]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
drm/amdkfd: Avoid using doorbell_off as offset in process doorbell pages
authorYong Zhao <Yong.Zhao@amd.com>
Tue, 15 Jan 2019 18:58:57 +0000 (13:58 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 13 Nov 2019 20:29:45 +0000 (15:29 -0500)
dorbell_off in the queue properties is mainly used for the doorbell dw
offset in pci bar. We should not set it to the doorbell byte offset in
process doorbell pages. This makes the code much easier to read.

Signed-off-by: Yong Zhao <Yong.Zhao@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_chardev.c
drivers/gpu/drm/amd/amdkfd/kfd_dbgdev.c
drivers/gpu/drm/amd/amdkfd/kfd_priv.h
drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c

index 568989b7947fd6c29a072f9959ecd9ab0c4381b5..1041f4d627a6f0a1a56c39d7af10f18bbb9f4f7e 100644 (file)
@@ -258,6 +258,7 @@ static int kfd_ioctl_create_queue(struct file *filep, struct kfd_process *p,
        unsigned int queue_id;
        struct kfd_process_device *pdd;
        struct queue_properties q_properties;
+       uint32_t doorbell_offset_in_process = 0;
 
        memset(&q_properties, 0, sizeof(struct queue_properties));
 
@@ -286,7 +287,8 @@ static int kfd_ioctl_create_queue(struct file *filep, struct kfd_process *p,
                        p->pasid,
                        dev->id);
 
-       err = pqm_create_queue(&p->pqm, dev, filep, &q_properties, &queue_id);
+       err = pqm_create_queue(&p->pqm, dev, filep, &q_properties, &queue_id,
+                       &doorbell_offset_in_process);
        if (err != 0)
                goto err_create_queue;
 
@@ -297,12 +299,10 @@ static int kfd_ioctl_create_queue(struct file *filep, struct kfd_process *p,
        args->doorbell_offset = KFD_MMAP_TYPE_DOORBELL;
        args->doorbell_offset |= KFD_MMAP_GPU_ID(args->gpu_id);
        if (KFD_IS_SOC15(dev->device_info->asic_family))
-               /* On SOC15 ASICs, doorbell allocation must be
-                * per-device, and independent from the per-process
-                * queue_id. Return the doorbell offset within the
-                * doorbell aperture to user mode.
+               /* On SOC15 ASICs, include the doorbell offset within the
+                * process doorbell frame, which is 2 pages.
                 */
-               args->doorbell_offset |= q_properties.doorbell_off;
+               args->doorbell_offset |= doorbell_offset_in_process;
 
        mutex_unlock(&p->mutex);
 
index d59f2cd056c648ee9d64c43c3fadda140b9b4dc1..1d33c4f252633cd4acde19411bd685d7f708753b 100644 (file)
@@ -185,7 +185,7 @@ static int dbgdev_register_diq(struct kfd_dbgdev *dbgdev)
        properties.type = KFD_QUEUE_TYPE_DIQ;
 
        status = pqm_create_queue(dbgdev->pqm, dbgdev->dev, NULL,
-                               &properties, &qid);
+                               &properties, &qid, NULL);
 
        if (status) {
                pr_err("Failed to create DIQ\n");
index 603d793a8f56205e958ab26f7bfa95d1d1b554be..8ed691fb345adb66514a8e62f2da1162f1295c96 100644 (file)
@@ -902,7 +902,8 @@ int pqm_create_queue(struct process_queue_manager *pqm,
                            struct kfd_dev *dev,
                            struct file *f,
                            struct queue_properties *properties,
-                           unsigned int *qid);
+                           unsigned int *qid,
+                           uint32_t *p_doorbell_offset_in_process);
 int pqm_destroy_queue(struct process_queue_manager *pqm, unsigned int qid);
 int pqm_update_queue(struct process_queue_manager *pqm, unsigned int qid,
                        struct queue_properties *p);
index 2659d226c0565ee8594babd3d7f0fdfbdac4bedb..8bc69689f9b8010ddcd7b052e7d152a912be132d 100644 (file)
@@ -192,7 +192,8 @@ int pqm_create_queue(struct process_queue_manager *pqm,
                            struct kfd_dev *dev,
                            struct file *f,
                            struct queue_properties *properties,
-                           unsigned int *qid)
+                           unsigned int *qid,
+                           uint32_t *p_doorbell_offset_in_process)
 {
        int retval;
        struct kfd_process_device *pdd;
@@ -303,12 +304,15 @@ int pqm_create_queue(struct process_queue_manager *pqm,
                goto err_create_queue;
        }
 
-       if (q)
+       if (q && p_doorbell_offset_in_process)
                /* Return the doorbell offset within the doorbell page
                 * to the caller so it can be passed up to user mode
                 * (in bytes).
+                * There are always 1024 doorbells per process, so in case
+                * of 8-byte doorbells, there are two doorbell pages per
+                * process.
                 */
-               properties->doorbell_off =
+               *p_doorbell_offset_in_process =
                        (q->properties.doorbell_off * sizeof(uint32_t)) &
                        (kfd_doorbell_process_slice(dev) - 1);