From faf172875ef1ddbd6c365512a3fbab0d8b44ee83 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Rafa=C5=82=20Mi=C5=82ecki?= Date: Fri, 1 Apr 2016 16:49:50 +0000 Subject: [PATCH] bcm53xx: use the final fix for iproc bcma regression MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Rafał Miłecki SVN-Revision: 49114 --- ...low-multiple-devices-except-on-PAXC.patch} | 38 +++++---- ...ix-BCMA-PCIe-bus-scanning-regression.patch | 51 ------------ ...llow-multiple-devices-except-on-PAXC.patch | 83 +++++++++++++++++++ ...llow-multiple-devices-except-on-PAXC.patch | 83 +++++++++++++++++++ 4 files changed, 190 insertions(+), 65 deletions(-) rename target/linux/bcm53xx/{patches-4.4/088-PCI-iproc-Fix-BCMA-PCIe-bus-scanning-regression.patch => patches-4.1/041-PCI-iproc-Allow-multiple-devices-except-on-PAXC.patch} (54%) delete mode 100644 target/linux/bcm53xx/patches-4.1/175-PCI-iproc-Fix-BCMA-PCIe-bus-scanning-regression.patch create mode 100644 target/linux/bcm53xx/patches-4.3/154-PCI-iproc-Allow-multiple-devices-except-on-PAXC.patch create mode 100644 target/linux/bcm53xx/patches-4.4/088-PCI-iproc-Allow-multiple-devices-except-on-PAXC.patch diff --git a/target/linux/bcm53xx/patches-4.4/088-PCI-iproc-Fix-BCMA-PCIe-bus-scanning-regression.patch b/target/linux/bcm53xx/patches-4.1/041-PCI-iproc-Allow-multiple-devices-except-on-PAXC.patch similarity index 54% rename from target/linux/bcm53xx/patches-4.4/088-PCI-iproc-Fix-BCMA-PCIe-bus-scanning-regression.patch rename to target/linux/bcm53xx/patches-4.1/041-PCI-iproc-Allow-multiple-devices-except-on-PAXC.patch index d35287f725..1955c01806 100644 --- a/target/linux/bcm53xx/patches-4.4/088-PCI-iproc-Fix-BCMA-PCIe-bus-scanning-regression.patch +++ b/target/linux/bcm53xx/patches-4.1/041-PCI-iproc-Allow-multiple-devices-except-on-PAXC.patch @@ -1,26 +1,36 @@ -From c43e4b52cbf2267047f67c9f65de18ee1ab8bfa2 Mon Sep 17 00:00:00 2001 +From 46560388c476c8471fde7712c10f9fad8d0d1875 Mon Sep 17 00:00:00 2001 From: Ray Jui Date: Wed, 27 Jan 2016 16:52:24 -0600 -Subject: [PATCH] PCI: iproc: Fix BCMA PCIe bus scanning regression +Subject: [PATCH] PCI: iproc: Allow multiple devices except on PAXC -Commit 943ebae781f5 ("PCI: iproc: Add PAXC interface support") causes -regression on EP device detection on BCMA based platforms. +Commit 943ebae781f5 ("PCI: iproc: Add PAXC interface support") only allowed +device 0, which is a regression on BCMA-based platforms. -Fix the issue by allowing multiple devices to be configured on the same -bus, for all PAXB based child buses. In addition, add a check to prevent -non-zero function from being used on bus 0 (root bus). +All systems support only one device, a Root Port at 00:00.0, on the root +bus. PAXC-based systems support only the Root Port (00:00.0) and a single +device (with multiple functions) below it, e.g., 01:00.0, 01:00.1, etc. +Non-PAXC systems support arbitrary devices below the Root Port. +[bhelgaas: changelog, fold in removal of MAX_NUM_PAXC_PF check] Fixes: 943ebae781f5 ("PCI: iproc: Add PAXC interface support") Reported-by: Rafal Milecki Signed-off-by: Ray Jui Signed-off-by: Bjorn Helgaas --- - drivers/pci/host/pcie-iproc.c | 28 +++++++++++----------------- - 1 file changed, 11 insertions(+), 17 deletions(-) + drivers/pci/host/pcie-iproc.c | 29 +++++++++++------------------ + 1 file changed, 11 insertions(+), 18 deletions(-) --- a/drivers/pci/host/pcie-iproc.c +++ b/drivers/pci/host/pcie-iproc.c -@@ -170,20 +170,6 @@ static inline void iproc_pcie_ob_write(s +@@ -64,7 +64,6 @@ + #define OARR_SIZE_CFG BIT(OARR_SIZE_CFG_SHIFT) + + #define MAX_NUM_OB_WINDOWS 2 +-#define MAX_NUM_PAXC_PF 4 + + #define IPROC_PCIE_REG_INVALID 0xffff + +@@ -170,20 +169,6 @@ static inline void iproc_pcie_ob_write(struct iproc_pcie *pcie, writel(val, pcie->base + offset + (window * 8)); } @@ -41,7 +51,7 @@ Signed-off-by: Bjorn Helgaas /** * Note access to the configuration registers are protected at the higher layer * by 'pci_lock' in drivers/pci/access.c -@@ -199,11 +185,11 @@ static void __iomem *iproc_pcie_map_cfg_ +@@ -199,11 +184,11 @@ static void __iomem *iproc_pcie_map_cfg_bus(struct pci_bus *bus, u32 val; u16 offset; @@ -56,16 +66,16 @@ Signed-off-by: Bjorn Helgaas iproc_pcie_write_reg(pcie, IPROC_PCIE_CFG_IND_ADDR, where & CFG_IND_ADDR_MASK); offset = iproc_pcie_reg_offset(pcie, IPROC_PCIE_CFG_IND_DATA); -@@ -213,6 +199,14 @@ static void __iomem *iproc_pcie_map_cfg_ +@@ -213,6 +198,14 @@ static void __iomem *iproc_pcie_map_cfg_bus(struct pci_bus *bus, return (pcie->base + offset); } + /* + * PAXC is connected to an internally emulated EP within the SoC. It -+ * allows only one device and supports a limited number of functions. ++ * allows only one device. + */ + if (pcie->type == IPROC_PCIE_PAXC) -+ if (slot > 0 || fn >= MAX_NUM_PAXC_PF) ++ if (slot > 0) + return NULL; + /* EP device access */ diff --git a/target/linux/bcm53xx/patches-4.1/175-PCI-iproc-Fix-BCMA-PCIe-bus-scanning-regression.patch b/target/linux/bcm53xx/patches-4.1/175-PCI-iproc-Fix-BCMA-PCIe-bus-scanning-regression.patch deleted file mode 100644 index 21c7716846..0000000000 --- a/target/linux/bcm53xx/patches-4.1/175-PCI-iproc-Fix-BCMA-PCIe-bus-scanning-regression.patch +++ /dev/null @@ -1,51 +0,0 @@ -From patchwork Wed Jan 20 22:55:10 2016 -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: 7bit -Subject: PCI: iproc: Fix BCMA PCIe bus scanning regression -From: Ray Jui -X-Patchwork-Id: 570953 -Message-Id: <1453330510-21926-1-git-send-email-rjui@broadcom.com> -To: Bjorn Helgaas -Cc: Rafal Milecki , Hante Meuleman , - Hauke Mehrtens , , - , - , Ray Jui -Date: Wed, 20 Jan 2016 14:55:10 -0800 - -Commit 943ebae781f5 ("PCI: iproc: Add PAXC interface support") causes -regression on EP device detection on BCMA based platforms. This patch -fixes the issue by allowing multiple devices to be configured on the -same bus, for all PAXB based child buses - -Reported-by: Rafal Milecki -Fixes: 943ebae781f5 ("PCI: iproc: Add PAXC interface support") -Signed-off-by: Ray Jui ---- - drivers/pci/host/pcie-iproc.c | 5 +++-- - 1 file changed, 3 insertions(+), 2 deletions(-) - ---- a/drivers/pci/host/pcie-iproc.c -+++ b/drivers/pci/host/pcie-iproc.c -@@ -171,10 +171,11 @@ static inline void iproc_pcie_ob_write(s - } - - static inline bool iproc_pcie_device_is_valid(struct iproc_pcie *pcie, -+ unsigned int busnum, - unsigned int slot, - unsigned int fn) - { -- if (slot > 0) -+ if ((pcie->type == IPROC_PCIE_PAXC || busnum == 0) && slot > 0) - return false; - - /* PAXC can only support limited number of functions */ -@@ -199,7 +200,7 @@ static void __iomem *iproc_pcie_map_cfg_ - u32 val; - u16 offset; - -- if (!iproc_pcie_device_is_valid(pcie, slot, fn)) -+ if (!iproc_pcie_device_is_valid(pcie, busno, slot, fn)) - return NULL; - - /* root complex access */ diff --git a/target/linux/bcm53xx/patches-4.3/154-PCI-iproc-Allow-multiple-devices-except-on-PAXC.patch b/target/linux/bcm53xx/patches-4.3/154-PCI-iproc-Allow-multiple-devices-except-on-PAXC.patch new file mode 100644 index 0000000000..1955c01806 --- /dev/null +++ b/target/linux/bcm53xx/patches-4.3/154-PCI-iproc-Allow-multiple-devices-except-on-PAXC.patch @@ -0,0 +1,83 @@ +From 46560388c476c8471fde7712c10f9fad8d0d1875 Mon Sep 17 00:00:00 2001 +From: Ray Jui +Date: Wed, 27 Jan 2016 16:52:24 -0600 +Subject: [PATCH] PCI: iproc: Allow multiple devices except on PAXC + +Commit 943ebae781f5 ("PCI: iproc: Add PAXC interface support") only allowed +device 0, which is a regression on BCMA-based platforms. + +All systems support only one device, a Root Port at 00:00.0, on the root +bus. PAXC-based systems support only the Root Port (00:00.0) and a single +device (with multiple functions) below it, e.g., 01:00.0, 01:00.1, etc. +Non-PAXC systems support arbitrary devices below the Root Port. + +[bhelgaas: changelog, fold in removal of MAX_NUM_PAXC_PF check] +Fixes: 943ebae781f5 ("PCI: iproc: Add PAXC interface support") +Reported-by: Rafal Milecki +Signed-off-by: Ray Jui +Signed-off-by: Bjorn Helgaas +--- + drivers/pci/host/pcie-iproc.c | 29 +++++++++++------------------ + 1 file changed, 11 insertions(+), 18 deletions(-) + +--- a/drivers/pci/host/pcie-iproc.c ++++ b/drivers/pci/host/pcie-iproc.c +@@ -64,7 +64,6 @@ + #define OARR_SIZE_CFG BIT(OARR_SIZE_CFG_SHIFT) + + #define MAX_NUM_OB_WINDOWS 2 +-#define MAX_NUM_PAXC_PF 4 + + #define IPROC_PCIE_REG_INVALID 0xffff + +@@ -170,20 +169,6 @@ static inline void iproc_pcie_ob_write(struct iproc_pcie *pcie, + writel(val, pcie->base + offset + (window * 8)); + } + +-static inline bool iproc_pcie_device_is_valid(struct iproc_pcie *pcie, +- unsigned int slot, +- unsigned int fn) +-{ +- if (slot > 0) +- return false; +- +- /* PAXC can only support limited number of functions */ +- if (pcie->type == IPROC_PCIE_PAXC && fn >= MAX_NUM_PAXC_PF) +- return false; +- +- return true; +-} +- + /** + * Note access to the configuration registers are protected at the higher layer + * by 'pci_lock' in drivers/pci/access.c +@@ -199,11 +184,11 @@ static void __iomem *iproc_pcie_map_cfg_bus(struct pci_bus *bus, + u32 val; + u16 offset; + +- if (!iproc_pcie_device_is_valid(pcie, slot, fn)) +- return NULL; +- + /* root complex access */ + if (busno == 0) { ++ if (slot > 0 || fn > 0) ++ return NULL; ++ + iproc_pcie_write_reg(pcie, IPROC_PCIE_CFG_IND_ADDR, + where & CFG_IND_ADDR_MASK); + offset = iproc_pcie_reg_offset(pcie, IPROC_PCIE_CFG_IND_DATA); +@@ -213,6 +198,14 @@ static void __iomem *iproc_pcie_map_cfg_bus(struct pci_bus *bus, + return (pcie->base + offset); + } + ++ /* ++ * PAXC is connected to an internally emulated EP within the SoC. It ++ * allows only one device. ++ */ ++ if (pcie->type == IPROC_PCIE_PAXC) ++ if (slot > 0) ++ return NULL; ++ + /* EP device access */ + val = (busno << CFG_ADDR_BUS_NUM_SHIFT) | + (slot << CFG_ADDR_DEV_NUM_SHIFT) | diff --git a/target/linux/bcm53xx/patches-4.4/088-PCI-iproc-Allow-multiple-devices-except-on-PAXC.patch b/target/linux/bcm53xx/patches-4.4/088-PCI-iproc-Allow-multiple-devices-except-on-PAXC.patch new file mode 100644 index 0000000000..1955c01806 --- /dev/null +++ b/target/linux/bcm53xx/patches-4.4/088-PCI-iproc-Allow-multiple-devices-except-on-PAXC.patch @@ -0,0 +1,83 @@ +From 46560388c476c8471fde7712c10f9fad8d0d1875 Mon Sep 17 00:00:00 2001 +From: Ray Jui +Date: Wed, 27 Jan 2016 16:52:24 -0600 +Subject: [PATCH] PCI: iproc: Allow multiple devices except on PAXC + +Commit 943ebae781f5 ("PCI: iproc: Add PAXC interface support") only allowed +device 0, which is a regression on BCMA-based platforms. + +All systems support only one device, a Root Port at 00:00.0, on the root +bus. PAXC-based systems support only the Root Port (00:00.0) and a single +device (with multiple functions) below it, e.g., 01:00.0, 01:00.1, etc. +Non-PAXC systems support arbitrary devices below the Root Port. + +[bhelgaas: changelog, fold in removal of MAX_NUM_PAXC_PF check] +Fixes: 943ebae781f5 ("PCI: iproc: Add PAXC interface support") +Reported-by: Rafal Milecki +Signed-off-by: Ray Jui +Signed-off-by: Bjorn Helgaas +--- + drivers/pci/host/pcie-iproc.c | 29 +++++++++++------------------ + 1 file changed, 11 insertions(+), 18 deletions(-) + +--- a/drivers/pci/host/pcie-iproc.c ++++ b/drivers/pci/host/pcie-iproc.c +@@ -64,7 +64,6 @@ + #define OARR_SIZE_CFG BIT(OARR_SIZE_CFG_SHIFT) + + #define MAX_NUM_OB_WINDOWS 2 +-#define MAX_NUM_PAXC_PF 4 + + #define IPROC_PCIE_REG_INVALID 0xffff + +@@ -170,20 +169,6 @@ static inline void iproc_pcie_ob_write(struct iproc_pcie *pcie, + writel(val, pcie->base + offset + (window * 8)); + } + +-static inline bool iproc_pcie_device_is_valid(struct iproc_pcie *pcie, +- unsigned int slot, +- unsigned int fn) +-{ +- if (slot > 0) +- return false; +- +- /* PAXC can only support limited number of functions */ +- if (pcie->type == IPROC_PCIE_PAXC && fn >= MAX_NUM_PAXC_PF) +- return false; +- +- return true; +-} +- + /** + * Note access to the configuration registers are protected at the higher layer + * by 'pci_lock' in drivers/pci/access.c +@@ -199,11 +184,11 @@ static void __iomem *iproc_pcie_map_cfg_bus(struct pci_bus *bus, + u32 val; + u16 offset; + +- if (!iproc_pcie_device_is_valid(pcie, slot, fn)) +- return NULL; +- + /* root complex access */ + if (busno == 0) { ++ if (slot > 0 || fn > 0) ++ return NULL; ++ + iproc_pcie_write_reg(pcie, IPROC_PCIE_CFG_IND_ADDR, + where & CFG_IND_ADDR_MASK); + offset = iproc_pcie_reg_offset(pcie, IPROC_PCIE_CFG_IND_DATA); +@@ -213,6 +198,14 @@ static void __iomem *iproc_pcie_map_cfg_bus(struct pci_bus *bus, + return (pcie->base + offset); + } + ++ /* ++ * PAXC is connected to an internally emulated EP within the SoC. It ++ * allows only one device. ++ */ ++ if (pcie->type == IPROC_PCIE_PAXC) ++ if (slot > 0) ++ return NULL; ++ + /* EP device access */ + val = (busno << CFG_ADDR_BUS_NUM_SHIFT) | + (slot << CFG_ADDR_DEV_NUM_SHIFT) | -- 2.25.1