1*43402ba5SAndrew Jones #ifndef _VIRTIO_H_ 2*43402ba5SAndrew Jones #define _VIRTIO_H_ 3*43402ba5SAndrew Jones /* 4*43402ba5SAndrew Jones * A minimal implementation of virtio. 5*43402ba5SAndrew Jones * Structures adapted from the Linux Kernel. 6*43402ba5SAndrew Jones * 7*43402ba5SAndrew Jones * Copyright (C) 2014, Red Hat Inc, Andrew Jones <drjones@redhat.com> 8*43402ba5SAndrew Jones * 9*43402ba5SAndrew Jones * This work is licensed under the terms of the GNU LGPL, version 2. 10*43402ba5SAndrew Jones */ 11*43402ba5SAndrew Jones #include "libcflat.h" 12*43402ba5SAndrew Jones 13*43402ba5SAndrew Jones struct virtio_device_id { 14*43402ba5SAndrew Jones u32 device; 15*43402ba5SAndrew Jones u32 vendor; 16*43402ba5SAndrew Jones }; 17*43402ba5SAndrew Jones 18*43402ba5SAndrew Jones struct virtio_device { 19*43402ba5SAndrew Jones struct virtio_device_id id; 20*43402ba5SAndrew Jones const struct virtio_config_ops *config; 21*43402ba5SAndrew Jones }; 22*43402ba5SAndrew Jones 23*43402ba5SAndrew Jones struct virtio_config_ops { 24*43402ba5SAndrew Jones void (*get)(struct virtio_device *vdev, unsigned offset, 25*43402ba5SAndrew Jones void *buf, unsigned len); 26*43402ba5SAndrew Jones void (*set)(struct virtio_device *vdev, unsigned offset, 27*43402ba5SAndrew Jones const void *buf, unsigned len); 28*43402ba5SAndrew Jones }; 29*43402ba5SAndrew Jones 30*43402ba5SAndrew Jones static inline u8 31*43402ba5SAndrew Jones virtio_config_readb(struct virtio_device *vdev, unsigned offset) 32*43402ba5SAndrew Jones { 33*43402ba5SAndrew Jones u8 val; 34*43402ba5SAndrew Jones vdev->config->get(vdev, offset, &val, 1); 35*43402ba5SAndrew Jones return val; 36*43402ba5SAndrew Jones } 37*43402ba5SAndrew Jones 38*43402ba5SAndrew Jones static inline u16 39*43402ba5SAndrew Jones virtio_config_readw(struct virtio_device *vdev, unsigned offset) 40*43402ba5SAndrew Jones { 41*43402ba5SAndrew Jones u16 val; 42*43402ba5SAndrew Jones vdev->config->get(vdev, offset, &val, 2); 43*43402ba5SAndrew Jones return val; 44*43402ba5SAndrew Jones } 45*43402ba5SAndrew Jones 46*43402ba5SAndrew Jones static inline u32 47*43402ba5SAndrew Jones virtio_config_readl(struct virtio_device *vdev, unsigned offset) 48*43402ba5SAndrew Jones { 49*43402ba5SAndrew Jones u32 val; 50*43402ba5SAndrew Jones vdev->config->get(vdev, offset, &val, 4); 51*43402ba5SAndrew Jones return val; 52*43402ba5SAndrew Jones } 53*43402ba5SAndrew Jones 54*43402ba5SAndrew Jones static inline void 55*43402ba5SAndrew Jones virtio_config_writeb(struct virtio_device *vdev, unsigned offset, u8 val) 56*43402ba5SAndrew Jones { 57*43402ba5SAndrew Jones vdev->config->set(vdev, offset, &val, 1); 58*43402ba5SAndrew Jones } 59*43402ba5SAndrew Jones 60*43402ba5SAndrew Jones static inline void 61*43402ba5SAndrew Jones virtio_config_writew(struct virtio_device *vdev, unsigned offset, u16 val) 62*43402ba5SAndrew Jones { 63*43402ba5SAndrew Jones vdev->config->set(vdev, offset, &val, 2); 64*43402ba5SAndrew Jones } 65*43402ba5SAndrew Jones 66*43402ba5SAndrew Jones static inline void 67*43402ba5SAndrew Jones virtio_config_writel(struct virtio_device *vdev, unsigned offset, u32 val) 68*43402ba5SAndrew Jones { 69*43402ba5SAndrew Jones vdev->config->set(vdev, offset, &val, 4); 70*43402ba5SAndrew Jones } 71*43402ba5SAndrew Jones 72*43402ba5SAndrew Jones extern struct virtio_device *virtio_bind(u32 devid); 73*43402ba5SAndrew Jones 74*43402ba5SAndrew Jones #endif /* _VIRTIO_H_ */ 75