Commit 18df969b authored by Ma Jun's avatar Ma Jun Committed by Alex Deucher
Browse files

drm/amd/pm: enable Wifi RFI mitigation feature support for SMU13.0.0



Fulfill the SMU13.0.0 support for Wifi RFI mitigation feature.

--
v10->v11:
 - downgrade the prompt level on message failure(Lijo)
v13:
 - Fix the format issue (IIpo Jarvinen)
 - Move function smu_v13_0_0_set_wbrf_exclusion_ranges to
smu_v13_0.c as a generic code for later use (IIpo Jarvinen)

Co-developed-by: default avatarEvan Quan <quanliangl@hotmail.com>
Signed-off-by: default avatarEvan Quan <quanliangl@hotmail.com>
Reviewed-by: default avatarMario Limonciello <mario.limonciello@amd.com>
Signed-off-by: default avatarMa Jun <Jun.Ma2@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 71f69557
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@
#define __AMDGPU_SMU_H__

#include <linux/acpi_amd_wbrf.h>
#include <linux/units.h>

#include "amdgpu.h"
#include "kgd_pp_interface.h"
@@ -320,6 +321,7 @@ enum smu_table_id {
	SMU_TABLE_PACE,
	SMU_TABLE_ECCINFO,
	SMU_TABLE_COMBO_PPTABLE,
	SMU_TABLE_WIFIBAND,
	SMU_TABLE_COUNT,
};

+2 −1
Original line number Diff line number Diff line
@@ -260,7 +260,8 @@
	__SMU_DUMMY_MAP(PowerDownUmsch),	\
	__SMU_DUMMY_MAP(SetSoftMaxVpe),	\
	__SMU_DUMMY_MAP(SetSoftMinVpe), \
	__SMU_DUMMY_MAP(GetMetricsVersion),
	__SMU_DUMMY_MAP(GetMetricsVersion), \
	__SMU_DUMMY_MAP(EnableUCLKShadow),

#undef __SMU_DUMMY_MAP
#define __SMU_DUMMY_MAP(type)	SMU_MSG_##type
+4 −0
Original line number Diff line number Diff line
@@ -294,5 +294,9 @@ int smu_v13_0_update_pcie_parameters(struct smu_context *smu,

int smu_v13_0_disable_pmfw_state(struct smu_context *smu);

int smu_v13_0_enable_uclk_shadow(struct smu_context *smu, bool enable);

int smu_v13_0_set_wbrf_exclusion_ranges(struct smu_context *smu,
						 struct freq_band_range *exclusion_ranges);
#endif
#endif
+48 −0
Original line number Diff line number Diff line
@@ -2507,3 +2507,51 @@ int smu_v13_0_disable_pmfw_state(struct smu_context *smu)

	return ret == 0 ? 0 : -EINVAL;
}

int smu_v13_0_enable_uclk_shadow(struct smu_context *smu, bool enable)
{
	return smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_EnableUCLKShadow, enable, NULL);
}

int smu_v13_0_set_wbrf_exclusion_ranges(struct smu_context *smu,
						 struct freq_band_range *exclusion_ranges)
{
	WifiBandEntryTable_t wifi_bands;
	int valid_entries = 0;
	int ret, i;

	memset(&wifi_bands, 0, sizeof(wifi_bands));
	for (i = 0; i < ARRAY_SIZE(wifi_bands.WifiBandEntry); i++) {
		if (!exclusion_ranges[i].start && !exclusion_ranges[i].end)
			break;

		/* PMFW expects the inputs to be in Mhz unit */
		wifi_bands.WifiBandEntry[valid_entries].LowFreq =
			DIV_ROUND_DOWN_ULL(exclusion_ranges[i].start, HZ_PER_MHZ);
		wifi_bands.WifiBandEntry[valid_entries++].HighFreq =
			DIV_ROUND_UP_ULL(exclusion_ranges[i].end, HZ_PER_MHZ);
	}
	wifi_bands.WifiBandEntryNum = valid_entries;

