diff options
author | Glauber Costa <gcosta@redhat.com> | 2008-04-08 12:20:54 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-04-19 13:19:57 -0400 |
commit | 116890d556af38d539597655c564a73e6eef3d9e (patch) | |
tree | 4c284032ee8b59fb97fd01b86ba6ca0b925480fe /arch/x86/kernel/pci-dma.c | |
parent | cb5867a5d8ca20e16ddc3397c36ee9c2e4cba219 (diff) |
x86: move x86_64-specific to common code.
This patch moves the bootmem functions, that are largely
x86_64-specific into pci-dma.c. The code goes inside an ifdef.
Signed-off-by: Glauber Costa <gcosta@redhat.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'arch/x86/kernel/pci-dma.c')
-rw-r--r-- | arch/x86/kernel/pci-dma.c | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/arch/x86/kernel/pci-dma.c b/arch/x86/kernel/pci-dma.c index 6b77fd872a7a..91443361cb67 100644 --- a/arch/x86/kernel/pci-dma.c +++ b/arch/x86/kernel/pci-dma.c | |||
@@ -1,6 +1,9 @@ | |||
1 | #include <linux/dma-mapping.h> | 1 | #include <linux/dma-mapping.h> |
2 | #include <linux/dmar.h> | 2 | #include <linux/dmar.h> |
3 | #include <linux/bootmem.h> | ||
3 | 4 | ||
5 | #include <asm/proto.h> | ||
6 | #include <asm/dma.h> | ||
4 | #include <asm/gart.h> | 7 | #include <asm/gart.h> |
5 | #include <asm/calgary.h> | 8 | #include <asm/calgary.h> |
6 | 9 | ||
@@ -26,6 +29,76 @@ int dma_set_mask(struct device *dev, u64 mask) | |||
26 | } | 29 | } |
27 | EXPORT_SYMBOL(dma_set_mask); | 30 | EXPORT_SYMBOL(dma_set_mask); |
28 | 31 | ||
32 | #ifdef CONFIG_X86_64 | ||
33 | static __initdata void *dma32_bootmem_ptr; | ||
34 | static unsigned long dma32_bootmem_size __initdata = (128ULL<<20); | ||
35 | |||
36 | static int __init parse_dma32_size_opt(char *p) | ||
37 | { | ||
38 | if (!p) | ||
39 | return -EINVAL; | ||
40 | dma32_bootmem_size = memparse(p, &p); | ||
41 | return 0; | ||
42 | } | ||
43 | early_param("dma32_size", parse_dma32_size_opt); | ||
44 | |||
45 | void __init dma32_reserve_bootmem(void) | ||
46 | { | ||
47 | unsigned long size, align; | ||
48 | if (end_pfn <= MAX_DMA32_PFN) | ||
49 | return; | ||
50 | |||
51 | align = 64ULL<<20; | ||
52 | size = round_up(dma32_bootmem_size, align); | ||
53 | dma32_bootmem_ptr = __alloc_bootmem_nopanic(size, align, | ||
54 | __pa(MAX_DMA_ADDRESS)); | ||
55 | if (dma32_bootmem_ptr) | ||
56 | dma32_bootmem_size = size; | ||
57 | else | ||
58 | dma32_bootmem_size = 0; | ||
59 | } | ||
60 | static void __init dma32_free_bootmem(void) | ||
61 | { | ||
62 | int node; | ||
63 | |||
64 | if (end_pfn <= MAX_DMA32_PFN) | ||
65 | return; | ||
66 | |||
67 | if (!dma32_bootmem_ptr) | ||
68 | return; | ||
69 | |||
70 | for_each_online_node(node) | ||
71 | free_bootmem_node(NODE_DATA(node), __pa(dma32_bootmem_ptr), | ||
72 | dma32_bootmem_size); | ||
73 | |||
74 | dma32_bootmem_ptr = NULL; | ||
75 | dma32_bootmem_size = 0; | ||
76 | } | ||
77 | |||
78 | void __init pci_iommu_alloc(void) | ||
79 | { | ||
80 | /* free the range so iommu could get some range less than 4G */ | ||
81 | dma32_free_bootmem(); | ||
82 | /* | ||
83 | * The order of these functions is important for | ||
84 | * fall-back/fail-over reasons | ||
85 | */ | ||
86 | #ifdef CONFIG_GART_IOMMU | ||
87 | gart_iommu_hole_init(); | ||
88 | #endif | ||
89 | |||
90 | #ifdef CONFIG_CALGARY_IOMMU | ||
91 | detect_calgary(); | ||
92 | #endif | ||
93 | |||
94 | detect_intel_iommu(); | ||
95 | |||
96 | #ifdef CONFIG_SWIOTLB | ||
97 | pci_swiotlb_init(); | ||
98 | #endif | ||
99 | } | ||
100 | #endif | ||
101 | |||
29 | static int __init pci_iommu_init(void) | 102 | static int __init pci_iommu_init(void) |
30 | { | 103 | { |
31 | #ifdef CONFIG_CALGARY_IOMMU | 104 | #ifdef CONFIG_CALGARY_IOMMU |