drm/amd/powerplay: support Vega10 fan table V3
authorEvan Quan <evan.quan@amd.com>
Tue, 22 Jan 2019 09:54:22 +0000 (17:54 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 25 Jan 2019 21:15:36 +0000 (16:15 -0500)
MGPU fan boost related parameter is added.

Signed-off-by: Evan Quan <evan.quan@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/powerplay/hwmgr/vega10_pptable.h
drivers/gpu/drm/amd/powerplay/hwmgr/vega10_processpptables.c
drivers/gpu/drm/amd/powerplay/inc/hwmgr.h

index b3e6300..c934e96 100644 (file)
@@ -282,6 +282,30 @@ typedef struct _ATOM_Vega10_Fan_Table_V2 {
        UCHAR   ucFanMaxRPM;
 } ATOM_Vega10_Fan_Table_V2;
 
+typedef struct _ATOM_Vega10_Fan_Table_V3 {
+       UCHAR   ucRevId;
+       USHORT  usFanOutputSensitivity;
+       USHORT  usFanAcousticLimitRpm;
+       USHORT  usThrottlingRPM;
+       USHORT  usTargetTemperature;
+       USHORT  usMinimumPWMLimit;
+       USHORT  usTargetGfxClk;
+       USHORT  usFanGainEdge;
+       USHORT  usFanGainHotspot;
+       USHORT  usFanGainLiquid;
+       USHORT  usFanGainVrVddc;
+       USHORT  usFanGainVrMvdd;
+       USHORT  usFanGainPlx;
+       USHORT  usFanGainHbm;
+       UCHAR   ucEnableZeroRPM;
+       USHORT  usFanStopTemperature;
+       USHORT  usFanStartTemperature;
+       UCHAR   ucFanParameters;
+       UCHAR   ucFanMinRPM;
+       UCHAR   ucFanMaxRPM;
+       USHORT  usMGpuThrottlingRPM;
+} ATOM_Vega10_Fan_Table_V3;
+
 typedef struct _ATOM_Vega10_Thermal_Controller {
        UCHAR ucRevId;
        UCHAR ucType;           /* one of ATOM_VEGA10_PP_THERMALCONTROLLER_*/
index 99d596d..b6767d7 100644 (file)
@@ -123,6 +123,7 @@ static int init_thermal_controller(
        const Vega10_PPTable_Generic_SubTable_Header *header;
        const ATOM_Vega10_Fan_Table *fan_table_v1;
        const ATOM_Vega10_Fan_Table_V2 *fan_table_v2;
+       const ATOM_Vega10_Fan_Table_V3 *fan_table_v3;
 
        thermal_controller = (ATOM_Vega10_Thermal_Controller *)
                        (((unsigned long)powerplay_table) +
@@ -207,7 +208,7 @@ static int init_thermal_controller(
                                le16_to_cpu(fan_table_v1->usFanStopTemperature);
                hwmgr->thermal_controller.advanceFanControlParameters.usZeroRPMStartTemperature =
                                le16_to_cpu(fan_table_v1->usFanStartTemperature);
-       } else if (header->ucRevId > 10) {
+       } else if (header->ucRevId == 0xb) {
                fan_table_v2 = (ATOM_Vega10_Fan_Table_V2 *)header;
 
                hwmgr->thermal_controller.fanInfo.ucTachometerPulsesPerRevolution =
@@ -251,7 +252,54 @@ static int init_thermal_controller(
                                le16_to_cpu(fan_table_v2->usFanStopTemperature);
                hwmgr->thermal_controller.advanceFanControlParameters.usZeroRPMStartTemperature =
                                le16_to_cpu(fan_table_v2->usFanStartTemperature);
+       } else if (header->ucRevId > 0xb) {
+               fan_table_v3 = (ATOM_Vega10_Fan_Table_V3 *)header;
+
+               hwmgr->thermal_controller.fanInfo.ucTachometerPulsesPerRevolution =
+                               fan_table_v3->ucFanParameters & ATOM_VEGA10_PP_FANPARAMETERS_TACHOMETER_PULSES_PER_REVOLUTION_MASK;
+               hwmgr->thermal_controller.fanInfo.ulMinRPM = fan_table_v3->ucFanMinRPM * 100UL;
+               hwmgr->thermal_controller.fanInfo.ulMaxRPM = fan_table_v3->ucFanMaxRPM * 100UL;
+               phm_cap_set(hwmgr->platform_descriptor.platformCaps,
+                               PHM_PlatformCaps_MicrocodeFanControl);
+               hwmgr->thermal_controller.advanceFanControlParameters.usFanOutputSensitivity =
+                               le16_to_cpu(fan_table_v3->usFanOutputSensitivity);
+               hwmgr->thermal_controller.advanceFanControlParameters.usMaxFanRPM =
+                               fan_table_v3->ucFanMaxRPM * 100UL;
+               hwmgr->thermal_controller.advanceFanControlParameters.usFanRPMMaxLimit =
+                               le16_to_cpu(fan_table_v3->usThrottlingRPM);
+               hwmgr->thermal_controller.advanceFanControlParameters.ulMinFanSCLKAcousticLimit =
+                               le16_to_cpu(fan_table_v3->usFanAcousticLimitRpm);
+               hwmgr->thermal_controller.advanceFanControlParameters.usTMax =
+                               le16_to_cpu(fan_table_v3->usTargetTemperature);
+               hwmgr->thermal_controller.advanceFanControlParameters.usPWMMin =
+                               le16_to_cpu(fan_table_v3->usMinimumPWMLimit);
+               hwmgr->thermal_controller.advanceFanControlParameters.ulTargetGfxClk =
+                               le16_to_cpu(fan_table_v3->usTargetGfxClk);
+               hwmgr->thermal_controller.advanceFanControlParameters.usFanGainEdge =
+                               le16_to_cpu(fan_table_v3->usFanGainEdge);
+               hwmgr->thermal_controller.advanceFanControlParameters.usFanGainHotspot =
+                               le16_to_cpu(fan_table_v3->usFanGainHotspot);
+               hwmgr->thermal_controller.advanceFanControlParameters.usFanGainLiquid =
+                               le16_to_cpu(fan_table_v3->usFanGainLiquid);
+               hwmgr->thermal_controller.advanceFanControlParameters.usFanGainVrVddc =
+                               le16_to_cpu(fan_table_v3->usFanGainVrVddc);
+               hwmgr->thermal_controller.advanceFanControlParameters.usFanGainVrMvdd =
+                               le16_to_cpu(fan_table_v3->usFanGainVrMvdd);
+               hwmgr->thermal_controller.advanceFanControlParameters.usFanGainPlx =
+                               le16_to_cpu(fan_table_v3->usFanGainPlx);
+               hwmgr->thermal_controller.advanceFanControlParameters.usFanGainHbm =
+                               le16_to_cpu(fan_table_v3->usFanGainHbm);
+
+               hwmgr->thermal_controller.advanceFanControlParameters.ucEnableZeroRPM =
+                               fan_table_v3->ucEnableZeroRPM;
+               hwmgr->thermal_controller.advanceFanControlParameters.usZeroRPMStopTemperature =
+                               le16_to_cpu(fan_table_v3->usFanStopTemperature);
+               hwmgr->thermal_controller.advanceFanControlParameters.usZeroRPMStartTemperature =
+                               le16_to_cpu(fan_table_v3->usFanStartTemperature);
+               hwmgr->thermal_controller.advanceFanControlParameters.usMGpuThrottlingRPMLimit =
+                               le16_to_cpu(fan_table_v3->usMGpuThrottlingRPM);
        }
+
        return 0;
 }
 
index b1cd70d..bac3d85 100644 (file)
@@ -687,6 +687,7 @@ struct pp_advance_fan_control_parameters {
        uint32_t  ulTargetGfxClk;
        uint16_t  usZeroRPMStartTemperature;
        uint16_t  usZeroRPMStopTemperature;
+       uint16_t  usMGpuThrottlingRPMLimit;
 };
 
 struct pp_thermal_controller_info {