mirror of
https://github.com/torvalds/linux.git
synced 2026-06-02 19:43:40 +02:00
drm/amd/pm: set pcie default dpm table when updating pcie dpm parameters
set pcie default dpm table when updating pcie dpm parameters Signed-off-by: Kenneth Feng <kenneth.feng@amd.com> Acked-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
9dd1f15236
commit
25b35ad296
|
|
@ -572,8 +572,6 @@ static int smu_v13_0_0_set_default_dpm_table(struct smu_context *smu)
|
|||
PPTable_t *pptable = table_context->driver_pptable;
|
||||
SkuTable_t *skutable = &pptable->SkuTable;
|
||||
struct smu_13_0_dpm_table *dpm_table;
|
||||
struct smu_13_0_pcie_table *pcie_table;
|
||||
uint32_t link_level;
|
||||
int ret = 0;
|
||||
|
||||
/* socclk dpm table setup */
|
||||
|
|
@ -689,24 +687,6 @@ static int smu_v13_0_0_set_default_dpm_table(struct smu_context *smu)
|
|||
dpm_table->max = dpm_table->dpm_levels[0].value;
|
||||
}
|
||||
|
||||
/* lclk dpm table setup */
|
||||
pcie_table = &dpm_context->dpm_tables.pcie_table;
|
||||
pcie_table->num_of_link_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++;
|
||||
}
|
||||
|
||||
/* dcefclk dpm table setup */
|
||||
dpm_table = &dpm_context->dpm_tables.dcef_table;
|
||||
if (smu_cmn_feature_is_enabled(smu, SMU_FEATURE_DPM_DCN_BIT)) {
|
||||
|
|
@ -3150,6 +3130,88 @@ static int smu_v13_0_0_set_power_limit(struct smu_context *smu,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int smu_v13_0_0_update_pcie_parameters(struct smu_context *smu,
|
||||
uint8_t pcie_gen_cap,
|
||||
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;
|
||||
uint32_t smu_pcie_arg;
|
||||
uint32_t link_level;
|
||||
struct smu_table_context *table_context = &smu->smu_table;
|
||||
PPTable_t *pptable = table_context->driver_pptable;
|
||||
SkuTable_t *skutable = &pptable->SkuTable;
|
||||
int ret = 0;
|
||||
int i;
|
||||
|
||||
pcie_table->num_of_link_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++;
|
||||
}
|
||||
|
||||
num_of_levels = pcie_table->num_of_link_levels;
|
||||
if (!num_of_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_lane[num_of_levels - 1] < pcie_width_cap)
|
||||
pcie_width_cap = pcie_table->pcie_lane[num_of_levels - 1];
|
||||
|
||||
/* Force all levels to use the same settings */
|
||||
for (i = 0; i < num_of_levels; i++) {
|
||||
pcie_table->pcie_gen[i] = pcie_gen_cap;
|
||||
pcie_table->pcie_lane[i] = pcie_width_cap;
|
||||
smu_pcie_arg = i << 16;
|
||||
smu_pcie_arg |= pcie_table->pcie_gen[i] << 8;
|
||||
smu_pcie_arg |= pcie_table->pcie_lane[i];
|
||||
|
||||
ret = smu_cmn_send_smc_msg_with_param(smu,
|
||||
SMU_MSG_OverridePcieParameters,
|
||||
smu_pcie_arg,
|
||||
NULL);
|
||||
if (ret)
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
for (i = 0; i < num_of_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_gen_cap;
|
||||
pcie_table->pcie_lane[i] = pcie_width_cap;
|
||||
smu_pcie_arg = i << 16;
|
||||
smu_pcie_arg |= pcie_table->pcie_gen[i] << 8;
|
||||
smu_pcie_arg |= pcie_table->pcie_lane[i];
|
||||
|
||||
ret = smu_cmn_send_smc_msg_with_param(smu,
|
||||
SMU_MSG_OverridePcieParameters,
|
||||
smu_pcie_arg,
|
||||
NULL);
|
||||
if (ret)
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct pptable_funcs smu_v13_0_0_ppt_funcs = {
|
||||
.get_allowed_feature_mask = smu_v13_0_0_get_allowed_feature_mask,
|
||||
.set_default_dpm_table = smu_v13_0_0_set_default_dpm_table,
|
||||
|
|
@ -3179,7 +3241,7 @@ static const struct pptable_funcs smu_v13_0_0_ppt_funcs = {
|
|||
.feature_is_enabled = smu_cmn_feature_is_enabled,
|
||||
.print_clk_levels = smu_v13_0_0_print_clk_levels,
|
||||
.force_clk_levels = smu_v13_0_0_force_clk_levels,
|
||||
.update_pcie_parameters = smu_v13_0_update_pcie_parameters,
|
||||
.update_pcie_parameters = smu_v13_0_0_update_pcie_parameters,
|
||||
.get_thermal_temperature_range = smu_v13_0_0_get_thermal_temperature_range,
|
||||
.register_irq_handler = smu_v13_0_register_irq_handler,
|
||||
.enable_thermal_alert = smu_v13_0_enable_thermal_alert,
|
||||
|
|
|
|||
|
|
@ -579,8 +579,6 @@ static int smu_v13_0_7_set_default_dpm_table(struct smu_context *smu)
|
|||
PPTable_t *driver_ppt = smu->smu_table.driver_pptable;
|
||||
SkuTable_t *skutable = &driver_ppt->SkuTable;
|
||||
struct smu_13_0_dpm_table *dpm_table;
|
||||
struct smu_13_0_pcie_table *pcie_table;
|
||||
uint32_t link_level;
|
||||
int ret = 0;
|
||||
|
||||
/* socclk dpm table setup */
|
||||
|
|
@ -687,24 +685,6 @@ static int smu_v13_0_7_set_default_dpm_table(struct smu_context *smu)
|
|||
dpm_table->max = dpm_table->dpm_levels[0].value;
|
||||
}
|
||||
|
||||
/* lclk dpm table setup */
|
||||
pcie_table = &dpm_context->dpm_tables.pcie_table;
|
||||
pcie_table->num_of_link_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++;
|
||||
}
|
||||
|
||||
/* dcefclk dpm table setup */
|
||||
dpm_table = &dpm_context->dpm_tables.dcef_table;
|
||||
if (smu_cmn_feature_is_enabled(smu, SMU_FEATURE_DPM_DCN_BIT)) {
|
||||
|
|
@ -2739,6 +2719,87 @@ static int smu_v13_0_7_set_power_limit(struct smu_context *smu,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int smu_v13_0_7_update_pcie_parameters(struct smu_context *smu,
|
||||
uint8_t pcie_gen_cap,
|
||||
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;
|
||||
int link_level;
|
||||
uint32_t smu_pcie_arg;
|
||||
struct smu_table_context *table_context = &smu->smu_table;
|
||||
PPTable_t *pptable = table_context->driver_pptable;
|
||||
SkuTable_t *skutable = &pptable->SkuTable;
|
||||
int ret = 0;
|
||||
int i;
|
||||
|
||||
pcie_table->num_of_link_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++;
|
||||
}
|
||||
|
||||
num_of_levels = pcie_table->num_of_link_levels;
|
||||
if (!num_of_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_lane[num_of_levels - 1] < pcie_width_cap)
|
||||
pcie_width_cap = pcie_table->pcie_lane[num_of_levels - 1];
|
||||
|
||||
/* Force all levels to use the same settings */
|
||||
for (i = 0; i < num_of_levels; i++) {
|
||||
pcie_table->pcie_gen[i] = pcie_gen_cap;
|
||||
pcie_table->pcie_lane[i] = pcie_width_cap;
|
||||
smu_pcie_arg = i << 16;
|
||||
smu_pcie_arg |= pcie_table->pcie_gen[i] << 8;
|
||||
smu_pcie_arg |= pcie_table->pcie_lane[i];
|
||||
|
||||
ret = smu_cmn_send_smc_msg_with_param(smu,
|
||||
SMU_MSG_OverridePcieParameters,
|
||||
smu_pcie_arg,
|
||||
NULL);
|
||||
if (ret)
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
for (i = 0; i < num_of_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_gen_cap;
|
||||
pcie_table->pcie_lane[i] = pcie_width_cap;
|
||||
smu_pcie_arg = i << 16;
|
||||
smu_pcie_arg |= pcie_table->pcie_gen[i] << 8;
|
||||
smu_pcie_arg |= pcie_table->pcie_lane[i];
|
||||
|
||||
ret = smu_cmn_send_smc_msg_with_param(smu,
|
||||
SMU_MSG_OverridePcieParameters,
|
||||
smu_pcie_arg,
|
||||
NULL);
|
||||
if (ret)
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct pptable_funcs smu_v13_0_7_ppt_funcs = {
|
||||
.get_allowed_feature_mask = smu_v13_0_7_get_allowed_feature_mask,
|
||||
.set_default_dpm_table = smu_v13_0_7_set_default_dpm_table,
|
||||
|
|
@ -2768,7 +2829,7 @@ static const struct pptable_funcs smu_v13_0_7_ppt_funcs = {
|
|||
.feature_is_enabled = smu_cmn_feature_is_enabled,
|
||||
.print_clk_levels = smu_v13_0_7_print_clk_levels,
|
||||
.force_clk_levels = smu_v13_0_7_force_clk_levels,
|
||||
.update_pcie_parameters = smu_v13_0_update_pcie_parameters,
|
||||
.update_pcie_parameters = smu_v13_0_7_update_pcie_parameters,
|
||||
.get_thermal_temperature_range = smu_v13_0_7_get_thermal_temperature_range,
|
||||
.register_irq_handler = smu_v13_0_register_irq_handler,
|
||||
.enable_thermal_alert = smu_v13_0_enable_thermal_alert,
|
||||
|
|
|
|||
|
|
@ -502,8 +502,6 @@ static int smu_v14_0_2_set_default_dpm_table(struct smu_context *smu)
|
|||
PPTable_t *pptable = table_context->driver_pptable;
|
||||
SkuTable_t *skutable = &pptable->SkuTable;
|
||||
struct smu_14_0_dpm_table *dpm_table;
|
||||
struct smu_14_0_pcie_table *pcie_table;
|
||||
uint32_t link_level;
|
||||
int ret = 0;
|
||||
|
||||
/* socclk dpm table setup */
|
||||
|
|
@ -619,27 +617,6 @@ static int smu_v14_0_2_set_default_dpm_table(struct smu_context *smu)
|
|||
dpm_table->max = dpm_table->dpm_levels[0].value;
|
||||
}
|
||||
|
||||
/* lclk dpm table setup */
|
||||
pcie_table = &dpm_context->dpm_tables.pcie_table;
|
||||
pcie_table->num_of_link_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++;
|
||||
|
||||
if (link_level == 0)
|
||||
link_level++;
|
||||
}
|
||||
|
||||
/* dcefclk dpm table setup */
|
||||
dpm_table = &dpm_context->dpm_tables.dcef_table;
|
||||
if (smu_cmn_feature_is_enabled(smu, SMU_FEATURE_DPM_DCN_BIT)) {
|
||||
|
|
@ -1487,11 +1464,31 @@ static int smu_v14_0_2_update_pcie_parameters(struct smu_context *smu,
|
|||
struct smu_14_0_dpm_context *dpm_context = smu->smu_dpm.dpm_context;
|
||||
struct smu_14_0_pcie_table *pcie_table =
|
||||
&dpm_context->dpm_tables.pcie_table;
|
||||
int num_of_levels = pcie_table->num_of_link_levels;
|
||||
int num_of_levels;
|
||||
uint32_t smu_pcie_arg;
|
||||
uint32_t link_level;
|
||||
struct smu_table_context *table_context = &smu->smu_table;
|
||||
PPTable_t *pptable = table_context->driver_pptable;
|
||||
SkuTable_t *skutable = &pptable->SkuTable;
|
||||
int ret = 0;
|
||||
int i;
|
||||
|
||||
pcie_table->num_of_link_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++;
|
||||
}
|
||||
num_of_levels = pcie_table->num_of_link_levels;
|
||||
if (!num_of_levels)
|
||||
return 0;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user