First version
[3rdparty/ote_partner/tlk.git] / kernel / boot.c
1 /*
2  * Copyright (c) 2012-2013, 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
30 unsigned int coldboot_normal_os;
31 unsigned int normal_os_coldboot_fn;
32 extern uint32_t debug_uart_id;
33 unsigned int tf_key_addr;
34 unsigned int tf_key_size;
35 uint32_t device_uid[DEVICE_UID_SIZE_WORDS];
36
37 extern unsigned int __bootarg_addr;
38
39 struct cmdline_member {
40         char name[PARAM_NAME_LEN];
41         unsigned int *container;
42 };
43
44 static int getoffsetof(char *source, char c)
45 {
46         int offset = 0;
47         int len = strlen(source);
48
49         if (!source)
50                 return 0;
51
52         while (*source++ != c && len-- > 0)
53                 offset++;
54
55         return offset;
56 }
57
58 void parse_cmdline(void)
59 {
60         boot_params *boot_params_ptr = (boot_params*)__bootarg_addr;
61         char *str;
62         int cmdline_len, i;
63         struct cmdline_member members[] = {
64                 {CMDLINE_OS_BOOT_ADDR, &normal_os_coldboot_fn},
65                 {CMDLINE_DEVICE_UID0, &device_uid[0]},
66                 {CMDLINE_DEVICE_UID1, &device_uid[1]},
67                 {CMDLINE_DEVICE_UID2, &device_uid[2]},
68                 {CMDLINE_DEVICE_UID3, &device_uid[3]},
69                 {CMDLINE_DEBUG_UART_ID, &debug_uart_id},
70                 {CMDLINE_TFKEY_ADDR, &tf_key_addr},
71                 {CMDLINE_TFKEY_SIZE, &tf_key_size}
72         };
73
74         if (!boot_params_ptr ||
75             !boot_params_ptr->param_string)
76                 return;
77
78         cmdline_len = boot_params_ptr->param_string_sz;
79
80         str = boot_params_ptr->param_string;
81         for (i = 0; i < cmdline_len; i++) {
82                 if (*(str + i) == '\n') {
83                         *(str + i) = '\0';
84                         cmdline_len--;
85                 }
86         }
87
88         str = boot_params_ptr->param_string;
89         while (cmdline_len > 0) {
90                 if (*str == '[')
91                         goto done;
92
93                 unsigned int offset = getoffsetof(str, ':');
94
95                 if (strlen(str) < offset)
96                         goto done;
97
98                 *(str + offset) = '\0';
99                 cmdline_len -= (strlen(str) + 1);
100
101                 for (i = 0; i < ARRAY_SIZE(members); i++) {
102                         if (!strncmp(str, (const char *)&members[i].name, strlen(members[i].name))) {
103                                 str += strlen(str) + 2;
104                                 *members[i].container = atoi(str);
105                                 cmdline_len--;
106                                 break;
107                         } else if (!strncmp(str, CMDLINE_DRAM_RANGE, strlen(CMDLINE_DRAM_RANGE))) {
108                                 paddr_t base, size;
109
110                                 /* format is "mem: <size>M@<base>M" in MBbytes */
111                                 str += strlen(str) + 2;
112                                 size = (paddr_t) atoui(str);
113                                 base = (paddr_t) atoui(strchr(str, '@') + 1);
114                                 cmdline_len--;
115
116                                 tz_add_dram_range(base << 20, size << 20);
117                                 break;
118                         }
119                 }
120
121                 if (i == ARRAY_SIZE(members)) {
122                         str += strlen(str) + 2;
123                         cmdline_len--;
124                 }
125
126 done:
127                 cmdline_len -= strlen(str);
128                 str += strlen(str) + 1;
129         }
130 }