drm/amdgpu/sdma5.2: add begin/end_use ring callbacks
authorjsg <jsg@openbsd.org>
Thu, 21 Dec 2023 03:43:28 +0000 (03:43 +0000)
committerjsg <jsg@openbsd.org>
Thu, 21 Dec 2023 03:43:28 +0000 (03:43 +0000)
From Alex Deucher
78b2ba39beef21c8baebb1868569c2026ad76de0 in linux-6.1.y/6.1.69
ab4750332dbe535243def5dcebc24ca00c1f98ac in mainline linux

sys/dev/pci/drm/amd/amdgpu/sdma_v5_2.c

index 93bdd2c..5dfd1e1 100644 (file)
@@ -1690,6 +1690,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,
@@ -1738,6 +1764,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,