Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

PCI: Allow PASID on fake PCIe devices without TLP prefixes

Some systems, e.g., HiSilicon KunPeng920 and KunPeng930, have devices that
appear as PCI but are actually on the AMBA bus. Some of these fake PCI
devices support a PASID-like feature and they do have a working PASID
capability even though they do not use the PCIe Transport Layer Protocol
and do not support TLP prefixes.

Add a pasid_no_tlp bit for this "PASID works without TLP prefixes" case and
update pci_enable_pasid() so it can enable PASID on these devices.

Set this bit for HiSilicon KunPeng920 and KunPeng930.

[bhelgaas: squashed, commit log]
Suggested-by: Bjorn Helgaas <bhelgaas@google.com>
Link: https://lore.kernel.org/r/1626144876-11352-2-git-send-email-zhangfei.gao@linaro.org
Link: https://lore.kernel.org/r/1626144876-11352-3-git-send-email-zhangfei.gao@linaro.org
Signed-off-by: Zhangfei Gao <zhangfei.gao@linaro.org>
Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
Signed-off-by: Zhou Wang <wangzhou1@hisilicon.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>

authored by

Zhangfei Gao and committed by
Bjorn Helgaas
8c09e896 e73f0f0e

+16 -1
+1 -1
drivers/pci/ats.c
··· 376 376 if (WARN_ON(pdev->pasid_enabled)) 377 377 return -EBUSY; 378 378 379 - if (!pdev->eetlp_prefix_path) 379 + if (!pdev->eetlp_prefix_path && !pdev->pasid_no_tlp) 380 380 return -EINVAL; 381 381 382 382 if (!pasid)
+14
drivers/pci/quirks.c
··· 1821 1821 1822 1822 DECLARE_PCI_FIXUP_CLASS_FINAL(PCI_VENDOR_ID_HUAWEI, 0x1610, PCI_CLASS_BRIDGE_PCI, 8, quirk_pcie_mch); 1823 1823 1824 + static void quirk_huawei_pcie_sva(struct pci_dev *pdev) 1825 + { 1826 + if (pdev->revision != 0x21 && pdev->revision != 0x30) 1827 + return; 1828 + 1829 + pdev->pasid_no_tlp = 1; 1830 + } 1831 + DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_HUAWEI, 0xa250, quirk_huawei_pcie_sva); 1832 + DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_HUAWEI, 0xa251, quirk_huawei_pcie_sva); 1833 + DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_HUAWEI, 0xa255, quirk_huawei_pcie_sva); 1834 + DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_HUAWEI, 0xa256, quirk_huawei_pcie_sva); 1835 + DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_HUAWEI, 0xa258, quirk_huawei_pcie_sva); 1836 + DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_HUAWEI, 0xa259, quirk_huawei_pcie_sva); 1837 + 1824 1838 /* 1825 1839 * It's possible for the MSI to get corrupted if SHPC and ACPI are used 1826 1840 * together on certain PXH-based systems.
+1
include/linux/pci.h
··· 388 388 supported from root to here */ 389 389 u16 l1ss; /* L1SS Capability pointer */ 390 390 #endif 391 + unsigned int pasid_no_tlp:1; /* PASID works without TLP Prefix */ 391 392 unsigned int eetlp_prefix_path:1; /* End-to-End TLP Prefix */ 392 393 393 394 pci_channel_state_t error_state; /* Current connectivity state */