aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoerg Roedel <jroedel@suse.de>2017-06-15 04:36:22 -0400
committerJoerg Roedel <jroedel@suse.de>2017-06-16 04:21:05 -0400
commit54bd63570484167cb13edf81e31fff107b879981 (patch)
tree28e5fe4889ba7e939a9f78c51c0b50d73a6e9092
parentac3b708ad49f77b44faa104057783f161491e9e4 (diff)
iommu/amd: Suppress IO_PAGE_FAULTs in kdump kernel
When booting into a kdump kernel, suppress IO_PAGE_FAULTs by default for all devices. But allow the faults again when a domain is assigned to a device. Signed-off-by: Joerg Roedel <jroedel@suse.de>
-rw-r--r--drivers/iommu/amd_iommu.c3
-rw-r--r--drivers/iommu/amd_iommu_init.c9
-rw-r--r--drivers/iommu/amd_iommu_types.h1
3 files changed, 12 insertions, 1 deletions
diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c
index 6498f5baa7ea..95ee360a5199 100644
--- a/drivers/iommu/amd_iommu.c
+++ b/drivers/iommu/amd_iommu.c
@@ -2078,7 +2078,8 @@ static void set_dte_entry(u16 devid, struct protection_domain *domain, bool ats)
2078 flags |= tmp; 2078 flags |= tmp;
2079 } 2079 }
2080 2080
2081 flags &= ~(0xffffUL); 2081
2082 flags &= ~(DTE_FLAG_SA | 0xffffULL);
2082 flags |= domain->id; 2083 flags |= domain->id;
2083 2084
2084 amd_iommu_dev_table[devid].data[1] = flags; 2085 amd_iommu_dev_table[devid].data[1] = flags;
diff --git a/drivers/iommu/amd_iommu_init.c b/drivers/iommu/amd_iommu_init.c
index 3fa7e3b35507..cf7896550e75 100644
--- a/drivers/iommu/amd_iommu_init.c
+++ b/drivers/iommu/amd_iommu_init.c
@@ -29,6 +29,7 @@
29#include <linux/export.h> 29#include <linux/export.h>
30#include <linux/iommu.h> 30#include <linux/iommu.h>
31#include <linux/kmemleak.h> 31#include <linux/kmemleak.h>
32#include <linux/crash_dump.h>
32#include <asm/pci-direct.h> 33#include <asm/pci-direct.h>
33#include <asm/iommu.h> 34#include <asm/iommu.h>
34#include <asm/gart.h> 35#include <asm/gart.h>
@@ -1900,6 +1901,14 @@ static void init_device_table_dma(void)
1900 for (devid = 0; devid <= amd_iommu_last_bdf; ++devid) { 1901 for (devid = 0; devid <= amd_iommu_last_bdf; ++devid) {
1901 set_dev_entry_bit(devid, DEV_ENTRY_VALID); 1902 set_dev_entry_bit(devid, DEV_ENTRY_VALID);
1902 set_dev_entry_bit(devid, DEV_ENTRY_TRANSLATION); 1903 set_dev_entry_bit(devid, DEV_ENTRY_TRANSLATION);
1904 /*
1905 * In kdump kernels in-flight DMA from the old kernel might
1906 * cause IO_PAGE_FAULTs. There are no reports that a kdump
1907 * actually failed because of that, so just disable fault
1908 * reporting in the hardware to get rid of the messages
1909 */
1910 if (is_kdump_kernel())
1911 set_dev_entry_bit(devid, DEV_ENTRY_NO_PAGE_FAULT);
1903 } 1912 }
1904} 1913}
1905 1914
diff --git a/drivers/iommu/amd_iommu_types.h b/drivers/iommu/amd_iommu_types.h
index 6960d7db2fab..294a409e283b 100644
--- a/drivers/iommu/amd_iommu_types.h
+++ b/drivers/iommu/amd_iommu_types.h
@@ -322,6 +322,7 @@
322#define IOMMU_PTE_IW (1ULL << 62) 322#define IOMMU_PTE_IW (1ULL << 62)
323 323
324#define DTE_FLAG_IOTLB (1ULL << 32) 324#define DTE_FLAG_IOTLB (1ULL << 32)
325#define DTE_FLAG_SA (1ULL << 34)
325#define DTE_FLAG_GV (1ULL << 55) 326#define DTE_FLAG_GV (1ULL << 55)
326#define DTE_FLAG_MASK (0x3ffULL << 32) 327#define DTE_FLAG_MASK (0x3ffULL << 32)
327#define DTE_GLX_SHIFT (56) 328#define DTE_GLX_SHIFT (56)