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