bcm53xx: use the final fix for iproc bcma regression
Signed-off-by: Rafał Miłecki <zajec5@gmail.com> SVN-Revision: 49114
This commit is contained in:
parent
970dc268e7
commit
faf172875e
4 changed files with 190 additions and 65 deletions
|
@ -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 <rjui@broadcom.com>
|
From: Ray Jui <rjui@broadcom.com>
|
||||||
Date: Wed, 27 Jan 2016 16:52:24 -0600
|
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
|
Commit 943ebae781f5 ("PCI: iproc: Add PAXC interface support") only allowed
|
||||||
regression on EP device detection on BCMA based platforms.
|
device 0, which is a regression on BCMA-based platforms.
|
||||||
|
|
||||||
Fix the issue by allowing multiple devices to be configured on the same
|
All systems support only one device, a Root Port at 00:00.0, on the root
|
||||||
bus, for all PAXB based child buses. In addition, add a check to prevent
|
bus. PAXC-based systems support only the Root Port (00:00.0) and a single
|
||||||
non-zero function from being used on bus 0 (root bus).
|
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")
|
Fixes: 943ebae781f5 ("PCI: iproc: Add PAXC interface support")
|
||||||
Reported-by: Rafal Milecki <zajec5@gmail.com>
|
Reported-by: Rafal Milecki <zajec5@gmail.com>
|
||||||
Signed-off-by: Ray Jui <rjui@broadcom.com>
|
Signed-off-by: Ray Jui <rjui@broadcom.com>
|
||||||
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
|
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
|
||||||
---
|
---
|
||||||
drivers/pci/host/pcie-iproc.c | 28 +++++++++++-----------------
|
drivers/pci/host/pcie-iproc.c | 29 +++++++++++------------------
|
||||||
1 file changed, 11 insertions(+), 17 deletions(-)
|
1 file changed, 11 insertions(+), 18 deletions(-)
|
||||||
|
|
||||||
--- a/drivers/pci/host/pcie-iproc.c
|
--- a/drivers/pci/host/pcie-iproc.c
|
||||||
+++ b/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));
|
writel(val, pcie->base + offset + (window * 8));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -41,7 +51,7 @@ Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
|
||||||
/**
|
/**
|
||||||
* Note access to the configuration registers are protected at the higher layer
|
* Note access to the configuration registers are protected at the higher layer
|
||||||
* by 'pci_lock' in drivers/pci/access.c
|
* 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;
|
u32 val;
|
||||||
u16 offset;
|
u16 offset;
|
||||||
|
|
||||||
|
@ -56,16 +66,16 @@ Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
|
||||||
iproc_pcie_write_reg(pcie, IPROC_PCIE_CFG_IND_ADDR,
|
iproc_pcie_write_reg(pcie, IPROC_PCIE_CFG_IND_ADDR,
|
||||||
where & CFG_IND_ADDR_MASK);
|
where & CFG_IND_ADDR_MASK);
|
||||||
offset = iproc_pcie_reg_offset(pcie, IPROC_PCIE_CFG_IND_DATA);
|
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);
|
return (pcie->base + offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
+ /*
|
+ /*
|
||||||
+ * PAXC is connected to an internally emulated EP within the SoC. It
|
+ * 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 (pcie->type == IPROC_PCIE_PAXC)
|
||||||
+ if (slot > 0 || fn >= MAX_NUM_PAXC_PF)
|
+ if (slot > 0)
|
||||||
+ return NULL;
|
+ return NULL;
|
||||||
+
|
+
|
||||||
/* EP device access */
|
/* EP device access */
|
|
@ -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 <rjui@broadcom.com>
|
|
||||||
X-Patchwork-Id: 570953
|
|
||||||
Message-Id: <1453330510-21926-1-git-send-email-rjui@broadcom.com>
|
|
||||||
To: Bjorn Helgaas <bhelgaas@google.com>
|
|
||||||
Cc: Rafal Milecki <zajec5@gmail.com>, Hante Meuleman <meuleman@broadcom.com>,
|
|
||||||
Hauke Mehrtens <hauke@hauke-m.de>, <linux-kernel@vger.kernel.org>,
|
|
||||||
<bcm-kernel-feedback-list@broadcom.com>,
|
|
||||||
<linux-pci@vger.kernel.org>, Ray Jui <rjui@broadcom.com>
|
|
||||||
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 <zajec5@gmail.com>
|
|
||||||
Fixes: 943ebae781f5 ("PCI: iproc: Add PAXC interface support")
|
|
||||||
Signed-off-by: Ray Jui <rjui@broadcom.com>
|
|
||||||
---
|
|
||||||
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 */
|
|
|
@ -0,0 +1,83 @@
|
||||||
|
From 46560388c476c8471fde7712c10f9fad8d0d1875 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ray Jui <rjui@broadcom.com>
|
||||||
|
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 <zajec5@gmail.com>
|
||||||
|
Signed-off-by: Ray Jui <rjui@broadcom.com>
|
||||||
|
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
|
||||||
|
---
|
||||||
|
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) |
|
|
@ -0,0 +1,83 @@
|
||||||
|
From 46560388c476c8471fde7712c10f9fad8d0d1875 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ray Jui <rjui@broadcom.com>
|
||||||
|
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 <zajec5@gmail.com>
|
||||||
|
Signed-off-by: Ray Jui <rjui@broadcom.com>
|
||||||
|
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
|
||||||
|
---
|
||||||
|
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) |
|
Loading…
Reference in a new issue