diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index 6ddb5b50a14ae389d138f1044e5dd0441e59b297..39e91a7b1dd9d29e2f75c8f42b5ab5fbbacef445 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c @@ -5071,6 +5071,22 @@ static int pci_quirk_wangxun_nic_acs(struct pci_dev *dev, u16 acs_flags) return false; } +/* + * Phytium 5000E SOC have no ACS capability, and on multi-function + * devices, peer-to-peer transactions are not be used between the functions. + * So add an ACS quirk for below devices to isolate functions. + */ +static int pci_quirk_phytium_pcie_ports_acs(struct pci_dev *dev, u16 acs_flags) +{ + switch (dev->device) { + case 0x0100: + return pci_acs_ctrl_enabled(acs_flags, + PCI_ACS_SV | PCI_ACS_RR | PCI_ACS_CR | PCI_ACS_UF); + } + + return false; +} + static const struct pci_dev_acs_enabled { u16 vendor; u16 device; @@ -5242,6 +5258,8 @@ static const struct pci_dev_acs_enabled { { PCI_VENDOR_ID_ZHAOXIN, PCI_ANY_ID, pci_quirk_zhaoxin_pcie_ports_acs }, /* Wangxun nics */ { PCI_VENDOR_ID_WANGXUN, PCI_ANY_ID, pci_quirk_wangxun_nic_acs }, + /* Phytium Socs */ + { PCI_VENDOR_ID_PHYTIUM, PCI_ANY_ID, pci_quirk_phytium_pcie_ports_acs }, { 0 } };