diff options
author | Dave Airlie <airlied@redhat.com> | 2017-10-08 21:00:16 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2017-10-08 21:00:16 -0400 |
commit | bb7a9c8d712f37385a706a594d6edf6e6d2669d0 (patch) | |
tree | 701a317ca8ecc2bedc40577b657dcdda3e7428c5 /drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | |
parent | 15438ab06515b093d61e2f35bb27d21e5e7f966e (diff) | |
parent | d3f04c98ead2b89887e1e3c09b26e4917bacdd9e (diff) |
Merge branch 'drm-next-4.15' of git://people.freedesktop.org/~agd5f/linux into drm-next
More new stuff for 4.15. Highlights:
- Add clock query interface for raven
- Add new FENCE_TO_HANDLE ioctl
- UVD video encode ring support on polaris
- transparent huge page DMA support
- deadlock fixes
- compute pipe lru tweaks
- powerplay cleanups and regression fixes
- fix duplicate symbol issue with radeon and amdgpu
- misc bug fixes
* 'drm-next-4.15' of git://people.freedesktop.org/~agd5f/linux: (72 commits)
drm/radeon/dp: make radeon_dp_get_dp_link_config static
drm/radeon: move ci_send_msg_to_smc to where it's used
drm/amd/sched: fix deadlock caused by unsignaled fences of deleted jobs
drm/amd/sched: NULL out the s_fence field after run_job
drm/amd/sched: move adding finish callback to amd_sched_job_begin
drm/amd/sched: fix an outdated comment
drm/amd/sched: rename amd_sched_entity_pop_job
drm/amdgpu: minor coding style fix
drm/ttm: add transparent huge page support for DMA allocations v2
drm/ttm: add support for different pool sizes
drm/ttm: remove unsued options from ttm_mem_global_alloc_page
drm/amdgpu: add uvd enc irq
drm/amdgpu: add uvd enc ib test
drm/amdgpu: add uvd enc ring test
drm/amdgpu: add uvd enc vm functions (v2)
drm/amdgpu: add uvd enc into run queue
drm/amdgpu: add uvd enc rings
drm/amdgpu: add new uvd enc ring methods
drm/amdgpu: add uvd enc command in header
drm/amdgpu: add uvd enc registers in header
...
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 37 |
1 files changed, 35 insertions, 2 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c index bbcc67038203..fee0a32ac56f 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | |||
@@ -2541,7 +2541,8 @@ static uint32_t amdgpu_vm_get_block_size(uint64_t vm_size) | |||
2541 | * @adev: amdgpu_device pointer | 2541 | * @adev: amdgpu_device pointer |
2542 | * @fragment_size_default: the default fragment size if it's set auto | 2542 | * @fragment_size_default: the default fragment size if it's set auto |
2543 | */ | 2543 | */ |
2544 | void amdgpu_vm_set_fragment_size(struct amdgpu_device *adev, uint32_t fragment_size_default) | 2544 | void amdgpu_vm_set_fragment_size(struct amdgpu_device *adev, |
2545 | uint32_t fragment_size_default) | ||
2545 | { | 2546 | { |
2546 | if (amdgpu_vm_fragment_size == -1) | 2547 | if (amdgpu_vm_fragment_size == -1) |
2547 | adev->vm_manager.fragment_size = fragment_size_default; | 2548 | adev->vm_manager.fragment_size = fragment_size_default; |
@@ -2555,7 +2556,8 @@ void amdgpu_vm_set_fragment_size(struct amdgpu_device *adev, uint32_t fragment_s | |||
2555 | * @adev: amdgpu_device pointer | 2556 | * @adev: amdgpu_device pointer |
2556 | * @vm_size: the default vm size if it's set auto | 2557 | * @vm_size: the default vm size if it's set auto |
2557 | */ | 2558 | */ |
2558 | void amdgpu_vm_adjust_size(struct amdgpu_device *adev, uint64_t vm_size, uint32_t fragment_size_default) | 2559 | void amdgpu_vm_adjust_size(struct amdgpu_device *adev, uint64_t vm_size, |
2560 | uint32_t fragment_size_default) | ||
2559 | { | 2561 | { |
2560 | /* adjust vm size firstly */ | 2562 | /* adjust vm size firstly */ |
2561 | if (amdgpu_vm_size == -1) | 2563 | if (amdgpu_vm_size == -1) |
@@ -2682,6 +2684,7 @@ int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm, | |||
2682 | } | 2684 | } |
2683 | 2685 | ||
2684 | INIT_KFIFO(vm->faults); | 2686 | INIT_KFIFO(vm->faults); |
2687 | vm->fault_credit = 16; | ||
2685 | 2688 | ||
2686 | return 0; | 2689 | return 0; |
2687 | 2690 | ||
@@ -2777,6 +2780,36 @@ void amdgpu_vm_fini(struct amdgpu_device *adev, struct amdgpu_vm *vm) | |||
2777 | } | 2780 | } |
2778 | 2781 | ||
2779 | /** | 2782 | /** |
2783 | * amdgpu_vm_pasid_fault_credit - Check fault credit for given PASID | ||
2784 | * | ||
2785 | * @adev: amdgpu_device pointer | ||
2786 | * @pasid: PASID do identify the VM | ||
2787 | * | ||
2788 | * This function is expected to be called in interrupt context. Returns | ||
2789 | * true if there was fault credit, false otherwise | ||
2790 | */ | ||
2791 | bool amdgpu_vm_pasid_fault_credit(struct amdgpu_device *adev, | ||
2792 | unsigned int pasid) | ||
2793 | { | ||
2794 | struct amdgpu_vm *vm; | ||
2795 | |||
2796 | spin_lock(&adev->vm_manager.pasid_lock); | ||
2797 | vm = idr_find(&adev->vm_manager.pasid_idr, pasid); | ||
2798 | spin_unlock(&adev->vm_manager.pasid_lock); | ||
2799 | if (!vm) | ||
2800 | /* VM not found, can't track fault credit */ | ||
2801 | return true; | ||
2802 | |||
2803 | /* No lock needed. only accessed by IRQ handler */ | ||
2804 | if (!vm->fault_credit) | ||
2805 | /* Too many faults in this VM */ | ||
2806 | return false; | ||
2807 | |||
2808 | vm->fault_credit--; | ||
2809 | return true; | ||
2810 | } | ||
2811 | |||
2812 | /** | ||
2780 | * amdgpu_vm_manager_init - init the VM manager | 2813 | * amdgpu_vm_manager_init - init the VM manager |
2781 | * | 2814 | * |
2782 | * @adev: amdgpu_device pointer | 2815 | * @adev: amdgpu_device pointer |