1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* 3 * dma-bufs for virtio exported objects 4 * 5 * Copyright (C) 2020 Google, Inc. 6 */ 7 8 #include <linux/module.h> 9 #include <linux/virtio_dma_buf.h> 10 11 /** 12 * virtio_dma_buf_export - Creates a new dma-buf for a virtio exported object 13 * @exp_info: [in] see dma_buf_export(). ops MUST refer to a dma_buf_ops 14 * struct embedded in a virtio_dma_buf_ops. 15 * 16 * This wraps dma_buf_export() to allow virtio drivers to create a dma-buf 17 * for an virtio exported object that can be queried by other virtio drivers 18 * for the object's UUID. 19 */ 20 struct dma_buf *virtio_dma_buf_export 21 (const struct dma_buf_export_info *exp_info) 22 { 23 const struct virtio_dma_buf_ops *virtio_ops = 24 container_of(exp_info->ops, 25 const struct virtio_dma_buf_ops, ops); 26 27 if (!exp_info->ops || 28 exp_info->ops->attach != &virtio_dma_buf_attach || 29 !virtio_ops->get_uuid) { 30 return ERR_PTR(-EINVAL); 31 } 32 33 return dma_buf_export(exp_info); 34 } 35 EXPORT_SYMBOL(virtio_dma_buf_export); 36 37 /** 38 * virtio_dma_buf_attach - mandatory attach callback for virtio dma-bufs 39 */ 40 int virtio_dma_buf_attach(struct dma_buf *dma_buf, 41 struct dma_buf_attachment *attach) 42 { 43 int ret; 44 const struct virtio_dma_buf_ops *ops = 45 container_of(dma_buf->ops, 46 const struct virtio_dma_buf_ops, ops); 47 48 if (ops->device_attach) { 49 ret = ops->device_attach(dma_buf, attach); 50 if (ret) 51 return ret; 52 } 53 return 0; 54 } 55 EXPORT_SYMBOL(virtio_dma_buf_attach); 56 57 /** 58 * is_virtio_dma_buf - returns true if the given dma-buf is a virtio dma-buf 59 * @dma_buf: buffer to query 60 */ 61 bool is_virtio_dma_buf(struct dma_buf *dma_buf) 62 { 63 return dma_buf->ops->attach == &virtio_dma_buf_attach; 64 } 65 EXPORT_SYMBOL(is_virtio_dma_buf); 66 67 /** 68 * virtio_dma_buf_get_uuid - gets a virtio dma-buf's exported object's uuid 69 * @dma_buf: [in] buffer to query 70 * @uuid: [out] the uuid 71 * 72 * Returns: 0 on success, negative on failure. 73 */ 74 int virtio_dma_buf_get_uuid(struct dma_buf *dma_buf, 75 uuid_t *uuid) 76 { 77 const struct virtio_dma_buf_ops *ops = 78 container_of(dma_buf->ops, 79 const struct virtio_dma_buf_ops, ops); 80 81 if (!is_virtio_dma_buf(dma_buf)) 82 return -EINVAL; 83 84 return ops->get_uuid(dma_buf, uuid); 85 } 86 EXPORT_SYMBOL(virtio_dma_buf_get_uuid); 87 88 MODULE_LICENSE("GPL"); 89