aboutsummaryrefslogtreecommitdiffstats
path: root/src/hw/virtio-pci.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/hw/virtio-pci.h')
-rw-r--r--src/hw/virtio-pci.h46
1 files changed, 27 insertions, 19 deletions
diff --git a/src/hw/virtio-pci.h b/src/hw/virtio-pci.h
index bc04b039..c1caf67e 100644
--- a/src/hw/virtio-pci.h
+++ b/src/hw/virtio-pci.h
@@ -2,6 +2,7 @@
#define _VIRTIO_PCI_H
#include "x86.h" // inl
+#include "biosvar.h" // GET_LOWFLAT
/* A 32-bit r/o bitmask of the features supported by the host */
#define VIRTIO_PCI_HOST_FEATURES 0
@@ -39,19 +40,24 @@
/* Virtio ABI version, this must match exactly */
#define VIRTIO_PCI_ABI_VERSION 0
-static inline u32 vp_get_features(unsigned int ioaddr)
+struct vp_device {
+ unsigned int ioaddr;
+};
+
+static inline u32 vp_get_features(struct vp_device *vp)
{
- return inl(ioaddr + VIRTIO_PCI_HOST_FEATURES);
+ return inl(GET_LOWFLAT(vp->ioaddr) + VIRTIO_PCI_HOST_FEATURES);
}
-static inline void vp_set_features(unsigned int ioaddr, u32 features)
+static inline void vp_set_features(struct vp_device *vp, u32 features)
{
- outl(features, ioaddr + VIRTIO_PCI_GUEST_FEATURES);
+ outl(features, GET_LOWFLAT(vp->ioaddr) + VIRTIO_PCI_GUEST_FEATURES);
}
-static inline void vp_get(unsigned int ioaddr, unsigned offset,
+static inline void vp_get(struct vp_device *vp, unsigned offset,
void *buf, unsigned len)
{
+ int ioaddr = GET_LOWFLAT(vp->ioaddr);
u8 *ptr = buf;
unsigned i;
@@ -59,47 +65,49 @@ static inline void vp_get(unsigned int ioaddr, unsigned offset,
ptr[i] = inb(ioaddr + VIRTIO_PCI_CONFIG + offset + i);
}
-static inline u8 vp_get_status(unsigned int ioaddr)
+static inline u8 vp_get_status(struct vp_device *vp)
{
- return inb(ioaddr + VIRTIO_PCI_STATUS);
+ return inb(GET_LOWFLAT(vp->ioaddr) + VIRTIO_PCI_STATUS);
}
-static inline void vp_set_status(unsigned int ioaddr, u8 status)
+static inline void vp_set_status(struct vp_device *vp, u8 status)
{
if (status == 0) /* reset */
return;
- outb(status, ioaddr + VIRTIO_PCI_STATUS);
+ outb(status, GET_LOWFLAT(vp->ioaddr) + VIRTIO_PCI_STATUS);
}
-static inline u8 vp_get_isr(unsigned int ioaddr)
+static inline u8 vp_get_isr(struct vp_device *vp)
{
- return inb(ioaddr + VIRTIO_PCI_ISR);
+ return inb(GET_LOWFLAT(vp->ioaddr) + VIRTIO_PCI_ISR);
}
-static inline void vp_reset(unsigned int ioaddr)
+static inline void vp_reset(struct vp_device *vp)
{
+ int ioaddr = GET_LOWFLAT(vp->ioaddr);
+
outb(0, ioaddr + VIRTIO_PCI_STATUS);
(void)inb(ioaddr + VIRTIO_PCI_ISR);
}
-static inline void vp_notify(unsigned int ioaddr, int queue_index)
+static inline void vp_notify(struct vp_device *vp, int queue_index)
{
- outw(queue_index, ioaddr + VIRTIO_PCI_QUEUE_NOTIFY);
+ outw(queue_index, GET_LOWFLAT(vp->ioaddr) + VIRTIO_PCI_QUEUE_NOTIFY);
}
-static inline void vp_del_vq(unsigned int ioaddr, int queue_index)
+static inline void vp_del_vq(struct vp_device *vp, int queue_index)
{
- /* select the queue */
+ int ioaddr = GET_LOWFLAT(vp->ioaddr);
+ /* select the queue */
outw(queue_index, ioaddr + VIRTIO_PCI_QUEUE_SEL);
/* deactivate the queue */
-
outl(0, ioaddr + VIRTIO_PCI_QUEUE_PFN);
}
struct vring_virtqueue;
-u16 vp_init_simple(u16 bdf);
-int vp_find_vq(unsigned int ioaddr, int queue_index,
+void vp_init_simple(struct vp_device *vp, u16 bdf);
+int vp_find_vq(struct vp_device *vp, int queue_index,
struct vring_virtqueue **p_vq);
#endif /* _VIRTIO_PCI_H_ */