Commit fdaa3725 authored by Pali Rohár's avatar Pali Rohár Committed by Gregory CLEMENT

ARM: Marvell: Update PCIe fixup

- The code relies on rc_pci_fixup being called, which only happens
  when CONFIG_PCI_QUIRKS is enabled, so add that to Kconfig. Omitting
  this causes a booting failure with a non-obvious cause.
- Update rc_pci_fixup to set the class properly, copying the
  more modern style from other places
- Correct the rc_pci_fixup comment

This patch just re-applies commit 1dc831bf ("ARM: Kirkwood: Update
PCI-E fixup") for all other Marvell ARM platforms which have same buggy
PCIe controller and do not use pci-mvebu.c controller driver yet.

Long-term goal for these Marvell ARM platforms should be conversion to
pci-mvebu.c controller driver and removal of these fixups in arch code.
Signed-off-by: default avatarPali Rohár <pali@kernel.org>
Cc: Jason Gunthorpe <jgg@nvidia.com>
Cc: stable@vger.kernel.org
Signed-off-by: default avatarGregory CLEMENT <gregory.clement@bootlin.com>
parent f2906aa8
...@@ -8,6 +8,7 @@ menuconfig ARCH_DOVE ...@@ -8,6 +8,7 @@ menuconfig ARCH_DOVE
select PINCTRL_DOVE select PINCTRL_DOVE
select PLAT_ORION_LEGACY select PLAT_ORION_LEGACY
select PM_GENERIC_DOMAINS if PM select PM_GENERIC_DOMAINS if PM
select PCI_QUIRKS if PCI
help help
Support for the Marvell Dove SoC 88AP510 Support for the Marvell Dove SoC 88AP510
......
...@@ -136,14 +136,19 @@ static struct pci_ops pcie_ops = { ...@@ -136,14 +136,19 @@ static struct pci_ops pcie_ops = {
.write = pcie_wr_conf, .write = pcie_wr_conf,
}; };
/*
* The root complex has a hardwired class of PCI_CLASS_MEMORY_OTHER, when it
* is operating as a root complex this needs to be switched to
* PCI_CLASS_BRIDGE_HOST or Linux will errantly try to process the BAR's on
* the device. Decoding setup is handled by the orion code.
*/
static void rc_pci_fixup(struct pci_dev *dev) static void rc_pci_fixup(struct pci_dev *dev)
{ {
/*
* Prevent enumeration of root complex.
*/
if (dev->bus->parent == NULL && dev->devfn == 0) { if (dev->bus->parent == NULL && dev->devfn == 0) {
int i; int i;
dev->class &= 0xff;
dev->class |= PCI_CLASS_BRIDGE_HOST << 8;
for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) { for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
dev->resource[i].start = 0; dev->resource[i].start = 0;
dev->resource[i].end = 0; dev->resource[i].end = 0;
......
...@@ -180,14 +180,19 @@ static struct pci_ops pcie_ops = { ...@@ -180,14 +180,19 @@ static struct pci_ops pcie_ops = {
.write = pcie_wr_conf, .write = pcie_wr_conf,
}; };
/*
* The root complex has a hardwired class of PCI_CLASS_MEMORY_OTHER, when it
* is operating as a root complex this needs to be switched to
* PCI_CLASS_BRIDGE_HOST or Linux will errantly try to process the BAR's on
* the device. Decoding setup is handled by the orion code.
*/
static void rc_pci_fixup(struct pci_dev *dev) static void rc_pci_fixup(struct pci_dev *dev)
{ {
/*
* Prevent enumeration of root complex.
*/
if (dev->bus->parent == NULL && dev->devfn == 0) { if (dev->bus->parent == NULL && dev->devfn == 0) {
int i; int i;
dev->class &= 0xff;
dev->class |= PCI_CLASS_BRIDGE_HOST << 8;
for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) { for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
dev->resource[i].start = 0; dev->resource[i].start = 0;
dev->resource[i].end = 0; dev->resource[i].end = 0;
......
...@@ -7,6 +7,7 @@ menuconfig ARCH_ORION5X ...@@ -7,6 +7,7 @@ menuconfig ARCH_ORION5X
select GPIOLIB select GPIOLIB
select MVEBU_MBUS select MVEBU_MBUS
select FORCE_PCI select FORCE_PCI
select PCI_QUIRKS
select PHYLIB if NETDEVICES select PHYLIB if NETDEVICES
select PLAT_ORION_LEGACY select PLAT_ORION_LEGACY
help help
......
...@@ -515,14 +515,20 @@ static int __init pci_setup(struct pci_sys_data *sys) ...@@ -515,14 +515,20 @@ static int __init pci_setup(struct pci_sys_data *sys)
/***************************************************************************** /*****************************************************************************
* General PCIe + PCI * General PCIe + PCI
****************************************************************************/ ****************************************************************************/
/*
* The root complex has a hardwired class of PCI_CLASS_MEMORY_OTHER, when it
* is operating as a root complex this needs to be switched to
* PCI_CLASS_BRIDGE_HOST or Linux will errantly try to process the BAR's on
* the device. Decoding setup is handled by the orion code.
*/
static void rc_pci_fixup(struct pci_dev *dev) static void rc_pci_fixup(struct pci_dev *dev)
{ {
/*
* Prevent enumeration of root complex.
*/
if (dev->bus->parent == NULL && dev->devfn == 0) { if (dev->bus->parent == NULL && dev->devfn == 0) {
int i; int i;
dev->class &= 0xff;
dev->class |= PCI_CLASS_BRIDGE_HOST << 8;
for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) { for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
dev->resource[i].start = 0; dev->resource[i].start = 0;
dev->resource[i].end = 0; dev->resource[i].end = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment