]> git.karo-electronics.de Git - linux-beck.git/commitdiff
ARM: bcm: clean up SMC code
authorAlex Elder <elder@linaro.org>
Mon, 21 Apr 2014 21:53:04 +0000 (16:53 -0500)
committerMatt Porter <mporter@linaro.org>
Fri, 25 Apr 2014 12:51:32 +0000 (08:51 -0400)
This patch just does some simple cleanup in "bcm_kona_smc.c":
    - Get rid of the secure_bridge_data structure.  Instead, just
      define two globals that record the physical and virtual
      addresses of the SMC arguments buffer.  Use "buffer" instead
      of "bounce" in their names.  Drop of the erroneous __iomem
      annotation for the physical address.
    - Get rid of the initialized flag and just use a non-null buffer
      address to indicate that.
    - Get the size of the memory region when fetching the SMC
      arguments buffer location from the device tree.  Use it to
      call ioremap() directly rather than requiring of_iomap() to
      go look it up again.
    - Do some additional validation on that memory region size.
    - Flush caches unconditionally in __bcm_kona_smc(); nothing
      supplies SSAPI_BRCM_START_VC_CORE as a service id.
    - Drop a needless initialization of "rc" in __bcm_kona_smc().

It also deletes most of the content of "bcm_kona_smc.h" because it's
never actually used and is of questionable value anyway.

Signed-off-by: Alex Elder <elder@linaro.org>
Reviewed-by: Tim Kryger <tim.kryger@linaro.org>
Reviewed-by: Markus Mayer <markus.mayer@linaro.org>
Reviewed-by: Matt Porter <mporter@linaro.org>
Signed-off-by: Matt Porter <mporter@linaro.org>
arch/arm/mach-bcm/bcm_kona_smc.c
arch/arm/mach-bcm/bcm_kona_smc.h

index ddc2f17217ee152d23baf508645211d77997ad65..0d2bfe2bcfa85de42b4434913619d4d2b93d6120 100644 (file)
 
 #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;
@@ -41,31 +38,37 @@ 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 */
-       prop_val = of_get_address(node, 0, NULL, NULL);
+       prop_val = of_get_address(node, 0, &prop_size, NULL);
        if (!prop_val)
                return -EINVAL;
 
-       bridge_data.buffer_addr = be32_to_cpu(*prop_val);
-       if (!bridge_data.buffer_addr)
+       /* 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.bounce = of_iomap(node, 0);
-       if (!bridge_data.bounce)
-               return -ENOMEM;
+       buffer_phys = be32_to_cpup(prop_val);
+       if (!buffer_phys)
+               return -EINVAL;
 
-       bridge_data.initialized = 1;
+       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");
 
@@ -76,14 +79,11 @@ int __init bcm_kona_smc_init(void)
 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;
+       int rc;
 
-       /* Must run on CPU 0 */
        BUG_ON(smp_processor_id() != 0);
-
-       /* Check map in the bounce area */
-       BUG_ON(!bridge_data.initialized);
+       BUG_ON(!args);
 
        /* Copy the four 32 bit argument values into the bounce area */
        writel_relaxed(data->arg0, args++);
@@ -92,11 +92,10 @@ static void __bcm_kona_smc(void *info)
        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();
+       flush_cache_all();
 
        /* Trap into Secure Monitor */
-       rc = bcm_kona_smc_asm(data->service_id, bridge_data.buffer_addr);
+       rc = bcm_kona_smc_asm(data->service_id, bcm_smc_buffer_phys);
 
        if (rc != SEC_ROM_RET_OK)
                pr_err("Secure Monitor call failed (0x%x)!\n", rc);
index d098a7e7674429165197e5fedb2d6f469774c279..629e64a899822d9a472a16b50b38bd4e413c4f59 100644 (file)
 #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
-#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 */
+/* Broadcom Secure Service API service IDs, return codes, and exit codes */
+#define SSAPI_ENABLE_L2_CACHE          0x01000002
 #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);