Re: IBM Thinkpad G41 PCMCIA problems [Was: Yenta TI: ... no PCIinterrupts. Fish. Please report.]

From: Linus Torvalds
Date: Sun Feb 20 2005 - 12:57:08 EST




On Sun, 20 Feb 2005, Linus Torvalds wrote:
>
> But the PCI allocations are not at all limited by MAXMEM - they want to be
> in the low 4GB, but that's the only real limit. So using "max_low_pfn" to
> determine where to start PCI allocations is pretty bogus.
>
> I'll try to write something that actually looks at the e820 memory map
> properly.

Russell, what do your eagle-eyes think of a patch like this?

Steven, does this fix it without the need for any kernel command line (or
any other patches, for that matter - ie revert all the transparency-
changing ones)?

Linus

----
# This is a BitKeeper generated diff -Nru style patch.
#
# ChangeSet
# 2005/02/20 09:43:19-08:00 torvalds@xxxxxxxxxxxxxxx
# Use e820 memory map to determine PCI allocation area.
#
# Don't use the VM numbers (max_low_pfn and friends), since they depend
# on the partial kernel linear mapping and only partially on the actual
# physical memory layout.
#
# arch/i386/kernel/setup.c
# 2005/02/20 09:43:12-08:00 torvalds@xxxxxxxxxxxxxxx +19 -6
# Use e820 memory map to determine PCI allocation area.
#
# Don't use the VM numbers (max_low_pfn and friends), since they depend
# on the partial kernel linear mapping and only partially on the actual
# physical memory layout.
#
diff -Nru a/arch/i386/kernel/setup.c b/arch/i386/kernel/setup.c
--- a/arch/i386/kernel/setup.c 2005-02-20 09:54:35 -08:00
+++ b/arch/i386/kernel/setup.c 2005-02-20 09:54:35 -08:00
@@ -1166,9 +1166,10 @@
/*
* Request address space for all standard resources
*/
-static void __init register_memory(unsigned long max_low_pfn)
+static void __init register_memory(void)
{
- unsigned long low_mem_size;
+ long long gapsize;
+ unsigned long long last;
int i;

if (efi_enabled)
@@ -1184,9 +1185,21 @@
request_resource(&ioport_resource, &standard_io_resources[i]);

/* Tell the PCI layer not to allocate too close to the RAM area.. */
- low_mem_size = ((max_low_pfn << PAGE_SHIFT) + 0xfffff) & ~0xfffff;
- if (low_mem_size > pci_mem_start)
- pci_mem_start = low_mem_size;
+ last = 0x100000000ull;
+ gapsize = 0x400000;
+ i = e820.nr_map;
+ while (--i >= 0) {
+ unsigned long long start = e820.map[i].addr;
+ unsigned long long end = start + e820.map[i].size;
+ long long gap = last - end;
+
+ if (gap > gapsize) {
+ gapsize = gap;
+ pci_mem_start = ((unsigned long) end + 0xfffff) & ~0xfffff;
+ }
+ last = start;
+ }
+ printk("Allocating PCI resources starting at %08lx\n", pci_mem_start);
}

/* Use inline assembly to define this because the nops are defined
@@ -1432,7 +1445,7 @@
get_smp_config();
#endif

- register_memory(max_low_pfn);
+ register_memory();

#ifdef CONFIG_VT
#if defined(CONFIG_VGA_CONSOLE)
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/