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

Merge branch 'drm-next-4.20' of git://people.freedesktop.org/~agd5f/linux into drm-next

More new features and fixes for 4.20:
- Add dynamic powergating support for VCN on picasso
- Scheduler cleanup
- Vega20 support for KFD
- DC cleanups and bug fixes

Signed-off-by: Dave Airlie <airlied@redhat.com>
From: Alex Deucher <alexdeucher@gmail.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20180927184348.2696-1-alexander.deucher@amd.com

+1860 -721
+17 -7
drivers/gpu/drm/amd/amdgpu/amdgpu.h
··· 146 146 #define AMDGPU_DEFAULT_GTT_SIZE_MB 3072ULL /* 3GB by default */ 147 147 #define AMDGPU_WAIT_IDLE_TIMEOUT_IN_MS 3000 148 148 #define AMDGPU_MAX_USEC_TIMEOUT 100000 /* 100 ms */ 149 + #define AMDGPU_FENCE_JIFFIES_TIMEOUT (HZ / 2) 149 150 /* AMDGPU_IB_POOL_SIZE must be a power of 2 */ 150 151 #define AMDGPU_IB_POOL_SIZE 16 151 152 #define AMDGPU_DEBUGFS_MAX_COMPONENTS 32 ··· 409 408 AMDGPU_DOORBELL64_GFX_RING0 = 0x8b, 410 409 411 410 /* 412 - * Other graphics doorbells can be allocated here: from 0x8c to 0xef 411 + * Other graphics doorbells can be allocated here: from 0x8c to 0xdf 413 412 * Graphics voltage island aperture 1 414 - * default non-graphics QWORD index is 0xF0 - 0xFF inclusive 413 + * default non-graphics QWORD index is 0xe0 - 0xFF inclusive 415 414 */ 416 415 417 - /* sDMA engines */ 418 - AMDGPU_DOORBELL64_sDMA_ENGINE0 = 0xF0, 419 - AMDGPU_DOORBELL64_sDMA_HI_PRI_ENGINE0 = 0xF1, 420 - AMDGPU_DOORBELL64_sDMA_ENGINE1 = 0xF2, 421 - AMDGPU_DOORBELL64_sDMA_HI_PRI_ENGINE1 = 0xF3, 416 + /* sDMA engines reserved from 0xe0 -oxef */ 417 + AMDGPU_DOORBELL64_sDMA_ENGINE0 = 0xE0, 418 + AMDGPU_DOORBELL64_sDMA_HI_PRI_ENGINE0 = 0xE1, 419 + AMDGPU_DOORBELL64_sDMA_ENGINE1 = 0xE8, 420 + AMDGPU_DOORBELL64_sDMA_HI_PRI_ENGINE1 = 0xE9, 421 + 422 + /* For vega10 sriov, the sdma doorbell must be fixed as follow 423 + * to keep the same setting with host driver, or it will 424 + * happen conflicts 425 + */ 426 + AMDGPU_VEGA10_DOORBELL64_sDMA_ENGINE0 = 0xF0, 427 + AMDGPU_VEGA10_DOORBELL64_sDMA_HI_PRI_ENGINE0 = 0xF1, 428 + AMDGPU_VEGA10_DOORBELL64_sDMA_ENGINE1 = 0xF2, 429 + AMDGPU_VEGA10_DOORBELL64_sDMA_HI_PRI_ENGINE1 = 0xF3, 422 430 423 431 /* Interrupt handler */ 424 432 AMDGPU_DOORBELL64_IH = 0xF4, /* For legacy interrupt ring buffer */
+35 -15
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
··· 76 76 kfd2kgd = amdgpu_amdkfd_gfx_8_0_get_functions(); 77 77 break; 78 78 case CHIP_VEGA10: 79 + case CHIP_VEGA20: 79 80 case CHIP_RAVEN: 80 81 kfd2kgd = amdgpu_amdkfd_gfx_9_0_get_functions(); 81 82 break; ··· 124 123 125 124 void amdgpu_amdkfd_device_init(struct amdgpu_device *adev) 126 125 { 127 - int i; 126 + int i, n; 128 127 int last_valid_bit; 129 128 if (adev->kfd) { 130 129 struct kgd2kfd_shared_resources gpu_resources = { ··· 163 162 &gpu_resources.doorbell_physical_address, 164 163 &gpu_resources.doorbell_aperture_size, 165 164 &gpu_resources.doorbell_start_offset); 166 - if (adev->asic_type >= CHIP_VEGA10) { 165 + 166 + if (adev->asic_type < CHIP_VEGA10) { 167 + kgd2kfd->device_init(adev->kfd, &gpu_resources); 168 + return; 169 + } 170 + 171 + n = (adev->asic_type < CHIP_VEGA20) ? 2 : 8; 172 + 173 + for (i = 0; i < n; i += 2) { 167 174 /* On SOC15 the BIF is involved in routing 168 175 * doorbells using the low 12 bits of the 169 176 * address. Communicate the assignments to ··· 179 170 * process in case of 64-bit doorbells so we 180 171 * can use each doorbell assignment twice. 181 172 */ 182 - gpu_resources.sdma_doorbell[0][0] = 183 - AMDGPU_DOORBELL64_sDMA_ENGINE0; 184 - gpu_resources.sdma_doorbell[0][1] = 185 - AMDGPU_DOORBELL64_sDMA_ENGINE0 + 0x200; 186 - gpu_resources.sdma_doorbell[1][0] = 187 - AMDGPU_DOORBELL64_sDMA_ENGINE1; 188 - gpu_resources.sdma_doorbell[1][1] = 189 - AMDGPU_DOORBELL64_sDMA_ENGINE1 + 0x200; 190 - /* Doorbells 0x0f0-0ff and 0x2f0-2ff are reserved for 191 - * SDMA, IH and VCN. So don't use them for the CP. 192 - */ 193 - gpu_resources.reserved_doorbell_mask = 0x1f0; 194 - gpu_resources.reserved_doorbell_val = 0x0f0; 173 + if (adev->asic_type == CHIP_VEGA10) { 174 + gpu_resources.sdma_doorbell[0][i] = 175 + AMDGPU_VEGA10_DOORBELL64_sDMA_ENGINE0 + (i >> 1); 176 + gpu_resources.sdma_doorbell[0][i+1] = 177 + AMDGPU_VEGA10_DOORBELL64_sDMA_ENGINE0 + 0x200 + (i >> 1); 178 + gpu_resources.sdma_doorbell[1][i] = 179 + AMDGPU_VEGA10_DOORBELL64_sDMA_ENGINE1 + (i >> 1); 180 + gpu_resources.sdma_doorbell[1][i+1] = 181 + AMDGPU_VEGA10_DOORBELL64_sDMA_ENGINE1 + 0x200 + (i >> 1); 182 + } else { 183 + gpu_resources.sdma_doorbell[0][i] = 184 + AMDGPU_DOORBELL64_sDMA_ENGINE0 + (i >> 1); 185 + gpu_resources.sdma_doorbell[0][i+1] = 186 + AMDGPU_DOORBELL64_sDMA_ENGINE0 + 0x200 + (i >> 1); 187 + gpu_resources.sdma_doorbell[1][i] = 188 + AMDGPU_DOORBELL64_sDMA_ENGINE1 + (i >> 1); 189 + gpu_resources.sdma_doorbell[1][i+1] = 190 + AMDGPU_DOORBELL64_sDMA_ENGINE1 + 0x200 + (i >> 1); 191 + } 195 192 } 193 + /* Doorbells 0x0e0-0ff and 0x2e0-2ff are reserved for 194 + * SDMA, IH and VCN. So don't use them for the CP. 195 + */ 196 + gpu_resources.reserved_doorbell_mask = 0x1e0; 197 + gpu_resources.reserved_doorbell_val = 0x0e0; 196 198 197 199 kgd2kfd->device_init(adev->kfd, &gpu_resources); 198 200 }
+1 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
··· 174 174 struct amdgpu_vm *vm); 175 175 void amdgpu_amdkfd_gpuvm_destroy_process_vm(struct kgd_dev *kgd, void *vm); 176 176 void amdgpu_amdkfd_gpuvm_release_process_vm(struct kgd_dev *kgd, void *vm); 177 - uint32_t amdgpu_amdkfd_gpuvm_get_process_page_dir(void *vm); 177 + uint64_t amdgpu_amdkfd_gpuvm_get_process_page_dir(void *vm); 178 178 int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu( 179 179 struct kgd_dev *kgd, uint64_t va, uint64_t size, 180 180 void *vm, struct kgd_mem **mem,
+4 -3
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
··· 142 142 static void set_scratch_backing_va(struct kgd_dev *kgd, 143 143 uint64_t va, uint32_t vmid); 144 144 static void set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmid, 145 - uint32_t page_table_base); 145 + uint64_t page_table_base); 146 146 static int invalidate_tlbs(struct kgd_dev *kgd, uint16_t pasid); 147 147 static int invalidate_tlbs_vmid(struct kgd_dev *kgd, uint16_t vmid); 148 148 static uint32_t read_vmid_from_vmfault_reg(struct kgd_dev *kgd); ··· 874 874 } 875 875 876 876 static void set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmid, 877 - uint32_t page_table_base) 877 + uint64_t page_table_base) 878 878 { 879 879 struct amdgpu_device *adev = get_amdgpu_device(kgd); 880 880 ··· 882 882 pr_err("trying to set page table base for wrong VMID\n"); 883 883 return; 884 884 } 885 - WREG32(mmVM_CONTEXT8_PAGE_TABLE_BASE_ADDR + vmid - 8, page_table_base); 885 + WREG32(mmVM_CONTEXT8_PAGE_TABLE_BASE_ADDR + vmid - 8, 886 + lower_32_bits(page_table_base)); 886 887 } 887 888 888 889 static int invalidate_tlbs(struct kgd_dev *kgd, uint16_t pasid)
+6 -6
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
··· 45 45 RESET_WAVES 46 46 }; 47 47 48 - struct vi_sdma_mqd; 49 - 50 48 /* 51 49 * Register access functions 52 50 */ ··· 98 100 static void set_scratch_backing_va(struct kgd_dev *kgd, 99 101 uint64_t va, uint32_t vmid); 100 102 static void set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmid, 101 - uint32_t page_table_base); 103 + uint64_t page_table_base); 102 104 static int invalidate_tlbs(struct kgd_dev *kgd, uint16_t pasid); 103 105 static int invalidate_tlbs_vmid(struct kgd_dev *kgd, uint16_t vmid); 104 106 ··· 280 282 281 283 lock_srbm(kgd, mec, pipe, 0, 0); 282 284 283 - WREG32(mmCPC_INT_CNTL, CP_INT_CNTL_RING0__TIME_STAMP_INT_ENABLE_MASK); 285 + WREG32(mmCPC_INT_CNTL, CP_INT_CNTL_RING0__TIME_STAMP_INT_ENABLE_MASK | 286 + CP_INT_CNTL_RING0__OPCODE_ERROR_INT_ENABLE_MASK); 284 287 285 288 unlock_srbm(kgd); 286 289 ··· 833 834 } 834 835 835 836 static void set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmid, 836 - uint32_t page_table_base) 837 + uint64_t page_table_base) 837 838 { 838 839 struct amdgpu_device *adev = get_amdgpu_device(kgd); 839 840 ··· 841 842 pr_err("trying to set page table base for wrong VMID\n"); 842 843 return; 843 844 } 844 - WREG32(mmVM_CONTEXT8_PAGE_TABLE_BASE_ADDR + vmid - 8, page_table_base); 845 + WREG32(mmVM_CONTEXT8_PAGE_TABLE_BASE_ADDR + vmid - 8, 846 + lower_32_bits(page_table_base)); 845 847 } 846 848 847 849 static int invalidate_tlbs(struct kgd_dev *kgd, uint16_t pasid)
+3 -4
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c
··· 138 138 static uint16_t get_atc_vmid_pasid_mapping_pasid(struct kgd_dev *kgd, 139 139 uint8_t vmid); 140 140 static void set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmid, 141 - uint32_t page_table_base); 141 + uint64_t page_table_base); 142 142 static uint16_t get_fw_version(struct kgd_dev *kgd, enum kgd_engine_type type); 143 143 static void set_scratch_backing_va(struct kgd_dev *kgd, 144 144 uint64_t va, uint32_t vmid); ··· 1013 1013 } 1014 1014 1015 1015 static void set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmid, 1016 - uint32_t page_table_base) 1016 + uint64_t page_table_base) 1017 1017 { 1018 1018 struct amdgpu_device *adev = get_amdgpu_device(kgd); 1019 - uint64_t base = (uint64_t)page_table_base << PAGE_SHIFT | 1020 - AMDGPU_PTE_VALID; 1019 + uint64_t base = page_table_base | AMDGPU_PTE_VALID; 1021 1020 1022 1021 if (!amdgpu_amdkfd_is_kfd_vmid(adev, vmid)) { 1023 1022 pr_err("trying to set page table base for wrong VMID %u\n",
+6 -2
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
··· 1131 1131 amdgpu_vm_release_compute(adev, avm); 1132 1132 } 1133 1133 1134 - uint32_t amdgpu_amdkfd_gpuvm_get_process_page_dir(void *vm) 1134 + uint64_t amdgpu_amdkfd_gpuvm_get_process_page_dir(void *vm) 1135 1135 { 1136 1136 struct amdgpu_vm *avm = (struct amdgpu_vm *)vm; 1137 + struct amdgpu_bo *pd = avm->root.base.bo; 1138 + struct amdgpu_device *adev = amdgpu_ttm_adev(pd->tbo.bdev); 1137 1139 1138 - return avm->pd_phys_addr >> AMDGPU_GPU_PAGE_SHIFT; 1140 + if (adev->asic_type < CHIP_VEGA10) 1141 + return avm->pd_phys_addr >> AMDGPU_GPU_PAGE_SHIFT; 1142 + return avm->pd_phys_addr; 1139 1143 } 1140 1144 1141 1145 int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(
+64 -2
drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
··· 196 196 } 197 197 198 198 /** 199 + * amdgpu_fence_schedule_fallback - schedule fallback check 200 + * 201 + * @ring: pointer to struct amdgpu_ring 202 + * 203 + * Start a timer as fallback to our interrupts. 204 + */ 205 + static void amdgpu_fence_schedule_fallback(struct amdgpu_ring *ring) 206 + { 207 + mod_timer(&ring->fence_drv.fallback_timer, 208 + jiffies + AMDGPU_FENCE_JIFFIES_TIMEOUT); 209 + } 210 + 211 + /** 199 212 * amdgpu_fence_process - check for fence activity 200 213 * 201 214 * @ring: pointer to struct amdgpu_ring ··· 216 203 * Checks the current fence value and calculates the last 217 204 * signalled fence value. Wakes the fence queue if the 218 205 * sequence number has increased. 206 + * 207 + * Returns true if fence was processed 219 208 */ 220 - void amdgpu_fence_process(struct amdgpu_ring *ring) 209 + bool amdgpu_fence_process(struct amdgpu_ring *ring) 221 210 { 222 211 struct amdgpu_fence_driver *drv = &ring->fence_drv; 223 212 uint32_t seq, last_seq; ··· 231 216 232 217 } while (atomic_cmpxchg(&drv->last_seq, last_seq, seq) != last_seq); 233 218 219 + if (del_timer(&ring->fence_drv.fallback_timer) && 220 + seq != ring->fence_drv.sync_seq) 221 + amdgpu_fence_schedule_fallback(ring); 222 + 234 223 if (unlikely(seq == last_seq)) 235 - return; 224 + return false; 236 225 237 226 last_seq &= drv->num_fences_mask; 238 227 seq &= drv->num_fences_mask; ··· 263 244 264 245 dma_fence_put(fence); 265 246 } while (last_seq != seq); 247 + 248 + return true; 249 + } 250 + 251 + /** 252 + * amdgpu_fence_fallback - fallback for hardware interrupts 253 + * 254 + * @work: delayed work item 255 + * 256 + * Checks for fence activity. 257 + */ 258 + static void amdgpu_fence_fallback(struct timer_list *t) 259 + { 260 + struct amdgpu_ring *ring = from_timer(ring, t, 261 + fence_drv.fallback_timer); 262 + 263 + if (amdgpu_fence_process(ring)) 264 + DRM_WARN("Fence fallback timer expired on ring %s\n", ring->name); 266 265 } 267 266 268 267 /** ··· 430 393 atomic_set(&ring->fence_drv.last_seq, 0); 431 394 ring->fence_drv.initialized = false; 432 395 396 + timer_setup(&ring->fence_drv.fallback_timer, amdgpu_fence_fallback, 0); 397 + 433 398 ring->fence_drv.num_fences_mask = num_hw_submission * 2 - 1; 434 399 spin_lock_init(&ring->fence_drv.lock); 435 400 ring->fence_drv.fences = kcalloc(num_hw_submission * 2, sizeof(void *), ··· 507 468 amdgpu_irq_put(adev, ring->fence_drv.irq_src, 508 469 ring->fence_drv.irq_type); 509 470 drm_sched_fini(&ring->sched); 471 + del_timer_sync(&ring->fence_drv.fallback_timer); 510 472 for (j = 0; j <= ring->fence_drv.num_fences_mask; ++j) 511 473 dma_fence_put(ring->fence_drv.fences[j]); 512 474 kfree(ring->fence_drv.fences); ··· 601 561 } 602 562 603 563 /** 564 + * amdgpu_fence_enable_signaling - enable signalling on fence 565 + * @fence: fence 566 + * 567 + * This function is called with fence_queue lock held, and adds a callback 568 + * to fence_queue that checks if this fence is signaled, and if so it 569 + * signals the fence and removes itself. 570 + */ 571 + static bool amdgpu_fence_enable_signaling(struct dma_fence *f) 572 + { 573 + struct amdgpu_fence *fence = to_amdgpu_fence(f); 574 + struct amdgpu_ring *ring = fence->ring; 575 + 576 + if (!timer_pending(&ring->fence_drv.fallback_timer)) 577 + amdgpu_fence_schedule_fallback(ring); 578 + 579 + DMA_FENCE_TRACE(&fence->base, "armed on ring %i!\n", ring->idx); 580 + 581 + return true; 582 + } 583 + 584 + /** 604 585 * amdgpu_fence_free - free up the fence memory 605 586 * 606 587 * @rcu: RCU callback head ··· 651 590 static const struct dma_fence_ops amdgpu_fence_ops = { 652 591 .get_driver_name = amdgpu_fence_get_driver_name, 653 592 .get_timeline_name = amdgpu_fence_get_timeline_name, 593 + .enable_signaling = amdgpu_fence_enable_signaling, 654 594 .release = amdgpu_fence_release, 655 595 }; 656 596
+66 -98
drivers/gpu/drm/amd/amdgpu/amdgpu_ih.c
··· 24 24 #include <drm/drmP.h> 25 25 #include "amdgpu.h" 26 26 #include "amdgpu_ih.h" 27 - #include "amdgpu_amdkfd.h" 28 - 29 - /** 30 - * amdgpu_ih_ring_alloc - allocate memory for the IH ring 31 - * 32 - * @adev: amdgpu_device pointer 33 - * 34 - * Allocate a ring buffer for the interrupt controller. 35 - * Returns 0 for success, errors for failure. 36 - */ 37 - static int amdgpu_ih_ring_alloc(struct amdgpu_device *adev) 38 - { 39 - int r; 40 - 41 - /* Allocate ring buffer */ 42 - if (adev->irq.ih.ring_obj == NULL) { 43 - r = amdgpu_bo_create_kernel(adev, adev->irq.ih.ring_size, 44 - PAGE_SIZE, AMDGPU_GEM_DOMAIN_GTT, 45 - &adev->irq.ih.ring_obj, 46 - &adev->irq.ih.gpu_addr, 47 - (void **)&adev->irq.ih.ring); 48 - if (r) { 49 - DRM_ERROR("amdgpu: failed to create ih ring buffer (%d).\n", r); 50 - return r; 51 - } 52 - } 53 - return 0; 54 - } 55 27 56 28 /** 57 29 * amdgpu_ih_ring_init - initialize the IH state 58 30 * 59 31 * @adev: amdgpu_device pointer 32 + * @ih: ih ring to initialize 33 + * @ring_size: ring size to allocate 34 + * @use_bus_addr: true when we can use dma_alloc_coherent 60 35 * 61 36 * Initializes the IH state and allocates a buffer 62 37 * for the IH ring buffer. 63 38 * Returns 0 for success, errors for failure. 64 39 */ 65 - int amdgpu_ih_ring_init(struct amdgpu_device *adev, unsigned ring_size, 66 - bool use_bus_addr) 40 + int amdgpu_ih_ring_init(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih, 41 + unsigned ring_size, bool use_bus_addr) 67 42 { 68 43 u32 rb_bufsz; 69 44 int r; ··· 46 71 /* Align ring size */ 47 72 rb_bufsz = order_base_2(ring_size / 4); 48 73 ring_size = (1 << rb_bufsz) * 4; 49 - adev->irq.ih.ring_size = ring_size; 50 - adev->irq.ih.ptr_mask = adev->irq.ih.ring_size - 1; 51 - adev->irq.ih.rptr = 0; 52 - adev->irq.ih.use_bus_addr = use_bus_addr; 74 + ih->ring_size = ring_size; 75 + ih->ptr_mask = ih->ring_size - 1; 76 + ih->rptr = 0; 77 + ih->use_bus_addr = use_bus_addr; 53 78 54 - if (adev->irq.ih.use_bus_addr) { 55 - if (!adev->irq.ih.ring) { 56 - /* add 8 bytes for the rptr/wptr shadows and 57 - * add them to the end of the ring allocation. 58 - */ 59 - adev->irq.ih.ring = pci_alloc_consistent(adev->pdev, 60 - adev->irq.ih.ring_size + 8, 61 - &adev->irq.ih.rb_dma_addr); 62 - if (adev->irq.ih.ring == NULL) 63 - return -ENOMEM; 64 - memset((void *)adev->irq.ih.ring, 0, adev->irq.ih.ring_size + 8); 65 - adev->irq.ih.wptr_offs = (adev->irq.ih.ring_size / 4) + 0; 66 - adev->irq.ih.rptr_offs = (adev->irq.ih.ring_size / 4) + 1; 67 - } 68 - return 0; 79 + if (use_bus_addr) { 80 + if (ih->ring) 81 + return 0; 82 + 83 + /* add 8 bytes for the rptr/wptr shadows and 84 + * add them to the end of the ring allocation. 85 + */ 86 + ih->ring = dma_alloc_coherent(adev->dev, ih->ring_size + 8, 87 + &ih->rb_dma_addr, GFP_KERNEL); 88 + if (ih->ring == NULL) 89 + return -ENOMEM; 90 + 91 + memset((void *)ih->ring, 0, ih->ring_size + 8); 92 + ih->wptr_offs = (ih->ring_size / 4) + 0; 93 + ih->rptr_offs = (ih->ring_size / 4) + 1; 69 94 } else { 70 - r = amdgpu_device_wb_get(adev, &adev->irq.ih.wptr_offs); 95 + r = amdgpu_device_wb_get(adev, &ih->wptr_offs); 96 + if (r) 97 + return r; 98 + 99 + r = amdgpu_device_wb_get(adev, &ih->rptr_offs); 71 100 if (r) { 72 - dev_err(adev->dev, "(%d) ih wptr_offs wb alloc failed\n", r); 101 + amdgpu_device_wb_free(adev, ih->wptr_offs); 73 102 return r; 74 103 } 75 104 76 - r = amdgpu_device_wb_get(adev, &adev->irq.ih.rptr_offs); 105 + r = amdgpu_bo_create_kernel(adev, ih->ring_size, PAGE_SIZE, 106 + AMDGPU_GEM_DOMAIN_GTT, 107 + &ih->ring_obj, &ih->gpu_addr, 108 + (void **)&ih->ring); 77 109 if (r) { 78 - amdgpu_device_wb_free(adev, adev->irq.ih.wptr_offs); 79 - dev_err(adev->dev, "(%d) ih rptr_offs wb alloc failed\n", r); 110 + amdgpu_device_wb_free(adev, ih->rptr_offs); 111 + amdgpu_device_wb_free(adev, ih->wptr_offs); 80 112 return r; 81 113 } 82 - 83 - return amdgpu_ih_ring_alloc(adev); 84 114 } 115 + return 0; 85 116 } 86 117 87 118 /** 88 119 * amdgpu_ih_ring_fini - tear down the IH state 89 120 * 90 121 * @adev: amdgpu_device pointer 122 + * @ih: ih ring to tear down 91 123 * 92 124 * Tears down the IH state and frees buffer 93 125 * used for the IH ring buffer. 94 126 */ 95 - void amdgpu_ih_ring_fini(struct amdgpu_device *adev) 127 + void amdgpu_ih_ring_fini(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih) 96 128 { 97 - if (adev->irq.ih.use_bus_addr) { 98 - if (adev->irq.ih.ring) { 99 - /* add 8 bytes for the rptr/wptr shadows and 100 - * add them to the end of the ring allocation. 101 - */ 102 - pci_free_consistent(adev->pdev, adev->irq.ih.ring_size + 8, 103 - (void *)adev->irq.ih.ring, 104 - adev->irq.ih.rb_dma_addr); 105 - adev->irq.ih.ring = NULL; 106 - } 129 + if (ih->use_bus_addr) { 130 + if (!ih->ring) 131 + return; 132 + 133 + /* add 8 bytes for the rptr/wptr shadows and 134 + * add them to the end of the ring allocation. 135 + */ 136 + dma_free_coherent(adev->dev, ih->ring_size + 8, 137 + (void *)ih->ring, ih->rb_dma_addr); 138 + ih->ring = NULL; 107 139 } else { 108 - amdgpu_bo_free_kernel(&adev->irq.ih.ring_obj, 109 - &adev->irq.ih.gpu_addr, 110 - (void **)&adev->irq.ih.ring); 111 - amdgpu_device_wb_free(adev, adev->irq.ih.wptr_offs); 112 - amdgpu_device_wb_free(adev, adev->irq.ih.rptr_offs); 140 + amdgpu_bo_free_kernel(&ih->ring_obj, &ih->gpu_addr, 141 + (void **)&ih->ring); 142 + amdgpu_device_wb_free(adev, ih->wptr_offs); 143 + amdgpu_device_wb_free(adev, ih->rptr_offs); 113 144 } 114 145 } 115 146 ··· 123 142 * amdgpu_ih_process - interrupt handler 124 143 * 125 144 * @adev: amdgpu_device pointer 145 + * @ih: ih ring to process 126 146 * 127 147 * Interrupt hander (VI), walk the IH ring. 128 148 * Returns irq process return code. 129 149 */ 130 - int amdgpu_ih_process(struct amdgpu_device *adev) 150 + int amdgpu_ih_process(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih, 151 + void (*callback)(struct amdgpu_device *adev, 152 + struct amdgpu_ih_ring *ih)) 131 153 { 132 - struct amdgpu_iv_entry entry; 133 154 u32 wptr; 134 155 135 - if (!adev->irq.ih.enabled || adev->shutdown) 156 + if (!ih->enabled || adev->shutdown) 136 157 return IRQ_NONE; 137 158 138 159 wptr = amdgpu_ih_get_wptr(adev); 139 160 140 161 restart_ih: 141 162 /* is somebody else already processing irqs? */ 142 - if (atomic_xchg(&adev->irq.ih.lock, 1)) 163 + if (atomic_xchg(&ih->lock, 1)) 143 164 return IRQ_NONE; 144 165 145 - DRM_DEBUG("%s: rptr %d, wptr %d\n", __func__, adev->irq.ih.rptr, wptr); 166 + DRM_DEBUG("%s: rptr %d, wptr %d\n", __func__, ih->rptr, wptr); 146 167 147 168 /* Order reading of wptr vs. reading of IH ring data */ 148 169 rmb(); 149 170 150 - while (adev->irq.ih.rptr != wptr) { 151 - u32 ring_index = adev->irq.ih.rptr >> 2; 152 - 153 - /* Prescreening of high-frequency interrupts */ 154 - if (!amdgpu_ih_prescreen_iv(adev)) { 155 - adev->irq.ih.rptr &= adev->irq.ih.ptr_mask; 156 - continue; 157 - } 158 - 159 - /* Before dispatching irq to IP blocks, send it to amdkfd */ 160 - amdgpu_amdkfd_interrupt(adev, 161 - (const void *) &adev->irq.ih.ring[ring_index]); 162 - 163 - entry.iv_entry = (const uint32_t *) 164 - &adev->irq.ih.ring[ring_index]; 165 - amdgpu_ih_decode_iv(adev, &entry); 166 - adev->irq.ih.rptr &= adev->irq.ih.ptr_mask; 167 - 168 - amdgpu_irq_dispatch(adev, &entry); 171 + while (ih->rptr != wptr) { 172 + callback(adev, ih); 173 + ih->rptr &= ih->ptr_mask; 169 174 } 175 + 170 176 amdgpu_ih_set_rptr(adev); 171 - atomic_set(&adev->irq.ih.lock, 0); 177 + atomic_set(&ih->lock, 0); 172 178 173 179 /* make sure wptr hasn't changed while processing */ 174 180 wptr = amdgpu_ih_get_wptr(adev); 175 - if (wptr != adev->irq.ih.rptr) 181 + if (wptr != ih->rptr) 176 182 goto restart_ih; 177 183 178 184 return IRQ_HANDLED;
+7 -25
drivers/gpu/drm/amd/amdgpu/amdgpu_ih.h
··· 24 24 #ifndef __AMDGPU_IH_H__ 25 25 #define __AMDGPU_IH_H__ 26 26 27 - #include "soc15_ih_clientid.h" 28 - 29 27 struct amdgpu_device; 30 - 31 - #define AMDGPU_IH_CLIENTID_LEGACY 0 32 - #define AMDGPU_IH_CLIENTID_MAX SOC15_IH_CLIENTID_MAX 28 + struct amdgpu_iv_entry; 33 29 34 30 /* 35 31 * R6xx+ IH ring ··· 47 51 dma_addr_t rb_dma_addr; /* only used when use_bus_addr = true */ 48 52 }; 49 53 50 - #define AMDGPU_IH_SRC_DATA_MAX_SIZE_DW 4 51 - 52 - struct amdgpu_iv_entry { 53 - unsigned client_id; 54 - unsigned src_id; 55 - unsigned ring_id; 56 - unsigned vmid; 57 - unsigned vmid_src; 58 - uint64_t timestamp; 59 - unsigned timestamp_src; 60 - unsigned pasid; 61 - unsigned pasid_src; 62 - unsigned src_data[AMDGPU_IH_SRC_DATA_MAX_SIZE_DW]; 63 - const uint32_t *iv_entry; 64 - }; 65 - 66 54 /* provided by the ih block */ 67 55 struct amdgpu_ih_funcs { 68 56 /* ring read/write ptr handling, called from interrupt context */ ··· 62 82 #define amdgpu_ih_decode_iv(adev, iv) (adev)->irq.ih_funcs->decode_iv((adev), (iv)) 63 83 #define amdgpu_ih_set_rptr(adev) (adev)->irq.ih_funcs->set_rptr((adev)) 64 84 65 - int amdgpu_ih_ring_init(struct amdgpu_device *adev, unsigned ring_size, 66 - bool use_bus_addr); 67 - void amdgpu_ih_ring_fini(struct amdgpu_device *adev); 68 - int amdgpu_ih_process(struct amdgpu_device *adev); 85 + int amdgpu_ih_ring_init(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih, 86 + unsigned ring_size, bool use_bus_addr); 87 + void amdgpu_ih_ring_fini(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih); 88 + int amdgpu_ih_process(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih, 89 + void (*callback)(struct amdgpu_device *adev, 90 + struct amdgpu_ih_ring *ih)); 69 91 70 92 #endif
+35 -6
drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
··· 51 51 #include "atom.h" 52 52 #include "amdgpu_connectors.h" 53 53 #include "amdgpu_trace.h" 54 + #include "amdgpu_amdkfd.h" 54 55 55 56 #include <linux/pm_runtime.h> 56 57 ··· 124 123 int r; 125 124 126 125 spin_lock_irqsave(&adev->irq.lock, irqflags); 127 - for (i = 0; i < AMDGPU_IH_CLIENTID_MAX; ++i) { 126 + for (i = 0; i < AMDGPU_IRQ_CLIENTID_MAX; ++i) { 128 127 if (!adev->irq.client[i].sources) 129 128 continue; 130 129 ··· 148 147 } 149 148 150 149 /** 150 + * amdgpu_irq_callback - callback from the IH ring 151 + * 152 + * @adev: amdgpu device pointer 153 + * @ih: amdgpu ih ring 154 + * 155 + * Callback from IH ring processing to handle the entry at the current position 156 + * and advance the read pointer. 157 + */ 158 + static void amdgpu_irq_callback(struct amdgpu_device *adev, 159 + struct amdgpu_ih_ring *ih) 160 + { 161 + u32 ring_index = ih->rptr >> 2; 162 + struct amdgpu_iv_entry entry; 163 + 164 + /* Prescreening of high-frequency interrupts */ 165 + if (!amdgpu_ih_prescreen_iv(adev)) 166 + return; 167 + 168 + /* Before dispatching irq to IP blocks, send it to amdkfd */ 169 + amdgpu_amdkfd_interrupt(adev, (const void *) &ih->ring[ring_index]); 170 + 171 + entry.iv_entry = (const uint32_t *)&ih->ring[ring_index]; 172 + amdgpu_ih_decode_iv(adev, &entry); 173 + 174 + amdgpu_irq_dispatch(adev, &entry); 175 + } 176 + 177 + /** 151 178 * amdgpu_irq_handler - IRQ handler 152 179 * 153 180 * @irq: IRQ number (unused) ··· 192 163 struct amdgpu_device *adev = dev->dev_private; 193 164 irqreturn_t ret; 194 165 195 - ret = amdgpu_ih_process(adev); 166 + ret = amdgpu_ih_process(adev, &adev->irq.ih, amdgpu_irq_callback); 196 167 if (ret == IRQ_HANDLED) 197 168 pm_runtime_mark_last_busy(dev->dev); 198 169 return ret; ··· 302 273 cancel_work_sync(&adev->reset_work); 303 274 } 304 275 305 - for (i = 0; i < AMDGPU_IH_CLIENTID_MAX; ++i) { 276 + for (i = 0; i < AMDGPU_IRQ_CLIENTID_MAX; ++i) { 306 277 if (!adev->irq.client[i].sources) 307 278 continue; 308 279 ··· 342 313 unsigned client_id, unsigned src_id, 343 314 struct amdgpu_irq_src *source) 344 315 { 345 - if (client_id >= AMDGPU_IH_CLIENTID_MAX) 316 + if (client_id >= AMDGPU_IRQ_CLIENTID_MAX) 346 317 return -EINVAL; 347 318 348 319 if (src_id >= AMDGPU_MAX_IRQ_SRC_ID) ··· 396 367 397 368 trace_amdgpu_iv(entry); 398 369 399 - if (client_id >= AMDGPU_IH_CLIENTID_MAX) { 370 + if (client_id >= AMDGPU_IRQ_CLIENTID_MAX) { 400 371 DRM_DEBUG("Invalid client_id in IV: %d\n", client_id); 401 372 return; 402 373 } ··· 469 440 { 470 441 int i, j, k; 471 442 472 - for (i = 0; i < AMDGPU_IH_CLIENTID_MAX; ++i) { 443 + for (i = 0; i < AMDGPU_IRQ_CLIENTID_MAX; ++i) { 473 444 if (!adev->irq.client[i].sources) 474 445 continue; 475 446
+22 -3
drivers/gpu/drm/amd/amdgpu/amdgpu_irq.h
··· 25 25 #define __AMDGPU_IRQ_H__ 26 26 27 27 #include <linux/irqdomain.h> 28 + #include "soc15_ih_clientid.h" 28 29 #include "amdgpu_ih.h" 29 30 30 - #define AMDGPU_MAX_IRQ_SRC_ID 0x100 31 + #define AMDGPU_MAX_IRQ_SRC_ID 0x100 31 32 #define AMDGPU_MAX_IRQ_CLIENT_ID 0x100 32 33 34 + #define AMDGPU_IRQ_CLIENTID_LEGACY 0 35 + #define AMDGPU_IRQ_CLIENTID_MAX SOC15_IH_CLIENTID_MAX 36 + 37 + #define AMDGPU_IRQ_SRC_DATA_MAX_SIZE_DW 4 38 + 33 39 struct amdgpu_device; 34 - struct amdgpu_iv_entry; 35 40 36 41 enum amdgpu_interrupt_state { 37 42 AMDGPU_IRQ_STATE_DISABLE, 38 43 AMDGPU_IRQ_STATE_ENABLE, 44 + }; 45 + 46 + struct amdgpu_iv_entry { 47 + unsigned client_id; 48 + unsigned src_id; 49 + unsigned ring_id; 50 + unsigned vmid; 51 + unsigned vmid_src; 52 + uint64_t timestamp; 53 + unsigned timestamp_src; 54 + unsigned pasid; 55 + unsigned pasid_src; 56 + unsigned src_data[AMDGPU_IRQ_SRC_DATA_MAX_SIZE_DW]; 57 + const uint32_t *iv_entry; 39 58 }; 40 59 41 60 struct amdgpu_irq_src { ··· 82 63 bool installed; 83 64 spinlock_t lock; 84 65 /* interrupt sources */ 85 - struct amdgpu_irq_client client[AMDGPU_IH_CLIENTID_MAX]; 66 + struct amdgpu_irq_client client[AMDGPU_IRQ_CLIENTID_MAX]; 86 67 87 68 /* status, etc. */ 88 69 bool msi_enabled; /* msi enabled */
+5
drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
··· 1976 1976 static int amdgpu_debugfs_pm_info_pp(struct seq_file *m, struct amdgpu_device *adev) 1977 1977 { 1978 1978 uint32_t value; 1979 + uint64_t value64; 1979 1980 uint32_t query = 0; 1980 1981 int size; 1981 1982 ··· 2014 2013 if (!amdgpu_dpm_read_sensor(adev, AMDGPU_PP_SENSOR_GPU_LOAD, (void *)&value, &size)) 2015 2014 seq_printf(m, "GPU Load: %u %%\n", value); 2016 2015 seq_printf(m, "\n"); 2016 + 2017 + /* SMC feature mask */ 2018 + if (!amdgpu_dpm_read_sensor(adev, AMDGPU_PP_SENSOR_ENABLED_SMC_FEATURES_MASK, (void *)&value64, &size)) 2019 + seq_printf(m, "SMC Feature Mask: 0x%016llx\n", value64); 2017 2020 2018 2021 /* UVD clocks */ 2019 2022 if (!amdgpu_dpm_read_sensor(adev, AMDGPU_PP_SENSOR_UVD_POWER, (void *)&value, &size)) {
+2 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
··· 77 77 bool initialized; 78 78 struct amdgpu_irq_src *irq_src; 79 79 unsigned irq_type; 80 + struct timer_list fallback_timer; 80 81 unsigned num_fences_mask; 81 82 spinlock_t lock; 82 83 struct dma_fence **fences; ··· 97 96 int amdgpu_fence_emit(struct amdgpu_ring *ring, struct dma_fence **fence, 98 97 unsigned flags); 99 98 int amdgpu_fence_emit_polling(struct amdgpu_ring *ring, uint32_t *s); 100 - void amdgpu_fence_process(struct amdgpu_ring *ring); 99 + bool amdgpu_fence_process(struct amdgpu_ring *ring); 101 100 int amdgpu_fence_wait_empty(struct amdgpu_ring *ring); 102 101 signed long amdgpu_fence_wait_polling(struct amdgpu_ring *ring, 103 102 uint32_t wait_seq,
+1 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h
··· 103 103 __entry->src_data[2] = iv->src_data[2]; 104 104 __entry->src_data[3] = iv->src_data[3]; 105 105 ), 106 - TP_printk("client_id:%u src_id:%u ring:%u vmid:%u timestamp: %llu pasid:%u src_data: %08x %08x %08x %08x\n", 106 + TP_printk("client_id:%u src_id:%u ring:%u vmid:%u timestamp: %llu pasid:%u src_data: %08x %08x %08x %08x", 107 107 __entry->client_id, __entry->src_id, 108 108 __entry->ring_id, __entry->vmid, 109 109 __entry->timestamp, __entry->pasid,
+167 -10
drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
··· 36 36 #include "soc15_common.h" 37 37 38 38 #include "vcn/vcn_1_0_offset.h" 39 + #include "vcn/vcn_1_0_sh_mask.h" 39 40 40 41 /* 1 second timeout */ 41 42 #define VCN_IDLE_TIMEOUT msecs_to_jiffies(1000) ··· 213 212 return 0; 214 213 } 215 214 215 + static int amdgpu_vcn_pause_dpg_mode(struct amdgpu_device *adev, 216 + struct dpg_pause_state *new_state) 217 + { 218 + int ret_code; 219 + uint32_t reg_data = 0; 220 + uint32_t reg_data2 = 0; 221 + struct amdgpu_ring *ring; 222 + 223 + /* pause/unpause if state is changed */ 224 + if (adev->vcn.pause_state.fw_based != new_state->fw_based) { 225 + DRM_DEBUG("dpg pause state changed %d:%d -> %d:%d", 226 + adev->vcn.pause_state.fw_based, adev->vcn.pause_state.jpeg, 227 + new_state->fw_based, new_state->jpeg); 228 + 229 + reg_data = RREG32_SOC15(UVD, 0, mmUVD_DPG_PAUSE) & 230 + (~UVD_DPG_PAUSE__NJ_PAUSE_DPG_ACK_MASK); 231 + 232 + if (new_state->fw_based == VCN_DPG_STATE__PAUSE) { 233 + ret_code = 0; 234 + 235 + if (!(reg_data & UVD_DPG_PAUSE__JPEG_PAUSE_DPG_ACK_MASK)) 236 + SOC15_WAIT_ON_RREG(UVD, 0, mmUVD_POWER_STATUS, 237 + UVD_POWER_STATUS__UVD_POWER_STATUS_TILES_OFF, 238 + UVD_POWER_STATUS__UVD_POWER_STATUS_MASK, ret_code); 239 + 240 + if (!ret_code) { 241 + /* pause DPG non-jpeg */ 242 + reg_data |= UVD_DPG_PAUSE__NJ_PAUSE_DPG_REQ_MASK; 243 + WREG32_SOC15(UVD, 0, mmUVD_DPG_PAUSE, reg_data); 244 + SOC15_WAIT_ON_RREG(UVD, 0, mmUVD_DPG_PAUSE, 245 + UVD_DPG_PAUSE__NJ_PAUSE_DPG_ACK_MASK, 246 + UVD_DPG_PAUSE__NJ_PAUSE_DPG_ACK_MASK, ret_code); 247 + 248 + /* Restore */ 249 + ring = &adev->vcn.ring_enc[0]; 250 + WREG32_SOC15(UVD, 0, mmUVD_RB_BASE_LO, ring->gpu_addr); 251 + WREG32_SOC15(UVD, 0, mmUVD_RB_BASE_HI, upper_32_bits(ring->gpu_addr)); 252 + WREG32_SOC15(UVD, 0, mmUVD_RB_SIZE, ring->ring_size / 4); 253 + WREG32_SOC15(UVD, 0, mmUVD_RB_RPTR, lower_32_bits(ring->wptr)); 254 + WREG32_SOC15(UVD, 0, mmUVD_RB_WPTR, lower_32_bits(ring->wptr)); 255 + 256 + ring = &adev->vcn.ring_enc[1]; 257 + WREG32_SOC15(UVD, 0, mmUVD_RB_BASE_LO2, ring->gpu_addr); 258 + WREG32_SOC15(UVD, 0, mmUVD_RB_BASE_HI2, upper_32_bits(ring->gpu_addr)); 259 + WREG32_SOC15(UVD, 0, mmUVD_RB_SIZE2, ring->ring_size / 4); 260 + WREG32_SOC15(UVD, 0, mmUVD_RB_RPTR2, lower_32_bits(ring->wptr)); 261 + WREG32_SOC15(UVD, 0, mmUVD_RB_WPTR2, lower_32_bits(ring->wptr)); 262 + 263 + ring = &adev->vcn.ring_dec; 264 + WREG32_SOC15(UVD, 0, mmUVD_RBC_RB_WPTR, 265 + lower_32_bits(ring->wptr) | 0x80000000); 266 + SOC15_WAIT_ON_RREG(UVD, 0, mmUVD_POWER_STATUS, 267 + UVD_PGFSM_CONFIG__UVDM_UVDU_PWR_ON, 268 + UVD_POWER_STATUS__UVD_POWER_STATUS_MASK, ret_code); 269 + } 270 + } else { 271 + /* unpause dpg non-jpeg, no need to wait */ 272 + reg_data &= ~UVD_DPG_PAUSE__NJ_PAUSE_DPG_REQ_MASK; 273 + WREG32_SOC15(UVD, 0, mmUVD_DPG_PAUSE, reg_data); 274 + } 275 + adev->vcn.pause_state.fw_based = new_state->fw_based; 276 + } 277 + 278 + /* pause/unpause if state is changed */ 279 + if (adev->vcn.pause_state.jpeg != new_state->jpeg) { 280 + DRM_DEBUG("dpg pause state changed %d:%d -> %d:%d", 281 + adev->vcn.pause_state.fw_based, adev->vcn.pause_state.jpeg, 282 + new_state->fw_based, new_state->jpeg); 283 + 284 + reg_data = RREG32_SOC15(UVD, 0, mmUVD_DPG_PAUSE) & 285 + (~UVD_DPG_PAUSE__JPEG_PAUSE_DPG_ACK_MASK); 286 + 287 + if (new_state->jpeg == VCN_DPG_STATE__PAUSE) { 288 + ret_code = 0; 289 + 290 + if (!(reg_data & UVD_DPG_PAUSE__NJ_PAUSE_DPG_ACK_MASK)) 291 + SOC15_WAIT_ON_RREG(UVD, 0, mmUVD_POWER_STATUS, 292 + UVD_POWER_STATUS__UVD_POWER_STATUS_TILES_OFF, 293 + UVD_POWER_STATUS__UVD_POWER_STATUS_MASK, ret_code); 294 + 295 + if (!ret_code) { 296 + /* Make sure JPRG Snoop is disabled before sending the pause */ 297 + reg_data2 = RREG32_SOC15(UVD, 0, mmUVD_POWER_STATUS); 298 + reg_data2 |= UVD_POWER_STATUS__JRBC_SNOOP_DIS_MASK; 299 + WREG32_SOC15(UVD, 0, mmUVD_POWER_STATUS, reg_data2); 300 + 301 + /* pause DPG jpeg */ 302 + reg_data |= UVD_DPG_PAUSE__JPEG_PAUSE_DPG_REQ_MASK; 303 + WREG32_SOC15(UVD, 0, mmUVD_DPG_PAUSE, reg_data); 304 + SOC15_WAIT_ON_RREG(UVD, 0, mmUVD_DPG_PAUSE, 305 + UVD_DPG_PAUSE__JPEG_PAUSE_DPG_ACK_MASK, 306 + UVD_DPG_PAUSE__JPEG_PAUSE_DPG_ACK_MASK, ret_code); 307 + 308 + /* Restore */ 309 + ring = &adev->vcn.ring_jpeg; 310 + WREG32_SOC15(UVD, 0, mmUVD_LMI_JRBC_RB_VMID, 0); 311 + WREG32_SOC15(UVD, 0, mmUVD_JRBC_RB_CNTL, 0x00000001L | 0x00000002L); 312 + WREG32_SOC15(UVD, 0, mmUVD_LMI_JRBC_RB_64BIT_BAR_LOW, 313 + lower_32_bits(ring->gpu_addr)); 314 + WREG32_SOC15(UVD, 0, mmUVD_LMI_JRBC_RB_64BIT_BAR_HIGH, 315 + upper_32_bits(ring->gpu_addr)); 316 + WREG32_SOC15(UVD, 0, mmUVD_JRBC_RB_RPTR, ring->wptr); 317 + WREG32_SOC15(UVD, 0, mmUVD_JRBC_RB_WPTR, ring->wptr); 318 + WREG32_SOC15(UVD, 0, mmUVD_JRBC_RB_CNTL, 0x00000002L); 319 + 320 + ring = &adev->vcn.ring_dec; 321 + WREG32_SOC15(UVD, 0, mmUVD_RBC_RB_WPTR, 322 + lower_32_bits(ring->wptr) | 0x80000000); 323 + SOC15_WAIT_ON_RREG(UVD, 0, mmUVD_POWER_STATUS, 324 + UVD_PGFSM_CONFIG__UVDM_UVDU_PWR_ON, 325 + UVD_POWER_STATUS__UVD_POWER_STATUS_MASK, ret_code); 326 + } 327 + } else { 328 + /* unpause dpg jpeg, no need to wait */ 329 + reg_data &= ~UVD_DPG_PAUSE__JPEG_PAUSE_DPG_REQ_MASK; 330 + WREG32_SOC15(UVD, 0, mmUVD_DPG_PAUSE, reg_data); 331 + } 332 + adev->vcn.pause_state.jpeg = new_state->jpeg; 333 + } 334 + 335 + return 0; 336 + } 337 + 216 338 static void amdgpu_vcn_idle_work_handler(struct work_struct *work) 217 339 { 218 340 struct amdgpu_device *adev = 219 341 container_of(work, struct amdgpu_device, vcn.idle_work.work); 220 - unsigned fences = amdgpu_fence_count_emitted(&adev->vcn.ring_dec); 221 - unsigned i; 342 + unsigned int fences = 0; 343 + unsigned int i; 222 344 223 345 for (i = 0; i < adev->vcn.num_enc_rings; ++i) { 224 346 fences += amdgpu_fence_count_emitted(&adev->vcn.ring_enc[i]); 225 347 } 226 348 349 + if (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG) { 350 + struct dpg_pause_state new_state; 351 + 352 + if (fences) 353 + new_state.fw_based = VCN_DPG_STATE__PAUSE; 354 + else 355 + new_state.fw_based = VCN_DPG_STATE__UNPAUSE; 356 + 357 + if (amdgpu_fence_count_emitted(&adev->vcn.ring_jpeg)) 358 + new_state.jpeg = VCN_DPG_STATE__PAUSE; 359 + else 360 + new_state.jpeg = VCN_DPG_STATE__UNPAUSE; 361 + 362 + amdgpu_vcn_pause_dpg_mode(adev, &new_state); 363 + } 364 + 227 365 fences += amdgpu_fence_count_emitted(&adev->vcn.ring_jpeg); 366 + fences += amdgpu_fence_count_emitted(&adev->vcn.ring_dec); 228 367 229 368 if (fences == 0) { 230 369 amdgpu_gfx_off_ctrl(adev, true); ··· 391 250 amdgpu_device_ip_set_powergating_state(adev, AMD_IP_BLOCK_TYPE_VCN, 392 251 AMD_PG_STATE_UNGATE); 393 252 } 253 + 254 + if (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG) { 255 + struct dpg_pause_state new_state; 256 + 257 + if (ring->funcs->type == AMDGPU_RING_TYPE_VCN_ENC) 258 + new_state.fw_based = VCN_DPG_STATE__PAUSE; 259 + else 260 + new_state.fw_based = adev->vcn.pause_state.fw_based; 261 + 262 + if (ring->funcs->type == AMDGPU_RING_TYPE_VCN_JPEG) 263 + new_state.jpeg = VCN_DPG_STATE__PAUSE; 264 + else 265 + new_state.jpeg = adev->vcn.pause_state.jpeg; 266 + 267 + amdgpu_vcn_pause_dpg_mode(adev, &new_state); 268 + } 394 269 } 395 270 396 271 void amdgpu_vcn_ring_end_use(struct amdgpu_ring *ring) ··· 421 264 unsigned i; 422 265 int r; 423 266 424 - WREG32(SOC15_REG_OFFSET(UVD, 0, mmUVD_CONTEXT_ID), 0xCAFEDEAD); 267 + WREG32(SOC15_REG_OFFSET(UVD, 0, mmUVD_SCRATCH9), 0xCAFEDEAD); 425 268 r = amdgpu_ring_alloc(ring, 3); 426 269 if (r) { 427 270 DRM_ERROR("amdgpu: cp failed to lock ring %d (%d).\n", ··· 429 272 return r; 430 273 } 431 274 amdgpu_ring_write(ring, 432 - PACKET0(SOC15_REG_OFFSET(UVD, 0, mmUVD_CONTEXT_ID), 0)); 275 + PACKET0(SOC15_REG_OFFSET(UVD, 0, mmUVD_SCRATCH9), 0)); 433 276 amdgpu_ring_write(ring, 0xDEADBEEF); 434 277 amdgpu_ring_commit(ring); 435 278 for (i = 0; i < adev->usec_timeout; i++) { 436 - tmp = RREG32(SOC15_REG_OFFSET(UVD, 0, mmUVD_CONTEXT_ID)); 279 + tmp = RREG32(SOC15_REG_OFFSET(UVD, 0, mmUVD_SCRATCH9)); 437 280 if (tmp == 0xDEADBEEF) 438 281 break; 439 282 DRM_UDELAY(1); ··· 773 616 unsigned i; 774 617 int r; 775 618 776 - WREG32(SOC15_REG_OFFSET(UVD, 0, mmUVD_CONTEXT_ID), 0xCAFEDEAD); 619 + WREG32(SOC15_REG_OFFSET(UVD, 0, mmUVD_SCRATCH9), 0xCAFEDEAD); 777 620 r = amdgpu_ring_alloc(ring, 3); 778 621 779 622 if (r) { ··· 783 626 } 784 627 785 628 amdgpu_ring_write(ring, 786 - PACKETJ(SOC15_REG_OFFSET(UVD, 0, mmUVD_CONTEXT_ID), 0, 0, 0)); 629 + PACKETJ(SOC15_REG_OFFSET(UVD, 0, mmUVD_SCRATCH9), 0, 0, 0)); 787 630 amdgpu_ring_write(ring, 0xDEADBEEF); 788 631 amdgpu_ring_commit(ring); 789 632 790 633 for (i = 0; i < adev->usec_timeout; i++) { 791 - tmp = RREG32(SOC15_REG_OFFSET(UVD, 0, mmUVD_CONTEXT_ID)); 634 + tmp = RREG32(SOC15_REG_OFFSET(UVD, 0, mmUVD_SCRATCH9)); 792 635 if (tmp == 0xDEADBEEF) 793 636 break; 794 637 DRM_UDELAY(1); ··· 822 665 823 666 ib = &job->ibs[0]; 824 667 825 - ib->ptr[0] = PACKETJ(SOC15_REG_OFFSET(UVD, 0, mmUVD_JPEG_PITCH), 0, 0, PACKETJ_TYPE0); 668 + ib->ptr[0] = PACKETJ(SOC15_REG_OFFSET(UVD, 0, mmUVD_SCRATCH9), 0, 0, PACKETJ_TYPE0); 826 669 ib->ptr[1] = 0xDEADBEEF; 827 670 for (i = 2; i < 16; i += 2) { 828 671 ib->ptr[i] = PACKETJ(0, 0, 0, PACKETJ_TYPE6); ··· 871 714 r = 0; 872 715 873 716 for (i = 0; i < adev->usec_timeout; i++) { 874 - tmp = RREG32(SOC15_REG_OFFSET(UVD, 0, mmUVD_JPEG_PITCH)); 717 + tmp = RREG32(SOC15_REG_OFFSET(UVD, 0, mmUVD_SCRATCH9)); 875 718 if (tmp == 0xDEADBEEF) 876 719 break; 877 720 DRM_UDELAY(1);
+12
drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h
··· 56 56 UVD_STATUS__RBC_BUSY = 0x1, 57 57 }; 58 58 59 + enum internal_dpg_state { 60 + VCN_DPG_STATE__UNPAUSE = 0, 61 + VCN_DPG_STATE__PAUSE, 62 + }; 63 + 64 + struct dpg_pause_state { 65 + enum internal_dpg_state fw_based; 66 + enum internal_dpg_state jpeg; 67 + }; 68 + 59 69 struct amdgpu_vcn { 60 70 struct amdgpu_bo *vcpu_bo; 61 71 void *cpu_addr; ··· 79 69 struct amdgpu_ring ring_jpeg; 80 70 struct amdgpu_irq_src irq; 81 71 unsigned num_enc_rings; 72 + enum amd_powergating_state cur_state; 73 + struct dpg_pause_state pause_state; 82 74 }; 83 75 84 76 int amdgpu_vcn_sw_init(struct amdgpu_device *adev);
+2 -2
drivers/gpu/drm/amd/amdgpu/ci_dpm.c
··· 6277 6277 int ret; 6278 6278 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 6279 6279 6280 - ret = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, 230, 6280 + ret = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, 230, 6281 6281 &adev->pm.dpm.thermal.irq); 6282 6282 if (ret) 6283 6283 return ret; 6284 6284 6285 - ret = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, 231, 6285 + ret = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, 231, 6286 6286 &adev->pm.dpm.thermal.irq); 6287 6287 if (ret) 6288 6288 return ret;
+4 -5
drivers/gpu/drm/amd/amdgpu/cik_ih.c
··· 276 276 dw[2] = le32_to_cpu(adev->irq.ih.ring[ring_index + 2]); 277 277 dw[3] = le32_to_cpu(adev->irq.ih.ring[ring_index + 3]); 278 278 279 - entry->client_id = AMDGPU_IH_CLIENTID_LEGACY; 279 + entry->client_id = AMDGPU_IRQ_CLIENTID_LEGACY; 280 280 entry->src_id = dw[0] & 0xff; 281 281 entry->src_data[0] = dw[1] & 0xfffffff; 282 282 entry->ring_id = dw[2] & 0xff; ··· 318 318 int r; 319 319 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 320 320 321 - r = amdgpu_ih_ring_init(adev, 64 * 1024, false); 321 + r = amdgpu_ih_ring_init(adev, &adev->irq.ih, 64 * 1024, false); 322 322 if (r) 323 323 return r; 324 324 ··· 332 332 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 333 333 334 334 amdgpu_irq_fini(adev); 335 - amdgpu_ih_ring_fini(adev); 335 + amdgpu_ih_ring_fini(adev, &adev->irq.ih); 336 336 amdgpu_irq_remove_domain(adev); 337 337 338 338 return 0; ··· 468 468 469 469 static void cik_ih_set_interrupt_funcs(struct amdgpu_device *adev) 470 470 { 471 - if (adev->irq.ih_funcs == NULL) 472 - adev->irq.ih_funcs = &cik_ih_funcs; 471 + adev->irq.ih_funcs = &cik_ih_funcs; 473 472 } 474 473 475 474 const struct amdgpu_ip_block_version cik_ih_ip_block =
+11 -15
drivers/gpu/drm/amd/amdgpu/cik_sdma.c
··· 970 970 } 971 971 972 972 /* SDMA trap event */ 973 - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, 224, 973 + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, 224, 974 974 &adev->sdma.trap_irq); 975 975 if (r) 976 976 return r; 977 977 978 978 /* SDMA Privileged inst */ 979 - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, 241, 979 + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, 241, 980 980 &adev->sdma.illegal_inst_irq); 981 981 if (r) 982 982 return r; 983 983 984 984 /* SDMA Privileged inst */ 985 - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, 247, 985 + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, 247, 986 986 &adev->sdma.illegal_inst_irq); 987 987 if (r) 988 988 return r; ··· 1370 1370 1371 1371 static void cik_sdma_set_buffer_funcs(struct amdgpu_device *adev) 1372 1372 { 1373 - if (adev->mman.buffer_funcs == NULL) { 1374 - adev->mman.buffer_funcs = &cik_sdma_buffer_funcs; 1375 - adev->mman.buffer_funcs_ring = &adev->sdma.instance[0].ring; 1376 - } 1373 + adev->mman.buffer_funcs = &cik_sdma_buffer_funcs; 1374 + adev->mman.buffer_funcs_ring = &adev->sdma.instance[0].ring; 1377 1375 } 1378 1376 1379 1377 static const struct amdgpu_vm_pte_funcs cik_sdma_vm_pte_funcs = { ··· 1387 1389 struct drm_gpu_scheduler *sched; 1388 1390 unsigned i; 1389 1391 1390 - if (adev->vm_manager.vm_pte_funcs == NULL) { 1391 - adev->vm_manager.vm_pte_funcs = &cik_sdma_vm_pte_funcs; 1392 - for (i = 0; i < adev->sdma.num_instances; i++) { 1393 - sched = &adev->sdma.instance[i].ring.sched; 1394 - adev->vm_manager.vm_pte_rqs[i] = 1395 - &sched->sched_rq[DRM_SCHED_PRIORITY_KERNEL]; 1396 - } 1397 - adev->vm_manager.vm_pte_num_rqs = adev->sdma.num_instances; 1392 + adev->vm_manager.vm_pte_funcs = &cik_sdma_vm_pte_funcs; 1393 + for (i = 0; i < adev->sdma.num_instances; i++) { 1394 + sched = &adev->sdma.instance[i].ring.sched; 1395 + adev->vm_manager.vm_pte_rqs[i] = 1396 + &sched->sched_rq[DRM_SCHED_PRIORITY_KERNEL]; 1398 1397 } 1398 + adev->vm_manager.vm_pte_num_rqs = adev->sdma.num_instances; 1399 1399 } 1400 1400 1401 1401 const struct amdgpu_ip_block_version cik_sdma_ip_block =
+4 -5
drivers/gpu/drm/amd/amdgpu/cz_ih.c
··· 255 255 dw[2] = le32_to_cpu(adev->irq.ih.ring[ring_index + 2]); 256 256 dw[3] = le32_to_cpu(adev->irq.ih.ring[ring_index + 3]); 257 257 258 - entry->client_id = AMDGPU_IH_CLIENTID_LEGACY; 258 + entry->client_id = AMDGPU_IRQ_CLIENTID_LEGACY; 259 259 entry->src_id = dw[0] & 0xff; 260 260 entry->src_data[0] = dw[1] & 0xfffffff; 261 261 entry->ring_id = dw[2] & 0xff; ··· 297 297 int r; 298 298 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 299 299 300 - r = amdgpu_ih_ring_init(adev, 64 * 1024, false); 300 + r = amdgpu_ih_ring_init(adev, &adev->irq.ih, 64 * 1024, false); 301 301 if (r) 302 302 return r; 303 303 ··· 311 311 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 312 312 313 313 amdgpu_irq_fini(adev); 314 - amdgpu_ih_ring_fini(adev); 314 + amdgpu_ih_ring_fini(adev, &adev->irq.ih); 315 315 amdgpu_irq_remove_domain(adev); 316 316 317 317 return 0; ··· 449 449 450 450 static void cz_ih_set_interrupt_funcs(struct amdgpu_device *adev) 451 451 { 452 - if (adev->irq.ih_funcs == NULL) 453 - adev->irq.ih_funcs = &cz_ih_funcs; 452 + adev->irq.ih_funcs = &cz_ih_funcs; 454 453 } 455 454 456 455 const struct amdgpu_ip_block_version cz_ih_ip_block =
+4 -5
drivers/gpu/drm/amd/amdgpu/dce_v10_0.c
··· 2746 2746 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 2747 2747 2748 2748 for (i = 0; i < adev->mode_info.num_crtc; i++) { 2749 - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, i + 1, &adev->crtc_irq); 2749 + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, i + 1, &adev->crtc_irq); 2750 2750 if (r) 2751 2751 return r; 2752 2752 } 2753 2753 2754 2754 for (i = VISLANDS30_IV_SRCID_D1_GRPH_PFLIP; i < 20; i += 2) { 2755 - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, i, &adev->pageflip_irq); 2755 + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, i, &adev->pageflip_irq); 2756 2756 if (r) 2757 2757 return r; 2758 2758 } 2759 2759 2760 2760 /* HPD hotplug */ 2761 - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_HOTPLUG_DETECT_A, &adev->hpd_irq); 2761 + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_HOTPLUG_DETECT_A, &adev->hpd_irq); 2762 2762 if (r) 2763 2763 return r; 2764 2764 ··· 3570 3570 3571 3571 static void dce_v10_0_set_display_funcs(struct amdgpu_device *adev) 3572 3572 { 3573 - if (adev->mode_info.funcs == NULL) 3574 - adev->mode_info.funcs = &dce_v10_0_display_funcs; 3573 + adev->mode_info.funcs = &dce_v10_0_display_funcs; 3575 3574 } 3576 3575 3577 3576 static const struct amdgpu_irq_src_funcs dce_v10_0_crtc_irq_funcs = {
+4 -5
drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
··· 2867 2867 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 2868 2868 2869 2869 for (i = 0; i < adev->mode_info.num_crtc; i++) { 2870 - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, i + 1, &adev->crtc_irq); 2870 + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, i + 1, &adev->crtc_irq); 2871 2871 if (r) 2872 2872 return r; 2873 2873 } 2874 2874 2875 2875 for (i = VISLANDS30_IV_SRCID_D1_GRPH_PFLIP; i < 20; i += 2) { 2876 - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, i, &adev->pageflip_irq); 2876 + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, i, &adev->pageflip_irq); 2877 2877 if (r) 2878 2878 return r; 2879 2879 } 2880 2880 2881 2881 /* HPD hotplug */ 2882 - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_HOTPLUG_DETECT_A, &adev->hpd_irq); 2882 + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_HOTPLUG_DETECT_A, &adev->hpd_irq); 2883 2883 if (r) 2884 2884 return r; 2885 2885 ··· 3702 3702 3703 3703 static void dce_v11_0_set_display_funcs(struct amdgpu_device *adev) 3704 3704 { 3705 - if (adev->mode_info.funcs == NULL) 3706 - adev->mode_info.funcs = &dce_v11_0_display_funcs; 3705 + adev->mode_info.funcs = &dce_v11_0_display_funcs; 3707 3706 } 3708 3707 3709 3708 static const struct amdgpu_irq_src_funcs dce_v11_0_crtc_irq_funcs = {
+4 -5
drivers/gpu/drm/amd/amdgpu/dce_v6_0.c
··· 2616 2616 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 2617 2617 2618 2618 for (i = 0; i < adev->mode_info.num_crtc; i++) { 2619 - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, i + 1, &adev->crtc_irq); 2619 + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, i + 1, &adev->crtc_irq); 2620 2620 if (r) 2621 2621 return r; 2622 2622 } 2623 2623 2624 2624 for (i = 8; i < 20; i += 2) { 2625 - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, i, &adev->pageflip_irq); 2625 + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, i, &adev->pageflip_irq); 2626 2626 if (r) 2627 2627 return r; 2628 2628 } 2629 2629 2630 2630 /* HPD hotplug */ 2631 - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, 42, &adev->hpd_irq); 2631 + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, 42, &adev->hpd_irq); 2632 2632 if (r) 2633 2633 return r; 2634 2634 ··· 3376 3376 3377 3377 static void dce_v6_0_set_display_funcs(struct amdgpu_device *adev) 3378 3378 { 3379 - if (adev->mode_info.funcs == NULL) 3380 - adev->mode_info.funcs = &dce_v6_0_display_funcs; 3379 + adev->mode_info.funcs = &dce_v6_0_display_funcs; 3381 3380 } 3382 3381 3383 3382 static const struct amdgpu_irq_src_funcs dce_v6_0_crtc_irq_funcs = {
+4 -5
drivers/gpu/drm/amd/amdgpu/dce_v8_0.c
··· 2643 2643 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 2644 2644 2645 2645 for (i = 0; i < adev->mode_info.num_crtc; i++) { 2646 - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, i + 1, &adev->crtc_irq); 2646 + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, i + 1, &adev->crtc_irq); 2647 2647 if (r) 2648 2648 return r; 2649 2649 } 2650 2650 2651 2651 for (i = 8; i < 20; i += 2) { 2652 - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, i, &adev->pageflip_irq); 2652 + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, i, &adev->pageflip_irq); 2653 2653 if (r) 2654 2654 return r; 2655 2655 } 2656 2656 2657 2657 /* HPD hotplug */ 2658 - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, 42, &adev->hpd_irq); 2658 + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, 42, &adev->hpd_irq); 2659 2659 if (r) 2660 2660 return r; 2661 2661 ··· 3458 3458 3459 3459 static void dce_v8_0_set_display_funcs(struct amdgpu_device *adev) 3460 3460 { 3461 - if (adev->mode_info.funcs == NULL) 3462 - adev->mode_info.funcs = &dce_v8_0_display_funcs; 3461 + adev->mode_info.funcs = &dce_v8_0_display_funcs; 3463 3462 } 3464 3463 3465 3464 static const struct amdgpu_irq_src_funcs dce_v8_0_crtc_irq_funcs = {
+2 -3
drivers/gpu/drm/amd/amdgpu/dce_virtual.c
··· 372 372 int r, i; 373 373 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 374 374 375 - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_SMU_DISP_TIMER2_TRIGGER, &adev->crtc_irq); 375 + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_SMU_DISP_TIMER2_TRIGGER, &adev->crtc_irq); 376 376 if (r) 377 377 return r; 378 378 ··· 649 649 650 650 static void dce_virtual_set_display_funcs(struct amdgpu_device *adev) 651 651 { 652 - if (adev->mode_info.funcs == NULL) 653 - adev->mode_info.funcs = &dce_virtual_display_funcs; 652 + adev->mode_info.funcs = &dce_virtual_display_funcs; 654 653 } 655 654 656 655 static int dce_virtual_pageflip(struct amdgpu_device *adev,
+5 -5
drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
··· 1552 1552 adev->gfx.config.double_offchip_lds_buf = 0; 1553 1553 } 1554 1554 1555 - static void gfx_v6_0_gpu_init(struct amdgpu_device *adev) 1555 + static void gfx_v6_0_constants_init(struct amdgpu_device *adev) 1556 1556 { 1557 1557 u32 gb_addr_config = 0; 1558 1558 u32 mc_shared_chmap, mc_arb_ramcfg; ··· 3094 3094 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 3095 3095 int i, r; 3096 3096 3097 - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, 181, &adev->gfx.eop_irq); 3097 + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, 181, &adev->gfx.eop_irq); 3098 3098 if (r) 3099 3099 return r; 3100 3100 3101 - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, 184, &adev->gfx.priv_reg_irq); 3101 + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, 184, &adev->gfx.priv_reg_irq); 3102 3102 if (r) 3103 3103 return r; 3104 3104 3105 - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, 185, &adev->gfx.priv_inst_irq); 3105 + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, 185, &adev->gfx.priv_inst_irq); 3106 3106 if (r) 3107 3107 return r; 3108 3108 ··· 3175 3175 int r; 3176 3176 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 3177 3177 3178 - gfx_v6_0_gpu_init(adev); 3178 + gfx_v6_0_constants_init(adev); 3179 3179 3180 3180 r = gfx_v6_0_rlc_resume(adev); 3181 3181 if (r)
+8 -8
drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
··· 1886 1886 } 1887 1887 1888 1888 /** 1889 - * gfx_v7_0_gpu_init - setup the 3D engine 1889 + * gfx_v7_0_constants_init - setup the 3D engine 1890 1890 * 1891 1891 * @adev: amdgpu_device pointer 1892 1892 * 1893 - * Configures the 3D engine and tiling configuration 1894 - * registers so that the 3D engine is usable. 1893 + * init the gfx constants such as the 3D engine, tiling configuration 1894 + * registers, maximum number of quad pipes, render backends... 1895 1895 */ 1896 - static void gfx_v7_0_gpu_init(struct amdgpu_device *adev) 1896 + static void gfx_v7_0_constants_init(struct amdgpu_device *adev) 1897 1897 { 1898 1898 u32 sh_mem_cfg, sh_static_mem_cfg, sh_mem_base; 1899 1899 u32 tmp; ··· 4516 4516 adev->gfx.mec.num_queue_per_pipe = 8; 4517 4517 4518 4518 /* EOP Event */ 4519 - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, 181, &adev->gfx.eop_irq); 4519 + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, 181, &adev->gfx.eop_irq); 4520 4520 if (r) 4521 4521 return r; 4522 4522 4523 4523 /* Privileged reg */ 4524 - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, 184, 4524 + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, 184, 4525 4525 &adev->gfx.priv_reg_irq); 4526 4526 if (r) 4527 4527 return r; 4528 4528 4529 4529 /* Privileged inst */ 4530 - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, 185, 4530 + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, 185, 4531 4531 &adev->gfx.priv_inst_irq); 4532 4532 if (r) 4533 4533 return r; ··· 4624 4624 int r; 4625 4625 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 4626 4626 4627 - gfx_v7_0_gpu_init(adev); 4627 + gfx_v7_0_constants_init(adev); 4628 4628 4629 4629 /* init rlc */ 4630 4630 r = gfx_v7_0_rlc_resume(adev);
+67 -55
drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
··· 2049 2049 adev->gfx.mec.num_queue_per_pipe = 8; 2050 2050 2051 2051 /* KIQ event */ 2052 - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_CP_INT_IB2, &adev->gfx.kiq.irq); 2052 + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_CP_INT_IB2, &adev->gfx.kiq.irq); 2053 2053 if (r) 2054 2054 return r; 2055 2055 2056 2056 /* EOP Event */ 2057 - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_CP_END_OF_PIPE, &adev->gfx.eop_irq); 2057 + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_CP_END_OF_PIPE, &adev->gfx.eop_irq); 2058 2058 if (r) 2059 2059 return r; 2060 2060 2061 2061 /* Privileged reg */ 2062 - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_CP_PRIV_REG_FAULT, 2062 + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_CP_PRIV_REG_FAULT, 2063 2063 &adev->gfx.priv_reg_irq); 2064 2064 if (r) 2065 2065 return r; 2066 2066 2067 2067 /* Privileged inst */ 2068 - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_CP_PRIV_INSTR_FAULT, 2068 + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_CP_PRIV_INSTR_FAULT, 2069 2069 &adev->gfx.priv_inst_irq); 2070 2070 if (r) 2071 2071 return r; 2072 2072 2073 2073 /* Add CP EDC/ECC irq */ 2074 - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_CP_ECC_ERROR, 2074 + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_CP_ECC_ERROR, 2075 2075 &adev->gfx.cp_ecc_error_irq); 2076 2076 if (r) 2077 2077 return r; 2078 2078 2079 2079 /* SQ interrupts. */ 2080 - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_SQ_INTERRUPT_MSG, 2080 + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_SQ_INTERRUPT_MSG, 2081 2081 &adev->gfx.sq_irq); 2082 2082 if (r) { 2083 2083 DRM_ERROR("amdgpu_irq_add() for SQ failed: %d\n", r); ··· 3835 3835 } 3836 3836 } 3837 3837 3838 - static void gfx_v8_0_gpu_init(struct amdgpu_device *adev) 3838 + static void gfx_v8_0_constants_init(struct amdgpu_device *adev) 3839 3839 { 3840 3840 u32 tmp, sh_static_mem_cfg; 3841 3841 int i; ··· 4208 4208 static int gfx_v8_0_rlc_resume(struct amdgpu_device *adev) 4209 4209 { 4210 4210 int r; 4211 - u32 tmp; 4212 4211 4213 4212 gfx_v8_0_rlc_stop(adev); 4214 - 4215 - /* disable CG */ 4216 - tmp = RREG32(mmRLC_CGCG_CGLS_CTRL); 4217 - tmp &= ~(RLC_CGCG_CGLS_CTRL__CGCG_EN_MASK | 4218 - RLC_CGCG_CGLS_CTRL__CGLS_EN_MASK); 4219 - WREG32(mmRLC_CGCG_CGLS_CTRL, tmp); 4220 - if (adev->asic_type == CHIP_POLARIS11 || 4221 - adev->asic_type == CHIP_POLARIS10 || 4222 - adev->asic_type == CHIP_POLARIS12 || 4223 - adev->asic_type == CHIP_VEGAM) { 4224 - tmp = RREG32(mmRLC_CGCG_CGLS_CTRL_3D); 4225 - tmp &= ~0x3; 4226 - WREG32(mmRLC_CGCG_CGLS_CTRL_3D, tmp); 4227 - } 4228 - 4229 - /* disable PG */ 4230 - WREG32(mmRLC_PG_CNTL, 0); 4231 - 4232 4213 gfx_v8_0_rlc_reset(adev); 4233 4214 gfx_v8_0_init_pg(adev); 4234 - 4235 4215 4236 4216 if (adev->firmware.load_type == AMDGPU_FW_LOAD_DIRECT) { 4237 4217 /* legacy rlc firmware loading */ ··· 5019 5039 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 5020 5040 5021 5041 gfx_v8_0_init_golden_registers(adev); 5022 - gfx_v8_0_gpu_init(adev); 5042 + gfx_v8_0_constants_init(adev); 5023 5043 5024 5044 r = gfx_v8_0_rlc_resume(adev); 5025 5045 if (r) ··· 5060 5080 return r; 5061 5081 } 5062 5082 5083 + static bool gfx_v8_0_is_idle(void *handle) 5084 + { 5085 + struct amdgpu_device *adev = (struct amdgpu_device *)handle; 5086 + 5087 + if (REG_GET_FIELD(RREG32(mmGRBM_STATUS), GRBM_STATUS, GUI_ACTIVE) 5088 + || RREG32(mmGRBM_STATUS2) != 0x8) 5089 + return false; 5090 + else 5091 + return true; 5092 + } 5093 + 5094 + static bool gfx_v8_0_rlc_is_idle(void *handle) 5095 + { 5096 + struct amdgpu_device *adev = (struct amdgpu_device *)handle; 5097 + 5098 + if (RREG32(mmGRBM_STATUS2) != 0x8) 5099 + return false; 5100 + else 5101 + return true; 5102 + } 5103 + 5104 + static int gfx_v8_0_wait_for_rlc_idle(void *handle) 5105 + { 5106 + unsigned int i; 5107 + struct amdgpu_device *adev = (struct amdgpu_device *)handle; 5108 + 5109 + for (i = 0; i < adev->usec_timeout; i++) { 5110 + if (gfx_v8_0_rlc_is_idle(handle)) 5111 + return 0; 5112 + 5113 + udelay(1); 5114 + } 5115 + return -ETIMEDOUT; 5116 + } 5117 + 5118 + static int gfx_v8_0_wait_for_idle(void *handle) 5119 + { 5120 + unsigned int i; 5121 + struct amdgpu_device *adev = (struct amdgpu_device *)handle; 5122 + 5123 + for (i = 0; i < adev->usec_timeout; i++) { 5124 + if (gfx_v8_0_is_idle(handle)) 5125 + return 0; 5126 + 5127 + udelay(1); 5128 + } 5129 + return -ETIMEDOUT; 5130 + } 5131 + 5063 5132 static int gfx_v8_0_hw_fini(void *handle) 5064 5133 { 5065 5134 struct amdgpu_device *adev = (struct amdgpu_device *)handle; ··· 5127 5098 pr_debug("For SRIOV client, shouldn't do anything.\n"); 5128 5099 return 0; 5129 5100 } 5130 - gfx_v8_0_cp_enable(adev, false); 5131 - gfx_v8_0_rlc_stop(adev); 5132 - 5101 + adev->gfx.rlc.funcs->enter_safe_mode(adev); 5102 + if (!gfx_v8_0_wait_for_idle(adev)) 5103 + gfx_v8_0_cp_enable(adev, false); 5104 + else 5105 + pr_err("cp is busy, skip halt cp\n"); 5106 + if (!gfx_v8_0_wait_for_rlc_idle(adev)) 5107 + gfx_v8_0_rlc_stop(adev); 5108 + else 5109 + pr_err("rlc is busy, skip halt rlc\n"); 5110 + adev->gfx.rlc.funcs->exit_safe_mode(adev); 5133 5111 return 0; 5134 5112 } 5135 5113 ··· 5155 5119 r = gfx_v8_0_hw_init(adev); 5156 5120 adev->gfx.in_suspend = false; 5157 5121 return r; 5158 - } 5159 - 5160 - static bool gfx_v8_0_is_idle(void *handle) 5161 - { 5162 - struct amdgpu_device *adev = (struct amdgpu_device *)handle; 5163 - 5164 - if (REG_GET_FIELD(RREG32(mmGRBM_STATUS), GRBM_STATUS, GUI_ACTIVE)) 5165 - return false; 5166 - else 5167 - return true; 5168 - } 5169 - 5170 - static int gfx_v8_0_wait_for_idle(void *handle) 5171 - { 5172 - unsigned i; 5173 - struct amdgpu_device *adev = (struct amdgpu_device *)handle; 5174 - 5175 - for (i = 0; i < adev->usec_timeout; i++) { 5176 - if (gfx_v8_0_is_idle(handle)) 5177 - return 0; 5178 - 5179 - udelay(1); 5180 - } 5181 - return -ETIMEDOUT; 5182 5122 } 5183 5123 5184 5124 static bool gfx_v8_0_check_soft_reset(void *handle)
+2 -2
drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
··· 1847 1847 mutex_unlock(&adev->srbm_mutex); 1848 1848 } 1849 1849 1850 - static void gfx_v9_0_gpu_init(struct amdgpu_device *adev) 1850 + static void gfx_v9_0_constants_init(struct amdgpu_device *adev) 1851 1851 { 1852 1852 u32 tmp; 1853 1853 int i; ··· 3235 3235 3236 3236 gfx_v9_0_init_golden_registers(adev); 3237 3237 3238 - gfx_v9_0_gpu_init(adev); 3238 + gfx_v9_0_constants_init(adev); 3239 3239 3240 3240 r = gfx_v9_0_csb_vram_pin(adev); 3241 3241 if (r)
+2 -1
drivers/gpu/drm/amd/amdgpu/gfxhub_v1_0.c
··· 82 82 * to get rid of the VM fault and hardware hang. 83 83 */ 84 84 WREG32_SOC15(GC, 0, mmMC_VM_SYSTEM_APERTURE_HIGH_ADDR, 85 - (max(adev->gmc.vram_end, adev->gmc.agp_end) >> 18) + 0x1); 85 + max((adev->gmc.vram_end >> 18) + 0x1, 86 + adev->gmc.agp_end >> 18)); 86 87 else 87 88 WREG32_SOC15(GC, 0, mmMC_VM_SYSTEM_APERTURE_HIGH_ADDR, 88 89 max(adev->gmc.vram_end, adev->gmc.agp_end) >> 18);
+3 -4
drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
··· 859 859 adev->gmc.vram_type = gmc_v6_0_convert_vram_type(tmp); 860 860 } 861 861 862 - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, 146, &adev->gmc.vm_fault); 862 + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, 146, &adev->gmc.vm_fault); 863 863 if (r) 864 864 return r; 865 865 866 - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, 147, &adev->gmc.vm_fault); 866 + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, 147, &adev->gmc.vm_fault); 867 867 if (r) 868 868 return r; 869 869 ··· 1180 1180 1181 1181 static void gmc_v6_0_set_gmc_funcs(struct amdgpu_device *adev) 1182 1182 { 1183 - if (adev->gmc.gmc_funcs == NULL) 1184 - adev->gmc.gmc_funcs = &gmc_v6_0_gmc_funcs; 1183 + adev->gmc.gmc_funcs = &gmc_v6_0_gmc_funcs; 1185 1184 } 1186 1185 1187 1186 static void gmc_v6_0_set_irq_funcs(struct amdgpu_device *adev)
+3 -4
drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
··· 991 991 adev->gmc.vram_type = gmc_v7_0_convert_vram_type(tmp); 992 992 } 993 993 994 - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_GFX_PAGE_INV_FAULT, &adev->gmc.vm_fault); 994 + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_GFX_PAGE_INV_FAULT, &adev->gmc.vm_fault); 995 995 if (r) 996 996 return r; 997 997 998 - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_GFX_MEM_PROT_FAULT, &adev->gmc.vm_fault); 998 + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_GFX_MEM_PROT_FAULT, &adev->gmc.vm_fault); 999 999 if (r) 1000 1000 return r; 1001 1001 ··· 1388 1388 1389 1389 static void gmc_v7_0_set_gmc_funcs(struct amdgpu_device *adev) 1390 1390 { 1391 - if (adev->gmc.gmc_funcs == NULL) 1392 - adev->gmc.gmc_funcs = &gmc_v7_0_gmc_funcs; 1391 + adev->gmc.gmc_funcs = &gmc_v7_0_gmc_funcs; 1393 1392 } 1394 1393 1395 1394 static void gmc_v7_0_set_irq_funcs(struct amdgpu_device *adev)
+3 -4
drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
··· 1095 1095 adev->gmc.vram_type = gmc_v8_0_convert_vram_type(tmp); 1096 1096 } 1097 1097 1098 - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_GFX_PAGE_INV_FAULT, &adev->gmc.vm_fault); 1098 + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_GFX_PAGE_INV_FAULT, &adev->gmc.vm_fault); 1099 1099 if (r) 1100 1100 return r; 1101 1101 1102 - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_GFX_MEM_PROT_FAULT, &adev->gmc.vm_fault); 1102 + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_GFX_MEM_PROT_FAULT, &adev->gmc.vm_fault); 1103 1103 if (r) 1104 1104 return r; 1105 1105 ··· 1733 1733 1734 1734 static void gmc_v8_0_set_gmc_funcs(struct amdgpu_device *adev) 1735 1735 { 1736 - if (adev->gmc.gmc_funcs == NULL) 1737 - adev->gmc.gmc_funcs = &gmc_v8_0_gmc_funcs; 1736 + adev->gmc.gmc_funcs = &gmc_v8_0_gmc_funcs; 1738 1737 } 1739 1738 1740 1739 static void gmc_v8_0_set_irq_funcs(struct amdgpu_device *adev)
+1 -2
drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
··· 593 593 594 594 static void gmc_v9_0_set_gmc_funcs(struct amdgpu_device *adev) 595 595 { 596 - if (adev->gmc.gmc_funcs == NULL) 597 - adev->gmc.gmc_funcs = &gmc_v9_0_gmc_funcs; 596 + adev->gmc.gmc_funcs = &gmc_v9_0_gmc_funcs; 598 597 } 599 598 600 599 static int gmc_v9_0_early_init(void *handle)
+4 -5
drivers/gpu/drm/amd/amdgpu/iceland_ih.c
··· 255 255 dw[2] = le32_to_cpu(adev->irq.ih.ring[ring_index + 2]); 256 256 dw[3] = le32_to_cpu(adev->irq.ih.ring[ring_index + 3]); 257 257 258 - entry->client_id = AMDGPU_IH_CLIENTID_LEGACY; 258 + entry->client_id = AMDGPU_IRQ_CLIENTID_LEGACY; 259 259 entry->src_id = dw[0] & 0xff; 260 260 entry->src_data[0] = dw[1] & 0xfffffff; 261 261 entry->ring_id = dw[2] & 0xff; ··· 297 297 int r; 298 298 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 299 299 300 - r = amdgpu_ih_ring_init(adev, 64 * 1024, false); 300 + r = amdgpu_ih_ring_init(adev, &adev->irq.ih, 64 * 1024, false); 301 301 if (r) 302 302 return r; 303 303 ··· 311 311 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 312 312 313 313 amdgpu_irq_fini(adev); 314 - amdgpu_ih_ring_fini(adev); 314 + amdgpu_ih_ring_fini(adev, &adev->irq.ih); 315 315 amdgpu_irq_remove_domain(adev); 316 316 317 317 return 0; ··· 447 447 448 448 static void iceland_ih_set_interrupt_funcs(struct amdgpu_device *adev) 449 449 { 450 - if (adev->irq.ih_funcs == NULL) 451 - adev->irq.ih_funcs = &iceland_ih_funcs; 450 + adev->irq.ih_funcs = &iceland_ih_funcs; 452 451 } 453 452 454 453 const struct amdgpu_ip_block_version iceland_ih_ip_block =
+2 -2
drivers/gpu/drm/amd/amdgpu/kv_dpm.c
··· 2995 2995 int ret; 2996 2996 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 2997 2997 2998 - ret = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, 230, 2998 + ret = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, 230, 2999 2999 &adev->pm.dpm.thermal.irq); 3000 3000 if (ret) 3001 3001 return ret; 3002 3002 3003 - ret = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, 231, 3003 + ret = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, 231, 3004 3004 &adev->pm.dpm.thermal.irq); 3005 3005 if (ret) 3006 3006 return ret;
+2 -1
drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c
··· 100 100 * to get rid of the VM fault and hardware hang. 101 101 */ 102 102 WREG32_SOC15(MMHUB, 0, mmMC_VM_SYSTEM_APERTURE_HIGH_ADDR, 103 - (max(adev->gmc.vram_end, adev->gmc.agp_end) >> 18) + 0x1); 103 + max((adev->gmc.vram_end >> 18) + 0x1, 104 + adev->gmc.agp_end >> 18)); 104 105 else 105 106 WREG32_SOC15(MMHUB, 0, mmMC_VM_SYSTEM_APERTURE_HIGH_ADDR, 106 107 max(adev->gmc.vram_end, adev->gmc.agp_end) >> 18);
+2 -2
drivers/gpu/drm/amd/amdgpu/mxgpu_vi.c
··· 580 580 { 581 581 int r; 582 582 583 - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, 135, &adev->virt.rcv_irq); 583 + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, 135, &adev->virt.rcv_irq); 584 584 if (r) 585 585 return r; 586 586 587 - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, 138, &adev->virt.ack_irq); 587 + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, 138, &adev->virt.ack_irq); 588 588 if (r) { 589 589 amdgpu_irq_put(adev, &adev->virt.rcv_irq, 0); 590 590 return r;
+11 -15
drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
··· 898 898 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 899 899 900 900 /* SDMA trap event */ 901 - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_SDMA_TRAP, 901 + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_SDMA_TRAP, 902 902 &adev->sdma.trap_irq); 903 903 if (r) 904 904 return r; 905 905 906 906 /* SDMA Privileged inst */ 907 - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, 241, 907 + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, 241, 908 908 &adev->sdma.illegal_inst_irq); 909 909 if (r) 910 910 return r; 911 911 912 912 /* SDMA Privileged inst */ 913 - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_SDMA_SRBM_WRITE, 913 + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_SDMA_SRBM_WRITE, 914 914 &adev->sdma.illegal_inst_irq); 915 915 if (r) 916 916 return r; ··· 1296 1296 1297 1297 static void sdma_v2_4_set_buffer_funcs(struct amdgpu_device *adev) 1298 1298 { 1299 - if (adev->mman.buffer_funcs == NULL) { 1300 - adev->mman.buffer_funcs = &sdma_v2_4_buffer_funcs; 1301 - adev->mman.buffer_funcs_ring = &adev->sdma.instance[0].ring; 1302 - } 1299 + adev->mman.buffer_funcs = &sdma_v2_4_buffer_funcs; 1300 + adev->mman.buffer_funcs_ring = &adev->sdma.instance[0].ring; 1303 1301 } 1304 1302 1305 1303 static const struct amdgpu_vm_pte_funcs sdma_v2_4_vm_pte_funcs = { ··· 1313 1315 struct drm_gpu_scheduler *sched; 1314 1316 unsigned i; 1315 1317 1316 - if (adev->vm_manager.vm_pte_funcs == NULL) { 1317 - adev->vm_manager.vm_pte_funcs = &sdma_v2_4_vm_pte_funcs; 1318 - for (i = 0; i < adev->sdma.num_instances; i++) { 1319 - sched = &adev->sdma.instance[i].ring.sched; 1320 - adev->vm_manager.vm_pte_rqs[i] = 1321 - &sched->sched_rq[DRM_SCHED_PRIORITY_KERNEL]; 1322 - } 1323 - adev->vm_manager.vm_pte_num_rqs = adev->sdma.num_instances; 1318 + adev->vm_manager.vm_pte_funcs = &sdma_v2_4_vm_pte_funcs; 1319 + for (i = 0; i < adev->sdma.num_instances; i++) { 1320 + sched = &adev->sdma.instance[i].ring.sched; 1321 + adev->vm_manager.vm_pte_rqs[i] = 1322 + &sched->sched_rq[DRM_SCHED_PRIORITY_KERNEL]; 1324 1323 } 1324 + adev->vm_manager.vm_pte_num_rqs = adev->sdma.num_instances; 1325 1325 } 1326 1326 1327 1327 const struct amdgpu_ip_block_version sdma_v2_4_ip_block =
+11 -15
drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
··· 1177 1177 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 1178 1178 1179 1179 /* SDMA trap event */ 1180 - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_SDMA_TRAP, 1180 + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_SDMA_TRAP, 1181 1181 &adev->sdma.trap_irq); 1182 1182 if (r) 1183 1183 return r; 1184 1184 1185 1185 /* SDMA Privileged inst */ 1186 - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, 241, 1186 + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, 241, 1187 1187 &adev->sdma.illegal_inst_irq); 1188 1188 if (r) 1189 1189 return r; 1190 1190 1191 1191 /* SDMA Privileged inst */ 1192 - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_SDMA_SRBM_WRITE, 1192 + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_SDMA_SRBM_WRITE, 1193 1193 &adev->sdma.illegal_inst_irq); 1194 1194 if (r) 1195 1195 return r; ··· 1736 1736 1737 1737 static void sdma_v3_0_set_buffer_funcs(struct amdgpu_device *adev) 1738 1738 { 1739 - if (adev->mman.buffer_funcs == NULL) { 1740 - adev->mman.buffer_funcs = &sdma_v3_0_buffer_funcs; 1741 - adev->mman.buffer_funcs_ring = &adev->sdma.instance[0].ring; 1742 - } 1739 + adev->mman.buffer_funcs = &sdma_v3_0_buffer_funcs; 1740 + adev->mman.buffer_funcs_ring = &adev->sdma.instance[0].ring; 1743 1741 } 1744 1742 1745 1743 static const struct amdgpu_vm_pte_funcs sdma_v3_0_vm_pte_funcs = { ··· 1753 1755 struct drm_gpu_scheduler *sched; 1754 1756 unsigned i; 1755 1757 1756 - if (adev->vm_manager.vm_pte_funcs == NULL) { 1757 - adev->vm_manager.vm_pte_funcs = &sdma_v3_0_vm_pte_funcs; 1758 - for (i = 0; i < adev->sdma.num_instances; i++) { 1759 - sched = &adev->sdma.instance[i].ring.sched; 1760 - adev->vm_manager.vm_pte_rqs[i] = 1761 - &sched->sched_rq[DRM_SCHED_PRIORITY_KERNEL]; 1762 - } 1763 - adev->vm_manager.vm_pte_num_rqs = adev->sdma.num_instances; 1758 + adev->vm_manager.vm_pte_funcs = &sdma_v3_0_vm_pte_funcs; 1759 + for (i = 0; i < adev->sdma.num_instances; i++) { 1760 + sched = &adev->sdma.instance[i].ring.sched; 1761 + adev->vm_manager.vm_pte_rqs[i] = 1762 + &sched->sched_rq[DRM_SCHED_PRIORITY_KERNEL]; 1764 1763 } 1764 + adev->vm_manager.vm_pte_num_rqs = adev->sdma.num_instances; 1765 1765 } 1766 1766 1767 1767 const struct amdgpu_ip_block_version sdma_v3_0_ip_block =
+17 -15
drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
··· 1320 1320 DRM_INFO("use_doorbell being set to: [%s]\n", 1321 1321 ring->use_doorbell?"true":"false"); 1322 1322 1323 - ring->doorbell_index = (i == 0) ? 1324 - (AMDGPU_DOORBELL64_sDMA_ENGINE0 << 1) //get DWORD offset 1325 - : (AMDGPU_DOORBELL64_sDMA_ENGINE1 << 1); // get DWORD offset 1323 + if (adev->asic_type == CHIP_VEGA10) 1324 + ring->doorbell_index = (i == 0) ? 1325 + (AMDGPU_VEGA10_DOORBELL64_sDMA_ENGINE0 << 1) //get DWORD offset 1326 + : (AMDGPU_VEGA10_DOORBELL64_sDMA_ENGINE1 << 1); // get DWORD offset 1327 + else 1328 + ring->doorbell_index = (i == 0) ? 1329 + (AMDGPU_DOORBELL64_sDMA_ENGINE0 << 1) //get DWORD offset 1330 + : (AMDGPU_DOORBELL64_sDMA_ENGINE1 << 1); // get DWORD offset 1331 + 1326 1332 1327 1333 sprintf(ring->name, "sdma%d", i); 1328 1334 r = amdgpu_ring_init(adev, ring, 1024, ··· 1807 1801 1808 1802 static void sdma_v4_0_set_buffer_funcs(struct amdgpu_device *adev) 1809 1803 { 1810 - if (adev->mman.buffer_funcs == NULL) { 1811 - adev->mman.buffer_funcs = &sdma_v4_0_buffer_funcs; 1812 - adev->mman.buffer_funcs_ring = &adev->sdma.instance[0].ring; 1813 - } 1804 + adev->mman.buffer_funcs = &sdma_v4_0_buffer_funcs; 1805 + adev->mman.buffer_funcs_ring = &adev->sdma.instance[0].ring; 1814 1806 } 1815 1807 1816 1808 static const struct amdgpu_vm_pte_funcs sdma_v4_0_vm_pte_funcs = { ··· 1824 1820 struct drm_gpu_scheduler *sched; 1825 1821 unsigned i; 1826 1822 1827 - if (adev->vm_manager.vm_pte_funcs == NULL) { 1828 - adev->vm_manager.vm_pte_funcs = &sdma_v4_0_vm_pte_funcs; 1829 - for (i = 0; i < adev->sdma.num_instances; i++) { 1830 - sched = &adev->sdma.instance[i].ring.sched; 1831 - adev->vm_manager.vm_pte_rqs[i] = 1832 - &sched->sched_rq[DRM_SCHED_PRIORITY_KERNEL]; 1833 - } 1834 - adev->vm_manager.vm_pte_num_rqs = adev->sdma.num_instances; 1823 + adev->vm_manager.vm_pte_funcs = &sdma_v4_0_vm_pte_funcs; 1824 + for (i = 0; i < adev->sdma.num_instances; i++) { 1825 + sched = &adev->sdma.instance[i].ring.sched; 1826 + adev->vm_manager.vm_pte_rqs[i] = 1827 + &sched->sched_rq[DRM_SCHED_PRIORITY_KERNEL]; 1835 1828 } 1829 + adev->vm_manager.vm_pte_num_rqs = adev->sdma.num_instances; 1836 1830 } 1837 1831 1838 1832 const struct amdgpu_ip_block_version sdma_v4_0_ip_block = {
+10 -14
drivers/gpu/drm/amd/amdgpu/si_dma.c
··· 502 502 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 503 503 504 504 /* DMA0 trap event */ 505 - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, 224, &adev->sdma.trap_irq); 505 + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, 224, &adev->sdma.trap_irq); 506 506 if (r) 507 507 return r; 508 508 509 509 /* DMA1 trap event */ 510 - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, 244, &adev->sdma.trap_irq_1); 510 + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, 244, &adev->sdma.trap_irq_1); 511 511 if (r) 512 512 return r; 513 513 ··· 863 863 864 864 static void si_dma_set_buffer_funcs(struct amdgpu_device *adev) 865 865 { 866 - if (adev->mman.buffer_funcs == NULL) { 867 - adev->mman.buffer_funcs = &si_dma_buffer_funcs; 868 - adev->mman.buffer_funcs_ring = &adev->sdma.instance[0].ring; 869 - } 866 + adev->mman.buffer_funcs = &si_dma_buffer_funcs; 867 + adev->mman.buffer_funcs_ring = &adev->sdma.instance[0].ring; 870 868 } 871 869 872 870 static const struct amdgpu_vm_pte_funcs si_dma_vm_pte_funcs = { ··· 880 882 struct drm_gpu_scheduler *sched; 881 883 unsigned i; 882 884 883 - if (adev->vm_manager.vm_pte_funcs == NULL) { 884 - adev->vm_manager.vm_pte_funcs = &si_dma_vm_pte_funcs; 885 - for (i = 0; i < adev->sdma.num_instances; i++) { 886 - sched = &adev->sdma.instance[i].ring.sched; 887 - adev->vm_manager.vm_pte_rqs[i] = 888 - &sched->sched_rq[DRM_SCHED_PRIORITY_KERNEL]; 889 - } 890 - adev->vm_manager.vm_pte_num_rqs = adev->sdma.num_instances; 885 + adev->vm_manager.vm_pte_funcs = &si_dma_vm_pte_funcs; 886 + for (i = 0; i < adev->sdma.num_instances; i++) { 887 + sched = &adev->sdma.instance[i].ring.sched; 888 + adev->vm_manager.vm_pte_rqs[i] = 889 + &sched->sched_rq[DRM_SCHED_PRIORITY_KERNEL]; 891 890 } 891 + adev->vm_manager.vm_pte_num_rqs = adev->sdma.num_instances; 892 892 } 893 893 894 894 const struct amdgpu_ip_block_version si_dma_ip_block =
+2 -2
drivers/gpu/drm/amd/amdgpu/si_dpm.c
··· 7687 7687 int ret; 7688 7688 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 7689 7689 7690 - ret = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, 230, &adev->pm.dpm.thermal.irq); 7690 + ret = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, 230, &adev->pm.dpm.thermal.irq); 7691 7691 if (ret) 7692 7692 return ret; 7693 7693 7694 - ret = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, 231, &adev->pm.dpm.thermal.irq); 7694 + ret = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, 231, &adev->pm.dpm.thermal.irq); 7695 7695 if (ret) 7696 7696 return ret; 7697 7697
+4 -5
drivers/gpu/drm/amd/amdgpu/si_ih.c
··· 142 142 dw[2] = le32_to_cpu(adev->irq.ih.ring[ring_index + 2]); 143 143 dw[3] = le32_to_cpu(adev->irq.ih.ring[ring_index + 3]); 144 144 145 - entry->client_id = AMDGPU_IH_CLIENTID_LEGACY; 145 + entry->client_id = AMDGPU_IRQ_CLIENTID_LEGACY; 146 146 entry->src_id = dw[0] & 0xff; 147 147 entry->src_data[0] = dw[1] & 0xfffffff; 148 148 entry->ring_id = dw[2] & 0xff; ··· 170 170 int r; 171 171 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 172 172 173 - r = amdgpu_ih_ring_init(adev, 64 * 1024, false); 173 + r = amdgpu_ih_ring_init(adev, &adev->irq.ih, 64 * 1024, false); 174 174 if (r) 175 175 return r; 176 176 ··· 182 182 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 183 183 184 184 amdgpu_irq_fini(adev); 185 - amdgpu_ih_ring_fini(adev); 185 + amdgpu_ih_ring_fini(adev, &adev->irq.ih); 186 186 187 187 return 0; 188 188 } ··· 308 308 309 309 static void si_ih_set_interrupt_funcs(struct amdgpu_device *adev) 310 310 { 311 - if (adev->irq.ih_funcs == NULL) 312 - adev->irq.ih_funcs = &si_ih_funcs; 311 + adev->irq.ih_funcs = &si_ih_funcs; 313 312 } 314 313 315 314 const struct amdgpu_ip_block_version si_ih_ip_block =
+2 -1
drivers/gpu/drm/amd/amdgpu/soc15.c
··· 739 739 740 740 adev->pg_flags = AMD_PG_SUPPORT_SDMA | 741 741 AMD_PG_SUPPORT_MMHUB | 742 - AMD_PG_SUPPORT_VCN; 742 + AMD_PG_SUPPORT_VCN | 743 + AMD_PG_SUPPORT_VCN_DPG; 743 744 } else { 744 745 adev->cg_flags = AMD_CG_SUPPORT_GFX_MGCG | 745 746 AMD_CG_SUPPORT_GFX_MGLS |
+21 -1
drivers/gpu/drm/amd/amdgpu/soc15_common.h
··· 57 57 loop--; \ 58 58 if (!loop) { \ 59 59 DRM_ERROR("Register(%d) [%s] failed to reach value 0x%08x != 0x%08x\n", \ 60 - inst, #reg, expected_value, (tmp_ & (mask))); \ 60 + inst, #reg, (unsigned)expected_value, (unsigned)(tmp_ & (mask))); \ 61 61 ret = -ETIMEDOUT; \ 62 62 break; \ 63 63 } \ 64 64 } \ 65 + } while (0) 66 + 67 + #define RREG32_SOC15_DPG_MODE(ip, inst, reg, mask, sram_sel) \ 68 + ({ WREG32_SOC15(ip, inst, mmUVD_DPG_LMA_MASK, mask); \ 69 + WREG32_SOC15(ip, inst, mmUVD_DPG_LMA_CTL, \ 70 + UVD_DPG_LMA_CTL__MASK_EN_MASK | \ 71 + ((adev->reg_offset[ip##_HWIP][inst][reg##_BASE_IDX] + reg) \ 72 + << UVD_DPG_LMA_CTL__READ_WRITE_ADDR__SHIFT) | \ 73 + (sram_sel << UVD_DPG_LMA_CTL__SRAM_SEL__SHIFT)); \ 74 + RREG32_SOC15(ip, inst, mmUVD_DPG_LMA_DATA); }) 75 + 76 + #define WREG32_SOC15_DPG_MODE(ip, inst, reg, value, mask, sram_sel) \ 77 + do { \ 78 + WREG32_SOC15(ip, inst, mmUVD_DPG_LMA_DATA, value); \ 79 + WREG32_SOC15(ip, inst, mmUVD_DPG_LMA_MASK, mask); \ 80 + WREG32_SOC15(ip, inst, mmUVD_DPG_LMA_CTL, \ 81 + UVD_DPG_LMA_CTL__READ_WRITE_MASK | \ 82 + ((adev->reg_offset[ip##_HWIP][inst][reg##_BASE_IDX] + reg) \ 83 + << UVD_DPG_LMA_CTL__READ_WRITE_ADDR__SHIFT) | \ 84 + (sram_sel << UVD_DPG_LMA_CTL__SRAM_SEL__SHIFT)); \ 65 85 } while (0) 66 86 67 87 #endif
+4 -5
drivers/gpu/drm/amd/amdgpu/tonga_ih.c
··· 266 266 dw[2] = le32_to_cpu(adev->irq.ih.ring[ring_index + 2]); 267 267 dw[3] = le32_to_cpu(adev->irq.ih.ring[ring_index + 3]); 268 268 269 - entry->client_id = AMDGPU_IH_CLIENTID_LEGACY; 269 + entry->client_id = AMDGPU_IRQ_CLIENTID_LEGACY; 270 270 entry->src_id = dw[0] & 0xff; 271 271 entry->src_data[0] = dw[1] & 0xfffffff; 272 272 entry->ring_id = dw[2] & 0xff; ··· 317 317 int r; 318 318 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 319 319 320 - r = amdgpu_ih_ring_init(adev, 64 * 1024, true); 320 + r = amdgpu_ih_ring_init(adev, &adev->irq.ih, 64 * 1024, true); 321 321 if (r) 322 322 return r; 323 323 ··· 334 334 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 335 335 336 336 amdgpu_irq_fini(adev); 337 - amdgpu_ih_ring_fini(adev); 337 + amdgpu_ih_ring_fini(adev, &adev->irq.ih); 338 338 amdgpu_irq_remove_domain(adev); 339 339 340 340 return 0; ··· 513 513 514 514 static void tonga_ih_set_interrupt_funcs(struct amdgpu_device *adev) 515 515 { 516 - if (adev->irq.ih_funcs == NULL) 517 - adev->irq.ih_funcs = &tonga_ih_funcs; 516 + adev->irq.ih_funcs = &tonga_ih_funcs; 518 517 } 519 518 520 519 const struct amdgpu_ip_block_version tonga_ih_ip_block =
+1 -1
drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c
··· 108 108 int r; 109 109 110 110 /* UVD TRAP */ 111 - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, 124, &adev->uvd.inst->irq); 111 + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, 124, &adev->uvd.inst->irq); 112 112 if (r) 113 113 return r; 114 114
+1 -1
drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c
··· 105 105 int r; 106 106 107 107 /* UVD TRAP */ 108 - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_UVD_SYSTEM_MESSAGE, &adev->uvd.inst->irq); 108 + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_UVD_SYSTEM_MESSAGE, &adev->uvd.inst->irq); 109 109 if (r) 110 110 return r; 111 111
+2 -2
drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c
··· 393 393 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 394 394 395 395 /* UVD TRAP */ 396 - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_UVD_SYSTEM_MESSAGE, &adev->uvd.inst->irq); 396 + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_UVD_SYSTEM_MESSAGE, &adev->uvd.inst->irq); 397 397 if (r) 398 398 return r; 399 399 400 400 /* UVD ENC TRAP */ 401 401 if (uvd_v6_0_enc_support(adev)) { 402 402 for (i = 0; i < adev->uvd.num_enc_rings; ++i) { 403 - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, i + VISLANDS30_IV_SRCID_UVD_ENC_GEN_PURP, &adev->uvd.inst->irq); 403 + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, i + VISLANDS30_IV_SRCID_UVD_ENC_GEN_PURP, &adev->uvd.inst->irq); 404 404 if (r) 405 405 return r; 406 406 }
+1 -1
drivers/gpu/drm/amd/amdgpu/vce_v2_0.c
··· 417 417 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 418 418 419 419 /* VCE */ 420 - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, 167, &adev->vce.irq); 420 + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, 167, &adev->vce.irq); 421 421 if (r) 422 422 return r; 423 423
+1 -1
drivers/gpu/drm/amd/amdgpu/vce_v3_0.c
··· 423 423 int r, i; 424 424 425 425 /* VCE */ 426 - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_VCE_TRAP, &adev->vce.irq); 426 + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_VCE_TRAP, &adev->vce.irq); 427 427 if (r) 428 428 return r; 429 429
+323 -8
drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
··· 198 198 199 199 done: 200 200 if (!r) 201 - DRM_INFO("VCN decode and encode initialized successfully.\n"); 201 + DRM_INFO("VCN decode and encode initialized successfully(under %s).\n", 202 + (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG)?"DPG Mode":"SPG Mode"); 202 203 203 204 return r; 204 205 } ··· 267 266 } 268 267 269 268 /** 270 - * vcn_v1_0_mc_resume - memory controller programming 269 + * vcn_v1_0_mc_resume_spg_mode - memory controller programming 271 270 * 272 271 * @adev: amdgpu_device pointer 273 272 * 274 273 * Let the VCN memory controller know it's offsets 275 274 */ 276 - static void vcn_v1_0_mc_resume(struct amdgpu_device *adev) 275 + static void vcn_v1_0_mc_resume_spg_mode(struct amdgpu_device *adev) 277 276 { 278 277 uint32_t size = AMDGPU_GPU_PAGE_ALIGN(adev->vcn.fw->size + 4); 279 278 uint32_t offset; ··· 318 317 adev->gfx.config.gb_addr_config); 319 318 WREG32_SOC15(UVD, 0, mmUVD_UDEC_DBW_ADDR_CONFIG, 320 319 adev->gfx.config.gb_addr_config); 320 + } 321 + 322 + static void vcn_v1_0_mc_resume_dpg_mode(struct amdgpu_device *adev) 323 + { 324 + uint32_t size = AMDGPU_GPU_PAGE_ALIGN(adev->vcn.fw->size + 4); 325 + uint32_t offset; 326 + 327 + if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) { 328 + WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW, 329 + (adev->firmware.ucode[AMDGPU_UCODE_ID_VCN].tmr_mc_addr_lo), 330 + 0xFFFFFFFF, 0); 331 + WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH, 332 + (adev->firmware.ucode[AMDGPU_UCODE_ID_VCN].tmr_mc_addr_hi), 333 + 0xFFFFFFFF, 0); 334 + WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_VCPU_CACHE_OFFSET0, 0, 335 + 0xFFFFFFFF, 0); 336 + offset = 0; 337 + } else { 338 + WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW, 339 + lower_32_bits(adev->vcn.gpu_addr), 0xFFFFFFFF, 0); 340 + WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH, 341 + upper_32_bits(adev->vcn.gpu_addr), 0xFFFFFFFF, 0); 342 + offset = size; 343 + WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_VCPU_CACHE_OFFSET0, 344 + AMDGPU_UVD_FIRMWARE_OFFSET >> 3, 0xFFFFFFFF, 0); 345 + } 346 + 347 + WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_VCPU_CACHE_SIZE0, size, 0xFFFFFFFF, 0); 348 + 349 + WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_LOW, 350 + lower_32_bits(adev->vcn.gpu_addr + offset), 0xFFFFFFFF, 0); 351 + WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_HIGH, 352 + upper_32_bits(adev->vcn.gpu_addr + offset), 0xFFFFFFFF, 0); 353 + WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_VCPU_CACHE_OFFSET1, 0, 354 + 0xFFFFFFFF, 0); 355 + WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_VCPU_CACHE_SIZE1, AMDGPU_VCN_HEAP_SIZE, 356 + 0xFFFFFFFF, 0); 357 + 358 + WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_LMI_VCPU_CACHE2_64BIT_BAR_LOW, 359 + lower_32_bits(adev->vcn.gpu_addr + offset + AMDGPU_VCN_HEAP_SIZE), 360 + 0xFFFFFFFF, 0); 361 + WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_LMI_VCPU_CACHE2_64BIT_BAR_HIGH, 362 + upper_32_bits(adev->vcn.gpu_addr + offset + AMDGPU_VCN_HEAP_SIZE), 363 + 0xFFFFFFFF, 0); 364 + WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_VCPU_CACHE_OFFSET2, 0, 0xFFFFFFFF, 0); 365 + WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_VCPU_CACHE_SIZE2, 366 + AMDGPU_VCN_STACK_SIZE + (AMDGPU_VCN_SESSION_SIZE * 40), 367 + 0xFFFFFFFF, 0); 368 + 369 + WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_UDEC_ADDR_CONFIG, 370 + adev->gfx.config.gb_addr_config, 0xFFFFFFFF, 0); 371 + WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_UDEC_DB_ADDR_CONFIG, 372 + adev->gfx.config.gb_addr_config, 0xFFFFFFFF, 0); 373 + WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_UDEC_DBW_ADDR_CONFIG, 374 + adev->gfx.config.gb_addr_config, 0xFFFFFFFF, 0); 375 + WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_JPEG_ADDR_CONFIG, 376 + adev->gfx.config.gb_addr_config, 0xFFFFFFFF, 0); 377 + WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_JPEG_UV_ADDR_CONFIG, 378 + adev->gfx.config.gb_addr_config, 0xFFFFFFFF, 0); 321 379 } 322 380 323 381 /** ··· 579 519 WREG32_SOC15(VCN, 0, mmUVD_SUVD_CGC_CTRL, data); 580 520 } 581 521 522 + static void vcn_v1_0_clock_gating_dpg_mode(struct amdgpu_device *adev, uint8_t sram_sel) 523 + { 524 + uint32_t reg_data = 0; 525 + 526 + /* disable JPEG CGC */ 527 + if (adev->cg_flags & AMD_CG_SUPPORT_VCN_MGCG) 528 + reg_data = 1 << JPEG_CGC_CTRL__DYN_CLOCK_MODE__SHIFT; 529 + else 530 + reg_data = 0 << JPEG_CGC_CTRL__DYN_CLOCK_MODE__SHIFT; 531 + reg_data |= 1 << JPEG_CGC_CTRL__CLK_GATE_DLY_TIMER__SHIFT; 532 + reg_data |= 4 << JPEG_CGC_CTRL__CLK_OFF_DELAY__SHIFT; 533 + WREG32_SOC15_DPG_MODE(UVD, 0, mmJPEG_CGC_CTRL, reg_data, 0xFFFFFFFF, sram_sel); 534 + 535 + WREG32_SOC15_DPG_MODE(UVD, 0, mmJPEG_CGC_GATE, 0, 0xFFFFFFFF, sram_sel); 536 + 537 + /* enable sw clock gating control */ 538 + if (adev->cg_flags & AMD_CG_SUPPORT_VCN_MGCG) 539 + reg_data = 1 << UVD_CGC_CTRL__DYN_CLOCK_MODE__SHIFT; 540 + else 541 + reg_data = 0 << UVD_CGC_CTRL__DYN_CLOCK_MODE__SHIFT; 542 + reg_data |= 1 << UVD_CGC_CTRL__CLK_GATE_DLY_TIMER__SHIFT; 543 + reg_data |= 4 << UVD_CGC_CTRL__CLK_OFF_DELAY__SHIFT; 544 + WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_CGC_CTRL, reg_data, 0xFFFFFFFF, sram_sel); 545 + 546 + reg_data &= ~(UVD_CGC_CTRL__UDEC_RE_MODE_MASK | 547 + UVD_CGC_CTRL__UDEC_CM_MODE_MASK | 548 + UVD_CGC_CTRL__UDEC_IT_MODE_MASK | 549 + UVD_CGC_CTRL__UDEC_DB_MODE_MASK | 550 + UVD_CGC_CTRL__UDEC_MP_MODE_MASK | 551 + UVD_CGC_CTRL__SYS_MODE_MASK | 552 + UVD_CGC_CTRL__UDEC_MODE_MASK | 553 + UVD_CGC_CTRL__MPEG2_MODE_MASK | 554 + UVD_CGC_CTRL__REGS_MODE_MASK | 555 + UVD_CGC_CTRL__RBC_MODE_MASK | 556 + UVD_CGC_CTRL__LMI_MC_MODE_MASK | 557 + UVD_CGC_CTRL__LMI_UMC_MODE_MASK | 558 + UVD_CGC_CTRL__IDCT_MODE_MASK | 559 + UVD_CGC_CTRL__MPRD_MODE_MASK | 560 + UVD_CGC_CTRL__MPC_MODE_MASK | 561 + UVD_CGC_CTRL__LBSI_MODE_MASK | 562 + UVD_CGC_CTRL__LRBBM_MODE_MASK | 563 + UVD_CGC_CTRL__WCB_MODE_MASK | 564 + UVD_CGC_CTRL__VCPU_MODE_MASK | 565 + UVD_CGC_CTRL__SCPU_MODE_MASK); 566 + WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_CGC_CTRL, reg_data, 0xFFFFFFFF, sram_sel); 567 + 568 + /* turn off clock gating */ 569 + WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_CGC_GATE, 0, 0xFFFFFFFF, sram_sel); 570 + 571 + /* turn on SUVD clock gating */ 572 + WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_SUVD_CGC_GATE, 1, 0xFFFFFFFF, sram_sel); 573 + 574 + /* turn on sw mode in UVD_SUVD_CGC_CTRL */ 575 + WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_SUVD_CGC_CTRL, 0, 0xFFFFFFFF, sram_sel); 576 + } 577 + 582 578 static void vcn_1_0_disable_static_power_gating(struct amdgpu_device *adev) 583 579 { 584 580 uint32_t data = 0; ··· 730 614 * 731 615 * Setup and start the VCN block 732 616 */ 733 - static int vcn_v1_0_start(struct amdgpu_device *adev) 617 + static int vcn_v1_0_start_spg_mode(struct amdgpu_device *adev) 734 618 { 735 619 struct amdgpu_ring *ring = &adev->vcn.ring_dec; 736 620 uint32_t rb_bufsz, tmp; ··· 744 628 /* disable clock gating */ 745 629 vcn_v1_0_disable_clock_gating(adev); 746 630 747 - vcn_v1_0_mc_resume(adev); 631 + vcn_v1_0_mc_resume_spg_mode(adev); 748 632 749 633 /* disable interupt */ 750 634 WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_MASTINT_EN), 0, ··· 915 799 return 0; 916 800 } 917 801 802 + static int vcn_v1_0_start_dpg_mode(struct amdgpu_device *adev) 803 + { 804 + struct amdgpu_ring *ring = &adev->vcn.ring_dec; 805 + uint32_t rb_bufsz, tmp, reg_data; 806 + uint32_t lmi_swap_cntl; 807 + 808 + /* disable byte swapping */ 809 + lmi_swap_cntl = 0; 810 + 811 + vcn_1_0_enable_static_power_gating(adev); 812 + 813 + /* enable dynamic power gating mode */ 814 + reg_data = RREG32_SOC15(UVD, 0, mmUVD_POWER_STATUS); 815 + reg_data |= UVD_POWER_STATUS__UVD_PG_MODE_MASK; 816 + reg_data |= UVD_POWER_STATUS__UVD_PG_EN_MASK; 817 + WREG32_SOC15(UVD, 0, mmUVD_POWER_STATUS, reg_data); 818 + 819 + /* enable clock gating */ 820 + vcn_v1_0_clock_gating_dpg_mode(adev, 0); 821 + 822 + /* enable VCPU clock */ 823 + reg_data = (0xFF << UVD_VCPU_CNTL__PRB_TIMEOUT_VAL__SHIFT); 824 + reg_data |= UVD_VCPU_CNTL__CLK_EN_MASK; 825 + reg_data |= UVD_VCPU_CNTL__MIF_WR_LOW_THRESHOLD_BP_MASK; 826 + WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_VCPU_CNTL, reg_data, 0xFFFFFFFF, 0); 827 + 828 + /* disable interupt */ 829 + WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_MASTINT_EN, 830 + 0, UVD_MASTINT_EN__VCPU_EN_MASK, 0); 831 + 832 + /* stall UMC and register bus before resetting VCPU */ 833 + WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_LMI_CTRL2, 834 + UVD_LMI_CTRL2__STALL_ARB_UMC_MASK, UVD_LMI_CTRL2__STALL_ARB_UMC_MASK, 0); 835 + 836 + /* put LMI, VCPU, RBC etc... into reset */ 837 + WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_SOFT_RESET, 838 + UVD_SOFT_RESET__LMI_SOFT_RESET_MASK | 839 + UVD_SOFT_RESET__VCPU_SOFT_RESET_MASK | 840 + UVD_SOFT_RESET__LBSI_SOFT_RESET_MASK | 841 + UVD_SOFT_RESET__RBC_SOFT_RESET_MASK | 842 + UVD_SOFT_RESET__CSM_SOFT_RESET_MASK | 843 + UVD_SOFT_RESET__CXW_SOFT_RESET_MASK | 844 + UVD_SOFT_RESET__TAP_SOFT_RESET_MASK | 845 + UVD_SOFT_RESET__LMI_UMC_SOFT_RESET_MASK, 846 + 0xFFFFFFFF, 0); 847 + 848 + /* initialize VCN memory controller */ 849 + WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_LMI_CTRL, 850 + (0x40 << UVD_LMI_CTRL__WRITE_CLEAN_TIMER__SHIFT) | 851 + UVD_LMI_CTRL__WRITE_CLEAN_TIMER_EN_MASK | 852 + UVD_LMI_CTRL__DATA_COHERENCY_EN_MASK | 853 + UVD_LMI_CTRL__VCPU_DATA_COHERENCY_EN_MASK | 854 + UVD_LMI_CTRL__REQ_MODE_MASK | 855 + 0x00100000L, 0xFFFFFFFF, 0); 856 + 857 + #ifdef __BIG_ENDIAN 858 + /* swap (8 in 32) RB and IB */ 859 + lmi_swap_cntl = 0xa; 860 + #endif 861 + WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_LMI_SWAP_CNTL, lmi_swap_cntl, 0xFFFFFFFF, 0); 862 + 863 + WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_MPC_SET_MUXA0, 0x40c2040, 0xFFFFFFFF, 0); 864 + WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_MPC_SET_MUXA1, 0x0, 0xFFFFFFFF, 0); 865 + WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_MPC_SET_MUXB0, 0x40c2040, 0xFFFFFFFF, 0); 866 + WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_MPC_SET_MUXB1, 0x0, 0xFFFFFFFF, 0); 867 + WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_MPC_SET_ALU, 0, 0xFFFFFFFF, 0); 868 + WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_MPC_SET_MUX, 0x88, 0xFFFFFFFF, 0); 869 + 870 + vcn_v1_0_mc_resume_dpg_mode(adev); 871 + 872 + /* take all subblocks out of reset, except VCPU */ 873 + WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_SOFT_RESET, 874 + UVD_SOFT_RESET__VCPU_SOFT_RESET_MASK, 0xFFFFFFFF, 0); 875 + 876 + /* enable VCPU clock */ 877 + WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_VCPU_CNTL, 878 + UVD_VCPU_CNTL__CLK_EN_MASK, 0xFFFFFFFF, 0); 879 + 880 + /* enable UMC */ 881 + WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_LMI_CTRL2, 882 + 0, UVD_LMI_CTRL2__STALL_ARB_UMC_MASK, 0); 883 + 884 + /* boot up the VCPU */ 885 + WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_SOFT_RESET, 0, 0xFFFFFFFF, 0); 886 + 887 + /* enable master interrupt */ 888 + WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_MASTINT_EN, 889 + (UVD_MASTINT_EN__VCPU_EN_MASK|UVD_MASTINT_EN__SYS_EN_MASK), 890 + (UVD_MASTINT_EN__VCPU_EN_MASK|UVD_MASTINT_EN__SYS_EN_MASK), 0); 891 + 892 + vcn_v1_0_clock_gating_dpg_mode(adev, 1); 893 + /* setup mmUVD_LMI_CTRL */ 894 + WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_LMI_CTRL, 895 + (UVD_LMI_CTRL__WRITE_CLEAN_TIMER_EN_MASK | 896 + UVD_LMI_CTRL__CRC_RESET_MASK | 897 + UVD_LMI_CTRL__MASK_MC_URGENT_MASK | 898 + UVD_LMI_CTRL__DATA_COHERENCY_EN_MASK | 899 + UVD_LMI_CTRL__VCPU_DATA_COHERENCY_EN_MASK | 900 + (8 << UVD_LMI_CTRL__WRITE_CLEAN_TIMER__SHIFT) | 901 + 0x00100000L), 0xFFFFFFFF, 1); 902 + 903 + tmp = adev->gfx.config.gb_addr_config; 904 + /* setup VCN global tiling registers */ 905 + WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_JPEG_ADDR_CONFIG, tmp, 0xFFFFFFFF, 1); 906 + WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_JPEG_UV_ADDR_CONFIG, tmp, 0xFFFFFFFF, 1); 907 + 908 + /* enable System Interrupt for JRBC */ 909 + WREG32_SOC15_DPG_MODE(UVD, 0, mmUVD_SYS_INT_EN, 910 + UVD_SYS_INT_EN__UVD_JRBC_EN_MASK, 0xFFFFFFFF, 1); 911 + 912 + /* force RBC into idle state */ 913 + rb_bufsz = order_base_2(ring->ring_size); 914 + tmp = REG_SET_FIELD(0, UVD_RBC_RB_CNTL, RB_BUFSZ, rb_bufsz); 915 + tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_BLKSZ, 1); 916 + tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_NO_FETCH, 1); 917 + tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_WPTR_POLL_EN, 0); 918 + tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_NO_UPDATE, 1); 919 + tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_RPTR_WR_EN, 1); 920 + WREG32_SOC15(UVD, 0, mmUVD_RBC_RB_CNTL, tmp); 921 + 922 + /* set the write pointer delay */ 923 + WREG32_SOC15(UVD, 0, mmUVD_RBC_RB_WPTR_CNTL, 0); 924 + 925 + /* set the wb address */ 926 + WREG32_SOC15(UVD, 0, mmUVD_RBC_RB_RPTR_ADDR, 927 + (upper_32_bits(ring->gpu_addr) >> 2)); 928 + 929 + /* programm the RB_BASE for ring buffer */ 930 + WREG32_SOC15(UVD, 0, mmUVD_LMI_RBC_RB_64BIT_BAR_LOW, 931 + lower_32_bits(ring->gpu_addr)); 932 + WREG32_SOC15(UVD, 0, mmUVD_LMI_RBC_RB_64BIT_BAR_HIGH, 933 + upper_32_bits(ring->gpu_addr)); 934 + 935 + /* Initialize the ring buffer's read and write pointers */ 936 + WREG32_SOC15(UVD, 0, mmUVD_RBC_RB_RPTR, 0); 937 + 938 + ring->wptr = RREG32_SOC15(UVD, 0, mmUVD_RBC_RB_RPTR); 939 + WREG32_SOC15(UVD, 0, mmUVD_RBC_RB_WPTR, 940 + lower_32_bits(ring->wptr)); 941 + 942 + WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_RBC_RB_CNTL), 0, 943 + ~UVD_RBC_RB_CNTL__RB_NO_FETCH_MASK); 944 + 945 + /* initialize wptr */ 946 + ring->wptr = RREG32_SOC15(UVD, 0, mmUVD_JRBC_RB_WPTR); 947 + 948 + /* copy patch commands to the jpeg ring */ 949 + vcn_v1_0_jpeg_ring_set_patch_ring(ring, 950 + (ring->wptr + ring->max_dw * amdgpu_sched_hw_submission)); 951 + 952 + return 0; 953 + } 954 + 955 + static int vcn_v1_0_start(struct amdgpu_device *adev) 956 + { 957 + int r; 958 + 959 + if (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG) 960 + r = vcn_v1_0_start_dpg_mode(adev); 961 + else 962 + r = vcn_v1_0_start_spg_mode(adev); 963 + return r; 964 + } 965 + 918 966 /** 919 967 * vcn_v1_0_stop - stop VCN block 920 968 * ··· 1086 806 * 1087 807 * stop the VCN block 1088 808 */ 1089 - static int vcn_v1_0_stop(struct amdgpu_device *adev) 809 + static int vcn_v1_0_stop_spg_mode(struct amdgpu_device *adev) 1090 810 { 1091 811 /* force RBC into idle state */ 1092 812 WREG32_SOC15(UVD, 0, mmUVD_RBC_RB_CNTL, 0x11010101); ··· 1114 834 vcn_v1_0_enable_clock_gating(adev); 1115 835 vcn_1_0_enable_static_power_gating(adev); 1116 836 return 0; 837 + } 838 + 839 + static int vcn_v1_0_stop_dpg_mode(struct amdgpu_device *adev) 840 + { 841 + int ret_code; 842 + 843 + /* Wait for power status to be 1 */ 844 + SOC15_WAIT_ON_RREG(UVD, 0, mmUVD_POWER_STATUS, 0x1, 845 + UVD_POWER_STATUS__UVD_POWER_STATUS_MASK, ret_code); 846 + 847 + /* disable dynamic power gating mode */ 848 + WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_POWER_STATUS), 0, 849 + ~UVD_POWER_STATUS__UVD_PG_MODE_MASK); 850 + 851 + return 0; 852 + } 853 + 854 + static int vcn_v1_0_stop(struct amdgpu_device *adev) 855 + { 856 + int r; 857 + 858 + if (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG) 859 + r = vcn_v1_0_stop_dpg_mode(adev); 860 + else 861 + r = vcn_v1_0_stop_spg_mode(adev); 862 + 863 + return r; 1117 864 } 1118 865 1119 866 static bool vcn_v1_0_is_idle(void *handle) ··· 1940 1633 * revisit this when there is a cleaner line between 1941 1634 * the smc and the hw blocks 1942 1635 */ 1636 + int ret; 1943 1637 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 1944 1638 1639 + if(state == adev->vcn.cur_state) 1640 + return 0; 1641 + 1945 1642 if (state == AMD_PG_STATE_GATE) 1946 - return vcn_v1_0_stop(adev); 1643 + ret = vcn_v1_0_stop(adev); 1947 1644 else 1948 - return vcn_v1_0_start(adev); 1645 + ret = vcn_v1_0_start(adev); 1646 + 1647 + if(!ret) 1648 + adev->vcn.cur_state = state; 1649 + return ret; 1949 1650 } 1950 1651 1951 1652 static const struct amd_ip_funcs vcn_v1_0_ip_funcs = {
+3 -4
drivers/gpu/drm/amd/amdgpu/vega10_ih.c
··· 380 380 int r; 381 381 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 382 382 383 - r = amdgpu_ih_ring_init(adev, 256 * 1024, true); 383 + r = amdgpu_ih_ring_init(adev, &adev->irq.ih, 256 * 1024, true); 384 384 if (r) 385 385 return r; 386 386 ··· 397 397 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 398 398 399 399 amdgpu_irq_fini(adev); 400 - amdgpu_ih_ring_fini(adev); 400 + amdgpu_ih_ring_fini(adev, &adev->irq.ih); 401 401 402 402 return 0; 403 403 } ··· 494 494 495 495 static void vega10_ih_set_interrupt_funcs(struct amdgpu_device *adev) 496 496 { 497 - if (adev->irq.ih_funcs == NULL) 498 - adev->irq.ih_funcs = &vega10_ih_funcs; 497 + adev->irq.ih_funcs = &vega10_ih_funcs; 499 498 } 500 499 501 500 const struct amdgpu_ip_block_version vega10_ih_ip_block =
+21
drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
··· 447 447 return retval; 448 448 } 449 449 450 + static int kfd_ioctl_get_queue_wave_state(struct file *filep, 451 + struct kfd_process *p, void *data) 452 + { 453 + struct kfd_ioctl_get_queue_wave_state_args *args = data; 454 + int r; 455 + 456 + mutex_lock(&p->mutex); 457 + 458 + r = pqm_get_wave_state(&p->pqm, args->queue_id, 459 + (void __user *)args->ctl_stack_address, 460 + &args->ctl_stack_used_size, 461 + &args->save_area_used_size); 462 + 463 + mutex_unlock(&p->mutex); 464 + 465 + return r; 466 + } 467 + 450 468 static int kfd_ioctl_set_memory_policy(struct file *filep, 451 469 struct kfd_process *p, void *data) 452 470 { ··· 1632 1614 1633 1615 AMDKFD_IOCTL_DEF(AMDKFD_IOC_SET_CU_MASK, 1634 1616 kfd_ioctl_set_cu_mask, 0), 1617 + 1618 + AMDKFD_IOCTL_DEF(AMDKFD_IOC_GET_QUEUE_WAVE_STATE, 1619 + kfd_ioctl_get_queue_wave_state, 0) 1635 1620 1636 1621 }; 1637 1622
+1
drivers/gpu/drm/amd/amdkfd/kfd_crat.c
··· 647 647 num_of_cache_types = ARRAY_SIZE(polaris11_cache_info); 648 648 break; 649 649 case CHIP_VEGA10: 650 + case CHIP_VEGA20: 650 651 pcache_info = vega10_cache_info; 651 652 num_of_cache_types = ARRAY_SIZE(vega10_cache_info); 652 653 break;
+44 -21
drivers/gpu/drm/amd/amdkfd/kfd_device.c
··· 53 53 .needs_iommu_device = true, 54 54 .needs_pci_atomics = false, 55 55 .num_sdma_engines = 2, 56 + .num_sdma_queues_per_engine = 2, 56 57 }; 57 58 58 59 static const struct kfd_device_info carrizo_device_info = { ··· 70 69 .needs_iommu_device = true, 71 70 .needs_pci_atomics = false, 72 71 .num_sdma_engines = 2, 72 + .num_sdma_queues_per_engine = 2, 73 73 }; 74 74 75 75 static const struct kfd_device_info raven_device_info = { ··· 86 84 .needs_iommu_device = true, 87 85 .needs_pci_atomics = true, 88 86 .num_sdma_engines = 1, 87 + .num_sdma_queues_per_engine = 2, 89 88 }; 90 89 #endif 91 90 ··· 104 101 .needs_iommu_device = false, 105 102 .needs_pci_atomics = false, 106 103 .num_sdma_engines = 2, 104 + .num_sdma_queues_per_engine = 2, 107 105 }; 108 106 109 107 static const struct kfd_device_info tonga_device_info = { ··· 120 116 .needs_iommu_device = false, 121 117 .needs_pci_atomics = true, 122 118 .num_sdma_engines = 2, 123 - }; 124 - 125 - static const struct kfd_device_info tonga_vf_device_info = { 126 - .asic_family = CHIP_TONGA, 127 - .max_pasid_bits = 16, 128 - .max_no_of_hqd = 24, 129 - .doorbell_size = 4, 130 - .ih_ring_entry_size = 4 * sizeof(uint32_t), 131 - .event_interrupt_class = &event_interrupt_class_cik, 132 - .num_of_watch_points = 4, 133 - .mqd_size_aligned = MQD_SIZE_ALIGNED, 134 - .supports_cwsr = false, 135 - .needs_iommu_device = false, 136 - .needs_pci_atomics = false, 137 - .num_sdma_engines = 2, 119 + .num_sdma_queues_per_engine = 2, 138 120 }; 139 121 140 122 static const struct kfd_device_info fiji_device_info = { ··· 136 146 .needs_iommu_device = false, 137 147 .needs_pci_atomics = true, 138 148 .num_sdma_engines = 2, 149 + .num_sdma_queues_per_engine = 2, 139 150 }; 140 151 141 152 static const struct kfd_device_info fiji_vf_device_info = { ··· 152 161 .needs_iommu_device = false, 153 162 .needs_pci_atomics = false, 154 163 .num_sdma_engines = 2, 164 + .num_sdma_queues_per_engine = 2, 155 165 }; 156 166 157 167 ··· 169 177 .needs_iommu_device = false, 170 178 .needs_pci_atomics = true, 171 179 .num_sdma_engines = 2, 180 + .num_sdma_queues_per_engine = 2, 172 181 }; 173 182 174 183 static const struct kfd_device_info polaris10_vf_device_info = { ··· 185 192 .needs_iommu_device = false, 186 193 .needs_pci_atomics = false, 187 194 .num_sdma_engines = 2, 195 + .num_sdma_queues_per_engine = 2, 188 196 }; 189 197 190 198 static const struct kfd_device_info polaris11_device_info = { ··· 201 207 .needs_iommu_device = false, 202 208 .needs_pci_atomics = true, 203 209 .num_sdma_engines = 2, 210 + .num_sdma_queues_per_engine = 2, 204 211 }; 205 212 206 213 static const struct kfd_device_info vega10_device_info = { ··· 217 222 .needs_iommu_device = false, 218 223 .needs_pci_atomics = false, 219 224 .num_sdma_engines = 2, 225 + .num_sdma_queues_per_engine = 2, 220 226 }; 221 227 222 228 static const struct kfd_device_info vega10_vf_device_info = { ··· 233 237 .needs_iommu_device = false, 234 238 .needs_pci_atomics = false, 235 239 .num_sdma_engines = 2, 240 + .num_sdma_queues_per_engine = 2, 236 241 }; 237 242 243 + static const struct kfd_device_info vega20_device_info = { 244 + .asic_family = CHIP_VEGA20, 245 + .max_pasid_bits = 16, 246 + .max_no_of_hqd = 24, 247 + .doorbell_size = 8, 248 + .ih_ring_entry_size = 8 * sizeof(uint32_t), 249 + .event_interrupt_class = &event_interrupt_class_v9, 250 + .num_of_watch_points = 4, 251 + .mqd_size_aligned = MQD_SIZE_ALIGNED, 252 + .supports_cwsr = true, 253 + .needs_iommu_device = false, 254 + .needs_pci_atomics = false, 255 + .num_sdma_engines = 2, 256 + .num_sdma_queues_per_engine = 8, 257 + }; 238 258 239 259 struct kfd_deviceid { 240 260 unsigned short did; ··· 305 293 { 0x6928, &tonga_device_info }, /* Tonga */ 306 294 { 0x6929, &tonga_device_info }, /* Tonga */ 307 295 { 0x692B, &tonga_device_info }, /* Tonga */ 308 - { 0x692F, &tonga_vf_device_info }, /* Tonga vf */ 309 296 { 0x6938, &tonga_device_info }, /* Tonga */ 310 297 { 0x6939, &tonga_device_info }, /* Tonga */ 311 298 { 0x7300, &fiji_device_info }, /* Fiji */ ··· 339 328 { 0x6868, &vega10_device_info }, /* Vega10 */ 340 329 { 0x686C, &vega10_vf_device_info }, /* Vega10 vf*/ 341 330 { 0x687F, &vega10_device_info }, /* Vega10 */ 331 + { 0x66a0, &vega20_device_info }, /* Vega20 */ 332 + { 0x66a1, &vega20_device_info }, /* Vega20 */ 333 + { 0x66a2, &vega20_device_info }, /* Vega20 */ 334 + { 0x66a3, &vega20_device_info }, /* Vega20 */ 335 + { 0x66a7, &vega20_device_info }, /* Vega20 */ 336 + { 0x66af, &vega20_device_info } /* Vega20 */ 342 337 }; 343 338 344 339 static int kfd_gtt_sa_init(struct kfd_dev *kfd, unsigned int buf_size, ··· 383 366 return NULL; 384 367 } 385 368 369 + kfd = kzalloc(sizeof(*kfd), GFP_KERNEL); 370 + if (!kfd) 371 + return NULL; 372 + 386 373 /* Allow BIF to recode atomics to PCIe 3.0 AtomicOps. 387 374 * 32 and 64-bit requests are possible and must be 388 375 * supported. ··· 398 377 dev_info(kfd_device, 399 378 "skipped device %x:%x, PCI rejects atomics\n", 400 379 pdev->vendor, pdev->device); 380 + kfree(kfd); 401 381 return NULL; 402 - } 403 - 404 - kfd = kzalloc(sizeof(*kfd), GFP_KERNEL); 405 - if (!kfd) 406 - return NULL; 382 + } else if (!ret) 383 + kfd->pci_atomic_requested = true; 407 384 408 385 kfd->kgd = kgd; 409 386 kfd->device_info = device_info; ··· 438 419 { 439 420 unsigned int size; 440 421 422 + kfd->mec_fw_version = kfd->kfd2kgd->get_fw_version(kfd->kgd, 423 + KGD_ENGINE_MEC1); 424 + kfd->sdma_fw_version = kfd->kfd2kgd->get_fw_version(kfd->kgd, 425 + KGD_ENGINE_SDMA1); 441 426 kfd->shared_resources = *gpu_resources; 442 427 443 428 kfd->vm_info.first_vmid_kfd = ffs(gpu_resources->compute_vmid_bitmap)-1;
+48 -7
drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
··· 109 109 unsigned int get_num_sdma_queues(struct device_queue_manager *dqm) 110 110 { 111 111 return dqm->dev->device_info->num_sdma_engines 112 - * KFD_SDMA_QUEUES_PER_ENGINE; 112 + * dqm->dev->device_info->num_sdma_queues_per_engine; 113 113 } 114 114 115 115 void program_sh_mem_settings(struct device_queue_manager *dqm, ··· 656 656 struct queue *q; 657 657 struct mqd_manager *mqd_mgr; 658 658 struct kfd_process_device *pdd; 659 - uint32_t pd_base; 659 + uint64_t pd_base; 660 660 int retval = 0; 661 661 662 662 pdd = qpd_to_pdd(qpd); ··· 676 676 677 677 /* Update PD Base in QPD */ 678 678 qpd->page_table_base = pd_base; 679 - pr_debug("Updated PD address to 0x%08x\n", pd_base); 679 + pr_debug("Updated PD address to 0x%llx\n", pd_base); 680 680 681 681 if (!list_empty(&qpd->queues_list)) { 682 682 dqm->dev->kfd2kgd->set_vm_context_page_table_base( ··· 717 717 { 718 718 struct queue *q; 719 719 struct kfd_process_device *pdd; 720 - uint32_t pd_base; 720 + uint64_t pd_base; 721 721 int retval = 0; 722 722 723 723 pdd = qpd_to_pdd(qpd); ··· 737 737 738 738 /* Update PD Base in QPD */ 739 739 qpd->page_table_base = pd_base; 740 - pr_debug("Updated PD address to 0x%08x\n", pd_base); 740 + pr_debug("Updated PD address to 0x%llx\n", pd_base); 741 741 742 742 /* activate all active queues on the qpd */ 743 743 list_for_each_entry(q, &qpd->queues_list, list) { ··· 761 761 { 762 762 struct device_process_node *n; 763 763 struct kfd_process_device *pdd; 764 - uint32_t pd_base; 764 + uint64_t pd_base; 765 765 int retval; 766 766 767 767 n = kzalloc(sizeof(*n), GFP_KERNEL); ··· 779 779 780 780 /* Update PD Base in QPD */ 781 781 qpd->page_table_base = pd_base; 782 + pr_debug("Updated PD address to 0x%llx\n", pd_base); 782 783 783 784 retval = dqm->asic_ops.update_qpd(dqm, qpd); 784 785 ··· 1529 1528 return retval; 1530 1529 } 1531 1530 1531 + static int get_wave_state(struct device_queue_manager *dqm, 1532 + struct queue *q, 1533 + void __user *ctl_stack, 1534 + u32 *ctl_stack_used_size, 1535 + u32 *save_area_used_size) 1536 + { 1537 + struct mqd_manager *mqd; 1538 + int r; 1539 + 1540 + dqm_lock(dqm); 1541 + 1542 + if (q->properties.type != KFD_QUEUE_TYPE_COMPUTE || 1543 + q->properties.is_active || !q->device->cwsr_enabled) { 1544 + r = -EINVAL; 1545 + goto dqm_unlock; 1546 + } 1547 + 1548 + mqd = dqm->ops.get_mqd_manager(dqm, KFD_MQD_TYPE_COMPUTE); 1549 + if (!mqd) { 1550 + r = -ENOMEM; 1551 + goto dqm_unlock; 1552 + } 1553 + 1554 + if (!mqd->get_wave_state) { 1555 + r = -EINVAL; 1556 + goto dqm_unlock; 1557 + } 1558 + 1559 + r = mqd->get_wave_state(mqd, q->mqd, ctl_stack, ctl_stack_used_size, 1560 + save_area_used_size); 1561 + 1562 + dqm_unlock: 1563 + dqm_unlock(dqm); 1564 + return r; 1565 + } 1532 1566 1533 1567 static int process_termination_cpsch(struct device_queue_manager *dqm, 1534 1568 struct qcm_process_device *qpd) ··· 1685 1649 dqm->ops.process_termination = process_termination_cpsch; 1686 1650 dqm->ops.evict_process_queues = evict_process_queues_cpsch; 1687 1651 dqm->ops.restore_process_queues = restore_process_queues_cpsch; 1652 + dqm->ops.get_wave_state = get_wave_state; 1688 1653 break; 1689 1654 case KFD_SCHED_POLICY_NO_HWS: 1690 1655 /* initialize dqm for no cp scheduling */ ··· 1705 1668 dqm->ops.evict_process_queues = evict_process_queues_nocpsch; 1706 1669 dqm->ops.restore_process_queues = 1707 1670 restore_process_queues_nocpsch; 1671 + dqm->ops.get_wave_state = get_wave_state; 1708 1672 break; 1709 1673 default: 1710 1674 pr_err("Invalid scheduling policy %d\n", dqm->sched_policy); ··· 1733 1695 break; 1734 1696 1735 1697 case CHIP_VEGA10: 1698 + case CHIP_VEGA20: 1736 1699 case CHIP_RAVEN: 1737 1700 device_queue_manager_init_v9(&dqm->asic_ops); 1738 1701 break; ··· 1845 1806 } 1846 1807 1847 1808 for (pipe = 0; pipe < get_num_sdma_engines(dqm); pipe++) { 1848 - for (queue = 0; queue < KFD_SDMA_QUEUES_PER_ENGINE; queue++) { 1809 + for (queue = 0; 1810 + queue < dqm->dev->device_info->num_sdma_queues_per_engine; 1811 + queue++) { 1849 1812 r = dqm->dev->kfd2kgd->hqd_sdma_dump( 1850 1813 dqm->dev->kgd, pipe, queue, &dump, &n_regs); 1851 1814 if (r)
+8 -1
drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.h
··· 33 33 34 34 #define KFD_UNMAP_LATENCY_MS (4000) 35 35 #define QUEUE_PREEMPT_DEFAULT_TIMEOUT_MS (2 * KFD_UNMAP_LATENCY_MS + 1000) 36 - #define KFD_SDMA_QUEUES_PER_ENGINE (2) 37 36 38 37 struct device_process_node { 39 38 struct qcm_process_device *qpd; ··· 81 82 * 82 83 * @restore_process_queues: Restore all evicted queues queues of a process 83 84 * 85 + * @get_wave_state: Retrieves context save state and optionally copies the 86 + * control stack, if kept in the MQD, to the given userspace address. 84 87 */ 85 88 86 89 struct device_queue_manager_ops { ··· 138 137 struct qcm_process_device *qpd); 139 138 int (*restore_process_queues)(struct device_queue_manager *dqm, 140 139 struct qcm_process_device *qpd); 140 + 141 + int (*get_wave_state)(struct device_queue_manager *dqm, 142 + struct queue *q, 143 + void __user *ctl_stack, 144 + u32 *ctl_stack_used_size, 145 + u32 *save_area_used_size); 141 146 }; 142 147 143 148 struct device_queue_manager_asic_ops {
+1
drivers/gpu/drm/amd/amdkfd/kfd_flat_memory.c
··· 400 400 kfd_init_apertures_vi(pdd, id); 401 401 break; 402 402 case CHIP_VEGA10: 403 + case CHIP_VEGA20: 403 404 case CHIP_RAVEN: 404 405 kfd_init_apertures_v9(pdd, id); 405 406 break;
+1
drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.c
··· 322 322 break; 323 323 324 324 case CHIP_VEGA10: 325 + case CHIP_VEGA20: 325 326 case CHIP_RAVEN: 326 327 kernel_queue_init_v9(&kq->ops_asic_specific); 327 328 break;
+1 -2
drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue_v9.c
··· 71 71 uint32_t *buffer, struct qcm_process_device *qpd) 72 72 { 73 73 struct pm4_mes_map_process *packet; 74 - uint64_t vm_page_table_base_addr = 75 - (uint64_t)(qpd->page_table_base) << 12; 74 + uint64_t vm_page_table_base_addr = qpd->page_table_base; 76 75 77 76 packet = (struct pm4_mes_map_process *)buffer; 78 77 memset(buffer, 0, sizeof(struct pm4_mes_map_process));
+1
drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.c
··· 39 39 case CHIP_POLARIS11: 40 40 return mqd_manager_init_vi_tonga(type, dev); 41 41 case CHIP_VEGA10: 42 + case CHIP_VEGA20: 42 43 case CHIP_RAVEN: 43 44 return mqd_manager_init_v9(type, dev); 44 45 default:
+8
drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.h
··· 43 43 * 44 44 * @is_occupied: Checks if the relevant HQD slot is occupied. 45 45 * 46 + * @get_wave_state: Retrieves context save state and optionally copies the 47 + * control stack, if kept in the MQD, to the given userspace address. 48 + * 46 49 * @mqd_mutex: Mqd manager mutex. 47 50 * 48 51 * @dev: The kfd device structure coupled with this module. ··· 87 84 bool (*is_occupied)(struct mqd_manager *mm, void *mqd, 88 85 uint64_t queue_address, uint32_t pipe_id, 89 86 uint32_t queue_id); 87 + 88 + int (*get_wave_state)(struct mqd_manager *mm, void *mqd, 89 + void __user *ctl_stack, 90 + u32 *ctl_stack_used_size, 91 + u32 *save_area_used_size); 90 92 91 93 #if defined(CONFIG_DEBUG_FS) 92 94 int (*debugfs_show_mqd)(struct seq_file *m, void *data);
+23
drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c
··· 266 266 pipe_id, queue_id); 267 267 } 268 268 269 + static int get_wave_state(struct mqd_manager *mm, void *mqd, 270 + void __user *ctl_stack, 271 + u32 *ctl_stack_used_size, 272 + u32 *save_area_used_size) 273 + { 274 + struct v9_mqd *m; 275 + 276 + /* Control stack is located one page after MQD. */ 277 + void *mqd_ctl_stack = (void *)((uintptr_t)mqd + PAGE_SIZE); 278 + 279 + m = get_mqd(mqd); 280 + 281 + *ctl_stack_used_size = m->cp_hqd_cntl_stack_size - 282 + m->cp_hqd_cntl_stack_offset; 283 + *save_area_used_size = m->cp_hqd_wg_state_offset; 284 + 285 + if (copy_to_user(ctl_stack, mqd_ctl_stack, m->cp_hqd_cntl_stack_size)) 286 + return -EFAULT; 287 + 288 + return 0; 289 + } 290 + 269 291 static int init_mqd_hiq(struct mqd_manager *mm, void **mqd, 270 292 struct kfd_mem_obj **mqd_mem_obj, uint64_t *gart_addr, 271 293 struct queue_properties *q) ··· 457 435 mqd->update_mqd = update_mqd; 458 436 mqd->destroy_mqd = destroy_mqd; 459 437 mqd->is_occupied = is_occupied; 438 + mqd->get_wave_state = get_wave_state; 460 439 #if defined(CONFIG_DEBUG_FS) 461 440 mqd->debugfs_show_mqd = debugfs_show_mqd; 462 441 #endif
+23
drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_vi.c
··· 269 269 pipe_id, queue_id); 270 270 } 271 271 272 + static int get_wave_state(struct mqd_manager *mm, void *mqd, 273 + void __user *ctl_stack, 274 + u32 *ctl_stack_used_size, 275 + u32 *save_area_used_size) 276 + { 277 + struct vi_mqd *m; 278 + 279 + m = get_mqd(mqd); 280 + 281 + *ctl_stack_used_size = m->cp_hqd_cntl_stack_size - 282 + m->cp_hqd_cntl_stack_offset; 283 + *save_area_used_size = m->cp_hqd_wg_state_offset - 284 + m->cp_hqd_cntl_stack_size; 285 + 286 + /* Control stack is not copied to user mode for GFXv8 because 287 + * it's part of the context save area that is already 288 + * accessible to user mode 289 + */ 290 + 291 + return 0; 292 + } 293 + 272 294 static int init_mqd_hiq(struct mqd_manager *mm, void **mqd, 273 295 struct kfd_mem_obj **mqd_mem_obj, uint64_t *gart_addr, 274 296 struct queue_properties *q) ··· 458 436 mqd->update_mqd = update_mqd; 459 437 mqd->destroy_mqd = destroy_mqd; 460 438 mqd->is_occupied = is_occupied; 439 + mqd->get_wave_state = get_wave_state; 461 440 #if defined(CONFIG_DEBUG_FS) 462 441 mqd->debugfs_show_mqd = debugfs_show_mqd; 463 442 #endif
+1
drivers/gpu/drm/amd/amdkfd/kfd_packet_manager.c
··· 229 229 pm->pmf = &kfd_vi_pm_funcs; 230 230 break; 231 231 case CHIP_VEGA10: 232 + case CHIP_VEGA20: 232 233 case CHIP_RAVEN: 233 234 pm->pmf = &kfd_v9_pm_funcs; 234 235 break;
+13 -1
drivers/gpu/drm/amd/amdkfd/kfd_priv.h
··· 176 176 bool needs_iommu_device; 177 177 bool needs_pci_atomics; 178 178 unsigned int num_sdma_engines; 179 + unsigned int num_sdma_queues_per_engine; 179 180 }; 180 181 181 182 struct kfd_mem_obj { ··· 248 247 /* Debug manager */ 249 248 struct kfd_dbgmgr *dbgmgr; 250 249 250 + /* Firmware versions */ 251 + uint16_t mec_fw_version; 252 + uint16_t sdma_fw_version; 253 + 251 254 /* Maximum process number mapped to HW scheduler */ 252 255 unsigned int max_proc_per_quantum; 253 256 ··· 262 257 263 258 /* xGMI */ 264 259 uint64_t hive_id; 260 + 261 + bool pci_atomic_requested; 265 262 }; 266 263 267 264 /* KGD2KFD callbacks */ ··· 507 500 * All the memory management data should be here too 508 501 */ 509 502 uint64_t gds_context_area; 503 + uint64_t page_table_base; 510 504 uint32_t sh_mem_config; 511 505 uint32_t sh_mem_bases; 512 506 uint32_t sh_mem_ape1_base; 513 507 uint32_t sh_mem_ape1_limit; 514 - uint32_t page_table_base; 515 508 uint32_t gds_size; 516 509 uint32_t num_gws; 517 510 uint32_t num_oac; ··· 863 856 struct queue_properties *p); 864 857 struct kernel_queue *pqm_get_kernel_queue(struct process_queue_manager *pqm, 865 858 unsigned int qid); 859 + int pqm_get_wave_state(struct process_queue_manager *pqm, 860 + unsigned int qid, 861 + void __user *ctl_stack, 862 + u32 *ctl_stack_used_size, 863 + u32 *save_area_used_size); 866 864 867 865 int amdkfd_fence_wait_timeout(unsigned int *fence_addr, 868 866 unsigned int fence_value,
+22
drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c
··· 408 408 return NULL; 409 409 } 410 410 411 + int pqm_get_wave_state(struct process_queue_manager *pqm, 412 + unsigned int qid, 413 + void __user *ctl_stack, 414 + u32 *ctl_stack_used_size, 415 + u32 *save_area_used_size) 416 + { 417 + struct process_queue_node *pqn; 418 + 419 + pqn = get_queue_by_qid(pqm, qid); 420 + if (!pqn) { 421 + pr_debug("amdkfd: No queue %d exists for operation\n", 422 + qid); 423 + return -EFAULT; 424 + } 425 + 426 + return pqn->q->device->dqm->ops.get_wave_state(pqn->q->device->dqm, 427 + pqn->q, 428 + ctl_stack, 429 + ctl_stack_used_size, 430 + save_area_used_size); 431 + } 432 + 411 433 #if defined(CONFIG_DEBUG_FS) 412 434 413 435 int pqm_debugfs_mqds(struct seq_file *m, void *data)
+34 -10
drivers/gpu/drm/amd/amdkfd/kfd_topology.c
··· 482 482 (unsigned long long int) 0); 483 483 484 484 sysfs_show_32bit_prop(buffer, "fw_version", 485 - dev->gpu->kfd2kgd->get_fw_version( 486 - dev->gpu->kgd, 487 - KGD_ENGINE_MEC1)); 485 + dev->gpu->mec_fw_version); 488 486 sysfs_show_32bit_prop(buffer, "capability", 489 487 dev->node_props.capability); 488 + sysfs_show_32bit_prop(buffer, "sdma_fw_version", 489 + dev->gpu->sdma_fw_version); 490 490 } 491 491 492 492 return sysfs_show_32bit_prop(buffer, "max_engine_clk_ccompute", ··· 1127 1127 1128 1128 static void kfd_fill_iolink_non_crat_info(struct kfd_topology_device *dev) 1129 1129 { 1130 - struct kfd_iolink_properties *link; 1130 + struct kfd_iolink_properties *link, *cpu_link; 1131 + struct kfd_topology_device *cpu_dev; 1132 + uint32_t cap; 1133 + uint32_t cpu_flag = CRAT_IOLINK_FLAGS_ENABLED; 1134 + uint32_t flag = CRAT_IOLINK_FLAGS_ENABLED; 1131 1135 1132 1136 if (!dev || !dev->gpu) 1133 1137 return; 1134 1138 1135 - /* GPU only creates direck links so apply flags setting to all */ 1136 - if (dev->gpu->device_info->asic_family == CHIP_HAWAII) 1137 - list_for_each_entry(link, &dev->io_link_props, list) 1138 - link->flags = CRAT_IOLINK_FLAGS_ENABLED | 1139 - CRAT_IOLINK_FLAGS_NO_ATOMICS_32_BIT | 1140 - CRAT_IOLINK_FLAGS_NO_ATOMICS_64_BIT; 1139 + pcie_capability_read_dword(dev->gpu->pdev, 1140 + PCI_EXP_DEVCAP2, &cap); 1141 + 1142 + if (!(cap & (PCI_EXP_DEVCAP2_ATOMIC_COMP32 | 1143 + PCI_EXP_DEVCAP2_ATOMIC_COMP64))) 1144 + cpu_flag |= CRAT_IOLINK_FLAGS_NO_ATOMICS_32_BIT | 1145 + CRAT_IOLINK_FLAGS_NO_ATOMICS_64_BIT; 1146 + 1147 + if (!dev->gpu->pci_atomic_requested || 1148 + dev->gpu->device_info->asic_family == CHIP_HAWAII) 1149 + flag |= CRAT_IOLINK_FLAGS_NO_ATOMICS_32_BIT | 1150 + CRAT_IOLINK_FLAGS_NO_ATOMICS_64_BIT; 1151 + 1152 + /* GPU only creates direct links so apply flags setting to all */ 1153 + list_for_each_entry(link, &dev->io_link_props, list) { 1154 + link->flags = flag; 1155 + cpu_dev = kfd_topology_device_by_proximity_domain( 1156 + link->node_to); 1157 + if (cpu_dev) { 1158 + list_for_each_entry(cpu_link, 1159 + &cpu_dev->io_link_props, list) 1160 + if (cpu_link->node_to == link->node_from) 1161 + cpu_link->flags = cpu_flag; 1162 + } 1163 + } 1141 1164 } 1142 1165 1143 1166 int kfd_topology_add_device(struct kfd_dev *gpu) ··· 1278 1255 HSA_CAP_DOORBELL_TYPE_TOTALBITS_MASK); 1279 1256 break; 1280 1257 case CHIP_VEGA10: 1258 + case CHIP_VEGA20: 1281 1259 case CHIP_RAVEN: 1282 1260 dev->node_props.capability |= ((HSA_CAP_DOORBELL_TYPE_2_0 << 1283 1261 HSA_CAP_DOORBELL_TYPE_TOTALBITS_SHIFT) &
+17 -12
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
··· 338 338 /* Prototypes of private functions */ 339 339 static int dm_early_init(void* handle); 340 340 341 - static void hotplug_notify_work_func(struct work_struct *work) 342 - { 343 - struct amdgpu_display_manager *dm = container_of(work, struct amdgpu_display_manager, mst_hotplug_work); 344 - struct drm_device *dev = dm->ddev; 345 - 346 - drm_kms_helper_hotplug_event(dev); 347 - } 348 - 349 341 /* Allocate memory for FBC compressed data */ 350 342 static void amdgpu_dm_fbc_init(struct drm_connector *connector) 351 343 { ··· 438 446 DRM_INFO("Display Core failed to initialize with v%s!\n", DC_VER); 439 447 goto error; 440 448 } 441 - 442 - INIT_WORK(&adev->dm.mst_hotplug_work, hotplug_notify_work_func); 443 449 444 450 adev->dm.freesync_module = mod_freesync_create(adev->dm.dc); 445 451 if (!adev->dm.freesync_module) { ··· 1204 1214 struct dc_interrupt_params int_params = {0}; 1205 1215 int r; 1206 1216 int i; 1207 - unsigned client_id = AMDGPU_IH_CLIENTID_LEGACY; 1217 + unsigned client_id = AMDGPU_IRQ_CLIENTID_LEGACY; 1208 1218 1209 1219 if (adev->asic_type == CHIP_VEGA10 || 1210 1220 adev->asic_type == CHIP_VEGA12 || ··· 4069 4079 /* TODO eliminate or rename surface_update */ 4070 4080 struct dc_surface_update surface_updates[1] = { {0} }; 4071 4081 struct dm_crtc_state *acrtc_state = to_dm_crtc_state(crtc->state); 4082 + struct dc_stream_status *stream_status; 4072 4083 4073 4084 4074 4085 /* Prepare wait for target vblank early - before the fence-waits */ ··· 4125 4134 4126 4135 spin_unlock_irqrestore(&crtc->dev->event_lock, flags); 4127 4136 4128 - surface_updates->surface = dc_stream_get_status(acrtc_state->stream)->plane_states[0]; 4137 + stream_status = dc_stream_get_status(acrtc_state->stream); 4138 + if (!stream_status) { 4139 + DRM_ERROR("No stream status for CRTC: id=%d\n", 4140 + acrtc->crtc_id); 4141 + return; 4142 + } 4143 + 4144 + surface_updates->surface = stream_status->plane_states[0]; 4145 + if (!surface_updates->surface) { 4146 + DRM_ERROR("No surface for CRTC: id=%d\n", 4147 + acrtc->crtc_id); 4148 + return; 4149 + } 4129 4150 surface_updates->flip_addr = &addr; 4130 4151 4131 4152 dc_commit_updates_for_stream(adev->dm.dc, ··· 4800 4797 mod_freesync_build_vrr_infopacket(dm->freesync_module, 4801 4798 new_stream, 4802 4799 &vrr, 4800 + packet_type_fs1, 4801 + NULL, 4803 4802 &vrr_infopacket); 4804 4803 4805 4804 new_crtc_state->adjust = vrr.adjust;
-2
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
··· 108 108 109 109 const struct dc_link *backlight_link; 110 110 111 - struct work_struct mst_hotplug_work; 112 - 113 111 struct mod_freesync *freesync_module; 114 112 115 113 /**
+2
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_pp_smu.c
··· 105 105 adev->powerplay.pp_funcs->display_configuration_change( 106 106 adev->powerplay.pp_handle, 107 107 &adev->pm.pm_display_cfg); 108 + 109 + amdgpu_pm_compute_clocks(adev); 108 110 } 109 111 110 112 return true;
+4 -4
drivers/gpu/drm/amd/display/dc/calcs/dcn_calc_auto.c
··· 1625 1625 else { 1626 1626 v->dsty_after_scaler = 0.0; 1627 1627 } 1628 - v->v_update_offset_pix =dcn_bw_ceil2(v->htotal[k] / 4.0, 1.0); 1628 + v->v_update_offset_pix[k] = dcn_bw_ceil2(v->htotal[k] / 4.0, 1.0); 1629 1629 v->total_repeater_delay_time = v->max_inter_dcn_tile_repeaters * (2.0 / v->dppclk + 3.0 / v->dispclk); 1630 - v->v_update_width_pix = (14.0 / v->dcf_clk_deep_sleep + 12.0 / v->dppclk + v->total_repeater_delay_time) * v->pixel_clock[k]; 1631 - v->v_ready_offset_pix =dcn_bw_max2(150.0 / v->dppclk, v->total_repeater_delay_time + 20.0 / v->dcf_clk_deep_sleep + 10.0 / v->dppclk) * v->pixel_clock[k]; 1632 - v->t_setup = (v->v_update_offset_pix + v->v_update_width_pix + v->v_ready_offset_pix) / v->pixel_clock[k]; 1630 + v->v_update_width_pix[k] = (14.0 / v->dcf_clk_deep_sleep + 12.0 / v->dppclk + v->total_repeater_delay_time) * v->pixel_clock[k]; 1631 + v->v_ready_offset_pix[k] = dcn_bw_max2(150.0 / v->dppclk, v->total_repeater_delay_time + 20.0 / v->dcf_clk_deep_sleep + 10.0 / v->dppclk) * v->pixel_clock[k]; 1632 + v->t_setup = (v->v_update_offset_pix[k] + v->v_update_width_pix[k] + v->v_ready_offset_pix[k]) / v->pixel_clock[k]; 1633 1633 v->v_startup[k] =dcn_bw_min2(v->v_startup_lines, v->max_vstartup_lines[k]); 1634 1634 if (v->prefetch_mode == 0.0) { 1635 1635 v->t_wait =dcn_bw_max3(v->dram_clock_change_latency + v->urgent_latency, v->sr_enter_plus_exit_time, v->urgent_latency);
+6 -6
drivers/gpu/drm/amd/display/dc/calcs/dcn_calcs.c
··· 1096 1096 if (pipe->top_pipe && pipe->top_pipe->plane_state == pipe->plane_state) 1097 1097 continue; 1098 1098 1099 - pipe->pipe_dlg_param.vupdate_width = v->v_update_width[input_idx][v->dpp_per_plane[input_idx] == 2 ? 1 : 0]; 1100 - pipe->pipe_dlg_param.vupdate_offset = v->v_update_offset[input_idx][v->dpp_per_plane[input_idx] == 2 ? 1 : 0]; 1101 - pipe->pipe_dlg_param.vready_offset = v->v_ready_offset[input_idx][v->dpp_per_plane[input_idx] == 2 ? 1 : 0]; 1099 + pipe->pipe_dlg_param.vupdate_width = v->v_update_width_pix[input_idx]; 1100 + pipe->pipe_dlg_param.vupdate_offset = v->v_update_offset_pix[input_idx]; 1101 + pipe->pipe_dlg_param.vready_offset = v->v_ready_offset_pix[input_idx]; 1102 1102 pipe->pipe_dlg_param.vstartup_start = v->v_startup[input_idx]; 1103 1103 1104 1104 pipe->pipe_dlg_param.htotal = pipe->stream->timing.h_total; ··· 1137 1137 TIMING_3D_FORMAT_SIDE_BY_SIDE))) { 1138 1138 if (hsplit_pipe && hsplit_pipe->plane_state == pipe->plane_state) { 1139 1139 /* update previously split pipe */ 1140 - hsplit_pipe->pipe_dlg_param.vupdate_width = v->v_update_width[input_idx][v->dpp_per_plane[input_idx] == 2 ? 1 : 0]; 1141 - hsplit_pipe->pipe_dlg_param.vupdate_offset = v->v_update_offset[input_idx][v->dpp_per_plane[input_idx] == 2 ? 1 : 0]; 1142 - hsplit_pipe->pipe_dlg_param.vready_offset = v->v_ready_offset[input_idx][v->dpp_per_plane[input_idx] == 2 ? 1 : 0]; 1140 + hsplit_pipe->pipe_dlg_param.vupdate_width = v->v_update_width_pix[input_idx]; 1141 + hsplit_pipe->pipe_dlg_param.vupdate_offset = v->v_update_offset_pix[input_idx]; 1142 + hsplit_pipe->pipe_dlg_param.vready_offset = v->v_ready_offset_pix[input_idx]; 1143 1143 hsplit_pipe->pipe_dlg_param.vstartup_start = v->v_startup[input_idx]; 1144 1144 1145 1145 hsplit_pipe->pipe_dlg_param.htotal = pipe->stream->timing.h_total;
+33 -8
drivers/gpu/drm/amd/display/dc/core/dc.c
··· 460 460 struct dc_link_settings *link_setting, 461 461 struct dc_link *link) 462 462 { 463 + int i; 464 + struct pipe_ctx *pipe; 465 + struct dc_stream_state *link_stream; 463 466 struct dc_link_settings store_settings = *link_setting; 464 - struct dc_stream_state *link_stream = 465 - link->dc->current_state->res_ctx.pipe_ctx[0].stream; 467 + 468 + for (i = 0; i < MAX_PIPES; i++) { 469 + pipe = &dc->current_state->res_ctx.pipe_ctx[i]; 470 + if (pipe->stream && pipe->stream->sink 471 + && pipe->stream->sink->link) { 472 + if (pipe->stream->sink->link == link) 473 + break; 474 + } 475 + } 476 + 477 + /* Stream not found */ 478 + if (i == MAX_PIPES) 479 + return; 480 + 481 + link_stream = link->dc->current_state->res_ctx.pipe_ctx[i].stream; 466 482 467 483 link->preferred_link_setting = store_settings; 468 484 if (link_stream) ··· 1176 1160 */ 1177 1161 update_flags->bits.bpp_change = 1; 1178 1162 1179 - if (u->gamma && dce_use_lut(u->plane_info->format)) 1180 - update_flags->bits.gamma_change = 1; 1181 - 1182 1163 if (memcmp(&u->plane_info->tiling_info, &u->surface->tiling_info, 1183 1164 sizeof(union dc_tiling_info)) != 0) { 1184 1165 update_flags->bits.swizzle_change = 1; ··· 1192 1179 if (update_flags->bits.rotation_change 1193 1180 || update_flags->bits.stereo_format_change 1194 1181 || update_flags->bits.pixel_format_change 1195 - || update_flags->bits.gamma_change 1196 1182 || update_flags->bits.bpp_change 1197 1183 || update_flags->bits.bandwidth_change 1198 1184 || update_flags->bits.output_tf_change) ··· 1281 1269 if (u->coeff_reduction_factor) 1282 1270 update_flags->bits.coeff_reduction_change = 1; 1283 1271 1272 + if (u->gamma) { 1273 + enum surface_pixel_format format = SURFACE_PIXEL_FORMAT_GRPH_BEGIN; 1274 + 1275 + if (u->plane_info) 1276 + format = u->plane_info->format; 1277 + else if (u->surface) 1278 + format = u->surface->format; 1279 + 1280 + if (dce_use_lut(format)) 1281 + update_flags->bits.gamma_change = 1; 1282 + } 1283 + 1284 1284 if (update_flags->bits.in_transfer_func_change) { 1285 1285 type = UPDATE_TYPE_MED; 1286 1286 elevate_update_type(&overall_type, type); 1287 1287 } 1288 1288 1289 1289 if (update_flags->bits.input_csc_change 1290 - || update_flags->bits.coeff_reduction_change) { 1290 + || update_flags->bits.coeff_reduction_change 1291 + || update_flags->bits.gamma_change) { 1291 1292 type = UPDATE_TYPE_FULL; 1292 1293 elevate_update_type(&overall_type, type); 1293 1294 } ··· 1404 1379 * sent as part of pplib_apply_display_requirements. 1405 1380 * So just return. 1406 1381 */ 1407 - if (!pp_smu->set_display_count) 1382 + if (!pp_smu || !pp_smu->set_display_count) 1408 1383 return; 1409 1384 1410 1385 display_count = 0;
+32 -28
drivers/gpu/drm/amd/display/dc/core/dc_link.c
··· 2559 2559 pipe_ctx->stream_res.stream_enc, 2560 2560 &stream->timing); 2561 2561 2562 - resource_build_info_frame(pipe_ctx); 2563 - core_dc->hwss.update_info_frame(pipe_ctx); 2562 + if (!IS_FPGA_MAXIMUS_DC(core_dc->ctx->dce_environment)) { 2563 + resource_build_info_frame(pipe_ctx); 2564 + core_dc->hwss.update_info_frame(pipe_ctx); 2564 2565 2565 - /* eDP lit up by bios already, no need to enable again. */ 2566 - if (pipe_ctx->stream->signal == SIGNAL_TYPE_EDP && 2567 - pipe_ctx->stream->apply_edp_fast_boot_optimization) { 2568 - pipe_ctx->stream->apply_edp_fast_boot_optimization = false; 2569 - pipe_ctx->stream->dpms_off = false; 2570 - return; 2571 - } 2566 + /* eDP lit up by bios already, no need to enable again. */ 2567 + if (pipe_ctx->stream->signal == SIGNAL_TYPE_EDP && 2568 + pipe_ctx->stream->apply_edp_fast_boot_optimization) { 2569 + pipe_ctx->stream->apply_edp_fast_boot_optimization = false; 2570 + pipe_ctx->stream->dpms_off = false; 2571 + return; 2572 + } 2572 2573 2573 - if (pipe_ctx->stream->dpms_off) 2574 - return; 2574 + if (pipe_ctx->stream->dpms_off) 2575 + return; 2575 2576 2576 - status = enable_link(state, pipe_ctx); 2577 + status = enable_link(state, pipe_ctx); 2577 2578 2578 - if (status != DC_OK) { 2579 + if (status != DC_OK) { 2579 2580 DC_LOG_WARNING("enabling link %u failed: %d\n", 2580 2581 pipe_ctx->stream->sink->link->link_index, 2581 2582 status); ··· 2591 2590 BREAK_TO_DEBUGGER(); 2592 2591 return; 2593 2592 } 2593 + } 2594 + 2595 + core_dc->hwss.enable_audio_stream(pipe_ctx); 2596 + 2597 + /* turn off otg test pattern if enable */ 2598 + if (pipe_ctx->stream_res.tg->funcs->set_test_pattern) 2599 + pipe_ctx->stream_res.tg->funcs->set_test_pattern(pipe_ctx->stream_res.tg, 2600 + CONTROLLER_DP_TEST_PATTERN_VIDEOMODE, 2601 + COLOR_DEPTH_UNDEFINED); 2602 + 2603 + core_dc->hwss.enable_stream(pipe_ctx); 2604 + 2605 + if (pipe_ctx->stream->signal == SIGNAL_TYPE_DISPLAY_PORT_MST) 2606 + allocate_mst_payload(pipe_ctx); 2607 + 2608 + core_dc->hwss.unblank_stream(pipe_ctx, 2609 + &pipe_ctx->stream->sink->link->cur_link_settings); 2610 + 2594 2611 } 2595 2612 2596 - core_dc->hwss.enable_audio_stream(pipe_ctx); 2597 - 2598 - /* turn off otg test pattern if enable */ 2599 - if (pipe_ctx->stream_res.tg->funcs->set_test_pattern) 2600 - pipe_ctx->stream_res.tg->funcs->set_test_pattern(pipe_ctx->stream_res.tg, 2601 - CONTROLLER_DP_TEST_PATTERN_VIDEOMODE, 2602 - COLOR_DEPTH_UNDEFINED); 2603 - 2604 - core_dc->hwss.enable_stream(pipe_ctx); 2605 - 2606 - if (pipe_ctx->stream->signal == SIGNAL_TYPE_DISPLAY_PORT_MST) 2607 - allocate_mst_payload(pipe_ctx); 2608 - 2609 - core_dc->hwss.unblank_stream(pipe_ctx, 2610 - &pipe_ctx->stream->sink->link->cur_link_settings); 2611 2613 } 2612 2614 2613 2615 void core_link_disable_stream(struct pipe_ctx *pipe_ctx, int option)
+1 -1
drivers/gpu/drm/amd/display/dc/dc.h
··· 38 38 #include "inc/compressor.h" 39 39 #include "dml/display_mode_lib.h" 40 40 41 - #define DC_VER "3.1.66" 41 + #define DC_VER "3.1.67" 42 42 43 43 #define MAX_SURFACES 3 44 44 #define MAX_STREAMS 6
+3
drivers/gpu/drm/amd/display/dc/dce/dce_clocks.c
··· 468 468 { 469 469 struct dm_pp_clock_for_voltage_req clock_voltage_req = {0}; 470 470 471 + /* TODO: Investigate why this is needed to fix display corruption. */ 472 + new_clocks->dispclk_khz = new_clocks->dispclk_khz * 115 / 100; 473 + 471 474 if (should_set_clock(safe_to_lower, new_clocks->dispclk_khz, dccg->clks.dispclk_khz)) { 472 475 clock_voltage_req.clk_type = DM_PP_CLOCK_TYPE_DISPLAY_CLK; 473 476 clock_voltage_req.clocks_in_khz = new_clocks->dispclk_khz;
+1 -14
drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c
··· 1377 1377 /* */ 1378 1378 dc->hwss.enable_stream_timing(pipe_ctx, context, dc); 1379 1379 1380 - /* FPGA does not program backend */ 1381 - if (IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment)) { 1382 - pipe_ctx->stream_res.opp->funcs->opp_set_dyn_expansion( 1383 - pipe_ctx->stream_res.opp, 1384 - COLOR_SPACE_YCBCR601, 1385 - stream->timing.display_color_depth, 1386 - pipe_ctx->stream->signal); 1387 - 1388 - pipe_ctx->stream_res.opp->funcs->opp_program_fmt( 1389 - pipe_ctx->stream_res.opp, 1390 - &stream->bit_depth_params, 1391 - &stream->clamping); 1392 - return DC_OK; 1393 - } 1394 1380 /* TODO: move to stream encoder */ 1395 1381 if (pipe_ctx->stream->signal != SIGNAL_TYPE_VIRTUAL) 1396 1382 if (DC_OK != bios_parser_crtc_source_select(pipe_ctx)) { 1397 1383 BREAK_TO_DEBUGGER(); 1398 1384 return DC_ERROR_UNEXPECTED; 1399 1385 } 1386 + 1400 1387 pipe_ctx->stream_res.opp->funcs->opp_set_dyn_expansion( 1401 1388 pipe_ctx->stream_res.opp, 1402 1389 COLOR_SPACE_YCBCR601,
+1
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
··· 44 44 #include "dcn10_hubp.h" 45 45 #include "dcn10_hubbub.h" 46 46 #include "dcn10_cm_common.h" 47 + #include "dc_link_dp.h" 47 48 48 49 #define DC_LOGGER_INIT(logger) 49 50
+3 -3
drivers/gpu/drm/amd/display/dc/inc/dcn_calcs.h
··· 504 504 float prefetch_mode; 505 505 float dstx_after_scaler; 506 506 float dsty_after_scaler; 507 - float v_update_offset_pix; 507 + float v_update_offset_pix[number_of_planes_minus_one + 1]; 508 508 float total_repeater_delay_time; 509 - float v_update_width_pix; 510 - float v_ready_offset_pix; 509 + float v_update_width_pix[number_of_planes_minus_one + 1]; 510 + float v_ready_offset_pix[number_of_planes_minus_one + 1]; 511 511 float t_setup; 512 512 float t_wait; 513 513 float bandwidth_available_for_immediate_flip;
+144 -20
drivers/gpu/drm/amd/display/modules/freesync/freesync.c
··· 480 480 return false; 481 481 } 482 482 483 - void mod_freesync_build_vrr_infopacket(struct mod_freesync *mod_freesync, 484 - const struct dc_stream_state *stream, 485 - const struct mod_vrr_params *vrr, 486 - struct dc_info_packet *infopacket) 483 + static void build_vrr_infopacket_header_v1(enum signal_type signal, 484 + struct dc_info_packet *infopacket, 485 + unsigned int *payload_size) 487 486 { 488 - /* SPD info packet for FreeSync */ 489 - unsigned char checksum = 0; 490 - unsigned int idx, payload_size = 0; 491 - 492 - /* Check if Freesync is supported. Return if false. If true, 493 - * set the corresponding bit in the info packet 494 - */ 495 - if (!vrr->supported || !vrr->send_vsif) 496 - return; 497 - 498 - if (dc_is_hdmi_signal(stream->signal)) { 487 + if (dc_is_hdmi_signal(signal)) { 499 488 500 489 /* HEADER */ 501 490 ··· 499 510 /* HB2 = [Bits 7:5 = 0] [Bits 4:0 = Length = 0x08] */ 500 511 infopacket->hb2 = 0x08; 501 512 502 - payload_size = 0x08; 513 + *payload_size = 0x08; 503 514 504 - } else if (dc_is_dp_signal(stream->signal)) { 515 + } else if (dc_is_dp_signal(signal)) { 505 516 506 517 /* HEADER */ 507 518 ··· 525 536 */ 526 537 infopacket->hb3 = 0x04; 527 538 528 - payload_size = 0x1B; 539 + *payload_size = 0x1B; 529 540 } 541 + } 530 542 543 + static void build_vrr_infopacket_header_v2(enum signal_type signal, 544 + struct dc_info_packet *infopacket, 545 + unsigned int *payload_size) 546 + { 547 + if (dc_is_hdmi_signal(signal)) { 548 + 549 + /* HEADER */ 550 + 551 + /* HB0 = Packet Type = 0x83 (Source Product 552 + * Descriptor InfoFrame) 553 + */ 554 + infopacket->hb0 = DC_HDMI_INFOFRAME_TYPE_SPD; 555 + 556 + /* HB1 = Version = 0x02 */ 557 + infopacket->hb1 = 0x02; 558 + 559 + /* HB2 = [Bits 7:5 = 0] [Bits 4:0 = Length = 0x09] */ 560 + infopacket->hb2 = 0x09; 561 + 562 + *payload_size = 0x0A; 563 + 564 + } else if (dc_is_dp_signal(signal)) { 565 + 566 + /* HEADER */ 567 + 568 + /* HB0 = Secondary-data Packet ID = 0 - Only non-zero 569 + * when used to associate audio related info packets 570 + */ 571 + infopacket->hb0 = 0x00; 572 + 573 + /* HB1 = Packet Type = 0x83 (Source Product 574 + * Descriptor InfoFrame) 575 + */ 576 + infopacket->hb1 = DC_HDMI_INFOFRAME_TYPE_SPD; 577 + 578 + /* HB2 = [Bits 7:0 = Least significant eight bits - 579 + * For INFOFRAME, the value must be 1Bh] 580 + */ 581 + infopacket->hb2 = 0x1B; 582 + 583 + /* HB3 = [Bits 7:2 = INFOFRAME SDP Version Number = 0x2] 584 + * [Bits 1:0 = Most significant two bits = 0x00] 585 + */ 586 + infopacket->hb3 = 0x08; 587 + 588 + *payload_size = 0x1B; 589 + } 590 + } 591 + 592 + static void build_vrr_infopacket_data(const struct mod_vrr_params *vrr, 593 + struct dc_info_packet *infopacket) 594 + { 531 595 /* PB1 = 0x1A (24bit AMD IEEE OUI (0x00001A) - Byte 0) */ 532 596 infopacket->sb[1] = 0x1A; 533 597 ··· 618 576 */ 619 577 infopacket->sb[8] = (unsigned char)(vrr->max_refresh_in_uhz / 1000000); 620 578 621 - /* PB9 - PB27 = Reserved */ 622 579 580 + //FreeSync HDR 581 + infopacket->sb[9] = 0; 582 + infopacket->sb[10] = 0; 583 + } 584 + 585 + static void build_vrr_infopacket_fs2_data(enum color_transfer_func app_tf, 586 + struct dc_info_packet *infopacket) 587 + { 588 + if (app_tf != transfer_func_unknown) { 589 + infopacket->valid = true; 590 + 591 + infopacket->sb[6] |= 0x08; // PB6 = [Bit 3 = Native Color Active] 592 + 593 + if (app_tf == transfer_func_gamma_22) { 594 + infopacket->sb[9] |= 0x04; // PB6 = [Bit 2 = Gamma 2.2 EOTF Active] 595 + } 596 + } 597 + } 598 + 599 + static void build_vrr_infopacket_checksum(unsigned int *payload_size, 600 + struct dc_info_packet *infopacket) 601 + { 623 602 /* Calculate checksum */ 603 + unsigned int idx = 0; 604 + unsigned char checksum = 0; 605 + 624 606 checksum += infopacket->hb0; 625 607 checksum += infopacket->hb1; 626 608 checksum += infopacket->hb2; 627 609 checksum += infopacket->hb3; 628 610 629 - for (idx = 1; idx <= payload_size; idx++) 611 + for (idx = 1; idx <= *payload_size; idx++) 630 612 checksum += infopacket->sb[idx]; 631 613 632 614 /* PB0 = Checksum (one byte complement) */ 633 615 infopacket->sb[0] = (unsigned char)(0x100 - checksum); 634 616 635 617 infopacket->valid = true; 618 + } 619 + 620 + static void build_vrr_infopacket_v1(enum signal_type signal, 621 + const struct mod_vrr_params *vrr, 622 + struct dc_info_packet *infopacket) 623 + { 624 + /* SPD info packet for FreeSync */ 625 + unsigned int payload_size = 0; 626 + 627 + build_vrr_infopacket_header_v1(signal, infopacket, &payload_size); 628 + build_vrr_infopacket_data(vrr, infopacket); 629 + build_vrr_infopacket_checksum(&payload_size, infopacket); 630 + 631 + infopacket->valid = true; 632 + } 633 + 634 + static void build_vrr_infopacket_v2(enum signal_type signal, 635 + const struct mod_vrr_params *vrr, 636 + const enum color_transfer_func *app_tf, 637 + struct dc_info_packet *infopacket) 638 + { 639 + unsigned int payload_size = 0; 640 + 641 + build_vrr_infopacket_header_v2(signal, infopacket, &payload_size); 642 + build_vrr_infopacket_data(vrr, infopacket); 643 + 644 + if (app_tf != NULL) 645 + build_vrr_infopacket_fs2_data(*app_tf, infopacket); 646 + 647 + build_vrr_infopacket_checksum(&payload_size, infopacket); 648 + 649 + infopacket->valid = true; 650 + } 651 + 652 + void mod_freesync_build_vrr_infopacket(struct mod_freesync *mod_freesync, 653 + const struct dc_stream_state *stream, 654 + const struct mod_vrr_params *vrr, 655 + enum vrr_packet_type packet_type, 656 + const enum color_transfer_func *app_tf, 657 + struct dc_info_packet *infopacket) 658 + { 659 + /* SPD info packet for FreeSync */ 660 + 661 + /* Check if Freesync is supported. Return if false. If true, 662 + * set the corresponding bit in the info packet 663 + */ 664 + if (!vrr->supported || !vrr->send_vsif) 665 + return; 666 + 667 + switch (packet_type) { 668 + case packet_type_fs2: 669 + build_vrr_infopacket_v2(stream->signal, vrr, app_tf, infopacket); 670 + break; 671 + case packet_type_vrr: 672 + case packet_type_fs1: 673 + default: 674 + build_vrr_infopacket_v1(stream->signal, vrr, infopacket); 675 + } 636 676 } 637 677 638 678 void mod_freesync_build_vrr_params(struct mod_freesync *mod_freesync,
+3 -1
drivers/gpu/drm/amd/display/modules/inc/mod_freesync.h
··· 54 54 #ifndef MOD_FREESYNC_H_ 55 55 #define MOD_FREESYNC_H_ 56 56 57 - #include "dm_services.h" 57 + #include "mod_shared.h" 58 58 59 59 // Access structures 60 60 struct mod_freesync { ··· 144 144 void mod_freesync_build_vrr_infopacket(struct mod_freesync *mod_freesync, 145 145 const struct dc_stream_state *stream, 146 146 const struct mod_vrr_params *vrr, 147 + enum vrr_packet_type packet_type, 148 + const enum color_transfer_func *app_tf, 147 149 struct dc_info_packet *infopacket); 148 150 149 151 void mod_freesync_build_vrr_params(struct mod_freesync *mod_freesync,
+49
drivers/gpu/drm/amd/display/modules/inc/mod_shared.h
··· 1 + /* 2 + * Copyright 2016 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 + * Authors: AMD 23 + * 24 + */ 25 + 26 + 27 + #ifndef MOD_SHARED_H_ 28 + #define MOD_SHARED_H_ 29 + 30 + enum color_transfer_func { 31 + transfer_func_unknown, 32 + transfer_func_srgb, 33 + transfer_func_bt709, 34 + transfer_func_pq2084, 35 + transfer_func_pq2084_interim, 36 + transfer_func_linear_0_1, 37 + transfer_func_linear_0_125, 38 + transfer_func_dolbyvision, 39 + transfer_func_gamma_22, 40 + transfer_func_gamma_26 41 + }; 42 + 43 + enum vrr_packet_type { 44 + packet_type_vrr, 45 + packet_type_fs1, 46 + packet_type_fs2 47 + }; 48 + 49 + #endif /* MOD_SHARED_H_ */
+54 -4
drivers/gpu/drm/amd/display/modules/info_packet/info_packet.c
··· 48 48 unsigned int i; 49 49 unsigned int pixelEncoding = 0; 50 50 unsigned int colorimetryFormat = 0; 51 + bool stereo3dSupport = false; 51 52 52 - if (stream->timing.timing_3d_format != TIMING_3D_FORMAT_NONE && stream->view_format != VIEW_3D_FORMAT_NONE) 53 + if (stream->timing.timing_3d_format != TIMING_3D_FORMAT_NONE && stream->view_format != VIEW_3D_FORMAT_NONE) { 53 54 vscPacketRevision = 1; 55 + stereo3dSupport = true; 56 + } 54 57 55 58 /*VSC packet set to 2 when DP revision >= 1.2*/ 56 59 if (stream->psr_version != 0) ··· 97 94 info_packet->hb2 = 0x01; // 01h = Revision number. VSC SDP supporting 3D stereo only 98 95 info_packet->hb3 = 0x01; // 01h = VSC SDP supporting 3D stereo only (HB2 = 01h). 99 96 100 - if (stream->timing.timing_3d_format == TIMING_3D_FORMAT_INBAND_FA) 101 - info_packet->sb[0] = 0x1; 102 - 103 97 info_packet->valid = true; 98 + } 99 + 100 + if (stereo3dSupport) { 101 + /* ==============================================================================================================| 102 + * A. STEREO 3D 103 + * ==============================================================================================================| 104 + * VSC Payload (1 byte) From DP1.2 spec 105 + * 106 + * Bits 3:0 (Stereo Interface Method Code) | Bits 7:4 (Stereo Interface Method Specific Parameter) 107 + * ----------------------------------------------------------------------------------------------------- 108 + * 0 = Non Stereo Video | Must be set to 0x0 109 + * ----------------------------------------------------------------------------------------------------- 110 + * 1 = Frame/Field Sequential | 0x0: L + R view indication based on MISC1 bit 2:1 111 + * | 0x1: Right when Stereo Signal = 1 112 + * | 0x2: Left when Stereo Signal = 1 113 + * | (others reserved) 114 + * ----------------------------------------------------------------------------------------------------- 115 + * 2 = Stacked Frame | 0x0: Left view is on top and right view on bottom 116 + * | (others reserved) 117 + * ----------------------------------------------------------------------------------------------------- 118 + * 3 = Pixel Interleaved | 0x0: horiz interleaved, right view pixels on even lines 119 + * | 0x1: horiz interleaved, right view pixels on odd lines 120 + * | 0x2: checker board, start with left view pixel 121 + * | 0x3: vertical interleaved, start with left view pixels 122 + * | 0x4: vertical interleaved, start with right view pixels 123 + * | (others reserved) 124 + * ----------------------------------------------------------------------------------------------------- 125 + * 4 = Side-by-side | 0x0: left half represents left eye view 126 + * | 0x1: left half represents right eye view 127 + */ 128 + switch (stream->timing.timing_3d_format) { 129 + case TIMING_3D_FORMAT_HW_FRAME_PACKING: 130 + case TIMING_3D_FORMAT_SW_FRAME_PACKING: 131 + case TIMING_3D_FORMAT_TOP_AND_BOTTOM: 132 + case TIMING_3D_FORMAT_TB_SW_PACKED: 133 + info_packet->sb[0] = 0x02; // Stacked Frame, Left view is on top and right view on bottom. 134 + break; 135 + case TIMING_3D_FORMAT_DP_HDMI_INBAND_FA: 136 + case TIMING_3D_FORMAT_INBAND_FA: 137 + info_packet->sb[0] = 0x01; // Frame/Field Sequential, L + R view indication based on MISC1 bit 2:1 138 + break; 139 + case TIMING_3D_FORMAT_SIDE_BY_SIDE: 140 + case TIMING_3D_FORMAT_SBS_SW_PACKED: 141 + info_packet->sb[0] = 0x04; // Side-by-side 142 + break; 143 + default: 144 + info_packet->sb[0] = 0x00; // No Stereo Video, Shall be cleared to 0x0. 145 + break; 146 + } 147 + 104 148 } 105 149 106 150 /* 05h = VSC SDP supporting 3D stereo, PSR2, and Pixel Encoding/Colorimetry Format indication.
+2 -6
drivers/gpu/drm/amd/display/modules/stats/stats.c
··· 186 186 if (mod_stats != NULL) { 187 187 struct core_stats *core_stats = MOD_STATS_TO_CORE(mod_stats); 188 188 189 - if (core_stats->time != NULL) 190 - kfree(core_stats->time); 191 - 192 - if (core_stats->events != NULL) 193 - kfree(core_stats->events); 194 - 189 + kfree(core_stats->time); 190 + kfree(core_stats->events); 195 191 kfree(core_stats); 196 192 } 197 193 }
+1
drivers/gpu/drm/amd/include/amd_shared.h
··· 109 109 #define AMD_PG_SUPPORT_GFX_PIPELINE (1 << 12) 110 110 #define AMD_PG_SUPPORT_MMHUB (1 << 13) 111 111 #define AMD_PG_SUPPORT_VCN (1 << 14) 112 + #define AMD_PG_SUPPORT_VCN_DPG (1 << 15) 112 113 113 114 enum PP_FEATURE_MASK { 114 115 PP_SCLK_DPM_MASK = 0x1,
+8
drivers/gpu/drm/amd/include/asic_reg/vcn/vcn_1_0_offset.h
··· 33 33 #define mmUVD_POWER_STATUS_BASE_IDX 1 34 34 #define mmCC_UVD_HARVESTING 0x00c7 35 35 #define mmCC_UVD_HARVESTING_BASE_IDX 1 36 + #define mmUVD_DPG_LMA_CTL 0x00d1 37 + #define mmUVD_DPG_LMA_CTL_BASE_IDX 1 38 + #define mmUVD_DPG_LMA_DATA 0x00d2 39 + #define mmUVD_DPG_LMA_DATA_BASE_IDX 1 40 + #define mmUVD_DPG_LMA_MASK 0x00d3 41 + #define mmUVD_DPG_LMA_MASK_BASE_IDX 1 42 + #define mmUVD_DPG_PAUSE 0x00d4 43 + #define mmUVD_DPG_PAUSE_BASE_IDX 1 36 44 #define mmUVD_SCRATCH1 0x00d5 37 45 #define mmUVD_SCRATCH1_BASE_IDX 1 38 46 #define mmUVD_SCRATCH2 0x00d6
+25
drivers/gpu/drm/amd/include/asic_reg/vcn/vcn_1_0_sh_mask.h
··· 87 87 //CC_UVD_HARVESTING 88 88 #define CC_UVD_HARVESTING__UVD_DISABLE__SHIFT 0x1 89 89 #define CC_UVD_HARVESTING__UVD_DISABLE_MASK 0x00000002L 90 + //UVD_DPG_LMA_CTL 91 + #define UVD_DPG_LMA_CTL__READ_WRITE__SHIFT 0x0 92 + #define UVD_DPG_LMA_CTL__MASK_EN__SHIFT 0x1 93 + #define UVD_DPG_LMA_CTL__ADDR_AUTO_INCREMENT__SHIFT 0x2 94 + #define UVD_DPG_LMA_CTL__SRAM_SEL__SHIFT 0x4 95 + #define UVD_DPG_LMA_CTL__READ_WRITE_ADDR__SHIFT 0x10 96 + #define UVD_DPG_LMA_CTL__READ_WRITE_MASK 0x00000001L 97 + #define UVD_DPG_LMA_CTL__MASK_EN_MASK 0x00000002L 98 + #define UVD_DPG_LMA_CTL__ADDR_AUTO_INCREMENT_MASK 0x00000004L 99 + #define UVD_DPG_LMA_CTL__SRAM_SEL_MASK 0x00000010L 100 + #define UVD_DPG_LMA_CTL__READ_WRITE_ADDR_MASK 0xFFFF0000L 101 + //UVD_DPG_PAUSE 102 + #define UVD_DPG_PAUSE__JPEG_PAUSE_DPG_REQ__SHIFT 0x0 103 + #define UVD_DPG_PAUSE__JPEG_PAUSE_DPG_ACK__SHIFT 0x1 104 + #define UVD_DPG_PAUSE__NJ_PAUSE_DPG_REQ__SHIFT 0x2 105 + #define UVD_DPG_PAUSE__NJ_PAUSE_DPG_ACK__SHIFT 0x3 106 + #define UVD_DPG_PAUSE__JPEG_PAUSE_DPG_REQ_MASK 0x00000001L 107 + #define UVD_DPG_PAUSE__JPEG_PAUSE_DPG_ACK_MASK 0x00000002L 108 + #define UVD_DPG_PAUSE__NJ_PAUSE_DPG_REQ_MASK 0x00000004L 109 + #define UVD_DPG_PAUSE__NJ_PAUSE_DPG_ACK_MASK 0x00000008L 90 110 //UVD_SCRATCH1 91 111 #define UVD_SCRATCH1__SCRATCH1_DATA__SHIFT 0x0 92 112 #define UVD_SCRATCH1__SCRATCH1_DATA_MASK 0xFFFFFFFFL ··· 1003 983 #define UVD_MASTINT_EN__SYS_EN_MASK 0x00000004L 1004 984 #define UVD_MASTINT_EN__INT_OVERRUN_MASK 0x007FFFF0L 1005 985 //UVD_SYS_INT_EN 986 + #define UVD_SYS_INT_EN__UVD_JRBC_EN__SHIFT 0x4 1006 987 #define UVD_SYS_INT_EN__UVD_JRBC_EN_MASK 0x00000010L 1007 988 //JPEG_CGC_CTRL 1008 989 #define JPEG_CGC_CTRL__DYN_CLOCK_MODE__SHIFT 0x0 ··· 1159 1138 #define UVD_VCPU_CACHE_SIZE2__CACHE_SIZE2_MASK 0x001FFFFFL 1160 1139 //UVD_VCPU_CNTL 1161 1140 #define UVD_VCPU_CNTL__CLK_EN__SHIFT 0x9 1141 + #define UVD_VCPU_CNTL__MIF_WR_LOW_THRESHOLD_BP__SHIFT 0x11 1142 + #define UVD_VCPU_CNTL__PRB_TIMEOUT_VAL__SHIFT 0x14 1162 1143 #define UVD_VCPU_CNTL__CLK_EN_MASK 0x00000200L 1144 + #define UVD_VCPU_CNTL__MIF_WR_LOW_THRESHOLD_BP_MASK 0x00020000L 1145 + #define UVD_VCPU_CNTL__PRB_TIMEOUT_VAL_MASK 0x0FF00000L 1163 1146 //UVD_SOFT_RESET 1164 1147 #define UVD_SOFT_RESET__RBC_SOFT_RESET__SHIFT 0x0 1165 1148 #define UVD_SOFT_RESET__LBSI_SOFT_RESET__SHIFT 0x1
+5 -5
drivers/gpu/drm/amd/include/kgd_kfd_interface.h
··· 146 146 * is reserved: (D & reserved_doorbell_mask) == reserved_doorbell_val 147 147 * 148 148 * KFD currently uses 1024 (= 0x3ff) doorbells per process. If 149 - * doorbells 0x0f0-0x0f7 and 0x2f-0x2f7 are reserved, that means 150 - * mask would be set to 0x1f8 and val set to 0x0f0. 149 + * doorbells 0x0e0-0x0ff and 0x2e0-0x2ff are reserved, that means 150 + * mask would be set to 0x1e0 and val set to 0x0e0. 151 151 */ 152 - unsigned int sdma_doorbell[2][2]; 152 + unsigned int sdma_doorbell[2][8]; 153 153 unsigned int reserved_doorbell_mask; 154 154 unsigned int reserved_doorbell_val; 155 155 ··· 409 409 struct dma_fence **ef); 410 410 void (*destroy_process_vm)(struct kgd_dev *kgd, void *vm); 411 411 void (*release_process_vm)(struct kgd_dev *kgd, void *vm); 412 - uint32_t (*get_process_page_dir)(void *vm); 412 + uint64_t (*get_process_page_dir)(void *vm); 413 413 void (*set_vm_context_page_table_base)(struct kgd_dev *kgd, 414 - uint32_t vmid, uint32_t page_table_base); 414 + uint32_t vmid, uint64_t page_table_base); 415 415 int (*alloc_memory_of_gpu)(struct kgd_dev *kgd, uint64_t va, 416 416 uint64_t size, void *vm, 417 417 struct kgd_mem **mem, uint64_t *offset,
+1
drivers/gpu/drm/amd/include/kgd_pp_interface.h
··· 113 113 AMDGPU_PP_SENSOR_GPU_POWER, 114 114 AMDGPU_PP_SENSOR_STABLE_PSTATE_SCLK, 115 115 AMDGPU_PP_SENSOR_STABLE_PSTATE_MCLK, 116 + AMDGPU_PP_SENSOR_ENABLED_SMC_FEATURES_MASK, 116 117 }; 117 118 118 119 enum amd_pp_task {
+2 -1
drivers/gpu/drm/amd/powerplay/hwmgr/ppatomfwctrl.c
··· 488 488 return 0; 489 489 } 490 490 491 - int pp_atomfwctrl_get_clk_information_by_clkid(struct pp_hwmgr *hwmgr, BIOS_CLKID id, uint32_t *frequency) 491 + int pp_atomfwctrl_get_clk_information_by_clkid(struct pp_hwmgr *hwmgr, 492 + uint8_t id, uint32_t *frequency) 492 493 { 493 494 struct amdgpu_device *adev = hwmgr->adev; 494 495 struct atom_get_smu_clock_info_parameters_v3_1 parameters;
+1 -1
drivers/gpu/drm/amd/powerplay/hwmgr/ppatomfwctrl.h
··· 236 236 int pp_atomfwctrl_get_smc_dpm_information(struct pp_hwmgr *hwmgr, 237 237 struct pp_atomfwctrl_smc_dpm_parameters *param); 238 238 int pp_atomfwctrl_get_clk_information_by_clkid(struct pp_hwmgr *hwmgr, 239 - BIOS_CLKID id, uint32_t *frequency); 239 + uint8_t id, uint32_t *frequency); 240 240 241 241 #endif 242 242
+17 -8
drivers/gpu/drm/amd/powerplay/hwmgr/smu10_hwmgr.c
··· 552 552 { 553 553 struct smu10_hwmgr *data = hwmgr->backend; 554 554 struct amdgpu_device *adev = hwmgr->adev; 555 + uint32_t min_sclk = hwmgr->display_config->min_core_set_clock; 556 + uint32_t min_mclk = hwmgr->display_config->min_mem_set_clock/100; 555 557 556 558 if (hwmgr->smu_version < 0x1E3700) { 557 559 pr_info("smu firmware version too old, can not set dpm level\n"); ··· 564 562 if ((adev->asic_type == CHIP_RAVEN) && 565 563 (adev->rev_id >= 8)) 566 564 return 0; 565 + 566 + if (min_sclk < data->gfx_min_freq_limit) 567 + min_sclk = data->gfx_min_freq_limit; 568 + 569 + min_sclk /= 100; /* transfer 10KHz to MHz */ 570 + if (min_mclk < data->clock_table.FClocks[0].Freq) 571 + min_mclk = data->clock_table.FClocks[0].Freq; 567 572 568 573 switch (level) { 569 574 case AMD_DPM_FORCED_LEVEL_HIGH: ··· 604 595 case AMD_DPM_FORCED_LEVEL_PROFILE_MIN_SCLK: 605 596 smum_send_msg_to_smc_with_parameter(hwmgr, 606 597 PPSMC_MSG_SetHardMinGfxClk, 607 - data->gfx_min_freq_limit/100); 598 + min_sclk); 608 599 smum_send_msg_to_smc_with_parameter(hwmgr, 609 600 PPSMC_MSG_SetSoftMaxGfxClk, 610 - data->gfx_min_freq_limit/100); 601 + min_sclk); 611 602 break; 612 603 case AMD_DPM_FORCED_LEVEL_PROFILE_MIN_MCLK: 613 604 smum_send_msg_to_smc_with_parameter(hwmgr, 614 605 PPSMC_MSG_SetHardMinFclkByFreq, 615 - SMU10_UMD_PSTATE_MIN_FCLK); 606 + min_mclk); 616 607 smum_send_msg_to_smc_with_parameter(hwmgr, 617 608 PPSMC_MSG_SetSoftMaxFclkByFreq, 618 - SMU10_UMD_PSTATE_MIN_FCLK); 609 + min_mclk); 619 610 break; 620 611 case AMD_DPM_FORCED_LEVEL_PROFILE_STANDARD: 621 612 smum_send_msg_to_smc_with_parameter(hwmgr, ··· 647 638 case AMD_DPM_FORCED_LEVEL_AUTO: 648 639 smum_send_msg_to_smc_with_parameter(hwmgr, 649 640 PPSMC_MSG_SetHardMinGfxClk, 650 - data->gfx_min_freq_limit/100); 641 + min_sclk); 651 642 smum_send_msg_to_smc_with_parameter(hwmgr, 652 643 PPSMC_MSG_SetHardMinFclkByFreq, 653 644 hwmgr->display_config->num_display > 3 ? 654 645 SMU10_UMD_PSTATE_PEAK_FCLK : 655 - SMU10_UMD_PSTATE_MIN_FCLK); 646 + min_mclk); 656 647 657 648 smum_send_msg_to_smc_with_parameter(hwmgr, 658 649 PPSMC_MSG_SetHardMinSocclkByFreq, ··· 683 674 data->gfx_min_freq_limit/100); 684 675 smum_send_msg_to_smc_with_parameter(hwmgr, 685 676 PPSMC_MSG_SetHardMinFclkByFreq, 686 - SMU10_UMD_PSTATE_MIN_FCLK); 677 + min_mclk); 687 678 smum_send_msg_to_smc_with_parameter(hwmgr, 688 679 PPSMC_MSG_SetSoftMaxFclkByFreq, 689 - SMU10_UMD_PSTATE_MIN_FCLK); 680 + min_mclk); 690 681 break; 691 682 case AMD_DPM_FORCED_LEVEL_MANUAL: 692 683 case AMD_DPM_FORCED_LEVEL_PROFILE_EXIT:
+16 -3
drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
··· 4106 4106 source->funcs = &smu7_irq_funcs; 4107 4107 4108 4108 amdgpu_irq_add_id((struct amdgpu_device *)(hwmgr->adev), 4109 - AMDGPU_IH_CLIENTID_LEGACY, 4109 + AMDGPU_IRQ_CLIENTID_LEGACY, 4110 4110 VISLANDS30_IV_SRCID_CG_TSS_THERMAL_LOW_TO_HIGH, 4111 4111 source); 4112 4112 amdgpu_irq_add_id((struct amdgpu_device *)(hwmgr->adev), 4113 - AMDGPU_IH_CLIENTID_LEGACY, 4113 + AMDGPU_IRQ_CLIENTID_LEGACY, 4114 4114 VISLANDS30_IV_SRCID_CG_TSS_THERMAL_HIGH_TO_LOW, 4115 4115 source); 4116 4116 4117 4117 /* Register CTF(GPIO_19) interrupt */ 4118 4118 amdgpu_irq_add_id((struct amdgpu_device *)(hwmgr->adev), 4119 - AMDGPU_IH_CLIENTID_LEGACY, 4119 + AMDGPU_IRQ_CLIENTID_LEGACY, 4120 4120 VISLANDS30_IV_SRCID_GPIO_19, 4121 4121 source); 4122 4122 ··· 5035 5035 return 0; 5036 5036 } 5037 5037 5038 + static int smu7_power_off_asic(struct pp_hwmgr *hwmgr) 5039 + { 5040 + int result; 5041 + 5042 + result = smu7_disable_dpm_tasks(hwmgr); 5043 + PP_ASSERT_WITH_CODE((0 == result), 5044 + "[disable_dpm_tasks] Failed to disable DPM!", 5045 + ); 5046 + 5047 + return result; 5048 + } 5049 + 5038 5050 static const struct pp_hwmgr_func smu7_hwmgr_funcs = { 5039 5051 .backend_init = &smu7_hwmgr_backend_init, 5040 5052 .backend_fini = &smu7_hwmgr_backend_fini, ··· 5104 5092 .get_power_profile_mode = smu7_get_power_profile_mode, 5105 5093 .set_power_profile_mode = smu7_set_power_profile_mode, 5106 5094 .get_performance_level = smu7_get_performance_level, 5095 + .power_off_asic = smu7_power_off_asic, 5107 5096 }; 5108 5097 5109 5098 uint8_t smu7_get_sleep_divider_id_from_clock(uint32_t clock,
+22 -21
drivers/gpu/drm/amd/powerplay/hwmgr/smu8_hwmgr.c
··· 880 880 smu8_update_low_mem_pstate(hwmgr, input); 881 881 882 882 return 0; 883 - }; 883 + } 884 884 885 885 886 886 static int smu8_setup_asic_task(struct pp_hwmgr *hwmgr) ··· 933 933 hw_data->cc6_settings.cpu_cc6_disable = false; 934 934 hw_data->cc6_settings.cpu_pstate_disable = false; 935 935 } 936 - 937 - static int smu8_power_off_asic(struct pp_hwmgr *hwmgr) 938 - { 939 - smu8_power_up_display_clock_sys_pll(hwmgr); 940 - smu8_clear_nb_dpm_flag(hwmgr); 941 - smu8_reset_cc6_data(hwmgr); 942 - return 0; 943 - }; 944 936 945 937 static void smu8_program_voting_clients(struct pp_hwmgr *hwmgr) 946 938 { ··· 1003 1011 data->acp_boot_level = 0xff; 1004 1012 } 1005 1013 1006 - static int smu8_disable_dpm_tasks(struct pp_hwmgr *hwmgr) 1007 - { 1008 - smu8_disable_nb_dpm(hwmgr); 1009 - 1010 - smu8_clear_voting_clients(hwmgr); 1011 - if (smu8_stop_dpm(hwmgr)) 1012 - return -EINVAL; 1013 - 1014 - return 0; 1015 - }; 1016 - 1017 1014 static int smu8_enable_dpm_tasks(struct pp_hwmgr *hwmgr) 1018 1015 { 1019 1016 smu8_program_voting_clients(hwmgr); ··· 1012 1031 smu8_reset_acp_boot_level(hwmgr); 1013 1032 1014 1033 return 0; 1015 - }; 1034 + } 1035 + 1036 + static int smu8_disable_dpm_tasks(struct pp_hwmgr *hwmgr) 1037 + { 1038 + smu8_disable_nb_dpm(hwmgr); 1039 + 1040 + smu8_clear_voting_clients(hwmgr); 1041 + if (smu8_stop_dpm(hwmgr)) 1042 + return -EINVAL; 1043 + 1044 + return 0; 1045 + } 1046 + 1047 + static int smu8_power_off_asic(struct pp_hwmgr *hwmgr) 1048 + { 1049 + smu8_disable_dpm_tasks(hwmgr); 1050 + smu8_power_up_display_clock_sys_pll(hwmgr); 1051 + smu8_clear_nb_dpm_flag(hwmgr); 1052 + smu8_reset_cc6_data(hwmgr); 1053 + return 0; 1054 + } 1016 1055 1017 1056 static int smu8_apply_state_adjust_rules(struct pp_hwmgr *hwmgr, 1018 1057 struct pp_power_state *prequest_ps,
+1 -1
drivers/gpu/drm/amd/powerplay/hwmgr/smu_helper.c
··· 545 545 uint32_t client_id = entry->client_id; 546 546 uint32_t src_id = entry->src_id; 547 547 548 - if (client_id == AMDGPU_IH_CLIENTID_LEGACY) { 548 + if (client_id == AMDGPU_IRQ_CLIENTID_LEGACY) { 549 549 if (src_id == VISLANDS30_IV_SRCID_CG_TSS_THERMAL_LOW_TO_HIGH) 550 550 pr_warn("GPU over temperature range detected on PCIe %d:%d.%d!\n", 551 551 PCI_BUS_NUM(adev->pdev->devfn),
+6 -10
drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c
··· 39 39 #include "soc15_common.h" 40 40 #include "pppcielanes.h" 41 41 #include "vega10_hwmgr.h" 42 + #include "vega10_smumgr.h" 42 43 #include "vega10_processpptables.h" 43 44 #include "vega10_pptable.h" 44 45 #include "vega10_thermal.h" ··· 3714 3713 SMUSVI0_PLANE0_CURRENTVID__CURRENT_SVI0_PLANE0_VID__SHIFT; 3715 3714 *((uint32_t *)value) = (uint32_t)convert_to_vddc((uint8_t)val_vid); 3716 3715 return 0; 3716 + case AMDGPU_PP_SENSOR_ENABLED_SMC_FEATURES_MASK: 3717 + ret = vega10_get_enabled_smc_features(hwmgr, (uint64_t *)value); 3718 + if (!ret) 3719 + *size = 8; 3720 + break; 3717 3721 default: 3718 3722 ret = -EINVAL; 3719 3723 break; ··· 4945 4939 .odn_edit_dpm_table = vega10_odn_edit_dpm_table, 4946 4940 .get_performance_level = vega10_get_performance_level, 4947 4941 }; 4948 - 4949 - int vega10_enable_smc_features(struct pp_hwmgr *hwmgr, 4950 - bool enable, uint32_t feature_mask) 4951 - { 4952 - int msg = enable ? PPSMC_MSG_EnableSmuFeatures : 4953 - PPSMC_MSG_DisableSmuFeatures; 4954 - 4955 - return smum_send_msg_to_smc_with_parameter(hwmgr, 4956 - msg, feature_mask); 4957 - } 4958 4942 4959 4943 int vega10_hwmgr_init(struct pp_hwmgr *hwmgr) 4960 4944 {
-2
drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.h
··· 441 441 int vega10_update_samu_dpm(struct pp_hwmgr *hwmgr, bool bgate); 442 442 int vega10_update_acp_dpm(struct pp_hwmgr *hwmgr, bool bgate); 443 443 int vega10_enable_disable_vce_dpm(struct pp_hwmgr *hwmgr, bool enable); 444 - int vega10_enable_smc_features(struct pp_hwmgr *hwmgr, 445 - bool enable, uint32_t feature_mask); 446 444 447 445 #endif /* _VEGA10_HWMGR_H_ */
+1
drivers/gpu/drm/amd/powerplay/hwmgr/vega10_powertune.c
··· 23 23 24 24 #include "hwmgr.h" 25 25 #include "vega10_hwmgr.h" 26 + #include "vega10_smumgr.h" 26 27 #include "vega10_powertune.h" 27 28 #include "vega10_ppsmc.h" 28 29 #include "vega10_inc.h"
+1
drivers/gpu/drm/amd/powerplay/hwmgr/vega10_thermal.c
··· 23 23 24 24 #include "vega10_thermal.h" 25 25 #include "vega10_hwmgr.h" 26 + #include "vega10_smumgr.h" 26 27 #include "vega10_ppsmc.h" 27 28 #include "vega10_inc.h" 28 29 #include "soc15_common.h"
+9 -5
drivers/gpu/drm/amd/powerplay/hwmgr/vega12_hwmgr.c
··· 745 745 746 746 memcpy(pp_table, pptable_information->smc_pptable, sizeof(PPTable_t)); 747 747 748 - result = vega12_copy_table_to_smc(hwmgr, 749 - (uint8_t *)pp_table, TABLE_PPTABLE); 748 + result = smum_smc_table_manager(hwmgr, 749 + (uint8_t *)pp_table, TABLE_PPTABLE, false); 750 750 PP_ASSERT_WITH_CODE(!result, 751 751 "Failed to upload PPtable!", return result); 752 752 ··· 1317 1317 break; 1318 1318 case AMDGPU_PP_SENSOR_GPU_POWER: 1319 1319 ret = vega12_get_gpu_power(hwmgr, (uint32_t *)value); 1320 - 1320 + break; 1321 + case AMDGPU_PP_SENSOR_ENABLED_SMC_FEATURES_MASK: 1322 + ret = vega12_get_enabled_smc_features(hwmgr, (uint64_t *)value); 1323 + if (!ret) 1324 + *size = 8; 1321 1325 break; 1322 1326 default: 1323 1327 ret = -EINVAL; ··· 2107 2103 2108 2104 if ((data->water_marks_bitmap & WaterMarksExist) && 2109 2105 !(data->water_marks_bitmap & WaterMarksLoaded)) { 2110 - result = vega12_copy_table_to_smc(hwmgr, 2111 - (uint8_t *)wm_table, TABLE_WATERMARKS); 2106 + result = smum_smc_table_manager(hwmgr, 2107 + (uint8_t *)wm_table, TABLE_WATERMARKS, false); 2112 2108 PP_ASSERT_WITH_CODE(result, "Failed to update WMTABLE!", return EINVAL); 2113 2109 data->water_marks_bitmap |= WaterMarksLoaded; 2114 2110 }
+30 -25
drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c
··· 461 461 "[GetNumOfDpmLevel] failed to get dpm levels!", 462 462 return ret); 463 463 464 - vega20_read_arg_from_smc(hwmgr, num_of_levels); 464 + *num_of_levels = smum_get_argument(hwmgr); 465 465 PP_ASSERT_WITH_CODE(*num_of_levels > 0, 466 466 "[GetNumOfDpmLevel] number of clk levels is invalid!", 467 467 return -EINVAL); ··· 481 481 "[GetDpmFreqByIndex] failed to get dpm freq by index!", 482 482 return ret); 483 483 484 - vega20_read_arg_from_smc(hwmgr, clk); 484 + *clk = smum_get_argument(hwmgr); 485 485 PP_ASSERT_WITH_CODE(*clk, 486 486 "[GetDpmFreqByIndex] clk value is invalid!", 487 487 return -EINVAL); ··· 743 743 744 744 memcpy(pp_table, pptable_information->smc_pptable, sizeof(PPTable_t)); 745 745 746 - result = vega20_copy_table_to_smc(hwmgr, 747 - (uint8_t *)pp_table, TABLE_PPTABLE); 746 + result = smum_smc_table_manager(hwmgr, 747 + (uint8_t *)pp_table, TABLE_PPTABLE, false); 748 748 PP_ASSERT_WITH_CODE(!result, 749 749 "[InitSMCTable] Failed to upload PPtable!", 750 750 return result); ··· 1044 1044 "[GetBaseVoltage] failed to get GFXCLK AVFS voltage from SMU!", 1045 1045 return ret); 1046 1046 1047 - vega20_read_arg_from_smc(hwmgr, voltage); 1047 + *voltage = smum_get_argument(hwmgr); 1048 1048 *voltage = *voltage / VOLTAGE_SCALE; 1049 1049 1050 1050 return 0; ··· 1067 1067 vega20_od8_set_feature_id(hwmgr); 1068 1068 1069 1069 /* Set default values */ 1070 - ret = vega20_copy_table_from_smc(hwmgr, (uint8_t *)od_table, TABLE_OVERDRIVE); 1070 + ret = smum_smc_table_manager(hwmgr, (uint8_t *)od_table, TABLE_OVERDRIVE, true); 1071 1071 PP_ASSERT_WITH_CODE(!ret, 1072 1072 "Failed to export over drive table!", 1073 1073 return ret); ··· 1195 1195 } 1196 1196 } 1197 1197 1198 - ret = vega20_copy_table_to_smc(hwmgr, (uint8_t *)od_table, TABLE_OVERDRIVE); 1198 + ret = smum_smc_table_manager(hwmgr, (uint8_t *)od_table, TABLE_OVERDRIVE, false); 1199 1199 PP_ASSERT_WITH_CODE(!ret, 1200 1200 "Failed to import over drive table!", 1201 1201 return ret); ··· 1214 1214 struct vega20_od8_single_setting *od8_settings = 1215 1215 data->od8_settings.od8_settings_array; 1216 1216 1217 - ret = vega20_copy_table_from_smc(hwmgr, (uint8_t *)(&od_table), TABLE_OVERDRIVE); 1217 + ret = smum_smc_table_manager(hwmgr, (uint8_t *)(&od_table), TABLE_OVERDRIVE, true); 1218 1218 PP_ASSERT_WITH_CODE(!ret, 1219 1219 "Failed to export over drive table!", 1220 1220 return ret); ··· 1271 1271 break; 1272 1272 } 1273 1273 1274 - ret = vega20_copy_table_to_smc(hwmgr, (uint8_t *)(&od_table), TABLE_OVERDRIVE); 1274 + ret = smum_smc_table_manager(hwmgr, (uint8_t *)(&od_table), TABLE_OVERDRIVE, false); 1275 1275 PP_ASSERT_WITH_CODE(!ret, 1276 1276 "Failed to import over drive table!", 1277 1277 return ret); ··· 1401 1401 (clock_select << 16))) == 0, 1402 1402 "[GetMaxSustainableClock] Failed to get max DC clock from SMC!", 1403 1403 return ret); 1404 - vega20_read_arg_from_smc(hwmgr, clock); 1404 + *clock = smum_get_argument(hwmgr); 1405 1405 1406 1406 /* if DC limit is zero, return AC limit */ 1407 1407 if (*clock == 0) { ··· 1410 1410 (clock_select << 16))) == 0, 1411 1411 "[GetMaxSustainableClock] failed to get max AC clock from SMC!", 1412 1412 return ret); 1413 - vega20_read_arg_from_smc(hwmgr, clock); 1413 + *clock = smum_get_argument(hwmgr); 1414 1414 } 1415 1415 1416 1416 return 0; ··· 1770 1770 PPSMC_MSG_GetMaxDpmFreq, (clock_select << 16))) == 0, 1771 1771 "[GetClockRanges] Failed to get max clock from SMC!", 1772 1772 return ret); 1773 - vega20_read_arg_from_smc(hwmgr, clock); 1773 + *clock = smum_get_argument(hwmgr); 1774 1774 } else { 1775 1775 PP_ASSERT_WITH_CODE((ret = smum_send_msg_to_smc_with_parameter(hwmgr, 1776 1776 PPSMC_MSG_GetMinDpmFreq, 1777 1777 (clock_select << 16))) == 0, 1778 1778 "[GetClockRanges] Failed to get min clock from SMC!", 1779 1779 return ret); 1780 - vega20_read_arg_from_smc(hwmgr, clock); 1780 + *clock = smum_get_argument(hwmgr); 1781 1781 } 1782 1782 1783 1783 return 0; ··· 1841 1841 int ret = 0; 1842 1842 SmuMetrics_t metrics_table; 1843 1843 1844 - ret = vega20_copy_table_from_smc(hwmgr, (uint8_t *)&metrics_table, TABLE_SMU_METRICS); 1844 + ret = smum_smc_table_manager(hwmgr, (uint8_t *)&metrics_table, TABLE_SMU_METRICS, true); 1845 1845 PP_ASSERT_WITH_CODE(!ret, 1846 1846 "Failed to export SMU METRICS table!", 1847 1847 return ret); ··· 1862 1862 PPSMC_MSG_GetDpmClockFreq, (PPCLK_GFXCLK << 16))) == 0, 1863 1863 "[GetCurrentGfxClkFreq] Attempt to get Current GFXCLK Frequency Failed!", 1864 1864 return ret); 1865 - vega20_read_arg_from_smc(hwmgr, &gfx_clk); 1865 + gfx_clk = smum_get_argument(hwmgr); 1866 1866 1867 1867 *gfx_freq = gfx_clk * 100; 1868 1868 ··· 1880 1880 PPSMC_MSG_GetDpmClockFreq, (PPCLK_UCLK << 16))) == 0, 1881 1881 "[GetCurrentMClkFreq] Attempt to get Current MCLK Frequency Failed!", 1882 1882 return ret); 1883 - vega20_read_arg_from_smc(hwmgr, &mem_clk); 1883 + mem_clk = smum_get_argument(hwmgr); 1884 1884 1885 1885 *mclk_freq = mem_clk * 100; 1886 1886 ··· 1893 1893 int ret = 0; 1894 1894 SmuMetrics_t metrics_table; 1895 1895 1896 - ret = vega20_copy_table_from_smc(hwmgr, (uint8_t *)&metrics_table, TABLE_SMU_METRICS); 1896 + ret = smum_smc_table_manager(hwmgr, (uint8_t *)&metrics_table, TABLE_SMU_METRICS, true); 1897 1897 PP_ASSERT_WITH_CODE(!ret, 1898 1898 "Failed to export SMU METRICS table!", 1899 1899 return ret); ··· 1940 1940 case AMDGPU_PP_SENSOR_GPU_POWER: 1941 1941 *size = 16; 1942 1942 ret = vega20_get_gpu_power(hwmgr, (uint32_t *)value); 1943 + break; 1944 + case AMDGPU_PP_SENSOR_ENABLED_SMC_FEATURES_MASK: 1945 + ret = vega20_get_enabled_smc_features(hwmgr, (uint64_t *)value); 1946 + if (!ret) 1947 + *size = 8; 1943 1948 break; 1944 1949 default: 1945 1950 ret = -EINVAL; ··· 2617 2612 data->gfxclk_overdrive = false; 2618 2613 data->memclk_overdrive = false; 2619 2614 2620 - ret = vega20_copy_table_from_smc(hwmgr, 2621 - (uint8_t *)od_table, 2622 - TABLE_OVERDRIVE); 2615 + ret = smum_smc_table_manager(hwmgr, 2616 + (uint8_t *)od_table, 2617 + TABLE_OVERDRIVE, true); 2623 2618 PP_ASSERT_WITH_CODE(!ret, 2624 2619 "Failed to export overdrive table!", 2625 2620 return ret); 2626 2621 break; 2627 2622 2628 2623 case PP_OD_COMMIT_DPM_TABLE: 2629 - ret = vega20_copy_table_to_smc(hwmgr, 2630 - (uint8_t *)od_table, 2631 - TABLE_OVERDRIVE); 2624 + ret = smum_smc_table_manager(hwmgr, 2625 + (uint8_t *)od_table, 2626 + TABLE_OVERDRIVE, false); 2632 2627 PP_ASSERT_WITH_CODE(!ret, 2633 2628 "Failed to import overdrive table!", 2634 2629 return ret); ··· 2852 2847 2853 2848 if ((data->water_marks_bitmap & WaterMarksExist) && 2854 2849 !(data->water_marks_bitmap & WaterMarksLoaded)) { 2855 - result = vega20_copy_table_to_smc(hwmgr, 2856 - (uint8_t *)wm_table, TABLE_WATERMARKS); 2850 + result = smum_smc_table_manager(hwmgr, 2851 + (uint8_t *)wm_table, TABLE_WATERMARKS, false); 2857 2852 PP_ASSERT_WITH_CODE(!result, 2858 2853 "Failed to update WMTABLE!", 2859 2854 return result);
+1 -4
drivers/gpu/drm/amd/powerplay/hwmgr/vega20_thermal.c
··· 37 37 PPSMC_MSG_GetCurrentRpm)) == 0, 38 38 "Attempt to get current RPM from SMC Failed!", 39 39 return ret); 40 - PP_ASSERT_WITH_CODE((ret = vega20_read_arg_from_smc(hwmgr, 41 - current_rpm)) == 0, 42 - "Attempt to read current RPM from SMC Failed!", 43 - return ret); 40 + *current_rpm = smum_get_argument(hwmgr); 44 41 45 42 return 0; 46 43 }
+6 -4
drivers/gpu/drm/amd/powerplay/smumgr/smu8_smumgr.c
··· 724 724 if (hwmgr->chip_id == CHIP_STONEY) 725 725 fw_to_check &= ~(UCODE_ID_SDMA1_MASK | UCODE_ID_CP_MEC_JT2_MASK); 726 726 727 - ret = smu8_request_smu_load_fw(hwmgr); 728 - if (ret) 729 - pr_err("SMU firmware load failed\n"); 727 + smu8_request_smu_load_fw(hwmgr); 730 728 731 - smu8_check_fw_load_finish(hwmgr, fw_to_check); 729 + ret = smu8_check_fw_load_finish(hwmgr, fw_to_check); 730 + if (ret) { 731 + pr_err("SMU firmware load failed\n"); 732 + return ret; 733 + } 732 734 733 735 ret = smu8_load_mec_firmware(hwmgr); 734 736 if (ret)
+14 -4
drivers/gpu/drm/amd/powerplay/smumgr/vega10_smumgr.c
··· 88 88 return 0; 89 89 } 90 90 91 - static int vega10_get_smc_features(struct pp_hwmgr *hwmgr, 92 - uint32_t *features_enabled) 91 + int vega10_enable_smc_features(struct pp_hwmgr *hwmgr, 92 + bool enable, uint32_t feature_mask) 93 + { 94 + int msg = enable ? PPSMC_MSG_EnableSmuFeatures : 95 + PPSMC_MSG_DisableSmuFeatures; 96 + 97 + return smum_send_msg_to_smc_with_parameter(hwmgr, 98 + msg, feature_mask); 99 + } 100 + 101 + int vega10_get_enabled_smc_features(struct pp_hwmgr *hwmgr, 102 + uint64_t *features_enabled) 93 103 { 94 104 if (features_enabled == NULL) 95 105 return -EINVAL; ··· 112 102 113 103 static bool vega10_is_dpm_running(struct pp_hwmgr *hwmgr) 114 104 { 115 - uint32_t features_enabled = 0; 105 + uint64_t features_enabled = 0; 116 106 117 - vega10_get_smc_features(hwmgr, &features_enabled); 107 + vega10_get_enabled_smc_features(hwmgr, &features_enabled); 118 108 119 109 if (features_enabled & SMC_DPM_FEATURES) 120 110 return true;
+4
drivers/gpu/drm/amd/powerplay/smumgr/vega10_smumgr.h
··· 42 42 struct smu_table_array smu_tables; 43 43 }; 44 44 45 + int vega10_enable_smc_features(struct pp_hwmgr *hwmgr, 46 + bool enable, uint32_t feature_mask); 47 + int vega10_get_enabled_smc_features(struct pp_hwmgr *hwmgr, 48 + uint64_t *features_enabled); 45 49 46 50 #endif 47 51
+18 -4
drivers/gpu/drm/amd/powerplay/smumgr/vega12_smumgr.c
··· 37 37 * @param hwmgr the address of the HW manager 38 38 * @param table_id the driver's table ID to copy from 39 39 */ 40 - int vega12_copy_table_from_smc(struct pp_hwmgr *hwmgr, 41 - uint8_t *table, int16_t table_id) 40 + static int vega12_copy_table_from_smc(struct pp_hwmgr *hwmgr, 41 + uint8_t *table, int16_t table_id) 42 42 { 43 43 struct vega12_smumgr *priv = 44 44 (struct vega12_smumgr *)(hwmgr->smu_backend); ··· 75 75 * @param hwmgr the address of the HW manager 76 76 * @param table_id the table to copy from 77 77 */ 78 - int vega12_copy_table_to_smc(struct pp_hwmgr *hwmgr, 79 - uint8_t *table, int16_t table_id) 78 + static int vega12_copy_table_to_smc(struct pp_hwmgr *hwmgr, 79 + uint8_t *table, int16_t table_id) 80 80 { 81 81 struct vega12_smumgr *priv = 82 82 (struct vega12_smumgr *)(hwmgr->smu_backend); ··· 351 351 return 0; 352 352 } 353 353 354 + static int vega12_smc_table_manager(struct pp_hwmgr *hwmgr, uint8_t *table, 355 + uint16_t table_id, bool rw) 356 + { 357 + int ret; 358 + 359 + if (rw) 360 + ret = vega12_copy_table_from_smc(hwmgr, table, table_id); 361 + else 362 + ret = vega12_copy_table_to_smc(hwmgr, table, table_id); 363 + 364 + return ret; 365 + } 366 + 354 367 const struct pp_smumgr_func vega12_smu_funcs = { 355 368 .smu_init = &vega12_smu_init, 356 369 .smu_fini = &vega12_smu_fini, ··· 375 362 .upload_pptable_settings = NULL, 376 363 .is_dpm_running = vega12_is_dpm_running, 377 364 .get_argument = smu9_get_argument, 365 + .smc_table_manager = vega12_smc_table_manager, 378 366 };
-4
drivers/gpu/drm/amd/powerplay/smumgr/vega12_smumgr.h
··· 48 48 #define SMU_FEATURES_HIGH_MASK 0xFFFFFFFF00000000 49 49 #define SMU_FEATURES_HIGH_SHIFT 32 50 50 51 - int vega12_copy_table_from_smc(struct pp_hwmgr *hwmgr, 52 - uint8_t *table, int16_t table_id); 53 - int vega12_copy_table_to_smc(struct pp_hwmgr *hwmgr, 54 - uint8_t *table, int16_t table_id); 55 51 int vega12_enable_smc_features(struct pp_hwmgr *hwmgr, 56 52 bool enable, uint64_t feature_mask); 57 53 int vega12_get_enabled_smc_features(struct pp_hwmgr *hwmgr,
+23 -22
drivers/gpu/drm/amd/powerplay/smumgr/vega20_smumgr.c
··· 148 148 return (ret == PPSMC_Result_OK) ? 0 : -EIO; 149 149 } 150 150 151 - /* 152 - * Retrieve an argument from SMC. 153 - * @param hwmgr the address of the powerplay hardware manager. 154 - * @param arg pointer to store the argument from SMC. 155 - * @return Always return 0. 156 - */ 157 - int vega20_read_arg_from_smc(struct pp_hwmgr *hwmgr, uint32_t *arg) 151 + static uint32_t vega20_get_argument(struct pp_hwmgr *hwmgr) 158 152 { 159 153 struct amdgpu_device *adev = hwmgr->adev; 160 154 161 - *arg = RREG32_SOC15(MP1, 0, mmMP1_SMN_C2PMSG_82); 162 - 163 - return 0; 155 + return RREG32_SOC15(MP1, 0, mmMP1_SMN_C2PMSG_82); 164 156 } 165 157 166 158 /* ··· 160 168 * @param hwmgr the address of the HW manager 161 169 * @param table_id the driver's table ID to copy from 162 170 */ 163 - int vega20_copy_table_from_smc(struct pp_hwmgr *hwmgr, 164 - uint8_t *table, int16_t table_id) 171 + static int vega20_copy_table_from_smc(struct pp_hwmgr *hwmgr, 172 + uint8_t *table, int16_t table_id) 165 173 { 166 174 struct vega20_smumgr *priv = 167 175 (struct vega20_smumgr *)(hwmgr->smu_backend); ··· 200 208 * @param hwmgr the address of the HW manager 201 209 * @param table_id the table to copy from 202 210 */ 203 - int vega20_copy_table_to_smc(struct pp_hwmgr *hwmgr, 204 - uint8_t *table, int16_t table_id) 211 + static int vega20_copy_table_to_smc(struct pp_hwmgr *hwmgr, 212 + uint8_t *table, int16_t table_id) 205 213 { 206 214 struct vega20_smumgr *priv = 207 215 (struct vega20_smumgr *)(hwmgr->smu_backend); ··· 337 345 PPSMC_MSG_GetEnabledSmuFeaturesLow)) == 0, 338 346 "[GetEnabledSMCFeatures] Attemp to get SMU features Low failed!", 339 347 return ret); 340 - PP_ASSERT_WITH_CODE((ret = vega20_read_arg_from_smc(hwmgr, 341 - &smc_features_low)) == 0, 342 - "[GetEnabledSMCFeatures] Attemp to read SMU features Low argument failed!", 343 - return ret); 348 + smc_features_low = vega20_get_argument(hwmgr); 344 349 PP_ASSERT_WITH_CODE((ret = vega20_send_msg_to_smc(hwmgr, 345 350 PPSMC_MSG_GetEnabledSmuFeaturesHigh)) == 0, 346 351 "[GetEnabledSMCFeatures] Attemp to get SMU features High failed!", 347 352 return ret); 348 - PP_ASSERT_WITH_CODE((ret = vega20_read_arg_from_smc(hwmgr, 349 - &smc_features_high)) == 0, 350 - "[GetEnabledSMCFeatures] Attemp to read SMU features High argument failed!", 351 - return ret); 353 + smc_features_high = vega20_get_argument(hwmgr); 352 354 353 355 *features_enabled = ((((uint64_t)smc_features_low << SMU_FEATURES_LOW_SHIFT) & SMU_FEATURES_LOW_MASK) | 354 356 (((uint64_t)smc_features_high << SMU_FEATURES_HIGH_SHIFT) & SMU_FEATURES_HIGH_MASK)); ··· 560 574 return false; 561 575 } 562 576 577 + static int vega20_smc_table_manager(struct pp_hwmgr *hwmgr, uint8_t *table, 578 + uint16_t table_id, bool rw) 579 + { 580 + int ret; 581 + 582 + if (rw) 583 + ret = vega20_copy_table_from_smc(hwmgr, table, table_id); 584 + else 585 + ret = vega20_copy_table_to_smc(hwmgr, table, table_id); 586 + 587 + return ret; 588 + } 589 + 563 590 const struct pp_smumgr_func vega20_smu_funcs = { 564 591 .smu_init = &vega20_smu_init, 565 592 .smu_fini = &vega20_smu_fini, ··· 583 584 .download_pptable_settings = NULL, 584 585 .upload_pptable_settings = NULL, 585 586 .is_dpm_running = vega20_is_dpm_running, 587 + .get_argument = vega20_get_argument, 588 + .smc_table_manager = vega20_smc_table_manager, 586 589 };
-5
drivers/gpu/drm/amd/powerplay/smumgr/vega20_smumgr.h
··· 47 47 #define SMU_FEATURES_HIGH_MASK 0xFFFFFFFF00000000 48 48 #define SMU_FEATURES_HIGH_SHIFT 32 49 49 50 - int vega20_read_arg_from_smc(struct pp_hwmgr *hwmgr, uint32_t *arg); 51 - int vega20_copy_table_from_smc(struct pp_hwmgr *hwmgr, 52 - uint8_t *table, int16_t table_id); 53 - int vega20_copy_table_to_smc(struct pp_hwmgr *hwmgr, 54 - uint8_t *table, int16_t table_id); 55 50 int vega20_enable_smc_features(struct pp_hwmgr *hwmgr, 56 51 bool enable, uint64_t feature_mask); 57 52 int vega20_get_enabled_smc_features(struct pp_hwmgr *hwmgr,
+1 -1
drivers/gpu/drm/etnaviv/etnaviv_sched.c
··· 105 105 change = dma_addr - gpu->hangcheck_dma_addr; 106 106 if (change < 0 || change > 16) { 107 107 gpu->hangcheck_dma_addr = dma_addr; 108 - schedule_delayed_work(&sched_job->work_tdr, 108 + schedule_delayed_work(&sched_job->sched->work_tdr, 109 109 sched_job->sched->timeout); 110 110 return; 111 111 }
+16 -15
drivers/gpu/drm/scheduler/sched_main.c
··· 197 197 * manages to find this job as the next job in the list, the fence 198 198 * signaled check below will prevent the timeout to be restarted. 199 199 */ 200 - cancel_delayed_work_sync(&s_job->work_tdr); 200 + cancel_delayed_work_sync(&sched->work_tdr); 201 201 202 202 spin_lock(&sched->job_list_lock); 203 - /* queue TDR for next job */ 204 - if (sched->timeout != MAX_SCHEDULE_TIMEOUT && 205 - !list_is_last(&s_job->node, &sched->ring_mirror_list)) { 206 - struct drm_sched_job *next = list_next_entry(s_job, node); 207 - 208 - if (!dma_fence_is_signaled(&next->s_fence->finished)) 209 - schedule_delayed_work(&next->work_tdr, sched->timeout); 210 - } 211 203 /* remove job from ring_mirror_list */ 212 204 list_del(&s_job->node); 205 + /* queue TDR for next job */ 206 + if (sched->timeout != MAX_SCHEDULE_TIMEOUT && 207 + !list_empty(&sched->ring_mirror_list)) 208 + schedule_delayed_work(&sched->work_tdr, sched->timeout); 213 209 spin_unlock(&sched->job_list_lock); 214 210 215 211 dma_fence_put(&s_job->s_fence->finished); ··· 232 236 if (sched->timeout != MAX_SCHEDULE_TIMEOUT && 233 237 list_first_entry_or_null(&sched->ring_mirror_list, 234 238 struct drm_sched_job, node) == s_job) 235 - schedule_delayed_work(&s_job->work_tdr, sched->timeout); 239 + schedule_delayed_work(&sched->work_tdr, sched->timeout); 236 240 spin_unlock(&sched->job_list_lock); 237 241 } 238 242 239 243 static void drm_sched_job_timedout(struct work_struct *work) 240 244 { 241 - struct drm_sched_job *job = container_of(work, struct drm_sched_job, 242 - work_tdr.work); 245 + struct drm_gpu_scheduler *sched; 246 + struct drm_sched_job *job; 243 247 244 - job->sched->ops->timedout_job(job); 248 + sched = container_of(work, struct drm_gpu_scheduler, work_tdr.work); 249 + job = list_first_entry_or_null(&sched->ring_mirror_list, 250 + struct drm_sched_job, node); 251 + 252 + if (job) 253 + job->sched->ops->timedout_job(job); 245 254 } 246 255 247 256 /** ··· 316 315 s_job = list_first_entry_or_null(&sched->ring_mirror_list, 317 316 struct drm_sched_job, node); 318 317 if (s_job && sched->timeout != MAX_SCHEDULE_TIMEOUT) 319 - schedule_delayed_work(&s_job->work_tdr, sched->timeout); 318 + schedule_delayed_work(&sched->work_tdr, sched->timeout); 320 319 321 320 list_for_each_entry_safe(s_job, tmp, &sched->ring_mirror_list, node) { 322 321 struct drm_sched_fence *s_fence = s_job->s_fence; ··· 385 384 386 385 INIT_WORK(&job->finish_work, drm_sched_job_finish); 387 386 INIT_LIST_HEAD(&job->node); 388 - INIT_DELAYED_WORK(&job->work_tdr, drm_sched_job_timedout); 389 387 390 388 return 0; 391 389 } ··· 575 575 INIT_LIST_HEAD(&sched->ring_mirror_list); 576 576 spin_lock_init(&sched->job_list_lock); 577 577 atomic_set(&sched->hw_rq_count, 0); 578 + INIT_DELAYED_WORK(&sched->work_tdr, drm_sched_job_timedout); 578 579 atomic_set(&sched->num_jobs, 0); 579 580 atomic64_set(&sched->job_id_count, 0); 580 581
+1 -1
drivers/gpu/drm/v3d/v3d_sched.c
··· 168 168 job->timedout_ctca = ctca; 169 169 job->timedout_ctra = ctra; 170 170 171 - schedule_delayed_work(&job->base.work_tdr, 171 + schedule_delayed_work(&job->base.sched->work_tdr, 172 172 job->base.sched->timeout); 173 173 return; 174 174 }
+3 -3
include/drm/gpu_scheduler.h
··· 175 175 * finished to remove the job from the 176 176 * @drm_gpu_scheduler.ring_mirror_list. 177 177 * @node: used to append this struct to the @drm_gpu_scheduler.ring_mirror_list. 178 - * @work_tdr: schedules a delayed call to @drm_sched_job_timedout after the timeout 179 - * interval is over. 180 178 * @id: a unique id assigned to each job scheduled on the scheduler. 181 179 * @karma: increment on every hang caused by this job. If this exceeds the hang 182 180 * limit of the scheduler then the job is marked guilty and will not ··· 193 195 struct dma_fence_cb finish_cb; 194 196 struct work_struct finish_work; 195 197 struct list_head node; 196 - struct delayed_work work_tdr; 197 198 uint64_t id; 198 199 atomic_t karma; 199 200 enum drm_sched_priority s_priority; ··· 256 259 * finished. 257 260 * @hw_rq_count: the number of jobs currently in the hardware queue. 258 261 * @job_id_count: used to assign unique id to the each job. 262 + * @work_tdr: schedules a delayed call to @drm_sched_job_timedout after the 263 + * timeout interval is over. 259 264 * @thread: the kthread on which the scheduler which run. 260 265 * @ring_mirror_list: the list of jobs which are currently in the job queue. 261 266 * @job_list_lock: lock to protect the ring_mirror_list. ··· 277 278 wait_queue_head_t job_scheduled; 278 279 atomic_t hw_rq_count; 279 280 atomic64_t job_id_count; 281 + struct delayed_work work_tdr; 280 282 struct task_struct *thread; 281 283 struct list_head ring_mirror_list; 282 284 spinlock_t job_list_lock;
+12 -1
include/uapi/linux/kfd_ioctl.h
··· 82 82 __u64 cu_mask_ptr; /* to KFD */ 83 83 }; 84 84 85 + struct kfd_ioctl_get_queue_wave_state_args { 86 + uint64_t ctl_stack_address; /* to KFD */ 87 + uint32_t ctl_stack_used_size; /* from KFD */ 88 + uint32_t save_area_used_size; /* from KFD */ 89 + uint32_t queue_id; /* to KFD */ 90 + uint32_t pad; 91 + }; 92 + 85 93 /* For kfd_ioctl_set_memory_policy_args.default_policy and alternate_policy */ 86 94 #define KFD_IOC_CACHE_POLICY_COHERENT 0 87 95 #define KFD_IOC_CACHE_POLICY_NONCOHERENT 1 ··· 483 475 #define AMDKFD_IOC_SET_CU_MASK \ 484 476 AMDKFD_IOW(0x1A, struct kfd_ioctl_set_cu_mask_args) 485 477 478 + #define AMDKFD_IOC_GET_QUEUE_WAVE_STATE \ 479 + AMDKFD_IOWR(0x1B, struct kfd_ioctl_get_queue_wave_state_args) 480 + 486 481 #define AMDKFD_COMMAND_START 0x01 487 - #define AMDKFD_COMMAND_END 0x1B 482 + #define AMDKFD_COMMAND_END 0x1C 488 483 489 484 #endif