2 * Copyright 2014 Advanced Micro Devices, Inc.
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
24 #include <linux/slab.h>
25 #include <linux/list.h>
26 #include "kfd_device_queue_manager.h"
28 #include "kfd_kernel_queue.h"
30 static inline struct process_queue_node
*get_queue_by_qid(
31 struct process_queue_manager
*pqm
, unsigned int qid
)
33 struct process_queue_node
*pqn
;
37 list_for_each_entry(pqn
, &pqm
->queues
, process_queue_list
) {
38 if (pqn
->q
&& pqn
->q
->properties
.queue_id
== qid
)
40 if (pqn
->kq
&& pqn
->kq
->queue
->properties
.queue_id
== qid
)
47 static int find_available_queue_slot(struct process_queue_manager
*pqm
,
54 pr_debug("kfd: in %s\n", __func__
);
56 found
= find_first_zero_bit(pqm
->queue_slot_bitmap
,
57 KFD_MAX_NUM_OF_QUEUES_PER_PROCESS
);
59 pr_debug("kfd: the new slot id %lu\n", found
);
61 if (found
>= KFD_MAX_NUM_OF_QUEUES_PER_PROCESS
) {
62 pr_info("amdkfd: Can not open more queues for process with pasid %d\n",
67 set_bit(found
, pqm
->queue_slot_bitmap
);
73 int pqm_init(struct process_queue_manager
*pqm
, struct kfd_process
*p
)
77 INIT_LIST_HEAD(&pqm
->queues
);
78 pqm
->queue_slot_bitmap
=
79 kzalloc(DIV_ROUND_UP(KFD_MAX_NUM_OF_QUEUES_PER_PROCESS
,
80 BITS_PER_BYTE
), GFP_KERNEL
);
81 if (pqm
->queue_slot_bitmap
== NULL
)
88 void pqm_uninit(struct process_queue_manager
*pqm
)
91 struct process_queue_node
*pqn
, *next
;
95 pr_debug("In func %s\n", __func__
);
97 list_for_each_entry_safe(pqn
, next
, &pqm
->queues
, process_queue_list
) {
98 retval
= pqm_destroy_queue(
101 pqn
->q
->properties
.queue_id
:
102 pqn
->kq
->queue
->properties
.queue_id
);
105 pr_err("kfd: failed to destroy queue\n");
109 kfree(pqm
->queue_slot_bitmap
);
110 pqm
->queue_slot_bitmap
= NULL
;
113 static int create_cp_queue(struct process_queue_manager
*pqm
,
114 struct kfd_dev
*dev
, struct queue
**q
,
115 struct queue_properties
*q_properties
,
116 struct file
*f
, unsigned int qid
)
122 /* Doorbell initialized in user space*/
123 q_properties
->doorbell_ptr
= NULL
;
125 q_properties
->doorbell_off
=
126 kfd_queue_id_to_doorbell(dev
, pqm
->process
, qid
);
128 /* let DQM handle it*/
129 q_properties
->vmid
= 0;
130 q_properties
->queue_id
= qid
;
132 retval
= init_queue(q
, *q_properties
);
137 (*q
)->process
= pqm
->process
;
139 pr_debug("kfd: PQM After init queue");
147 int pqm_create_queue(struct process_queue_manager
*pqm
,
150 struct queue_properties
*properties
,
152 enum kfd_queue_type type
,
156 struct kfd_process_device
*pdd
;
157 struct queue_properties q_properties
;
159 struct process_queue_node
*pqn
;
160 struct kernel_queue
*kq
;
164 BUG_ON(!pqm
|| !dev
|| !properties
|| !qid
);
166 memset(&q_properties
, 0, sizeof(struct queue_properties
));
167 memcpy(&q_properties
, properties
, sizeof(struct queue_properties
));
171 pdd
= kfd_get_process_device_data(dev
, pqm
->process
);
173 pr_err("Process device data doesn't exist\n");
178 * for debug process, verify that it is within the static queues limit
179 * currently limit is set to half of the total avail HQD slots
180 * If we are just about to create DIQ, the is_debug flag is not set yet
181 * Hence we also check the type as well
183 if ((pdd
->qpd
.is_debug
) ||
184 (type
== KFD_QUEUE_TYPE_DIQ
)) {
185 list_for_each_entry(cur
, &pdd
->qpd
.queues_list
, list
)
187 if (num_queues
>= dev
->device_info
->max_no_of_hqd
/2)
191 retval
= find_available_queue_slot(pqm
, qid
);
195 if (list_empty(&pqm
->queues
)) {
197 dev
->dqm
->ops
.register_process(dev
->dqm
, &pdd
->qpd
);
200 pqn
= kzalloc(sizeof(struct process_queue_node
), GFP_KERNEL
);
203 goto err_allocate_pqn
;
207 case KFD_QUEUE_TYPE_SDMA
:
208 case KFD_QUEUE_TYPE_COMPUTE
:
209 /* check if there is over subscription */
210 if ((sched_policy
== KFD_SCHED_POLICY_HWS_NO_OVERSUBSCRIPTION
) &&
211 ((dev
->dqm
->processes_count
>= VMID_PER_DEVICE
) ||
212 (dev
->dqm
->queue_count
>= PIPE_PER_ME_CP_SCHEDULING
* QUEUES_PER_PIPE
))) {
213 pr_err("kfd: over-subscription is not allowed in radeon_kfd.sched_policy == 1\n");
215 goto err_create_queue
;
218 retval
= create_cp_queue(pqm
, dev
, &q
, &q_properties
, f
, *qid
);
220 goto err_create_queue
;
223 retval
= dev
->dqm
->ops
.create_queue(dev
->dqm
, q
, &pdd
->qpd
,
224 &q
->properties
.vmid
);
225 pr_debug("DQM returned %d for create_queue\n", retval
);
228 case KFD_QUEUE_TYPE_DIQ
:
229 kq
= kernel_queue_init(dev
, KFD_QUEUE_TYPE_DIQ
);
232 goto err_create_queue
;
234 kq
->queue
->properties
.queue_id
= *qid
;
237 retval
= dev
->dqm
->ops
.create_kernel_queue(dev
->dqm
,
246 pr_debug("Error dqm create queue\n");
247 goto err_create_queue
;
250 pr_debug("kfd: PQM After DQM create queue\n");
252 list_add(&pqn
->process_queue_list
, &pqm
->queues
);
255 *properties
= q
->properties
;
256 pr_debug("kfd: PQM done creating queue\n");
257 print_queue_properties(properties
);
265 /* check if queues list is empty unregister process from device */
266 clear_bit(*qid
, pqm
->queue_slot_bitmap
);
267 if (list_empty(&pqm
->queues
))
268 dev
->dqm
->ops
.unregister_process(dev
->dqm
, &pdd
->qpd
);
272 int pqm_destroy_queue(struct process_queue_manager
*pqm
, unsigned int qid
)
274 struct process_queue_node
*pqn
;
275 struct kfd_process_device
*pdd
;
276 struct device_queue_manager
*dqm
;
285 pr_debug("kfd: In Func %s\n", __func__
);
287 pqn
= get_queue_by_qid(pqm
, qid
);
289 pr_err("kfd: queue id does not match any known queue\n");
297 dev
= pqn
->q
->device
;
300 pdd
= kfd_get_process_device_data(dev
, pqm
->process
);
302 pr_err("Process device data doesn't exist\n");
307 /* destroy kernel queue (DIQ) */
308 dqm
= pqn
->kq
->dev
->dqm
;
309 dqm
->ops
.destroy_kernel_queue(dqm
, pqn
->kq
, &pdd
->qpd
);
310 kernel_queue_uninit(pqn
->kq
);
314 dqm
= pqn
->q
->device
->dqm
;
315 retval
= dqm
->ops
.destroy_queue(dqm
, &pdd
->qpd
, pqn
->q
);
319 uninit_queue(pqn
->q
);
322 list_del(&pqn
->process_queue_list
);
324 clear_bit(qid
, pqm
->queue_slot_bitmap
);
326 if (list_empty(&pqm
->queues
))
327 dqm
->ops
.unregister_process(dqm
, &pdd
->qpd
);
332 int pqm_update_queue(struct process_queue_manager
*pqm
, unsigned int qid
,
333 struct queue_properties
*p
)
336 struct process_queue_node
*pqn
;
340 pqn
= get_queue_by_qid(pqm
, qid
);
342 pr_debug("amdkfd: No queue %d exists for update operation\n",
347 pqn
->q
->properties
.queue_address
= p
->queue_address
;
348 pqn
->q
->properties
.queue_size
= p
->queue_size
;
349 pqn
->q
->properties
.queue_percent
= p
->queue_percent
;
350 pqn
->q
->properties
.priority
= p
->priority
;
352 retval
= pqn
->q
->device
->dqm
->ops
.update_queue(pqn
->q
->device
->dqm
,
360 struct kernel_queue
*pqm_get_kernel_queue(
361 struct process_queue_manager
*pqm
,
364 struct process_queue_node
*pqn
;
368 pqn
= get_queue_by_qid(pqm
, qid
);