--- zzzz-none-000/linux-2.6.13.1/arch/mips/mips-boards/generic/memory.c 2005-09-10 02:42:58.000000000 +0000 +++ ohio-7170-487/linux-2.6.13.1/arch/mips/mips-boards/generic/memory.c 2006-11-09 09:11:12.000000000 +0000 @@ -28,25 +28,29 @@ #include -/*#define DEBUG*/ +/*--- #define DEBUG ---*/ +#define prom_printf printk enum yamon_memtypes { yamon_dontuse, yamon_prom, yamon_free, + yamon_flash, }; struct prom_pmemblock mdesc[PROM_MAX_PMEMBLOCKS]; #ifdef DEBUG -static char *mtypes[3] = { +static char *mtypes[] = { "Dont use memory", - "YAMON PROM memory", + "Urlader data memory", "Free memmory", + "Flash memmory" }; #endif /* References to section boundaries */ extern char _end; +extern char _text; #define PFN_ALIGN(x) (((unsigned long)(x) + (PAGE_SIZE - 1)) & PAGE_MASK) @@ -55,6 +59,8 @@ { char *memsize_str; unsigned int memsize; + char *flashsize_str; + unsigned int flashsize; memsize_str = prom_getenv("memsize"); if (!memsize_str) { @@ -66,9 +72,23 @@ #endif memsize = simple_strtol(memsize_str, NULL, 0); } + prom_printf("memsize=%u MByte\n", memsize >> 20); + + flashsize_str = prom_getenv("flashsize"); + if (!flashsize_str) { + prom_printf("flashsize not set in boot prom, set to default (8Mb)\n"); + flashsize = 0x00800000; + } else { +#ifdef DEBUG + prom_printf("prom_flashsize = %s\n", flashsize_str); +#endif + flashsize = simple_strtol(flashsize_str, NULL, 0); + } + prom_printf("flashsize=%u MByte\n", flashsize >> 20); memset(mdesc, 0, sizeof(mdesc)); +#if !defined(CONFIG_MIPS_OHIO) && !defined(CONFIG_MIPS_UR8) && !defined(CONFIG_MIPS_AR7) mdesc[0].type = yamon_dontuse; mdesc[0].base = 0x00000000; mdesc[0].size = 0x00001000; @@ -102,6 +122,55 @@ mdesc[4].base = CPHYSADDR(PFN_ALIGN(&_end)); mdesc[4].size = memsize - mdesc[4].base; +#else /*--- #if !defined(CONFIG_MIPS_OHIO) && !defined(CONFIG_MIPS_UR8) && !defined(CONFIG_MIPS_AR7) ---*/ + /*------------------------------------------------------------------------------------------*\ + * Memory Avail + * + * ROM 0x1000 0000 - 0x1040 0000 4MB + * ROM 0x1000 0000 - 0x1080 0000 8MB + * + * RAM 0x1400 0000 - 0x1500 0000 16MB + * RAM 0x1400 0000 - 0x1600 0000 32MB + * + * Memory Layout + * + * kernel 0x1400 0000 - 0x1460 0700 [0] + [1] + * Urlader 0x1460 0700 - 0x1470 0700 + * RAM 0x1470 0700 - 0x1500 0000 16MB + * RAM 0x1470 0700 - 0x1600 0000 32MB + * + \*------------------------------------------------------------------------------------------*/ + prom_printf("&_end=0x%p PFN_ALIGN(&_end)=0x%lx CPHYSADDR(PFN_ALIGN(&_end))=0x%x memsize=0x%x\n", + &_end, PFN_ALIGN(&_end), CPHYSADDR(PFN_ALIGN(&_end)), memsize); + + /*--- kernel ---*/ + mdesc[0].type = yamon_dontuse; + mdesc[0].base = CPHYSADDR(PFN_ALIGN(&_text)); + mdesc[0].size = CPHYSADDR(PFN_ALIGN(&_end)) - mdesc[0].base; + + mdesc[1].type = yamon_free; + mdesc[1].base = mdesc[0].base + mdesc[0].size; +#if defined(CONFIG_MIPS_OHIO) + mdesc[1].size = memsize - (mdesc[1].base - CONFIG_MIPS_OHIO_PHY_MEMSTART); +#elif defined(CONFIG_MIPS_AR7) + mdesc[1].size = memsize - (mdesc[1].base - CONFIG_MIPS_AR7_PHY_MEMSTART); +#elif defined(CONFIG_MIPS_UR8) + mdesc[1].size = memsize - (mdesc[1].base - CONFIG_MIPS_UR8_PHY_MEMSTART); +#endif + + mdesc[2].type = yamon_dontuse; + mdesc[2].base = 0; + mdesc[2].size = 0; + + mdesc[3].type = yamon_dontuse; + mdesc[3].base = 0; + mdesc[3].size = 0; + + mdesc[4].type = yamon_dontuse; + mdesc[4].base = 0x10000000; + mdesc[4].size = flashsize; + +#endif /*--- #else ---*/ /*--- #if !defined(CONFIG_MIPS_OHIO) && !defined(CONFIG_MIPS_UR8) && !defined(CONFIG_MIPS_AR7)---*/ return &mdesc[0]; } @@ -121,12 +190,13 @@ { struct prom_pmemblock *p; + #ifdef DEBUG prom_printf("YAMON MEMORY DESCRIPTOR dump:\n"); p = prom_getmdesc(); while (p->size) { int i = 0; - prom_printf("[%d,%p]: base<%08lx> size<%08lx> type<%s>\n", + prom_printf("[%d,%p]: base<%08lx> size<%08x> type<%s>\n", i, p, p->base, p->size, mtypes[p->type]); p++; i++; @@ -142,8 +212,8 @@ base = p->base; size = p->size; - add_memory_region(base, size, type); - p++; + add_memory_region(base, size, type); + p++; } }