/* * We only check that the OP-TEE node is present and available. The * OP-TEE kernel driver is not needed for the type of interaction made * with OP-TEE here so the driver's status is not checked.
*/
np = of_find_node_by_path("/firmware/optee"); if (np && of_device_is_available(np))
optee_available = true;
of_node_put(np);
}
/** * omap_secure_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)
{ static u32 buf[NR_CPUS][5];
u32 *param; int cpu;
u32 ret;
void omap_smc1(u32 fn, u32 arg)
{ /* * If this platform has OP-TEE installed we use ARM SMC calls * otherwise fall back to the OMAP ROM style calls.
*/ if (optee_available)
omap_smccc_smc(fn, arg); else
_omap_smc1(fn, arg);
}
/* Allocate the memory to save secure ram */ int __init omap_secure_ram_reserve_memblock(void)
{
u32 size = OMAP_SECURE_RAM_STORAGE;
if (size != OMAP3_SAVE_SECURE_RAM_SZ) return OMAP3_SAVE_SECURE_RAM_SZ;
param[0] = 4; /* Number of arguments */
param[1] = __pa(addr); /* Physical address for saving */
param[2] = 0;
param[3] = 1;
param[4] = 1;
ret = save_secure_ram_context(__pa(param));
return ret;
} #endif
/** * rx51_secure_dispatcher: Routine to dispatch secure PPA API calls * @idx: The PPA API index * @process: Process ID * @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. * * NOTE: rx51_secure_dispatcher differs from omap_secure_dispatcher because * it calling omap_smc3() instead omap_smc2() and param[0] is nargs+1
*/ static u32 rx51_secure_dispatcher(u32 idx, u32 process, u32 flag, u32 nargs,
u32 arg1, u32 arg2, u32 arg3, u32 arg4)
{ static u32 param[5];
u32 ret;
/* * Secure API needs physical address * pointer for the parameters
*/
local_irq_disable();
local_fiq_disable();
flush_cache_all();
outer_clean_range(__pa(param), __pa(param + 5));
ret = omap_smc3(idx, process, flag, __pa(param));
flush_cache_all();
local_fiq_enable();
local_irq_enable();
return ret;
}
/** * rx51_secure_update_aux_cr: Routine to modify the contents of Auxiliary Control Register * @set_bits: bits to set in ACR * @clear_bits: bits to clear in ACR * * Return the non-zero error value on failure.
*/
u32 rx51_secure_update_aux_cr(u32 set_bits, u32 clear_bits)
{
u32 acr;
/* * Dummy dispatcher call after core OSWR and MPU off. Updates the ROM return * address after MMU has been re-enabled after CPU1 has been woken up again. * Otherwise the ROM code will attempt to use the earlier physical return * address that got set with MMU off when waking up CPU1. Only used on secure * devices.
*/ staticint cpu_notifier(struct notifier_block *nb, unsignedlong cmd, void *v)
{ switch (cmd) { case CPU_CLUSTER_PM_EXIT:
omap_secure_dispatcher(OMAP4_PPA_SERVICE_0,
FLAG_START_CRITICAL,
0, 0, 0, 0, 0); break; default: break;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.