On Sun, Nov 22, 2009 at 3:01 PM, Albert Herranz <albert_herr...@yahoo.es> wrote: > The Nintendo Wii has two discontiguous RAM memory areas called > MEM1 and MEM2. > MEM1 starts at 0x00000000 and contains 24MB of 1T-SRAM. > MEM2 starts at 0x10000000 and contains 64MB of DDR2 RAM. > Between both memory address ranges there is an address space > where memory-mapped I/O registers are found. > > Currently, Linux 32-bit PowerPC does not support RAM in > discontiguous memory address spaces. Thus, in order to use > both RAM areas, we declare as RAM the range from the start of > MEM1 to the end of useable MEM2 and exclude the needed parts > with /memreserve/ statements, at the expense of wasting a bit > of memory. > > As a side effect, we need to allow ioremapping RAM areas > because the I/O address space sits within the memreserve'd part > of the declared RAM region. > Note that this is not safe if the region ioremapped is covered > by an existing BAT mapping used to map RAM, so this is > specifically banned here. > > Signed-off-by: Albert Herranz <albert_herr...@yahoo.es> > --- > arch/powerpc/mm/pgtable_32.c | 19 ++++++++++++++++--- > 1 files changed, 16 insertions(+), 3 deletions(-) > > diff --git a/arch/powerpc/mm/pgtable_32.c b/arch/powerpc/mm/pgtable_32.c > index cb96cb2..ba00cb1 100644 > --- a/arch/powerpc/mm/pgtable_32.c > +++ b/arch/powerpc/mm/pgtable_32.c > @@ -191,9 +191,22 @@ __ioremap_caller(phys_addr_t addr, unsigned long size, > unsigned long flags, > * Don't allow anybody to remap normal RAM that we're using. > * mem_init() sets high_memory so only do the check after that. > */ > - if (mem_init_done && (p < virt_to_phys(high_memory))) { > - printk("__ioremap(): phys addr 0x%llx is RAM lr %p\n", > - (unsigned long long)p, __builtin_return_address(0)); > + if (mem_init_done && (p < virt_to_phys(high_memory)) > +#ifdef CONFIG_WII > + /* > + * On some systems, though, we may want to remap an area > + * declared as normal RAM that we have memreserve'd at the > + * device tree. See wii.dts. > + * But we can't do that safely if we are using BATs to map > + * part of that area. > + */ > + && !__map_without_bats > +#endif > + ) { > + printk(KERN_WARNING > + "__ioremap(): phys addr 0x%llx is RAM lr %p\n", > + (unsigned long long)p, > + __builtin_return_address(0));
This could adversely affect multiplatform kernels. I'd rather get the RAM problem fixed and not hack up common code to work around the hack. g. -- Grant Likely, B.Sc., P.Eng. Secret Lab Technologies Ltd. _______________________________________________ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev