[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