aboutsummaryrefslogtreecommitdiffstats
path: root/src/hw/virtio-ring.h
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2015-09-22 11:46:48 -0400
committerKevin O'Connor <kevin@koconnor.net>2015-10-15 10:52:13 -0400
commit1dcf02b06797309676a2915454d1388b8ef0434d (patch)
tree9c1298ea8f5884bbdb6fa9fea178f1b0a77e35a8 /src/hw/virtio-ring.h
parent5ba22ab9f56fd1c01fc6cdd3f934e7323894e0f8 (diff)
downloadseabios-1dcf02b06797309676a2915454d1388b8ef0434d.tar.gz
virtio: Simplify vring alignment code
Don't do phys_to_virt(virt_to_phys(vaddr)) for page alignment - page alignment can be determined directly from the virtual address. Use the ALIGN() macro to make the code more readable. Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Diffstat (limited to 'src/hw/virtio-ring.h')
-rw-r--r--src/hw/virtio-ring.h29
1 files changed, 9 insertions, 20 deletions
diff --git a/src/hw/virtio-ring.h b/src/hw/virtio-ring.h
index 7df90044..e8f3b822 100644
--- a/src/hw/virtio-ring.h
+++ b/src/hw/virtio-ring.h
@@ -5,10 +5,8 @@
#include "memmap.h" // PAGE_SIZE
#define PAGE_SHIFT 12
-#define PAGE_MASK (PAGE_SIZE-1)
#define virt_to_phys(v) (unsigned long)(v)
-#define phys_to_virt(p) (void*)(p)
/* Compiler barrier is enough as an x86 CPU does not reorder reads or writes */
#define smp_rmb() barrier()
#define smp_wmb() barrier()
@@ -73,10 +71,9 @@ struct vring {
};
#define vring_size(num) \
- (((((sizeof(struct vring_desc) * num) + \
- (sizeof(struct vring_avail) + sizeof(u16) * num)) \
- + PAGE_MASK) & ~PAGE_MASK) + \
- (sizeof(struct vring_used) + sizeof(struct vring_used_elem) * num))
+ (ALIGN(sizeof(struct vring_desc) * num + sizeof(struct vring_avail) \
+ + sizeof(u16) * num, PAGE_SIZE) \
+ + sizeof(struct vring_used) + sizeof(struct vring_used_elem) * num)
typedef unsigned char virtio_queue_t[vring_size(MAX_QUEUE_NUM)];
@@ -96,33 +93,25 @@ struct vring_list {
unsigned int length;
};
-static inline void vring_init(struct vring *vr,
- unsigned int num, unsigned char *queue)
+static inline void
+vring_init(struct vring *vr, unsigned int num, unsigned char *queue)
{
- unsigned int i;
- unsigned long pa;
-
ASSERT32FLAT();
vr->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->desc = (void*)ALIGN((u32)queue, PAGE_SIZE);
vr->avail = (struct vring_avail *)&vr->desc[num];
/* disable interrupts */
vr->avail->flags |= VRING_AVAIL_F_NO_INTERRUPT;
/* physical address of used must be page aligned */
+ vr->used = (void*)ALIGN((u32)&vr->avail->ring[num], PAGE_SIZE);
- pa = virt_to_phys(&vr->avail->ring[num]);
- pa = (pa + PAGE_MASK) & ~PAGE_MASK;
- vr->used = phys_to_virt(pa);
-
+ int i;
for (i = 0; i < num - 1; i++)
- vr->desc[i].next = i + 1;
+ vr->desc[i].next = i + 1;
vr->desc[i].next = 0;
}