aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.19.8/1575-drm-amd-powerplay-apply-Vega20-BACO-workaround.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/1575-drm-amd-powerplay-apply-Vega20-BACO-workaround.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.19.8/1575-drm-amd-powerplay-apply-Vega20-BACO-workaround.patch173
1 files changed, 173 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/1575-drm-amd-powerplay-apply-Vega20-BACO-workaround.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/1575-drm-amd-powerplay-apply-Vega20-BACO-workaround.patch
new file mode 100644
index 00000000..12bae305
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/1575-drm-amd-powerplay-apply-Vega20-BACO-workaround.patch
@@ -0,0 +1,173 @@
+From 7f96060c26189ea1ad02c4f670b6f77fdc9bb70c Mon Sep 17 00:00:00 2001
+From: Evan Quan <evan.quan@amd.com>
+Date: Thu, 7 Mar 2019 10:20:12 +0800
+Subject: [PATCH 1575/2940] drm/amd/powerplay: apply Vega20 BACO workaround
+
+Applied vdci flush workaround for Vega20 BACO.
+
+Change-Id: Ia132ae30f826643bfba980402a92fbd0ae7a4236
+Signed-off-by: Evan Quan <evan.quan@amd.com>
+Acked-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu.h | 1 +
+ drivers/gpu/drm/amd/amdgpu/soc15.c | 2 ++
+ .../gpu/drm/amd/powerplay/hwmgr/vega20_baco.c | 12 +++++++++++
+ .../gpu/drm/amd/powerplay/hwmgr/vega20_baco.h | 1 +
+ .../drm/amd/powerplay/hwmgr/vega20_hwmgr.c | 11 +++++++++-
+ .../gpu/drm/amd/powerplay/inc/vega20_ppsmc.h | 3 ++-
+ .../drm/amd/powerplay/smumgr/vega20_smumgr.c | 20 +++++++++++++++++++
+ .../drm/amd/powerplay/smumgr/vega20_smumgr.h | 1 +
+ 8 files changed, 49 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+index 8e9e17ae585e..11cdfcd5e077 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+@@ -971,6 +971,7 @@ struct amdgpu_device {
+ /* counter of mapped memory through xgmi */
+ atomic_t xgmi_map_counter;
+
++ bool in_baco_reset;
+ };
+
+ static inline struct amdgpu_device *amdgpu_ttm_adev(struct ttm_bo_device *bdev)
+diff --git a/drivers/gpu/drm/amd/amdgpu/soc15.c b/drivers/gpu/drm/amd/amdgpu/soc15.c
+index 6c045039c5c9..eb29162de439 100644
+--- a/drivers/gpu/drm/amd/amdgpu/soc15.c
++++ b/drivers/gpu/drm/amd/amdgpu/soc15.c
+@@ -452,6 +452,8 @@ static int soc15_asic_baco_reset(struct amdgpu_device *adev)
+
+ dev_info(adev->dev, "GPU BACO reset\n");
+
++ adev->in_baco_reset = 1;
++
+ return 0;
+ }
+
+diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_baco.c b/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_baco.c
+index 5e8602a79b1c..df6ff9252401 100644
+--- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_baco.c
++++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_baco.c
+@@ -27,6 +27,7 @@
+ #include "vega20_inc.h"
+ #include "vega20_ppsmc.h"
+ #include "vega20_baco.h"
++#include "vega20_smumgr.h"
+
+
+
+@@ -101,3 +102,14 @@ int vega20_baco_set_state(struct pp_hwmgr *hwmgr, enum BACO_STATE state)
+
+ return 0;
+ }
++
++int vega20_baco_apply_vdci_flush_workaround(struct pp_hwmgr *hwmgr)
++{
++ int ret = 0;
++
++ ret = vega20_set_pptable_driver_address(hwmgr);
++ if (ret)
++ return ret;
++
++ return smum_send_msg_to_smc(hwmgr, PPSMC_MSG_BacoWorkAroundFlushVDCI);
++}
+diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_baco.h b/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_baco.h
+index 51c7f8392925..f06471e712dc 100644
+--- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_baco.h
++++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_baco.h
+@@ -28,5 +28,6 @@
+ extern int vega20_baco_get_capability(struct pp_hwmgr *hwmgr, bool *cap);
+ extern int vega20_baco_get_state(struct pp_hwmgr *hwmgr, enum BACO_STATE *state);
+ extern int vega20_baco_set_state(struct pp_hwmgr *hwmgr, enum BACO_STATE state);
++extern int vega20_baco_apply_vdci_flush_workaround(struct pp_hwmgr *hwmgr);
+
+ #endif
+diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c
+index 9aa7bec1b5fe..664544e7fcdc 100644
+--- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c
++++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c
+@@ -443,6 +443,7 @@ static int vega20_init_sclk_threshold(struct pp_hwmgr *hwmgr)
+
+ static int vega20_setup_asic_task(struct pp_hwmgr *hwmgr)
+ {
++ struct amdgpu_device *adev = (struct amdgpu_device *)(hwmgr->adev);
+ int ret = 0;
+
+ ret = vega20_init_sclk_threshold(hwmgr);
+@@ -450,7 +451,15 @@ static int vega20_setup_asic_task(struct pp_hwmgr *hwmgr)
+ "Failed to init sclk threshold!",
+ return ret);
+
+- return 0;
++ if (adev->in_baco_reset) {
++ adev->in_baco_reset = 0;
++
++ ret = vega20_baco_apply_vdci_flush_workaround(hwmgr);
++ if (ret)
++ pr_err("Failed to apply vega20 baco workaround!\n");
++ }
++
++ return ret;
+ }
+
+ /*
+diff --git a/drivers/gpu/drm/amd/powerplay/inc/vega20_ppsmc.h b/drivers/gpu/drm/amd/powerplay/inc/vega20_ppsmc.h
+index 4f63a736ea0e..a0883038f3c3 100644
+--- a/drivers/gpu/drm/amd/powerplay/inc/vega20_ppsmc.h
++++ b/drivers/gpu/drm/amd/powerplay/inc/vega20_ppsmc.h
+@@ -119,7 +119,8 @@
+ #define PPSMC_MSG_PrepareMp1ForShutdown 0x5A
+ #define PPSMC_MSG_SetMGpuFanBoostLimitRpm 0x5D
+ #define PPSMC_MSG_GetAVFSVoltageByDpm 0x5F
+-#define PPSMC_Message_Count 0x60
++#define PPSMC_MSG_BacoWorkAroundFlushVDCI 0x60
++#define PPSMC_Message_Count 0x61
+
+ typedef uint32_t PPSMC_Result;
+ typedef uint32_t PPSMC_Msg;
+diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/vega20_smumgr.c b/drivers/gpu/drm/amd/powerplay/smumgr/vega20_smumgr.c
+index ba00744c3413..f301a73f6df1 100644
+--- a/drivers/gpu/drm/amd/powerplay/smumgr/vega20_smumgr.c
++++ b/drivers/gpu/drm/amd/powerplay/smumgr/vega20_smumgr.c
+@@ -367,6 +367,26 @@ static int vega20_set_tools_address(struct pp_hwmgr *hwmgr)
+ return ret;
+ }
+
++int vega20_set_pptable_driver_address(struct pp_hwmgr *hwmgr)
++{
++ struct vega20_smumgr *priv =
++ (struct vega20_smumgr *)(hwmgr->smu_backend);
++ int ret = 0;
++
++ PP_ASSERT_WITH_CODE((ret = vega20_send_msg_to_smc_with_parameter(hwmgr,
++ PPSMC_MSG_SetDriverDramAddrHigh,
++ upper_32_bits(priv->smu_tables.entry[TABLE_PPTABLE].mc_addr))) == 0,
++ "[SetPPtabeDriverAddress] Attempt to Set Dram Addr High Failed!",
++ return ret);
++ PP_ASSERT_WITH_CODE((ret = vega20_send_msg_to_smc_with_parameter(hwmgr,
++ PPSMC_MSG_SetDriverDramAddrLow,
++ lower_32_bits(priv->smu_tables.entry[TABLE_PPTABLE].mc_addr))) == 0,
++ "[SetPPtabeDriverAddress] Attempt to Set Dram Addr Low Failed!",
++ return ret);
++
++ return ret;
++}
++
+ static int vega20_smu_init(struct pp_hwmgr *hwmgr)
+ {
+ struct vega20_smumgr *priv;
+diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/vega20_smumgr.h b/drivers/gpu/drm/amd/powerplay/smumgr/vega20_smumgr.h
+index 77349c3f0162..ec953ab13e87 100644
+--- a/drivers/gpu/drm/amd/powerplay/smumgr/vega20_smumgr.h
++++ b/drivers/gpu/drm/amd/powerplay/smumgr/vega20_smumgr.h
+@@ -55,6 +55,7 @@ int vega20_set_activity_monitor_coeff(struct pp_hwmgr *hwmgr,
+ uint8_t *table, uint16_t workload_type);
+ int vega20_get_activity_monitor_coeff(struct pp_hwmgr *hwmgr,
+ uint8_t *table, uint16_t workload_type);
++int vega20_set_pptable_driver_address(struct pp_hwmgr *hwmgr);
+
+ #endif
+
+--
+2.17.1
+