diff options
Diffstat (limited to 'Revert-iommu-intel-iommu-Enable-CONFIG_DMA_DIRECT_OP.patch')
-rw-r--r-- | Revert-iommu-intel-iommu-Enable-CONFIG_DMA_DIRECT_OP.patch | 125 |
1 files changed, 0 insertions, 125 deletions
diff --git a/Revert-iommu-intel-iommu-Enable-CONFIG_DMA_DIRECT_OP.patch b/Revert-iommu-intel-iommu-Enable-CONFIG_DMA_DIRECT_OP.patch deleted file mode 100644 index 46212341f..000000000 --- a/Revert-iommu-intel-iommu-Enable-CONFIG_DMA_DIRECT_OP.patch +++ /dev/null @@ -1,125 +0,0 @@ -From 3c16e0cc4ace8bd838bf234caead5a766b07fe9d Mon Sep 17 00:00:00 2001 -From: Christoph Hellwig <hch@lst.de> -Date: Thu, 5 Jul 2018 13:29:55 -0600 -Subject: [PATCH] Revert "iommu/intel-iommu: Enable CONFIG_DMA_DIRECT_OPS=y and - clean up intel_{alloc,free}_coherent()" - -This commit may cause a less than required dma mask to be used for -some allocations, which apparently leads to module load failures for -iwlwifi sometimes. - -This reverts commit d657c5c73ca987214a6f9436e435b34fc60f332a. - -Signed-off-by: Christoph Hellwig <hch@lst.de> -Reported-by: Fabio Coatti <fabio.coatti@gmail.com> -Tested-by: Fabio Coatti <fabio.coatti@gmail.com> -Signed-off-by: Jeremy Cline <jcline@redhat.com> ---- - drivers/iommu/Kconfig | 1 - - drivers/iommu/intel-iommu.c | 62 +++++++++++++++++++++++++++---------- - 2 files changed, 46 insertions(+), 17 deletions(-) - -diff --git a/drivers/iommu/Kconfig b/drivers/iommu/Kconfig -index b38798cc5288..f3a21343e636 100644 ---- a/drivers/iommu/Kconfig -+++ b/drivers/iommu/Kconfig -@@ -142,7 +142,6 @@ config DMAR_TABLE - config INTEL_IOMMU - bool "Support for Intel IOMMU using DMA Remapping Devices" - depends on PCI_MSI && ACPI && (X86 || IA64_GENERIC) -- select DMA_DIRECT_OPS - select IOMMU_API - select IOMMU_IOVA - select DMAR_TABLE -diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c -index 749d8f235346..6392a4964fc5 100644 ---- a/drivers/iommu/intel-iommu.c -+++ b/drivers/iommu/intel-iommu.c -@@ -31,7 +31,6 @@ - #include <linux/pci.h> - #include <linux/dmar.h> - #include <linux/dma-mapping.h> --#include <linux/dma-direct.h> - #include <linux/mempool.h> - #include <linux/memory.h> - #include <linux/cpu.h> -@@ -3709,30 +3708,61 @@ static void *intel_alloc_coherent(struct device *dev, size_t size, - dma_addr_t *dma_handle, gfp_t flags, - unsigned long attrs) - { -- void *vaddr; -+ struct page *page = NULL; -+ int order; - -- vaddr = dma_direct_alloc(dev, size, dma_handle, flags, attrs); -- if (iommu_no_mapping(dev) || !vaddr) -- return vaddr; -+ size = PAGE_ALIGN(size); -+ order = get_order(size); - -- *dma_handle = __intel_map_single(dev, virt_to_phys(vaddr), -- PAGE_ALIGN(size), DMA_BIDIRECTIONAL, -- dev->coherent_dma_mask); -- if (!*dma_handle) -- goto out_free_pages; -- return vaddr; -+ if (!iommu_no_mapping(dev)) -+ flags &= ~(GFP_DMA | GFP_DMA32); -+ else if (dev->coherent_dma_mask < dma_get_required_mask(dev)) { -+ if (dev->coherent_dma_mask < DMA_BIT_MASK(32)) -+ flags |= GFP_DMA; -+ else -+ flags |= GFP_DMA32; -+ } -+ -+ if (gfpflags_allow_blocking(flags)) { -+ unsigned int count = size >> PAGE_SHIFT; -+ -+ page = dma_alloc_from_contiguous(dev, count, order, flags); -+ if (page && iommu_no_mapping(dev) && -+ page_to_phys(page) + size > dev->coherent_dma_mask) { -+ dma_release_from_contiguous(dev, page, count); -+ page = NULL; -+ } -+ } -+ -+ if (!page) -+ page = alloc_pages(flags, order); -+ if (!page) -+ return NULL; -+ memset(page_address(page), 0, size); -+ -+ *dma_handle = __intel_map_single(dev, page_to_phys(page), size, -+ DMA_BIDIRECTIONAL, -+ dev->coherent_dma_mask); -+ if (*dma_handle) -+ return page_address(page); -+ if (!dma_release_from_contiguous(dev, page, size >> PAGE_SHIFT)) -+ __free_pages(page, order); - --out_free_pages: -- dma_direct_free(dev, size, vaddr, *dma_handle, attrs); - return NULL; - } - - static void intel_free_coherent(struct device *dev, size_t size, void *vaddr, - dma_addr_t dma_handle, unsigned long attrs) - { -- if (!iommu_no_mapping(dev)) -- intel_unmap(dev, dma_handle, PAGE_ALIGN(size)); -- dma_direct_free(dev, size, vaddr, dma_handle, attrs); -+ int order; -+ struct page *page = virt_to_page(vaddr); -+ -+ size = PAGE_ALIGN(size); -+ order = get_order(size); -+ -+ intel_unmap(dev, dma_handle, size); -+ if (!dma_release_from_contiguous(dev, page, size >> PAGE_SHIFT)) -+ __free_pages(page, order); - } - - static void intel_unmap_sg(struct device *dev, struct scatterlist *sglist, --- -2.17.1 - |