[PATCH 0/2] PCI: Allow disabling port services on broken root ports

Han Gao posted 2 patches 12 hours ago
drivers/pci/pcie/portdrv.c |  3 +++
drivers/pci/quirks.c       | 12 ++++++++++++
include/linux/pci.h        |  2 ++
include/linux/pci_ids.h    |  2 ++
4 files changed, 19 insertions(+)
[PATCH 0/2] PCI: Allow disabling port services on broken root ports
Posted by Han Gao 12 hours ago
Some PCIe root ports break MSI delivery to downstream devices when
native port services (AER, PME, bwctrl, etc.) are active. The existing
pcie_ports=compat kernel parameter works around this globally, but
affects all ports on the system.

This series adds a per-device mechanism to skip port service probing:
  1. Introduce PCI_DEV_FLAGS_NO_PORT_SERVICES flag and wire it into
     the PCIe port driver
  2. Apply it via quirk to Sophgo SG2042 root ports [1f1c:2042], which
     fail to deliver MSI interrupts when port services are enabled

SG2042's PCIe root ports only support MSI, not MSI-X. The MSI
controller provides only 32 vectors shared across all devices behind
each root port. When native port services claim vectors from this
limited pool, downstream devices are starved of interrupts, resulting
in zero interrupts delivered and driver timeouts (e.g. amdgpu fence
fallback timer expired on all rings).

Han Gao (2):
  PCI: Add per-device flag to disable native PCIe port services
  PCI: Add quirk to disable PCIe port services on Sophgo SG2042

 drivers/pci/pcie/portdrv.c |  3 +++
 drivers/pci/quirks.c       | 12 ++++++++++++
 include/linux/pci.h        |  2 ++
 include/linux/pci_ids.h    |  2 ++
 4 files changed, 19 insertions(+)

-- 
2.47.3
Re: [PATCH 0/2] PCI: Allow disabling port services on broken root ports
Posted by Lukas Wunner 11 hours ago
On Wed, Apr 01, 2026 at 01:56:56AM +0800, Han Gao wrote:
> SG2042's PCIe root ports only support MSI, not MSI-X. The MSI
> controller provides only 32 vectors shared across all devices behind
> each root port. When native port services claim vectors from this
> limited pool, downstream devices are starved of interrupts, resulting
> in zero interrupts delivered and driver timeouts (e.g. amdgpu fence
> fallback timer expired on all rings).

Have you considered setting the pci_dev::no_msi flag on the Root Ports
to force them to use INTx interrupts instead of MSI?  That would seem
like a cleaner solution.  There are already several devices for which
the flag is set in drivers/pci/quirks.c, see quirk_no_msi().

> Some PCIe root ports break MSI delivery to downstream devices when
> native port services (AER, PME, bwctrl, etc.) are active. The existing
> pcie_ports=compat kernel parameter works around this globally, but
> affects all ports on the system.
> 
> This series adds a per-device mechanism to skip port service probing:
>   1. Introduce PCI_DEV_FLAGS_NO_PORT_SERVICES flag and wire it into
>      the PCIe port driver
>   2. Apply it via quirk to Sophgo SG2042 root ports [1f1c:2042], which
>      fail to deliver MSI interrupts when port services are enabled

I think we should try to minimize such workarounds or at least make them
as non-intrusive as possible, so please try the no_msi approach instead.

I also don't see why the stable designation is needed TBH.

Thanks,

Lukas
Re: [PATCH 0/2] PCI: Allow disabling port services on broken root ports
Posted by Han Gao 11 hours ago
On Wed, Apr 1, 2026 at 2:58 AM Lukas Wunner <lukas@wunner.de> wrote:
>
> On Wed, Apr 01, 2026 at 01:56:56AM +0800, Han Gao wrote:
> > SG2042's PCIe root ports only support MSI, not MSI-X. The MSI
> > controller provides only 32 vectors shared across all devices behind
> > each root port. When native port services claim vectors from this
> > limited pool, downstream devices are starved of interrupts, resulting
> > in zero interrupts delivered and driver timeouts (e.g. amdgpu fence
> > fallback timer expired on all rings).
>
> Have you considered setting the pci_dev::no_msi flag on the Root Ports
> to force them to use INTx interrupts instead of MSI?  That would seem
> like a cleaner solution.  There are already several devices for which
> the flag is set in drivers/pci/quirks.c, see quirk_no_msi().

Unfortunately, the SG2042 has no INTx interrupts.

>
> > Some PCIe root ports break MSI delivery to downstream devices when
> > native port services (AER, PME, bwctrl, etc.) are active. The existing
> > pcie_ports=compat kernel parameter works around this globally, but
> > affects all ports on the system.
> >
> > This series adds a per-device mechanism to skip port service probing:
> >   1. Introduce PCI_DEV_FLAGS_NO_PORT_SERVICES flag and wire it into
> >      the PCIe port driver
> >   2. Apply it via quirk to Sophgo SG2042 root ports [1f1c:2042], which
> >      fail to deliver MSI interrupts when port services are enabled
>
> I think we should try to minimize such workarounds or at least make them
> as non-intrusive as possible, so please try the no_msi approach instead.
>
> I also don't see why the stable designation is needed TBH.

6.18 has merged PCIe drivers, so a stable tag is required.

>
> Thanks,
>
> Lukas

Han