aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/1917-drm-amdgpu-init-vega10-SR-IOV-reg-access-mode.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/1917-drm-amdgpu-init-vega10-SR-IOV-reg-access-mode.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/1917-drm-amdgpu-init-vega10-SR-IOV-reg-access-mode.patch171
1 files changed, 171 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/1917-drm-amdgpu-init-vega10-SR-IOV-reg-access-mode.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/1917-drm-amdgpu-init-vega10-SR-IOV-reg-access-mode.patch
new file mode 100644
index 00000000..79ca3765
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/1917-drm-amdgpu-init-vega10-SR-IOV-reg-access-mode.patch
@@ -0,0 +1,171 @@
+From 0f41bbaacd93d92e987e83b50cad28f1466b70be Mon Sep 17 00:00:00 2001
+From: Trigger Huang <Trigger.Huang@amd.com>
+Date: Thu, 9 May 2019 17:32:59 +0800
+Subject: [PATCH 1917/2940] drm/amdgpu: init vega10 SR-IOV reg access mode
+
+Set different register access mode according to the features
+provided by firmware
+
+Signed-off-by: Trigger Huang <Trigger.Huang@amd.com>
+Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 3 ++
+ drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c | 44 ++++++++++++++++++++++
+ drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h | 13 +++++++
+ drivers/gpu/drm/amd/amdgpu/mxgpu_ai.c | 19 ++++++++++
+ 4 files changed, 79 insertions(+)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+index ec5456956dcf..79dd96b93d50 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+@@ -1578,6 +1578,9 @@ static int amdgpu_device_ip_early_init(struct amdgpu_device *adev)
+ r = amdgpu_virt_request_full_gpu(adev, true);
+ if (r)
+ return -EAGAIN;
++
++ /* query the reg access mode at the very beginning */
++ amdgpu_virt_init_reg_access_mode(adev);
+ }
+
+ adev->pm.pp_feature = amdgpu_pp_feature_mask;
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c
+index 7d484fad3909..1f0bd4d16475 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c
+@@ -426,3 +426,47 @@ uint32_t amdgpu_virt_get_mclk(struct amdgpu_device *adev, bool lowest)
+ return clk;
+ }
+
++void amdgpu_virt_init_reg_access_mode(struct amdgpu_device *adev)
++{
++ struct amdgpu_virt *virt = &adev->virt;
++
++ if (virt->ops && virt->ops->init_reg_access_mode)
++ virt->ops->init_reg_access_mode(adev);
++}
++
++bool amdgpu_virt_support_psp_prg_ih_reg(struct amdgpu_device *adev)
++{
++ bool ret = false;
++ struct amdgpu_virt *virt = &adev->virt;
++
++ if (amdgpu_sriov_vf(adev)
++ && (virt->reg_access_mode & AMDGPU_VIRT_REG_ACCESS_PSP_PRG_IH))
++ ret = true;
++
++ return ret;
++}
++
++bool amdgpu_virt_support_rlc_prg_reg(struct amdgpu_device *adev)
++{
++ bool ret = false;
++ struct amdgpu_virt *virt = &adev->virt;
++
++ if (amdgpu_sriov_vf(adev)
++ && (virt->reg_access_mode & AMDGPU_VIRT_REG_ACCESS_RLC)
++ && !(amdgpu_sriov_runtime(adev)))
++ ret = true;
++
++ return ret;
++}
++
++bool amdgpu_virt_support_skip_setting(struct amdgpu_device *adev)
++{
++ bool ret = false;
++ struct amdgpu_virt *virt = &adev->virt;
++
++ if (amdgpu_sriov_vf(adev)
++ && (virt->reg_access_mode & AMDGPU_VIRT_REG_SKIP_SEETING))
++ ret = true;
++
++ return ret;
++}
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h
+index 584947b7ccf3..dca25deee75c 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h
+@@ -48,6 +48,12 @@ struct amdgpu_vf_error_buffer {
+ uint64_t data[AMDGPU_VF_ERROR_ENTRY_SIZE];
+ };
+
++/* According to the fw feature, some new reg access modes are supported */
++#define AMDGPU_VIRT_REG_ACCESS_LEGACY (1 << 0) /* directly mmio */
++#define AMDGPU_VIRT_REG_ACCESS_PSP_PRG_IH (1 << 1) /* by PSP */
++#define AMDGPU_VIRT_REG_ACCESS_RLC (1 << 2) /* by RLC */
++#define AMDGPU_VIRT_REG_SKIP_SEETING (1 << 3) /* Skip setting reg */
++
+ /**
+ * struct amdgpu_virt_ops - amdgpu device virt operations
+ */
+@@ -59,6 +65,7 @@ struct amdgpu_virt_ops {
+ void (*trans_msg)(struct amdgpu_device *adev, u32 req, u32 data1, u32 data2, u32 data3);
+ int (*get_pp_clk)(struct amdgpu_device *adev, u32 type, char *buf);
+ int (*force_dpm_level)(struct amdgpu_device *adev, u32 level);
++ void (*init_reg_access_mode)(struct amdgpu_device *adev);
+ };
+
+ /*
+@@ -258,6 +265,7 @@ struct amdgpu_virt {
+ uint32_t gim_feature;
+ /* protect DPM events to GIM */
+ struct mutex dpm_mutex;
++ uint32_t reg_access_mode;
+ };
+
+ #define amdgpu_sriov_enabled(adev) \
+@@ -307,4 +315,9 @@ void amdgpu_virt_init_data_exchange(struct amdgpu_device *adev);
+ uint32_t amdgpu_virt_get_sclk(struct amdgpu_device *adev, bool lowest);
+ uint32_t amdgpu_virt_get_mclk(struct amdgpu_device *adev, bool lowest);
+
++void amdgpu_virt_init_reg_access_mode(struct amdgpu_device *adev);
++bool amdgpu_virt_support_psp_prg_ih_reg(struct amdgpu_device *adev);
++bool amdgpu_virt_support_rlc_prg_reg(struct amdgpu_device *adev);
++bool amdgpu_virt_support_skip_setting(struct amdgpu_device *adev);
++
+ #endif
+diff --git a/drivers/gpu/drm/amd/amdgpu/mxgpu_ai.c b/drivers/gpu/drm/amd/amdgpu/mxgpu_ai.c
+index 64a7b1fb1d1b..31030f86be86 100644
+--- a/drivers/gpu/drm/amd/amdgpu/mxgpu_ai.c
++++ b/drivers/gpu/drm/amd/amdgpu/mxgpu_ai.c
+@@ -26,6 +26,7 @@
+ #include "nbio/nbio_6_1_sh_mask.h"
+ #include "gc/gc_9_0_offset.h"
+ #include "gc/gc_9_0_sh_mask.h"
++#include "mp/mp_9_0_offset.h"
+ #include "soc15.h"
+ #include "vega10_ih.h"
+ #include "soc15_common.h"
+@@ -448,6 +449,23 @@ void xgpu_ai_mailbox_put_irq(struct amdgpu_device *adev)
+ amdgpu_irq_put(adev, &adev->virt.rcv_irq, 0);
+ }
+
++static void xgpu_ai_init_reg_access_mode(struct amdgpu_device *adev)
++{
++ uint32_t rlc_fw_ver = RREG32_SOC15(GC, 0, mmRLC_GPM_GENERAL_6);
++ uint32_t sos_fw_ver = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_58);
++
++ adev->virt.reg_access_mode = AMDGPU_VIRT_REG_ACCESS_LEGACY;
++
++ if (rlc_fw_ver >= 0x5d)
++ adev->virt.reg_access_mode |= AMDGPU_VIRT_REG_ACCESS_RLC;
++
++ if (sos_fw_ver >= 0x80455)
++ adev->virt.reg_access_mode |= AMDGPU_VIRT_REG_ACCESS_PSP_PRG_IH;
++
++ if (sos_fw_ver >= 0x8045b)
++ adev->virt.reg_access_mode |= AMDGPU_VIRT_REG_SKIP_SEETING;
++}
++
+ const struct amdgpu_virt_ops xgpu_ai_virt_ops = {
+ .req_full_gpu = xgpu_ai_request_full_gpu_access,
+ .rel_full_gpu = xgpu_ai_release_full_gpu_access,
+@@ -456,4 +474,5 @@ const struct amdgpu_virt_ops xgpu_ai_virt_ops = {
+ .trans_msg = xgpu_ai_mailbox_trans_msg,
+ .get_pp_clk = xgpu_ai_get_pp_clk,
+ .force_dpm_level = xgpu_ai_force_dpm_level,
++ .init_reg_access_mode = xgpu_ai_init_reg_access_mode,
+ };
+--
+2.17.1
+