From nobody Wed Feb 11 05:59:57 2026 Delivered-To: importer@patchew.org Received-SPF: temperror (zoho.com: Error in retrieving data from DNS) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=temperror (zoho.com: Error in retrieving data from DNS) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1507022359901452.9820503512964; Tue, 3 Oct 2017 02:19:19 -0700 (PDT) Received: from localhost ([::1]:57272 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dzJMB-00074c-Vz for importer@patchew.org; Tue, 03 Oct 2017 05:19:16 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:37738) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dzJHe-0003ZB-Ec for qemu-devel@nongnu.org; Tue, 03 Oct 2017 05:14:36 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dzJHd-0004pc-34 for qemu-devel@nongnu.org; Tue, 03 Oct 2017 05:14:34 -0400 Received: from ozlabs.org ([103.22.144.67]:45607) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1dzJHc-0004ie-DQ for qemu-devel@nongnu.org; Tue, 03 Oct 2017 05:14:33 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 3y5tdc01hhz9t4b; Tue, 3 Oct 2017 20:14:27 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1507022068; bh=ydWrq7h2pUvx/ISwtSoGYeuWUUn40/P556GoSdoVXVo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ZFWOE+yKk9mZafC8Cj49Zl94HbDXBffmoPRuNe1fj2rgwO9sP+oep9TLIYkZvBCO3 u8Hdj9+uSbaWpdZFFVcn8fiuk2TXiix9Gsr+R2+f1vIxrpVM178/V1GT403FsO8X6m Lww/ouET21avrSvKZITING/73bx/rGl3keL8JQ88= From: David Gibson To: mst@redhat.com, ehabkost@redhat.com, marcel@redhat.com Date: Tue, 3 Oct 2017 20:14:22 +1100 Message-Id: <20171003091423.28704-5-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.13.6 In-Reply-To: <20171003091423.28704-1-david@gibson.dropbear.id.au> References: <20171003091423.28704-1-david@gibson.dropbear.id.au> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 103.22.144.67 Subject: [Qemu-devel] [RFC 4/5] pci: Simplify pci_bus_is_root() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: alex.williamson@redhat.com, qemu-devel@nongnu.org, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_6 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" pci_bus_is_root() currently relies on a method in the PCIBusClass. But it's always known if a PCI bus is a root bus when we create it, so using a dynamic method is overkill. This replaces it with an IS_ROOT bit in a new flags field, which is set on root buses and otherwise clear. As a bonus this removes the special is_root logic from pci_expander_bridge, since it already creates its bus as a root bus. Signed-off-by: David Gibson # Conflicts: # include/hw/pci/pci_bus.h --- hw/pci-bridge/pci_expander_bridge.c | 6 ------ hw/pci/pci.c | 14 ++------------ include/hw/pci/pci.h | 12 +++++++++++- 3 files changed, 13 insertions(+), 19 deletions(-) diff --git a/hw/pci-bridge/pci_expander_bridge.c b/hw/pci-bridge/pci_expand= er_bridge.c index 5652cf06e9..11dfa9258e 100644 --- a/hw/pci-bridge/pci_expander_bridge.c +++ b/hw/pci-bridge/pci_expander_bridge.c @@ -65,11 +65,6 @@ static int pxb_bus_num(PCIBus *bus) return pxb->bus_nr; } =20 -static bool pxb_is_root(PCIBus *bus) -{ - return true; /* by definition */ -} - static uint16_t pxb_bus_numa_node(PCIBus *bus) { PXBDev *pxb =3D convert_to_pxb(bus->parent_dev); @@ -82,7 +77,6 @@ static void pxb_bus_class_init(ObjectClass *class, void *= data) PCIBusClass *pbc =3D PCI_BUS_CLASS(class); =20 pbc->bus_num =3D pxb_bus_num; - pbc->is_root =3D pxb_is_root; pbc->numa_node =3D pxb_bus_numa_node; } =20 diff --git a/hw/pci/pci.c b/hw/pci/pci.c index ffaa449ec1..4baf591562 100644 --- a/hw/pci/pci.c +++ b/hw/pci/pci.c @@ -126,14 +126,9 @@ static void pci_bus_unrealize(BusState *qbus, Error **= errp) vmstate_unregister(NULL, &vmstate_pcibus, bus); } =20 -static bool pcibus_is_root(PCIBus *bus) -{ - return !bus->parent_dev; -} - static int pcibus_num(PCIBus *bus) { - if (pcibus_is_root(bus)) { + if (pci_bus_is_root(bus)) { return 0; /* pci host bridge */ } return bus->parent_dev->config[PCI_SECONDARY_BUS]; @@ -156,7 +151,6 @@ static void pci_bus_class_init(ObjectClass *klass, void= *data) k->unrealize =3D pci_bus_unrealize; k->reset =3D pcibus_reset; =20 - pbc->is_root =3D pcibus_is_root; pbc->bus_num =3D pcibus_num; pbc->numa_node =3D pcibus_numa_node; } @@ -385,6 +379,7 @@ static void pci_root_bus_init(PCIBus *bus, DeviceState = *parent, bus->slot_reserved_mask =3D 0x0; bus->address_space_mem =3D address_space_mem; bus->address_space_io =3D address_space_io; + bus->flags |=3D PCI_BUS_IS_ROOT; =20 /* host bridge */ QLIST_INIT(&bus->child); @@ -397,11 +392,6 @@ bool pci_bus_is_express(PCIBus *bus) return object_dynamic_cast(OBJECT(bus), TYPE_PCIE_BUS); } =20 -bool pci_bus_is_root(PCIBus *bus) -{ - return PCI_BUS_GET_CLASS(bus)->is_root(bus); -} - void pci_root_bus_new_inplace(PCIBus *bus, size_t bus_size, DeviceState *p= arent, const char *name, MemoryRegion *address_space_mem, diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h index 77d92a3dc4..cbb3386207 100644 --- a/include/hw/pci/pci.h +++ b/include/hw/pci/pci.h @@ -404,6 +404,11 @@ typedef AddressSpace *(*PCIIOMMUFunc)(PCIBus *, void *= , int); #define PCI_BUS_GET_CLASS(obj) OBJECT_GET_CLASS(PCIBusClass, (obj), TYPE_P= CI_BUS) #define TYPE_PCIE_BUS "PCIE" =20 +enum PCIBusFlags { + /* This bus is the root of a PCI domain */ + PCI_BUS_IS_ROOT =3D 0x0001, +}; + typedef struct PCIBusClass { /*< private >*/ BusClass parent_class; @@ -416,6 +421,7 @@ typedef struct PCIBusClass { =20 struct PCIBus { BusState qbus; + enum PCIBusFlags flags; PCIIOMMUFunc iommu_fn; void *iommu_opaque; uint8_t devfn_min; @@ -440,8 +446,12 @@ struct PCIBus { Notifier machine_done; }; =20 +static inline bool pci_bus_is_root(PCIBus *bus) +{ + return !!(bus->flags & PCI_BUS_IS_ROOT); +} + bool pci_bus_is_express(PCIBus *bus); -bool pci_bus_is_root(PCIBus *bus); void pci_root_bus_new_inplace(PCIBus *bus, size_t bus_size, DeviceState *p= arent, const char *name, MemoryRegion *address_space_mem, --=20 2.13.6