[AMD Public Use] >-----Original Message----- >From: amd-gfx <amd-gfx-bounces@xxxxxxxxxxxxxxxxxxxxx> On Behalf Of Likun >Gao >Sent: Monday, December 28, 2020 2:49 PM >To: amd-gfx@xxxxxxxxxxxxxxxxxxxxx >Cc: Gao, Likun <Likun.Gao@xxxxxxx>; Zhang, Hawking ><Hawking.Zhang@xxxxxxx> >Subject: [PATCH 3/5] drm/amdgpu: switch hdp callback functions for hdp v4 > >[CAUTION: External Email] > >From: Likun Gao <Likun.Gao@xxxxxxx> > >Switch to use the HDP functions which unfied on hdp structure instead of the >scattered hdp callback functions. > >Signed-off-by: Likun Gao <Likun.Gao@xxxxxxx> >Change-Id: I75016df403eca537fa30519e2918207461ec6f28 >--- > drivers/gpu/drm/amd/amdgpu/Makefile | 2 +- > drivers/gpu/drm/amd/amdgpu/amdgpu.h | 7 ++- > drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c | 21 +------ > drivers/gpu/drm/amd/amdgpu/soc15.c | 82 +++------------------------ > 4 files changed, 15 insertions(+), 97 deletions(-) > >diff --git a/drivers/gpu/drm/amd/amdgpu/Makefile >b/drivers/gpu/drm/amd/amdgpu/Makefile >index c6262689e14e..d741fee91a37 100644 >--- a/drivers/gpu/drm/amd/amdgpu/Makefile >+++ b/drivers/gpu/drm/amd/amdgpu/Makefile >@@ -71,7 +71,7 @@ amdgpu-y += \ > vi.o mxgpu_vi.o nbio_v6_1.o soc15.o emu_soc.o mxgpu_ai.o nbio_v7_0.o >vega10_reg_init.o \ > vega20_reg_init.o nbio_v7_4.o nbio_v2_3.o nv.o navi10_reg_init.o >navi14_reg_init.o \ > arct_reg_init.o navi12_reg_init.o mxgpu_nv.o sienna_cichlid_reg_init.o >vangogh_reg_init.o \ >- nbio_v7_2.o dimgrey_cavefish_reg_init.o >+ nbio_v7_2.o dimgrey_cavefish_reg_init.o hdp_v4_0.o > > # add DF block > amdgpu-y += \ >diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h >b/drivers/gpu/drm/amd/amdgpu/amdgpu.h >index 92e9d1f1207b..ae4bcdd630e6 100644 >--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h >+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h >@@ -89,6 +89,7 @@ > #include "amdgpu_gfx.h" > #include "amdgpu_sdma.h" > #include "amdgpu_nbio.h" >+#include "amdgpu_hdp.h" > #include "amdgpu_dm.h" > #include "amdgpu_virt.h" > #include "amdgpu_csa.h" >@@ -1209,8 +1210,10 @@ int emu_soc_asic_init(struct amdgpu_device >*adev); #define amdgpu_asic_read_bios_from_rom(adev, b, l) (adev)- >>asic_funcs->read_bios_from_rom((adev), (b), (l)) #define >amdgpu_asic_read_register(adev, se, sh, offset, v)((adev)->asic_funcs- >>read_register((adev), (se), (sh), (offset), (v))) #define >amdgpu_asic_get_config_memsize(adev) (adev)->asic_funcs- >>get_config_memsize((adev)) >-#define amdgpu_asic_flush_hdp(adev, r) (adev)->asic_funcs- >>flush_hdp((adev), (r)) -#define amdgpu_asic_invalidate_hdp(adev, r) >(adev)->asic_funcs->invalidate_hdp((adev), (r)) >+#define amdgpu_asic_flush_hdp(adev, r) \ >+ ((adev)->asic_funcs->flush_hdp ? >+(adev)->asic_funcs->flush_hdp((adev), (r)) : (adev)->hdp.funcs- >>flush_hdp((adev), (r))) #define amdgpu_asic_invalidate_hdp(adev, r) \ >+ ((adev)->asic_funcs->invalidate_hdp ? >+(adev)->asic_funcs->invalidate_hdp((adev), (r)) : >+(adev)->hdp.funcs->invalidate_hdp((adev), (r))) > #define amdgpu_asic_need_full_reset(adev) (adev)->asic_funcs- >>need_full_reset((adev)) > #define amdgpu_asic_init_doorbell_index(adev) (adev)->asic_funcs- >>init_doorbell_index((adev)) > #define amdgpu_asic_get_pcie_usage(adev, cnt0, cnt1) ((adev)->asic_funcs- >>get_pcie_usage((adev), (cnt0), (cnt1))) diff --git >a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c >b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c >index e22268f9dba7..7b1f50fa9dac 100644 >--- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c >+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c >@@ -31,8 +31,6 @@ > #include "amdgpu_atomfirmware.h" > #include "amdgpu_gem.h" > >-#include "hdp/hdp_4_0_offset.h" >-#include "hdp/hdp_4_0_sh_mask.h" > #include "gc/gc_9_0_sh_mask.h" > #include "dce/dce_12_0_offset.h" > #include "dce/dce_12_0_sh_mask.h" >@@ -1571,7 +1569,6 @@ static int gmc_v9_0_hw_init(void *handle) > struct amdgpu_device *adev = (struct amdgpu_device *)handle; > bool value; > int r, i; >- u32 tmp; > > /* The sequence of these two function calls matters.*/ > gmc_v9_0_init_golden_registers(adev); >@@ -1590,24 +1587,10 @@ static int gmc_v9_0_hw_init(void *handle) > if (adev->mmhub.funcs->update_power_gating) > adev->mmhub.funcs->update_power_gating(adev, true); > >- switch (adev->asic_type) { >- case CHIP_ARCTURUS: >- WREG32_FIELD15(HDP, 0, HDP_MMHUB_CNTL, HDP_MMHUB_GCC, >1); >- break; >- default: >- break; >- } >- >- WREG32_FIELD15(HDP, 0, HDP_MISC_CNTL, FLUSH_INVALIDATE_CACHE, >1); >- >- tmp = RREG32_SOC15(HDP, 0, mmHDP_HOST_PATH_CNTL); >- WREG32_SOC15(HDP, 0, mmHDP_HOST_PATH_CNTL, tmp); >- >- WREG32_SOC15(HDP, 0, mmHDP_NONSURFACE_BASE, (adev- >>gmc.vram_start >> 8)); >- WREG32_SOC15(HDP, 0, mmHDP_NONSURFACE_BASE_HI, (adev- >>gmc.vram_start >> 40)); >+ adev->hdp.funcs->init_registers(adev); > > /* After HDP is initialized, flush HDP.*/ >- adev->nbio.funcs->hdp_flush(adev, NULL); >+ adev->hdp.funcs->flush_hdp(adev, NULL); > > if (amdgpu_vm_fault_stop == AMDGPU_VM_FAULT_STOP_ALWAYS) > value = false; >diff --git a/drivers/gpu/drm/amd/amdgpu/soc15.c >b/drivers/gpu/drm/amd/amdgpu/soc15.c >index 0d3def7269bb..6426ecd1861b 100644 >--- a/drivers/gpu/drm/amd/amdgpu/soc15.c >+++ b/drivers/gpu/drm/amd/amdgpu/soc15.c >@@ -40,8 +40,6 @@ > #include "gc/gc_9_0_sh_mask.h" > #include "sdma0/sdma0_4_0_offset.h" > #include "sdma1/sdma1_4_0_offset.h" >-#include "hdp/hdp_4_0_offset.h" >-#include "hdp/hdp_4_0_sh_mask.h" > #include "nbio/nbio_7_0_default.h" > #include "nbio/nbio_7_0_offset.h" > #include "nbio/nbio_7_0_sh_mask.h" >@@ -59,6 +57,7 @@ > #include "nbio_v6_1.h" > #include "nbio_v7_0.h" > #include "nbio_v7_4.h" >+#include "hdp_v4_0.h" > #include "vega10_ih.h" > #include "vega20_ih.h" > #include "navi10_ih.h" >@@ -84,14 +83,6 @@ > #define mmMP0_MISC_LIGHT_SLEEP_CTRL >0x01ba > #define mmMP0_MISC_LIGHT_SLEEP_CTRL_BASE_IDX >0 > >-/* for Vega20 register name change */ >-#define mmHDP_MEM_POWER_CTRL 0x00d4 >-#define HDP_MEM_POWER_CTRL__IPH_MEM_POWER_CTRL_EN_MASK >0x00000001L >-#define HDP_MEM_POWER_CTRL__IPH_MEM_POWER_LS_EN_MASK >0x00000002L >-#define HDP_MEM_POWER_CTRL__RC_MEM_POWER_CTRL_EN_MASK >0x00010000L >-#define HDP_MEM_POWER_CTRL__RC_MEM_POWER_LS_EN_MASK >0x00020000L >-#define mmHDP_MEM_POWER_CTRL_BASE_IDX 0 >- > /* > * Indirect registers accessor > */ >@@ -700,6 +691,7 @@ int soc15_set_ip_blocks(struct amdgpu_device *adev) > adev->nbio.funcs = &nbio_v6_1_funcs; > adev->nbio.hdp_flush_reg = &nbio_v6_1_hdp_flush_reg; > } >+ adev->hdp.funcs = &hdp_v4_0_funcs; > > if (adev->asic_type == CHIP_VEGA20 || adev->asic_type == >CHIP_ARCTURUS) > adev->df.funcs = &df_v3_6_funcs; @@ -835,21 +827,6 @@ int >soc15_set_ip_blocks(struct amdgpu_device *adev) > return 0; > } > >-static void soc15_flush_hdp(struct amdgpu_device *adev, struct >amdgpu_ring *ring) -{ >- adev->nbio.funcs->hdp_flush(adev, ring); >-} >- >-static void soc15_invalidate_hdp(struct amdgpu_device *adev, >- struct amdgpu_ring *ring) >-{ >- if (!ring || !ring->funcs->emit_wreg) >- WREG32_SOC15_NO_KIQ(HDP, 0, >mmHDP_READ_CACHE_INVALIDATE, 1); >- else >- amdgpu_ring_emit_wreg(ring, SOC15_REG_OFFSET( >- HDP, 0, mmHDP_READ_CACHE_INVALIDATE), 1); >-} >- > static bool soc15_need_full_reset(struct amdgpu_device *adev) { > /* change this when we implement soft reset */ @@ -858,10 +835,7 @@ >static bool soc15_need_full_reset(struct amdgpu_device *adev) > > static void vega20_reset_hdp_ras_error_count(struct amdgpu_device >*adev) { >- if (!amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__HDP)) >- return; >- /*read back hdp ras counter to reset it to 0 */ >- RREG32_SOC15(HDP, 0, mmHDP_EDC_CNT); >+ adev->hdp.funcs->reset_ras_error_count(adev); > } > > static void soc15_get_pcie_usage(struct amdgpu_device *adev, uint64_t >*count0, @@ -1012,8 +986,6 @@ static const struct amdgpu_asic_funcs >soc15_asic_funcs = > .set_uvd_clocks = &soc15_set_uvd_clocks, > .set_vce_clocks = &soc15_set_vce_clocks, > .get_config_memsize = &soc15_get_config_memsize, >- .flush_hdp = &soc15_flush_hdp, >- .invalidate_hdp = &soc15_invalidate_hdp, > .need_full_reset = &soc15_need_full_reset, > .init_doorbell_index = &vega10_doorbell_index_init, > .get_pcie_usage = &soc15_get_pcie_usage, @@ -1035,8 +1007,6 @@ >static const struct amdgpu_asic_funcs vega20_asic_funcs = > .set_uvd_clocks = &soc15_set_uvd_clocks, > .set_vce_clocks = &soc15_set_vce_clocks, > .get_config_memsize = &soc15_get_config_memsize, >- .flush_hdp = &soc15_flush_hdp, >- .invalidate_hdp = &soc15_invalidate_hdp, > .reset_hdp_ras_error_count = &vega20_reset_hdp_ras_error_count, Could you remove this asic function also ? You may use this check before calling hdp reset errors function. if (!amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__HDP)) Regards, Lijo > .need_full_reset = &soc15_need_full_reset, > .init_doorbell_index = &vega20_doorbell_index_init, @@ -1422,41 >+1392,6 @@ static int soc15_common_soft_reset(void *handle) > return 0; > } > >-static void soc15_update_hdp_light_sleep(struct amdgpu_device *adev, >bool enable) -{ >- uint32_t def, data; >- >- if (adev->asic_type == CHIP_VEGA20 || >- adev->asic_type == CHIP_ARCTURUS || >- adev->asic_type == CHIP_RENOIR) { >- def = data = RREG32(SOC15_REG_OFFSET(HDP, 0, >mmHDP_MEM_POWER_CTRL)); >- >- if (enable && (adev->cg_flags & AMD_CG_SUPPORT_HDP_LS)) >- data |= >HDP_MEM_POWER_CTRL__IPH_MEM_POWER_CTRL_EN_MASK | >- >HDP_MEM_POWER_CTRL__IPH_MEM_POWER_LS_EN_MASK | >- >HDP_MEM_POWER_CTRL__RC_MEM_POWER_CTRL_EN_MASK | >- >HDP_MEM_POWER_CTRL__RC_MEM_POWER_LS_EN_MASK; >- else >- data &= >~(HDP_MEM_POWER_CTRL__IPH_MEM_POWER_CTRL_EN_MASK | >- >HDP_MEM_POWER_CTRL__IPH_MEM_POWER_LS_EN_MASK | >- >HDP_MEM_POWER_CTRL__RC_MEM_POWER_CTRL_EN_MASK | >- >HDP_MEM_POWER_CTRL__RC_MEM_POWER_LS_EN_MASK); >- >- if (def != data) >- WREG32(SOC15_REG_OFFSET(HDP, 0, >mmHDP_MEM_POWER_CTRL), data); >- } else { >- def = data = RREG32(SOC15_REG_OFFSET(HDP, 0, >mmHDP_MEM_POWER_LS)); >- >- if (enable && (adev->cg_flags & AMD_CG_SUPPORT_HDP_LS)) >- data |= HDP_MEM_POWER_LS__LS_ENABLE_MASK; >- else >- data &= ~HDP_MEM_POWER_LS__LS_ENABLE_MASK; >- >- if (def != data) >- WREG32(SOC15_REG_OFFSET(HDP, 0, >mmHDP_MEM_POWER_LS), data); >- } >-} >- > static void soc15_update_drm_clock_gating(struct amdgpu_device *adev, >bool enable) { > uint32_t def, data; >@@ -1517,7 +1452,7 @@ static int >soc15_common_set_clockgating_state(void *handle, > state == AMD_CG_STATE_GATE); > adev->nbio.funcs->update_medium_grain_light_sleep(adev, > state == AMD_CG_STATE_GATE); >- soc15_update_hdp_light_sleep(adev, >+ adev->hdp.funcs->update_clock_gating(adev, > state == AMD_CG_STATE_GATE); > soc15_update_drm_clock_gating(adev, > state == AMD_CG_STATE_GATE); @@ -1534,7 +1469,7 @@ >static int soc15_common_set_clockgating_state(void *handle, > state == AMD_CG_STATE_GATE); > adev->nbio.funcs->update_medium_grain_light_sleep(adev, > state == AMD_CG_STATE_GATE); >- soc15_update_hdp_light_sleep(adev, >+ adev->hdp.funcs->update_clock_gating(adev, > state == AMD_CG_STATE_GATE); > soc15_update_drm_clock_gating(adev, > state == AMD_CG_STATE_GATE); @@ -1542,7 +1477,7 @@ >static int soc15_common_set_clockgating_state(void *handle, > state == AMD_CG_STATE_GATE); > break; > case CHIP_ARCTURUS: >- soc15_update_hdp_light_sleep(adev, >+ adev->hdp.funcs->update_clock_gating(adev, > state == AMD_CG_STATE_GATE); > break; > default: >@@ -1561,10 +1496,7 @@ static void >soc15_common_get_clockgating_state(void *handle, u32 *flags) > > adev->nbio.funcs->get_clockgating_state(adev, flags); > >- /* AMD_CG_SUPPORT_HDP_LS */ >- data = RREG32(SOC15_REG_OFFSET(HDP, 0, mmHDP_MEM_POWER_LS)); >- if (data & HDP_MEM_POWER_LS__LS_ENABLE_MASK) >- *flags |= AMD_CG_SUPPORT_HDP_LS; >+ adev->hdp.funcs->get_clock_gating_state(adev, flags); > > /* AMD_CG_SUPPORT_DRM_MGCG */ > data = RREG32(SOC15_REG_OFFSET(MP0, 0, >mmMP0_MISC_CGTT_CTRL0)); >-- >2.25.1 > >_______________________________________________ >amd-gfx mailing list >amd-gfx@xxxxxxxxxxxxxxxxxxxxx >https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Flists.f >reedesktop.org%2Fmailman%2Flistinfo%2Famd- >gfx&data=04%7C01%7Clijo.lazar%40amd.com%7Cba137ed79c354d2620a1 >08d8ab119d0c%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637447 >439441071208%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQ >IjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&sdata=8nzvnyY >DrhrG5HXAXut4N%2FXUYpWcrHbObXOxnDjwm1Y%3D&reserved=0 _______________________________________________ amd-gfx mailing list amd-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/amd-gfx