Bläddra i källkod

bcm53xx: use the final fix for iproc bcma regression

Signed-off-by: Rafał Miłecki <[email protected]>

SVN-Revision: 49114
Rafał Miłecki 9 år sedan
förälder
incheckning
faf172875e

+ 24 - 14
target/linux/bcm53xx/patches-4.4/088-PCI-iproc-Fix-BCMA-PCIe-bus-scanning-regression.patch → 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 <[email protected]>
 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 <[email protected]>
 Signed-off-by: Ray Jui <[email protected]>
 Signed-off-by: Bjorn Helgaas <[email protected]>
 ---
- 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 <[email protected]>
  /**
   * 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 <[email protected]>
  		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 */

+ 0 - 51
target/linux/bcm53xx/patches-4.1/175-PCI-iproc-Fix-BCMA-PCIe-bus-scanning-regression.patch

@@ -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 <[email protected]>
-X-Patchwork-Id: 570953
-Message-Id: <[email protected]>
-To: Bjorn Helgaas <[email protected]>
-Cc: Rafal Milecki <[email protected]>, Hante Meuleman <[email protected]>, 
- Hauke Mehrtens <[email protected]>, <[email protected]>,
- <[email protected]>,
- <[email protected]>, Ray Jui <[email protected]>
-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 <[email protected]>
-Fixes: 943ebae781f5 ("PCI: iproc: Add PAXC interface support")
-Signed-off-by: Ray Jui <[email protected]>
----
- 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 */

+ 83 - 0
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 <[email protected]>
+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 <[email protected]>
+Signed-off-by: Ray Jui <[email protected]>
+Signed-off-by: Bjorn Helgaas <[email protected]>
+---
+ 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) |

+ 83 - 0
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 <[email protected]>
+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 <[email protected]>
+Signed-off-by: Ray Jui <[email protected]>
+Signed-off-by: Bjorn Helgaas <[email protected]>
+---
+ 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) |