drm/radeon: add get_temperature() callbacks for CIK (v2)
This added support for the on-chip thermal sensors on CIK asics. v2: fix register offset. Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
		
							parent
							
								
									12262906b1
								
							
						
					
					
						commit
						286d9cc67a
					
				| @ -69,6 +69,43 @@ static void cik_program_aspm(struct radeon_device *rdev); | ||||
| static void cik_init_pg(struct radeon_device *rdev); | ||||
| static void cik_init_cg(struct radeon_device *rdev); | ||||
| 
 | ||||
| /* get temperature in millidegrees */ | ||||
| int ci_get_temp(struct radeon_device *rdev) | ||||
| { | ||||
| 	u32 temp; | ||||
| 	int actual_temp = 0; | ||||
| 
 | ||||
| 	temp = (RREG32_SMC(CG_MULT_THERMAL_STATUS) & CTF_TEMP_MASK) >> | ||||
| 		CTF_TEMP_SHIFT; | ||||
| 
 | ||||
| 	if (temp & 0x200) | ||||
| 		actual_temp = 255; | ||||
| 	else | ||||
| 		actual_temp = temp & 0x1ff; | ||||
| 
 | ||||
| 	actual_temp = actual_temp * 1000; | ||||
| 
 | ||||
| 	return actual_temp; | ||||
| } | ||||
| 
 | ||||
| /* get temperature in millidegrees */ | ||||
| int kv_get_temp(struct radeon_device *rdev) | ||||
| { | ||||
| 	u32 temp; | ||||
| 	int actual_temp = 0; | ||||
| 
 | ||||
| 	temp = RREG32_SMC(0xC0300E0C); | ||||
| 
 | ||||
| 	if (temp) | ||||
| 		actual_temp = (temp / 8) - 49; | ||||
| 	else | ||||
| 		actual_temp = 0; | ||||
| 
 | ||||
| 	actual_temp = actual_temp * 1000; | ||||
| 
 | ||||
| 	return actual_temp; | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * Indirect registers accessor | ||||
|  */ | ||||
|  | ||||
| @ -32,6 +32,14 @@ | ||||
| #define GENERAL_PWRMGT                                    0xC0200000 | ||||
| #       define GPU_COUNTER_CLK                            (1 << 15) | ||||
| 
 | ||||
| #define	CG_MULT_THERMAL_STATUS				0xC0300014 | ||||
| #define		ASIC_MAX_TEMP(x)			((x) << 0) | ||||
| #define		ASIC_MAX_TEMP_MASK			0x000001ff | ||||
| #define		ASIC_MAX_TEMP_SHIFT			0 | ||||
| #define		CTF_TEMP(x)				((x) << 9) | ||||
| #define		CTF_TEMP_MASK				0x0003fe00 | ||||
| #define		CTF_TEMP_SHIFT				9 | ||||
| 
 | ||||
| #define	MPLL_BYPASSCLK_SEL				0xC050019C | ||||
| #	define MPLL_CLKOUT_SEL(x)			((x) << 8) | ||||
| #	define MPLL_CLKOUT_SEL_MASK			0xFF00 | ||||
|  | ||||
| @ -2452,6 +2452,7 @@ static struct radeon_asic ci_asic = { | ||||
| 		.set_pcie_lanes = NULL, | ||||
| 		.set_clock_gating = NULL, | ||||
| 		.set_uvd_clocks = &cik_set_uvd_clocks, | ||||
| 		.get_temperature = &ci_get_temp, | ||||
| 	}, | ||||
| 	.pflip = { | ||||
| 		.pre_page_flip = &evergreen_pre_page_flip, | ||||
| @ -2607,6 +2608,7 @@ static struct radeon_asic kv_asic = { | ||||
| 		.set_pcie_lanes = NULL, | ||||
| 		.set_clock_gating = NULL, | ||||
| 		.set_uvd_clocks = &cik_set_uvd_clocks, | ||||
| 		.get_temperature = &kv_get_temp, | ||||
| 	}, | ||||
| 	.pflip = { | ||||
| 		.pre_page_flip = &evergreen_pre_page_flip, | ||||
|  | ||||
| @ -747,5 +747,7 @@ u32 cik_compute_ring_get_wptr(struct radeon_device *rdev, | ||||
| 			      struct radeon_ring *ring); | ||||
| void cik_compute_ring_set_wptr(struct radeon_device *rdev, | ||||
| 			       struct radeon_ring *ring); | ||||
| int ci_get_temp(struct radeon_device *rdev); | ||||
| int kv_get_temp(struct radeon_device *rdev); | ||||
| 
 | ||||
| #endif | ||||
|  | ||||
| @ -569,6 +569,8 @@ static int radeon_hwmon_init(struct radeon_device *rdev) | ||||
| 	case THERMAL_TYPE_NI: | ||||
| 	case THERMAL_TYPE_SUMO: | ||||
| 	case THERMAL_TYPE_SI: | ||||
| 	case THERMAL_TYPE_CI: | ||||
| 	case THERMAL_TYPE_KV: | ||||
| 		if (rdev->asic->pm.get_temperature == NULL) | ||||
| 			return err; | ||||
| 		rdev->pm.int_hwmon_dev = hwmon_device_register(rdev->dev); | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user