diff options
author | Christian König <christian.koenig@amd.com> | 2017-11-27 10:22:05 -0500 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2017-12-06 12:48:31 -0500 |
commit | 97489129c220ef67195c886f9f2bad9651edd601 (patch) | |
tree | 656cfcc8985ca50d147917e57c09fec819649e5f /drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | |
parent | f3368128bacece315aa0384b54b7da9e6f0909cd (diff) |
drm/amdgpu: allow specifying vm_block_size for multi level PDs v2
This patch allows specifying the vm_block_size even when multi level
page directories are active.
v2: fix signed/unsigned compare warning
Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c index 44430c4820cc..7de519b86b78 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | |||
@@ -2600,18 +2600,21 @@ void amdgpu_vm_adjust_size(struct amdgpu_device *adev, uint32_t vm_size, | |||
2600 | adev->vm_manager.max_pfn = (uint64_t)vm_size << 18; | 2600 | adev->vm_manager.max_pfn = (uint64_t)vm_size << 18; |
2601 | 2601 | ||
2602 | tmp = roundup_pow_of_two(adev->vm_manager.max_pfn); | 2602 | tmp = roundup_pow_of_two(adev->vm_manager.max_pfn); |
2603 | if (amdgpu_vm_block_size != -1) | ||
2604 | tmp >>= amdgpu_vm_block_size - 9; | ||
2603 | tmp = DIV_ROUND_UP(fls64(tmp) - 1, 9) - 1; | 2605 | tmp = DIV_ROUND_UP(fls64(tmp) - 1, 9) - 1; |
2604 | adev->vm_manager.num_level = min(max_level, (unsigned)tmp); | 2606 | adev->vm_manager.num_level = min(max_level, (unsigned)tmp); |
2605 | 2607 | ||
2606 | /* block size depends on vm size and hw setup*/ | 2608 | /* block size depends on vm size and hw setup*/ |
2607 | if (adev->vm_manager.num_level > 1) | 2609 | if (amdgpu_vm_block_size != -1) |
2608 | /* Use fixed block_size for multi level page tables */ | ||
2609 | adev->vm_manager.block_size = 9; | ||
2610 | else if (amdgpu_vm_block_size == -1) | ||
2611 | adev->vm_manager.block_size = | 2610 | adev->vm_manager.block_size = |
2612 | amdgpu_vm_get_block_size(vm_size); | 2611 | min((unsigned)amdgpu_vm_block_size, max_bits |
2612 | - AMDGPU_GPU_PAGE_SHIFT | ||
2613 | - 9 * adev->vm_manager.num_level); | ||
2614 | else if (adev->vm_manager.num_level > 1) | ||
2615 | adev->vm_manager.block_size = 9; | ||
2613 | else | 2616 | else |
2614 | adev->vm_manager.block_size = amdgpu_vm_block_size; | 2617 | adev->vm_manager.block_size = amdgpu_vm_get_block_size(tmp); |
2615 | 2618 | ||
2616 | if (amdgpu_vm_fragment_size == -1) | 2619 | if (amdgpu_vm_fragment_size == -1) |
2617 | adev->vm_manager.fragment_size = fragment_size_default; | 2620 | adev->vm_manager.fragment_size = fragment_size_default; |