cregit-Linux how code gets into the kernel

Release 4.11 drivers/gpu/drm/omapdrm/omap_gem_dmabuf.c

/*
 * drivers/gpu/drm/omapdrm/omap_gem_dmabuf.c
 *
 * Copyright (C) 2011 Texas Instruments
 * Author: Rob Clark <rob.clark@linaro.org>
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 as published by
 * the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License along with
 * this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#include <linux/dma-buf.h>

#include "omap_drv.h"

/* -----------------------------------------------------------------------------
 * DMABUF Export
 */


static struct sg_table *omap_gem_map_dma_buf( struct dma_buf_attachment *attachment, enum dma_data_direction dir) { struct drm_gem_object *obj = attachment->dmabuf->priv; struct sg_table *sg; dma_addr_t paddr; int ret; sg = kzalloc(sizeof(*sg), GFP_KERNEL); if (!sg) return ERR_PTR(-ENOMEM); /* camera, etc, need physically contiguous.. but we need a * better way to know this.. */ ret = omap_gem_get_paddr(obj, &paddr, true); if (ret) goto out; ret = sg_alloc_table(sg, 1, GFP_KERNEL); if (ret) goto out; sg_init_table(sg->sgl, 1); sg_dma_len(sg->sgl) = obj->size; sg_set_page(sg->sgl, pfn_to_page(PFN_DOWN(paddr)), obj->size, 0); sg_dma_address(sg->sgl) = paddr; /* this should be after _get_paddr() to ensure we have pages attached */ omap_gem_dma_sync(obj, dir); return sg; out: kfree(sg); return ERR_PTR(ret); }

Contributors

PersonTokensPropCommitsCommitProp
Rob Clark16895.45%266.67%
Cong Ding84.55%133.33%
Total176100.00%3100.00%


static void omap_gem_unmap_dma_buf(struct dma_buf_attachment *attachment, struct sg_table *sg, enum dma_data_direction dir) { struct drm_gem_object *obj = attachment->dmabuf->priv; omap_gem_put_paddr(obj); sg_free_table(sg); kfree(sg); }

Contributors

PersonTokensPropCommitsCommitProp
Rob Clark46100.00%1100.00%
Total46100.00%1100.00%


static void omap_gem_dmabuf_release(struct dma_buf *buffer) { struct drm_gem_object *obj = buffer->priv; /* release reference that was taken when dmabuf was exported * in omap_gem_prime_set().. */ drm_gem_object_unreference_unlocked(obj); }

Contributors

PersonTokensPropCommitsCommitProp
Rob Clark26100.00%1100.00%
Total26100.00%1100.00%


static int omap_gem_dmabuf_begin_cpu_access(struct dma_buf *buffer, enum dma_data_direction dir) { struct drm_gem_object *obj = buffer->priv; struct page **pages; if (omap_gem_flags(obj) & OMAP_BO_TILED) { /* TODO we would need to pin at least part of the buffer to * get de-tiled view. For now just reject it. */ return -ENOMEM; } /* make sure we have the pages: */ return omap_gem_get_pages(obj, &pages, true); }

Contributors

PersonTokensPropCommitsCommitProp
Rob Clark58100.00%1100.00%
Total58100.00%1100.00%


