diff options
author | Gerd Hoffmann <kraxel@redhat.com> | 2009-09-16 22:25:32 +0200 |
---|---|---|
committer | Anthony Liguori <aliguori@us.ibm.com> | 2009-10-05 09:32:47 -0500 |
commit | 03587182757dd7988d77b535614acf74b52b81ec (patch) | |
tree | 23ef9a7656df2aacfecf234f6293d54af0cfad1b | |
parent | 21eea4b38f88176891de7b104465ebcb02da6425 (diff) |
convert pci bridge to qdev
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
-rw-r--r-- | hw/pci.c | 66 |
1 files changed, 48 insertions, 18 deletions
@@ -142,18 +142,16 @@ PCIBus *pci_register_bus(DeviceState *parent, const char *name, return bus; } -static PCIBus *pci_register_secondary_bus(PCIDevice *dev, - pci_map_irq_fn map_irq, - const char *name) +static void pci_register_secondary_bus(PCIBus *bus, + PCIDevice *dev, + pci_map_irq_fn map_irq, + const char *name) { - PCIBus *bus; - - bus = FROM_QBUS(PCIBus, qbus_create(&pci_bus_info, &dev->qdev, name)); + qbus_create_inplace(&bus->qbus, &pci_bus_info, &dev->qdev, name); bus->map_irq = map_irq; bus->parent_dev = dev; bus->next = dev->bus->next; dev->bus->next = bus; - return bus; } int pci_bus_num(PCIBus *s) @@ -869,7 +867,9 @@ PCIDevice *pci_nic_init(NICInfo *nd, const char *default_model, typedef struct { PCIDevice dev; - PCIBus *bus; + PCIBus bus; + uint32_t vid; + uint32_t did; } PCIBridge; static void pci_bridge_write_config(PCIDevice *d, @@ -878,7 +878,7 @@ static void pci_bridge_write_config(PCIDevice *d, PCIBridge *s = (PCIBridge *)d; pci_default_write_config(d, address, val, len); - s->bus->bus_num = d->config[PCI_SECONDARY_BUS]; + s->bus.bus_num = d->config[PCI_SECONDARY_BUS]; } PCIBus *pci_find_bus(int bus_num) @@ -901,15 +901,12 @@ PCIDevice *pci_find_device(int bus_num, int slot, int function) return bus->devices[PCI_DEVFN(slot, function)]; } -PCIBus *pci_bridge_init(PCIBus *bus, int devfn, uint16_t vid, uint16_t did, - pci_map_irq_fn map_irq, const char *name) +static int pci_bridge_initfn(PCIDevice *dev) { - PCIBridge *s; - s = (PCIBridge *)pci_register_device(bus, name, sizeof(PCIBridge), - devfn, NULL, pci_bridge_write_config); + PCIBridge *s = DO_UPCAST(PCIBridge, dev, dev); - pci_config_set_vendor_id(s->dev.config, vid); - pci_config_set_device_id(s->dev.config, did); + pci_config_set_vendor_id(s->dev.config, s->vid); + pci_config_set_device_id(s->dev.config, s->did); s->dev.config[0x04] = 0x06; // command = bus master, pci mem s->dev.config[0x05] = 0x00; @@ -922,9 +919,23 @@ PCIBus *pci_bridge_init(PCIBus *bus, int devfn, uint16_t vid, uint16_t did, s->dev.config[PCI_HEADER_TYPE] = PCI_HEADER_TYPE_MULTI_FUNCTION | PCI_HEADER_TYPE_BRIDGE; // header_type s->dev.config[0x1E] = 0xa0; // secondary status + return 0; +} - s->bus = pci_register_secondary_bus(&s->dev, map_irq, name); - return s->bus; +PCIBus *pci_bridge_init(PCIBus *bus, int devfn, uint16_t vid, uint16_t did, + pci_map_irq_fn map_irq, const char *name) +{ + PCIDevice *dev; + PCIBridge *s; + + dev = pci_create_noinit(bus, devfn, "pci-bridge"); + qdev_prop_set_uint32(&dev->qdev, "vendorid", vid); + qdev_prop_set_uint32(&dev->qdev, "deviceid", did); + qdev_init(&dev->qdev); + + s = DO_UPCAST(PCIBridge, dev, dev); + pci_register_secondary_bus(&s->bus, &s->dev, map_irq, name); + return &s->bus; } static int pci_qdev_init(DeviceState *qdev, DeviceInfo *base) @@ -1085,3 +1096,22 @@ static void pcibus_dev_print(Monitor *mon, DeviceState *dev, int indent) r->addr, r->addr + r->size - 1); } } + +static PCIDeviceInfo bridge_info = { + .qdev.name = "pci-bridge", + .qdev.size = sizeof(PCIBridge), + .init = pci_bridge_initfn, + .config_write = pci_bridge_write_config, + .qdev.props = (Property[]) { + DEFINE_PROP_HEX32("vendorid", PCIBridge, vid, 0), + DEFINE_PROP_HEX32("deviceid", PCIBridge, did, 0), + DEFINE_PROP_END_OF_LIST(), + } +}; + +static void pci_register_devices(void) +{ + pci_qdev_register(&bridge_info); +} + +device_init(pci_register_devices) |