mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-28 00:12:28 -04:00
drm/amd/pm: Use generic pcie dpm table for SMUv13
Use smu_pcie_table for SMUv13 SOCs. Signed-off-by: Lijo Lazar <lijo.lazar@amd.com> Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user