[Intel-gfx] [PATCH v2 13/22] drm/i915: treat stolen as a region

Tang, CQ cq.tang at intel.com
Thu Oct 3 19:43:31 UTC 2019



> -----Original Message-----
> From: Intel-gfx <intel-gfx-bounces at lists.freedesktop.org> On Behalf Of
> Matthew Auld
> Sent: Thursday, October 3, 2019 12:25 PM
> To: intel-gfx at 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 at intel.com>
> Cc: Joonas Lahtinen <joonas.lahtinen at linux.intel.com>
> Cc: Abdiel Janulgue <abdiel.janulgue at 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 at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx


More information about the Intel-gfx mailing list