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

drm/amdgpu: use kernel submit helper in vm

Signed-off-by: Chunming Zhou <david1.zhou@amd.com>
Reviewed-by: Christian K?nig <christian.koenig@amd.com>

authored by

Chunming Zhou and committed by
Alex Deucher
4af9f07c 953e8fd4

+33 -144
-14
drivers/gpu/drm/amd/amdgpu/amdgpu.h
··· 1235 1235 void __user *user_ptr; 1236 1236 }; 1237 1237 1238 - union amdgpu_sched_job_param { 1239 - struct { 1240 - struct amdgpu_vm *vm; 1241 - uint64_t start; 1242 - uint64_t last; 1243 - struct fence **fence; 1244 - 1245 - } vm_mapping; 1246 - struct { 1247 - struct amdgpu_bo *bo; 1248 - } vm; 1249 - }; 1250 - 1251 1238 struct amdgpu_cs_parser { 1252 1239 struct amdgpu_device *adev; 1253 1240 struct drm_file *filp; ··· 1259 1272 struct mutex job_lock; 1260 1273 struct work_struct job_work; 1261 1274 int (*prepare_job)(struct amdgpu_cs_parser *sched_job); 1262 - union amdgpu_sched_job_param job_param; 1263 1275 int (*run_job)(struct amdgpu_cs_parser *sched_job); 1264 1276 int (*free_job)(struct amdgpu_cs_parser *sched_job); 1265 1277 };
+2 -2
drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c
··· 121 121 uint64_t v_seq; 122 122 struct amdgpu_cs_parser *sched_job = 123 123 amdgpu_cs_parser_create(adev, owner, &adev->kernel_ctx, 124 - ibs, 1); 124 + ibs, num_ibs); 125 125 if(!sched_job) { 126 126 return -ENOMEM; 127 127 } ··· 139 139 if (r) 140 140 WARN(true, "emit timeout\n"); 141 141 } else 142 - r = amdgpu_ib_schedule(adev, 1, ibs, owner); 142 + r = amdgpu_ib_schedule(adev, num_ibs, ibs, owner); 143 143 if (r) 144 144 return r; 145 145 *f = &ibs[num_ibs - 1].fence->base;
+31 -128
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
··· 316 316 return 0; 317 317 } 318 318 319 - static int amdgpu_vm_run_job( 320 - struct amdgpu_cs_parser *sched_job) 321 - { 322 - amdgpu_bo_fence(sched_job->job_param.vm.bo, 323 - &sched_job->ibs[sched_job->num_ibs -1].fence->base, true); 324 - return 0; 325 - } 326 - 327 319 /** 328 320 * amdgpu_vm_clear_bo - initially clear the page dir/table 329 321 * ··· 326 334 struct amdgpu_bo *bo) 327 335 { 328 336 struct amdgpu_ring *ring = adev->vm_manager.vm_pte_funcs_ring; 329 - struct amdgpu_cs_parser *sched_job = NULL; 337 + struct fence *fence = NULL; 330 338 struct amdgpu_ib *ib; 331 339 unsigned entries; 332 340 uint64_t addr; ··· 360 368 amdgpu_vm_update_pages(adev, ib, addr, 0, entries, 0, 0, 0); 361 369 amdgpu_vm_pad_ib(adev, ib); 362 370 WARN_ON(ib->length_dw > 64); 363 - 371 + r = amdgpu_sched_ib_submit_kernel_helper(adev, ring, ib, 1, 372 + &amdgpu_vm_free_job, 373 + AMDGPU_FENCE_OWNER_VM, 374 + &fence); 375 + if (!r) 376 + amdgpu_bo_fence(bo, fence, true); 364 377 if (amdgpu_enable_scheduler) { 365 - int r; 366 - uint64_t v_seq; 367 - sched_job = amdgpu_cs_parser_create(adev, AMDGPU_FENCE_OWNER_VM, 368 - &adev->kernel_ctx, ib, 1); 369 - if(!sched_job) 370 - goto error_free; 371 - sched_job->job_param.vm.bo = bo; 372 - sched_job->run_job = amdgpu_vm_run_job; 373 - sched_job->free_job = amdgpu_vm_free_job; 374 - v_seq = atomic64_inc_return(&adev->kernel_ctx.rings[ring->idx].entity.last_queued_v_seq); 375 - ib->sequence = v_seq; 376 - amd_sched_push_job(ring->scheduler, 377 - &adev->kernel_ctx.rings[ring->idx].entity, 378 - sched_job); 379 - r = amd_sched_wait_emit(&adev->kernel_ctx.rings[ring->idx].entity, 380 - v_seq, 381 - false, 382 - -1); 383 - if (r) 384 - DRM_ERROR("emit timeout\n"); 385 - 386 378 amdgpu_bo_unreserve(bo); 387 379 return 0; 388 - } else { 389 - r = amdgpu_ib_schedule(adev, 1, ib, AMDGPU_FENCE_OWNER_VM); 390 - if (r) 391 - goto error_free; 392 - amdgpu_bo_fence(bo, &ib->fence->base, true); 393 380 } 394 - 395 381 error_free: 396 382 amdgpu_ib_free(adev, ib); 397 383 kfree(ib); ··· 426 456 uint64_t last_pde = ~0, last_pt = ~0; 427 457 unsigned count = 0, pt_idx, ndw; 428 458 struct amdgpu_ib *ib; 429 - struct amdgpu_cs_parser *sched_job = NULL; 459 + struct fence *fence = NULL; 430 460 431 461 int r; 432 462 ··· 488 518 amdgpu_vm_pad_ib(adev, ib); 489 519 amdgpu_sync_resv(adev, &ib->sync, pd->tbo.resv, AMDGPU_FENCE_OWNER_VM); 490 520 WARN_ON(ib->length_dw > ndw); 491 - 492 - if (amdgpu_enable_scheduler) { 493 - int r; 494 - uint64_t v_seq; 495 - sched_job = amdgpu_cs_parser_create(adev, AMDGPU_FENCE_OWNER_VM, 496 - &adev->kernel_ctx, 497 - ib, 1); 498 - if(!sched_job) 499 - goto error_free; 500 - sched_job->job_param.vm.bo = pd; 501 - sched_job->run_job = amdgpu_vm_run_job; 502 - sched_job->free_job = amdgpu_vm_free_job; 503 - v_seq = atomic64_inc_return(&adev->kernel_ctx.rings[ring->idx].entity.last_queued_v_seq); 504 - ib->sequence = v_seq; 505 - amd_sched_push_job(ring->scheduler, 506 - &adev->kernel_ctx.rings[ring->idx].entity, 507 - sched_job); 508 - r = amd_sched_wait_emit(&adev->kernel_ctx.rings[ring->idx].entity, 509 - v_seq, 510 - false, 511 - -1); 512 - if (r) 513 - DRM_ERROR("emit timeout\n"); 514 - } else { 515 - r = amdgpu_ib_schedule(adev, 1, ib, AMDGPU_FENCE_OWNER_VM); 516 - if (r) { 517 - amdgpu_ib_free(adev, ib); 518 - return r; 519 - } 520 - amdgpu_bo_fence(pd, &ib->fence->base, true); 521 - } 521 + r = amdgpu_sched_ib_submit_kernel_helper(adev, ring, ib, 1, 522 + &amdgpu_vm_free_job, 523 + AMDGPU_FENCE_OWNER_VM, 524 + &fence); 525 + if (r) 526 + goto error_free; 527 + amdgpu_bo_fence(pd, fence, true); 522 528 } 523 529 524 530 if (!amdgpu_enable_scheduler || ib->length_dw == 0) { ··· 505 559 return 0; 506 560 507 561 error_free: 508 - if (sched_job) 509 - kfree(sched_job); 510 562 amdgpu_ib_free(adev, ib); 511 563 kfree(ib); 512 - return -ENOMEM; 564 + return r; 513 565 } 514 566 515 567 /** ··· 692 748 amdgpu_bo_fence(vm->page_tables[i].bo, fence, true); 693 749 } 694 750 695 - static int amdgpu_vm_bo_update_mapping_run_job( 696 - struct amdgpu_cs_parser *sched_job) 697 - { 698 - struct fence **fence = sched_job->job_param.vm_mapping.fence; 699 - amdgpu_vm_fence_pts(sched_job->job_param.vm_mapping.vm, 700 - sched_job->job_param.vm_mapping.start, 701 - sched_job->job_param.vm_mapping.last + 1, 702 - &sched_job->ibs[sched_job->num_ibs -1].fence->base); 703 - if (fence) { 704 - fence_put(*fence); 705 - *fence = fence_get(&sched_job->ibs[sched_job->num_ibs -1].fence->base); 706 - } 707 - return 0; 708 - } 709 751 /** 710 752 * amdgpu_vm_bo_update_mapping - update a mapping in the vm page table 711 753 * ··· 717 787 unsigned nptes, ncmds, ndw; 718 788 uint32_t flags = gtt_flags; 719 789 struct amdgpu_ib *ib; 720 - struct amdgpu_cs_parser *sched_job = NULL; 790 + struct fence *f = NULL; 721 791 int r; 722 792 723 793 /* normally,bo_va->flags only contians READABLE and WIRTEABLE bit go here ··· 799 869 800 870 amdgpu_vm_pad_ib(adev, ib); 801 871 WARN_ON(ib->length_dw > ndw); 872 + r = amdgpu_sched_ib_submit_kernel_helper(adev, ring, ib, 1, 873 + &amdgpu_vm_free_job, 874 + AMDGPU_FENCE_OWNER_VM, 875 + &f); 876 + if (r) 877 + goto error_free; 802 878 803 - if (amdgpu_enable_scheduler) { 804 - int r; 805 - uint64_t v_seq; 806 - sched_job = amdgpu_cs_parser_create(adev, AMDGPU_FENCE_OWNER_VM, 807 - &adev->kernel_ctx, ib, 1); 808 - if(!sched_job) 809 - goto error_free; 810 - sched_job->job_param.vm_mapping.vm = vm; 811 - sched_job->job_param.vm_mapping.start = mapping->it.start; 812 - sched_job->job_param.vm_mapping.last = mapping->it.last; 813 - sched_job->job_param.vm_mapping.fence = fence; 814 - sched_job->run_job = amdgpu_vm_bo_update_mapping_run_job; 815 - sched_job->free_job = amdgpu_vm_free_job; 816 - v_seq = atomic64_inc_return(&adev->kernel_ctx.rings[ring->idx].entity.last_queued_v_seq); 817 - ib->sequence = v_seq; 818 - amd_sched_push_job(ring->scheduler, 819 - &adev->kernel_ctx.rings[ring->idx].entity, 820 - sched_job); 821 - r = amd_sched_wait_emit(&adev->kernel_ctx.rings[ring->idx].entity, 822 - v_seq, 823 - false, 824 - -1); 825 - if (r) 826 - DRM_ERROR("emit timeout\n"); 827 - } else { 828 - r = amdgpu_ib_schedule(adev, 1, ib, AMDGPU_FENCE_OWNER_VM); 829 - if (r) { 830 - amdgpu_ib_free(adev, ib); 831 - return r; 832 - } 833 - 834 - amdgpu_vm_fence_pts(vm, mapping->it.start, 835 - mapping->it.last + 1, &ib->fence->base); 836 - if (fence) { 837 - fence_put(*fence); 838 - *fence = fence_get(&ib->fence->base); 839 - } 840 - 879 + amdgpu_vm_fence_pts(vm, mapping->it.start, 880 + mapping->it.last + 1, f); 881 + if (fence) { 882 + fence_put(*fence); 883 + *fence = fence_get(f); 884 + } 885 + if (!amdgpu_enable_scheduler) { 841 886 amdgpu_ib_free(adev, ib); 842 887 kfree(ib); 843 888 } 844 889 return 0; 845 890 846 891 error_free: 847 - if (sched_job) 848 - kfree(sched_job); 849 892 amdgpu_ib_free(adev, ib); 850 893 kfree(ib); 851 - return -ENOMEM; 894 + return r; 852 895 } 853 896 854 897 /**