Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/radeon: deprecate and remove KFD interface

To quote Felix: "For testing KV with current user mode stack, please use
amdgpu. I don't expect this to work with radeon and I'm not planning to
spend any effort on making radeon work with a current user mode stack."

Only compile tested, but should be straight forward.

Signed-off-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Oded Gabbay <oded.gabbay@gmail.com>

authored by

Christian König and committed by
Oded Gabbay
f4fa88ab 48e876a2

+4 -987
-2
MAINTAINERS
··· 759 759 F: drivers/gpu/drm/amd/include/cik_structs.h 760 760 F: drivers/gpu/drm/amd/include/kgd_kfd_interface.h 761 761 F: drivers/gpu/drm/amd/include/vi_structs.h 762 - F: drivers/gpu/drm/radeon/radeon_kfd.c 763 - F: drivers/gpu/drm/radeon/radeon_kfd.h 764 762 F: include/uapi/linux/kfd_ioctl.h 765 763 766 764 AMD SEATTLE DEVICE TREE SUPPORT
+1 -1
drivers/gpu/drm/amd/amdkfd/Kconfig
··· 4 4 5 5 config HSA_AMD 6 6 tristate "HSA kernel driver for AMD GPU devices" 7 - depends on (DRM_RADEON || DRM_AMDGPU) && AMD_IOMMU_V2 && X86_64 7 + depends on DRM_AMDGPU && AMD_IOMMU_V2 && X86_64 8 8 help 9 9 Enable this if you want to use HSA features on AMD GPU devices.
+1 -2
drivers/gpu/drm/radeon/Makefile
··· 102 102 radeon-y += \ 103 103 radeon_vce.o \ 104 104 vce_v1_0.o \ 105 - vce_v2_0.o \ 106 - radeon_kfd.o 105 + vce_v2_0.o 107 106 108 107 radeon-$(CONFIG_VGA_SWITCHEROO) += radeon_atpx_handler.o 109 108 radeon-$(CONFIG_ACPI) += radeon_acpi.o
+2 -12
drivers/gpu/drm/radeon/cik.c
··· 33 33 #include "cik_blit_shaders.h" 34 34 #include "radeon_ucode.h" 35 35 #include "clearstate_ci.h" 36 - #include "radeon_kfd.h" 37 36 38 37 #define SH_MEM_CONFIG_GFX_DEFAULT \ 39 38 ALIGNMENT_MODE(SH_MEM_ALIGNMENT_MODE_UNALIGNED) ··· 5683 5684 /* 5684 5685 * number of VMs 5685 5686 * VMID 0 is reserved for System 5686 - * radeon graphics/compute will use VMIDs 1-7 5687 - * amdkfd will use VMIDs 8-15 5687 + * radeon graphics/compute will use VMIDs 1-15 5688 5688 */ 5689 - rdev->vm_manager.nvm = RADEON_NUM_OF_VMIDS; 5689 + rdev->vm_manager.nvm = 16; 5690 5690 /* base offset of vram pages */ 5691 5691 if (rdev->flags & RADEON_IS_IGP) { 5692 5692 u64 tmp = RREG32(MC_VM_FB_OFFSET); ··· 7587 7589 /* wptr/rptr are in bytes! */ 7588 7590 ring_index = rptr / 4; 7589 7591 7590 - radeon_kfd_interrupt(rdev, 7591 - (const void *) &rdev->ih.ring[ring_index]); 7592 - 7593 7592 src_id = le32_to_cpu(rdev->ih.ring[ring_index]) & 0xff; 7594 7593 src_data = le32_to_cpu(rdev->ih.ring[ring_index + 1]) & 0xfffffff; 7595 7594 ring_id = le32_to_cpu(rdev->ih.ring[ring_index + 2]) & 0xff; ··· 8481 8486 if (r) 8482 8487 return r; 8483 8488 8484 - r = radeon_kfd_resume(rdev); 8485 - if (r) 8486 - return r; 8487 - 8488 8489 return 0; 8489 8490 } 8490 8491 ··· 8529 8538 */ 8530 8539 int cik_suspend(struct radeon_device *rdev) 8531 8540 { 8532 - radeon_kfd_suspend(rdev); 8533 8541 radeon_pm_suspend(rdev); 8534 8542 radeon_audio_fini(rdev); 8535 8543 radeon_vm_manager_fini(rdev);
-2
drivers/gpu/drm/radeon/cikd.h
··· 30 30 #define CIK_RB_BITMAP_WIDTH_PER_SH 2 31 31 #define HAWAII_RB_BITMAP_WIDTH_PER_SH 4 32 32 33 - #define RADEON_NUM_OF_VMIDS 8 34 - 35 33 /* DIDT IND registers */ 36 34 #define DIDT_SQ_CTRL0 0x0 37 35 # define DIDT_CTRL_EN (1 << 0)
-3
drivers/gpu/drm/radeon/radeon.h
··· 2456 2456 u64 vram_pin_size; 2457 2457 u64 gart_pin_size; 2458 2458 2459 - /* amdkfd interface */ 2460 - struct kfd_dev *kfd; 2461 - 2462 2459 struct mutex mn_lock; 2463 2460 DECLARE_HASHTABLE(mn_hash, 7); 2464 2461 };
-10
drivers/gpu/drm/radeon/radeon_drv.c
··· 43 43 #include <drm/drm_fb_helper.h> 44 44 45 45 #include <drm/drm_crtc_helper.h> 46 - #include "radeon_kfd.h" 47 46 48 47 /* 49 48 * KMS wrapper. ··· 336 337 const struct pci_device_id *ent) 337 338 { 338 339 int ret; 339 - 340 - /* 341 - * Initialize amdkfd before starting radeon. If it was not loaded yet, 342 - * defer radeon probing 343 - */ 344 - ret = radeon_kfd_init(); 345 - if (ret == -EPROBE_DEFER) 346 - return ret; 347 340 348 341 if (vga_switcheroo_client_probe_defer(pdev)) 349 342 return -EPROBE_DEFER; ··· 636 645 637 646 static void __exit radeon_exit(void) 638 647 { 639 - radeon_kfd_fini(); 640 648 pci_unregister_driver(pdriver); 641 649 radeon_unregister_atpx_handler(); 642 650 }
-901
drivers/gpu/drm/radeon/radeon_kfd.c
··· 1 - /* 2 - * Copyright 2014 Advanced Micro Devices, Inc. 3 - * 4 - * Permission is hereby granted, free of charge, to any person obtaining a 5 - * copy of this software and associated documentation files (the "Software"), 6 - * to deal in the Software without restriction, including without limitation 7 - * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 - * and/or sell copies of the Software, and to permit persons to whom the 9 - * Software is furnished to do so, subject to the following conditions: 10 - * 11 - * The above copyright notice and this permission notice shall be included in 12 - * all copies or substantial portions of the Software. 13 - * 14 - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17 - * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18 - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19 - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20 - * OTHER DEALINGS IN THE SOFTWARE. 21 - */ 22 - 23 - #include <linux/module.h> 24 - #include <linux/fdtable.h> 25 - #include <linux/uaccess.h> 26 - #include <drm/drmP.h> 27 - #include "radeon.h" 28 - #include "cikd.h" 29 - #include "cik_reg.h" 30 - #include "radeon_kfd.h" 31 - #include "radeon_ucode.h" 32 - #include <linux/firmware.h> 33 - #include "cik_structs.h" 34 - 35 - #define CIK_PIPE_PER_MEC (4) 36 - 37 - static const uint32_t watchRegs[MAX_WATCH_ADDRESSES * ADDRESS_WATCH_REG_MAX] = { 38 - TCP_WATCH0_ADDR_H, TCP_WATCH0_ADDR_L, TCP_WATCH0_CNTL, 39 - TCP_WATCH1_ADDR_H, TCP_WATCH1_ADDR_L, TCP_WATCH1_CNTL, 40 - TCP_WATCH2_ADDR_H, TCP_WATCH2_ADDR_L, TCP_WATCH2_CNTL, 41 - TCP_WATCH3_ADDR_H, TCP_WATCH3_ADDR_L, TCP_WATCH3_CNTL 42 - }; 43 - 44 - struct kgd_mem { 45 - struct radeon_bo *bo; 46 - uint64_t gpu_addr; 47 - void *cpu_ptr; 48 - }; 49 - 50 - 51 - static int alloc_gtt_mem(struct kgd_dev *kgd, size_t size, 52 - void **mem_obj, uint64_t *gpu_addr, 53 - void **cpu_ptr); 54 - 55 - static void free_gtt_mem(struct kgd_dev *kgd, void *mem_obj); 56 - 57 - static uint64_t get_vmem_size(struct kgd_dev *kgd); 58 - static uint64_t get_gpu_clock_counter(struct kgd_dev *kgd); 59 - 60 - static uint32_t get_max_engine_clock_in_mhz(struct kgd_dev *kgd); 61 - 62 - static int alloc_pasid(unsigned int bits); 63 - static void free_pasid(unsigned int pasid); 64 - 65 - static uint16_t get_fw_version(struct kgd_dev *kgd, enum kgd_engine_type type); 66 - 67 - /* 68 - * Register access functions 69 - */ 70 - 71 - static void kgd_program_sh_mem_settings(struct kgd_dev *kgd, uint32_t vmid, 72 - uint32_t sh_mem_config, uint32_t sh_mem_ape1_base, 73 - uint32_t sh_mem_ape1_limit, uint32_t sh_mem_bases); 74 - 75 - static int kgd_set_pasid_vmid_mapping(struct kgd_dev *kgd, unsigned int pasid, 76 - unsigned int vmid); 77 - 78 - static int kgd_init_pipeline(struct kgd_dev *kgd, uint32_t pipe_id, 79 - uint32_t hpd_size, uint64_t hpd_gpu_addr); 80 - static int kgd_init_interrupts(struct kgd_dev *kgd, uint32_t pipe_id); 81 - static int kgd_hqd_load(struct kgd_dev *kgd, void *mqd, uint32_t pipe_id, 82 - uint32_t queue_id, uint32_t __user *wptr, 83 - uint32_t wptr_shift, uint32_t wptr_mask, 84 - struct mm_struct *mm); 85 - static int kgd_hqd_sdma_load(struct kgd_dev *kgd, void *mqd); 86 - static bool kgd_hqd_is_occupied(struct kgd_dev *kgd, uint64_t queue_address, 87 - uint32_t pipe_id, uint32_t queue_id); 88 - 89 - static int kgd_hqd_destroy(struct kgd_dev *kgd, void *mqd, uint32_t reset_type, 90 - unsigned int timeout, uint32_t pipe_id, 91 - uint32_t queue_id); 92 - static bool kgd_hqd_sdma_is_occupied(struct kgd_dev *kgd, void *mqd); 93 - static int kgd_hqd_sdma_destroy(struct kgd_dev *kgd, void *mqd, 94 - unsigned int timeout); 95 - static int kgd_address_watch_disable(struct kgd_dev *kgd); 96 - static int kgd_address_watch_execute(struct kgd_dev *kgd, 97 - unsigned int watch_point_id, 98 - uint32_t cntl_val, 99 - uint32_t addr_hi, 100 - uint32_t addr_lo); 101 - static int kgd_wave_control_execute(struct kgd_dev *kgd, 102 - uint32_t gfx_index_val, 103 - uint32_t sq_cmd); 104 - static uint32_t kgd_address_watch_get_offset(struct kgd_dev *kgd, 105 - unsigned int watch_point_id, 106 - unsigned int reg_offset); 107 - 108 - static bool get_atc_vmid_pasid_mapping_valid(struct kgd_dev *kgd, uint8_t vmid); 109 - static uint16_t get_atc_vmid_pasid_mapping_pasid(struct kgd_dev *kgd, 110 - uint8_t vmid); 111 - static void write_vmid_invalidate_request(struct kgd_dev *kgd, uint8_t vmid); 112 - 113 - static const struct kfd2kgd_calls kfd2kgd = { 114 - .init_gtt_mem_allocation = alloc_gtt_mem, 115 - .free_gtt_mem = free_gtt_mem, 116 - .get_vmem_size = get_vmem_size, 117 - .get_gpu_clock_counter = get_gpu_clock_counter, 118 - .get_max_engine_clock_in_mhz = get_max_engine_clock_in_mhz, 119 - .alloc_pasid = alloc_pasid, 120 - .free_pasid = free_pasid, 121 - .program_sh_mem_settings = kgd_program_sh_mem_settings, 122 - .set_pasid_vmid_mapping = kgd_set_pasid_vmid_mapping, 123 - .init_pipeline = kgd_init_pipeline, 124 - .init_interrupts = kgd_init_interrupts, 125 - .hqd_load = kgd_hqd_load, 126 - .hqd_sdma_load = kgd_hqd_sdma_load, 127 - .hqd_is_occupied = kgd_hqd_is_occupied, 128 - .hqd_sdma_is_occupied = kgd_hqd_sdma_is_occupied, 129 - .hqd_destroy = kgd_hqd_destroy, 130 - .hqd_sdma_destroy = kgd_hqd_sdma_destroy, 131 - .address_watch_disable = kgd_address_watch_disable, 132 - .address_watch_execute = kgd_address_watch_execute, 133 - .wave_control_execute = kgd_wave_control_execute, 134 - .address_watch_get_offset = kgd_address_watch_get_offset, 135 - .get_atc_vmid_pasid_mapping_pasid = get_atc_vmid_pasid_mapping_pasid, 136 - .get_atc_vmid_pasid_mapping_valid = get_atc_vmid_pasid_mapping_valid, 137 - .write_vmid_invalidate_request = write_vmid_invalidate_request, 138 - .get_fw_version = get_fw_version 139 - }; 140 - 141 - static const struct kgd2kfd_calls *kgd2kfd; 142 - 143 - int radeon_kfd_init(void) 144 - { 145 - int ret; 146 - 147 - #if defined(CONFIG_HSA_AMD_MODULE) 148 - int (*kgd2kfd_init_p)(unsigned, const struct kgd2kfd_calls**); 149 - 150 - kgd2kfd_init_p = symbol_request(kgd2kfd_init); 151 - 152 - if (kgd2kfd_init_p == NULL) 153 - return -ENOENT; 154 - 155 - ret = kgd2kfd_init_p(KFD_INTERFACE_VERSION, &kgd2kfd); 156 - if (ret) { 157 - symbol_put(kgd2kfd_init); 158 - kgd2kfd = NULL; 159 - } 160 - 161 - #elif defined(CONFIG_HSA_AMD) 162 - ret = kgd2kfd_init(KFD_INTERFACE_VERSION, &kgd2kfd); 163 - if (ret) 164 - kgd2kfd = NULL; 165 - 166 - #else 167 - ret = -ENOENT; 168 - #endif 169 - 170 - return ret; 171 - } 172 - 173 - void radeon_kfd_fini(void) 174 - { 175 - if (kgd2kfd) { 176 - kgd2kfd->exit(); 177 - symbol_put(kgd2kfd_init); 178 - } 179 - } 180 - 181 - void radeon_kfd_device_probe(struct radeon_device *rdev) 182 - { 183 - if (kgd2kfd) 184 - rdev->kfd = kgd2kfd->probe((struct kgd_dev *)rdev, 185 - rdev->pdev, &kfd2kgd); 186 - } 187 - 188 - void radeon_kfd_device_init(struct radeon_device *rdev) 189 - { 190 - int i, queue, pipe, mec; 191 - 192 - if (rdev->kfd) { 193 - struct kgd2kfd_shared_resources gpu_resources = { 194 - .compute_vmid_bitmap = 0xFF00, 195 - .num_pipe_per_mec = 4, 196 - .num_queue_per_pipe = 8 197 - }; 198 - 199 - bitmap_zero(gpu_resources.queue_bitmap, KGD_MAX_QUEUES); 200 - 201 - for (i = 0; i < KGD_MAX_QUEUES; ++i) { 202 - queue = i % gpu_resources.num_queue_per_pipe; 203 - pipe = (i / gpu_resources.num_queue_per_pipe) 204 - % gpu_resources.num_pipe_per_mec; 205 - mec = (i / gpu_resources.num_queue_per_pipe) 206 - / gpu_resources.num_pipe_per_mec; 207 - 208 - if (mec == 0 && pipe > 0) 209 - set_bit(i, gpu_resources.queue_bitmap); 210 - } 211 - 212 - radeon_doorbell_get_kfd_info(rdev, 213 - &gpu_resources.doorbell_physical_address, 214 - &gpu_resources.doorbell_aperture_size, 215 - &gpu_resources.doorbell_start_offset); 216 - 217 - kgd2kfd->device_init(rdev->kfd, &gpu_resources); 218 - } 219 - } 220 - 221 - void radeon_kfd_device_fini(struct radeon_device *rdev) 222 - { 223 - if (rdev->kfd) { 224 - kgd2kfd->device_exit(rdev->kfd); 225 - rdev->kfd = NULL; 226 - } 227 - } 228 - 229 - void radeon_kfd_interrupt(struct radeon_device *rdev, const void *ih_ring_entry) 230 - { 231 - if (rdev->kfd) 232 - kgd2kfd->interrupt(rdev->kfd, ih_ring_entry); 233 - } 234 - 235 - void radeon_kfd_suspend(struct radeon_device *rdev) 236 - { 237 - if (rdev->kfd) 238 - kgd2kfd->suspend(rdev->kfd); 239 - } 240 - 241 - int radeon_kfd_resume(struct radeon_device *rdev) 242 - { 243 - int r = 0; 244 - 245 - if (rdev->kfd) 246 - r = kgd2kfd->resume(rdev->kfd); 247 - 248 - return r; 249 - } 250 - 251 - static int alloc_gtt_mem(struct kgd_dev *kgd, size_t size, 252 - void **mem_obj, uint64_t *gpu_addr, 253 - void **cpu_ptr) 254 - { 255 - struct radeon_device *rdev = (struct radeon_device *)kgd; 256 - struct kgd_mem **mem = (struct kgd_mem **) mem_obj; 257 - int r; 258 - 259 - BUG_ON(kgd == NULL); 260 - BUG_ON(gpu_addr == NULL); 261 - BUG_ON(cpu_ptr == NULL); 262 - 263 - *mem = kmalloc(sizeof(struct kgd_mem), GFP_KERNEL); 264 - if ((*mem) == NULL) 265 - return -ENOMEM; 266 - 267 - r = radeon_bo_create(rdev, size, PAGE_SIZE, true, RADEON_GEM_DOMAIN_GTT, 268 - RADEON_GEM_GTT_WC, NULL, NULL, &(*mem)->bo); 269 - if (r) { 270 - dev_err(rdev->dev, 271 - "failed to allocate BO for amdkfd (%d)\n", r); 272 - return r; 273 - } 274 - 275 - /* map the buffer */ 276 - r = radeon_bo_reserve((*mem)->bo, true); 277 - if (r) { 278 - dev_err(rdev->dev, "(%d) failed to reserve bo for amdkfd\n", r); 279 - goto allocate_mem_reserve_bo_failed; 280 - } 281 - 282 - r = radeon_bo_pin((*mem)->bo, RADEON_GEM_DOMAIN_GTT, 283 - &(*mem)->gpu_addr); 284 - if (r) { 285 - dev_err(rdev->dev, "(%d) failed to pin bo for amdkfd\n", r); 286 - goto allocate_mem_pin_bo_failed; 287 - } 288 - *gpu_addr = (*mem)->gpu_addr; 289 - 290 - r = radeon_bo_kmap((*mem)->bo, &(*mem)->cpu_ptr); 291 - if (r) { 292 - dev_err(rdev->dev, 293 - "(%d) failed to map bo to kernel for amdkfd\n", r); 294 - goto allocate_mem_kmap_bo_failed; 295 - } 296 - *cpu_ptr = (*mem)->cpu_ptr; 297 - 298 - radeon_bo_unreserve((*mem)->bo); 299 - 300 - return 0; 301 - 302 - allocate_mem_kmap_bo_failed: 303 - radeon_bo_unpin((*mem)->bo); 304 - allocate_mem_pin_bo_failed: 305 - radeon_bo_unreserve((*mem)->bo); 306 - allocate_mem_reserve_bo_failed: 307 - radeon_bo_unref(&(*mem)->bo); 308 - 309 - return r; 310 - } 311 - 312 - static void free_gtt_mem(struct kgd_dev *kgd, void *mem_obj) 313 - { 314 - struct kgd_mem *mem = (struct kgd_mem *) mem_obj; 315 - 316 - BUG_ON(mem == NULL); 317 - 318 - radeon_bo_reserve(mem->bo, true); 319 - radeon_bo_kunmap(mem->bo); 320 - radeon_bo_unpin(mem->bo); 321 - radeon_bo_unreserve(mem->bo); 322 - radeon_bo_unref(&(mem->bo)); 323 - kfree(mem); 324 - } 325 - 326 - static uint64_t get_vmem_size(struct kgd_dev *kgd) 327 - { 328 - struct radeon_device *rdev = (struct radeon_device *)kgd; 329 - 330 - BUG_ON(kgd == NULL); 331 - 332 - return rdev->mc.real_vram_size; 333 - } 334 - 335 - static uint64_t get_gpu_clock_counter(struct kgd_dev *kgd) 336 - { 337 - struct radeon_device *rdev = (struct radeon_device *)kgd; 338 - 339 - return rdev->asic->get_gpu_clock_counter(rdev); 340 - } 341 - 342 - static uint32_t get_max_engine_clock_in_mhz(struct kgd_dev *kgd) 343 - { 344 - struct radeon_device *rdev = (struct radeon_device *)kgd; 345 - 346 - /* The sclk is in quantas of 10kHz */ 347 - return rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac.sclk / 100; 348 - } 349 - 350 - /* 351 - * PASID manager 352 - */ 353 - static DEFINE_IDA(pasid_ida); 354 - 355 - static int alloc_pasid(unsigned int bits) 356 - { 357 - int pasid = -EINVAL; 358 - 359 - for (bits = min(bits, 31U); bits > 0; bits--) { 360 - pasid = ida_simple_get(&pasid_ida, 361 - 1U << (bits - 1), 1U << bits, 362 - GFP_KERNEL); 363 - if (pasid != -ENOSPC) 364 - break; 365 - } 366 - 367 - return pasid; 368 - } 369 - 370 - static void free_pasid(unsigned int pasid) 371 - { 372 - ida_simple_remove(&pasid_ida, pasid); 373 - } 374 - 375 - static inline struct radeon_device *get_radeon_device(struct kgd_dev *kgd) 376 - { 377 - return (struct radeon_device *)kgd; 378 - } 379 - 380 - static void write_register(struct kgd_dev *kgd, uint32_t offset, uint32_t value) 381 - { 382 - struct radeon_device *rdev = get_radeon_device(kgd); 383 - 384 - writel(value, (void __iomem *)(rdev->rmmio + offset)); 385 - } 386 - 387 - static uint32_t read_register(struct kgd_dev *kgd, uint32_t offset) 388 - { 389 - struct radeon_device *rdev = get_radeon_device(kgd); 390 - 391 - return readl((void __iomem *)(rdev->rmmio + offset)); 392 - } 393 - 394 - static void lock_srbm(struct kgd_dev *kgd, uint32_t mec, uint32_t pipe, 395 - uint32_t queue, uint32_t vmid) 396 - { 397 - struct radeon_device *rdev = get_radeon_device(kgd); 398 - uint32_t value = PIPEID(pipe) | MEID(mec) | VMID(vmid) | QUEUEID(queue); 399 - 400 - mutex_lock(&rdev->srbm_mutex); 401 - write_register(kgd, SRBM_GFX_CNTL, value); 402 - } 403 - 404 - static void unlock_srbm(struct kgd_dev *kgd) 405 - { 406 - struct radeon_device *rdev = get_radeon_device(kgd); 407 - 408 - write_register(kgd, SRBM_GFX_CNTL, 0); 409 - mutex_unlock(&rdev->srbm_mutex); 410 - } 411 - 412 - static void acquire_queue(struct kgd_dev *kgd, uint32_t pipe_id, 413 - uint32_t queue_id) 414 - { 415 - uint32_t mec = (++pipe_id / CIK_PIPE_PER_MEC) + 1; 416 - uint32_t pipe = (pipe_id % CIK_PIPE_PER_MEC); 417 - 418 - lock_srbm(kgd, mec, pipe, queue_id, 0); 419 - } 420 - 421 - static void release_queue(struct kgd_dev *kgd) 422 - { 423 - unlock_srbm(kgd); 424 - } 425 - 426 - static void kgd_program_sh_mem_settings(struct kgd_dev *kgd, uint32_t vmid, 427 - uint32_t sh_mem_config, 428 - uint32_t sh_mem_ape1_base, 429 - uint32_t sh_mem_ape1_limit, 430 - uint32_t sh_mem_bases) 431 - { 432 - lock_srbm(kgd, 0, 0, 0, vmid); 433 - 434 - write_register(kgd, SH_MEM_CONFIG, sh_mem_config); 435 - write_register(kgd, SH_MEM_APE1_BASE, sh_mem_ape1_base); 436 - write_register(kgd, SH_MEM_APE1_LIMIT, sh_mem_ape1_limit); 437 - write_register(kgd, SH_MEM_BASES, sh_mem_bases); 438 - 439 - unlock_srbm(kgd); 440 - } 441 - 442 - static int kgd_set_pasid_vmid_mapping(struct kgd_dev *kgd, unsigned int pasid, 443 - unsigned int vmid) 444 - { 445 - /* 446 - * We have to assume that there is no outstanding mapping. 447 - * The ATC_VMID_PASID_MAPPING_UPDATE_STATUS bit could be 0 448 - * because a mapping is in progress or because a mapping finished and 449 - * the SW cleared it. 450 - * So the protocol is to always wait & clear. 451 - */ 452 - uint32_t pasid_mapping = (pasid == 0) ? 0 : (uint32_t)pasid | 453 - ATC_VMID_PASID_MAPPING_VALID_MASK; 454 - 455 - write_register(kgd, ATC_VMID0_PASID_MAPPING + vmid*sizeof(uint32_t), 456 - pasid_mapping); 457 - 458 - while (!(read_register(kgd, ATC_VMID_PASID_MAPPING_UPDATE_STATUS) & 459 - (1U << vmid))) 460 - cpu_relax(); 461 - write_register(kgd, ATC_VMID_PASID_MAPPING_UPDATE_STATUS, 1U << vmid); 462 - 463 - /* Mapping vmid to pasid also for IH block */ 464 - write_register(kgd, IH_VMID_0_LUT + vmid * sizeof(uint32_t), 465 - pasid_mapping); 466 - 467 - return 0; 468 - } 469 - 470 - static int kgd_init_pipeline(struct kgd_dev *kgd, uint32_t pipe_id, 471 - uint32_t hpd_size, uint64_t hpd_gpu_addr) 472 - { 473 - /* nothing to do here */ 474 - return 0; 475 - } 476 - 477 - static int kgd_init_interrupts(struct kgd_dev *kgd, uint32_t pipe_id) 478 - { 479 - uint32_t mec; 480 - uint32_t pipe; 481 - 482 - mec = (pipe_id / CIK_PIPE_PER_MEC) + 1; 483 - pipe = (pipe_id % CIK_PIPE_PER_MEC); 484 - 485 - lock_srbm(kgd, mec, pipe, 0, 0); 486 - 487 - write_register(kgd, CPC_INT_CNTL, 488 - TIME_STAMP_INT_ENABLE | OPCODE_ERROR_INT_ENABLE); 489 - 490 - unlock_srbm(kgd); 491 - 492 - return 0; 493 - } 494 - 495 - static inline uint32_t get_sdma_base_addr(struct cik_sdma_rlc_registers *m) 496 - { 497 - uint32_t retval; 498 - 499 - retval = m->sdma_engine_id * SDMA1_REGISTER_OFFSET + 500 - m->sdma_queue_id * KFD_CIK_SDMA_QUEUE_OFFSET; 501 - 502 - pr_debug("kfd: sdma base address: 0x%x\n", retval); 503 - 504 - return retval; 505 - } 506 - 507 - static inline struct cik_mqd *get_mqd(void *mqd) 508 - { 509 - return (struct cik_mqd *)mqd; 510 - } 511 - 512 - static inline struct cik_sdma_rlc_registers *get_sdma_mqd(void *mqd) 513 - { 514 - return (struct cik_sdma_rlc_registers *)mqd; 515 - } 516 - 517 - static int kgd_hqd_load(struct kgd_dev *kgd, void *mqd, uint32_t pipe_id, 518 - uint32_t queue_id, uint32_t __user *wptr, 519 - uint32_t wptr_shift, uint32_t wptr_mask, 520 - struct mm_struct *mm) 521 - { 522 - uint32_t wptr_shadow, is_wptr_shadow_valid; 523 - struct cik_mqd *m; 524 - 525 - m = get_mqd(mqd); 526 - 527 - is_wptr_shadow_valid = !get_user(wptr_shadow, wptr); 528 - 529 - acquire_queue(kgd, pipe_id, queue_id); 530 - write_register(kgd, CP_MQD_BASE_ADDR, m->cp_mqd_base_addr_lo); 531 - write_register(kgd, CP_MQD_BASE_ADDR_HI, m->cp_mqd_base_addr_hi); 532 - write_register(kgd, CP_MQD_CONTROL, m->cp_mqd_control); 533 - 534 - write_register(kgd, CP_HQD_PQ_BASE, m->cp_hqd_pq_base_lo); 535 - write_register(kgd, CP_HQD_PQ_BASE_HI, m->cp_hqd_pq_base_hi); 536 - write_register(kgd, CP_HQD_PQ_CONTROL, m->cp_hqd_pq_control); 537 - 538 - write_register(kgd, CP_HQD_IB_CONTROL, m->cp_hqd_ib_control); 539 - write_register(kgd, CP_HQD_IB_BASE_ADDR, m->cp_hqd_ib_base_addr_lo); 540 - write_register(kgd, CP_HQD_IB_BASE_ADDR_HI, m->cp_hqd_ib_base_addr_hi); 541 - 542 - write_register(kgd, CP_HQD_IB_RPTR, m->cp_hqd_ib_rptr); 543 - 544 - write_register(kgd, CP_HQD_PERSISTENT_STATE, 545 - m->cp_hqd_persistent_state); 546 - write_register(kgd, CP_HQD_SEMA_CMD, m->cp_hqd_sema_cmd); 547 - write_register(kgd, CP_HQD_MSG_TYPE, m->cp_hqd_msg_type); 548 - 549 - write_register(kgd, CP_HQD_ATOMIC0_PREOP_LO, 550 - m->cp_hqd_atomic0_preop_lo); 551 - 552 - write_register(kgd, CP_HQD_ATOMIC0_PREOP_HI, 553 - m->cp_hqd_atomic0_preop_hi); 554 - 555 - write_register(kgd, CP_HQD_ATOMIC1_PREOP_LO, 556 - m->cp_hqd_atomic1_preop_lo); 557 - 558 - write_register(kgd, CP_HQD_ATOMIC1_PREOP_HI, 559 - m->cp_hqd_atomic1_preop_hi); 560 - 561 - write_register(kgd, CP_HQD_PQ_RPTR_REPORT_ADDR, 562 - m->cp_hqd_pq_rptr_report_addr_lo); 563 - 564 - write_register(kgd, CP_HQD_PQ_RPTR_REPORT_ADDR_HI, 565 - m->cp_hqd_pq_rptr_report_addr_hi); 566 - 567 - write_register(kgd, CP_HQD_PQ_RPTR, m->cp_hqd_pq_rptr); 568 - 569 - write_register(kgd, CP_HQD_PQ_WPTR_POLL_ADDR, 570 - m->cp_hqd_pq_wptr_poll_addr_lo); 571 - 572 - write_register(kgd, CP_HQD_PQ_WPTR_POLL_ADDR_HI, 573 - m->cp_hqd_pq_wptr_poll_addr_hi); 574 - 575 - write_register(kgd, CP_HQD_PQ_DOORBELL_CONTROL, 576 - m->cp_hqd_pq_doorbell_control); 577 - 578 - write_register(kgd, CP_HQD_VMID, m->cp_hqd_vmid); 579 - 580 - write_register(kgd, CP_HQD_QUANTUM, m->cp_hqd_quantum); 581 - 582 - write_register(kgd, CP_HQD_PIPE_PRIORITY, m->cp_hqd_pipe_priority); 583 - write_register(kgd, CP_HQD_QUEUE_PRIORITY, m->cp_hqd_queue_priority); 584 - 585 - write_register(kgd, CP_HQD_IQ_RPTR, m->cp_hqd_iq_rptr); 586 - 587 - if (is_wptr_shadow_valid) 588 - write_register(kgd, CP_HQD_PQ_WPTR, wptr_shadow); 589 - 590 - write_register(kgd, CP_HQD_ACTIVE, m->cp_hqd_active); 591 - release_queue(kgd); 592 - 593 - return 0; 594 - } 595 - 596 - static int kgd_hqd_sdma_load(struct kgd_dev *kgd, void *mqd) 597 - { 598 - struct cik_sdma_rlc_registers *m; 599 - uint32_t sdma_base_addr; 600 - 601 - m = get_sdma_mqd(mqd); 602 - sdma_base_addr = get_sdma_base_addr(m); 603 - 604 - write_register(kgd, 605 - sdma_base_addr + SDMA0_RLC0_VIRTUAL_ADDR, 606 - m->sdma_rlc_virtual_addr); 607 - 608 - write_register(kgd, 609 - sdma_base_addr + SDMA0_RLC0_RB_BASE, 610 - m->sdma_rlc_rb_base); 611 - 612 - write_register(kgd, 613 - sdma_base_addr + SDMA0_RLC0_RB_BASE_HI, 614 - m->sdma_rlc_rb_base_hi); 615 - 616 - write_register(kgd, 617 - sdma_base_addr + SDMA0_RLC0_RB_RPTR_ADDR_LO, 618 - m->sdma_rlc_rb_rptr_addr_lo); 619 - 620 - write_register(kgd, 621 - sdma_base_addr + SDMA0_RLC0_RB_RPTR_ADDR_HI, 622 - m->sdma_rlc_rb_rptr_addr_hi); 623 - 624 - write_register(kgd, 625 - sdma_base_addr + SDMA0_RLC0_DOORBELL, 626 - m->sdma_rlc_doorbell); 627 - 628 - write_register(kgd, 629 - sdma_base_addr + SDMA0_RLC0_RB_CNTL, 630 - m->sdma_rlc_rb_cntl); 631 - 632 - return 0; 633 - } 634 - 635 - static bool kgd_hqd_is_occupied(struct kgd_dev *kgd, uint64_t queue_address, 636 - uint32_t pipe_id, uint32_t queue_id) 637 - { 638 - uint32_t act; 639 - bool retval = false; 640 - uint32_t low, high; 641 - 642 - acquire_queue(kgd, pipe_id, queue_id); 643 - act = read_register(kgd, CP_HQD_ACTIVE); 644 - if (act) { 645 - low = lower_32_bits(queue_address >> 8); 646 - high = upper_32_bits(queue_address >> 8); 647 - 648 - if (low == read_register(kgd, CP_HQD_PQ_BASE) && 649 - high == read_register(kgd, CP_HQD_PQ_BASE_HI)) 650 - retval = true; 651 - } 652 - release_queue(kgd); 653 - return retval; 654 - } 655 - 656 - static bool kgd_hqd_sdma_is_occupied(struct kgd_dev *kgd, void *mqd) 657 - { 658 - struct cik_sdma_rlc_registers *m; 659 - uint32_t sdma_base_addr; 660 - uint32_t sdma_rlc_rb_cntl; 661 - 662 - m = get_sdma_mqd(mqd); 663 - sdma_base_addr = get_sdma_base_addr(m); 664 - 665 - sdma_rlc_rb_cntl = read_register(kgd, 666 - sdma_base_addr + SDMA0_RLC0_RB_CNTL); 667 - 668 - if (sdma_rlc_rb_cntl & SDMA_RB_ENABLE) 669 - return true; 670 - 671 - return false; 672 - } 673 - 674 - static int kgd_hqd_destroy(struct kgd_dev *kgd, void *mqd, uint32_t reset_type, 675 - unsigned int timeout, uint32_t pipe_id, 676 - uint32_t queue_id) 677 - { 678 - uint32_t temp; 679 - 680 - acquire_queue(kgd, pipe_id, queue_id); 681 - write_register(kgd, CP_HQD_PQ_DOORBELL_CONTROL, 0); 682 - 683 - write_register(kgd, CP_HQD_DEQUEUE_REQUEST, reset_type); 684 - 685 - while (true) { 686 - temp = read_register(kgd, CP_HQD_ACTIVE); 687 - if (temp & 0x1) 688 - break; 689 - if (timeout == 0) { 690 - pr_err("kfd: cp queue preemption time out (%dms)\n", 691 - temp); 692 - release_queue(kgd); 693 - return -ETIME; 694 - } 695 - msleep(20); 696 - timeout -= 20; 697 - } 698 - 699 - release_queue(kgd); 700 - return 0; 701 - } 702 - 703 - static int kgd_hqd_sdma_destroy(struct kgd_dev *kgd, void *mqd, 704 - unsigned int timeout) 705 - { 706 - struct cik_sdma_rlc_registers *m; 707 - uint32_t sdma_base_addr; 708 - uint32_t temp; 709 - 710 - m = get_sdma_mqd(mqd); 711 - sdma_base_addr = get_sdma_base_addr(m); 712 - 713 - temp = read_register(kgd, sdma_base_addr + SDMA0_RLC0_RB_CNTL); 714 - temp = temp & ~SDMA_RB_ENABLE; 715 - write_register(kgd, sdma_base_addr + SDMA0_RLC0_RB_CNTL, temp); 716 - 717 - while (true) { 718 - temp = read_register(kgd, sdma_base_addr + 719 - SDMA0_RLC0_CONTEXT_STATUS); 720 - if (temp & SDMA_RLC_IDLE) 721 - break; 722 - if (timeout == 0) 723 - return -ETIME; 724 - msleep(20); 725 - timeout -= 20; 726 - } 727 - 728 - write_register(kgd, sdma_base_addr + SDMA0_RLC0_DOORBELL, 0); 729 - write_register(kgd, sdma_base_addr + SDMA0_RLC0_RB_RPTR, 0); 730 - write_register(kgd, sdma_base_addr + SDMA0_RLC0_RB_WPTR, 0); 731 - write_register(kgd, sdma_base_addr + SDMA0_RLC0_RB_BASE, 0); 732 - 733 - return 0; 734 - } 735 - 736 - static int kgd_address_watch_disable(struct kgd_dev *kgd) 737 - { 738 - union TCP_WATCH_CNTL_BITS cntl; 739 - unsigned int i; 740 - 741 - cntl.u32All = 0; 742 - 743 - cntl.bitfields.valid = 0; 744 - cntl.bitfields.mask = ADDRESS_WATCH_REG_CNTL_DEFAULT_MASK; 745 - cntl.bitfields.atc = 1; 746 - 747 - /* Turning off this address until we set all the registers */ 748 - for (i = 0; i < MAX_WATCH_ADDRESSES; i++) 749 - write_register(kgd, 750 - watchRegs[i * ADDRESS_WATCH_REG_MAX + 751 - ADDRESS_WATCH_REG_CNTL], 752 - cntl.u32All); 753 - 754 - return 0; 755 - } 756 - 757 - static int kgd_address_watch_execute(struct kgd_dev *kgd, 758 - unsigned int watch_point_id, 759 - uint32_t cntl_val, 760 - uint32_t addr_hi, 761 - uint32_t addr_lo) 762 - { 763 - union TCP_WATCH_CNTL_BITS cntl; 764 - 765 - cntl.u32All = cntl_val; 766 - 767 - /* Turning off this watch point until we set all the registers */ 768 - cntl.bitfields.valid = 0; 769 - write_register(kgd, 770 - watchRegs[watch_point_id * ADDRESS_WATCH_REG_MAX + 771 - ADDRESS_WATCH_REG_CNTL], 772 - cntl.u32All); 773 - 774 - write_register(kgd, 775 - watchRegs[watch_point_id * ADDRESS_WATCH_REG_MAX + 776 - ADDRESS_WATCH_REG_ADDR_HI], 777 - addr_hi); 778 - 779 - write_register(kgd, 780 - watchRegs[watch_point_id * ADDRESS_WATCH_REG_MAX + 781 - ADDRESS_WATCH_REG_ADDR_LO], 782 - addr_lo); 783 - 784 - /* Enable the watch point */ 785 - cntl.bitfields.valid = 1; 786 - 787 - write_register(kgd, 788 - watchRegs[watch_point_id * ADDRESS_WATCH_REG_MAX + 789 - ADDRESS_WATCH_REG_CNTL], 790 - cntl.u32All); 791 - 792 - return 0; 793 - } 794 - 795 - static int kgd_wave_control_execute(struct kgd_dev *kgd, 796 - uint32_t gfx_index_val, 797 - uint32_t sq_cmd) 798 - { 799 - struct radeon_device *rdev = get_radeon_device(kgd); 800 - uint32_t data; 801 - 802 - mutex_lock(&rdev->grbm_idx_mutex); 803 - 804 - write_register(kgd, GRBM_GFX_INDEX, gfx_index_val); 805 - write_register(kgd, SQ_CMD, sq_cmd); 806 - 807 - /* Restore the GRBM_GFX_INDEX register */ 808 - 809 - data = INSTANCE_BROADCAST_WRITES | SH_BROADCAST_WRITES | 810 - SE_BROADCAST_WRITES; 811 - 812 - write_register(kgd, GRBM_GFX_INDEX, data); 813 - 814 - mutex_unlock(&rdev->grbm_idx_mutex); 815 - 816 - return 0; 817 - } 818 - 819 - static uint32_t kgd_address_watch_get_offset(struct kgd_dev *kgd, 820 - unsigned int watch_point_id, 821 - unsigned int reg_offset) 822 - { 823 - return watchRegs[watch_point_id * ADDRESS_WATCH_REG_MAX + reg_offset] 824 - / 4; 825 - } 826 - 827 - static bool get_atc_vmid_pasid_mapping_valid(struct kgd_dev *kgd, uint8_t vmid) 828 - { 829 - uint32_t reg; 830 - struct radeon_device *rdev = (struct radeon_device *) kgd; 831 - 832 - reg = RREG32(ATC_VMID0_PASID_MAPPING + vmid*4); 833 - return reg & ATC_VMID_PASID_MAPPING_VALID_MASK; 834 - } 835 - 836 - static uint16_t get_atc_vmid_pasid_mapping_pasid(struct kgd_dev *kgd, 837 - uint8_t vmid) 838 - { 839 - uint32_t reg; 840 - struct radeon_device *rdev = (struct radeon_device *) kgd; 841 - 842 - reg = RREG32(ATC_VMID0_PASID_MAPPING + vmid*4); 843 - return reg & ATC_VMID_PASID_MAPPING_PASID_MASK; 844 - } 845 - 846 - static void write_vmid_invalidate_request(struct kgd_dev *kgd, uint8_t vmid) 847 - { 848 - struct radeon_device *rdev = (struct radeon_device *) kgd; 849 - 850 - return WREG32(VM_INVALIDATE_REQUEST, 1 << vmid); 851 - } 852 - 853 - static uint16_t get_fw_version(struct kgd_dev *kgd, enum kgd_engine_type type) 854 - { 855 - struct radeon_device *rdev = (struct radeon_device *) kgd; 856 - const union radeon_firmware_header *hdr; 857 - 858 - BUG_ON(kgd == NULL || rdev->mec_fw == NULL); 859 - 860 - switch (type) { 861 - case KGD_ENGINE_PFP: 862 - hdr = (const union radeon_firmware_header *) rdev->pfp_fw->data; 863 - break; 864 - 865 - case KGD_ENGINE_ME: 866 - hdr = (const union radeon_firmware_header *) rdev->me_fw->data; 867 - break; 868 - 869 - case KGD_ENGINE_CE: 870 - hdr = (const union radeon_firmware_header *) rdev->ce_fw->data; 871 - break; 872 - 873 - case KGD_ENGINE_MEC1: 874 - hdr = (const union radeon_firmware_header *) rdev->mec_fw->data; 875 - break; 876 - 877 - case KGD_ENGINE_MEC2: 878 - hdr = (const union radeon_firmware_header *) 879 - rdev->mec2_fw->data; 880 - break; 881 - 882 - case KGD_ENGINE_RLC: 883 - hdr = (const union radeon_firmware_header *) rdev->rlc_fw->data; 884 - break; 885 - 886 - case KGD_ENGINE_SDMA1: 887 - case KGD_ENGINE_SDMA2: 888 - hdr = (const union radeon_firmware_header *) 889 - rdev->sdma_fw->data; 890 - break; 891 - 892 - default: 893 - return 0; 894 - } 895 - 896 - if (hdr == NULL) 897 - return 0; 898 - 899 - /* Only 12 bit in use*/ 900 - return hdr->common.ucode_version; 901 - }
-47
drivers/gpu/drm/radeon/radeon_kfd.h
··· 1 - /* 2 - * Copyright 2014 Advanced Micro Devices, Inc. 3 - * 4 - * Permission is hereby granted, free of charge, to any person obtaining a 5 - * copy of this software and associated documentation files (the "Software"), 6 - * to deal in the Software without restriction, including without limitation 7 - * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 - * and/or sell copies of the Software, and to permit persons to whom the 9 - * Software is furnished to do so, subject to the following conditions: 10 - * 11 - * The above copyright notice and this permission notice shall be included in 12 - * all copies or substantial portions of the Software. 13 - * 14 - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17 - * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18 - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19 - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20 - * OTHER DEALINGS IN THE SOFTWARE. 21 - */ 22 - 23 - /* 24 - * radeon_kfd.h defines the private interface between the 25 - * AMD kernel graphics drivers and the AMD KFD. 26 - */ 27 - 28 - #ifndef RADEON_KFD_H_INCLUDED 29 - #define RADEON_KFD_H_INCLUDED 30 - 31 - #include <linux/types.h> 32 - #include "kgd_kfd_interface.h" 33 - 34 - struct radeon_device; 35 - 36 - int radeon_kfd_init(void); 37 - void radeon_kfd_fini(void); 38 - 39 - void radeon_kfd_suspend(struct radeon_device *rdev); 40 - int radeon_kfd_resume(struct radeon_device *rdev); 41 - void radeon_kfd_interrupt(struct radeon_device *rdev, 42 - const void *ih_ring_entry); 43 - void radeon_kfd_device_probe(struct radeon_device *rdev); 44 - void radeon_kfd_device_init(struct radeon_device *rdev); 45 - void radeon_kfd_device_fini(struct radeon_device *rdev); 46 - 47 - #endif /* RADEON_KFD_H_INCLUDED */
-7
drivers/gpu/drm/radeon/radeon_kms.c
··· 34 34 #include <linux/slab.h> 35 35 #include <linux/pm_runtime.h> 36 36 37 - #include "radeon_kfd.h" 38 - 39 37 #if defined(CONFIG_VGA_SWITCHEROO) 40 38 bool radeon_has_atpx(void); 41 39 #else ··· 65 67 pm_runtime_get_sync(dev->dev); 66 68 pm_runtime_forbid(dev->dev); 67 69 } 68 - 69 - radeon_kfd_device_fini(rdev); 70 70 71 71 radeon_acpi_fini(rdev); 72 72 ··· 169 173 dev_dbg(&dev->pdev->dev, 170 174 "Error during ACPI methods call\n"); 171 175 } 172 - 173 - radeon_kfd_device_probe(rdev); 174 - radeon_kfd_device_init(rdev); 175 176 176 177 if (radeon_is_px(dev)) { 177 178 pm_runtime_use_autosuspend(dev->dev);