diff options
author | Ingo Molnar <mingo@elte.hu> | 2008-01-30 07:30:09 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-01-30 07:30:09 -0500 |
commit | c140df973c07ac328aafd19d4f4c413f2f8902df (patch) | |
tree | bed9df605a514e40fd0132ba13050596367f02d2 | |
parent | 5bafb671e20d2a3721589378681326197fc37a5f (diff) |
x86: clean up arch/x86/kernel/aperture_64.c
whitespace cleanup. No code changed:
text data bss dec hex filename
2080 76 4 2160 870 aperture_64.o.before
2080 76 4 2160 870 aperture_64.o.after
errors lines of code errors/KLOC
arch/x86/kernel/aperture_64.c 114 299 381.2
arch/x86/kernel/aperture_64.c 0 315 0
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
-rw-r--r-- | arch/x86/kernel/aperture_64.c | 244 |
1 files changed, 130 insertions, 114 deletions
diff --git a/arch/x86/kernel/aperture_64.c b/arch/x86/kernel/aperture_64.c index 5b6992799c9d..250db0527f5d 100644 --- a/arch/x86/kernel/aperture_64.c +++ b/arch/x86/kernel/aperture_64.c | |||
@@ -1,12 +1,12 @@ | |||
1 | /* | 1 | /* |
2 | * Firmware replacement code. | 2 | * Firmware replacement code. |
3 | * | 3 | * |
4 | * Work around broken BIOSes that don't set an aperture or only set the | 4 | * Work around broken BIOSes that don't set an aperture or only set the |
5 | * aperture in the AGP bridge. | 5 | * aperture in the AGP bridge. |
6 | * If all fails map the aperture over some low memory. This is cheaper than | 6 | * If all fails map the aperture over some low memory. This is cheaper than |
7 | * doing bounce buffering. The memory is lost. This is done at early boot | 7 | * doing bounce buffering. The memory is lost. This is done at early boot |
8 | * because only the bootmem allocator can allocate 32+MB. | 8 | * because only the bootmem allocator can allocate 32+MB. |
9 | * | 9 | * |
10 | * Copyright 2002 Andi Kleen, SuSE Labs. | 10 | * Copyright 2002 Andi Kleen, SuSE Labs. |
11 | */ | 11 | */ |
12 | #include <linux/kernel.h> | 12 | #include <linux/kernel.h> |
@@ -30,7 +30,7 @@ int gart_iommu_aperture_disabled __initdata = 0; | |||
30 | int gart_iommu_aperture_allowed __initdata = 0; | 30 | int gart_iommu_aperture_allowed __initdata = 0; |
31 | 31 | ||
32 | int fallback_aper_order __initdata = 1; /* 64MB */ | 32 | int fallback_aper_order __initdata = 1; /* 64MB */ |
33 | int fallback_aper_force __initdata = 0; | 33 | int fallback_aper_force __initdata = 0; |
34 | 34 | ||
35 | int fix_aperture __initdata = 1; | 35 | int fix_aperture __initdata = 1; |
36 | 36 | ||
@@ -49,20 +49,20 @@ static void __init insert_aperture_resource(u32 aper_base, u32 aper_size) | |||
49 | /* This code runs before the PCI subsystem is initialized, so just | 49 | /* This code runs before the PCI subsystem is initialized, so just |
50 | access the northbridge directly. */ | 50 | access the northbridge directly. */ |
51 | 51 | ||
52 | static u32 __init allocate_aperture(void) | 52 | static u32 __init allocate_aperture(void) |
53 | { | 53 | { |
54 | u32 aper_size; | 54 | u32 aper_size; |
55 | void *p; | 55 | void *p; |
56 | 56 | ||
57 | if (fallback_aper_order > 7) | 57 | if (fallback_aper_order > 7) |
58 | fallback_aper_order = 7; | 58 | fallback_aper_order = 7; |
59 | aper_size = (32 * 1024 * 1024) << fallback_aper_order; | 59 | aper_size = (32 * 1024 * 1024) << fallback_aper_order; |
60 | 60 | ||
61 | /* | 61 | /* |
62 | * Aperture has to be naturally aligned. This means an 2GB aperture won't | 62 | * Aperture has to be naturally aligned. This means a 2GB aperture |
63 | * have much chance of finding a place in the lower 4GB of memory. | 63 | * won't have much chance of finding a place in the lower 4GB of |
64 | * Unfortunately we cannot move it up because that would make the | 64 | * memory. Unfortunately we cannot move it up because that would |
65 | * IOMMU useless. | 65 | * make the IOMMU useless. |
66 | */ | 66 | */ |
67 | p = __alloc_bootmem_nopanic(aper_size, aper_size, 0); | 67 | p = __alloc_bootmem_nopanic(aper_size, aper_size, 0); |
68 | if (!p || __pa(p)+aper_size > 0xffffffff) { | 68 | if (!p || __pa(p)+aper_size > 0xffffffff) { |
@@ -73,54 +73,60 @@ static u32 __init allocate_aperture(void) | |||
73 | return 0; | 73 | return 0; |
74 | } | 74 | } |
75 | printk("Mapping aperture over %d KB of RAM @ %lx\n", | 75 | printk("Mapping aperture over %d KB of RAM @ %lx\n", |
76 | aper_size >> 10, __pa(p)); | 76 | aper_size >> 10, __pa(p)); |
77 | insert_aperture_resource((u32)__pa(p), aper_size); | 77 | insert_aperture_resource((u32)__pa(p), aper_size); |
78 | return (u32)__pa(p); | 78 | |
79 | return (u32)__pa(p); | ||
79 | } | 80 | } |
80 | 81 | ||
81 | static int __init aperture_valid(u64 aper_base, u32 aper_size) | 82 | static int __init aperture_valid(u64 aper_base, u32 aper_size) |
82 | { | 83 | { |
83 | if (!aper_base) | 84 | if (!aper_base) |
84 | return 0; | 85 | return 0; |
85 | if (aper_size < 64*1024*1024) { | 86 | if (aper_size < 64*1024*1024) { |
86 | printk("Aperture too small (%d MB)\n", aper_size>>20); | 87 | printk("Aperture too small (%d MB)\n", aper_size>>20); |
87 | return 0; | 88 | return 0; |
88 | } | 89 | } |
89 | if (aper_base + aper_size > 0x100000000UL) { | 90 | if (aper_base + aper_size > 0x100000000UL) { |
90 | printk("Aperture beyond 4GB. Ignoring.\n"); | 91 | printk("Aperture beyond 4GB. Ignoring.\n"); |
91 | return 0; | 92 | return 0; |
92 | } | 93 | } |
93 | if (e820_any_mapped(aper_base, aper_base + aper_size, E820_RAM)) { | 94 | if (e820_any_mapped(aper_base, aper_base + aper_size, E820_RAM)) { |
94 | printk("Aperture pointing to e820 RAM. Ignoring.\n"); | 95 | printk("Aperture pointing to e820 RAM. Ignoring.\n"); |
95 | return 0; | 96 | return 0; |
96 | } | 97 | } |
97 | return 1; | 98 | return 1; |
98 | } | 99 | } |
99 | 100 | ||
100 | /* Find a PCI capability */ | 101 | /* Find a PCI capability */ |
101 | static __u32 __init find_cap(int num, int slot, int func, int cap) | 102 | static __u32 __init find_cap(int num, int slot, int func, int cap) |
102 | { | 103 | { |
103 | u8 pos; | ||
104 | int bytes; | 104 | int bytes; |
105 | if (!(read_pci_config_16(num,slot,func,PCI_STATUS) & PCI_STATUS_CAP_LIST)) | 105 | u8 pos; |
106 | |||
107 | if (!(read_pci_config_16(num, slot, func, PCI_STATUS) & | ||
108 | PCI_STATUS_CAP_LIST)) | ||
106 | return 0; | 109 | return 0; |
107 | pos = read_pci_config_byte(num,slot,func,PCI_CAPABILITY_LIST); | 110 | |
108 | for (bytes = 0; bytes < 48 && pos >= 0x40; bytes++) { | 111 | pos = read_pci_config_byte(num, slot, func, PCI_CAPABILITY_LIST); |
112 | for (bytes = 0; bytes < 48 && pos >= 0x40; bytes++) { | ||
109 | u8 id; | 113 | u8 id; |
110 | pos &= ~3; | 114 | |
111 | id = read_pci_config_byte(num,slot,func,pos+PCI_CAP_LIST_ID); | 115 | pos &= ~3; |
116 | id = read_pci_config_byte(num, slot, func, pos+PCI_CAP_LIST_ID); | ||
112 | if (id == 0xff) | 117 | if (id == 0xff) |
113 | break; | 118 | break; |
114 | if (id == cap) | 119 | if (id == cap) |
115 | return pos; | 120 | return pos; |
116 | pos = read_pci_config_byte(num,slot,func,pos+PCI_CAP_LIST_NEXT); | 121 | pos = read_pci_config_byte(num, slot, func, |
117 | } | 122 | pos+PCI_CAP_LIST_NEXT); |
123 | } | ||
118 | return 0; | 124 | return 0; |
119 | } | 125 | } |
120 | 126 | ||
121 | /* Read a standard AGPv3 bridge header */ | 127 | /* Read a standard AGPv3 bridge header */ |
122 | static __u32 __init read_agp(int num, int slot, int func, int cap, u32 *order) | 128 | static __u32 __init read_agp(int num, int slot, int func, int cap, u32 *order) |
123 | { | 129 | { |
124 | u32 apsize; | 130 | u32 apsize; |
125 | u32 apsizereg; | 131 | u32 apsizereg; |
126 | int nbits; | 132 | int nbits; |
@@ -128,7 +134,7 @@ static __u32 __init read_agp(int num, int slot, int func, int cap, u32 *order) | |||
128 | u64 aper; | 134 | u64 aper; |
129 | 135 | ||
130 | printk("AGP bridge at %02x:%02x:%02x\n", num, slot, func); | 136 | printk("AGP bridge at %02x:%02x:%02x\n", num, slot, func); |
131 | apsizereg = read_pci_config_16(num,slot,func, cap + 0x14); | 137 | apsizereg = read_pci_config_16(num, slot, func, cap + 0x14); |
132 | if (apsizereg == 0xffffffff) { | 138 | if (apsizereg == 0xffffffff) { |
133 | printk("APSIZE in AGP bridge unreadable\n"); | 139 | printk("APSIZE in AGP bridge unreadable\n"); |
134 | return 0; | 140 | return 0; |
@@ -136,80 +142,84 @@ static __u32 __init read_agp(int num, int slot, int func, int cap, u32 *order) | |||
136 | 142 | ||
137 | apsize = apsizereg & 0xfff; | 143 | apsize = apsizereg & 0xfff; |
138 | /* Some BIOS use weird encodings not in the AGPv3 table. */ | 144 | /* Some BIOS use weird encodings not in the AGPv3 table. */ |
139 | if (apsize & 0xff) | 145 | if (apsize & 0xff) |
140 | apsize |= 0xf00; | 146 | apsize |= 0xf00; |
141 | nbits = hweight16(apsize); | 147 | nbits = hweight16(apsize); |
142 | *order = 7 - nbits; | 148 | *order = 7 - nbits; |
143 | if ((int)*order < 0) /* < 32MB */ | 149 | if ((int)*order < 0) /* < 32MB */ |
144 | *order = 0; | 150 | *order = 0; |
145 | 151 | ||
146 | aper_low = read_pci_config(num,slot,func, 0x10); | 152 | aper_low = read_pci_config(num, slot, func, 0x10); |
147 | aper_hi = read_pci_config(num,slot,func,0x14); | 153 | aper_hi = read_pci_config(num, slot, func, 0x14); |
148 | aper = (aper_low & ~((1<<22)-1)) | ((u64)aper_hi << 32); | 154 | aper = (aper_low & ~((1<<22)-1)) | ((u64)aper_hi << 32); |
149 | 155 | ||
150 | printk("Aperture from AGP @ %Lx size %u MB (APSIZE %x)\n", | 156 | printk("Aperture from AGP @ %Lx size %u MB (APSIZE %x)\n", |
151 | aper, 32 << *order, apsizereg); | 157 | aper, 32 << *order, apsizereg); |
152 | 158 | ||
153 | if (!aperture_valid(aper, (32*1024*1024) << *order)) | 159 | if (!aperture_valid(aper, (32*1024*1024) << *order)) |
154 | return 0; | 160 | return 0; |
155 | return (u32)aper; | 161 | return (u32)aper; |
156 | } | 162 | } |
157 | |||
158 | /* Look for an AGP bridge. Windows only expects the aperture in the | ||
159 | AGP bridge and some BIOS forget to initialize the Northbridge too. | ||
160 | Work around this here. | ||
161 | |||
162 | Do an PCI bus scan by hand because we're running before the PCI | ||
163 | subsystem. | ||
164 | 163 | ||
165 | All K8 AGP bridges are AGPv3 compliant, so we can do this scan | 164 | /* |
166 | generically. It's probably overkill to always scan all slots because | 165 | * Look for an AGP bridge. Windows only expects the aperture in the |
167 | the AGP bridges should be always an own bus on the HT hierarchy, | 166 | * AGP bridge and some BIOS forget to initialize the Northbridge too. |
168 | but do it here for future safety. */ | 167 | * Work around this here. |
168 | * | ||
169 | * Do an PCI bus scan by hand because we're running before the PCI | ||
170 | * subsystem. | ||
171 | * | ||
172 | * All K8 AGP bridges are AGPv3 compliant, so we can do this scan | ||
173 | * generically. It's probably overkill to always scan all slots because | ||
174 | * the AGP bridges should be always an own bus on the HT hierarchy, | ||
175 | * but do it here for future safety. | ||
176 | */ | ||
169 | static __u32 __init search_agp_bridge(u32 *order, int *valid_agp) | 177 | static __u32 __init search_agp_bridge(u32 *order, int *valid_agp) |
170 | { | 178 | { |
171 | int num, slot, func; | 179 | int num, slot, func; |
172 | 180 | ||
173 | /* Poor man's PCI discovery */ | 181 | /* Poor man's PCI discovery */ |
174 | for (num = 0; num < 256; num++) { | 182 | for (num = 0; num < 256; num++) { |
175 | for (slot = 0; slot < 32; slot++) { | 183 | for (slot = 0; slot < 32; slot++) { |
176 | for (func = 0; func < 8; func++) { | 184 | for (func = 0; func < 8; func++) { |
177 | u32 class, cap; | 185 | u32 class, cap; |
178 | u8 type; | 186 | u8 type; |
179 | class = read_pci_config(num,slot,func, | 187 | class = read_pci_config(num, slot, func, |
180 | PCI_CLASS_REVISION); | 188 | PCI_CLASS_REVISION); |
181 | if (class == 0xffffffff) | 189 | if (class == 0xffffffff) |
182 | break; | 190 | break; |
183 | 191 | ||
184 | switch (class >> 16) { | 192 | switch (class >> 16) { |
185 | case PCI_CLASS_BRIDGE_HOST: | 193 | case PCI_CLASS_BRIDGE_HOST: |
186 | case PCI_CLASS_BRIDGE_OTHER: /* needed? */ | 194 | case PCI_CLASS_BRIDGE_OTHER: /* needed? */ |
187 | /* AGP bridge? */ | 195 | /* AGP bridge? */ |
188 | cap = find_cap(num,slot,func,PCI_CAP_ID_AGP); | 196 | cap = find_cap(num, slot, func, |
197 | PCI_CAP_ID_AGP); | ||
189 | if (!cap) | 198 | if (!cap) |
190 | break; | 199 | break; |
191 | *valid_agp = 1; | 200 | *valid_agp = 1; |
192 | return read_agp(num,slot,func,cap,order); | 201 | return read_agp(num, slot, func, cap, |
193 | } | 202 | order); |
194 | 203 | } | |
204 | |||
195 | /* No multi-function device? */ | 205 | /* No multi-function device? */ |
196 | type = read_pci_config_byte(num,slot,func, | 206 | type = read_pci_config_byte(num, slot, func, |
197 | PCI_HEADER_TYPE); | 207 | PCI_HEADER_TYPE); |
198 | if (!(type & 0x80)) | 208 | if (!(type & 0x80)) |
199 | break; | 209 | break; |
200 | } | 210 | } |
201 | } | 211 | } |
202 | } | 212 | } |
203 | printk("No AGP bridge found\n"); | 213 | printk("No AGP bridge found\n"); |
214 | |||
204 | return 0; | 215 | return 0; |
205 | } | 216 | } |
206 | 217 | ||
207 | void __init gart_iommu_hole_init(void) | 218 | void __init gart_iommu_hole_init(void) |
208 | { | 219 | { |
209 | int fix, num; | ||
210 | u32 aper_size, aper_alloc = 0, aper_order = 0, last_aper_order = 0; | 220 | u32 aper_size, aper_alloc = 0, aper_order = 0, last_aper_order = 0; |
211 | u64 aper_base, last_aper_base = 0; | 221 | u64 aper_base, last_aper_base = 0; |
212 | int valid_agp = 0; | 222 | int fix, num, valid_agp = 0; |
213 | 223 | ||
214 | if (gart_iommu_aperture_disabled || !fix_aperture || | 224 | if (gart_iommu_aperture_disabled || !fix_aperture || |
215 | !early_pci_allowed()) | 225 | !early_pci_allowed()) |
@@ -218,24 +228,24 @@ void __init gart_iommu_hole_init(void) | |||
218 | printk(KERN_INFO "Checking aperture...\n"); | 228 | printk(KERN_INFO "Checking aperture...\n"); |
219 | 229 | ||
220 | fix = 0; | 230 | fix = 0; |
221 | for (num = 24; num < 32; num++) { | 231 | for (num = 24; num < 32; num++) { |
222 | if (!early_is_k8_nb(read_pci_config(0, num, 3, 0x00))) | 232 | if (!early_is_k8_nb(read_pci_config(0, num, 3, 0x00))) |
223 | continue; | 233 | continue; |
224 | 234 | ||
225 | iommu_detected = 1; | 235 | iommu_detected = 1; |
226 | gart_iommu_aperture = 1; | 236 | gart_iommu_aperture = 1; |
227 | 237 | ||
228 | aper_order = (read_pci_config(0, num, 3, 0x90) >> 1) & 7; | 238 | aper_order = (read_pci_config(0, num, 3, 0x90) >> 1) & 7; |
229 | aper_size = (32 * 1024 * 1024) << aper_order; | 239 | aper_size = (32 * 1024 * 1024) << aper_order; |
230 | aper_base = read_pci_config(0, num, 3, 0x94) & 0x7fff; | 240 | aper_base = read_pci_config(0, num, 3, 0x94) & 0x7fff; |
231 | aper_base <<= 25; | 241 | aper_base <<= 25; |
232 | 242 | ||
233 | printk("CPU %d: aperture @ %Lx size %u MB\n", num-24, | 243 | printk("CPU %d: aperture @ %Lx size %u MB\n", num-24, |
234 | aper_base, aper_size>>20); | 244 | aper_base, aper_size>>20); |
235 | 245 | ||
236 | if (!aperture_valid(aper_base, aper_size)) { | 246 | if (!aperture_valid(aper_base, aper_size)) { |
237 | fix = 1; | 247 | fix = 1; |
238 | break; | 248 | break; |
239 | } | 249 | } |
240 | 250 | ||
241 | if ((last_aper_order && aper_order != last_aper_order) || | 251 | if ((last_aper_order && aper_order != last_aper_order) || |
@@ -245,27 +255,28 @@ void __init gart_iommu_hole_init(void) | |||
245 | } | 255 | } |
246 | last_aper_order = aper_order; | 256 | last_aper_order = aper_order; |
247 | last_aper_base = aper_base; | 257 | last_aper_base = aper_base; |
248 | } | 258 | } |
249 | 259 | ||
250 | if (!fix && !fallback_aper_force) { | 260 | if (!fix && !fallback_aper_force) { |
251 | if (last_aper_base) { | 261 | if (last_aper_base) { |
252 | unsigned long n = (32 * 1024 * 1024) << last_aper_order; | 262 | unsigned long n = (32 * 1024 * 1024) << last_aper_order; |
263 | |||
253 | insert_aperture_resource((u32)last_aper_base, n); | 264 | insert_aperture_resource((u32)last_aper_base, n); |
254 | } | 265 | } |
255 | return; | 266 | return; |
256 | } | 267 | } |
257 | 268 | ||
258 | if (!fallback_aper_force) | 269 | if (!fallback_aper_force) |
259 | aper_alloc = search_agp_bridge(&aper_order, &valid_agp); | 270 | aper_alloc = search_agp_bridge(&aper_order, &valid_agp); |
260 | 271 | ||
261 | if (aper_alloc) { | 272 | if (aper_alloc) { |
262 | /* Got the aperture from the AGP bridge */ | 273 | /* Got the aperture from the AGP bridge */ |
263 | } else if (swiotlb && !valid_agp) { | 274 | } else if (swiotlb && !valid_agp) { |
264 | /* Do nothing */ | 275 | /* Do nothing */ |
265 | } else if ((!no_iommu && end_pfn > MAX_DMA32_PFN) || | 276 | } else if ((!no_iommu && end_pfn > MAX_DMA32_PFN) || |
266 | force_iommu || | 277 | force_iommu || |
267 | valid_agp || | 278 | valid_agp || |
268 | fallback_aper_force) { | 279 | fallback_aper_force) { |
269 | printk("Your BIOS doesn't leave a aperture memory hole\n"); | 280 | printk("Your BIOS doesn't leave a aperture memory hole\n"); |
270 | printk("Please enable the IOMMU option in the BIOS setup\n"); | 281 | printk("Please enable the IOMMU option in the BIOS setup\n"); |
271 | printk("This costs you %d MB of RAM\n", | 282 | printk("This costs you %d MB of RAM\n", |
@@ -273,27 +284,32 @@ void __init gart_iommu_hole_init(void) | |||
273 | 284 | ||
274 | aper_order = fallback_aper_order; | 285 | aper_order = fallback_aper_order; |
275 | aper_alloc = allocate_aperture(); | 286 | aper_alloc = allocate_aperture(); |
276 | if (!aper_alloc) { | 287 | if (!aper_alloc) { |
277 | /* Could disable AGP and IOMMU here, but it's probably | 288 | /* |
278 | not worth it. But the later users cannot deal with | 289 | * Could disable AGP and IOMMU here, but it's |
279 | bad apertures and turning on the aperture over memory | 290 | * probably not worth it. But the later users |
280 | causes very strange problems, so it's better to | 291 | * cannot deal with bad apertures and turning |
281 | panic early. */ | 292 | * on the aperture over memory causes very |
293 | * strange problems, so it's better to panic | ||
294 | * early. | ||
295 | */ | ||
282 | panic("Not enough memory for aperture"); | 296 | panic("Not enough memory for aperture"); |
283 | } | 297 | } |
284 | } else { | 298 | } else { |
285 | return; | 299 | return; |
286 | } | 300 | } |
287 | 301 | ||
288 | /* Fix up the north bridges */ | 302 | /* Fix up the north bridges */ |
289 | for (num = 24; num < 32; num++) { | 303 | for (num = 24; num < 32; num++) { |
290 | if (!early_is_k8_nb(read_pci_config(0, num, 3, 0x00))) | 304 | if (!early_is_k8_nb(read_pci_config(0, num, 3, 0x00))) |
291 | continue; | 305 | continue; |
292 | 306 | ||
293 | /* Don't enable translation yet. That is done later. | 307 | /* |
294 | Assume this BIOS didn't initialise the GART so | 308 | * Don't enable translation yet. That is done later. |
295 | just overwrite all previous bits */ | 309 | * Assume this BIOS didn't initialise the GART so |
296 | write_pci_config(0, num, 3, 0x90, aper_order<<1); | 310 | * just overwrite all previous bits |
297 | write_pci_config(0, num, 3, 0x94, aper_alloc>>25); | 311 | */ |
298 | } | 312 | write_pci_config(0, num, 3, 0x90, aper_order<<1); |
299 | } | 313 | write_pci_config(0, num, 3, 0x94, aper_alloc>>25); |
314 | } | ||
315 | } | ||