diff options
| -rw-r--r-- | drivers/gpu/drm/radeon/evergreen.c | 46 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/evergreend.h | 8 |
2 files changed, 39 insertions, 15 deletions
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c index 34cd5a878088..8f446aadccd6 100644 --- a/drivers/gpu/drm/radeon/evergreen.c +++ b/drivers/gpu/drm/radeon/evergreen.c | |||
| @@ -88,21 +88,39 @@ u32 evergreen_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base) | |||
| 88 | /* get temperature in millidegrees */ | 88 | /* get temperature in millidegrees */ |
| 89 | int evergreen_get_temp(struct radeon_device *rdev) | 89 | int evergreen_get_temp(struct radeon_device *rdev) |
| 90 | { | 90 | { |
| 91 | u32 temp = (RREG32(CG_MULT_THERMAL_STATUS) & ASIC_T_MASK) >> | 91 | u32 temp, toffset, actual_temp = 0; |
| 92 | ASIC_T_SHIFT; | 92 | |
| 93 | u32 actual_temp = 0; | 93 | if (rdev->family == CHIP_JUNIPER) { |
| 94 | 94 | toffset = (RREG32(CG_THERMAL_CTRL) & TOFFSET_MASK) >> | |
| 95 | if (temp & 0x400) | 95 | TOFFSET_SHIFT; |
| 96 | actual_temp = -256; | 96 | temp = (RREG32(CG_TS0_STATUS) & TS0_ADC_DOUT_MASK) >> |
| 97 | else if (temp & 0x200) | 97 | TS0_ADC_DOUT_SHIFT; |
| 98 | actual_temp = 255; | 98 | |
| 99 | else if (temp & 0x100) { | 99 | if (toffset & 0x100) |
| 100 | actual_temp = temp & 0x1ff; | 100 | actual_temp = temp / 2 - (0x200 - toffset); |
| 101 | actual_temp |= ~0x1ff; | 101 | else |
| 102 | } else | 102 | actual_temp = temp / 2 + toffset; |
| 103 | actual_temp = temp & 0xff; | 103 | |
| 104 | actual_temp = actual_temp * 1000; | ||
| 105 | |||
| 106 | } else { | ||
| 107 | temp = (RREG32(CG_MULT_THERMAL_STATUS) & ASIC_T_MASK) >> | ||
| 108 | ASIC_T_SHIFT; | ||
| 109 | |||
| 110 | if (temp & 0x400) | ||
| 111 | actual_temp = -256; | ||
| 112 | else if (temp & 0x200) | ||
| 113 | actual_temp = 255; | ||
| 114 | else if (temp & 0x100) { | ||
| 115 | actual_temp = temp & 0x1ff; | ||
| 116 | actual_temp |= ~0x1ff; | ||
| 117 | } else | ||
| 118 | actual_temp = temp & 0xff; | ||
| 119 | |||
| 120 | actual_temp = (actual_temp * 1000) / 2; | ||
| 121 | } | ||
| 104 | 122 | ||
| 105 | return (actual_temp * 1000) / 2; | 123 | return actual_temp; |
| 106 | } | 124 | } |
| 107 | 125 | ||
| 108 | int sumo_get_temp(struct radeon_device *rdev) | 126 | int sumo_get_temp(struct radeon_device *rdev) |
diff --git a/drivers/gpu/drm/radeon/evergreend.h b/drivers/gpu/drm/radeon/evergreend.h index 75b57e394f2b..103250ff3cbe 100644 --- a/drivers/gpu/drm/radeon/evergreend.h +++ b/drivers/gpu/drm/radeon/evergreend.h | |||
| @@ -168,10 +168,16 @@ | |||
| 168 | #define SE_DB_BUSY (1 << 30) | 168 | #define SE_DB_BUSY (1 << 30) |
| 169 | #define SE_CB_BUSY (1 << 31) | 169 | #define SE_CB_BUSY (1 << 31) |
| 170 | /* evergreen */ | 170 | /* evergreen */ |
| 171 | #define CG_THERMAL_CTRL 0x72c | ||
| 172 | #define TOFFSET_MASK 0x00003FE0 | ||
| 173 | #define TOFFSET_SHIFT 5 | ||
| 171 | #define CG_MULT_THERMAL_STATUS 0x740 | 174 | #define CG_MULT_THERMAL_STATUS 0x740 |
| 172 | #define ASIC_T(x) ((x) << 16) | 175 | #define ASIC_T(x) ((x) << 16) |
| 173 | #define ASIC_T_MASK 0x7FF0000 | 176 | #define ASIC_T_MASK 0x07FF0000 |
| 174 | #define ASIC_T_SHIFT 16 | 177 | #define ASIC_T_SHIFT 16 |
| 178 | #define CG_TS0_STATUS 0x760 | ||
| 179 | #define TS0_ADC_DOUT_MASK 0x000003FF | ||
| 180 | #define TS0_ADC_DOUT_SHIFT 0 | ||
| 175 | /* APU */ | 181 | /* APU */ |
| 176 | #define CG_THERMAL_STATUS 0x678 | 182 | #define CG_THERMAL_STATUS 0x678 |
| 177 | 183 | ||
