PCI: Add ACS quirk for Intel Root Complex Integrated Endpoints
[platform/kernel/linux-rpi.git] / drivers / pci / quirks.c
index d59a735..a1ec8a1 100644 (file)
@@ -4683,6 +4683,20 @@ static int pci_quirk_mf_endpoint_acs(struct pci_dev *dev, u16 acs_flags)
                PCI_ACS_CR | PCI_ACS_UF | PCI_ACS_DT);
 }
 
+static int pci_quirk_rciep_acs(struct pci_dev *dev, u16 acs_flags)
+{
+       /*
+        * Intel RCiEP's are required to allow p2p only on translated
+        * addresses.  Refer to Intel VT-d specification, r3.1, sec 3.16,
+        * "Root-Complex Peer to Peer Considerations".
+        */
+       if (pci_pcie_type(dev) != PCI_EXP_TYPE_RC_END)
+               return -ENOTTY;
+
+       return pci_acs_ctrl_enabled(acs_flags,
+               PCI_ACS_SV | PCI_ACS_RR | PCI_ACS_CR | PCI_ACS_UF);
+}
+
 static int pci_quirk_brcm_acs(struct pci_dev *dev, u16 acs_flags)
 {
        /*
@@ -4765,6 +4779,7 @@ static const struct pci_dev_acs_enabled {
        /* I219 */
        { PCI_VENDOR_ID_INTEL, 0x15b7, pci_quirk_mf_endpoint_acs },
        { PCI_VENDOR_ID_INTEL, 0x15b8, pci_quirk_mf_endpoint_acs },
+       { PCI_VENDOR_ID_INTEL, PCI_ANY_ID, pci_quirk_rciep_acs },
        /* QCOM QDF2xxx root ports */
        { PCI_VENDOR_ID_QCOM, 0x0400, pci_quirk_qcom_rp_acs },
        { PCI_VENDOR_ID_QCOM, 0x0401, pci_quirk_qcom_rp_acs },