/* * Remoteproc Virtio Framework * * Copyright(c) 2018 Xilinx Ltd. * Copyright(c) 2011 Texas Instruments, Inc. * Copyright(c) 2011 Google, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name Texas Instruments nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef REMOTEPROC_VIRTIO_H #define REMOTEPROC_VIRTIO_H #include #include #include #if defined __cplusplus extern "C" { #endif /* define vdev notification funciton user should implement */ typedef int (*rpvdev_notify_func)(void *priv, uint32_t id); /** * struct remoteproc_virtio * @priv pointer to private data * @notifyid notification id * @vdev_rsc address of vdev resource * @vdev_rsc_io metal I/O region of vdev_info, can be NULL * @notify notification function * @vdev virtio device * @node list node */ struct remoteproc_virtio { void *priv; uint32_t notify_id; void *vdev_rsc; struct metal_io_region *vdev_rsc_io; rpvdev_notify_func notify; struct virtio_device vdev; struct metal_list node; }; /** * rproc_virtio_create_vdev * * Create rproc virtio vdev * * @role: 0 - virtio master, 1 - virtio slave * @notifyid: virtio device notification id * @rsc: pointer to the virtio device resource * @rsc_io: pointer to the virtio device resource I/O region * @priv: pointer to the private data * @notify: vdev and virtqueue notification function * @rst_cb: reset virtio device callback * * return pointer to the created virtio device for success, * NULL for failure. */ struct virtio_device * rproc_virtio_create_vdev(unsigned int role, unsigned int notifyid, void *rsc, struct metal_io_region *rsc_io, void *priv, rpvdev_notify_func notify, virtio_dev_reset_cb rst_cb); /** * rproc_virtio_remove_vdev * * Create rproc virtio vdev * * @vdev - pointer to the virtio device */ void rproc_virtio_remove_vdev(struct virtio_device *vdev); /** * rproc_virtio_create_vring * * Create rproc virtio vring * * @vdev: pointer to the virtio device * @index: vring index in the virtio device * @notifyid: remoteproc vring notification id * @va: vring virtual address * @io: pointer to vring I/O region * @num_desc: number of descriptors * @align: vring alignment * * return 0 for success, negative value for failure. */ int rproc_virtio_init_vring(struct virtio_device *vdev, unsigned int index, unsigned int notifyid, void *va, struct metal_io_region *io, unsigned int num_descs, unsigned int align); /** * rproc_virtio_notified * * remoteproc virtio is got notified * * @vdev - pointer to the virtio device * @notifyid - notify id * * return 0 for successful, negative value for failure */ int rproc_virtio_notified(struct virtio_device *vdev, uint32_t notifyid); /** * rproc_virtio_wait_remote_ready * * Blocking function, waiting for the remote core is ready to start * communications. * * @vdev - pointer to the virtio device * * return true when remote processor is ready. */ void rproc_virtio_wait_remote_ready(struct virtio_device *vdev); #if defined __cplusplus } #endif #endif /* REMOTEPROC_VIRTIO_H */