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 "omap-secure.h" 22 23 static phys_addr_t omap_secure_memblock_base; 24 25 /** 26 * omap_sec_dispatcher: Routine to dispatch low power secure 27 * service routines 28 * @idx: The HAL API index 29 * @flag: The flag indicating criticality of operation 30 * @nargs: Number of valid arguments out of four. 31 * @arg1, arg2, arg3 args4: Parameters passed to secure API 32 * 33 * Return the non-zero error value on failure. 34 */ 35 u32 omap_secure_dispatcher(u32 idx, u32 flag, u32 nargs, u32 arg1, u32 arg2, 36 u32 arg3, u32 arg4) 37 { 38 u32 ret; 39 u32 param[5]; 40 41 param[0] = nargs; 42 param[1] = arg1; 43 param[2] = arg2; 44 param[3] = arg3; 45 param[4] = arg4; 46 47 /* 48 * Secure API needs physical address 49 * pointer for the parameters 50 */ 51 flush_cache_all(); 52 outer_clean_range(__pa(param), __pa(param + 5)); 53 ret = omap_smc2(idx, flag, __pa(param)); 54 55 return ret; 56 } 57 58 /* Allocate the memory to save secure ram */ 59 int __init omap_secure_ram_reserve_memblock(void) 60 { 61 u32 size = OMAP_SECURE_RAM_STORAGE; 62 63 size = ALIGN(size, SECTION_SIZE); 64 omap_secure_memblock_base = arm_memblock_steal(size, SECTION_SIZE); 65 66 return 0; 67 } 68 69 phys_addr_t omap_secure_ram_mempool_base(void) 70 { 71 return omap_secure_memblock_base; 72 } 73