]> www.infradead.org Git - nvme.git/commit
PCI: dw-rockchip: Hide broken ATS capability for RK3588 running in EP mode
authorNiklas Cassel <cassel@kernel.org>
Mon, 10 Mar 2025 09:48:28 +0000 (10:48 +0100)
committerKrzysztof Wilczyński <kwilczynski@kernel.org>
Fri, 14 Mar 2025 16:13:19 +0000 (16:13 +0000)
commit1f5a69f1b3132054d8d82b8d7546d0af6a2ed4f6
treef807916290f266d67916c2ffba4609628f53e1e0
parente3d6957f177936281278d259029a1a2184ba50d4
PCI: dw-rockchip: Hide broken ATS capability for RK3588 running in EP mode

When running the RK3588 in Endpoint mode, with an Intel host with IOMMU
enabled, the host side prints:

  DMAR: VT-d detected Invalidation Time-out Error: SID 0

When running the RK3588 in Endpoint mode, with an AMD host with IOMMU
enabled, the host side prints:

  iommu ivhd0: AMD-Vi: Event logged [IOTLB_INV_TIMEOUT device=63:00.0 address=0x42b5b01a0]

Rockchip has confirmed that the ATS support for RK3588 only works when
running the PCIe controller in Root Complex (RC) mode, see:

  https://lore.kernel.org/linux-pci/93cdce39-1ae6-4939-a3fc-db10be7564e5@rock-chips.com

Usually, to handle these issues, we add a quirk for the PCI vendor and
device ID in drivers/pci/quirks.c with quirk_no_ats(). That is because
we cannot usually modify the capabilities on the EP side. In this case,
we can modify the capabilities on the EP side.

Thus, hide the broken ATS capability on RK3588 when running in EP mode.

That way, we don't need any quirk on the host side, and we see no errors
on the host side, and we can run pci_endpoint_test successfully, with
the IOMMU enabled on the host side.

Acked-by: Shawn Lin <shawn.lin@rock-chips.com>
Signed-off-by: Niklas Cassel <cassel@kernel.org>
[kwilczynski: commit log, tidy up code comments and error message]
Signed-off-by: Krzysztof Wilczyński <kwilczynski@kernel.org>
Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Link: https://lore.kernel.org/r/20250310094826.842681-6-cassel@kernel.org
drivers/pci/controller/dwc/pcie-dw-rockchip.c