Commit 3c8bdb51 authored by Mukul Joshi's avatar Mukul Joshi Committed by Alex Deucher

drm/amdkfd: Add PM4 target XCC

In a device that supports multiple XCCs, unlike AQL queues, the PM4 queue
will be only processed in one XCC in the partitioning. This patch
re-purposes the queue percentage variable in create queue and update
queue ioctl for the user space to specify the target XCC.
Signed-off-by: default avatarAmber Lin <Amber.Lin@amd.com>
Signed-off-by: default avatarMukul Joshi <mukul.joshi@amd.com>
Tested-by: default avatarAmber Lin <Amber.Lin@amd.com>
Reviewed-by: default avatarFelix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 2f77b9a2
...@@ -186,7 +186,12 @@ static int kfd_ioctl_get_version(struct file *filep, struct kfd_process *p, ...@@ -186,7 +186,12 @@ static int kfd_ioctl_get_version(struct file *filep, struct kfd_process *p,
static int set_queue_properties_from_user(struct queue_properties *q_properties, static int set_queue_properties_from_user(struct queue_properties *q_properties,
struct kfd_ioctl_create_queue_args *args) struct kfd_ioctl_create_queue_args *args)
{ {
if (args->queue_percentage > KFD_MAX_QUEUE_PERCENTAGE) { /*
* Repurpose queue percentage to accommodate new features:
* bit 0-7: queue percentage
* bit 8-15: pm4_target_xcc
*/
if ((args->queue_percentage & 0xFF) > KFD_MAX_QUEUE_PERCENTAGE) {
pr_err("Queue percentage must be between 0 to KFD_MAX_QUEUE_PERCENTAGE\n"); pr_err("Queue percentage must be between 0 to KFD_MAX_QUEUE_PERCENTAGE\n");
return -EINVAL; return -EINVAL;
} }
...@@ -236,7 +241,9 @@ static int set_queue_properties_from_user(struct queue_properties *q_properties, ...@@ -236,7 +241,9 @@ static int set_queue_properties_from_user(struct queue_properties *q_properties,
q_properties->is_interop = false; q_properties->is_interop = false;
q_properties->is_gws = false; q_properties->is_gws = false;
q_properties->queue_percent = args->queue_percentage; q_properties->queue_percent = args->queue_percentage & 0xFF;
/* bit 8-15 are repurposed to be PM4 target XCC */
q_properties->pm4_target_xcc = (args->queue_percentage >> 8) & 0xFF;
q_properties->priority = args->queue_priority; q_properties->priority = args->queue_priority;
q_properties->queue_address = args->ring_base_address; q_properties->queue_address = args->ring_base_address;
q_properties->queue_size = args->ring_size; q_properties->queue_size = args->ring_size;
...@@ -442,7 +449,12 @@ static int kfd_ioctl_update_queue(struct file *filp, struct kfd_process *p, ...@@ -442,7 +449,12 @@ static int kfd_ioctl_update_queue(struct file *filp, struct kfd_process *p,
struct kfd_ioctl_update_queue_args *args = data; struct kfd_ioctl_update_queue_args *args = data;
struct queue_properties properties; struct queue_properties properties;
if (args->queue_percentage > KFD_MAX_QUEUE_PERCENTAGE) { /*
* Repurpose queue percentage to accommodate new features:
* bit 0-7: queue percentage
* bit 8-15: pm4_target_xcc
*/
if ((args->queue_percentage & 0xFF) > KFD_MAX_QUEUE_PERCENTAGE) {
pr_err("Queue percentage must be between 0 to KFD_MAX_QUEUE_PERCENTAGE\n"); pr_err("Queue percentage must be between 0 to KFD_MAX_QUEUE_PERCENTAGE\n");
return -EINVAL; return -EINVAL;
} }
...@@ -466,7 +478,9 @@ static int kfd_ioctl_update_queue(struct file *filp, struct kfd_process *p, ...@@ -466,7 +478,9 @@ static int kfd_ioctl_update_queue(struct file *filp, struct kfd_process *p,
properties.queue_address = args->ring_base_address; properties.queue_address = args->ring_base_address;
properties.queue_size = args->ring_size; properties.queue_size = args->ring_size;
properties.queue_percent = args->queue_percentage; properties.queue_percent = args->queue_percentage & 0xFF;
/* bit 8-15 are repurposed to be PM4 target XCC */
properties.pm4_target_xcc = (args->queue_percentage >> 8) & 0xFF;
properties.priority = args->queue_priority; properties.priority = args->queue_priority;
pr_debug("Updating queue id %d for pasid 0x%x\n", pr_debug("Updating queue id %d for pasid 0x%x\n",
......
...@@ -587,6 +587,7 @@ static void init_mqd_v9_4_3(struct mqd_manager *mm, void **mqd, ...@@ -587,6 +587,7 @@ static void init_mqd_v9_4_3(struct mqd_manager *mm, void **mqd,
/* PM4 Queue */ /* PM4 Queue */
m->compute_current_logic_xcc_id = 0; m->compute_current_logic_xcc_id = 0;
m->compute_tg_chunk_size = 0; m->compute_tg_chunk_size = 0;
m->pm4_target_xcc_in_xcp = q->pm4_target_xcc;
} }
if (xcc == 0) { if (xcc == 0) {
...@@ -627,6 +628,7 @@ static void update_mqd_v9_4_3(struct mqd_manager *mm, void *mqd, ...@@ -627,6 +628,7 @@ static void update_mqd_v9_4_3(struct mqd_manager *mm, void *mqd,
/* PM4 Queue */ /* PM4 Queue */
m->compute_current_logic_xcc_id = 0; m->compute_current_logic_xcc_id = 0;
m->compute_tg_chunk_size = 0; m->compute_tg_chunk_size = 0;
m->pm4_target_xcc_in_xcp = q->pm4_target_xcc;
} }
} }
} }
......
...@@ -509,6 +509,7 @@ struct queue_properties { ...@@ -509,6 +509,7 @@ struct queue_properties {
bool is_evicted; bool is_evicted;
bool is_active; bool is_active;
bool is_gws; bool is_gws;
uint32_t pm4_target_xcc;
/* Not relevant for user mode queues in cp scheduling */ /* Not relevant for user mode queues in cp scheduling */
unsigned int vmid; unsigned int vmid;
/* Relevant only for sdma queues*/ /* Relevant only for sdma queues*/
......
...@@ -477,6 +477,7 @@ int pqm_update_queue_properties(struct process_queue_manager *pqm, ...@@ -477,6 +477,7 @@ int pqm_update_queue_properties(struct process_queue_manager *pqm,
pqn->q->properties.queue_size = p->queue_size; pqn->q->properties.queue_size = p->queue_size;
pqn->q->properties.queue_percent = p->queue_percent; pqn->q->properties.queue_percent = p->queue_percent;
pqn->q->properties.priority = p->priority; pqn->q->properties.priority = p->priority;
pqn->q->properties.pm4_target_xcc = p->pm4_target_xcc;
retval = pqn->q->device->dqm->ops.update_queue(pqn->q->device->dqm, retval = pqn->q->device->dqm->ops.update_queue(pqn->q->device->dqm,
pqn->q, NULL); pqn->q, NULL);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment