4 #include "ioport.h" // inl
6 /* A 32-bit r/o bitmask of the features supported by the host */
7 #define VIRTIO_PCI_HOST_FEATURES 0
9 /* A 32-bit r/w bitmask of features activated by the guest */
10 #define VIRTIO_PCI_GUEST_FEATURES 4
12 /* A 32-bit r/w PFN for the currently selected queue */
13 #define VIRTIO_PCI_QUEUE_PFN 8
15 /* A 16-bit r/o queue size for the currently selected queue */
16 #define VIRTIO_PCI_QUEUE_NUM 12
18 /* A 16-bit r/w queue selector */
19 #define VIRTIO_PCI_QUEUE_SEL 14
21 /* A 16-bit r/w queue notifier */
22 #define VIRTIO_PCI_QUEUE_NOTIFY 16
24 /* An 8-bit device status register. */
25 #define VIRTIO_PCI_STATUS 18
27 /* An 8-bit r/o interrupt status register. Reading the value will return the
28 * current contents of the ISR and will also clear it. This is effectively
29 * a read-and-acknowledge. */
30 #define VIRTIO_PCI_ISR 19
32 /* The bit of the ISR which indicates a device configuration change. */
33 #define VIRTIO_PCI_ISR_CONFIG 0x2
35 /* The remaining space is defined by each driver as the per-driver
36 * configuration space */
37 #define VIRTIO_PCI_CONFIG 20
39 /* Virtio ABI version, this must match exactly */
40 #define VIRTIO_PCI_ABI_VERSION 0
42 static inline u32 vp_get_features(unsigned int ioaddr)
44 return inl(ioaddr + VIRTIO_PCI_HOST_FEATURES);
47 static inline void vp_set_features(unsigned int ioaddr, u32 features)
49 outl(features, ioaddr + VIRTIO_PCI_GUEST_FEATURES);
52 static inline void vp_get(unsigned int ioaddr, unsigned offset,
53 void *buf, unsigned len)
58 for (i = 0; i < len; i++)
59 ptr[i] = inb(ioaddr + VIRTIO_PCI_CONFIG + offset + i);
62 static inline u8 vp_get_status(unsigned int ioaddr)
64 return inb(ioaddr + VIRTIO_PCI_STATUS);
67 static inline void vp_set_status(unsigned int ioaddr, u8 status)
69 if (status == 0) /* reset */
71 outb(status, ioaddr + VIRTIO_PCI_STATUS);
74 static inline u8 vp_get_isr(unsigned int ioaddr)
76 return inb(ioaddr + VIRTIO_PCI_ISR);
79 static inline void vp_reset(unsigned int ioaddr)
81 outb(0, ioaddr + VIRTIO_PCI_STATUS);
82 (void)inb(ioaddr + VIRTIO_PCI_ISR);
85 static inline void vp_notify(unsigned int ioaddr, int queue_index)
87 outw(queue_index, ioaddr + VIRTIO_PCI_QUEUE_NOTIFY);
90 static inline void vp_del_vq(unsigned int ioaddr, int queue_index)
92 /* select the queue */
94 outw(queue_index, ioaddr + VIRTIO_PCI_QUEUE_SEL);
96 /* deactivate the queue */
98 outl(0, ioaddr + VIRTIO_PCI_QUEUE_PFN);
101 struct vring_virtqueue;
102 int vp_find_vq(unsigned int ioaddr, int queue_index,
103 struct vring_virtqueue *vq);
104 #endif /* _VIRTIO_PCI_H_ */