1 // SPDX-License-Identifier: GPL-2.0 OR MIT 2 /* 3 * Copyright 2016-2022 Advanced Micro Devices, Inc. 4 * 5 * Permission is hereby granted, free of charge, to any person obtaining a 6 * copy of this software and associated documentation files (the "Software"), 7 * to deal in the Software without restriction, including without limitation 8 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 9 * and/or sell copies of the Software, and to permit persons to whom the 10 * Software is furnished to do so, subject to the following conditions: 11 * 12 * The above copyright notice and this permission notice shall be included in 13 * all copies or substantial portions of the Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 19 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 20 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 21 * OTHER DEALINGS IN THE SOFTWARE. 22 * 23 */ 24 25 #include <linux/printk.h> 26 #include <linux/slab.h> 27 #include <linux/uaccess.h> 28 #include "kfd_priv.h" 29 #include "kfd_mqd_manager.h" 30 #include "kfd_topology.h" 31 #include "v9_structs.h" 32 #include "gc/gc_9_0_offset.h" 33 #include "gc/gc_9_0_sh_mask.h" 34 #include "sdma0/sdma0_4_0_sh_mask.h" 35 #include "amdgpu_amdkfd.h" 36 #include "kfd_device_queue_manager.h" 37 38 static void update_mqd(struct mqd_manager *mm, void *mqd, 39 struct queue_properties *q, 40 struct mqd_update_info *minfo); 41 42 static uint64_t mqd_stride_v9(struct mqd_manager *mm, 43 struct queue_properties *q) 44 { 45 if (mm->dev->kfd->cwsr_enabled && 46 q->type == KFD_QUEUE_TYPE_COMPUTE) { 47 48 /* On gfxv9, the MQD resides in the first 4K page, 49 * followed by the control stack. Align both to 50 * AMDGPU_GPU_PAGE_SIZE to maintain the required 4K boundary. 51 */ 52 53 return ALIGN(ALIGN(q->ctl_stack_size, AMDGPU_GPU_PAGE_SIZE) + 54 ALIGN(sizeof(struct v9_mqd), AMDGPU_GPU_PAGE_SIZE), PAGE_SIZE); 55 } 56 57 return mm->mqd_size; 58 } 59 60 static inline struct v9_mqd *get_mqd(void *mqd) 61 { 62 return (struct v9_mqd *)mqd; 63 } 64 65 static inline struct v9_sdma_mqd *get_sdma_mqd(void *mqd) 66 { 67 return (struct v9_sdma_mqd *)mqd; 68 } 69 70 static void update_cu_mask(struct mqd_manager *mm, void *mqd, 71 struct mqd_update_info *minfo, uint32_t inst) 72 { 73 struct v9_mqd *m; 74 uint32_t se_mask[KFD_MAX_NUM_SE] = {0}; 75 76 if (!minfo || !minfo->cu_mask.ptr) 77 return; 78 79 mqd_symmetrically_map_cu_mask(mm, 80 minfo->cu_mask.ptr, minfo->cu_mask.count, se_mask, inst); 81 82 m = get_mqd(mqd); 83 84 m->compute_static_thread_mgmt_se0 = se_mask[0]; 85 m->compute_static_thread_mgmt_se1 = se_mask[1]; 86 m->compute_static_thread_mgmt_se2 = se_mask[2]; 87 m->compute_static_thread_mgmt_se3 = se_mask[3]; 88 if (KFD_GC_VERSION(mm->dev) != IP_VERSION(9, 4, 3) && 89 KFD_GC_VERSION(mm->dev) != IP_VERSION(9, 4, 4) && 90 KFD_GC_VERSION(mm->dev) != IP_VERSION(9, 5, 0)) { 91 m->compute_static_thread_mgmt_se4 = se_mask[4]; 92 m->compute_static_thread_mgmt_se5 = se_mask[5]; 93 m->compute_static_thread_mgmt_se6 = se_mask[6]; 94 m->compute_static_thread_mgmt_se7 = se_mask[7]; 95 96 pr_debug("update cu mask to %#x %#x %#x %#x %#x %#x %#x %#x\n", 97 m->compute_static_thread_mgmt_se0, 98 m->compute_static_thread_mgmt_se1, 99 m->compute_static_thread_mgmt_se2, 100 m->compute_static_thread_mgmt_se3, 101 m->compute_static_thread_mgmt_se4, 102 m->compute_static_thread_mgmt_se5, 103 m->compute_static_thread_mgmt_se6, 104 m->compute_static_thread_mgmt_se7); 105 } else { 106 pr_debug("inst: %u, update cu mask to %#x %#x %#x %#x\n", 107 inst, m->compute_static_thread_mgmt_se0, 108 m->compute_static_thread_mgmt_se1, 109 m->compute_static_thread_mgmt_se2, 110 m->compute_static_thread_mgmt_se3); 111 } 112 } 113 114 static void set_priority(struct v9_mqd *m, struct queue_properties *q) 115 { 116 m->cp_hqd_pipe_priority = pipe_priority_map[q->priority]; 117 } 118 119 static bool mqd_on_vram(struct amdgpu_device *adev) 120 { 121 if (adev->apu_prefer_gtt) 122 return false; 123 124 switch (amdgpu_ip_version(adev, GC_HWIP, 0)) { 125 case IP_VERSION(9, 4, 3): 126 case IP_VERSION(9, 5, 0): 127 return true; 128 default: 129 return false; 130 } 131 } 132 133 static struct kfd_mem_obj *allocate_mqd(struct mqd_manager *mm, 134 struct queue_properties *q) 135 { 136 int retval; 137 struct kfd_node *node = mm->dev; 138 struct kfd_mem_obj *mqd_mem_obj = NULL; 139 140 /* For V9 only, due to a HW bug, the control stack of a user mode 141 * compute queue needs to be allocated just behind the page boundary 142 * of its regular MQD buffer. So we allocate an enlarged MQD buffer: 143 * the first page of the buffer serves as the regular MQD buffer 144 * purpose and the remaining is for control stack. Although the two 145 * parts are in the same buffer object, they need different memory 146 * types: MQD part needs UC (uncached) as usual, while control stack 147 * needs NC (non coherent), which is different from the UC type which 148 * is used when control stack is allocated in user space. 149 * 150 * Because of all those, we use the gtt allocation function instead 151 * of sub-allocation function for this enlarged MQD buffer. Moreover, 152 * in order to achieve two memory types in a single buffer object, we 153 * pass a special bo flag AMDGPU_GEM_CREATE_CP_MQD_GFX9 to instruct 154 * amdgpu memory functions to do so. 155 */ 156 if (node->kfd->cwsr_enabled && (q->type == KFD_QUEUE_TYPE_COMPUTE)) { 157 mqd_mem_obj = kzalloc_obj(struct kfd_mem_obj); 158 if (!mqd_mem_obj) 159 return NULL; 160 retval = amdgpu_amdkfd_alloc_kernel_mem(node->adev, 161 (ALIGN(ALIGN(q->ctl_stack_size, AMDGPU_GPU_PAGE_SIZE) + 162 ALIGN(sizeof(struct v9_mqd), AMDGPU_GPU_PAGE_SIZE), PAGE_SIZE)) * 163 NUM_XCC(node->xcc_mask), 164 mqd_on_vram(node->adev) ? AMDGPU_GEM_DOMAIN_VRAM : 165 AMDGPU_GEM_DOMAIN_GTT, 166 &(mqd_mem_obj->mem), 167 &(mqd_mem_obj->gpu_addr), 168 (void *)&(mqd_mem_obj->cpu_ptr), true); 169 170 if (retval) { 171 kfree(mqd_mem_obj); 172 return NULL; 173 } 174 } else { 175 retval = kfd_gtt_sa_allocate(node, sizeof(struct v9_mqd), 176 &mqd_mem_obj); 177 if (retval) 178 return NULL; 179 } 180 181 return mqd_mem_obj; 182 } 183 184 static void init_mqd(struct mqd_manager *mm, void **mqd, 185 struct kfd_mem_obj *mqd_mem_obj, uint64_t *gart_addr, 186 struct queue_properties *q) 187 { 188 uint64_t addr; 189 struct v9_mqd *m; 190 191 m = (struct v9_mqd *) mqd_mem_obj->cpu_ptr; 192 addr = mqd_mem_obj->gpu_addr; 193 194 memset(m, 0, sizeof(struct v9_mqd)); 195 196 m->header = 0xC0310800; 197 m->compute_pipelinestat_enable = 1; 198 m->compute_static_thread_mgmt_se0 = 0xFFFFFFFF; 199 m->compute_static_thread_mgmt_se1 = 0xFFFFFFFF; 200 m->compute_static_thread_mgmt_se2 = 0xFFFFFFFF; 201 m->compute_static_thread_mgmt_se3 = 0xFFFFFFFF; 202 m->compute_static_thread_mgmt_se4 = 0xFFFFFFFF; 203 m->compute_static_thread_mgmt_se5 = 0xFFFFFFFF; 204 m->compute_static_thread_mgmt_se6 = 0xFFFFFFFF; 205 m->compute_static_thread_mgmt_se7 = 0xFFFFFFFF; 206 207 m->cp_hqd_persistent_state = CP_HQD_PERSISTENT_STATE__PRELOAD_REQ_MASK | 208 0x53 << CP_HQD_PERSISTENT_STATE__PRELOAD_SIZE__SHIFT; 209 210 m->cp_hqd_pq_control = 5 << CP_HQD_PQ_CONTROL__RPTR_BLOCK_SIZE__SHIFT; 211 m->cp_hqd_pq_control |= CP_HQD_PQ_CONTROL__UNORD_DISPATCH_MASK; 212 213 m->cp_mqd_control = 1 << CP_MQD_CONTROL__PRIV_STATE__SHIFT; 214 215 m->cp_mqd_base_addr_lo = lower_32_bits(addr); 216 m->cp_mqd_base_addr_hi = upper_32_bits(addr); 217 218 m->cp_hqd_quantum = 1 << CP_HQD_QUANTUM__QUANTUM_EN__SHIFT | 219 1 << CP_HQD_QUANTUM__QUANTUM_SCALE__SHIFT | 220 1 << CP_HQD_QUANTUM__QUANTUM_DURATION__SHIFT; 221 222 /* Set cp_hqd_hq_scheduler0 bit 14 to 1 to have the CP set up the 223 * DISPATCH_PTR. This is required for the kfd debugger 224 */ 225 m->cp_hqd_hq_status0 = 1 << 14; 226 227 if (q->format == KFD_QUEUE_FORMAT_AQL) 228 m->cp_hqd_aql_control = 229 1 << CP_HQD_AQL_CONTROL__CONTROL0__SHIFT; 230 231 if (q->tba_addr) 232 m->compute_pgm_rsrc2 |= 233 (1 << COMPUTE_PGM_RSRC2__TRAP_PRESENT__SHIFT); 234 235 if (mm->dev->kfd->cwsr_enabled && q->ctx_save_restore_area_address) { 236 m->cp_hqd_persistent_state |= 237 (1 << CP_HQD_PERSISTENT_STATE__QSWITCH_MODE__SHIFT); 238 m->cp_hqd_ctx_save_base_addr_lo = 239 lower_32_bits(q->ctx_save_restore_area_address); 240 m->cp_hqd_ctx_save_base_addr_hi = 241 upper_32_bits(q->ctx_save_restore_area_address); 242 m->cp_hqd_ctx_save_size = q->ctx_save_restore_area_size; 243 m->cp_hqd_cntl_stack_size = q->ctl_stack_size; 244 m->cp_hqd_cntl_stack_offset = q->ctl_stack_size; 245 m->cp_hqd_wg_state_offset = q->ctl_stack_size; 246 } 247 248 mutex_lock(&mm->dev->kfd->profiler_lock); 249 if (mm->dev->kfd->profiler_process != NULL) 250 m->compute_perfcount_enable = 1; 251 mutex_unlock(&mm->dev->kfd->profiler_lock); 252 253 *mqd = m; 254 if (gart_addr) 255 *gart_addr = addr; 256 update_mqd(mm, m, q, NULL); 257 } 258 259 static int load_mqd(struct mqd_manager *mm, void *mqd, 260 uint32_t pipe_id, uint32_t queue_id, 261 struct queue_properties *p, struct mm_struct *mms) 262 { 263 /* AQL write pointer counts in 64B packets, PM4/CP counts in dwords. */ 264 uint32_t wptr_shift = (p->format == KFD_QUEUE_FORMAT_AQL ? 4 : 0); 265 266 return mm->dev->kfd2kgd->hqd_load(mm->dev->adev, mqd, pipe_id, queue_id, 267 (uint32_t __user *)p->write_ptr, 268 wptr_shift, 0, mms, 0); 269 } 270 271 static void update_mqd(struct mqd_manager *mm, void *mqd, 272 struct queue_properties *q, 273 struct mqd_update_info *minfo) 274 { 275 struct v9_mqd *m; 276 277 m = get_mqd(mqd); 278 279 m->cp_hqd_pq_control &= ~CP_HQD_PQ_CONTROL__QUEUE_SIZE_MASK; 280 m->cp_hqd_pq_control |= order_base_2(q->queue_size / 4) - 1; 281 pr_debug("cp_hqd_pq_control 0x%x\n", m->cp_hqd_pq_control); 282 283 m->cp_hqd_pq_base_lo = lower_32_bits((uint64_t)q->queue_address >> 8); 284 m->cp_hqd_pq_base_hi = upper_32_bits((uint64_t)q->queue_address >> 8); 285 286 m->cp_hqd_pq_rptr_report_addr_lo = lower_32_bits((uint64_t)q->read_ptr); 287 m->cp_hqd_pq_rptr_report_addr_hi = upper_32_bits((uint64_t)q->read_ptr); 288 m->cp_hqd_pq_wptr_poll_addr_lo = lower_32_bits((uint64_t)q->write_ptr); 289 m->cp_hqd_pq_wptr_poll_addr_hi = upper_32_bits((uint64_t)q->write_ptr); 290 291 m->cp_hqd_pq_doorbell_control = 292 q->doorbell_off << 293 CP_HQD_PQ_DOORBELL_CONTROL__DOORBELL_OFFSET__SHIFT; 294 pr_debug("cp_hqd_pq_doorbell_control 0x%x\n", 295 m->cp_hqd_pq_doorbell_control); 296 297 m->cp_hqd_ib_control = 298 3 << CP_HQD_IB_CONTROL__MIN_IB_AVAIL_SIZE__SHIFT | 299 1 << CP_HQD_IB_CONTROL__IB_EXE_DISABLE__SHIFT; 300 301 /* 302 * HW does not clamp this field correctly. Maximum EOP queue size 303 * is constrained by per-SE EOP done signal count, which is 8-bit. 304 * Limit is 0xFF EOP entries (= 0x7F8 dwords). CP will not submit 305 * more than (EOP entry count - 1) so a queue size of 0x800 dwords 306 * is safe, giving a maximum field value of 0xA. 307 * 308 * Also, do calculation only if EOP is used (size > 0), otherwise 309 * the order_base_2 calculation provides incorrect result. 310 * 311 */ 312 m->cp_hqd_eop_control = q->eop_ring_buffer_size ? 313 min(0xA, order_base_2(q->eop_ring_buffer_size / 4) - 1) : 0; 314 315 m->cp_hqd_eop_base_addr_lo = 316 lower_32_bits(q->eop_ring_buffer_address >> 8); 317 m->cp_hqd_eop_base_addr_hi = 318 upper_32_bits(q->eop_ring_buffer_address >> 8); 319 320 m->cp_hqd_iq_timer = 0; 321 322 m->cp_hqd_vmid = q->vmid; 323 324 if (q->format == KFD_QUEUE_FORMAT_AQL) { 325 m->cp_hqd_pq_control |= CP_HQD_PQ_CONTROL__NO_UPDATE_RPTR_MASK | 326 2 << CP_HQD_PQ_CONTROL__SLOT_BASED_WPTR__SHIFT | 327 1 << CP_HQD_PQ_CONTROL__QUEUE_FULL_EN__SHIFT | 328 1 << CP_HQD_PQ_CONTROL__WPP_CLAMP_EN__SHIFT; 329 m->cp_hqd_pq_doorbell_control |= 1 << 330 CP_HQD_PQ_DOORBELL_CONTROL__DOORBELL_BIF_DROP__SHIFT; 331 } 332 if (mm->dev->kfd->cwsr_enabled && q->ctx_save_restore_area_address) 333 m->cp_hqd_ctx_save_control = 0; 334 335 if (minfo) { 336 if (minfo->update_flag == UPDATE_FLAG_PERFCOUNT_ENABLE) 337 m->compute_perfcount_enable = 1; 338 else if (minfo->update_flag == UPDATE_FLAG_PERFCOUNT_DISABLE) 339 m->compute_perfcount_enable = 0; 340 } 341 342 if (KFD_GC_VERSION(mm->dev) != IP_VERSION(9, 4, 3) && 343 KFD_GC_VERSION(mm->dev) != IP_VERSION(9, 4, 4) && 344 KFD_GC_VERSION(mm->dev) != IP_VERSION(9, 5, 0)) 345 update_cu_mask(mm, mqd, minfo, 0); 346 set_priority(m, q); 347 348 if (minfo && KFD_GC_VERSION(mm->dev) >= IP_VERSION(9, 4, 2)) { 349 if (minfo->update_flag & UPDATE_FLAG_IS_GWS) 350 m->compute_resource_limits |= 351 COMPUTE_RESOURCE_LIMITS__FORCE_SIMD_DIST_MASK; 352 else 353 m->compute_resource_limits &= 354 ~COMPUTE_RESOURCE_LIMITS__FORCE_SIMD_DIST_MASK; 355 } 356 357 q->is_active = QUEUE_IS_ACTIVE(*q); 358 } 359 360 361 static bool check_preemption_failed(struct mqd_manager *mm, void *mqd) 362 { 363 struct v9_mqd *m = (struct v9_mqd *)mqd; 364 uint32_t doorbell_id = m->queue_doorbell_id0; 365 366 m->queue_doorbell_id0 = 0; 367 368 return kfd_check_hiq_mqd_doorbell_id(mm->dev, doorbell_id, 0); 369 } 370 371 static int get_wave_state(struct mqd_manager *mm, void *mqd, 372 struct queue_properties *q, 373 void __user *ctl_stack, 374 u32 *ctl_stack_used_size, 375 u32 *save_area_used_size) 376 { 377 struct v9_mqd *m; 378 struct kfd_context_save_area_header header; 379 u32 cntl_stack_size; 380 u32 cntl_stack_offset; 381 382 /* Control stack is located one page after MQD. */ 383 void *mqd_ctl_stack = (void *)((uintptr_t)mqd + AMDGPU_GPU_PAGE_SIZE); 384 385 m = get_mqd(mqd); 386 cntl_stack_size = min_t(u32, m->cp_hqd_cntl_stack_size, q->ctl_stack_size); 387 cntl_stack_offset = min_t(u32, m->cp_hqd_cntl_stack_offset, cntl_stack_size); 388 389 *ctl_stack_used_size = m->cp_hqd_cntl_stack_size - 390 m->cp_hqd_cntl_stack_offset; 391 *save_area_used_size = m->cp_hqd_wg_state_offset - 392 m->cp_hqd_cntl_stack_size; 393 394 header.wave_state.control_stack_size = *ctl_stack_used_size; 395 header.wave_state.wave_state_size = *save_area_used_size; 396 397 header.wave_state.wave_state_offset = m->cp_hqd_wg_state_offset; 398 header.wave_state.control_stack_offset = m->cp_hqd_cntl_stack_offset; 399 400 if (copy_to_user(ctl_stack, &header, sizeof(header.wave_state))) 401 return -EFAULT; 402 403 *ctl_stack_used_size = cntl_stack_size - cntl_stack_offset; 404 405 if (copy_to_user(ctl_stack + cntl_stack_offset, mqd_ctl_stack + cntl_stack_offset, 406 *ctl_stack_used_size)) 407 return -EFAULT; 408 409 return 0; 410 } 411 412 static int get_checkpoint_info(struct mqd_manager *mm, void *mqd, u32 *ctl_stack_size) 413 { 414 struct v9_mqd *m = get_mqd(mqd); 415 u32 per_xcc_size; 416 417 per_xcc_size = min_t(u32, m->cp_hqd_cntl_stack_size, mm->ctl_stack_size); 418 419 if (check_mul_overflow(per_xcc_size, NUM_XCC(mm->dev->xcc_mask), ctl_stack_size)) 420 return -EINVAL; 421 422 return 0; 423 } 424 425 static void checkpoint_mqd(struct mqd_manager *mm, void *mqd, void *mqd_dst, void *ctl_stack_dst) 426 { 427 struct v9_mqd *m; 428 u32 ctl_stack_copy_size; 429 /* Control stack is located one page after MQD. */ 430 void *ctl_stack = (void *)((uintptr_t)mqd + AMDGPU_GPU_PAGE_SIZE); 431 432 m = get_mqd(mqd); 433 ctl_stack_copy_size = min_t(u32, m->cp_hqd_cntl_stack_size, mm->ctl_stack_size); 434 435 memcpy(mqd_dst, m, sizeof(struct v9_mqd)); 436 memcpy(ctl_stack_dst, ctl_stack, ctl_stack_copy_size); 437 } 438 439 static void checkpoint_mqd_v9_4_3(struct mqd_manager *mm, 440 void *mqd, 441 void *mqd_dst, 442 void *ctl_stack_dst) 443 { 444 struct v9_mqd *m; 445 u32 ctl_stack_stride; 446 int xcc; 447 uint64_t size = get_mqd(mqd)->cp_mqd_stride_size; 448 449 ctl_stack_stride = min_t(u32, get_mqd(mqd)->cp_hqd_cntl_stack_size, 450 mm->ctl_stack_size); 451 452 for (xcc = 0; xcc < NUM_XCC(mm->dev->xcc_mask); xcc++) { 453 m = get_mqd(mqd + size * xcc); 454 455 checkpoint_mqd(mm, m, 456 (uint8_t *)mqd_dst + sizeof(*m) * xcc, 457 (uint8_t *)ctl_stack_dst + ctl_stack_stride * xcc); 458 } 459 } 460 461 static void restore_mqd(struct mqd_manager *mm, void **mqd, 462 struct kfd_mem_obj *mqd_mem_obj, uint64_t *gart_addr, 463 struct queue_properties *qp, 464 const void *mqd_src, 465 const void *ctl_stack_src, u32 ctl_stack_size) 466 { 467 uint64_t addr; 468 struct v9_mqd *m; 469 void *ctl_stack; 470 471 m = (struct v9_mqd *) mqd_mem_obj->cpu_ptr; 472 addr = mqd_mem_obj->gpu_addr; 473 474 memcpy(m, mqd_src, sizeof(*m)); 475 476 *mqd = m; 477 if (gart_addr) 478 *gart_addr = addr; 479 480 /* Control stack is located one page after MQD. */ 481 ctl_stack = (void *)((uintptr_t)*mqd + AMDGPU_GPU_PAGE_SIZE); 482 memcpy(ctl_stack, ctl_stack_src, ctl_stack_size); 483 484 m->cp_hqd_pq_doorbell_control = 485 qp->doorbell_off << 486 CP_HQD_PQ_DOORBELL_CONTROL__DOORBELL_OFFSET__SHIFT; 487 pr_debug("cp_hqd_pq_doorbell_control 0x%x\n", 488 m->cp_hqd_pq_doorbell_control); 489 490 qp->is_active = 0; 491 } 492 493 static void init_mqd_hiq(struct mqd_manager *mm, void **mqd, 494 struct kfd_mem_obj *mqd_mem_obj, uint64_t *gart_addr, 495 struct queue_properties *q) 496 { 497 struct v9_mqd *m; 498 499 init_mqd(mm, mqd, mqd_mem_obj, gart_addr, q); 500 501 m = get_mqd(*mqd); 502 503 m->cp_hqd_pq_control |= 1 << CP_HQD_PQ_CONTROL__PRIV_STATE__SHIFT | 504 1 << CP_HQD_PQ_CONTROL__KMD_QUEUE__SHIFT; 505 } 506 507 static int destroy_hiq_mqd(struct mqd_manager *mm, void *mqd, 508 enum kfd_preempt_type type, unsigned int timeout, 509 uint32_t pipe_id, uint32_t queue_id) 510 { 511 int err; 512 struct v9_mqd *m; 513 u32 doorbell_off; 514 515 m = get_mqd(mqd); 516 517 doorbell_off = m->cp_hqd_pq_doorbell_control >> 518 CP_HQD_PQ_DOORBELL_CONTROL__DOORBELL_OFFSET__SHIFT; 519 err = amdgpu_amdkfd_unmap_hiq(mm->dev->adev, doorbell_off, 0); 520 if (err) 521 pr_debug("Destroy HIQ MQD failed: %d\n", err); 522 523 return err; 524 } 525 526 static void init_mqd_sdma(struct mqd_manager *mm, void **mqd, 527 struct kfd_mem_obj *mqd_mem_obj, uint64_t *gart_addr, 528 struct queue_properties *q) 529 { 530 struct v9_sdma_mqd *m; 531 532 m = (struct v9_sdma_mqd *) mqd_mem_obj->cpu_ptr; 533 534 memset(m, 0, sizeof(struct v9_sdma_mqd)); 535 536 *mqd = m; 537 if (gart_addr) 538 *gart_addr = mqd_mem_obj->gpu_addr; 539 540 mm->update_mqd(mm, m, q, NULL); 541 } 542 543 #define SDMA_RLC_DUMMY_DEFAULT 0xf 544 545 static void update_mqd_sdma(struct mqd_manager *mm, void *mqd, 546 struct queue_properties *q, 547 struct mqd_update_info *minfo) 548 { 549 struct v9_sdma_mqd *m; 550 551 m = get_sdma_mqd(mqd); 552 m->sdmax_rlcx_rb_cntl = order_base_2(q->queue_size / 4) 553 << SDMA0_RLC0_RB_CNTL__RB_SIZE__SHIFT | 554 q->vmid << SDMA0_RLC0_RB_CNTL__RB_VMID__SHIFT | 555 1 << SDMA0_RLC0_RB_CNTL__RPTR_WRITEBACK_ENABLE__SHIFT | 556 6 << SDMA0_RLC0_RB_CNTL__RPTR_WRITEBACK_TIMER__SHIFT; 557 558 m->sdmax_rlcx_rb_base = lower_32_bits(q->queue_address >> 8); 559 m->sdmax_rlcx_rb_base_hi = upper_32_bits(q->queue_address >> 8); 560 m->sdmax_rlcx_rb_rptr_addr_lo = lower_32_bits((uint64_t)q->read_ptr); 561 m->sdmax_rlcx_rb_rptr_addr_hi = upper_32_bits((uint64_t)q->read_ptr); 562 m->sdmax_rlcx_doorbell_offset = 563 q->doorbell_off << SDMA0_RLC0_DOORBELL_OFFSET__OFFSET__SHIFT; 564 565 m->sdma_engine_id = q->sdma_engine_id; 566 m->sdma_queue_id = q->sdma_queue_id; 567 m->sdmax_rlcx_dummy_reg = SDMA_RLC_DUMMY_DEFAULT; 568 /* Allow context switch so we don't cross-process starve with a massive 569 * command buffer of long-running SDMA commands 570 */ 571 m->sdmax_rlcx_ib_cntl |= SDMA0_GFX_IB_CNTL__SWITCH_INSIDE_IB_MASK; 572 573 q->is_active = QUEUE_IS_ACTIVE(*q); 574 } 575 576 static void checkpoint_mqd_sdma(struct mqd_manager *mm, 577 void *mqd, 578 void *mqd_dst, 579 void *ctl_stack_dst) 580 { 581 struct v9_sdma_mqd *m; 582 583 m = get_sdma_mqd(mqd); 584 585 memcpy(mqd_dst, m, sizeof(struct v9_sdma_mqd)); 586 } 587 588 static void restore_mqd_sdma(struct mqd_manager *mm, void **mqd, 589 struct kfd_mem_obj *mqd_mem_obj, uint64_t *gart_addr, 590 struct queue_properties *qp, 591 const void *mqd_src, 592 const void *ctl_stack_src, const u32 ctl_stack_size) 593 { 594 uint64_t addr; 595 struct v9_sdma_mqd *m; 596 597 m = (struct v9_sdma_mqd *) mqd_mem_obj->cpu_ptr; 598 addr = mqd_mem_obj->gpu_addr; 599 600 memcpy(m, mqd_src, sizeof(*m)); 601 602 m->sdmax_rlcx_doorbell_offset = 603 qp->doorbell_off << SDMA0_RLC0_DOORBELL_OFFSET__OFFSET__SHIFT; 604 605 *mqd = m; 606 if (gart_addr) 607 *gart_addr = addr; 608 609 qp->is_active = 0; 610 } 611 612 static void init_mqd_hiq_v9_4_3(struct mqd_manager *mm, void **mqd, 613 struct kfd_mem_obj *mqd_mem_obj, uint64_t *gart_addr, 614 struct queue_properties *q) 615 { 616 struct v9_mqd *m; 617 int xcc = 0; 618 struct kfd_mem_obj xcc_mqd_mem_obj; 619 uint64_t xcc_gart_addr = 0; 620 621 memset(&xcc_mqd_mem_obj, 0x0, sizeof(struct kfd_mem_obj)); 622 623 for (xcc = 0; xcc < NUM_XCC(mm->dev->xcc_mask); xcc++) { 624 kfd_get_hiq_xcc_mqd(mm->dev, &xcc_mqd_mem_obj, xcc); 625 626 init_mqd(mm, (void **)&m, &xcc_mqd_mem_obj, &xcc_gart_addr, q); 627 628 m->cp_hqd_pq_control |= CP_HQD_PQ_CONTROL__NO_UPDATE_RPTR_MASK | 629 1 << CP_HQD_PQ_CONTROL__PRIV_STATE__SHIFT | 630 1 << CP_HQD_PQ_CONTROL__KMD_QUEUE__SHIFT; 631 if (amdgpu_sriov_multi_vf_mode(mm->dev->adev)) 632 m->cp_hqd_pq_doorbell_control |= 1 << 633 CP_HQD_PQ_DOORBELL_CONTROL__DOORBELL_MODE__SHIFT; 634 m->cp_mqd_stride_size = kfd_hiq_mqd_stride(mm->dev); 635 if (xcc == 0) { 636 /* Set no_update_rptr = 0 in Master XCC */ 637 m->cp_hqd_pq_control &= ~CP_HQD_PQ_CONTROL__NO_UPDATE_RPTR_MASK; 638 639 /* Set the MQD pointer and gart address to XCC0 MQD */ 640 *mqd = m; 641 *gart_addr = xcc_gart_addr; 642 } 643 } 644 } 645 646 static int hiq_load_mqd_kiq_v9_4_3(struct mqd_manager *mm, void *mqd, 647 uint32_t pipe_id, uint32_t queue_id, 648 struct queue_properties *p, struct mm_struct *mms) 649 { 650 uint32_t xcc_mask = mm->dev->xcc_mask; 651 int xcc_id, err = 0, inst = 0; 652 void *xcc_mqd; 653 uint64_t hiq_mqd_size = kfd_hiq_mqd_stride(mm->dev); 654 655 for_each_inst(xcc_id, xcc_mask) { 656 xcc_mqd = mqd + hiq_mqd_size * inst; 657 err = mm->dev->kfd2kgd->hiq_mqd_load(mm->dev->adev, xcc_mqd, 658 pipe_id, queue_id, 659 p->doorbell_off, xcc_id); 660 if (err) { 661 pr_debug("Failed to load HIQ MQD for XCC: %d\n", inst); 662 break; 663 } 664 ++inst; 665 } 666 667 return err; 668 } 669 670 static int destroy_hiq_mqd_v9_4_3(struct mqd_manager *mm, void *mqd, 671 enum kfd_preempt_type type, unsigned int timeout, 672 uint32_t pipe_id, uint32_t queue_id) 673 { 674 uint32_t xcc_mask = mm->dev->xcc_mask; 675 int xcc_id, err = 0, inst = 0; 676 uint64_t hiq_mqd_size = kfd_hiq_mqd_stride(mm->dev); 677 struct v9_mqd *m; 678 u32 doorbell_off; 679 680 for_each_inst(xcc_id, xcc_mask) { 681 m = get_mqd(mqd + hiq_mqd_size * inst); 682 683 doorbell_off = m->cp_hqd_pq_doorbell_control >> 684 CP_HQD_PQ_DOORBELL_CONTROL__DOORBELL_OFFSET__SHIFT; 685 686 err = amdgpu_amdkfd_unmap_hiq(mm->dev->adev, doorbell_off, xcc_id); 687 if (err) { 688 pr_debug("Destroy HIQ MQD failed for xcc: %d\n", inst); 689 break; 690 } 691 ++inst; 692 } 693 694 return err; 695 } 696 697 static bool check_preemption_failed_v9_4_3(struct mqd_manager *mm, void *mqd) 698 { 699 uint64_t hiq_mqd_size = kfd_hiq_mqd_stride(mm->dev); 700 uint32_t xcc_mask = mm->dev->xcc_mask; 701 int inst = 0, xcc_id; 702 struct v9_mqd *m; 703 bool ret = false; 704 705 for_each_inst(xcc_id, xcc_mask) { 706 m = get_mqd(mqd + hiq_mqd_size * inst); 707 ret |= kfd_check_hiq_mqd_doorbell_id(mm->dev, 708 m->queue_doorbell_id0, inst); 709 m->queue_doorbell_id0 = 0; 710 ++inst; 711 } 712 713 return ret; 714 } 715 716 static void get_xcc_mqd(struct kfd_mem_obj *mqd_mem_obj, 717 struct kfd_mem_obj *xcc_mqd_mem_obj, 718 uint64_t offset) 719 { 720 xcc_mqd_mem_obj->mem = (offset == 0) ? 721 mqd_mem_obj->mem : NULL; 722 xcc_mqd_mem_obj->gpu_addr = mqd_mem_obj->gpu_addr + offset; 723 xcc_mqd_mem_obj->cpu_ptr = (uint32_t *)((uintptr_t)mqd_mem_obj->cpu_ptr 724 + offset); 725 } 726 727 static void init_mqd_v9_4_3(struct mqd_manager *mm, void **mqd, 728 struct kfd_mem_obj *mqd_mem_obj, uint64_t *gart_addr, 729 struct queue_properties *q) 730 { 731 struct v9_mqd *m; 732 int xcc = 0; 733 struct kfd_mem_obj xcc_mqd_mem_obj; 734 uint64_t xcc_gart_addr = 0; 735 uint64_t xcc_ctx_save_restore_area_address; 736 uint64_t offset = mm->mqd_stride(mm, q); 737 uint32_t local_xcc_start = mm->dev->dqm->current_logical_xcc_start++; 738 739 memset(&xcc_mqd_mem_obj, 0x0, sizeof(struct kfd_mem_obj)); 740 for (xcc = 0; xcc < NUM_XCC(mm->dev->xcc_mask); xcc++) { 741 get_xcc_mqd(mqd_mem_obj, &xcc_mqd_mem_obj, offset*xcc); 742 743 init_mqd(mm, (void **)&m, &xcc_mqd_mem_obj, &xcc_gart_addr, q); 744 if (amdgpu_sriov_multi_vf_mode(mm->dev->adev)) 745 m->cp_hqd_pq_doorbell_control |= 1 << 746 CP_HQD_PQ_DOORBELL_CONTROL__DOORBELL_MODE__SHIFT; 747 m->cp_mqd_stride_size = offset; 748 749 /* 750 * Update the CWSR address for each XCC if CWSR is enabled 751 * and CWSR area is allocated in thunk 752 */ 753 if (mm->dev->kfd->cwsr_enabled && 754 q->ctx_save_restore_area_address) { 755 xcc_ctx_save_restore_area_address = 756 q->ctx_save_restore_area_address + 757 (xcc * q->ctx_save_restore_area_size); 758 759 m->cp_hqd_ctx_save_base_addr_lo = 760 lower_32_bits(xcc_ctx_save_restore_area_address); 761 m->cp_hqd_ctx_save_base_addr_hi = 762 upper_32_bits(xcc_ctx_save_restore_area_address); 763 } 764 765 if (q->format == KFD_QUEUE_FORMAT_AQL) { 766 m->compute_tg_chunk_size = 1; 767 m->compute_current_logic_xcc_id = 768 (local_xcc_start + xcc) % 769 NUM_XCC(mm->dev->xcc_mask); 770 771 switch (xcc) { 772 case 0: 773 /* Master XCC */ 774 m->cp_hqd_pq_control &= 775 ~CP_HQD_PQ_CONTROL__NO_UPDATE_RPTR_MASK; 776 break; 777 default: 778 break; 779 } 780 } else { 781 /* PM4 Queue */ 782 m->compute_current_logic_xcc_id = 0; 783 m->compute_tg_chunk_size = 0; 784 m->pm4_target_xcc_in_xcp = q->pm4_target_xcc; 785 } 786 787 if (xcc == 0) { 788 /* Set the MQD pointer and gart address to XCC0 MQD */ 789 *mqd = m; 790 *gart_addr = xcc_gart_addr; 791 } 792 } 793 794 if (mqd_on_vram(mm->dev->adev)) 795 amdgpu_device_flush_hdp(mm->dev->adev, NULL); 796 } 797 798 static void update_mqd_v9_4_3(struct mqd_manager *mm, void *mqd, 799 struct queue_properties *q, struct mqd_update_info *minfo) 800 { 801 struct v9_mqd *m; 802 int xcc = 0; 803 uint64_t size = mm->mqd_stride(mm, q); 804 805 for (xcc = 0; xcc < NUM_XCC(mm->dev->xcc_mask); xcc++) { 806 m = get_mqd(mqd + size * xcc); 807 update_mqd(mm, m, q, minfo); 808 809 if (amdgpu_sriov_multi_vf_mode(mm->dev->adev)) 810 m->cp_hqd_pq_doorbell_control |= 1 << 811 CP_HQD_PQ_DOORBELL_CONTROL__DOORBELL_MODE__SHIFT; 812 update_cu_mask(mm, m, minfo, xcc); 813 814 if (q->format == KFD_QUEUE_FORMAT_AQL) { 815 switch (xcc) { 816 case 0: 817 /* Master XCC */ 818 m->cp_hqd_pq_control &= 819 ~CP_HQD_PQ_CONTROL__NO_UPDATE_RPTR_MASK; 820 break; 821 default: 822 break; 823 } 824 m->compute_tg_chunk_size = 1; 825 } else { 826 /* PM4 Queue */ 827 m->compute_current_logic_xcc_id = 0; 828 m->compute_tg_chunk_size = 0; 829 m->pm4_target_xcc_in_xcp = q->pm4_target_xcc; 830 } 831 } 832 833 if (mqd_on_vram(mm->dev->adev)) 834 amdgpu_device_flush_hdp(mm->dev->adev, NULL); 835 } 836 837 static void restore_mqd_v9_4_3(struct mqd_manager *mm, void **mqd, 838 struct kfd_mem_obj *mqd_mem_obj, uint64_t *gart_addr, 839 struct queue_properties *qp, 840 const void *mqd_src, 841 const void *ctl_stack_src, u32 ctl_stack_size) 842 { 843 struct kfd_mem_obj xcc_mqd_mem_obj; 844 u32 mqd_ctl_stack_size; 845 struct v9_mqd *m; 846 u32 num_xcc; 847 int xcc; 848 849 uint64_t offset = mm->mqd_stride(mm, qp); 850 851 mm->dev->dqm->current_logical_xcc_start++; 852 853 num_xcc = NUM_XCC(mm->dev->xcc_mask); 854 mqd_ctl_stack_size = ctl_stack_size / num_xcc; 855 856 memset(&xcc_mqd_mem_obj, 0x0, sizeof(struct kfd_mem_obj)); 857 858 /* Set the MQD pointer and gart address to XCC0 MQD */ 859 *mqd = mqd_mem_obj->cpu_ptr; 860 if (gart_addr) 861 *gart_addr = mqd_mem_obj->gpu_addr; 862 863 for (xcc = 0; xcc < num_xcc; xcc++) { 864 get_xcc_mqd(mqd_mem_obj, &xcc_mqd_mem_obj, offset * xcc); 865 restore_mqd(mm, (void **)&m, 866 &xcc_mqd_mem_obj, 867 NULL, 868 qp, 869 (uint8_t *)mqd_src + xcc * sizeof(*m), 870 (uint8_t *)ctl_stack_src + xcc * mqd_ctl_stack_size, 871 mqd_ctl_stack_size); 872 } 873 874 if (mqd_on_vram(mm->dev->adev)) 875 amdgpu_device_flush_hdp(mm->dev->adev, NULL); 876 } 877 static int destroy_mqd_v9_4_3(struct mqd_manager *mm, void *mqd, 878 enum kfd_preempt_type type, unsigned int timeout, 879 uint32_t pipe_id, uint32_t queue_id) 880 { 881 uint32_t xcc_mask = mm->dev->xcc_mask; 882 int xcc_id, err = 0, inst = 0; 883 void *xcc_mqd; 884 struct v9_mqd *m; 885 uint64_t mqd_offset; 886 887 m = get_mqd(mqd); 888 mqd_offset = m->cp_mqd_stride_size; 889 890 for_each_inst(xcc_id, xcc_mask) { 891 xcc_mqd = mqd + mqd_offset * inst; 892 err = mm->dev->kfd2kgd->hqd_destroy(mm->dev->adev, xcc_mqd, 893 type, timeout, pipe_id, 894 queue_id, xcc_id); 895 if (err) { 896 pr_debug("Destroy MQD failed for xcc: %d\n", inst); 897 break; 898 } 899 ++inst; 900 } 901 902 return err; 903 } 904 905 static int load_mqd_v9_4_3(struct mqd_manager *mm, void *mqd, 906 uint32_t pipe_id, uint32_t queue_id, 907 struct queue_properties *p, struct mm_struct *mms) 908 { 909 /* AQL write pointer counts in 64B packets, PM4/CP counts in dwords. */ 910 uint32_t wptr_shift = (p->format == KFD_QUEUE_FORMAT_AQL ? 4 : 0); 911 uint32_t xcc_mask = mm->dev->xcc_mask; 912 int xcc_id, err = 0, inst = 0; 913 void *xcc_mqd; 914 uint64_t mqd_stride_size = mm->mqd_stride(mm, p); 915 916 for_each_inst(xcc_id, xcc_mask) { 917 xcc_mqd = mqd + mqd_stride_size * inst; 918 err = mm->dev->kfd2kgd->hqd_load( 919 mm->dev->adev, xcc_mqd, pipe_id, queue_id, 920 (uint32_t __user *)p->write_ptr, wptr_shift, 0, mms, 921 xcc_id); 922 if (err) { 923 pr_debug("Load MQD failed for xcc: %d\n", inst); 924 break; 925 } 926 ++inst; 927 } 928 929 return err; 930 } 931 932 static int get_wave_state_v9_4_3(struct mqd_manager *mm, void *mqd, 933 struct queue_properties *q, 934 void __user *ctl_stack, 935 u32 *ctl_stack_used_size, 936 u32 *save_area_used_size) 937 { 938 int xcc, err = 0; 939 void *xcc_mqd; 940 void __user *xcc_ctl_stack; 941 uint64_t mqd_stride_size = mm->mqd_stride(mm, q); 942 u32 tmp_ctl_stack_used_size = 0, tmp_save_area_used_size = 0; 943 944 for (xcc = 0; xcc < NUM_XCC(mm->dev->xcc_mask); xcc++) { 945 xcc_mqd = mqd + mqd_stride_size * xcc; 946 xcc_ctl_stack = (void __user *)((uintptr_t)ctl_stack + 947 q->ctx_save_restore_area_size * xcc); 948 949 err = get_wave_state(mm, xcc_mqd, q, xcc_ctl_stack, 950 &tmp_ctl_stack_used_size, 951 &tmp_save_area_used_size); 952 if (err) 953 break; 954 955 /* 956 * Set the ctl_stack_used_size and save_area_used_size to 957 * ctl_stack_used_size and save_area_used_size of XCC 0 when 958 * passing the info the user-space. 959 * For multi XCC, user-space would have to look at the header 960 * info of each Control stack area to determine the control 961 * stack size and save area used. 962 */ 963 if (xcc == 0) { 964 *ctl_stack_used_size = tmp_ctl_stack_used_size; 965 *save_area_used_size = tmp_save_area_used_size; 966 } 967 } 968 969 return err; 970 } 971 972 #if defined(CONFIG_DEBUG_FS) 973 974 static int debugfs_show_mqd(struct seq_file *m, void *data) 975 { 976 seq_hex_dump(m, " ", DUMP_PREFIX_OFFSET, 32, 4, 977 data, sizeof(struct v9_mqd), false); 978 return 0; 979 } 980 981 static int debugfs_show_mqd_sdma(struct seq_file *m, void *data) 982 { 983 seq_hex_dump(m, " ", DUMP_PREFIX_OFFSET, 32, 4, 984 data, sizeof(struct v9_sdma_mqd), false); 985 return 0; 986 } 987 988 #endif 989 990 struct mqd_manager *mqd_manager_init_v9(enum KFD_MQD_TYPE type, 991 struct kfd_node *dev) 992 { 993 struct mqd_manager *mqd; 994 995 if (WARN_ON(type >= KFD_MQD_TYPE_MAX)) 996 return NULL; 997 998 mqd = kzalloc_obj(*mqd); 999 if (!mqd) 1000 return NULL; 1001 1002 mqd->dev = dev; 1003 1004 switch (type) { 1005 case KFD_MQD_TYPE_CP: 1006 mqd->allocate_mqd = allocate_mqd; 1007 mqd->free_mqd = kfd_free_mqd_cp; 1008 mqd->is_occupied = kfd_is_occupied_cp; 1009 mqd->get_checkpoint_info = get_checkpoint_info; 1010 mqd->mqd_size = sizeof(struct v9_mqd); 1011 if (dev->kfd->cwsr_enabled) { 1012 struct kfd_topology_device *topo_dev; 1013 1014 topo_dev = kfd_topology_device_by_id(dev->id); 1015 if (topo_dev) 1016 mqd->ctl_stack_size = 1017 ALIGN(topo_dev->node_props.ctl_stack_size, 1018 AMDGPU_GPU_PAGE_SIZE); 1019 } 1020 mqd->mqd_stride = mqd_stride_v9; 1021 #if defined(CONFIG_DEBUG_FS) 1022 mqd->debugfs_show_mqd = debugfs_show_mqd; 1023 #endif 1024 if (KFD_GC_VERSION(dev) == IP_VERSION(9, 4, 3) || 1025 KFD_GC_VERSION(dev) == IP_VERSION(9, 4, 4) || 1026 KFD_GC_VERSION(dev) == IP_VERSION(9, 5, 0)) { 1027 mqd->init_mqd = init_mqd_v9_4_3; 1028 mqd->load_mqd = load_mqd_v9_4_3; 1029 mqd->update_mqd = update_mqd_v9_4_3; 1030 mqd->destroy_mqd = destroy_mqd_v9_4_3; 1031 mqd->get_wave_state = get_wave_state_v9_4_3; 1032 mqd->checkpoint_mqd = checkpoint_mqd_v9_4_3; 1033 mqd->restore_mqd = restore_mqd_v9_4_3; 1034 } else { 1035 mqd->init_mqd = init_mqd; 1036 mqd->load_mqd = load_mqd; 1037 mqd->update_mqd = update_mqd; 1038 mqd->destroy_mqd = kfd_destroy_mqd_cp; 1039 mqd->get_wave_state = get_wave_state; 1040 mqd->checkpoint_mqd = checkpoint_mqd; 1041 mqd->restore_mqd = restore_mqd; 1042 } 1043 break; 1044 case KFD_MQD_TYPE_HIQ: 1045 mqd->allocate_mqd = allocate_hiq_mqd; 1046 mqd->free_mqd = free_mqd_hiq_sdma; 1047 mqd->update_mqd = update_mqd; 1048 mqd->is_occupied = kfd_is_occupied_cp; 1049 mqd->mqd_size = sizeof(struct v9_mqd); 1050 mqd->mqd_stride = kfd_mqd_stride; 1051 #if defined(CONFIG_DEBUG_FS) 1052 mqd->debugfs_show_mqd = debugfs_show_mqd; 1053 #endif 1054 mqd->check_preemption_failed = check_preemption_failed; 1055 if (KFD_GC_VERSION(dev) == IP_VERSION(9, 4, 3) || 1056 KFD_GC_VERSION(dev) == IP_VERSION(9, 4, 4) || 1057 KFD_GC_VERSION(dev) == IP_VERSION(9, 5, 0)) { 1058 mqd->init_mqd = init_mqd_hiq_v9_4_3; 1059 mqd->load_mqd = hiq_load_mqd_kiq_v9_4_3; 1060 mqd->destroy_mqd = destroy_hiq_mqd_v9_4_3; 1061 mqd->check_preemption_failed = check_preemption_failed_v9_4_3; 1062 } else { 1063 mqd->init_mqd = init_mqd_hiq; 1064 mqd->load_mqd = kfd_hiq_load_mqd_kiq; 1065 mqd->destroy_mqd = destroy_hiq_mqd; 1066 mqd->check_preemption_failed = check_preemption_failed; 1067 } 1068 break; 1069 case KFD_MQD_TYPE_DIQ: 1070 mqd->allocate_mqd = allocate_mqd; 1071 mqd->init_mqd = init_mqd_hiq; 1072 mqd->free_mqd = kfd_free_mqd_cp; 1073 mqd->load_mqd = load_mqd; 1074 mqd->update_mqd = update_mqd; 1075 mqd->destroy_mqd = kfd_destroy_mqd_cp; 1076 mqd->is_occupied = kfd_is_occupied_cp; 1077 mqd->mqd_size = sizeof(struct v9_mqd); 1078 #if defined(CONFIG_DEBUG_FS) 1079 mqd->debugfs_show_mqd = debugfs_show_mqd; 1080 #endif 1081 break; 1082 case KFD_MQD_TYPE_SDMA: 1083 mqd->allocate_mqd = allocate_sdma_mqd; 1084 mqd->init_mqd = init_mqd_sdma; 1085 mqd->free_mqd = free_mqd_hiq_sdma; 1086 mqd->load_mqd = kfd_load_mqd_sdma; 1087 mqd->update_mqd = update_mqd_sdma; 1088 mqd->destroy_mqd = kfd_destroy_mqd_sdma; 1089 mqd->is_occupied = kfd_is_occupied_sdma; 1090 mqd->checkpoint_mqd = checkpoint_mqd_sdma; 1091 mqd->restore_mqd = restore_mqd_sdma; 1092 mqd->mqd_size = sizeof(struct v9_sdma_mqd); 1093 mqd->mqd_stride = kfd_mqd_stride; 1094 #if defined(CONFIG_DEBUG_FS) 1095 mqd->debugfs_show_mqd = debugfs_show_mqd_sdma; 1096 #endif 1097 break; 1098 default: 1099 kfree(mqd); 1100 return NULL; 1101 } 1102 1103 return mqd; 1104 } 1105