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 "v9_structs.h" 31 #include "gc/gc_9_0_offset.h" 32 #include "gc/gc_9_0_sh_mask.h" 33 #include "sdma0/sdma0_4_0_sh_mask.h" 34 #include "amdgpu_amdkfd.h" 35 #include "kfd_device_queue_manager.h" 36 37 static void update_mqd(struct mqd_manager *mm, void *mqd, 38 struct queue_properties *q, 39 struct mqd_update_info *minfo); 40 41 static uint64_t mqd_stride_v9(struct mqd_manager *mm, 42 struct queue_properties *q) 43 { 44 if (mm->dev->kfd->cwsr_enabled && 45 q->type == KFD_QUEUE_TYPE_COMPUTE) { 46 47 /* On gfxv9, the MQD resides in the first 4K page, 48 * followed by the control stack. Align both to 49 * AMDGPU_GPU_PAGE_SIZE to maintain the required 4K boundary. 50 */ 51 52 return ALIGN(ALIGN(q->ctl_stack_size, AMDGPU_GPU_PAGE_SIZE) + 53 ALIGN(sizeof(struct v9_mqd), AMDGPU_GPU_PAGE_SIZE), PAGE_SIZE); 54 } 55 56 return mm->mqd_size; 57 } 58 59 static inline struct v9_mqd *get_mqd(void *mqd) 60 { 61 return (struct v9_mqd *)mqd; 62 } 63 64 static inline struct v9_sdma_mqd *get_sdma_mqd(void *mqd) 65 { 66 return (struct v9_sdma_mqd *)mqd; 67 } 68 69 static void update_cu_mask(struct mqd_manager *mm, void *mqd, 70 struct mqd_update_info *minfo, uint32_t inst) 71 { 72 struct v9_mqd *m; 73 uint32_t se_mask[KFD_MAX_NUM_SE] = {0}; 74 75 if (!minfo || !minfo->cu_mask.ptr) 76 return; 77 78 mqd_symmetrically_map_cu_mask(mm, 79 minfo->cu_mask.ptr, minfo->cu_mask.count, se_mask, inst); 80 81 m = get_mqd(mqd); 82 83 m->compute_static_thread_mgmt_se0 = se_mask[0]; 84 m->compute_static_thread_mgmt_se1 = se_mask[1]; 85 m->compute_static_thread_mgmt_se2 = se_mask[2]; 86 m->compute_static_thread_mgmt_se3 = se_mask[3]; 87 if (KFD_GC_VERSION(mm->dev) != IP_VERSION(9, 4, 3) && 88 KFD_GC_VERSION(mm->dev) != IP_VERSION(9, 4, 4) && 89 KFD_GC_VERSION(mm->dev) != IP_VERSION(9, 5, 0)) { 90 m->compute_static_thread_mgmt_se4 = se_mask[4]; 91 m->compute_static_thread_mgmt_se5 = se_mask[5]; 92 m->compute_static_thread_mgmt_se6 = se_mask[6]; 93 m->compute_static_thread_mgmt_se7 = se_mask[7]; 94 95 pr_debug("update cu mask to %#x %#x %#x %#x %#x %#x %#x %#x\n", 96 m->compute_static_thread_mgmt_se0, 97 m->compute_static_thread_mgmt_se1, 98 m->compute_static_thread_mgmt_se2, 99 m->compute_static_thread_mgmt_se3, 100 m->compute_static_thread_mgmt_se4, 101 m->compute_static_thread_mgmt_se5, 102 m->compute_static_thread_mgmt_se6, 103 m->compute_static_thread_mgmt_se7); 104 } else { 105 pr_debug("inst: %u, update cu mask to %#x %#x %#x %#x\n", 106 inst, m->compute_static_thread_mgmt_se0, 107 m->compute_static_thread_mgmt_se1, 108 m->compute_static_thread_mgmt_se2, 109 m->compute_static_thread_mgmt_se3); 110 } 111 } 112 113 static void set_priority(struct v9_mqd *m, struct queue_properties *q) 114 { 115 m->cp_hqd_pipe_priority = pipe_priority_map[q->priority]; 116 /* m->cp_hqd_queue_priority = 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 236 if (mm->dev->kfd->cwsr_enabled && q->ctx_save_restore_area_address) { 237 m->cp_hqd_persistent_state |= 238 (1 << CP_HQD_PERSISTENT_STATE__QSWITCH_MODE__SHIFT); 239 m->cp_hqd_ctx_save_base_addr_lo = 240 lower_32_bits(q->ctx_save_restore_area_address); 241 m->cp_hqd_ctx_save_base_addr_hi = 242 upper_32_bits(q->ctx_save_restore_area_address); 243 m->cp_hqd_ctx_save_size = q->ctx_save_restore_area_size; 244 m->cp_hqd_cntl_stack_size = q->ctl_stack_size; 245 m->cp_hqd_cntl_stack_offset = q->ctl_stack_size; 246 m->cp_hqd_wg_state_offset = q->ctl_stack_size; 247 } 248 249 *mqd = m; 250 if (gart_addr) 251 *gart_addr = addr; 252 update_mqd(mm, m, q, NULL); 253 } 254 255 static int load_mqd(struct mqd_manager *mm, void *mqd, 256 uint32_t pipe_id, uint32_t queue_id, 257 struct queue_properties *p, struct mm_struct *mms) 258 { 259 /* AQL write pointer counts in 64B packets, PM4/CP counts in dwords. */ 260 uint32_t wptr_shift = (p->format == KFD_QUEUE_FORMAT_AQL ? 4 : 0); 261 262 return mm->dev->kfd2kgd->hqd_load(mm->dev->adev, mqd, pipe_id, queue_id, 263 (uint32_t __user *)p->write_ptr, 264 wptr_shift, 0, mms, 0); 265 } 266 267 static void update_mqd(struct mqd_manager *mm, void *mqd, 268 struct queue_properties *q, 269 struct mqd_update_info *minfo) 270 { 271 struct v9_mqd *m; 272 273 m = get_mqd(mqd); 274 275 m->cp_hqd_pq_control &= ~CP_HQD_PQ_CONTROL__QUEUE_SIZE_MASK; 276 m->cp_hqd_pq_control |= order_base_2(q->queue_size / 4) - 1; 277 pr_debug("cp_hqd_pq_control 0x%x\n", m->cp_hqd_pq_control); 278 279 m->cp_hqd_pq_base_lo = lower_32_bits((uint64_t)q->queue_address >> 8); 280 m->cp_hqd_pq_base_hi = upper_32_bits((uint64_t)q->queue_address >> 8); 281 282 m->cp_hqd_pq_rptr_report_addr_lo = lower_32_bits((uint64_t)q->read_ptr); 283 m->cp_hqd_pq_rptr_report_addr_hi = upper_32_bits((uint64_t)q->read_ptr); 284 m->cp_hqd_pq_wptr_poll_addr_lo = lower_32_bits((uint64_t)q->write_ptr); 285 m->cp_hqd_pq_wptr_poll_addr_hi = upper_32_bits((uint64_t)q->write_ptr); 286 287 m->cp_hqd_pq_doorbell_control = 288 q->doorbell_off << 289 CP_HQD_PQ_DOORBELL_CONTROL__DOORBELL_OFFSET__SHIFT; 290 pr_debug("cp_hqd_pq_doorbell_control 0x%x\n", 291 m->cp_hqd_pq_doorbell_control); 292 293 m->cp_hqd_ib_control = 294 3 << CP_HQD_IB_CONTROL__MIN_IB_AVAIL_SIZE__SHIFT | 295 1 << CP_HQD_IB_CONTROL__IB_EXE_DISABLE__SHIFT; 296 297 /* 298 * HW does not clamp this field correctly. Maximum EOP queue size 299 * is constrained by per-SE EOP done signal count, which is 8-bit. 300 * Limit is 0xFF EOP entries (= 0x7F8 dwords). CP will not submit 301 * more than (EOP entry count - 1) so a queue size of 0x800 dwords 302 * is safe, giving a maximum field value of 0xA. 303 * 304 * Also, do calculation only if EOP is used (size > 0), otherwise 305 * the order_base_2 calculation provides incorrect result. 306 * 307 */ 308 m->cp_hqd_eop_control = q->eop_ring_buffer_size ? 309 min(0xA, order_base_2(q->eop_ring_buffer_size / 4) - 1) : 0; 310 311 m->cp_hqd_eop_base_addr_lo = 312 lower_32_bits(q->eop_ring_buffer_address >> 8); 313 m->cp_hqd_eop_base_addr_hi = 314 upper_32_bits(q->eop_ring_buffer_address >> 8); 315 316 m->cp_hqd_iq_timer = 0; 317 318 m->cp_hqd_vmid = q->vmid; 319 320 if (q->format == KFD_QUEUE_FORMAT_AQL) { 321 m->cp_hqd_pq_control |= CP_HQD_PQ_CONTROL__NO_UPDATE_RPTR_MASK | 322 2 << CP_HQD_PQ_CONTROL__SLOT_BASED_WPTR__SHIFT | 323 1 << CP_HQD_PQ_CONTROL__QUEUE_FULL_EN__SHIFT | 324 1 << CP_HQD_PQ_CONTROL__WPP_CLAMP_EN__SHIFT; 325 m->cp_hqd_pq_doorbell_control |= 1 << 326 CP_HQD_PQ_DOORBELL_CONTROL__DOORBELL_BIF_DROP__SHIFT; 327 } 328 if (mm->dev->kfd->cwsr_enabled && q->ctx_save_restore_area_address) 329 m->cp_hqd_ctx_save_control = 0; 330 331 if (KFD_GC_VERSION(mm->dev) != IP_VERSION(9, 4, 3) && 332 KFD_GC_VERSION(mm->dev) != IP_VERSION(9, 4, 4) && 333 KFD_GC_VERSION(mm->dev) != IP_VERSION(9, 5, 0)) 334 update_cu_mask(mm, mqd, minfo, 0); 335 set_priority(m, q); 336 337 if (minfo && KFD_GC_VERSION(mm->dev) >= IP_VERSION(9, 4, 2)) { 338 if (minfo->update_flag & UPDATE_FLAG_IS_GWS) 339 m->compute_resource_limits |= 340 COMPUTE_RESOURCE_LIMITS__FORCE_SIMD_DIST_MASK; 341 else 342 m->compute_resource_limits &= 343 ~COMPUTE_RESOURCE_LIMITS__FORCE_SIMD_DIST_MASK; 344 } 345 346 q->is_active = QUEUE_IS_ACTIVE(*q); 347 } 348 349 350 static bool check_preemption_failed(struct mqd_manager *mm, void *mqd) 351 { 352 struct v9_mqd *m = (struct v9_mqd *)mqd; 353 uint32_t doorbell_id = m->queue_doorbell_id0; 354 355 m->queue_doorbell_id0 = 0; 356 357 return kfd_check_hiq_mqd_doorbell_id(mm->dev, doorbell_id, 0); 358 } 359 360 static int get_wave_state(struct mqd_manager *mm, void *mqd, 361 struct queue_properties *q, 362 void __user *ctl_stack, 363 u32 *ctl_stack_used_size, 364 u32 *save_area_used_size) 365 { 366 struct v9_mqd *m; 367 struct kfd_context_save_area_header header; 368 369 /* Control stack is located one page after MQD. */ 370 void *mqd_ctl_stack = (void *)((uintptr_t)mqd + AMDGPU_GPU_PAGE_SIZE); 371 372 m = get_mqd(mqd); 373 374 *ctl_stack_used_size = m->cp_hqd_cntl_stack_size - 375 m->cp_hqd_cntl_stack_offset; 376 *save_area_used_size = m->cp_hqd_wg_state_offset - 377 m->cp_hqd_cntl_stack_size; 378 379 header.wave_state.control_stack_size = *ctl_stack_used_size; 380 header.wave_state.wave_state_size = *save_area_used_size; 381 382 header.wave_state.wave_state_offset = m->cp_hqd_wg_state_offset; 383 header.wave_state.control_stack_offset = m->cp_hqd_cntl_stack_offset; 384 385 if (copy_to_user(ctl_stack, &header, sizeof(header.wave_state))) 386 return -EFAULT; 387 388 if (copy_to_user(ctl_stack + m->cp_hqd_cntl_stack_offset, 389 mqd_ctl_stack + m->cp_hqd_cntl_stack_offset, 390 *ctl_stack_used_size)) 391 return -EFAULT; 392 393 return 0; 394 } 395 396 static void get_checkpoint_info(struct mqd_manager *mm, void *mqd, u32 *ctl_stack_size) 397 { 398 struct v9_mqd *m = get_mqd(mqd); 399 400 *ctl_stack_size = m->cp_hqd_cntl_stack_size * NUM_XCC(mm->dev->xcc_mask); 401 } 402 403 static void checkpoint_mqd(struct mqd_manager *mm, void *mqd, void *mqd_dst, void *ctl_stack_dst) 404 { 405 struct v9_mqd *m; 406 /* Control stack is located one page after MQD. */ 407 void *ctl_stack = (void *)((uintptr_t)mqd + AMDGPU_GPU_PAGE_SIZE); 408 409 m = get_mqd(mqd); 410 411 memcpy(mqd_dst, m, sizeof(struct v9_mqd)); 412 memcpy(ctl_stack_dst, ctl_stack, m->cp_hqd_cntl_stack_size); 413 } 414 415 static void checkpoint_mqd_v9_4_3(struct mqd_manager *mm, 416 void *mqd, 417 void *mqd_dst, 418 void *ctl_stack_dst) 419 { 420 struct v9_mqd *m; 421 int xcc; 422 uint64_t size = get_mqd(mqd)->cp_mqd_stride_size; 423 424 for (xcc = 0; xcc < NUM_XCC(mm->dev->xcc_mask); xcc++) { 425 m = get_mqd(mqd + size * xcc); 426 427 checkpoint_mqd(mm, m, 428 (uint8_t *)mqd_dst + sizeof(*m) * xcc, 429 (uint8_t *)ctl_stack_dst + m->cp_hqd_cntl_stack_size * xcc); 430 } 431 } 432 433 static void restore_mqd(struct mqd_manager *mm, void **mqd, 434 struct kfd_mem_obj *mqd_mem_obj, uint64_t *gart_addr, 435 struct queue_properties *qp, 436 const void *mqd_src, 437 const void *ctl_stack_src, u32 ctl_stack_size) 438 { 439 uint64_t addr; 440 struct v9_mqd *m; 441 void *ctl_stack; 442 443 m = (struct v9_mqd *) mqd_mem_obj->cpu_ptr; 444 addr = mqd_mem_obj->gpu_addr; 445 446 memcpy(m, mqd_src, sizeof(*m)); 447 448 *mqd = m; 449 if (gart_addr) 450 *gart_addr = addr; 451 452 /* Control stack is located one page after MQD. */ 453 ctl_stack = (void *)((uintptr_t)*mqd + AMDGPU_GPU_PAGE_SIZE); 454 memcpy(ctl_stack, ctl_stack_src, ctl_stack_size); 455 456 m->cp_hqd_pq_doorbell_control = 457 qp->doorbell_off << 458 CP_HQD_PQ_DOORBELL_CONTROL__DOORBELL_OFFSET__SHIFT; 459 pr_debug("cp_hqd_pq_doorbell_control 0x%x\n", 460 m->cp_hqd_pq_doorbell_control); 461 462 qp->is_active = 0; 463 } 464 465 static void init_mqd_hiq(struct mqd_manager *mm, void **mqd, 466 struct kfd_mem_obj *mqd_mem_obj, uint64_t *gart_addr, 467 struct queue_properties *q) 468 { 469 struct v9_mqd *m; 470 471 init_mqd(mm, mqd, mqd_mem_obj, gart_addr, q); 472 473 m = get_mqd(*mqd); 474 475 m->cp_hqd_pq_control |= 1 << CP_HQD_PQ_CONTROL__PRIV_STATE__SHIFT | 476 1 << CP_HQD_PQ_CONTROL__KMD_QUEUE__SHIFT; 477 } 478 479 static int destroy_hiq_mqd(struct mqd_manager *mm, void *mqd, 480 enum kfd_preempt_type type, unsigned int timeout, 481 uint32_t pipe_id, uint32_t queue_id) 482 { 483 int err; 484 struct v9_mqd *m; 485 u32 doorbell_off; 486 487 m = get_mqd(mqd); 488 489 doorbell_off = m->cp_hqd_pq_doorbell_control >> 490 CP_HQD_PQ_DOORBELL_CONTROL__DOORBELL_OFFSET__SHIFT; 491 err = amdgpu_amdkfd_unmap_hiq(mm->dev->adev, doorbell_off, 0); 492 if (err) 493 pr_debug("Destroy HIQ MQD failed: %d\n", err); 494 495 return err; 496 } 497 498 static void init_mqd_sdma(struct mqd_manager *mm, void **mqd, 499 struct kfd_mem_obj *mqd_mem_obj, uint64_t *gart_addr, 500 struct queue_properties *q) 501 { 502 struct v9_sdma_mqd *m; 503 504 m = (struct v9_sdma_mqd *) mqd_mem_obj->cpu_ptr; 505 506 memset(m, 0, sizeof(struct v9_sdma_mqd)); 507 508 *mqd = m; 509 if (gart_addr) 510 *gart_addr = mqd_mem_obj->gpu_addr; 511 512 mm->update_mqd(mm, m, q, NULL); 513 } 514 515 #define SDMA_RLC_DUMMY_DEFAULT 0xf 516 517 static void update_mqd_sdma(struct mqd_manager *mm, void *mqd, 518 struct queue_properties *q, 519 struct mqd_update_info *minfo) 520 { 521 struct v9_sdma_mqd *m; 522 523 m = get_sdma_mqd(mqd); 524 m->sdmax_rlcx_rb_cntl = order_base_2(q->queue_size / 4) 525 << SDMA0_RLC0_RB_CNTL__RB_SIZE__SHIFT | 526 q->vmid << SDMA0_RLC0_RB_CNTL__RB_VMID__SHIFT | 527 1 << SDMA0_RLC0_RB_CNTL__RPTR_WRITEBACK_ENABLE__SHIFT | 528 6 << SDMA0_RLC0_RB_CNTL__RPTR_WRITEBACK_TIMER__SHIFT; 529 530 m->sdmax_rlcx_rb_base = lower_32_bits(q->queue_address >> 8); 531 m->sdmax_rlcx_rb_base_hi = upper_32_bits(q->queue_address >> 8); 532 m->sdmax_rlcx_rb_rptr_addr_lo = lower_32_bits((uint64_t)q->read_ptr); 533 m->sdmax_rlcx_rb_rptr_addr_hi = upper_32_bits((uint64_t)q->read_ptr); 534 m->sdmax_rlcx_doorbell_offset = 535 q->doorbell_off << SDMA0_RLC0_DOORBELL_OFFSET__OFFSET__SHIFT; 536 537 m->sdma_engine_id = q->sdma_engine_id; 538 m->sdma_queue_id = q->sdma_queue_id; 539 m->sdmax_rlcx_dummy_reg = SDMA_RLC_DUMMY_DEFAULT; 540 /* Allow context switch so we don't cross-process starve with a massive 541 * command buffer of long-running SDMA commands 542 */ 543 m->sdmax_rlcx_ib_cntl |= SDMA0_GFX_IB_CNTL__SWITCH_INSIDE_IB_MASK; 544 545 q->is_active = QUEUE_IS_ACTIVE(*q); 546 } 547 548 static void checkpoint_mqd_sdma(struct mqd_manager *mm, 549 void *mqd, 550 void *mqd_dst, 551 void *ctl_stack_dst) 552 { 553 struct v9_sdma_mqd *m; 554 555 m = get_sdma_mqd(mqd); 556 557 memcpy(mqd_dst, m, sizeof(struct v9_sdma_mqd)); 558 } 559 560 static void restore_mqd_sdma(struct mqd_manager *mm, void **mqd, 561 struct kfd_mem_obj *mqd_mem_obj, uint64_t *gart_addr, 562 struct queue_properties *qp, 563 const void *mqd_src, 564 const void *ctl_stack_src, const u32 ctl_stack_size) 565 { 566 uint64_t addr; 567 struct v9_sdma_mqd *m; 568 569 m = (struct v9_sdma_mqd *) mqd_mem_obj->cpu_ptr; 570 addr = mqd_mem_obj->gpu_addr; 571 572 memcpy(m, mqd_src, sizeof(*m)); 573 574 m->sdmax_rlcx_doorbell_offset = 575 qp->doorbell_off << SDMA0_RLC0_DOORBELL_OFFSET__OFFSET__SHIFT; 576 577 *mqd = m; 578 if (gart_addr) 579 *gart_addr = addr; 580 581 qp->is_active = 0; 582 } 583 584 static void init_mqd_hiq_v9_4_3(struct mqd_manager *mm, void **mqd, 585 struct kfd_mem_obj *mqd_mem_obj, uint64_t *gart_addr, 586 struct queue_properties *q) 587 { 588 struct v9_mqd *m; 589 int xcc = 0; 590 struct kfd_mem_obj xcc_mqd_mem_obj; 591 uint64_t xcc_gart_addr = 0; 592 593 memset(&xcc_mqd_mem_obj, 0x0, sizeof(struct kfd_mem_obj)); 594 595 for (xcc = 0; xcc < NUM_XCC(mm->dev->xcc_mask); xcc++) { 596 kfd_get_hiq_xcc_mqd(mm->dev, &xcc_mqd_mem_obj, xcc); 597 598 init_mqd(mm, (void **)&m, &xcc_mqd_mem_obj, &xcc_gart_addr, q); 599 600 m->cp_hqd_pq_control |= CP_HQD_PQ_CONTROL__NO_UPDATE_RPTR_MASK | 601 1 << CP_HQD_PQ_CONTROL__PRIV_STATE__SHIFT | 602 1 << CP_HQD_PQ_CONTROL__KMD_QUEUE__SHIFT; 603 if (amdgpu_sriov_multi_vf_mode(mm->dev->adev)) 604 m->cp_hqd_pq_doorbell_control |= 1 << 605 CP_HQD_PQ_DOORBELL_CONTROL__DOORBELL_MODE__SHIFT; 606 m->cp_mqd_stride_size = kfd_hiq_mqd_stride(mm->dev); 607 if (xcc == 0) { 608 /* Set no_update_rptr = 0 in Master XCC */ 609 m->cp_hqd_pq_control &= ~CP_HQD_PQ_CONTROL__NO_UPDATE_RPTR_MASK; 610 611 /* Set the MQD pointer and gart address to XCC0 MQD */ 612 *mqd = m; 613 *gart_addr = xcc_gart_addr; 614 } 615 } 616 } 617 618 static int hiq_load_mqd_kiq_v9_4_3(struct mqd_manager *mm, void *mqd, 619 uint32_t pipe_id, uint32_t queue_id, 620 struct queue_properties *p, struct mm_struct *mms) 621 { 622 uint32_t xcc_mask = mm->dev->xcc_mask; 623 int xcc_id, err = 0, inst = 0; 624 void *xcc_mqd; 625 uint64_t hiq_mqd_size = kfd_hiq_mqd_stride(mm->dev); 626 627 for_each_inst(xcc_id, xcc_mask) { 628 xcc_mqd = mqd + hiq_mqd_size * inst; 629 err = mm->dev->kfd2kgd->hiq_mqd_load(mm->dev->adev, xcc_mqd, 630 pipe_id, queue_id, 631 p->doorbell_off, xcc_id); 632 if (err) { 633 pr_debug("Failed to load HIQ MQD for XCC: %d\n", inst); 634 break; 635 } 636 ++inst; 637 } 638 639 return err; 640 } 641 642 static int destroy_hiq_mqd_v9_4_3(struct mqd_manager *mm, void *mqd, 643 enum kfd_preempt_type type, unsigned int timeout, 644 uint32_t pipe_id, uint32_t queue_id) 645 { 646 uint32_t xcc_mask = mm->dev->xcc_mask; 647 int xcc_id, err = 0, inst = 0; 648 uint64_t hiq_mqd_size = kfd_hiq_mqd_stride(mm->dev); 649 struct v9_mqd *m; 650 u32 doorbell_off; 651 652 for_each_inst(xcc_id, xcc_mask) { 653 m = get_mqd(mqd + hiq_mqd_size * inst); 654 655 doorbell_off = m->cp_hqd_pq_doorbell_control >> 656 CP_HQD_PQ_DOORBELL_CONTROL__DOORBELL_OFFSET__SHIFT; 657 658 err = amdgpu_amdkfd_unmap_hiq(mm->dev->adev, doorbell_off, xcc_id); 659 if (err) { 660 pr_debug("Destroy HIQ MQD failed for xcc: %d\n", inst); 661 break; 662 } 663 ++inst; 664 } 665 666 return err; 667 } 668 669 static bool check_preemption_failed_v9_4_3(struct mqd_manager *mm, void *mqd) 670 { 671 uint64_t hiq_mqd_size = kfd_hiq_mqd_stride(mm->dev); 672 uint32_t xcc_mask = mm->dev->xcc_mask; 673 int inst = 0, xcc_id; 674 struct v9_mqd *m; 675 bool ret = false; 676 677 for_each_inst(xcc_id, xcc_mask) { 678 m = get_mqd(mqd + hiq_mqd_size * inst); 679 ret |= kfd_check_hiq_mqd_doorbell_id(mm->dev, 680 m->queue_doorbell_id0, inst); 681 m->queue_doorbell_id0 = 0; 682 ++inst; 683 } 684 685 return ret; 686 } 687 688 static void get_xcc_mqd(struct kfd_mem_obj *mqd_mem_obj, 689 struct kfd_mem_obj *xcc_mqd_mem_obj, 690 uint64_t offset) 691 { 692 xcc_mqd_mem_obj->mem = (offset == 0) ? 693 mqd_mem_obj->mem : NULL; 694 xcc_mqd_mem_obj->gpu_addr = mqd_mem_obj->gpu_addr + offset; 695 xcc_mqd_mem_obj->cpu_ptr = (uint32_t *)((uintptr_t)mqd_mem_obj->cpu_ptr 696 + offset); 697 } 698 699 static void init_mqd_v9_4_3(struct mqd_manager *mm, void **mqd, 700 struct kfd_mem_obj *mqd_mem_obj, uint64_t *gart_addr, 701 struct queue_properties *q) 702 { 703 struct v9_mqd *m; 704 int xcc = 0; 705 struct kfd_mem_obj xcc_mqd_mem_obj; 706 uint64_t xcc_gart_addr = 0; 707 uint64_t xcc_ctx_save_restore_area_address; 708 uint64_t offset = mm->mqd_stride(mm, q); 709 uint32_t local_xcc_start = mm->dev->dqm->current_logical_xcc_start++; 710 711 memset(&xcc_mqd_mem_obj, 0x0, sizeof(struct kfd_mem_obj)); 712 for (xcc = 0; xcc < NUM_XCC(mm->dev->xcc_mask); xcc++) { 713 get_xcc_mqd(mqd_mem_obj, &xcc_mqd_mem_obj, offset*xcc); 714 715 init_mqd(mm, (void **)&m, &xcc_mqd_mem_obj, &xcc_gart_addr, q); 716 if (amdgpu_sriov_multi_vf_mode(mm->dev->adev)) 717 m->cp_hqd_pq_doorbell_control |= 1 << 718 CP_HQD_PQ_DOORBELL_CONTROL__DOORBELL_MODE__SHIFT; 719 m->cp_mqd_stride_size = offset; 720 721 /* 722 * Update the CWSR address for each XCC if CWSR is enabled 723 * and CWSR area is allocated in thunk 724 */ 725 if (mm->dev->kfd->cwsr_enabled && 726 q->ctx_save_restore_area_address) { 727 xcc_ctx_save_restore_area_address = 728 q->ctx_save_restore_area_address + 729 (xcc * q->ctx_save_restore_area_size); 730 731 m->cp_hqd_ctx_save_base_addr_lo = 732 lower_32_bits(xcc_ctx_save_restore_area_address); 733 m->cp_hqd_ctx_save_base_addr_hi = 734 upper_32_bits(xcc_ctx_save_restore_area_address); 735 } 736 737 if (q->format == KFD_QUEUE_FORMAT_AQL) { 738 m->compute_tg_chunk_size = 1; 739 m->compute_current_logic_xcc_id = 740 (local_xcc_start + xcc) % 741 NUM_XCC(mm->dev->xcc_mask); 742 743 switch (xcc) { 744 case 0: 745 /* Master XCC */ 746 m->cp_hqd_pq_control &= 747 ~CP_HQD_PQ_CONTROL__NO_UPDATE_RPTR_MASK; 748 break; 749 default: 750 break; 751 } 752 } else { 753 /* PM4 Queue */ 754 m->compute_current_logic_xcc_id = 0; 755 m->compute_tg_chunk_size = 0; 756 m->pm4_target_xcc_in_xcp = q->pm4_target_xcc; 757 } 758 759 if (xcc == 0) { 760 /* Set the MQD pointer and gart address to XCC0 MQD */ 761 *mqd = m; 762 *gart_addr = xcc_gart_addr; 763 } 764 } 765 766 if (mqd_on_vram(mm->dev->adev)) 767 amdgpu_device_flush_hdp(mm->dev->adev, NULL); 768 } 769 770 static void update_mqd_v9_4_3(struct mqd_manager *mm, void *mqd, 771 struct queue_properties *q, struct mqd_update_info *minfo) 772 { 773 struct v9_mqd *m; 774 int xcc = 0; 775 uint64_t size = mm->mqd_stride(mm, q); 776 777 for (xcc = 0; xcc < NUM_XCC(mm->dev->xcc_mask); xcc++) { 778 m = get_mqd(mqd + size * xcc); 779 update_mqd(mm, m, q, minfo); 780 781 if (amdgpu_sriov_multi_vf_mode(mm->dev->adev)) 782 m->cp_hqd_pq_doorbell_control |= 1 << 783 CP_HQD_PQ_DOORBELL_CONTROL__DOORBELL_MODE__SHIFT; 784 update_cu_mask(mm, m, minfo, xcc); 785 786 if (q->format == KFD_QUEUE_FORMAT_AQL) { 787 switch (xcc) { 788 case 0: 789 /* Master XCC */ 790 m->cp_hqd_pq_control &= 791 ~CP_HQD_PQ_CONTROL__NO_UPDATE_RPTR_MASK; 792 break; 793 default: 794 break; 795 } 796 m->compute_tg_chunk_size = 1; 797 } else { 798 /* PM4 Queue */ 799 m->compute_current_logic_xcc_id = 0; 800 m->compute_tg_chunk_size = 0; 801 m->pm4_target_xcc_in_xcp = q->pm4_target_xcc; 802 } 803 } 804 805 if (mqd_on_vram(mm->dev->adev)) 806 amdgpu_device_flush_hdp(mm->dev->adev, NULL); 807 } 808 809 static void restore_mqd_v9_4_3(struct mqd_manager *mm, void **mqd, 810 struct kfd_mem_obj *mqd_mem_obj, uint64_t *gart_addr, 811 struct queue_properties *qp, 812 const void *mqd_src, 813 const void *ctl_stack_src, u32 ctl_stack_size) 814 { 815 struct kfd_mem_obj xcc_mqd_mem_obj; 816 u32 mqd_ctl_stack_size; 817 struct v9_mqd *m; 818 u32 num_xcc; 819 int xcc; 820 821 uint64_t offset = mm->mqd_stride(mm, qp); 822 823 mm->dev->dqm->current_logical_xcc_start++; 824 825 num_xcc = NUM_XCC(mm->dev->xcc_mask); 826 mqd_ctl_stack_size = ctl_stack_size / num_xcc; 827 828 memset(&xcc_mqd_mem_obj, 0x0, sizeof(struct kfd_mem_obj)); 829 830 /* Set the MQD pointer and gart address to XCC0 MQD */ 831 *mqd = mqd_mem_obj->cpu_ptr; 832 if (gart_addr) 833 *gart_addr = mqd_mem_obj->gpu_addr; 834 835 for (xcc = 0; xcc < num_xcc; xcc++) { 836 get_xcc_mqd(mqd_mem_obj, &xcc_mqd_mem_obj, offset * xcc); 837 restore_mqd(mm, (void **)&m, 838 &xcc_mqd_mem_obj, 839 NULL, 840 qp, 841 (uint8_t *)mqd_src + xcc * sizeof(*m), 842 (uint8_t *)ctl_stack_src + xcc * mqd_ctl_stack_size, 843 mqd_ctl_stack_size); 844 } 845 846 if (mqd_on_vram(mm->dev->adev)) 847 amdgpu_device_flush_hdp(mm->dev->adev, NULL); 848 } 849 static int destroy_mqd_v9_4_3(struct mqd_manager *mm, void *mqd, 850 enum kfd_preempt_type type, unsigned int timeout, 851 uint32_t pipe_id, uint32_t queue_id) 852 { 853 uint32_t xcc_mask = mm->dev->xcc_mask; 854 int xcc_id, err = 0, inst = 0; 855 void *xcc_mqd; 856 struct v9_mqd *m; 857 uint64_t mqd_offset; 858 859 m = get_mqd(mqd); 860 mqd_offset = m->cp_mqd_stride_size; 861 862 for_each_inst(xcc_id, xcc_mask) { 863 xcc_mqd = mqd + mqd_offset * inst; 864 err = mm->dev->kfd2kgd->hqd_destroy(mm->dev->adev, xcc_mqd, 865 type, timeout, pipe_id, 866 queue_id, xcc_id); 867 if (err) { 868 pr_debug("Destroy MQD failed for xcc: %d\n", inst); 869 break; 870 } 871 ++inst; 872 } 873 874 return err; 875 } 876 877 static int load_mqd_v9_4_3(struct mqd_manager *mm, void *mqd, 878 uint32_t pipe_id, uint32_t queue_id, 879 struct queue_properties *p, struct mm_struct *mms) 880 { 881 /* AQL write pointer counts in 64B packets, PM4/CP counts in dwords. */ 882 uint32_t wptr_shift = (p->format == KFD_QUEUE_FORMAT_AQL ? 4 : 0); 883 uint32_t xcc_mask = mm->dev->xcc_mask; 884 int xcc_id, err = 0, inst = 0; 885 void *xcc_mqd; 886 uint64_t mqd_stride_size = mm->mqd_stride(mm, p); 887 888 for_each_inst(xcc_id, xcc_mask) { 889 xcc_mqd = mqd + mqd_stride_size * inst; 890 err = mm->dev->kfd2kgd->hqd_load( 891 mm->dev->adev, xcc_mqd, pipe_id, queue_id, 892 (uint32_t __user *)p->write_ptr, wptr_shift, 0, mms, 893 xcc_id); 894 if (err) { 895 pr_debug("Load MQD failed for xcc: %d\n", inst); 896 break; 897 } 898 ++inst; 899 } 900 901 return err; 902 } 903 904 static int get_wave_state_v9_4_3(struct mqd_manager *mm, void *mqd, 905 struct queue_properties *q, 906 void __user *ctl_stack, 907 u32 *ctl_stack_used_size, 908 u32 *save_area_used_size) 909 { 910 int xcc, err = 0; 911 void *xcc_mqd; 912 void __user *xcc_ctl_stack; 913 uint64_t mqd_stride_size = mm->mqd_stride(mm, q); 914 u32 tmp_ctl_stack_used_size = 0, tmp_save_area_used_size = 0; 915 916 for (xcc = 0; xcc < NUM_XCC(mm->dev->xcc_mask); xcc++) { 917 xcc_mqd = mqd + mqd_stride_size * xcc; 918 xcc_ctl_stack = (void __user *)((uintptr_t)ctl_stack + 919 q->ctx_save_restore_area_size * xcc); 920 921 err = get_wave_state(mm, xcc_mqd, q, xcc_ctl_stack, 922 &tmp_ctl_stack_used_size, 923 &tmp_save_area_used_size); 924 if (err) 925 break; 926 927 /* 928 * Set the ctl_stack_used_size and save_area_used_size to 929 * ctl_stack_used_size and save_area_used_size of XCC 0 when 930 * passing the info the user-space. 931 * For multi XCC, user-space would have to look at the header 932 * info of each Control stack area to determine the control 933 * stack size and save area used. 934 */ 935 if (xcc == 0) { 936 *ctl_stack_used_size = tmp_ctl_stack_used_size; 937 *save_area_used_size = tmp_save_area_used_size; 938 } 939 } 940 941 return err; 942 } 943 944 #if defined(CONFIG_DEBUG_FS) 945 946 static int debugfs_show_mqd(struct seq_file *m, void *data) 947 { 948 seq_hex_dump(m, " ", DUMP_PREFIX_OFFSET, 32, 4, 949 data, sizeof(struct v9_mqd), false); 950 return 0; 951 } 952 953 static int debugfs_show_mqd_sdma(struct seq_file *m, void *data) 954 { 955 seq_hex_dump(m, " ", DUMP_PREFIX_OFFSET, 32, 4, 956 data, sizeof(struct v9_sdma_mqd), false); 957 return 0; 958 } 959 960 #endif 961 962 struct mqd_manager *mqd_manager_init_v9(enum KFD_MQD_TYPE type, 963 struct kfd_node *dev) 964 { 965 struct mqd_manager *mqd; 966 967 if (WARN_ON(type >= KFD_MQD_TYPE_MAX)) 968 return NULL; 969 970 mqd = kzalloc_obj(*mqd); 971 if (!mqd) 972 return NULL; 973 974 mqd->dev = dev; 975 976 switch (type) { 977 case KFD_MQD_TYPE_CP: 978 mqd->allocate_mqd = allocate_mqd; 979 mqd->free_mqd = kfd_free_mqd_cp; 980 mqd->is_occupied = kfd_is_occupied_cp; 981 mqd->get_checkpoint_info = get_checkpoint_info; 982 mqd->mqd_size = sizeof(struct v9_mqd); 983 mqd->mqd_stride = mqd_stride_v9; 984 #if defined(CONFIG_DEBUG_FS) 985 mqd->debugfs_show_mqd = debugfs_show_mqd; 986 #endif 987 if (KFD_GC_VERSION(dev) == IP_VERSION(9, 4, 3) || 988 KFD_GC_VERSION(dev) == IP_VERSION(9, 4, 4) || 989 KFD_GC_VERSION(dev) == IP_VERSION(9, 5, 0)) { 990 mqd->init_mqd = init_mqd_v9_4_3; 991 mqd->load_mqd = load_mqd_v9_4_3; 992 mqd->update_mqd = update_mqd_v9_4_3; 993 mqd->destroy_mqd = destroy_mqd_v9_4_3; 994 mqd->get_wave_state = get_wave_state_v9_4_3; 995 mqd->checkpoint_mqd = checkpoint_mqd_v9_4_3; 996 mqd->restore_mqd = restore_mqd_v9_4_3; 997 } else { 998 mqd->init_mqd = init_mqd; 999 mqd->load_mqd = load_mqd; 1000 mqd->update_mqd = update_mqd; 1001 mqd->destroy_mqd = kfd_destroy_mqd_cp; 1002 mqd->get_wave_state = get_wave_state; 1003 mqd->checkpoint_mqd = checkpoint_mqd; 1004 mqd->restore_mqd = restore_mqd; 1005 } 1006 break; 1007 case KFD_MQD_TYPE_HIQ: 1008 mqd->allocate_mqd = allocate_hiq_mqd; 1009 mqd->free_mqd = free_mqd_hiq_sdma; 1010 mqd->update_mqd = update_mqd; 1011 mqd->is_occupied = kfd_is_occupied_cp; 1012 mqd->mqd_size = sizeof(struct v9_mqd); 1013 mqd->mqd_stride = kfd_mqd_stride; 1014 #if defined(CONFIG_DEBUG_FS) 1015 mqd->debugfs_show_mqd = debugfs_show_mqd; 1016 #endif 1017 mqd->check_preemption_failed = check_preemption_failed; 1018 if (KFD_GC_VERSION(dev) == IP_VERSION(9, 4, 3) || 1019 KFD_GC_VERSION(dev) == IP_VERSION(9, 4, 4) || 1020 KFD_GC_VERSION(dev) == IP_VERSION(9, 5, 0)) { 1021 mqd->init_mqd = init_mqd_hiq_v9_4_3; 1022 mqd->load_mqd = hiq_load_mqd_kiq_v9_4_3; 1023 mqd->destroy_mqd = destroy_hiq_mqd_v9_4_3; 1024 mqd->check_preemption_failed = check_preemption_failed_v9_4_3; 1025 } else { 1026 mqd->init_mqd = init_mqd_hiq; 1027 mqd->load_mqd = kfd_hiq_load_mqd_kiq; 1028 mqd->destroy_mqd = destroy_hiq_mqd; 1029 mqd->check_preemption_failed = check_preemption_failed; 1030 } 1031 break; 1032 case KFD_MQD_TYPE_DIQ: 1033 mqd->allocate_mqd = allocate_mqd; 1034 mqd->init_mqd = init_mqd_hiq; 1035 mqd->free_mqd = kfd_free_mqd_cp; 1036 mqd->load_mqd = load_mqd; 1037 mqd->update_mqd = update_mqd; 1038 mqd->destroy_mqd = kfd_destroy_mqd_cp; 1039 mqd->is_occupied = kfd_is_occupied_cp; 1040 mqd->mqd_size = sizeof(struct v9_mqd); 1041 #if defined(CONFIG_DEBUG_FS) 1042 mqd->debugfs_show_mqd = debugfs_show_mqd; 1043 #endif 1044 break; 1045 case KFD_MQD_TYPE_SDMA: 1046 mqd->allocate_mqd = allocate_sdma_mqd; 1047 mqd->init_mqd = init_mqd_sdma; 1048 mqd->free_mqd = free_mqd_hiq_sdma; 1049 mqd->load_mqd = kfd_load_mqd_sdma; 1050 mqd->update_mqd = update_mqd_sdma; 1051 mqd->destroy_mqd = kfd_destroy_mqd_sdma; 1052 mqd->is_occupied = kfd_is_occupied_sdma; 1053 mqd->checkpoint_mqd = checkpoint_mqd_sdma; 1054 mqd->restore_mqd = restore_mqd_sdma; 1055 mqd->mqd_size = sizeof(struct v9_sdma_mqd); 1056 mqd->mqd_stride = kfd_mqd_stride; 1057 #if defined(CONFIG_DEBUG_FS) 1058 mqd->debugfs_show_mqd = debugfs_show_mqd_sdma; 1059 #endif 1060 break; 1061 default: 1062 kfree(mqd); 1063 return NULL; 1064 } 1065 1066 return mqd; 1067 } 1068