Merge tag 'pci-v5.19-fixes-1' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaa...
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 2 Jun 2022 19:11:25 +0000 (12:11 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 2 Jun 2022 19:11:25 +0000 (12:11 -0700)
Pull pci fixes from Bjorn Helgaas:

 - Revert brcmstb patches that broke booting on Raspberry Pi Compute
   Module 4 (Bjorn Helgaas)

 - Fix bridge_d3_blacklist[] error that overwrote the existing Gigabyte
   X299 entry instead of adding a new one (Bjorn Helgaas)

 - Update Lorenzo Pieralisi's email address in MAINTAINERS (Lorenzo
   Pieralisi)

* tag 'pci-v5.19-fixes-1' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci:
  MAINTAINERS: Update Lorenzo Pieralisi's email address
  PCI/PM: Fix bridge_d3_blacklist[] Elo i2 overwrite of Gigabyte X299
  Revert "PCI: brcmstb: Split brcm_pcie_setup() into two funcs"
  Revert "PCI: brcmstb: Add mechanism to turn on subdev regulators"
  Revert "PCI: brcmstb: Add control of subdevice voltage regulators"
  Revert "PCI: brcmstb: Do not turn off WOL regulators on suspend"

.mailmap
MAINTAINERS
drivers/pci/controller/pcie-brcmstb.c
drivers/pci/pci.c

index 6d48493..9ba38a8 100644 (file)
--- a/.mailmap
+++ b/.mailmap
@@ -236,6 +236,7 @@ Linus Lüssing <linus.luessing@c0d3.blue> <linus.luessing@web.de>
 <linux-hardening@vger.kernel.org> <kernel-hardening@lists.openwall.com>
 Li Yang <leoyang.li@nxp.com> <leoli@freescale.com>
 Li Yang <leoyang.li@nxp.com> <leo@zh-kernel.org>
+Lorenzo Pieralisi <lpieralisi@kernel.org> <lorenzo.pieralisi@arm.com>
 Lukasz Luba <lukasz.luba@arm.com> <l.luba@partner.samsung.com>
 Maciej W. Rozycki <macro@mips.com> <macro@imgtec.com>
 Maciej W. Rozycki <macro@orcam.me.uk> <macro@linux-mips.org>
index e0d19ca..033a01b 100644 (file)
@@ -382,7 +382,7 @@ F:  include/acpi/
 F:     tools/power/acpi/
 
 ACPI FOR ARM64 (ACPI/arm64)
-M:     Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
+M:     Lorenzo Pieralisi <lpieralisi@kernel.org>
 M:     Hanjun Guo <guohanjun@huawei.com>
 M:     Sudeep Holla <sudeep.holla@arm.com>
 L:     linux-acpi@vger.kernel.org
@@ -2940,7 +2940,7 @@ N:        uniphier
 ARM/VERSATILE EXPRESS PLATFORM
 M:     Liviu Dudau <liviu.dudau@arm.com>
 M:     Sudeep Holla <sudeep.holla@arm.com>
-M:     Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
+M:     Lorenzo Pieralisi <lpieralisi@kernel.org>
 L:     linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 S:     Maintained
 F:     */*/*/vexpress*
@@ -5156,7 +5156,7 @@ F:        arch/x86/kernel/cpuid.c
 F:     arch/x86/kernel/msr.c
 
 CPUIDLE DRIVER - ARM BIG LITTLE
-M:     Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
+M:     Lorenzo Pieralisi <lpieralisi@kernel.org>
 M:     Daniel Lezcano <daniel.lezcano@linaro.org>
 L:     linux-pm@vger.kernel.org
 L:     linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@@ -5176,7 +5176,7 @@ F:        drivers/cpuidle/cpuidle-exynos.c
 F:     include/linux/platform_data/cpuidle-exynos.h
 
 CPUIDLE DRIVER - ARM PSCI
-M:     Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
+M:     Lorenzo Pieralisi <lpieralisi@kernel.org>
 M:     Sudeep Holla <sudeep.holla@arm.com>
 L:     linux-pm@vger.kernel.org
 L:     linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@@ -15282,7 +15282,7 @@ F:      drivers/pci/controller/pci-v3-semi.c
 
 PCI ENDPOINT SUBSYSTEM
 M:     Kishon Vijay Abraham I <kishon@ti.com>
-M:     Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
+M:     Lorenzo Pieralisi <lpieralisi@kernel.org>
 R:     Krzysztof Wilczyński <kw@linux.com>
 L:     linux-pci@vger.kernel.org
 S:     Supported
