[PATCH] drm/amd/pm: conditionally disable pcie lane switching for some sienna_cichlid SKUs

Lazar, Lijo lijo.lazar at amd.com
Fri Apr 21 09:30:24 UTC 2023



On 4/21/2023 1:02 PM, Quan, Evan wrote:
> [AMD Official Use Only - General]
> 
> This seems able to address some audio noise issue observed per customer's feedback.
> 
> Evan
>> -----Original Message-----
>> From: Quan, Evan <Evan.Quan at amd.com>
>> Sent: Friday, April 21, 2023 3:29 PM
>> To: amd-gfx at lists.freedesktop.org
>> Cc: Deucher, Alexander <Alexander.Deucher at amd.com>; Limonciello, Mario
>> <Mario.Limonciello at amd.com>; Quan, Evan <Evan.Quan at amd.com>
>> Subject: [PATCH] drm/amd/pm: conditionally disable pcie lane switching for
>> some sienna_cichlid SKUs
>>
>> Disable the pcie lane switching for some sienna_cichlid SKUs since it
>> might not work well on some platforms.
>>
>> Signed-off-by: Evan Quan <evan.quan at amd.com>
>> Change-Id: Iea9ceaa146c8706768ee077c10e5d33bce9bc1c2
>> ---
>>   .../amd/pm/swsmu/smu11/sienna_cichlid_ppt.c   | 92 +++++++++++++++---
>> -
>>   1 file changed, 74 insertions(+), 18 deletions(-)
>>
>> 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 4b91cdc3eaa0..e7223513e384 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
>> @@ -2067,33 +2067,94 @@ static int
>> sienna_cichlid_display_disable_memory_clock_switch(struct smu_context
>>   	return ret;
>>   }
>>
>> +static void sienna_cichlid_get_override_pcie_settings(struct smu_context
>> *smu,
>> +						      uint32_t
>> *gen_speed_override,
>> +						      uint32_t
>> *lane_width_override)
>> +{
>> +	struct amdgpu_device *adev = smu->adev;
>> +
>> +	*gen_speed_override = 0xff;
>> +	*lane_width_override = 0xff;
>> +
>> +	switch (adev->pdev->device) {
>> +	case 0x73A0:
>> +	case 0x73A1:
>> +	case 0x73A2:
>> +	case 0x73A3:
>> +	case 0x73AB:
>> +	case 0x73AE:
>> +		/* Bit 7:0: PCIE lane width, 1 to 7 corresponds is x1 to x32 */
>> +		*lane_width_override = 6;
>> +		break;
>> +	case 0x73E0:
>> +	case 0x73E1:
>> +	case 0x73E3:
>> +		*lane_width_override = 4;
>> +		break;
>> +	case 0x7420:
>> +	case 0x7421:
>> +	case 0x7422:
>> +	case 0x7423:
>> +	case 0x7424:
>> +		*lane_width_override = 3;
>> +		break;
>> +	default:
>> +		break;
>> +	}
>> +}
>> +

Isn't this applicable only on Intel platforms? If so, better to do a 
processor check rather than maintaining max width based on DID.

Thanks,
Lijo

>> +#define MAX(a, b)	((a) > (b) ? (a) : (b))
>> +
>>   static int sienna_cichlid_update_pcie_parameters(struct smu_context *smu,
>>   					 uint32_t pcie_gen_cap,
>>   					 uint32_t pcie_width_cap)
>>   {
>>   	struct smu_11_0_dpm_context *dpm_context = smu-
>>> smu_dpm.dpm_context;
>> -
>> -	uint32_t smu_pcie_arg;
>> +	struct smu_11_0_pcie_table *pcie_table = &dpm_context-
>>> dpm_tables.pcie_table;
>> +	uint32_t gen_speed_override, lane_width_override;
>>   	uint8_t *table_member1, *table_member2;
>> +	uint32_t min_gen_speed, max_gen_speed;
>> +	uint32_t min_lane_width, max_lane_width;
>> +	uint32_t smu_pcie_arg;
>>   	int ret, i;
>>
>>   	GET_PPTABLE_MEMBER(PcieGenSpeed, &table_member1);
>>   	GET_PPTABLE_MEMBER(PcieLaneCount, &table_member2);
>>
>> -	/* lclk dpm table setup */
>> -	for (i = 0; i < MAX_PCIE_CONF; i++) {
>> -		dpm_context->dpm_tables.pcie_table.pcie_gen[i] =
>> table_member1[i];
>> -		dpm_context->dpm_tables.pcie_table.pcie_lane[i] =
>> table_member2[i];
>> +	sienna_cichlid_get_override_pcie_settings(smu,
>> +						  &gen_speed_override,
>> +						  &lane_width_override);
>> +
>> +	/* PCIE gen speed override */
>> +	if (gen_speed_override != 0xff) {
>> +		min_gen_speed = MIN(pcie_gen_cap, gen_speed_override);
>> +		max_gen_speed = MIN(pcie_gen_cap,
>> gen_speed_override);
>> +	} else {
>> +		min_gen_speed = MAX(0, table_member1[0]);
>> +		max_gen_speed = MIN(pcie_gen_cap, table_member1[1]);
>> +		min_gen_speed = min_gen_speed > max_gen_speed ?
>> +				max_gen_speed : min_gen_speed;
>>   	}
>> +	pcie_table->pcie_gen[0] = min_gen_speed;
>> +	pcie_table->pcie_gen[1] = max_gen_speed;
>> +
>> +	/* PCIE lane width override */
>> +	if (lane_width_override != 0xff) {
>> +		min_lane_width = MIN(pcie_width_cap,
>> lane_width_override);
>> +		max_lane_width = MIN(pcie_width_cap,
>> lane_width_override);
>> +	} else {
>> +		min_lane_width = MAX(1, table_member2[0]);
>> +		max_lane_width = MIN(pcie_width_cap, table_member2[1]);
>> +		min_lane_width = min_lane_width > max_lane_width ?
>> +				 max_lane_width : min_lane_width;
>> +	}
>> +	pcie_table->pcie_lane[0] = min_lane_width;
>> +	pcie_table->pcie_lane[1] = max_lane_width;
>>
>>   	for (i = 0; i < NUM_LINK_LEVELS; i++) {
>> -		smu_pcie_arg = (i << 16) |
>> -			((table_member1[i] <= pcie_gen_cap) ?
>> -			 (table_member1[i] << 8) :
>> -			 (pcie_gen_cap << 8)) |
>> -			((table_member2[i] <= pcie_width_cap) ?
>> -			 table_member2[i] :
>> -			 pcie_width_cap);
>> +		smu_pcie_arg = (i << 16 |
>> +				pcie_table->pcie_gen[i] << 8 |
>> +				pcie_table->pcie_lane[i]);
>>
>>   		ret = smu_cmn_send_smc_msg_with_param(smu,
>>   				SMU_MSG_OverridePcieParameters,
>> @@ -2101,11 +2162,6 @@ static int
>> sienna_cichlid_update_pcie_parameters(struct smu_context *smu,
>>   				NULL);
>>   		if (ret)
>>   			return ret;
>> -
>> -		if (table_member1[i] > pcie_gen_cap)
>> -			dpm_context->dpm_tables.pcie_table.pcie_gen[i] =
>> pcie_gen_cap;
>> -		if (table_member2[i] > pcie_width_cap)
>> -			dpm_context->dpm_tables.pcie_table.pcie_lane[i] =
>> pcie_width_cap;
>>   	}
>>
>>   	return 0;
>> --
>> 2.34.1


More information about the amd-gfx mailing list