diff mbox series

[v2,13/22] drm/i915: treat stolen as a region

Message ID 20191003192444.10113-14-matthew.auld@intel.com (mailing list archive)
State New, archived
Headers show
Series LMEM basics | expand

Commit Message

Matthew Auld Oct. 3, 2019, 7:24 p.m. UTC
Convert stolen memory over to a region object. Still leaves open the
question with what to do with pre-allocated objects...

Signed-off-by: Matthew Auld <matthew.auld@intel.com>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Cc: Abdiel Janulgue <abdiel.janulgue@linux.intel.com>
---
 drivers/gpu/drm/i915/gem/i915_gem_stolen.c | 66 +++++++++++++++++++---
 drivers/gpu/drm/i915/gem/i915_gem_stolen.h |  3 +-
 drivers/gpu/drm/i915/i915_gem_gtt.c        | 14 +----
 drivers/gpu/drm/i915/i915_pci.c            |  2 +-
 4 files changed, 62 insertions(+), 23 deletions(-)

Comments

Tang, CQ Oct. 3, 2019, 7:43 p.m. UTC | #1
> -----Original Message-----
> From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of
> Matthew Auld
> Sent: Thursday, October 3, 2019 12:25 PM
> To: intel-gfx@lists.freedesktop.org
> Subject: [Intel-gfx] [PATCH v2 13/22] drm/i915: treat stolen as a region
> 
> Convert stolen memory over to a region object. Still leaves open the
> question with what to do with pre-allocated objects...
> 
> Signed-off-by: Matthew Auld <matthew.auld@intel.com>
> Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
> Cc: Abdiel Janulgue <abdiel.janulgue@linux.intel.com>
> ---
>  drivers/gpu/drm/i915/gem/i915_gem_stolen.c | 66
> +++++++++++++++++++---  drivers/gpu/drm/i915/gem/i915_gem_stolen.h
> |  3 +-
>  drivers/gpu/drm/i915/i915_gem_gtt.c        | 14 +----
>  drivers/gpu/drm/i915/i915_pci.c            |  2 +-
>  4 files changed, 62 insertions(+), 23 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_stolen.c
> b/drivers/gpu/drm/i915/gem/i915_gem_stolen.c
> index 3dd295bb61f6..a91ef9fe98cd 100644
> --- a/drivers/gpu/drm/i915/gem/i915_gem_stolen.c
> +++ b/drivers/gpu/drm/i915/gem/i915_gem_stolen.c
> @@ -10,6 +10,7 @@
>  #include <drm/drm_mm.h>
>  #include <drm/i915_drm.h>
> 
> +#include "gem/i915_gem_region.h"
>  #include "i915_drv.h"
>  #include "i915_gem_stolen.h"
> 
> @@ -150,7 +151,7 @@ static int i915_adjust_stolen(struct drm_i915_private
> *dev_priv,
>  	return 0;
>  }
> 
> -void i915_gem_cleanup_stolen(struct drm_i915_private *dev_priv)
> +static void i915_gem_cleanup_stolen(struct drm_i915_private *dev_priv)
>  {
>  	if (!drm_mm_initialized(&dev_priv->mm.stolen))
>  		return;
> @@ -355,7 +356,7 @@ static void icl_get_stolen_reserved(struct
> drm_i915_private *i915,
>  	}
>  }
> 
> -int i915_gem_init_stolen(struct drm_i915_private *dev_priv)
> +static int i915_gem_init_stolen(struct drm_i915_private *dev_priv)
>  {
>  	resource_size_t reserved_base, stolen_top;
>  	resource_size_t reserved_total, reserved_size; @@ -539,6 +540,9
> @@ i915_gem_object_release_stolen(struct drm_i915_gem_object *obj)
> 
>  	i915_gem_stolen_remove_node(dev_priv, stolen);
>  	kfree(stolen);
> +
> +	if (obj->mm.region)
> +		i915_gem_object_release_memory_region(obj);

We fully support memory region concept for both bios stolen system memory and local stolen memory, we don't need such kind of checking.
This looks to upstream code before latest DG1 code. I am not sure if we want to upstream this intermediate code.

--CQ


>  }
> 
>  static const struct drm_i915_gem_object_ops i915_gem_object_stolen_ops
> = { @@ -548,8 +552,9 @@ static const struct drm_i915_gem_object_ops
> i915_gem_object_stolen_ops = {  };
> 
>  static struct drm_i915_gem_object *
> -_i915_gem_object_create_stolen(struct drm_i915_private *dev_priv,
> -			       struct drm_mm_node *stolen)
> +__i915_gem_object_create_stolen(struct drm_i915_private *dev_priv,
> +				struct drm_mm_node *stolen,
> +				struct intel_memory_region *mem)
>  {
>  	struct drm_i915_gem_object *obj;
>  	unsigned int cache_level;
> @@ -566,6 +571,9 @@ _i915_gem_object_create_stolen(struct
> drm_i915_private *dev_priv,
>  	cache_level = HAS_LLC(dev_priv) ? I915_CACHE_LLC :
> I915_CACHE_NONE;
>  	i915_gem_object_set_cache_coherency(obj, cache_level);
> 
> +	if (mem)
> +		i915_gem_object_init_memory_region(obj, mem, 0);
> +
>  	if (i915_gem_object_pin_pages(obj))
>  		goto cleanup;
> 
> @@ -576,10 +584,12 @@ _i915_gem_object_create_stolen(struct
> drm_i915_private *dev_priv,
>  	return NULL;
>  }
> 
> -struct drm_i915_gem_object *
> -i915_gem_object_create_stolen(struct drm_i915_private *dev_priv,
> -			      resource_size_t size)
> +static struct drm_i915_gem_object *
> +_i915_gem_object_create_stolen(struct intel_memory_region *mem,
> +			       resource_size_t size,
> +			       unsigned int flags)
>  {
> +	struct drm_i915_private *dev_priv = mem->i915;
>  	struct drm_i915_gem_object *obj;
>  	struct drm_mm_node *stolen;
>  	int ret;
> @@ -598,7 +608,7 @@ i915_gem_object_create_stolen(struct
> drm_i915_private *dev_priv,
>  	if (ret)
>  		goto err_free;
> 
> -	obj = _i915_gem_object_create_stolen(dev_priv, stolen);
> +	obj = __i915_gem_object_create_stolen(dev_priv, stolen, mem);
>  	if (obj == NULL) {
>  		ret = -ENOMEM;
>  		goto err_remove;
> @@ -613,6 +623,44 @@ i915_gem_object_create_stolen(struct
> drm_i915_private *dev_priv,
>  	return ERR_PTR(ret);
>  }
> 
> +struct drm_i915_gem_object *
> +i915_gem_object_create_stolen(struct drm_i915_private *dev_priv,
> +			      resource_size_t size)
> +{
> +
> +	return i915_gem_object_create_region(dev_priv-
> >mm.regions[INTEL_MEMORY_STOLEN],
> +					     size,
> I915_BO_ALLOC_CONTIGUOUS); }
> +
> +static int init_stolen(struct intel_memory_region *mem) {
> +	/*
> +	 * Initialise stolen early so that we may reserve preallocated
> +	 * objects for the BIOS to KMS transition.
> +	 */
> +	return i915_gem_init_stolen(mem->i915); }
> +
> +static void release_stolen(struct intel_memory_region *mem) {
> +	i915_gem_cleanup_stolen(mem->i915);
> +}
> +
> +static const struct intel_memory_region_ops i915_region_stolen_ops = {
> +	.init = init_stolen,
> +	.release = release_stolen,
> +	.create_object = _i915_gem_object_create_stolen, };
> +
> +struct intel_memory_region *i915_gem_stolen_setup(struct
> +drm_i915_private *i915) {
> +	return intel_memory_region_create(i915,
> +					  intel_graphics_stolen_res.start,
> +
> resource_size(&intel_graphics_stolen_res),
> +					  I915_GTT_PAGE_SIZE_4K, 0,
> +					  &i915_region_stolen_ops);
> +}
> +
>  struct drm_i915_gem_object *
>  i915_gem_object_create_stolen_for_preallocated(struct drm_i915_private
> *dev_priv,
>  					       resource_size_t stolen_offset,
> @@ -654,7 +702,7 @@
> i915_gem_object_create_stolen_for_preallocated(struct drm_i915_private
> *dev_priv
>  		return ERR_PTR(ret);
>  	}
> 
> -	obj = _i915_gem_object_create_stolen(dev_priv, stolen);
> +	obj = __i915_gem_object_create_stolen(dev_priv, stolen, NULL);
>  	if (obj == NULL) {
>  		DRM_DEBUG_DRIVER("failed to allocate stolen object\n");
>  		i915_gem_stolen_remove_node(dev_priv, stolen); diff --git
> a/drivers/gpu/drm/i915/gem/i915_gem_stolen.h
> b/drivers/gpu/drm/i915/gem/i915_gem_stolen.h
> index 2289644d8604..c1040627fbf3 100644
> --- a/drivers/gpu/drm/i915/gem/i915_gem_stolen.h
> +++ b/drivers/gpu/drm/i915/gem/i915_gem_stolen.h
> @@ -21,8 +21,7 @@ int i915_gem_stolen_insert_node_in_range(struct
> drm_i915_private *dev_priv,
>  					 u64 end);
>  void i915_gem_stolen_remove_node(struct drm_i915_private *dev_priv,
>  				 struct drm_mm_node *node);
> -int i915_gem_init_stolen(struct drm_i915_private *dev_priv); -void
> i915_gem_cleanup_stolen(struct drm_i915_private *dev_priv);
> +struct intel_memory_region *i915_gem_stolen_setup(struct
> +drm_i915_private *i915);
>  struct drm_i915_gem_object *
>  i915_gem_object_create_stolen(struct drm_i915_private *dev_priv,
>  			      resource_size_t size);
> diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c
> b/drivers/gpu/drm/i915/i915_gem_gtt.c
> index d05aff7677c2..209686c23d21 100644
> --- a/drivers/gpu/drm/i915/i915_gem_gtt.c
> +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
> @@ -2748,8 +2748,6 @@ void i915_gem_cleanup_memory_regions(struct
> drm_i915_private *i915)  {
>  	int i;
> 
> -	i915_gem_cleanup_stolen(i915);
> -
>  	for (i = 0; i < ARRAY_SIZE(i915->mm.regions); i++) {
>  		struct intel_memory_region *region = i915->mm.regions[i];
> 
> @@ -2762,15 +2760,6 @@ int i915_gem_init_memory_regions(struct
> drm_i915_private *i915)  {
>  	int err, i;
> 
> -	/*
> -	 * Initialise stolen early so that we may reserve preallocated
> -	 * objects for the BIOS to KMS transition.
> -	 */
> -	/* XXX: stolen will become a region at some point */
> -	err = i915_gem_init_stolen(i915);
> -	if (err)
> -		return err;
> -
>  	for (i = 0; i < ARRAY_SIZE(i915->mm.regions); i++) {
>  		struct intel_memory_region *mem = NULL;
>  		u32 type;
> @@ -2783,6 +2772,9 @@ int i915_gem_init_memory_regions(struct
> drm_i915_private *i915)
>  		case INTEL_SMEM:
>  			mem = i915_gem_shmem_setup(i915);
>  			break;
> +		case INTEL_STOLEN:
> +			mem = i915_gem_stolen_setup(i915);
> +			break;
>  		}
> 
>  		if (IS_ERR(mem)) {
> diff --git a/drivers/gpu/drm/i915/i915_pci.c
> b/drivers/gpu/drm/i915/i915_pci.c index e55ab2724996..f9a3bfe68689
> 100644
> --- a/drivers/gpu/drm/i915/i915_pci.c
> +++ b/drivers/gpu/drm/i915/i915_pci.c
> @@ -152,7 +152,7 @@
>  	.page_sizes = I915_GTT_PAGE_SIZE_4K
> 
>  #define GEN_DEFAULT_REGIONS \
> -	.memory_regions = REGION_SMEM
> +	.memory_regions = REGION_SMEM | REGION_STOLEN
> 
>  #define I830_FEATURES \
>  	GEN(2), \
> --
> 2.20.1
> 
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx
diff mbox series

Patch

diff --git a/drivers/gpu/drm/i915/gem/i915_gem_stolen.c b/drivers/gpu/drm/i915/gem/i915_gem_stolen.c
index 3dd295bb61f6..a91ef9fe98cd 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_stolen.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_stolen.c
@@ -10,6 +10,7 @@ 
 #include <drm/drm_mm.h>
 #include <drm/i915_drm.h>
 
+#include "gem/i915_gem_region.h"
 #include "i915_drv.h"
 #include "i915_gem_stolen.h"
 
@@ -150,7 +151,7 @@  static int i915_adjust_stolen(struct drm_i915_private *dev_priv,
 	return 0;
 }
 
-void i915_gem_cleanup_stolen(struct drm_i915_private *dev_priv)
+static void i915_gem_cleanup_stolen(struct drm_i915_private *dev_priv)
 {
 	if (!drm_mm_initialized(&dev_priv->mm.stolen))
 		return;
@@ -355,7 +356,7 @@  static void icl_get_stolen_reserved(struct drm_i915_private *i915,
 	}
 }
 
-int i915_gem_init_stolen(struct drm_i915_private *dev_priv)
+static int i915_gem_init_stolen(struct drm_i915_private *dev_priv)
 {
 	resource_size_t reserved_base, stolen_top;
 	resource_size_t reserved_total, reserved_size;
@@ -539,6 +540,9 @@  i915_gem_object_release_stolen(struct drm_i915_gem_object *obj)
 
 	i915_gem_stolen_remove_node(dev_priv, stolen);
 	kfree(stolen);
+
+	if (obj->mm.region)
+		i915_gem_object_release_memory_region(obj);
 }
 
 static const struct drm_i915_gem_object_ops i915_gem_object_stolen_ops = {
@@ -548,8 +552,9 @@  static const struct drm_i915_gem_object_ops i915_gem_object_stolen_ops = {
 };
 
 static struct drm_i915_gem_object *
-_i915_gem_object_create_stolen(struct drm_i915_private *dev_priv,
-			       struct drm_mm_node *stolen)
+__i915_gem_object_create_stolen(struct drm_i915_private *dev_priv,
+				struct drm_mm_node *stolen,
+				struct intel_memory_region *mem)
 {
 	struct drm_i915_gem_object *obj;
 	unsigned int cache_level;
@@ -566,6 +571,9 @@  _i915_gem_object_create_stolen(struct drm_i915_private *dev_priv,
 	cache_level = HAS_LLC(dev_priv) ? I915_CACHE_LLC : I915_CACHE_NONE;
 	i915_gem_object_set_cache_coherency(obj, cache_level);
 
+	if (mem)
+		i915_gem_object_init_memory_region(obj, mem, 0);
+
 	if (i915_gem_object_pin_pages(obj))
 		goto cleanup;
 
@@ -576,10 +584,12 @@  _i915_gem_object_create_stolen(struct drm_i915_private *dev_priv,
 	return NULL;
 }
 
-struct drm_i915_gem_object *
-i915_gem_object_create_stolen(struct drm_i915_private *dev_priv,
-			      resource_size_t size)
+static struct drm_i915_gem_object *
+_i915_gem_object_create_stolen(struct intel_memory_region *mem,
+			       resource_size_t size,
+			       unsigned int flags)
 {
+	struct drm_i915_private *dev_priv = mem->i915;
 	struct drm_i915_gem_object *obj;
 	struct drm_mm_node *stolen;
 	int ret;
@@ -598,7 +608,7 @@  i915_gem_object_create_stolen(struct drm_i915_private *dev_priv,
 	if (ret)
 		goto err_free;
 
-	obj = _i915_gem_object_create_stolen(dev_priv, stolen);
+	obj = __i915_gem_object_create_stolen(dev_priv, stolen, mem);
 	if (obj == NULL) {
 		ret = -ENOMEM;
 		goto err_remove;
@@ -613,6 +623,44 @@  i915_gem_object_create_stolen(struct drm_i915_private *dev_priv,
 	return ERR_PTR(ret);
 }
 
+struct drm_i915_gem_object *
+i915_gem_object_create_stolen(struct drm_i915_private *dev_priv,
+			      resource_size_t size)
+{
+
+	return i915_gem_object_create_region(dev_priv->mm.regions[INTEL_MEMORY_STOLEN],
+					     size, I915_BO_ALLOC_CONTIGUOUS);
+}
+
+static int init_stolen(struct intel_memory_region *mem)
+{
+	/*
+	 * Initialise stolen early so that we may reserve preallocated
+	 * objects for the BIOS to KMS transition.
+	 */
+	return i915_gem_init_stolen(mem->i915);
+}
+
+static void release_stolen(struct intel_memory_region *mem)
+{
+	i915_gem_cleanup_stolen(mem->i915);
+}
+
+static const struct intel_memory_region_ops i915_region_stolen_ops = {
+	.init = init_stolen,
+	.release = release_stolen,
+	.create_object = _i915_gem_object_create_stolen,
+};
+
+struct intel_memory_region *i915_gem_stolen_setup(struct drm_i915_private *i915)
+{
+	return intel_memory_region_create(i915,
+					  intel_graphics_stolen_res.start,
+					  resource_size(&intel_graphics_stolen_res),
+					  I915_GTT_PAGE_SIZE_4K, 0,
+					  &i915_region_stolen_ops);
+}
+
 struct drm_i915_gem_object *
 i915_gem_object_create_stolen_for_preallocated(struct drm_i915_private *dev_priv,
 					       resource_size_t stolen_offset,
@@ -654,7 +702,7 @@  i915_gem_object_create_stolen_for_preallocated(struct drm_i915_private *dev_priv
 		return ERR_PTR(ret);
 	}
 
-	obj = _i915_gem_object_create_stolen(dev_priv, stolen);
+	obj = __i915_gem_object_create_stolen(dev_priv, stolen, NULL);
 	if (obj == NULL) {
 		DRM_DEBUG_DRIVER("failed to allocate stolen object\n");
 		i915_gem_stolen_remove_node(dev_priv, stolen);
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_stolen.h b/drivers/gpu/drm/i915/gem/i915_gem_stolen.h
index 2289644d8604..c1040627fbf3 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_stolen.h
+++ b/drivers/gpu/drm/i915/gem/i915_gem_stolen.h
@@ -21,8 +21,7 @@  int i915_gem_stolen_insert_node_in_range(struct drm_i915_private *dev_priv,
 					 u64 end);
 void i915_gem_stolen_remove_node(struct drm_i915_private *dev_priv,
 				 struct drm_mm_node *node);
-int i915_gem_init_stolen(struct drm_i915_private *dev_priv);
-void i915_gem_cleanup_stolen(struct drm_i915_private *dev_priv);
+struct intel_memory_region *i915_gem_stolen_setup(struct drm_i915_private *i915);
 struct drm_i915_gem_object *
 i915_gem_object_create_stolen(struct drm_i915_private *dev_priv,
 			      resource_size_t size);
diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c
index d05aff7677c2..209686c23d21 100644
--- a/drivers/gpu/drm/i915/i915_gem_gtt.c
+++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
@@ -2748,8 +2748,6 @@  void i915_gem_cleanup_memory_regions(struct drm_i915_private *i915)
 {
 	int i;
 
-	i915_gem_cleanup_stolen(i915);
-
 	for (i = 0; i < ARRAY_SIZE(i915->mm.regions); i++) {
 		struct intel_memory_region *region = i915->mm.regions[i];
 
@@ -2762,15 +2760,6 @@  int i915_gem_init_memory_regions(struct drm_i915_private *i915)
 {
 	int err, i;
 
-	/*
-	 * Initialise stolen early so that we may reserve preallocated
-	 * objects for the BIOS to KMS transition.
-	 */
-	/* XXX: stolen will become a region at some point */
-	err = i915_gem_init_stolen(i915);
-	if (err)
-		return err;
-
 	for (i = 0; i < ARRAY_SIZE(i915->mm.regions); i++) {
 		struct intel_memory_region *mem = NULL;
 		u32 type;
@@ -2783,6 +2772,9 @@  int i915_gem_init_memory_regions(struct drm_i915_private *i915)
 		case INTEL_SMEM:
 			mem = i915_gem_shmem_setup(i915);
 			break;
+		case INTEL_STOLEN:
+			mem = i915_gem_stolen_setup(i915);
+			break;
 		}
 
 		if (IS_ERR(mem)) {
diff --git a/drivers/gpu/drm/i915/i915_pci.c b/drivers/gpu/drm/i915/i915_pci.c
index e55ab2724996..f9a3bfe68689 100644
--- a/drivers/gpu/drm/i915/i915_pci.c
+++ b/drivers/gpu/drm/i915/i915_pci.c
@@ -152,7 +152,7 @@ 
 	.page_sizes = I915_GTT_PAGE_SIZE_4K
 
 #define GEN_DEFAULT_REGIONS \
-	.memory_regions = REGION_SMEM
+	.memory_regions = REGION_SMEM | REGION_STOLEN
 
 #define I830_FEATURES \
 	GEN(2), \