|
|
1.1 root 1: /* virtio-pci.c - pci interface for virtio interface
2: *
3: * (c) Copyright 2008 Bull S.A.S.
4: *
5: * Author: Laurent Vivier <[email protected]>
6: *
7: * some parts from Linux Virtio PCI driver
8: *
9: * Copyright IBM Corp. 2007
10: * Authors: Anthony Liguori <[email protected]>
11: *
12: */
13:
14: #include "etherboot.h"
15: #include "ipxe/io.h"
16: #include "ipxe/virtio-ring.h"
17: #include "ipxe/virtio-pci.h"
18:
19: int vp_find_vq(unsigned int ioaddr, int queue_index,
20: struct vring_virtqueue *vq)
21: {
22: struct vring * vr = &vq->vring;
23: u16 num;
24:
25: /* select the queue */
26:
27: outw(queue_index, ioaddr + VIRTIO_PCI_QUEUE_SEL);
28:
29: /* check if the queue is available */
30:
31: num = inw(ioaddr + VIRTIO_PCI_QUEUE_NUM);
32: if (!num) {
33: printf("ERROR: queue size is 0\n");
34: return -1;
35: }
36:
37: if (num > MAX_QUEUE_NUM) {
38: printf("ERROR: queue size %d > %d\n", num, MAX_QUEUE_NUM);
39: return -1;
40: }
41:
42: /* check if the queue is already active */
43:
44: if (inl(ioaddr + VIRTIO_PCI_QUEUE_PFN)) {
45: printf("ERROR: queue already active\n");
46: return -1;
47: }
48:
49: vq->queue_index = queue_index;
50:
51: /* initialize the queue */
52:
53: vring_init(vr, num, (unsigned char*)&vq->queue);
54:
55: /* activate the queue
56: *
57: * NOTE: vr->desc is initialized by vring_init()
58: */
59:
60: outl((unsigned long)virt_to_phys(vr->desc) >> PAGE_SHIFT,
61: ioaddr + VIRTIO_PCI_QUEUE_PFN);
62:
63: return num;
64: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.