aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c37
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 */
2544void amdgpu_vm_set_fragment_size(struct amdgpu_device *adev, uint32_t fragment_size_default) 2544void 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 */
2558void amdgpu_vm_adjust_size(struct amdgpu_device *adev, uint64_t vm_size, uint32_t fragment_size_default) 2559void 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 */
2791bool 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