|
|
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.