diff options
author | Jeremy Fitzhardinge <jeremy@goop.org> | 2009-02-07 18:39:38 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-02-09 07:33:51 -0500 |
commit | 1c14fa4937eb73509e07ac12bf8db1fdf4c42a59 (patch) | |
tree | d137f1587078f2909a2df48a5206ca1e9751f47f /arch | |
parent | d5b562330ec766292a3ac54ae5e0673610bd5b3d (diff) |
x86: use early_ioremap in __acpi_map_table
__acpi_map_table() effectively reimplements early_ioremap(). Rather
than have that duplication, just implement it in terms of
early_ioremap().
However, unlike early_ioremap(), __acpi_map_table() just maintains a
single mapping which gets replaced each call, and has no corresponding
unmap function. Implement this by just removing the previous mapping
each time its called. Unfortunately, this will leave a stray mapping
at the end.
Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/x86/include/asm/acpi.h | 3 | ||||
-rw-r--r-- | arch/x86/include/asm/fixmap_32.h | 4 | ||||
-rw-r--r-- | arch/x86/include/asm/fixmap_64.h | 4 | ||||
-rw-r--r-- | arch/x86/kernel/acpi/boot.c | 27 |
4 files changed, 7 insertions, 31 deletions
diff --git a/arch/x86/include/asm/acpi.h b/arch/x86/include/asm/acpi.h index 9830681446ad..4518dc500903 100644 --- a/arch/x86/include/asm/acpi.h +++ b/arch/x86/include/asm/acpi.h | |||
@@ -102,9 +102,6 @@ static inline void disable_acpi(void) | |||
102 | acpi_noirq = 1; | 102 | acpi_noirq = 1; |
103 | } | 103 | } |
104 | 104 | ||
105 | /* Fixmap pages to reserve for ACPI boot-time tables (see fixmap.h) */ | ||
106 | #define FIX_ACPI_PAGES 4 | ||
107 | |||
108 | extern int acpi_gsi_to_irq(u32 gsi, unsigned int *irq); | 105 | extern int acpi_gsi_to_irq(u32 gsi, unsigned int *irq); |
109 | 106 | ||
110 | static inline void acpi_noirq_set(void) { acpi_noirq = 1; } | 107 | static inline void acpi_noirq_set(void) { acpi_noirq = 1; } |
diff --git a/arch/x86/include/asm/fixmap_32.h b/arch/x86/include/asm/fixmap_32.h index c7115c1d7217..047d9bab2b31 100644 --- a/arch/x86/include/asm/fixmap_32.h +++ b/arch/x86/include/asm/fixmap_32.h | |||
@@ -95,10 +95,6 @@ enum fixed_addresses { | |||
95 | (__end_of_permanent_fixed_addresses & 255), | 95 | (__end_of_permanent_fixed_addresses & 255), |
96 | FIX_BTMAP_BEGIN = FIX_BTMAP_END + NR_FIX_BTMAPS*FIX_BTMAPS_SLOTS - 1, | 96 | FIX_BTMAP_BEGIN = FIX_BTMAP_END + NR_FIX_BTMAPS*FIX_BTMAPS_SLOTS - 1, |
97 | FIX_WP_TEST, | 97 | FIX_WP_TEST, |
98 | #ifdef CONFIG_ACPI | ||
99 | FIX_ACPI_BEGIN, | ||
100 | FIX_ACPI_END = FIX_ACPI_BEGIN + FIX_ACPI_PAGES - 1, | ||
101 | #endif | ||
102 | #ifdef CONFIG_PROVIDE_OHCI1394_DMA_INIT | 98 | #ifdef CONFIG_PROVIDE_OHCI1394_DMA_INIT |
103 | FIX_OHCI1394_BASE, | 99 | FIX_OHCI1394_BASE, |
104 | #endif | 100 | #endif |
diff --git a/arch/x86/include/asm/fixmap_64.h b/arch/x86/include/asm/fixmap_64.h index 00a30ab9b1a5..298d9ba3faeb 100644 --- a/arch/x86/include/asm/fixmap_64.h +++ b/arch/x86/include/asm/fixmap_64.h | |||
@@ -50,10 +50,6 @@ enum fixed_addresses { | |||
50 | FIX_PARAVIRT_BOOTMAP, | 50 | FIX_PARAVIRT_BOOTMAP, |
51 | #endif | 51 | #endif |
52 | __end_of_permanent_fixed_addresses, | 52 | __end_of_permanent_fixed_addresses, |
53 | #ifdef CONFIG_ACPI | ||
54 | FIX_ACPI_BEGIN, | ||
55 | FIX_ACPI_END = FIX_ACPI_BEGIN + FIX_ACPI_PAGES - 1, | ||
56 | #endif | ||
57 | #ifdef CONFIG_PROVIDE_OHCI1394_DMA_INIT | 53 | #ifdef CONFIG_PROVIDE_OHCI1394_DMA_INIT |
58 | FIX_OHCI1394_BASE, | 54 | FIX_OHCI1394_BASE, |
59 | #endif | 55 | #endif |
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c index d37593c2f438..c518599e4264 100644 --- a/arch/x86/kernel/acpi/boot.c +++ b/arch/x86/kernel/acpi/boot.c | |||
@@ -121,8 +121,8 @@ enum acpi_irq_model_id acpi_irq_model = ACPI_IRQ_MODEL_PIC; | |||
121 | */ | 121 | */ |
122 | char *__init __acpi_map_table(unsigned long phys, unsigned long size) | 122 | char *__init __acpi_map_table(unsigned long phys, unsigned long size) |
123 | { | 123 | { |
124 | unsigned long base, offset, mapped_size; | 124 | static char *prev_map; |
125 | int idx; | 125 | static unsigned long prev_size; |
126 | 126 | ||
127 | if (!phys || !size) | 127 | if (!phys || !size) |
128 | return NULL; | 128 | return NULL; |
@@ -130,26 +130,13 @@ char *__init __acpi_map_table(unsigned long phys, unsigned long size) | |||
130 | if (phys+size <= (max_low_pfn_mapped << PAGE_SHIFT)) | 130 | if (phys+size <= (max_low_pfn_mapped << PAGE_SHIFT)) |
131 | return __va(phys); | 131 | return __va(phys); |
132 | 132 | ||
133 | offset = phys & (PAGE_SIZE - 1); | 133 | if (prev_map) |
134 | mapped_size = PAGE_SIZE - offset; | 134 | early_iounmap(prev_map, prev_size); |
135 | clear_fixmap(FIX_ACPI_END); | ||
136 | set_fixmap(FIX_ACPI_END, phys); | ||
137 | base = fix_to_virt(FIX_ACPI_END); | ||
138 | 135 | ||
139 | /* | 136 | prev_size = size; |
140 | * Most cases can be covered by the below. | 137 | prev_map = early_ioremap(phys, size); |
141 | */ | ||
142 | idx = FIX_ACPI_END; | ||
143 | while (mapped_size < size) { | ||
144 | if (--idx < FIX_ACPI_BEGIN) | ||
145 | return NULL; /* cannot handle this */ | ||
146 | phys += PAGE_SIZE; | ||
147 | clear_fixmap(idx); | ||
148 | set_fixmap(idx, phys); | ||
149 | mapped_size += PAGE_SIZE; | ||
150 | } | ||
151 | 138 | ||
152 | return ((unsigned char *)base + offset); | 139 | return prev_map; |
153 | } | 140 | } |
154 | 141 | ||
155 | #ifdef CONFIG_PCI_MMCONFIG | 142 | #ifdef CONFIG_PCI_MMCONFIG |