drm/amdgpu/powerplay: enable LEDs on Fiji boards
authorAlex Deucher <alexander.deucher@amd.com>
Wed, 22 Feb 2017 16:20:17 +0000 (11:20 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 30 Mar 2017 03:53:20 +0000 (23:53 -0400)
This enables the LEDs that light up based on DPM states
on some Fiji boards.

bug:
https://bugs.freedesktop.org/show_bug.cgi?id=97590

Reviewed-by: Huang Rui <ray.huang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/powerplay/inc/smu7_ppsmc.h
drivers/gpu/drm/amd/powerplay/smumgr/fiji_smc.c

index fbc504c70b8b34499ca9243c2744821a902ab772..62f36ba2435be4770e9a14f9dd8a779a2802fa79 100644 (file)
@@ -377,6 +377,7 @@ typedef uint16_t PPSMC_Result;
 #define PPSMC_MSG_DisableAvfs                 ((uint16_t) 0x26B)
 
 #define PPSMC_MSG_PerformBtc                  ((uint16_t) 0x26C)
+#define PPSMC_MSG_LedConfig                   ((uint16_t) 0x274)
 #define PPSMC_MSG_VftTableIsValid             ((uint16_t) 0x275)
 #define PPSMC_MSG_UseNewGPIOScheme            ((uint16_t) 0x277)
 #define PPSMC_MSG_GetEnabledPsm               ((uint16_t) 0x400)
index 62c41c4fc2e56de890ece1f6f20e4edea6be34e4..005e7d22c7b3f921e935cc401976c7ab74aeb391 100644 (file)
@@ -1758,6 +1758,36 @@ static int fiji_save_default_power_profile(struct pp_hwmgr *hwmgr)
 
        return 0;
 }
+
+static int fiji_setup_dpm_led_config(struct pp_hwmgr *hwmgr)
+{
+       pp_atomctrl_voltage_table param_led_dpm;
+       int result = 0;
+       u32 mask = 0;
+
+       result = atomctrl_get_voltage_table_v3(hwmgr,
+                                              VOLTAGE_TYPE_LEDDPM, VOLTAGE_OBJ_GPIO_LUT,
+                                              &param_led_dpm);
+       if (result == 0) {
+               int i, j;
+               u32 tmp = param_led_dpm.mask_low;
+
+               for (i = 0, j = 0; i < 32; i++) {
+                       if (tmp & 1) {
+                               mask |= (i << (8 * j));
+                               if (++j >= 3)
+                                       break;
+                       }
+                       tmp >>= 1;
+               }
+       }
+       if (mask)
+               smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
+                                                   PPSMC_MSG_LedConfig,
+                                                   mask);
+       return 0;
+}
+
 /**
 * Initializes the SMC table and uploads it
 *
@@ -1972,6 +2002,10 @@ int fiji_init_smc_table(struct pp_hwmgr *hwmgr)
        PP_ASSERT_WITH_CODE(0 == result,
                        "Failed to  populate PM fuses to SMC memory!", return result);
 
+       result = fiji_setup_dpm_led_config(hwmgr);
+       PP_ASSERT_WITH_CODE(0 == result,
+                           "Failed to setup dpm led config", return result);
+
        fiji_save_default_power_profile(hwmgr);
 
        return 0;