aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Ritz <daniel.ritz@gmx.ch>2005-09-08 18:57:14 -0400
committerLinus Torvalds <torvalds@g5.osdl.org>2005-09-09 18:25:46 -0400
commitf0eca9626c6becb6fc56106b2e4287c6c784af3d (patch)
tree552a52f367d9d964d4ac3f86ccacfd538aa610c3
parent41d0ab2a7dfe9e25504169c98eac5e84e5509e3d (diff)
[PATCH] Update PCI IOMEM allocation start
This fixes the problem with "Averatec 6240 pcmcia_socket0: unable to apply power", which was due to the CardBus IOMEM register region being allocated at an address that was actually inside the RAM window that had been reserved for video frame-buffers in an UMA setup. The BIOS _should_ have marked that region reserved in the e820 memory descriptor tables, but did not. It is fixed by rounding up the default starting address of PCI memory allocations, so that we leave a bigger gap after the final known memory location. The amount of rounding depends on how big the unused memory gap is that we can allocate IOMEM from. Based on example code by Linus. Acked-by: Greg KH <greg@kroah.com> Acked-by: Ivan Kokshaysky <ink@jurassic.park.msu.ru> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r--arch/i386/kernel/setup.c16
-rw-r--r--arch/x86_64/kernel/e820.c16
2 files changed, 16 insertions, 16 deletions
diff --git a/arch/i386/kernel/setup.c b/arch/i386/kernel/setup.c
index fa0c69eb937a..f3d808451d25 100644
--- a/arch/i386/kernel/setup.c
+++ b/arch/i386/kernel/setup.c
@@ -1300,7 +1300,7 @@ legacy_init_iomem_resources(struct resource *code_resource, struct resource *dat
1300 */ 1300 */
1301static void __init register_memory(void) 1301static void __init register_memory(void)
1302{ 1302{
1303 unsigned long gapstart, gapsize; 1303 unsigned long gapstart, gapsize, round;
1304 unsigned long long last; 1304 unsigned long long last;
1305 int i; 1305 int i;
1306 1306
@@ -1345,14 +1345,14 @@ static void __init register_memory(void)
1345 } 1345 }
1346 1346
1347 /* 1347 /*
1348 * Start allocating dynamic PCI memory a bit into the gap, 1348 * See how much we want to round up: start off with
1349 * aligned up to the nearest megabyte. 1349 * rounding to the next 1MB area.
1350 *
1351 * Question: should we try to pad it up a bit (do something
1352 * like " + (gapsize >> 3)" in there too?). We now have the
1353 * technology.
1354 */ 1350 */
1355 pci_mem_start = (gapstart + 0xfffff) & ~0xfffff; 1351 round = 0x100000;
1352 while ((gapsize >> 4) > round)
1353 round += round;
1354 /* Fun with two's complement */
1355 pci_mem_start = (gapstart + round) & -round;
1356 1356
1357 printk("Allocating PCI resources starting at %08lx (gap: %08lx:%08lx)\n", 1357 printk("Allocating PCI resources starting at %08lx (gap: %08lx:%08lx)\n",
1358 pci_mem_start, gapstart, gapsize); 1358 pci_mem_start, gapstart, gapsize);
diff --git a/arch/x86_64/kernel/e820.c b/arch/x86_64/kernel/e820.c
index 116ac5f53dce..bb0ae18ec02b 100644
--- a/arch/x86_64/kernel/e820.c
+++ b/arch/x86_64/kernel/e820.c
@@ -567,7 +567,7 @@ unsigned long pci_mem_start = 0xaeedbabe;
567 */ 567 */
568__init void e820_setup_gap(void) 568__init void e820_setup_gap(void)
569{ 569{
570 unsigned long gapstart, gapsize; 570 unsigned long gapstart, gapsize, round;
571 unsigned long last; 571 unsigned long last;
572 int i; 572 int i;
573 int found = 0; 573 int found = 0;
@@ -604,14 +604,14 @@ __init void e820_setup_gap(void)
604 } 604 }
605 605
606 /* 606 /*
607 * Start allocating dynamic PCI memory a bit into the gap, 607 * See how much we want to round up: start off with
608 * aligned up to the nearest megabyte. 608 * rounding to the next 1MB area.
609 *
610 * Question: should we try to pad it up a bit (do something
611 * like " + (gapsize >> 3)" in there too?). We now have the
612 * technology.
613 */ 609 */
614 pci_mem_start = (gapstart + 0xfffff) & ~0xfffff; 610 round = 0x100000;
611 while ((gapsize >> 4) > round)
612 round += round;
613 /* Fun with two's complement */
614 pci_mem_start = (gapstart + round) & -round;
615 615
616 printk(KERN_INFO "Allocating PCI resources starting at %lx (gap: %lx:%lx)\n", 616 printk(KERN_INFO "Allocating PCI resources starting at %lx (gap: %lx:%lx)\n",
617 pci_mem_start, gapstart, gapsize); 617 pci_mem_start, gapstart, gapsize);