The CSA and EOP buffers have different alignement requirements.
Replace the hardcoded sizes with proper queries to the IPs.

v2: verify callbacks (Prike)

Reviewed-by: Prike Liang <[email protected]> (v1)
Signed-off-by: Alex Deucher <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/mes_userqueue.c | 20 ++++++++++++++++++--
 1 file changed, 18 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/mes_userqueue.c 
b/drivers/gpu/drm/amd/amdgpu/mes_userqueue.c
index f5aa83ff57f35..bf6ee6697271a 100644
--- a/drivers/gpu/drm/amd/amdgpu/mes_userqueue.c
+++ b/drivers/gpu/drm/amd/amdgpu/mes_userqueue.c
@@ -281,6 +281,14 @@ static int mes_userq_mqd_create(struct amdgpu_userq_mgr 
*uq_mgr,
 
        if (queue->queue_type == AMDGPU_HW_IP_COMPUTE) {
                struct drm_amdgpu_userq_mqd_compute_gfx11 *compute_mqd;
+               struct amdgpu_gfx_shadow_info shadow_info;
+
+               if (adev->gfx.funcs->get_gfx_shadow_info) {
+                       adev->gfx.funcs->get_gfx_shadow_info(adev, 
&shadow_info, true);
+               } else {
+                       r = -EINVAL;
+                       goto free_mqd;
+               }
 
                if (mqd_user->mqd_size != sizeof(*compute_mqd)) {
                        DRM_ERROR("Invalid compute IP MQD size\n");
@@ -296,7 +304,7 @@ static int mes_userq_mqd_create(struct amdgpu_userq_mgr 
*uq_mgr,
                }
 
                r = amdgpu_userq_input_va_validate(queue, compute_mqd->eop_va,
-                                                  2048);
+                                                  shadow_info.eop_size);
                if (r)
                        goto free_mqd;
 
@@ -348,6 +356,14 @@ static int mes_userq_mqd_create(struct amdgpu_userq_mgr 
*uq_mgr,
                kfree(mqd_gfx_v11);
        } else if (queue->queue_type == AMDGPU_HW_IP_DMA) {
                struct drm_amdgpu_userq_mqd_sdma_gfx11 *mqd_sdma_v11;
+               struct amdgpu_sdma_csa_info csa;
+
+               if (adev->sdma.get_csa_info) {
+                       adev->sdma.get_csa_info(adev, &csa);
+               } else {
+                       r = -EINVAL;
+                       goto free_mqd;
+               }
 
                if (mqd_user->mqd_size != sizeof(*mqd_sdma_v11) || 
!mqd_user->mqd) {
                        DRM_ERROR("Invalid SDMA MQD\n");
@@ -362,7 +378,7 @@ static int mes_userq_mqd_create(struct amdgpu_userq_mgr 
*uq_mgr,
                        goto free_mqd;
                }
                r = amdgpu_userq_input_va_validate(queue, mqd_sdma_v11->csa_va,
-                                                  32);
+                                                  csa.size);
                if (r)
                        goto free_mqd;
 
-- 
2.51.0

Reply via email to