{"id":958754,"url":"http://patchwork.ozlabs.org/api/patches/958754/?format=json","web_url":"http://patchwork.ozlabs.org/project/linuxppc-dev/patch/20180817102645.3839621-15-arnd@arndb.de/","project":{"id":2,"url":"http://patchwork.ozlabs.org/api/projects/2/?format=json","name":"Linux PPC development","link_name":"linuxppc-dev","list_id":"linuxppc-dev.lists.ozlabs.org","list_email":"linuxppc-dev@lists.ozlabs.org","web_url":"https://github.com/linuxppc/wiki/wiki","scm_url":"https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git","webscm_url":"https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git/","list_archive_url":"https://lore.kernel.org/linuxppc-dev/","list_archive_url_format":"https://lore.kernel.org/linuxppc-dev/{}/","commit_url_format":"https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git/commit/?id={}"},"msgid":"<20180817102645.3839621-15-arnd@arndb.de>","list_archive_url":"https://lore.kernel.org/linuxppc-dev/20180817102645.3839621-15-arnd@arndb.de/","date":"2018-08-17T10:26:44","name":"[RFC,14/15] PCI: make pcibios_root_bridge_prepare a callback","commit_ref":null,"pull_url":null,"state":"not-applicable","archived":false,"hash":"7a280b79bbf7596821e0253567e4fbcc37ab8b63","submitter":{"id":30,"url":"http://patchwork.ozlabs.org/api/people/30/?format=json","name":"Arnd Bergmann","email":"arnd@arndb.de"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/linuxppc-dev/patch/20180817102645.3839621-15-arnd@arndb.de/mbox/","series":[{"id":61229,"url":"http://patchwork.ozlabs.org/api/series/61229/?format=json","web_url":"http://patchwork.ozlabs.org/project/linuxppc-dev/list/?series=61229","date":"2018-08-17T10:26:32","name":"PCI: turn some __weak functions into callbacks","version":1,"mbox":"http://patchwork.ozlabs.org/series/61229/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/958754/comments/","check":"success","checks":"http://patchwork.ozlabs.org/api/patches/958754/checks/","tags":{},"related":[],"headers":{"Return-Path":"<linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org>","X-Original-To":["patchwork-incoming@ozlabs.org","linuxppc-dev@lists.ozlabs.org"],"Delivered-To":["patchwork-incoming@ozlabs.org","linuxppc-dev@lists.ozlabs.org"],"Received":["from lists.ozlabs.org (lists.ozlabs.org [203.11.71.2])\n\t(using TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPS id 41sKWH0zdYz9s3Z\n\tfor <patchwork-incoming@ozlabs.org>;\n\tFri, 17 Aug 2018 20:41:31 +1000 (AEST)","from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3])\n\tby lists.ozlabs.org (Postfix) with ESMTP id 41sKWG6YhhzF0vb\n\tfor <patchwork-incoming@ozlabs.org>;\n\tFri, 17 Aug 2018 20:41:30 +1000 (AEST)","from mout.kundenserver.de (mout.kundenserver.de [217.72.192.75])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128\n\tbits)) (No client certificate requested)\n\tby lists.ozlabs.org (Postfix) with ESMTPS id 41sKKB4GR2zDrRN\n\tfor <linuxppc-dev@lists.ozlabs.org>;\n\tFri, 17 Aug 2018 20:32:45 +1000 (AEST)","from wuerfel.lan ([109.193.40.16]) by mrelayeu.kundenserver.de\n\t(mreue101 [212.227.15.145]) with ESMTPA (Nemesis) id\n\t0MIe3k-1fsotc3lQO-002Dcj; Fri, 17 Aug 2018 12:27:21 +0200"],"Authentication-Results":["ozlabs.org;\n\tdmarc=none (p=none dis=none) header.from=arndb.de","lists.ozlabs.org;\n\tdmarc=none (p=none dis=none) header.from=arndb.de","lists.ozlabs.org;\n\tspf=none (mailfrom) smtp.mailfrom=arndb.de\n\t(client-ip=217.72.192.75; helo=mout.kundenserver.de;\n\tenvelope-from=arnd@arndb.de; receiver=<UNKNOWN>)","lists.ozlabs.org;\n\tdmarc=none (p=none dis=none) header.from=arndb.de"],"X-Greylist":"delayed 301 seconds by postgrey-1.36 at bilbo;\n\tFri, 17 Aug 2018 20:32:46 AEST","From":"Arnd Bergmann <arnd@arndb.de>","To":"linux-pci@vger.kernel.org,\n\tBjorn Helgaas <bhelgaas@google.com>","Subject":"[RFC 14/15] PCI: make pcibios_root_bridge_prepare a callback","Date":"Fri, 17 Aug 2018 12:26:44 +0200","Message-Id":"<20180817102645.3839621-15-arnd@arndb.de>","X-Mailer":"git-send-email 2.18.0","In-Reply-To":"<20180817102645.3839621-1-arnd@arndb.de>","References":"<20180817102645.3839621-1-arnd@arndb.de>","X-Provags-ID":"V03:K1:vZ1tUwmaDYGgBzDuu0lrWWtkxQnlkXj5dtYX8zCbAbjMLPhmXwP\n\tt9LwpfD9mkpXEZveH7+fB8uk6X4OjdFYNyOnA1ey8wm+8CsZSfl/mDsjXOrb7MOd2PtYpje\n\tOlpTlmfI8HEz2MmVEtEV3Ua7aljIba3990heu2dTAIP1yUOKAYEcf+hRy1ZnQhsCmKw51jI\n\t+C4qufrNzYmzj/M0BHZrg==","X-UI-Out-Filterresults":"notjunk:1; V01:K0:dxliqE4bdUU=:3wNTq0x8GVJJDBiQ3AXqXs\n\tG1qv2M9EJ/R9gkV1bKMYZCs8sWmMSWUClGEIkfFaJ2W2G0STrO3wSkWADrlKtkCc9PfdTAoup\n\t3zxFFpGjrFC3KfzxAbZML6rOtKnoEb5e3CksJj+aa1fm6aeQMQTvedb371xxPgfGWKva598XF\n\tPUSLvS6C3LcfmUQxzp0qZhcq8yppA5YYztqdY4TGZalE1Y8SY+nXhfKO6wlKvVk8gBAw8bicO\n\tEVd+BdFeloh0voA6J06gKNEZYjc6N7/m2U+JDcnX3Ypj9EGMwtWwQMC/6iRinDdnA0fgkwqW4\n\tveqzwD45anZ44l+bkcdHI139spogAFCokqTAoS3lNwGdDFgnCrnv5wpnz92x18JhrHZFSK46h\n\t1ooUzAs76v4ReXOyxEaBYCIkZfLExQcmeFHG/69ANMAnxIAA7Yx8NyY+vmE5/VThcDYmgZXGe\n\t1jKXIZH/4ZFYKwPKIieTXdvXbmbnn+iTnmgndrm+wqozHbn1r61w/IAcy+XYfVEqj5uzXRSMJ\n\t1QxFviL9Dt34LjlL5KMfIJTwrsc9uYg7id2Spp2jrfngo0HnfwR71KrBA6ZNY7a0IAEr+OX4X\n\t030RsyIZnKMH2VTlrWfZhEjRisjQ8d9DdbWD9684DeNYA34N2KYNUgsazhi7hJGNV8xjU9sY+\n\tIW1+wFwF4nHlkdCh9SPWlrphoEsYEnEVQAW5fgWeSJm3dqoevlxFhDJCnasD5iu58MTk=","X-BeenThere":"linuxppc-dev@lists.ozlabs.org","X-Mailman-Version":"2.1.27","Precedence":"list","List-Id":"Linux on PowerPC Developers Mail List\n\t<linuxppc-dev.lists.ozlabs.org>","List-Unsubscribe":"<https://lists.ozlabs.org/options/linuxppc-dev>,\n\t<mailto:linuxppc-dev-request@lists.ozlabs.org?subject=unsubscribe>","List-Archive":"<http://lists.ozlabs.org/pipermail/linuxppc-dev/>","List-Post":"<mailto:linuxppc-dev@lists.ozlabs.org>","List-Help":"<mailto:linuxppc-dev-request@lists.ozlabs.org?subject=help>","List-Subscribe":"<https://lists.ozlabs.org/listinfo/linuxppc-dev>,\n\t<mailto:linuxppc-dev-request@lists.ozlabs.org?subject=subscribe>","Cc":"Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>,\n\tArnd Bergmann <arnd@arndb.de>, linux-kernel@vger.kernel.org,\n\tChristoph Hellwig <hch@infradead.org>, linux-acpi@vger.kernel.org,\n\tlinuxppc-dev@lists.ozlabs.org","Errors-To":"linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org","Sender":"\"Linuxppc-dev\"\n\t<linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org>"},"content":"pcibios_root_bridge_prepare() is always used as a per host bridge\nfunction, not per architecture.\n\nMaking it a callback in the pci_host_bridge instead lets the host\nbridge implementation easily override it, and avoids the checks\nin the architecture for which host bridge implementation is being\nused.\n\nAlternatively, we could probably just call the pcibios_root_bridge_prepare\nafter alloc_pci_host_bridge() here and get rid of it as a generic\ninterface altogether, but doing that has a slightly higher chance\nof breaking something subtle.\n\nSigned-off-by: Arnd Bergmann <arnd@arndb.de>\n---\n arch/arm64/kernel/pci.c          | 18 ++++++++----------\n arch/ia64/pci/pci.c              | 15 ++++-----------\n arch/powerpc/kernel/pci-common.c |  9 +--------\n arch/x86/pci/acpi.c              | 15 ++++-----------\n drivers/acpi/pci_root.c          |  1 +\n drivers/pci/probe.c              | 28 ++++++++++++++++------------\n include/linux/acpi.h             |  2 ++\n include/linux/pci.h              |  3 +--\n 8 files changed, 37 insertions(+), 54 deletions(-)","diff":"diff --git a/arch/arm64/kernel/pci.c b/arch/arm64/kernel/pci.c\nindex 3d196c68e362..8958a7c32a9f 100644\n--- a/arch/arm64/kernel/pci.c\n+++ b/arch/arm64/kernel/pci.c\n@@ -71,19 +71,17 @@ int acpi_pci_bus_find_domain_nr(struct pci_bus *bus)\n \treturn root->segment;\n }\n \n-int pcibios_root_bridge_prepare(struct pci_host_bridge *bridge)\n+int acpi_pci_root_bridge_prepare(struct pci_host_bridge *bridge)\n {\n-\tif (!acpi_disabled) {\n-\t\tstruct pci_config_window *cfg = bridge->bus->sysdata;\n-\t\tstruct acpi_device *adev = to_acpi_device(cfg->parent);\n-\t\tstruct device *bus_dev = &bridge->bus->dev;\n+\tstruct pci_config_window *cfg = bridge->bus->sysdata;\n+\tstruct acpi_device *adev = to_acpi_device(cfg->parent);\n+\tstruct device *bus_dev = &bridge->bus->dev;\n \n-\t\tACPI_COMPANION_SET(&bridge->dev, adev);\n-\t\tset_dev_node(bus_dev, acpi_get_node(acpi_device_handle(adev)));\n+\tACPI_COMPANION_SET(&bridge->dev, adev);\n+\tset_dev_node(bus_dev, acpi_get_node(acpi_device_handle(adev)));\n \n-\t\t/* Try to assign the IRQ number when probing a new device */\n-\t\tbridge->alloc_irq = acpi_pci_irq_enable;\n-\t}\n+\t/* Try to assign the IRQ number when probing a new device */\n+\tbridge->alloc_irq = acpi_pci_irq_enable;\n \n \treturn 0;\n }\ndiff --git a/arch/ia64/pci/pci.c b/arch/ia64/pci/pci.c\nindex 7ccc64d5fe3e..511b8a058d80 100644\n--- a/arch/ia64/pci/pci.c\n+++ b/arch/ia64/pci/pci.c\n@@ -308,18 +308,11 @@ struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root *root)\n \t\t\t\t    &info->common, &info->controller);\n }\n \n-int pcibios_root_bridge_prepare(struct pci_host_bridge *bridge)\n+int acpi_pci_root_bridge_prepare(struct pci_host_bridge *bridge)\n {\n-\t/*\n-\t * We pass NULL as parent to pci_create_root_bus(), so if it is not NULL\n-\t * here, pci_create_root_bus() has been called by someone else and\n-\t * sysdata is likely to be different from what we expect.  Let it go in\n-\t * that case.\n-\t */\n-\tif (!bridge->dev.parent) {\n-\t\tstruct pci_controller *controller = bridge->bus->sysdata;\n-\t\tACPI_COMPANION_SET(&bridge->dev, controller->companion);\n-\t}\n+\tstruct pci_controller *controller = bridge->bus->sysdata;\n+\tACPI_COMPANION_SET(&bridge->dev, controller->companion);\n+\n \treturn 0;\n }\n \ndiff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c\nindex afc9598e4349..5e5c6dd7ebe8 100644\n--- a/arch/powerpc/kernel/pci-common.c\n+++ b/arch/powerpc/kernel/pci-common.c\n@@ -771,14 +771,6 @@ int pci_proc_domain(struct pci_bus *bus)\n \treturn 1;\n }\n \n-int pcibios_root_bridge_prepare(struct pci_host_bridge *bridge)\n-{\n-\tif (ppc_md.pcibios_root_bridge_prepare)\n-\t\treturn ppc_md.pcibios_root_bridge_prepare(bridge);\n-\n-\treturn 0;\n-}\n-\n /* This header fixup will do the resource fixup for all devices as they are\n  * probed, but not for bridge ranges\n  */\n@@ -1612,6 +1604,7 @@ void pcibios_scan_phb(struct pci_controller *hose)\n \tpci_add_resource(&bridge->windows, &hose->busn);\n \n \tbridge->bus_add_device = ppc_md->pcibios_bus_add_device;\n+\tbridge->prepare = ppc_md->pcibios_root_bridge_prepare;\n \tbridge->dev.parent = hose->parent;\n \tbridge->sysdata = hose;\n \tbridge->busnr = hose->first_busno;\ndiff --git a/arch/x86/pci/acpi.c b/arch/x86/pci/acpi.c\nindex 5559dcaddd5e..041b2003707c 100644\n--- a/arch/x86/pci/acpi.c\n+++ b/arch/x86/pci/acpi.c\n@@ -382,18 +382,11 @@ struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root *root)\n \treturn bus;\n }\n \n-int pcibios_root_bridge_prepare(struct pci_host_bridge *bridge)\n+int acpi_pci_root_bridge_prepare(struct pci_host_bridge *bridge)\n {\n-\t/*\n-\t * We pass NULL as parent to pci_create_root_bus(), so if it is not NULL\n-\t * here, pci_create_root_bus() has been called by someone else and\n-\t * sysdata is likely to be different from what we expect.  Let it go in\n-\t * that case.\n-\t */\n-\tif (!bridge->dev.parent) {\n-\t\tstruct pci_sysdata *sd = bridge->bus->sysdata;\n-\t\tACPI_COMPANION_SET(&bridge->dev, sd->companion);\n-\t}\n+\tstruct pci_sysdata *sd = bridge->bus->sysdata;\n+\tACPI_COMPANION_SET(&bridge->dev, sd->companion);\n+\n \treturn 0;\n }\n \ndiff --git a/drivers/acpi/pci_root.c b/drivers/acpi/pci_root.c\nindex 5f73de3b67c8..5da0f70c4e65 100644\n--- a/drivers/acpi/pci_root.c\n+++ b/drivers/acpi/pci_root.c\n@@ -910,6 +910,7 @@ struct pci_bus *acpi_pci_root_create(struct acpi_pci_root *root,\n \tbridge->sysdata = sysdata;\n \tbridge->busnr = busnum;\n \tbridge->ops = ops->pci_ops;\n+\tbridge->prepare = acpi_pci_root_bridge_prepare;\n \tpci_set_host_bridge_release(bridge, acpi_pci_root_release_info,\n \t\t\t\t    info);\n \ndiff --git a/drivers/pci/probe.c b/drivers/pci/probe.c\nindex eaedb4fe143a..f493d7e299e6 100644\n--- a/drivers/pci/probe.c\n+++ b/drivers/pci/probe.c\n@@ -762,6 +762,22 @@ static void pci_set_bus_msi_domain(struct pci_bus *bus)\n \tdev_set_msi_domain(&bus->dev, d);\n }\n \n+/**\n+ * pcibios_root_bridge_prepare - Platform-specific host bridge setup\n+ * @bridge: Host bridge to set up\n+ *\n+ * Host bridge drivers can do some last minute fixups on the bridge\n+ * here. Usually this should be done before calling pci_register_host_bridge\n+ * though, so this hook can be removed.\n+ */\n+static int pcibios_root_bridge_prepare(struct pci_host_bridge *bridge)\n+{\n+\tif (bridge->prepare)\n+\t\treturn bridge->prepare(bridge);\n+\n+\treturn 0;\n+}\n+\n /*\n  * pci_register_host_bridge() - Register a host bridge without scanning\n  *\n@@ -2889,18 +2905,6 @@ unsigned int pci_scan_child_bus(struct pci_bus *bus)\n }\n EXPORT_SYMBOL_GPL(pci_scan_child_bus);\n \n-/**\n- * pcibios_root_bridge_prepare - Platform-specific host bridge setup\n- * @bridge: Host bridge to set up\n- *\n- * Default empty implementation.  Replace with an architecture-specific setup\n- * routine, if necessary.\n- */\n-int __weak pcibios_root_bridge_prepare(struct pci_host_bridge *bridge)\n-{\n-\treturn 0;\n-}\n-\n void __weak pcibios_add_bus(struct pci_bus *bus)\n {\n }\ndiff --git a/include/linux/acpi.h b/include/linux/acpi.h\nindex 9967ba2e0b31..62c0278a7614 100644\n--- a/include/linux/acpi.h\n+++ b/include/linux/acpi.h\n@@ -336,12 +336,14 @@ extern int acpi_get_override_irq(u32 gsi, int *trigger, int *polarity);\n void acpi_unregister_gsi (u32 gsi);\n \n struct pci_dev;\n+struct pci_host_bridge;\n \n int acpi_pci_irq_enable (struct pci_dev *dev);\n void acpi_penalize_isa_irq(int irq, int active);\n bool acpi_isa_irq_available(int irq);\n void acpi_penalize_sci_irq(int irq, int trigger, int polarity);\n void acpi_pci_irq_disable (struct pci_dev *dev);\n+int acpi_pci_root_bridge_prepare(struct pci_host_bridge *bridge);\n \n extern int ec_read(u8 addr, u8 *val);\n extern int ec_write(u8 addr, u8 val);\ndiff --git a/include/linux/pci.h b/include/linux/pci.h\nindex 1296d9fcc5da..24216daef6f8 100644\n--- a/include/linux/pci.h\n+++ b/include/linux/pci.h\n@@ -472,6 +472,7 @@ struct pci_host_bridge {\n \tvoid\t\t*sysdata;\n \tint\t\tbusnr;\n \tstruct list_head windows;\t/* resource_entry */\n+\tint (*prepare)(struct pci_host_bridge *bridge);\n \tu8 (*swizzle_irq)(struct pci_dev *, u8 *); /* Platform IRQ swizzler */\n \tint (*map_irq)(const struct pci_dev *, u8, u8);\n \tvoid (*release_fn)(struct pci_host_bridge *);\n@@ -518,8 +519,6 @@ void pci_set_host_bridge_release(struct pci_host_bridge *bridge,\n \t\t\t\t void (*release_fn)(struct pci_host_bridge *),\n \t\t\t\t void *release_data);\n \n-int pcibios_root_bridge_prepare(struct pci_host_bridge *bridge);\n-\n /*\n  * The first PCI_BRIDGE_RESOURCE_NUM PCI bus resources (those that correspond\n  * to P2P or CardBus bridge windows) go in a table.  Additional ones (for\n","prefixes":["RFC","14/15"]}