From f75227fb3fdfce1ffe2a737e90976cec4cb95218 Mon Sep 17 00:00:00 2001 From: Lijo Lazar Date: Tue, 25 Nov 2025 17:48:48 +0530 Subject: [PATCH] drm/amd/pm: Use generic pcie dpm table for SMUv13 Use smu_pcie_table for SMUv13 SOCs. Signed-off-by: Lijo Lazar Reviewed-by: Alex Deucher Signed-off-by: Alex Deucher --- drivers/gpu/drm/amd/pm/swsmu/inc/smu_v13_0.h | 9 +-- .../gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c | 5 +- .../drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c | 64 +++++++++++-------- .../drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c | 64 +++++++++++-------- 4 files changed, 75 insertions(+), 67 deletions(-) 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 4d1180030c8a..c35cbb2aee93 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 @@ -71,13 +71,6 @@ struct smu_13_0_max_sustainable_clocks { uint32_t soc_clock; }; -struct smu_13_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_13_0_dpm_tables { struct smu_dpm_table soc_table; struct smu_dpm_table gfx_table; @@ -90,7 +83,7 @@ struct smu_13_0_dpm_tables { struct smu_dpm_table display_table; struct smu_dpm_table phy_table; struct smu_dpm_table fclk_table; - struct smu_13_0_pcie_table pcie_table; + struct smu_pcie_table pcie_table; }; struct smu_13_0_dpm_context { 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 417c6f42c4fa..7340237b3c35 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 @@ -2374,9 +2374,8 @@ int smu_v13_0_update_pcie_parameters(struct smu_context *smu, uint8_t pcie_width_cap) { struct smu_13_0_dpm_context *dpm_context = smu->smu_dpm.dpm_context; - struct smu_13_0_pcie_table *pcie_table = - &dpm_context->dpm_tables.pcie_table; - int num_of_levels = pcie_table->num_of_link_levels; + struct smu_pcie_table *pcie_table = &dpm_context->dpm_tables.pcie_table; + int num_of_levels = pcie_table->lclk_levels; uint32_t smu_pcie_arg; int ret = 0; int i; 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 bc8293f45a13..adebf93c1557 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 @@ -1186,7 +1186,8 @@ static int smu_v13_0_0_emit_clk_levels(struct smu_context *smu, (OverDriveTableExternal_t *)smu->smu_table.overdrive_table; int i, curr_freq, size = *offset, start_offset = *offset; struct smu_dpm_table *single_dpm_table; - struct smu_13_0_pcie_table *pcie_table; + struct smu_pcie_table *pcie_table; + uint32_t pcie_speed, pcie_width; uint32_t gen_speed, lane_width; int32_t min_value, max_value; int ret = 0; @@ -1289,22 +1290,30 @@ static int smu_v13_0_0_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++) - 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," : - (pcie_table->pcie_gen[i] == 2) ? "8.0GT/s," : - (pcie_table->pcie_gen[i] == 3) ? "16.0GT/s," : "", - (pcie_table->pcie_lane[i] == 1) ? "x1" : - (pcie_table->pcie_lane[i] == 2) ? "x2" : - (pcie_table->pcie_lane[i] == 3) ? "x4" : - (pcie_table->pcie_lane[i] == 4) ? "x8" : - (pcie_table->pcie_lane[i] == 5) ? "x12" : - (pcie_table->pcie_lane[i] == 6) ? "x16" : "", - pcie_table->clk_freq[i], - (gen_speed == DECODE_GEN_SPEED(pcie_table->pcie_gen[i])) && - (lane_width == DECODE_LANE_WIDTH(pcie_table->pcie_lane[i])) ? - "*" : ""); + for (i = 0; i < pcie_table->lclk_levels; i++) { + pcie_speed = DECODE_GEN_SPEED(pcie_table->pcie_gen[i]); + pcie_width = + DECODE_LANE_WIDTH(pcie_table->pcie_lane[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," : + (pcie_table->pcie_gen[i] == 2) ? "8.0GT/s," : + (pcie_table->pcie_gen[i] == 3) ? "16.0GT/s," : + "", + (pcie_table->pcie_lane[i] == 1) ? "x1" : + (pcie_table->pcie_lane[i] == 2) ? "x2" : + (pcie_table->pcie_lane[i] == 3) ? "x4" : + (pcie_table->pcie_lane[i] == 4) ? "x8" : + (pcie_table->pcie_lane[i] == 5) ? "x12" : + (pcie_table->pcie_lane[i] == 6) ? "x16" : + "", + pcie_table->lclk_freq[i], + (gen_speed == pcie_speed && + lane_width == pcie_width) ? + "*" : + ""); + } break; case SMU_OD_SCLK: @@ -3107,8 +3116,7 @@ static int smu_v13_0_0_update_pcie_parameters(struct smu_context *smu, uint8_t pcie_width_cap) { struct smu_13_0_dpm_context *dpm_context = smu->smu_dpm.dpm_context; - struct smu_13_0_pcie_table *pcie_table = - &dpm_context->dpm_tables.pcie_table; + struct smu_pcie_table *pcie_table = &dpm_context->dpm_tables.pcie_table; int num_of_levels; uint32_t smu_pcie_arg; uint32_t link_level; @@ -3118,7 +3126,7 @@ static int smu_v13_0_0_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] && @@ -3126,16 +3134,16 @@ static int smu_v13_0_0_update_pcie_parameters(struct smu_context *smu, !skutable->LclkFreq[link_level]) continue; - pcie_table->pcie_gen[pcie_table->num_of_link_levels] = - skutable->PcieGenSpeed[link_level]; - pcie_table->pcie_lane[pcie_table->num_of_link_levels] = - skutable->PcieLaneCount[link_level]; - pcie_table->clk_freq[pcie_table->num_of_link_levels] = - skutable->LclkFreq[link_level]; - pcie_table->num_of_link_levels++; + pcie_table->pcie_gen[pcie_table->lclk_levels] = + skutable->PcieGenSpeed[link_level]; + pcie_table->pcie_lane[pcie_table->lclk_levels] = + skutable->PcieLaneCount[link_level]; + pcie_table->lclk_freq[pcie_table->lclk_levels] = + skutable->LclkFreq[link_level]; + pcie_table->lclk_levels++; } - num_of_levels = pcie_table->num_of_link_levels; + num_of_levels = pcie_table->lclk_levels; if (!num_of_levels) return 0; 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 8f664ef32570..ff9ad5bdf138 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 @@ -1175,7 +1175,8 @@ static int smu_v13_0_7_emit_clk_levels(struct smu_context *smu, (OverDriveTableExternal_t *)smu->smu_table.overdrive_table; int i, curr_freq, size = *offset, start_offset = *offset; struct smu_dpm_table *single_dpm_table; - struct smu_13_0_pcie_table *pcie_table; + struct smu_pcie_table *pcie_table; + uint32_t pcie_speed, pcie_width; uint32_t gen_speed, lane_width; int32_t min_value, max_value; int ret = 0; @@ -1278,22 +1279,30 @@ static int smu_v13_0_7_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++) - 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," : - (pcie_table->pcie_gen[i] == 2) ? "8.0GT/s," : - (pcie_table->pcie_gen[i] == 3) ? "16.0GT/s," : "", - (pcie_table->pcie_lane[i] == 1) ? "x1" : - (pcie_table->pcie_lane[i] == 2) ? "x2" : - (pcie_table->pcie_lane[i] == 3) ? "x4" : - (pcie_table->pcie_lane[i] == 4) ? "x8" : - (pcie_table->pcie_lane[i] == 5) ? "x12" : - (pcie_table->pcie_lane[i] == 6) ? "x16" : "", - pcie_table->clk_freq[i], - (gen_speed == DECODE_GEN_SPEED(pcie_table->pcie_gen[i])) && - (lane_width == DECODE_LANE_WIDTH(pcie_table->pcie_lane[i])) ? - "*" : ""); + for (i = 0; i < pcie_table->lclk_levels; i++) { + pcie_speed = DECODE_GEN_SPEED(pcie_table->pcie_gen[i]); + pcie_width = + DECODE_LANE_WIDTH(pcie_table->pcie_lane[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," : + (pcie_table->pcie_gen[i] == 2) ? "8.0GT/s," : + (pcie_table->pcie_gen[i] == 3) ? "16.0GT/s," : + "", + (pcie_table->pcie_lane[i] == 1) ? "x1" : + (pcie_table->pcie_lane[i] == 2) ? "x2" : + (pcie_table->pcie_lane[i] == 3) ? "x4" : + (pcie_table->pcie_lane[i] == 4) ? "x8" : + (pcie_table->pcie_lane[i] == 5) ? "x12" : + (pcie_table->pcie_lane[i] == 6) ? "x16" : + "", + pcie_table->lclk_freq[i], + (gen_speed == pcie_speed && + lane_width == pcie_width) ? + "*" : + ""); + } break; case SMU_OD_SCLK: @@ -2711,8 +2720,7 @@ static int smu_v13_0_7_update_pcie_parameters(struct smu_context *smu, uint8_t pcie_width_cap) { struct smu_13_0_dpm_context *dpm_context = smu->smu_dpm.dpm_context; - struct smu_13_0_pcie_table *pcie_table = - &dpm_context->dpm_tables.pcie_table; + struct smu_pcie_table *pcie_table = &dpm_context->dpm_tables.pcie_table; int num_of_levels; int link_level; uint32_t smu_pcie_arg; @@ -2722,23 +2730,23 @@ static int smu_v13_0_7_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] = - skutable->PcieGenSpeed[link_level]; - pcie_table->pcie_lane[pcie_table->num_of_link_levels] = - skutable->PcieLaneCount[link_level]; - pcie_table->clk_freq[pcie_table->num_of_link_levels] = - skutable->LclkFreq[link_level]; - pcie_table->num_of_link_levels++; + pcie_table->pcie_gen[pcie_table->lclk_levels] = + skutable->PcieGenSpeed[link_level]; + pcie_table->pcie_lane[pcie_table->lclk_levels] = + skutable->PcieLaneCount[link_level]; + pcie_table->lclk_freq[pcie_table->lclk_levels] = + skutable->LclkFreq[link_level]; + pcie_table->lclk_levels++; } - num_of_levels = pcie_table->num_of_link_levels; + num_of_levels = pcie_table->lclk_levels; if (!num_of_levels) return 0; -- 2.47.3