blob: 8b9c89ee42e00cfc0a885410d9d9de5b9cc5d4a4 [file] [log] [blame]
yuezonghe824eb0c2024-06-27 02:32:26 -07001/*
2 * (C) Copyright 2016 ZXIC Inc.
3 */
4#include <common.h>
5#include <asm/io.h>
6#include <asm/string.h>
7
8#include <image.h>
9#include <linux/byteorder/generic.h>
10#include <secure_verify.h>
11
12#include "flash.h"
13#include <bbt.h>
14
15
16/*
17 ******************************************************************************
18 * Function:
19 * Description:
20 * Parameters:
21 * Input:
22 * Output:
23 * Returns:
24 * Others:
25 *******************************************************************************
26 */
27uint32_t page_align(uint32_t offset)
28{
29 uint32_t page_size = flash.page_size;
30 if(offset & (page_size - 1))
31 {
32 offset &= (~(page_size - 1));
33 offset += page_size;
34 }
35 return offset;
36}
37
38
39/*
40 ******************************************************************************
41 * Function:
42 * Description:
43 * Parameters:
44 * Input:
45 * Output:
46 * Returns:
47 * Others:
48 *******************************************************************************
49 */
50uint32_t find_partition_para(partition_entry_t *entry,
51 uint32_t entrys,
52 uint8_t *name)
53{
54 partition_entry_t *p_entry = entry;
55 uint32_t entry_nums = entrys;
56 while(entry_nums--)
57 {
58 if(memcmp( p_entry->part_name, name, strlen(name)) == 0)
59 return p_entry->part_offset;
60 p_entry++;
61 }
62 return -1;
63}
64
65/*
66 ******************************************************************************
67 * Function:
68 * Description:
69 * Parameters:
70 * Input:
71 * Output:
72 * Returns:
73 * Others:
74 *******************************************************************************
75 */
76int read_image_part_offset(uint8_t *name, uint32_t *offset)
77{
78 int ret = 0;
79 uint32_t part_size = 0;
80
81 if(flash.flash_type == NOR_BOOT)
82 {
83 part_size = 8*flash.page_size;
84 }
85 else
86 {
87 part_size = flash.page_size;
88 }
89
90 ret = flash.read(0x2000, part_size, CFG_TEMP_ADDR);
91 if(ret != 0)
92 {
93 return -1;
94 }
95
96 partition_table_t *part = (partition_table_t *)CFG_TEMP_ADDR;
97 partition_entry_t *entry = &part->table[0];
98 uint32_t entrys = part->entrys;
99
100 if(part->magic != CFG_PARTITION_MAGIC)
101 {
102 return -1;
103 }
104
105 *offset = find_partition_para(entry, entrys, name);
106 if(*offset == -1 )
107 {
108 return -1;
109 }
110
111 return 0;
112}
113
114#ifdef CONFIG_ZX297520V3E_MDL_AB
115int read_flags_image(uint8_t *name)
116{
117 T_BOOT_FOTA_FLAG *fotaFlag;
118 uint32_t uiPageSize = 0;
119 uint32_t flags_offset = 0;
120 uint32_t off = 0;
121 uint32_t flags_size = 0x4E0000;/*flags·ÖÇø*/
122 uint32_t blockNum = 0;
123 int32_t flag_one = 0;
124 uint32_t work_area_offset = 0;
125 uint32_t backup_area_offset = 0;
126 int32_t ret = 0;
127 int32_t fota_size = sizeof(T_BOOT_FOTA_FLAG);
128 int32_t block_size = flash.block_size;
129
130 fota_size = page_align(fota_size);
131
132 ret = read_image_part_offset(name, &flags_offset);
133 if(ret != 0)
134 {
135 printf("flags partition offset fail.\n");
136 return -1;
137 }
138
139 /*È·¶¨¹¤×÷ÇøºÍ±¸·ÝÇøÆ«ÒÆµØÖ·*/
140 for (off = flags_offset; off < flags_offset+flags_size; off += flash.block_size)
141 {
142 if (!(nand_block_isbad(off)))
143 {
144 blockNum += 1;
145 }
146
147 if((blockNum == 1) && (flag_one == 0))
148 {
149 work_area_offset = off;
150 flag_one = 1;
151 }
152
153 else if(blockNum == 2)
154 {
155 backup_area_offset = off;
156 break;
157 }
158 }
159
160 if(blockNum < 2)
161 {
162 printf("flags partition have not enough space!\n");
163
164 return -1;
165 }
166
167 ret = flash.read(work_area_offset, fota_size, CFG_TEMP_ADDR);
168 if(ret != 0)
169 {
170 printf("read flags work partition err.\n");
171
172 return -1;
173 }
174
175 fotaFlag = (T_BOOT_FOTA_FLAG *)(CFG_TEMP_ADDR);
176
177 if(fotaFlag->magic != FLAGS_MAGIC)
178 {
179 ret = flash.read(backup_area_offset, fota_size, CFG_TEMP_ADDR);
180 if(ret != 0)
181 {
182 printf("read flags backup partition err.\n");
183
184 return -1;
185 }
186 fotaFlag = (T_BOOT_FOTA_FLAG *)(CFG_TEMP_ADDR);
187 if(fotaFlag->magic != FLAGS_MAGIC)
188 {
189 printf("flags magic err.\n");
190 return -1;
191 }
192 }
193
194 return 0;
195
196}
197#endif
198/*
199 ****************************************************************************
200 * Function:
201 * Description:
202 * Parameters:
203 * Input:
204 * Output:
205 * Returns:
206 * Others:
207 *****************************************************************************
208 */
209int read_uboot_image(uint8_t *name, uint32_t *uboot_entry_point)
210{
211 /*
212 * +----------------------------------------------------------------+
213 * | sImageHeader | image_header_t | u-boot.bin |
214 * +----------------------------------------------------------------+
215 * | 384 Bytes | 64 Bytes | xxx Bytes |
216 *
217 */
218
219 image_header_t *psImgHdrOld = NULL;
220
221 uint32_t uiPageSize = 0;
222
223 uint32_t uiImgHdrSizeOld = sizeof(image_header_t);
224 uint32_t uiImgHdrSizeNew = sizeof(sImageHeader);
225
226 uint32_t uiUBootSize = 0;
227 uint32_t uiUBootLoadAddr = 0;
228 uint32_t uiUBootIsReadSize = 0;
229
230 int32_t ret = 0;
231 uint32_t uboot_offset = 0;
232
233
234
235 if(flash.flash_type == NOR_BOOT)
236 {
237 uiPageSize = 8*flash.page_size;
238 }
239 else
240 {
241 uiPageSize = flash.page_size;
242 }
243
244 ret = read_image_part_offset(name, &uboot_offset);
245 if(ret != 0)
246 {
247 printf("offset fail.\n");
248 return -1;
249 }
250
251 ret = flash.read(uboot_offset, uiPageSize, CFG_TEMP_ADDR);
252 if(ret != 0)
253 {
254 printf("image header err.\n");
255 return -1;
256 }
257
258 psImgHdrOld = (image_header_t *)(CFG_TEMP_ADDR + uiImgHdrSizeNew);
259 uiUBootSize = ___htonl(psImgHdrOld->ih_size);
260 uiUBootLoadAddr = ___htonl(psImgHdrOld->ih_load);
261 *uboot_entry_point = ___htonl(psImgHdrOld->ih_ep);
262
263 if(___htonl(psImgHdrOld->ih_magic) != IH_MAGIC)
264 {
265 printf("magic err.\n");
266 return -1;
267 }
268
269 uiUBootIsReadSize = uiPageSize - uiImgHdrSizeOld - uiImgHdrSizeNew;
270 uiUBootSize -= uiUBootIsReadSize;
271 uiUBootSize = page_align(uiUBootSize);
272
273 memcpy(uiUBootLoadAddr - uiImgHdrSizeOld,
274 CFG_TEMP_ADDR + uiImgHdrSizeNew,
275 uiUBootIsReadSize + uiImgHdrSizeOld);
276
277 ret = flash.read(uboot_offset + uiPageSize,
278 uiUBootSize,
279 uiUBootLoadAddr + uiUBootIsReadSize);
280 if(ret != 0)
281 {
282 printf("image err.\n");
283 return -1;
284 }
285
286 ret = SecureVerify(CFG_TEMP_ADDR);
287 if(ret != 0)
288 {
289 printf("Secure verify fail!\n");
290 return -1;
291 }
292
293 return 0;
294}
295
296/*
297 ******************************************************************************
298 * Function:
299 * Description:
300 * Parameters:
301 * Input:
302 * Output:
303 * Returns:
304 * Others:
305 *******************************************************************************
306 */
307 int nand_read_m0(uint32_t *m0_entry_point)
308{
309 int remap = 0;
310 image_header_t *header = NULL;
311 uint32_t image_header_size = sizeof(image_header_t);
312 uint32_t m0_size = 0;
313 uint32_t m0_load_addr = 0;
314 /*
315 * +---------------------------------------------------------+
316 * | image_header_t | m0 |
317 * +---------------------------------------------------------+
318 m0.bin
319 */
320
321 /*1¡¢µÈ´ýBOOT°áÔËM0°æ±¾µ½CONFIG_SYS_SDRAM_TEMP_BASEÖÐ*/
322 writel(0, M0_IMAGE_READY_FLAG_ADDR);
323 while(!readl(M0_IMAGE_READY_FLAG_ADDR));
324
325 /*2¡¢M0µÄ0µØÖ·ÖØÓ³Éä*/
326 remap = readl(0x140000);
327 remap |= 0x800000;
328 writel(remap,0x140000);
329
330 /*3¡¢½âÎöM0µÄ°æ±¾Í·£¬»ñÈ¡ÔËÐеØÖ·ÒÔ¼°´óС*/
331 header = (image_header_t *)CONFIG_SYS_SDRAM_TEMP_BASE;
332 m0_size = ___htonl(header->ih_size); /* m0.bin */
333 m0_load_addr = ___htonl(header->ih_load);
334 *m0_entry_point = ___htonl(header->ih_ep);
335
336 if(___htonl(header->ih_magic) != IH_MAGIC)
337 {
338 return -1;
339 }
340
341 /*4¡¢½«M0µÄ°æ±¾´ÓIRAM0¿½±´µ½load_addr*/
342 memcpy(m0_load_addr, CONFIG_SYS_SDRAM_TEMP_BASE + image_header_size, m0_size);
343
344 /*5¡¢ÐÞ¸ÄIRAM±ê¼Ç£¬Ê¹BOOT¼ÌÐøÍùÏÂÖ´ÐÐ*/
345 writel(0, M0_IMAGE_READY_FLAG_ADDR);
346
347 return 0;
348}
349
350