diff options
author | Christian König <christian.koenig@amd.com> | 2016-08-08 08:40:18 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2016-08-10 14:06:08 -0400 |
commit | e2b84e4be37462e77f34b5bd057d2483fcd3ca98 (patch) | |
tree | 4432c49dd54c3ea8d65ddfbbbdd9b996dee7bc84 /drivers/gpu/drm/amd/amdgpu | |
parent | 92696dd52e58b5caaee1dc027cf14f327f91d2e1 (diff) |
drm/amdgpu: use more than 64KB fragment size if possible
We align to 64KB, but when userspace aligns even more we can easily use more.
Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c index d2796bb4004b..7f385e78a265 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | |||
@@ -818,13 +818,13 @@ static void amdgpu_vm_frag_ptes(struct amdgpu_pte_update_params *params, | |||
818 | * allocation size to the fragment size. | 818 | * allocation size to the fragment size. |
819 | */ | 819 | */ |
820 | 820 | ||
821 | /* SI and newer are optimized for 64KB */ | 821 | const uint64_t frag_align = 1 << AMDGPU_LOG2_PAGES_PER_FRAG; |
822 | uint64_t frag_flags = AMDGPU_PTE_FRAG(AMDGPU_LOG2_PAGES_PER_FRAG); | ||
823 | uint64_t frag_align = 1 << AMDGPU_LOG2_PAGES_PER_FRAG; | ||
824 | 822 | ||
825 | uint64_t frag_start = ALIGN(start, frag_align); | 823 | uint64_t frag_start = ALIGN(start, frag_align); |
826 | uint64_t frag_end = end & ~(frag_align - 1); | 824 | uint64_t frag_end = end & ~(frag_align - 1); |
827 | 825 | ||
826 | uint32_t frag; | ||
827 | |||
828 | /* system pages are non continuously */ | 828 | /* system pages are non continuously */ |
829 | if (params->src || params->pages_addr || !(flags & AMDGPU_PTE_VALID) || | 829 | if (params->src || params->pages_addr || !(flags & AMDGPU_PTE_VALID) || |
830 | (frag_start >= frag_end)) { | 830 | (frag_start >= frag_end)) { |
@@ -833,6 +833,10 @@ static void amdgpu_vm_frag_ptes(struct amdgpu_pte_update_params *params, | |||
833 | return; | 833 | return; |
834 | } | 834 | } |
835 | 835 | ||
836 | /* use more than 64KB fragment size if possible */ | ||
837 | frag = lower_32_bits(frag_start | frag_end); | ||
838 | frag = likely(frag) ? __ffs(frag) : 31; | ||
839 | |||
836 | /* handle the 4K area at the beginning */ | 840 | /* handle the 4K area at the beginning */ |
837 | if (start != frag_start) { | 841 | if (start != frag_start) { |
838 | amdgpu_vm_update_ptes(params, vm, start, frag_start, | 842 | amdgpu_vm_update_ptes(params, vm, start, frag_start, |
@@ -842,7 +846,7 @@ static void amdgpu_vm_frag_ptes(struct amdgpu_pte_update_params *params, | |||
842 | 846 | ||
843 | /* handle the area in the middle */ | 847 | /* handle the area in the middle */ |
844 | amdgpu_vm_update_ptes(params, vm, frag_start, frag_end, dst, | 848 | amdgpu_vm_update_ptes(params, vm, frag_start, frag_end, dst, |
845 | flags | frag_flags); | 849 | flags | AMDGPU_PTE_FRAG(frag)); |
846 | 850 | ||
847 | /* handle the 4K area at the end */ | 851 | /* handle the 4K area at the end */ |
848 | if (frag_end != end) { | 852 | if (frag_end != end) { |