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