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.c34
1 files changed, 13 insertions, 21 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
index 771995093cac..c942f6b4be1b 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
@@ -2574,43 +2574,35 @@ static uint32_t amdgpu_vm_get_block_size(uint64_t vm_size)
2574} 2574}
2575 2575
2576/** 2576/**
2577 * amdgpu_vm_set_fragment_size - adjust fragment size in PTE
2578 *
2579 * @adev: amdgpu_device pointer
2580 * @fragment_size_default: the default fragment size if it's set auto
2581 */
2582void amdgpu_vm_set_fragment_size(struct amdgpu_device *adev,
2583 uint32_t fragment_size_default)
2584{
2585 if (amdgpu_vm_fragment_size == -1)
2586 adev->vm_manager.fragment_size = fragment_size_default;
2587 else
2588 adev->vm_manager.fragment_size = amdgpu_vm_fragment_size;
2589}
2590
2591/**
2592 * amdgpu_vm_adjust_size - adjust vm size, block size and fragment size 2577 * amdgpu_vm_adjust_size - adjust vm size, block size and fragment size
2593 * 2578 *
2594 * @adev: amdgpu_device pointer 2579 * @adev: amdgpu_device pointer
2595 * @vm_size: the default vm size if it's set auto 2580 * @vm_size: the default vm size if it's set auto
2596 */ 2581 */
2597void amdgpu_vm_adjust_size(struct amdgpu_device *adev, uint32_t vm_size, 2582void amdgpu_vm_adjust_size(struct amdgpu_device *adev, uint32_t vm_size,
2598 uint32_t fragment_size_default) 2583 uint32_t fragment_size_default, unsigned max_level)
2599{ 2584{
2600 /* adjust vm size firstly */ 2585 /* adjust vm size first, but only for two level setups for now */
2601 if (amdgpu_vm_size != -1) 2586 if (amdgpu_vm_size != -1 && max_level == 1)
2602 vm_size = amdgpu_vm_size; 2587 vm_size = amdgpu_vm_size;
2603 2588
2604 adev->vm_manager.max_pfn = (uint64_t)vm_size << 18; 2589 adev->vm_manager.max_pfn = (uint64_t)vm_size << 18;
2590 adev->vm_manager.num_level = max_level;
2605 2591
2606 /* block size depends on vm size */ 2592 /* block size depends on vm size and hw setup*/
2607 if (amdgpu_vm_block_size == -1) 2593 if (adev->vm_manager.num_level > 1)
2594 /* Use fixed block_size for multi level page tables */
2595 adev->vm_manager.block_size = 9;
2596 else if (amdgpu_vm_block_size == -1)
2608 adev->vm_manager.block_size = 2597 adev->vm_manager.block_size =
2609 amdgpu_vm_get_block_size(vm_size); 2598 amdgpu_vm_get_block_size(vm_size);
2610 else 2599 else
2611 adev->vm_manager.block_size = amdgpu_vm_block_size; 2600 adev->vm_manager.block_size = amdgpu_vm_block_size;
2612 2601
2613 amdgpu_vm_set_fragment_size(adev, fragment_size_default); 2602 if (amdgpu_vm_fragment_size == -1)
2603 adev->vm_manager.fragment_size = fragment_size_default;
2604 else
2605 adev->vm_manager.fragment_size = amdgpu_vm_fragment_size;
2614 2606
2615 DRM_INFO("vm size is %u GB, block size is %u-bit, fragment size is %u-bit\n", 2607 DRM_INFO("vm size is %u GB, block size is %u-bit, fragment size is %u-bit\n",
2616 vm_size, adev->vm_manager.block_size, 2608 vm_size, adev->vm_manager.block_size,