|
@@ -36,6 +36,7 @@
|
|
|
|
|
|
#include "amd_iommu_proto.h"
|
|
|
#include "amd_iommu_types.h"
|
|
|
+#include "irq_remapping.h"
|
|
|
|
|
|
/*
|
|
|
* definitions for the ACPI scanning code
|
|
@@ -127,6 +128,7 @@ struct ivmd_header {
|
|
|
} __attribute__((packed));
|
|
|
|
|
|
bool amd_iommu_dump;
|
|
|
+bool amd_iommu_irq_remap __read_mostly;
|
|
|
|
|
|
static bool amd_iommu_detected;
|
|
|
static bool __initdata amd_iommu_disabled;
|
|
@@ -1530,6 +1532,11 @@ static struct syscore_ops amd_iommu_syscore_ops = {
|
|
|
|
|
|
static void __init free_on_init_error(void)
|
|
|
{
|
|
|
+ if (amd_iommu_irq_cache) {
|
|
|
+ kmem_cache_destroy(amd_iommu_irq_cache);
|
|
|
+ amd_iommu_irq_cache = NULL;
|
|
|
+ }
|
|
|
+
|
|
|
amd_iommu_uninit_devices();
|
|
|
|
|
|
free_pages((unsigned long)amd_iommu_pd_alloc_bitmap,
|
|
@@ -1669,6 +1676,19 @@ static int __init early_amd_iommu_init(void)
|
|
|
if (ret)
|
|
|
goto out;
|
|
|
|
|
|
+ if (amd_iommu_irq_remap) {
|
|
|
+ /*
|
|
|
+ * Interrupt remapping enabled, create kmem_cache for the
|
|
|
+ * remapping tables.
|
|
|
+ */
|
|
|
+ amd_iommu_irq_cache = kmem_cache_create("irq_remap_cache",
|
|
|
+ MAX_IRQS_PER_TABLE * sizeof(u32),
|
|
|
+ IRQ_TABLE_ALIGNMENT,
|
|
|
+ 0, NULL);
|
|
|
+ if (!amd_iommu_irq_cache)
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+
|
|
|
ret = init_memory_definitions(ivrs_base);
|
|
|
if (ret)
|
|
|
goto out;
|
|
@@ -1716,6 +1736,9 @@ static bool detect_ivrs(void)
|
|
|
/* Make sure ACS will be enabled during PCI probe */
|
|
|
pci_request_acs();
|
|
|
|
|
|
+ if (!disable_irq_remap)
|
|
|
+ amd_iommu_irq_remap = true;
|
|
|
+
|
|
|
return true;
|
|
|
}
|
|
|
|