[RFC PATCH 3/3] drm/i915: Update intel_memory_region to use nested drm_mem_region

Brian Welty brian.welty at intel.com
Tue Jul 30 00:32:25 UTC 2019


Some fields are deleted from intel_memory_region in favor of instead
using the new nested drm_mem_region structure.

Note, this is based upon unmerged i915 series [1] in order to show how
i915 might begin to integrate the proposed drm_mem_region.

[1] https://lists.freedesktop.org/archives/intel-gfx/2019-June/203649.html

Signed-off-by: Brian Welty <brian.welty at intel.com>
---
 drivers/gpu/drm/i915/gem/i915_gem_object.c    |  2 +-
 drivers/gpu/drm/i915/gem/i915_gem_shmem.c     |  2 +-
 drivers/gpu/drm/i915/i915_gem_gtt.c           | 10 +++----
 drivers/gpu/drm/i915/i915_gpu_error.c         |  2 +-
 drivers/gpu/drm/i915/i915_query.c             |  2 +-
 drivers/gpu/drm/i915/intel_memory_region.c    | 10 ++++---
 drivers/gpu/drm/i915/intel_memory_region.h    | 19 ++++----------
 drivers/gpu/drm/i915/intel_region_lmem.c      | 26 +++++++++----------
 .../drm/i915/selftests/intel_memory_region.c  |  8 +++---
 9 files changed, 37 insertions(+), 44 deletions(-)

diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object.c b/drivers/gpu/drm/i915/gem/i915_gem_object.c
index 73d2d72adc19..7e56fd89a972 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_object.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_object.c
@@ -606,7 +606,7 @@ static int i915_gem_object_region_select(struct drm_i915_private *dev_priv,
 		ret = i915_gem_object_migrate(obj, ce, id);
 		if (!ret) {
 			if (MEMORY_TYPE_FROM_REGION(region) ==
-			    INTEL_LMEM) {
+			    DRM_MEM_VRAM) {
 				/*
 				 * TODO: this should be part of get_pages(),
 				 * when async get_pages arrives
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_shmem.c b/drivers/gpu/drm/i915/gem/i915_gem_shmem.c
index d24f34443c4c..ac18e73665d4 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_shmem.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_shmem.c
@@ -53,7 +53,7 @@ static int shmem_get_pages(struct drm_i915_gem_object *obj)
 	 * If there's no chance of allocating enough pages for the whole
 	 * object, bail early.
 	 */
-	if (obj->base.size > resource_size(&mem->region))
+	if (obj->base.size > mem->region.size)
 		return -ENOMEM;
 
 	st = kmalloc(sizeof(*st), GFP_KERNEL);
diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c
index 2288a55f27f1..f4adc7e397ff 100644
--- a/drivers/gpu/drm/i915/i915_gem_gtt.c
+++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
@@ -2737,20 +2737,20 @@ int i915_gem_init_memory_regions(struct drm_i915_private *i915)
 
 	for (i = 0; i < ARRAY_SIZE(intel_region_map); i++) {
 		struct intel_memory_region *mem = NULL;
-		u32 type;
+		u8 type;
 
 		if (!HAS_REGION(i915, BIT(i)))
 			continue;
 
 		type = MEMORY_TYPE_FROM_REGION(intel_region_map[i]);
 		switch (type) {
-		case INTEL_SMEM:
+		case DRM_MEM_SYSTEM:
 			mem = i915_gem_shmem_setup(i915);
 			break;
-		case INTEL_STOLEN:
+		case DRM_MEM_STOLEN:
 			mem = i915_gem_stolen_setup(i915);
 			break;
-		case INTEL_LMEM:
+		case DRM_MEM_VRAM:
 			mem = i915_gem_setup_fake_lmem(i915);
 			break;
 		}
@@ -2762,7 +2762,7 @@ int i915_gem_init_memory_regions(struct drm_i915_private *i915)
 		}
 
 		mem->id = intel_region_map[i];
-		mem->type = type;
+		mem->region.type = type;
 		mem->instance = MEMORY_INSTANCE_FROM_REGION(intel_region_map[i]);
 
 		i915->regions[i] = mem;
diff --git a/drivers/gpu/drm/i915/i915_gpu_error.c b/drivers/gpu/drm/i915/i915_gpu_error.c
index 9feb597f2b01..908691c3aadb 100644
--- a/drivers/gpu/drm/i915/i915_gpu_error.c
+++ b/drivers/gpu/drm/i915/i915_gpu_error.c
@@ -1048,7 +1048,7 @@ i915_error_object_create(struct drm_i915_private *i915,
 		struct intel_memory_region *mem = vma->obj->memory_region;
 
 		for_each_sgt_dma(dma, iter, vma->pages) {
-			s = io_mapping_map_atomic_wc(&mem->iomap, dma);
+			s = io_mapping_map_atomic_wc(&mem->region.iomap, dma);
 			ret = compress_page(compress, s, dst);
 			io_mapping_unmap_atomic(s);
 
diff --git a/drivers/gpu/drm/i915/i915_query.c b/drivers/gpu/drm/i915/i915_query.c
index 21c4c2592d6c..d16b4a6688e8 100644
--- a/drivers/gpu/drm/i915/i915_query.c
+++ b/drivers/gpu/drm/i915/i915_query.c
@@ -184,7 +184,7 @@ static int query_memregion_info(struct drm_i915_private *dev_priv,
 			continue;
 
 		info.id = region->id;
-		info.size = resource_size(&region->region);
+		info.size = region->region.size;
 
 		if (__copy_to_user(info_ptr, &info, sizeof(info)))
 			return -EFAULT;
diff --git a/drivers/gpu/drm/i915/intel_memory_region.c b/drivers/gpu/drm/i915/intel_memory_region.c
index ab57b94b27a9..dcf077c23a72 100644
--- a/drivers/gpu/drm/i915/intel_memory_region.c
+++ b/drivers/gpu/drm/i915/intel_memory_region.c
@@ -200,7 +200,7 @@ i915_memory_region_get_pages_buddy(struct drm_i915_gem_object *obj)
 
 int i915_memory_region_init_buddy(struct intel_memory_region *mem)
 {
-	return i915_buddy_init(&mem->mm, resource_size(&mem->region),
+	return i915_buddy_init(&mem->mm, mem->region.size,
 			       mem->min_page_size);
 }
 
@@ -285,10 +285,12 @@ intel_memory_region_create(struct drm_i915_private *i915,
 		return ERR_PTR(-ENOMEM);
 
 	mem->i915 = i915;
-	mem->region = (struct resource)DEFINE_RES_MEM(start, size);
-	mem->io_start = io_start;
-	mem->min_page_size = min_page_size;
 	mem->ops = ops;
+	/* FIXME drm_mem_region_init? */
+	mem->region.start = start;
+	mem->region.size = size;
+	mem->region.io_start = io_start;
+	mem->min_page_size = min_page_size;
 
 	mutex_init(&mem->obj_lock);
 	INIT_LIST_HEAD(&mem->objects);
diff --git a/drivers/gpu/drm/i915/intel_memory_region.h b/drivers/gpu/drm/i915/intel_memory_region.h
index 4960096ec30f..fc00d43f07a7 100644
--- a/drivers/gpu/drm/i915/intel_memory_region.h
+++ b/drivers/gpu/drm/i915/intel_memory_region.h
@@ -19,14 +19,8 @@ struct intel_memory_region;
 struct sg_table;
 
 /**
- *  Base memory type
+ *  Define supported memory regions
  */
-enum intel_memory_type {
-	INTEL_SMEM = 0,
-	INTEL_LMEM,
-	INTEL_STOLEN,
-};
-
 enum intel_region_id {
 	INTEL_MEMORY_SMEM = 0,
 	INTEL_MEMORY_LMEM,
@@ -47,9 +41,9 @@ enum intel_region_id {
  * Memory regions encoded as type | instance
  */
 static const u32 intel_region_map[] = {
-	[INTEL_MEMORY_SMEM] = BIT(INTEL_SMEM + INTEL_MEMORY_TYPE_SHIFT) | BIT(0),
-	[INTEL_MEMORY_LMEM] = BIT(INTEL_LMEM + INTEL_MEMORY_TYPE_SHIFT) | BIT(0),
-	[INTEL_MEMORY_STOLEN] = BIT(INTEL_STOLEN + INTEL_MEMORY_TYPE_SHIFT) | BIT(0),
+	[INTEL_MEMORY_SMEM] = BIT(DRM_MEM_SYSTEM + INTEL_MEMORY_TYPE_SHIFT) | BIT(0),
+	[INTEL_MEMORY_LMEM] = BIT(DRM_MEM_VRAM + INTEL_MEMORY_TYPE_SHIFT) | BIT(0),
+	[INTEL_MEMORY_STOLEN] = BIT(DRM_MEM_STOLEN + INTEL_MEMORY_TYPE_SHIFT) | BIT(0),
 };
 
 struct intel_memory_region_ops {
@@ -69,8 +63,7 @@ struct intel_memory_region {
 
 	const struct intel_memory_region_ops *ops;
 
-	struct io_mapping iomap;
-	struct resource region;
+	struct drm_mem_region region;
 
 	/* For faking for lmem */
 	struct drm_mm_node fake_mappable;
@@ -78,10 +71,8 @@ struct intel_memory_region {
 	struct i915_buddy_mm mm;
 	struct mutex mm_lock;
 
-	resource_size_t io_start;
 	resource_size_t min_page_size;
 
-	unsigned int type;
 	unsigned int instance;
 	unsigned int id;
 
diff --git a/drivers/gpu/drm/i915/intel_region_lmem.c b/drivers/gpu/drm/i915/intel_region_lmem.c
index afde9be72a12..6f0ce0314b98 100644
--- a/drivers/gpu/drm/i915/intel_region_lmem.c
+++ b/drivers/gpu/drm/i915/intel_region_lmem.c
@@ -250,7 +250,7 @@ static int i915_gem_init_fake_lmem_bar(struct intel_memory_region *mem)
 	int ret;
 
 	mem->fake_mappable.start = 0;
-	mem->fake_mappable.size = resource_size(&mem->region);
+	mem->fake_mappable.size = mem->region.size;
 	mem->fake_mappable.color = I915_COLOR_UNEVICTABLE;
 
 	ret = drm_mm_reserve_node(&ggtt->vm.mm, &mem->fake_mappable);
@@ -277,7 +277,7 @@ static void
 region_lmem_release(struct intel_memory_region *mem)
 {
 	i915_gem_relase_fake_lmem_bar(mem);
-	io_mapping_fini(&mem->iomap);
+	io_mapping_fini(&mem->region.iomap);
 	i915_memory_region_release_buddy(mem);
 }
 
@@ -294,14 +294,14 @@ region_lmem_init(struct intel_memory_region *mem)
 		}
 	}
 
-	if (!io_mapping_init_wc(&mem->iomap,
-				mem->io_start,
-				resource_size(&mem->region)))
+	if (!io_mapping_init_wc(&mem->region.iomap,
+				mem->region.io_start,
+				mem->region.size))
 		return -EIO;
 
 	ret = i915_memory_region_init_buddy(mem);
 	if (ret)
-		io_mapping_fini(&mem->iomap);
+		io_mapping_fini(&mem->region.iomap);
 
 	return ret;
 }
@@ -321,7 +321,7 @@ void __iomem *i915_gem_object_lmem_io_map_page(struct drm_i915_gem_object *obj,
 	offset = i915_gem_object_get_dma_address(obj, n);
 	offset -= intel_graphics_fake_lmem_res.start;
 
-	return io_mapping_map_atomic_wc(&obj->memory_region->iomap, offset);
+	return io_mapping_map_atomic_wc(&obj->memory_region->region.iomap, offset);
 }
 
 void __iomem *i915_gem_object_lmem_io_map(struct drm_i915_gem_object *obj,
@@ -335,7 +335,7 @@ void __iomem *i915_gem_object_lmem_io_map(struct drm_i915_gem_object *obj,
 	offset = i915_gem_object_get_dma_address(obj, n);
 	offset -= intel_graphics_fake_lmem_res.start;
 
-	return io_mapping_map_wc(&obj->memory_region->iomap, offset, size);
+	return io_mapping_map_wc(&obj->memory_region->region.iomap, offset, size);
 }
 
 resource_size_t i915_gem_object_lmem_io_offset(struct drm_i915_gem_object *obj,
@@ -352,14 +352,14 @@ resource_size_t i915_gem_object_lmem_io_offset(struct drm_i915_gem_object *obj,
 	daddr = i915_gem_object_get_dma_address(obj, n);
 	daddr -= intel_graphics_fake_lmem_res.start;
 
-	return mem->io_start + daddr;
+	return mem->region.io_start + daddr;
 }
 
 bool i915_gem_object_is_lmem(struct drm_i915_gem_object *obj)
 {
-	struct intel_memory_region *region = obj->memory_region;
+	struct intel_memory_region *mem = obj->memory_region;
 
-	return region && region->type == INTEL_LMEM;
+	return mem && mem->region.type == DRM_MEM_VRAM;
 }
 
 struct drm_i915_gem_object *
@@ -395,9 +395,9 @@ i915_gem_setup_fake_lmem(struct drm_i915_private *i915)
 					 io_start,
 					 &region_lmem_ops);
 	if (!IS_ERR(mem)) {
-		DRM_INFO("Intel graphics fake LMEM: %pR\n", &mem->region);
+		DRM_INFO("Intel graphics fake LMEM: %pR\n", mem);
 		DRM_INFO("Intel graphics fake LMEM IO start: %llx\n",
-			 (u64)mem->io_start);
+			 (u64)mem->region.io_start);
 	}
 
 	return mem;
diff --git a/drivers/gpu/drm/i915/selftests/intel_memory_region.c b/drivers/gpu/drm/i915/selftests/intel_memory_region.c
index 9793f548a71a..1496f47a794a 100644
--- a/drivers/gpu/drm/i915/selftests/intel_memory_region.c
+++ b/drivers/gpu/drm/i915/selftests/intel_memory_region.c
@@ -32,7 +32,7 @@ static void close_objects(struct list_head *objects)
 static int igt_mock_fill(void *arg)
 {
 	struct intel_memory_region *mem = arg;
-	resource_size_t total = resource_size(&mem->region);
+	resource_size_t total = mem->region.size;
 	resource_size_t page_size;
 	resource_size_t rem;
 	unsigned long max_pages;
@@ -98,7 +98,7 @@ static int igt_frag_region(struct intel_memory_region *mem,
 	int err = 0;
 
 	target = mem->mm.min_size;
-	total = resource_size(&mem->region);
+	total = mem->region.size;
 	n_objects = total / target;
 
 	while (n_objects--) {
@@ -152,7 +152,7 @@ static int igt_mock_evict(void *arg)
 	if (err)
 		return err;
 
-	total = resource_size(&mem->region);
+	total = mem->region.size;
 	target = mem->mm.min_size;
 
 	while (target <= total / 2) {
@@ -198,7 +198,7 @@ static int igt_mock_continuous(void *arg)
 	if (err)
 		return err;
 
-	total = resource_size(&mem->region);
+	total = mem->region.size;
 	target = total / 2;
 
 	/*
-- 
2.21.0



More information about the amd-gfx mailing list