|
|
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: * Adopted for Seabios: Gleb Natapov <[email protected]>
13: *
14: * This work is licensed under the terms of the GNU LGPLv3
15: * See the COPYING file in the top-level directory.
16: */
17:
18: #include "virtio-ring.h"
19: #include "virtio-pci.h"
20: #include "config.h" // CONFIG_DEBUG_LEVEL
21: #include "util.h" // dprintf
22:
23: int vp_find_vq(unsigned int ioaddr, int queue_index,
24: struct vring_virtqueue *vq)
25: {
26: struct vring * vr = &vq->vring;
27: u16 num;
28:
29: ASSERT32FLAT();
30: /* select the queue */
31:
32: outw(queue_index, ioaddr + VIRTIO_PCI_QUEUE_SEL);
33:
34: /* check if the queue is available */
35:
36: num = inw(ioaddr + VIRTIO_PCI_QUEUE_NUM);
37: if (!num) {
38: dprintf(1, "ERROR: queue size is 0\n");
39: return -1;
40: }
41:
42: if (num > MAX_QUEUE_NUM) {
43: dprintf(1, "ERROR: queue size %d > %d\n", num, MAX_QUEUE_NUM);
44: return -1;
45: }
46:
47: /* check if the queue is already active */
48:
49: if (inl(ioaddr + VIRTIO_PCI_QUEUE_PFN)) {
50: dprintf(1, "ERROR: queue already active\n");
51: return -1;
52: }
53:
54: vq->queue_index = queue_index;
55:
56: /* initialize the queue */
57:
58: vring_init(vr, num, (unsigned char*)&vq->queue);
59:
60: /* activate the queue
61: *
62: * NOTE: vr->desc is initialized by vring_init()
63: */
64:
65: outl((unsigned long)virt_to_phys(vr->desc) >> PAGE_SHIFT,
66: ioaddr + VIRTIO_PCI_QUEUE_PFN);
67:
68: return num;
69: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.