Add support for thermal status queries on newer chipsets

* add temperature query support for Juniper, Sumo, Evergreen, and North Islands
* add missing thermal defines for evergreen cards
* northern island cards use the evergreen thermal calculations
This commit is contained in:
Alexander von Gluck IV
2011-11-24 19:42:45 -06:00
parent 8fd51c0819
commit cb050a33be
2 changed files with 49 additions and 4 deletions
@@ -80,5 +80,18 @@
#define EVERGREEN_SCRATCH_UMSK 0x8540
#define EVERGREEN_SCRATCH_ADDR 0x8544
/* evergreen */
#define EVERGREEN_CG_THERMAL_CTRL 0x72c
#define EVERGREEN_TOFFSET_MASK 0x00003FE0
#define EVERGREEN_TOFFSET_SHIFT 5
#define EVERGREEN_CG_MULT_THERMAL_STATUS 0x740
#define EVERGREEN_ASIC_T(x) ((x) << 16)
#define EVERGREEN_ASIC_T_MASK 0x07FF0000
#define EVERGREEN_ASIC_T_SHIFT 16
#define EVERGREEN_CG_TS0_STATUS 0x760
#define EVERGREEN_TS0_ADC_DOUT_MASK 0x000003FF
#define EVERGREEN_TS0_ADC_DOUT_SHIFT 0
/* APU */
#define EVERGREEN_CG_THERMAL_STATUS 0x678
#endif
+36 -4
View File
@@ -783,10 +783,43 @@ radeon_get_temp()
radeon_shared_info &info = *gInfo->shared_info;
uint32 rawTemp = 0; // temp
int32 finalTemp = 0; // actual_temp
uint32 rawTemp = 0;
int32 finalTemp = 0;
if (info.chipsetID >= RADEON_RV770) {
if (info.chipsetID == RADEON_JUNIPER) {
uint32 offset = (Read32(OUT, EVERGREEN_CG_THERMAL_CTRL)
& EVERGREEN_TOFFSET_MASK) >> EVERGREEN_TOFFSET_SHIFT;
rawTemp = (Read32(OUT, EVERGREEN_CG_TS0_STATUS)
& EVERGREEN_TS0_ADC_DOUT_MASK) >> EVERGREEN_TS0_ADC_DOUT_SHIFT;
if (offset & 0x100)
finalTemp = rawTemp / 2 - (0x200 - offset);
else
finalTemp = rawTemp / 2 + offset;
return finalTemp * 1000;
} else if (info.chipsetID == RADEON_SUMO
|| info.chipsetID == RADEON_SUMO2) {
uint32 rawTemp = Read32(OUT, EVERGREEN_CG_THERMAL_STATUS) & 0xff;
finalTemp = rawTemp - 49;
return finalTemp * 1000;
} else if (info.chipsetID >= RADEON_CEDAR) {
rawTemp = (Read32(OUT, EVERGREEN_CG_MULT_THERMAL_STATUS)
& EVERGREEN_ASIC_T_MASK) >> EVERGREEN_ASIC_T_SHIFT;
if (rawTemp & 0x400)
finalTemp = -256;
else if (rawTemp & 0x200)
finalTemp = 255;
else if (rawTemp & 0x100) {
finalTemp = rawTemp & 0x1ff;
finalTemp |= ~0x1ff;
} else
finalTemp = rawTemp & 0xff;
return (finalTemp * 1000) / 2;
} else if (info.chipsetID >= RADEON_RV770) {
rawTemp = (Read32(OUT, R700_CG_MULT_THERMAL_STATUS) & R700_ASIC_T_MASK)
>> R700_ASIC_T_SHIFT;
if (rawTemp & 0x400)
@@ -800,7 +833,6 @@ radeon_get_temp()
finalTemp = rawTemp & 0xff;
return (finalTemp * 1000) / 2;
} else if (info.chipsetID >= RADEON_R600) {
rawTemp = (Read32(OUT, R600_CG_THERMAL_STATUS) & R600_ASIC_T_MASK)
>> R600_ASIC_T_SHIFT;