	/*
	 * Per confirm with PMFW team, WifiBandEntryNum = 0
	 * is a valid setting.
	 *
	 * Considering the scenarios below:
	 * - At first the wifi device adds an exclusion range e.g. (2400,2500) to
	 *   BIOS and our driver gets notified. We will set WifiBandEntryNum = 1
	 *   and pass the WifiBandEntry (2400, 2500) to PMFW.
	 *
	 * - Later the wifi device removes the wifiband list added above and
	 *   our driver gets notified again. At this time, driver will set
	 *   WifiBandEntryNum = 0 and pass an empty WifiBandEntry list to PMFW.
	 *
	 * - PMFW may still need to do some uclk shadow update(e.g. switching
	 *   from shadow clock back to primary clock) on receiving this.
	 */
	ret = smu_cmn_update_table(smu, SMU_TABLE_WIFIBAND, 0, &wifi_bands, true);
	if (ret)
		dev_warn(smu->adev->dev, "Failed to set wifiband!");

	return ret;
}
+22 −0
Original line number Diff line number Diff line
@@ -169,6 +169,7 @@ static struct cmn2asic_msg_mapping smu_v13_0_0_message_map[SMU_MSG_MAX_COUNT] =
	MSG_MAP(AllowIHHostInterrupt,		PPSMC_MSG_AllowIHHostInterrupt,       0),
	MSG_MAP(ReenableAcDcInterrupt,		PPSMC_MSG_ReenableAcDcInterrupt,       0),
	MSG_MAP(DALNotPresent,		PPSMC_MSG_DALNotPresent,       0),
	MSG_MAP(EnableUCLKShadow,		PPSMC_MSG_EnableUCLKShadow,            0),
};

static struct cmn2asic_mapping smu_v13_0_0_clk_map[SMU_CLK_COUNT] = {
@@ -253,6 +254,7 @@ static struct cmn2asic_mapping smu_v13_0_0_table_map[SMU_TABLE_COUNT] = {
	TAB_MAP(I2C_COMMANDS),
	TAB_MAP(ECCINFO),
	TAB_MAP(OVERDRIVE),
	TAB_MAP(WIFIBAND),
};

static struct cmn2asic_mapping smu_v13_0_0_pwr_src_map[SMU_POWER_SOURCE_COUNT] = {
@@ -498,6 +500,9 @@ static int smu_v13_0_0_tables_init(struct smu_context *smu)
			PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM);
	SMU_TABLE_INIT(tables, SMU_TABLE_ECCINFO, sizeof(EccInfoTable_t),
			PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM);
	SMU_TABLE_INIT(tables, SMU_TABLE_WIFIBAND,
		       sizeof(WifiBandEntryTable_t), PAGE_SIZE,
		       AMDGPU_GEM_DOMAIN_VRAM);

	smu_table->metrics_table = kzalloc(sizeof(SmuMetricsExternal_t), GFP_KERNEL);
	if (!smu_table->metrics_table)
@@ -2938,6 +2943,20 @@ static ssize_t smu_v13_0_0_get_ecc_info(struct smu_context *smu,
	return ret;
}

static bool smu_v13_0_0_wbrf_support_check(struct smu_context *smu)
{
	struct amdgpu_device *adev = smu->adev;

	switch (adev->ip_versions[MP1_HWIP][0]) {
	case IP_VERSION(13, 0, 0):
		return smu->smc_fw_version >= 0x004e6300;
	case IP_VERSION(13, 0, 10):
		return smu->smc_fw_version >= 0x00503300;
	default:
		return false;
	}
}

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,
@@ -3016,6 +3035,9 @@ static const struct pptable_funcs smu_v13_0_0_ppt_funcs = {
	.gpo_control = smu_v13_0_gpo_control,
	.get_ecc_info = smu_v13_0_0_get_ecc_info,
	.notify_display_change = smu_v13_0_notify_display_change,
	.is_asic_wbrf_supported = smu_v13_0_0_wbrf_support_check,
	.enable_uclk_shadow = smu_v13_0_enable_uclk_shadow,
	.set_wbrf_exclusion_ranges = smu_v13_0_set_wbrf_exclusion_ranges,
};

void smu_v13_0_0_set_ppt_funcs(struct smu_context *smu)