tegrakernel/kernel/nvidia/drivers/video/tegra/nvmap/nv2/nvmap_dmabuf.c

89 lines
2.1 KiB
C

/*
* dma_buf exporter for nvmap
*
* Copyright (c) 2012-2018, NVIDIA CORPORATION. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope 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.
*/
#define pr_fmt(fmt) "nvmap: %s() " fmt, __func__
#include <linux/list.h>
#include <linux/slab.h>
#include <linux/nvmap.h>
#include <linux/dma-buf.h>
#include <linux/version.h>
#include <trace/events/nvmap.h>
#include "nvmap_dmabuf.h"
extern bool dmabuf_is_nvmap(struct dma_buf *dmabuf);
extern struct dma_buf_ops nvmap_dma_buf_ops;
int nvmap_dmabuf_is_nvmap(struct dma_buf *dmabuf)
{
return dmabuf_is_nvmap(dmabuf);
}
struct dma_buf *nvmap_dmabuf_from_fd(int fd)
{
struct dma_buf *dmabuf;
dmabuf = dma_buf_get(fd);
if (IS_ERR(dmabuf))
return dmabuf;
dma_buf_put(dmabuf);
return dmabuf;
}
struct nvmap_handle * nvmap_dmabuf_to_handle(struct dma_buf *dmabuf)
{
struct nvmap_handle_info *info;
if (!dmabuf_is_nvmap(dmabuf)) {
return ERR_PTR(-EINVAL);
}
info = dmabuf->priv;
return info->handle;
}
void nvmap_dmabuf_install_fd(struct dma_buf *dmabuf, int fd)
{
fd_install(fd, dmabuf->file);
}
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 0)
static struct dma_buf *__dma_buf_export(void * priv,
size_t size)
{
DEFINE_DMA_BUF_EXPORT_INFO(exp_info);
exp_info.priv = priv;
exp_info.ops = &nvmap_dma_buf_ops;
exp_info.size = size;
exp_info.flags = O_RDWR;
exp_info.exp_flags = DMABUF_CAN_DEFER_UNMAP |
DMABUF_SKIP_CACHE_SYNC;
return dma_buf_export(&exp_info);
}
#else
#define __dma_buf_export(priv, size) \
dma_buf_export(priv, &nvmap_dma_buf_ops, size, O_RDWR, NULL)
#endif
/*
* Make a dmabuf object for an nvmap handle.
*/
struct dma_buf *nvmap_dmabuf_create(void * priv, size_t size)
{
return __dma_buf_export(priv, size);
}