Commit e33df25f authored by Alex Deucher's avatar Alex Deucher Committed by Dave Airlie

drm/radeon/kms: add thermal sensor support for fusion APUs

Signed-off-by: default avatarAlex Deucher <alexdeucher@gmail.com>
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent d5e455e4
...@@ -57,6 +57,14 @@ u32 evergreen_get_temp(struct radeon_device *rdev) ...@@ -57,6 +57,14 @@ u32 evergreen_get_temp(struct radeon_device *rdev)
return actual_temp * 1000; return actual_temp * 1000;
} }
u32 sumo_get_temp(struct radeon_device *rdev)
{
u32 temp = RREG32(CG_THERMAL_STATUS) & 0xff;
u32 actual_temp = (temp >> 1) & 0xff;
return actual_temp * 1000;
}
void evergreen_pm_misc(struct radeon_device *rdev) void evergreen_pm_misc(struct radeon_device *rdev)
{ {
int req_ps_idx = rdev->pm.requested_power_state_index; int req_ps_idx = rdev->pm.requested_power_state_index;
......
...@@ -164,11 +164,13 @@ ...@@ -164,11 +164,13 @@
#define SE_SC_BUSY (1 << 29) #define SE_SC_BUSY (1 << 29)
#define SE_DB_BUSY (1 << 30) #define SE_DB_BUSY (1 << 30)
#define SE_CB_BUSY (1 << 31) #define SE_CB_BUSY (1 << 31)
/* evergreen */
#define CG_MULT_THERMAL_STATUS 0x740 #define CG_MULT_THERMAL_STATUS 0x740
#define ASIC_T(x) ((x) << 16) #define ASIC_T(x) ((x) << 16)
#define ASIC_T_MASK 0x7FF0000 #define ASIC_T_MASK 0x7FF0000
#define ASIC_T_SHIFT 16 #define ASIC_T_SHIFT 16
/* APU */
#define CG_THERMAL_STATUS 0x678
#define HDP_HOST_PATH_CNTL 0x2C00 #define HDP_HOST_PATH_CNTL 0x2C00
#define HDP_NONSURFACE_BASE 0x2C04 #define HDP_NONSURFACE_BASE 0x2C04
......
...@@ -180,6 +180,7 @@ void rs690_pm_info(struct radeon_device *rdev); ...@@ -180,6 +180,7 @@ void rs690_pm_info(struct radeon_device *rdev);
extern u32 rv6xx_get_temp(struct radeon_device *rdev); extern u32 rv6xx_get_temp(struct radeon_device *rdev);
extern u32 rv770_get_temp(struct radeon_device *rdev); extern u32 rv770_get_temp(struct radeon_device *rdev);
extern u32 evergreen_get_temp(struct radeon_device *rdev); extern u32 evergreen_get_temp(struct radeon_device *rdev);
extern u32 sumo_get_temp(struct radeon_device *rdev);
/* /*
* Fences. * Fences.
...@@ -687,6 +688,7 @@ enum radeon_int_thermal_type { ...@@ -687,6 +688,7 @@ enum radeon_int_thermal_type {
THERMAL_TYPE_RV6XX, THERMAL_TYPE_RV6XX,
THERMAL_TYPE_RV770, THERMAL_TYPE_RV770,
THERMAL_TYPE_EVERGREEN, THERMAL_TYPE_EVERGREEN,
THERMAL_TYPE_SUMO,
}; };
struct radeon_voltage { struct radeon_voltage {
......
...@@ -449,6 +449,9 @@ static ssize_t radeon_hwmon_show_temp(struct device *dev, ...@@ -449,6 +449,9 @@ static ssize_t radeon_hwmon_show_temp(struct device *dev,
case THERMAL_TYPE_EVERGREEN: case THERMAL_TYPE_EVERGREEN:
temp = evergreen_get_temp(rdev); temp = evergreen_get_temp(rdev);
break; break;
case THERMAL_TYPE_SUMO:
temp = sumo_get_temp(rdev);
break;
default: default:
temp = 0; temp = 0;
break; break;
...@@ -487,6 +490,7 @@ static int radeon_hwmon_init(struct radeon_device *rdev) ...@@ -487,6 +490,7 @@ static int radeon_hwmon_init(struct radeon_device *rdev)
case THERMAL_TYPE_RV6XX: case THERMAL_TYPE_RV6XX:
case THERMAL_TYPE_RV770: case THERMAL_TYPE_RV770:
case THERMAL_TYPE_EVERGREEN: case THERMAL_TYPE_EVERGREEN:
case THERMAL_TYPE_SUMO:
rdev->pm.int_hwmon_dev = hwmon_device_register(rdev->dev); rdev->pm.int_hwmon_dev = hwmon_device_register(rdev->dev);
if (IS_ERR(rdev->pm.int_hwmon_dev)) { if (IS_ERR(rdev->pm.int_hwmon_dev)) {
err = PTR_ERR(rdev->pm.int_hwmon_dev); err = PTR_ERR(rdev->pm.int_hwmon_dev);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment