diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2013-02-19 16:31:37 -0500 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2013-03-26 15:39:28 -0400 |
commit | 866d12b4ee5faefbc1a98b787ac4242a2f04b051 (patch) | |
tree | 5af9628efb98e0c73dd6e306d2c0bf67e66644e4 | |
parent | f9c513e9d6d25fec3404a97c9b0f03b2eb858315 (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.h | 5 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem_stolen.c | 65 |
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); | |||
1712 | void i915_gem_cleanup_stolen(struct drm_device *dev); | 1712 | void i915_gem_cleanup_stolen(struct drm_device *dev); |
1713 | struct drm_i915_gem_object * | 1713 | struct drm_i915_gem_object * |
1714 | i915_gem_object_create_stolen(struct drm_device *dev, u32 size); | 1714 | i915_gem_object_create_stolen(struct drm_device *dev, u32 size); |
1715 | struct drm_i915_gem_object * | ||
1716 | i915_gem_object_create_stolen_for_preallocated(struct drm_device *dev, | ||
1717 | u32 stolen_offset, | ||
1718 | u32 gtt_offset, | ||
1719 | u32 size); | ||
1715 | void i915_gem_object_release_stolen(struct drm_i915_gem_object *obj); | 1720 | void 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 | ||
315 | struct drm_i915_gem_object * | ||
316 | i915_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 | |||
315 | void | 380 | void |
316 | i915_gem_object_release_stolen(struct drm_i915_gem_object *obj) | 381 | i915_gem_object_release_stolen(struct drm_i915_gem_object *obj) |
317 | { | 382 | { |