From patchwork Fri Sep 25 19:42:32 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gerd Hoffmann X-Patchwork-Id: 34290 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [199.232.76.165]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 7DA8AB7BC2 for ; Sat, 26 Sep 2009 05:59:52 +1000 (EST) Received: from localhost ([127.0.0.1]:37826 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1MrGxJ-0003ZU-L0 for incoming@patchwork.ozlabs.org; Fri, 25 Sep 2009 15:59:49 -0400 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1MrGhD-0006SK-5T for qemu-devel@nongnu.org; Fri, 25 Sep 2009 15:43:11 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1MrGh7-0006Ne-D0 for qemu-devel@nongnu.org; Fri, 25 Sep 2009 15:43:09 -0400 Received: from [199.232.76.173] (port=56045 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1MrGh6-0006NH-T9 for qemu-devel@nongnu.org; Fri, 25 Sep 2009 15:43:04 -0400 Received: from mx1.redhat.com ([209.132.183.28]:5889) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1MrGh5-0004dZ-GT for qemu-devel@nongnu.org; Fri, 25 Sep 2009 15:43:03 -0400 Received: from int-mx08.intmail.prod.int.phx2.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id n8PJh2vT032661 for ; Fri, 25 Sep 2009 15:43:02 -0400 Received: from zweiblum.home.kraxel.org (vpn2-8-108.ams2.redhat.com [10.36.8.108]) by int-mx08.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with SMTP id n8PJguFC021022; Fri, 25 Sep 2009 15:42:57 -0400 Received: by zweiblum.home.kraxel.org (Postfix, from userid 500) id 69455700EA; Fri, 25 Sep 2009 21:42:50 +0200 (CEST) From: Gerd Hoffmann To: qemu-devel@nongnu.org Date: Fri, 25 Sep 2009 21:42:32 +0200 Message-Id: <1253907769-1067-8-git-send-email-kraxel@redhat.com> In-Reply-To: <1253907769-1067-1-git-send-email-kraxel@redhat.com> References: <1253907769-1067-1-git-send-email-kraxel@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.21 X-detected-operating-system: by monty-python.gnu.org: Genre and OS details not recognized. Cc: Gerd Hoffmann Subject: [Qemu-devel] [PATCH 07/24] convert pci bridge to qdev X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org 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)