### iommu
= List of [ <bool>, verbose, debug, force, required,
- sharept, intremap, intpost,
+ sharept, intremap, intpost, crash-disable,
snoop, qinval, igfx, workaround_bios_bug,
amd-iommu-perdev-intremap,
dom0-{passthrough,strict} ]
This option depends on `intremap`, and is disabled by default due to some
corner cases in the implementation which have yet to be resolved.
+* The `crash-disable` boolean controls disabling IOMMU functionality (DMAR/IR/QI)
+ before switching to a crash kernel. This option is inactive by default and
+ is for compatibility with older kdump kernels only. Modern kernels copy
+ all the necessary tables from the previous one following kexec which makes
+ the transition transparent for them with IOMMU functions still on.
+
The following options are specific to Intel VT-d hardware:
* The `snoop` boolean controls the Snoop Control sub-feature, and is active
printk("Failed to shoot down CPUs {%*pbl}\n",
nr_cpu_ids, cpumask_bits(&waiting_to_crash));
- /* Crash shutdown any IOMMU functionality as the crashdump kernel is not
- * happy when booting if interrupt/dma remapping is still enabled */
+ /*
+ * Try to crash shutdown IOMMU functionality as some old crashdump
+ * kernels are not happy when booting if interrupt/dma remapping
+ * is still enabled.
+ */
iommu_crash_shutdown();
__stop_this_cpu();
bool_t __read_mostly iommu_snoop = 1;
bool_t __read_mostly iommu_qinval = 1;
bool_t __read_mostly iommu_intremap = 1;
+bool_t __read_mostly iommu_crash_disable;
static bool __hwdom_initdata iommu_hwdom_none;
bool __hwdom_initdata iommu_hwdom_strict;
iommu_intremap = val;
else if ( (val = parse_boolean("intpost", s, ss)) >= 0 )
iommu_intpost = val;
+#ifdef CONFIG_KEXEC
+ else if ( (val = parse_boolean("crash-disable", s, ss)) >= 0 )
+ iommu_crash_disable = val;
+#endif
else if ( (val = parse_boolean("debug", s, ss)) >= 0 )
{
iommu_debug = val;
void iommu_crash_shutdown(void)
{
+ if ( !iommu_crash_disable )
+ return;
+
if ( iommu_enabled )
iommu_get_ops()->crash_shutdown();
iommu_enabled = iommu_intremap = iommu_intpost = 0;