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

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

radeon and amdgpu fixes for 4.3. It's a bit bigger than usual since
it's 3 weeks worth of fixes since I was on vacation, then at XDC.
- lots of stability fixes
- suspend and resume fixes
- GPU scheduler fixes
- Misc other fixes

* 'drm-fixes-4.3' of git://people.freedesktop.org/~agd5f/linux: (31 commits)
drm/radeon: add quirk for MSI R7 370
drm/amdgpu: Sprinkle drm_modeset_lock_all to appease locking checks
drm/radeon: Sprinkle drm_modeset_lock_all to appease locking checks
drm/amdgpu: sync ce and me with SWITCH_BUFFER(2)
drm/amdgpu: integer overflow in amdgpu_mode_dumb_create()
drm/amdgpu: info leak in amdgpu_gem_metadata_ioctl()
drm/amdgpu: integer overflow in amdgpu_info_ioctl()
drm/amdgpu: unwind properly in amdgpu_cs_parser_init()
drm/amdgpu: Fix max_vblank_count value for current display engines
drm/amdgpu: use kmemdup rather than duplicating its implementation
drm/amdgpu: fix UVD suspend and resume for VI APU
drm/amdgpu: fix the UVD suspend sequence order
drm/amdgpu: make UVD handle checking more strict
drm/amdgpu: Disable UVD PG
drm/amdgpu: more scheduler cleanups v2
drm/amdgpu: cleanup fence queue init v2
drm/amdgpu: rename fence->scheduler to sched v2
drm/amdgpu: cleanup entity init
drm/amdgpu: refine the scheduler job type conversion
drm/amdgpu: refine the job naming for amdgpu_job and amdgpu_sched_job
...

