| 1 | /* |
| 2 | * Virtio crypto Support |
| 3 | * |
| 4 | * Copyright (c) 2016 HUAWEI TECHNOLOGIES CO., LTD. |
| 5 | * |
| 6 | * Authors: |
| 7 | * Gonglei <arei.gonglei@huawei.com> |
| 8 | * |
| 9 | * This work is licensed under the terms of the GNU GPL, version 2 or |
| 10 | * (at your option) any later version. See the COPYING file in the |
| 11 | * top-level directory. |
| 12 | */ |
| 13 | |
| 14 | #ifndef QEMU_VIRTIO_CRYPTO_H |
| 15 | #define QEMU_VIRTIO_CRYPTO_H |
| 16 | |
| 17 | #include "standard-headers/linux/virtio_crypto.h" |
| 18 | #include "hw/virtio/virtio.h" |
| 19 | #include "system/iothread.h" |
| 20 | #include "system/cryptodev.h" |
| 21 | #include "qom/object.h" |
| 22 | |
| 23 | |
| 24 | #define DEBUG_VIRTIO_CRYPTO 0 |
| 25 | |
| 26 | #define DPRINTF(fmt, ...) \ |
| 27 | do { \ |
| 28 | if (DEBUG_VIRTIO_CRYPTO) { \ |
| 29 | fprintf(stderr, "virtio_crypto: " fmt, ##__VA_ARGS__); \ |
| 30 | } \ |
| 31 | } while (0) |
| 32 | |
| 33 | |
| 34 | #define TYPE_VIRTIO_CRYPTO "virtio-crypto-device" |
| 35 | OBJECT_DECLARE_SIMPLE_TYPE(VirtIOCrypto, VIRTIO_CRYPTO) |
| 36 | #define VIRTIO_CRYPTO_GET_PARENT_CLASS(obj) \ |
| 37 | OBJECT_GET_PARENT_CLASS(obj, TYPE_VIRTIO_CRYPTO) |
| 38 | |
| 39 | |
| 40 | typedef struct VirtIOCryptoConf { |
| 41 | CryptoDevBackend *cryptodev; |
| 42 | |
| 43 | /* Supported service mask */ |
| 44 | uint32_t crypto_services; |
| 45 | |
| 46 | /* Detailed algorithms mask */ |
| 47 | uint32_t cipher_algo_l; |
| 48 | uint32_t cipher_algo_h; |
| 49 | uint32_t hash_algo; |
| 50 | uint32_t mac_algo_l; |
| 51 | uint32_t mac_algo_h; |
| 52 | uint32_t aead_algo; |
| 53 | uint32_t akcipher_algo; |
| 54 | |
| 55 | /* Maximum length of cipher key */ |
| 56 | uint32_t max_cipher_key_len; |
| 57 | /* Maximum length of authenticated key */ |
| 58 | uint32_t max_auth_key_len; |
| 59 | /* Maximum size of each crypto request's content */ |
| 60 | uint64_t max_size; |
| 61 | } VirtIOCryptoConf; |
| 62 | |
| 63 | struct VirtIOCrypto; |
| 64 | |
| 65 | typedef struct VirtIOCryptoReq { |
| 66 | VirtQueueElement elem; |
| 67 | /* flags of operation, such as type of algorithm */ |
| 68 | uint32_t flags; |
| 69 | struct virtio_crypto_inhdr *in; |
| 70 | struct iovec *in_iov; /* Head address of dest iovec */ |
| 71 | unsigned int in_num; /* Number of dest iovec */ |
| 72 | size_t in_len; |
| 73 | VirtQueue *vq; |
| 74 | struct VirtIOCrypto *vcrypto; |
| 75 | CryptoDevBackendOpInfo op_info; |
| 76 | } VirtIOCryptoReq; |
| 77 | |
| 78 | typedef struct VirtIOCryptoQueue { |
| 79 | VirtQueue *dataq; |
| 80 | QEMUBH *dataq_bh; |
| 81 | struct VirtIOCrypto *vcrypto; |
| 82 | } VirtIOCryptoQueue; |
| 83 | |
| 84 | struct VirtIOCrypto { |
| 85 | VirtIODevice parent_obj; |
| 86 | |
| 87 | VirtQueue *ctrl_vq; |
| 88 | VirtIOCryptoQueue *vqs; |
| 89 | VirtIOCryptoConf conf; |
| 90 | CryptoDevBackend *cryptodev; |
| 91 | |
| 92 | uint32_t max_queues; |
| 93 | uint32_t status; |
| 94 | |
| 95 | int multiqueue; |
| 96 | uint32_t curr_queues; |
| 97 | size_t config_size; |
| 98 | uint8_t vhost_started; |
| 99 | }; |
| 100 | |
| 101 | #endif /* QEMU_VIRTIO_CRYPTO_H */ |