drm/radeon/kms: add thermal sensor support for fusion APUs
authorAlex Deucher <alexdeucher@gmail.com>
Mon, 22 Nov 2010 22:56:32 +0000 (17:56 -0500)
committerDave Airlie <airlied@redhat.com>
Mon, 22 Nov 2010 23:23:29 +0000 (09:23 +1000)
Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
drivers/gpu/drm/radeon/evergreen.c
drivers/gpu/drm/radeon/evergreend.h
drivers/gpu/drm/radeon/radeon.h
drivers/gpu/drm/radeon/radeon_pm.c

index 7f859ffe99ceaa221e7efb727cc2f2cc69ca0f22..075d6c172595ac5f90aad570d6ce110a2537ce6f 100644 (file)
@@ -57,6 +57,14 @@ u32 evergreen_get_temp(struct radeon_device *rdev)
        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)
 {
        int req_ps_idx = rdev->pm.requested_power_state_index;
index 9644b1cbfb093cdd0083428535404e10bafa5c7b..87fcaba7669582397147c5e3232fb83b58d0e99e 100644 (file)
 #define                SE_SC_BUSY                                      (1 << 29)
 #define                SE_DB_BUSY                                      (1 << 30)
 #define                SE_CB_BUSY                                      (1 << 31)
-
+/* evergreen */
 #define        CG_MULT_THERMAL_STATUS                          0x740
 #define                ASIC_T(x)                               ((x) << 16)
 #define                ASIC_T_MASK                             0x7FF0000
 #define                ASIC_T_SHIFT                            16
+/* APU */
+#define        CG_THERMAL_STATUS                               0x678
 
 #define        HDP_HOST_PATH_CNTL                              0x2C00
 #define        HDP_NONSURFACE_BASE                             0x2C04
index bf3a4fc82964c064705effb177543d13563d2bf0..0507ee7e16eb5be8451d42315d90a90b32a1a79b 100644 (file)
@@ -180,6 +180,7 @@ void rs690_pm_info(struct radeon_device *rdev);
 extern u32 rv6xx_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 sumo_get_temp(struct radeon_device *rdev);
 
 /*
  * Fences.
@@ -687,6 +688,7 @@ enum radeon_int_thermal_type {
        THERMAL_TYPE_RV6XX,
        THERMAL_TYPE_RV770,
        THERMAL_TYPE_EVERGREEN,
+       THERMAL_TYPE_SUMO,
 };
 
 struct radeon_voltage {
index 8c9b2ef32c681229aa9b21d5d2bce87b7bfae6fa..ac4efb0f1cb4649433e45b79e25dff73e1665ad6 100644 (file)
@@ -449,6 +449,9 @@ static ssize_t radeon_hwmon_show_temp(struct device *dev,
        case THERMAL_TYPE_EVERGREEN:
                temp = evergreen_get_temp(rdev);
                break;
+       case THERMAL_TYPE_SUMO:
+               temp = sumo_get_temp(rdev);
+               break;
        default:
                temp = 0;
                break;
@@ -487,6 +490,7 @@ static int radeon_hwmon_init(struct radeon_device *rdev)
        case THERMAL_TYPE_RV6XX:
        case THERMAL_TYPE_RV770:
        case THERMAL_TYPE_EVERGREEN:
+       case THERMAL_TYPE_SUMO:
                rdev->pm.int_hwmon_dev = hwmon_device_register(rdev->dev);
                if (IS_ERR(rdev->pm.int_hwmon_dev)) {
                        err = PTR_ERR(rdev->pm.int_hwmon_dev);