diff options
Diffstat (limited to 'arch/arm/mm/mm-sa1100.c')
-rw-r--r-- | arch/arm/mm/mm-sa1100.c | 162 |
1 files changed, 98 insertions, 64 deletions
diff --git a/arch/arm/mm/mm-sa1100.c b/arch/arm/mm/mm-sa1100.c index 1cb1a3b58..5674dbe37 100644 --- a/arch/arm/mm/mm-sa1100.c +++ b/arch/arm/mm/mm-sa1100.c @@ -9,6 +9,10 @@ * 1999/12/04 Nicolas Pitre <nico@cam.org> * Converted memory definition for struct meminfo initialisations. * Memory is listed physically now. + * + * 2000/04/07 Nicolas Pitre <nico@cam.org> + * Reworked for real-time selection of memory definitions + * */ #include <linux/config.h> @@ -23,79 +27,109 @@ #define SIZE(x) (sizeof(x) / sizeof(x[0])) -/* - * These are the RAM memory mappings for SA1100 implementations. - * Note that LART is a special case - it doesn't use physical - * address line A23 on the DRAM, so we effectively have 4 * 8MB - * in two banks. - */ -struct mem_desc { - unsigned long phys_start; - unsigned long length; -} mem_desc[] __initdata = { -#if defined(CONFIG_SA1100_BRUTUS) - { 0xc0000000, 0x00400000 }, /* 4MB */ - { 0xc8000000, 0x00400000 }, /* 4MB */ - { 0xd0000000, 0x00400000 }, /* 4MB */ - { 0xd8000000, 0x00400000 } /* 4MB */ -#elif defined(CONFIG_SA1100_EMPEG) - { 0xc0000000, 0x00400000 }, /* 4MB */ - { 0xc8000000, 0x00400000 } /* 4MB */ -#elif defined(CONFIG_SA1100_LART) - { 0xc0000000, 0x00800000 }, /* 8MB */ - { 0xc1000000, 0x00800000 }, /* 8MB */ - { 0xc8000000, 0x00800000 }, /* 8MB */ - { 0xc9000000, 0x00800000 } /* 8MB */ -#elif defined(CONFIG_SA1100_VICTOR) - { 0xc0000000, 0x00400000 } /* 4MB */ -#elif defined(CONFIG_SA1100_THINCLIENT) - { 0xc0000000, 0x01000000 } /* 16MB */ -#elif defined(CONFIG_SA1100_TIFON) - { 0xc0000000, 0x01000000 }, /* 16MB */ - { 0xc8000000, 0x01000000 } /* 16MB */ -#else -#error missing memory configuration +#define SA1100_STD_IO_MAPPING \ + /* virtual physical length domain r w c b */ \ + { 0xe0000000, 0x20000000, 0x04000000, DOMAIN_IO, 0, 1, 0, 0 }, /* PCMCIA0 IO */ \ + { 0xe4000000, 0x30000000, 0x04000000, DOMAIN_IO, 0, 1, 0, 0 }, /* PCMCIA1 IO */ \ + { 0xe8000000, 0x28000000, 0x04000000, DOMAIN_IO, 0, 1, 0, 0 }, /* PCMCIA0 attr */ \ + { 0xec000000, 0x38000000, 0x04000000, DOMAIN_IO, 0, 1, 0, 0 }, /* PCMCIA1 attr */ \ + { 0xf0000000, 0x2c000000, 0x04000000, DOMAIN_IO, 0, 1, 0, 0 }, /* PCMCIA0 mem */ \ + { 0xf4000000, 0x3c000000, 0x04000000, DOMAIN_IO, 0, 1, 0, 0 }, /* PCMCIA1 mem */ \ + { 0xf8000000, 0x80000000, 0x02000000, DOMAIN_IO, 0, 1, 0, 0 }, /* PCM */ \ + { 0xfa000000, 0x90000000, 0x02000000, DOMAIN_IO, 0, 1, 0, 0 }, /* SCM */ \ + { 0xfc000000, 0xa0000000, 0x02000000, DOMAIN_IO, 0, 1, 0, 0 }, /* MER */ \ + { 0xfe000000, 0xb0000000, 0x02000000, DOMAIN_IO, 0, 1, 0, 0 } /* LCD + DMA */ + + +static struct map_desc assabet_io_desc[] __initdata = { +#ifdef CONFIG_SA1100_ASSABET + { 0xd0000000, 0x00000000, 0x02000000, DOMAIN_IO, 1, 1, 0, 0 }, /* Flash bank 0 */ + { 0xdc000000, 0x12000000, 0x00100000, DOMAIN_IO, 1, 1, 0, 0 }, /* Board Control Register */ + SA1100_STD_IO_MAPPING #endif }; -unsigned int __initdata mem_desc_size = SIZE(mem_desc); +static struct map_desc bitsy_io_desc[] __initdata = { +#ifdef CONFIG_SA1100_BITSY + { 0xd0000000, 0x00000000, 0x02000000, DOMAIN_IO, 1, 1, 0, 0 }, /* Flash bank 0 */ + SA1100_STD_IO_MAPPING +#endif +}; +static struct map_desc empeg_io_desc[] __initdata = { +#ifdef CONFIG_SA1100_EMPEG + { EMPEG_FLASHBASE, 0x00000000, 0x00200000, DOMAIN_IO, 1, 1, 0, 0 }, /* Flash */ + SA1100_STD_IO_MAPPING +#endif +}; -struct map_desc io_desc[] __initdata = { - /* virtual physical length domain r w c b */ -#if defined(CONFIG_SA1100_VICTOR) - { 0xd0000000, 0x00000000, 0x00200000, DOMAIN_IO, 1, 1, 0, 0 }, /* Flash */ -#elif defined(CONFIG_SA1100_EMPEG) - { EMPEG_FLASHBASE, 0x00000000, 0x00200000, DOMAIN_IO, 1, 1, 0, 0 }, /* Flash */ -#elif defined(CONFIG_SA1100_THINCLIENT) +static struct map_desc thinclient_io_desc[] __initdata = { +#ifdef CONFIG_SA1100_THINCLIENT #if 1 - /* ThinClient: only one of those... */ -// { 0xd0000000, 0x00000000, 0x01000000, DOMAIN_IO, 1, 1, 0, 0 }, /* Flash bank 0 when JP1 2-4 */ - { 0xd0000000, 0x08000000, 0x01000000, DOMAIN_IO, 1, 1, 0, 0 }, /* Flash bank 1 when JP1 3-4 */ + /* ThinClient: only one of those... */ +// { 0xd0000000, 0x00000000, 0x01000000, DOMAIN_IO, 1, 1, 0, 0 }, /* Flash bank 0 when JP1 2-4 */ + { 0xd0000000, 0x08000000, 0x01000000, DOMAIN_IO, 1, 1, 0, 0 }, /* Flash bank 1 when JP1 3-4 */ #else - /* GraphicsClient: */ - { 0xd0000000, 0x08000000, 0x00800000, DOMAIN_IO, 1, 1, 0, 0 }, /* Flash bank 1 */ - { 0xd0800000, 0x18000000, 0x00800000, DOMAIN_IO, 1, 1, 0, 0 }, /* Flash bank 3 */ + /* GraphicsClient: */ + { 0xd0000000, 0x08000000, 0x00800000, DOMAIN_IO, 1, 1, 0, 0 }, /* Flash bank 1 */ + { 0xd0800000, 0x18000000, 0x00800000, DOMAIN_IO, 1, 1, 0, 0 }, /* Flash bank 3 */ +#endif + { 0xdc000000, 0x10000000, 0x00400000, DOMAIN_IO, 0, 1, 0, 0 }, /* CPLD */ + SA1100_STD_IO_MAPPING #endif -#elif defined(CONFIG_SA1100_TIFON) - { 0xd0000000, 0x00000000, 0x00800000, DOMAIN_IO, 1, 1, 0, 0 }, /* Flash bank 1 */ - { 0xd0800000, 0x08000000, 0x00800000, DOMAIN_IO, 1, 1, 0, 0 }, /* Flash bank 2 */ +}; + +static struct map_desc tifon_io_desc[] __initdata = { +#ifdef CONFIG_SA1100_TIFON + { 0xd0000000, 0x00000000, 0x00800000, DOMAIN_IO, 1, 1, 0, 0 }, /* Flash bank 1 */ + { 0xd0800000, 0x08000000, 0x00800000, DOMAIN_IO, 1, 1, 0, 0 }, /* Flash bank 2 */ + SA1100_STD_IO_MAPPING #endif -#if defined( CONFIG_SA1101 ) - { 0xdc000000, SA1101_BASE, 0x00400000, DOMAIN_IO, 1, 1, 0, 0 }, /* SA1101 */ -#elif defined( CONFIG_SA1100_THINCLIENT ) - { 0xdc000000, 0x10000000, 0x00400000, DOMAIN_IO, 0, 1, 0, 0 }, /* CPLD */ +}; + +static struct map_desc victor_io_desc[] __initdata = { +#ifdef CONFIG_SA1100_VICTOR + { 0xd0000000, 0x00000000, 0x00200000, DOMAIN_IO, 1, 1, 0, 0 }, /* Flash */ + SA1100_STD_IO_MAPPING #endif - { 0xe0000000, 0x20000000, 0x04000000, DOMAIN_IO, 0, 1, 0, 0 }, /* PCMCIA0 IO */ - { 0xe4000000, 0x30000000, 0x04000000, DOMAIN_IO, 0, 1, 0, 0 }, /* PCMCIA1 IO */ - { 0xe8000000, 0x28000000, 0x04000000, DOMAIN_IO, 0, 1, 0, 0 }, /* PCMCIA0 attr */ - { 0xec000000, 0x38000000, 0x04000000, DOMAIN_IO, 0, 1, 0, 0 }, /* PCMCIA1 attr */ - { 0xf0000000, 0x2c000000, 0x04000000, DOMAIN_IO, 0, 1, 0, 0 }, /* PCMCIA0 mem */ - { 0xf4000000, 0x3c000000, 0x04000000, DOMAIN_IO, 0, 1, 0, 0 }, /* PCMCIA1 mem */ - { 0xf8000000, 0x80000000, 0x02000000, DOMAIN_IO, 0, 1, 0, 0 }, /* PCM */ - { 0xfa000000, 0x90000000, 0x02000000, DOMAIN_IO, 0, 1, 0, 0 }, /* SCM */ - { 0xfc000000, 0xa0000000, 0x02000000, DOMAIN_IO, 0, 1, 0, 0 }, /* MER */ - { 0xfe000000, 0xb0000000, 0x02000000, DOMAIN_IO, 0, 1, 0, 0 } /* LCD + DMA */ }; -unsigned int __initdata io_desc_size = SIZE(io_desc); + +static struct map_desc default_io_desc[] __initdata = { + SA1100_STD_IO_MAPPING +}; + + +/* + * Here it would be wiser to simply assign a pointer to the appropriate + * list, but io_desc is already declared as an array in "map.h". + */ +struct map_desc io_desc[20] __initdata = { { 0, }, }; +unsigned int io_desc_size; + +void __init select_sa1100_io_desc(void) +{ + if( machine_is_assabet() ) { + memcpy( io_desc, assabet_io_desc, sizeof(assabet_io_desc) ); + io_desc_size = SIZE(assabet_io_desc); + } else if( machine_is_bitsy() ) { + memcpy( io_desc, bitsy_io_desc, sizeof(bitsy_io_desc) ); + io_desc_size = SIZE(bitsy_io_desc); + } else if( machine_is_empeg() ) { + memcpy( io_desc, empeg_io_desc, sizeof(empeg_io_desc) ); + io_desc_size = SIZE(empeg_io_desc); + } else if( machine_is_thinclient() ) { + memcpy( io_desc, thinclient_io_desc, sizeof(thinclient_io_desc) ); + io_desc_size = SIZE(thinclient_io_desc); + } else if( machine_is_tifon() ) { + memcpy( io_desc, tifon_io_desc, sizeof(tifon_io_desc) ); + io_desc_size = SIZE(tifon_io_desc); + } else if( machine_is_victor() ) { + memcpy( io_desc, victor_io_desc, sizeof(victor_io_desc) ); + io_desc_size = SIZE(victor_io_desc); + } else { + memcpy( io_desc, default_io_desc, sizeof(default_io_desc) ); + io_desc_size = SIZE(default_io_desc); + } +} + |