diff options
author | Guennadi Liakhovetski <lg@denx.de> | 2008-02-29 21:12:57 +0100 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2008-03-06 12:18:17 +0000 |
commit | be73a347ec7799aec0aa1008bd991f93dbfa80e8 (patch) | |
tree | f1eb1420be7e9c593c303392b955d7ebd0582f14 /arch/arm/mach-orion/common.c | |
parent | 29e8c3c304b62f31b799565c9ee85d42bd163f80 (diff) | |
download | lwn-be73a347ec7799aec0aa1008bd991f93dbfa80e8.tar.gz lwn-be73a347ec7799aec0aa1008bd991f93dbfa80e8.zip |
[ARM] 4845/1: Orion: Ignore memory tags with invalid data
The DNS-323, Kurobox-Pro / Linkstation-Pro, QNAP TS-109/TS-209 and some
other orion-based systems have several bogus memory entries in the tag
table, which causes the system to crash at startup. Ignore them by
resetting the tag ID to 0 in a machine fixup function.
Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'arch/arm/mach-orion/common.c')
-rw-r--r-- | arch/arm/mach-orion/common.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/arch/arm/mach-orion/common.c b/arch/arm/mach-orion/common.c index 5f0ee4b8a9b7..2d6d413f0235 100644 --- a/arch/arm/mach-orion/common.c +++ b/arch/arm/mach-orion/common.c @@ -17,7 +17,9 @@ #include <linux/mv643xx_eth.h> #include <linux/mv643xx_i2c.h> #include <asm/page.h> +#include <asm/setup.h> #include <asm/timex.h> +#include <asm/mach/arch.h> #include <asm/mach/map.h> #include <asm/arch/hardware.h> #include "common.h" @@ -347,3 +349,21 @@ void __init orion_init(void) platform_device_register(&orion_ehci1); platform_device_register(&orion_i2c); } + +/* + * Many orion-based systems have buggy bootloader implementations. + * This is a common fixup for bogus memory tags. + */ +void __init tag_fixup_mem32(struct machine_desc *mdesc, struct tag *t, + char **from, struct meminfo *meminfo) +{ + for (; t->hdr.size; t = tag_next(t)) + if (t->hdr.tag == ATAG_MEM && + (!t->u.mem.size || t->u.mem.size & ~PAGE_MASK || + t->u.mem.start & ~PAGE_MASK)) { + printk(KERN_WARNING + "Clearing invalid memory bank %dKB@0x%08x\n", + t->u.mem.size / 1024, t->u.mem.start); + t->hdr.tag = 0; + } +} |