Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/958754/?format=api
{ "id": 958754, "url": "http://patchwork.ozlabs.org/api/patches/958754/?format=api", "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=api", "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=api", "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=api", "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" ] }