提交 e47a8b52 编写于 作者: Y Yong Zhao 提交者: Alex Deucher

drm/amdkfd: Avoid using doorbell_off as offset in process doorbell pages

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: NYong Zhao <Yong.Zhao@amd.com>
Reviewed-by: NFelix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: NAlex Deucher <alexander.deucher@amd.com>
上级 339903fa
...@@ -258,6 +258,7 @@ static int kfd_ioctl_create_queue(struct file *filep, struct kfd_process *p, ...@@ -258,6 +258,7 @@ static int kfd_ioctl_create_queue(struct file *filep, struct kfd_process *p,
unsigned int queue_id; unsigned int queue_id;
struct kfd_process_device *pdd; struct kfd_process_device *pdd;
struct queue_properties q_properties; struct queue_properties q_properties;
uint32_t doorbell_offset_in_process = 0;
memset(&q_properties, 0, sizeof(struct queue_properties)); 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, ...@@ -286,7 +287,8 @@ static int kfd_ioctl_create_queue(struct file *filep, struct kfd_process *p,
p->pasid, p->pasid,
dev->id); 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) if (err != 0)
goto err_create_queue; goto err_create_queue;
...@@ -297,12 +299,10 @@ static int kfd_ioctl_create_queue(struct file *filep, struct kfd_process *p, ...@@ -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_TYPE_DOORBELL;
args->doorbell_offset |= KFD_MMAP_GPU_ID(args->gpu_id); args->doorbell_offset |= KFD_MMAP_GPU_ID(args->gpu_id);
if (KFD_IS_SOC15(dev->device_info->asic_family)) if (KFD_IS_SOC15(dev->device_info->asic_family))
/* On SOC15 ASICs, doorbell allocation must be /* On SOC15 ASICs, include the doorbell offset within the
* per-device, and independent from the per-process * process doorbell frame, which is 2 pages.
* queue_id. Return the doorbell offset within the
* doorbell aperture to user mode.
*/ */
args->doorbell_offset |= q_properties.doorbell_off; args->doorbell_offset |= doorbell_offset_in_process;
mutex_unlock(&p->mutex); mutex_unlock(&p->mutex);
......
...@@ -185,7 +185,7 @@ static int dbgdev_register_diq(struct kfd_dbgdev *dbgdev) ...@@ -185,7 +185,7 @@ static int dbgdev_register_diq(struct kfd_dbgdev *dbgdev)
properties.type = KFD_QUEUE_TYPE_DIQ; properties.type = KFD_QUEUE_TYPE_DIQ;
status = pqm_create_queue(dbgdev->pqm, dbgdev->dev, NULL, status = pqm_create_queue(dbgdev->pqm, dbgdev->dev, NULL,
&properties, &qid); &properties, &qid, NULL);
if (status) { if (status) {
pr_err("Failed to create DIQ\n"); pr_err("Failed to create DIQ\n");
......
...@@ -902,7 +902,8 @@ int pqm_create_queue(struct process_queue_manager *pqm, ...@@ -902,7 +902,8 @@ int pqm_create_queue(struct process_queue_manager *pqm,
struct kfd_dev *dev, struct kfd_dev *dev,
struct file *f, struct file *f,
struct queue_properties *properties, 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_destroy_queue(struct process_queue_manager *pqm, unsigned int qid);
int pqm_update_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); struct queue_properties *p);
......
...@@ -192,7 +192,8 @@ int pqm_create_queue(struct process_queue_manager *pqm, ...@@ -192,7 +192,8 @@ int pqm_create_queue(struct process_queue_manager *pqm,
struct kfd_dev *dev, struct kfd_dev *dev,
struct file *f, struct file *f,
struct queue_properties *properties, struct queue_properties *properties,
unsigned int *qid) unsigned int *qid,
uint32_t *p_doorbell_offset_in_process)
{ {
int retval; int retval;
struct kfd_process_device *pdd; struct kfd_process_device *pdd;
...@@ -303,12 +304,15 @@ int pqm_create_queue(struct process_queue_manager *pqm, ...@@ -303,12 +304,15 @@ int pqm_create_queue(struct process_queue_manager *pqm,
goto err_create_queue; goto err_create_queue;
} }
if (q) if (q && p_doorbell_offset_in_process)
/* Return the doorbell offset within the doorbell page /* Return the doorbell offset within the doorbell page
* to the caller so it can be passed up to user mode * to the caller so it can be passed up to user mode
* (in bytes). * (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)) & (q->properties.doorbell_off * sizeof(uint32_t)) &
(kfd_doorbell_process_slice(dev) - 1); (kfd_doorbell_process_slice(dev) - 1);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册