@@ -15345,7 +15345,7 @@ F:      Documentation/devicetree/bindings/pci/xgene-pci-msi.txt
 F:     drivers/pci/controller/pci-xgene-msi.c
 
 PCI NATIVE HOST BRIDGE AND ENDPOINT DRIVERS
-M:     Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
+M:     Lorenzo Pieralisi <lpieralisi@kernel.org>
 R:     Rob Herring <robh@kernel.org>
 R:     Krzysztof Wilczyński <kw@linux.com>
 L:     linux-pci@vger.kernel.org
@@ -15898,7 +15898,7 @@ F:      include/linux/dtpm.h
 
 POWER STATE COORDINATION INTERFACE (PSCI)
 M:     Mark Rutland <mark.rutland@arm.com>
-M:     Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
+M:     Lorenzo Pieralisi <lpieralisi@kernel.org>
 L:     linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 S:     Maintained
 F:     drivers/firmware/psci/
@@ -18285,7 +18285,7 @@ F:      drivers/net/ethernet/smsc/smc91x.*
 
 SECURE MONITOR CALL(SMC) CALLING CONVENTION (SMCCC)
 M:     Mark Rutland <mark.rutland@arm.com>
-M:     Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
+M:     Lorenzo Pieralisi <lpieralisi@kernel.org>
 M:     Sudeep Holla <sudeep.holla@arm.com>
 L:     linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 S:     Maintained
index 375c0c4..e61058e 100644 (file)
@@ -24,7 +24,6 @@
 #include <linux/pci.h>
 #include <linux/pci-ecam.h>
 #include <linux/printk.h>
-#include <linux/regulator/consumer.h>
 #include <linux/reset.h>
 #include <linux/sizes.h>
 #include <linux/slab.h>
