[PATCH 02/15] drm/i915: introduce gtt page size

Matthew Auld matthew.auld at intel.com
Sun Apr 23 19:13:26 UTC 2017


In preparation for supporting huge gtt pages for the ppgtt, we introduce
the gtt_page_size member for gem objects.  We fill in the gtt page size
by scanning the sg table to determine max page size which satisfies the
alignment for each sg entry. Currently the only platform supported page
size is 4K.

Signed-off-by: Matthew Auld <matthew.auld at intel.com>
---
 drivers/gpu/drm/i915/i915_gem.c        | 16 ++++++++++++++++
 drivers/gpu/drm/i915/i915_gem_object.h |  2 ++
 2 files changed, 18 insertions(+)

diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 33fb11cc5acc..e16fc8ec3361 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -2490,7 +2490,13 @@ void __i915_gem_object_set_pages(struct drm_i915_gem_object *obj,
 
 static int ____i915_gem_object_get_pages(struct drm_i915_gem_object *obj)
 {
+	struct drm_i915_private *i915 = to_i915(obj->base.dev);
+	unsigned long page_sizes = INTEL_INFO(i915)->page_size_mask;
 	struct sg_table *pages;
+	struct scatterlist *sg;
+	unsigned int sg_mask = 0;
+	unsigned int i;
+	unsigned int bit;
 
 	GEM_BUG_ON(i915_gem_object_has_pinned_pages(obj));
 
@@ -2503,6 +2509,16 @@ static int ____i915_gem_object_get_pages(struct drm_i915_gem_object *obj)
 	if (unlikely(IS_ERR(pages)))
 		return PTR_ERR(pages);
 
+	for_each_sg(pages->sgl, sg, pages->nents, i)
+		sg_mask |= sg->length;
+
+	for_each_set_bit(bit, &page_sizes, BITS_PER_LONG) {
+		if (IS_ALIGNED(sg_mask, 1 << bit))
+			obj->gtt_page_size = 1 << bit;
+	}
+
+	GEM_BUG_ON(!SUPPORTS_PAGE_SIZE(i915, obj->gtt_page_size));
+
 	__i915_gem_object_set_pages(obj, pages);
 	return 0;
 }
diff --git a/drivers/gpu/drm/i915/i915_gem_object.h b/drivers/gpu/drm/i915/i915_gem_object.h
index 174cf923c236..75beb6a79635 100644
--- a/drivers/gpu/drm/i915/i915_gem_object.h
+++ b/drivers/gpu/drm/i915/i915_gem_object.h
@@ -107,6 +107,8 @@ struct drm_i915_gem_object {
 	unsigned int cache_level:3;
 	unsigned int cache_dirty:1;
 
+	unsigned int gtt_page_size;
+
 	atomic_t frontbuffer_bits;
 	unsigned int frontbuffer_ggtt_origin; /* write once */
 	struct i915_gem_active frontbuffer_write;
-- 
2.9.3



More information about the Intel-gfx-trybot mailing list