[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [UNIKRAFT PATCH v2 2/7] plat/common: Introduce virtio standard header
We introduce the standard virtio header files. * virtio_ids: List the ids of the virtio devices * virtio_ring.h: Describes the virtio ring descriptor, used and available descriptors. * virtio_pci.h: Describes the virtio PCI device register map. * virtio_types.h: Describes the type of the data structure. * virtio_config.h: Provides helper function to perform IO operation on the device. Signed-off-by: Sharan Santhanam <sharan.santhanam@xxxxxxxxx> Reviewed-by: Simon Kuenzer <simon.kuenzer@xxxxxxxxx> --- plat/common/include/pci/virtio/virtio_pci.h | 66 ------- plat/drivers/include/virtio/virtio_config.h | 259 ++++++++++++++++++++++++++++ plat/drivers/include/virtio/virtio_ids.h | 64 +++++++ plat/drivers/include/virtio/virtio_pci.h | 74 ++++++++ plat/drivers/include/virtio/virtio_ring.h | 196 +++++++++++++++++++++ plat/drivers/include/virtio/virtio_types.h | 62 +++++++ 6 files changed, 655 insertions(+), 66 deletions(-) delete mode 100644 plat/common/include/pci/virtio/virtio_pci.h create mode 100644 plat/drivers/include/virtio/virtio_config.h create mode 100644 plat/drivers/include/virtio/virtio_ids.h create mode 100644 plat/drivers/include/virtio/virtio_pci.h create mode 100644 plat/drivers/include/virtio/virtio_ring.h create mode 100644 plat/drivers/include/virtio/virtio_types.h diff --git a/plat/common/include/pci/virtio/virtio_pci.h b/plat/common/include/pci/virtio/virtio_pci.h deleted file mode 100644 index 6f9a6e1..0000000 --- a/plat/common/include/pci/virtio/virtio_pci.h +++ /dev/null @@ -1,66 +0,0 @@ -/* SPDX-License-Identifier: ISC */ -/* - * Authors: Dan Williams - * Costin Lupu <costin.lupu@xxxxxxxxx> - * - * Copyright (c) 2015, IBM - * Copyright (c) 2018, NEC Europe Ltd., NEC Corporation - * - * Permission to use, copy, modify, and/or distribute this software - * for any purpose with or without fee is hereby granted, provided - * that the above copyright notice and this permission notice appear - * in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL - * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE - * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR - * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS - * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, - * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ -/* Taken and adapted from solo5 virtio_pci.h */ - -#ifndef __PLAT_CMN_PCI_VIRTIO_PCI_H__ -#define __PLAT_CMN_PCI_VIRTIO_PCI_H__ - -/* virtio config space layout */ -/* TODO we currently support only the legacy interface */ -#define VIRTIO_PCI_HOST_FEATURES 0 /* 32-bit r/o */ -#define VIRTIO_PCI_GUEST_FEATURES 4 /* 32-bit r/w */ -#define VIRTIO_PCI_QUEUE_PFN 8 /* 32-bit r/w */ -#define VIRTIO_PCI_QUEUE_SIZE 12 /* 16-bit r/o */ -#define VIRTIO_PCI_QUEUE_SEL 14 /* 16-bit r/w */ -#define VIRTIO_PCI_QUEUE_NOTIFY 16 /* 16-bit r/w */ - -/* - * Shift size used for writing physical queue address to QUEUE_PFN - */ -#define VIRTIO_PCI_QUEUE_ADDR_SHIFT 12 - - -/* - * The status register lets us tell the device where we are in - * initialization - */ -#define VIRTIO_PCI_STATUS 18 /* 8-bit r/w */ -#define VIRTIO_PCI_STATUS_ACK 0x1 /* we recognize device as virtio */ -#define VIRTIO_PCI_STATUS_DRIVER 0x2 /* we want to drive it */ -#define VIRTIO_PCI_STATUS_DRIVER_OK 0x4 /* initialization is complete */ -#define VIRTIO_PCI_STATUS_DEVICE_RESET 0x40 /* device needs reset */ -#define VIRTIO_PCI_STATUS_FAIL 0x80 /* tell device something's wrong */ - -/* - * Reading the value will return the current contents of the interrupt - * status register and will also clear it. This is effectively a - * read-and-acknowledge. - */ -#define VIRTIO_PCI_ISR 19 /* 8-bit r/o */ -#define VIRTIO_PCI_ISR_HAS_INTR 0x1 /* interrupt is for this device */ -#define VIRTIO_PCI_ISR_CONFIG 0x2 /* config change bit */ - -/* TODO Revisit when adding MSI support. */ -#define VIRTIO_PCI_CONFIG_OFF 20 - -#endif /* __PLAT_CMN_PCI_VIRTIO_PCI_H__ */ diff --git a/plat/drivers/include/virtio/virtio_config.h b/plat/drivers/include/virtio/virtio_config.h new file mode 100644 index 0000000..1c4e7ef --- /dev/null +++ b/plat/drivers/include/virtio/virtio_config.h @@ -0,0 +1,259 @@ +/* SPDX-License-Identifier: BSD-3-Clause */ +/* + * Authors: Sharan Santhanam <sharan.santhanam@xxxxxxxxx> + * + * Copyright (c) 2018, NEC Europe Ltd., NEC Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * 3. Neither the name of the copyright holder 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 HOLDER 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. + * + * THIS HEADER MAY NOT BE EXTRACTED OR MODIFIED IN ANY WAY. + */ + +#ifndef __PLAT_DRV_VIRTIO_CONFIG_H +#define __PLAT_DRV_VIRTIO_CONFIG_H + +#include <uk/arch/types.h> +#include <cpu.h> + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus __ */ + +#define MAX_TRY_COUNT (10) + +#define VIRTIO_CONFIG_STATUS_RESET 0x0 /* Reset the device */ +#define VIRTIO_CONFIG_STATUS_ACK 0x1 /* recognize device as virtio */ +#define VIRTIO_CONFIG_STATUS_DRIVER 0x2 /* driver for the device found*/ +#define VIRTIO_CONFIG_STATUS_DRIVER_OK 0x4 /* initialization is complete */ +#define VIRTIO_CONFIG_STATUS_NEEDS_RESET 0x40 /* device needs reset */ +#define VIRTIO_CONFIG_STATUS_FAIL 0x80 /* device something's wrong*/ + +#define VIRTIO_TRANSPORT_F_START 28 +#define VIRTIO_TRANSPORT_F_END 32 + +#ifdef __X86_64__ +static inline void _virtio_cwrite_bytes(const void *addr, const __u8 offset, + const void *buf, int len, int type_len) +{ + int i = 0; + __u16 io_addr; + int count; + + count = len / type_len; + for (i = 0; i < count; i++) { + io_addr = ((unsigned long)addr) + offset + (i * type_len); + switch (type_len) { + case 1: + outb(io_addr, ((__u8 *)buf)[i * type_len]); + break; + case 2: + outw(io_addr, ((__u16 *)buf)[i * type_len]); + break; + case 4: + outl(io_addr, ((__u32 *)buf)[i * type_len]); + break; + default: + UK_CRASH("Unsupported virtio write operation\n"); + } + } +} + +static inline void _virtio_cread_bytes(const void *addr, const __u8 offset, + void *buf, int len, int type_len) +{ + int i = 0; + __u16 io_addr; + int count; + + count = len / type_len; + for (i = 0; i < count; i++) { + io_addr = ((unsigned long)addr) + offset + (i * type_len); + switch (type_len) { + case 1: + ((__u8 *)buf)[i * type_len] = inb(io_addr); + break; + case 2: + ((__u16 *)buf)[i * type_len] = inw(io_addr); + break; + case 4: + ((__u32 *)buf)[i * type_len] = inl(io_addr); + break; + case 8: + ((__u64 *)buf)[i * type_len] = inq(io_addr); + break; + default: + UK_CRASH("Unsupported virtio read operation\n"); + } + } +} +#else /* __X86_64__ */ +#error "Virtio driver not supported for this architecture" +#endif /* __X86_64__ */ + +/** + * Read the virtio device configuration of specified length. + * + * @param addr + * The base address of the device. + * @param offset + * The offset with the device address space. + * @param buf + * The destination buffer to which the value has to be copied. + * @param len + * The length of the destination buffer. + */ +static inline int virtio_cread_bytes_many(const void *addr, const __u8 offset, + __u8 *buf, __u32 len) +{ + __u8 old_buf[len]; + int check = -1; + int cnt = 0; + __u32 i = 0; + + do { + check = len; + _virtio_cread_bytes(addr, offset, &old_buf[0], len, 1); + _virtio_cread_bytes(addr, offset, buf, len, 1); + + for (i = 0; i < len; i++) { + if (unlikely(buf[i] != old_buf[i])) { + check = -1; /* Need to retry configuration */ + break; + } + } + cnt++; + } while (check == -1 && cnt < MAX_TRY_COUNT); + + return check; +} + +/** + * Read the single byte configuration. + * + * @param addr + * The base address of the device. + * @param offset + * The offset with the device address space. + * @return __u8 + * Returns the value configuration register. + */ +static inline __u8 virtio_cread8(const void *addr, const __u8 offset) +{ + __u8 buf = 0; + + _virtio_cread_bytes(addr, offset, &buf, sizeof(buf), sizeof(buf)); + return buf; +} + +/** + * Read the single word configuration. + * + * @param addr + * The base address of the device. + * @param offset + * The offset with the device address space. + * @return __u16 + * Returns the value configuration register. + */ +static inline __u16 virtio_cread16(const void *addr, const __u8 offset) +{ + __u16 buf = 0; + + _virtio_cread_bytes(addr, offset, &buf, sizeof(buf), sizeof(buf)); + return buf; +} + +/** + * Read the single long word configuration. + * + * @param addr + * The base address of the device. + * @param offset + * The offset with the device address space. + * @return __u32 + * Returns the value configuration register. + */ +static inline __u32 virtio_cread32(const void *addr, const __u8 offset) +{ + __u32 buf = 0; + + _virtio_cread_bytes(addr, offset, &buf, sizeof(buf), sizeof(buf)); + return buf; +} + +/** + * Write the configuration. + * + * @param addr + * The base address of the device. + * @param offset + * The offset with the device address space. + * @param data + * The value to write to the configuration. + */ +static inline void virtio_cwrite8(const void *addr, const __u8 offset, + const __u8 data) +{ + _virtio_cwrite_bytes(addr, offset, &data, sizeof(data), sizeof(data)); +} + +/** + * Write the configuration. + * + * @param addr + * The base address of the device. + * @param offset + * The offset with the device address space. + * @param data + * The value to write to the configuration. + */ +static inline void virtio_cwrite16(const void *addr, const __u8 offset, + const __u16 data) +{ + _virtio_cwrite_bytes(addr, offset, &data, sizeof(data), sizeof(data)); +} + +/** + * Write the configuration. + * + * @param addr + * The base address of the device. + * @param offset + * The offset with the device address space. + * @param data + * The value to write to the configuration. + */ +static inline void virtio_cwrite32(const void *addr, const __u8 offset, + const __u32 data) +{ + _virtio_cwrite_bytes(addr, offset, &data, sizeof(data), sizeof(data)); +} + +#ifdef __cplusplus +} +#endif /* __cplusplus __ */ + +#endif /* __PLAT_DRV_VIRTIO_CONFIG_H */ diff --git a/plat/drivers/include/virtio/virtio_ids.h b/plat/drivers/include/virtio/virtio_ids.h new file mode 100644 index 0000000..c70de23 --- /dev/null +++ b/plat/drivers/include/virtio/virtio_ids.h @@ -0,0 +1,64 @@ +/* SPDX-License-Identifier: BSD-3-Clause */ +/** + * Virtio IDs + * + * This header is BSD licensed so anyone can use the definitions to implement + * compatible drivers/servers. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * 3. Neither the name of IBM 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 IBM 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. + */ +/** + * Taken and modified from Linux Kernel. + * include/uapi/linux/virtio_ids.h + * + * Commit-id:dbaf0624ffa5 + */ +#ifndef __PLAT_DRV_VIRTIO_IDS_H +#define __PLAT_DRV_VIRTIO_IDS_H + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus __ */ + +#define VIRTIO_ID_INVALID 0 /* Invalid device (Reserved) */ +#define VIRTIO_ID_NET 1 /* virtio net */ +#define VIRTIO_ID_BLOCK 2 /* virtio block */ +#define VIRTIO_ID_CONSOLE 3 /* virtio console */ +#define VIRTIO_ID_RNG 4 /* virtio rng */ +#define VIRTIO_ID_BALLOON 5 /* virtio balloon */ +#define VIRTIO_ID_RPMSG 7 /* virtio remote processor messaging */ +#define VIRTIO_ID_SCSI 8 /* virtio scsi */ +#define VIRTIO_ID_9P 9 /* 9p virtio console */ +#define VIRTIO_ID_RPROC_SERIAL 11 /* virtio remoteproc serial link */ +#define VIRTIO_ID_CAIF 12 /* Virtio caif */ +#define VIRTIO_ID_GPU 16 /* virtio GPU */ +#define VIRTIO_ID_INPUT 18 /* virtio input */ +#define VIRTIO_ID_VSOCK 19 /* virtio vsock transport */ +#define VIRTIO_ID_CRYPTO 20 /* virtio crypto */ + +#ifdef __cplusplus +} +#endif /* __cplusplus __ */ + +#endif /* __PLAT_DRV_VIRTIO_IDS_H */ diff --git a/plat/drivers/include/virtio/virtio_pci.h b/plat/drivers/include/virtio/virtio_pci.h new file mode 100644 index 0000000..d843914 --- /dev/null +++ b/plat/drivers/include/virtio/virtio_pci.h @@ -0,0 +1,74 @@ +/* SPDX-License-Identifier: ISC */ +/* + * Authors: Dan Williams + * Costin Lupu <costin.lupu@xxxxxxxxx> + * Sharan Santhanam <sharan.santhanam@xxxxxxxxx> + * + * Copyright (c) 2015, IBM + * Copyright (c) 2018, NEC Europe Ltd., NEC Corporation + * + * Permission to use, copy, modify, and/or distribute this software + * for any purpose with or without fee is hereby granted, provided + * that the above copyright notice and this permission notice appear + * in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL + * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE + * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS + * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, + * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ +/** + * Taken and adapted from solo5 virtio_pci.h + * kernel/virtio/virtio_pci.h + * Commit-id: 6e0e12133aa7 + */ + +#ifndef __PLAT_DRV_VIRTIO_PCI_H__ +#define __PLAT_DRV_VIRTIO_PCI_H__ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus __ */ + +/* virtio config space layout */ +/* TODO we currently support only the legacy interface */ +#define VIRTIO_PCI_HOST_FEATURES 0 /* 32-bit r/o */ +#define VIRTIO_PCI_GUEST_FEATURES 4 /* 32-bit r/w */ +#define VIRTIO_PCI_QUEUE_PFN 8 /* 32-bit r/w */ +#define VIRTIO_PCI_QUEUE_SIZE 12 /* 16-bit r/o */ +#define VIRTIO_PCI_QUEUE_SEL 14 /* 16-bit r/w */ +#define VIRTIO_PCI_QUEUE_NOTIFY 16 /* 16-bit r/w */ + +/* + * Shift size used for writing physical queue address to QUEUE_PFN + */ +#define VIRTIO_PCI_QUEUE_ADDR_SHIFT 12 + +/* + * The status register lets us tell the device where we are in + * initialization + */ +#define VIRTIO_PCI_STATUS 18 /* 8-bit r/w */ + +/* + * Reading the value will return the current contents of the interrupt + * status register and will also clear it. This is effectively a + * read-and-acknowledge. + */ +#define VIRTIO_PCI_ISR 19 /* 8-bit r/o */ +#define VIRTIO_PCI_ISR_HAS_INTR 0x1 /* interrupt is for this device */ +#define VIRTIO_PCI_ISR_CONFIG 0x2 /* config change bit */ + +/* TODO Revisit when adding MSI support. */ +#define VIRTIO_PCI_CONFIG_OFF 20 +#define VIRTIO_PCI_VRING_ALIGN 4096 + +#ifdef __cplusplus +} +#endif /* __cplusplus __ */ + +#endif /* __PLAT_DRV_VIRTIO_PCI_H__ */ diff --git a/plat/drivers/include/virtio/virtio_ring.h b/plat/drivers/include/virtio/virtio_ring.h new file mode 100644 index 0000000..9f65594 --- /dev/null +++ b/plat/drivers/include/virtio/virtio_ring.h @@ -0,0 +1,196 @@ +/* SPDX-License-Identifier: BSD-3-Clause */ +/* An interface for efficient virtio implementation, currently for use by KVM, + * but hopefully others soon. Do NOT change this since it will + * break existing servers and clients. + * + * This header is BSD licensed so anyone can use the definitions to implement + * compatible drivers/servers. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * 3. Neither the name of IBM 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 IBM 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. + * + * Copyright Rusty Russell IBM Corporation 2007. */ +/** + * Taken and modified from Linux. + * include/uapi/linux/virtio_ring.h + * + * Commit id: ecda85e70277 + */ + +#ifndef __PLAT_DRV_VIRTIO_RING_H__ +#define __PLAT_DRV_VIRTIO_RING_H__ + +#include <uk/arch/limits.h> +#include <virtio/virtio_types.h> + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus __ */ + +#if __BYTE_ORDER__ != __ORDER_LITTLE_ENDIAN__ +#error "Please define conversion functions from host to little endian!" +#endif + +/* This marks a buffer as continuing via the next field. */ +#define VRING_DESC_F_NEXT 1 +/* This marks a buffer as write-only (otherwise read-only). */ +#define VRING_DESC_F_WRITE 2 +/* This means the buffer contains a list of buffer descriptors. */ +#define VRING_DESC_F_INDIRECT 4 + +/* + * The device uses this in used->flags to advise the driver: + * don't kick me when you add a buffer. It's unreliable, so + * it's simply an optimization. + */ +#define VRING_USED_F_NO_NOTIFY 1 + +/* + * The driver uses this in avail->flags to advise the device: + * don't interrupt me when you consume a buffer. It's unreliable, so + * it's simply an optimization. + */ +#define VRING_AVAIL_F_NO_INTERRUPT 1 + +/* Support for indirect descriptors */ +#define VIRTIO_F_INDIRECT_DESC 28 + +/* Support for avail_event and used_event fields */ +#define VIRTIO_F_EVENT_IDX 29 + +/* Arbitrary descriptor layouts. */ +#define VIRTIO_F_ANY_LAYOUT 27 + +/** + * Virtqueue descriptors: 16 bytes. + * These can chain together via "next". + */ +struct vring_desc { + /* Address (guest-physical). */ + __virtio_le64 addr; + /* Length. */ + __virtio_le32 len; + /* The flags as indicated above. */ + __virtio_le16 flags; + /* We chain unused descriptors via this, too */ + __virtio_le16 next; +}; + +struct vring_avail { + __virtio_le16 flags; + __virtio_le16 idx; + __virtio_le16 ring[]; + /* Only if VIRTIO_F_EVENT_IDX: __virtio_le16 used_event; */ +}; + +/* __virtio_le32 is used here for ids for padding reasons. */ +struct vring_used_elem { + /* Index of start of used descriptor chain. */ + __virtio_le32 id; + /* Total length of the descriptor chain which was written to. */ + __virtio_le32 len; +}; + +struct vring_used { + __virtio_le16 flags; + __virtio_le16 idx; + struct vring_used_elem ring[]; + /* Only if VIRTIO_F_EVENT_IDX: __virtio_le16 avail_event; */ +}; + +struct vring { + unsigned int num; + + struct vring_desc *desc; + struct vring_avail *avail; + struct vring_used *used; +}; + +/* The standard layout for the ring is a continuous chunk of memory which + * looks like this. We assume num is a power of 2. + * + * struct vring { + * // The actual descriptors (16 bytes each) + * struct vring_desc desc[num]; + * + * // A ring of available descriptor heads with free-running index. + * __virtio_le16 avail_flags; + * __virtio_le16 avail_idx; + * __virtio_le16 available[num]; + * __virtio_le16 used_event_idx; + * + * // Padding to the next align boundary. + * char pad[]; + * + * // A ring of used descriptor heads with free-running index. + * __virtio_le16 used_flags; + * __virtio_le16 used_idx; + * struct vring_used_elem used[num]; + * __virtio_le16 avail_event_idx; + * }; + * + * NOTE: for VirtIO PCI, align is 4096. + */ + +/** + * We publish the used event index at the end of the available ring, and vice + * versa. They are at the end for backwards compatibility. + */ +#define vring_used_event(vr) ((vr)->avail->ring[(vr)->num]) +#define vring_avail_event(vr) (*(__virtio16 *)&(vr)->used->ring[(vr)->num]) + +static inline void vring_init(struct vring *vr, unsigned int num, uint8_t *p, + unsigned long align) +{ + vr->num = num; + vr->desc = (struct vring_desc *) p; + vr->avail = (struct vring_avail *) (p + + num * sizeof(struct vring_desc)); + vr->used = (void *) + (((unsigned long) &vr->avail->ring[num] + align - 1) & ~(align - 1)); +} + +static inline unsigned int vring_size(unsigned int num, unsigned long align) +{ + int size; + + size = num * sizeof(struct vring_desc); + size += sizeof(struct vring_avail) + (num * sizeof(uint16_t)) + + sizeof(uint16_t); + size = (size + align - 1) & ~(align - 1); + size += sizeof(struct vring_used) + + (num * sizeof(struct vring_used_elem)) + sizeof(uint16_t); + return size; +} + +static inline int vring_need_event(__u16 event_idx, __u16 new_idx, + __u16 old_idx) +{ + return (new_idx - event_idx - 1) < (new_idx - old_idx); +} + +#ifdef __cplusplus +} +#endif /* __cplusplus __ */ + +#endif /* __PLAT_DRV_VIRTIO_RING_H__ */ diff --git a/plat/drivers/include/virtio/virtio_types.h b/plat/drivers/include/virtio/virtio_types.h new file mode 100644 index 0000000..a804c2c --- /dev/null +++ b/plat/drivers/include/virtio/virtio_types.h @@ -0,0 +1,62 @@ +/* SPDX-License-Identifier: BSD-3-Clause */ +/* Type definitions for virtio implementations. + * + * This header is BSD licensed so anyone can use the definitions to implement + * compatible drivers/servers. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * 3. Neither the name of IBM 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 IBM 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. + * + * Copyright (C) 2014 Red Hat, Inc. + * Author: Michael S. Tsirkin <mst@xxxxxxxxxx> + * Sharan Santhanam <sharan.santhanam@xxxxxxxxx> + */ +/** + * Taken and modified from Linux Kernel. + * include/uapi/linux/virtio_types.h + * + * Commit-id: 9efeccacd3a4 + */ +#ifndef __PLAT_DRV_VIRTIO_TYPES_H +#define __PLAT_DRV_VIRTIO_TYPES_H + +#include <uk/arch/types.h> + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/** + * __virtio{16,32,64} have the following meaning: + * - __u{16,32,64} for virtio devices in legacy mode, accessed in native endian + * - __le{16,32,64} for standard-compliant virtio devices + */ +typedef __u16 __virtio_le16; +typedef __u32 __virtio_le32; +typedef __u64 __virtio_le64; + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __PLAT_DRV_VIRTIO_TYPES_H */ -- 2.7.4 _______________________________________________ Minios-devel mailing list Minios-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/minios-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |