OSDN Git Service

drm/amd/powerplay: separate Polaris fan table setup from Tonga
authorEvan Quan <evan.quan@amd.com>
Thu, 18 Jun 2020 08:39:03 +0000 (16:39 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 27 Oct 2020 15:58:08 +0000 (11:58 -0400)
Instead of sharing the fan table setup with Tonga, Polaris has
its own fan table setup.

Signed-off-by: Evan Quan <evan.quan@amd.com>
Acked-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/pm/powerplay/hwmgr/pptable_v1_0.h
drivers/gpu/drm/amd/pm/powerplay/hwmgr/process_pptables_v1_0.c

index 1e870f5..614f61a 100644 (file)
@@ -315,6 +315,36 @@ typedef struct _ATOM_Fiji_Fan_Table {
        USHORT  usReserved;
 } ATOM_Fiji_Fan_Table;
 
+typedef struct _ATOM_Polaris_Fan_Table {
+       UCHAR   ucRevId;                                                 /* Change this if the table format changes or version changes so that the other fields are not the same. */
+       UCHAR   ucTHyst;                                                 /* Temperature hysteresis. Integer. */
+       USHORT  usTMin;                                                  /* The temperature, in 0.01 centigrades, below which we just run at a minimal PWM. */
+       USHORT  usTMed;                                                  /* The middle temperature where we change slopes. */
+       USHORT  usTHigh;                                                 /* The high point above TMed for adjusting the second slope. */
+       USHORT  usPWMMin;                                                /* The minimum PWM value in percent (0.01% increments). */
+       USHORT  usPWMMed;                                                /* The PWM value (in percent) at TMed. */
+       USHORT  usPWMHigh;                                               /* The PWM value at THigh. */
+       USHORT  usTMax;                                                  /* The max temperature */
+       UCHAR   ucFanControlMode;                                 /* Legacy or Fuzzy Fan mode */
+       USHORT  usFanPWMMax;                                      /* Maximum allowed fan power in percent */
+       USHORT  usFanOutputSensitivity;           /* Sensitivity of fan reaction to temepature changes */
+       USHORT  usFanRPMMax;                                      /* The default value in RPM */
+       ULONG  ulMinFanSCLKAcousticLimit;               /* Minimum Fan Controller SCLK Frequency Acoustic Limit. */
+       UCHAR   ucTargetTemperature;                     /* Advanced fan controller target temperature. */
+       UCHAR   ucMinimumPWMLimit;                        /* The minimum PWM that the advanced fan controller can set.  This should be set to the highest PWM that will run the fan at its lowest RPM. */
+       USHORT  usFanGainEdge;
+       USHORT  usFanGainHotspot;
+       USHORT  usFanGainLiquid;
+       USHORT  usFanGainVrVddc;
+       USHORT  usFanGainVrMvdd;
+       USHORT  usFanGainPlx;
+       USHORT  usFanGainHbm;
+       UCHAR   ucEnableZeroRPM;
+       UCHAR   ucFanStopTemperature;
+       UCHAR   ucFanStartTemperature;
+       USHORT  usReserved;
+} ATOM_Polaris_Fan_Table;
+
 typedef struct _ATOM_Tonga_Thermal_Controller {
        UCHAR ucRevId;
        UCHAR ucType;              /* one of ATOM_TONGA_PP_THERMALCONTROLLER_* */
index 4fa5861..4ed9f81 100644 (file)
@@ -949,7 +949,7 @@ static int init_thermal_controller(
                        = tonga_fan_table->ucTargetTemperature;
                hwmgr->thermal_controller.advanceFanControlParameters.ucMinimumPWMLimit
                        = tonga_fan_table->ucMinimumPWMLimit;
-       } else {
+       } else if (fan_table->ucRevId == 8) {
                const ATOM_Fiji_Fan_Table *fiji_fan_table =
                        (ATOM_Fiji_Fan_Table *)fan_table;
                hwmgr->thermal_controller.advanceFanControlParameters.ucTHyst
@@ -999,6 +999,62 @@ static int init_thermal_controller(
                        = le16_to_cpu(fiji_fan_table->usFanGainPlx);
                hwmgr->thermal_controller.advanceFanControlParameters.usFanGainHbm
                        = le16_to_cpu(fiji_fan_table->usFanGainHbm);
+       } else if (fan_table->ucRevId >= 9) {
+               const ATOM_Polaris_Fan_Table *polaris_fan_table =
+                       (ATOM_Polaris_Fan_Table *)fan_table;
+               hwmgr->thermal_controller.advanceFanControlParameters.ucTHyst
+                       = polaris_fan_table->ucTHyst;
+               hwmgr->thermal_controller.advanceFanControlParameters.usTMin
+                       = le16_to_cpu(polaris_fan_table->usTMin);
+               hwmgr->thermal_controller.advanceFanControlParameters.usTMed
+                       = le16_to_cpu(polaris_fan_table->usTMed);
+               hwmgr->thermal_controller.advanceFanControlParameters.usTHigh
+                       = le16_to_cpu(polaris_fan_table->usTHigh);
+               hwmgr->thermal_controller.advanceFanControlParameters.usPWMMin
+                       = le16_to_cpu(polaris_fan_table->usPWMMin);
+               hwmgr->thermal_controller.advanceFanControlParameters.usPWMMed
+                       = le16_to_cpu(polaris_fan_table->usPWMMed);
+               hwmgr->thermal_controller.advanceFanControlParameters.usPWMHigh
+                       = le16_to_cpu(polaris_fan_table->usPWMHigh);
+               hwmgr->thermal_controller.advanceFanControlParameters.usTMax
+                       = le16_to_cpu(polaris_fan_table->usTMax);
+               hwmgr->thermal_controller.advanceFanControlParameters.ucFanControlMode
+                       = polaris_fan_table->ucFanControlMode;
+               hwmgr->thermal_controller.advanceFanControlParameters.usDefaultMaxFanPWM
+                       = le16_to_cpu(polaris_fan_table->usFanPWMMax);
+               hwmgr->thermal_controller.advanceFanControlParameters.usDefaultFanOutputSensitivity
+                       = 4836;
+               hwmgr->thermal_controller.advanceFanControlParameters.usFanOutputSensitivity
+                       = le16_to_cpu(polaris_fan_table->usFanOutputSensitivity);
+               hwmgr->thermal_controller.advanceFanControlParameters.usDefaultMaxFanRPM
+                       = le16_to_cpu(polaris_fan_table->usFanRPMMax);
+               hwmgr->thermal_controller.advanceFanControlParameters.ulMinFanSCLKAcousticLimit
+                       = (le32_to_cpu(polaris_fan_table->ulMinFanSCLKAcousticLimit) / 100); /* PPTable stores it in 10Khz unit for 2 decimal places.  SMC wants MHz. */
+               hwmgr->thermal_controller.advanceFanControlParameters.ucTargetTemperature
+                       = polaris_fan_table->ucTargetTemperature;
+               hwmgr->thermal_controller.advanceFanControlParameters.ucMinimumPWMLimit
+                       = polaris_fan_table->ucMinimumPWMLimit;
+
+               hwmgr->thermal_controller.advanceFanControlParameters.usFanGainEdge
+                       = le16_to_cpu(polaris_fan_table->usFanGainEdge);
+               hwmgr->thermal_controller.advanceFanControlParameters.usFanGainHotspot
+                       = le16_to_cpu(polaris_fan_table->usFanGainHotspot);
+               hwmgr->thermal_controller.advanceFanControlParameters.usFanGainLiquid
+                       = le16_to_cpu(polaris_fan_table->usFanGainLiquid);
+               hwmgr->thermal_controller.advanceFanControlParameters.usFanGainVrVddc
+                       = le16_to_cpu(polaris_fan_table->usFanGainVrVddc);
+               hwmgr->thermal_controller.advanceFanControlParameters.usFanGainVrMvdd
+                       = le16_to_cpu(polaris_fan_table->usFanGainVrMvdd);
+               hwmgr->thermal_controller.advanceFanControlParameters.usFanGainPlx
+                       = le16_to_cpu(polaris_fan_table->usFanGainPlx);
+               hwmgr->thermal_controller.advanceFanControlParameters.usFanGainHbm
+                       = le16_to_cpu(polaris_fan_table->usFanGainHbm);
+               hwmgr->thermal_controller.advanceFanControlParameters.ucEnableZeroRPM
+                       = le16_to_cpu(polaris_fan_table->ucEnableZeroRPM);
+               hwmgr->thermal_controller.advanceFanControlParameters.ucFanStopTemperature
+                       = le16_to_cpu(polaris_fan_table->ucFanStopTemperature);
+               hwmgr->thermal_controller.advanceFanControlParameters.ucFanStartTemperature
+                       = le16_to_cpu(polaris_fan_table->ucFanStartTemperature);
        }
 
        return 0;