PCI: Set dma-can-stall for HiSilicon chips
authorZhangfei Gao <zhangfei.gao@linaro.org>
Tue, 13 Jul 2021 02:54:36 +0000 (10:54 +0800)
committerBjorn Helgaas <bhelgaas@google.com>
Tue, 31 Aug 2021 20:06:04 +0000 (15:06 -0500)
HiSilicon KunPeng920 and KunPeng930 have devices that appear as PCI but are
actually on the AMBA bus. These fake PCI devices can support SVA via the
SMMU stall feature.

DT systems can indicate this in the device tree, but ACPI systems don't
have that mechanism, so add a "dma-can-stall" property manually for them.

[bhelgaas: add text from Robin as comment near quirk]
Link: https://lore.kernel.org/r/1626144876-11352-4-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>
Acked-by: Robin Murphy <robin.murphy@arm.com>
drivers/pci/quirks.c

index 5d46ac6..1871c1d 100644 (file)
@@ -1821,12 +1821,37 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,    PCI_DEVICE_ID_INTEL_E7525_MCH,  quir
 
 DECLARE_PCI_FIXUP_CLASS_FINAL(PCI_VENDOR_ID_HUAWEI, 0x1610, PCI_CLASS_BRIDGE_PCI, 8, quirk_pcie_mch);
 
+/*
+ * HiSilicon KunPeng920 and KunPeng930 have devices appear as PCI but are
+ * actually on the AMBA bus. These fake PCI devices can support SVA via
+ * SMMU stall feature, by setting dma-can-stall for ACPI platforms.
+ *
+ * Normally stalling must not be enabled for PCI devices, since it would
+ * break the PCI requirement for free-flowing writes and may lead to
+ * deadlock.  We expect PCI devices to support ATS and PRI if they want to
+ * be fault-tolerant, so there's no ACPI binding to describe anything else,
+ * even when a "PCI" device turns out to be a regular old SoC device
+ * dressed up as a RCiEP and normal rules don't apply.
+ */
 static void quirk_huawei_pcie_sva(struct pci_dev *pdev)
 {
+       struct property_entry properties[] = {
+               PROPERTY_ENTRY_BOOL("dma-can-stall"),
+               {},
+       };
+
        if (pdev->revision != 0x21 && pdev->revision != 0x30)
                return;
 
        pdev->pasid_no_tlp = 1;
+
+       /*
+        * Set the dma-can-stall property on ACPI platforms. Device tree
+        * can set it directly.
+        */
+       if (!pdev->dev.of_node &&
+           device_add_properties(&pdev->dev, properties))
+               pci_warn(pdev, "could not add stall property");
 }
 DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_HUAWEI, 0xa250, quirk_huawei_pcie_sva);
 DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_HUAWEI, 0xa251, quirk_huawei_pcie_sva);