diff options
| -rw-r--r-- | arch/arm/mach-omap2/include/mach/omap-secure.h | 3 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/omap-secure.c | 29 | ||||
| -rw-r--r-- | arch/arm/plat-omap/common.c | 3 | ||||
| -rw-r--r-- | arch/arm/plat-omap/include/plat/omap-secure.h | 13 | 
4 files changed, 48 insertions, 0 deletions
diff --git a/arch/arm/mach-omap2/include/mach/omap-secure.h b/arch/arm/mach-omap2/include/mach/omap-secure.h index 26e7bcc49ad..29f60cae45e 100644 --- a/arch/arm/mach-omap2/include/mach/omap-secure.h +++ b/arch/arm/mach-omap2/include/mach/omap-secure.h @@ -26,6 +26,8 @@  #define FLAG_FIQ_ENABLE			0x1  #define NO_FLAG				0x0 +/* Maximum Secure memory storage size */ +#define OMAP_SECURE_RAM_STORAGE	(88 * SZ_1K)  /* Secure low power HAL API index */  #define OMAP4_HAL_SAVESECURERAM_INDEX	0x1a @@ -36,5 +38,6 @@  extern u32 omap_secure_dispatcher(u32 idx, u32 flag, u32 nargs,  				u32 arg1, u32 arg2, u32 arg3, u32 arg4);  extern u32 omap_smc2(u32 id, u32 falg, u32 pargs); +extern phys_addr_t omap_secure_ram_mempool_base(void);  #endif /* OMAP_ARCH_OMAP_SECURE_H */ diff --git a/arch/arm/mach-omap2/omap-secure.c b/arch/arm/mach-omap2/omap-secure.c index e5a606e59b1..69f3c72d959 100644 --- a/arch/arm/mach-omap2/omap-secure.c +++ b/arch/arm/mach-omap2/omap-secure.c @@ -13,11 +13,14 @@  #include <linux/kernel.h>  #include <linux/init.h>  #include <linux/io.h> +#include <linux/memblock.h>  #include <asm/cacheflush.h>  #include <mach/omap-secure.h> +static phys_addr_t omap_secure_memblock_base; +  /**   * omap_sec_dispatcher: Routine to dispatch low power secure   * service routines @@ -50,3 +53,29 @@ u32 omap_secure_dispatcher(u32 idx, u32 flag, u32 nargs, u32 arg1, u32 arg2,  	return ret;  } + +/* Allocate the memory to save secure ram */ +int __init omap_secure_ram_reserve_memblock(void) +{ +	phys_addr_t paddr; +	u32 size = OMAP_SECURE_RAM_STORAGE; + +	size = ALIGN(size, SZ_1M); +	paddr = memblock_alloc(size, SZ_1M); +	if (!paddr) { +		pr_err("%s: failed to reserve %x bytes\n", +				__func__, size); +		return -ENOMEM; +	} +	memblock_free(paddr, size); +	memblock_remove(paddr, size); + +	omap_secure_memblock_base = paddr; + +	return 0; +} + +phys_addr_t omap_secure_ram_mempool_base(void) +{ +	return omap_secure_memblock_base; +} diff --git a/arch/arm/plat-omap/common.c b/arch/arm/plat-omap/common.c index 2ee6341fffd..06383b51e65 100644 --- a/arch/arm/plat-omap/common.c +++ b/arch/arm/plat-omap/common.c @@ -22,6 +22,8 @@  #include <plat/vram.h>  #include <plat/dsp.h> +#include <plat/omap-secure.h> +  #define NO_LENGTH_CHECK 0xffffffff @@ -66,6 +68,7 @@ void __init omap_reserve(void)  	omapfb_reserve_sdram_memblock();  	omap_vram_reserve_sdram_memblock();  	omap_dsp_reserve_sdram_memblock(); +	omap_secure_ram_reserve_memblock();  }  void __init omap_init_consistent_dma_size(void) diff --git a/arch/arm/plat-omap/include/plat/omap-secure.h b/arch/arm/plat-omap/include/plat/omap-secure.h new file mode 100644 index 00000000000..64f9d1c7f1b --- /dev/null +++ b/arch/arm/plat-omap/include/plat/omap-secure.h @@ -0,0 +1,13 @@ +#ifndef __OMAP_SECURE_H__ +#define __OMAP_SECURE_H__ + +#include <linux/types.h> + +#ifdef CONFIG_ARCH_OMAP2PLUS +extern int omap_secure_ram_reserve_memblock(void); +#else +static inline void omap_secure_ram_reserve_memblock(void) +{ } +#endif + +#endif /* __OMAP_SECURE_H__ */  |