#ifndef _VIRTIO_RING_H_ # define _VIRTIO_RING_H_ #define PAGE_SHIFT (12) #define PAGE_SIZE (1<num = num; /* physical address of desc must be page aligned */ pa = virt_to_phys(queue); pa = (pa + PAGE_MASK) & ~PAGE_MASK; vr->desc = phys_to_virt(pa); vr->avail = (struct vring_avail *)&vr->desc[num]; /* physical address of used must be page aligned */ pa = virt_to_phys(&vr->avail->ring[num]); pa = (pa + PAGE_MASK) & ~PAGE_MASK; vr->used = phys_to_virt(pa); for (i = 0; i < num - 1; i++) vr->desc[i].next = i + 1; vr->desc[i].next = 0; } static inline void vring_enable_cb(struct vring_virtqueue *vq) { vq->vring.avail->flags &= ~VRING_AVAIL_F_NO_INTERRUPT; } static inline void vring_disable_cb(struct vring_virtqueue *vq) { vq->vring.avail->flags |= VRING_AVAIL_F_NO_INTERRUPT; } /* * vring_more_used * * is there some used buffers ? * */ static inline int vring_more_used(struct vring_virtqueue *vq) { wmb(); return vq->last_used_idx != vq->vring.used->idx; } void vring_detach(struct vring_virtqueue *vq, unsigned int head); int vring_get_buf(struct vring_virtqueue *vq, unsigned int *len); void vring_add_buf(struct vring_virtqueue *vq, struct vring_list list[], unsigned int out, unsigned int in, int index, int num_added); void vring_kick(unsigned int ioaddr, struct vring_virtqueue *vq, int num_added); #endif /* _VIRTIO_RING_H_ */