]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
drm/amdkfd: To fix sdma page fault issue for GC 11
authorRuili Ji <ruiliji2@amd.com>
Mon, 6 Feb 2023 10:35:50 +0000 (18:35 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 23 Feb 2023 22:35:57 +0000 (17:35 -0500)
For the MQD memory, KMD would always allocate 4K memory,
and mes scheduler would write to the end of MQD for unmap flag.

Signed-off-by: Ruili Ji <ruiliji2@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v11.c

index c06ada0844ba154bfe61782c46abef90b4e8af7d..7a95698d83f73e82519d3a92e65885997162bbc4 100644 (file)
@@ -2373,7 +2373,7 @@ struct device_queue_manager *device_queue_manager_init(struct kfd_dev *dev)
        if (init_mqd_managers(dqm))
                goto out_free;
 
-       if (allocate_hiq_sdma_mqd(dqm)) {
+       if (!dev->shared_resources.enable_mes && allocate_hiq_sdma_mqd(dqm)) {
                pr_err("Failed to allocate hiq sdma mqd trunk buffer\n");
                goto out_free;
        }
@@ -2397,7 +2397,8 @@ static void deallocate_hiq_sdma_mqd(struct kfd_dev *dev,
 void device_queue_manager_uninit(struct device_queue_manager *dqm)
 {
        dqm->ops.uninitialize(dqm);
-       deallocate_hiq_sdma_mqd(dqm->dev, &dqm->hiq_sdma_mqd);
+       if (!dqm->dev->shared_resources.enable_mes)
+               deallocate_hiq_sdma_mqd(dqm->dev, &dqm->hiq_sdma_mqd);
        kfree(dqm);
 }
 
index 4f6390f3236ef17100a856ea8163c4f4a02bb3f2..4a9af800b1f1cea83a1fc2d707f06b1dede61cfc 100644 (file)
@@ -308,11 +308,16 @@ static void init_mqd_sdma(struct mqd_manager *mm, void **mqd,
                struct queue_properties *q)
 {
        struct v11_sdma_mqd *m;
+       int size;
 
        m = (struct v11_sdma_mqd *) mqd_mem_obj->cpu_ptr;
 
-       memset(m, 0, sizeof(struct v11_sdma_mqd));
+       if (mm->dev->shared_resources.enable_mes)
+               size = PAGE_SIZE;
+       else
+               size = sizeof(struct v11_sdma_mqd);
 
+       memset(m, 0, size);
        *mqd = m;
        if (gart_addr)
                *gart_addr = mqd_mem_obj->gpu_addr;
@@ -443,6 +448,14 @@ struct mqd_manager *mqd_manager_init_v11(enum KFD_MQD_TYPE type,
 #if defined(CONFIG_DEBUG_FS)
                mqd->debugfs_show_mqd = debugfs_show_mqd_sdma;
 #endif
+               /*
+                * To allocate SDMA MQDs by generic functions
+                * when MES is enabled.
+                */
+               if (dev->shared_resources.enable_mes) {
+                       mqd->allocate_mqd = allocate_mqd;
+                       mqd->free_mqd = kfd_free_mqd_cp;
+               }
                pr_debug("%s@%i\n", __func__, __LINE__);
                break;
        default: