lkml.org 
[lkml]   [2022]   [Aug]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.19 1075/1157] ARM: Marvell: Update PCIe fixup
    Date
    From: Pali Rohár <pali@kernel.org>

    [ Upstream commit fdaa3725831972284ef2779ddba00491d9dbbfca ]

    - 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 1dc831bf53fd ("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: Pali Rohár <pali@kernel.org>
    Cc: Jason Gunthorpe <jgg@nvidia.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: Gregory CLEMENT <gregory.clement@bootlin.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    arch/arm/mach-dove/Kconfig | 1 +
    arch/arm/mach-dove/pcie.c | 11 ++++++++---
    arch/arm/mach-mv78xx0/pcie.c | 11 ++++++++---
    arch/arm/mach-orion5x/Kconfig | 1 +
    arch/arm/mach-orion5x/pci.c | 12 +++++++++---
    5 files changed, 27 insertions(+), 9 deletions(-)

    diff --git a/arch/arm/mach-dove/Kconfig b/arch/arm/mach-dove/Kconfig
    index c30c69c664ea..a568ef90633e 100644
    --- a/arch/arm/mach-dove/Kconfig
    +++ b/arch/arm/mach-dove/Kconfig
    @@ -8,6 +8,7 @@ menuconfig ARCH_DOVE
    select PINCTRL_DOVE
    select PLAT_ORION_LEGACY
    select PM_GENERIC_DOMAINS if PM
    + select PCI_QUIRKS if PCI
    help
    Support for the Marvell Dove SoC 88AP510

    diff --git a/arch/arm/mach-dove/pcie.c b/arch/arm/mach-dove/pcie.c
    index 2a493bdfffc6..f90f42fc495e 100644
    --- a/arch/arm/mach-dove/pcie.c
    +++ b/arch/arm/mach-dove/pcie.c
    @@ -136,14 +136,19 @@ static struct pci_ops pcie_ops = {
    .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)
    {
    - /*
    - * Prevent enumeration of root complex.
    - */
    if (dev->bus->parent == NULL && dev->devfn == 0) {
    int i;

    + dev->class &= 0xff;
    + dev->class |= PCI_CLASS_BRIDGE_HOST << 8;
    for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
    dev->resource[i].start = 0;
    dev->resource[i].end = 0;
    diff --git a/arch/arm/mach-mv78xx0/pcie.c b/arch/arm/mach-mv78xx0/pcie.c
    index e15646af7f26..4f1847babef2 100644
    --- a/arch/arm/mach-mv78xx0/pcie.c
    +++ b/arch/arm/mach-mv78xx0/pcie.c
    @@ -180,14 +180,19 @@ static struct pci_ops pcie_ops = {
    .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)
    {
    - /*
    - * Prevent enumeration of root complex.
    - */
    if (dev->bus->parent == NULL && dev->devfn == 0) {
    int i;

    + dev->class &= 0xff;
    + dev->class |= PCI_CLASS_BRIDGE_HOST << 8;
    for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
    dev->resource[i].start = 0;
    dev->resource[i].end = 0;
    diff --git a/arch/arm/mach-orion5x/Kconfig b/arch/arm/mach-orion5x/Kconfig
    index bf833b51931d..aeac281c8764 100644
    --- a/arch/arm/mach-orion5x/Kconfig
    +++ b/arch/arm/mach-orion5x/Kconfig
    @@ -7,6 +7,7 @@ menuconfig ARCH_ORION5X
    select GPIOLIB
    select MVEBU_MBUS
    select FORCE_PCI
    + select PCI_QUIRKS
    select PHYLIB if NETDEVICES
    select PLAT_ORION_LEGACY
    help
    diff --git a/arch/arm/mach-orion5x/pci.c b/arch/arm/mach-orion5x/pci.c
    index 92e938bba20d..9574c73f3c03 100644
    --- a/arch/arm/mach-orion5x/pci.c
    +++ b/arch/arm/mach-orion5x/pci.c
    @@ -515,14 +515,20 @@ static int __init pci_setup(struct pci_sys_data *sys)
    /*****************************************************************************
    * 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)
    {
    - /*
    - * Prevent enumeration of root complex.
    - */
    if (dev->bus->parent == NULL && dev->devfn == 0) {
    int i;

    + dev->class &= 0xff;
    + dev->class |= PCI_CLASS_BRIDGE_HOST << 8;
    for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
    dev->resource[i].start = 0;
    dev->resource[i].end = 0;
    --
    2.35.1


    \
     
     \ /
      Last update: 2022-08-16 06:54    [W:4.029 / U:0.040 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site