]>
Commit | Line | Data |
---|---|---|
a0308938 DS |
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 | ||
9fe2f897 | 8 | #include <linux/module.h> |
a0308938 DS |
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); | |
9fe2f897 DS |
87 | |
88 | MODULE_LICENSE("GPL"); |