Add architecture-specific 'update_mqd' callbacks for GFX12 to support
runtime MQD priority updates.

Signed-off-by: Jesse Zhang <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/gfx_v12_0.c | 74 ++++++++++++++++----------
 1 file changed, 46 insertions(+), 28 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v12_0.c 
b/drivers/gpu/drm/amd/amdgpu/gfx_v12_0.c
index 6cd16f016c37..a0180699e492 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v12_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v12_0.c
@@ -3110,11 +3110,54 @@ static int gfx_v12_0_cp_async_gfx_ring_resume(struct 
amdgpu_device *adev)
        return gfx_v12_0_cp_gfx_start(adev);
 }
 
+/**
+ * gfx_v12_0_compute_update_queue - Update runtime-configurable queue 
parameters
+ * @adev: amdgpu device pointer
+ * @mqd: MQD structure to update
+ * @prop: MQD properties containing updated configuration parameters
+ */
+static int gfx_v12_0_compute_mqd_update(struct amdgpu_device *adev, void *m,
+                                         struct amdgpu_mqd_prop *prop)
+{
+       struct v12_compute_mqd *mqd = m;
+       uint64_t hqd_gpu_addr;
+       uint32_t tmp;
+
+       /* set the pointer to the HQD, this is similar CP_RB0_BASE/_HI */
+       hqd_gpu_addr = prop->hqd_base_gpu_addr >> 8;
+       mqd->cp_hqd_pq_base_lo = hqd_gpu_addr;
+       mqd->cp_hqd_pq_base_hi = upper_32_bits(hqd_gpu_addr);
+
+       /* set up the HQD, this is similar to CP_RB0_CNTL */
+       tmp = regCP_HQD_PQ_CONTROL_DEFAULT;
+       tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, QUEUE_SIZE,
+                           (order_base_2(prop->queue_size / 4) - 1));
+       tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, RPTR_BLOCK_SIZE,
+                           (order_base_2(AMDGPU_GPU_PAGE_SIZE / 4) - 1));
+       tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, UNORD_DISPATCH, 1);
+       tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, TUNNEL_DISPATCH, 0);
+       if (prop->kernel_queue) {
+               tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, PRIV_STATE, 1);
+               tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, KMD_QUEUE, 1);
+       }
+       if (prop->tmz_queue)
+               tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, TMZ, 1);
+       mqd->cp_hqd_pq_control = tmp;
+
+       /* set static priority for a compute queue/ring */
+       mqd->cp_hqd_pipe_priority = prop->hqd_pipe_priority;
+       mqd->cp_hqd_queue_priority = prop->hqd_queue_priority;
+
+       mqd->cp_hqd_active = prop->hqd_active;
+
+       return 0;
+}
+
 static int gfx_v12_0_compute_mqd_init(struct amdgpu_device *adev, void *m,
                                      struct amdgpu_mqd_prop *prop)
 {
        struct v12_compute_mqd *mqd = m;
-       uint64_t hqd_gpu_addr, wb_gpu_addr, eop_base_addr;
+       uint64_t wb_gpu_addr, eop_base_addr;
        uint32_t tmp;
 
        mqd->header = 0xC0310800;
@@ -3170,27 +3213,6 @@ static int gfx_v12_0_compute_mqd_init(struct 
amdgpu_device *adev, void *m,
        tmp = REG_SET_FIELD(tmp, CP_MQD_CONTROL, VMID, 0);
        mqd->cp_mqd_control = tmp;
 
-       /* set the pointer to the HQD, this is similar CP_RB0_BASE/_HI */
-       hqd_gpu_addr = prop->hqd_base_gpu_addr >> 8;
-       mqd->cp_hqd_pq_base_lo = hqd_gpu_addr;
-       mqd->cp_hqd_pq_base_hi = upper_32_bits(hqd_gpu_addr);
-
-       /* set up the HQD, this is similar to CP_RB0_CNTL */
-       tmp = regCP_HQD_PQ_CONTROL_DEFAULT;
-       tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, QUEUE_SIZE,
-                           (order_base_2(prop->queue_size / 4) - 1));
-       tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, RPTR_BLOCK_SIZE,
-                           (order_base_2(AMDGPU_GPU_PAGE_SIZE / 4) - 1));
-       tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, UNORD_DISPATCH, 1);
-       tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, TUNNEL_DISPATCH, 0);
-       if (prop->kernel_queue) {
-               tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, PRIV_STATE, 1);
-               tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, KMD_QUEUE, 1);
-       }
-       if (prop->tmz_queue)
-               tmp = REG_SET_FIELD(tmp, CP_HQD_PQ_CONTROL, TMZ, 1);
-       mqd->cp_hqd_pq_control = tmp;
-
        /* set the wb address whether it's enabled or not */
        wb_gpu_addr = prop->rptr_gpu_addr;
        mqd->cp_hqd_pq_rptr_report_addr_lo = wb_gpu_addr & 0xfffffffc;
@@ -3234,12 +3256,6 @@ static int gfx_v12_0_compute_mqd_init(struct 
amdgpu_device *adev, void *m,
        tmp = REG_SET_FIELD(tmp, CP_HQD_IB_CONTROL, MIN_IB_AVAIL_SIZE, 3);
        mqd->cp_hqd_ib_control = tmp;
 
-       /* set static priority for a compute queue/ring */
-       mqd->cp_hqd_pipe_priority = prop->hqd_pipe_priority;
-       mqd->cp_hqd_queue_priority = prop->hqd_queue_priority;
-
-       mqd->cp_hqd_active = prop->hqd_active;
-
        /* set UQ fenceaddress */
        mqd->fence_address_lo = lower_32_bits(prop->fence_address);
        mqd->fence_address_hi = upper_32_bits(prop->fence_address);
@@ -5669,6 +5685,8 @@ static void gfx_v12_0_set_mqd_funcs(struct amdgpu_device 
*adev)
                sizeof(struct v12_compute_mqd);
        adev->mqds[AMDGPU_HW_IP_COMPUTE].init_mqd =
                gfx_v12_0_compute_mqd_init;
+       adev->mqds[AMDGPU_HW_IP_COMPUTE].update_mqd =
+               gfx_v12_0_compute_mqd_update;
 }
 
 static void gfx_v12_0_set_user_wgp_inactive_bitmap_per_sh(struct amdgpu_device 
*adev,
-- 
2.49.0

Reply via email to