+536 -468
+6 -5
drivers/gpu/drm/amd/amdgpu/amdgpu.h
··· 82 82 extern int amdgpu_enable_scheduler; 83 83 extern int amdgpu_sched_jobs; 84 84 extern int amdgpu_sched_hw_submission; 85 + extern int amdgpu_enable_semaphores; 85 86 86 87 #define AMDGPU_WAIT_IDLE_TIMEOUT_IN_MS 3000 87 88 #define AMDGPU_MAX_USEC_TIMEOUT 100000 /* 100 ms */ ··· 433 432 void amdgpu_fence_driver_fini(struct amdgpu_device *adev); 434 433 void amdgpu_fence_driver_force_completion(struct amdgpu_device *adev); 435 434 436 - void amdgpu_fence_driver_init_ring(struct amdgpu_ring *ring); 435 + int amdgpu_fence_driver_init_ring(struct amdgpu_ring *ring); 437 436 int amdgpu_fence_driver_start_ring(struct amdgpu_ring *ring, 438 437 struct amdgpu_irq_src *irq_src, 439 438 unsigned irq_type); ··· 891 890 struct amdgpu_device *adev; 892 891 const struct amdgpu_ring_funcs *funcs; 893 892 struct amdgpu_fence_driver fence_drv; 894 - struct amd_gpu_scheduler *scheduler; 893 + struct amd_gpu_scheduler sched; 895 894 896 895 spinlock_t fence_lock; 897 896 struct mutex *ring_lock; ··· 1202 1201 struct amdgpu_irq_src priv_inst_irq; 1203 1202 /* gfx status */ 1204 1203 uint32_t gfx_current_status; 1205 - /* sync signal for const engine */ 1206 - unsigned ce_sync_offs; 1207 1204 /* ce ram size*/ 1208 1205 unsigned ce_ram_size; 1209 1206 }; ··· 1273 1274 uint32_t num_ibs; 1274 1275 struct mutex job_lock; 1275 1276 struct amdgpu_user_fence uf; 1276 - int (*free_job)(struct amdgpu_job *sched_job); 1277 + int (*free_job)(struct amdgpu_job *job); 1277 1278 }; 1279 + #define to_amdgpu_job(sched_job) \ 1280 + container_of((sched_job), struct amdgpu_job, base) 1278 1281 1279 1282 static inline u32 amdgpu_get_ib_value(struct amdgpu_cs_parser *p, uint32_t ib_idx, int idx) 1280 1283 {
+1 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
··· 183 183 return -ENOMEM; 184 184 185 185 r = amdgpu_bo_create(rdev, size, PAGE_SIZE, true, AMDGPU_GEM_DOMAIN_GTT, 186 - AMDGPU_GEM_CREATE_CPU_GTT_USWC, NULL, &(*mem)->bo); 186 + AMDGPU_GEM_CREATE_CPU_GTT_USWC, NULL, NULL, &(*mem)->bo); 187 187 if (r) { 188 188 dev_err(rdev->dev, 189 189 "failed to allocate BO for amdkfd (%d)\n", r);
+4 -2
drivers/gpu/drm/amd/amdgpu/amdgpu_benchmark.c
··· 79 79 int time; 80 80 81 81 n = AMDGPU_BENCHMARK_ITERATIONS; 82 - r = amdgpu_bo_create(adev, size, PAGE_SIZE, true, sdomain, 0, NULL, &sobj); 82 + r = amdgpu_bo_create(adev, size, PAGE_SIZE, true, sdomain, 0, NULL, 83 + NULL, &sobj); 83 84 if (r) { 84 85 goto out_cleanup; 85 86 } ··· 92 91 if (r) { 93 92 goto out_cleanup; 94 93 } 95 - r = amdgpu_bo_create(adev, size, PAGE_SIZE, true, ddomain, 0, NULL, &dobj); 94 + r = amdgpu_bo_create(adev, size, PAGE_SIZE, true, ddomain, 0, NULL, 95 + NULL, &dobj); 96 96 if (r) { 97 97 goto out_cleanup; 98 98 }
+3 -2
drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c
··· 86 86 87 87 struct sg_table *sg = drm_prime_pages_to_sg(&kmem_page, npages); 88 88 ret = amdgpu_bo_create(adev, size, PAGE_SIZE, false, 89 - AMDGPU_GEM_DOMAIN_GTT, 0, sg, &bo); 89 + AMDGPU_GEM_DOMAIN_GTT, 0, sg, NULL, &bo); 90 90 if (ret) 91 91 return ret; 92 92 ret = amdgpu_bo_reserve(bo, false); ··· 197 197 198 198 ret = amdgpu_bo_create_restricted(adev, size, PAGE_SIZE, 199 199 true, domain, flags, 200 - NULL, &placement, &obj); 200 + NULL, &placement, NULL, 201 + &obj); 201 202 if (ret) { 202 203 DRM_ERROR("(%d) bo create failed\n", ret); 203 204 return ret;
+80 -57
drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
··· 154 154 { 155 155 union drm_amdgpu_cs *cs = data; 156 156 uint64_t *chunk_array_user; 157 - uint64_t *chunk_array = NULL; 157 + uint64_t *chunk_array; 158 158 struct amdgpu_fpriv *fpriv = p->filp->driver_priv; 159 159 unsigned size, i; 160 - int r = 0; 160 + int ret; 161 161 162 - if (!cs->in.num_chunks) 163 - goto out; 162 + if (cs->in.num_chunks == 0) 163 + return 0; 164 + 165 + chunk_array = kmalloc_array(cs->in.num_chunks, sizeof(uint64_t), GFP_KERNEL); 166 + if (!chunk_array) 167 + return -ENOMEM; 164 168 165 169 p->ctx = amdgpu_ctx_get(fpriv, cs->in.ctx_id); 166 170 if (!p->ctx) { 167 - r = -EINVAL; 168 - goto out; 171 + ret = -EINVAL; 172 + goto free_chunk; 169 173 } 174 + 170 175 p->bo_list = amdgpu_bo_list_get(fpriv, cs->in.bo_list_handle); 171 176 172 177 /* get chunks */ 173 178 INIT_LIST_HEAD(&p->validated); 174 - chunk_array = kmalloc_array(cs->in.num_chunks, sizeof(uint64_t), GFP_KERNEL); 175 - if (chunk_array == NULL) { 176 - r = -ENOMEM; 177 - goto out; 178 - } 179 - 180 179 chunk_array_user = (uint64_t __user *)(cs->in.chunks); 181 180 if (copy_from_user(chunk_array, chunk_array_user, 182 181 sizeof(uint64_t)*cs->in.num_chunks)) { 183 - r = -EFAULT; 184 - goto out; 182 + ret = -EFAULT; 183 + goto put_bo_list; 185 184 } 186 185 187 186 p->nchunks = cs->in.num_chunks; 188 187 p->chunks = kmalloc_array(p->nchunks, sizeof(struct amdgpu_cs_chunk), 189 188 GFP_KERNEL); 190 - if (p->chunks == NULL) { 191 - r = -ENOMEM; 192 - goto out; 189 + if (!p->chunks) { 190 + ret = -ENOMEM; 191 + goto put_bo_list; 193 192 } 194 193 195 194 for (i = 0; i < p->nchunks; i++) { ··· 199 200 chunk_ptr = (void __user *)chunk_array[i]; 200 201 if (copy_from_user(&user_chunk, chunk_ptr, 201 202 sizeof(struct drm_amdgpu_cs_chunk))) { 202 - r = -EFAULT; 203 - goto out; 203 + ret = -EFAULT; 204 + i--; 205 + goto free_partial_kdata; 204 206 } 205 207 p->chunks[i].chunk_id = user_chunk.chunk_id; 206 208 p->chunks[i].length_dw = user_chunk.length_dw; ··· 212 212 213 213 p->chunks[i].kdata = drm_malloc_ab(size, sizeof(uint32_t)); 214 214 if (p->chunks[i].kdata == NULL) { 215 - r = -ENOMEM; 216 - goto out; 215 + ret = -ENOMEM; 216 + i--; 217 + goto free_partial_kdata; 217 218 } 218 219 size *= sizeof(uint32_t); 219 220 if (copy_from_user(p->chunks[i].kdata, cdata, size)) { 220 - r = -EFAULT; 221 - goto out; 221 + ret = -EFAULT; 222 + goto free_partial_kdata; 222 223 } 223 224 224 225 switch (p->chunks[i].chunk_id) { ··· 239 238 gobj = drm_gem_object_lookup(p->adev->ddev, 240 239 p->filp, handle); 241 240 if (gobj == NULL) { 242 - r = -EINVAL; 243 - goto out; 241 + ret = -EINVAL; 242 + goto free_partial_kdata; 244 243 } 245 244 246 245 p->uf.bo = gem_to_amdgpu_bo(gobj); 247 246 p->uf.offset = fence_data->offset; 248 247 } else { 249 - r = -EINVAL; 250 - goto out; 248 + ret = -EINVAL; 249 + goto free_partial_kdata; 251 250 } 252 251 break; 253 252 ··· 255 254 break; 256 255 257 256 default: 258 - r = -EINVAL; 259 - goto out; 257 + ret = -EINVAL; 258 + goto free_partial_kdata; 260 259 } 261 260 } 262 261 263 262 264 263 p->ibs = kcalloc(p->num_ibs, sizeof(struct amdgpu_ib), GFP_KERNEL); 265 - if (!p->ibs) 266 - r = -ENOMEM; 264 + if (!p->ibs) { 265 + ret = -ENOMEM; 266 + goto free_all_kdata; 267 + } 267 268 268 - out: 269 269 kfree(chunk_array); 270 - return r; 270 + return 0; 271 + 272 + free_all_kdata: 273 + i = p->nchunks - 1; 274 + free_partial_kdata: 275 + for (; i >= 0; i--) 276 + drm_free_large(p->chunks[i].kdata); 277 + kfree(p->chunks); 278 + put_bo_list: 279 + if (p->bo_list) 280 + amdgpu_bo_list_put(p->bo_list); 281 + amdgpu_ctx_put(p->ctx); 282 + free_chunk: 283 + kfree(chunk_array); 284 + 285 + return ret; 271 286 } 272 287 273 288 /* Returns how many bytes TTM can move per IB. ··· 338 321 return max(bytes_moved_threshold, 1024*1024ull); 339 322 } 340 323 341 - int amdgpu_cs_list_validate(struct amdgpu_cs_parser *p) 324 + int amdgpu_cs_list_validate(struct amdgpu_device *adev, 325 + struct amdgpu_vm *vm, 326 + struct list_head *validated) 342 327 { 343 - struct amdgpu_fpriv *fpriv = p->filp->driver_priv; 344 - struct amdgpu_vm *vm = &fpriv->vm; 345 - struct amdgpu_device *adev = p->adev; 346 328 struct amdgpu_bo_list_entry *lobj; 347 - struct list_head duplicates; 348 329 struct amdgpu_bo *bo; 349 330 u64 bytes_moved = 0, initial_bytes_moved; 350 331 u64 bytes_moved_threshold = amdgpu_cs_get_threshold_for_moves(adev); 351 332 int r; 352 333 353 - INIT_LIST_HEAD(&duplicates); 354 - r = ttm_eu_reserve_buffers(&p->ticket, &p->validated, true, &duplicates); 355 - if (unlikely(r != 0)) { 356 - return r; 357 - } 358 - 359 - list_for_each_entry(lobj, &p->validated, tv.head) { 334 + list_for_each_entry(lobj, validated, tv.head) { 360 335 bo = lobj->robj; 361 336 if (!bo->pin_count) { 362 337 u32 domain = lobj->prefered_domains; ··· 382 373 domain = lobj->allowed_domains; 383 374 goto retry; 384 375 } 385 - ttm_eu_backoff_reservation(&p->ticket, &p->validated); 386 376 return r; 387 377 } 388 378 } ··· 394 386 { 395 387 struct amdgpu_fpriv *fpriv = p->filp->driver_priv; 396 388 struct amdgpu_cs_buckets buckets; 389 + struct list_head duplicates; 397 390 bool need_mmap_lock = false; 398 391 int i, r; 399 392 ··· 414 405 if (need_mmap_lock) 415 406 down_read(&current->mm->mmap_sem); 416 407 417 - r = amdgpu_cs_list_validate(p); 408 + INIT_LIST_HEAD(&duplicates); 409 + r = ttm_eu_reserve_buffers(&p->ticket, &p->validated, true, &duplicates); 410 + if (unlikely(r != 0)) 411 + goto error_reserve; 418 412 413 + r = amdgpu_cs_list_validate(p->adev, &fpriv->vm, &p->validated); 414 + if (r) 415 + goto error_validate; 416 + 417 + r = amdgpu_cs_list_validate(p->adev, &fpriv->vm, &duplicates); 418 + 419 + error_validate: 420 + if (r) 421 + ttm_eu_backoff_reservation(&p->ticket, &p->validated); 422 + 423 + error_reserve: 419 424 if (need_mmap_lock) 420 425 up_read(&current->mm->mmap_sem); 421 426 ··· 795 772 return 0; 796 773 } 797 774 798 - static int amdgpu_cs_free_job(struct amdgpu_job *sched_job) 775 + static int amdgpu_cs_free_job(struct amdgpu_job *job) 799 776 { 800 777 int i; 801 - if (sched_job->ibs) 802 - for (i = 0; i < sched_job->num_ibs; i++) 803 - amdgpu_ib_free(sched_job->adev, &sched_job->ibs[i]); 804 - kfree(sched_job->ibs); 805 - if (sched_job->uf.bo) 806 - drm_gem_object_unreference_unlocked(&sched_job->uf.bo->gem_base); 778 + if (job->ibs) 779 + for (i = 0; i < job->num_ibs; i++) 780 + amdgpu_ib_free(job->adev, &job->ibs[i]); 781 + kfree(job->ibs); 782 + if (job->uf.bo) 783 + drm_gem_object_unreference_unlocked(&job->uf.bo->gem_base); 807 784 return 0; 808 785 } 809 786 ··· 827 804 r = amdgpu_cs_parser_init(parser, data); 828 805 if (r) { 829 806 DRM_ERROR("Failed to initialize parser !\n"); 830 - amdgpu_cs_parser_fini(parser, r, false); 807 + kfree(parser); 831 808 up_read(&adev->exclusive_lock); 832 809 r = amdgpu_cs_handle_lockup(adev, r); 833 810 return r; ··· 865 842 job = kzalloc(sizeof(struct amdgpu_job), GFP_KERNEL); 866 843 if (!job) 867 844 return -ENOMEM; 868 - job->base.sched = ring->scheduler; 845 + job->base.sched = &ring->sched; 869 846 job->base.s_entity = &parser->ctx->rings[ring->idx].entity; 870 847 job->adev = parser->adev; 871 848 job->ibs = parser->ibs; ··· 880 857 881 858 job->free_job = amdgpu_cs_free_job; 882 859 mutex_lock(&job->job_lock); 883 - r = amd_sched_entity_push_job((struct amd_sched_job *)job); 860 + r = amd_sched_entity_push_job(&job->base); 884 861 if (r) { 885 862 mutex_unlock(&job->job_lock); 886 863 amdgpu_cs_free_job(job);
+5 -5
drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
··· 43 43 for (i = 0; i < adev->num_rings; i++) { 44 44 struct amd_sched_rq *rq; 45 45 if (kernel) 46 - rq = &adev->rings[i]->scheduler->kernel_rq; 46 + rq = &adev->rings[i]->sched.kernel_rq; 47 47 else 48 - rq = &adev->rings[i]->scheduler->sched_rq; 49 - r = amd_sched_entity_init(adev->rings[i]->scheduler, 48 + rq = &adev->rings[i]->sched.sched_rq; 49 + r = amd_sched_entity_init(&adev->rings[i]->sched, 50 50 &ctx->rings[i].entity, 51 51 rq, amdgpu_sched_jobs); 52 52 if (r) ··· 55 55 56 56 if (i < adev->num_rings) { 57 57 for (j = 0; j < i; j++) 58 - amd_sched_entity_fini(adev->rings[j]->scheduler, 58 + amd_sched_entity_fini(&adev->rings[j]->sched, 59 59 &ctx->rings[j].entity); 60 60 kfree(ctx); 61 61 return r; ··· 75 75 76 76 if (amdgpu_enable_scheduler) { 77 77 for (i = 0; i < adev->num_rings; i++) 78 - amd_sched_entity_fini(adev->rings[i]->scheduler, 78 + amd_sched_entity_fini(&adev->rings[i]->sched, 79 79 &ctx->rings[i].entity); 80 80 } 81 81 }
+7 -2
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
··· 246 246 r = amdgpu_bo_create(adev, AMDGPU_GPU_PAGE_SIZE, 247 247 PAGE_SIZE, true, AMDGPU_GEM_DOMAIN_VRAM, 248 248 AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, 249 - NULL, &adev->vram_scratch.robj); 249 + NULL, NULL, &adev->vram_scratch.robj); 250 250 if (r) { 251 251 return r; 252 252 } ··· 449 449 450 450 if (adev->wb.wb_obj == NULL) { 451 451 r = amdgpu_bo_create(adev, AMDGPU_MAX_WB * 4, PAGE_SIZE, true, 452 - AMDGPU_GEM_DOMAIN_GTT, 0, NULL, &adev->wb.wb_obj); 452 + AMDGPU_GEM_DOMAIN_GTT, 0, NULL, NULL, 453 + &adev->wb.wb_obj); 453 454 if (r) { 454 455 dev_warn(adev->dev, "(%d) create WB bo failed\n", r); 455 456 return r; ··· 1651 1650 drm_kms_helper_poll_disable(dev); 1652 1651 1653 1652 /* turn off display hw */ 1653 + drm_modeset_lock_all(dev); 1654 1654 list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 1655 1655 drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF); 1656 1656 } 1657 + drm_modeset_unlock_all(dev); 1657 1658 1658 1659 /* unpin the front buffers */ 1659 1660 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { ··· 1750 1747 if (fbcon) { 1751 1748 drm_helper_resume_force_mode(dev); 1752 1749 /* turn on display hw */ 1750 + drm_modeset_lock_all(dev); 1753 1751 list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 1754 1752 drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON); 1755 1753 } 1754 + drm_modeset_unlock_all(dev); 1756 1755 } 1757 1756 1758 1757 drm_kms_helper_poll_enable(dev);
+4
drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
··· 79 79 int amdgpu_enable_scheduler = 0; 80 80 int amdgpu_sched_jobs = 16; 81 81 int amdgpu_sched_hw_submission = 2; 82 + int amdgpu_enable_semaphores = 1; 82 83 83 84 MODULE_PARM_DESC(vramlimit, "Restrict VRAM for testing, in megabytes"); 84 85 module_param_named(vramlimit, amdgpu_vram_limit, int, 0600); ··· 152 151 153 152 MODULE_PARM_DESC(sched_hw_submission, "the max number of HW submissions (default 2)"); 154 153 module_param_named(sched_hw_submission, amdgpu_sched_hw_submission, int, 0444); 154 + 155 + MODULE_PARM_DESC(enable_semaphores, "Enable semaphores (1 = enable (default), 0 = disable)"); 156 + module_param_named(enable_semaphores, amdgpu_enable_semaphores, int, 0644); 155 157 156 158 static struct pci_device_id pciidlist[] = { 157 159 #ifdef CONFIG_DRM_AMDGPU_CIK
+14 -11
drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
··· 609 609 * Init the fence driver for the requested ring (all asics). 610 610 * Helper function for amdgpu_fence_driver_init(). 611 611 */ 612 - void amdgpu_fence_driver_init_ring(struct amdgpu_ring *ring) 612 + int amdgpu_fence_driver_init_ring(struct amdgpu_ring *ring) 613 613 { 614 - int i; 614 + int i, r; 615 615 616 616 ring->fence_drv.cpu_addr = NULL; 617 617 ring->fence_drv.gpu_addr = 0; ··· 625 625 amdgpu_fence_check_lockup); 626 626 ring->fence_drv.ring = ring; 627 627 628 + init_waitqueue_head(&ring->fence_drv.fence_queue); 629 + 628 630 if (amdgpu_enable_scheduler) { 629 - ring->scheduler = amd_sched_create(&amdgpu_sched_ops, 630 - ring->idx, 631 - amdgpu_sched_hw_submission, 632 - (void *)ring->adev); 633 - if (!ring->scheduler) 634 - DRM_ERROR("Failed to create scheduler on ring %d.\n", 635 - ring->idx); 631 + r = amd_sched_init(&ring->sched, &amdgpu_sched_ops, 632 + amdgpu_sched_hw_submission, ring->name); 633 + if (r) { 634 + DRM_ERROR("Failed to create scheduler on ring %s.\n", 635 + ring->name); 636 + return r; 637 + } 636 638 } 639 + 640 + return 0; 637 641 } 638 642 639 643 /** ··· 685 681 wake_up_all(&ring->fence_drv.fence_queue); 686 682 amdgpu_irq_put(adev, ring->fence_drv.irq_src, 687 683 ring->fence_drv.irq_type); 688 - if (ring->scheduler) 689 - amd_sched_destroy(ring->scheduler); 684 + amd_sched_fini(&ring->sched); 690 685 ring->fence_drv.initialized = false; 691 686 } 692 687 mutex_unlock(&adev->ring_lock);
+1 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
··· 127 127 r = amdgpu_bo_create(adev, adev->gart.table_size, 128 128 PAGE_SIZE, true, AMDGPU_GEM_DOMAIN_VRAM, 129 129 AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, 130 - NULL, &adev->gart.robj); 130 + NULL, NULL, &adev->gart.robj); 131 131 if (r) { 132 132 return r; 133 133 }
+12 -4
drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
··· 69 69 } 70 70 } 71 71 retry: 72 - r = amdgpu_bo_create(adev, size, alignment, kernel, initial_domain, flags, NULL, &robj); 72 + r = amdgpu_bo_create(adev, size, alignment, kernel, initial_domain, 73 + flags, NULL, NULL, &robj); 73 74 if (r) { 74 75 if (r != -ERESTARTSYS) { 75 76 if (initial_domain == AMDGPU_GEM_DOMAIN_VRAM) { ··· 427 426 &args->data.data_size_bytes, 428 427 &args->data.flags); 429 428 } else if (args->op == AMDGPU_GEM_METADATA_OP_SET_METADATA) { 429 + if (args->data.data_size_bytes > sizeof(args->data.data)) { 430 + r = -EINVAL; 431 + goto unreserve; 432 + } 430 433 r = amdgpu_bo_set_tiling_flags(robj, args->data.tiling_info); 431 434 if (!r) 432 435 r = amdgpu_bo_set_metadata(robj, args->data.data, ··· 438 433 args->data.flags); 439 434 } 440 435 436 + unreserve: 441 437 amdgpu_bo_unreserve(robj); 442 438 out: 443 439 drm_gem_object_unreference_unlocked(gobj); ··· 460 454 struct ttm_validate_buffer tv, *entry; 461 455 struct amdgpu_bo_list_entry *vm_bos; 462 456 struct ww_acquire_ctx ticket; 463 - struct list_head list; 457 + struct list_head list, duplicates; 464 458 unsigned domain; 465 459 int r; 466 460 467 461 INIT_LIST_HEAD(&list); 462 + INIT_LIST_HEAD(&duplicates); 468 463 469 464 tv.bo = &bo_va->bo->tbo; 470 465 tv.shared = true; ··· 475 468 if (!vm_bos) 476 469 return; 477 470 478 - r = ttm_eu_reserve_buffers(&ticket, &list, true, NULL); 471 + /* Provide duplicates to avoid -EALREADY */ 472 + r = ttm_eu_reserve_buffers(&ticket, &list, true, &duplicates); 479 473 if (r) 480 474 goto error_free; 481 475 ··· 659 651 int r; 660 652 661 653 args->pitch = amdgpu_align_pitch(adev, args->width, args->bpp, 0) * ((args->bpp + 1) / 8); 662 - args->size = args->pitch * args->height; 654 + args->size = (u64)args->pitch * args->height; 663 655 args->size = ALIGN(args->size, PAGE_SIZE); 664 656 665 657 r = amdgpu_gem_object_create(adev, args->size, 0,
+1 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_ih.c
··· 43 43 r = amdgpu_bo_create(adev, adev->irq.ih.ring_size, 44 44 PAGE_SIZE, true, 45 45 AMDGPU_GEM_DOMAIN_GTT, 0, 46 - NULL, &adev->irq.ih.ring_obj); 46 + NULL, NULL, &adev->irq.ih.ring_obj); 47 47 if (r) { 48 48 DRM_ERROR("amdgpu: failed to create ih ring buffer (%d).\n", r); 49 49 return r;
+1 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
··· 140 140 */ 141 141 int amdgpu_irq_postinstall(struct drm_device *dev) 142 142 { 143 - dev->max_vblank_count = 0x001fffff; 143 + dev->max_vblank_count = 0x00ffffff; 144 144 return 0; 145 145 } 146 146
+3 -2
drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
··· 390 390 min((size_t)size, sizeof(vram_gtt))) ? -EFAULT : 0; 391 391 } 392 392 case AMDGPU_INFO_READ_MMR_REG: { 393 - unsigned n, alloc_size = info->read_mmr_reg.count * 4; 393 + unsigned n, alloc_size; 394 394 uint32_t *regs; 395 395 unsigned se_num = (info->read_mmr_reg.instance >> 396 396 AMDGPU_INFO_MMR_SE_INDEX_SHIFT) & ··· 406 406 if (sh_num == AMDGPU_INFO_MMR_SH_INDEX_MASK) 407 407 sh_num = 0xffffffff; 408 408 409 - regs = kmalloc(alloc_size, GFP_KERNEL); 409 + regs = kmalloc_array(info->read_mmr_reg.count, sizeof(*regs), GFP_KERNEL); 410 410 if (!regs) 411 411 return -ENOMEM; 412 + alloc_size = info->read_mmr_reg.count * sizeof(*regs); 412 413 413 414 for (i = 0; i < info->read_mmr_reg.count; i++) 414 415 if (amdgpu_asic_read_register(adev, se_num, sh_num,
+9 -10
drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
··· 215 215 bool kernel, u32 domain, u64 flags, 216 216 struct sg_table *sg, 217 217 struct ttm_placement *placement, 218 + struct reservation_object *resv, 218 219 struct amdgpu_bo **bo_ptr) 219 220 { 220 221 struct amdgpu_bo *bo; ··· 262 261 /* Kernel allocation are uninterruptible */ 263 262 r = ttm_bo_init(&adev->mman.bdev, &bo->tbo, size, type, 264 263 &bo->placement, page_align, !kernel, NULL, 265 - acc_size, sg, NULL, &amdgpu_ttm_bo_destroy); 264 + acc_size, sg, resv, &amdgpu_ttm_bo_destroy); 266 265 if (unlikely(r != 0)) { 267 266 return r; 268 267 } ··· 276 275 int amdgpu_bo_create(struct amdgpu_device *adev, 277 276 unsigned long size, int byte_align, 278 277 bool kernel, u32 domain, u64 flags, 279 - struct sg_table *sg, struct amdgpu_bo **bo_ptr) 278 + struct sg_table *sg, 279 + struct reservation_object *resv, 280 + struct amdgpu_bo **bo_ptr) 280 281 { 281 282 struct ttm_placement placement = {0}; 282 283 struct ttm_place placements[AMDGPU_GEM_DOMAIN_MAX + 1]; ··· 289 286 amdgpu_ttm_placement_init(adev, &placement, 290 287 placements, domain, flags); 291 288 292 - return amdgpu_bo_create_restricted(adev, size, byte_align, 293 - kernel, domain, flags, 294 - sg, 295 - &placement, 296 - bo_ptr); 289 + return amdgpu_bo_create_restricted(adev, size, byte_align, kernel, 290 + domain, flags, sg, &placement, 291 + resv, bo_ptr); 297 292 } 298 293 299 294 int amdgpu_bo_kmap(struct amdgpu_bo *bo, void **ptr) ··· 536 535 if (metadata == NULL) 537 536 return -EINVAL; 538 537 539 - buffer = kzalloc(metadata_size, GFP_KERNEL); 538 + buffer = kmemdup(metadata, metadata_size, GFP_KERNEL); 540 539 if (buffer == NULL) 541 540 return -ENOMEM; 542 - 543 - memcpy(buffer, metadata, metadata_size); 544 541 545 542 kfree(bo->metadata); 546 543 bo->metadata_flags = flags;
+2
drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
··· 129 129 unsigned long size, int byte_align, 130 130 bool kernel, u32 domain, u64 flags, 131 131 struct sg_table *sg, 132 + struct reservation_object *resv, 132 133 struct amdgpu_bo **bo_ptr); 133 134 int amdgpu_bo_create_restricted(struct amdgpu_device *adev, 134 135 unsigned long size, int byte_align, 135 136 bool kernel, u32 domain, u64 flags, 136 137 struct sg_table *sg, 137 138 struct ttm_placement *placement, 139 + struct reservation_object *resv, 138 140 struct amdgpu_bo **bo_ptr); 139 141 int amdgpu_bo_kmap(struct amdgpu_bo *bo, void **ptr); 140 142 void amdgpu_bo_kunmap(struct amdgpu_bo *bo);
+4 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c
··· 61 61 struct dma_buf_attachment *attach, 62 62 struct sg_table *sg) 63 63 { 64 + struct reservation_object *resv = attach->dmabuf->resv; 64 65 struct amdgpu_device *adev = dev->dev_private; 65 66 struct amdgpu_bo *bo; 66 67 int ret; 67 68 69 + ww_mutex_lock(&resv->lock, NULL); 68 70 ret = amdgpu_bo_create(adev, attach->dmabuf->size, PAGE_SIZE, false, 69 - AMDGPU_GEM_DOMAIN_GTT, 0, sg, &bo); 71 + AMDGPU_GEM_DOMAIN_GTT, 0, sg, resv, &bo); 72 + ww_mutex_unlock(&resv->lock); 70 73 if (ret) 71 74 return ERR_PTR(ret); 72 75
+4 -4
drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
··· 357 357 ring->adev = adev; 358 358 ring->idx = adev->num_rings++; 359 359 adev->rings[ring->idx] = ring; 360 - amdgpu_fence_driver_init_ring(ring); 360 + r = amdgpu_fence_driver_init_ring(ring); 361 + if (r) 362 + return r; 361 363 } 362 - 363 - init_waitqueue_head(&ring->fence_drv.fence_queue); 364 364 365 365 r = amdgpu_wb_get(adev, &ring->rptr_offs); 366 366 if (r) { ··· 407 407 if (ring->ring_obj == NULL) { 408 408 r = amdgpu_bo_create(adev, ring->ring_size, PAGE_SIZE, true, 409 409 AMDGPU_GEM_DOMAIN_GTT, 0, 410 - NULL, &ring->ring_obj); 410 + NULL, NULL, &ring->ring_obj); 411 411 if (r) { 412 412 dev_err(adev->dev, "(%d) ring create failed\n", r); 413 413 return r;
+31 -16
drivers/gpu/drm/amd/amdgpu/amdgpu_sa.c
··· 64 64 INIT_LIST_HEAD(&sa_manager->flist[i]); 65 65 } 66 66 67 - r = amdgpu_bo_create(adev, size, align, true, 68 - domain, 0, NULL, &sa_manager->bo); 67 + r = amdgpu_bo_create(adev, size, align, true, domain, 68 + 0, NULL, NULL, &sa_manager->bo); 69 69 if (r) { 70 70 dev_err(adev->dev, "(%d) failed to allocate bo for manager\n", r); 71 71 return r; ··· 145 145 struct amd_sched_fence *s_fence; 146 146 147 147 s_fence = to_amd_sched_fence(f); 148 - if (s_fence) 149 - return s_fence->scheduler->ring_id; 148 + if (s_fence) { 149 + struct amdgpu_ring *ring; 150 + 151 + ring = container_of(s_fence->sched, struct amdgpu_ring, sched); 152 + return ring->idx; 153 + } 154 + 150 155 a_fence = to_amdgpu_fence(f); 151 156 if (a_fence) 152 157 return a_fence->ring->idx; ··· 417 412 } 418 413 419 414 #if defined(CONFIG_DEBUG_FS) 415 + 416 + static void amdgpu_sa_bo_dump_fence(struct fence *fence, struct seq_file *m) 417 + { 418 + struct amdgpu_fence *a_fence = to_amdgpu_fence(fence); 419 + struct amd_sched_fence *s_fence = to_amd_sched_fence(fence); 420 + 421 + if (a_fence) 422 + seq_printf(m, " protected by 0x%016llx on ring %d", 423 + a_fence->seq, a_fence->ring->idx); 424 + 425 + if (s_fence) { 426 + struct amdgpu_ring *ring; 427 + 428 + 429 + ring = container_of(s_fence->sched, struct amdgpu_ring, sched); 430 + seq_printf(m, " protected by 0x%016x on ring %d", 431 + s_fence->base.seqno, ring->idx); 432 + } 433 + } 434 + 420 435 void amdgpu_sa_bo_dump_debug_info(struct amdgpu_sa_manager *sa_manager, 421 436 struct seq_file *m) 422 437 { ··· 453 428 } 454 429 seq_printf(m, "[0x%010llx 0x%010llx] size %8lld", 455 430 soffset, eoffset, eoffset - soffset); 456 - if (i->fence) { 457 - struct amdgpu_fence *a_fence = to_amdgpu_fence(i->fence); 458 - struct amd_sched_fence *s_fence = to_amd_sched_fence(i->fence); 459 - if (a_fence) 460 - seq_printf(m, " protected by 0x%016llx on ring %d", 461 - a_fence->seq, a_fence->ring->idx); 462 - if (s_fence) 463 - seq_printf(m, " protected by 0x%016x on ring %d", 464 - s_fence->base.seqno, 465 - s_fence->scheduler->ring_id); 466 - 467 - } 431 + if (i->fence) 432 + amdgpu_sa_bo_dump_fence(i->fence, m); 468 433 seq_printf(m, "\n"); 469 434 } 470 435 spin_unlock(&sa_manager->wq.lock);
+25 -40
drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c
··· 27 27 #include <drm/drmP.h> 28 28 #include "amdgpu.h" 29 29 30 - static struct fence *amdgpu_sched_dependency(struct amd_sched_job *job) 30 + static struct fence *amdgpu_sched_dependency(struct amd_sched_job *sched_job) 31 31 { 32 - struct amdgpu_job *sched_job = (struct amdgpu_job *)job; 33 - return amdgpu_sync_get_fence(&sched_job->ibs->sync); 32 + struct amdgpu_job *job = to_amdgpu_job(sched_job); 33 + return amdgpu_sync_get_fence(&job->ibs->sync); 34 34 } 35 35 36 - static struct fence *amdgpu_sched_run_job(struct amd_sched_job *job) 36 + static struct fence *amdgpu_sched_run_job(struct amd_sched_job *sched_job) 37 37 { 38 - struct amdgpu_job *sched_job; 39 - struct amdgpu_fence *fence; 38 + struct amdgpu_fence *fence = NULL; 39 + struct amdgpu_job *job; 40 40 int r; 41 41 42 - if (!job) { 42 + if (!sched_job) { 43 43 DRM_ERROR("job is null\n"); 44 44 return NULL; 45 45 } 46 - sched_job = (struct amdgpu_job *)job; 47 - mutex_lock(&sched_job->job_lock); 48 - r = amdgpu_ib_schedule(sched_job->adev, 49 - sched_job->num_ibs, 50 - sched_job->ibs, 51 - sched_job->base.owner); 52 - if (r) 46 + job = to_amdgpu_job(sched_job); 47 + mutex_lock(&job->job_lock); 48 + r = amdgpu_ib_schedule(job->adev, 49 + job->num_ibs, 50 + job->ibs, 51 + job->base.owner); 52 + if (r) { 53 + DRM_ERROR("Error scheduling IBs (%d)\n", r); 53 54 goto err; 54 - fence = amdgpu_fence_ref(sched_job->ibs[sched_job->num_ibs - 1].fence); 55 + } 55 56 56 - if (sched_job->free_job) 57 - sched_job->free_job(sched_job); 58 - 59 - mutex_unlock(&sched_job->job_lock); 60 - return &fence->base; 57 + fence = amdgpu_fence_ref(job->ibs[job->num_ibs - 1].fence); 61 58 62 59 err: 63 - DRM_ERROR("Run job error\n"); 64 - mutex_unlock(&sched_job->job_lock); 65 - job->sched->ops->process_job(job); 66 - return NULL; 67 - } 60 + if (job->free_job) 61 + job->free_job(job); 68 62 69 - static void amdgpu_sched_process_job(struct amd_sched_job *job) 70 - { 71 - struct amdgpu_job *sched_job; 72 - 73 - if (!job) { 74 - DRM_ERROR("job is null\n"); 75 - return; 76 - } 77 - sched_job = (struct amdgpu_job *)job; 78 - /* after processing job, free memory */ 79 - fence_put(&sched_job->base.s_fence->base); 80 - kfree(sched_job); 63 + mutex_unlock(&job->job_lock); 64 + fence_put(&job->base.s_fence->base); 65 + kfree(job); 66 + return fence ? &fence->base : NULL; 81 67 } 82 68 83 69 struct amd_sched_backend_ops amdgpu_sched_ops = { 84 70 .dependency = amdgpu_sched_dependency, 85 71 .run_job = amdgpu_sched_run_job, 86 - .process_job = amdgpu_sched_process_job 87 72 }; 88 73 89 74 int amdgpu_sched_ib_submit_kernel_helper(struct amdgpu_device *adev, ··· 85 100 kzalloc(sizeof(struct amdgpu_job), GFP_KERNEL); 86 101 if (!job) 87 102 return -ENOMEM; 88 - job->base.sched = ring->scheduler; 103 + job->base.sched = &ring->sched; 89 104 job->base.s_entity = &adev->kernel_ctx.rings[ring->idx].entity; 90 105 job->adev = adev; 91 106 job->ibs = ibs; ··· 94 109 mutex_init(&job->job_lock); 95 110 job->free_job = free_job; 96 111 mutex_lock(&job->job_lock); 97 - r = amd_sched_entity_push_job((struct amd_sched_job *)job); 112 + r = amd_sched_entity_push_job(&job->base); 98 113 if (r) { 99 114 mutex_unlock(&job->job_lock); 100 115 kfree(job);
+24 -3
drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c
··· 65 65 66 66 if (a_fence) 67 67 return a_fence->ring->adev == adev; 68 - if (s_fence) 69 - return (struct amdgpu_device *)s_fence->scheduler->priv == adev; 68 + 69 + if (s_fence) { 70 + struct amdgpu_ring *ring; 71 + 72 + ring = container_of(s_fence->sched, struct amdgpu_ring, sched); 73 + return ring->adev == adev; 74 + } 75 + 70 76 return false; 71 77 } 72 78 ··· 257 251 fence_put(e->fence); 258 252 kfree(e); 259 253 } 254 + 255 + if (amdgpu_enable_semaphores) 256 + return 0; 257 + 258 + for (i = 0; i < AMDGPU_MAX_RINGS; ++i) { 259 + struct amdgpu_fence *fence = sync->sync_to[i]; 260 + if (!fence) 261 + continue; 262 + 263 + r = fence_wait(&fence->base, false); 264 + if (r) 265 + return r; 266 + } 267 + 260 268 return 0; 261 269 } 262 270 ··· 305 285 return -EINVAL; 306 286 } 307 287 308 - if (amdgpu_enable_scheduler || (count >= AMDGPU_NUM_SYNCS)) { 288 + if (amdgpu_enable_scheduler || !amdgpu_enable_semaphores || 289 + (count >= AMDGPU_NUM_SYNCS)) { 309 290 /* not enough room, wait manually */ 310 291 r = fence_wait(&fence->base, false); 311 292 if (r)
+5 -3
drivers/gpu/drm/amd/amdgpu/amdgpu_test.c
··· 59 59 goto out_cleanup; 60 60 } 61 61 62 - r = amdgpu_bo_create(adev, size, PAGE_SIZE, true, AMDGPU_GEM_DOMAIN_VRAM, 0, 63 - NULL, &vram_obj); 62 + r = amdgpu_bo_create(adev, size, PAGE_SIZE, true, 63 + AMDGPU_GEM_DOMAIN_VRAM, 0, 64 + NULL, NULL, &vram_obj); 64 65 if (r) { 65 66 DRM_ERROR("Failed to create VRAM object\n"); 66 67 goto out_cleanup; ··· 81 80 struct fence *fence = NULL; 82 81 83 82 r = amdgpu_bo_create(adev, size, PAGE_SIZE, true, 84 - AMDGPU_GEM_DOMAIN_GTT, 0, NULL, gtt_obj + i); 83 + AMDGPU_GEM_DOMAIN_GTT, 0, NULL, 84 + NULL, gtt_obj + i); 85 85 if (r) { 86 86 DRM_ERROR("Failed to create GTT object %d\n", i); 87 87 goto out_lclean;
+1 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
··· 861 861 r = amdgpu_bo_create(adev, 256 * 1024, PAGE_SIZE, true, 862 862 AMDGPU_GEM_DOMAIN_VRAM, 863 863 AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, 864 - NULL, &adev->stollen_vga_memory); 864 + NULL, NULL, &adev->stollen_vga_memory); 865 865 if (r) { 866 866 return r; 867 867 }
+1 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c
··· 247 247 const struct common_firmware_header *header = NULL; 248 248 249 249 err = amdgpu_bo_create(adev, adev->firmware.fw_size, PAGE_SIZE, true, 250 - AMDGPU_GEM_DOMAIN_GTT, 0, NULL, bo); 250 + AMDGPU_GEM_DOMAIN_GTT, 0, NULL, NULL, bo); 251 251 if (err) { 252 252 dev_err(adev->dev, "(%d) Firmware buffer allocate failed\n", err); 253 253 err = -ENOMEM;
+47 -33
drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
··· 156 156 r = amdgpu_bo_create(adev, bo_size, PAGE_SIZE, true, 157 157 AMDGPU_GEM_DOMAIN_VRAM, 158 158 AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, 159 - NULL, &adev->uvd.vcpu_bo); 159 + NULL, NULL, &adev->uvd.vcpu_bo); 160 160 if (r) { 161 161 dev_err(adev->dev, "(%d) failed to allocate UVD bo\n", r); 162 162 return r; ··· 543 543 return -EINVAL; 544 544 } 545 545 546 - if (msg_type == 1) { 546 + switch (msg_type) { 547 + case 0: 548 + /* it's a create msg, calc image size (width * height) */ 549 + amdgpu_bo_kunmap(bo); 550 + 551 + /* try to alloc a new handle */ 552 + for (i = 0; i < AMDGPU_MAX_UVD_HANDLES; ++i) { 553 + if (atomic_read(&adev->uvd.handles[i]) == handle) { 554 + DRM_ERROR("Handle 0x%x already in use!\n", handle); 555 + return -EINVAL; 556 + } 557 + 558 + if (!atomic_cmpxchg(&adev->uvd.handles[i], 0, handle)) { 559 + adev->uvd.filp[i] = ctx->parser->filp; 560 + return 0; 561 + } 562 + } 563 + 564 + DRM_ERROR("No more free UVD handles!\n"); 565 + return -EINVAL; 566 + 567 + case 1: 547 568 /* it's a decode msg, calc buffer sizes */ 548 569 r = amdgpu_uvd_cs_msg_decode(msg, ctx->buf_sizes); 549 570 amdgpu_bo_kunmap(bo); 550 571 if (r) 551 572 return r; 552 573 553 - } else if (msg_type == 2) { 574 + /* validate the handle */ 575 + for (i = 0; i < AMDGPU_MAX_UVD_HANDLES; ++i) { 576 + if (atomic_read(&adev->uvd.handles[i]) == handle) { 577 + if (adev->uvd.filp[i] != ctx->parser->filp) { 578 + DRM_ERROR("UVD handle collision detected!\n"); 579 + return -EINVAL; 580 + } 581 + return 0; 582 + } 583 + } 584 + 585 + DRM_ERROR("Invalid UVD handle 0x%x!\n", handle); 586 + return -ENOENT; 587 + 588 + case 2: 554 589 /* it's a destroy msg, free the handle */ 555 590 for (i = 0; i < AMDGPU_MAX_UVD_HANDLES; ++i) 556 591 atomic_cmpxchg(&adev->uvd.handles[i], handle, 0); 557 592 amdgpu_bo_kunmap(bo); 558 593 return 0; 559 - } else { 560 - /* it's a create msg */ 561 - amdgpu_bo_kunmap(bo); 562 594 563 - if (msg_type != 0) { 564 - DRM_ERROR("Illegal UVD message type (%d)!\n", msg_type); 565 - return -EINVAL; 566 - } 567 - 568 - /* it's a create msg, no special handling needed */ 595 + default: 596 + DRM_ERROR("Illegal UVD message type (%d)!\n", msg_type); 597 + return -EINVAL; 569 598 } 570 - 571 - /* create or decode, validate the handle */ 572 - for (i = 0; i < AMDGPU_MAX_UVD_HANDLES; ++i) { 573 - if (atomic_read(&adev->uvd.handles[i]) == handle) 574 - return 0; 575 - } 576 - 577 - /* handle not found try to alloc a new one */ 578 - for (i = 0; i < AMDGPU_MAX_UVD_HANDLES; ++i) { 579 - if (!atomic_cmpxchg(&adev->uvd.handles[i], 0, handle)) { 580 - adev->uvd.filp[i] = ctx->parser->filp; 581 - return 0; 582 - } 583 - } 584 - 585 - DRM_ERROR("No more free UVD handles!\n"); 599 + BUG(); 586 600 return -EINVAL; 587 601 } 588 602 ··· 819 805 } 820 806 821 807 static int amdgpu_uvd_free_job( 822 - struct amdgpu_job *sched_job) 808 + struct amdgpu_job *job) 823 809 { 824 - amdgpu_ib_free(sched_job->adev, sched_job->ibs); 825 - kfree(sched_job->ibs); 810 + amdgpu_ib_free(job->adev, job->ibs); 811 + kfree(job->ibs); 826 812 return 0; 827 813 } 828 814 ··· 919 905 r = amdgpu_bo_create(adev, 1024, PAGE_SIZE, true, 920 906 AMDGPU_GEM_DOMAIN_VRAM, 921 907 AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, 922 - NULL, &bo); 908 + NULL, NULL, &bo); 923 909 if (r) 924 910 return r; 925 911 ··· 968 954 r = amdgpu_bo_create(adev, 1024, PAGE_SIZE, true, 969 955 AMDGPU_GEM_DOMAIN_VRAM, 970 956 AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, 971 - NULL, &bo); 957 + NULL, NULL, &bo); 972 958 if (r) 973 959 return r; 974 960
+4 -4
drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
··· 143 143 r = amdgpu_bo_create(adev, size, PAGE_SIZE, true, 144 144 AMDGPU_GEM_DOMAIN_VRAM, 145 145 AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, 146 - NULL, &adev->vce.vcpu_bo); 146 + NULL, NULL, &adev->vce.vcpu_bo); 147 147 if (r) { 148 148 dev_err(adev->dev, "(%d) failed to allocate VCE bo\n", r); 149 149 return r; ··· 342 342 } 343 343 344 344 static int amdgpu_vce_free_job( 345 - struct amdgpu_job *sched_job) 345 + struct amdgpu_job *job) 346 346 { 347 - amdgpu_ib_free(sched_job->adev, sched_job->ibs); 348 - kfree(sched_job->ibs); 347 + amdgpu_ib_free(job->adev, job->ibs); 348 + kfree(job->ibs); 349 349 return 0; 350 350 } 351 351
+11 -34
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
··· 316 316 } 317 317 } 318 318 319 - int amdgpu_vm_free_job(struct amdgpu_job *sched_job) 319 + int amdgpu_vm_free_job(struct amdgpu_job *job) 320 320 { 321 321 int i; 322 - for (i = 0; i < sched_job->num_ibs; i++) 323 - amdgpu_ib_free(sched_job->adev, &sched_job->ibs[i]); 324 - kfree(sched_job->ibs); 322 + for (i = 0; i < job->num_ibs; i++) 323 + amdgpu_ib_free(job->adev, &job->ibs[i]); 324 + kfree(job->ibs); 325 325 return 0; 326 326 } 327 327 ··· 686 686 } 687 687 688 688 /** 689 - * amdgpu_vm_fence_pts - fence page tables after an update 690 - * 691 - * @vm: requested vm 692 - * @start: start of GPU address range 693 - * @end: end of GPU address range 694 - * @fence: fence to use 695 - * 696 - * Fence the page tables in the range @start - @end (cayman+). 697 - * 698 - * Global and local mutex must be locked! 699 - */ 700 - static void amdgpu_vm_fence_pts(struct amdgpu_vm *vm, 701 - uint64_t start, uint64_t end, 702 - struct fence *fence) 703 - { 704 - unsigned i; 705 - 706 - start >>= amdgpu_vm_block_size; 707 - end >>= amdgpu_vm_block_size; 708 - 709 - for (i = start; i <= end; ++i) 710 - amdgpu_bo_fence(vm->page_tables[i].bo, fence, true); 711 - } 712 - 713 - /** 714 689 * amdgpu_vm_bo_update_mapping - update a mapping in the vm page table 715 690 * 716 691 * @adev: amdgpu_device pointer ··· 788 813 if (r) 789 814 goto error_free; 790 815 791 - amdgpu_vm_fence_pts(vm, mapping->it.start, 792 - mapping->it.last + 1, f); 816 + amdgpu_bo_fence(vm->page_directory, f, true); 793 817 if (fence) { 794 818 fence_put(*fence); 795 819 *fence = fence_get(f); ··· 829 855 int r; 830 856 831 857 if (mem) { 832 - addr = mem->start << PAGE_SHIFT; 858 + addr = (u64)mem->start << PAGE_SHIFT; 833 859 if (mem->mem_type != TTM_PL_TT) 834 860 addr += adev->vm_manager.vram_base_offset; 835 861 } else { ··· 1063 1089 1064 1090 /* walk over the address space and allocate the page tables */ 1065 1091 for (pt_idx = saddr; pt_idx <= eaddr; ++pt_idx) { 1092 + struct reservation_object *resv = vm->page_directory->tbo.resv; 1066 1093 struct amdgpu_bo *pt; 1067 1094 1068 1095 if (vm->page_tables[pt_idx].bo) ··· 1072 1097 /* drop mutex to allocate and clear page table */ 1073 1098 mutex_unlock(&vm->mutex); 1074 1099 1100 + ww_mutex_lock(&resv->lock, NULL); 1075 1101 r = amdgpu_bo_create(adev, AMDGPU_VM_PTE_COUNT * 8, 1076 1102 AMDGPU_GPU_PAGE_SIZE, true, 1077 1103 AMDGPU_GEM_DOMAIN_VRAM, 1078 1104 AMDGPU_GEM_CREATE_NO_CPU_ACCESS, 1079 - NULL, &pt); 1105 + NULL, resv, &pt); 1106 + ww_mutex_unlock(&resv->lock); 1080 1107 if (r) 1081 1108 goto error_free; 1082 1109 ··· 1280 1303 r = amdgpu_bo_create(adev, pd_size, align, true, 1281 1304 AMDGPU_GEM_DOMAIN_VRAM, 1282 1305 AMDGPU_GEM_CREATE_NO_CPU_ACCESS, 1283 - NULL, &vm->page_directory); 1306 + NULL, NULL, &vm->page_directory); 1284 1307 if (r) 1285 1308 return r; 1286 1309
+4 -2
drivers/gpu/drm/amd/amdgpu/cz_smc.c
··· 814 814 * 3. map kernel virtual address 815 815 */ 816 816 ret = amdgpu_bo_create(adev, priv->toc_buffer.data_size, PAGE_SIZE, 817 - true, AMDGPU_GEM_DOMAIN_GTT, 0, NULL, toc_buf); 817 + true, AMDGPU_GEM_DOMAIN_GTT, 0, NULL, NULL, 818 + toc_buf); 818 819 819 820 if (ret) { 820 821 dev_err(adev->dev, "(%d) SMC TOC buffer allocation failed\n", ret); ··· 823 822 } 824 823 825 824 ret = amdgpu_bo_create(adev, priv->smu_buffer.data_size, PAGE_SIZE, 826 - true, AMDGPU_GEM_DOMAIN_GTT, 0, NULL, smu_buf); 825 + true, AMDGPU_GEM_DOMAIN_GTT, 0, NULL, NULL, 826 + smu_buf); 827 827 828 828 if (ret) { 829 829 dev_err(adev->dev, "(%d) SMC Internal buffer allocation failed\n", ret);
+2 -2
drivers/gpu/drm/amd/amdgpu/fiji_smc.c
··· 764 764 ret = amdgpu_bo_create(adev, image_size, PAGE_SIZE, 765 765 true, AMDGPU_GEM_DOMAIN_VRAM, 766 766 AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, 767 - NULL, toc_buf); 767 + NULL, NULL, toc_buf); 768 768 if (ret) { 769 769 DRM_ERROR("Failed to allocate memory for TOC buffer\n"); 770 770 return -ENOMEM; ··· 774 774 ret = amdgpu_bo_create(adev, smu_internal_buffer_size, PAGE_SIZE, 775 775 true, AMDGPU_GEM_DOMAIN_VRAM, 776 776 AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, 777 - NULL, smu_buf); 777 + NULL, NULL, smu_buf); 778 778 if (ret) { 779 779 DRM_ERROR("Failed to allocate memory for SMU internal buffer\n"); 780 780 return -ENOMEM;
+22 -52
drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
··· 3206 3206 r = amdgpu_bo_create(adev, 3207 3207 adev->gfx.mec.num_mec *adev->gfx.mec.num_pipe * MEC_HPD_SIZE * 2, 3208 3208 PAGE_SIZE, true, 3209 - AMDGPU_GEM_DOMAIN_GTT, 0, NULL, 3209 + AMDGPU_GEM_DOMAIN_GTT, 0, NULL, NULL, 3210 3210 &adev->gfx.mec.hpd_eop_obj); 3211 3211 if (r) { 3212 3212 dev_warn(adev->dev, "(%d) create HDP EOP bo failed\n", r); ··· 3373 3373 r = amdgpu_bo_create(adev, 3374 3374 sizeof(struct bonaire_mqd), 3375 3375 PAGE_SIZE, true, 3376 - AMDGPU_GEM_DOMAIN_GTT, 0, NULL, 3376 + AMDGPU_GEM_DOMAIN_GTT, 0, NULL, NULL, 3377 3377 &ring->mqd_obj); 3378 3378 if (r) { 3379 3379 dev_warn(adev->dev, "(%d) create MQD bo failed\n", r); ··· 3610 3610 return 0; 3611 3611 } 3612 3612 3613 - static void gfx_v7_0_ce_sync_me(struct amdgpu_ring *ring) 3614 - { 3615 - struct amdgpu_device *adev = ring->adev; 3616 - u64 gpu_addr = adev->wb.gpu_addr + adev->gfx.ce_sync_offs * 4; 3617 - 3618 - /* instruct DE to set a magic number */ 3619 - amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3)); 3620 - amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) | 3621 - WRITE_DATA_DST_SEL(5))); 3622 - amdgpu_ring_write(ring, gpu_addr & 0xfffffffc); 3623 - amdgpu_ring_write(ring, upper_32_bits(gpu_addr) & 0xffffffff); 3624 - amdgpu_ring_write(ring, 1); 3625 - 3626 - /* let CE wait till condition satisfied */ 3627 - amdgpu_ring_write(ring, PACKET3(PACKET3_WAIT_REG_MEM, 5)); 3628 - amdgpu_ring_write(ring, (WAIT_REG_MEM_OPERATION(0) | /* wait */ 3629 - WAIT_REG_MEM_MEM_SPACE(1) | /* memory */ 3630 - WAIT_REG_MEM_FUNCTION(3) | /* == */ 3631 - WAIT_REG_MEM_ENGINE(2))); /* ce */ 3632 - amdgpu_ring_write(ring, gpu_addr & 0xfffffffc); 3633 - amdgpu_ring_write(ring, upper_32_bits(gpu_addr) & 0xffffffff); 3634 - amdgpu_ring_write(ring, 1); 3635 - amdgpu_ring_write(ring, 0xffffffff); 3636 - amdgpu_ring_write(ring, 4); /* poll interval */ 3637 - 3638 - /* instruct CE to reset wb of ce_sync to zero */ 3639 - amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3)); 3640 - amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(2) | 3641 - WRITE_DATA_DST_SEL(5) | 3642 - WR_CONFIRM)); 3643 - amdgpu_ring_write(ring, gpu_addr & 0xfffffffc); 3644 - amdgpu_ring_write(ring, upper_32_bits(gpu_addr) & 0xffffffff); 3645 - amdgpu_ring_write(ring, 0); 3646 - } 3647 - 3648 3613 /* 3649 3614 * vm 3650 3615 * VMID 0 is the physical GPU addresses as used by the kernel. ··· 3628 3663 unsigned vm_id, uint64_t pd_addr) 3629 3664 { 3630 3665 int usepfp = (ring->type == AMDGPU_RING_TYPE_GFX); 3666 + if (usepfp) { 3667 + /* synce CE with ME to prevent CE fetch CEIB before context switch done */ 3668 + amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0)); 3669 + amdgpu_ring_write(ring, 0); 3670 + amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0)); 3671 + amdgpu_ring_write(ring, 0); 3672 + } 3631 3673 3632 3674 amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3)); 3633 3675 amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(usepfp) | ··· 3675 3703 amdgpu_ring_write(ring, 0x0); 3676 3704 3677 3705 /* synce CE with ME to prevent CE fetch CEIB before context switch done */ 3678 - gfx_v7_0_ce_sync_me(ring); 3706 + amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0)); 3707 + amdgpu_ring_write(ring, 0); 3708 + amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0)); 3709 + amdgpu_ring_write(ring, 0); 3679 3710 } 3680 3711 } 3681 3712 ··· 3763 3788 r = amdgpu_bo_create(adev, dws * 4, PAGE_SIZE, true, 3764 3789 AMDGPU_GEM_DOMAIN_VRAM, 3765 3790 AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, 3766 - NULL, &adev->gfx.rlc.save_restore_obj); 3791 + NULL, NULL, 3792 + &adev->gfx.rlc.save_restore_obj); 3767 3793 if (r) { 3768 3794 dev_warn(adev->dev, "(%d) create RLC sr bo failed\n", r); 3769 3795 return r; ··· 3807 3831 r = amdgpu_bo_create(adev, dws * 4, PAGE_SIZE, true, 3808 3832 AMDGPU_GEM_DOMAIN_VRAM, 3809 3833 AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, 3810 - NULL, &adev->gfx.rlc.clear_state_obj); 3834 + NULL, NULL, 3835 + &adev->gfx.rlc.clear_state_obj); 3811 3836 if (r) { 3812 3837 dev_warn(adev->dev, "(%d) create RLC c bo failed\n", r); 3813 3838 gfx_v7_0_rlc_fini(adev); ··· 3847 3870 r = amdgpu_bo_create(adev, adev->gfx.rlc.cp_table_size, PAGE_SIZE, true, 3848 3871 AMDGPU_GEM_DOMAIN_VRAM, 3849 3872 AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, 3850 - NULL, &adev->gfx.rlc.cp_table_obj); 3873 + NULL, NULL, 3874 + &adev->gfx.rlc.cp_table_obj); 3851 3875 if (r) { 3852 3876 dev_warn(adev->dev, "(%d) create RLC cp table bo failed\n", r); 3853 3877 gfx_v7_0_rlc_fini(adev); ··· 4780 4802 return r; 4781 4803 } 4782 4804 4783 - r = amdgpu_wb_get(adev, &adev->gfx.ce_sync_offs); 4784 - if (r) { 4785 - DRM_ERROR("(%d) gfx.ce_sync_offs wb alloc failed\n", r); 4786 - return r; 4787 - } 4788 - 4789 4805 for (i = 0; i < adev->gfx.num_gfx_rings; i++) { 4790 4806 ring = &adev->gfx.gfx_ring[i]; 4791 4807 ring->ring_obj = NULL; ··· 4823 4851 r = amdgpu_bo_create(adev, adev->gds.mem.gfx_partition_size, 4824 4852 PAGE_SIZE, true, 4825 4853 AMDGPU_GEM_DOMAIN_GDS, 0, 4826 - NULL, &adev->gds.gds_gfx_bo); 4854 + NULL, NULL, &adev->gds.gds_gfx_bo); 4827 4855 if (r) 4828 4856 return r; 4829 4857 4830 4858 r = amdgpu_bo_create(adev, adev->gds.gws.gfx_partition_size, 4831 4859 PAGE_SIZE, true, 4832 4860 AMDGPU_GEM_DOMAIN_GWS, 0, 4833 - NULL, &adev->gds.gws_gfx_bo); 4861 + NULL, NULL, &adev->gds.gws_gfx_bo); 4834 4862 if (r) 4835 4863 return r; 4836 4864 4837 4865 r = amdgpu_bo_create(adev, adev->gds.oa.gfx_partition_size, 4838 4866 PAGE_SIZE, true, 4839 4867 AMDGPU_GEM_DOMAIN_OA, 0, 4840 - NULL, &adev->gds.oa_gfx_bo); 4868 + NULL, NULL, &adev->gds.oa_gfx_bo); 4841 4869 if (r) 4842 4870 return r; 4843 4871 ··· 4857 4885 amdgpu_ring_fini(&adev->gfx.gfx_ring[i]); 4858 4886 for (i = 0; i < adev->gfx.num_compute_rings; i++) 4859 4887 amdgpu_ring_fini(&adev->gfx.compute_ring[i]); 4860 - 4861 - amdgpu_wb_free(adev, adev->gfx.ce_sync_offs); 4862 4888 4863 4889 gfx_v7_0_cp_compute_fini(adev); 4864 4890 gfx_v7_0_rlc_fini(adev);
+31 -52
drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
··· 868 868 r = amdgpu_bo_create(adev, 869 869 adev->gfx.mec.num_mec *adev->gfx.mec.num_pipe * MEC_HPD_SIZE * 2, 870 870 PAGE_SIZE, true, 871 - AMDGPU_GEM_DOMAIN_GTT, 0, NULL, 871 + AMDGPU_GEM_DOMAIN_GTT, 0, NULL, NULL, 872 872 &adev->gfx.mec.hpd_eop_obj); 873 873 if (r) { 874 874 dev_warn(adev->dev, "(%d) create HDP EOP bo failed\n", r); ··· 940 940 return r; 941 941 } 942 942 943 - r = amdgpu_wb_get(adev, &adev->gfx.ce_sync_offs); 944 - if (r) { 945 - DRM_ERROR("(%d) gfx.ce_sync_offs wb alloc failed\n", r); 946 - return r; 947 - } 948 - 949 943 /* set up the gfx ring */ 950 944 for (i = 0; i < adev->gfx.num_gfx_rings; i++) { 951 945 ring = &adev->gfx.gfx_ring[i]; ··· 989 995 /* reserve GDS, GWS and OA resource for gfx */ 990 996 r = amdgpu_bo_create(adev, adev->gds.mem.gfx_partition_size, 991 997 PAGE_SIZE, true, 992 - AMDGPU_GEM_DOMAIN_GDS, 0, 998 + AMDGPU_GEM_DOMAIN_GDS, 0, NULL, 993 999 NULL, &adev->gds.gds_gfx_bo); 994 1000 if (r) 995 1001 return r; 996 1002 997 1003 r = amdgpu_bo_create(adev, adev->gds.gws.gfx_partition_size, 998 1004 PAGE_SIZE, true, 999 - AMDGPU_GEM_DOMAIN_GWS, 0, 1005 + AMDGPU_GEM_DOMAIN_GWS, 0, NULL, 1000 1006 NULL, &adev->gds.gws_gfx_bo); 1001 1007 if (r) 1002 1008 return r; 1003 1009 1004 1010 r = amdgpu_bo_create(adev, adev->gds.oa.gfx_partition_size, 1005 1011 PAGE_SIZE, true, 1006 - AMDGPU_GEM_DOMAIN_OA, 0, 1012 + AMDGPU_GEM_DOMAIN_OA, 0, NULL, 1007 1013 NULL, &adev->gds.oa_gfx_bo); 1008 1014 if (r) 1009 1015 return r; ··· 1026 1032 amdgpu_ring_fini(&adev->gfx.gfx_ring[i]); 1027 1033 for (i = 0; i < adev->gfx.num_compute_rings; i++) 1028 1034 amdgpu_ring_fini(&adev->gfx.compute_ring[i]); 1029 - 1030 - amdgpu_wb_free(adev, adev->gfx.ce_sync_offs); 1031 1035 1032 1036 gfx_v8_0_mec_fini(adev); 1033 1037 ··· 3098 3106 sizeof(struct vi_mqd), 3099 3107 PAGE_SIZE, true, 3100 3108 AMDGPU_GEM_DOMAIN_GTT, 0, NULL, 3101 - &ring->mqd_obj); 3109 + NULL, &ring->mqd_obj); 3102 3110 if (r) { 3103 3111 dev_warn(adev->dev, "(%d) create MQD bo failed\n", r); 3104 3112 return r; ··· 3957 3965 DATA_SEL(write64bit ? 2 : 1) | INT_SEL(int_sel ? 2 : 0)); 3958 3966 amdgpu_ring_write(ring, lower_32_bits(seq)); 3959 3967 amdgpu_ring_write(ring, upper_32_bits(seq)); 3968 + 3960 3969 } 3961 3970 3962 3971 /** ··· 3998 4005 return true; 3999 4006 } 4000 4007 4001 - static void gfx_v8_0_ce_sync_me(struct amdgpu_ring *ring) 4002 - { 4003 - struct amdgpu_device *adev = ring->adev; 4004 - u64 gpu_addr = adev->wb.gpu_addr + adev->gfx.ce_sync_offs * 4; 4005 - 4006 - /* instruct DE to set a magic number */ 4007 - amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3)); 4008 - amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(0) | 4009 - WRITE_DATA_DST_SEL(5))); 4010 - amdgpu_ring_write(ring, gpu_addr & 0xfffffffc); 4011 - amdgpu_ring_write(ring, upper_32_bits(gpu_addr) & 0xffffffff); 4012 - amdgpu_ring_write(ring, 1); 4013 - 4014 - /* let CE wait till condition satisfied */ 4015 - amdgpu_ring_write(ring, PACKET3(PACKET3_WAIT_REG_MEM, 5)); 4016 - amdgpu_ring_write(ring, (WAIT_REG_MEM_OPERATION(0) | /* wait */ 4017 - WAIT_REG_MEM_MEM_SPACE(1) | /* memory */ 4018 - WAIT_REG_MEM_FUNCTION(3) | /* == */ 4019 - WAIT_REG_MEM_ENGINE(2))); /* ce */ 4020 - amdgpu_ring_write(ring, gpu_addr & 0xfffffffc); 4021 - amdgpu_ring_write(ring, upper_32_bits(gpu_addr) & 0xffffffff); 4022 - amdgpu_ring_write(ring, 1); 4023 - amdgpu_ring_write(ring, 0xffffffff); 4024 - amdgpu_ring_write(ring, 4); /* poll interval */ 4025 - 4026 - /* instruct CE to reset wb of ce_sync to zero */ 4027 - amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3)); 4028 - amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(2) | 4029 - WRITE_DATA_DST_SEL(5) | 4030 - WR_CONFIRM)); 4031 - amdgpu_ring_write(ring, gpu_addr & 0xfffffffc); 4032 - amdgpu_ring_write(ring, upper_32_bits(gpu_addr) & 0xffffffff); 4033 - amdgpu_ring_write(ring, 0); 4034 - } 4035 - 4036 4008 static void gfx_v8_0_ring_emit_vm_flush(struct amdgpu_ring *ring, 4037 4009 unsigned vm_id, uint64_t pd_addr) 4038 4010 { 4039 4011 int usepfp = (ring->type == AMDGPU_RING_TYPE_GFX); 4012 + uint32_t seq = ring->fence_drv.sync_seq[ring->idx]; 4013 + uint64_t addr = ring->fence_drv.gpu_addr; 4014 + 4015 + amdgpu_ring_write(ring, PACKET3(PACKET3_WAIT_REG_MEM, 5)); 4016 + amdgpu_ring_write(ring, (WAIT_REG_MEM_MEM_SPACE(1) | /* memory */ 4017 + WAIT_REG_MEM_FUNCTION(3))); /* equal */ 4018 + amdgpu_ring_write(ring, addr & 0xfffffffc); 4019 + amdgpu_ring_write(ring, upper_32_bits(addr) & 0xffffffff); 4020 + amdgpu_ring_write(ring, seq); 4021 + amdgpu_ring_write(ring, 0xffffffff); 4022 + amdgpu_ring_write(ring, 4); /* poll interval */ 4023 + 4024 + if (usepfp) { 4025 + /* synce CE with ME to prevent CE fetch CEIB before context switch done */ 4026 + amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0)); 4027 + amdgpu_ring_write(ring, 0); 4028 + amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0)); 4029 + amdgpu_ring_write(ring, 0); 4030 + } 4040 4031 4041 4032 amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3)); 4042 4033 amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(usepfp) | 4043 - WRITE_DATA_DST_SEL(0))); 4034 + WRITE_DATA_DST_SEL(0)) | 4035 + WR_CONFIRM); 4044 4036 if (vm_id < 8) { 4045 4037 amdgpu_ring_write(ring, 4046 4038 (mmVM_CONTEXT0_PAGE_TABLE_BASE_ADDR + vm_id)); ··· 4061 4083 /* sync PFP to ME, otherwise we might get invalid PFP reads */ 4062 4084 amdgpu_ring_write(ring, PACKET3(PACKET3_PFP_SYNC_ME, 0)); 4063 4085 amdgpu_ring_write(ring, 0x0); 4064 - 4065 - /* synce CE with ME to prevent CE fetch CEIB before context switch done */ 4066 - gfx_v8_0_ce_sync_me(ring); 4086 + amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0)); 4087 + amdgpu_ring_write(ring, 0); 4088 + amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0)); 4089 + amdgpu_ring_write(ring, 0); 4067 4090 } 4068 4091 } 4069 4092
+1 -1
drivers/gpu/drm/amd/amdgpu/iceland_smc.c
··· 625 625 ret = amdgpu_bo_create(adev, image_size, PAGE_SIZE, 626 626 true, AMDGPU_GEM_DOMAIN_VRAM, 627 627 AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, 628 - NULL, toc_buf); 628 + NULL, NULL, toc_buf); 629 629 if (ret) { 630 630 DRM_ERROR("Failed to allocate memory for TOC buffer\n"); 631 631 return -ENOMEM;
+2 -2
drivers/gpu/drm/amd/amdgpu/tonga_smc.c
··· 763 763 ret = amdgpu_bo_create(adev, image_size, PAGE_SIZE, 764 764 true, AMDGPU_GEM_DOMAIN_VRAM, 765 765 AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, 766 - NULL, toc_buf); 766 + NULL, NULL, toc_buf); 767 767 if (ret) { 768 768 DRM_ERROR("Failed to allocate memory for TOC buffer\n"); 769 769 return -ENOMEM; ··· 773 773 ret = amdgpu_bo_create(adev, smu_internal_buffer_size, PAGE_SIZE, 774 774 true, AMDGPU_GEM_DOMAIN_VRAM, 775 775 AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, 776 - NULL, smu_buf); 776 + NULL, NULL, smu_buf); 777 777 if (ret) { 778 778 DRM_ERROR("Failed to allocate memory for SMU internal buffer\n"); 779 779 return -ENOMEM;
+2 -2
drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c
··· 224 224 int r; 225 225 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 226 226 227 - r = uvd_v4_2_hw_fini(adev); 227 + r = amdgpu_uvd_suspend(adev); 228 228 if (r) 229 229 return r; 230 230 231 - r = amdgpu_uvd_suspend(adev); 231 + r = uvd_v4_2_hw_fini(adev); 232 232 if (r) 233 233 return r; 234 234
+2 -2
drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c
··· 220 220 int r; 221 221 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 222 222 223 - r = uvd_v5_0_hw_fini(adev); 223 + r = amdgpu_uvd_suspend(adev); 224 224 if (r) 225 225 return r; 226 226 227 - r = amdgpu_uvd_suspend(adev); 227 + r = uvd_v5_0_hw_fini(adev); 228 228 if (r) 229 229 return r; 230 230
+12 -8
drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c
··· 214 214 int r; 215 215 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 216 216 217 + /* Skip this for APU for now */ 218 + if (!(adev->flags & AMD_IS_APU)) { 219 + r = amdgpu_uvd_suspend(adev); 220 + if (r) 221 + return r; 222 + } 217 223 r = uvd_v6_0_hw_fini(adev); 218 - if (r) 219 - return r; 220 - 221 - r = amdgpu_uvd_suspend(adev); 222 224 if (r) 223 225 return r; 224 226 ··· 232 230 int r; 233 231 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 234 232 235 - r = amdgpu_uvd_resume(adev); 236 - if (r) 237 - return r; 238 - 233 + /* Skip this for APU for now */ 234 + if (!(adev->flags & AMD_IS_APU)) { 235 + r = amdgpu_uvd_resume(adev); 236 + if (r) 237 + return r; 238 + } 239 239 r = uvd_v6_0_hw_init(adev); 240 240 if (r) 241 241 return r;
+2 -1
drivers/gpu/drm/amd/amdgpu/vi.c
··· 1400 1400 case CHIP_CARRIZO: 1401 1401 adev->has_uvd = true; 1402 1402 adev->cg_flags = 0; 1403 - adev->pg_flags = AMDGPU_PG_SUPPORT_UVD | AMDGPU_PG_SUPPORT_VCE; 1403 + /* Disable UVD pg */ 1404 + adev->pg_flags = /* AMDGPU_PG_SUPPORT_UVD | */AMDGPU_PG_SUPPORT_VCE; 1404 1405 adev->external_rev_id = adev->rev_id + 0x1; 1405 1406 if (amdgpu_smc_load_fw && smc_enabled) 1406 1407 adev->firmware.smu_load = true;
+41
drivers/gpu/drm/amd/scheduler/gpu_sched_trace.h
··· 1 + #if !defined(_GPU_SCHED_TRACE_H) || defined(TRACE_HEADER_MULTI_READ) 2 + #define _GPU_SCHED_TRACE_H_ 3 + 4 + #include <linux/stringify.h> 5 + #include <linux/types.h> 6 + #include <linux/tracepoint.h> 7 + 8 + #include <drm/drmP.h> 9 + 10 + #undef TRACE_SYSTEM 11 + #define TRACE_SYSTEM gpu_sched 12 + #define TRACE_INCLUDE_FILE gpu_sched_trace 13 + 14 + TRACE_EVENT(amd_sched_job, 15 + TP_PROTO(struct amd_sched_job *sched_job), 16 + TP_ARGS(sched_job), 17 + TP_STRUCT__entry( 18 + __field(struct amd_sched_entity *, entity) 19 + __field(const char *, name) 20 + __field(u32, job_count) 21 + __field(int, hw_job_count) 22 + ), 23 + 24 + TP_fast_assign( 25 + __entry->entity = sched_job->s_entity; 26 + __entry->name = sched_job->sched->name; 27 + __entry->job_count = kfifo_len( 28 + &sched_job->s_entity->job_queue) / sizeof(sched_job); 29 + __entry->hw_job_count = atomic_read( 30 + &sched_job->sched->hw_rq_count); 31 + ), 32 + TP_printk("entity=%p, ring=%s, job count:%u, hw job count:%d", 33 + __entry->entity, __entry->name, __entry->job_count, 34 + __entry->hw_job_count) 35 + ); 36 + #endif 37 + 38 + /* This part must be outside protection */ 39 + #undef TRACE_INCLUDE_PATH 40 + #define TRACE_INCLUDE_PATH . 41 + #include <trace/define_trace.h>
+78 -77
drivers/gpu/drm/amd/scheduler/gpu_scheduler.c
··· 27 27 #include <drm/drmP.h> 28 28 #include "gpu_scheduler.h" 29 29 30 + #define CREATE_TRACE_POINTS 31 + #include "gpu_sched_trace.h" 32 + 30 33 static struct amd_sched_job * 31 34 amd_sched_entity_pop_job(struct amd_sched_entity *entity); 32 35 static void amd_sched_wakeup(struct amd_gpu_scheduler *sched); ··· 68 65 amd_sched_rq_select_job(struct amd_sched_rq *rq) 69 66 { 70 67 struct amd_sched_entity *entity; 71 - struct amd_sched_job *job; 68 + struct amd_sched_job *sched_job; 72 69 73 70 spin_lock(&rq->lock); 74 71 75 72 entity = rq->current_entity; 76 73 if (entity) { 77 74 list_for_each_entry_continue(entity, &rq->entities, list) { 78 - job = amd_sched_entity_pop_job(entity); 79 - if (job) { 75 + sched_job = amd_sched_entity_pop_job(entity); 76 + if (sched_job) { 80 77 rq->current_entity = entity; 81 78 spin_unlock(&rq->lock); 82 - return job; 79 + return sched_job; 83 80 } 84 81 } 85 82 } 86 83 87 84 list_for_each_entry(entity, &rq->entities, list) { 88 85 89 - job = amd_sched_entity_pop_job(entity); 90 - if (job) { 86 + sched_job = amd_sched_entity_pop_job(entity); 87 + if (sched_job) { 91 88 rq->current_entity = entity; 92 89 spin_unlock(&rq->lock); 93 - return job; 90 + return sched_job; 94 91 } 95 92 96 93 if (entity == rq->current_entity) ··· 118 115 struct amd_sched_rq *rq, 119 116 uint32_t jobs) 120 117 { 118 + int r; 119 + 121 120 if (!(sched && entity && rq)) 122 121 return -EINVAL; 123 122 124 123 memset(entity, 0, sizeof(struct amd_sched_entity)); 125 - entity->belongto_rq = rq; 126 - entity->scheduler = sched; 127 - entity->fence_context = fence_context_alloc(1); 128 - if(kfifo_alloc(&entity->job_queue, 129 - jobs * sizeof(void *), 130 - GFP_KERNEL)) 131 - return -EINVAL; 124 + INIT_LIST_HEAD(&entity->list); 125 + entity->rq = rq; 126 + entity->sched = sched; 132 127 133 128 spin_lock_init(&entity->queue_lock); 129 + r = kfifo_alloc(&entity->job_queue, jobs * sizeof(void *), GFP_KERNEL); 130 + if (r) 131 + return r; 132 + 134 133 atomic_set(&entity->fence_seq, 0); 134 + entity->fence_context = fence_context_alloc(1); 135 135 136 136 /* Add the entity to the run queue */ 137 137 amd_sched_rq_add_entity(rq, entity); 138 + 138 139 return 0; 139 140 } 140 141 ··· 153 146 static bool amd_sched_entity_is_initialized(struct amd_gpu_scheduler *sched, 154 147 struct amd_sched_entity *entity) 155 148 { 156 - return entity->scheduler == sched && 157 - entity->belongto_rq != NULL; 149 + return entity->sched == sched && 150 + entity->rq != NULL; 158 151 } 159 152 160 153 /** ··· 184 177 void amd_sched_entity_fini(struct amd_gpu_scheduler *sched, 185 178 struct amd_sched_entity *entity) 186 179 { 187 - struct amd_sched_rq *rq = entity->belongto_rq; 180 + struct amd_sched_rq *rq = entity->rq; 188 181 189 182 if (!amd_sched_entity_is_initialized(sched, entity)) 190 183 return; ··· 205 198 container_of(cb, struct amd_sched_entity, cb); 206 199 entity->dependency = NULL; 207 200 fence_put(f); 208 - amd_sched_wakeup(entity->scheduler); 201 + amd_sched_wakeup(entity->sched); 209 202 } 210 203 211 204 static struct amd_sched_job * 212 205 amd_sched_entity_pop_job(struct amd_sched_entity *entity) 213 206 { 214 - struct amd_gpu_scheduler *sched = entity->scheduler; 215 - struct amd_sched_job *job; 207 + struct amd_gpu_scheduler *sched = entity->sched; 208 + struct amd_sched_job *sched_job; 216 209 217 210 if (ACCESS_ONCE(entity->dependency)) 218 211 return NULL; 219 212 220 - if (!kfifo_out_peek(&entity->job_queue, &job, sizeof(job))) 213 + if (!kfifo_out_peek(&entity->job_queue, &sched_job, sizeof(sched_job))) 221 214 return NULL; 222 215 223 - while ((entity->dependency = sched->ops->dependency(job))) { 216 + while ((entity->dependency = sched->ops->dependency(sched_job))) { 224 217 225 218 if (fence_add_callback(entity->dependency, &entity->cb, 226 219 amd_sched_entity_wakeup)) ··· 229 222 return NULL; 230 223 } 231 224 232 - return job; 225 + return sched_job; 233 226 } 234 227 235 228 /** 236 229 * Helper to submit a job to the job queue 237 230 * 238 - * @job The pointer to job required to submit 231 + * @sched_job The pointer to job required to submit 239 232 * 240 233 * Returns true if we could submit the job. 241 234 */ 242 - static bool amd_sched_entity_in(struct amd_sched_job *job) 235 + static bool amd_sched_entity_in(struct amd_sched_job *sched_job) 243 236 { 244 - struct amd_sched_entity *entity = job->s_entity; 237 + struct amd_sched_entity *entity = sched_job->s_entity; 245 238 bool added, first = false; 246 239 247 240 spin_lock(&entity->queue_lock); 248 - added = kfifo_in(&entity->job_queue, &job, sizeof(job)) == sizeof(job); 241 + added = kfifo_in(&entity->job_queue, &sched_job, 242 + sizeof(sched_job)) == sizeof(sched_job); 249 243 250 - if (added && kfifo_len(&entity->job_queue) == sizeof(job)) 244 + if (added && kfifo_len(&entity->job_queue) == sizeof(sched_job)) 251 245 first = true; 252 246 253 247 spin_unlock(&entity->queue_lock); 254 248 255 249 /* first job wakes up scheduler */ 256 250 if (first) 257 - amd_sched_wakeup(job->sched); 251 + amd_sched_wakeup(sched_job->sched); 258 252 259 253 return added; 260 254 } ··· 263 255 /** 264 256 * Submit a job to the job queue 265 257 * 266 - * @job The pointer to job required to submit 258 + * @sched_job The pointer to job required to submit 267 259 * 268 260 * Returns 0 for success, negative error code otherwise. 269 261 */ ··· 279 271 fence_get(&fence->base); 280 272 sched_job->s_fence = fence; 281 273 282 - wait_event(entity->scheduler->job_scheduled, 274 + wait_event(entity->sched->job_scheduled, 283 275 amd_sched_entity_in(sched_job)); 284 - 276 + trace_amd_sched_job(sched_job); 285 277 return 0; 286 278 } 287 279 ··· 309 301 static struct amd_sched_job * 310 302 amd_sched_select_job(struct amd_gpu_scheduler *sched) 311 303 { 312 - struct amd_sched_job *job; 304 + struct amd_sched_job *sched_job; 313 305 314 306 if (!amd_sched_ready(sched)) 315 307 return NULL; 316 308 317 309 /* Kernel run queue has higher priority than normal run queue*/ 318 - job = amd_sched_rq_select_job(&sched->kernel_rq); 319 - if (job == NULL) 320 - job = amd_sched_rq_select_job(&sched->sched_rq); 310 + sched_job = amd_sched_rq_select_job(&sched->kernel_rq); 311 + if (sched_job == NULL) 312 + sched_job = amd_sched_rq_select_job(&sched->sched_rq); 321 313 322 - return job; 314 + return sched_job; 323 315 } 324 316 325 317 static void amd_sched_process_job(struct fence *f, struct fence_cb *cb) 326 318 { 327 - struct amd_sched_job *sched_job = 328 - container_of(cb, struct amd_sched_job, cb); 329 - struct amd_gpu_scheduler *sched; 319 + struct amd_sched_fence *s_fence = 320 + container_of(cb, struct amd_sched_fence, cb); 321 + struct amd_gpu_scheduler *sched = s_fence->sched; 330 322 331 - sched = sched_job->sched; 332 - amd_sched_fence_signal(sched_job->s_fence); 333 323 atomic_dec(&sched->hw_rq_count); 334 - fence_put(&sched_job->s_fence->base); 335 - sched->ops->process_job(sched_job); 324 + amd_sched_fence_signal(s_fence); 325 + fence_put(&s_fence->base); 336 326 wake_up_interruptible(&sched->wake_up_worker); 337 327 } 338 328 ··· 344 338 345 339 while (!kthread_should_stop()) { 346 340 struct amd_sched_entity *entity; 347 - struct amd_sched_job *job; 341 + struct amd_sched_fence *s_fence; 342 + struct amd_sched_job *sched_job; 348 343 struct fence *fence; 349 344 350 345 wait_event_interruptible(sched->wake_up_worker, 351 346 kthread_should_stop() || 352 - (job = amd_sched_select_job(sched))); 347 + (sched_job = amd_sched_select_job(sched))); 353 348 354 - if (!job) 349 + if (!sched_job) 355 350 continue; 356 351 357 - entity = job->s_entity; 352 + entity = sched_job->s_entity; 353 + s_fence = sched_job->s_fence; 358 354 atomic_inc(&sched->hw_rq_count); 359 - fence = sched->ops->run_job(job); 355 + fence = sched->ops->run_job(sched_job); 360 356 if (fence) { 361 - r = fence_add_callback(fence, &job->cb, 357 + r = fence_add_callback(fence, &s_fence->cb, 362 358 amd_sched_process_job); 363 359 if (r == -ENOENT) 364 - amd_sched_process_job(fence, &job->cb); 360 + amd_sched_process_job(fence, &s_fence->cb); 365 361 else if (r) 366 362 DRM_ERROR("fence add callback failed (%d)\n", r); 367 363 fence_put(fence); 364 + } else { 365 + DRM_ERROR("Failed to run job!\n"); 366 + amd_sched_process_job(NULL, &s_fence->cb); 368 367 } 369 368 370 - count = kfifo_out(&entity->job_queue, &job, sizeof(job)); 371 - WARN_ON(count != sizeof(job)); 369 + count = kfifo_out(&entity->job_queue, &sched_job, 370 + sizeof(sched_job)); 371 + WARN_ON(count != sizeof(sched_job)); 372 372 wake_up(&sched->job_scheduled); 373 373 } 374 374 return 0; 375 375 } 376 376 377 377 /** 378 - * Create a gpu scheduler 378 + * Init a gpu scheduler instance 379 379 * 380 + * @sched The pointer to the scheduler 380 381 * @ops The backend operations for this scheduler. 381 - * @ring The the ring id for the scheduler. 382 382 * @hw_submissions Number of hw submissions to do. 383 + * @name Name used for debugging 383 384 * 384 - * Return the pointer to scheduler for success, otherwise return NULL 385 + * Return 0 on success, otherwise error code. 385 386 */ 386 - struct amd_gpu_scheduler *amd_sched_create(struct amd_sched_backend_ops *ops, 387 - unsigned ring, unsigned hw_submission, 388 - void *priv) 387 + int amd_sched_init(struct amd_gpu_scheduler *sched, 388 + struct amd_sched_backend_ops *ops, 389 + unsigned hw_submission, const char *name) 389 390 { 390 - struct amd_gpu_scheduler *sched; 391 - 392 - sched = kzalloc(sizeof(struct amd_gpu_scheduler), GFP_KERNEL); 393 - if (!sched) 394 - return NULL; 395 - 396 391 sched->ops = ops; 397 - sched->ring_id = ring; 398 392 sched->hw_submission_limit = hw_submission; 399 - sched->priv = priv; 400 - snprintf(sched->name, sizeof(sched->name), "amdgpu[%d]", ring); 393 + sched->name = name; 401 394 amd_sched_rq_init(&sched->sched_rq); 402 395 amd_sched_rq_init(&sched->kernel_rq); 403 396 404 397 init_waitqueue_head(&sched->wake_up_worker); 405 398 init_waitqueue_head(&sched->job_scheduled); 406 399 atomic_set(&sched->hw_rq_count, 0); 400 + 407 401 /* Each scheduler will run on a seperate kernel thread */ 408 402 sched->thread = kthread_run(amd_sched_main, sched, sched->name); 409 403 if (IS_ERR(sched->thread)) { 410 - DRM_ERROR("Failed to create scheduler for id %d.\n", ring); 411 - kfree(sched); 412 - return NULL; 404 + DRM_ERROR("Failed to create scheduler for %s.\n", name); 405 + return PTR_ERR(sched->thread); 413 406 } 414 407 415 - return sched; 408 + return 0; 416 409 } 417 410 418 411 /** 419 412 * Destroy a gpu scheduler 420 413 * 421 414 * @sched The pointer to the scheduler 422 - * 423 - * return 0 if succeed. -1 if failed. 424 415 */ 425 - int amd_sched_destroy(struct amd_gpu_scheduler *sched) 416 + void amd_sched_fini(struct amd_gpu_scheduler *sched) 426 417 { 427 418 kthread_stop(sched->thread); 428 - kfree(sched); 429 - return 0; 430 419 }
+20 -21
drivers/gpu/drm/amd/scheduler/gpu_scheduler.h
··· 38 38 */ 39 39 struct amd_sched_entity { 40 40 struct list_head list; 41 - struct amd_sched_rq *belongto_rq; 42 - atomic_t fence_seq; 43 - /* the job_queue maintains the jobs submitted by clients */ 44 - struct kfifo job_queue; 41 + struct amd_sched_rq *rq; 42 + struct amd_gpu_scheduler *sched; 43 + 45 44 spinlock_t queue_lock; 46 - struct amd_gpu_scheduler *scheduler; 45 + struct kfifo job_queue; 46 + 47 + atomic_t fence_seq; 47 48 uint64_t fence_context; 49 + 48 50 struct fence *dependency; 49 51 struct fence_cb cb; 50 52 }; ··· 64 62 65 63 struct amd_sched_fence { 66 64 struct fence base; 67 - struct amd_gpu_scheduler *scheduler; 65 + struct fence_cb cb; 66 + struct amd_gpu_scheduler *sched; 68 67 spinlock_t lock; 69 68 void *owner; 70 69 }; 71 70 72 71 struct amd_sched_job { 73 - struct fence_cb cb; 74 72 struct amd_gpu_scheduler *sched; 75 73 struct amd_sched_entity *s_entity; 76 74 struct amd_sched_fence *s_fence; ··· 93 91 * these functions should be implemented in driver side 94 92 */ 95 93 struct amd_sched_backend_ops { 96 - struct fence *(*dependency)(struct amd_sched_job *job); 97 - struct fence *(*run_job)(struct amd_sched_job *job); 98 - void (*process_job)(struct amd_sched_job *job); 94 + struct fence *(*dependency)(struct amd_sched_job *sched_job); 95 + struct fence *(*run_job)(struct amd_sched_job *sched_job); 99 96 }; 100 97 101 98 /** 102 99 * One scheduler is implemented for each hardware ring 103 100 */ 104 101 struct amd_gpu_scheduler { 105 - struct task_struct *thread; 102 + struct amd_sched_backend_ops *ops; 103 + uint32_t hw_submission_limit; 104 + const char *name; 106 105 struct amd_sched_rq sched_rq; 107 106 struct amd_sched_rq kernel_rq; 108 - atomic_t hw_rq_count; 109 - struct amd_sched_backend_ops *ops; 110 - uint32_t ring_id; 111 107 wait_queue_head_t wake_up_worker; 112 108 wait_queue_head_t job_scheduled; 113 - uint32_t hw_submission_limit; 114 - char name[20]; 115 - void *priv; 109 + atomic_t hw_rq_count; 110 + struct task_struct *thread; 116 111 }; 117 112 118 - struct amd_gpu_scheduler * 119 - amd_sched_create(struct amd_sched_backend_ops *ops, 120 - uint32_t ring, uint32_t hw_submission, void *priv); 121 - int amd_sched_destroy(struct amd_gpu_scheduler *sched); 113 + int amd_sched_init(struct amd_gpu_scheduler *sched, 114 + struct amd_sched_backend_ops *ops, 115 + uint32_t hw_submission, const char *name); 116 + void amd_sched_fini(struct amd_gpu_scheduler *sched); 122 117 123 118 int amd_sched_entity_init(struct amd_gpu_scheduler *sched, 124 119 struct amd_sched_entity *entity,
+2 -2
drivers/gpu/drm/amd/scheduler/sched_fence.c
··· 36 36 if (fence == NULL) 37 37 return NULL; 38 38 fence->owner = owner; 39 - fence->scheduler = s_entity->scheduler; 39 + fence->sched = s_entity->sched; 40 40 spin_lock_init(&fence->lock); 41 41 42 42 seq = atomic_inc_return(&s_entity->fence_seq); ··· 63 63 static const char *amd_sched_fence_get_timeline_name(struct fence *f) 64 64 { 65 65 struct amd_sched_fence *fence = to_amd_sched_fence(f); 66 - return (const char *)fence->scheduler->name; 66 + return (const char *)fence->sched->name; 67 67 } 68 68 69 69 static bool amd_sched_fence_enable_signaling(struct fence *f)
+4
drivers/gpu/drm/radeon/radeon_device.c
··· 1573 1573 1574 1574 drm_kms_helper_poll_disable(dev); 1575 1575 1576 + drm_modeset_lock_all(dev); 1576 1577 /* turn off display hw */ 1577 1578 list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 1578 1579 drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF); 1579 1580 } 1581 + drm_modeset_unlock_all(dev); 1580 1582 1581 1583 /* unpin the front buffers and cursors */ 1582 1584 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { ··· 1736 1734 if (fbcon) { 1737 1735 drm_helper_resume_force_mode(dev); 1738 1736 /* turn on display hw */ 1737 + drm_modeset_lock_all(dev); 1739 1738 list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 1740 1739 drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON); 1741 1740 } 1741 + drm_modeset_unlock_all(dev); 1742 1742 } 1743 1743 1744 1744 drm_kms_helper_poll_enable(dev);
+1
drivers/gpu/drm/radeon/si_dpm.c
··· 2927 2927 { PCI_VENDOR_ID_ATI, 0x6810, 0x1462, 0x3036, 0, 120000 }, 2928 2928 { PCI_VENDOR_ID_ATI, 0x6811, 0x174b, 0xe271, 0, 120000 }, 2929 2929 { PCI_VENDOR_ID_ATI, 0x6810, 0x174b, 0xe271, 85000, 90000 }, 2930 + { PCI_VENDOR_ID_ATI, 0x6811, 0x1762, 0x2015, 0, 120000 }, 2930 2931 { 0, 0, 0, 0 }, 2931 2932 }; 2932 2933