Annotation of qemu/roms/seabios/src/virtio-pci.c, revision 1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.