Loading arch/arm/mach-bcm/Kconfig +35 −5 Original line number Diff line number Diff line Loading @@ -10,21 +10,51 @@ if ARCH_BCM menu "Broadcom SoC Selection" config ARCH_BCM_MOBILE bool "Broadcom Mobile SoC" if ARCH_MULTI_V7 bool "Broadcom Mobile SoC Support" if ARCH_MULTI_V7 select ARCH_REQUIRE_GPIOLIB select ARM_ERRATA_754322 select ARM_ERRATA_764369 if SMP select ARM_GIC select GPIO_BCM_KONA select TICK_ONESHOT select CACHE_L2X0 select HAVE_ARM_ARCH_TIMER select PINCTRL help This enables support for systems based on Broadcom mobile SoCs. It currently supports the 'BCM281XX' family, which includes BCM11130, BCM11140, BCM11351, BCM28145 and BCM28155 variants. if ARCH_BCM_MOBILE menu "Broadcom Mobile SoC Selection" config ARCH_BCM_281XX bool "Broadcom BCM281XX SoC family" default y help Enable support for the the BCM281XX family, which includes BCM11130, BCM11140, BCM11351, BCM28145 and BCM28155 variants. config ARCH_BCM_21664 bool "Broadcom BCM21664 SoC family" default y help Enable support for the the BCM21664 family, which includes BCM21663 and BCM21664 variants. config ARCH_BCM_MOBILE_L2_CACHE bool "Broadcom mobile SoC level 2 cache support" depends on (ARCH_BCM_281XX || ARCH_BCM_21664) default y select CACHE_L2X0 select ARCH_BCM_MOBILE_SMC config ARCH_BCM_MOBILE_SMC bool depends on ARCH_BCM_281XX || ARCH_BCM_21664 endmenu endif config ARCH_BCM2835 bool "Broadcom BCM2835 family" if ARCH_MULTI_V6 Loading arch/arm/mach-bcm/Makefile +17 −4 Original line number Diff line number Diff line Loading @@ -10,10 +10,23 @@ # of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. obj-$(CONFIG_ARCH_BCM_MOBILE) := board_bcm281xx.o board_bcm21664.o \ bcm_kona_smc.o bcm_kona_smc_asm.o kona.o # BCM281XX obj-$(CONFIG_ARCH_BCM_281XX) += board_bcm281xx.o # BCM21664 obj-$(CONFIG_ARCH_BCM_21664) += board_bcm21664.o # BCM281XX and BCM21664 L2 cache control obj-$(CONFIG_ARCH_BCM_MOBILE_L2_CACHE) += kona_l2_cache.o # Support for secure monitor traps obj-$(CONFIG_ARCH_BCM_MOBILE_SMC) += bcm_kona_smc.o ifeq ($(call as-instr,.arch_extension sec,as_has_sec),as_has_sec) CFLAGS_bcm_kona_smc.o += -Wa,-march=armv7-a+sec -DREQUIRES_SEC endif # BCM2835 obj-$(CONFIG_ARCH_BCM2835) += board_bcm2835.o plus_sec := $(call as-instr,.arch_extension sec,+sec) AFLAGS_bcm_kona_smc_asm.o :=-Wa,-march=armv7-a$(plus_sec) # BCM5301X obj-$(CONFIG_ARCH_BCM_5301X) += bcm_5301x.o arch/arm/mach-bcm/bcm_kona_smc.c +98 −38 Original line number Diff line number Diff line Loading @@ -21,11 +21,8 @@ #include "bcm_kona_smc.h" struct secure_bridge_data { void __iomem *bounce; /* virtual address */ u32 __iomem buffer_addr; /* physical address */ int initialized; } bridge_data; static u32 bcm_smc_buffer_phys; /* physical address */ static void __iomem *bcm_smc_buffer; /* virtual address */ struct bcm_kona_smc_data { unsigned service_id; Loading @@ -33,6 +30,7 @@ struct bcm_kona_smc_data { unsigned arg1; unsigned arg2; unsigned arg3; unsigned result; }; static const struct of_device_id bcm_kona_smc_ids[] __initconst = { Loading @@ -41,59 +39,125 @@ static const struct of_device_id bcm_kona_smc_ids[] __initconst = { {}, }; /* Map in the bounce area */ /* Map in the args buffer area */ int __init bcm_kona_smc_init(void) { struct device_node *node; const __be32 *prop_val; u64 prop_size = 0; unsigned long buffer_size; u32 buffer_phys; /* Read buffer addr and size from the device tree node */ node = of_find_matching_node(NULL, bcm_kona_smc_ids); if (!node) return -ENODEV; /* Don't care about size or flags of the DT node */ bridge_data.buffer_addr = be32_to_cpu(*of_get_address(node, 0, NULL, NULL)); BUG_ON(!bridge_data.buffer_addr); prop_val = of_get_address(node, 0, &prop_size, NULL); if (!prop_val) return -EINVAL; bridge_data.bounce = of_iomap(node, 0); BUG_ON(!bridge_data.bounce); /* We assume space for four 32-bit arguments */ if (prop_size < 4 * sizeof(u32) || prop_size > (u64)ULONG_MAX) return -EINVAL; buffer_size = (unsigned long)prop_size; bridge_data.initialized = 1; buffer_phys = be32_to_cpup(prop_val); if (!buffer_phys) return -EINVAL; bcm_smc_buffer = ioremap(buffer_phys, buffer_size); if (!bcm_smc_buffer) return -ENOMEM; bcm_smc_buffer_phys = buffer_phys; pr_info("Kona Secure API initialized\n"); return 0; } /* * int bcm_kona_do_smc(u32 service_id, u32 buffer_addr) * * Only core 0 can run the secure monitor code. If an "smc" request * is initiated on a different core it must be redirected to core 0 * for execution. We rely on the caller to handle this. * * Each "smc" request supplies a service id and the address of a * buffer containing parameters related to the service to be * performed. A flags value defines the behavior of the level 2 * cache and interrupt handling while the secure monitor executes. * * Parameters to the "smc" request are passed in r4-r6 as follows: * r4 service id * r5 flags (SEC_ROM_*) * r6 physical address of buffer with other parameters * * Execution of an "smc" request produces two distinct results. * * First, the secure monitor call itself (regardless of the specific * service request) can succeed, or can produce an error. When an * "smc" request completes this value is found in r12; it should * always be SEC_EXIT_NORMAL. * * In addition, the particular service performed produces a result. * The values that should be expected depend on the service. We * therefore return this value to the caller, so it can handle the * request result appropriately. This result value is found in r0 * when the "smc" request completes. */ static int bcm_kona_do_smc(u32 service_id, u32 buffer_phys) { register u32 ip asm("ip"); /* Also called r12 */ register u32 r0 asm("r0"); register u32 r4 asm("r4"); register u32 r5 asm("r5"); register u32 r6 asm("r6"); r4 = service_id; r5 = 0x3; /* Keep IRQ and FIQ off in SM */ r6 = buffer_phys; asm volatile ( /* Make sure we got the registers we want */ __asmeq("%0", "ip") __asmeq("%1", "r0") __asmeq("%2", "r4") __asmeq("%3", "r5") __asmeq("%4", "r6") #ifdef REQUIRES_SEC ".arch_extension sec\n" #endif " smc #0\n" : "=r" (ip), "=r" (r0) : "r" (r4), "r" (r5), "r" (r6) : "r1", "r2", "r3", "r7", "lr"); BUG_ON(ip != SEC_EXIT_NORMAL); return r0; } /* __bcm_kona_smc() should only run on CPU 0, with pre-emption disabled */ static void __bcm_kona_smc(void *info) { struct bcm_kona_smc_data *data = info; u32 *args = bridge_data.bounce; int rc = 0; u32 *args = bcm_smc_buffer; /* Must run on CPU 0 */ BUG_ON(smp_processor_id() != 0); BUG_ON(!args); /* Check map in the bounce area */ BUG_ON(!bridge_data.initialized); /* Copy one 32 bit word into the bounce area */ args[0] = data->arg0; args[1] = data->arg1; args[2] = data->arg2; args[3] = data->arg3; /* Copy the four 32 bit argument values into the bounce area */ writel_relaxed(data->arg0, args++); writel_relaxed(data->arg1, args++); writel_relaxed(data->arg2, args++); writel(data->arg3, args); /* Flush caches for input data passed to Secure Monitor */ if (data->service_id != SSAPI_BRCM_START_VC_CORE) flush_cache_all(); /* Trap into Secure Monitor */ rc = bcm_kona_smc_asm(data->service_id, bridge_data.buffer_addr); if (rc != SEC_ROM_RET_OK) pr_err("Secure Monitor call failed (0x%x)!\n", rc); /* Trap into Secure Monitor and record the request result */ data->result = bcm_kona_do_smc(data->service_id, bcm_smc_buffer_phys); } unsigned bcm_kona_smc(unsigned service_id, unsigned arg0, unsigned arg1, Loading @@ -106,17 +170,13 @@ unsigned bcm_kona_smc(unsigned service_id, unsigned arg0, unsigned arg1, data.arg1 = arg1; data.arg2 = arg2; data.arg3 = arg3; data.result = 0; /* * Due to a limitation of the secure monitor, we must use the SMP * infrastructure to forward all secure monitor calls to Core 0. */ if (get_cpu() != 0) smp_call_function_single(0, __bcm_kona_smc, (void *)&data, 1); else __bcm_kona_smc(&data); smp_call_function_single(0, __bcm_kona_smc, &data, 1); put_cpu(); return 0; return data.result; } arch/arm/mach-bcm/bcm_kona_smc.h +2 −50 Original line number Diff line number Diff line Loading @@ -15,55 +15,12 @@ #define BCM_KONA_SMC_H #include <linux/types.h> #define FLAGS (SEC_ROM_ICACHE_ENABLE_MASK | SEC_ROM_DCACHE_ENABLE_MASK | \ SEC_ROM_IRQ_ENABLE_MASK | SEC_ROM_FIQ_ENABLE_MASK) /*! * Definitions for IRQ & FIQ Mask for ARM */ #define FIQ_IRQ_MASK 0xC0 #define FIQ_MASK 0x40 #define IRQ_MASK 0x80 /*! * Secure Mode FLAGs */ /* When set, enables ICache within the secure mode */ #define SEC_ROM_ICACHE_ENABLE_MASK 0x00000001 /* When set, enables DCache within the secure mode */ #define SEC_ROM_DCACHE_ENABLE_MASK 0x00000002 /* When set, enables IRQ within the secure mode */ #define SEC_ROM_IRQ_ENABLE_MASK 0x00000004 /* When set, enables FIQ within the secure mode */ #define SEC_ROM_FIQ_ENABLE_MASK 0x00000008 /* When set, enables Unified L2 cache within the secure mode */ #define SEC_ROM_UL2_CACHE_ENABLE_MASK 0x00000010 /* Broadcom Secure Service API Service IDs */ #define SSAPI_DORMANT_ENTRY_SERV 0x01000000 #define SSAPI_PUBLIC_OTP_SERV 0x01000001 /* Broadcom Secure Service API service IDs, return codes, and exit codes */ #define SSAPI_ENABLE_L2_CACHE 0x01000002 #define SSAPI_DISABLE_L2_CACHE 0x01000003 #define SSAPI_WRITE_SCU_STATUS 0x01000004 #define SSAPI_WRITE_PWR_GATE 0x01000005 /* Broadcom Secure Service API Return Codes */ #define SEC_ROM_RET_OK 0x00000001 #define SEC_ROM_RET_FAIL 0x00000009 #define SSAPI_RET_FROM_INT_SERV 0x4 #define SEC_EXIT_NORMAL 0x1 #define SSAPI_ROW_AES 0x0E000006 #define SSAPI_BRCM_START_VC_CORE 0x0E000008 #ifndef __ASSEMBLY__ extern int __init bcm_kona_smc_init(void); extern unsigned bcm_kona_smc(unsigned service_id, Loading @@ -72,9 +29,4 @@ extern unsigned bcm_kona_smc(unsigned service_id, unsigned arg2, unsigned arg3); extern int bcm_kona_smc_asm(u32 service_id, u32 buffer_addr); #endif /* __ASSEMBLY__ */ #endif /* BCM_KONA_SMC_H */ arch/arm/mach-bcm/bcm_kona_smc_asm.Sdeleted 100644 → 0 +0 −41 Original line number Diff line number Diff line /* * Copyright (C) 2013 Broadcom Corporation * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation version 2. * * This program is distributed "as is" WITHOUT ANY WARRANTY of any * kind, whether express or implied; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ #include <linux/linkage.h> #include "bcm_kona_smc.h" /* * int bcm_kona_smc_asm(u32 service_id, u32 buffer_addr) */ ENTRY(bcm_kona_smc_asm) stmfd sp!, {r4-r12, lr} mov r4, r0 @ service_id mov r5, #3 @ Keep IRQ and FIQ off in SM /* * Since interrupts are disabled in the open mode, we must keep * interrupts disabled in secure mode by setting R5=0x3. If interrupts * are enabled in open mode, we can set R5=0x0 to allow interrupts in * secure mode. If we did this, the secure monitor would return back * control to the open mode to handle the interrupt prior to completing * the secure service. If this happened, R12 would not be * SEC_EXIT_NORMAL and we would need to call SMC again after resetting * R5 (it gets clobbered by the secure monitor) and setting R4 to * SSAPI_RET_FROM_INT_SERV to indicate that we want the secure monitor * to finish up the previous uncompleted secure service. */ mov r6, r1 @ buffer_addr smc #0 /* Check r12 for SEC_EXIT_NORMAL here if interrupts are enabled */ ldmfd sp!, {r4-r12, pc} ENDPROC(bcm_kona_smc_asm) Loading
arch/arm/mach-bcm/Kconfig +35 −5 Original line number Diff line number Diff line Loading @@ -10,21 +10,51 @@ if ARCH_BCM menu "Broadcom SoC Selection" config ARCH_BCM_MOBILE bool "Broadcom Mobile SoC" if ARCH_MULTI_V7 bool "Broadcom Mobile SoC Support" if ARCH_MULTI_V7 select ARCH_REQUIRE_GPIOLIB select ARM_ERRATA_754322 select ARM_ERRATA_764369 if SMP select ARM_GIC select GPIO_BCM_KONA select TICK_ONESHOT select CACHE_L2X0 select HAVE_ARM_ARCH_TIMER select PINCTRL help This enables support for systems based on Broadcom mobile SoCs. It currently supports the 'BCM281XX' family, which includes BCM11130, BCM11140, BCM11351, BCM28145 and BCM28155 variants. if ARCH_BCM_MOBILE menu "Broadcom Mobile SoC Selection" config ARCH_BCM_281XX bool "Broadcom BCM281XX SoC family" default y help Enable support for the the BCM281XX family, which includes BCM11130, BCM11140, BCM11351, BCM28145 and BCM28155 variants. config ARCH_BCM_21664 bool "Broadcom BCM21664 SoC family" default y help Enable support for the the BCM21664 family, which includes BCM21663 and BCM21664 variants. config ARCH_BCM_MOBILE_L2_CACHE bool "Broadcom mobile SoC level 2 cache support" depends on (ARCH_BCM_281XX || ARCH_BCM_21664) default y select CACHE_L2X0 select ARCH_BCM_MOBILE_SMC config ARCH_BCM_MOBILE_SMC bool depends on ARCH_BCM_281XX || ARCH_BCM_21664 endmenu endif config ARCH_BCM2835 bool "Broadcom BCM2835 family" if ARCH_MULTI_V6 Loading
arch/arm/mach-bcm/Makefile +17 −4 Original line number Diff line number Diff line Loading @@ -10,10 +10,23 @@ # of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. obj-$(CONFIG_ARCH_BCM_MOBILE) := board_bcm281xx.o board_bcm21664.o \ bcm_kona_smc.o bcm_kona_smc_asm.o kona.o # BCM281XX obj-$(CONFIG_ARCH_BCM_281XX) += board_bcm281xx.o # BCM21664 obj-$(CONFIG_ARCH_BCM_21664) += board_bcm21664.o # BCM281XX and BCM21664 L2 cache control obj-$(CONFIG_ARCH_BCM_MOBILE_L2_CACHE) += kona_l2_cache.o # Support for secure monitor traps obj-$(CONFIG_ARCH_BCM_MOBILE_SMC) += bcm_kona_smc.o ifeq ($(call as-instr,.arch_extension sec,as_has_sec),as_has_sec) CFLAGS_bcm_kona_smc.o += -Wa,-march=armv7-a+sec -DREQUIRES_SEC endif # BCM2835 obj-$(CONFIG_ARCH_BCM2835) += board_bcm2835.o plus_sec := $(call as-instr,.arch_extension sec,+sec) AFLAGS_bcm_kona_smc_asm.o :=-Wa,-march=armv7-a$(plus_sec) # BCM5301X obj-$(CONFIG_ARCH_BCM_5301X) += bcm_5301x.o
arch/arm/mach-bcm/bcm_kona_smc.c +98 −38 Original line number Diff line number Diff line Loading @@ -21,11 +21,8 @@ #include "bcm_kona_smc.h" struct secure_bridge_data { void __iomem *bounce; /* virtual address */ u32 __iomem buffer_addr; /* physical address */ int initialized; } bridge_data; static u32 bcm_smc_buffer_phys; /* physical address */ static void __iomem *bcm_smc_buffer; /* virtual address */ struct bcm_kona_smc_data { unsigned service_id; Loading @@ -33,6 +30,7 @@ struct bcm_kona_smc_data { unsigned arg1; unsigned arg2; unsigned arg3; unsigned result; }; static const struct of_device_id bcm_kona_smc_ids[] __initconst = { Loading @@ -41,59 +39,125 @@ static const struct of_device_id bcm_kona_smc_ids[] __initconst = { {}, }; /* Map in the bounce area */ /* Map in the args buffer area */ int __init bcm_kona_smc_init(void) { struct device_node *node; const __be32 *prop_val; u64 prop_size = 0; unsigned long buffer_size; u32 buffer_phys; /* Read buffer addr and size from the device tree node */ node = of_find_matching_node(NULL, bcm_kona_smc_ids); if (!node) return -ENODEV; /* Don't care about size or flags of the DT node */ bridge_data.buffer_addr = be32_to_cpu(*of_get_address(node, 0, NULL, NULL)); BUG_ON(!bridge_data.buffer_addr); prop_val = of_get_address(node, 0, &prop_size, NULL); if (!prop_val) return -EINVAL; bridge_data.bounce = of_iomap(node, 0); BUG_ON(!bridge_data.bounce); /* We assume space for four 32-bit arguments */ if (prop_size < 4 * sizeof(u32) || prop_size > (u64)ULONG_MAX) return -EINVAL; buffer_size = (unsigned long)prop_size; bridge_data.initialized = 1; buffer_phys = be32_to_cpup(prop_val); if (!buffer_phys) return -EINVAL; bcm_smc_buffer = ioremap(buffer_phys, buffer_size); if (!bcm_smc_buffer) return -ENOMEM; bcm_smc_buffer_phys = buffer_phys; pr_info("Kona Secure API initialized\n"); return 0; } /* * int bcm_kona_do_smc(u32 service_id, u32 buffer_addr) * * Only core 0 can run the secure monitor code. If an "smc" request * is initiated on a different core it must be redirected to core 0 * for execution. We rely on the caller to handle this. * * Each "smc" request supplies a service id and the address of a * buffer containing parameters related to the service to be * performed. A flags value defines the behavior of the level 2 * cache and interrupt handling while the secure monitor executes. * * Parameters to the "smc" request are passed in r4-r6 as follows: * r4 service id * r5 flags (SEC_ROM_*) * r6 physical address of buffer with other parameters * * Execution of an "smc" request produces two distinct results. * * First, the secure monitor call itself (regardless of the specific * service request) can succeed, or can produce an error. When an * "smc" request completes this value is found in r12; it should * always be SEC_EXIT_NORMAL. * * In addition, the particular service performed produces a result. * The values that should be expected depend on the service. We * therefore return this value to the caller, so it can handle the * request result appropriately. This result value is found in r0 * when the "smc" request completes. */ static int bcm_kona_do_smc(u32 service_id, u32 buffer_phys) { register u32 ip asm("ip"); /* Also called r12 */ register u32 r0 asm("r0"); register u32 r4 asm("r4"); register u32 r5 asm("r5"); register u32 r6 asm("r6"); r4 = service_id; r5 = 0x3; /* Keep IRQ and FIQ off in SM */ r6 = buffer_phys; asm volatile ( /* Make sure we got the registers we want */ __asmeq("%0", "ip") __asmeq("%1", "r0") __asmeq("%2", "r4") __asmeq("%3", "r5") __asmeq("%4", "r6") #ifdef REQUIRES_SEC ".arch_extension sec\n" #endif " smc #0\n" : "=r" (ip), "=r" (r0) : "r" (r4), "r" (r5), "r" (r6) : "r1", "r2", "r3", "r7", "lr"); BUG_ON(ip != SEC_EXIT_NORMAL); return r0; } /* __bcm_kona_smc() should only run on CPU 0, with pre-emption disabled */ static void __bcm_kona_smc(void *info) { struct bcm_kona_smc_data *data = info; u32 *args = bridge_data.bounce; int rc = 0; u32 *args = bcm_smc_buffer; /* Must run on CPU 0 */ BUG_ON(smp_processor_id() != 0); BUG_ON(!args); /* Check map in the bounce area */ BUG_ON(!bridge_data.initialized); /* Copy one 32 bit word into the bounce area */ args[0] = data->arg0; args[1] = data->arg1; args[2] = data->arg2; args[3] = data->arg3; /* Copy the four 32 bit argument values into the bounce area */ writel_relaxed(data->arg0, args++); writel_relaxed(data->arg1, args++); writel_relaxed(data->arg2, args++); writel(data->arg3, args); /* Flush caches for input data passed to Secure Monitor */ if (data->service_id != SSAPI_BRCM_START_VC_CORE) flush_cache_all(); /* Trap into Secure Monitor */ rc = bcm_kona_smc_asm(data->service_id, bridge_data.buffer_addr); if (rc != SEC_ROM_RET_OK) pr_err("Secure Monitor call failed (0x%x)!\n", rc); /* Trap into Secure Monitor and record the request result */ data->result = bcm_kona_do_smc(data->service_id, bcm_smc_buffer_phys); } unsigned bcm_kona_smc(unsigned service_id, unsigned arg0, unsigned arg1, Loading @@ -106,17 +170,13 @@ unsigned bcm_kona_smc(unsigned service_id, unsigned arg0, unsigned arg1, data.arg1 = arg1; data.arg2 = arg2; data.arg3 = arg3; data.result = 0; /* * Due to a limitation of the secure monitor, we must use the SMP * infrastructure to forward all secure monitor calls to Core 0. */ if (get_cpu() != 0) smp_call_function_single(0, __bcm_kona_smc, (void *)&data, 1); else __bcm_kona_smc(&data); smp_call_function_single(0, __bcm_kona_smc, &data, 1); put_cpu(); return 0; return data.result; }
arch/arm/mach-bcm/bcm_kona_smc.h +2 −50 Original line number Diff line number Diff line Loading @@ -15,55 +15,12 @@ #define BCM_KONA_SMC_H #include <linux/types.h> #define FLAGS (SEC_ROM_ICACHE_ENABLE_MASK | SEC_ROM_DCACHE_ENABLE_MASK | \ SEC_ROM_IRQ_ENABLE_MASK | SEC_ROM_FIQ_ENABLE_MASK) /*! * Definitions for IRQ & FIQ Mask for ARM */ #define FIQ_IRQ_MASK 0xC0 #define FIQ_MASK 0x40 #define IRQ_MASK 0x80 /*! * Secure Mode FLAGs */ /* When set, enables ICache within the secure mode */ #define SEC_ROM_ICACHE_ENABLE_MASK 0x00000001 /* When set, enables DCache within the secure mode */ #define SEC_ROM_DCACHE_ENABLE_MASK 0x00000002 /* When set, enables IRQ within the secure mode */ #define SEC_ROM_IRQ_ENABLE_MASK 0x00000004 /* When set, enables FIQ within the secure mode */ #define SEC_ROM_FIQ_ENABLE_MASK 0x00000008 /* When set, enables Unified L2 cache within the secure mode */ #define SEC_ROM_UL2_CACHE_ENABLE_MASK 0x00000010 /* Broadcom Secure Service API Service IDs */ #define SSAPI_DORMANT_ENTRY_SERV 0x01000000 #define SSAPI_PUBLIC_OTP_SERV 0x01000001 /* Broadcom Secure Service API service IDs, return codes, and exit codes */ #define SSAPI_ENABLE_L2_CACHE 0x01000002 #define SSAPI_DISABLE_L2_CACHE 0x01000003 #define SSAPI_WRITE_SCU_STATUS 0x01000004 #define SSAPI_WRITE_PWR_GATE 0x01000005 /* Broadcom Secure Service API Return Codes */ #define SEC_ROM_RET_OK 0x00000001 #define SEC_ROM_RET_FAIL 0x00000009 #define SSAPI_RET_FROM_INT_SERV 0x4 #define SEC_EXIT_NORMAL 0x1 #define SSAPI_ROW_AES 0x0E000006 #define SSAPI_BRCM_START_VC_CORE 0x0E000008 #ifndef __ASSEMBLY__ extern int __init bcm_kona_smc_init(void); extern unsigned bcm_kona_smc(unsigned service_id, Loading @@ -72,9 +29,4 @@ extern unsigned bcm_kona_smc(unsigned service_id, unsigned arg2, unsigned arg3); extern int bcm_kona_smc_asm(u32 service_id, u32 buffer_addr); #endif /* __ASSEMBLY__ */ #endif /* BCM_KONA_SMC_H */
arch/arm/mach-bcm/bcm_kona_smc_asm.Sdeleted 100644 → 0 +0 −41 Original line number Diff line number Diff line /* * Copyright (C) 2013 Broadcom Corporation * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation version 2. * * This program is distributed "as is" WITHOUT ANY WARRANTY of any * kind, whether express or implied; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ #include <linux/linkage.h> #include "bcm_kona_smc.h" /* * int bcm_kona_smc_asm(u32 service_id, u32 buffer_addr) */ ENTRY(bcm_kona_smc_asm) stmfd sp!, {r4-r12, lr} mov r4, r0 @ service_id mov r5, #3 @ Keep IRQ and FIQ off in SM /* * Since interrupts are disabled in the open mode, we must keep * interrupts disabled in secure mode by setting R5=0x3. If interrupts * are enabled in open mode, we can set R5=0x0 to allow interrupts in * secure mode. If we did this, the secure monitor would return back * control to the open mode to handle the interrupt prior to completing * the secure service. If this happened, R12 would not be * SEC_EXIT_NORMAL and we would need to call SMC again after resetting * R5 (it gets clobbered by the secure monitor) and setting R4 to * SSAPI_RET_FROM_INT_SERV to indicate that we want the secure monitor * to finish up the previous uncompleted secure service. */ mov r6, r1 @ buffer_addr smc #0 /* Check r12 for SEC_EXIT_NORMAL here if interrupts are enabled */ ldmfd sp!, {r4-r12, pc} ENDPROC(bcm_kona_smc_asm)