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

PCI: Add ACS quirk for APM X-Gene devices

The APM X-Gene PCIe root port does not support ACS at this point. However,
the hardware provides isolation and source validation through the SMMU.
The stream ID generated by the PCIe ports contain both the bus/device/
function number as well as the port ID in its 3 most significant bits.
Turn on ACS but disable all the peer-to-peer features.

Signed-off-by: Feng Kan <fkan@apm.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Alex Williamson <alex.williamson@redhat.com>
Acked-by: Tanmay Inamdar <tinamdar@apm.com>

authored by

Feng Kan and committed by
Bjorn Helgaas
a0418aa2 9b44b0b0

+14
+14
drivers/pci/quirks.c
··· 4137 4137 return acs_flags ? 0 : 1; 4138 4138 } 4139 4139 4140 + static int pci_quirk_xgene_acs(struct pci_dev *dev, u16 acs_flags) 4141 + { 4142 + /* 4143 + * X-Gene root matching this quirk do not allow peer-to-peer 4144 + * transactions with others, allowing masking out these bits as if they 4145 + * were unimplemented in the ACS capability. 4146 + */ 4147 + acs_flags &= ~(PCI_ACS_SV | PCI_ACS_RR | PCI_ACS_CR | PCI_ACS_UF); 4148 + 4149 + return acs_flags ? 0 : 1; 4150 + } 4151 + 4140 4152 /* 4141 4153 * Many Intel PCH root ports do provide ACS-like features to disable peer 4142 4154 * transactions and validate bus numbers in requests, but do not provide an ··· 4397 4385 { 0x10df, 0x720, pci_quirk_mf_endpoint_acs }, /* Emulex Skyhawk-R */ 4398 4386 /* Cavium ThunderX */ 4399 4387 { PCI_VENDOR_ID_CAVIUM, PCI_ANY_ID, pci_quirk_cavium_acs }, 4388 + /* APM X-Gene */ 4389 + { PCI_VENDOR_ID_AMCC, 0xE004, pci_quirk_xgene_acs }, 4400 4390 { 0 } 4401 4391 }; 4402 4392