aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIngo Molnar <mingo@elte.hu>2008-01-30 07:30:09 -0500
committerIngo Molnar <mingo@elte.hu>2008-01-30 07:30:09 -0500
commitc140df973c07ac328aafd19d4f4c413f2f8902df (patch)
treebed9df605a514e40fd0132ba13050596367f02d2
parent5bafb671e20d2a3721589378681326197fc37a5f (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.c244
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;
30int gart_iommu_aperture_allowed __initdata = 0; 30int gart_iommu_aperture_allowed __initdata = 0;
31 31
32int fallback_aper_order __initdata = 1; /* 64MB */ 32int fallback_aper_order __initdata = 1; /* 64MB */
33int fallback_aper_force __initdata = 0; 33int fallback_aper_force __initdata = 0;
34 34
35int fix_aperture __initdata = 1; 35int 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
52static u32 __init allocate_aperture(void) 52static 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
81static int __init aperture_valid(u64 aper_base, u32 aper_size) 82static 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 */
101static __u32 __init find_cap(int num, int slot, int func, int cap) 102static __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 */
122static __u32 __init read_agp(int num, int slot, int func, int cap, u32 *order) 128static __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 */
169static __u32 __init search_agp_bridge(u32 *order, int *valid_agp) 177static __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
207void __init gart_iommu_hole_init(void) 218void __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}