aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2016-12-22 03:36:34 -0500
committerDaniel Vetter <daniel.vetter@ffwll.ch>2016-12-28 05:51:52 -0500
commit9a956b1548794033d5b893d6d6fcc00b197cfc9b (patch)
tree8b8cfbe1b61e48ac2a8a7aca0620a16bc29fcd15
parent0b04d474a611e2831d142e246422a03a10998ae1 (diff)
drm: Optimise power-of-two alignments in drm_mm_scan_add_block()
For power-of-two alignments, we can avoid the 64bit divide and do a simple bitwise add instead. v2: s/alignment_mask/remainder_mask/ Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> Link: http://patchwork.freedesktop.org/patch/msgid/20161222083641.2691-32-chris@chris-wilson.co.uk
-rw-r--r--drivers/gpu/drm/drm_mm.c9
-rw-r--r--include/drm/drm_mm.h1
2 files changed, 9 insertions, 1 deletions
diff --git a/drivers/gpu/drm/drm_mm.c b/drivers/gpu/drm/drm_mm.c
index 189ab84c5a59..0441d84fba74 100644
--- a/drivers/gpu/drm/drm_mm.c
+++ b/drivers/gpu/drm/drm_mm.c
@@ -742,8 +742,12 @@ void drm_mm_scan_init_with_range(struct drm_mm_scan *scan,
742 742
743 scan->mm = mm; 743 scan->mm = mm;
744 744
745 if (alignment <= 1)
746 alignment = 0;
747
745 scan->color = color; 748 scan->color = color;
746 scan->alignment = alignment; 749 scan->alignment = alignment;
750 scan->remainder_mask = is_power_of_2(alignment) ? alignment - 1 : 0;
747 scan->size = size; 751 scan->size = size;
748 scan->flags = flags; 752 scan->flags = flags;
749 753
@@ -811,7 +815,10 @@ bool drm_mm_scan_add_block(struct drm_mm_scan *scan,
811 if (scan->alignment) { 815 if (scan->alignment) {
812 u64 rem; 816 u64 rem;
813 817
814 div64_u64_rem(adj_start, scan->alignment, &rem); 818 if (likely(scan->remainder_mask))
819 rem = adj_start & scan->remainder_mask;
820 else
821 div64_u64_rem(adj_start, scan->alignment, &rem);
815 if (rem) { 822 if (rem) {
816 adj_start -= rem; 823 adj_start -= rem;
817 if (scan->flags != DRM_MM_CREATE_TOP) 824 if (scan->flags != DRM_MM_CREATE_TOP)
diff --git a/include/drm/drm_mm.h b/include/drm/drm_mm.h
index 606336fc229a..d6701d56ea74 100644
--- a/include/drm/drm_mm.h
+++ b/include/drm/drm_mm.h
@@ -110,6 +110,7 @@ struct drm_mm_scan {
110 110
111 u64 size; 111 u64 size;
112 u64 alignment; 112 u64 alignment;
113 u64 remainder_mask;
113 114
114 u64 range_start; 115 u64 range_start;
115 u64 range_end; 116 u64 range_end;