@@ -196,8 +195,6 @@ static inline void brcm_pcie_bridge_sw_init_set_generic(struct brcm_pcie *pcie,
 static inline void brcm_pcie_perst_set_4908(struct brcm_pcie *pcie, u32 val);
 static inline void brcm_pcie_perst_set_7278(struct brcm_pcie *pcie, u32 val);
 static inline void brcm_pcie_perst_set_generic(struct brcm_pcie *pcie, u32 val);
-static int brcm_pcie_linkup(struct brcm_pcie *pcie);
-static int brcm_pcie_add_bus(struct pci_bus *bus);
 
 enum {
        RGR1_SW_INIT_1,
@@ -286,14 +283,6 @@ static const struct pcie_cfg_data bcm2711_cfg = {
        .bridge_sw_init_set = brcm_pcie_bridge_sw_init_set_generic,
 };
 
-struct subdev_regulators {
-       unsigned int num_supplies;
-       struct regulator_bulk_data supplies[];
-};
-
-static int pci_subdev_regulators_add_bus(struct pci_bus *bus);
-static void pci_subdev_regulators_remove_bus(struct pci_bus *bus);
-
 struct brcm_msi {
        struct device           *dev;
        void __iomem            *base;
@@ -331,9 +320,6 @@ struct brcm_pcie {
        u32                     hw_rev;
        void                    (*perst_set)(struct brcm_pcie *pcie, u32 val);
        void                    (*bridge_sw_init_set)(struct brcm_pcie *pcie, u32 val);
-       bool                    refusal_mode;
-       struct subdev_regulators *sr;
-       bool                    ep_wakeup_capable;
 };
 
 static inline bool is_bmips(const struct brcm_pcie *pcie)
@@ -450,99 +436,6 @@ static int brcm_pcie_set_ssc(struct brcm_pcie *pcie)
        return ssc && pll ? 0 : -EIO;
 }
 
-static void *alloc_subdev_regulators(struct device *dev)
-{
-       static const char * const supplies[] = {
-               "vpcie3v3",
-               "vpcie3v3aux",
-               "vpcie12v",
-       };
-       const size_t size = sizeof(struct subdev_regulators)
-               + sizeof(struct regulator_bulk_data) * ARRAY_SIZE(supplies);
-       struct subdev_regulators *sr;
-       int i;
-
-       sr = devm_kzalloc(dev, size, GFP_KERNEL);
-       if (sr) {
-               sr->num_supplies = ARRAY_SIZE(supplies);
-               for (i = 0; i < ARRAY_SIZE(supplies); i++)
-                       sr->supplies[i].supply = supplies[i];
-       }
-
-       return sr;
-}
-
-static int pci_subdev_regulators_add_bus(struct pci_bus *bus)
-{
-       struct device *dev = &bus->dev;
-       struct subdev_regulators *sr;
-       int ret;
-
-       if (!dev->of_node || !bus->parent || !pci_is_root_bus(bus->parent))
-               return 0;
-
-       if (dev->driver_data)
-               dev_err(dev, "dev.driver_data unexpectedly non-NULL\n");
-
-       sr = alloc_subdev_regulators(dev);
-       if (!sr)
-               return -ENOMEM;
-
-       dev->driver_data = sr;
-       ret = regulator_bulk_get(dev, sr->num_supplies, sr->supplies);
-       if (ret)
-               return ret;
-
-       ret = regulator_bulk_enable(sr->num_supplies, sr->supplies);
-       if (ret) {
-               dev_err(dev, "failed to enable regulators for downstream device\n");
-               return ret;
-       }
-
-       return 0;
-}
-
-static int brcm_pcie_add_bus(struct pci_bus *bus)
-{
-       struct device *dev = &bus->dev;
-       struct brcm_pcie *pcie = (struct brcm_pcie *) bus->sysdata;
-       int ret;
-
-       if (!dev->of_node || !bus->parent || !pci_is_root_bus(bus->parent))
-               return 0;
-
-       ret = pci_subdev_regulators_add_bus(bus);
-       if (ret)
-               return ret;
-
-       /* Grab the regulators for suspend/resume */
-       pcie->sr = bus->dev.driver_data;
-
-       /*
-        * If we have failed linkup there is no point to return an error as
-        * currently it will cause a WARNING() from pci_alloc_child_bus().
-        * We return 0 and turn on the "refusal_mode" so that any further
-        * accesses to the pci_dev just get 0xffffffff
-        */
-       if (brcm_pcie_linkup(pcie) != 0)
-               pcie->refusal_mode = true;
-
-       return 0;
-}
-
-static void pci_subdev_regulators_remove_bus(struct pci_bus *bus)
-{
-       struct device *dev = &bus->dev;
-       struct subdev_regulators *sr = dev->driver_data;
-
-       if (!sr || !bus->parent || !pci_is_root_bus(bus->parent))
-               return;
-
-       if (regulator_bulk_disable(sr->num_supplies, sr->supplies))
-               dev_err(dev, "failed to disable regulators for downstream device\n");
-       dev->driver_data = NULL;
-}
-
 /* Limits operation to a specific generation (1, 2, or 3) */
 static void brcm_pcie_set_gen(struct brcm_pcie *pcie, int gen)
 {
@@ -858,18 +751,6 @@ static void __iomem *brcm_pcie_map_conf(struct pci_bus *bus, unsigned int devfn,
        /* Accesses to the RC go right to the RC registers if slot==0 */
        if (pci_is_root_bus(bus))
                return PCI_SLOT(devfn) ? NULL : base + where;
-       if (pcie->refusal_mode) {
-               /*
-                * At this point we do not have link.  There will be a CPU
-                * abort -- a quirk with this controller --if Linux tries
-                * to read any config-space registers besides those
-                * targeting the host bridge.  To prevent this we hijack
-                * the address to point to a safe access that will return
-                * 0xffffffff.
-                */
-               writel(0xffffffff, base + PCIE_MISC_RC_BAR2_CONFIG_HI);
-               return base + PCIE_MISC_RC_BAR2_CONFIG_HI + (where & 0x3);
-       }
 
        /* For devices, write to the config space index register */
        idx = PCIE_ECAM_OFFSET(bus->number, devfn, 0);
@@ -898,8 +779,6 @@ static struct pci_ops brcm_pcie_ops = {
        .map_bus = brcm_pcie_map_conf,
        .read = pci_generic_config_read,
        .write = pci_generic_config_write,
-       .add_bus = brcm_pcie_add_bus,
-       .remove_bus = pci_subdev_regulators_remove_bus,
 };
 
 static struct pci_ops brcm_pcie_ops32 = {
@@ -1047,9 +926,16 @@ static inline int brcm_pcie_get_rc_bar2_size_and_offset(struct brcm_pcie *pcie,
 
 static int brcm_pcie_setup(struct brcm_pcie *pcie)
 {
+       struct pci_host_bridge *bridge = pci_host_bridge_from_priv(pcie);
        u64 rc_bar2_offset, rc_bar2_size;
        void __iomem *base = pcie->base;
-       int ret, memc;
+       struct device *dev = pcie->dev;
+       struct resource_entry *entry;
+       bool ssc_good = false;
+       struct resource *res;
+       int num_out_wins = 0;
+       u16 nlw, cls, lnksta;
+       int i, ret, memc;
        u32 tmp, burst, aspm_support;
 
        /* Reset the bridge */
@@ -1139,40 +1025,6 @@ static int brcm_pcie_setup(struct brcm_pcie *pcie)
        if (pcie->gen)
                brcm_pcie_set_gen(pcie, pcie->gen);
 
-       /* Don't advertise L0s capability if 'aspm-no-l0s' */
-       aspm_support = PCIE_LINK_STATE_L1;
-       if (!of_property_read_bool(pcie->np, "aspm-no-l0s"))
-               aspm_support |= PCIE_LINK_STATE_L0S;
-       tmp = readl(base + PCIE_RC_CFG_PRIV1_LINK_CAPABILITY);
-       u32p_replace_bits(&tmp, aspm_support,
-               PCIE_RC_CFG_PRIV1_LINK_CAPABILITY_ASPM_SUPPORT_MASK);
-       writel(tmp, base + PCIE_RC_CFG_PRIV1_LINK_CAPABILITY);
-
-       /*
-        * For config space accesses on the RC, show the right class for
-        * a PCIe-PCIe bridge (the default setting is to be EP mode).
-        */
-       tmp = readl(base + PCIE_RC_CFG_PRIV1_ID_VAL3);
-       u32p_replace_bits(&tmp, 0x060400,
-                         PCIE_RC_CFG_PRIV1_ID_VAL3_CLASS_CODE_MASK);
-       writel(tmp, base + PCIE_RC_CFG_PRIV1_ID_VAL3);
-
-       return 0;
-}
-
-static int brcm_pcie_linkup(struct brcm_pcie *pcie)
-{
-       struct pci_host_bridge *bridge = pci_host_bridge_from_priv(pcie);
-       struct device *dev = pcie->dev;
-       void __iomem *base = pcie->base;
-       struct resource_entry *entry;
-       struct resource *res;
-       int num_out_wins = 0;
-       u16 nlw, cls, lnksta;
-       bool ssc_good = false;
-       u32 tmp;
-       int ret, i;
-
        /* Unassert the fundamental reset */
        pcie->perst_set(pcie, 0);
 
@@ -1223,6 +1075,24 @@ static int brcm_pcie_linkup(struct brcm_pcie *pcie)
                num_out_wins++;
        }
 
+       /* Don't advertise L0s capability if 'aspm-no-l0s' */
+       aspm_support = PCIE_LINK_STATE_L1;
+       if (!of_property_read_bool(pcie->np, "aspm-no-l0s"))
+               aspm_support |= PCIE_LINK_STATE_L0S;
+       tmp = readl(base + PCIE_RC_CFG_PRIV1_LINK_CAPABILITY);
+       u32p_replace_bits(&tmp, aspm_support,
+               PCIE_RC_CFG_PRIV1_LINK_CAPABILITY_ASPM_SUPPORT_MASK);
+       writel(tmp, base + PCIE_RC_CFG_PRIV1_LINK_CAPABILITY);
+
+       /*
+        * For config space accesses on the RC, show the right class for
+        * a PCIe-PCIe bridge (the default setting is to be EP mode).
+        */
+       tmp = readl(base + PCIE_RC_CFG_PRIV1_ID_VAL3);
+       u32p_replace_bits(&tmp, 0x060400,
+                         PCIE_RC_CFG_PRIV1_ID_VAL3_CLASS_CODE_MASK);
+       writel(tmp, base + PCIE_RC_CFG_PRIV1_ID_VAL3);
+
        if (pcie->ssc) {
                ret = brcm_pcie_set_ssc(pcie);
                if (ret == 0)
@@ -1351,21 +1221,9 @@ static void brcm_pcie_turn_off(struct brcm_pcie *pcie)
        pcie->bridge_sw_init_set(pcie, 1);
 }
 
-static int pci_dev_may_wakeup(struct pci_dev *dev, void *data)
-{
-       bool *ret = data;
-
-       if (device_may_wakeup(&dev->dev)) {
-               *ret = true;
-               dev_info(&dev->dev, "disable cancelled for wake-up device\n");
-       }
-       return (int) *ret;
-}
-
 static int brcm_pcie_suspend(struct device *dev)
 {
        struct brcm_pcie *pcie = dev_get_drvdata(dev);
-       struct pci_host_bridge *bridge = pci_host_bridge_from_priv(pcie);
        int ret;
 
        brcm_pcie_turn_off(pcie);
@@ -1383,25 +1241,6 @@ static int brcm_pcie_suspend(struct device *dev)
                return ret;
        }
 
-       if (pcie->sr) {
-               /*
-                * Now turn off the regulators, but if at least one
-                * downstream device is enabled as a wake-up source, do not
-                * turn off regulators.
-                */
-               pcie->ep_wakeup_capable = false;
-               pci_walk_bus(bridge->bus, pci_dev_may_wakeup,
-                            &pcie->ep_wakeup_capable);
-               if (!pcie->ep_wakeup_capable) {
-                       ret = regulator_bulk_disable(pcie->sr->num_supplies,
-                                                    pcie->sr->supplies);
-                       if (ret) {
-                               dev_err(dev, "Could not turn off regulators\n");
-                               reset_control_reset(pcie->rescal);
-                               return ret;
-                       }
-               }
-       }
        clk_disable_unprepare(pcie->clk);
 
        return 0;
@@ -1419,28 +1258,9 @@ static int brcm_pcie_resume(struct device *dev)
        if (ret)
                return ret;
 
-       if (pcie->sr) {
-               if (pcie->ep_wakeup_capable) {
-                       /*
-                        * We are resuming from a suspend.  In the suspend we
-                        * did not disable the power supplies, so there is
-                        * no need to enable them (and falsely increase their
-                        * usage count).
-                        */
-                       pcie->ep_wakeup_capable = false;
-               } else {
-                       ret = regulator_bulk_enable(pcie->sr->num_supplies,
-                                                   pcie->sr->supplies);
-                       if (ret) {
-                               dev_err(dev, "Could not turn on regulators\n");
-                               goto err_disable_clk;
-                       }
-               }
-       }
-
        ret = reset_control_reset(pcie->rescal);
        if (ret)
-               goto err_regulator;
+               goto err_disable_clk;
 
        ret = brcm_phy_start(pcie);
        if (ret)
@@ -1461,10 +1281,6 @@ static int brcm_pcie_resume(struct device *dev)
        if (ret)
                goto err_reset;
 
-       ret = brcm_pcie_linkup(pcie);
-       if (ret)
-               goto err_reset;
-
        if (pcie->msi)
                brcm_msi_set_regs(pcie->msi);
 
@@ -1472,9 +1288,6 @@ static int brcm_pcie_resume(struct device *dev)
 
 err_reset:
        reset_control_rearm(pcie->rescal);
-err_regulator:
-       if (pcie->sr)
-               regulator_bulk_disable(pcie->sr->num_supplies, pcie->sr->supplies);
 err_disable_clk:
        clk_disable_unprepare(pcie->clk);
        return ret;
@@ -1606,17 +1419,7 @@ static int brcm_pcie_probe(struct platform_device *pdev)
 
        platform_set_drvdata(pdev, pcie);
 
-       ret = pci_host_probe(bridge);
-       if (!ret && !brcm_pcie_link_up(pcie))
-               ret = -ENODEV;
-
-       if (ret) {
-               brcm_pcie_remove(pdev);
-               return ret;
-       }
-
-       return 0;
-
+       return pci_host_probe(bridge);
 fail:
        __brcm_pcie_remove(pcie);
        return ret;
@@ -1625,8 +1428,8 @@ fail:
 MODULE_DEVICE_TABLE(of, brcm_pcie_match);
 
 static const struct dev_pm_ops brcm_pcie_pm_ops = {
-       .suspend_noirq = brcm_pcie_suspend,
-       .resume_noirq = brcm_pcie_resume,
+       .suspend = brcm_pcie_suspend,
+       .resume = brcm_pcie_resume,
 };
 
 static struct platform_driver brcm_pcie_driver = {
index 8761828..cfaf40a 100644 (file)
@@ -2967,6 +2967,8 @@ static const struct dmi_system_id bridge_d3_blacklist[] = {
                        DMI_MATCH(DMI_BOARD_VENDOR, "Gigabyte Technology Co., Ltd."),
                        DMI_MATCH(DMI_BOARD_NAME, "X299 DESIGNARE EX-CF"),
                },
+       },
+       {
                /*
                 * Downstream device is not accessible after putting a root port
                 * into D3cold and back into D0 on Elo i2.