Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/amdgpu: add get_clockgating callback for gfx v9

Signed-off-by: Huang Rui <ray.huang@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: Edward O'Callaghan <funfunctor@folklore1984.net>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Huang Rui and committed by
Alex Deucher
12ad27fa e322edc3

+45
+2
drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
··· 43 43 {AMD_CG_SUPPORT_GFX_CGTS_LS, "Graphics Coarse Grain Tree Shader Light Sleep"}, 44 44 {AMD_CG_SUPPORT_GFX_CP_LS, "Graphics Command Processor Light Sleep"}, 45 45 {AMD_CG_SUPPORT_GFX_RLC_LS, "Graphics Run List Controller Light Sleep"}, 46 + {AMD_CG_SUPPORT_GFX_3D_CGCG, "Graphics 3D Coarse Grain Clock Gating"}, 47 + {AMD_CG_SUPPORT_GFX_3D_CGLS, "Graphics 3D Coarse Grain memory Light Sleep"}, 46 48 {AMD_CG_SUPPORT_MC_LS, "Memory Controller Light Sleep"}, 47 49 {AMD_CG_SUPPORT_MC_MGCG, "Memory Controller Medium Grain Clock Gating"}, 48 50 {AMD_CG_SUPPORT_SDMA_LS, "System Direct Memory Access Light Sleep"},
+43
drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
··· 2946 2946 return 0; 2947 2947 } 2948 2948 2949 + static void gfx_v9_0_get_clockgating_state(void *handle, u32 *flags) 2950 + { 2951 + struct amdgpu_device *adev = (struct amdgpu_device *)handle; 2952 + int data; 2953 + 2954 + if (amdgpu_sriov_vf(adev)) 2955 + *flags = 0; 2956 + 2957 + /* AMD_CG_SUPPORT_GFX_MGCG */ 2958 + data = RREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_CGTT_MGCG_OVERRIDE)); 2959 + if (!(data & RLC_CGTT_MGCG_OVERRIDE__GFXIP_MGCG_OVERRIDE_MASK)) 2960 + *flags |= AMD_CG_SUPPORT_GFX_MGCG; 2961 + 2962 + /* AMD_CG_SUPPORT_GFX_CGCG */ 2963 + data = RREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_CGCG_CGLS_CTRL)); 2964 + if (data & RLC_CGCG_CGLS_CTRL__CGCG_EN_MASK) 2965 + *flags |= AMD_CG_SUPPORT_GFX_CGCG; 2966 + 2967 + /* AMD_CG_SUPPORT_GFX_CGLS */ 2968 + if (data & RLC_CGCG_CGLS_CTRL__CGLS_EN_MASK) 2969 + *flags |= AMD_CG_SUPPORT_GFX_CGLS; 2970 + 2971 + /* AMD_CG_SUPPORT_GFX_RLC_LS */ 2972 + data = RREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_MEM_SLP_CNTL)); 2973 + if (data & RLC_MEM_SLP_CNTL__RLC_MEM_LS_EN_MASK) 2974 + *flags |= AMD_CG_SUPPORT_GFX_RLC_LS | AMD_CG_SUPPORT_GFX_MGLS; 2975 + 2976 + /* AMD_CG_SUPPORT_GFX_CP_LS */ 2977 + data = RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_MEM_SLP_CNTL)); 2978 + if (data & CP_MEM_SLP_CNTL__CP_MEM_LS_EN_MASK) 2979 + *flags |= AMD_CG_SUPPORT_GFX_CP_LS | AMD_CG_SUPPORT_GFX_MGLS; 2980 + 2981 + /* AMD_CG_SUPPORT_GFX_3D_CGCG */ 2982 + data = RREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_CGCG_CGLS_CTRL_3D)); 2983 + if (data & RLC_CGCG_CGLS_CTRL_3D__CGCG_EN_MASK) 2984 + *flags |= AMD_CG_SUPPORT_GFX_3D_CGCG; 2985 + 2986 + /* AMD_CG_SUPPORT_GFX_3D_CGLS */ 2987 + if (data & RLC_CGCG_CGLS_CTRL_3D__CGLS_EN_MASK) 2988 + *flags |= AMD_CG_SUPPORT_GFX_3D_CGLS; 2989 + } 2990 + 2949 2991 static u64 gfx_v9_0_ring_get_rptr_gfx(struct amdgpu_ring *ring) 2950 2992 { 2951 2993 return ring->adev->wb.wb[ring->rptr_offs]; /* gfx9 is 32bit rptr*/ ··· 3668 3626 .soft_reset = gfx_v9_0_soft_reset, 3669 3627 .set_clockgating_state = gfx_v9_0_set_clockgating_state, 3670 3628 .set_powergating_state = gfx_v9_0_set_powergating_state, 3629 + .get_clockgating_state = gfx_v9_0_get_clockgating_state, 3671 3630 }; 3672 3631 3673 3632 static const struct amdgpu_ring_funcs gfx_v9_0_ring_funcs_gfx = {