[Why]
Enable separate sizes for GFX and compute MQD,
preventing memory corruption issues when different rings share contiguous 
memory.

[How]
Update MQD initialization to accept separate sizes for GFX and compute queues.

Signed-off-by: Yifan Zha <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c | 25 ++++++++++++++++---------
 drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h |  4 +++-
 drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c  |  5 ++++-
 drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c  |  5 ++++-
 drivers/gpu/drm/amd/amdgpu/gfx_v12_0.c  |  5 ++++-
 drivers/gpu/drm/amd/amdgpu/gfx_v12_1.c  |  5 ++++-
 drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c   |  5 ++++-
 drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c   |  5 ++++-
 drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c |  4 +++-
 9 files changed, 46 insertions(+), 17 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c
index 6abe5103a78d..14bd75dfd8c0 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c
@@ -379,13 +379,18 @@ int amdgpu_gfx_kiq_init(struct amdgpu_device *adev,
 
 /* create MQD for each compute/gfx queue */
 int amdgpu_gfx_mqd_sw_init(struct amdgpu_device *adev,
-                          unsigned int mqd_size, int xcc_id)
+                          unsigned int gfx_mqd_size,
+                          unsigned int compute_mqd_size,
+                          int xcc_id)
 {
        int r, i, j;
        struct amdgpu_kiq *kiq = &adev->gfx.kiq[xcc_id];
        struct amdgpu_ring *ring = &kiq->ring;
        u32 domain = AMDGPU_GEM_DOMAIN_GTT;
 
+       if (!gfx_mqd_size || !compute_mqd_size)
+               return -EINVAL;
+
 #if !defined(CONFIG_ARM) && !defined(CONFIG_ARM64)
        /* Only enable on gfx10 and 11 for now to avoid changing behavior on 
older chips */
        if (amdgpu_ip_version(adev, GC_HWIP, 0) >= IP_VERSION(10, 0, 0))
@@ -399,7 +404,7 @@ int amdgpu_gfx_mqd_sw_init(struct amdgpu_device *adev,
                 * deallocated and gart_unbind, to strict diverage we decide to 
use VRAM domain for
                 * KIQ MQD no matter SRIOV or Bare-metal
                 */
-               r = amdgpu_bo_create_kernel(adev, mqd_size, PAGE_SIZE,
+               r = amdgpu_bo_create_kernel(adev, compute_mqd_size, PAGE_SIZE,
                                            AMDGPU_GEM_DOMAIN_VRAM |
                                            AMDGPU_GEM_DOMAIN_GTT,
                                            &ring->mqd_obj,
@@ -411,12 +416,14 @@ int amdgpu_gfx_mqd_sw_init(struct amdgpu_device *adev,
                }
 
                /* prepare MQD backup */
-               kiq->mqd_backup = kzalloc(mqd_size, GFP_KERNEL);
+               kiq->mqd_backup = kzalloc(compute_mqd_size, GFP_KERNEL);
                if (!kiq->mqd_backup) {
                        dev_warn(adev->dev,
                                 "no memory to create MQD backup for ring 
%s\n", ring->name);
                        return -ENOMEM;
                }
+
+               ring->mqd_size = compute_mqd_size;
        }
 
        if (adev->asic_type >= CHIP_NAVI10 && amdgpu_async_gfx_ring) {
@@ -424,7 +431,7 @@ int amdgpu_gfx_mqd_sw_init(struct amdgpu_device *adev,
                for (i = 0; i < adev->gfx.num_gfx_rings; i++) {
                        ring = &adev->gfx.gfx_ring[i];
                        if (!ring->mqd_obj) {
-                               r = amdgpu_bo_create_kernel(adev, mqd_size, 
PAGE_SIZE,
+                               r = amdgpu_bo_create_kernel(adev, gfx_mqd_size, 
PAGE_SIZE,
                                                            domain, 
&ring->mqd_obj,
                                                            
&ring->mqd_gpu_addr, &ring->mqd_ptr);
                                if (r) {
@@ -432,9 +439,9 @@ int amdgpu_gfx_mqd_sw_init(struct amdgpu_device *adev,
                                        return r;
                                }
 
-                               ring->mqd_size = mqd_size;
+                               ring->mqd_size = gfx_mqd_size;
                                /* prepare MQD backup */
-                               adev->gfx.me.mqd_backup[i] = kzalloc(mqd_size, 
GFP_KERNEL);
+                               adev->gfx.me.mqd_backup[i] = 
kzalloc(gfx_mqd_size, GFP_KERNEL);
                                if (!adev->gfx.me.mqd_backup[i]) {
                                        dev_warn(adev->dev, "no memory to 
create MQD backup for ring %s\n", ring->name);
                                        return -ENOMEM;
@@ -448,7 +455,7 @@ int amdgpu_gfx_mqd_sw_init(struct amdgpu_device *adev,
                j = i + xcc_id * adev->gfx.num_compute_rings;
                ring = &adev->gfx.compute_ring[j];
                if (!ring->mqd_obj) {
-                       r = amdgpu_bo_create_kernel(adev, mqd_size, PAGE_SIZE,
+                       r = amdgpu_bo_create_kernel(adev, compute_mqd_size, 
PAGE_SIZE,
                                                    domain, &ring->mqd_obj,
                                                    &ring->mqd_gpu_addr, 
&ring->mqd_ptr);
                        if (r) {
@@ -456,9 +463,9 @@ int amdgpu_gfx_mqd_sw_init(struct amdgpu_device *adev,
                                return r;
                        }
 
-                       ring->mqd_size = mqd_size;
+                       ring->mqd_size = compute_mqd_size;
                        /* prepare MQD backup */
-                       adev->gfx.mec.mqd_backup[j] = kzalloc(mqd_size, 
GFP_KERNEL);
+                       adev->gfx.mec.mqd_backup[j] = kzalloc(compute_mqd_size, 
GFP_KERNEL);
                        if (!adev->gfx.mec.mqd_backup[j]) {
                                dev_warn(adev->dev, "no memory to create MQD 
backup for ring %s\n", ring->name);
                                return -ENOMEM;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h
index 585cc8e81bb2..c5970aafa49d 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h
@@ -581,7 +581,9 @@ int amdgpu_gfx_kiq_init(struct amdgpu_device *adev,
                        unsigned hpd_size, int xcc_id);
 
 int amdgpu_gfx_mqd_sw_init(struct amdgpu_device *adev,
-                          unsigned mqd_size, int xcc_id);
+                          unsigned int gfx_mqd_size,
+                          unsigned int compute_mqd_size,
+                          int xcc_id);
 void amdgpu_gfx_mqd_sw_fini(struct amdgpu_device *adev, int xcc_id);
 int amdgpu_gfx_disable_kcq(struct amdgpu_device *adev, int xcc_id);
 int amdgpu_gfx_enable_kcq(struct amdgpu_device *adev, int xcc_id);
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c 
b/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
index 41bbedb8e157..4d4820adac4d 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
@@ -4973,7 +4973,10 @@ static int gfx_v10_0_sw_init(struct amdgpu_ip_block 
*ip_block)
        if (r)
                return r;
 
-       r = amdgpu_gfx_mqd_sw_init(adev, sizeof(struct v10_compute_mqd), 0);
+       r = amdgpu_gfx_mqd_sw_init(adev,
+                                  sizeof(struct v10_gfx_mqd),
+                                  sizeof(struct v10_compute_mqd),
+                                  0);
        if (r)
                return r;
 
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c 
b/drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c
index 3a4ca104b161..968098b20a02 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c
@@ -1860,7 +1860,10 @@ static int gfx_v11_0_sw_init(struct amdgpu_ip_block 
*ip_block)
                        return r;
        }
 
-       r = amdgpu_gfx_mqd_sw_init(adev, sizeof(struct v11_compute_mqd), 0);
+       r = amdgpu_gfx_mqd_sw_init(adev,
+                                  sizeof(struct v11_gfx_mqd),
+                                  sizeof(struct v11_compute_mqd),
+                                  0);
        if (r)
                return r;
 
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v12_0.c 
b/drivers/gpu/drm/amd/amdgpu/gfx_v12_0.c
index 6cd16f016c37..ecb04e387111 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v12_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v12_0.c
@@ -1576,7 +1576,10 @@ static int gfx_v12_0_sw_init(struct amdgpu_ip_block 
*ip_block)
                        return r;
        }
 
-       r = amdgpu_gfx_mqd_sw_init(adev, sizeof(struct v12_compute_mqd), 0);
+       r = amdgpu_gfx_mqd_sw_init(adev,
+                                  sizeof(struct v12_gfx_mqd),
+                                  sizeof(struct v12_compute_mqd),
+                                  0);
        if (r)
                return r;
 
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v12_1.c 
b/drivers/gpu/drm/amd/amdgpu/gfx_v12_1.c
index 86cc90a66296..db96fac75b95 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v12_1.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v12_1.c
@@ -1229,7 +1229,10 @@ static int gfx_v12_1_sw_init(struct amdgpu_ip_block 
*ip_block)
                                return r;
                }
 
-               r = amdgpu_gfx_mqd_sw_init(adev, sizeof(struct 
v12_1_compute_mqd), xcc_id);
+               r = amdgpu_gfx_mqd_sw_init(adev,
+                                          sizeof(struct v12_1_compute_mqd),
+                                          sizeof(struct v12_1_compute_mqd),
+                                          xcc_id);
                if (r)
                        return r;
        }
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c 
b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
index a6b4c8f41dc1..c35bea99df5d 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
@@ -2013,7 +2013,10 @@ static int gfx_v8_0_sw_init(struct amdgpu_ip_block 
*ip_block)
                return r;
 
        /* create MQD for all compute queues as well as KIQ for SRIOV case */
-       r = amdgpu_gfx_mqd_sw_init(adev, sizeof(struct vi_mqd_allocation), 0);
+       r = amdgpu_gfx_mqd_sw_init(adev,
+                                  sizeof(struct vi_mqd_allocation),
+                                  sizeof(struct vi_mqd_allocation),
+                                  0);
        if (r)
                return r;
 
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c 
b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
index 7e9d753f4a80..10802e26f371 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
@@ -2427,7 +2427,10 @@ static int gfx_v9_0_sw_init(struct amdgpu_ip_block 
*ip_block)
                return r;
 
        /* create MQD for all compute queues as wel as KIQ for SRIOV case */
-       r = amdgpu_gfx_mqd_sw_init(adev, sizeof(struct v9_mqd_allocation), 0);
+       r = amdgpu_gfx_mqd_sw_init(adev,
+                                  sizeof(struct v9_mqd_allocation),
+                                  sizeof(struct v9_mqd_allocation),
+                                  0);
        if (r)
                return r;
 
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c 
b/drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c
index ad4d442e7345..f76a0de617f4 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c
@@ -1139,7 +1139,9 @@ static int gfx_v9_4_3_sw_init(struct amdgpu_ip_block 
*ip_block)
 
                /* create MQD for all compute queues as wel as KIQ for SRIOV 
case */
                r = amdgpu_gfx_mqd_sw_init(adev,
-                               sizeof(struct v9_mqd_allocation), xcc_id);
+                                          sizeof(struct v9_mqd_allocation),
+                                          sizeof(struct v9_mqd_allocation),
+                                          xcc_id);
                if (r)
                        return r;
        }
-- 
2.43.0

Reply via email to