Skip to content

Commit e701156

Browse files
superm1alexdeucher
authored andcommitted
drm/amd: Align SMU11 SMU_MSG_OverridePcieParameters implementation with SMU13
SMU13 overrides dynamic PCIe lane width and dynamic speed by when on certain hosts. commit 38e4ced ("drm/amd/pm: conditionally disable pcie lane switching for some sienna_cichlid SKUs") worked around this issue by setting up certain SKUs to set up certain limits, but the same fundamental problem with those hosts affects all SMU11 implmentations as well, so align the SMU11 and SMU13 driver handling. Signed-off-by: Mario Limonciello <[email protected]> Reviewed-by: Evan Quan <[email protected]> Signed-off-by: Alex Deucher <[email protected]> Cc: [email protected] # 6.1.x
1 parent 1886230 commit e701156

File tree

1 file changed

+18
-71
lines changed

1 file changed

+18
-71
lines changed

drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c

Lines changed: 18 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -2077,89 +2077,36 @@ static int sienna_cichlid_display_disable_memory_clock_switch(struct smu_context
20772077
return ret;
20782078
}
20792079

2080-
static void sienna_cichlid_get_override_pcie_settings(struct smu_context *smu,
2081-
uint32_t *gen_speed_override,
2082-
uint32_t *lane_width_override)
2083-
{
2084-
struct amdgpu_device *adev = smu->adev;
2085-
2086-
*gen_speed_override = 0xff;
2087-
*lane_width_override = 0xff;
2088-
2089-
switch (adev->pdev->device) {
2090-
case 0x73A0:
2091-
case 0x73A1:
2092-
case 0x73A2:
2093-
case 0x73A3:
2094-
case 0x73AB:
2095-
case 0x73AE:
2096-
/* Bit 7:0: PCIE lane width, 1 to 7 corresponds is x1 to x32 */
2097-
*lane_width_override = 6;
2098-
break;
2099-
case 0x73E0:
2100-
case 0x73E1:
2101-
case 0x73E3:
2102-
*lane_width_override = 4;
2103-
break;
2104-
case 0x7420:
2105-
case 0x7421:
2106-
case 0x7422:
2107-
case 0x7423:
2108-
case 0x7424:
2109-
*lane_width_override = 3;
2110-
break;
2111-
default:
2112-
break;
2113-
}
2114-
}
2115-
2116-
#define MAX(a, b) ((a) > (b) ? (a) : (b))
2117-
21182080
static int sienna_cichlid_update_pcie_parameters(struct smu_context *smu,
21192081
uint32_t pcie_gen_cap,
21202082
uint32_t pcie_width_cap)
21212083
{
21222084
struct smu_11_0_dpm_context *dpm_context = smu->smu_dpm.dpm_context;
21232085
struct smu_11_0_pcie_table *pcie_table = &dpm_context->dpm_tables.pcie_table;
2124-
uint32_t gen_speed_override, lane_width_override;
2125-
uint8_t *table_member1, *table_member2;
2126-
uint32_t min_gen_speed, max_gen_speed;
2127-
uint32_t min_lane_width, max_lane_width;
2128-
uint32_t smu_pcie_arg;
2086+
u32 smu_pcie_arg;
21292087
int ret, i;
21302088

2131-
GET_PPTABLE_MEMBER(PcieGenSpeed, &table_member1);
2132-
GET_PPTABLE_MEMBER(PcieLaneCount, &table_member2);
2133-
2134-
sienna_cichlid_get_override_pcie_settings(smu,
2135-
&gen_speed_override,
2136-
&lane_width_override);
2089+
/* PCIE gen speed and lane width override */
2090+
if (!amdgpu_device_pcie_dynamic_switching_supported()) {
2091+
if (pcie_table->pcie_gen[NUM_LINK_LEVELS - 1] < pcie_gen_cap)
2092+
pcie_gen_cap = pcie_table->pcie_gen[NUM_LINK_LEVELS - 1];
21372093

2138-
/* PCIE gen speed override */
2139-
if (gen_speed_override != 0xff) {
2140-
min_gen_speed = MIN(pcie_gen_cap, gen_speed_override);
2141-
max_gen_speed = MIN(pcie_gen_cap, gen_speed_override);
2142-
} else {
2143-
min_gen_speed = MAX(0, table_member1[0]);
2144-
max_gen_speed = MIN(pcie_gen_cap, table_member1[1]);
2145-
min_gen_speed = min_gen_speed > max_gen_speed ?
2146-
max_gen_speed : min_gen_speed;
2147-
}
2148-
pcie_table->pcie_gen[0] = min_gen_speed;
2149-
pcie_table->pcie_gen[1] = max_gen_speed;
2094+
if (pcie_table->pcie_lane[NUM_LINK_LEVELS - 1] < pcie_width_cap)
2095+
pcie_width_cap = pcie_table->pcie_lane[NUM_LINK_LEVELS - 1];
21502096

2151-
/* PCIE lane width override */
2152-
if (lane_width_override != 0xff) {
2153-
min_lane_width = MIN(pcie_width_cap, lane_width_override);
2154-
max_lane_width = MIN(pcie_width_cap, lane_width_override);
2097+
/* Force all levels to use the same settings */
2098+
for (i = 0; i < NUM_LINK_LEVELS; i++) {
2099+
pcie_table->pcie_gen[i] = pcie_gen_cap;
2100+
pcie_table->pcie_lane[i] = pcie_width_cap;
2101+
}
21552102
} else {
2156-
min_lane_width = MAX(1, table_member2[0]);
2157-
max_lane_width = MIN(pcie_width_cap, table_member2[1]);
2158-
min_lane_width = min_lane_width > max_lane_width ?
2159-
max_lane_width : min_lane_width;
2103+
for (i = 0; i < NUM_LINK_LEVELS; i++) {
2104+
if (pcie_table->pcie_gen[i] > pcie_gen_cap)
2105+
pcie_table->pcie_gen[i] = pcie_gen_cap;
2106+
if (pcie_table->pcie_lane[i] > pcie_width_cap)
2107+
pcie_table->pcie_lane[i] = pcie_width_cap;
2108+
}
21602109
}
2161-
pcie_table->pcie_lane[0] = min_lane_width;
2162-
pcie_table->pcie_lane[1] = max_lane_width;
21632110

21642111
for (i = 0; i < NUM_LINK_LEVELS; i++) {
21652112
smu_pcie_arg = (i << 16 |

0 commit comments

Comments
 (0)