Skip to content

Commit 38e4ced

Browse files
Evan Quanalexdeucher
authored andcommitted
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 <[email protected]> Reviewed-by: Alex Deucher <[email protected]> Signed-off-by: Alex Deucher <[email protected]> Cc: [email protected]
1 parent 1d13c49 commit 38e4ced

File tree

1 file changed

+74
-18
lines changed

1 file changed

+74
-18
lines changed

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

Lines changed: 74 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2067,45 +2067,101 @@ static int sienna_cichlid_display_disable_memory_clock_switch(struct smu_context
20672067
return ret;
20682068
}
20692069

2070+
static void sienna_cichlid_get_override_pcie_settings(struct smu_context *smu,
2071+
uint32_t *gen_speed_override,
2072+
uint32_t *lane_width_override)
2073+
{
2074+
struct amdgpu_device *adev = smu->adev;
2075+
2076+
*gen_speed_override = 0xff;
2077+
*lane_width_override = 0xff;
2078+
2079+
switch (adev->pdev->device) {
2080+
case 0x73A0:
2081+
case 0x73A1:
2082+
case 0x73A2:
2083+
case 0x73A3:
2084+
case 0x73AB:
2085+
case 0x73AE:
2086+
/* Bit 7:0: PCIE lane width, 1 to 7 corresponds is x1 to x32 */
2087+
*lane_width_override = 6;
2088+
break;
2089+
case 0x73E0:
2090+
case 0x73E1:
2091+
case 0x73E3:
2092+
*lane_width_override = 4;
2093+
break;
2094+
case 0x7420:
2095+
case 0x7421:
2096+
case 0x7422:
2097+
case 0x7423:
2098+
case 0x7424:
2099+
*lane_width_override = 3;
2100+
break;
2101+
default:
2102+
break;
2103+
}
2104+
}
2105+
2106+
#define MAX(a, b) ((a) > (b) ? (a) : (b))
2107+
20702108
static int sienna_cichlid_update_pcie_parameters(struct smu_context *smu,
20712109
uint32_t pcie_gen_cap,
20722110
uint32_t pcie_width_cap)
20732111
{
20742112
struct smu_11_0_dpm_context *dpm_context = smu->smu_dpm.dpm_context;
2075-
2076-
uint32_t smu_pcie_arg;
2113+
struct smu_11_0_pcie_table *pcie_table = &dpm_context->dpm_tables.pcie_table;
2114+
uint32_t gen_speed_override, lane_width_override;
20772115
uint8_t *table_member1, *table_member2;
2116+
uint32_t min_gen_speed, max_gen_speed;
2117+
uint32_t min_lane_width, max_lane_width;
2118+
uint32_t smu_pcie_arg;
20782119
int ret, i;
20792120

20802121
GET_PPTABLE_MEMBER(PcieGenSpeed, &table_member1);
20812122
GET_PPTABLE_MEMBER(PcieLaneCount, &table_member2);
20822123

2083-
/* lclk dpm table setup */
2084-
for (i = 0; i < MAX_PCIE_CONF; i++) {
2085-
dpm_context->dpm_tables.pcie_table.pcie_gen[i] = table_member1[i];
2086-
dpm_context->dpm_tables.pcie_table.pcie_lane[i] = table_member2[i];
2124+
sienna_cichlid_get_override_pcie_settings(smu,
2125+
&gen_speed_override,
2126+
&lane_width_override);
2127+
2128+
/* PCIE gen speed override */
2129+
if (gen_speed_override != 0xff) {
2130+
min_gen_speed = MIN(pcie_gen_cap, gen_speed_override);
2131+
max_gen_speed = MIN(pcie_gen_cap, gen_speed_override);
2132+
} else {
2133+
min_gen_speed = MAX(0, table_member1[0]);
2134+
max_gen_speed = MIN(pcie_gen_cap, table_member1[1]);
2135+
min_gen_speed = min_gen_speed > max_gen_speed ?
2136+
max_gen_speed : min_gen_speed;
20872137
}
2138+
pcie_table->pcie_gen[0] = min_gen_speed;
2139+
pcie_table->pcie_gen[1] = max_gen_speed;
2140+
2141+
/* PCIE lane width override */
2142+
if (lane_width_override != 0xff) {
2143+
min_lane_width = MIN(pcie_width_cap, lane_width_override);
2144+
max_lane_width = MIN(pcie_width_cap, lane_width_override);
2145+
} else {
2146+
min_lane_width = MAX(1, table_member2[0]);
2147+
max_lane_width = MIN(pcie_width_cap, table_member2[1]);
2148+
min_lane_width = min_lane_width > max_lane_width ?
2149+
max_lane_width : min_lane_width;
2150+
}
2151+
pcie_table->pcie_lane[0] = min_lane_width;
2152+
pcie_table->pcie_lane[1] = max_lane_width;
20882153

20892154
for (i = 0; i < NUM_LINK_LEVELS; i++) {
2090-
smu_pcie_arg = (i << 16) |
2091-
((table_member1[i] <= pcie_gen_cap) ?
2092-
(table_member1[i] << 8) :
2093-
(pcie_gen_cap << 8)) |
2094-
((table_member2[i] <= pcie_width_cap) ?
2095-
table_member2[i] :
2096-
pcie_width_cap);
2155+
smu_pcie_arg = (i << 16 |
2156+
pcie_table->pcie_gen[i] << 8 |
2157+
pcie_table->pcie_lane[i]);
20972158

20982159
ret = smu_cmn_send_smc_msg_with_param(smu,
20992160
SMU_MSG_OverridePcieParameters,
21002161
smu_pcie_arg,
21012162
NULL);
21022163
if (ret)
21032164
return ret;
2104-
2105-
if (table_member1[i] > pcie_gen_cap)
2106-
dpm_context->dpm_tables.pcie_table.pcie_gen[i] = pcie_gen_cap;
2107-
if (table_member2[i] > pcie_width_cap)
2108-
dpm_context->dpm_tables.pcie_table.pcie_lane[i] = pcie_width_cap;
21092165
}
21102166

21112167
return 0;

0 commit comments

Comments
 (0)