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/ratelimit.h>
25 #include <linux/printk.h>
26 #include <linux/slab.h>
27 #include <linux/list.h>
28 #include <linux/types.h>
29 #include <linux/bitops.h>
30 #include <linux/sched.h>
32 #include "kfd_device_queue_manager.h"
33 #include "kfd_mqd_manager.h"
35 #include "kfd_kernel_queue.h"
36 #include "amdgpu_amdkfd.h"
38 /* Size of the per-pipe EOP queue */
39 #define CIK_HPD_EOP_BYTES_LOG2 11
40 #define CIK_HPD_EOP_BYTES (1U << CIK_HPD_EOP_BYTES_LOG2)
42 static int set_pasid_vmid_mapping(struct device_queue_manager
*dqm
,
43 u32 pasid
, unsigned int vmid
);
45 static int execute_queues_cpsch(struct device_queue_manager
*dqm
,
46 enum kfd_unmap_queues_filter filter
,
47 uint32_t filter_param
);
48 static int unmap_queues_cpsch(struct device_queue_manager
*dqm
,
49 enum kfd_unmap_queues_filter filter
,
50 uint32_t filter_param
);
52 static int map_queues_cpsch(struct device_queue_manager
*dqm
);
54 static void deallocate_sdma_queue(struct device_queue_manager
*dqm
,
57 static inline void deallocate_hqd(struct device_queue_manager
*dqm
,
59 static int allocate_hqd(struct device_queue_manager
*dqm
, struct queue
*q
);
60 static int allocate_sdma_queue(struct device_queue_manager
*dqm
,
62 static void kfd_process_hw_exception(struct work_struct
*work
);
65 enum KFD_MQD_TYPE
get_mqd_type_from_queue_type(enum kfd_queue_type type
)
67 if (type
== KFD_QUEUE_TYPE_SDMA
|| type
== KFD_QUEUE_TYPE_SDMA_XGMI
)
68 return KFD_MQD_TYPE_SDMA
;
69 return KFD_MQD_TYPE_CP
;
72 static bool is_pipe_enabled(struct device_queue_manager
*dqm
, int mec
, int pipe
)
75 int pipe_offset
= (mec
* dqm
->dev
->shared_resources
.num_pipe_per_mec
76 + pipe
) * dqm
->dev
->shared_resources
.num_queue_per_pipe
;
78 /* queue is available for KFD usage if bit is 1 */
79 for (i
= 0; i
< dqm
->dev
->shared_resources
.num_queue_per_pipe
; ++i
)
80 if (test_bit(pipe_offset
+ i
,
81 dqm
->dev
->shared_resources
.cp_queue_bitmap
))
86 unsigned int get_cp_queues_num(struct device_queue_manager
*dqm
)
88 return bitmap_weight(dqm
->dev
->shared_resources
.cp_queue_bitmap
,
92 unsigned int get_queues_per_pipe(struct device_queue_manager
*dqm
)
94 return dqm
->dev
->shared_resources
.num_queue_per_pipe
;
97 unsigned int get_pipes_per_mec(struct device_queue_manager
*dqm
)
99 return dqm
->dev
->shared_resources
.num_pipe_per_mec
;
102 static unsigned int get_num_sdma_engines(struct device_queue_manager
*dqm
)
104 return dqm
->dev
->device_info
->num_sdma_engines
;
107 static unsigned int get_num_xgmi_sdma_engines(struct device_queue_manager
*dqm
)
109 return dqm
->dev
->device_info
->num_xgmi_sdma_engines
;
112 static unsigned int get_num_all_sdma_engines(struct device_queue_manager
*dqm
)
114 return get_num_sdma_engines(dqm
) + get_num_xgmi_sdma_engines(dqm
);
117 unsigned int get_num_sdma_queues(struct device_queue_manager
*dqm
)
119 return dqm
->dev
->device_info
->num_sdma_engines
120 * dqm
->dev
->device_info
->num_sdma_queues_per_engine
;
123 unsigned int get_num_xgmi_sdma_queues(struct device_queue_manager
*dqm
)
125 return dqm
->dev
->device_info
->num_xgmi_sdma_engines
126 * dqm
->dev
->device_info
->num_sdma_queues_per_engine
;
129 void program_sh_mem_settings(struct device_queue_manager
*dqm
,
130 struct qcm_process_device
*qpd
)
132 return dqm
->dev
->kfd2kgd
->program_sh_mem_settings(
133 dqm
->dev
->kgd
, qpd
->vmid
,
135 qpd
->sh_mem_ape1_base
,
136 qpd
->sh_mem_ape1_limit
,
140 static void increment_queue_count(struct device_queue_manager
*dqm
,
141 enum kfd_queue_type type
)
143 dqm
->active_queue_count
++;
144 if (type
== KFD_QUEUE_TYPE_COMPUTE
|| type
== KFD_QUEUE_TYPE_DIQ
)
145 dqm
->active_cp_queue_count
++;
148 static void decrement_queue_count(struct device_queue_manager
*dqm
,
149 enum kfd_queue_type type
)
151 dqm
->active_queue_count
--;
152 if (type
== KFD_QUEUE_TYPE_COMPUTE
|| type
== KFD_QUEUE_TYPE_DIQ
)
153 dqm
->active_cp_queue_count
--;
156 static int allocate_doorbell(struct qcm_process_device
*qpd
, struct queue
*q
)
158 struct kfd_dev
*dev
= qpd
->dqm
->dev
;
160 if (!KFD_IS_SOC15(dev
->device_info
->asic_family
)) {
161 /* On pre-SOC15 chips we need to use the queue ID to
162 * preserve the user mode ABI.
164 q
->doorbell_id
= q
->properties
.queue_id
;
165 } else if (q
->properties
.type
== KFD_QUEUE_TYPE_SDMA
||
166 q
->properties
.type
== KFD_QUEUE_TYPE_SDMA_XGMI
) {
167 /* For SDMA queues on SOC15 with 8-byte doorbell, use static
168 * doorbell assignments based on the engine and queue id.
169 * The doobell index distance between RLC (2*i) and (2*i+1)
170 * for a SDMA engine is 512.
172 uint32_t *idx_offset
=
173 dev
->shared_resources
.sdma_doorbell_idx
;
175 q
->doorbell_id
= idx_offset
[q
->properties
.sdma_engine_id
]
176 + (q
->properties
.sdma_queue_id
& 1)
177 * KFD_QUEUE_DOORBELL_MIRROR_OFFSET
178 + (q
->properties
.sdma_queue_id
>> 1);
180 /* For CP queues on SOC15 reserve a free doorbell ID */
183 found
= find_first_zero_bit(qpd
->doorbell_bitmap
,
184 KFD_MAX_NUM_OF_QUEUES_PER_PROCESS
);
185 if (found
>= KFD_MAX_NUM_OF_QUEUES_PER_PROCESS
) {
186 pr_debug("No doorbells available");
189 set_bit(found
, qpd
->doorbell_bitmap
);
190 q
->doorbell_id
= found
;
193 q
->properties
.doorbell_off
=
194 kfd_get_doorbell_dw_offset_in_bar(dev
, qpd_to_pdd(qpd
),
199 static void deallocate_doorbell(struct qcm_process_device
*qpd
,
203 struct kfd_dev
*dev
= qpd
->dqm
->dev
;
205 if (!KFD_IS_SOC15(dev
->device_info
->asic_family
) ||
206 q
->properties
.type
== KFD_QUEUE_TYPE_SDMA
||
207 q
->properties
.type
== KFD_QUEUE_TYPE_SDMA_XGMI
)
210 old
= test_and_clear_bit(q
->doorbell_id
, qpd
->doorbell_bitmap
);
214 static int allocate_vmid(struct device_queue_manager
*dqm
,
215 struct qcm_process_device
*qpd
,
218 int allocated_vmid
= -1, i
;
220 for (i
= dqm
->dev
->vm_info
.first_vmid_kfd
;
221 i
<= dqm
->dev
->vm_info
.last_vmid_kfd
; i
++) {
222 if (!dqm
->vmid_pasid
[i
]) {
228 if (allocated_vmid
< 0) {
229 pr_err("no more vmid to allocate\n");
233 pr_debug("vmid allocated: %d\n", allocated_vmid
);
235 dqm
->vmid_pasid
[allocated_vmid
] = q
->process
->pasid
;
237 set_pasid_vmid_mapping(dqm
, q
->process
->pasid
, allocated_vmid
);
239 qpd
->vmid
= allocated_vmid
;
240 q
->properties
.vmid
= allocated_vmid
;
242 program_sh_mem_settings(dqm
, qpd
);
244 /* qpd->page_table_base is set earlier when register_process()
245 * is called, i.e. when the first queue is created.
247 dqm
->dev
->kfd2kgd
->set_vm_context_page_table_base(dqm
->dev
->kgd
,
249 qpd
->page_table_base
);
250 /* invalidate the VM context after pasid and vmid mapping is set up */
251 kfd_flush_tlb(qpd_to_pdd(qpd
));
253 if (dqm
->dev
->kfd2kgd
->set_scratch_backing_va
)
254 dqm
->dev
->kfd2kgd
->set_scratch_backing_va(dqm
->dev
->kgd
,
255 qpd
->sh_hidden_private_base
, qpd
->vmid
);
260 static int flush_texture_cache_nocpsch(struct kfd_dev
*kdev
,
261 struct qcm_process_device
*qpd
)
263 const struct packet_manager_funcs
*pmf
= qpd
->dqm
->packets
.pmf
;
269 ret
= pmf
->release_mem(qpd
->ib_base
, (uint32_t *)qpd
->ib_kaddr
);
273 return amdgpu_amdkfd_submit_ib(kdev
->kgd
, KGD_ENGINE_MEC1
, qpd
->vmid
,
274 qpd
->ib_base
, (uint32_t *)qpd
->ib_kaddr
,
275 pmf
->release_mem_size
/ sizeof(uint32_t));
278 static void deallocate_vmid(struct device_queue_manager
*dqm
,
279 struct qcm_process_device
*qpd
,
282 /* On GFX v7, CP doesn't flush TC at dequeue */
283 if (q
->device
->device_info
->asic_family
== CHIP_HAWAII
)
284 if (flush_texture_cache_nocpsch(q
->device
, qpd
))
285 pr_err("Failed to flush TC\n");
287 kfd_flush_tlb(qpd_to_pdd(qpd
));
289 /* Release the vmid mapping */
290 set_pasid_vmid_mapping(dqm
, 0, qpd
->vmid
);
291 dqm
->vmid_pasid
[qpd
->vmid
] = 0;
294 q
->properties
.vmid
= 0;
297 static int create_queue_nocpsch(struct device_queue_manager
*dqm
,
299 struct qcm_process_device
*qpd
)
301 struct mqd_manager
*mqd_mgr
;
306 if (dqm
->total_queue_count
>= max_num_of_queues_per_device
) {
307 pr_warn("Can't create new usermode queue because %d queues were already created\n",
308 dqm
->total_queue_count
);
313 if (list_empty(&qpd
->queues_list
)) {
314 retval
= allocate_vmid(dqm
, qpd
, q
);
318 q
->properties
.vmid
= qpd
->vmid
;
320 * Eviction state logic: mark all queues as evicted, even ones
321 * not currently active. Restoring inactive queues later only
322 * updates the is_evicted flag but is a no-op otherwise.
324 q
->properties
.is_evicted
= !!qpd
->evicted
;
326 q
->properties
.tba_addr
= qpd
->tba_addr
;
327 q
->properties
.tma_addr
= qpd
->tma_addr
;
329 mqd_mgr
= dqm
->mqd_mgrs
[get_mqd_type_from_queue_type(
330 q
->properties
.type
)];
331 if (q
->properties
.type
== KFD_QUEUE_TYPE_COMPUTE
) {
332 retval
= allocate_hqd(dqm
, q
);
334 goto deallocate_vmid
;
335 pr_debug("Loading mqd to hqd on pipe %d, queue %d\n",
337 } else if (q
->properties
.type
== KFD_QUEUE_TYPE_SDMA
||
338 q
->properties
.type
== KFD_QUEUE_TYPE_SDMA_XGMI
) {
339 retval
= allocate_sdma_queue(dqm
, q
);
341 goto deallocate_vmid
;
342 dqm
->asic_ops
.init_sdma_vm(dqm
, q
, qpd
);
345 retval
= allocate_doorbell(qpd
, q
);
347 goto out_deallocate_hqd
;
349 /* Temporarily release dqm lock to avoid a circular lock dependency */
351 q
->mqd_mem_obj
= mqd_mgr
->allocate_mqd(mqd_mgr
->dev
, &q
->properties
);
354 if (!q
->mqd_mem_obj
) {
356 goto out_deallocate_doorbell
;
358 mqd_mgr
->init_mqd(mqd_mgr
, &q
->mqd
, q
->mqd_mem_obj
,
359 &q
->gart_mqd_addr
, &q
->properties
);
360 if (q
->properties
.is_active
) {
361 if (!dqm
->sched_running
) {
362 WARN_ONCE(1, "Load non-HWS mqd while stopped\n");
363 goto add_queue_to_list
;
366 if (WARN(q
->process
->mm
!= current
->mm
,
367 "should only run in user thread"))
370 retval
= mqd_mgr
->load_mqd(mqd_mgr
, q
->mqd
, q
->pipe
,
371 q
->queue
, &q
->properties
, current
->mm
);
377 list_add(&q
->list
, &qpd
->queues_list
);
379 if (q
->properties
.is_active
)
380 increment_queue_count(dqm
, q
->properties
.type
);
383 * Unconditionally increment this counter, regardless of the queue's
384 * type or whether the queue is active.
386 dqm
->total_queue_count
++;
387 pr_debug("Total of %d queues are accountable so far\n",
388 dqm
->total_queue_count
);
392 mqd_mgr
->free_mqd(mqd_mgr
, q
->mqd
, q
->mqd_mem_obj
);
393 out_deallocate_doorbell
:
394 deallocate_doorbell(qpd
, q
);
396 if (q
->properties
.type
== KFD_QUEUE_TYPE_COMPUTE
)
397 deallocate_hqd(dqm
, q
);
398 else if (q
->properties
.type
== KFD_QUEUE_TYPE_SDMA
||
399 q
->properties
.type
== KFD_QUEUE_TYPE_SDMA_XGMI
)
400 deallocate_sdma_queue(dqm
, q
);
402 if (list_empty(&qpd
->queues_list
))
403 deallocate_vmid(dqm
, qpd
, q
);
409 static int allocate_hqd(struct device_queue_manager
*dqm
, struct queue
*q
)
416 for (pipe
= dqm
->next_pipe_to_allocate
, i
= 0;
417 i
< get_pipes_per_mec(dqm
);
418 pipe
= ((pipe
+ 1) % get_pipes_per_mec(dqm
)), ++i
) {
420 if (!is_pipe_enabled(dqm
, 0, pipe
))
423 if (dqm
->allocated_queues
[pipe
] != 0) {
424 bit
= ffs(dqm
->allocated_queues
[pipe
]) - 1;
425 dqm
->allocated_queues
[pipe
] &= ~(1 << bit
);
436 pr_debug("hqd slot - pipe %d, queue %d\n", q
->pipe
, q
->queue
);
437 /* horizontal hqd allocation */
438 dqm
->next_pipe_to_allocate
= (pipe
+ 1) % get_pipes_per_mec(dqm
);
443 static inline void deallocate_hqd(struct device_queue_manager
*dqm
,
446 dqm
->allocated_queues
[q
->pipe
] |= (1 << q
->queue
);
449 /* Access to DQM has to be locked before calling destroy_queue_nocpsch_locked
450 * to avoid asynchronized access
452 static int destroy_queue_nocpsch_locked(struct device_queue_manager
*dqm
,
453 struct qcm_process_device
*qpd
,
457 struct mqd_manager
*mqd_mgr
;
459 mqd_mgr
= dqm
->mqd_mgrs
[get_mqd_type_from_queue_type(
460 q
->properties
.type
)];
462 if (q
->properties
.type
== KFD_QUEUE_TYPE_COMPUTE
)
463 deallocate_hqd(dqm
, q
);
464 else if (q
->properties
.type
== KFD_QUEUE_TYPE_SDMA
)
465 deallocate_sdma_queue(dqm
, q
);
466 else if (q
->properties
.type
== KFD_QUEUE_TYPE_SDMA_XGMI
)
467 deallocate_sdma_queue(dqm
, q
);
469 pr_debug("q->properties.type %d is invalid\n",
473 dqm
->total_queue_count
--;
475 deallocate_doorbell(qpd
, q
);
477 if (!dqm
->sched_running
) {
478 WARN_ONCE(1, "Destroy non-HWS queue while stopped\n");
482 retval
= mqd_mgr
->destroy_mqd(mqd_mgr
, q
->mqd
,
483 KFD_PREEMPT_TYPE_WAVEFRONT_RESET
,
484 KFD_UNMAP_LATENCY_MS
,
486 if (retval
== -ETIME
)
487 qpd
->reset_wavefronts
= true;
490 mqd_mgr
->free_mqd(mqd_mgr
, q
->mqd
, q
->mqd_mem_obj
);
493 if (list_empty(&qpd
->queues_list
)) {
494 if (qpd
->reset_wavefronts
) {
495 pr_warn("Resetting wave fronts (nocpsch) on dev %p\n",
497 /* dbgdev_wave_reset_wavefronts has to be called before
498 * deallocate_vmid(), i.e. when vmid is still in use.
500 dbgdev_wave_reset_wavefronts(dqm
->dev
,
502 qpd
->reset_wavefronts
= false;
505 deallocate_vmid(dqm
, qpd
, q
);
508 if (q
->properties
.is_active
) {
509 decrement_queue_count(dqm
, q
->properties
.type
);
510 if (q
->properties
.is_gws
) {
511 dqm
->gws_queue_count
--;
512 qpd
->mapped_gws_queue
= false;
519 static int destroy_queue_nocpsch(struct device_queue_manager
*dqm
,
520 struct qcm_process_device
*qpd
,
524 uint64_t sdma_val
= 0;
525 struct kfd_process_device
*pdd
= qpd_to_pdd(qpd
);
527 /* Get the SDMA queue stats */
528 if ((q
->properties
.type
== KFD_QUEUE_TYPE_SDMA
) ||
529 (q
->properties
.type
== KFD_QUEUE_TYPE_SDMA_XGMI
)) {
530 retval
= read_sdma_queue_counter((uint64_t __user
*)q
->properties
.read_ptr
,
533 pr_err("Failed to read SDMA queue counter for queue: %d\n",
534 q
->properties
.queue_id
);
538 retval
= destroy_queue_nocpsch_locked(dqm
, qpd
, q
);
540 pdd
->sdma_past_activity_counter
+= sdma_val
;
546 static int update_queue(struct device_queue_manager
*dqm
, struct queue
*q
)
549 struct mqd_manager
*mqd_mgr
;
550 struct kfd_process_device
*pdd
;
551 bool prev_active
= false;
554 pdd
= kfd_get_process_device_data(q
->device
, q
->process
);
559 mqd_mgr
= dqm
->mqd_mgrs
[get_mqd_type_from_queue_type(
560 q
->properties
.type
)];
562 /* Save previous activity state for counters */
563 prev_active
= q
->properties
.is_active
;
565 /* Make sure the queue is unmapped before updating the MQD */
566 if (dqm
->sched_policy
!= KFD_SCHED_POLICY_NO_HWS
) {
567 retval
= unmap_queues_cpsch(dqm
,
568 KFD_UNMAP_QUEUES_FILTER_DYNAMIC_QUEUES
, 0);
570 pr_err("unmap queue failed\n");
573 } else if (prev_active
&&
574 (q
->properties
.type
== KFD_QUEUE_TYPE_COMPUTE
||
575 q
->properties
.type
== KFD_QUEUE_TYPE_SDMA
||
576 q
->properties
.type
== KFD_QUEUE_TYPE_SDMA_XGMI
)) {
578 if (!dqm
->sched_running
) {
579 WARN_ONCE(1, "Update non-HWS queue while stopped\n");
583 retval
= mqd_mgr
->destroy_mqd(mqd_mgr
, q
->mqd
,
584 KFD_PREEMPT_TYPE_WAVEFRONT_DRAIN
,
585 KFD_UNMAP_LATENCY_MS
, q
->pipe
, q
->queue
);
587 pr_err("destroy mqd failed\n");
592 mqd_mgr
->update_mqd(mqd_mgr
, q
->mqd
, &q
->properties
);
595 * check active state vs. the previous state and modify
596 * counter accordingly. map_queues_cpsch uses the
597 * dqm->active_queue_count to determine whether a new runlist must be
600 if (q
->properties
.is_active
&& !prev_active
)
601 increment_queue_count(dqm
, q
->properties
.type
);
602 else if (!q
->properties
.is_active
&& prev_active
)
603 decrement_queue_count(dqm
, q
->properties
.type
);
605 if (q
->gws
&& !q
->properties
.is_gws
) {
606 if (q
->properties
.is_active
) {
607 dqm
->gws_queue_count
++;
608 pdd
->qpd
.mapped_gws_queue
= true;
610 q
->properties
.is_gws
= true;
611 } else if (!q
->gws
&& q
->properties
.is_gws
) {
612 if (q
->properties
.is_active
) {
613 dqm
->gws_queue_count
--;
614 pdd
->qpd
.mapped_gws_queue
= false;
616 q
->properties
.is_gws
= false;
619 if (dqm
->sched_policy
!= KFD_SCHED_POLICY_NO_HWS
)
620 retval
= map_queues_cpsch(dqm
);
621 else if (q
->properties
.is_active
&&
622 (q
->properties
.type
== KFD_QUEUE_TYPE_COMPUTE
||
623 q
->properties
.type
== KFD_QUEUE_TYPE_SDMA
||
624 q
->properties
.type
== KFD_QUEUE_TYPE_SDMA_XGMI
)) {
625 if (WARN(q
->process
->mm
!= current
->mm
,
626 "should only run in user thread"))
629 retval
= mqd_mgr
->load_mqd(mqd_mgr
, q
->mqd
,
631 &q
->properties
, current
->mm
);
639 static int evict_process_queues_nocpsch(struct device_queue_manager
*dqm
,
640 struct qcm_process_device
*qpd
)
643 struct mqd_manager
*mqd_mgr
;
644 struct kfd_process_device
*pdd
;
648 if (qpd
->evicted
++ > 0) /* already evicted, do nothing */
651 pdd
= qpd_to_pdd(qpd
);
652 pr_debug_ratelimited("Evicting PASID 0x%x queues\n",
653 pdd
->process
->pasid
);
655 pdd
->last_evict_timestamp
= get_jiffies_64();
656 /* Mark all queues as evicted. Deactivate all active queues on
659 list_for_each_entry(q
, &qpd
->queues_list
, list
) {
660 q
->properties
.is_evicted
= true;
661 if (!q
->properties
.is_active
)
664 mqd_mgr
= dqm
->mqd_mgrs
[get_mqd_type_from_queue_type(
665 q
->properties
.type
)];
666 q
->properties
.is_active
= false;
667 decrement_queue_count(dqm
, q
->properties
.type
);
668 if (q
->properties
.is_gws
) {
669 dqm
->gws_queue_count
--;
670 qpd
->mapped_gws_queue
= false;
673 if (WARN_ONCE(!dqm
->sched_running
, "Evict when stopped\n"))
676 retval
= mqd_mgr
->destroy_mqd(mqd_mgr
, q
->mqd
,
677 KFD_PREEMPT_TYPE_WAVEFRONT_DRAIN
,
678 KFD_UNMAP_LATENCY_MS
, q
->pipe
, q
->queue
);
680 /* Return the first error, but keep going to
681 * maintain a consistent eviction state
691 static int evict_process_queues_cpsch(struct device_queue_manager
*dqm
,
692 struct qcm_process_device
*qpd
)
695 struct kfd_process_device
*pdd
;
699 if (qpd
->evicted
++ > 0) /* already evicted, do nothing */
702 pdd
= qpd_to_pdd(qpd
);
703 pr_debug_ratelimited("Evicting PASID 0x%x queues\n",
704 pdd
->process
->pasid
);
706 /* Mark all queues as evicted. Deactivate all active queues on
709 list_for_each_entry(q
, &qpd
->queues_list
, list
) {
710 q
->properties
.is_evicted
= true;
711 if (!q
->properties
.is_active
)
714 q
->properties
.is_active
= false;
715 decrement_queue_count(dqm
, q
->properties
.type
);
717 pdd
->last_evict_timestamp
= get_jiffies_64();
718 retval
= execute_queues_cpsch(dqm
,
720 KFD_UNMAP_QUEUES_FILTER_ALL_QUEUES
:
721 KFD_UNMAP_QUEUES_FILTER_DYNAMIC_QUEUES
, 0);
728 static int restore_process_queues_nocpsch(struct device_queue_manager
*dqm
,
729 struct qcm_process_device
*qpd
)
731 struct mm_struct
*mm
= NULL
;
733 struct mqd_manager
*mqd_mgr
;
734 struct kfd_process_device
*pdd
;
736 uint64_t eviction_duration
;
739 pdd
= qpd_to_pdd(qpd
);
740 /* Retrieve PD base */
741 pd_base
= amdgpu_amdkfd_gpuvm_get_process_page_dir(pdd
->vm
);
744 if (WARN_ON_ONCE(!qpd
->evicted
)) /* already restored, do nothing */
746 if (qpd
->evicted
> 1) { /* ref count still > 0, decrement & quit */
751 pr_debug_ratelimited("Restoring PASID 0x%x queues\n",
752 pdd
->process
->pasid
);
754 /* Update PD Base in QPD */
755 qpd
->page_table_base
= pd_base
;
756 pr_debug("Updated PD address to 0x%llx\n", pd_base
);
758 if (!list_empty(&qpd
->queues_list
)) {
759 dqm
->dev
->kfd2kgd
->set_vm_context_page_table_base(
762 qpd
->page_table_base
);
766 /* Take a safe reference to the mm_struct, which may otherwise
767 * disappear even while the kfd_process is still referenced.
769 mm
= get_task_mm(pdd
->process
->lead_thread
);
775 /* Remove the eviction flags. Activate queues that are not
776 * inactive for other reasons.
778 list_for_each_entry(q
, &qpd
->queues_list
, list
) {
779 q
->properties
.is_evicted
= false;
780 if (!QUEUE_IS_ACTIVE(q
->properties
))
783 mqd_mgr
= dqm
->mqd_mgrs
[get_mqd_type_from_queue_type(
784 q
->properties
.type
)];
785 q
->properties
.is_active
= true;
786 increment_queue_count(dqm
, q
->properties
.type
);
787 if (q
->properties
.is_gws
) {
788 dqm
->gws_queue_count
++;
789 qpd
->mapped_gws_queue
= true;
792 if (WARN_ONCE(!dqm
->sched_running
, "Restore when stopped\n"))
795 retval
= mqd_mgr
->load_mqd(mqd_mgr
, q
->mqd
, q
->pipe
,
796 q
->queue
, &q
->properties
, mm
);
798 /* Return the first error, but keep going to
799 * maintain a consistent eviction state
804 eviction_duration
= get_jiffies_64() - pdd
->last_evict_timestamp
;
805 atomic64_add(eviction_duration
, &pdd
->evict_duration_counter
);
813 static int restore_process_queues_cpsch(struct device_queue_manager
*dqm
,
814 struct qcm_process_device
*qpd
)
817 struct kfd_process_device
*pdd
;
819 uint64_t eviction_duration
;
822 pdd
= qpd_to_pdd(qpd
);
823 /* Retrieve PD base */
824 pd_base
= amdgpu_amdkfd_gpuvm_get_process_page_dir(pdd
->vm
);
827 if (WARN_ON_ONCE(!qpd
->evicted
)) /* already restored, do nothing */
829 if (qpd
->evicted
> 1) { /* ref count still > 0, decrement & quit */
834 pr_debug_ratelimited("Restoring PASID 0x%x queues\n",
835 pdd
->process
->pasid
);
837 /* Update PD Base in QPD */
838 qpd
->page_table_base
= pd_base
;
839 pr_debug("Updated PD address to 0x%llx\n", pd_base
);
841 /* activate all active queues on the qpd */
842 list_for_each_entry(q
, &qpd
->queues_list
, list
) {
843 q
->properties
.is_evicted
= false;
844 if (!QUEUE_IS_ACTIVE(q
->properties
))
847 q
->properties
.is_active
= true;
848 increment_queue_count(dqm
, q
->properties
.type
);
850 retval
= execute_queues_cpsch(dqm
,
851 KFD_UNMAP_QUEUES_FILTER_DYNAMIC_QUEUES
, 0);
853 eviction_duration
= get_jiffies_64() - pdd
->last_evict_timestamp
;
854 atomic64_add(eviction_duration
, &pdd
->evict_duration_counter
);
860 static int register_process(struct device_queue_manager
*dqm
,
861 struct qcm_process_device
*qpd
)
863 struct device_process_node
*n
;
864 struct kfd_process_device
*pdd
;
868 n
= kzalloc(sizeof(*n
), GFP_KERNEL
);
874 pdd
= qpd_to_pdd(qpd
);
875 /* Retrieve PD base */
876 pd_base
= amdgpu_amdkfd_gpuvm_get_process_page_dir(pdd
->vm
);
879 list_add(&n
->list
, &dqm
->queues
);
881 /* Update PD Base in QPD */
882 qpd
->page_table_base
= pd_base
;
883 pr_debug("Updated PD address to 0x%llx\n", pd_base
);
885 retval
= dqm
->asic_ops
.update_qpd(dqm
, qpd
);
887 dqm
->processes_count
++;
891 /* Outside the DQM lock because under the DQM lock we can't do
892 * reclaim or take other locks that others hold while reclaiming.
894 kfd_inc_compute_active(dqm
->dev
);
899 static int unregister_process(struct device_queue_manager
*dqm
,
900 struct qcm_process_device
*qpd
)
903 struct device_process_node
*cur
, *next
;
905 pr_debug("qpd->queues_list is %s\n",
906 list_empty(&qpd
->queues_list
) ? "empty" : "not empty");
911 list_for_each_entry_safe(cur
, next
, &dqm
->queues
, list
) {
912 if (qpd
== cur
->qpd
) {
913 list_del(&cur
->list
);
915 dqm
->processes_count
--;
919 /* qpd not found in dqm list */
924 /* Outside the DQM lock because under the DQM lock we can't do
925 * reclaim or take other locks that others hold while reclaiming.
928 kfd_dec_compute_active(dqm
->dev
);
934 set_pasid_vmid_mapping(struct device_queue_manager
*dqm
, u32 pasid
,
937 return dqm
->dev
->kfd2kgd
->set_pasid_vmid_mapping(
938 dqm
->dev
->kgd
, pasid
, vmid
);
941 static void init_interrupts(struct device_queue_manager
*dqm
)
945 for (i
= 0 ; i
< get_pipes_per_mec(dqm
) ; i
++)
946 if (is_pipe_enabled(dqm
, 0, i
))
947 dqm
->dev
->kfd2kgd
->init_interrupts(dqm
->dev
->kgd
, i
);
950 static int initialize_nocpsch(struct device_queue_manager
*dqm
)
954 pr_debug("num of pipes: %d\n", get_pipes_per_mec(dqm
));
956 dqm
->allocated_queues
= kcalloc(get_pipes_per_mec(dqm
),
957 sizeof(unsigned int), GFP_KERNEL
);
958 if (!dqm
->allocated_queues
)
961 mutex_init(&dqm
->lock_hidden
);
962 INIT_LIST_HEAD(&dqm
->queues
);
963 dqm
->active_queue_count
= dqm
->next_pipe_to_allocate
= 0;
964 dqm
->active_cp_queue_count
= 0;
965 dqm
->gws_queue_count
= 0;
967 for (pipe
= 0; pipe
< get_pipes_per_mec(dqm
); pipe
++) {
968 int pipe_offset
= pipe
* get_queues_per_pipe(dqm
);
970 for (queue
= 0; queue
< get_queues_per_pipe(dqm
); queue
++)
971 if (test_bit(pipe_offset
+ queue
,
972 dqm
->dev
->shared_resources
.cp_queue_bitmap
))
973 dqm
->allocated_queues
[pipe
] |= 1 << queue
;
976 memset(dqm
->vmid_pasid
, 0, sizeof(dqm
->vmid_pasid
));
978 dqm
->sdma_bitmap
= ~0ULL >> (64 - get_num_sdma_queues(dqm
));
979 dqm
->xgmi_sdma_bitmap
= ~0ULL >> (64 - get_num_xgmi_sdma_queues(dqm
));
984 static void uninitialize(struct device_queue_manager
*dqm
)
988 WARN_ON(dqm
->active_queue_count
> 0 || dqm
->processes_count
> 0);
990 kfree(dqm
->allocated_queues
);
991 for (i
= 0 ; i
< KFD_MQD_TYPE_MAX
; i
++)
992 kfree(dqm
->mqd_mgrs
[i
]);
993 mutex_destroy(&dqm
->lock_hidden
);
996 static int start_nocpsch(struct device_queue_manager
*dqm
)
998 pr_info("SW scheduler is used");
999 init_interrupts(dqm
);
1001 if (dqm
->dev
->device_info
->asic_family
== CHIP_HAWAII
)
1002 return pm_init(&dqm
->packets
, dqm
);
1003 dqm
->sched_running
= true;
1008 static int stop_nocpsch(struct device_queue_manager
*dqm
)
1010 if (dqm
->dev
->device_info
->asic_family
== CHIP_HAWAII
)
1011 pm_uninit(&dqm
->packets
, false);
1012 dqm
->sched_running
= false;
1017 static void pre_reset(struct device_queue_manager
*dqm
)
1020 dqm
->is_resetting
= true;
1024 static int allocate_sdma_queue(struct device_queue_manager
*dqm
,
1029 if (q
->properties
.type
== KFD_QUEUE_TYPE_SDMA
) {
1030 if (dqm
->sdma_bitmap
== 0) {
1031 pr_err("No more SDMA queue to allocate\n");
1035 bit
= __ffs64(dqm
->sdma_bitmap
);
1036 dqm
->sdma_bitmap
&= ~(1ULL << bit
);
1038 q
->properties
.sdma_engine_id
= q
->sdma_id
%
1039 get_num_sdma_engines(dqm
);
1040 q
->properties
.sdma_queue_id
= q
->sdma_id
/
1041 get_num_sdma_engines(dqm
);
1042 } else if (q
->properties
.type
== KFD_QUEUE_TYPE_SDMA_XGMI
) {
1043 if (dqm
->xgmi_sdma_bitmap
== 0) {
1044 pr_err("No more XGMI SDMA queue to allocate\n");
1047 bit
= __ffs64(dqm
->xgmi_sdma_bitmap
);
1048 dqm
->xgmi_sdma_bitmap
&= ~(1ULL << bit
);
1050 /* sdma_engine_id is sdma id including
1051 * both PCIe-optimized SDMAs and XGMI-
1052 * optimized SDMAs. The calculation below
1053 * assumes the first N engines are always
1054 * PCIe-optimized ones
1056 q
->properties
.sdma_engine_id
= get_num_sdma_engines(dqm
) +
1057 q
->sdma_id
% get_num_xgmi_sdma_engines(dqm
);
1058 q
->properties
.sdma_queue_id
= q
->sdma_id
/
1059 get_num_xgmi_sdma_engines(dqm
);
1062 pr_debug("SDMA engine id: %d\n", q
->properties
.sdma_engine_id
);
1063 pr_debug("SDMA queue id: %d\n", q
->properties
.sdma_queue_id
);
1068 static void deallocate_sdma_queue(struct device_queue_manager
*dqm
,
1071 if (q
->properties
.type
== KFD_QUEUE_TYPE_SDMA
) {
1072 if (q
->sdma_id
>= get_num_sdma_queues(dqm
))
1074 dqm
->sdma_bitmap
|= (1ULL << q
->sdma_id
);
1075 } else if (q
->properties
.type
== KFD_QUEUE_TYPE_SDMA_XGMI
) {
1076 if (q
->sdma_id
>= get_num_xgmi_sdma_queues(dqm
))
1078 dqm
->xgmi_sdma_bitmap
|= (1ULL << q
->sdma_id
);
1083 * Device Queue Manager implementation for cp scheduler
1086 static int set_sched_resources(struct device_queue_manager
*dqm
)
1089 struct scheduling_resources res
;
1091 res
.vmid_mask
= dqm
->dev
->shared_resources
.compute_vmid_bitmap
;
1094 for (i
= 0; i
< KGD_MAX_QUEUES
; ++i
) {
1095 mec
= (i
/ dqm
->dev
->shared_resources
.num_queue_per_pipe
)
1096 / dqm
->dev
->shared_resources
.num_pipe_per_mec
;
1098 if (!test_bit(i
, dqm
->dev
->shared_resources
.cp_queue_bitmap
))
1101 /* only acquire queues from the first MEC */
1105 /* This situation may be hit in the future if a new HW
1106 * generation exposes more than 64 queues. If so, the
1107 * definition of res.queue_mask needs updating
1109 if (WARN_ON(i
>= (sizeof(res
.queue_mask
)*8))) {
1110 pr_err("Invalid queue enabled by amdgpu: %d\n", i
);
1114 res
.queue_mask
|= 1ull
1115 << amdgpu_queue_mask_bit_to_set_resource_bit(
1116 (struct amdgpu_device
*)dqm
->dev
->kgd
, i
);
1118 res
.gws_mask
= ~0ull;
1119 res
.oac_mask
= res
.gds_heap_base
= res
.gds_heap_size
= 0;
1121 pr_debug("Scheduling resources:\n"
1122 "vmid mask: 0x%8X\n"
1123 "queue mask: 0x%8llX\n",
1124 res
.vmid_mask
, res
.queue_mask
);
1126 return pm_send_set_resources(&dqm
->packets
, &res
);
1129 static int initialize_cpsch(struct device_queue_manager
*dqm
)
1131 pr_debug("num of pipes: %d\n", get_pipes_per_mec(dqm
));
1133 mutex_init(&dqm
->lock_hidden
);
1134 INIT_LIST_HEAD(&dqm
->queues
);
1135 dqm
->active_queue_count
= dqm
->processes_count
= 0;
1136 dqm
->active_cp_queue_count
= 0;
1137 dqm
->gws_queue_count
= 0;
1138 dqm
->active_runlist
= false;
1139 dqm
->sdma_bitmap
= ~0ULL >> (64 - get_num_sdma_queues(dqm
));
1140 dqm
->xgmi_sdma_bitmap
= ~0ULL >> (64 - get_num_xgmi_sdma_queues(dqm
));
1142 INIT_WORK(&dqm
->hw_exception_work
, kfd_process_hw_exception
);
1147 static int start_cpsch(struct device_queue_manager
*dqm
)
1153 retval
= pm_init(&dqm
->packets
, dqm
);
1155 goto fail_packet_manager_init
;
1157 retval
= set_sched_resources(dqm
);
1159 goto fail_set_sched_resources
;
1161 pr_debug("Allocating fence memory\n");
1163 /* allocate fence memory on the gart */
1164 retval
= kfd_gtt_sa_allocate(dqm
->dev
, sizeof(*dqm
->fence_addr
),
1168 goto fail_allocate_vidmem
;
1170 dqm
->fence_addr
= dqm
->fence_mem
->cpu_ptr
;
1171 dqm
->fence_gpu_addr
= dqm
->fence_mem
->gpu_addr
;
1173 init_interrupts(dqm
);
1176 /* clear hang status when driver try to start the hw scheduler */
1177 dqm
->is_hws_hang
= false;
1178 dqm
->is_resetting
= false;
1179 dqm
->sched_running
= true;
1180 execute_queues_cpsch(dqm
, KFD_UNMAP_QUEUES_FILTER_DYNAMIC_QUEUES
, 0);
1184 fail_allocate_vidmem
:
1185 fail_set_sched_resources
:
1186 pm_uninit(&dqm
->packets
, false);
1187 fail_packet_manager_init
:
1191 static int stop_cpsch(struct device_queue_manager
*dqm
)
1196 if (!dqm
->is_hws_hang
)
1197 unmap_queues_cpsch(dqm
, KFD_UNMAP_QUEUES_FILTER_ALL_QUEUES
, 0);
1198 hanging
= dqm
->is_hws_hang
|| dqm
->is_resetting
;
1199 dqm
->sched_running
= false;
1202 pm_release_ib(&dqm
->packets
);
1204 kfd_gtt_sa_free(dqm
->dev
, dqm
->fence_mem
);
1205 pm_uninit(&dqm
->packets
, hanging
);
1210 static int create_kernel_queue_cpsch(struct device_queue_manager
*dqm
,
1211 struct kernel_queue
*kq
,
1212 struct qcm_process_device
*qpd
)
1215 if (dqm
->total_queue_count
>= max_num_of_queues_per_device
) {
1216 pr_warn("Can't create new kernel queue because %d queues were already created\n",
1217 dqm
->total_queue_count
);
1223 * Unconditionally increment this counter, regardless of the queue's
1224 * type or whether the queue is active.
1226 dqm
->total_queue_count
++;
1227 pr_debug("Total of %d queues are accountable so far\n",
1228 dqm
->total_queue_count
);
1230 list_add(&kq
->list
, &qpd
->priv_queue_list
);
1231 increment_queue_count(dqm
, kq
->queue
->properties
.type
);
1232 qpd
->is_debug
= true;
1233 execute_queues_cpsch(dqm
, KFD_UNMAP_QUEUES_FILTER_DYNAMIC_QUEUES
, 0);
1239 static void destroy_kernel_queue_cpsch(struct device_queue_manager
*dqm
,
1240 struct kernel_queue
*kq
,
1241 struct qcm_process_device
*qpd
)
1244 list_del(&kq
->list
);
1245 decrement_queue_count(dqm
, kq
->queue
->properties
.type
);
1246 qpd
->is_debug
= false;
1247 execute_queues_cpsch(dqm
, KFD_UNMAP_QUEUES_FILTER_ALL_QUEUES
, 0);
1249 * Unconditionally decrement this counter, regardless of the queue's
1252 dqm
->total_queue_count
--;
1253 pr_debug("Total of %d queues are accountable so far\n",
1254 dqm
->total_queue_count
);
1258 static int create_queue_cpsch(struct device_queue_manager
*dqm
, struct queue
*q
,
1259 struct qcm_process_device
*qpd
)
1262 struct mqd_manager
*mqd_mgr
;
1264 if (dqm
->total_queue_count
>= max_num_of_queues_per_device
) {
1265 pr_warn("Can't create new usermode queue because %d queues were already created\n",
1266 dqm
->total_queue_count
);
1271 if (q
->properties
.type
== KFD_QUEUE_TYPE_SDMA
||
1272 q
->properties
.type
== KFD_QUEUE_TYPE_SDMA_XGMI
) {
1274 retval
= allocate_sdma_queue(dqm
, q
);
1280 retval
= allocate_doorbell(qpd
, q
);
1282 goto out_deallocate_sdma_queue
;
1284 mqd_mgr
= dqm
->mqd_mgrs
[get_mqd_type_from_queue_type(
1285 q
->properties
.type
)];
1287 if (q
->properties
.type
== KFD_QUEUE_TYPE_SDMA
||
1288 q
->properties
.type
== KFD_QUEUE_TYPE_SDMA_XGMI
)
1289 dqm
->asic_ops
.init_sdma_vm(dqm
, q
, qpd
);
1290 q
->properties
.tba_addr
= qpd
->tba_addr
;
1291 q
->properties
.tma_addr
= qpd
->tma_addr
;
1292 q
->mqd_mem_obj
= mqd_mgr
->allocate_mqd(mqd_mgr
->dev
, &q
->properties
);
1293 if (!q
->mqd_mem_obj
) {
1295 goto out_deallocate_doorbell
;
1300 * Eviction state logic: mark all queues as evicted, even ones
1301 * not currently active. Restoring inactive queues later only
1302 * updates the is_evicted flag but is a no-op otherwise.
1304 q
->properties
.is_evicted
= !!qpd
->evicted
;
1305 mqd_mgr
->init_mqd(mqd_mgr
, &q
->mqd
, q
->mqd_mem_obj
,
1306 &q
->gart_mqd_addr
, &q
->properties
);
1308 list_add(&q
->list
, &qpd
->queues_list
);
1311 if (q
->properties
.is_active
) {
1312 increment_queue_count(dqm
, q
->properties
.type
);
1314 execute_queues_cpsch(dqm
,
1315 KFD_UNMAP_QUEUES_FILTER_DYNAMIC_QUEUES
, 0);
1319 * Unconditionally increment this counter, regardless of the queue's
1320 * type or whether the queue is active.
1322 dqm
->total_queue_count
++;
1324 pr_debug("Total of %d queues are accountable so far\n",
1325 dqm
->total_queue_count
);
1330 out_deallocate_doorbell
:
1331 deallocate_doorbell(qpd
, q
);
1332 out_deallocate_sdma_queue
:
1333 if (q
->properties
.type
== KFD_QUEUE_TYPE_SDMA
||
1334 q
->properties
.type
== KFD_QUEUE_TYPE_SDMA_XGMI
) {
1336 deallocate_sdma_queue(dqm
, q
);
1343 int amdkfd_fence_wait_timeout(unsigned int *fence_addr
,
1344 unsigned int fence_value
,
1345 unsigned int timeout_ms
)
1347 unsigned long end_jiffies
= msecs_to_jiffies(timeout_ms
) + jiffies
;
1349 while (*fence_addr
!= fence_value
) {
1350 if (time_after(jiffies
, end_jiffies
)) {
1351 pr_err("qcm fence wait loop timeout expired\n");
1352 /* In HWS case, this is used to halt the driver thread
1353 * in order not to mess up CP states before doing
1354 * scandumps for FW debugging.
1356 while (halt_if_hws_hang
)
1367 /* dqm->lock mutex has to be locked before calling this function */
1368 static int map_queues_cpsch(struct device_queue_manager
*dqm
)
1372 if (!dqm
->sched_running
)
1374 if (dqm
->active_queue_count
<= 0 || dqm
->processes_count
<= 0)
1376 if (dqm
->active_runlist
)
1379 retval
= pm_send_runlist(&dqm
->packets
, &dqm
->queues
);
1380 pr_debug("%s sent runlist\n", __func__
);
1382 pr_err("failed to execute runlist\n");
1385 dqm
->active_runlist
= true;
1390 /* dqm->lock mutex has to be locked before calling this function */
1391 static int unmap_queues_cpsch(struct device_queue_manager
*dqm
,
1392 enum kfd_unmap_queues_filter filter
,
1393 uint32_t filter_param
)
1397 if (!dqm
->sched_running
)
1399 if (dqm
->is_hws_hang
)
1401 if (!dqm
->active_runlist
)
1404 retval
= pm_send_unmap_queue(&dqm
->packets
, KFD_QUEUE_TYPE_COMPUTE
,
1405 filter
, filter_param
, false, 0);
1409 *dqm
->fence_addr
= KFD_FENCE_INIT
;
1410 pm_send_query_status(&dqm
->packets
, dqm
->fence_gpu_addr
,
1411 KFD_FENCE_COMPLETED
);
1412 /* should be timed out */
1413 retval
= amdkfd_fence_wait_timeout(dqm
->fence_addr
, KFD_FENCE_COMPLETED
,
1414 queue_preemption_timeout_ms
);
1416 pr_err("The cp might be in an unrecoverable state due to an unsuccessful queues preemption\n");
1417 dqm
->is_hws_hang
= true;
1418 /* It's possible we're detecting a HWS hang in the
1419 * middle of a GPU reset. No need to schedule another
1420 * reset in this case.
1422 if (!dqm
->is_resetting
)
1423 schedule_work(&dqm
->hw_exception_work
);
1427 pm_release_ib(&dqm
->packets
);
1428 dqm
->active_runlist
= false;
1433 /* dqm->lock mutex has to be locked before calling this function */
1434 static int execute_queues_cpsch(struct device_queue_manager
*dqm
,
1435 enum kfd_unmap_queues_filter filter
,
1436 uint32_t filter_param
)
1440 if (dqm
->is_hws_hang
)
1442 retval
= unmap_queues_cpsch(dqm
, filter
, filter_param
);
1446 return map_queues_cpsch(dqm
);
1449 static int destroy_queue_cpsch(struct device_queue_manager
*dqm
,
1450 struct qcm_process_device
*qpd
,
1454 struct mqd_manager
*mqd_mgr
;
1455 uint64_t sdma_val
= 0;
1456 struct kfd_process_device
*pdd
= qpd_to_pdd(qpd
);
1458 /* Get the SDMA queue stats */
1459 if ((q
->properties
.type
== KFD_QUEUE_TYPE_SDMA
) ||
1460 (q
->properties
.type
== KFD_QUEUE_TYPE_SDMA_XGMI
)) {
1461 retval
= read_sdma_queue_counter((uint64_t __user
*)q
->properties
.read_ptr
,
1464 pr_err("Failed to read SDMA queue counter for queue: %d\n",
1465 q
->properties
.queue_id
);
1470 /* remove queue from list to prevent rescheduling after preemption */
1473 if (qpd
->is_debug
) {
1475 * error, currently we do not allow to destroy a queue
1476 * of a currently debugged process
1479 goto failed_try_destroy_debugged_queue
;
1483 mqd_mgr
= dqm
->mqd_mgrs
[get_mqd_type_from_queue_type(
1484 q
->properties
.type
)];
1486 deallocate_doorbell(qpd
, q
);
1488 if ((q
->properties
.type
== KFD_QUEUE_TYPE_SDMA
) ||
1489 (q
->properties
.type
== KFD_QUEUE_TYPE_SDMA_XGMI
)) {
1490 deallocate_sdma_queue(dqm
, q
);
1491 pdd
->sdma_past_activity_counter
+= sdma_val
;
1496 if (q
->properties
.is_active
) {
1497 decrement_queue_count(dqm
, q
->properties
.type
);
1498 retval
= execute_queues_cpsch(dqm
,
1499 KFD_UNMAP_QUEUES_FILTER_DYNAMIC_QUEUES
, 0);
1500 if (retval
== -ETIME
)
1501 qpd
->reset_wavefronts
= true;
1502 if (q
->properties
.is_gws
) {
1503 dqm
->gws_queue_count
--;
1504 qpd
->mapped_gws_queue
= false;
1509 * Unconditionally decrement this counter, regardless of the queue's
1512 dqm
->total_queue_count
--;
1513 pr_debug("Total of %d queues are accountable so far\n",
1514 dqm
->total_queue_count
);
1518 /* Do free_mqd after dqm_unlock(dqm) to avoid circular locking */
1519 mqd_mgr
->free_mqd(mqd_mgr
, q
->mqd
, q
->mqd_mem_obj
);
1523 failed_try_destroy_debugged_queue
:
1530 * Low bits must be 0000/FFFF as required by HW, high bits must be 0 to
1531 * stay in user mode.
1533 #define APE1_FIXED_BITS_MASK 0xFFFF80000000FFFFULL
1534 /* APE1 limit is inclusive and 64K aligned. */
1535 #define APE1_LIMIT_ALIGNMENT 0xFFFF
1537 static bool set_cache_memory_policy(struct device_queue_manager
*dqm
,
1538 struct qcm_process_device
*qpd
,
1539 enum cache_policy default_policy
,
1540 enum cache_policy alternate_policy
,
1541 void __user
*alternate_aperture_base
,
1542 uint64_t alternate_aperture_size
)
1546 if (!dqm
->asic_ops
.set_cache_memory_policy
)
1551 if (alternate_aperture_size
== 0) {
1552 /* base > limit disables APE1 */
1553 qpd
->sh_mem_ape1_base
= 1;
1554 qpd
->sh_mem_ape1_limit
= 0;
1557 * In FSA64, APE1_Base[63:0] = { 16{SH_MEM_APE1_BASE[31]},
1558 * SH_MEM_APE1_BASE[31:0], 0x0000 }
1559 * APE1_Limit[63:0] = { 16{SH_MEM_APE1_LIMIT[31]},
1560 * SH_MEM_APE1_LIMIT[31:0], 0xFFFF }
1561 * Verify that the base and size parameters can be
1562 * represented in this format and convert them.
1563 * Additionally restrict APE1 to user-mode addresses.
1566 uint64_t base
= (uintptr_t)alternate_aperture_base
;
1567 uint64_t limit
= base
+ alternate_aperture_size
- 1;
1569 if (limit
<= base
|| (base
& APE1_FIXED_BITS_MASK
) != 0 ||
1570 (limit
& APE1_FIXED_BITS_MASK
) != APE1_LIMIT_ALIGNMENT
) {
1575 qpd
->sh_mem_ape1_base
= base
>> 16;
1576 qpd
->sh_mem_ape1_limit
= limit
>> 16;
1579 retval
= dqm
->asic_ops
.set_cache_memory_policy(
1584 alternate_aperture_base
,
1585 alternate_aperture_size
);
1587 if ((dqm
->sched_policy
== KFD_SCHED_POLICY_NO_HWS
) && (qpd
->vmid
!= 0))
1588 program_sh_mem_settings(dqm
, qpd
);
1590 pr_debug("sh_mem_config: 0x%x, ape1_base: 0x%x, ape1_limit: 0x%x\n",
1591 qpd
->sh_mem_config
, qpd
->sh_mem_ape1_base
,
1592 qpd
->sh_mem_ape1_limit
);
1599 static int set_trap_handler(struct device_queue_manager
*dqm
,
1600 struct qcm_process_device
*qpd
,
1606 if (dqm
->dev
->cwsr_enabled
) {
1607 /* Jump from CWSR trap handler to user trap */
1608 tma
= (uint64_t *)(qpd
->cwsr_kaddr
+ KFD_CWSR_TMA_OFFSET
);
1612 qpd
->tba_addr
= tba_addr
;
1613 qpd
->tma_addr
= tma_addr
;
1619 static int process_termination_nocpsch(struct device_queue_manager
*dqm
,
1620 struct qcm_process_device
*qpd
)
1622 struct queue
*q
, *next
;
1623 struct device_process_node
*cur
, *next_dpn
;
1629 /* Clear all user mode queues */
1630 list_for_each_entry_safe(q
, next
, &qpd
->queues_list
, list
) {
1633 ret
= destroy_queue_nocpsch_locked(dqm
, qpd
, q
);
1638 /* Unregister process */
1639 list_for_each_entry_safe(cur
, next_dpn
, &dqm
->queues
, list
) {
1640 if (qpd
== cur
->qpd
) {
1641 list_del(&cur
->list
);
1643 dqm
->processes_count
--;
1651 /* Outside the DQM lock because under the DQM lock we can't do
1652 * reclaim or take other locks that others hold while reclaiming.
1655 kfd_dec_compute_active(dqm
->dev
);
1660 static int get_wave_state(struct device_queue_manager
*dqm
,
1662 void __user
*ctl_stack
,
1663 u32
*ctl_stack_used_size
,
1664 u32
*save_area_used_size
)
1666 struct mqd_manager
*mqd_mgr
;
1671 if (q
->properties
.type
!= KFD_QUEUE_TYPE_COMPUTE
||
1672 q
->properties
.is_active
|| !q
->device
->cwsr_enabled
) {
1677 mqd_mgr
= dqm
->mqd_mgrs
[KFD_MQD_TYPE_CP
];
1679 if (!mqd_mgr
->get_wave_state
) {
1684 r
= mqd_mgr
->get_wave_state(mqd_mgr
, q
->mqd
, ctl_stack
,
1685 ctl_stack_used_size
, save_area_used_size
);
1692 static int process_termination_cpsch(struct device_queue_manager
*dqm
,
1693 struct qcm_process_device
*qpd
)
1696 struct queue
*q
, *next
;
1697 struct kernel_queue
*kq
, *kq_next
;
1698 struct mqd_manager
*mqd_mgr
;
1699 struct device_process_node
*cur
, *next_dpn
;
1700 enum kfd_unmap_queues_filter filter
=
1701 KFD_UNMAP_QUEUES_FILTER_DYNAMIC_QUEUES
;
1708 /* Clean all kernel queues */
1709 list_for_each_entry_safe(kq
, kq_next
, &qpd
->priv_queue_list
, list
) {
1710 list_del(&kq
->list
);
1711 decrement_queue_count(dqm
, kq
->queue
->properties
.type
);
1712 qpd
->is_debug
= false;
1713 dqm
->total_queue_count
--;
1714 filter
= KFD_UNMAP_QUEUES_FILTER_ALL_QUEUES
;
1717 /* Clear all user mode queues */
1718 list_for_each_entry(q
, &qpd
->queues_list
, list
) {
1719 if (q
->properties
.type
== KFD_QUEUE_TYPE_SDMA
)
1720 deallocate_sdma_queue(dqm
, q
);
1721 else if (q
->properties
.type
== KFD_QUEUE_TYPE_SDMA_XGMI
)
1722 deallocate_sdma_queue(dqm
, q
);
1724 if (q
->properties
.is_active
) {
1725 decrement_queue_count(dqm
, q
->properties
.type
);
1726 if (q
->properties
.is_gws
) {
1727 dqm
->gws_queue_count
--;
1728 qpd
->mapped_gws_queue
= false;
1732 dqm
->total_queue_count
--;
1735 /* Unregister process */
1736 list_for_each_entry_safe(cur
, next_dpn
, &dqm
->queues
, list
) {
1737 if (qpd
== cur
->qpd
) {
1738 list_del(&cur
->list
);
1740 dqm
->processes_count
--;
1746 retval
= execute_queues_cpsch(dqm
, filter
, 0);
1747 if ((!dqm
->is_hws_hang
) && (retval
|| qpd
->reset_wavefronts
)) {
1748 pr_warn("Resetting wave fronts (cpsch) on dev %p\n", dqm
->dev
);
1749 dbgdev_wave_reset_wavefronts(dqm
->dev
, qpd
->pqm
->process
);
1750 qpd
->reset_wavefronts
= false;
1755 /* Outside the DQM lock because under the DQM lock we can't do
1756 * reclaim or take other locks that others hold while reclaiming.
1759 kfd_dec_compute_active(dqm
->dev
);
1761 /* Lastly, free mqd resources.
1762 * Do free_mqd() after dqm_unlock to avoid circular locking.
1764 list_for_each_entry_safe(q
, next
, &qpd
->queues_list
, list
) {
1765 mqd_mgr
= dqm
->mqd_mgrs
[get_mqd_type_from_queue_type(
1766 q
->properties
.type
)];
1769 mqd_mgr
->free_mqd(mqd_mgr
, q
->mqd
, q
->mqd_mem_obj
);
1775 static int init_mqd_managers(struct device_queue_manager
*dqm
)
1778 struct mqd_manager
*mqd_mgr
;
1780 for (i
= 0; i
< KFD_MQD_TYPE_MAX
; i
++) {
1781 mqd_mgr
= dqm
->asic_ops
.mqd_manager_init(i
, dqm
->dev
);
1783 pr_err("mqd manager [%d] initialization failed\n", i
);
1786 dqm
->mqd_mgrs
[i
] = mqd_mgr
;
1792 for (j
= 0; j
< i
; j
++) {
1793 kfree(dqm
->mqd_mgrs
[j
]);
1794 dqm
->mqd_mgrs
[j
] = NULL
;
1800 /* Allocate one hiq mqd (HWS) and all SDMA mqd in a continuous trunk*/
1801 static int allocate_hiq_sdma_mqd(struct device_queue_manager
*dqm
)
1804 struct kfd_dev
*dev
= dqm
->dev
;
1805 struct kfd_mem_obj
*mem_obj
= &dqm
->hiq_sdma_mqd
;
1806 uint32_t size
= dqm
->mqd_mgrs
[KFD_MQD_TYPE_SDMA
]->mqd_size
*
1807 get_num_all_sdma_engines(dqm
) *
1808 dev
->device_info
->num_sdma_queues_per_engine
+
1809 dqm
->mqd_mgrs
[KFD_MQD_TYPE_HIQ
]->mqd_size
;
1811 retval
= amdgpu_amdkfd_alloc_gtt_mem(dev
->kgd
, size
,
1812 &(mem_obj
->gtt_mem
), &(mem_obj
->gpu_addr
),
1813 (void *)&(mem_obj
->cpu_ptr
), false);
1818 struct device_queue_manager
*device_queue_manager_init(struct kfd_dev
*dev
)
1820 struct device_queue_manager
*dqm
;
1822 pr_debug("Loading device queue manager\n");
1824 dqm
= kzalloc(sizeof(*dqm
), GFP_KERNEL
);
1828 switch (dev
->device_info
->asic_family
) {
1829 /* HWS is not available on Hawaii. */
1831 /* HWS depends on CWSR for timely dequeue. CWSR is not
1832 * available on Tonga.
1834 * FIXME: This argument also applies to Kaveri.
1837 dqm
->sched_policy
= KFD_SCHED_POLICY_NO_HWS
;
1840 dqm
->sched_policy
= sched_policy
;
1845 switch (dqm
->sched_policy
) {
1846 case KFD_SCHED_POLICY_HWS
:
1847 case KFD_SCHED_POLICY_HWS_NO_OVERSUBSCRIPTION
:
1848 /* initialize dqm for cp scheduling */
1849 dqm
->ops
.create_queue
= create_queue_cpsch
;
1850 dqm
->ops
.initialize
= initialize_cpsch
;
1851 dqm
->ops
.start
= start_cpsch
;
1852 dqm
->ops
.stop
= stop_cpsch
;
1853 dqm
->ops
.pre_reset
= pre_reset
;
1854 dqm
->ops
.destroy_queue
= destroy_queue_cpsch
;
1855 dqm
->ops
.update_queue
= update_queue
;
1856 dqm
->ops
.register_process
= register_process
;
1857 dqm
->ops
.unregister_process
= unregister_process
;
1858 dqm
->ops
.uninitialize
= uninitialize
;
1859 dqm
->ops
.create_kernel_queue
= create_kernel_queue_cpsch
;
1860 dqm
->ops
.destroy_kernel_queue
= destroy_kernel_queue_cpsch
;
1861 dqm
->ops
.set_cache_memory_policy
= set_cache_memory_policy
;
1862 dqm
->ops
.set_trap_handler
= set_trap_handler
;
1863 dqm
->ops
.process_termination
= process_termination_cpsch
;
1864 dqm
->ops
.evict_process_queues
= evict_process_queues_cpsch
;
1865 dqm
->ops
.restore_process_queues
= restore_process_queues_cpsch
;
1866 dqm
->ops
.get_wave_state
= get_wave_state
;
1868 case KFD_SCHED_POLICY_NO_HWS
:
1869 /* initialize dqm for no cp scheduling */
1870 dqm
->ops
.start
= start_nocpsch
;
1871 dqm
->ops
.stop
= stop_nocpsch
;
1872 dqm
->ops
.pre_reset
= pre_reset
;
1873 dqm
->ops
.create_queue
= create_queue_nocpsch
;
1874 dqm
->ops
.destroy_queue
= destroy_queue_nocpsch
;
1875 dqm
->ops
.update_queue
= update_queue
;
1876 dqm
->ops
.register_process
= register_process
;
1877 dqm
->ops
.unregister_process
= unregister_process
;
1878 dqm
->ops
.initialize
= initialize_nocpsch
;
1879 dqm
->ops
.uninitialize
= uninitialize
;
1880 dqm
->ops
.set_cache_memory_policy
= set_cache_memory_policy
;
1881 dqm
->ops
.set_trap_handler
= set_trap_handler
;
1882 dqm
->ops
.process_termination
= process_termination_nocpsch
;
1883 dqm
->ops
.evict_process_queues
= evict_process_queues_nocpsch
;
1884 dqm
->ops
.restore_process_queues
=
1885 restore_process_queues_nocpsch
;
1886 dqm
->ops
.get_wave_state
= get_wave_state
;
1889 pr_err("Invalid scheduling policy %d\n", dqm
->sched_policy
);
1893 switch (dev
->device_info
->asic_family
) {
1895 device_queue_manager_init_vi(&dqm
->asic_ops
);
1899 device_queue_manager_init_cik(&dqm
->asic_ops
);
1903 device_queue_manager_init_cik_hawaii(&dqm
->asic_ops
);
1908 case CHIP_POLARIS10
:
1909 case CHIP_POLARIS11
:
1910 case CHIP_POLARIS12
:
1912 device_queue_manager_init_vi_tonga(&dqm
->asic_ops
);
1921 device_queue_manager_init_v9(&dqm
->asic_ops
);
1926 case CHIP_SIENNA_CICHLID
:
1927 case CHIP_NAVY_FLOUNDER
:
1929 case CHIP_DIMGREY_CAVEFISH
:
1930 device_queue_manager_init_v10_navi10(&dqm
->asic_ops
);
1933 WARN(1, "Unexpected ASIC family %u",
1934 dev
->device_info
->asic_family
);
1938 if (init_mqd_managers(dqm
))
1941 if (allocate_hiq_sdma_mqd(dqm
)) {
1942 pr_err("Failed to allocate hiq sdma mqd trunk buffer\n");
1946 if (!dqm
->ops
.initialize(dqm
))
1954 static void deallocate_hiq_sdma_mqd(struct kfd_dev
*dev
,
1955 struct kfd_mem_obj
*mqd
)
1957 WARN(!mqd
, "No hiq sdma mqd trunk to free");
1959 amdgpu_amdkfd_free_gtt_mem(dev
->kgd
, mqd
->gtt_mem
);
1962 void device_queue_manager_uninit(struct device_queue_manager
*dqm
)
1964 dqm
->ops
.uninitialize(dqm
);
1965 deallocate_hiq_sdma_mqd(dqm
->dev
, &dqm
->hiq_sdma_mqd
);
1969 int kfd_process_vm_fault(struct device_queue_manager
*dqm
, u32 pasid
)
1971 struct kfd_process_device
*pdd
;
1972 struct kfd_process
*p
= kfd_lookup_process_by_pasid(pasid
);
1977 WARN(debug_evictions
, "Evicting pid %d", p
->lead_thread
->pid
);
1978 pdd
= kfd_get_process_device_data(dqm
->dev
, p
);
1980 ret
= dqm
->ops
.evict_process_queues(dqm
, &pdd
->qpd
);
1981 kfd_unref_process(p
);
1986 static void kfd_process_hw_exception(struct work_struct
*work
)
1988 struct device_queue_manager
*dqm
= container_of(work
,
1989 struct device_queue_manager
, hw_exception_work
);
1990 amdgpu_amdkfd_gpu_reset(dqm
->dev
->kgd
);
1993 #if defined(CONFIG_DEBUG_FS)
1995 static void seq_reg_dump(struct seq_file
*m
,
1996 uint32_t (*dump
)[2], uint32_t n_regs
)
2000 for (i
= 0, count
= 0; i
< n_regs
; i
++) {
2002 dump
[i
-1][0] + sizeof(uint32_t) != dump
[i
][0]) {
2003 seq_printf(m
, "%s %08x: %08x",
2005 dump
[i
][0], dump
[i
][1]);
2008 seq_printf(m
, " %08x", dump
[i
][1]);
2016 int dqm_debugfs_hqds(struct seq_file
*m
, void *data
)
2018 struct device_queue_manager
*dqm
= data
;
2019 uint32_t (*dump
)[2], n_regs
;
2023 if (!dqm
->sched_running
) {
2024 seq_printf(m
, " Device is stopped\n");
2029 r
= dqm
->dev
->kfd2kgd
->hqd_dump(dqm
->dev
->kgd
,
2030 KFD_CIK_HIQ_PIPE
, KFD_CIK_HIQ_QUEUE
,
2033 seq_printf(m
, " HIQ on MEC %d Pipe %d Queue %d\n",
2034 KFD_CIK_HIQ_PIPE
/get_pipes_per_mec(dqm
)+1,
2035 KFD_CIK_HIQ_PIPE
%get_pipes_per_mec(dqm
),
2037 seq_reg_dump(m
, dump
, n_regs
);
2042 for (pipe
= 0; pipe
< get_pipes_per_mec(dqm
); pipe
++) {
2043 int pipe_offset
= pipe
* get_queues_per_pipe(dqm
);
2045 for (queue
= 0; queue
< get_queues_per_pipe(dqm
); queue
++) {
2046 if (!test_bit(pipe_offset
+ queue
,
2047 dqm
->dev
->shared_resources
.cp_queue_bitmap
))
2050 r
= dqm
->dev
->kfd2kgd
->hqd_dump(
2051 dqm
->dev
->kgd
, pipe
, queue
, &dump
, &n_regs
);
2055 seq_printf(m
, " CP Pipe %d, Queue %d\n",
2057 seq_reg_dump(m
, dump
, n_regs
);
2063 for (pipe
= 0; pipe
< get_num_all_sdma_engines(dqm
); pipe
++) {
2065 queue
< dqm
->dev
->device_info
->num_sdma_queues_per_engine
;
2067 r
= dqm
->dev
->kfd2kgd
->hqd_sdma_dump(
2068 dqm
->dev
->kgd
, pipe
, queue
, &dump
, &n_regs
);
2072 seq_printf(m
, " SDMA Engine %d, RLC %d\n",
2074 seq_reg_dump(m
, dump
, n_regs
);
2083 int dqm_debugfs_execute_queues(struct device_queue_manager
*dqm
)
2088 dqm
->active_runlist
= true;
2089 r
= execute_queues_cpsch(dqm
, KFD_UNMAP_QUEUES_FILTER_ALL_QUEUES
, 0);