diff options
Diffstat (limited to 'drivers/gpu/drm/amd/pm')
20 files changed, 408 insertions, 108 deletions
| diff --git a/drivers/gpu/drm/amd/pm/powerplay/amd_powerplay.c b/drivers/gpu/drm/amd/pm/powerplay/amd_powerplay.c index ec055858eb95..304190d5c9d2 100644 --- a/drivers/gpu/drm/amd/pm/powerplay/amd_powerplay.c +++ b/drivers/gpu/drm/amd/pm/powerplay/amd_powerplay.c @@ -838,7 +838,8 @@ static int pp_set_fine_grain_clk_vol(void *handle, uint32_t type, long *input, u  	return hwmgr->hwmgr_func->set_fine_grain_clk_vol(hwmgr, type, input, size);  } -static int pp_odn_edit_dpm_table(void *handle, uint32_t type, long *input, uint32_t size) +static int pp_odn_edit_dpm_table(void *handle, enum PP_OD_DPM_TABLE_COMMAND type, +				 long *input, uint32_t size)  {  	struct pp_hwmgr *hwmgr = handle; @@ -1507,7 +1508,7 @@ static void pp_pm_compute_clocks(void *handle)  	struct pp_hwmgr *hwmgr = handle;  	struct amdgpu_device *adev = hwmgr->adev; -	if (!amdgpu_device_has_dc_support(adev)) { +	if (!adev->dc_enabled) {  		amdgpu_dpm_get_active_displays(adev);  		adev->pm.pm_display_cfg.num_display = adev->pm.dpm.new_active_crtc_count;  		adev->pm.pm_display_cfg.vrefresh = amdgpu_dpm_get_vrefresh(adev); diff --git a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/pp_psm.c b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/pp_psm.c index 67d7da0b6fed..1d829402cd2e 100644 --- a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/pp_psm.c +++ b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/pp_psm.c @@ -75,8 +75,10 @@ int psm_init_power_state_table(struct pp_hwmgr *hwmgr)  	for (i = 0; i < table_entries; i++) {  		result = hwmgr->hwmgr_func->get_pp_table_entry(hwmgr, i, state);  		if (result) { +			kfree(hwmgr->current_ps);  			kfree(hwmgr->request_ps);  			kfree(hwmgr->ps); +			hwmgr->current_ps = NULL;  			hwmgr->request_ps = NULL;  			hwmgr->ps = NULL;  			return -EINVAL; diff --git a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_thermal.c b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_thermal.c index dad3e3741a4e..190af79f3236 100644 --- a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_thermal.c +++ b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_thermal.c @@ -67,22 +67,21 @@ int vega10_fan_ctrl_get_fan_speed_info(struct pp_hwmgr *hwmgr,  int vega10_fan_ctrl_get_fan_speed_pwm(struct pp_hwmgr *hwmgr,  		uint32_t *speed)  { -	uint32_t current_rpm; -	uint32_t percent = 0; - -	if (hwmgr->thermal_controller.fanInfo.bNoFan) -		return 0; +	struct amdgpu_device *adev = hwmgr->adev; +	uint32_t duty100, duty; +	uint64_t tmp64; -	if (vega10_get_current_rpm(hwmgr, ¤t_rpm)) -		return -1; +	duty100 = REG_GET_FIELD(RREG32_SOC15(THM, 0, mmCG_FDO_CTRL1), +				CG_FDO_CTRL1, FMAX_DUTY100); +	duty = REG_GET_FIELD(RREG32_SOC15(THM, 0, mmCG_THERMAL_STATUS), +				CG_THERMAL_STATUS, FDO_PWM_DUTY); -	if (hwmgr->thermal_controller. -			advanceFanControlParameters.usMaxFanRPM != 0) -		percent = current_rpm * 255 / -			hwmgr->thermal_controller. -			advanceFanControlParameters.usMaxFanRPM; +	if (!duty100) +		return -EINVAL; -	*speed = MIN(percent, 255); +	tmp64 = (uint64_t)duty * 255; +	do_div(tmp64, duty100); +	*speed = MIN((uint32_t)tmp64, 255);  	return 0;  } diff --git a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega20_hwmgr.c b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega20_hwmgr.c index 97b3ad369046..b30684c84e20 100644 --- a/drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega20_hwmgr.c +++ b/drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega20_hwmgr.c @@ -2961,7 +2961,8 @@ static int vega20_odn_edit_dpm_table(struct pp_hwmgr *hwmgr,  			data->od8_settings.od8_settings_array;  	OverDriveTable_t *od_table =  			&(data->smc_state_table.overdrive_table); -	int32_t input_index, input_clk, input_vol, i; +	int32_t input_clk, input_vol, i; +	uint32_t input_index;  	int od8_id;  	int ret; diff --git a/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c b/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c index 4fe75dd2b329..ca3beb5d8f27 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c +++ b/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c @@ -161,7 +161,7 @@ int smu_get_dpm_freq_range(struct smu_context *smu,  int smu_set_gfx_power_up_by_imu(struct smu_context *smu)  { -	if (!smu->ppt_funcs && !smu->ppt_funcs->set_gfx_power_up_by_imu) +	if (!smu->ppt_funcs || !smu->ppt_funcs->set_gfx_power_up_by_imu)  		return -EOPNOTSUPP;  	return smu->ppt_funcs->set_gfx_power_up_by_imu(smu); @@ -585,6 +585,7 @@ static int smu_set_funcs(struct amdgpu_device *adev)  		yellow_carp_set_ppt_funcs(smu);  		break;  	case IP_VERSION(13, 0, 4): +	case IP_VERSION(13, 0, 11):  		smu_v13_0_4_set_ppt_funcs(smu);  		break;  	case IP_VERSION(13, 0, 5): @@ -1156,22 +1157,21 @@ static int smu_smc_hw_setup(struct smu_context *smu)  	uint64_t features_supported;  	int ret = 0; -	if (adev->in_suspend && smu_is_dpm_running(smu)) { -		dev_info(adev->dev, "dpm has been enabled\n"); -		/* this is needed specifically */ -		switch (adev->ip_versions[MP1_HWIP][0]) { -		case IP_VERSION(11, 0, 7): -		case IP_VERSION(11, 0, 11): -		case IP_VERSION(11, 5, 0): -		case IP_VERSION(11, 0, 12): +	switch (adev->ip_versions[MP1_HWIP][0]) { +	case IP_VERSION(11, 0, 7): +	case IP_VERSION(11, 0, 11): +	case IP_VERSION(11, 5, 0): +	case IP_VERSION(11, 0, 12): +		if (adev->in_suspend && smu_is_dpm_running(smu)) { +			dev_info(adev->dev, "dpm has been enabled\n");  			ret = smu_system_features_control(smu, true);  			if (ret)  				dev_err(adev->dev, "Failed system features control!\n"); -			break; -		default: -			break; +			return ret;  		} -		return ret; +		break; +	default: +		break;  	}  	ret = smu_init_display_count(smu, 0); @@ -1449,6 +1449,7 @@ static int smu_disable_dpms(struct smu_context *smu)  	switch (adev->ip_versions[MP1_HWIP][0]) {  	case IP_VERSION(13, 0, 0):  	case IP_VERSION(13, 0, 7): +	case IP_VERSION(13, 0, 10):  		return 0;  	default:  		break; @@ -1517,7 +1518,7 @@ static int smu_disable_dpms(struct smu_context *smu)  	}  	if (adev->ip_versions[GC_HWIP][0] >= IP_VERSION(9, 4, 2) && -	    adev->gfx.rlc.funcs->stop) +	    !amdgpu_sriov_vf(adev) && adev->gfx.rlc.funcs->stop)  		adev->gfx.rlc.funcs->stop(adev);  	return ret; diff --git a/drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h b/drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h index e2fa3b066b96..3bc4128a22ac 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h +++ b/drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h @@ -168,6 +168,7 @@ struct smu_temperature_range {  	int mem_crit_max;  	int mem_emergency_max;  	int software_shutdown_temp; +	int software_shutdown_temp_offset;  };  struct smu_state_validation_block { @@ -568,6 +569,10 @@ struct smu_context  	u32 param_reg;  	u32 msg_reg;  	u32 resp_reg; + +	u32 debug_param_reg; +	u32 debug_msg_reg; +	u32 debug_resp_reg;  };  struct i2c_adapter; @@ -1388,6 +1393,14 @@ enum smu_cmn2asic_mapping_type {  	CMN2ASIC_MAPPING_WORKLOAD,  }; +enum smu_baco_seq { +	BACO_SEQ_BACO = 0, +	BACO_SEQ_MSR, +	BACO_SEQ_BAMACO, +	BACO_SEQ_ULPS, +	BACO_SEQ_COUNT, +}; +  #define MSG_MAP(msg, index, valid_in_vf) \  	[SMU_MSG_##msg] = {1, (index), (valid_in_vf)} diff --git a/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu13_driver_if_v13_0_7.h b/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu13_driver_if_v13_0_7.h index 25c08f963f49..d6b13933a98f 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu13_driver_if_v13_0_7.h +++ b/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu13_driver_if_v13_0_7.h @@ -25,10 +25,10 @@  // *** IMPORTANT ***  // PMFW TEAM: Always increment the interface version on any change to this file -#define SMU13_DRIVER_IF_VERSION  0x2C +#define SMU13_DRIVER_IF_VERSION  0x35  //Increment this version if SkuTable_t or BoardTable_t change -#define PPTABLE_VERSION 0x20 +#define PPTABLE_VERSION 0x27  #define NUM_GFXCLK_DPM_LEVELS    16  #define NUM_SOCCLK_DPM_LEVELS    8 @@ -96,7 +96,7 @@  #define FEATURE_MEM_TEMP_READ_BIT             47  #define FEATURE_ATHUB_MMHUB_PG_BIT            48  #define FEATURE_SOC_PCC_BIT                   49 -#define FEATURE_SPARE_50_BIT                  50 +#define FEATURE_EDC_PWRBRK_BIT                50  #define FEATURE_SPARE_51_BIT                  51  #define FEATURE_SPARE_52_BIT                  52  #define FEATURE_SPARE_53_BIT                  53 @@ -282,15 +282,15 @@ typedef enum {  } I2cControllerPort_e;  typedef enum { -  I2C_CONTROLLER_NAME_VR_GFX = 0, -  I2C_CONTROLLER_NAME_VR_SOC, -  I2C_CONTROLLER_NAME_VR_VMEMP, -  I2C_CONTROLLER_NAME_VR_VDDIO, -  I2C_CONTROLLER_NAME_LIQUID0, -  I2C_CONTROLLER_NAME_LIQUID1, -  I2C_CONTROLLER_NAME_PLX, -  I2C_CONTROLLER_NAME_OTHER, -  I2C_CONTROLLER_NAME_COUNT, +	I2C_CONTROLLER_NAME_VR_GFX = 0, +	I2C_CONTROLLER_NAME_VR_SOC, +	I2C_CONTROLLER_NAME_VR_VMEMP, +	I2C_CONTROLLER_NAME_VR_VDDIO, +	I2C_CONTROLLER_NAME_LIQUID0, +	I2C_CONTROLLER_NAME_LIQUID1, +	I2C_CONTROLLER_NAME_PLX, +	I2C_CONTROLLER_NAME_FAN_INTAKE, +	I2C_CONTROLLER_NAME_COUNT,  } I2cControllerName_e;  typedef enum { @@ -302,6 +302,7 @@ typedef enum {    I2C_CONTROLLER_THROTTLER_LIQUID0,    I2C_CONTROLLER_THROTTLER_LIQUID1,    I2C_CONTROLLER_THROTTLER_PLX, +  I2C_CONTROLLER_THROTTLER_FAN_INTAKE,    I2C_CONTROLLER_THROTTLER_INA3221,    I2C_CONTROLLER_THROTTLER_COUNT,  } I2cControllerThrottler_e; @@ -309,8 +310,9 @@ typedef enum {  typedef enum {    I2C_CONTROLLER_PROTOCOL_VR_XPDE132G5,    I2C_CONTROLLER_PROTOCOL_VR_IR35217, -  I2C_CONTROLLER_PROTOCOL_TMP_TMP102A, +  I2C_CONTROLLER_PROTOCOL_TMP_MAX31875,    I2C_CONTROLLER_PROTOCOL_INA3221, +  I2C_CONTROLLER_PROTOCOL_TMP_MAX6604,    I2C_CONTROLLER_PROTOCOL_COUNT,  } I2cControllerProtocol_e; @@ -690,6 +692,9 @@ typedef struct {  #define PP_OD_FEATURE_UCLK_BIT      8  #define PP_OD_FEATURE_ZERO_FAN_BIT      9  #define PP_OD_FEATURE_TEMPERATURE_BIT 10 +#define PP_OD_FEATURE_POWER_FEATURE_CTRL_BIT 11 +#define PP_OD_FEATURE_ASIC_TDC_BIT 12 +#define PP_OD_FEATURE_COUNT 13  typedef enum {    PP_OD_POWER_FEATURE_ALWAYS_ENABLED, @@ -697,6 +702,11 @@ typedef enum {    PP_OD_POWER_FEATURE_ALWAYS_DISABLED,  } PP_OD_POWER_FEATURE_e; +typedef enum { +  FAN_MODE_AUTO = 0, +  FAN_MODE_MANUAL_LINEAR, +} FanMode_e; +  typedef struct {    uint32_t FeatureCtrlMask; @@ -708,8 +718,8 @@ typedef struct {    uint8_t                RuntimePwrSavingFeaturesCtrl;    //Frequency changes -  int16_t               GfxclkFmin;           // MHz -  int16_t               GfxclkFmax;           // MHz +  int16_t                GfxclkFmin;           // MHz +  int16_t                GfxclkFmax;           // MHz    uint16_t               UclkFmin;             // MHz    uint16_t               UclkFmax;             // MHz @@ -730,7 +740,12 @@ typedef struct {    uint8_t                MaxOpTemp;    uint8_t                Padding[4]; -  uint32_t               Spare[12]; +  uint16_t               GfxVoltageFullCtrlMode; +  uint16_t               GfxclkFullCtrlMode; +  uint16_t               UclkFullCtrlMode; +  int16_t                AsicTdc; + +  uint32_t               Spare[10];    uint32_t               MmHubPadding[8]; // SMU internal use. Adding here instead of external as a workaround  } OverDriveTable_t; @@ -748,8 +763,8 @@ typedef struct {    uint8_t                IdlePwrSavingFeaturesCtrl;    uint8_t                RuntimePwrSavingFeaturesCtrl; -  uint16_t               GfxclkFmin;           // MHz -  uint16_t               GfxclkFmax;           // MHz +  int16_t                GfxclkFmin;           // MHz +  int16_t                GfxclkFmax;           // MHz    uint16_t               UclkFmin;             // MHz    uint16_t               UclkFmax;             // MHz @@ -769,7 +784,12 @@ typedef struct {    uint8_t                MaxOpTemp;    uint8_t                Padding[4]; -  uint32_t               Spare[12]; +  uint16_t               GfxVoltageFullCtrlMode; +  uint16_t               GfxclkFullCtrlMode; +  uint16_t               UclkFullCtrlMode; +  int16_t                AsicTdc; + +  uint32_t               Spare[10];  } OverDriveLimits_t; @@ -903,7 +923,8 @@ typedef struct {    uint16_t  FanStartTempMin;    uint16_t  FanStartTempMax; -  uint32_t Spare[12]; +  uint16_t  PowerMinPpt0[POWER_SOURCE_COUNT]; +  uint32_t  Spare[11];  } MsgLimits_t; @@ -1086,11 +1107,13 @@ typedef struct {    uint32_t        GfxoffSpare[15];    // GFX GPO -  float           DfllBtcMasterScalerM; +  uint32_t        DfllBtcMasterScalerM;    int32_t         DfllBtcMasterScalerB; -  float           DfllBtcSlaveScalerM; +  uint32_t        DfllBtcSlaveScalerM;    int32_t         DfllBtcSlaveScalerB; -  uint32_t        GfxGpoSpare[12]; +  uint32_t        DfllPccAsWaitCtrl; //GDFLL_AS_WAIT_CTRL_PCC register value to be passed to RLC msg +  uint32_t        DfllPccAsStepCtrl; //GDFLL_AS_STEP_CTRL_PCC register value to be passed to RLC msg +  uint32_t        GfxGpoSpare[10];    // GFX DCS @@ -1106,7 +1129,10 @@ typedef struct {    uint16_t        DcsTimeout;           //This is the amount of time SMU FW waits for RLC to put GFX into GFXOFF before reverting to the fallback mechanism of throttling GFXCLK to Fmin. -  uint32_t        DcsSpare[16]; +  uint32_t        DcsSpare[14]; + +  // UCLK section +  uint16_t     ShadowFreqTableUclk[NUM_UCLK_DPM_LEVELS];     // In MHz    // UCLK section    uint8_t      UseStrobeModeOptimizations; //Set to indicate that FW should use strobe mode optimizations @@ -1163,13 +1189,14 @@ typedef struct {    uint16_t IntakeTempHighIntakeAcousticLimit;    uint16_t IntakeTempAcouticLimitReleaseRate; -  uint16_t FanStalledTempLimitOffset; +  int16_t FanAbnormalTempLimitOffset;    uint16_t FanStalledTriggerRpm; -  uint16_t FanAbnormalTriggerRpm; -  uint16_t FanPadding; - -  uint32_t     FanSpare[14]; +  uint16_t FanAbnormalTriggerRpmCoeff; +  uint16_t FanAbnormalDetectionEnable; +  uint8_t      FanIntakeSensorSupport; +  uint8_t      FanIntakePadding[3]; +  uint32_t     FanSpare[13];    // SECTION: VDD_GFX AVFS    uint8_t      OverrideGfxAvfsFuses; @@ -1193,7 +1220,6 @@ typedef struct {    uint32_t   dGbV_dT_vmin;    uint32_t   dGbV_dT_vmax; -  //Unused: PMFW-9370    uint32_t   V2F_vmin_range_low;    uint32_t   V2F_vmin_range_high;    uint32_t   V2F_vmax_range_low; @@ -1238,8 +1264,21 @@ typedef struct {    // SECTION: Advanced Options    uint32_t          DebugOverrides; +  // Section: Total Board Power idle vs active coefficients +  uint8_t     TotalBoardPowerSupport; +  uint8_t     TotalBoardPowerPadding[3]; + +  int16_t     TotalIdleBoardPowerM; +  int16_t     TotalIdleBoardPowerB; +  int16_t     TotalBoardPowerM; +  int16_t     TotalBoardPowerB; + +  QuadraticInt_t qFeffCoeffGameClock[POWER_SOURCE_COUNT]; +  QuadraticInt_t qFeffCoeffBaseClock[POWER_SOURCE_COUNT]; +  QuadraticInt_t qFeffCoeffBoostClock[POWER_SOURCE_COUNT]; +    // SECTION: Sku Reserved -  uint32_t         Spare[64]; +  uint32_t         Spare[43];    // Padding for MMHUB - do not modify this    uint32_t     MmHubPadding[8]; @@ -1304,7 +1343,8 @@ typedef struct {    // SECTION: Clock Spread Spectrum    // UCLK Spread Spectrum -  uint16_t     UclkSpreadPadding; +  uint8_t      UclkTrainingModeSpreadPercent; // Q4.4 +  uint8_t      UclkSpreadPadding;    uint16_t     UclkSpreadFreq;      // kHz    // UCLK Spread Spectrum @@ -1317,11 +1357,7 @@ typedef struct {    // Section: Memory Config    uint8_t      DramWidth; // Width of interface to the channel for each DRAM module. See DRAM_BIT_WIDTH_TYPE_e -  uint8_t      PaddingMem1[3]; - -  // Section: Total Board Power -  uint16_t     TotalBoardPower;     //Only needed for TCP Estimated case, where TCP = TGP+Total Board Power -  uint16_t     BoardPowerPadding; +  uint8_t      PaddingMem1[7];    // SECTION: UMC feature flags    uint8_t      HsrEnabled; @@ -1423,8 +1459,11 @@ typedef struct {    uint16_t Vcn1ActivityPercentage  ;    uint32_t EnergyAccumulator; -  uint16_t AverageSocketPower    ; +  uint16_t AverageSocketPower; +  uint16_t AverageTotalBoardPower; +    uint16_t AvgTemperature[TEMP_COUNT]; +  uint16_t AvgTemperatureFanIntake;    uint8_t  PcieRate               ;    uint8_t  PcieWidth              ; @@ -1592,5 +1631,7 @@ typedef struct {  #define IH_INTERRUPT_CONTEXT_ID_AUDIO_D0            0x5  #define IH_INTERRUPT_CONTEXT_ID_AUDIO_D3            0x6  #define IH_INTERRUPT_CONTEXT_ID_THERMAL_THROTTLING  0x7 +#define IH_INTERRUPT_CONTEXT_ID_FAN_ABNORMAL        0x8 +#define IH_INTERRUPT_CONTEXT_ID_FAN_RECOVERY        0x9  #endif diff --git a/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v13_0_0_ppsmc.h b/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v13_0_0_ppsmc.h index 9ebb8f39732a..8b8266890a10 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v13_0_0_ppsmc.h +++ b/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v13_0_0_ppsmc.h @@ -131,7 +131,13 @@  #define PPSMC_MSG_EnableAudioStutterWA           0x44  #define PPSMC_MSG_PowerUpUmsch                   0x45  #define PPSMC_MSG_PowerDownUmsch                 0x46 -#define PPSMC_Message_Count                      0x47 +#define PPSMC_MSG_SetDcsArch                     0x47 +#define PPSMC_MSG_TriggerVFFLR                   0x48 +#define PPSMC_MSG_SetNumBadMemoryPagesRetired    0x49 +#define PPSMC_MSG_SetBadMemoryPagesRetiredFlagsPerChannel 0x4A +#define PPSMC_MSG_SetPriorityDeltaGain           0x4B +#define PPSMC_MSG_AllowIHHostInterrupt           0x4C +#define PPSMC_Message_Count                      0x4D  //Debug Dump Message  #define DEBUGSMC_MSG_TestMessage                    0x1 diff --git a/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v13_0_4_ppsmc.h b/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v13_0_4_ppsmc.h index d9b0cd752200..f4d6c07b56ea 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v13_0_4_ppsmc.h +++ b/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v13_0_4_ppsmc.h @@ -54,14 +54,14 @@  #define PPSMC_MSG_TestMessage                   0x01 ///< To check if PMFW is alive and responding. Requirement specified by PMFW team  #define PPSMC_MSG_GetPmfwVersion                0x02 ///< Get PMFW version  #define PPSMC_MSG_GetDriverIfVersion            0x03 ///< Get PMFW_DRIVER_IF version -#define PPSMC_MSG_EnableGfxOff                  0x04 ///< Enable GFXOFF -#define PPSMC_MSG_DisableGfxOff                 0x05 ///< Disable GFXOFF +#define PPSMC_MSG_SPARE0                        0x04 ///< SPARE +#define PPSMC_MSG_SPARE1                        0x05 ///< SPARE  #define PPSMC_MSG_PowerDownVcn                  0x06 ///< Power down VCN  #define PPSMC_MSG_PowerUpVcn                    0x07 ///< Power up VCN; VCN is power gated by default  #define PPSMC_MSG_SetHardMinVcn                 0x08 ///< For wireless display  #define PPSMC_MSG_SetSoftMinGfxclk              0x09 ///< Set SoftMin for GFXCLK, argument is frequency in MHz -#define PPSMC_MSG_ActiveProcessNotify           0x0A ///< Needs update -#define PPSMC_MSG_ForcePowerDownGfx             0x0B ///< Force power down GFX, i.e. enter GFXOFF +#define PPSMC_MSG_SPARE2                        0x0A ///< SPARE +#define PPSMC_MSG_SPARE3                        0x0B ///< SPARE  #define PPSMC_MSG_PrepareMp1ForUnload           0x0C ///< Prepare PMFW for GFX driver unload  #define PPSMC_MSG_SetDriverDramAddrHigh         0x0D ///< Set high 32 bits of DRAM address for Driver table transfer  #define PPSMC_MSG_SetDriverDramAddrLow          0x0E ///< Set low 32 bits of DRAM address for Driver table transfer @@ -73,8 +73,7 @@  #define PPSMC_MSG_SetSoftMinFclk                0x14 ///< Set hard min for FCLK  #define PPSMC_MSG_SetSoftMinVcn                 0x15 ///< Set soft min for VCN clocks (VCLK and DCLK) - -#define PPSMC_MSG_EnableGfxImu                  0x16 ///< Needs update +#define PPSMC_MSG_EnableGfxImu                  0x16 ///< Enable GFX IMU  #define PPSMC_MSG_GetGfxclkFrequency            0x17 ///< Get GFX clock frequency  #define PPSMC_MSG_GetFclkFrequency              0x18 ///< Get FCLK frequency @@ -102,8 +101,8 @@  #define PPSMC_MSG_SetHardMinIspxclkByFreq       0x2C ///< Set HardMin by frequency for ISPXCLK  #define PPSMC_MSG_PowerDownUmsch                0x2D ///< Power down VCN.UMSCH (aka VSCH) scheduler  #define PPSMC_MSG_PowerUpUmsch                  0x2E ///< Power up VCN.UMSCH (aka VSCH) scheduler -#define PPSMC_Message_IspStutterOn_MmhubPgDis   0x2F ///< ISP StutterOn mmHub PgDis -#define PPSMC_Message_IspStutterOff_MmhubPgEn   0x30 ///< ISP StufferOff mmHub PgEn +#define PPSMC_MSG_IspStutterOn_MmhubPgDis       0x2F ///< ISP StutterOn mmHub PgDis +#define PPSMC_MSG_IspStutterOff_MmhubPgEn       0x30 ///< ISP StufferOff mmHub PgEn  #define PPSMC_Message_Count                     0x31 ///< Total number of PPSMC messages  /** @}*/ diff --git a/drivers/gpu/drm/amd/pm/swsmu/inc/smu_types.h b/drivers/gpu/drm/amd/pm/swsmu/inc/smu_types.h index 58098b82df66..a4e3425b1027 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/inc/smu_types.h +++ b/drivers/gpu/drm/amd/pm/swsmu/inc/smu_types.h @@ -239,7 +239,9 @@  	__SMU_DUMMY_MAP(DriverMode2Reset), \  	__SMU_DUMMY_MAP(GetGfxOffStatus),		 \  	__SMU_DUMMY_MAP(GetGfxOffEntryCount),		 \ -	__SMU_DUMMY_MAP(LogGfxOffResidency), +	__SMU_DUMMY_MAP(LogGfxOffResidency),			\ +	__SMU_DUMMY_MAP(SetNumBadMemoryPagesRetired),		\ +	__SMU_DUMMY_MAP(SetBadMemoryPagesRetiredFlagsPerChannel),  #undef __SMU_DUMMY_MAP  #define __SMU_DUMMY_MAP(type)	SMU_MSG_##type diff --git a/drivers/gpu/drm/amd/pm/swsmu/inc/smu_v11_0.h b/drivers/gpu/drm/amd/pm/swsmu/inc/smu_v11_0.h index a9215494dcdd..d466db6f0ad4 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/inc/smu_v11_0.h +++ b/drivers/gpu/drm/amd/pm/swsmu/inc/smu_v11_0.h @@ -147,14 +147,6 @@ struct smu_11_5_power_context {  	uint32_t	max_fast_ppt_limit;  }; -enum smu_v11_0_baco_seq { -	BACO_SEQ_BACO = 0, -	BACO_SEQ_MSR, -	BACO_SEQ_BAMACO, -	BACO_SEQ_ULPS, -	BACO_SEQ_COUNT, -}; -  #if defined(SWSMU_CODE_LAYER_L2) || defined(SWSMU_CODE_LAYER_L3)  int smu_v11_0_init_microcode(struct smu_context *smu); @@ -257,7 +249,7 @@ int smu_v11_0_baco_enter(struct smu_context *smu);  int smu_v11_0_baco_exit(struct smu_context *smu);  int smu_v11_0_baco_set_armd3_sequence(struct smu_context *smu, -				      enum smu_v11_0_baco_seq baco_seq); +				      enum smu_baco_seq baco_seq);  int smu_v11_0_mode1_reset(struct smu_context *smu); diff --git a/drivers/gpu/drm/amd/pm/swsmu/inc/smu_v13_0.h b/drivers/gpu/drm/amd/pm/swsmu/inc/smu_v13_0.h index 80fb583b18d9..865d6358918d 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/inc/smu_v13_0.h +++ b/drivers/gpu/drm/amd/pm/swsmu/inc/smu_v13_0.h @@ -31,7 +31,7 @@  #define SMU13_DRIVER_IF_VERSION_SMU_V13_0_4 0x07  #define SMU13_DRIVER_IF_VERSION_SMU_V13_0_5 0x04  #define SMU13_DRIVER_IF_VERSION_SMU_V13_0_0_10 0x32 -#define SMU13_DRIVER_IF_VERSION_SMU_V13_0_7 0x2C +#define SMU13_DRIVER_IF_VERSION_SMU_V13_0_7 0x35  #define SMU13_DRIVER_IF_VERSION_SMU_V13_0_10 0x1D  #define SMU13_MODE1_RESET_WAIT_TIME_IN_MS 500  //500ms @@ -124,14 +124,6 @@ struct smu_13_0_power_context {  	enum smu_13_0_power_state power_state;  }; -enum smu_v13_0_baco_seq { -	BACO_SEQ_BACO = 0, -	BACO_SEQ_MSR, -	BACO_SEQ_BAMACO, -	BACO_SEQ_ULPS, -	BACO_SEQ_COUNT, -}; -  #if defined(SWSMU_CODE_LAYER_L2) || defined(SWSMU_CODE_LAYER_L3)  int smu_v13_0_init_microcode(struct smu_context *smu); @@ -218,6 +210,9 @@ int smu_v13_0_set_azalia_d3_pme(struct smu_context *smu);  int smu_v13_0_get_max_sustainable_clocks_by_dc(struct smu_context *smu,  					       struct pp_smu_nv_clock_table *max_clocks); +int smu_v13_0_baco_set_armd3_sequence(struct smu_context *smu, +				      enum smu_baco_seq baco_seq); +  bool smu_v13_0_baco_is_support(struct smu_context *smu);  enum smu_baco_state smu_v13_0_baco_get_state(struct smu_context *smu); diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c index 74996a8fb671..697e98a0a20a 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c +++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c @@ -377,7 +377,13 @@ static void sienna_cichlid_check_bxco_support(struct smu_context *smu)  		if (((adev->pdev->device == 0x73A1) &&  		    (adev->pdev->revision == 0x00)) ||  		    ((adev->pdev->device == 0x73BF) && -		    (adev->pdev->revision == 0xCF))) +		    (adev->pdev->revision == 0xCF)) || +		    ((adev->pdev->device == 0x7422) && +		    (adev->pdev->revision == 0x00)) || +		    ((adev->pdev->device == 0x73A3) && +		    (adev->pdev->revision == 0x00)) || +		    ((adev->pdev->device == 0x73E3) && +		    (adev->pdev->revision == 0x00)))  			smu_baco->platform_support = false;  	} diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu11/smu_v11_0.c b/drivers/gpu/drm/amd/pm/swsmu/smu11/smu_v11_0.c index dccbd9f70723..ad66d57aa102 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/smu11/smu_v11_0.c +++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/smu_v11_0.c @@ -79,6 +79,17 @@ MODULE_FIRMWARE("amdgpu/beige_goby_smc.bin");  #define mmTHM_BACO_CNTL_ARCT			0xA7  #define mmTHM_BACO_CNTL_ARCT_BASE_IDX		0 +static void smu_v11_0_poll_baco_exit(struct smu_context *smu) +{ +	struct amdgpu_device *adev = smu->adev; +	uint32_t data, loop = 0; + +	do { +		usleep_range(1000, 1100); +		data = RREG32_SOC15(THM, 0, mmTHM_BACO_CNTL); +	} while ((data & 0x100) && (++loop < 100)); +} +  int smu_v11_0_init_microcode(struct smu_context *smu)  {  	struct amdgpu_device *adev = smu->adev; @@ -1576,7 +1587,7 @@ int smu_v11_0_set_azalia_d3_pme(struct smu_context *smu)  }  int smu_v11_0_baco_set_armd3_sequence(struct smu_context *smu, -				      enum smu_v11_0_baco_seq baco_seq) +				      enum smu_baco_seq baco_seq)  {  	return smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_ArmD3, baco_seq, NULL);  } @@ -1588,6 +1599,10 @@ bool smu_v11_0_baco_is_support(struct smu_context *smu)  	if (amdgpu_sriov_vf(smu->adev) || !smu_baco->platform_support)  		return false; +	/* return true if ASIC is in BACO state already */ +	if (smu_v11_0_baco_get_state(smu) == SMU_BACO_STATE_ENTER) +		return true; +  	/* Arcturus does not support this bit mask */  	if (smu_cmn_feature_is_supported(smu, SMU_FEATURE_BACO_BIT) &&  	   !smu_cmn_feature_is_enabled(smu, SMU_FEATURE_BACO_BIT)) @@ -1685,7 +1700,18 @@ int smu_v11_0_baco_enter(struct smu_context *smu)  int smu_v11_0_baco_exit(struct smu_context *smu)  { -	return smu_v11_0_baco_set_state(smu, SMU_BACO_STATE_EXIT); +	int ret; + +	ret = smu_v11_0_baco_set_state(smu, SMU_BACO_STATE_EXIT); +	if (!ret) { +		/* +		 * Poll BACO exit status to ensure FW has completed +		 * BACO exit process to avoid timing issues. +		 */ +		smu_v11_0_poll_baco_exit(smu); +	} + +	return ret;  }  int smu_v11_0_mode1_reset(struct smu_context *smu) diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c index 43fb102a65f5..f5e90e0a99df 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c +++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c @@ -250,6 +250,7 @@ int smu_v13_0_check_fw_status(struct smu_context *smu)  	switch (adev->ip_versions[MP1_HWIP][0]) {  	case IP_VERSION(13, 0, 4): +	case IP_VERSION(13, 0, 11):  		mp1_fw_flags = RREG32_PCIE(MP1_Public |  					   (smnMP1_V13_0_4_FIRMWARE_FLAGS & 0xffffffff));  		break; @@ -301,6 +302,7 @@ int smu_v13_0_check_fw_version(struct smu_context *smu)  		smu->smc_driver_if_version = SMU13_DRIVER_IF_VERSION_YELLOW_CARP;  		break;  	case IP_VERSION(13, 0, 4): +	case IP_VERSION(13, 0, 11):  		smu->smc_driver_if_version = SMU13_DRIVER_IF_VERSION_SMU_V13_0_4;  		break;  	case IP_VERSION(13, 0, 5): @@ -841,6 +843,7 @@ int smu_v13_0_gfx_off_control(struct smu_context *smu, bool enable)  	case IP_VERSION(13, 0, 7):  	case IP_VERSION(13, 0, 8):  	case IP_VERSION(13, 0, 10): +	case IP_VERSION(13, 0, 11):  		if (!(adev->pm.pp_feature & PP_GFXOFF_MASK))  			return 0;  		if (enable) @@ -1376,6 +1379,7 @@ static int smu_v13_0_irq_process(struct amdgpu_device *adev,  	 */  	uint32_t ctxid = entry->src_data[0];  	uint32_t data; +	uint32_t high;  	if (client_id == SOC15_IH_CLIENTID_THM) {  		switch (src_id) { @@ -1432,6 +1436,36 @@ static int smu_v13_0_irq_process(struct amdgpu_device *adev,  					schedule_work(&smu->throttling_logging_work);  				break; +			case 0x8: +				high = smu->thermal_range.software_shutdown_temp + +					smu->thermal_range.software_shutdown_temp_offset; +				high = min_t(typeof(high), +					     SMU_THERMAL_MAXIMUM_ALERT_TEMP, +					     high); +				dev_emerg(adev->dev, "Reduce soft CTF limit to %d (by an offset %d)\n", +							high, +							smu->thermal_range.software_shutdown_temp_offset); + +				data = RREG32_SOC15(THM, 0, regTHM_THERMAL_INT_CTRL); +				data = REG_SET_FIELD(data, THM_THERMAL_INT_CTRL, +							DIG_THERM_INTH, +							(high & 0xff)); +				data = data & (~THM_THERMAL_INT_CTRL__THERM_TRIGGER_MASK_MASK); +				WREG32_SOC15(THM, 0, regTHM_THERMAL_INT_CTRL, data); +				break; +			case 0x9: +				high = min_t(typeof(high), +					     SMU_THERMAL_MAXIMUM_ALERT_TEMP, +					     smu->thermal_range.software_shutdown_temp); +				dev_emerg(adev->dev, "Recover soft CTF limit to %d\n", high); + +				data = RREG32_SOC15(THM, 0, regTHM_THERMAL_INT_CTRL); +				data = REG_SET_FIELD(data, THM_THERMAL_INT_CTRL, +							DIG_THERM_INTH, +							(high & 0xff)); +				data = data & (~THM_THERMAL_INT_CTRL__THERM_TRIGGER_MASK_MASK); +				WREG32_SOC15(THM, 0, regTHM_THERMAL_INT_CTRL, data); +				break;  			}  		}  	} @@ -2230,6 +2264,15 @@ int smu_v13_0_gfx_ulv_control(struct smu_context *smu,  	return ret;  } +int smu_v13_0_baco_set_armd3_sequence(struct smu_context *smu, +				      enum smu_baco_seq baco_seq) +{ +	return smu_cmn_send_smc_msg_with_param(smu, +					       SMU_MSG_ArmD3, +					       baco_seq, +					       NULL); +} +  bool smu_v13_0_baco_is_support(struct smu_context *smu)  {  	struct smu_baco_context *smu_baco = &smu->smu_baco; diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c index 29529328152d..87d7c66e49ef 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c +++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c @@ -70,6 +70,26 @@  #define MP0_MP1_DATA_REGION_SIZE_COMBOPPTABLE	0x4000 +#define mmMP1_SMN_C2PMSG_66                                                                            0x0282 +#define mmMP1_SMN_C2PMSG_66_BASE_IDX                                                                   0 + +#define mmMP1_SMN_C2PMSG_82                                                                            0x0292 +#define mmMP1_SMN_C2PMSG_82_BASE_IDX                                                                   0 + +#define mmMP1_SMN_C2PMSG_90                                                                            0x029a +#define mmMP1_SMN_C2PMSG_90_BASE_IDX                                                                   0 + +#define mmMP1_SMN_C2PMSG_75                                                                            0x028b +#define mmMP1_SMN_C2PMSG_75_BASE_IDX                                                                   0 + +#define mmMP1_SMN_C2PMSG_53                                                                            0x0275 +#define mmMP1_SMN_C2PMSG_53_BASE_IDX                                                                   0 + +#define mmMP1_SMN_C2PMSG_54                                                                            0x0276 +#define mmMP1_SMN_C2PMSG_54_BASE_IDX                                                                   0 + +#define DEBUGSMC_MSG_Mode1Reset	2 +  static struct cmn2asic_msg_mapping smu_v13_0_0_message_map[SMU_MSG_MAX_COUNT] = {  	MSG_MAP(TestMessage,			PPSMC_MSG_TestMessage,                 1),  	MSG_MAP(GetSmuVersion,			PPSMC_MSG_GetSmuVersion,               1), @@ -120,6 +140,10 @@ static struct cmn2asic_msg_mapping smu_v13_0_0_message_map[SMU_MSG_MAX_COUNT] =  	MSG_MAP(Mode1Reset,			PPSMC_MSG_Mode1Reset,                  0),  	MSG_MAP(PrepareMp1ForUnload,		PPSMC_MSG_PrepareMp1ForUnload,         0),  	MSG_MAP(DFCstateControl,		PPSMC_MSG_SetExternalClientDfCstateAllow, 0), +	MSG_MAP(ArmD3,				PPSMC_MSG_ArmD3,                       0), +	MSG_MAP(SetNumBadMemoryPagesRetired,	PPSMC_MSG_SetNumBadMemoryPagesRetired,   0), +	MSG_MAP(SetBadMemoryPagesRetiredFlagsPerChannel, +			    PPSMC_MSG_SetBadMemoryPagesRetiredFlagsPerChannel,   0),  };  static struct cmn2asic_mapping smu_v13_0_0_clk_map[SMU_CLK_COUNT] = { @@ -1566,6 +1590,31 @@ static int smu_v13_0_0_set_power_profile_mode(struct smu_context *smu,  					       NULL);  } +static int smu_v13_0_0_baco_enter(struct smu_context *smu) +{ +	struct smu_baco_context *smu_baco = &smu->smu_baco; +	struct amdgpu_device *adev = smu->adev; + +	if (adev->in_runpm && smu_cmn_is_audio_func_enabled(adev)) +		return smu_v13_0_baco_set_armd3_sequence(smu, +				smu_baco->maco_support ? BACO_SEQ_BAMACO : BACO_SEQ_BACO); +	else +		return smu_v13_0_baco_enter(smu); +} + +static int smu_v13_0_0_baco_exit(struct smu_context *smu) +{ +	struct amdgpu_device *adev = smu->adev; + +	if (adev->in_runpm && smu_cmn_is_audio_func_enabled(adev)) { +		/* Wait for PMFW handling for the Dstate change */ +		usleep_range(10000, 11000); +		return smu_v13_0_baco_set_armd3_sequence(smu, BACO_SEQ_ULPS); +	} else { +		return smu_v13_0_baco_exit(smu); +	} +} +  static bool smu_v13_0_0_is_mode1_reset_supported(struct smu_context *smu)  {  	struct amdgpu_device *adev = smu->adev; @@ -1763,6 +1812,69 @@ static int smu_v13_0_0_set_df_cstate(struct smu_context *smu,  					       NULL);  } +static int smu_v13_0_0_mode1_reset(struct smu_context *smu) +{ +	int ret; +	struct amdgpu_device *adev = smu->adev; + +	if (adev->ip_versions[MP1_HWIP][0] == IP_VERSION(13, 0, 10)) +		ret = smu_cmn_send_debug_smc_msg(smu, DEBUGSMC_MSG_Mode1Reset); +	else +		ret = smu_cmn_send_smc_msg(smu, SMU_MSG_Mode1Reset, NULL); + +	if (!ret) +		msleep(SMU13_MODE1_RESET_WAIT_TIME_IN_MS); + +	return ret; +} + +static void smu_v13_0_0_set_smu_mailbox_registers(struct smu_context *smu) +{ +	struct amdgpu_device *adev = smu->adev; + +	smu->param_reg = SOC15_REG_OFFSET(MP1, 0, mmMP1_SMN_C2PMSG_82); +	smu->msg_reg = SOC15_REG_OFFSET(MP1, 0, mmMP1_SMN_C2PMSG_66); +	smu->resp_reg = SOC15_REG_OFFSET(MP1, 0, mmMP1_SMN_C2PMSG_90); + +	smu->debug_param_reg = SOC15_REG_OFFSET(MP1, 0, mmMP1_SMN_C2PMSG_53); +	smu->debug_msg_reg = SOC15_REG_OFFSET(MP1, 0, mmMP1_SMN_C2PMSG_75); +	smu->debug_resp_reg = SOC15_REG_OFFSET(MP1, 0, mmMP1_SMN_C2PMSG_54); +} + +static int smu_v13_0_0_smu_send_bad_mem_page_num(struct smu_context *smu, +		uint32_t size) +{ +	int ret = 0; + +	/* message SMU to update the bad page number on SMUBUS */ +	ret = smu_cmn_send_smc_msg_with_param(smu, +					  SMU_MSG_SetNumBadMemoryPagesRetired, +					  size, NULL); +	if (ret) +		dev_err(smu->adev->dev, +			  "[%s] failed to message SMU to update bad memory pages number\n", +			  __func__); + +	return ret; +} + +static int smu_v13_0_0_send_bad_mem_channel_flag(struct smu_context *smu, +		uint32_t size) +{ +	int ret = 0; + +	/* message SMU to update the bad channel info on SMUBUS */ +	ret = smu_cmn_send_smc_msg_with_param(smu, +				  SMU_MSG_SetBadMemoryPagesRetiredFlagsPerChannel, +				  size, NULL); +	if (ret) +		dev_err(smu->adev->dev, +			  "[%s] failed to message SMU to update bad memory pages channel info\n", +			  __func__); + +	return ret; +} +  static const struct pptable_funcs smu_v13_0_0_ppt_funcs = {  	.get_allowed_feature_mask = smu_v13_0_0_get_allowed_feature_mask,  	.set_default_dpm_table = smu_v13_0_0_set_default_dpm_table, @@ -1827,12 +1939,14 @@ static const struct pptable_funcs smu_v13_0_0_ppt_funcs = {  	.baco_is_support = smu_v13_0_baco_is_support,  	.baco_get_state = smu_v13_0_baco_get_state,  	.baco_set_state = smu_v13_0_baco_set_state, -	.baco_enter = smu_v13_0_baco_enter, -	.baco_exit = smu_v13_0_baco_exit, +	.baco_enter = smu_v13_0_0_baco_enter, +	.baco_exit = smu_v13_0_0_baco_exit,  	.mode1_reset_is_support = smu_v13_0_0_is_mode1_reset_supported, -	.mode1_reset = smu_v13_0_mode1_reset, +	.mode1_reset = smu_v13_0_0_mode1_reset,  	.set_mp1_state = smu_v13_0_0_set_mp1_state,  	.set_df_cstate = smu_v13_0_0_set_df_cstate, +	.send_hbm_bad_pages_num = smu_v13_0_0_smu_send_bad_mem_page_num, +	.send_hbm_bad_channel_flag = smu_v13_0_0_send_bad_mem_channel_flag,  };  void smu_v13_0_0_set_ppt_funcs(struct smu_context *smu) @@ -1844,5 +1958,5 @@ void smu_v13_0_0_set_ppt_funcs(struct smu_context *smu)  	smu->table_map = smu_v13_0_0_table_map;  	smu->pwr_src_map = smu_v13_0_0_pwr_src_map;  	smu->workload_map = smu_v13_0_0_workload_map; -	smu_v13_0_set_smu_mailbox_registers(smu); +	smu_v13_0_0_set_smu_mailbox_registers(smu);  } diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_4_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_4_ppt.c index 97e1d55dcaad..8fa9a36c38b6 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_4_ppt.c +++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_4_ppt.c @@ -1026,6 +1026,15 @@ static const struct pptable_funcs smu_v13_0_4_ppt_funcs = {  	.set_gfx_power_up_by_imu = smu_v13_0_set_gfx_power_up_by_imu,  }; +static void smu_v13_0_4_set_smu_mailbox_registers(struct smu_context *smu) +{ +	struct amdgpu_device *adev = smu->adev; + +	smu->param_reg = SOC15_REG_OFFSET(MP1, 0, mmMP1_SMN_C2PMSG_82); +	smu->msg_reg = SOC15_REG_OFFSET(MP1, 0, mmMP1_SMN_C2PMSG_66); +	smu->resp_reg = SOC15_REG_OFFSET(MP1, 0, mmMP1_SMN_C2PMSG_90); +} +  void smu_v13_0_4_set_ppt_funcs(struct smu_context *smu)  {  	struct amdgpu_device *adev = smu->adev; @@ -1035,7 +1044,9 @@ void smu_v13_0_4_set_ppt_funcs(struct smu_context *smu)  	smu->feature_map = smu_v13_0_4_feature_mask_map;  	smu->table_map = smu_v13_0_4_table_map;  	smu->is_apu = true; -	smu->param_reg = SOC15_REG_OFFSET(MP1, 0, mmMP1_SMN_C2PMSG_82); -	smu->msg_reg = SOC15_REG_OFFSET(MP1, 0, mmMP1_SMN_C2PMSG_66); -	smu->resp_reg = SOC15_REG_OFFSET(MP1, 0, mmMP1_SMN_C2PMSG_90); + +	if (adev->ip_versions[MP1_HWIP][0] == IP_VERSION(13, 0, 4)) +		smu_v13_0_4_set_smu_mailbox_registers(smu); +	else +		smu_v13_0_set_smu_mailbox_registers(smu);  } diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c index c4102cfb734c..c3c9ef523e59 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c +++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c @@ -122,6 +122,7 @@ static struct cmn2asic_msg_mapping smu_v13_0_7_message_map[SMU_MSG_MAX_COUNT] =  	MSG_MAP(PrepareMp1ForUnload,		PPSMC_MSG_PrepareMp1ForUnload,         0),  	MSG_MAP(SetMGpuFanBoostLimitRpm,	PPSMC_MSG_SetMGpuFanBoostLimitRpm,     0),  	MSG_MAP(DFCstateControl,		PPSMC_MSG_SetExternalClientDfCstateAllow, 0), +	MSG_MAP(ArmD3,				PPSMC_MSG_ArmD3,                       0),  };  static struct cmn2asic_mapping smu_v13_0_7_clk_map[SMU_CLK_COUNT] = { @@ -1222,6 +1223,7 @@ static int smu_v13_0_7_get_thermal_temperature_range(struct smu_context *smu,  	range->mem_emergency_max = (pptable->SkuTable.TemperatureLimit[TEMP_MEM] + CTF_OFFSET_MEM)*  		SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;  	range->software_shutdown_temp = powerplay_table->software_shutdown_temp; +	range->software_shutdown_temp_offset = pptable->SkuTable.FanAbnormalTempLimitOffset;  	return 0;  } @@ -1578,6 +1580,31 @@ static int smu_v13_0_7_set_mp1_state(struct smu_context *smu,  	return ret;  } +static int smu_v13_0_7_baco_enter(struct smu_context *smu) +{ +	struct smu_baco_context *smu_baco = &smu->smu_baco; +	struct amdgpu_device *adev = smu->adev; + +	if (adev->in_runpm && smu_cmn_is_audio_func_enabled(adev)) +		return smu_v13_0_baco_set_armd3_sequence(smu, +				smu_baco->maco_support ? BACO_SEQ_BAMACO : BACO_SEQ_BACO); +	else +		return smu_v13_0_baco_enter(smu); +} + +static int smu_v13_0_7_baco_exit(struct smu_context *smu) +{ +	struct amdgpu_device *adev = smu->adev; + +	if (adev->in_runpm && smu_cmn_is_audio_func_enabled(adev)) { +		/* Wait for PMFW handling for the Dstate change */ +		usleep_range(10000, 11000); +		return smu_v13_0_baco_set_armd3_sequence(smu, BACO_SEQ_ULPS); +	} else { +		return smu_v13_0_baco_exit(smu); +	} +} +  static bool smu_v13_0_7_is_mode1_reset_supported(struct smu_context *smu)  {  	struct amdgpu_device *adev = smu->adev; @@ -1655,8 +1682,8 @@ static const struct pptable_funcs smu_v13_0_7_ppt_funcs = {  	.baco_is_support = smu_v13_0_baco_is_support,  	.baco_get_state = smu_v13_0_baco_get_state,  	.baco_set_state = smu_v13_0_baco_set_state, -	.baco_enter = smu_v13_0_baco_enter, -	.baco_exit = smu_v13_0_baco_exit, +	.baco_enter = smu_v13_0_7_baco_enter, +	.baco_exit = smu_v13_0_7_baco_exit,  	.mode1_reset_is_support = smu_v13_0_7_is_mode1_reset_supported,  	.mode1_reset = smu_v13_0_mode1_reset,  	.set_mp1_state = smu_v13_0_7_set_mp1_state, diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu_cmn.c b/drivers/gpu/drm/amd/pm/swsmu/smu_cmn.c index e4f8f90ac5aa..768b6e7dbd77 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/smu_cmn.c +++ b/drivers/gpu/drm/amd/pm/swsmu/smu_cmn.c @@ -233,6 +233,18 @@ static void __smu_cmn_send_msg(struct smu_context *smu,  	WREG32(smu->msg_reg, msg);  } +static int __smu_cmn_send_debug_msg(struct smu_context *smu, +			       u32 msg, +			       u32 param) +{ +	struct amdgpu_device *adev = smu->adev; + +	WREG32(smu->debug_param_reg, param); +	WREG32(smu->debug_msg_reg, msg); +	WREG32(smu->debug_resp_reg, 0); + +	return 0; +}  /**   * smu_cmn_send_msg_without_waiting -- send the message; don't wait for status   * @smu: pointer to an SMU context @@ -386,6 +398,12 @@ int smu_cmn_send_smc_msg(struct smu_context *smu,  					       read_arg);  } +int smu_cmn_send_debug_smc_msg(struct smu_context *smu, +			 uint32_t msg) +{ +	return __smu_cmn_send_debug_msg(smu, msg, 0); +} +  int smu_cmn_to_asic_specific_index(struct smu_context *smu,  				   enum smu_cmn2asic_mapping_type type,  				   uint32_t index) diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu_cmn.h b/drivers/gpu/drm/amd/pm/swsmu/smu_cmn.h index 1526ce09c399..f82cf76dd3a4 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/smu_cmn.h +++ b/drivers/gpu/drm/amd/pm/swsmu/smu_cmn.h @@ -42,6 +42,9 @@ int smu_cmn_send_smc_msg(struct smu_context *smu,  			 enum smu_message_type msg,  			 uint32_t *read_arg); +int smu_cmn_send_debug_smc_msg(struct smu_context *smu, +			 uint32_t msg); +  int smu_cmn_wait_for_response(struct smu_context *smu);  int smu_cmn_to_asic_specific_index(struct smu_context *smu, |