[FOSS_TLK]ote: tlk: makefile change for upstream TLK
[3rdparty/ote_partner/tlk.git] / kernel / boot.c
1 /*
2  * Copyright (c) 2012-2015, NVIDIA CORPORATION. All rights reserved
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining
5  * a copy of this software and associated documentation files
6  * (the "Software"), to deal in the Software without restriction,
7  * including without limitation the rights to use, copy, modify, merge,
8  * publish, distribute, sublicense, and/or sell copies of the Software,
9  * and to permit persons to whom the Software is furnished to do so,
10  * subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice shall be
13  * included in all copies or substantial portions of the Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
18  * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
19  * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
20  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
21  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22  */
23
24 #include <string.h>
25 #include <stdlib.h>
26 #include <assert.h>
27 #include <kernel/boot_params.h>
28 #include <platform/platform_p.h>
29 #include <common/ote_nv_uuid.h>
30
31 unsigned int coldboot_normal_os;
32 unsigned int normal_os_coldboot_fn;
33 extern uint32_t debug_uart_id;
34 unsigned int tf_key_addr;
35 unsigned int tf_key_size;
36 uint32_t device_uid[DEVICE_UID_SIZE_WORDS];
37 paddr_t tsec_carveout_size, tsec_carveout_base;
38 paddr_t dtb_addr;
39
40 extern unsigned int __bootarg_addr;
41
42 struct cmdline_member {
43         char name[PARAM_NAME_LEN];
44         unsigned int *container;
45 };
46
47 static int getoffsetof(char *source, char c)
48 {
49         int offset = 0;
50         int len;
51
52         if (!source)
53                 return 0;
54
55         len = strlen(source);
56
57         while (*source++ != c && len-- > 0)
58                 offset++;
59
60         return offset;
61 }
62
63 void parse_cmdline(void)
64 {
65         boot_params *boot_params_ptr = (boot_params*)__bootarg_addr;
66         char *str;
67         int cmdline_len, i;
68         struct cmdline_member members[] = {
69                 {CMDLINE_OS_BOOT_ADDR, &normal_os_coldboot_fn},
70                 {CMDLINE_DEVICE_UID0, &device_uid[0]},
71                 {CMDLINE_DEVICE_UID1, &device_uid[1]},
72                 {CMDLINE_DEVICE_UID2, &device_uid[2]},
73                 {CMDLINE_DEVICE_UID3, &device_uid[3]},
74                 {CMDLINE_DEBUG_UART_ID, &debug_uart_id},
75                 {CMDLINE_TFKEY_ADDR, &tf_key_addr},
76                 {CMDLINE_TFKEY_SIZE, &tf_key_size},
77                 {CMDLINE_DTB_ADDR, &dtb_addr}
78         };
79
80         if (!boot_params_ptr ||
81             !boot_params_ptr->param_string[0])
82                 return;
83
84         cmdline_len = boot_params_ptr->param_string_sz;
85
86         str = boot_params_ptr->param_string;
87         for (i = 0; i < cmdline_len; i++) {
88                 if (*(str + i) == '\n') {
89                         *(str + i) = '\0';
90                         cmdline_len--;
91                 }
92         }
93
94         str = boot_params_ptr->param_string;
95         while (cmdline_len > 0) {
96                 if (*str == '[')
97                         goto done;
98
99                 unsigned int offset = getoffsetof(str, ':');
100
101                 if (strlen(str) < offset)
102                         goto done;
103
104                 *(str + offset) = '\0';
105                 cmdline_len -= (strlen(str) + 1);
106
107                 for (i = 0; i < ARRAY_SIZE(members); i++) {
108                         if (!strncmp(str, (const char *)&members[i].name, strlen(members[i].name))) {
109                                 str += strlen(str) + 2;
110                                 *members[i].container = atoi(str);
111                                 cmdline_len--;
112                                 break;
113                         } else if (!strncmp(str, CMDLINE_DRAM_RANGE, strlen(CMDLINE_DRAM_RANGE))) {
114                                 paddr_t base, size;
115
116                                 /* format is "mem: <size>M@<base>M" in MBbytes */
117                                 str += strlen(str) + 2;
118                                 size = (paddr_t) atoui(str);
119                                 base = (paddr_t) atoui(strchr(str, '@') + 1);
120                                 cmdline_len--;
121
122                                 tz_add_dram_range(base << 20, size << 20);
123                                 break;
124                         } else if (!strncmp(str, CMDLINE_TSEC_CARVEOUT, strlen(CMDLINE_TSEC_CARVEOUT))) {
125
126                                 /* format is "tsec: <size>M@<base>M" in MBbytes */
127                                 str += strlen(str) + 2;
128                                 tsec_carveout_size = (paddr_t) atoui(str);
129                                 tsec_carveout_base = (paddr_t) atoui(strchr(str, '@') + 1);
130                                 tsec_carveout_size <<= 20;
131                                 tsec_carveout_base <<= 20;
132                                 cmdline_len--;
133                                 break;
134                         }
135                 }
136
137                 if (i == ARRAY_SIZE(members)) {
138                         str += strlen(str) + 2;
139                         cmdline_len--;
140                 }
141
142 done:
143                 cmdline_len -= strlen(str);
144                 str += strlen(str) + 1;
145         }
146 }
147
148 int get_boot_args(task_t *task, uint32_t *argv)
149 {
150         int i = 0;
151         te_service_id_t hdcp_uuid = SERVICE_SECURE_HDCP_UUID;
152
153         /* pass input params to hdcp service via argv */
154         if (!memcmp(&hdcp_uuid, &task->props.uuid, sizeof(te_service_id_t))) {
155                 argv[i++] = 0x0;                /* argv[0] = progname (NULL) */
156                 argv[i++] = tsec_carveout_base; /* argv[1] */
157                 argv[i++] = tsec_carveout_size; /* argv[2] */
158         }
159
160         return i;
161 }