blob: 86542cd5b590e31eeaff06064a918a6574c387ec [file] [log] [blame]
rjw1f884582022-01-06 17:20:42 +08001/*
2 * Copyright (c) 2019 MediaTek Inc.
3 *
4 * Use of this source code is governed by a MIT-style
5 * license that can be found in the LICENSE file or at
6 * https://opensource.org/licenses/MIT
7 */
8
9#include <assert.h>
10#include <lib/boot_info.h>
11#include <stdbool.h>
12#include <string.h>
13#include <trace.h>
14
15#define LOCAL_TRACE 0
16
17static struct bootimg_hdr g_bootimg_hdr;
18static struct boot_info g_boot_info;
19
20static uint32_t bootimg_hdr_valid(uint8_t *buf)
21{
22 if (strncmp((char *)buf, BOOTIMG_MAGIC, BOOTIMG_MAGIC_SZ) == 0)
23 return 1;
24 else
25 return 0;
26}
27
28int load_bootinfo_bootimg_hdr(struct bootimg_hdr *buf)
29{
30 assert(buf);
31 if (g_boot_info.hdr_loaded)
32 return 0;
33
34 if (!bootimg_hdr_valid((uint8_t *)buf)) {
35 LTRACEF_LEVEL(CRITICAL, "invalid boot image header\n");
36 return -1;
37 }
38 memcpy(&g_bootimg_hdr, buf, sizeof(struct bootimg_hdr));
39 g_boot_info.hdr_loaded = 1;
40 return 0;
41}
42
43vaddr_t get_dtb_addr(void)
44{
45 vaddr_t dtb_addr;
46
47 ASSERT(g_boot_info.hdr_loaded);
48
49 dtb_addr = get_kernel_addr()
50 + get_kernel_sz()
51 + get_ramdisk_sz()
52 + get_recovery_dtbo_sz();
53
54 return dtb_addr;
55}
56
57uint32_t get_dtb_size(void)
58{
59 ASSERT(g_boot_info.hdr_loaded);
60
61 return g_bootimg_hdr.dtb_size;
62}
63
64uint64_t get_dtb_target_addr(void)
65{
66 ASSERT(g_boot_info.hdr_loaded);
67
68 return g_bootimg_hdr.dtb_addr;
69}
70
71uint32_t get_recovery_dtbo_sz(void)
72{
73 uint32_t page_sz;
74 uint32_t recovery_dtbo_size;
75 uint32_t out_recovery_dtbo_size;
76
77 ASSERT(g_boot_info.hdr_loaded);
78
79 recovery_dtbo_size = g_bootimg_hdr.recovery_dtbo_size;
80 page_sz = g_bootimg_hdr.page_sz;
81
82 out_recovery_dtbo_size =
83 (((recovery_dtbo_size + page_sz - 1) / page_sz) * page_sz);
84
85 return out_recovery_dtbo_size;
86}
87
88uint32_t get_page_sz(void)
89{
90 ASSERT(g_boot_info.hdr_loaded);
91
92 return g_bootimg_hdr.page_sz;
93}
94
95/* get final kernel image location (after relocation) */
96uint32_t get_kernel_target_addr(void)
97{
98 ASSERT(g_boot_info.hdr_loaded);
99
100 return g_bootimg_hdr.kernel_addr;
101}
102
103/* get kernel image address when it's loaded */
104vaddr_t get_kernel_addr(void)
105{
106 vaddr_t kernel_addr;
107
108 ASSERT(g_boot_info.hdr_loaded);
109 ASSERT(g_boot_info.img_loaded);
110
111 kernel_addr = g_boot_info.bootimg_load_addr + g_bootimg_hdr.page_sz;
112
113 return kernel_addr;
114}
115
116uint32_t get_kernel_sz(void)
117{
118 uint32_t page_sz;
119 uint32_t kernel_sz;
120 uint32_t out_kernel_sz;
121
122 ASSERT(g_boot_info.hdr_loaded);
123
124 kernel_sz = g_bootimg_hdr.kernel_sz;
125 page_sz = g_bootimg_hdr.page_sz;
126
127 out_kernel_sz = (((kernel_sz + page_sz - 1) / page_sz) * page_sz);
128
129 return out_kernel_sz;
130}
131
132uint32_t get_kernel_real_sz(void)
133{
134 ASSERT(g_boot_info.hdr_loaded);
135 return g_bootimg_hdr.kernel_sz;
136}
137
138/* get final ramdisk image location (after relocation) */
139uint32_t get_ramdisk_target_addr(void)
140{
141 ASSERT(g_boot_info.hdr_loaded);
142
143 return g_bootimg_hdr.ramdisk_addr;
144}
145
146/* get ramdisk image address when it's loaded */
147vaddr_t get_ramdisk_addr(void)
148{
149 uint32_t kernel_sz;
150 vaddr_t ramdisk_addr;
151
152 ASSERT(g_boot_info.hdr_loaded);
153 ASSERT(g_boot_info.img_loaded);
154
155 kernel_sz = get_kernel_sz();
156 if (kernel_sz == 0)
157 return 0;
158
159 ramdisk_addr = g_boot_info.bootimg_load_addr + g_bootimg_hdr.page_sz +
160 kernel_sz;
161
162 return ramdisk_addr;
163}
164
165uint32_t get_ramdisk_sz(void)
166{
167 uint32_t page_sz;
168 uint32_t ramdisk_sz;
169 uint32_t out_ramdisk_sz;
170
171 ASSERT(g_boot_info.hdr_loaded);
172
173 ramdisk_sz = g_bootimg_hdr.ramdisk_sz;
174 page_sz = g_bootimg_hdr.page_sz;
175
176 out_ramdisk_sz = (((ramdisk_sz + page_sz - 1) / page_sz) * page_sz);
177
178 return out_ramdisk_sz;
179}
180
181uint32_t get_ramdisk_real_sz(void)
182{
183 ASSERT(g_boot_info.hdr_loaded);
184 return g_bootimg_hdr.ramdisk_sz;
185}
186
187uint32_t get_header_version(void)
188{
189 ASSERT(g_boot_info.hdr_loaded);
190 return g_bootimg_hdr.header_version;
191}
192
193void set_bootimg_loaded(vaddr_t addr)
194{
195 ASSERT(g_boot_info.hdr_loaded);
196
197 g_boot_info.img_loaded = 1;
198 g_boot_info.bootimg_load_addr = addr;
199}