Commit 71733207 authored by Chris Wilson's avatar Chris Wilson Committed by Daniel Vetter

drm: Promote drm_mm alignment to u64

In places (e.g. i915.ko), the alignment is exported to userspace as u64
and there now exists hardware for which we can indeed utilize a u64
alignment. As such, we need to keep 64bit integers throughout when
handling alignment.

Testcase: igt/drm_mm/align64
Testcase: igt/gem_exec_alignment
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Cc: Christian König <christian.koenig@amd.com>
Reviewed-by: default avatarChristian König <christian.koenig@amd.com>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
Link: http://patchwork.freedesktop.org/patch/msgid/20161222083641.2691-22-chris@chris-wilson.co.uk
parent d1bac3a7
...@@ -93,12 +93,12 @@ ...@@ -93,12 +93,12 @@
static struct drm_mm_node *drm_mm_search_free_generic(const struct drm_mm *mm, static struct drm_mm_node *drm_mm_search_free_generic(const struct drm_mm *mm,
u64 size, u64 size,
unsigned alignment, u64 alignment,
unsigned long color, unsigned long color,
enum drm_mm_search_flags flags); enum drm_mm_search_flags flags);
static struct drm_mm_node *drm_mm_search_free_in_range_generic(const struct drm_mm *mm, static struct drm_mm_node *drm_mm_search_free_in_range_generic(const struct drm_mm *mm,
u64 size, u64 size,
unsigned alignment, u64 alignment,
unsigned long color, unsigned long color,
u64 start, u64 start,
u64 end, u64 end,
...@@ -227,7 +227,7 @@ static void drm_mm_interval_tree_add_node(struct drm_mm_node *hole_node, ...@@ -227,7 +227,7 @@ static void drm_mm_interval_tree_add_node(struct drm_mm_node *hole_node,
static void drm_mm_insert_helper(struct drm_mm_node *hole_node, static void drm_mm_insert_helper(struct drm_mm_node *hole_node,
struct drm_mm_node *node, struct drm_mm_node *node,
u64 size, unsigned alignment, u64 size, u64 alignment,
unsigned long color, unsigned long color,
enum drm_mm_allocator_flags flags) enum drm_mm_allocator_flags flags)
{ {
...@@ -246,10 +246,9 @@ static void drm_mm_insert_helper(struct drm_mm_node *hole_node, ...@@ -246,10 +246,9 @@ static void drm_mm_insert_helper(struct drm_mm_node *hole_node,
adj_start = adj_end - size; adj_start = adj_end - size;
if (alignment) { if (alignment) {
u64 tmp = adj_start; u64 rem;
unsigned rem;
rem = do_div(tmp, alignment); div64_u64_rem(adj_start, alignment, &rem);
if (rem) { if (rem) {
if (flags & DRM_MM_CREATE_TOP) if (flags & DRM_MM_CREATE_TOP)
adj_start -= rem; adj_start -= rem;
...@@ -376,7 +375,7 @@ EXPORT_SYMBOL(drm_mm_reserve_node); ...@@ -376,7 +375,7 @@ EXPORT_SYMBOL(drm_mm_reserve_node);
* 0 on success, -ENOSPC if there's no suitable hole. * 0 on success, -ENOSPC if there's no suitable hole.
*/ */
int drm_mm_insert_node_generic(struct drm_mm *mm, struct drm_mm_node *node, int drm_mm_insert_node_generic(struct drm_mm *mm, struct drm_mm_node *node,
u64 size, unsigned alignment, u64 size, u64 alignment,
unsigned long color, unsigned long color,
enum drm_mm_search_flags sflags, enum drm_mm_search_flags sflags,
enum drm_mm_allocator_flags aflags) enum drm_mm_allocator_flags aflags)
...@@ -398,7 +397,7 @@ EXPORT_SYMBOL(drm_mm_insert_node_generic); ...@@ -398,7 +397,7 @@ EXPORT_SYMBOL(drm_mm_insert_node_generic);
static void drm_mm_insert_helper_range(struct drm_mm_node *hole_node, static void drm_mm_insert_helper_range(struct drm_mm_node *hole_node,
struct drm_mm_node *node, struct drm_mm_node *node,
u64 size, unsigned alignment, u64 size, u64 alignment,
unsigned long color, unsigned long color,
u64 start, u64 end, u64 start, u64 end,
enum drm_mm_allocator_flags flags) enum drm_mm_allocator_flags flags)
...@@ -423,10 +422,9 @@ static void drm_mm_insert_helper_range(struct drm_mm_node *hole_node, ...@@ -423,10 +422,9 @@ static void drm_mm_insert_helper_range(struct drm_mm_node *hole_node,
adj_start = adj_end - size; adj_start = adj_end - size;
if (alignment) { if (alignment) {
u64 tmp = adj_start; u64 rem;
unsigned rem;
rem = do_div(tmp, alignment); div64_u64_rem(adj_start, alignment, &rem);
if (rem) { if (rem) {
if (flags & DRM_MM_CREATE_TOP) if (flags & DRM_MM_CREATE_TOP)
adj_start -= rem; adj_start -= rem;
...@@ -482,7 +480,7 @@ static void drm_mm_insert_helper_range(struct drm_mm_node *hole_node, ...@@ -482,7 +480,7 @@ static void drm_mm_insert_helper_range(struct drm_mm_node *hole_node,
* 0 on success, -ENOSPC if there's no suitable hole. * 0 on success, -ENOSPC if there's no suitable hole.
*/ */
int drm_mm_insert_node_in_range_generic(struct drm_mm *mm, struct drm_mm_node *node, int drm_mm_insert_node_in_range_generic(struct drm_mm *mm, struct drm_mm_node *node,
u64 size, unsigned alignment, u64 size, u64 alignment,
unsigned long color, unsigned long color,
u64 start, u64 end, u64 start, u64 end,
enum drm_mm_search_flags sflags, enum drm_mm_search_flags sflags,
...@@ -548,16 +546,15 @@ void drm_mm_remove_node(struct drm_mm_node *node) ...@@ -548,16 +546,15 @@ void drm_mm_remove_node(struct drm_mm_node *node)
} }
EXPORT_SYMBOL(drm_mm_remove_node); EXPORT_SYMBOL(drm_mm_remove_node);
static int check_free_hole(u64 start, u64 end, u64 size, unsigned alignment) static int check_free_hole(u64 start, u64 end, u64 size, u64 alignment)
{ {
if (end - start < size) if (end - start < size)
return 0; return 0;
if (alignment) { if (alignment) {
u64 tmp = start; u64 rem;
unsigned rem;
rem = do_div(tmp, alignment); div64_u64_rem(start, alignment, &rem);
if (rem) if (rem)
start += alignment - rem; start += alignment - rem;
} }
...@@ -567,7 +564,7 @@ static int check_free_hole(u64 start, u64 end, u64 size, unsigned alignment) ...@@ -567,7 +564,7 @@ static int check_free_hole(u64 start, u64 end, u64 size, unsigned alignment)
static struct drm_mm_node *drm_mm_search_free_generic(const struct drm_mm *mm, static struct drm_mm_node *drm_mm_search_free_generic(const struct drm_mm *mm,
u64 size, u64 size,
unsigned alignment, u64 alignment,
unsigned long color, unsigned long color,
enum drm_mm_search_flags flags) enum drm_mm_search_flags flags)
{ {
...@@ -609,7 +606,7 @@ static struct drm_mm_node *drm_mm_search_free_generic(const struct drm_mm *mm, ...@@ -609,7 +606,7 @@ static struct drm_mm_node *drm_mm_search_free_generic(const struct drm_mm *mm,
static struct drm_mm_node *drm_mm_search_free_in_range_generic(const struct drm_mm *mm, static struct drm_mm_node *drm_mm_search_free_in_range_generic(const struct drm_mm *mm,
u64 size, u64 size,
unsigned alignment, u64 alignment,
unsigned long color, unsigned long color,
u64 start, u64 start,
u64 end, u64 end,
...@@ -729,7 +726,7 @@ EXPORT_SYMBOL(drm_mm_replace_node); ...@@ -729,7 +726,7 @@ EXPORT_SYMBOL(drm_mm_replace_node);
*/ */
void drm_mm_init_scan(struct drm_mm *mm, void drm_mm_init_scan(struct drm_mm *mm,
u64 size, u64 size,
unsigned alignment, u64 alignment,
unsigned long color) unsigned long color)
{ {
mm->scan_color = color; mm->scan_color = color;
...@@ -762,7 +759,7 @@ EXPORT_SYMBOL(drm_mm_init_scan); ...@@ -762,7 +759,7 @@ EXPORT_SYMBOL(drm_mm_init_scan);
*/ */
void drm_mm_init_scan_with_range(struct drm_mm *mm, void drm_mm_init_scan_with_range(struct drm_mm *mm,
u64 size, u64 size,
unsigned alignment, u64 alignment,
unsigned long color, unsigned long color,
u64 start, u64 start,
u64 end) u64 end)
......
...@@ -1116,7 +1116,7 @@ static int igt_align64(void *ignored) ...@@ -1116,7 +1116,7 @@ static int igt_align64(void *ignored)
static void show_scan(const struct drm_mm *scan) static void show_scan(const struct drm_mm *scan)
{ {
pr_info("scan: hit [%llx, %llx], size=%lld, align=%d, color=%ld\n", pr_info("scan: hit [%llx, %llx], size=%lld, align=%lld, color=%ld\n",
scan->scan_hit_start, scan->scan_hit_end, scan->scan_hit_start, scan->scan_hit_end,
scan->scan_size, scan->scan_alignment, scan->scan_color); scan->scan_size, scan->scan_alignment, scan->scan_color);
} }
...@@ -1178,7 +1178,7 @@ static bool evict_nodes(struct drm_mm *mm, ...@@ -1178,7 +1178,7 @@ static bool evict_nodes(struct drm_mm *mm,
list_del(&e->link); list_del(&e->link);
} }
if (list_empty(evict_list)) { if (list_empty(evict_list)) {
pr_err("Failed to find eviction: size=%lld [avail=%d], align=%d (color=%lu)\n", pr_err("Failed to find eviction: size=%lld [avail=%d], align=%lld (color=%lu)\n",
mm->scan_size, count, mm->scan_size, count,
mm->scan_alignment, mm->scan_alignment,
mm->scan_color); mm->scan_color);
......
...@@ -98,12 +98,12 @@ struct drm_mm { ...@@ -98,12 +98,12 @@ struct drm_mm {
struct rb_root interval_tree; struct rb_root interval_tree;
unsigned int scan_check_range : 1; unsigned int scan_check_range : 1;
unsigned scan_alignment; unsigned int scanned_blocks;
unsigned long scan_color; unsigned long scan_color;
u64 scan_alignment;
u64 scan_size; u64 scan_size;
u64 scan_hit_start; u64 scan_hit_start;
u64 scan_hit_end; u64 scan_hit_end;
unsigned scanned_blocks;
u64 scan_start; u64 scan_start;
u64 scan_end; u64 scan_end;
struct drm_mm_node *prev_scanned_node; struct drm_mm_node *prev_scanned_node;
...@@ -261,7 +261,7 @@ int drm_mm_reserve_node(struct drm_mm *mm, struct drm_mm_node *node); ...@@ -261,7 +261,7 @@ int drm_mm_reserve_node(struct drm_mm *mm, struct drm_mm_node *node);
int drm_mm_insert_node_generic(struct drm_mm *mm, int drm_mm_insert_node_generic(struct drm_mm *mm,
struct drm_mm_node *node, struct drm_mm_node *node,
u64 size, u64 size,
unsigned alignment, u64 alignment,
unsigned long color, unsigned long color,
enum drm_mm_search_flags sflags, enum drm_mm_search_flags sflags,
enum drm_mm_allocator_flags aflags); enum drm_mm_allocator_flags aflags);
...@@ -284,7 +284,7 @@ int drm_mm_insert_node_generic(struct drm_mm *mm, ...@@ -284,7 +284,7 @@ int drm_mm_insert_node_generic(struct drm_mm *mm,
static inline int drm_mm_insert_node(struct drm_mm *mm, static inline int drm_mm_insert_node(struct drm_mm *mm,
struct drm_mm_node *node, struct drm_mm_node *node,
u64 size, u64 size,
unsigned alignment, u64 alignment,
enum drm_mm_search_flags flags) enum drm_mm_search_flags flags)
{ {
return drm_mm_insert_node_generic(mm, node, size, alignment, 0, flags, return drm_mm_insert_node_generic(mm, node, size, alignment, 0, flags,
...@@ -294,7 +294,7 @@ static inline int drm_mm_insert_node(struct drm_mm *mm, ...@@ -294,7 +294,7 @@ static inline int drm_mm_insert_node(struct drm_mm *mm,
int drm_mm_insert_node_in_range_generic(struct drm_mm *mm, int drm_mm_insert_node_in_range_generic(struct drm_mm *mm,
struct drm_mm_node *node, struct drm_mm_node *node,
u64 size, u64 size,
unsigned alignment, u64 alignment,
unsigned long color, unsigned long color,
u64 start, u64 start,
u64 end, u64 end,
...@@ -321,7 +321,7 @@ int drm_mm_insert_node_in_range_generic(struct drm_mm *mm, ...@@ -321,7 +321,7 @@ int drm_mm_insert_node_in_range_generic(struct drm_mm *mm,
static inline int drm_mm_insert_node_in_range(struct drm_mm *mm, static inline int drm_mm_insert_node_in_range(struct drm_mm *mm,
struct drm_mm_node *node, struct drm_mm_node *node,
u64 size, u64 size,
unsigned alignment, u64 alignment,
u64 start, u64 start,
u64 end, u64 end,
enum drm_mm_search_flags flags) enum drm_mm_search_flags flags)
...@@ -361,11 +361,11 @@ __drm_mm_interval_first(const struct drm_mm *mm, u64 start, u64 last); ...@@ -361,11 +361,11 @@ __drm_mm_interval_first(const struct drm_mm *mm, u64 start, u64 last);
void drm_mm_init_scan(struct drm_mm *mm, void drm_mm_init_scan(struct drm_mm *mm,
u64 size, u64 size,
unsigned alignment, u64 alignment,
unsigned long color); unsigned long color);
void drm_mm_init_scan_with_range(struct drm_mm *mm, void drm_mm_init_scan_with_range(struct drm_mm *mm,
u64 size, u64 size,
unsigned alignment, u64 alignment,
unsigned long color, unsigned long color,
u64 start, u64 start,
u64 end); u64 end);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment