Skip to content

Commit

Permalink
drm/amd/pm: enable Wifi RFI mitigation feature support for SMU13.0.0
Browse files Browse the repository at this point in the history
Fulfill the SMU13.0.0 support for Wifi RFI mitigation feature.

Signed-off-by: Evan Quan <evan.quan@amd.com>
--
v1->v2:
  - check the wbrf support using pmfw version(Lijo)
v2->v3:
  - some minor fixes(Mario)
  • Loading branch information
Evan Quan authored and intel-lab-lkp committed May 30, 2023
1 parent befb8e3 commit 8ecc361
Show file tree
Hide file tree
Showing 5 changed files with 80 additions and 1 deletion.
4 changes: 4 additions & 0 deletions drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h
Expand Up @@ -323,6 +323,7 @@ enum smu_table_id
SMU_TABLE_PACE,
SMU_TABLE_ECCINFO,
SMU_TABLE_COMBO_PPTABLE,
SMU_TABLE_WIFIBAND,
SMU_TABLE_COUNT,
};

Expand Down Expand Up @@ -1496,6 +1497,9 @@ enum smu_baco_seq {
__dst_size); \
})

#define HZ_IN_MHZ 1000000UL
#define HZ_TO_MHZ(freq) ((freq) / HZ_IN_MHZ)

#if !defined(SWSMU_CODE_LAYER_L2) && !defined(SWSMU_CODE_LAYER_L3) && !defined(SWSMU_CODE_LAYER_L4)
int smu_get_power_limit(void *handle,
uint32_t *limit,
Expand Down
3 changes: 2 additions & 1 deletion drivers/gpu/drm/amd/pm/swsmu/inc/smu_types.h
Expand Up @@ -245,7 +245,8 @@
__SMU_DUMMY_MAP(AllowGpo), \
__SMU_DUMMY_MAP(Mode2Reset), \
__SMU_DUMMY_MAP(RequestI2cTransaction), \
__SMU_DUMMY_MAP(GetMetricsTable),
__SMU_DUMMY_MAP(GetMetricsTable), \
__SMU_DUMMY_MAP(EnableUCLKShadow),

#undef __SMU_DUMMY_MAP
#define __SMU_DUMMY_MAP(type) SMU_MSG_##type
Expand Down
3 changes: 3 additions & 0 deletions drivers/gpu/drm/amd/pm/swsmu/inc/smu_v13_0.h
Expand Up @@ -303,5 +303,8 @@ int smu_v13_0_get_pptable_from_firmware(struct smu_context *smu,
uint32_t *size,
uint32_t pptable_id);

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

#endif
#endif
9 changes: 9 additions & 0 deletions drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c
Expand Up @@ -2453,3 +2453,12 @@ int smu_v13_0_mode1_reset(struct smu_context *smu)

return ret;
}

int smu_v13_0_enable_uclk_shadow(struct smu_context *smu,
bool enablement)
{
return smu_cmn_send_smc_msg_with_param(smu,
SMU_MSG_EnableUCLKShadow,
enablement,
NULL);
}
62 changes: 62 additions & 0 deletions drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c
Expand Up @@ -155,6 +155,7 @@ static struct cmn2asic_msg_mapping smu_v13_0_0_message_map[SMU_MSG_MAX_COUNT] =
MSG_MAP(AllowGpo, PPSMC_MSG_SetGpoAllow, 0),
MSG_MAP(AllowIHHostInterrupt, PPSMC_MSG_AllowIHHostInterrupt, 0),
MSG_MAP(ReenableAcDcInterrupt, PPSMC_MSG_ReenableAcDcInterrupt, 0),
MSG_MAP(EnableUCLKShadow, PPSMC_MSG_EnableUCLKShadow, 0),
};

static struct cmn2asic_mapping smu_v13_0_0_clk_map[SMU_CLK_COUNT] = {
Expand Down Expand Up @@ -235,6 +236,7 @@ static struct cmn2asic_mapping smu_v13_0_0_table_map[SMU_TABLE_COUNT] = {
TAB_MAP(DRIVER_SMU_CONFIG),
TAB_MAP(ACTIVITY_MONITOR_COEFF),
[SMU_TABLE_COMBO_PPTABLE] = {1, TABLE_COMBO_PPTABLE},
TAB_MAP(WIFIBAND),
TAB_MAP(I2C_COMMANDS),
TAB_MAP(ECCINFO),
};
Expand Down Expand Up @@ -472,6 +474,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)
Expand Down Expand Up @@ -2112,6 +2117,60 @@ 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]) {
/* PMFWs supporting WBRF feature are not yet available */
case IP_VERSION(13, 0, 0):
case IP_VERSION(13, 0, 10):
return false;
default:
return false;
}
}

static int smu_v13_0_0_set_wbrf_exclusion_ranges(struct smu_context *smu,
struct exclusion_range *exclusion_ranges)
{
WifiBandEntryTable_t wifi_bands;
uint64_t start_rounddown;
uint64_t end_roundup;
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;

start_rounddown = rounddown(exclusion_ranges[i].start, HZ_IN_MHZ);
end_roundup = roundup(exclusion_ranges[i].end, HZ_IN_MHZ);
/* PMFW expects the inputs to be in Mhz unit */
wifi_bands.WifiBandEntry[valid_entries].LowFreq = HZ_TO_MHZ(start_rounddown);
wifi_bands.WifiBandEntry[valid_entries++].HighFreq = HZ_TO_MHZ(end_roundup);
}
wifi_bands.WifiBandEntryNum = valid_entries;

/*
* Per confirm with PMFW team, WifiBandEntryNum = 0
* is a valid setting. So, there should be no direct
* return on that.
*/

ret = smu_cmn_update_table(smu,
SMU_TABLE_WIFIBAND,
0,
(void *)(&wifi_bands),
true);
if (ret)
dev_err(smu->adev->dev, "Failed to set wifiband!");

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,
Expand Down Expand Up @@ -2188,6 +2247,9 @@ static const struct pptable_funcs smu_v13_0_0_ppt_funcs = {
.send_hbm_bad_channel_flag = smu_v13_0_0_send_bad_mem_channel_flag,
.gpo_control = smu_v13_0_gpo_control,
.get_ecc_info = smu_v13_0_0_get_ecc_info,
.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_0_set_wbrf_exclusion_ranges,
};

void smu_v13_0_0_set_ppt_funcs(struct smu_context *smu)
Expand Down

0 comments on commit 8ecc361

Please sign in to comment.