Subject: [PATCH 1/4] ARM: Add __arm_ioremap_exec for mapping external memory as MT_MEMORY

From: [email-masked] (Santosh Shilimkar)
Date: Fri, 07 Oct 2011 23:09:39 +0530

On Friday 07 October 2011 08:41 PM, Tony Lindgren wrote:
> * Santosh Shilimkar <[email-masked]> [111007 07:29]:
>> On Friday 07 October 2011 08:13 PM, Tony Lindgren wrote:
>>>
>>> ..so I think we should just have a separate static mapping for
>>> the omap4 errata fix SO page, and just limit the memory available
>>> for SRAM code to ioremap.
>>>
>>> How does that sounds to you?
>>>
>> That's more or less what the patch is already doing.
>> Instead of static mapping, I was dynamically stealing one
>> page ( SZ_4K) and mapping it as MT_MEMORY_SO and rest
>> of the memory as MT_MEMORY for OMAP4.
> 
> Yeah cool.
>  
>> It should be doable with your updates as well,
>> I guess with or without static mapping since the only
>> requisite is to keep one page of SRAM free on OMAP4 and
>> them map them using  iotable_init() with MT_MEMORY_SO.
> 
> How about something like the following, this won't compile
> without at least moving the defines around a bit, but shows
> what I had in mind:
> 
> --- a/arch/arm/mach-omap2/io.c
> +++ b/arch/arm/mach-omap2/io.c
> @@ -238,6 +238,14 @@ static struct map_desc omap44xx_io_desc[] __initdata = {
>  		.length		= L4_EMU_44XX_SIZE,
>  		.type		= MT_DEVICE,
>  	},
> +#ifdef CONFIG_OMAP4_ERRATA_I688
> +	{
> +		.virtual	= OMAP4_SRAM_VA,
> +		.pfn		= __phys_to_pfn(OMAP4_SRAM_PA),
> +		.length		= PAGE_SIZE,
> +		.type		= MT_MEMORY_SO,
> +	},
> +#endif
>  };

I initially tried some thing similar but the issue was GP and
HS devices. SRAM_PA isn't same on GP and EMU device and hence
did that dynamically. One way is I can make GP and HS
device SRAM_PA same for OMAP4 (Will loose 16 KB of
SRAM on OMAP4 GP). It's ok to loose that 16 KB SRAM
for OMAP4 with errata enabled.

Below change works on both GP and HS device
If you are OK with it, I can update errata patch accordingly.

diff --git a/arch/arm/plat-omap/include/plat/sram.h
b/arch/arm/plat-omap/include/plat/sram.h
index f500fc3..111b1a8 100644
--- a/arch/arm/plat-omap/include/plat/sram.h
+++ b/arch/arm/plat-omap/include/plat/sram.h
@@ -95,6 +95,11 @@ static inline void omap_push_sram_idle(void) {}
  */
 #define OMAP2_SRAM_PA		0x40200000
 #define OMAP3_SRAM_PA           0x40200000
+#ifdef CONFIG_OMAP4_ERRATA_I688
+#define OMAP4_SRAM_PA		0x40304000
+#else
 #define OMAP4_SRAM_PA		0x40300000
+#endif
+#define OMAP4_SRAM_VA		0xfe404000

 #endif
diff --git a/arch/arm/plat-omap/sram.c b/arch/arm/plat-omap/sram.c
index 363c91e..cdd303f 100644
--- a/arch/arm/plat-omap/sram.c
+++ b/arch/arm/plat-omap/sram.c
@@ -48,9 +48,13 @@
 #define OMAP3_SRAM_VA           0xfe400000
 #define OMAP3_SRAM_PUB_PA       (OMAP3_SRAM_PA + 0x8000)
 #define OMAP3_SRAM_PUB_VA       (OMAP3_SRAM_VA + 0x8000)
-#define OMAP4_SRAM_VA		0xfe400000
+#ifdef CONFIG_OMAP4_ERRATA_I688
+#define OMAP4_SRAM_PUB_PA	OMAP4_SRAM_PA
+#define OMAP4_SRAM_PUB_VA	OMAP4_SRAM_VA
+#else
 #define OMAP4_SRAM_PUB_PA	(OMAP4_SRAM_PA + 0x4000)
 #define OMAP4_SRAM_PUB_VA	(OMAP4_SRAM_VA + 0x4000)
+#endif

 #if defined(CONFIG_ARCH_OMAP2PLUS)
 #define SRAM_BOOTLOADER_SZ	0x00
@@ -203,6 +207,11 @@ static void __init omap_map_sram(void)
 	if (omap_sram_size == 0)
 		return;

+#ifdef CONFIG_OMAP4_ERRATA_I688
+		omap_sram_base += PAGE_SIZE;
+		omap_sram_start += PAGE_SIZE;
+		omap_sram_size -= SZ_16K;
+#endif
 	if (cpu_is_omap34xx()) {
 		/*
 		 * SRAM must be marked as non-cached on OMAP3 since the

Regards
Santosh