x86: Add iommu_init to x86_init_ops
authorFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
Tue, 10 Nov 2009 10:46:12 +0000 (19:46 +0900)
committerIngo Molnar <mingo@elte.hu>
Tue, 10 Nov 2009 11:31:07 +0000 (12:31 +0100)
We call the detections functions of all the IOMMUs then all
their initialization functions. The latter is pointless since we
don't detect multiple different IOMMUs. What we need to do is
calling the initialization function of the detected IOMMU.

This adds iommu_init hook to x86_init_ops so if an IOMMU
detection function can set its initialization function to the
hook.

Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
Cc: chrisw@sous-sol.org
Cc: dwmw2@infradead.org
Cc: joerg.roedel@amd.com
Cc: muli@il.ibm.com
LKML-Reference: <1257849980-22640-2-git-send-email-fujita.tomonori@lab.ntt.co.jp>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
arch/x86/include/asm/x86_init.h
arch/x86/kernel/pci-dma.c
arch/x86/kernel/x86_init.c

index 66008ed80b7aeb0ac17bef1b4110321709d10a49..d8e71459f025a3c4c08225d148e67bbb895f851a 100644 (file)
@@ -90,6 +90,14 @@ struct x86_init_timers {
        void (*timer_init)(void);
 };
 
+/**
+ * struct x86_init_iommu - platform specific iommu setup
+ * @iommu_init:                        platform specific iommu setup
+ */
+struct x86_init_iommu {
+       int (*iommu_init)(void);
+};
+
 /**
  * struct x86_init_ops - functions for platform specific setup
  *
@@ -101,6 +109,7 @@ struct x86_init_ops {
        struct x86_init_oem             oem;
        struct x86_init_paging          paging;
        struct x86_init_timers          timers;
+       struct x86_init_iommu           iommu;
 };
 
 /**
index 839d49a669bc1acdddb18b653de52a35af6cf81f..a13478da533c33d25fdfc93b5fa3e2e6b9287cb0 100644 (file)
@@ -292,6 +292,8 @@ static int __init pci_iommu_init(void)
        dma_debug_add_bus(&pci_bus_type);
 #endif
 
+       x86_init.iommu.iommu_init();
+
        calgary_iommu_init();
 
        intel_iommu_init();
index bc9b230ef4021af623a7bf3f30ff757025d02a1e..c46984d122dcababab554fc5a16bb19fc73a4e09 100644 (file)
@@ -19,6 +19,7 @@
 void __cpuinit x86_init_noop(void) { }
 void __init x86_init_uint_noop(unsigned int unused) { }
 void __init x86_init_pgd_noop(pgd_t *unused) { }
+int __init iommu_init_noop(void) { return 0; }
 
 /*
  * The platform setup functions are preset with the default functions
@@ -63,6 +64,10 @@ struct x86_init_ops x86_init __initdata = {
                .tsc_pre_init           = x86_init_noop,
                .timer_init             = hpet_time_init,
        },
+
+       .iommu = {
+               .iommu_init             = iommu_init_noop,
+       },
 };
 
 struct x86_cpuinit_ops x86_cpuinit __cpuinitdata = {