In the GFX code, there are multiple parsers of the CSB buffer, which can
be avoided. This data is parsed via get_csb_buffer() in earlier stages,
and the result can be checked in "adev->gfx.rlc.cs_ptr". To avoid
re-parser the CSB buffer, this commit introduces a helper that copies
the CSB buffer into the ring buffer.

Signed-off-by: Rodrigo Siqueira <sique...@igalia.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c | 21 +++++++++++++++++++++
 drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h |  4 ++++
 2 files changed, 25 insertions(+)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c
index 8f1a2f7b03c1..dfd48670a0bf 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c
@@ -2323,6 +2323,27 @@ void amdgpu_gfx_csb_preamble_end(volatile u32 *buffer, 
u32 count)
        buffer[count++] = cpu_to_le32(0);
 }
 
+/**
+ * amdgpu_gfx_write_csb_to_ring - Write the CSB buffer into the ring
+ *
+ * @ring: Ring reference.
+ * @csb_buffer: CSB buffer.
+ * @csb_size: CSB buffer size.
+ *
+ * Usually, the adev->gfx.rlc.cs_ptr field is filled in earlier stages via
+ * get_csb_buffer(). This function just gets the CSB buffer and fills it in the
+ * ring buffer.
+ */
+void amdgpu_gfx_write_csb_to_ring(struct amdgpu_ring *ring,
+                                 volatile u32 *csb_buffer,
+                                 u32 csb_size)
+{
+       int i;
+
+       for (i = 0; i < csb_size; i++)
+               amdgpu_ring_write(ring, csb_buffer[i]);
+}
+
 /*
  * debugfs for to enable/disable gfx job submission to specific core.
  */
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h
index 08f268dab8f5..ce684c3d3d89 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h
@@ -646,6 +646,10 @@ u32 amdgpu_gfx_csb_preamble_start(volatile u32 *buffer);
 u32 amdgpu_gfx_csb_data_parser(struct amdgpu_device *adev, volatile u32 
*buffer, u32 count);
 void amdgpu_gfx_csb_preamble_end(volatile u32 *buffer, u32 count);
 
+void amdgpu_gfx_write_csb_to_ring(struct amdgpu_ring *ring,
+                                 volatile u32 *csb_buffer,
+                                 u32 csb_size);
+
 void amdgpu_debugfs_gfx_sched_mask_init(struct amdgpu_device *adev);
 void amdgpu_debugfs_compute_sched_mask_init(struct amdgpu_device *adev);
 
-- 
2.47.2

Reply via email to