2011-06-06 16:26:49 +04:00
/*
* OMAP Secure API infrastructure .
*
* Copyright ( C ) 2011 Texas Instruments , Inc .
* Santosh Shilimkar < santosh . shilimkar @ ti . com >
*
*
* This program is free software , you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation .
*/
# include <linux/kernel.h>
# include <linux/init.h>
# include <linux/io.h>
2011-06-06 18:58:23 +04:00
# include <linux/memblock.h>
2011-06-06 16:26:49 +04:00
# include <asm/cacheflush.h>
2012-01-13 19:00:51 +04:00
# include <asm/memblock.h>
2011-06-06 16:26:49 +04:00
2012-04-13 16:34:26 +04:00
# include <plat/omap-secure.h>
2011-06-06 16:26:49 +04:00
# include <mach/omap-secure.h>
2011-06-06 18:58:23 +04:00
static phys_addr_t omap_secure_memblock_base ;
2011-06-06 16:26:49 +04:00
/**
* omap_sec_dispatcher : Routine to dispatch low power secure
* service routines
* @ idx : The HAL API index
* @ flag : The flag indicating criticality of operation
* @ nargs : Number of valid arguments out of four .
* @ arg1 , arg2 , arg3 args4 : Parameters passed to secure API
*
* Return the non - zero error value on failure .
*/
u32 omap_secure_dispatcher ( u32 idx , u32 flag , u32 nargs , u32 arg1 , u32 arg2 ,
u32 arg3 , u32 arg4 )
{
u32 ret ;
u32 param [ 5 ] ;
param [ 0 ] = nargs ;
param [ 1 ] = arg1 ;
param [ 2 ] = arg2 ;
param [ 3 ] = arg3 ;
param [ 4 ] = arg4 ;
/*
* Secure API needs physical address
* pointer for the parameters
*/
flush_cache_all ( ) ;
outer_clean_range ( __pa ( param ) , __pa ( param + 5 ) ) ;
ret = omap_smc2 ( idx , flag , __pa ( param ) ) ;
return ret ;
}
2011-06-06 18:58:23 +04:00
/* Allocate the memory to save secure ram */
int __init omap_secure_ram_reserve_memblock ( void )
{
u32 size = OMAP_SECURE_RAM_STORAGE ;
size = ALIGN ( size , SZ_1M ) ;
2012-01-13 19:00:51 +04:00
omap_secure_memblock_base = arm_memblock_steal ( size , SZ_1M ) ;
2011-06-06 18:58:23 +04:00
return 0 ;
}
phys_addr_t omap_secure_ram_mempool_base ( void )
{
return omap_secure_memblock_base ;
}