// SPDX-License-Identifier: GPL-2.0-or-later
/*
 * dma-bufs for virtio exported objects
 *
 * Copyright (C) 2020 Google, Inc.
 */

#include <linux/module.h>
#include <linux/virtio_dma_buf.h>

/**
 * virtio_dma_buf_export - Creates a new dma-buf for a virtio exported object
 * @exp_info: [in] see dma_buf_export(). ops MUST refer to a dma_buf_ops
 *	struct embedded in a virtio_dma_buf_ops.
 *
 * This wraps dma_buf_export() to allow virtio drivers to create a dma-buf
 * for a virtio exported object that can be queried by other virtio drivers
 * for the object's UUID.
 */
struct dma_buf *virtio_dma_buf_export
	(const struct dma_buf_export_info *exp_info)
{
	const struct virtio_dma_buf_ops *virtio_ops =
		container_of(exp_info->ops,
			     const struct virtio_dma_buf_ops, ops);

	if (!exp_info->ops ||
	    exp_info->ops->attach != &virtio_dma_buf_attach ||
	    !virtio_ops->get_uuid) {
		return ERR_PTR(-EINVAL);
	}

	return dma_buf_export(exp_info);
}
EXPORT_SYMBOL(virtio_dma_buf_export);

/**
 * virtio_dma_buf_attach - mandatory attach callback for virtio dma-bufs
 * @dma_buf: [in] buffer to attach
 * @attach: [in] attachment structure
 */
int virtio_dma_buf_attach(struct dma_buf *dma_buf,
			  struct dma_buf_attachment *attach)
{
	int ret;
	const struct virtio_dma_buf_ops *ops =
		container_of(dma_buf->ops,
			     const struct virtio_dma_buf_ops, ops);

	if (ops->device_attach) {
		ret = ops->device_attach(dma_buf, attach);
		if (ret)
			return ret;
	}
	return 0;
}
EXPORT_SYMBOL(virtio_dma_buf_attach);

/**
 * is_virtio_dma_buf - returns true if the given dma-buf is a virtio dma-buf
 * @dma_buf: buffer to query
 */
bool is_virtio_dma_buf(struct dma_buf *dma_buf)
{
	return dma_buf->ops->attach == &virtio_dma_buf_attach;
}
EXPORT_SYMBOL(is_virtio_dma_buf);

/**
 * virtio_dma_buf_get_uuid - gets a virtio dma-buf's exported object's uuid
 * @dma_buf: [in] buffer to query
 * @uuid: [out] the uuid
 *
 * Returns: 0 on success, negative on failure.
 */
int virtio_dma_buf_get_uuid(struct dma_buf *dma_buf,
			    uuid_t *uuid)
{
	const struct virtio_dma_buf_ops *ops =
		container_of(dma_buf->ops,
			     const struct virtio_dma_buf_ops, ops);

	if (!is_virtio_dma_buf(dma_buf))
		return -EINVAL;

	return ops->get_uuid(dma_buf, uuid);
}
EXPORT_SYMBOL(virtio_dma_buf_get_uuid);

MODULE_DESCRIPTION("dma-bufs for virtio exported objects");
MODULE_LICENSE("GPL");
MODULE_IMPORT_NS("DMA_BUF");