static int omap_gem_dmabuf_end_cpu_access(struct dma_buf *buffer, enum dma_data_direction dir) { struct drm_gem_object *obj = buffer->priv; omap_gem_put_pages(obj); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Rob Clark2887.50%150.00%
Chris Wilson412.50%150.00%
Total32100.00%2100.00%


static void *omap_gem_dmabuf_kmap_atomic(struct dma_buf *buffer, unsigned long page_num) { struct drm_gem_object *obj = buffer->priv; struct page **pages; omap_gem_get_pages(obj, &pages, false); omap_gem_cpu_sync(obj, page_num); return kmap_atomic(pages[page_num]); }

Contributors

PersonTokensPropCommitsCommitProp
Rob Clark57100.00%2100.00%
Total57100.00%2100.00%


static void omap_gem_dmabuf_kunmap_atomic(struct dma_buf *buffer, unsigned long page_num, void *addr) { kunmap_atomic(addr); }

Contributors

PersonTokensPropCommitsCommitProp
Rob Clark24100.00%1100.00%
Total24100.00%1100.00%


static void *omap_gem_dmabuf_kmap(struct dma_buf *buffer, unsigned long page_num) { struct drm_gem_object *obj = buffer->priv; struct page **pages; omap_gem_get_pages(obj, &pages, false); omap_gem_cpu_sync(obj, page_num); return kmap(pages[page_num]); }

Contributors

PersonTokensPropCommitsCommitProp
Rob Clark57100.00%2100.00%
Total57100.00%2100.00%


static void omap_gem_dmabuf_kunmap(struct dma_buf *buffer, unsigned long page_num, void *addr) { struct drm_gem_object *obj = buffer->priv; struct page **pages; omap_gem_get_pages(obj, &pages, false); kunmap(pages[page_num]); }

Contributors

PersonTokensPropCommitsCommitProp
Rob Clark52100.00%1100.00%
Total52100.00%1100.00%


static int omap_gem_dmabuf_mmap(struct dma_buf *buffer, struct vm_area_struct *vma) { struct drm_gem_object *obj = buffer->priv; int ret = 0; ret = drm_gem_mmap_obj(obj, omap_gem_mmap_size(obj), vma); if (ret < 0) return ret; return omap_gem_mmap_obj(obj, vma); }

Contributors

PersonTokensPropCommitsCommitProp
Rob Clark4878.69%150.00%
Laurent Pinchart1321.31%150.00%
Total61100.00%2100.00%

static struct dma_buf_ops omap_dmabuf_ops = { .map_dma_buf = omap_gem_map_dma_buf, .unmap_dma_buf = omap_gem_unmap_dma_buf, .release = omap_gem_dmabuf_release, .begin_cpu_access = omap_gem_dmabuf_begin_cpu_access, .end_cpu_access = omap_gem_dmabuf_end_cpu_access, .kmap_atomic = omap_gem_dmabuf_kmap_atomic, .kunmap_atomic = omap_gem_dmabuf_kunmap_atomic, .kmap = omap_gem_dmabuf_kmap, .kunmap = omap_gem_dmabuf_kunmap, .mmap = omap_gem_dmabuf_mmap, };
struct dma_buf *omap_gem_prime_export(struct drm_device *dev, struct drm_gem_object *obj, int flags) { DEFINE_DMA_BUF_EXPORT_INFO(exp_info); exp_info.ops = &omap_dmabuf_ops; exp_info.size = obj->size; exp_info.flags = flags; exp_info.priv = obj; return dma_buf_export(&exp_info); }

Contributors

PersonTokensPropCommitsCommitProp
Sumit Semwal3050.85%133.33%
Rob Clark2949.15%266.67%
Total59100.00%3100.00%

/* ----------------------------------------------------------------------------- * DMABUF Import */
struct drm_gem_object *omap_gem_prime_import(struct drm_device *dev, struct dma_buf *dma_buf) { struct dma_buf_attachment *attach; struct drm_gem_object *obj; struct sg_table *sgt; int ret; if (dma_buf->ops == &omap_dmabuf_ops) { 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_reference(obj); return obj; } } attach = dma_buf_attach(dma_buf, dev->dev); if (IS_ERR(attach)) return ERR_CAST(attach); get_dma_buf(dma_buf); sgt = dma_buf_map_attachment(attach, DMA_BIDIRECTIONAL); if (IS_ERR(sgt)) { ret = PTR_ERR(sgt); goto fail_detach; } obj = omap_gem_new_dmabuf(dev, dma_buf->size, sgt); if (IS_ERR(obj)) { ret = PTR_ERR(obj); 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); }

Contributors

PersonTokensPropCommitsCommitProp
Laurent Pinchart14070.00%133.33%
Rob Clark5929.50%133.33%
Seung-Woo Kim10.50%133.33%
Total200100.00%3100.00%


Overall Contributors

PersonTokensPropCommitsCommitProp
Rob Clark71378.01%538.46%
Laurent Pinchart15717.18%323.08%
Sumit Semwal303.28%17.69%
Cong Ding80.88%17.69%
Chris Wilson40.44%17.69%
Seung-Woo Kim10.11%17.69%
Tomi Valkeinen10.11%17.69%
Total914100.00%13100.00%
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.