1 /* virtio-pci.c - pci interface for virtio interface
3 * (c) Copyright 2008 Bull S.A.S.
5 * Author: Laurent Vivier <Laurent.Vivier@bull.net>
7 * some parts from Linux Virtio PCI driver
9 * Copyright IBM Corp. 2007
10 * Authors: Anthony Liguori <aliguori@us.ibm.com>
14 #include "etherboot.h"
16 #include "gpxe/virtio-ring.h"
17 #include "gpxe/virtio-pci.h"
19 int vp_find_vq(unsigned int ioaddr
, int queue_index
,
20 struct vring_virtqueue
*vq
)
22 struct vring
* vr
= &vq
->vring
;
25 /* select the queue */
27 outw(queue_index
, ioaddr
+ VIRTIO_PCI_QUEUE_SEL
);
29 /* check if the queue is available */
31 num
= inw(ioaddr
+ VIRTIO_PCI_QUEUE_NUM
);
33 printf("ERROR: queue size is 0\n");
37 if (num
> MAX_QUEUE_NUM
) {
38 printf("ERROR: queue size %d > %d\n", num
, MAX_QUEUE_NUM
);
42 /* check if the queue is already active */
44 if (inl(ioaddr
+ VIRTIO_PCI_QUEUE_PFN
)) {
45 printf("ERROR: queue already active\n");
49 vq
->queue_index
= queue_index
;
51 /* initialize the queue */
53 vring_init(vr
, num
, (unsigned char*)&vq
->queue
);
57 * NOTE: vr->desc is initialized by vring_init()
60 outl((unsigned long)virt_to_phys(vr
->desc
) >> PAGE_SHIFT
,
61 ioaddr
+ VIRTIO_PCI_QUEUE_PFN
);