1 /*
2  * QEMU Crypto Device Common Vhost Implement
3  *
4  * Copyright (c) 2016 HUAWEI TECHNOLOGIES CO., LTD.
5  *
6  * Authors:
7  *    Gonglei <arei.gonglei@huawei.com>
8  *    Jay Zhou <jianjay.zhou@huawei.com>
9  *
10  * This library is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU Lesser General Public
12  * License as published by the Free Software Foundation; either
13  * version 2 of the License, or (at your option) any later version.
14  *
15  * This library is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18  * Lesser General Public License for more details.
19  *
20  * You should have received a copy of the GNU Lesser General Public
21  * License along with this library; if not, see <http://www.gnu.org/licenses/>.
22  *
23  */
24 #ifndef CRYPTODEV_VHOST_H
25 #define CRYPTODEV_VHOST_H
26 
27 #include "hw/virtio/vhost.h"
28 #include "hw/virtio/vhost-backend.h"
29 #include "chardev/char.h"
30 
31 #include "sysemu/cryptodev.h"
32 
33 
34 typedef struct CryptoDevBackendVhostOptions {
35     VhostBackendType backend_type;
36     void *opaque;
37     int total_queues;
38     CryptoDevBackendClient *cc;
39 } CryptoDevBackendVhostOptions;
40 
41 typedef struct CryptoDevBackendVhost {
42     struct vhost_dev dev;
43     struct vhost_virtqueue vqs[1];
44     int backend;
45     CryptoDevBackendClient *cc;
46 } CryptoDevBackendVhost;
47 
48 /**
49  * cryptodev_vhost_get_max_queues:
50  * @crypto: the cryptodev backend common vhost object
51  *
52  * Get the maximum queue number of @crypto.
53  *
54  *
55  * Returns: the maximum queue number
56  */
57 uint64_t
58 cryptodev_vhost_get_max_queues(
59                         CryptoDevBackendVhost *crypto);
60 
61 
62 /**
63  * cryptodev_vhost_init:
64  * @options: the common vhost object's option
65  *
66  * Creates a new cryptodev backend common vhost object
67  *
68  ** The returned object must be released with
69  * cryptodev_vhost_cleanup() when no
70  * longer required
71  *
72  * Returns: the cryptodev backend common vhost object
73  */
74 struct CryptoDevBackendVhost *
75 cryptodev_vhost_init(
76              CryptoDevBackendVhostOptions *options);
77 
78 /**
79  * cryptodev_vhost_cleanup:
80  * @crypto: the cryptodev backend common vhost object
81  *
82  * Clean the resouce associated with @crypto that realizaed
83  * by cryptodev_vhost_init()
84  *
85  */
86 void cryptodev_vhost_cleanup(
87                         CryptoDevBackendVhost *crypto);
88 
89 /**
90  * cryptodev_get_vhost:
91  * @cc: the client object for each queue
92  * @b: the cryptodev backend common vhost object
93  * @queue: the cryptodev backend queue index
94  *
95  * Gets a new cryptodev backend common vhost object based on
96  * @b and @queue
97  *
98  * Returns: the cryptodev backend common vhost object
99  */
100 CryptoDevBackendVhost *
101 cryptodev_get_vhost(CryptoDevBackendClient *cc,
102                             CryptoDevBackend *b,
103                             uint16_t queue);
104 /**
105  * cryptodev_vhost_start:
106  * @dev: the virtio crypto object
107  * @total_queues: the total count of queue
108  *
109  * Starts the vhost crypto logic
110  *
111  * Returns: 0 for success, negative for errors
112  */
113 int cryptodev_vhost_start(VirtIODevice *dev, int total_queues);
114 
115 /**
116  * cryptodev_vhost_stop:
117  * @dev: the virtio crypto object
118  * @total_queues: the total count of queue
119  *
120  * Stops the vhost crypto logic
121  *
122  */
123 void cryptodev_vhost_stop(VirtIODevice *dev, int total_queues);
124 
125 /**
126  * cryptodev_vhost_virtqueue_mask:
127  * @dev: the virtio crypto object
128  * @queue: the cryptodev backend queue index
129  * @idx: the virtqueue index
130  * @mask: mask or not (true or false)
131  *
132  * Mask/unmask events for @idx virtqueue on @dev device
133  *
134  */
135 void cryptodev_vhost_virtqueue_mask(VirtIODevice *dev,
136                                            int queue,
137                                            int idx, bool mask);
138 
139 /**
140  * cryptodev_vhost_virtqueue_pending:
141  * @dev: the virtio crypto object
142  * @queue: the cryptodev backend queue index
143  * @idx: the virtqueue index
144  *
145  * Test and clear event pending status for @idx virtqueue on @dev device.
146  * Should be called after unmask to avoid losing events.
147  *
148  * Returns: true for success, false for errors
149  */
150 bool cryptodev_vhost_virtqueue_pending(VirtIODevice *dev,
151                                               int queue, int idx);
152 
153 #endif /* CRYPTODEV_VHOST_H */
154