aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.14.71/5538-drm-amdgpu-Load-fw-between-hw_init-resume_phase1-and.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/5538-drm-amdgpu-Load-fw-between-hw_init-resume_phase1-and.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.14.71/5538-drm-amdgpu-Load-fw-between-hw_init-resume_phase1-and.patch290
1 files changed, 290 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/5538-drm-amdgpu-Load-fw-between-hw_init-resume_phase1-and.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/5538-drm-amdgpu-Load-fw-between-hw_init-resume_phase1-and.patch
new file mode 100644
index 00000000..ac25aedc
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/5538-drm-amdgpu-Load-fw-between-hw_init-resume_phase1-and.patch
@@ -0,0 +1,290 @@
+From ed92a4ecd991b2e62b49f9d607c0fa1e3d163546 Mon Sep 17 00:00:00 2001
+From: Rex Zhu <Rex.Zhu@amd.com>
+Date: Wed, 10 Oct 2018 20:41:32 +0800
+Subject: [PATCH 5538/5725] drm/amdgpu: Load fw between hw_init/resume_phase1
+ and phase2
+
+Extract the function of fw loading out of powerplay.
+Do fw loading between hw_init/resuem_phase1 and phase2
+
+Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Rex Zhu <Rex.Zhu@amd.com>
+Signed-off-by: Raveendra Talabattula <raveendra.talabattula@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 61 +++++++++++++++++++++-
+ drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c | 11 ----
+ drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c | 8 ---
+ drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c | 20 -------
+ drivers/gpu/drm/amd/powerplay/inc/hwmgr.h | 1 -
+ drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.c | 8 +--
+ drivers/gpu/drm/amd/powerplay/smumgr/smu8_smumgr.c | 5 --
+ 7 files changed, 62 insertions(+), 52 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+index a8b95cd..6260307 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+@@ -1620,6 +1620,47 @@ static int amdgpu_device_ip_hw_init_phase2(struct amdgpu_device *adev)
+ return 0;
+ }
+
++static int amdgpu_device_fw_loading(struct amdgpu_device *adev)
++{
++ int r = 0;
++ int i;
++
++ if (adev->asic_type >= CHIP_VEGA10) {
++ for (i = 0; i < adev->num_ip_blocks; i++) {
++ if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_PSP) {
++ if (adev->in_gpu_reset || adev->in_suspend) {
++ if (amdgpu_sriov_vf(adev) && adev->in_gpu_reset)
++ break; /* sriov gpu reset, psp need to do hw_init before IH because of hw limit */
++ r = adev->ip_blocks[i].version->funcs->resume(adev);
++ if (r) {
++ DRM_ERROR("resume of IP block <%s> failed %d\n",
++ adev->ip_blocks[i].version->funcs->name, r);
++ return r;
++ }
++ } else {
++ r = adev->ip_blocks[i].version->funcs->hw_init(adev);
++ if (r) {
++ DRM_ERROR("hw_init of IP block <%s> failed %d\n",
++ adev->ip_blocks[i].version->funcs->name, r);
++ return r;
++ }
++ }
++ adev->ip_blocks[i].status.hw = true;
++ }
++ }
++ }
++
++ if (adev->powerplay.pp_funcs->load_firmware) {
++ r = adev->powerplay.pp_funcs->load_firmware(adev->powerplay.pp_handle);
++ if (r) {
++ pr_err("firmware loading failed\n");
++ return r;
++ }
++ }
++
++ return 0;
++}
++
+ /**
+ * amdgpu_device_ip_init - run init for hardware IPs
+ *
+@@ -1684,6 +1725,10 @@ static int amdgpu_device_ip_init(struct amdgpu_device *adev)
+ if (r)
+ return r;
+
++ r = amdgpu_device_fw_loading(adev);
++ if (r)
++ return r;
++
+ r = amdgpu_device_ip_hw_init_phase2(adev);
+ if (r)
+ return r;
+@@ -2216,7 +2261,8 @@ static int amdgpu_device_ip_resume_phase2(struct amdgpu_device *adev)
+ continue;
+ if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_COMMON ||
+ adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC ||
+- adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_IH)
++ adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_IH ||
++ adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_PSP)
+ continue;
+ r = adev->ip_blocks[i].version->funcs->resume(adev);
+ if (r) {
+@@ -2248,6 +2294,11 @@ static int amdgpu_device_ip_resume(struct amdgpu_device *adev)
+ r = amdgpu_device_ip_resume_phase1(adev);
+ if (r)
+ return r;
++
++ r = amdgpu_device_fw_loading(adev);
++ if (r)
++ return r;
++
+ r = amdgpu_device_ip_resume_phase2(adev);
+
+ return r;
+@@ -3204,6 +3255,10 @@ static int amdgpu_device_reset(struct amdgpu_device *adev)
+ if (r)
+ goto out;
+
++ r = amdgpu_device_fw_loading(adev);
++ if (r)
++ return r;
++
+ r = amdgpu_device_ip_resume_phase2(adev);
+ if (r)
+ goto out;
+@@ -3264,6 +3319,10 @@ static int amdgpu_device_reset_sriov(struct amdgpu_device *adev,
+ /* we need recover gart prior to run SMC/CP/SDMA resume */
+ amdgpu_gtt_mgr_recover(&adev->mman.bdev.man[TTM_PL_TT]);
+
++ r = amdgpu_device_fw_loading(adev);
++ if (r)
++ return r;
++
+ /* now we are okay to resume SMC/CP/SDMA */
+ r = amdgpu_device_ip_reinit_late_sriov(adev);
+ if (r)
+diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
+index 575f363..a0fc2c2 100644
+--- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
+@@ -4174,20 +4174,9 @@ static void gfx_v8_0_rlc_start(struct amdgpu_device *adev)
+
+ static int gfx_v8_0_rlc_resume(struct amdgpu_device *adev)
+ {
+- int r;
+-
+ gfx_v8_0_rlc_stop(adev);
+ gfx_v8_0_rlc_reset(adev);
+ gfx_v8_0_init_pg(adev);
+-
+- if (adev->powerplay.pp_funcs->load_firmware) {
+- r = adev->powerplay.pp_funcs->load_firmware(adev->powerplay.pp_handle);
+- if (r) {
+- pr_err("firmware loading failed\n");
+- return r;
+- }
+- }
+-
+ gfx_v8_0_rlc_start(adev);
+
+ return 0;
+diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
+index 573284f..24b5252 100644
+--- a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
+@@ -796,14 +796,6 @@ static int sdma_v3_0_start(struct amdgpu_device *adev)
+ {
+ int r;
+
+- if (adev->powerplay.pp_funcs->load_firmware) {
+- r = adev->powerplay.pp_funcs->load_firmware(adev->powerplay.pp_handle);
+- if (r) {
+- pr_err("firmware loading failed\n");
+- return r;
+- }
+- }
+-
+ /* disable sdma engine before programing it */
+ sdma_v3_0_ctx_switch_enable(adev, false);
+ sdma_v3_0_enable(adev, false);
+diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c
+index d552af2..47ac923 100644
+--- a/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c
++++ b/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c
+@@ -89,7 +89,6 @@ int hwmgr_early_init(struct pp_hwmgr *hwmgr)
+ hwmgr_init_default_caps(hwmgr);
+ hwmgr_set_user_specify_caps(hwmgr);
+ hwmgr->fan_ctrl_is_in_default_mode = true;
+- hwmgr->reload_fw = 1;
+ hwmgr_init_workload_prority(hwmgr);
+
+ switch (hwmgr->chip_family) {
+@@ -209,17 +208,6 @@ int hwmgr_hw_init(struct pp_hwmgr *hwmgr)
+ {
+ int ret = 0;
+
+- if (!hwmgr || !hwmgr->smumgr_funcs)
+- return -EINVAL;
+-
+- if (hwmgr->smumgr_funcs->start_smu) {
+- ret = hwmgr->smumgr_funcs->start_smu(hwmgr);
+- if (ret) {
+- pr_err("smc start failed\n");
+- return -EINVAL;
+- }
+- }
+-
+ if (!hwmgr->pm_en)
+ return 0;
+
+@@ -301,7 +289,6 @@ int hwmgr_suspend(struct pp_hwmgr *hwmgr)
+ if (!hwmgr || !hwmgr->pm_en)
+ return 0;
+
+- hwmgr->reload_fw = true;
+ phm_disable_smc_firmware_ctf(hwmgr);
+ ret = psm_set_boot_states(hwmgr);
+ if (ret)
+@@ -321,13 +308,6 @@ int hwmgr_resume(struct pp_hwmgr *hwmgr)
+ if (!hwmgr)
+ return -EINVAL;
+
+- if (hwmgr->smumgr_funcs && hwmgr->smumgr_funcs->start_smu) {
+- if (hwmgr->smumgr_funcs->start_smu(hwmgr)) {
+- pr_err("smc start failed\n");
+- return -EINVAL;
+- }
+- }
+-
+ if (!hwmgr->pm_en)
+ return 0;
+
+diff --git a/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h b/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h
+index f07d93e..0d00dc3 100644
+--- a/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h
++++ b/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h
+@@ -735,7 +735,6 @@ struct pp_hwmgr {
+ void *smu_backend;
+ const struct pp_smumgr_func *smumgr_funcs;
+ bool is_kicker;
+- bool reload_fw;
+
+ enum PP_DAL_POWERLEVEL dal_power_level;
+ struct phm_dynamic_state_info dyn_state;
+diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.c b/drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.c
+index 5db9215..f189c40 100644
+--- a/drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.c
++++ b/drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.c
+@@ -345,9 +345,6 @@ int smu7_request_smu_load_fw(struct pp_hwmgr *hwmgr)
+ uint32_t fw_to_load;
+ int r = 0;
+
+- if (!hwmgr->reload_fw)
+- return 0;
+-
+ amdgpu_ucode_init_bo(hwmgr->adev);
+
+ if (smu_data->soft_regs_start)
+@@ -434,10 +431,9 @@ int smu7_request_smu_load_fw(struct pp_hwmgr *hwmgr)
+ smu7_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_LoadUcodes, fw_to_load);
+
+ r = smu7_check_fw_load_finish(hwmgr, fw_to_load);
+- if (!r) {
+- hwmgr->reload_fw = 0;
++ if (!r)
+ return 0;
+- }
++
+ pr_err("SMU load firmware failed\n");
+
+ failed:
+diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/smu8_smumgr.c b/drivers/gpu/drm/amd/powerplay/smumgr/smu8_smumgr.c
+index abbf2f2..f836d30 100644
+--- a/drivers/gpu/drm/amd/powerplay/smumgr/smu8_smumgr.c
++++ b/drivers/gpu/drm/amd/powerplay/smumgr/smu8_smumgr.c
+@@ -661,9 +661,6 @@ static int smu8_request_smu_load_fw(struct pp_hwmgr *hwmgr)
+ uint32_t fw_to_check = 0;
+ int ret;
+
+- if (!hwmgr->reload_fw)
+- return 0;
+-
+ amdgpu_ucode_init_bo(hwmgr->adev);
+
+ smu8_smu_populate_firmware_entries(hwmgr);
+@@ -719,8 +716,6 @@ static int smu8_request_smu_load_fw(struct pp_hwmgr *hwmgr)
+ return ret;
+ }
+
+- hwmgr->reload_fw = 0;
+-
+ return 0;
+ }
+
+--
+2.7.4
+