keystone2: add possibility to turn off all dsps
authorHao Zhang <hzhang@ti.com>
Wed, 9 Jul 2014 16:48:44 +0000 (19:48 +0300)
committerTom Rini <trini@ti.com>
Fri, 25 Jul 2014 20:26:10 +0000 (16:26 -0400)
By default all DSPs are turned off, for another case option
to turn off them is added in this commit.
Also add command to turn off itself.

Acked-by: Murali Karicheri <m-maricheri2@ti.com>
Signed-off-by: Hao Zhang <hzhang@ti.com>
Signed-off-by: Ivan Khoronzhuk <ivan.khoronzhuk@ti.com>
arch/arm/cpu/armv7/keystone/keystone.c
arch/arm/include/asm/arch-keystone/hardware-k2hk.h
arch/arm/include/asm/arch-keystone/hardware.h
arch/arm/include/asm/arch-keystone/mon.h [new file with mode: 0644]

index 48c869064ee5223b348c9cb8188dd861837c51cc..1c8c03845561407fdb53997f889d495e0223e8d7 100644 (file)
@@ -9,6 +9,9 @@
 
 #include <common.h>
 #include <asm/io.h>
+#include <asm/arch/mon.h>
+#include <asm/arch/psc_defs.h>
+#include <asm/arch/hardware.h>
 #include <asm/arch/hardware.h>
 
 /**
@@ -26,3 +29,59 @@ int cpu_to_bus(u32 *ptr, u32 length)
 
        return 0;
 }
+
+static int turn_off_myself(void)
+{
+       printf("Turning off ourselves\r\n");
+       mon_power_off(0);
+
+       psc_disable_module(KS2_LPSC_TETRIS);
+       psc_disable_domain(KS2_TETRIS_PWR_DOMAIN);
+
+       asm volatile ("isb\n"
+                     "dsb\n"
+                     "wfi\n");
+
+       printf("What! Should not see that\n");
+       return 0;
+}
+
+static void turn_off_all_dsps(int num_dsps)
+{
+       int i;
+
+       for (i = 0; i < num_dsps; i++) {
+               if (psc_disable_module(i + KS2_LPSC_GEM_0))
+                       printf("Cannot disable module for #%d DSP", i);
+
+               if (psc_disable_domain(i + 8))
+                       printf("Cannot disable domain for #%d DSP", i);
+       }
+}
+
+int do_killme_cmd(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+       return turn_off_myself();
+}
+
+U_BOOT_CMD(
+       killme, 1,      0,      do_killme_cmd,
+       "turn off main ARM core",
+       "turn off main ARM core. Should not live after that :(\n"
+);
+
+int misc_init_r(void)
+{
+       char *env;
+       long ks2_debug = 0;
+
+       env = getenv("ks2_debug");
+
+       if (env)
+               ks2_debug = simple_strtol(env, NULL, 0);
+
+       if ((ks2_debug & DBG_LEAVE_DSPS_ON) == 0)
+               turn_off_all_dsps(KS2_NUM_DSPS);
+
+       return 0;
+}
index 2cac63313114dd2449b8189360e26394ad79df7f..5e2f659e9473383c736dbc3b752f96e5044f8dce 100644 (file)
@@ -68,7 +68,6 @@
 #define K2HK_LPSC_VUSR0                12
 #define K2HK_LPSC_CHIP_SRSS            13
 #define K2HK_LPSC_MSMC                 14
-#define K2HK_LPSC_GEM_0                15
 #define K2HK_LPSC_GEM_1                16
 #define K2HK_LPSC_GEM_2                17
 #define K2HK_LPSC_GEM_3                18
 #define K2HK_LPSC_VUSR1                49
 #define K2HK_LPSC_XGE                  50
 #define K2HK_LPSC_ARM_SREFLEX          51
-#define K2HK_LPSC_TETRIS               52
 
 /* DDR3A definitions */
 #define K2HK_DDR3A_EMIF_CTRL_BASE      0x21010000
 /* MSMC control */
 #define K2HK_MSMC_CTRL_BASE             0x0bc00000
 
+/* Number of DSP cores */
+#define KS2_NUM_DSPS                   8
+
 #endif /* __ASM_ARCH_HARDWARE_H */
index db2d36bfb61c553cd2fc36355db019e1a6a730d6..0dcc31a64592f13519cd5aadac2a419ed96ec015 100644 (file)
@@ -87,11 +87,17 @@ typedef volatile unsigned int   *dv_reg_p;
 
 /* PSC */
 #define KS2_PSC_BASE                   0x02350000
+#define KS2_LPSC_GEM_0                 15
+#define KS2_LPSC_TETRIS                        52
+#define KS2_TETRIS_PWR_DOMAIN          31
 
 /* AEMIF */
 #define KS2_AEMIF_CNTRL_BASE           0x21000a00
 #define DAVINCI_ASYNC_EMIF_CNTRL_BASE   KS2_AEMIF_CNTRL_BASE
 
+/* Flag from ks2_debug options to check if DSPs need to stay ON */
+#define DBG_LEAVE_DSPS_ON              0x1
+
 #ifdef CONFIG_SOC_K2HK
 #include <asm/arch/hardware-k2hk.h>
 #endif
diff --git a/arch/arm/include/asm/arch-keystone/mon.h b/arch/arm/include/asm/arch-keystone/mon.h
new file mode 100644 (file)
index 0000000..33a2876
--- /dev/null
@@ -0,0 +1,15 @@
+/*
+ * K2HK: secure kernel command header file
+ *
+ * (C) Copyright 2014
+ *     Texas Instruments Incorporated, <www.ti.com>
+ *
+ * SPDX-License-Identifier:     GPL-2.0+
+ */
+
+#ifndef _MON_H_
+#define _MON_H_
+
+int mon_power_off(int core_id);
+
+#endif