diff options
Diffstat (limited to 'drivers/gpu/drm/i915/display/intel_dsb_buffer.c')
| -rw-r--r-- | drivers/gpu/drm/i915/display/intel_dsb_buffer.c | 43 |
1 files changed, 33 insertions, 10 deletions
diff --git a/drivers/gpu/drm/i915/display/intel_dsb_buffer.c b/drivers/gpu/drm/i915/display/intel_dsb_buffer.c index c77d48bda26a..50faf3869b6c 100644 --- a/drivers/gpu/drm/i915/display/intel_dsb_buffer.c +++ b/drivers/gpu/drm/i915/display/intel_dsb_buffer.c @@ -7,9 +7,14 @@ #include "gem/i915_gem_lmem.h" #include "i915_drv.h" #include "i915_vma.h" -#include "intel_display_types.h" #include "intel_dsb_buffer.h" +struct intel_dsb_buffer { + u32 *cmd_buf; + struct i915_vma *vma; + size_t buf_size; +}; + u32 intel_dsb_buffer_ggtt_offset(struct intel_dsb_buffer *dsb_buf) { return i915_ggtt_offset(dsb_buf->vma); @@ -32,48 +37,66 @@ void intel_dsb_buffer_memset(struct intel_dsb_buffer *dsb_buf, u32 idx, u32 val, memset(&dsb_buf->cmd_buf[idx], val, size); } -bool intel_dsb_buffer_create(struct intel_crtc *crtc, struct intel_dsb_buffer *dsb_buf, size_t size) +struct intel_dsb_buffer *intel_dsb_buffer_create(struct drm_device *drm, size_t size) { - struct drm_i915_private *i915 = to_i915(crtc->base.dev); + struct drm_i915_private *i915 = to_i915(drm); + struct intel_dsb_buffer *dsb_buf; struct drm_i915_gem_object *obj; struct i915_vma *vma; u32 *buf; + int ret; + + dsb_buf = kzalloc(sizeof(*dsb_buf), GFP_KERNEL); + if (!dsb_buf) + return ERR_PTR(-ENOMEM); if (HAS_LMEM(i915)) { obj = i915_gem_object_create_lmem(i915, PAGE_ALIGN(size), I915_BO_ALLOC_CONTIGUOUS); - if (IS_ERR(obj)) - return false; + if (IS_ERR(obj)) { + ret = PTR_ERR(obj); + goto err; + } } else { obj = i915_gem_object_create_internal(i915, PAGE_ALIGN(size)); - if (IS_ERR(obj)) - return false; + if (IS_ERR(obj)) { + ret = PTR_ERR(obj); + goto err; + } i915_gem_object_set_cache_coherency(obj, I915_CACHE_NONE); } vma = i915_gem_object_ggtt_pin(obj, NULL, 0, 0, 0); if (IS_ERR(vma)) { + ret = PTR_ERR(vma); i915_gem_object_put(obj); - return false; + goto err; } buf = i915_gem_object_pin_map_unlocked(vma->obj, I915_MAP_WC); if (IS_ERR(buf)) { + ret = PTR_ERR(buf); i915_vma_unpin_and_release(&vma, I915_VMA_RELEASE_MAP); - return false; + goto err; } dsb_buf->vma = vma; dsb_buf->cmd_buf = buf; dsb_buf->buf_size = size; - return true; + return dsb_buf; + +err: + kfree(dsb_buf); + + return ERR_PTR(ret); } void intel_dsb_buffer_cleanup(struct intel_dsb_buffer *dsb_buf) { i915_vma_unpin_and_release(&dsb_buf->vma, I915_VMA_RELEASE_MAP); + kfree(dsb_buf); } void intel_dsb_buffer_flush_map(struct intel_dsb_buffer *dsb_buf) |
