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 struct kfd_mem_obj *allocate_mqd(struct mqd_manager *mm, 120 struct queue_properties *q) 121 { 122 int retval; 123 struct kfd_node *node = mm->dev; 124 struct kfd_mem_obj *mqd_mem_obj = NULL; 125 126 /* For V9 only, due to a HW bug, the control stack of a user mode 127 * compute queue needs to be allocated just behind the page boundary 128 * of its regular MQD buffer. So we allocate an enlarged MQD buffer: 129 * the first page of the buffer serves as the regular MQD buffer 130 * purpose and the remaining is for control stack. Although the two 131 * parts are in the same buffer object, they need different memory 132 * types: MQD part needs UC (uncached) as usual, while control stack 133 * needs NC (non coherent), which is different from the UC type which 134 * is used when control stack is allocated in user space. 135 * 136 * Because of all those, we use the gtt allocation function instead 137 * of sub-allocation function for this enlarged MQD buffer. Moreover, 138 * in order to achieve two memory types in a single buffer object, we 139 * pass a special bo flag AMDGPU_GEM_CREATE_CP_MQD_GFX9 to instruct 140 * amdgpu memory functions to do so. 141 */ 142 if (node->kfd->cwsr_enabled && (q->type == KFD_QUEUE_TYPE_COMPUTE)) { 143 mqd_mem_obj = kzalloc_obj(struct kfd_mem_obj); 144 if (!mqd_mem_obj) 145 return NULL; 146 retval = amdgpu_amdkfd_alloc_kernel_mem(node->adev, 147 (ALIGN(ALIGN(q->ctl_stack_size, AMDGPU_GPU_PAGE_SIZE) + 148 ALIGN(sizeof(struct v9_mqd), AMDGPU_GPU_PAGE_SIZE), PAGE_SIZE)) * 149 NUM_XCC(node->xcc_mask), 150 mqd_on_vram(node->adev) ? AMDGPU_GEM_DOMAIN_VRAM : 151 AMDGPU_GEM_DOMAIN_GTT, 152 &(mqd_mem_obj->mem), 153 &(mqd_mem_obj->gpu_addr), 154 (void *)&(mqd_mem_obj->cpu_ptr), true); 155 156 if (retval) { 157 kfree(mqd_mem_obj); 158 return NULL; 159 } 160 } else { 161 retval = kfd_gtt_sa_allocate(node, sizeof(struct v9_mqd), 162 &mqd_mem_obj); 163 if (retval) 164 return NULL; 165 } 166 167 return mqd_mem_obj; 168 } 169 170 static void init_mqd(struct mqd_manager *mm, void **mqd, 171 struct kfd_mem_obj *mqd_mem_obj, uint64_t *gart_addr, 172 struct queue_properties *q) 173 { 174 uint64_t addr; 175 struct v9_mqd *m; 176 177 m = (struct v9_mqd *) mqd_mem_obj->cpu_ptr; 178 addr = mqd_mem_obj->gpu_addr; 179 180 memset(m, 0, sizeof(struct v9_mqd)); 181 182 m->header = 0xC0310800; 183 m->compute_pipelinestat_enable = 1; 184 m->compute_static_thread_mgmt_se0 = 0xFFFFFFFF; 185 m->compute_static_thread_mgmt_se1 = 0xFFFFFFFF; 186 m->compute_static_thread_mgmt_se2 = 0xFFFFFFFF; 187 m->compute_static_thread_mgmt_se3 = 0xFFFFFFFF; 188 m->compute_static_thread_mgmt_se4 = 0xFFFFFFFF; 189 m->compute_static_thread_mgmt_se5 = 0xFFFFFFFF; 190 m->compute_static_thread_mgmt_se6 = 0xFFFFFFFF; 191 m->compute_static_thread_mgmt_se7 = 0xFFFFFFFF; 192 193 m->cp_hqd_persistent_state = CP_HQD_PERSISTENT_STATE__PRELOAD_REQ_MASK | 194 0x53 << CP_HQD_PERSISTENT_STATE__PRELOAD_SIZE__SHIFT; 195 196 m->cp_hqd_pq_control = 5 << CP_HQD_PQ_CONTROL__RPTR_BLOCK_SIZE__SHIFT; 197 m->cp_hqd_pq_control |= CP_HQD_PQ_CONTROL__UNORD_DISPATCH_MASK; 198 199 m->cp_mqd_control = 1 << CP_MQD_CONTROL__PRIV_STATE__SHIFT; 200 201 m->cp_mqd_base_addr_lo = lower_32_bits(addr); 202 m->cp_mqd_base_addr_hi = upper_32_bits(addr); 203 204 m->cp_hqd_quantum = 1 << CP_HQD_QUANTUM__QUANTUM_EN__SHIFT | 205 1 << CP_HQD_QUANTUM__QUANTUM_SCALE__SHIFT | 206 1 << CP_HQD_QUANTUM__QUANTUM_DURATION__SHIFT; 207 208 /* Set cp_hqd_hq_scheduler0 bit 14 to 1 to have the CP set up the 209 * DISPATCH_PTR. This is required for the kfd debugger 210 */ 211 m->cp_hqd_hq_status0 = 1 << 14; 212 213 if (q->format == KFD_QUEUE_FORMAT_AQL) 214 m->cp_hqd_aql_control = 215 1 << CP_HQD_AQL_CONTROL__CONTROL0__SHIFT; 216 217 if (q->tba_addr) 218 m->compute_pgm_rsrc2 |= 219 (1 << COMPUTE_PGM_RSRC2__TRAP_PRESENT__SHIFT); 220 221 if (mm->dev->kfd->cwsr_enabled && q->ctx_save_restore_area_address) { 222 m->cp_hqd_persistent_state |= 223 (1 << CP_HQD_PERSISTENT_STATE__QSWITCH_MODE__SHIFT); 224 m->cp_hqd_ctx_save_base_addr_lo = 225 lower_32_bits(q->ctx_save_restore_area_address); 226 m->cp_hqd_ctx_save_base_addr_hi = 227 upper_32_bits(q->ctx_save_restore_area_address); 228 m->cp_hqd_ctx_save_size = q->ctx_save_restore_area_size; 229 m->cp_hqd_cntl_stack_size = q->ctl_stack_size; 230 m->cp_hqd_cntl_stack_offset = q->ctl_stack_size; 231 m->cp_hqd_wg_state_offset = q->ctl_stack_size; 232 } 233 234 mutex_lock(&mm->dev->kfd->profiler_lock); 235 if (mm->dev->kfd->profiler_process != NULL) 236 m->compute_perfcount_enable = 1; 237 mutex_unlock(&mm->dev->kfd->profiler_lock); 238 239 *mqd = m; 240 if (gart_addr) 241 *gart_addr = addr; 242 update_mqd(mm, m, q, NULL); 243 } 244 245 static int load_mqd(struct mqd_manager *mm, void *mqd, 246 uint32_t pipe_id, uint32_t queue_id, 247 struct queue_properties *p, struct mm_struct *mms) 248 { 249 /* AQL write pointer counts in 64B packets, PM4/CP counts in dwords. */ 250 uint32_t wptr_shift = (p->format == KFD_QUEUE_FORMAT_AQL ? 4 : 0); 251 252 return mm->dev->kfd2kgd->hqd_load(mm->dev->adev, mqd, pipe_id, queue_id, 253 (uint32_t __user *)p->write_ptr, 254 wptr_shift, 0, mms, 0); 255 } 256 257 static void update_mqd(struct mqd_manager *mm, void *mqd, 258 struct queue_properties *q, 259 struct mqd_update_info *minfo) 260 { 261 struct v9_mqd *m; 262 263 m = get_mqd(mqd); 264 265 m->cp_hqd_pq_control &= ~CP_HQD_PQ_CONTROL__QUEUE_SIZE_MASK; 266 m->cp_hqd_pq_control |= order_base_2(q->queue_size / 4) - 1; 267 pr_debug("cp_hqd_pq_control 0x%x\n", m->cp_hqd_pq_control); 268 269 m->cp_hqd_pq_base_lo = lower_32_bits((uint64_t)q->queue_address >> 8); 270 m->cp_hqd_pq_base_hi = upper_32_bits((uint64_t)q->queue_address >> 8); 271 272 m->cp_hqd_pq_rptr_report_addr_lo = lower_32_bits((uint64_t)q->read_ptr); 273 m->cp_hqd_pq_rptr_report_addr_hi = upper_32_bits((uint64_t)q->read_ptr); 274 m->cp_hqd_pq_wptr_poll_addr_lo = lower_32_bits((uint64_t)q->write_ptr); 275 m->cp_hqd_pq_wptr_poll_addr_hi = upper_32_bits((uint64_t)q->write_ptr); 276 277 m->cp_hqd_pq_doorbell_control = 278 q->doorbell_off << 279 CP_HQD_PQ_DOORBELL_CONTROL__DOORBELL_OFFSET__SHIFT; 280 pr_debug("cp_hqd_pq_doorbell_control 0x%x\n", 281 m->cp_hqd_pq_doorbell_control); 282 283 m->cp_hqd_ib_control = 284 3 << CP_HQD_IB_CONTROL__MIN_IB_AVAIL_SIZE__SHIFT | 285 1 << CP_HQD_IB_CONTROL__IB_EXE_DISABLE__SHIFT; 286 287 /* 288 * HW does not clamp this field correctly. Maximum EOP queue size 289 * is constrained by per-SE EOP done signal count, which is 8-bit. 290 * Limit is 0xFF EOP entries (= 0x7F8 dwords). CP will not submit 291 * more than (EOP entry count - 1) so a queue size of 0x800 dwords 292 * is safe, giving a maximum field value of 0xA. 293 * 294 * Also, do calculation only if EOP is used (size > 0), otherwise 295 * the order_base_2 calculation provides incorrect result. 296 * 297 */ 298 m->cp_hqd_eop_control = q->eop_ring_buffer_size ? 299 min(0xA, order_base_2(q->eop_ring_buffer_size / 4) - 1) : 0; 300 301 m->cp_hqd_eop_base_addr_lo = 302 lower_32_bits(q->eop_ring_buffer_address >> 8); 303 m->cp_hqd_eop_base_addr_hi = 304 upper_32_bits(q->eop_ring_buffer_address >> 8); 305 306 m->cp_hqd_iq_timer = 0; 307 308 m->cp_hqd_vmid = q->vmid; 309 310 if (q->format == KFD_QUEUE_FORMAT_AQL) { 311 m->cp_hqd_pq_control |= CP_HQD_PQ_CONTROL__NO_UPDATE_RPTR_MASK | 312 2 << CP_HQD_PQ_CONTROL__SLOT_BASED_WPTR__SHIFT | 313 1 << CP_HQD_PQ_CONTROL__QUEUE_FULL_EN__SHIFT | 314 1 << CP_HQD_PQ_CONTROL__WPP_CLAMP_EN__SHIFT; 315 m->cp_hqd_pq_doorbell_control |= 1 << 316 CP_HQD_PQ_DOORBELL_CONTROL__DOORBELL_BIF_DROP__SHIFT; 317 } 318 if (mm->dev->kfd->cwsr_enabled && q->ctx_save_restore_area_address) 319 m->cp_hqd_ctx_save_control = 0; 320 321 if (minfo) { 322 if (minfo->update_flag == UPDATE_FLAG_PERFCOUNT_ENABLE) 323 m->compute_perfcount_enable = 1; 324 else if (minfo->update_flag == UPDATE_FLAG_PERFCOUNT_DISABLE) 325 m->compute_perfcount_enable = 0; 326 } 327 328 if (KFD_GC_VERSION(mm->dev) != IP_VERSION(9, 4, 3) && 329 KFD_GC_VERSION(mm->dev) != IP_VERSION(9, 4, 4) && 330 KFD_GC_VERSION(mm->dev) != IP_VERSION(9, 5, 0)) 331 update_cu_mask(mm, mqd, minfo, 0); 332 set_priority(m, q); 333 334 if (minfo && KFD_GC_VERSION(mm->dev) >= IP_VERSION(9, 4, 2)) { 335 if (minfo->update_flag & UPDATE_FLAG_IS_GWS) 336 m->compute_resource_limits |= 337 COMPUTE_RESOURCE_LIMITS__FORCE_SIMD_DIST_MASK; 338 else 339 m->compute_resource_limits &= 340 ~COMPUTE_RESOURCE_LIMITS__FORCE_SIMD_DIST_MASK; 341 } 342 343 q->is_active = QUEUE_IS_ACTIVE(*q); 344 } 345 346 347 static bool check_preemption_failed(struct mqd_manager *mm, void *mqd) 348 { 349 struct v9_mqd *m = (struct v9_mqd *)mqd; 350 uint32_t doorbell_id = m->queue_doorbell_id0; 351 352 m->queue_doorbell_id0 = 0; 353 354 return kfd_check_hiq_mqd_doorbell_id(mm->dev, doorbell_id, 0); 355 } 356 357 static int get_wave_state(struct mqd_manager *mm, void *mqd, 358 struct queue_properties *q, 359 void __user *ctl_stack, 360 u32 *ctl_stack_used_size, 361 u32 *save_area_used_size) 362 { 363 struct v9_mqd *m; 364 struct kfd_context_save_area_header header; 365 u32 cntl_stack_size; 366 u32 cntl_stack_offset; 367 368 /* Control stack is located one page after MQD. */ 369 void *mqd_ctl_stack = (void *)((uintptr_t)mqd + AMDGPU_GPU_PAGE_SIZE); 370 371 m = get_mqd(mqd); 372 cntl_stack_size = min_t(u32, m->cp_hqd_cntl_stack_size, q->ctl_stack_size); 373 cntl_stack_offset = min_t(u32, m->cp_hqd_cntl_stack_offset, cntl_stack_size); 374 375 *ctl_stack_used_size = m->cp_hqd_cntl_stack_size - 376 m->cp_hqd_cntl_stack_offset; 377 *save_area_used_size = m->cp_hqd_wg_state_offset - 378 m->cp_hqd_cntl_stack_size; 379 380 header.wave_state.control_stack_size = *ctl_stack_used_size; 381 header.wave_state.wave_state_size = *save_area_used_size; 382 383 header.wave_state.wave_state_offset = m->cp_hqd_wg_state_offset; 384 header.wave_state.control_stack_offset = m->cp_hqd_cntl_stack_offset; 385 386 if (copy_to_user(ctl_stack, &header, sizeof(header.wave_state))) 387 return -EFAULT; 388 389 *ctl_stack_used_size = cntl_stack_size - cntl_stack_offset; 390 391 if (copy_to_user(ctl_stack + cntl_stack_offset, mqd_ctl_stack + cntl_stack_offset, 392 *ctl_stack_used_size)) 393 return -EFAULT; 394 395 return 0; 396 } 397 398 static int get_checkpoint_info(struct mqd_manager *mm, void *mqd, u32 *ctl_stack_size) 399 { 400 struct v9_mqd *m = get_mqd(mqd); 401 u32 per_xcc_size; 402 403 per_xcc_size = min_t(u32, m->cp_hqd_cntl_stack_size, mm->ctl_stack_size); 404 405 if (check_mul_overflow(per_xcc_size, NUM_XCC(mm->dev->xcc_mask), ctl_stack_size)) 406 return -EINVAL; 407 408 return 0; 409 } 410 411 static void checkpoint_mqd(struct mqd_manager *mm, void *mqd, void *mqd_dst, void *ctl_stack_dst) 412 { 413 struct v9_mqd *m; 414 u32 ctl_stack_copy_size; 415 /* Control stack is located one page after MQD. */ 416 void *ctl_stack = (void *)((uintptr_t)mqd + AMDGPU_GPU_PAGE_SIZE); 417 418 m = get_mqd(mqd); 419 ctl_stack_copy_size = min_t(u32, m->cp_hqd_cntl_stack_size, mm->ctl_stack_size); 420 421 memcpy(mqd_dst, m, sizeof(struct v9_mqd)); 422 memcpy(ctl_stack_dst, ctl_stack, ctl_stack_copy_size); 423 } 424 425 static void checkpoint_mqd_v9_4_3(struct mqd_manager *mm, 426 void *mqd, 427 void *mqd_dst, 428 void *ctl_stack_dst) 429 { 430 struct v9_mqd *m; 431 u32 ctl_stack_stride; 432 int xcc; 433 uint64_t size = get_mqd(mqd)->cp_mqd_stride_size; 434 435 ctl_stack_stride = min_t(u32, get_mqd(mqd)->cp_hqd_cntl_stack_size, 436 mm->ctl_stack_size); 437 438 for (xcc = 0; xcc < NUM_XCC(mm->dev->xcc_mask); xcc++) { 439 m = get_mqd(mqd + size * xcc); 440 441 checkpoint_mqd(mm, m, 442 (uint8_t *)mqd_dst + sizeof(*m) * xcc, 443 (uint8_t *)ctl_stack_dst + ctl_stack_stride * xcc); 444 } 445 } 446 447 static void restore_mqd(struct mqd_manager *mm, void **mqd, 448 struct kfd_mem_obj *mqd_mem_obj, uint64_t *gart_addr, 449 struct queue_properties *qp, 450 const void *mqd_src, 451 const void *ctl_stack_src, u32 ctl_stack_size) 452 { 453 uint64_t addr; 454 struct v9_mqd *m; 455 void *ctl_stack; 456 457 m = (struct v9_mqd *) mqd_mem_obj->cpu_ptr; 458 addr = mqd_mem_obj->gpu_addr; 459 460 memcpy(m, mqd_src, sizeof(*m)); 461 462 *mqd = m; 463 if (gart_addr) 464 *gart_addr = addr; 465 466 /* Control stack is located one page after MQD. */ 467 ctl_stack = (void *)((uintptr_t)*mqd + AMDGPU_GPU_PAGE_SIZE); 468 memcpy(ctl_stack, ctl_stack_src, ctl_stack_size); 469 470 m->cp_hqd_pq_doorbell_control = 471 qp->doorbell_off << 472 CP_HQD_PQ_DOORBELL_CONTROL__DOORBELL_OFFSET__SHIFT; 473 pr_debug("cp_hqd_pq_doorbell_control 0x%x\n", 474 m->cp_hqd_pq_doorbell_control); 475 476 qp->is_active = 0; 477 } 478 479 static void update_mqd_gpu_addr(struct mqd_manager *mm, void *mqd, 480 struct kfd_mem_obj *mqd_mem_obj, 481 struct queue_properties *qp) 482 { 483 struct v9_mqd *m = get_mqd(mqd); 484 uint64_t addr = mqd_mem_obj->gpu_addr; 485 486 m->cp_mqd_base_addr_lo = lower_32_bits(addr); 487 m->cp_mqd_base_addr_hi = upper_32_bits(addr); 488 489 if (mqd_on_vram(mm->dev->adev)) 490 amdgpu_device_flush_hdp(mm->dev->adev, NULL); 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 878 static void update_mqd_gpu_addr_v9_4_3(struct mqd_manager *mm, void *mqd, 879 struct kfd_mem_obj *mqd_mem_obj, 880 struct queue_properties *qp) 881 { 882 struct kfd_mem_obj xcc_mqd_mem_obj; 883 uint64_t offset = mm->mqd_stride(mm, qp); 884 u32 num_xcc = NUM_XCC(mm->dev->xcc_mask); 885 struct v9_mqd *m; 886 int xcc; 887 888 memset(&xcc_mqd_mem_obj, 0x0, sizeof(struct kfd_mem_obj)); 889 890 for (xcc = 0; xcc < num_xcc; xcc++) { 891 get_xcc_mqd(mqd_mem_obj, &xcc_mqd_mem_obj, offset * xcc); 892 m = get_mqd(mqd + offset * xcc); 893 m->cp_mqd_base_addr_lo = lower_32_bits(xcc_mqd_mem_obj.gpu_addr); 894 m->cp_mqd_base_addr_hi = upper_32_bits(xcc_mqd_mem_obj.gpu_addr); 895 } 896 897 if (mqd_on_vram(mm->dev->adev)) 898 amdgpu_device_flush_hdp(mm->dev->adev, NULL); 899 } 900 901 static int destroy_mqd_v9_4_3(struct mqd_manager *mm, void *mqd, 902 enum kfd_preempt_type type, unsigned int timeout, 903 uint32_t pipe_id, uint32_t queue_id) 904 { 905 uint32_t xcc_mask = mm->dev->xcc_mask; 906 int xcc_id, err = 0, inst = 0; 907 void *xcc_mqd; 908 struct v9_mqd *m; 909 uint64_t mqd_offset; 910 911 m = get_mqd(mqd); 912 mqd_offset = m->cp_mqd_stride_size; 913 914 for_each_inst(xcc_id, xcc_mask) { 915 xcc_mqd = mqd + mqd_offset * inst; 916 err = mm->dev->kfd2kgd->hqd_destroy(mm->dev->adev, xcc_mqd, 917 type, timeout, pipe_id, 918 queue_id, xcc_id); 919 if (err) { 920 pr_debug("Destroy MQD failed for xcc: %d\n", inst); 921 break; 922 } 923 ++inst; 924 } 925 926 return err; 927 } 928 929 static int load_mqd_v9_4_3(struct mqd_manager *mm, void *mqd, 930 uint32_t pipe_id, uint32_t queue_id, 931 struct queue_properties *p, struct mm_struct *mms) 932 { 933 /* AQL write pointer counts in 64B packets, PM4/CP counts in dwords. */ 934 uint32_t wptr_shift = (p->format == KFD_QUEUE_FORMAT_AQL ? 4 : 0); 935 uint32_t xcc_mask = mm->dev->xcc_mask; 936 int xcc_id, err = 0, inst = 0; 937 void *xcc_mqd; 938 uint64_t mqd_stride_size = mm->mqd_stride(mm, p); 939 940 for_each_inst(xcc_id, xcc_mask) { 941 xcc_mqd = mqd + mqd_stride_size * inst; 942 err = mm->dev->kfd2kgd->hqd_load( 943 mm->dev->adev, xcc_mqd, pipe_id, queue_id, 944 (uint32_t __user *)p->write_ptr, wptr_shift, 0, mms, 945 xcc_id); 946 if (err) { 947 pr_debug("Load MQD failed for xcc: %d\n", inst); 948 break; 949 } 950 ++inst; 951 } 952 953 return err; 954 } 955 956 static int get_wave_state_v9_4_3(struct mqd_manager *mm, void *mqd, 957 struct queue_properties *q, 958 void __user *ctl_stack, 959 u32 *ctl_stack_used_size, 960 u32 *save_area_used_size) 961 { 962 int xcc, err = 0; 963 void *xcc_mqd; 964 void __user *xcc_ctl_stack; 965 uint64_t mqd_stride_size = mm->mqd_stride(mm, q); 966 u32 tmp_ctl_stack_used_size = 0, tmp_save_area_used_size = 0; 967 968 for (xcc = 0; xcc < NUM_XCC(mm->dev->xcc_mask); xcc++) { 969 xcc_mqd = mqd + mqd_stride_size * xcc; 970 xcc_ctl_stack = (void __user *)((uintptr_t)ctl_stack + 971 q->ctx_save_restore_area_size * xcc); 972 973 err = get_wave_state(mm, xcc_mqd, q, xcc_ctl_stack, 974 &tmp_ctl_stack_used_size, 975 &tmp_save_area_used_size); 976 if (err) 977 break; 978 979 /* 980 * Set the ctl_stack_used_size and save_area_used_size to 981 * ctl_stack_used_size and save_area_used_size of XCC 0 when 982 * passing the info the user-space. 983 * For multi XCC, user-space would have to look at the header 984 * info of each Control stack area to determine the control 985 * stack size and save area used. 986 */ 987 if (xcc == 0) { 988 *ctl_stack_used_size = tmp_ctl_stack_used_size; 989 *save_area_used_size = tmp_save_area_used_size; 990 } 991 } 992 993 return err; 994 } 995 996 #if defined(CONFIG_DEBUG_FS) 997 998 static int debugfs_show_mqd(struct seq_file *m, void *data) 999 { 1000 seq_hex_dump(m, " ", DUMP_PREFIX_OFFSET, 32, 4, 1001 data, sizeof(struct v9_mqd), false); 1002 return 0; 1003 } 1004 1005 static int debugfs_show_mqd_sdma(struct seq_file *m, void *data) 1006 { 1007 seq_hex_dump(m, " ", DUMP_PREFIX_OFFSET, 32, 4, 1008 data, sizeof(struct v9_sdma_mqd), false); 1009 return 0; 1010 } 1011 1012 #endif 1013 1014 struct mqd_manager *mqd_manager_init_v9(enum KFD_MQD_TYPE type, 1015 struct kfd_node *dev) 1016 { 1017 struct mqd_manager *mqd; 1018 1019 if (WARN_ON(type >= KFD_MQD_TYPE_MAX)) 1020 return NULL; 1021 1022 mqd = kzalloc_obj(*mqd); 1023 if (!mqd) 1024 return NULL; 1025 1026 mqd->dev = dev; 1027 1028 switch (type) { 1029 case KFD_MQD_TYPE_CP: 1030 mqd->allocate_mqd = allocate_mqd; 1031 mqd->free_mqd = kfd_free_mqd_cp; 1032 mqd->is_occupied = kfd_is_occupied_cp; 1033 mqd->get_checkpoint_info = get_checkpoint_info; 1034 mqd->mqd_size = sizeof(struct v9_mqd); 1035 if (dev->kfd->cwsr_enabled) { 1036 struct kfd_topology_device *topo_dev; 1037 1038 topo_dev = kfd_topology_device_by_id(dev->id); 1039 if (topo_dev) 1040 mqd->ctl_stack_size = 1041 ALIGN(topo_dev->node_props.ctl_stack_size, 1042 AMDGPU_GPU_PAGE_SIZE); 1043 } 1044 mqd->mqd_stride = mqd_stride_v9; 1045 #if defined(CONFIG_DEBUG_FS) 1046 mqd->debugfs_show_mqd = debugfs_show_mqd; 1047 #endif 1048 if (KFD_GC_VERSION(dev) == IP_VERSION(9, 4, 3) || 1049 KFD_GC_VERSION(dev) == IP_VERSION(9, 4, 4) || 1050 KFD_GC_VERSION(dev) == IP_VERSION(9, 5, 0)) { 1051 mqd->init_mqd = init_mqd_v9_4_3; 1052 mqd->load_mqd = load_mqd_v9_4_3; 1053 mqd->update_mqd = update_mqd_v9_4_3; 1054 mqd->destroy_mqd = destroy_mqd_v9_4_3; 1055 mqd->get_wave_state = get_wave_state_v9_4_3; 1056 mqd->checkpoint_mqd = checkpoint_mqd_v9_4_3; 1057 mqd->restore_mqd = restore_mqd_v9_4_3; 1058 mqd->update_mqd_gpu_addr = update_mqd_gpu_addr_v9_4_3; 1059 } else { 1060 mqd->init_mqd = init_mqd; 1061 mqd->load_mqd = load_mqd; 1062 mqd->update_mqd = update_mqd; 1063 mqd->destroy_mqd = kfd_destroy_mqd_cp; 1064 mqd->get_wave_state = get_wave_state; 1065 mqd->checkpoint_mqd = checkpoint_mqd; 1066 mqd->restore_mqd = restore_mqd; 1067 mqd->update_mqd_gpu_addr = update_mqd_gpu_addr; 1068 } 1069 break; 1070 case KFD_MQD_TYPE_HIQ: 1071 mqd->allocate_mqd = allocate_hiq_mqd; 1072 mqd->free_mqd = free_mqd_hiq_sdma; 1073 mqd->update_mqd = update_mqd; 1074 mqd->is_occupied = kfd_is_occupied_cp; 1075 mqd->mqd_size = sizeof(struct v9_mqd); 1076 mqd->mqd_stride = kfd_mqd_stride; 1077 #if defined(CONFIG_DEBUG_FS) 1078 mqd->debugfs_show_mqd = debugfs_show_mqd; 1079 #endif 1080 mqd->check_preemption_failed = check_preemption_failed; 1081 if (KFD_GC_VERSION(dev) == IP_VERSION(9, 4, 3) || 1082 KFD_GC_VERSION(dev) == IP_VERSION(9, 4, 4) || 1083 KFD_GC_VERSION(dev) == IP_VERSION(9, 5, 0)) { 1084 mqd->init_mqd = init_mqd_hiq_v9_4_3; 1085 mqd->load_mqd = hiq_load_mqd_kiq_v9_4_3; 1086 mqd->destroy_mqd = destroy_hiq_mqd_v9_4_3; 1087 mqd->check_preemption_failed = check_preemption_failed_v9_4_3; 1088 } else { 1089 mqd->init_mqd = init_mqd_hiq; 1090 mqd->load_mqd = kfd_hiq_load_mqd_kiq; 1091 mqd->destroy_mqd = destroy_hiq_mqd; 1092 mqd->check_preemption_failed = check_preemption_failed; 1093 } 1094 break; 1095 case KFD_MQD_TYPE_DIQ: 1096 mqd->allocate_mqd = allocate_mqd; 1097 mqd->init_mqd = init_mqd_hiq; 1098 mqd->free_mqd = kfd_free_mqd_cp; 1099 mqd->load_mqd = load_mqd; 1100 mqd->update_mqd = update_mqd; 1101 mqd->destroy_mqd = kfd_destroy_mqd_cp; 1102 mqd->is_occupied = kfd_is_occupied_cp; 1103 mqd->mqd_size = sizeof(struct v9_mqd); 1104 #if defined(CONFIG_DEBUG_FS) 1105 mqd->debugfs_show_mqd = debugfs_show_mqd; 1106 #endif 1107 break; 1108 case KFD_MQD_TYPE_SDMA: 1109 mqd->allocate_mqd = allocate_sdma_mqd; 1110 mqd->init_mqd = init_mqd_sdma; 1111 mqd->free_mqd = free_mqd_hiq_sdma; 1112 mqd->load_mqd = kfd_load_mqd_sdma; 1113 mqd->update_mqd = update_mqd_sdma; 1114 mqd->destroy_mqd = kfd_destroy_mqd_sdma; 1115 mqd->is_occupied = kfd_is_occupied_sdma; 1116 mqd->checkpoint_mqd = checkpoint_mqd_sdma; 1117 mqd->restore_mqd = restore_mqd_sdma; 1118 mqd->mqd_size = sizeof(struct v9_sdma_mqd); 1119 mqd->mqd_stride = kfd_mqd_stride; 1120 #if defined(CONFIG_DEBUG_FS) 1121 mqd->debugfs_show_mqd = debugfs_show_mqd_sdma; 1122 #endif 1123 break; 1124 default: 1125 kfree(mqd); 1126 return NULL; 1127 } 1128 1129 return mqd; 1130 } 1131