Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+17 −20
Original line number Diff line number Diff line
@@ -93,12 +93,12 @@

static struct drm_mm_node *drm_mm_search_free_generic(const struct drm_mm *mm,
						u64 size,
						unsigned alignment,
						u64 alignment,
						unsigned long color,
						enum drm_mm_search_flags flags);
static struct drm_mm_node *drm_mm_search_free_in_range_generic(const struct drm_mm *mm,
						u64 size,
						unsigned alignment,
						u64 alignment,
						unsigned long color,
						u64 start,
						u64 end,
@@ -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,
				 struct drm_mm_node *node,
				 u64 size, unsigned alignment,
				 u64 size, u64 alignment,
				 unsigned long color,
				 enum drm_mm_allocator_flags flags)
{
@@ -246,10 +246,9 @@ static void drm_mm_insert_helper(struct drm_mm_node *hole_node,
		adj_start = adj_end - size;

	if (alignment) {
		u64 tmp = adj_start;
		unsigned rem;
		u64 rem;

		rem = do_div(tmp, alignment);
		div64_u64_rem(adj_start, alignment, &rem);
		if (rem) {
			if (flags & DRM_MM_CREATE_TOP)
				adj_start -= rem;
@@ -376,7 +375,7 @@ EXPORT_SYMBOL(drm_mm_reserve_node);
 * 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,
			       u64 size, unsigned alignment,
			       u64 size, u64 alignment,
			       unsigned long color,
			       enum drm_mm_search_flags sflags,
			       enum drm_mm_allocator_flags aflags)
@@ -398,7 +397,7 @@ EXPORT_SYMBOL(drm_mm_insert_node_generic);

static void drm_mm_insert_helper_range(struct drm_mm_node *hole_node,
				       struct drm_mm_node *node,
				       u64 size, unsigned alignment,
				       u64 size, u64 alignment,
				       unsigned long color,
				       u64 start, u64 end,
				       enum drm_mm_allocator_flags flags)
@@ -423,10 +422,9 @@ static void drm_mm_insert_helper_range(struct drm_mm_node *hole_node,
		adj_start = adj_end - size;

	if (alignment) {
		u64 tmp = adj_start;
		unsigned rem;
		u64 rem;

		rem = do_div(tmp, alignment);
		div64_u64_rem(adj_start, alignment, &rem);
		if (rem) {
			if (flags & DRM_MM_CREATE_TOP)
				adj_start -= rem;
@@ -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.
 */
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,
					u64 start, u64 end,
					enum drm_mm_search_flags sflags,
@@ -548,16 +546,15 @@ void drm_mm_remove_node(struct drm_mm_node *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)
		return 0;

	if (alignment) {
		u64 tmp = start;
		unsigned rem;
		u64 rem;

		rem = do_div(tmp, alignment);
		div64_u64_rem(start, alignment, &rem);
		if (rem)
			start += alignment - rem;
	}
@@ -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,
						      u64 size,
						      unsigned alignment,
						      u64 alignment,
						      unsigned long color,
						      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,

static struct drm_mm_node *drm_mm_search_free_in_range_generic(const struct drm_mm *mm,
							u64 size,
							unsigned alignment,
							u64 alignment,
							unsigned long color,
							u64 start,
							u64 end,
@@ -729,7 +726,7 @@ EXPORT_SYMBOL(drm_mm_replace_node);
 */
void drm_mm_init_scan(struct drm_mm *mm,
		      u64 size,
		      unsigned alignment,
		      u64 alignment,
		      unsigned long color)
{
	mm->scan_color = color;
@@ -762,7 +759,7 @@ EXPORT_SYMBOL(drm_mm_init_scan);
 */
void drm_mm_init_scan_with_range(struct drm_mm *mm,
				 u64 size,
				 unsigned alignment,
				 u64 alignment,
				 unsigned long color,
				 u64 start,
				 u64 end)
+2 −2
Original line number Diff line number Diff line
@@ -1116,7 +1116,7 @@ static int igt_align64(void *ignored)

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_size, scan->scan_alignment, scan->scan_color);
}
@@ -1178,7 +1178,7 @@ static bool evict_nodes(struct drm_mm *mm,
			list_del(&e->link);
	}
	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_alignment,
		       mm->scan_color);
+8 −8
Original line number Diff line number Diff line
@@ -98,12 +98,12 @@ struct drm_mm {
	struct rb_root interval_tree;

	unsigned int scan_check_range : 1;
	unsigned scan_alignment;
	unsigned int scanned_blocks;
	unsigned long scan_color;
	u64 scan_alignment;
	u64 scan_size;
	u64 scan_hit_start;
	u64 scan_hit_end;
	unsigned scanned_blocks;
	u64 scan_start;
	u64 scan_end;
	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);
int drm_mm_insert_node_generic(struct drm_mm *mm,
			       struct drm_mm_node *node,
			       u64 size,
			       unsigned alignment,
			       u64 alignment,
			       unsigned long color,
			       enum drm_mm_search_flags sflags,
			       enum drm_mm_allocator_flags aflags);
@@ -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,
				     struct drm_mm_node *node,
				     u64 size,
				     unsigned alignment,
				     u64 alignment,
				     enum drm_mm_search_flags 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,
int drm_mm_insert_node_in_range_generic(struct drm_mm *mm,
					struct drm_mm_node *node,
					u64 size,
					unsigned alignment,
					u64 alignment,
					unsigned long color,
					u64 start,
					u64 end,
@@ -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,
					      struct drm_mm_node *node,
					      u64 size,
					      unsigned alignment,
					      u64 alignment,
					      u64 start,
					      u64 end,
					      enum drm_mm_search_flags flags)
@@ -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,
		      u64 size,
		      unsigned alignment,
		      u64 alignment,
		      unsigned long color);
void drm_mm_init_scan_with_range(struct drm_mm *mm,
				 u64 size,
				 unsigned alignment,
				 u64 alignment,
				 unsigned long color,
				 u64 start,
				 u64 end);