drm/amdgpu: switch hdp callback functions for hdp v4
authorLikun Gao <Likun.Gao@amd.com>
Mon, 28 Dec 2020 08:54:16 +0000 (16:54 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 5 Jan 2021 16:33:01 +0000 (11:33 -0500)
Switch to use the HDP functions which unified on hdp structure instead of
the scattered hdp callback functions.
V2: clean up hdp reset ras error count function.

Signed-off-by: Likun Gao <Likun.Gao@amd.com>
Reviewed-by: Hawking Zhang <Hawking.Zhang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/Makefile
drivers/gpu/drm/amd/amdgpu/amdgpu.h
drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
drivers/gpu/drm/amd/amdgpu/soc15.c

index c6262689e14e6e234fb71da8518ae17c7cfd352f..d741fee91a3724c909a34916796f1b164804e788 100644 (file)
@@ -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 += \
index f534135bd417edc6669f5e28666ca5b4d8aeb96c..714d7180ab435a6ac4aca99f43b0a8062e1d490e 100644 (file)
@@ -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"
@@ -609,7 +610,6 @@ struct amdgpu_asic_funcs {
        /* invalidate hdp read cache */
        void (*invalidate_hdp)(struct amdgpu_device *adev,
                               struct amdgpu_ring *ring);
-       void (*reset_hdp_ras_error_count)(struct amdgpu_device *adev);
        /* check if the asic needs a full reset of if soft reset will work */
        bool (*need_full_reset)(struct amdgpu_device *adev);
        /* initialize doorbell layout for specific asic*/
@@ -1206,8 +1206,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)))
index e22268f9dba7315a64e0abe52d68f06806e3ef7b..7b1f50fa9dac758f66edfdbad5dbe2d0816d8444 100644 (file)
@@ -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;
index 0d3def7269bb5dcbfad1eaa29a099edd6c479763..9a25accd48a3eb19086c9bdf92ebfd410d19429e 100644 (file)
@@ -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"
 #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,35 +827,12 @@ 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 */
        return true;
 }
 
-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);
-}
-
 static void soc15_get_pcie_usage(struct amdgpu_device *adev, uint64_t *count0,
                                 uint64_t *count1)
 {
@@ -1012,8 +981,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,9 +1002,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,
        .need_full_reset = &soc15_need_full_reset,
        .init_doorbell_index = &vega20_doorbell_index_init,
        .get_pcie_usage = &vega20_get_pcie_usage,
@@ -1294,9 +1258,8 @@ static int soc15_common_late_init(void *handle)
        if (amdgpu_sriov_vf(adev))
                xgpu_ai_mailbox_get_irq(adev);
 
-       if (adev->asic_funcs &&
-           adev->asic_funcs->reset_hdp_ras_error_count)
-               adev->asic_funcs->reset_hdp_ras_error_count(adev);
+       if (adev->hdp.funcs->reset_ras_error_count)
+               adev->hdp.funcs->reset_ras_error_count(adev);
 
        if (adev->nbio.funcs->ras_late_init)
                r = adev->nbio.funcs->ras_late_init(adev);
@@ -1422,41 +1385,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 +1445,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 +1462,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 +1470,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 +1489,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));