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

Commit 8bab1193 authored by Chris Wilson's avatar Chris Wilson
Browse files

drm/i915: Convert i915_ggtt_view to use an anonymous union



Reading the ggtt_views is much more pleasant without the extra
characters from specifying the union (i.e. ggtt_view.partial rather than
ggtt_view.params.partial). To make this work inside i915_vma_compare()
with only a single memcmp requires us to ensure that there are no
uninitialised bytes within each branch of the union (we make sure the
structs are packed) and we need to store the size of each branch.

v4: Rewrite changelog and add comments explaining the assert.

Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Link: http://patchwork.freedesktop.org/patch/msgid/20170114002827.31315-5-chris@chris-wilson.co.uk


Reviewed-by: default avatarJoonas Lahtinen <joonas.lahtinen@linux.intel.com>
Reviewed-by: default avatarTvrtko Ursulin <tvrtko.ursulin@intel.com>
parent 3bf4d575
Loading
Loading
Loading
Loading
+10 −10
Original line number Original line Diff line number Diff line
@@ -167,20 +167,20 @@ describe_obj(struct seq_file *m, struct drm_i915_gem_object *obj)


			case I915_GGTT_VIEW_PARTIAL:
			case I915_GGTT_VIEW_PARTIAL:
				seq_printf(m, ", partial [%08llx+%x]",
				seq_printf(m, ", partial [%08llx+%x]",
					   vma->ggtt_view.params.partial.offset << PAGE_SHIFT,
					   vma->ggtt_view.partial.offset << PAGE_SHIFT,
					   vma->ggtt_view.params.partial.size << PAGE_SHIFT);
					   vma->ggtt_view.partial.size << PAGE_SHIFT);
				break;
				break;


			case I915_GGTT_VIEW_ROTATED:
			case I915_GGTT_VIEW_ROTATED:
				seq_printf(m, ", rotated [(%ux%u, stride=%u, offset=%u), (%ux%u, stride=%u, offset=%u)]",
				seq_printf(m, ", rotated [(%ux%u, stride=%u, offset=%u), (%ux%u, stride=%u, offset=%u)]",
					   vma->ggtt_view.params.rotated.plane[0].width,
					   vma->ggtt_view.rotated.plane[0].width,
					   vma->ggtt_view.params.rotated.plane[0].height,
					   vma->ggtt_view.rotated.plane[0].height,
					   vma->ggtt_view.params.rotated.plane[0].stride,
					   vma->ggtt_view.rotated.plane[0].stride,
					   vma->ggtt_view.params.rotated.plane[0].offset,
					   vma->ggtt_view.rotated.plane[0].offset,
					   vma->ggtt_view.params.rotated.plane[1].width,
					   vma->ggtt_view.rotated.plane[1].width,
					   vma->ggtt_view.params.rotated.plane[1].height,
					   vma->ggtt_view.rotated.plane[1].height,
					   vma->ggtt_view.params.rotated.plane[1].stride,
					   vma->ggtt_view.rotated.plane[1].stride,
					   vma->ggtt_view.params.rotated.plane[1].offset);
					   vma->ggtt_view.rotated.plane[1].offset);
				break;
				break;


			default:
			default:
