From: Lijo Lazar Date: Tue, 25 Nov 2025 12:33:30 +0000 (+0530) Subject: drm/amd/pm: Use generic pcie dpm table for SMUv14 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f0ba2c1f12d37d11b169578aa7e066d2b6c8ce02;p=thirdparty%2Fkernel%2Flinux.git drm/amd/pm: Use generic pcie dpm table for SMUv14 Use smu_pcie_table for SMUv14 SOCs. Signed-off-by: Lijo Lazar Reviewed-by: Alex Deucher Signed-off-by: Alex Deucher --- diff --git a/drivers/gpu/drm/amd/pm/swsmu/inc/smu_v14_0.h b/drivers/gpu/drm/amd/pm/swsmu/inc/smu_v14_0.h index 5b6fa8fdce2d..4ecec85b8404 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/inc/smu_v14_0.h +++ b/drivers/gpu/drm/amd/pm/swsmu/inc/smu_v14_0.h @@ -66,13 +66,6 @@ struct smu_14_0_max_sustainable_clocks { uint32_t soc_clock; }; -struct smu_14_0_pcie_table { - uint8_t pcie_gen[MAX_PCIE_CONF]; - uint8_t pcie_lane[MAX_PCIE_CONF]; - uint16_t clk_freq[MAX_PCIE_CONF]; - uint32_t num_of_link_levels; -}; - struct smu_14_0_dpm_tables { struct smu_dpm_table soc_table; struct smu_dpm_table gfx_table; @@ -85,7 +78,7 @@ struct smu_14_0_dpm_tables { struct smu_dpm_table display_table; struct smu_dpm_table phy_table; struct smu_dpm_table fclk_table; - struct smu_14_0_pcie_table pcie_table; + struct smu_pcie_table pcie_table; }; struct smu_14_0_dpm_context { diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.c index daa51364cb24..596cdba0a8b4 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.c +++ b/drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.c @@ -1046,7 +1046,7 @@ static int smu_v14_0_2_emit_clk_levels(struct smu_context *smu, OverDriveTableExternal_t *od_table = (OverDriveTableExternal_t *)smu->smu_table.overdrive_table; struct smu_dpm_table *single_dpm_table; - struct smu_14_0_pcie_table *pcie_table; + struct smu_pcie_table *pcie_table; uint32_t gen_speed, lane_width; int i, curr_freq, size = *offset, start_offset = *offset; int32_t min_value, max_value; @@ -1150,7 +1150,7 @@ static int smu_v14_0_2_emit_clk_levels(struct smu_context *smu, return ret; pcie_table = &(dpm_context->dpm_tables.pcie_table); - for (i = 0; i < pcie_table->num_of_link_levels; i++) + for (i = 0; i < pcie_table->lclk_levels; i++) size += sysfs_emit_at(buf, size, "%d: %s %s %dMhz %s\n", i, (pcie_table->pcie_gen[i] == 0) ? "2.5GT/s," : (pcie_table->pcie_gen[i] == 1) ? "5.0GT/s," : @@ -1164,7 +1164,7 @@ static int smu_v14_0_2_emit_clk_levels(struct smu_context *smu, (pcie_table->pcie_lane[i] == 5) ? "x12" : (pcie_table->pcie_lane[i] == 6) ? "x16" : (pcie_table->pcie_lane[i] == 7) ? "x32" : "", - pcie_table->clk_freq[i], + pcie_table->lclk_freq[i], (gen_speed == DECODE_GEN_SPEED(pcie_table->pcie_gen[i])) && (lane_width == DECODE_LANE_WIDTH(pcie_table->pcie_lane[i])) ? "*" : ""); @@ -1454,9 +1454,9 @@ static int smu_v14_0_2_update_pcie_parameters(struct smu_context *smu, uint8_t pcie_width_cap) { struct smu_14_0_dpm_context *dpm_context = smu->smu_dpm.dpm_context; - struct smu_14_0_pcie_table *pcie_table = + struct smu_pcie_table *pcie_table = &dpm_context->dpm_tables.pcie_table; - int num_of_levels; + int lclk_levels; uint32_t smu_pcie_arg; uint32_t link_level; struct smu_table_context *table_context = &smu->smu_table; @@ -1465,34 +1465,34 @@ static int smu_v14_0_2_update_pcie_parameters(struct smu_context *smu, int ret = 0; int i; - pcie_table->num_of_link_levels = 0; + pcie_table->lclk_levels = 0; for (link_level = 0; link_level < NUM_LINK_LEVELS; link_level++) { if (!skutable->PcieGenSpeed[link_level] && !skutable->PcieLaneCount[link_level] && !skutable->LclkFreq[link_level]) continue; - pcie_table->pcie_gen[pcie_table->num_of_link_levels] = + pcie_table->pcie_gen[pcie_table->lclk_levels] = skutable->PcieGenSpeed[link_level]; - pcie_table->pcie_lane[pcie_table->num_of_link_levels] = + pcie_table->pcie_lane[pcie_table->lclk_levels] = skutable->PcieLaneCount[link_level]; - pcie_table->clk_freq[pcie_table->num_of_link_levels] = + pcie_table->lclk_freq[pcie_table->lclk_levels] = skutable->LclkFreq[link_level]; - pcie_table->num_of_link_levels++; + pcie_table->lclk_levels++; } - num_of_levels = pcie_table->num_of_link_levels; - if (!num_of_levels) + lclk_levels = pcie_table->lclk_levels; + if (!lclk_levels) return 0; if (!(smu->adev->pm.pp_feature & PP_PCIE_DPM_MASK)) { - if (pcie_table->pcie_gen[num_of_levels - 1] < pcie_gen_cap) - pcie_gen_cap = pcie_table->pcie_gen[num_of_levels - 1]; + if (pcie_table->pcie_gen[lclk_levels - 1] < pcie_gen_cap) + pcie_gen_cap = pcie_table->pcie_gen[lclk_levels - 1]; - if (pcie_table->pcie_lane[num_of_levels - 1] < pcie_width_cap) - pcie_width_cap = pcie_table->pcie_lane[num_of_levels - 1]; + if (pcie_table->pcie_lane[lclk_levels - 1] < pcie_width_cap) + pcie_width_cap = pcie_table->pcie_lane[lclk_levels - 1]; /* Force all levels to use the same settings */ - for (i = 0; i < num_of_levels; i++) { + for (i = 0; i < lclk_levels; i++) { pcie_table->pcie_gen[i] = pcie_gen_cap; pcie_table->pcie_lane[i] = pcie_width_cap; smu_pcie_arg = i << 16; @@ -1507,7 +1507,7 @@ static int smu_v14_0_2_update_pcie_parameters(struct smu_context *smu, break; } } else { - for (i = 0; i < num_of_levels; i++) { + for (i = 0; i < lclk_levels; i++) { if (pcie_table->pcie_gen[i] > pcie_gen_cap || pcie_table->pcie_lane[i] > pcie_width_cap) { pcie_table->pcie_gen[i] = pcie_table->pcie_gen[i] > pcie_gen_cap ?