aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.14.71/3787-drm-amd-pp-Simplified-the-avfs-btc-state-on-smu7.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/3787-drm-amd-pp-Simplified-the-avfs-btc-state-on-smu7.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.14.71/3787-drm-amd-pp-Simplified-the-avfs-btc-state-on-smu7.patch415
1 files changed, 415 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/3787-drm-amd-pp-Simplified-the-avfs-btc-state-on-smu7.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/3787-drm-amd-pp-Simplified-the-avfs-btc-state-on-smu7.patch
new file mode 100644
index 00000000..59537d8b
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/3787-drm-amd-pp-Simplified-the-avfs-btc-state-on-smu7.patch
@@ -0,0 +1,415 @@
+From 59a165be99d48081efd5487de94b92690c49553c Mon Sep 17 00:00:00 2001
+From: Rex Zhu <Rex.Zhu@amd.com>
+Date: Fri, 9 Mar 2018 18:07:59 +0800
+Subject: [PATCH 3787/4131] drm/amd/pp: Simplified the avfs btc state on smu7
+
+AVFS feature support/not support is enough to driver.
+
+so remove the complex define of the avfs btc state.
+
+Change-Id: I554fc5ef18d86f9b292d716cd16cd00326e5853f
+Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Rex Zhu <Rex.Zhu@amd.com>
+---
+ drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c | 14 +---
+ drivers/gpu/drm/amd/powerplay/inc/hwmgr.h | 2 +-
+ drivers/gpu/drm/amd/powerplay/inc/smumgr.h | 21 ------
+ drivers/gpu/drm/amd/powerplay/smumgr/fiji_smumgr.c | 70 ++++++------------
+ .../drm/amd/powerplay/smumgr/polaris10_smumgr.c | 83 +++++++---------------
+ drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.c | 4 +-
+ drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.h | 7 +-
+ 7 files changed, 51 insertions(+), 150 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
+index cc1db96..96306ae 100644
+--- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
++++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
+@@ -40,7 +40,6 @@
+
+ #include "hwmgr.h"
+ #include "smu7_hwmgr.h"
+-#include "smu7_smumgr.h"
+ #include "smu_ucode_xfer_vi.h"
+ #include "smu7_powertune.h"
+ #include "smu7_dyn_defaults.h"
+@@ -1353,12 +1352,7 @@ static int smu7_enable_dpm_tasks(struct pp_hwmgr *hwmgr)
+
+ static int smu7_avfs_control(struct pp_hwmgr *hwmgr, bool enable)
+ {
+- struct smu7_smumgr *smu_data = (struct smu7_smumgr *)(hwmgr->smu_backend);
+-
+- if (smu_data == NULL)
+- return -EINVAL;
+-
+- if (smu_data->avfs.avfs_btc_status == AVFS_BTC_NOTSUPPORTED)
++ if (!hwmgr->avfs_supported)
+ return 0;
+
+ if (enable) {
+@@ -1382,13 +1376,9 @@ static int smu7_avfs_control(struct pp_hwmgr *hwmgr, bool enable)
+
+ static int smu7_update_avfs(struct pp_hwmgr *hwmgr)
+ {
+- struct smu7_smumgr *smu_data = (struct smu7_smumgr *)(hwmgr->smu_backend);
+ struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend);
+
+- if (smu_data == NULL)
+- return -EINVAL;
+-
+- if (smu_data->avfs.avfs_btc_status == AVFS_BTC_NOTSUPPORTED)
++ if (!hwmgr->avfs_supported)
+ return 0;
+
+ if (data->need_update_smu7_dpm_table & DPMTABLE_OD_UPDATE_VDDC) {
+diff --git a/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h b/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h
+index b151ad85..312fbc3 100644
+--- a/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h
++++ b/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h
+@@ -748,7 +748,7 @@ struct pp_hwmgr {
+ struct pp_power_state *uvd_ps;
+ struct amd_pp_display_configuration display_config;
+ uint32_t feature_mask;
+-
++ bool avfs_supported;
+ /* UMD Pstate */
+ bool en_umd_pstate;
+ uint32_t power_profile_mode;
+diff --git a/drivers/gpu/drm/amd/powerplay/inc/smumgr.h b/drivers/gpu/drm/amd/powerplay/inc/smumgr.h
+index 9bba0a0..19048b0 100644
+--- a/drivers/gpu/drm/amd/powerplay/inc/smumgr.h
++++ b/drivers/gpu/drm/amd/powerplay/inc/smumgr.h
+@@ -26,27 +26,6 @@
+ #include "amd_powerplay.h"
+ #include "hwmgr.h"
+
+-enum AVFS_BTC_STATUS {
+- AVFS_BTC_BOOT = 0,
+- AVFS_BTC_BOOT_STARTEDSMU,
+- AVFS_LOAD_VIRUS,
+- AVFS_BTC_VIRUS_LOADED,
+- AVFS_BTC_VIRUS_FAIL,
+- AVFS_BTC_COMPLETED_PREVIOUSLY,
+- AVFS_BTC_ENABLEAVFS,
+- AVFS_BTC_STARTED,
+- AVFS_BTC_FAILED,
+- AVFS_BTC_RESTOREVFT_FAILED,
+- AVFS_BTC_SAVEVFT_FAILED,
+- AVFS_BTC_DPMTABLESETUP_FAILED,
+- AVFS_BTC_COMPLETED_UNSAVED,
+- AVFS_BTC_COMPLETED_SAVED,
+- AVFS_BTC_COMPLETED_RESTORED,
+- AVFS_BTC_DISABLED,
+- AVFS_BTC_NOTSUPPORTED,
+- AVFS_BTC_SMUMSG_ERROR
+-};
+-
+ enum SMU_TABLE {
+ SMU_UVD_TABLE = 0,
+ SMU_VCE_TABLE,
+diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/fiji_smumgr.c b/drivers/gpu/drm/amd/powerplay/smumgr/fiji_smumgr.c
+index 0b2b5d1..ed2e2e9 100644
+--- a/drivers/gpu/drm/amd/powerplay/smumgr/fiji_smumgr.c
++++ b/drivers/gpu/drm/amd/powerplay/smumgr/fiji_smumgr.c
+@@ -205,9 +205,9 @@ static int fiji_start_avfs_btc(struct pp_hwmgr *hwmgr)
+ int result = 0;
+ struct smu7_smumgr *smu_data = (struct smu7_smumgr *)(hwmgr->smu_backend);
+
+- if (0 != smu_data->avfs.avfs_btc_param) {
++ if (0 != smu_data->avfs_btc_param) {
+ if (0 != smu7_send_msg_to_smc_with_parameter(hwmgr,
+- PPSMC_MSG_PerformBtc, smu_data->avfs.avfs_btc_param)) {
++ PPSMC_MSG_PerformBtc, smu_data->avfs_btc_param)) {
+ pr_info("[AVFS][Fiji_PerformBtc] PerformBTC SMU msg failed");
+ result = -EINVAL;
+ }
+@@ -261,43 +261,21 @@ static int fiji_setup_graphics_level_structure(struct pp_hwmgr *hwmgr)
+ return 0;
+ }
+
+-static int fiji_avfs_event_mgr(struct pp_hwmgr *hwmgr, bool smu_started)
++static int fiji_avfs_event_mgr(struct pp_hwmgr *hwmgr)
+ {
+- struct smu7_smumgr *smu_data = (struct smu7_smumgr *)(hwmgr->smu_backend);
+-
+- switch (smu_data->avfs.avfs_btc_status) {
+- case AVFS_BTC_COMPLETED_PREVIOUSLY:
+- break;
++ PP_ASSERT_WITH_CODE(0 == fiji_setup_graphics_level_structure(hwmgr),
++ "[AVFS][fiji_avfs_event_mgr] Could not Copy Graphics Level"
++ " table over to SMU",
++ return -EINVAL);
++ PP_ASSERT_WITH_CODE(0 == smu7_setup_pwr_virus(hwmgr),
++ "[AVFS][fiji_avfs_event_mgr] Could not setup "
++ "Pwr Virus for AVFS ",
++ return -EINVAL);
++ PP_ASSERT_WITH_CODE(0 == fiji_start_avfs_btc(hwmgr),
++ "[AVFS][fiji_avfs_event_mgr] Failure at "
++ "fiji_start_avfs_btc. AVFS Disabled",
++ return -EINVAL);
+
+- case AVFS_BTC_BOOT: /*Cold Boot State - Post SMU Start*/
+- if (!smu_started)
+- break;
+- smu_data->avfs.avfs_btc_status = AVFS_BTC_FAILED;
+- PP_ASSERT_WITH_CODE(0 == fiji_setup_graphics_level_structure(hwmgr),
+- "[AVFS][fiji_avfs_event_mgr] Could not Copy Graphics Level"
+- " table over to SMU",
+- return -EINVAL;);
+- smu_data->avfs.avfs_btc_status = AVFS_BTC_VIRUS_FAIL;
+- PP_ASSERT_WITH_CODE(0 == smu7_setup_pwr_virus(hwmgr),
+- "[AVFS][fiji_avfs_event_mgr] Could not setup "
+- "Pwr Virus for AVFS ",
+- return -EINVAL;);
+- smu_data->avfs.avfs_btc_status = AVFS_BTC_FAILED;
+- PP_ASSERT_WITH_CODE(0 == fiji_start_avfs_btc(hwmgr),
+- "[AVFS][fiji_avfs_event_mgr] Failure at "
+- "fiji_start_avfs_btc. AVFS Disabled",
+- return -EINVAL;);
+-
+- smu_data->avfs.avfs_btc_status = AVFS_BTC_ENABLEAVFS;
+- break;
+- case AVFS_BTC_DISABLED: /* Do nothing */
+- case AVFS_BTC_NOTSUPPORTED: /* Do nothing */
+- case AVFS_BTC_ENABLEAVFS:
+- break;
+- default:
+- pr_err("AVFS failed status is %x !\n", smu_data->avfs.avfs_btc_status);
+- break;
+- }
+ return 0;
+ }
+
+@@ -309,8 +287,6 @@ static int fiji_start_smu(struct pp_hwmgr *hwmgr)
+ /* Only start SMC if SMC RAM is not running */
+ if (!(smu7_is_smc_ram_running(hwmgr)
+ || cgs_is_virtualization_enabled(hwmgr->device))) {
+- fiji_avfs_event_mgr(hwmgr, false);
+-
+ /* Check if SMU is running in protected mode */
+ if (0 == PHM_READ_VFPF_INDIRECT_FIELD(hwmgr->device,
+ CGS_IND_REG__SMC,
+@@ -323,7 +299,8 @@ static int fiji_start_smu(struct pp_hwmgr *hwmgr)
+ if (result)
+ return result;
+ }
+- fiji_avfs_event_mgr(hwmgr, true);
++ if (fiji_avfs_event_mgr(hwmgr))
++ hwmgr->avfs_supported = false;
+ }
+
+ /* To initialize all clock gating before RLC loaded and running.*/
+@@ -2315,19 +2292,12 @@ static int fiji_thermal_setup_fan_table(struct pp_hwmgr *hwmgr)
+
+ static int fiji_thermal_avfs_enable(struct pp_hwmgr *hwmgr)
+ {
+- int ret;
+- struct smu7_smumgr *smu_data = (struct smu7_smumgr *)(hwmgr->smu_backend);
+-
+- if (smu_data->avfs.avfs_btc_status != AVFS_BTC_ENABLEAVFS)
++ if (!hwmgr->avfs_supported)
+ return 0;
+
+- ret = smum_send_msg_to_smc(hwmgr, PPSMC_MSG_EnableAvfs);
++ smum_send_msg_to_smc(hwmgr, PPSMC_MSG_EnableAvfs);
+
+- if (!ret)
+- /* If this param is not changed, this function could fire unnecessarily */
+- smu_data->avfs.avfs_btc_status = AVFS_BTC_COMPLETED_PREVIOUSLY;
+-
+- return ret;
++ return 0;
+ }
+
+ static int fiji_program_mem_timing_parameters(struct pp_hwmgr *hwmgr)
+diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smumgr.c b/drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smumgr.c
+index 632d1ca..0609acf 100644
+--- a/drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smumgr.c
++++ b/drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smumgr.c
+@@ -99,13 +99,13 @@ static int polaris10_perform_btc(struct pp_hwmgr *hwmgr)
+ int result = 0;
+ struct smu7_smumgr *smu_data = (struct smu7_smumgr *)(hwmgr->smu_backend);
+
+- if (0 != smu_data->avfs.avfs_btc_param) {
+- if (0 != smu7_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_PerformBtc, smu_data->avfs.avfs_btc_param)) {
++ if (0 != smu_data->avfs_btc_param) {
++ if (0 != smu7_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_PerformBtc, smu_data->avfs_btc_param)) {
+ pr_info("[AVFS][SmuPolaris10_PerformBtc] PerformBTC SMU msg failed");
+ result = -1;
+ }
+ }
+- if (smu_data->avfs.avfs_btc_param > 1) {
++ if (smu_data->avfs_btc_param > 1) {
+ /* Soft-Reset to reset the engine before loading uCode */
+ /* halt */
+ cgs_write_register(hwmgr->device, mmCP_MEC_CNTL, 0x50000000);
+@@ -173,46 +173,25 @@ static int polaris10_setup_graphics_level_structure(struct pp_hwmgr *hwmgr)
+
+
+ static int
+-polaris10_avfs_event_mgr(struct pp_hwmgr *hwmgr, bool SMU_VFT_INTACT)
++polaris10_avfs_event_mgr(struct pp_hwmgr *hwmgr)
+ {
+ struct smu7_smumgr *smu_data = (struct smu7_smumgr *)(hwmgr->smu_backend);
+
+- switch (smu_data->avfs.avfs_btc_status) {
+- case AVFS_BTC_COMPLETED_PREVIOUSLY:
+- break;
+-
+- case AVFS_BTC_BOOT: /* Cold Boot State - Post SMU Start */
+-
+- smu_data->avfs.avfs_btc_status = AVFS_BTC_DPMTABLESETUP_FAILED;
+- PP_ASSERT_WITH_CODE(0 == polaris10_setup_graphics_level_structure(hwmgr),
+- "[AVFS][Polaris10_AVFSEventMgr] Could not Copy Graphics Level table over to SMU",
+- return -EINVAL);
+-
+- if (smu_data->avfs.avfs_btc_param > 1) {
+- pr_info("[AVFS][Polaris10_AVFSEventMgr] AC BTC has not been successfully verified on Fiji. There may be in this setting.");
+- smu_data->avfs.avfs_btc_status = AVFS_BTC_VIRUS_FAIL;
+- PP_ASSERT_WITH_CODE(0 == smu7_setup_pwr_virus(hwmgr),
+- "[AVFS][Polaris10_AVFSEventMgr] Could not setup Pwr Virus for AVFS ",
+- return -EINVAL);
+- }
++ PP_ASSERT_WITH_CODE(0 == polaris10_setup_graphics_level_structure(hwmgr),
++ "[AVFS][Polaris10_AVFSEventMgr] Could not Copy Graphics Level table over to SMU",
++ return -EINVAL);
+
+- smu_data->avfs.avfs_btc_status = AVFS_BTC_FAILED;
+- PP_ASSERT_WITH_CODE(0 == polaris10_perform_btc(hwmgr),
+- "[AVFS][Polaris10_AVFSEventMgr] Failure at SmuPolaris10_PerformBTC. AVFS Disabled",
+- return -EINVAL);
+- smu_data->avfs.avfs_btc_status = AVFS_BTC_ENABLEAVFS;
+- break;
+-
+- case AVFS_BTC_DISABLED:
+- case AVFS_BTC_ENABLEAVFS:
+- case AVFS_BTC_NOTSUPPORTED:
+- break;
+-
+- default:
+- pr_err("AVFS failed status is %x!\n", smu_data->avfs.avfs_btc_status);
+- break;
++ if (smu_data->avfs_btc_param > 1) {
++ pr_info("[AVFS][Polaris10_AVFSEventMgr] AC BTC has not been successfully verified on Fiji. There may be in this setting.");
++ PP_ASSERT_WITH_CODE(0 == smu7_setup_pwr_virus(hwmgr),
++ "[AVFS][Polaris10_AVFSEventMgr] Could not setup Pwr Virus for AVFS ",
++ return -EINVAL);
+ }
+
++ PP_ASSERT_WITH_CODE(0 == polaris10_perform_btc(hwmgr),
++ "[AVFS][Polaris10_AVFSEventMgr] Failure at SmuPolaris10_PerformBTC. AVFS Disabled",
++ return -EINVAL);
++
+ return 0;
+ }
+
+@@ -312,11 +291,10 @@ static int polaris10_start_smu(struct pp_hwmgr *hwmgr)
+ {
+ int result = 0;
+ struct polaris10_smumgr *smu_data = (struct polaris10_smumgr *)(hwmgr->smu_backend);
+- bool SMU_VFT_INTACT;
+
+ /* Only start SMC if SMC RAM is not running */
+- if (!smu7_is_smc_ram_running(hwmgr)) {
+- SMU_VFT_INTACT = false;
++ if (!(smu7_is_smc_ram_running(hwmgr)
++ || cgs_is_virtualization_enabled(hwmgr->device))) {
+ smu_data->protected_mode = (uint8_t) (PHM_READ_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC, SMU_FIRMWARE, SMU_MODE));
+ smu_data->smu7_data.security_hard_key = (uint8_t) (PHM_READ_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC, SMU_FIRMWARE, SMU_SEL));
+
+@@ -337,11 +315,9 @@ static int polaris10_start_smu(struct pp_hwmgr *hwmgr)
+ if (result != 0)
+ PP_ASSERT_WITH_CODE(0, "Failed to load SMU ucode.", return result);
+
+- polaris10_avfs_event_mgr(hwmgr, true);
+- } else
+- SMU_VFT_INTACT = true; /*Driver went offline but SMU was still alive and contains the VFT table */
++ polaris10_avfs_event_mgr(hwmgr);
++ }
+
+- polaris10_avfs_event_mgr(hwmgr, SMU_VFT_INTACT);
+ /* Setup SoftRegsStart here for register lookup in case DummyBackEnd is used and ProcessFirmwareHeader is not executed */
+ smu7_read_smc_sram_dword(hwmgr, SMU7_FIRMWARE_HEADER_LOCATION + offsetof(SMU74_Firmware_Header, SoftRegisters),
+ &(smu_data->smu7_data.soft_regs_start), 0x40000);
+@@ -1732,8 +1708,8 @@ static int polaris10_populate_avfs_parameters(struct pp_hwmgr *hwmgr)
+ table_info->vdd_dep_on_sclk;
+
+
+- if (((struct smu7_smumgr *)smu_data)->avfs.avfs_btc_status == AVFS_BTC_NOTSUPPORTED)
+- return result;
++ if (!hwmgr->avfs_supported)
++ return 0;
+
+ result = atomctrl_get_avfs_information(hwmgr, &avfs_params);
+
+@@ -2070,24 +2046,17 @@ static int polaris10_program_mem_timing_parameters(struct pp_hwmgr *hwmgr)
+
+ int polaris10_thermal_avfs_enable(struct pp_hwmgr *hwmgr)
+ {
+- int ret;
+- struct smu7_smumgr *smu_data = (struct smu7_smumgr *)(hwmgr->smu_backend);
+ struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend);
+
+- if (smu_data->avfs.avfs_btc_status == AVFS_BTC_NOTSUPPORTED)
++ if (!hwmgr->avfs_supported)
+ return 0;
+
+- ret = smum_send_msg_to_smc_with_parameter(hwmgr,
++ smum_send_msg_to_smc_with_parameter(hwmgr,
+ PPSMC_MSG_SetGBDroopSettings, data->avfs_vdroop_override_setting);
+
+- ret = (smum_send_msg_to_smc(hwmgr, PPSMC_MSG_EnableAvfs) == 0) ?
+- 0 : -1;
++ smum_send_msg_to_smc(hwmgr, PPSMC_MSG_EnableAvfs);
+
+- if (!ret)
+- /* If this param is not changed, this function could fire unnecessarily */
+- smu_data->avfs.avfs_btc_status = AVFS_BTC_COMPLETED_PREVIOUSLY;
+-
+- return ret;
++ return 0;
+ }
+
+ static int polaris10_thermal_setup_fan_table(struct pp_hwmgr *hwmgr)
+diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.c b/drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.c
+index dcb151c..0399c10 100644
+--- a/drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.c
++++ b/drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.c
+@@ -629,9 +629,7 @@ int smu7_init(struct pp_hwmgr *hwmgr)
+ smu_data->smu_buffer.mc_addr = mc_addr;
+
+ if (smum_is_hw_avfs_present(hwmgr))
+- smu_data->avfs.avfs_btc_status = AVFS_BTC_BOOT;
+- else
+- smu_data->avfs.avfs_btc_status = AVFS_BTC_NOTSUPPORTED;
++ hwmgr->avfs_supported = true;
+
+ return 0;
+ }
+diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.h b/drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.h
+index 64334a8..126d300 100644
+--- a/drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.h
++++ b/drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.h
+@@ -36,11 +36,6 @@ struct smu7_buffer_entry {
+ struct amdgpu_bo *handle;
+ };
+
+-struct smu7_avfs {
+- enum AVFS_BTC_STATUS avfs_btc_status;
+- uint32_t avfs_btc_param;
+-};
+-
+ struct smu7_smumgr {
+ uint8_t *header;
+ uint8_t *mec_image;
+@@ -55,7 +50,7 @@ struct smu7_smumgr {
+ uint32_t ulv_setting_starts;
+ uint8_t security_hard_key;
+ uint32_t acpi_optimization;
+- struct smu7_avfs avfs;
++ uint32_t avfs_btc_param;
+ };
+
+
+--
+2.7.4
+