1 /* 2 * OMAP Secure API infrastructure. 3 * 4 * Copyright (C) 2011 Texas Instruments, Inc. 5 * Santosh Shilimkar <santosh.shilimkar@ti.com> 6 * 7 * 8 * This program is free software,you can redistribute it and/or modify 9 * it under the terms of the GNU General Public License version 2 as 10 * published by the Free Software Foundation. 11 */ 12 13 #include <linux/kernel.h> 14 #include <linux/init.h> 15 #include <linux/io.h> 16 #include <linux/memblock.h> 17 18 #include <asm/cacheflush.h> 19 #include <asm/memblock.h> 20 21 #include <plat/omap-secure.h> 22 #include "omap-secure.h" 23 24 static phys_addr_t omap_secure_memblock_base; 25 26 /** 27 * omap_sec_dispatcher: Routine to dispatch low power secure 28 * service routines 29 * @idx: The HAL API index 30 * @flag: The flag indicating criticality of operation 31 * @nargs: Number of valid arguments out of four. 32 * @arg1, arg2, arg3 args4: Parameters passed to secure API 33 * 34 * Return the non-zero error value on failure. 35 */ 36 u32 omap_secure_dispatcher(u32 idx, u32 flag, u32 nargs, u32 arg1, u32 arg2, 37 u32 arg3, u32 arg4) 38 { 39 u32 ret; 40 u32 param[5]; 41 42 param[0] = nargs; 43 param[1] = arg1; 44 param[2] = arg2; 45 param[3] = arg3; 46 param[4] = arg4; 47 48 /* 49 * Secure API needs physical address 50 * pointer for the parameters 51 */ 52 flush_cache_all(); 53 outer_clean_range(__pa(param), __pa(param + 5)); 54 ret = omap_smc2(idx, flag, __pa(param)); 55 56 return ret; 57 } 58 59 /* Allocate the memory to save secure ram */ 60 int __init omap_secure_ram_reserve_memblock(void) 61 { 62 u32 size = OMAP_SECURE_RAM_STORAGE; 63 64 size = ALIGN(size, SZ_1M); 65 omap_secure_memblock_base = arm_memblock_steal(size, SZ_1M); 66 67 return 0; 68 } 69 70 phys_addr_t omap_secure_ram_mempool_base(void) 71 { 72 return omap_secure_memblock_base; 73 } 74