xref: /rk3399_rockchip-uboot/arch/arm/mach-keystone/mon.c (revision 94f536fc4fd70fc9f3c7442d09698a9b1c82f41b)
1aadd3360STom Rini /*
2aadd3360STom Rini  * K2HK: secure kernel command file
3aadd3360STom Rini  *
4aadd3360STom Rini  * (C) Copyright 2012-2014
5aadd3360STom Rini  *     Texas Instruments Incorporated, <www.ti.com>
6aadd3360STom Rini  *
7aadd3360STom Rini  * SPDX-License-Identifier:     GPL-2.0+
8aadd3360STom Rini  */
9aadd3360STom Rini 
10aadd3360STom Rini #include <common.h>
11aadd3360STom Rini #include <command.h>
12aadd3360STom Rini #include <mach/mon.h>
13e8d740f5SVitaly Andrianov #include <spl.h>
14aadd3360STom Rini asm(".arch_extension sec\n\t");
15aadd3360STom Rini 
mon_install(u32 addr,u32 dpsc,u32 freq,u32 bm_addr)161d73ce6fSMadan Srinivas int mon_install(u32 addr, u32 dpsc, u32 freq, u32 bm_addr)
17aadd3360STom Rini {
18aadd3360STom Rini 	int result;
19aadd3360STom Rini 
20aadd3360STom Rini 	__asm__ __volatile__ (
21aadd3360STom Rini 		"stmfd r13!, {lr}\n"
22aadd3360STom Rini 		"mov r0, %1\n"
23aadd3360STom Rini 		"mov r1, %2\n"
24aadd3360STom Rini 		"mov r2, %3\n"
251d73ce6fSMadan Srinivas 		"mov r3, %4\n"
26aadd3360STom Rini 		"blx r0\n"
27*94f536fcSSrinivas, Madan 		"mov %0, r0\n"
28aadd3360STom Rini 		"ldmfd r13!, {lr}\n"
29aadd3360STom Rini 		: "=&r" (result)
301d73ce6fSMadan Srinivas 		: "r" (addr), "r" (dpsc), "r" (freq), "r" (bm_addr)
311d73ce6fSMadan Srinivas 		: "cc", "r0", "r1", "r2", "r3", "memory");
32aadd3360STom Rini 	return result;
33aadd3360STom Rini }
34aadd3360STom Rini 
mon_power_on(int core_id,void * ep)35aadd3360STom Rini int mon_power_on(int core_id, void *ep)
36aadd3360STom Rini {
37aadd3360STom Rini 	int result;
38aadd3360STom Rini 
39aadd3360STom Rini 	asm volatile (
40aadd3360STom Rini 		"stmfd  r13!, {lr}\n"
41aadd3360STom Rini 		"mov r1, %1\n"
42aadd3360STom Rini 		"mov r2, %2\n"
43aadd3360STom Rini 		"mov r0, #0\n"
44aadd3360STom Rini 		"smc	#0\n"
45*94f536fcSSrinivas, Madan 		"mov %0, r0\n"
46aadd3360STom Rini 		"ldmfd  r13!, {lr}\n"
47aadd3360STom Rini 		: "=&r" (result)
48aadd3360STom Rini 		: "r" (core_id), "r" (ep)
49aadd3360STom Rini 		: "cc", "r0", "r1", "r2", "memory");
50aadd3360STom Rini 	return  result;
51aadd3360STom Rini }
52aadd3360STom Rini 
mon_power_off(int core_id)53aadd3360STom Rini int mon_power_off(int core_id)
54aadd3360STom Rini {
55aadd3360STom Rini 	int result;
56aadd3360STom Rini 
57aadd3360STom Rini 	asm volatile (
58aadd3360STom Rini 		"stmfd  r13!, {lr}\n"
59aadd3360STom Rini 		"mov r1, %1\n"
60aadd3360STom Rini 		"mov r0, #1\n"
61aadd3360STom Rini 		"smc	#1\n"
62*94f536fcSSrinivas, Madan 		"mov %0, r0\n"
63aadd3360STom Rini 		"ldmfd  r13!, {lr}\n"
64aadd3360STom Rini 		: "=&r" (result)
65aadd3360STom Rini 		: "r" (core_id)
66aadd3360STom Rini 		: "cc", "r0", "r1", "memory");
67aadd3360STom Rini 	return  result;
68aadd3360STom Rini }
69e8d740f5SVitaly Andrianov 
70e8d740f5SVitaly Andrianov #ifdef CONFIG_TI_SECURE_DEVICE
71e8d740f5SVitaly Andrianov #define KS2_HS_SEC_HEADER_LEN	0x60
72e8d740f5SVitaly Andrianov #define KS2_HS_SEC_TAG_OFFSET	0x34
73e8d740f5SVitaly Andrianov #define KS2_AUTH_CMD		130
74e8d740f5SVitaly Andrianov 
75e8d740f5SVitaly Andrianov /**
76e8d740f5SVitaly Andrianov  * k2_hs_bm_auth() - Invokes security functions using a
77e8d740f5SVitaly Andrianov  * proprietary TI interface. This binary and source for
78e8d740f5SVitaly Andrianov  * this is available in the secure development package or
79e8d740f5SVitaly Andrianov  * SECDEV. For details on how to access this please refer
80e8d740f5SVitaly Andrianov  * doc/README.ti-secure
81e8d740f5SVitaly Andrianov  *
82e8d740f5SVitaly Andrianov  * @cmd: Secure monitor command
83e8d740f5SVitaly Andrianov  * @arg1: Argument for command
84e8d740f5SVitaly Andrianov  *
85e8d740f5SVitaly Andrianov  * returns non-zero value on success, zero on error
86e8d740f5SVitaly Andrianov  */
k2_hs_bm_auth(int cmd,void * arg1)87e8d740f5SVitaly Andrianov static int k2_hs_bm_auth(int cmd, void *arg1)
88e8d740f5SVitaly Andrianov {
89e8d740f5SVitaly Andrianov 	int result;
90e8d740f5SVitaly Andrianov 
91e8d740f5SVitaly Andrianov 	asm volatile (
92e8d740f5SVitaly Andrianov 		"stmfd  r13!, {r4-r12, lr}\n"
93e8d740f5SVitaly Andrianov 		"mov r0, %1\n"
94e8d740f5SVitaly Andrianov 		"mov r1, %2\n"
95e8d740f5SVitaly Andrianov 		"smc #2\n"
96*94f536fcSSrinivas, Madan 		"mov %0, r0\n"
97e8d740f5SVitaly Andrianov 		"ldmfd r13!, {r4-r12, lr}\n"
98e8d740f5SVitaly Andrianov 		: "=&r" (result)
99e8d740f5SVitaly Andrianov 		: "r" (cmd), "r" (arg1)
100e8d740f5SVitaly Andrianov 		: "cc", "r0", "r1", "memory");
101e8d740f5SVitaly Andrianov 
102e8d740f5SVitaly Andrianov 	return  result;
103e8d740f5SVitaly Andrianov }
104e8d740f5SVitaly Andrianov 
board_fit_image_post_process(void ** p_image,size_t * p_size)105e8d740f5SVitaly Andrianov void board_fit_image_post_process(void **p_image, size_t *p_size)
106e8d740f5SVitaly Andrianov {
107e8d740f5SVitaly Andrianov 	int result = 0;
108e8d740f5SVitaly Andrianov 	void *image = *p_image;
109e8d740f5SVitaly Andrianov 
110e8d740f5SVitaly Andrianov 	if (strncmp(image + KS2_HS_SEC_TAG_OFFSET, "KEYS", 4)) {
111e8d740f5SVitaly Andrianov 		printf("No signature found in image!\n");
112e8d740f5SVitaly Andrianov 		hang();
113e8d740f5SVitaly Andrianov 	}
114e8d740f5SVitaly Andrianov 
115e8d740f5SVitaly Andrianov 	result = k2_hs_bm_auth(KS2_AUTH_CMD, image);
116e8d740f5SVitaly Andrianov 	if (result == 0) {
117e8d740f5SVitaly Andrianov 		printf("Authentication failed!\n");
118e8d740f5SVitaly Andrianov 		hang();
119e8d740f5SVitaly Andrianov 	}
120e8d740f5SVitaly Andrianov 
121e8d740f5SVitaly Andrianov 	/*
122e8d740f5SVitaly Andrianov 	 * Overwrite the image headers after authentication
123e8d740f5SVitaly Andrianov 	 * and decryption. Update size to reflect removal
124e8d740f5SVitaly Andrianov 	 * of header.
125e8d740f5SVitaly Andrianov 	 */
126e8d740f5SVitaly Andrianov 	*p_size -= KS2_HS_SEC_HEADER_LEN;
1279e58d4dbSAndrew F. Davis 	memcpy(image, image + KS2_HS_SEC_HEADER_LEN, *p_size);
128e8d740f5SVitaly Andrianov 
129e8d740f5SVitaly Andrianov 	/*
130e8d740f5SVitaly Andrianov 	 * Output notification of successful authentication to re-assure the
131e8d740f5SVitaly Andrianov 	 * user that the secure code is being processed as expected. However
132e8d740f5SVitaly Andrianov 	 * suppress any such log output in case of building for SPL and booting
133e8d740f5SVitaly Andrianov 	 * via YMODEM. This is done to avoid disturbing the YMODEM serial
134e8d740f5SVitaly Andrianov 	 * protocol transactions.
135e8d740f5SVitaly Andrianov 	 */
136e8d740f5SVitaly Andrianov 	if (!(IS_ENABLED(CONFIG_SPL_BUILD) &&
137e8d740f5SVitaly Andrianov 	      IS_ENABLED(CONFIG_SPL_YMODEM_SUPPORT) &&
138e8d740f5SVitaly Andrianov 	      spl_boot_device() == BOOT_DEVICE_UART))
139e8d740f5SVitaly Andrianov 		printf("Authentication passed\n");
140e8d740f5SVitaly Andrianov }
141e8d740f5SVitaly Andrianov #endif
142