| /* |
| * Board specific setup info |
| * |
| * (C) Copyright 2010 |
| * Texas Instruments, <www.ti.com> |
| * |
| * Author : |
| * Aneesh V <aneesh@ti.com> |
| * |
| * SPDX-License-Identifier: GPL-2.0+ |
| */ |
| |
| #include <config.h> |
| #include <asm/arch/omap.h> |
| #include <asm/omap_common.h> |
| #include <asm/arch/spl.h> |
| #include <linux/linkage.h> |
| |
| .arch_extension sec |
| |
| #ifdef CONFIG_SPL |
| ENTRY(save_boot_params) |
| ldr r1, =OMAP_SRAM_SCRATCH_BOOT_PARAMS |
| str r0, [r1] |
| b save_boot_params_ret |
| ENDPROC(save_boot_params) |
| |
| #if !defined(CONFIG_TI_SECURE_DEVICE) && defined(CONFIG_ARMV7_LPAE) |
| ENTRY(switch_to_hypervisor) |
| |
| /* |
| * Switch to hypervisor mode |
| */ |
| adr r0, save_sp |
| str sp, [r0] |
| adr r1, restore_from_hyp |
| ldr r0, =0x102 |
| b omap_smc1 |
| restore_from_hyp: |
| adr r0, save_sp |
| ldr sp, [r0] |
| MRC p15, 4, R0, c1, c0, 0 |
| ldr r1, =0X1004 @Set cache enable bits for hypervisor mode |
| orr r0, r0, r1 |
| MCR p15, 4, R0, c1, c0, 0 |
| b switch_to_hypervisor_ret |
| save_sp: |
| .word 0x0 |
| ENDPROC(switch_to_hypervisor) |
| #endif |
| #endif |
| |
| ENTRY(omap_smc1) |
| push {r4-r12, lr} @ save registers - ROM code may pollute |
| @ our registers |
| mov r12, r0 @ Service |
| mov r0, r1 @ Argument |
| |
| dsb |
| dmb |
| smc 0 @ SMC #0 to enter monitor mode |
| @ call ROM Code API for the service requested |
| pop {r4-r12, pc} |
| ENDPROC(omap_smc1) |
| |
| ENTRY(omap_smc_sec) |
| push {r4-r12, lr} @ save registers - ROM code may pollute |
| @ our registers |
| mov r6, #0xFF @ Indicate new Task call |
| mov r12, #0x00 @ Secure Service ID in R12 |
| |
| dsb |
| dmb |
| smc 0 @ SMC #0 to enter monitor mode |
| |
| b omap_smc_sec_end @ exit at end of the service execution |
| nop |
| |
| @ In case of IRQ happening in Secure, then ARM will branch here. |
| @ At that moment, IRQ will be pending and ARM will jump to Non Secure |
| @ IRQ handler |
| mov r12, #0xFE |
| |
| dsb |
| dmb |
| smc 0 @ SMC #0 to enter monitor mode |
| |
| omap_smc_sec_end: |
| pop {r4-r12, pc} |
| ENDPROC(omap_smc_sec) |