diff options
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 |