[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [UNIKRAFT PATCH RFCv4 03/35] plat/virtio: Support virtio_cread/cwrite on arm64
Add virtio_cread/cwrite on arm64 with. Also add iowmb/iormb Signed-off-by: Jia He <justin.he@xxxxxxx> --- plat/drivers/include/virtio/virtio_config.h | 63 ++++++++++++++++++++- 1 file changed, 62 insertions(+), 1 deletion(-) diff --git a/plat/drivers/include/virtio/virtio_config.h b/plat/drivers/include/virtio/virtio_config.h index 1221bbc..b80f26a 100644 --- a/plat/drivers/include/virtio/virtio_config.h +++ b/plat/drivers/include/virtio/virtio_config.h @@ -54,6 +54,9 @@ extern "C" { #define VIRTIO_TRANSPORT_F_START 28 #define VIRTIO_TRANSPORT_F_END 32 +/* v1.0 compliant. */ +#define VIRTIO_F_VERSION_1 32 + #ifdef __X86_64__ static inline void _virtio_cwrite_bytes(const void *addr, const __u8 offset, const void *buf, int len, int type_len) @@ -110,7 +113,65 @@ static inline void _virtio_cread_bytes(const void *addr, const __u8 offset, } } #else /* __X86_64__ */ -#error "Virtio driver not supported for this architecture" + +/* IO barriers */ +#define __iormb() rmb() +#define __iowmb() wmb() + +static inline void _virtio_cwrite_bytes(const void *addr, const __u8 offset, + const void *buf, int len, int type_len) +{ + int i = 0; + void *io_addr; + int count; + + count = len / type_len; + for (i = 0; i < count; i++) { + io_addr = (void *)addr + offset + (i * type_len); + __iowmb(); + switch (type_len) { + case 1: + ioreg_write8(io_addr, ((__u8 *)buf)[i * type_len]); + break; + case 2: + ioreg_write16(io_addr, ((__u16 *)buf)[i * type_len]); + break; + case 4: + ioreg_write32(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; + void *io_addr; + int count; + + count = len / type_len; + for (i = 0; i < count; i++) { + io_addr = (void *)addr + offset + (i * type_len); + switch (type_len) { + case 1: + ((__u8 *)buf)[i * type_len] = ioreg_read8(io_addr); + break; + case 2: + ((__u16 *)buf)[i * type_len] = ioreg_read16(io_addr); + break; + case 4: + ((__u32 *)buf)[i * type_len] = ioreg_read32(io_addr); + break; + default: + UK_CRASH("Unsupported virtio read operation\n"); + } + __iormb(); + } +} + #endif /* __X86_64__ */ /** -- 2.17.1
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |