Annotation of qemu/roms/seabios/src/virtio-ring.h, revision 1.1

1.1     ! root        1: #ifndef _VIRTIO_RING_H
        !             2: #define _VIRTIO_RING_H
        !             3: 
        !             4: #include "types.h" // u64
        !             5: #include "memmap.h" // PAGE_SIZE
        !             6: 
        !             7: #define PAGE_SHIFT 12
        !             8: #define PAGE_MASK  (PAGE_SIZE-1)
        !             9: 
        !            10: #define virt_to_phys(v) (unsigned long)(v)
        !            11: #define phys_to_virt(p) (void*)(p)
        !            12: /* Compiler barrier is enough as an x86 CPU does not reorder reads or writes */
        !            13: #define smp_rmb() barrier()
        !            14: #define smp_wmb() barrier()
        !            15: 
        !            16: /* Status byte for guest to report progress, and synchronize features. */
        !            17: /* We have seen device and processed generic fields (VIRTIO_CONFIG_F_VIRTIO) */
        !            18: #define VIRTIO_CONFIG_S_ACKNOWLEDGE     1
        !            19: /* We have found a driver for the device. */
        !            20: #define VIRTIO_CONFIG_S_DRIVER          2
        !            21: /* Driver has used its parts of the config, and is happy */
        !            22: #define VIRTIO_CONFIG_S_DRIVER_OK       4
        !            23: /* We've given up on this device. */
        !            24: #define VIRTIO_CONFIG_S_FAILED          0x80
        !            25: 
        !            26: #define MAX_QUEUE_NUM      (128)
        !            27: 
        !            28: #define VRING_DESC_F_NEXT  1
        !            29: #define VRING_DESC_F_WRITE 2
        !            30: 
        !            31: #define VRING_AVAIL_F_NO_INTERRUPT 1
        !            32: 
        !            33: #define VRING_USED_F_NO_NOTIFY     1
        !            34: 
        !            35: struct vring_desc
        !            36: {
        !            37:    u64 addr;
        !            38:    u32 len;
        !            39:    u16 flags;
        !            40:    u16 next;
        !            41: };
        !            42: 
        !            43: struct vring_avail
        !            44: {
        !            45:    u16 flags;
        !            46:    u16 idx;
        !            47:    u16 ring[0];
        !            48: };
        !            49: 
        !            50: struct vring_used_elem
        !            51: {
        !            52:    u32 id;
        !            53:    u32 len;
        !            54: };
        !            55: 
        !            56: struct vring_used
        !            57: {
        !            58:    u16 flags;
        !            59:    u16 idx;
        !            60:    struct vring_used_elem ring[];
        !            61: };
        !            62: 
        !            63: struct vring {
        !            64:    unsigned int num;
        !            65:    struct vring_desc *desc;
        !            66:    struct vring_avail *avail;
        !            67:    struct vring_used *used;
        !            68: };
        !            69: 
        !            70: #define vring_size(num) \
        !            71:    (((((sizeof(struct vring_desc) * num) + \
        !            72:       (sizeof(struct vring_avail) + sizeof(u16) * num)) \
        !            73:          + PAGE_MASK) & ~PAGE_MASK) + \
        !            74:          (sizeof(struct vring_used) + sizeof(struct vring_used_elem) * num))
        !            75: 
        !            76: typedef unsigned char virtio_queue_t[vring_size(MAX_QUEUE_NUM)];
        !            77: 
        !            78: struct vring_virtqueue {
        !            79:    virtio_queue_t queue;
        !            80:    struct vring vring;
        !            81:    u16 free_head;
        !            82:    u16 last_used_idx;
        !            83:    u16 vdata[MAX_QUEUE_NUM];
        !            84:    /* PCI */
        !            85:    int queue_index;
        !            86: };
        !            87: 
        !            88: struct vring_list {
        !            89:   char *addr;
        !            90:   unsigned int length;
        !            91: };
        !            92: 
        !            93: static inline void vring_init(struct vring *vr,
        !            94:                          unsigned int num, unsigned char *queue)
        !            95: {
        !            96:    unsigned int i;
        !            97:    unsigned long pa;
        !            98: 
        !            99:    ASSERT32FLAT();
        !           100:    vr->num = num;
        !           101: 
        !           102:    /* physical address of desc must be page aligned */
        !           103: 
        !           104:    pa = virt_to_phys(queue);
        !           105:    pa = (pa + PAGE_MASK) & ~PAGE_MASK;
        !           106:    vr->desc = phys_to_virt(pa);
        !           107: 
        !           108:    vr->avail = (struct vring_avail *)&vr->desc[num];
        !           109:    /* disable interrupts */
        !           110:    vr->avail->flags |= VRING_AVAIL_F_NO_INTERRUPT;
        !           111: 
        !           112:    /* physical address of used must be page aligned */
        !           113: 
        !           114:    pa = virt_to_phys(&vr->avail->ring[num]);
        !           115:    pa = (pa + PAGE_MASK) & ~PAGE_MASK;
        !           116:    vr->used = phys_to_virt(pa);
        !           117: 
        !           118:    for (i = 0; i < num - 1; i++)
        !           119:            vr->desc[i].next = i + 1;
        !           120:    vr->desc[i].next = 0;
        !           121: }
        !           122: 
        !           123: int vring_more_used(struct vring_virtqueue *vq);
        !           124: void vring_detach(struct vring_virtqueue *vq, unsigned int head);
        !           125: int vring_get_buf(struct vring_virtqueue *vq, unsigned int *len);
        !           126: void vring_add_buf(struct vring_virtqueue *vq, struct vring_list list[],
        !           127:                    unsigned int out, unsigned int in,
        !           128:                    int index, int num_added);
        !           129: void vring_kick(unsigned int ioaddr, struct vring_virtqueue *vq, int num_added);
        !           130: 
        !           131: #endif /* _VIRTIO_RING_H_ */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.