+4 −4
Original line number Original line Diff line number Diff line
@@ -1760,10 +1760,10 @@ compute_partial_view(struct drm_i915_gem_object *obj,
		chunk = roundup(chunk, tile_row_pages(obj));
		chunk = roundup(chunk, tile_row_pages(obj));


	view.type = I915_GGTT_VIEW_PARTIAL;
	view.type = I915_GGTT_VIEW_PARTIAL;
	view.params.partial.offset = rounddown(page_offset, chunk);
	view.partial.offset = rounddown(page_offset, chunk);
	view.params.partial.size =
	view.partial.size =
		min_t(unsigned int, chunk,
		min_t(unsigned int, chunk,
		      (obj->base.size >> PAGE_SHIFT) - view.params.partial.offset);
		      (obj->base.size >> PAGE_SHIFT) - view.partial.offset);


	/* If the partial covers the entire object, just create a normal VMA. */
	/* If the partial covers the entire object, just create a normal VMA. */
	if (chunk >= obj->base.size >> PAGE_SHIFT)
	if (chunk >= obj->base.size >> PAGE_SHIFT)
@@ -1879,7 +1879,7 @@ int i915_gem_fault(struct vm_area_struct *area, struct vm_fault *vmf)


	/* Finally, remap it using the new GTT offset */
	/* Finally, remap it using the new GTT offset */
	ret = remap_io_mapping(area,
	ret = remap_io_mapping(area,
			       area->vm_start + (vma->ggtt_view.params.partial.offset << PAGE_SHIFT),
			       area->vm_start + (vma->ggtt_view.partial.offset << PAGE_SHIFT),
			       (ggtt->mappable_base + vma->node.start) >> PAGE_SHIFT,
			       (ggtt->mappable_base + vma->node.start) >> PAGE_SHIFT,
			       min_t(u64, vma->size, area->vm_end - area->vm_start),
			       min_t(u64, vma->size, area->vm_end - area->vm_start),
			       &ggtt->mappable);
			       &ggtt->mappable);
+4 −5
Original line number Original line Diff line number Diff line
@@ -3511,7 +3511,7 @@ intel_partial_pages(const struct i915_ggtt_view *view,
{
{
	struct sg_table *st;
	struct sg_table *st;
	struct scatterlist *sg, *iter;
	struct scatterlist *sg, *iter;
	unsigned int count = view->params.partial.size;
	unsigned int count = view->partial.size;
	unsigned int offset;
	unsigned int offset;
	int ret = -ENOMEM;
	int ret = -ENOMEM;


@@ -3523,9 +3523,7 @@ intel_partial_pages(const struct i915_ggtt_view *view,
	if (ret)
	if (ret)
		goto err_sg_alloc;
		goto err_sg_alloc;


	iter = i915_gem_object_get_sg(obj,
	iter = i915_gem_object_get_sg(obj, view->partial.offset, &offset);
				      view->params.partial.offset,
				      &offset);
	GEM_BUG_ON(!iter);
	GEM_BUG_ON(!iter);


	sg = st->sgl;
	sg = st->sgl;
@@ -3577,7 +3575,8 @@ i915_get_ggtt_vma_pages(struct i915_vma *vma)
		vma->pages = vma->obj->mm.pages;
		vma->pages = vma->obj->mm.pages;
	else if (vma->ggtt_view.type == I915_GGTT_VIEW_ROTATED)
	else if (vma->ggtt_view.type == I915_GGTT_VIEW_ROTATED)
		vma->pages =
		vma->pages =
			intel_rotate_fb_obj_pages(&vma->ggtt_view.params.rotated, vma->obj);
			intel_rotate_fb_obj_pages(&vma->ggtt_view.rotated,
						  vma->obj);
	else if (vma->ggtt_view.type == I915_GGTT_VIEW_PARTIAL)
	else if (vma->ggtt_view.type == I915_GGTT_VIEW_PARTIAL)
		vma->pages = intel_partial_pages(&vma->ggtt_view, vma->obj);
		vma->pages = intel_partial_pages(&vma->ggtt_view, vma->obj);
	else
	else
+1 −1
Original line number Original line Diff line number Diff line
@@ -193,7 +193,7 @@ struct i915_ggtt_view {
		/* Members need to contain no holes/padding */
		/* Members need to contain no holes/padding */
		struct intel_partial_info partial;
		struct intel_partial_info partial;
		struct intel_rotation_info rotated;
		struct intel_rotation_info rotated;
	} params;
	};
};
};


extern const struct i915_ggtt_view i915_ggtt_view_normal;
extern const struct i915_ggtt_view i915_ggtt_view_normal;
+4 −5
Original line number Original line Diff line number Diff line
@@ -97,15 +97,14 @@ __i915_vma_create(struct drm_i915_gem_object *obj,
		vma->ggtt_view = *view;
		vma->ggtt_view = *view;
		if (view->type == I915_GGTT_VIEW_PARTIAL) {
		if (view->type == I915_GGTT_VIEW_PARTIAL) {
			GEM_BUG_ON(range_overflows_t(u64,
			GEM_BUG_ON(range_overflows_t(u64,
						     view->params.partial.offset,
						     view->partial.offset,
						     view->params.partial.size,
						     view->partial.size,
						     obj->base.size >> PAGE_SHIFT));
						     obj->base.size >> PAGE_SHIFT));
			vma->size = view->params.partial.size;
			vma->size = view->partial.size;
			vma->size <<= PAGE_SHIFT;
			vma->size <<= PAGE_SHIFT;
			GEM_BUG_ON(vma->size >= obj->base.size);
			GEM_BUG_ON(vma->size >= obj->base.size);
		} else if (view->type == I915_GGTT_VIEW_ROTATED) {
		} else if (view->type == I915_GGTT_VIEW_ROTATED) {
			vma->size =
			vma->size = intel_rotation_info_size(&view->rotated);
				intel_rotation_info_size(&view->params.rotated);
			vma->size <<= PAGE_SHIFT;
			vma->size <<= PAGE_SHIFT;
		}
		}
	}
	}
Loading