aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3330-drm-amdgpu-add-mmhub-clock-gating-for-Arcturus.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3330-drm-amdgpu-add-mmhub-clock-gating-for-Arcturus.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3330-drm-amdgpu-add-mmhub-clock-gating-for-Arcturus.patch196
1 files changed, 196 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3330-drm-amdgpu-add-mmhub-clock-gating-for-Arcturus.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3330-drm-amdgpu-add-mmhub-clock-gating-for-Arcturus.patch
new file mode 100644
index 00000000..8c7e5edc
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3330-drm-amdgpu-add-mmhub-clock-gating-for-Arcturus.patch
@@ -0,0 +1,196 @@
+From 2c614d796ad5cfaf4d019918ad0cae5b08acf71a Mon Sep 17 00:00:00 2001
+From: Le Ma <le.ma@amd.com>
+Date: Fri, 9 Aug 2019 18:57:15 +0800
+Subject: [PATCH 3330/4256] drm/amdgpu: add mmhub clock gating for Arcturus
+
+Add 2 mmhub instances CG
+
+Change-Id: I76ab7a50cd9a40de3022f733787b42e4e5c4dbf5
+Signed-off-by: Le Ma <le.ma@amd.com>
+Reviewed-by: Kevin Wang <kevin1.wang@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c | 12 +--
+ drivers/gpu/drm/amd/amdgpu/mmhub_v9_4.c | 126 ++++++++++++++++++++++++
+ drivers/gpu/drm/amd/amdgpu/mmhub_v9_4.h | 3 +
+ 3 files changed, 135 insertions(+), 6 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
+index 56c8de2fb15c..004ae69c8def 100644
+--- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
+@@ -1402,9 +1402,9 @@ static int gmc_v9_0_set_clockgating_state(void *handle,
+ struct amdgpu_device *adev = (struct amdgpu_device *)handle;
+
+ if (adev->asic_type == CHIP_ARCTURUS)
+- return 0;
+-
+- mmhub_v1_0_set_clockgating(adev, state);
++ mmhub_v9_4_set_clockgating(adev, state);
++ else
++ mmhub_v1_0_set_clockgating(adev, state);
+
+ athub_v1_0_set_clockgating(adev, state);
+
+@@ -1416,9 +1416,9 @@ static void gmc_v9_0_get_clockgating_state(void *handle, u32 *flags)
+ struct amdgpu_device *adev = (struct amdgpu_device *)handle;
+
+ if (adev->asic_type == CHIP_ARCTURUS)
+- return;
+-
+- mmhub_v1_0_get_clockgating(adev, flags);
++ mmhub_v9_4_get_clockgating(adev, flags);
++ else
++ mmhub_v1_0_get_clockgating(adev, flags);
+
+ athub_v1_0_get_clockgating(adev, flags);
+ }
+diff --git a/drivers/gpu/drm/amd/amdgpu/mmhub_v9_4.c b/drivers/gpu/drm/amd/amdgpu/mmhub_v9_4.c
+index 33b0de54a5da..e52e4d1860f5 100644
+--- a/drivers/gpu/drm/amd/amdgpu/mmhub_v9_4.c
++++ b/drivers/gpu/drm/amd/amdgpu/mmhub_v9_4.c
+@@ -515,3 +515,129 @@ void mmhub_v9_4_init(struct amdgpu_device *adev)
+ i * MMHUB_INSTANCE_REGISTER_OFFSET;
+ }
+ }
++
++static void mmhub_v9_4_update_medium_grain_clock_gating(struct amdgpu_device *adev,
++ bool enable)
++{
++ uint32_t def, data, def1, data1;
++ int i, j;
++ int dist = mmDAGB1_CNTL_MISC2 - mmDAGB0_CNTL_MISC2;
++
++ for (i = 0; i < MMHUB_NUM_INSTANCES; i++) {
++ def = data = RREG32_SOC15_OFFSET(MMHUB, 0,
++ mmATCL2_0_ATC_L2_MISC_CG,
++ i * MMHUB_INSTANCE_REGISTER_OFFSET);
++
++ if (enable && (adev->cg_flags & AMD_CG_SUPPORT_MC_MGCG))
++ data |= ATCL2_0_ATC_L2_MISC_CG__ENABLE_MASK;
++ else
++ data &= ~ATCL2_0_ATC_L2_MISC_CG__ENABLE_MASK;
++
++ if (def != data)
++ WREG32_SOC15_OFFSET(MMHUB, 0, mmATCL2_0_ATC_L2_MISC_CG,
++ i * MMHUB_INSTANCE_REGISTER_OFFSET, data);
++
++ for (j = 0; j < 5; j++) {
++ def1 = data1 = RREG32_SOC15_OFFSET(MMHUB, 0,
++ mmDAGB0_CNTL_MISC2,
++ i * MMHUB_INSTANCE_REGISTER_OFFSET +
++ j * dist);
++ if (enable &&
++ (adev->cg_flags & AMD_CG_SUPPORT_MC_MGCG)) {
++ data1 &=
++ ~(DAGB0_CNTL_MISC2__DISABLE_WRREQ_CG_MASK |
++ DAGB0_CNTL_MISC2__DISABLE_WRRET_CG_MASK |
++ DAGB0_CNTL_MISC2__DISABLE_RDREQ_CG_MASK |
++ DAGB0_CNTL_MISC2__DISABLE_RDRET_CG_MASK |
++ DAGB0_CNTL_MISC2__DISABLE_TLBWR_CG_MASK |
++ DAGB0_CNTL_MISC2__DISABLE_TLBRD_CG_MASK);
++ } else {
++ data1 |=
++ (DAGB0_CNTL_MISC2__DISABLE_WRREQ_CG_MASK |
++ DAGB0_CNTL_MISC2__DISABLE_WRRET_CG_MASK |
++ DAGB0_CNTL_MISC2__DISABLE_RDREQ_CG_MASK |
++ DAGB0_CNTL_MISC2__DISABLE_RDRET_CG_MASK |
++ DAGB0_CNTL_MISC2__DISABLE_TLBWR_CG_MASK |
++ DAGB0_CNTL_MISC2__DISABLE_TLBRD_CG_MASK);
++ }
++
++ if (def1 != data1)
++ WREG32_SOC15_OFFSET(MMHUB, 0,
++ mmDAGB0_CNTL_MISC2,
++ i * MMHUB_INSTANCE_REGISTER_OFFSET +
++ j * dist, data1);
++
++ if (i == 1 && j == 3)
++ break;
++ }
++ }
++}
++
++static void mmhub_v9_4_update_medium_grain_light_sleep(struct amdgpu_device *adev,
++ bool enable)
++{
++ uint32_t def, data;
++ int i;
++
++ for (i = 0; i < MMHUB_NUM_INSTANCES; i++) {
++ def = data = RREG32_SOC15_OFFSET(MMHUB, 0,
++ mmATCL2_0_ATC_L2_MISC_CG,
++ i * MMHUB_INSTANCE_REGISTER_OFFSET);
++
++ if (enable && (adev->cg_flags & AMD_CG_SUPPORT_MC_LS))
++ data |= ATCL2_0_ATC_L2_MISC_CG__MEM_LS_ENABLE_MASK;
++ else
++ data &= ~ATCL2_0_ATC_L2_MISC_CG__MEM_LS_ENABLE_MASK;
++
++ if (def != data)
++ WREG32_SOC15_OFFSET(MMHUB, 0, mmATCL2_0_ATC_L2_MISC_CG,
++ i * MMHUB_INSTANCE_REGISTER_OFFSET, data);
++ }
++}
++
++int mmhub_v9_4_set_clockgating(struct amdgpu_device *adev,
++ enum amd_clockgating_state state)
++{
++ if (amdgpu_sriov_vf(adev))
++ return 0;
++
++ switch (adev->asic_type) {
++ case CHIP_ARCTURUS:
++ mmhub_v9_4_update_medium_grain_clock_gating(adev,
++ state == AMD_CG_STATE_GATE ? true : false);
++ mmhub_v9_4_update_medium_grain_light_sleep(adev,
++ state == AMD_CG_STATE_GATE ? true : false);
++ break;
++ default:
++ break;
++ }
++
++ return 0;
++}
++
++/* TODO: get 2 mmhub instances CG state */
++void mmhub_v9_4_get_clockgating(struct amdgpu_device *adev, u32 *flags)
++{
++ int data, data1;
++
++ if (amdgpu_sriov_vf(adev))
++ *flags = 0;
++
++ /* AMD_CG_SUPPORT_MC_MGCG */
++ data = RREG32_SOC15(MMHUB, 0, mmATCL2_0_ATC_L2_MISC_CG);
++
++ data1 = RREG32_SOC15(MMHUB, 0, mmATCL2_0_ATC_L2_MISC_CG);
++
++ if ((data & ATCL2_0_ATC_L2_MISC_CG__ENABLE_MASK) &&
++ !(data1 & (DAGB0_CNTL_MISC2__DISABLE_WRREQ_CG_MASK |
++ DAGB0_CNTL_MISC2__DISABLE_WRRET_CG_MASK |
++ DAGB0_CNTL_MISC2__DISABLE_RDREQ_CG_MASK |
++ DAGB0_CNTL_MISC2__DISABLE_RDRET_CG_MASK |
++ DAGB0_CNTL_MISC2__DISABLE_TLBWR_CG_MASK |
++ DAGB0_CNTL_MISC2__DISABLE_TLBRD_CG_MASK)))
++ *flags |= AMD_CG_SUPPORT_MC_MGCG;
++
++ /* AMD_CG_SUPPORT_MC_LS */
++ if (data & ATCL2_0_ATC_L2_MISC_CG__MEM_LS_ENABLE_MASK)
++ *flags |= AMD_CG_SUPPORT_MC_LS;
++}
+diff --git a/drivers/gpu/drm/amd/amdgpu/mmhub_v9_4.h b/drivers/gpu/drm/amd/amdgpu/mmhub_v9_4.h
+index 9ba3dd808826..d435cfcec1a8 100644
+--- a/drivers/gpu/drm/amd/amdgpu/mmhub_v9_4.h
++++ b/drivers/gpu/drm/amd/amdgpu/mmhub_v9_4.h
+@@ -29,5 +29,8 @@ void mmhub_v9_4_gart_disable(struct amdgpu_device *adev);
+ void mmhub_v9_4_set_fault_enable_default(struct amdgpu_device *adev,
+ bool value);
+ void mmhub_v9_4_init(struct amdgpu_device *adev);
++int mmhub_v9_4_set_clockgating(struct amdgpu_device *adev,
++ enum amd_clockgating_state state);
++void mmhub_v9_4_get_clockgating(struct amdgpu_device *adev, u32 *flags);
+
+ #endif
+--
+2.17.1
+