From: Jack Xiao <[email protected]>

Add the helper function to get the corresponding ctx meta data offset.

Signed-off-by: Jack Xiao <[email protected]>
Acked-by: Christian König <[email protected]>
Reviewed-by: Hawking Zhang <[email protected]>
Signed-off-by: Alex Deucher <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c | 36 +++++++++++++++++++++++++
 drivers/gpu/drm/amd/amdgpu/amdgpu_mes.h |  3 ++-
 2 files changed, 38 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c
index 8cb74d0d0a1f..4e99adcfbb0e 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c
@@ -717,3 +717,39 @@ amdgpu_mes_ring_to_queue_props(struct amdgpu_device *adev,
        props->paging = false;
        props->ring = ring;
 }
+
+#define DEFINE_AMDGPU_MES_CTX_GET_OFFS_ENG(_eng)                       \
+do {                                                                   \
+       if (id_offs < AMDGPU_MES_CTX_MAX_OFFS)                          \
+               return offsetof(struct amdgpu_mes_ctx_meta_data,        \
+                               _eng[ring->idx].slots[id_offs]);        \
+       else if (id_offs == AMDGPU_MES_CTX_RING_OFFS)                   \
+               return offsetof(struct amdgpu_mes_ctx_meta_data,        \
+                               _eng[ring->idx].ring);                  \
+       else if (id_offs == AMDGPU_MES_CTX_IB_OFFS)                     \
+               return offsetof(struct amdgpu_mes_ctx_meta_data,        \
+                               _eng[ring->idx].ib);                    \
+       else if (id_offs == AMDGPU_MES_CTX_PADDING_OFFS)                        
\
+               return offsetof(struct amdgpu_mes_ctx_meta_data,        \
+                               _eng[ring->idx].padding);               \
+} while(0)
+
+int amdgpu_mes_ctx_get_offs(struct amdgpu_ring *ring, unsigned int id_offs)
+{
+       switch (ring->funcs->type) {
+       case AMDGPU_RING_TYPE_GFX:
+               DEFINE_AMDGPU_MES_CTX_GET_OFFS_ENG(gfx);
+               break;
+       case AMDGPU_RING_TYPE_COMPUTE:
+               DEFINE_AMDGPU_MES_CTX_GET_OFFS_ENG(compute);
+               break;
+       case AMDGPU_RING_TYPE_SDMA:
+               DEFINE_AMDGPU_MES_CTX_GET_OFFS_ENG(sdma);
+               break;
+       default:
+               break;
+       }
+
+       WARN_ON(1);
+       return -EINVAL;
+}
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.h
index bf90863852a7..36684416f277 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mes.h
@@ -230,9 +230,10 @@ struct amdgpu_mes_funcs {
                           struct mes_resume_gang_input *input);
 };
 
-
 #define amdgpu_mes_kiq_hw_init(adev) (adev)->mes.kiq_hw_init((adev))
 
+int amdgpu_mes_ctx_get_offs(struct amdgpu_ring *ring, unsigned int id_offs);
+
 int amdgpu_mes_init(struct amdgpu_device *adev);
 void amdgpu_mes_fini(struct amdgpu_device *adev);
 
-- 
2.35.1

Reply via email to