drm/amdkfd: Allocate gws on device initialization
authorOak Zeng <Oak.Zeng@amd.com>
Mon, 6 May 2019 18:52:12 +0000 (13:52 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 28 May 2019 19:44:11 +0000 (14:44 -0500)
On device initialization, KFD allocates all (64) gws which
is shared by all KFD processes.

Signed-off-by: Oak Zeng <Oak.Zeng@amd.com>
Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdkfd/kfd_device.c
drivers/gpu/drm/amd/amdkfd/kfd_priv.h

index a53dda9..b08dc26 100644 (file)
@@ -552,6 +552,13 @@ bool kgd2kfd_device_init(struct kfd_dev *kfd,
        } else
                kfd->max_proc_per_quantum = hws_max_conc_proc;
 
+       /* Allocate global GWS that is shared by all KFD processes */
+       if (hws_gws_support && amdgpu_amdkfd_alloc_gws(kfd->kgd,
+                       amdgpu_amdkfd_get_num_gws(kfd->kgd), &kfd->gws)) {
+               dev_err(kfd_device, "Could not allocate %d gws\n",
+                       amdgpu_amdkfd_get_num_gws(kfd->kgd));
+               goto out;
+       }
        /* calculate max size of mqds needed for queues */
        size = max_num_of_queues_per_device *
                        kfd->device_info->mqd_size_aligned;
@@ -575,7 +582,7 @@ bool kgd2kfd_device_init(struct kfd_dev *kfd,
                        &kfd->gtt_start_gpu_addr, &kfd->gtt_start_cpu_ptr,
                        false)) {
                dev_err(kfd_device, "Could not allocate %d bytes\n", size);
-               goto out;
+               goto alloc_gtt_mem_failure;
        }
 
        dev_info(kfd_device, "Allocated %d bytes on gart\n", size);
@@ -645,6 +652,9 @@ kfd_doorbell_error:
        kfd_gtt_sa_fini(kfd);
 kfd_gtt_sa_init_error:
        amdgpu_amdkfd_free_gtt_mem(kfd->kgd, kfd->gtt_mem);
+alloc_gtt_mem_failure:
+       if (hws_gws_support)
+               amdgpu_amdkfd_free_gws(kfd->kgd, kfd->gws);
        dev_err(kfd_device,
                "device %x:%x NOT added due to errors\n",
                kfd->pdev->vendor, kfd->pdev->device);
@@ -662,6 +672,8 @@ void kgd2kfd_device_exit(struct kfd_dev *kfd)
                kfd_doorbell_fini(kfd);
                kfd_gtt_sa_fini(kfd);
                amdgpu_amdkfd_free_gtt_mem(kfd->kgd, kfd->gtt_mem);
+               if (hws_gws_support)
+                       amdgpu_amdkfd_free_gws(kfd->kgd, kfd->gws);
        }
 
        kfree(kfd);
index b6a60fc..57e87de 100644 (file)
@@ -289,6 +289,9 @@ struct kfd_dev {
 
        /* Compute Profile ref. count */
        atomic_t compute_profile;
+
+       /* Global GWS resource shared b/t processes*/
+       void *gws;
 };
 
 enum kfd_mempool {