diff options
author | Joonyoung Shim <jy0922.shim@samsung.com> | 2013-06-28 01:24:54 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2013-07-05 01:44:49 -0400 |
commit | 78467dc5f70fb9bee4a32c0c3714c99b0b5465c7 (patch) | |
tree | fe5b399e17578e2a819083df5d7e0fee11df4027 /drivers/gpu/drm/drm_gem_cma_helper.c | |
parent | 7c397cd97b8f46659698396b420bd48c3e6703e6 (diff) |
drm/cma: add low-level hook functions to use prime helpers
Instead of using the dma_buf functionality for GEM CMA, we can use prime
helpers if we can provide low-level hook functions for GEM CMA.
Signed-off-by: Joonyoung Shim <jy0922.shim@samsung.com>
Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/drm_gem_cma_helper.c')
-rw-r--r-- | drivers/gpu/drm/drm_gem_cma_helper.c | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/drivers/gpu/drm/drm_gem_cma_helper.c b/drivers/gpu/drm/drm_gem_cma_helper.c index ce063970d68c..83a45e5cf04e 100644 --- a/drivers/gpu/drm/drm_gem_cma_helper.c +++ b/drivers/gpu/drm/drm_gem_cma_helper.c | |||
@@ -602,3 +602,82 @@ error_gem_free: | |||
602 | return ERR_PTR(ret); | 602 | return ERR_PTR(ret); |
603 | } | 603 | } |
604 | EXPORT_SYMBOL_GPL(drm_gem_cma_dmabuf_import); | 604 | EXPORT_SYMBOL_GPL(drm_gem_cma_dmabuf_import); |
605 | |||
606 | /* low-level interface prime helpers */ | ||
607 | struct sg_table *drm_gem_cma_prime_get_sg_table(struct drm_gem_object *obj) | ||
608 | { | ||
609 | struct drm_gem_cma_object *cma_obj = to_drm_gem_cma_obj(obj); | ||
610 | struct sg_table *sgt; | ||
611 | int ret; | ||
612 | |||
613 | sgt = kzalloc(sizeof(*sgt), GFP_KERNEL); | ||
614 | if (!sgt) | ||
615 | return NULL; | ||
616 | |||
617 | ret = dma_get_sgtable(obj->dev->dev, sgt, cma_obj->vaddr, | ||
618 | cma_obj->paddr, obj->size); | ||
619 | if (ret < 0) | ||
620 | goto out; | ||
621 | |||
622 | return sgt; | ||
623 | |||
624 | out: | ||
625 | kfree(sgt); | ||
626 | return NULL; | ||
627 | } | ||
628 | EXPORT_SYMBOL_GPL(drm_gem_cma_prime_get_sg_table); | ||
629 | |||
630 | struct drm_gem_object * | ||
631 | drm_gem_cma_prime_import_sg_table(struct drm_device *dev, size_t size, | ||
632 | struct sg_table *sgt) | ||
633 | { | ||
634 | struct drm_gem_cma_object *cma_obj; | ||
635 | |||
636 | if (sgt->nents != 1) | ||
637 | return ERR_PTR(-EINVAL); | ||
638 | |||
639 | /* Create a CMA GEM buffer. */ | ||
640 | cma_obj = __drm_gem_cma_create(dev, size); | ||
641 | if (IS_ERR(cma_obj)) | ||
642 | return ERR_PTR(PTR_ERR(cma_obj)); | ||
643 | |||
644 | cma_obj->paddr = sg_dma_address(sgt->sgl); | ||
645 | cma_obj->sgt = sgt; | ||
646 | |||
647 | DRM_DEBUG_PRIME("dma_addr = 0x%x, size = %zu\n", cma_obj->paddr, size); | ||
648 | |||
649 | return &cma_obj->base; | ||
650 | } | ||
651 | EXPORT_SYMBOL_GPL(drm_gem_cma_prime_import_sg_table); | ||
652 | |||
653 | int drm_gem_cma_prime_mmap(struct drm_gem_object *obj, | ||
654 | struct vm_area_struct *vma) | ||
655 | { | ||
656 | struct drm_gem_cma_object *cma_obj; | ||
657 | struct drm_device *dev = obj->dev; | ||
658 | int ret; | ||
659 | |||
660 | mutex_lock(&dev->struct_mutex); | ||
661 | ret = drm_gem_mmap_obj(obj, obj->size, vma); | ||
662 | mutex_unlock(&dev->struct_mutex); | ||
663 | if (ret < 0) | ||
664 | return ret; | ||
665 | |||
666 | cma_obj = to_drm_gem_cma_obj(obj); | ||
667 | return drm_gem_cma_mmap_obj(cma_obj, vma); | ||
668 | } | ||
669 | EXPORT_SYMBOL_GPL(drm_gem_cma_prime_mmap); | ||
670 | |||
671 | void *drm_gem_cma_prime_vmap(struct drm_gem_object *obj) | ||
672 | { | ||
673 | struct drm_gem_cma_object *cma_obj = to_drm_gem_cma_obj(obj); | ||
674 | |||
675 | return cma_obj->vaddr; | ||
676 | } | ||
677 | EXPORT_SYMBOL_GPL(drm_gem_cma_prime_vmap); | ||
678 | |||
679 | void drm_gem_cma_prime_vunmap(struct drm_gem_object *obj, void *vaddr) | ||
680 | { | ||
681 | /* Nothing to do */ | ||
682 | } | ||
683 | EXPORT_SYMBOL_GPL(drm_gem_cma_prime_vunmap); | ||