[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [UNIKRAFT PATCH RFC 4/7] plat/virtio: Support virtio_cread/cwrite on arm64
Add virtio_cread/cwrite on arm64 with. Also add iowmb/iormb Jira: ENTOS-672 Change-Id: I9f20798c91708de07b9af477508a988ff321b2e2 Signed-off-by: Jia He <justin.he@xxxxxxx> --- plat/drivers/include/virtio/virtio_config.h | 64 +++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/plat/drivers/include/virtio/virtio_config.h b/plat/drivers/include/virtio/virtio_config.h index 1c4e7ef..7fb9cb3 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) @@ -109,6 +112,67 @@ static inline void _virtio_cread_bytes(const void *addr, const __u8 offset, } } } + +#elif defined(__ARM_64__) + +/* 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 *)((__u64)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 *)((__u64)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(); + } +} + #else /* __X86_64__ */ #error "Virtio driver not supported for this architecture" #endif /* __X86_64__ */ -- 2.17.1 _______________________________________________ Minios-devel mailing list Minios-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/minios-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |