aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3327-drm-amdgpu-split-athub-clock-gating-from-mmhub.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3327-drm-amdgpu-split-athub-clock-gating-from-mmhub.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3327-drm-amdgpu-split-athub-clock-gating-from-mmhub.patch319
1 files changed, 319 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3327-drm-amdgpu-split-athub-clock-gating-from-mmhub.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3327-drm-amdgpu-split-athub-clock-gating-from-mmhub.patch
new file mode 100644
index 00000000..121da08f
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3327-drm-amdgpu-split-athub-clock-gating-from-mmhub.patch
@@ -0,0 +1,319 @@
+From 121ba769169c7575536154b26ea5d14788fe00ff Mon Sep 17 00:00:00 2001
+From: Le Ma <le.ma@amd.com>
+Date: Thu, 8 Aug 2019 14:54:12 +0800
+Subject: [PATCH 3327/4256] drm/amdgpu: split athub clock gating from mmhub
+
+Untie the bind of get/set athub CG state from mmhub, for cosmetic fix and Asic
+not using mmhub 1.0. Besides, also fix wrong athub CG state in amdgpu_pm_info.
+
+Change-Id: I4ba970cae558ad5163e93fa9bc77f589196a22b1
+Signed-off-by: Le Ma <le.ma@amd.com>
+Reviewed-by: Feifei Xu <Feifei.Xu@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/Makefile | 1 +
+ drivers/gpu/drm/amd/amdgpu/athub_v1_0.c | 103 ++++++++++++++++++++++++
+ drivers/gpu/drm/amd/amdgpu/athub_v1_0.h | 30 +++++++
+ drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c | 9 ++-
+ drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c | 55 +++----------
+ 5 files changed, 154 insertions(+), 44 deletions(-)
+ create mode 100644 drivers/gpu/drm/amd/amdgpu/athub_v1_0.c
+ create mode 100644 drivers/gpu/drm/amd/amdgpu/athub_v1_0.h
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/Makefile b/drivers/gpu/drm/amd/amdgpu/Makefile
+index 651d77c59ba3..c82efd378f1d 100644
+--- a/drivers/gpu/drm/amd/amdgpu/Makefile
++++ b/drivers/gpu/drm/amd/amdgpu/Makefile
+@@ -154,6 +154,7 @@ amdgpu-y += \
+
+ # add ATHUB block
+ amdgpu-y += \
++ athub_v1_0.o \
+ athub_v2_0.o
+
+ # add amdkfd interfaces
+diff --git a/drivers/gpu/drm/amd/amdgpu/athub_v1_0.c b/drivers/gpu/drm/amd/amdgpu/athub_v1_0.c
+new file mode 100644
+index 000000000000..d9cc746af5e6
+--- /dev/null
++++ b/drivers/gpu/drm/amd/amdgpu/athub_v1_0.c
+@@ -0,0 +1,103 @@
++/*
++ * Copyright 2016 Advanced Micro Devices, Inc.
++ *
++ * Permission is hereby granted, free of charge, to any person obtaining a
++ * copy of this software and associated documentation files (the "Software"),
++ * to deal in the Software without restriction, including without limitation
++ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
++ * and/or sell copies of the Software, and to permit persons to whom the
++ * Software is furnished to do so, subject to the following conditions:
++ *
++ * The above copyright notice and this permission notice shall be included in
++ * all copies or substantial portions of the Software.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
++ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
++ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
++ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
++ * OTHER DEALINGS IN THE SOFTWARE.
++ *
++ */
++#include "amdgpu.h"
++#include "athub_v1_0.h"
++
++#include "athub/athub_1_0_offset.h"
++#include "athub/athub_1_0_sh_mask.h"
++#include "vega10_enum.h"
++
++#include "soc15_common.h"
++
++static void athub_update_medium_grain_clock_gating(struct amdgpu_device *adev,
++ bool enable)
++{
++ uint32_t def, data;
++
++ def = data = RREG32_SOC15(ATHUB, 0, mmATHUB_MISC_CNTL);
++
++ if (enable && (adev->cg_flags & AMD_CG_SUPPORT_MC_MGCG))
++ data |= ATHUB_MISC_CNTL__CG_ENABLE_MASK;
++ else
++ data &= ~ATHUB_MISC_CNTL__CG_ENABLE_MASK;
++
++ if (def != data)
++ WREG32_SOC15(ATHUB, 0, mmATHUB_MISC_CNTL, data);
++}
++
++static void athub_update_medium_grain_light_sleep(struct amdgpu_device *adev,
++ bool enable)
++{
++ uint32_t def, data;
++
++ def = data = RREG32_SOC15(ATHUB, 0, mmATHUB_MISC_CNTL);
++
++ if (enable && (adev->cg_flags & AMD_CG_SUPPORT_MC_LS) &&
++ (adev->cg_flags & AMD_CG_SUPPORT_HDP_LS))
++ data |= ATHUB_MISC_CNTL__CG_MEM_LS_ENABLE_MASK;
++ else
++ data &= ~ATHUB_MISC_CNTL__CG_MEM_LS_ENABLE_MASK;
++
++ if(def != data)
++ WREG32_SOC15(ATHUB, 0, mmATHUB_MISC_CNTL, data);
++}
++
++int athub_v1_0_set_clockgating(struct amdgpu_device *adev,
++ enum amd_clockgating_state state)
++{
++ if (amdgpu_sriov_vf(adev))
++ return 0;
++
++ switch (adev->asic_type) {
++ case CHIP_VEGA10:
++ case CHIP_VEGA12:
++ case CHIP_VEGA20:
++ case CHIP_RAVEN:
++ athub_update_medium_grain_clock_gating(adev,
++ state == AMD_CG_STATE_GATE ? true : false);
++ athub_update_medium_grain_light_sleep(adev,
++ state == AMD_CG_STATE_GATE ? true : false);
++ break;
++ default:
++ break;
++ }
++
++ return 0;
++}
++
++void athub_v1_0_get_clockgating(struct amdgpu_device *adev, u32 *flags)
++{
++ int data;
++
++ if (amdgpu_sriov_vf(adev))
++ *flags = 0;
++
++ /* AMD_CG_SUPPORT_ATHUB_MGCG */
++ data = RREG32_SOC15(ATHUB, 0, mmATHUB_MISC_CNTL);
++ if (data & ATHUB_MISC_CNTL__CG_ENABLE_MASK)
++ *flags |= AMD_CG_SUPPORT_ATHUB_MGCG;
++
++ /* AMD_CG_SUPPORT_ATHUB_LS */
++ if (data & ATHUB_MISC_CNTL__CG_MEM_LS_ENABLE_MASK)
++ *flags |= AMD_CG_SUPPORT_ATHUB_LS;
++}
+diff --git a/drivers/gpu/drm/amd/amdgpu/athub_v1_0.h b/drivers/gpu/drm/amd/amdgpu/athub_v1_0.h
+new file mode 100644
+index 000000000000..b279af59e34f
+--- /dev/null
++++ b/drivers/gpu/drm/amd/amdgpu/athub_v1_0.h
+@@ -0,0 +1,30 @@
++/*
++ * Copyright 2016 Advanced Micro Devices, Inc.
++ *
++ * Permission is hereby granted, free of charge, to any person obtaining a
++ * copy of this software and associated documentation files (the "Software"),
++ * to deal in the Software without restriction, including without limitation
++ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
++ * and/or sell copies of the Software, and to permit persons to whom the
++ * Software is furnished to do so, subject to the following conditions:
++ *
++ * The above copyright notice and this permission notice shall be included in
++ * all copies or substantial portions of the Software.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
++ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
++ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
++ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
++ * OTHER DEALINGS IN THE SOFTWARE.
++ *
++ */
++#ifndef __ATHUB_V1_0_H__
++#define __ATHUB_V1_0_H__
++
++int athub_v1_0_set_clockgating(struct amdgpu_device *adev,
++ enum amd_clockgating_state state);
++void athub_v1_0_get_clockgating(struct amdgpu_device *adev, u32 *flags);
++
++#endif
+diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
+index 41c4f6fea273..56c8de2fb15c 100644
+--- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
+@@ -43,6 +43,7 @@
+
+ #include "gfxhub_v1_0.h"
+ #include "mmhub_v1_0.h"
++#include "athub_v1_0.h"
+ #include "gfxhub_v1_1.h"
+ #include "mmhub_v9_4.h"
+ #include "umc_v6_1.h"
+@@ -1403,7 +1404,11 @@ static int gmc_v9_0_set_clockgating_state(void *handle,
+ if (adev->asic_type == CHIP_ARCTURUS)
+ return 0;
+
+- return mmhub_v1_0_set_clockgating(adev, state);
++ mmhub_v1_0_set_clockgating(adev, state);
++
++ athub_v1_0_set_clockgating(adev, state);
++
++ return 0;
+ }
+
+ static void gmc_v9_0_get_clockgating_state(void *handle, u32 *flags)
+@@ -1414,6 +1419,8 @@ static void gmc_v9_0_get_clockgating_state(void *handle, u32 *flags)
+ return;
+
+ mmhub_v1_0_get_clockgating(adev, flags);
++
++ athub_v1_0_get_clockgating(adev, flags);
+ }
+
+ static int gmc_v9_0_set_powergating_state(void *handle,
+diff --git a/drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c b/drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c
+index df0117df45a9..da214ca06cee 100644
+--- a/drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c
+@@ -26,8 +26,6 @@
+ #include "mmhub/mmhub_1_0_offset.h"
+ #include "mmhub/mmhub_1_0_sh_mask.h"
+ #include "mmhub/mmhub_1_0_default.h"
+-#include "athub/athub_1_0_offset.h"
+-#include "athub/athub_1_0_sh_mask.h"
+ #include "vega10_enum.h"
+
+ #include "soc15_common.h"
+@@ -491,22 +489,6 @@ static void mmhub_v1_0_update_medium_grain_clock_gating(struct amdgpu_device *ad
+ WREG32_SOC15(MMHUB, 0, mmDAGB1_CNTL_MISC2, data2);
+ }
+
+-static void athub_update_medium_grain_clock_gating(struct amdgpu_device *adev,
+- bool enable)
+-{
+- uint32_t def, data;
+-
+- def = data = RREG32_SOC15(ATHUB, 0, mmATHUB_MISC_CNTL);
+-
+- if (enable && (adev->cg_flags & AMD_CG_SUPPORT_MC_MGCG))
+- data |= ATHUB_MISC_CNTL__CG_ENABLE_MASK;
+- else
+- data &= ~ATHUB_MISC_CNTL__CG_ENABLE_MASK;
+-
+- if (def != data)
+- WREG32_SOC15(ATHUB, 0, mmATHUB_MISC_CNTL, data);
+-}
+-
+ static void mmhub_v1_0_update_medium_grain_light_sleep(struct amdgpu_device *adev,
+ bool enable)
+ {
+@@ -523,23 +505,6 @@ static void mmhub_v1_0_update_medium_grain_light_sleep(struct amdgpu_device *ade
+ WREG32_SOC15(MMHUB, 0, mmATC_L2_MISC_CG, data);
+ }
+
+-static void athub_update_medium_grain_light_sleep(struct amdgpu_device *adev,
+- bool enable)
+-{
+- uint32_t def, data;
+-
+- def = data = RREG32_SOC15(ATHUB, 0, mmATHUB_MISC_CNTL);
+-
+- if (enable && (adev->cg_flags & AMD_CG_SUPPORT_MC_LS) &&
+- (adev->cg_flags & AMD_CG_SUPPORT_HDP_LS))
+- data |= ATHUB_MISC_CNTL__CG_MEM_LS_ENABLE_MASK;
+- else
+- data &= ~ATHUB_MISC_CNTL__CG_MEM_LS_ENABLE_MASK;
+-
+- if(def != data)
+- WREG32_SOC15(ATHUB, 0, mmATHUB_MISC_CNTL, data);
+-}
+-
+ int mmhub_v1_0_set_clockgating(struct amdgpu_device *adev,
+ enum amd_clockgating_state state)
+ {
+@@ -553,12 +518,8 @@ int mmhub_v1_0_set_clockgating(struct amdgpu_device *adev,
+ case CHIP_RAVEN:
+ mmhub_v1_0_update_medium_grain_clock_gating(adev,
+ state == AMD_CG_STATE_GATE ? true : false);
+- athub_update_medium_grain_clock_gating(adev,
+- state == AMD_CG_STATE_GATE ? true : false);
+ mmhub_v1_0_update_medium_grain_light_sleep(adev,
+ state == AMD_CG_STATE_GATE ? true : false);
+- athub_update_medium_grain_light_sleep(adev,
+- state == AMD_CG_STATE_GATE ? true : false);
+ break;
+ default:
+ break;
+@@ -569,18 +530,26 @@ int mmhub_v1_0_set_clockgating(struct amdgpu_device *adev,
+
+ void mmhub_v1_0_get_clockgating(struct amdgpu_device *adev, u32 *flags)
+ {
+- int data;
++ int data, data1;
+
+ if (amdgpu_sriov_vf(adev))
+ *flags = 0;
+
++ data = RREG32_SOC15(MMHUB, 0, mmATC_L2_MISC_CG);
++
++ data1 = RREG32_SOC15(MMHUB, 0, mmDAGB0_CNTL_MISC2);
++
+ /* AMD_CG_SUPPORT_MC_MGCG */
+- data = RREG32_SOC15(ATHUB, 0, mmATHUB_MISC_CNTL);
+- if (data & ATHUB_MISC_CNTL__CG_ENABLE_MASK)
++ if ((data & 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 */
+- data = RREG32_SOC15(MMHUB, 0, mmATC_L2_MISC_CG);
+ if (data & ATC_L2_MISC_CG__MEM_LS_ENABLE_MASK)
+ *flags |= AMD_CG_SUPPORT_MC_LS;
+ }
+--
+2.17.1
+