drm/amdgpu/sdma5.2: add begin/end_use ring callbacks
[platform/kernel/linux-starfive.git] / drivers / gpu / drm / amd / amdgpu / sdma_v5_2.c
index 2b3ebeb..0f930fd 100644 (file)
@@ -1651,6 +1651,32 @@ static void sdma_v5_2_get_clockgating_state(void *handle, u64 *flags)
                *flags |= AMD_CG_SUPPORT_SDMA_LS;
 }
 
+static void sdma_v5_2_ring_begin_use(struct amdgpu_ring *ring)
+{
+       struct amdgpu_device *adev = ring->adev;
+
+       /* SDMA 5.2.3 (RMB) FW doesn't seem to properly
+        * disallow GFXOFF in some cases leading to
+        * hangs in SDMA.  Disallow GFXOFF while SDMA is active.
+        * We can probably just limit this to 5.2.3,
+        * but it shouldn't hurt for other parts since
+        * this GFXOFF will be disallowed anyway when SDMA is
+        * active, this just makes it explicit.
+        */
+       amdgpu_gfx_off_ctrl(adev, false);
+}
+
+static void sdma_v5_2_ring_end_use(struct amdgpu_ring *ring)
+{
+       struct amdgpu_device *adev = ring->adev;
+
+       /* SDMA 5.2.3 (RMB) FW doesn't seem to properly
+        * disallow GFXOFF in some cases leading to
+        * hangs in SDMA.  Allow GFXOFF when SDMA is complete.
+        */
+       amdgpu_gfx_off_ctrl(adev, true);
+}
+
 const struct amd_ip_funcs sdma_v5_2_ip_funcs = {
        .name = "sdma_v5_2",
        .early_init = sdma_v5_2_early_init,
@@ -1698,6 +1724,8 @@ static const struct amdgpu_ring_funcs sdma_v5_2_ring_funcs = {
        .test_ib = sdma_v5_2_ring_test_ib,
        .insert_nop = sdma_v5_2_ring_insert_nop,
        .pad_ib = sdma_v5_2_ring_pad_ib,
+       .begin_use = sdma_v5_2_ring_begin_use,
+       .end_use = sdma_v5_2_ring_end_use,
        .emit_wreg = sdma_v5_2_ring_emit_wreg,
        .emit_reg_wait = sdma_v5_2_ring_emit_reg_wait,
        .emit_reg_write_reg_wait = sdma_v5_2_ring_emit_reg_write_reg_wait,