]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
x86/pci-dma: switch the VIA 32-bit DMA quirk to use the struct device flag
authorChristoph Hellwig <hch@lst.de>
Mon, 28 May 2018 10:47:57 +0000 (12:47 +0200)
committerChristoph Hellwig <hch@lst.de>
Mon, 28 May 2018 10:48:25 +0000 (12:48 +0200)
Instead of globally disabling > 32bit DMA using the arch_dma_supported
hook walk the PCI bus under the actually affected bridge and mark every
device with the dma_32bit_limit flag.  This also gets rid of the
arch_dma_supported hook entirely.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
arch/x86/include/asm/dma-mapping.h
arch/x86/kernel/pci-dma.c
include/linux/dma-mapping.h

index ef597478f0acc34d7550d6c981def583336e3074..ce4d176b3d139d9636f5483103ad1ac9b20d9be9 100644 (file)
@@ -30,9 +30,6 @@ static inline const struct dma_map_ops *get_arch_dma_ops(struct bus_type *bus)
        return dma_ops;
 }
 
-int arch_dma_supported(struct device *dev, u64 mask);
-#define arch_dma_supported arch_dma_supported
-
 bool arch_dma_alloc_attrs(struct device **dev);
 #define arch_dma_alloc_attrs arch_dma_alloc_attrs
 
index b523414bc3238861625b1be7b33813b473005839..ab5d9dd668d2fb2580e07881d43f4d4bb5dc3e6c 100644 (file)
@@ -15,7 +15,7 @@
 #include <asm/x86_init.h>
 #include <asm/iommu_table.h>
 
-static int forbid_dac __read_mostly;
+static bool disable_dac_quirk __read_mostly;
 
 const struct dma_map_ops *dma_ops = &dma_direct_ops;
 EXPORT_SYMBOL(dma_ops);
@@ -126,7 +126,7 @@ static __init int iommu_setup(char *p)
                if (!strncmp(p, "nodac", 5))
                        pr_warn("nodac option ignored.\n");
                if (!strncmp(p, "usedac", 6)) {
-                       forbid_dac = -1;
+                       disable_dac_quirk = true;
                        return 1;
                }
 #ifdef CONFIG_SWIOTLB
@@ -151,19 +151,6 @@ static __init int iommu_setup(char *p)
 }
 early_param("iommu", iommu_setup);
 
-int arch_dma_supported(struct device *dev, u64 mask)
-{
-#ifdef CONFIG_PCI
-       if (mask > 0xffffffff && forbid_dac > 0) {
-               dev_info(dev, "PCI: Disallowing DAC for device\n");
-               return 0;
-       }
-#endif
-
-       return 1;
-}
-EXPORT_SYMBOL(arch_dma_supported);
-
 static int __init pci_iommu_init(void)
 {
        struct iommu_table_entry *p;
@@ -186,11 +173,17 @@ rootfs_initcall(pci_iommu_init);
 #ifdef CONFIG_PCI
 /* Many VIA bridges seem to corrupt data for DAC. Disable it here */
 
+static int via_no_dac_cb(struct pci_dev *pdev, void *data)
+{
+       pdev->dev.dma_32bit_limit = true;
+       return 0;
+}
+
 static void via_no_dac(struct pci_dev *dev)
 {
-       if (forbid_dac == 0) {
+       if (!disable_dac_quirk) {
                dev_info(&dev->dev, "disabling DAC on VIA PCI bridge\n");
-               forbid_dac = 1;
+               pci_walk_bus(dev->subordinate, via_no_dac_cb, NULL);
        }
 }
 DECLARE_PCI_FIXUP_CLASS_FINAL(PCI_VENDOR_ID_VIA, PCI_ANY_ID,
index 15e4b4e9cc20de0c969f497837d2925cb41dcc28..f9cc309507d9fc89bd91e7d44249ed379e5090a7 100644 (file)
@@ -572,14 +572,6 @@ static inline int dma_mapping_error(struct device *dev, dma_addr_t dma_addr)
        return 0;
 }
 
-/*
- * This is a hack for the legacy x86 forbid_dac and iommu_sac_force. Please
- * don't use this in new code.
- */
-#ifndef arch_dma_supported
-#define arch_dma_supported(dev, mask)  (1)
-#endif
-
 static inline void dma_check_mask(struct device *dev, u64 mask)
 {
        if (sme_active() && (mask < (((u64)sme_get_me_mask() << 1) - 1)))
@@ -592,9 +584,6 @@ static inline int dma_supported(struct device *dev, u64 mask)
 
        if (!ops)
                return 0;
-       if (!arch_dma_supported(dev, mask))
-               return 0;
-
        if (!ops->dma_supported)
                return 1;
        return ops->dma_supported(dev, mask);