Commit 1a18607c authored by Kenneth Feng's avatar Kenneth Feng Committed by Alex Deucher
Browse files

drm/amd/pm: override pcie dpm parameters only if it is necessary



override pcie dpm parameters only if it is necessary

Signed-off-by: default avatarKenneth Feng <kenneth.feng@amd.com>
Reviewed-by: default avatarYang Wang <kevinyang.wang@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 0c3f9723
Loading
Loading
Loading
Loading
+15 −16
Original line number Diff line number Diff line
@@ -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;
	PPTable_t *pptable = smu->smu_table.driver_pptable;
	uint32_t smu_pcie_arg;
	int ret, i;
	int ret = 0;
	int i;

	/* lclk dpm table setup */
	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++) {
		smu_pcie_arg = (i << 16) |
			((pptable->PcieGenSpeed[i] <= pcie_gen_cap) ? (pptable->PcieGenSpeed[i] << 8) :
				(pcie_gen_cap << 8)) | ((pptable->PcieLaneCount[i] <= pcie_width_cap) ?
					pptable->PcieLaneCount[i] : pcie_width_cap);
		if (pptable->PcieGenSpeed[i] > pcie_gen_cap ||
			pptable->PcieLaneCount[i] > pcie_width_cap) {
			dpm_context->dpm_tables.pcie_table.pcie_gen[i] = pcie_gen_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)
			return ret;

		if (pptable->PcieGenSpeed[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;
				break;
		}
	}

	return 0;
	return ret;
}

static inline void navi10_dump_od_table(struct smu_context *smu,
+13 −9
Original line number Diff line number Diff line
@@ -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_lane_width, max_lane_width;
	uint32_t smu_pcie_arg;
	int ret, i;
	int ret = 0;
	int i;

	GET_PPTABLE_MEMBER(PcieGenSpeed, &table_member1);
	GET_PPTABLE_MEMBER(PcieLaneCount, &table_member2);
@@ -2170,6 +2171,8 @@ static int sienna_cichlid_update_pcie_parameters(struct smu_context *smu,
	pcie_table->pcie_lane[1] = max_lane_width;

	for (i = 0; i < NUM_LINK_LEVELS; i++) {
		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_lane[i]);
@@ -2179,10 +2182,11 @@ static int sienna_cichlid_update_pcie_parameters(struct smu_context *smu,
						smu_pcie_arg,
						NULL);
			if (ret)
			return ret;
				break;
		}
	}

	return 0;
	return ret;
}

static int sienna_cichlid_get_dpm_ultimate_freq(struct smu_context *smu,
+26 −17
Original line number Diff line number Diff line
@@ -2386,7 +2386,8 @@ int smu_v13_0_update_pcie_parameters(struct smu_context *smu,
				&dpm_context->dpm_tables.pcie_table;
	int num_of_levels = pcie_table->num_of_link_levels;
	uint32_t smu_pcie_arg;
	int ret, i;
	int ret = 0;
	int i;

	if (!num_of_levels)
		return 0;
@@ -2402,17 +2403,23 @@ int smu_v13_0_update_pcie_parameters(struct smu_context *smu,
		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)
			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;
			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++) {
				smu_pcie_arg = i << 16;
				smu_pcie_arg |= pcie_table->pcie_gen[i] << 8;
				smu_pcie_arg |= pcie_table->pcie_lane[i];
@@ -2422,10 +2429,12 @@ int smu_v13_0_update_pcie_parameters(struct smu_context *smu,
									smu_pcie_arg,
									NULL);
				if (ret)
			return ret;
					break;
			}
		}
	}

	return 0;
	return ret;
}

int smu_v13_0_disable_pmfw_state(struct smu_context *smu)
+23 −14
Original line number Diff line number Diff line
@@ -1489,7 +1489,8 @@ static int smu_v14_0_2_update_pcie_parameters(struct smu_context *smu,
				&dpm_context->dpm_tables.pcie_table;
	int num_of_levels = pcie_table->num_of_link_levels;
	uint32_t smu_pcie_arg;
	int ret, i;
	int ret = 0;
	int i;

	if (!num_of_levels)
		return 0;
@@ -1505,17 +1506,23 @@ static int smu_v14_0_2_update_pcie_parameters(struct smu_context *smu,
		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)
			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;
			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++) {
				smu_pcie_arg = i << 16;
				smu_pcie_arg |= pcie_table->pcie_gen[i] << 8;
				smu_pcie_arg |= pcie_table->pcie_lane[i];
@@ -1525,10 +1532,12 @@ static int smu_v14_0_2_update_pcie_parameters(struct smu_context *smu,
						      smu_pcie_arg,
						      NULL);
				if (ret)
			return ret;
					break;
			}
		}
	}

	return 0;
	return ret;
}

static const struct smu_temperature_range smu14_thermal_policy[] = {