drm/i915: Introduce i915_gem_object_create_stolen_for_preallocated
Wrap a preallocated region of stolen memory within an ordinary GEM object, for example the BIOS framebuffer. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Reviewed-by: Imre Deak <imre.deak@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
This commit is contained in:
parent
f9c513e9d6
commit
866d12b4ee
|
@ -1712,6 +1712,11 @@ void i915_gem_stolen_cleanup_compression(struct drm_device *dev);
|
||||||
void i915_gem_cleanup_stolen(struct drm_device *dev);
|
void i915_gem_cleanup_stolen(struct drm_device *dev);
|
||||||
struct drm_i915_gem_object *
|
struct drm_i915_gem_object *
|
||||||
i915_gem_object_create_stolen(struct drm_device *dev, u32 size);
|
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);
|
||||||
void i915_gem_object_release_stolen(struct drm_i915_gem_object *obj);
|
void i915_gem_object_release_stolen(struct drm_i915_gem_object *obj);
|
||||||
|
|
||||||
/* i915_gem_tiling.c */
|
/* i915_gem_tiling.c */
|
||||||
|
|
|
@ -312,6 +312,71 @@ i915_gem_object_create_stolen(struct drm_device *dev, u32 size)
|
||||||
return NULL;
|
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;
|
||||||
|
|
||||||
|
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
|
void
|
||||||
i915_gem_object_release_stolen(struct drm_i915_gem_object *obj)
|
i915_gem_object_release_stolen(struct drm_i915_gem_object *obj)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue