/* * QEMU Crypto Device Common Vhost Implement * * Copyright (c) 2016 HUAWEI TECHNOLOGIES CO., LTD. * * Authors: * Gonglei * Jay Zhou * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, see . * */ #ifndef CRYPTODEV_VHOST_H #define CRYPTODEV_VHOST_H #include "hw/virtio/vhost.h" #include "hw/virtio/vhost-backend.h" #include "chardev/char.h" #include "sysemu/cryptodev.h" typedef struct CryptoDevBackendVhostOptions { VhostBackendType backend_type; void *opaque; int total_queues; CryptoDevBackendClient *cc; } CryptoDevBackendVhostOptions; typedef struct CryptoDevBackendVhost { struct vhost_dev dev; struct vhost_virtqueue vqs[1]; int backend; CryptoDevBackendClient *cc; } CryptoDevBackendVhost; /** * cryptodev_vhost_get_max_queues: * @crypto: the cryptodev backend common vhost object * * Get the maximum queue number of @crypto. * * * Returns: the maximum queue number */ uint64_t cryptodev_vhost_get_max_queues( CryptoDevBackendVhost *crypto); /** * cryptodev_vhost_init: * @options: the common vhost object's option * * Creates a new cryptodev backend common vhost object * ** The returned object must be released with * cryptodev_vhost_cleanup() when no * longer required * * Returns: the cryptodev backend common vhost object */ struct CryptoDevBackendVhost * cryptodev_vhost_init( CryptoDevBackendVhostOptions *options); /** * cryptodev_vhost_cleanup: * @crypto: the cryptodev backend common vhost object * * Clean the resouce associated with @crypto that realizaed * by cryptodev_vhost_init() * */ void cryptodev_vhost_cleanup( CryptoDevBackendVhost *crypto); /** * cryptodev_get_vhost: * @cc: the client object for each queue * @b: the cryptodev backend common vhost object * @queue: the cryptodev backend queue index * * Gets a new cryptodev backend common vhost object based on * @b and @queue * * Returns: the cryptodev backend common vhost object */ CryptoDevBackendVhost * cryptodev_get_vhost(CryptoDevBackendClient *cc, CryptoDevBackend *b, uint16_t queue); /** * cryptodev_vhost_start: * @dev: the virtio crypto object * @total_queues: the total count of queue * * Starts the vhost crypto logic * * Returns: 0 for success, negative for errors */ int cryptodev_vhost_start(VirtIODevice *dev, int total_queues); /** * cryptodev_vhost_stop: * @dev: the virtio crypto object * @total_queues: the total count of queue * * Stops the vhost crypto logic * */ void cryptodev_vhost_stop(VirtIODevice *dev, int total_queues); /** * cryptodev_vhost_virtqueue_mask: * @dev: the virtio crypto object * @queue: the cryptodev backend queue index * @idx: the virtqueue index * @mask: mask or not (true or false) * * Mask/unmask events for @idx virtqueue on @dev device * */ void cryptodev_vhost_virtqueue_mask(VirtIODevice *dev, int queue, int idx, bool mask); /** * cryptodev_vhost_virtqueue_pending: * @dev: the virtio crypto object * @queue: the cryptodev backend queue index * @idx: the virtqueue index * * Test and clear event pending status for @idx virtqueue on @dev device. * Should be called after unmask to avoid losing events. * * Returns: true for success, false for errors */ bool cryptodev_vhost_virtqueue_pending(VirtIODevice *dev, int queue, int idx); #endif /* CRYPTODEV_VHOST_H */