mirror of
https://github.com/torvalds/linux.git
synced 2026-06-06 13:37:36 +02:00
drm/amd/pm: override pcie dpm parameters only if it is necessary
override pcie dpm parameters only if it is necessary Signed-off-by: Kenneth Feng <kenneth.feng@amd.com> Reviewed-by: Yang Wang <kevinyang.wang@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
0c3f972394
commit
1a18607c07
|
|
@ -2444,7 +2444,8 @@ static int navi10_update_pcie_parameters(struct smu_context *smu,
|
||||||
struct smu_11_0_dpm_context *dpm_context = smu->smu_dpm.dpm_context;
|
struct smu_11_0_dpm_context *dpm_context = smu->smu_dpm.dpm_context;
|
||||||
PPTable_t *pptable = smu->smu_table.driver_pptable;
|
PPTable_t *pptable = smu->smu_table.driver_pptable;
|
||||||
uint32_t smu_pcie_arg;
|
uint32_t smu_pcie_arg;
|
||||||
int ret, i;
|
int ret = 0;
|
||||||
|
int i;
|
||||||
|
|
||||||
/* lclk dpm table setup */
|
/* lclk dpm table setup */
|
||||||
for (i = 0; i < MAX_PCIE_CONF; i++) {
|
for (i = 0; i < MAX_PCIE_CONF; i++) {
|
||||||
|
|
@ -2453,25 +2454,23 @@ static int navi10_update_pcie_parameters(struct smu_context *smu,
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < NUM_LINK_LEVELS; i++) {
|
for (i = 0; i < NUM_LINK_LEVELS; i++) {
|
||||||
smu_pcie_arg = (i << 16) |
|
if (pptable->PcieGenSpeed[i] > pcie_gen_cap ||
|
||||||
((pptable->PcieGenSpeed[i] <= pcie_gen_cap) ? (pptable->PcieGenSpeed[i] << 8) :
|
pptable->PcieLaneCount[i] > pcie_width_cap) {
|
||||||
(pcie_gen_cap << 8)) | ((pptable->PcieLaneCount[i] <= pcie_width_cap) ?
|
|
||||||
pptable->PcieLaneCount[i] : pcie_width_cap);
|
|
||||||
ret = smu_cmn_send_smc_msg_with_param(smu,
|
|
||||||
SMU_MSG_OverridePcieParameters,
|
|
||||||
smu_pcie_arg,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
if (pptable->PcieGenSpeed[i] > pcie_gen_cap)
|
|
||||||
dpm_context->dpm_tables.pcie_table.pcie_gen[i] = pcie_gen_cap;
|
dpm_context->dpm_tables.pcie_table.pcie_gen[i] = pcie_gen_cap;
|
||||||
if (pptable->PcieLaneCount[i] > pcie_width_cap)
|
|
||||||
dpm_context->dpm_tables.pcie_table.pcie_lane[i] = pcie_width_cap;
|
dpm_context->dpm_tables.pcie_table.pcie_lane[i] = pcie_width_cap;
|
||||||
|
smu_pcie_arg = i << 16;
|
||||||
|
smu_pcie_arg |= pcie_gen_cap << 8;
|
||||||
|
smu_pcie_arg |= pcie_width_cap;
|
||||||
|
ret = smu_cmn_send_smc_msg_with_param(smu,
|
||||||
|
SMU_MSG_OverridePcieParameters,
|
||||||
|
smu_pcie_arg,
|
||||||
|
NULL);
|
||||||
|
if (ret)
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void navi10_dump_od_table(struct smu_context *smu,
|
static inline void navi10_dump_od_table(struct smu_context *smu,
|
||||||
|
|
|
||||||
|
|
@ -2145,7 +2145,8 @@ static int sienna_cichlid_update_pcie_parameters(struct smu_context *smu,
|
||||||
uint8_t min_gen_speed, max_gen_speed;
|
uint8_t min_gen_speed, max_gen_speed;
|
||||||
uint8_t min_lane_width, max_lane_width;
|
uint8_t min_lane_width, max_lane_width;
|
||||||
uint32_t smu_pcie_arg;
|
uint32_t smu_pcie_arg;
|
||||||
int ret, i;
|
int ret = 0;
|
||||||
|
int i;
|
||||||
|
|
||||||
GET_PPTABLE_MEMBER(PcieGenSpeed, &table_member1);
|
GET_PPTABLE_MEMBER(PcieGenSpeed, &table_member1);
|
||||||
GET_PPTABLE_MEMBER(PcieLaneCount, &table_member2);
|
GET_PPTABLE_MEMBER(PcieLaneCount, &table_member2);
|
||||||
|
|
@ -2170,19 +2171,22 @@ static int sienna_cichlid_update_pcie_parameters(struct smu_context *smu,
|
||||||
pcie_table->pcie_lane[1] = max_lane_width;
|
pcie_table->pcie_lane[1] = max_lane_width;
|
||||||
|
|
||||||
for (i = 0; i < NUM_LINK_LEVELS; i++) {
|
for (i = 0; i < NUM_LINK_LEVELS; i++) {
|
||||||
smu_pcie_arg = (i << 16 |
|
if (!(smu->adev->pm.pp_feature & PP_PCIE_DPM_MASK) ||
|
||||||
|
table_member1[i] > pcie_gen_cap || table_member2[i] > pcie_width_cap) {
|
||||||
|
smu_pcie_arg = (i << 16 |
|
||||||
pcie_table->pcie_gen[i] << 8 |
|
pcie_table->pcie_gen[i] << 8 |
|
||||||
pcie_table->pcie_lane[i]);
|
pcie_table->pcie_lane[i]);
|
||||||
|
|
||||||
ret = smu_cmn_send_smc_msg_with_param(smu,
|
ret = smu_cmn_send_smc_msg_with_param(smu,
|
||||||
SMU_MSG_OverridePcieParameters,
|
SMU_MSG_OverridePcieParameters,
|
||||||
smu_pcie_arg,
|
smu_pcie_arg,
|
||||||
NULL);
|
NULL);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sienna_cichlid_get_dpm_ultimate_freq(struct smu_context *smu,
|
static int sienna_cichlid_get_dpm_ultimate_freq(struct smu_context *smu,
|
||||||
|
|
|
||||||
|
|
@ -2386,7 +2386,8 @@ int smu_v13_0_update_pcie_parameters(struct smu_context *smu,
|
||||||
&dpm_context->dpm_tables.pcie_table;
|
&dpm_context->dpm_tables.pcie_table;
|
||||||
int num_of_levels = pcie_table->num_of_link_levels;
|
int num_of_levels = pcie_table->num_of_link_levels;
|
||||||
uint32_t smu_pcie_arg;
|
uint32_t smu_pcie_arg;
|
||||||
int ret, i;
|
int ret = 0;
|
||||||
|
int i;
|
||||||
|
|
||||||
if (!num_of_levels)
|
if (!num_of_levels)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -2402,30 +2403,38 @@ int smu_v13_0_update_pcie_parameters(struct smu_context *smu,
|
||||||
for (i = 0; i < num_of_levels; i++) {
|
for (i = 0; i < num_of_levels; i++) {
|
||||||
pcie_table->pcie_gen[i] = pcie_gen_cap;
|
pcie_table->pcie_gen[i] = pcie_gen_cap;
|
||||||
pcie_table->pcie_lane[i] = pcie_width_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 {
|
} else {
|
||||||
for (i = 0; i < num_of_levels; i++) {
|
for (i = 0; i < num_of_levels; i++) {
|
||||||
if (pcie_table->pcie_gen[i] > pcie_gen_cap)
|
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_gen[i] = pcie_gen_cap;
|
||||||
if (pcie_table->pcie_lane[i] > pcie_width_cap)
|
|
||||||
pcie_table->pcie_lane[i] = pcie_width_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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < num_of_levels; i++) {
|
return ret;
|
||||||
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)
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int smu_v13_0_disable_pmfw_state(struct smu_context *smu)
|
int smu_v13_0_disable_pmfw_state(struct smu_context *smu)
|
||||||
|
|
|
||||||
|
|
@ -1489,7 +1489,8 @@ static int smu_v14_0_2_update_pcie_parameters(struct smu_context *smu,
|
||||||
&dpm_context->dpm_tables.pcie_table;
|
&dpm_context->dpm_tables.pcie_table;
|
||||||
int num_of_levels = pcie_table->num_of_link_levels;
|
int num_of_levels = pcie_table->num_of_link_levels;
|
||||||
uint32_t smu_pcie_arg;
|
uint32_t smu_pcie_arg;
|
||||||
int ret, i;
|
int ret = 0;
|
||||||
|
int i;
|
||||||
|
|
||||||
if (!num_of_levels)
|
if (!num_of_levels)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -1505,30 +1506,38 @@ static int smu_v14_0_2_update_pcie_parameters(struct smu_context *smu,
|
||||||
for (i = 0; i < num_of_levels; i++) {
|
for (i = 0; i < num_of_levels; i++) {
|
||||||
pcie_table->pcie_gen[i] = pcie_gen_cap;
|
pcie_table->pcie_gen[i] = pcie_gen_cap;
|
||||||
pcie_table->pcie_lane[i] = pcie_width_cap;
|
pcie_table->pcie_lane[i] = pcie_width_cap;
|
||||||
}
|
smu_pcie_arg = i << 16;
|
||||||
} else {
|
smu_pcie_arg |= pcie_table->pcie_gen[i] << 8;
|
||||||
for (i = 0; i < num_of_levels; i++) {
|
smu_pcie_arg |= pcie_table->pcie_lane[i];
|
||||||
if (pcie_table->pcie_gen[i] > pcie_gen_cap)
|
|
||||||
pcie_table->pcie_gen[i] = pcie_gen_cap;
|
|
||||||
if (pcie_table->pcie_lane[i] > pcie_width_cap)
|
|
||||||
pcie_table->pcie_lane[i] = pcie_width_cap;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < num_of_levels; i++) {
|
ret = smu_cmn_send_smc_msg_with_param(smu,
|
||||||
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_MSG_OverridePcieParameters,
|
||||||
smu_pcie_arg,
|
smu_pcie_arg,
|
||||||
NULL);
|
NULL);
|
||||||
if (ret)
|
if (ret)
|
||||||
return 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 0;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct smu_temperature_range smu14_thermal_policy[] = {
|
static const struct smu_temperature_range smu14_thermal_policy[] = {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user