[PATCH 2/8] drm/i915: Introduce i915_gem_object_create_stolen_for_preallocated

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Feb 06, 2013 at 11:10:22AM +0000, Chris Wilson wrote:
> Wrap a preallocated region of stolen memory within an ordinary GEM
> object, for example the BIOS framebuffer.
> 
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> ---
>  drivers/gpu/drm/i915/i915_drv.h        |    5 +++
>  drivers/gpu/drm/i915/i915_gem_stolen.c |   65 ++++++++++++++++++++++++++++++++
>  2 files changed, 70 insertions(+)
> 
> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> index 08c5def..fd8a495 100644
> --- a/drivers/gpu/drm/i915/i915_drv.h
> +++ b/drivers/gpu/drm/i915/i915_drv.h
> @@ -1720,6 +1720,11 @@ void i915_gem_stolen_cleanup_compression(struct drm_device *dev);
>  void i915_gem_cleanup_stolen(struct drm_device *dev);
>  struct drm_i915_gem_object *
>  i915_gem_object_create_stolen(struct drm_device *dev, u32 size);
> +struct drm_i915_gem_object *
> +i915_gem_object_create_stolen_for_preallocated(struct drm_device *dev,
> +					       u32 stolen_offset,
> +					       u32 gtt_offset,
> +					       u32 size);

Can we default to u64 for things from now on. Not that I know anything,
or anything. At least gtt_offset.

>  void i915_gem_object_release_stolen(struct drm_i915_gem_object *obj);
>  
>  /* i915_gem_tiling.c */
> diff --git a/drivers/gpu/drm/i915/i915_gem_stolen.c b/drivers/gpu/drm/i915/i915_gem_stolen.c
> index 69d97cb..130d1db 100644
> --- a/drivers/gpu/drm/i915/i915_gem_stolen.c
> +++ b/drivers/gpu/drm/i915/i915_gem_stolen.c
> @@ -312,6 +312,71 @@ i915_gem_object_create_stolen(struct drm_device *dev, u32 size)
>  	return NULL;
>  }
>  
> +struct drm_i915_gem_object *
> +i915_gem_object_create_stolen_for_preallocated(struct drm_device *dev,
> +					       u32 stolen_offset,
> +					       u32 gtt_offset,
> +					       u32 size)
> +{
> +	struct drm_i915_private *dev_priv = dev->dev_private;
> +	struct drm_i915_gem_object *obj;
> +	struct drm_mm_node *stolen;
> +
> +	if (dev_priv->mm.stolen_base == 0)
> +		return NULL;
> +
> +	DRM_DEBUG_KMS("creating preallocated stolen object: stolen_offset=%x, gtt_offset=%x, size=%x\n",
> +			stolen_offset, gtt_offset, size);
> +
> +	/* KISS and expect everything to be page-aligned */
> +	BUG_ON(stolen_offset & 4095);
> +	BUG_ON(gtt_offset & 4095);
> +	BUG_ON(size & 4095);
> +
> +	if (WARN_ON(size == 0))
> +		return NULL;
> +
> +	stolen = drm_mm_create_block(&dev_priv->mm.stolen,
> +				     stolen_offset, size,
> +				     false);
> +	if (stolen == NULL) {
> +		DRM_DEBUG_KMS("failed to allocate stolen space\n");
> +		return NULL;
> +	}
> +
> +	obj = _i915_gem_object_create_stolen(dev, stolen);
> +	if (obj == NULL) {
> +		DRM_DEBUG_KMS("failed to allocate stolen object\n");
> +		drm_mm_put_block(stolen);
> +		return NULL;
> +	}
> +
> +	/* To simplify the initialisation sequence between KMS and GTT,
> +	 * we allow construction of the stolen object prior to
> +	 * setting up the GTT space. The actual reservation will occur
> +	 * later.
> +	 */
> +	if (drm_mm_initialized(&dev_priv->mm.gtt_space)) {
> +		obj->gtt_space = drm_mm_create_block(&dev_priv->mm.gtt_space,
> +						     gtt_offset, size,
> +						     false);
> +		if (obj->gtt_space == NULL) {
> +			DRM_DEBUG_KMS("failed to allocate stolen GTT space\n");
> +			drm_gem_object_unreference(&obj->base);
> +			return NULL;
> +		}
> +	} else
> +		obj->gtt_space = I915_GTT_RESERVED;

Could you explain how/why we'd do this before the mm is initialized.

> +
> +	obj->gtt_offset = gtt_offset;
> +	obj->has_global_gtt_mapping = 1;
> +
> +	list_add_tail(&obj->gtt_list, &dev_priv->mm.bound_list);
> +	list_add_tail(&obj->mm_list, &dev_priv->mm.inactive_list);
> +
> +	return obj;
> +}
> +
>  void
>  i915_gem_object_release_stolen(struct drm_i915_gem_object *obj)
>  {
> -- 
> 1.7.10.4
> 
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx

-- 
Ben Widawsky, Intel Open Source Technology Center


[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]
  Powered by Linux