Loading drivers/gpu/drm/msm/msm_drv.c +2 −2 Original line number Diff line number Diff line /* * Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. * Copyright (c) 2016-2018, The Linux Foundation. All rights reserved. * Copyright (C) 2013 Red Hat * Author: Rob Clark <robdclark@gmail.com> * Loading Loading @@ -1658,7 +1658,7 @@ static struct drm_driver msm_driver = { .prime_handle_to_fd = drm_gem_prime_handle_to_fd, .prime_fd_to_handle = drm_gem_prime_fd_to_handle, .gem_prime_export = drm_gem_prime_export, .gem_prime_import = drm_gem_prime_import, .gem_prime_import = msm_gem_prime_import, .gem_prime_res_obj = msm_gem_prime_res_obj, .gem_prime_pin = msm_gem_prime_pin, .gem_prime_unpin = msm_gem_prime_unpin, Loading drivers/gpu/drm/msm/msm_drv.h +3 −1 Original line number Diff line number Diff line /* * Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. * Copyright (c) 2016-2018, The Linux Foundation. All rights reserved. * Copyright (C) 2013 Red Hat * Author: Rob Clark <robdclark@gmail.com> * Loading Loading @@ -750,6 +750,8 @@ struct drm_gem_object *msm_gem_prime_import_sg_table(struct drm_device *dev, struct dma_buf_attachment *attach, struct sg_table *sg); int msm_gem_prime_pin(struct drm_gem_object *obj); void msm_gem_prime_unpin(struct drm_gem_object *obj); struct drm_gem_object *msm_gem_prime_import(struct drm_device *dev, struct dma_buf *dma_buf); void *msm_gem_get_vaddr(struct drm_gem_object *obj); void msm_gem_put_vaddr(struct drm_gem_object *obj); int msm_gem_madvise(struct drm_gem_object *obj, unsigned madv); Loading drivers/gpu/drm/msm/msm_gem_prime.c +67 −0 Original line number Diff line number Diff line Loading @@ -77,3 +77,70 @@ struct reservation_object *msm_gem_prime_res_obj(struct drm_gem_object *obj) return msm_obj->resv; } struct drm_gem_object *msm_gem_prime_import(struct drm_device *dev, struct dma_buf *dma_buf) { struct dma_buf_attachment *attach; struct sg_table *sgt; struct drm_gem_object *obj; struct device *attach_dev; int ret; if (!dma_buf) return ERR_PTR(-EINVAL); if (dma_buf->priv && !dma_buf->ops->begin_cpu_access) { obj = dma_buf->priv; if (obj->dev == dev) { /* * Importing dmabuf exported from out own gem increases * refcount on gem itself instead of f_count of dmabuf. */ drm_gem_object_get(obj); return obj; } } if (!dev->driver->gem_prime_import_sg_table) { DRM_ERROR("NULL gem_prime_import_sg_table\n"); return ERR_PTR(-EINVAL); } attach_dev = dev->dev; attach = dma_buf_attach(dma_buf, attach_dev); if (IS_ERR(attach)) { DRM_ERROR("dma_buf_attach failure, err=%d\n", PTR_ERR(attach)); return ERR_CAST(attach); } get_dma_buf(dma_buf); attach->dma_map_attrs |= DMA_ATTR_DELAYED_UNMAP; sgt = dma_buf_map_attachment(attach, DMA_BIDIRECTIONAL); if (IS_ERR(sgt)) { ret = PTR_ERR(sgt); DRM_ERROR("dma_buf_map_attachment failure, err=%d\n", ret); goto fail_detach; } obj = dev->driver->gem_prime_import_sg_table(dev, attach, sgt); if (IS_ERR(obj)) { ret = PTR_ERR(obj); DRM_ERROR("gem_prime_import_sg_table failure, err=%d\n", ret); goto fail_unmap; } obj->import_attach = attach; return obj; fail_unmap: dma_buf_unmap_attachment(attach, sgt, DMA_BIDIRECTIONAL); fail_detach: dma_buf_detach(dma_buf, attach); dma_buf_put(dma_buf); return ERR_PTR(ret); } Loading
drivers/gpu/drm/msm/msm_drv.c +2 −2 Original line number Diff line number Diff line /* * Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. * Copyright (c) 2016-2018, The Linux Foundation. All rights reserved. * Copyright (C) 2013 Red Hat * Author: Rob Clark <robdclark@gmail.com> * Loading Loading @@ -1658,7 +1658,7 @@ static struct drm_driver msm_driver = { .prime_handle_to_fd = drm_gem_prime_handle_to_fd, .prime_fd_to_handle = drm_gem_prime_fd_to_handle, .gem_prime_export = drm_gem_prime_export, .gem_prime_import = drm_gem_prime_import, .gem_prime_import = msm_gem_prime_import, .gem_prime_res_obj = msm_gem_prime_res_obj, .gem_prime_pin = msm_gem_prime_pin, .gem_prime_unpin = msm_gem_prime_unpin, Loading
drivers/gpu/drm/msm/msm_drv.h +3 −1 Original line number Diff line number Diff line /* * Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. * Copyright (c) 2016-2018, The Linux Foundation. All rights reserved. * Copyright (C) 2013 Red Hat * Author: Rob Clark <robdclark@gmail.com> * Loading Loading @@ -750,6 +750,8 @@ struct drm_gem_object *msm_gem_prime_import_sg_table(struct drm_device *dev, struct dma_buf_attachment *attach, struct sg_table *sg); int msm_gem_prime_pin(struct drm_gem_object *obj); void msm_gem_prime_unpin(struct drm_gem_object *obj); struct drm_gem_object *msm_gem_prime_import(struct drm_device *dev, struct dma_buf *dma_buf); void *msm_gem_get_vaddr(struct drm_gem_object *obj); void msm_gem_put_vaddr(struct drm_gem_object *obj); int msm_gem_madvise(struct drm_gem_object *obj, unsigned madv); Loading
drivers/gpu/drm/msm/msm_gem_prime.c +67 −0 Original line number Diff line number Diff line Loading @@ -77,3 +77,70 @@ struct reservation_object *msm_gem_prime_res_obj(struct drm_gem_object *obj) return msm_obj->resv; } struct drm_gem_object *msm_gem_prime_import(struct drm_device *dev, struct dma_buf *dma_buf) { struct dma_buf_attachment *attach; struct sg_table *sgt; struct drm_gem_object *obj; struct device *attach_dev; int ret; if (!dma_buf) return ERR_PTR(-EINVAL); if (dma_buf->priv && !dma_buf->ops->begin_cpu_access) { obj = dma_buf->priv; if (obj->dev == dev) { /* * Importing dmabuf exported from out own gem increases * refcount on gem itself instead of f_count of dmabuf. */ drm_gem_object_get(obj); return obj; } } if (!dev->driver->gem_prime_import_sg_table) { DRM_ERROR("NULL gem_prime_import_sg_table\n"); return ERR_PTR(-EINVAL); } attach_dev = dev->dev; attach = dma_buf_attach(dma_buf, attach_dev); if (IS_ERR(attach)) { DRM_ERROR("dma_buf_attach failure, err=%d\n", PTR_ERR(attach)); return ERR_CAST(attach); } get_dma_buf(dma_buf); attach->dma_map_attrs |= DMA_ATTR_DELAYED_UNMAP; sgt = dma_buf_map_attachment(attach, DMA_BIDIRECTIONAL); if (IS_ERR(sgt)) { ret = PTR_ERR(sgt); DRM_ERROR("dma_buf_map_attachment failure, err=%d\n", ret); goto fail_detach; } obj = dev->driver->gem_prime_import_sg_table(dev, attach, sgt); if (IS_ERR(obj)) { ret = PTR_ERR(obj); DRM_ERROR("gem_prime_import_sg_table failure, err=%d\n", ret); goto fail_unmap; } obj->import_attach = attach; return obj; fail_unmap: dma_buf_unmap_attachment(attach, sgt, DMA_BIDIRECTIONAL); fail_detach: dma_buf_detach(dma_buf, attach); dma_buf_put(dma_buf); return ERR_PTR(ret); }