Subject: [PATCH 1/2] pxa/vpac270: Enable SparseMEM for 256 MB of RAM

From: [email-masked] (Marek Vasut)
Date: Wed, 12 May 2010 01:24:28 +0200

Dne ?t 4. kv?tna 2010 18:57:08 Marek Vasut napsal(a):
> This patch enables SparseMEM for the Voipac PXA270 board. To work around
> the PHYS_OFFSET being set to 0xa0000000 and disallowing us to map the
> other partition at 0x80000000, the physical-to-virtual mapping of SDRAM
> was altered and the partition at 0x80000000 was moved to 0x10000000 in
> virtual memory (past the first SDRAM partition). As the Voipac PXA270 is
> probably the only PXA270 device which utilizes 256 MB of RAM, adding the
> following code into memory.h seems much less painful than tinkering with
> PHYS_OFFSET.
> 
> NOTE: Once the PHYS_OFFSET can be dynamically configured, this code can
> probably be removed.
> 
> Signed-off-by: Marek Vasut <[email-masked]>
> ---
>  arch/arm/mach-pxa/Kconfig               |    1 +
>  arch/arm/mach-pxa/include/mach/memory.h |   21 +++++++++++++++++++++
>  2 files changed, 22 insertions(+), 0 deletions(-)
> 
> diff --git a/arch/arm/mach-pxa/Kconfig b/arch/arm/mach-pxa/Kconfig
> index 88e00db..ded9d64 100644
> --- a/arch/arm/mach-pxa/Kconfig
> +++ b/arch/arm/mach-pxa/Kconfig
> @@ -253,6 +253,7 @@ config MACH_VPAC270
>  	bool "Voipac PXA270"
>  	select PXA27x
>  	select HAVE_PATA_PLATFORM
> +	select ARCH_SPARSEMEM_ENABLE
>  	help
>  	  PXA270 based Single Board Computer.
> 
> diff --git a/arch/arm/mach-pxa/include/mach/memory.h
> b/arch/arm/mach-pxa/include/mach/memory.h index f626730..705c7a0 100644
> --- a/arch/arm/mach-pxa/include/mach/memory.h
> +++ b/arch/arm/mach-pxa/include/mach/memory.h
> @@ -40,4 +40,25 @@ void cmx2xx_pci_adjust_zones(int node, unsigned long
> *size, #define MAX_DMA_ADDRESS		(PAGE_OFFSET + SZ_64M)
>  #endif
> 
> +/*
> + * Voipac PXA270/PXA270M is probably the only board in the world with
> PXA27x + * that uses more than 128MB or SDRAM (256MB in the 'max
> configuration'). This + * hack should be removed once the PHYS_OFFSET can
> be configured dynamically. + *
> + * The two 128MB SDRAM banks are at addresses 0xa0000000 and 0x80000000.
> The + * following code moves the block of SDRAM at 0x80000000 past the
> block at + * 0xa0000000 in virtual memory and vice versa. We use SparseMEM
> to map the + * pages properly.
> + */
> +#ifdef	CONFIG_MACH_VPAC270
> +#define	MAX_PHYSMEM_BITS	32
> +#define	SECTION_SIZE_BITS	28
> +#define	__phys_to_virt(p) \
> +	(((p) & 0x0fffffff) | \
> +	(((p) & 0x20000000) ? 0 : 0x10000000) | PAGE_OFFSET)
> +#define	__virt_to_phys(v) \
> +	(((v) & 0x0fffffff) | \
> +	(((v) & 0x10000000) ? 0x80000000 : 0xa0000000))
> +#endif
> +
>  #endif

Eric, any updates on this and the other one? Would you mind applying?