void qpci_device_foreach(QPCIBus *bus, int vendor_id, int device_id, void (*func)(QPCIDevice *dev, int devfn, void *data), void *data) { int slot; for (slot = 0; slot < 32; slot++) { int fn; for (fn = 0; fn < 8; fn++) { QPCIDevice *dev; dev = qpci_device_find(bus, QPCI_DEVFN(slot, fn)); if (!dev) { continue; } if (vendor_id != -1 && qpci_config_readw(dev, PCI_VENDOR_ID) != vendor_id) { continue; } if (device_id != -1 && qpci_config_readw(dev, PCI_DEVICE_ID) != device_id) { continue; } func(dev, QPCI_DEVFN(slot, fn), data); } } }
static void pci_init(void) { if (pcibus) { return; } pcibus = qpci_init_pc(NULL); g_assert(pcibus != NULL); qusb_pci_init_one(pcibus, &uhci1, QPCI_DEVFN(0x1d, 0), 4); qusb_pci_init_one(pcibus, &uhci2, QPCI_DEVFN(0x1d, 1), 4); qusb_pci_init_one(pcibus, &uhci3, QPCI_DEVFN(0x1d, 2), 4); qusb_pci_init_one(pcibus, &ehci1, QPCI_DEVFN(0x1d, 7), 0); }
static void test_init(TestData *d) { QTestState *qs; qs = qtest_startf("-machine q35 %s %s", d->noreboot ? "" : "-global ICH9-LPC.noreboot=false", !d->args ? "" : d->args); global_qtest = qs; qtest_irq_intercept_in(qs, "ioapic"); d->bus = qpci_init_pc(qs, NULL); d->dev = qpci_device_find(d->bus, QPCI_DEVFN(0x1f, 0x00)); g_assert(d->dev != NULL); qpci_device_enable(d->dev); /* set ACPI PM I/O space base address */ qpci_config_writel(d->dev, ICH9_LPC_PMBASE, PM_IO_BASE_ADDR | 0x1); /* enable ACPI I/O */ qpci_config_writeb(d->dev, ICH9_LPC_ACPI_CTRL, 0x80); /* set Root Complex BAR */ qpci_config_writel(d->dev, ICH9_LPC_RCBA, RCBA_BASE_ADDR | 0x1); d->tco_io_bar = qpci_legacy_iomap(d->dev, PM_IO_BASE_ADDR + 0x60); }
static QPCIDevice *get_pci_device(uint16_t *bmdma_base) { QPCIDevice *dev; uint16_t vendor_id, device_id; if (!pcibus) { pcibus = qpci_init_pc(); } /* Find PCI device and verify it's the right one */ dev = qpci_device_find(pcibus, QPCI_DEVFN(IDE_PCI_DEV, IDE_PCI_FUNC)); g_assert(dev != NULL); vendor_id = qpci_config_readw(dev, PCI_VENDOR_ID); device_id = qpci_config_readw(dev, PCI_DEVICE_ID); g_assert(vendor_id == PCI_VENDOR_ID_INTEL); g_assert(device_id == PCI_DEVICE_ID_INTEL_82371SB_1); /* Map bmdma BAR */ *bmdma_base = (uint16_t)(uintptr_t) qpci_iomap(dev, 4); qpci_device_enable(dev); return dev; }
static void test_port(int port) { struct qhc uhci; g_assert(port > 0); qusb_pci_init_one(qs->pcibus, &uhci, QPCI_DEVFN(0x1d, 0), 4); uhci_port_test(&uhci, port - 1, UHCI_PORT_CCS); }
QVirtioBalloon *interface = &virtio_bpci->balloon; QOSGraphObject *obj = &virtio_bpci->pci_vdev.obj; virtio_pci_init(&virtio_bpci->pci_vdev, pci_bus, addr); interface->vdev = &virtio_bpci->pci_vdev.vdev; obj->get_driver = qvirtio_balloon_pci_get_driver; return obj; } static void virtio_balloon_register_nodes(void) { QPCIAddress addr = { .devfn = QPCI_DEVFN(4, 0), }; QOSGraphEdgeOptions opts = { .extra_device_opts = "addr=04.0", }; /* virtio-balloon-device */ qos_node_create_driver("virtio-balloon-device", virtio_balloon_device_create); qos_node_consumes("virtio-balloon-device", "virtio-bus", NULL); qos_node_produces("virtio-balloon-device", "virtio"); qos_node_produces("virtio-balloon-device", "virtio-balloon"); /* virtio-balloon-pci */ add_qpci_address(&opts, &addr);