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