[RFC PATCH 14/19] powerpc: allow ioremap within reserved fake ram regions

Grant Likely grant.likely at secretlab.ca
Mon Nov 23 10:36:54 EST 2009


On Sun, Nov 22, 2009 at 3:01 PM, Albert Herranz <albert_herranz at 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_herranz at 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.


More information about the Linuxppc-dev mailing list