From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1Mq1h0-0003o9-F9 for qemu-devel@nongnu.org; Tue, 22 Sep 2009 05:29:50 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1Mq1gt-0003jH-M0 for qemu-devel@nongnu.org; Tue, 22 Sep 2009 05:29:48 -0400 Received: from [199.232.76.173] (port=34987 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Mq1gs-0003j0-Rm for qemu-devel@nongnu.org; Tue, 22 Sep 2009 05:29:42 -0400 Received: from mx1.redhat.com ([209.132.183.28]:27595) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1Mq1gs-0008A2-CA for qemu-devel@nongnu.org; Tue, 22 Sep 2009 05:29:42 -0400 Received: from int-mx05.intmail.prod.int.phx2.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.18]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id n8M9TfW9005875 for ; Tue, 22 Sep 2009 05:29:41 -0400 From: Gerd Hoffmann Date: Tue, 22 Sep 2009 11:29:20 +0200 Message-Id: <1253611767-6483-7-git-send-email-kraxel@redhat.com> In-Reply-To: <1253611767-6483-1-git-send-email-kraxel@redhat.com> References: <1253611767-6483-1-git-send-email-kraxel@redhat.com> Subject: [Qemu-devel] [PATCH 06/13] convert pci bridge to qdev List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Gerd Hoffmann Also switch secondary pci busses to inplace allocation. Signed-off-by: Gerd Hoffmann --- hw/pci.c | 66 +++++++++++++++++++++++++++++++++++++++++++++---------------- 1 files changed, 48 insertions(+), 18 deletions(-) diff --git a/hw/pci.c b/hw/pci.c index ad508a5..608792a 100644 --- a/hw/pci.c +++ b/hw/pci.c @@ -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) @@ -858,7 +856,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, @@ -867,7 +867,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) @@ -890,15 +890,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; @@ -911,9 +908,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) @@ -1074,3 +1085,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) -- 1.6.2.5