aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2013-02-19 16:31:37 -0500
committerDaniel Vetter <daniel.vetter@ffwll.ch>2013-03-26 15:39:28 -0400
commit866d12b4ee5faefbc1a98b787ac4242a2f04b051 (patch)
tree5af9628efb98e0c73dd6e306d2c0bf67e66644e4
parentf9c513e9d6d25fec3404a97c9b0f03b2eb858315 (diff)
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>
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h5
-rw-r--r--drivers/gpu/drm/i915/i915_gem_stolen.c65
2 files changed, 70 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 1657d8733648..7f6452b592aa 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -1712,6 +1712,11 @@ void i915_gem_stolen_cleanup_compression(struct drm_device *dev);
1712void i915_gem_cleanup_stolen(struct drm_device *dev); 1712void i915_gem_cleanup_stolen(struct drm_device *dev);
1713struct drm_i915_gem_object * 1713struct drm_i915_gem_object *
1714i915_gem_object_create_stolen(struct drm_device *dev, u32 size); 1714i915_gem_object_create_stolen(struct drm_device *dev, u32 size);
1715struct drm_i915_gem_object *
1716i915_gem_object_create_stolen_for_preallocated(struct drm_device *dev,
1717 u32 stolen_offset,
1718 u32 gtt_offset,
1719 u32 size);
1715void i915_gem_object_release_stolen(struct drm_i915_gem_object *obj); 1720void i915_gem_object_release_stolen(struct drm_i915_gem_object *obj);
1716 1721
1717/* i915_gem_tiling.c */ 1722/* 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 efaaba5c4194..4aa6d73e6262 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)
312 return NULL; 312 return NULL;
313} 313}
314 314
315struct drm_i915_gem_object *
316i915_gem_object_create_stolen_for_preallocated(struct drm_device *dev,
317 u32 stolen_offset,
318 u32 gtt_offset,
319 u32 size)
320{
321 struct drm_i915_private *dev_priv = dev->dev_private;
322 struct drm_i915_gem_object *obj;
323 struct drm_mm_node *stolen;
324
325 if (dev_priv->mm.stolen_base == 0)
326 return NULL;
327
328 DRM_DEBUG_KMS("creating preallocated stolen object: stolen_offset=%x, gtt_offset=%x, size=%x\n",
329 stolen_offset, gtt_offset, size);
330
331 /* KISS and expect everything to be page-aligned */
332 BUG_ON(stolen_offset & 4095);
333 BUG_ON(gtt_offset & 4095);
334 BUG_ON(size & 4095);
335
336 if (WARN_ON(size == 0))
337 return NULL;
338
339 stolen = drm_mm_create_block(&dev_priv->mm.stolen,
340 stolen_offset, size,
341 false);
342 if (stolen == NULL) {
343 DRM_DEBUG_KMS("failed to allocate stolen space\n");
344 return NULL;
345 }
346
347 obj = _i915_gem_object_create_stolen(dev, stolen);
348 if (obj == NULL) {
349 DRM_DEBUG_KMS("failed to allocate stolen object\n");
350 drm_mm_put_block(stolen);
351 return NULL;
352 }
353
354 /* To simplify the initialisation sequence between KMS and GTT,
355 * we allow construction of the stolen object prior to
356 * setting up the GTT space. The actual reservation will occur
357 * later.
358 */
359 if (drm_mm_initialized(&dev_priv->mm.gtt_space)) {
360 obj->gtt_space = drm_mm_create_block(&dev_priv->mm.gtt_space,
361 gtt_offset, size,
362 false);
363 if (obj->gtt_space == NULL) {
364 DRM_DEBUG_KMS("failed to allocate stolen GTT space\n");
365 drm_gem_object_unreference(&obj->base);
366 return NULL;
367 }
368 } else
369 obj->gtt_space = I915_GTT_RESERVED;
370
371 obj->gtt_offset = gtt_offset;
372 obj->has_global_gtt_mapping = 1;
373
374 list_add_tail(&obj->gtt_list, &dev_priv->mm.bound_list);
375 list_add_tail(&obj->mm_list, &dev_priv->mm.inactive_list);
376
377 return obj;
378}
379
315void 380void
316i915_gem_object_release_stolen(struct drm_i915_gem_object *obj) 381i915_gem_object_release_stolen(struct drm_i915_gem_object *obj)
317{ 382{