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