diff options
author | Robert Morris <rtm@csail.mit.edu> | 2019-06-13 06:49:02 -0400 |
---|---|---|
committer | Robert Morris <rtm@csail.mit.edu> | 2019-06-13 06:49:02 -0400 |
commit | de9d72c9086ec935d5b2b889f50ff611135f80fa (patch) | |
tree | 071952e383057de705c59f9e7894f3154e4bbad2 /kernel/virtio.h | |
parent | 5753553213df8f9de851adb68377db43faecb91f (diff) | |
download | xv6-labs-de9d72c9086ec935d5b2b889f50ff611135f80fa.tar.gz xv6-labs-de9d72c9086ec935d5b2b889f50ff611135f80fa.tar.bz2 xv6-labs-de9d72c9086ec935d5b2b889f50ff611135f80fa.zip |
virtio disk driver
Diffstat (limited to 'kernel/virtio.h')
-rw-r--r-- | kernel/virtio.h | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/kernel/virtio.h b/kernel/virtio.h new file mode 100644 index 0000000..258d107 --- /dev/null +++ b/kernel/virtio.h @@ -0,0 +1,59 @@ +// +// virtio device definitions. +// for both the mmio interface, and virtio descriptors. +// only tested with qemu. +// this is the "legacy" virtio interface. +// + +// virtio mmio control registers, mapped starting at 0x10001000. +// from qemu virtio_mmio.h +#define VIRTIO_MMIO_MAGIC_VALUE 0x000 // 0x74726976 +#define VIRTIO_MMIO_VERSION 0x004 // 1 -- version, 1 is legacy +#define VIRTIO_MMIO_DEVICE_ID 0x008 // 2 -- block device type +#define VIRTIO_MMIO_VENDOR_ID 0x00c // 0x554d4551 +#define VIRTIO_MMIO_DEVICE_FEATURES 0x010 +#define VIRTIO_MMIO_DRIVER_FEATURES 0x020 +#define VIRTIO_MMIO_GUEST_PAGE_SIZE 0x028 // page size for PFN, write-only +#define VIRTIO_MMIO_QUEUE_SEL 0x030 // select queue, write-only +#define VIRTIO_MMIO_QUEUE_NUM_MAX 0x034 // max size of current queue, read-only +#define VIRTIO_MMIO_QUEUE_NUM 0x038 // size of current queue, write-only +#define VIRTIO_MMIO_QUEUE_ALIGN 0x03c // used ring alignment, write-only +#define VIRTIO_MMIO_QUEUE_PFN 0x040 // physical page number for queue, read/write +#define VIRTIO_MMIO_QUEUE_READY 0x044 // ready bit +#define VIRTIO_MMIO_QUEUE_NOTIFY 0x050 // write-only +#define VIRTIO_MMIO_INTERRUPT_STATUS 0x060 // read-only +#define VIRTIO_MMIO_INTERRUPT_ACK 0x064 // write-only +#define VIRTIO_MMIO_STATUS 0x070 // read/write + +// status register bits, from qemu virtio_config.h +#define VIRTIO_CONFIG_S_ACKNOWLEDGE 1 +#define VIRTIO_CONFIG_S_DRIVER 2 +#define VIRTIO_CONFIG_S_DRIVER_OK 4 +#define VIRTIO_CONFIG_S_FEATURES_OK 8 + +// device feature bits +#define VIRTIO_BLK_F_RO 5 /* Disk is read-only */ +#define VIRTIO_BLK_F_SCSI 7 /* Supports scsi command passthru */ +#define VIRTIO_BLK_F_CONFIG_WCE 11 /* Writeback mode available in config */ +#define VIRTIO_BLK_F_MQ 12 /* support more than one vq */ +#define VIRTIO_F_ANY_LAYOUT 27 +#define VIRTIO_RING_F_INDIRECT_DESC 28 +#define VIRTIO_RING_F_EVENT_IDX 29 + +struct VRingDesc { + uint64 addr; + uint32 len; + uint16 flags; + uint16 next; +}; +#define VRING_DESC_F_NEXT 1 +#define VRING_DESC_F_WRITE 2 // device writes (vs read) + +struct VRingUsedElem { + uint32 id; // index of start of completed descriptor chain + uint32 len; +}; + +// for disk ops +#define VIRTIO_BLK_T_IN 0 +#define VIRTIO_BLK_T_OUT 1 |