3 * Ladislav Michl <ladis@linux-mips.org>
5 * SPDX-License-Identifier: GPL 2.0+ BSD-3-Clause
11 #include <onenand_uboot.h>
15 int spl_ubi_load_image(struct spl_boot_device
*bootdev
)
17 struct image_header
*header
;
18 struct ubispl_info info
;
19 struct ubispl_load volumes
[2];
22 switch (bootdev
->boot_device
) {
23 #ifdef CONFIG_SPL_NAND_SUPPORT
24 case BOOT_DEVICE_NAND
:
26 info
.read
= nand_spl_read_block
;
27 info
.peb_size
= CONFIG_SYS_NAND_BLOCK_SIZE
;
30 #ifdef CONFIG_SPL_ONENAND_SUPPORT
31 case BOOT_DEVICE_ONENAND
:
32 info
.read
= onenand_spl_read_block
;
33 info
.peb_size
= CONFIG_SYS_ONENAND_BLOCK_SIZE
;
39 info
.ubi
= (struct ubi_scan_info
*)CONFIG_SPL_UBI_INFO_ADDR
;
42 info
.peb_offset
= CONFIG_SPL_UBI_PEB_OFFSET
;
43 info
.vid_offset
= CONFIG_SPL_UBI_VID_OFFSET
;
44 info
.leb_start
= CONFIG_SPL_UBI_LEB_START
;
45 info
.peb_count
= CONFIG_SPL_UBI_MAX_PEBS
- info
.peb_offset
;
47 #ifdef CONFIG_SPL_OS_BOOT
48 if (!spl_start_uboot()) {
49 volumes
[0].vol_id
= CONFIG_SPL_UBI_LOAD_KERNEL_ID
;
50 volumes
[0].load_addr
= (void *)CONFIG_SYS_LOAD_ADDR
;
51 volumes
[1].vol_id
= CONFIG_SPL_UBI_LOAD_ARGS_ID
;
52 volumes
[1].load_addr
= (void *)CONFIG_SYS_SPL_ARGS_ADDR
;
54 ret
= ubispl_load_volumes(&info
, volumes
, 2);
56 header
= (struct image_header
*)volumes
[0].load_addr
;
57 spl_parse_image_header(&spl_image
, header
);
58 puts("Linux loaded.\n");
61 puts("Loading Linux failed, falling back to U-Boot.\n");
64 header
= (struct image_header
*)
65 (CONFIG_SYS_TEXT_BASE
- sizeof(struct image_header
));
66 volumes
[0].vol_id
= CONFIG_SPL_UBI_LOAD_MONITOR_ID
;
67 volumes
[0].load_addr
= (void *)header
;
69 ret
= ubispl_load_volumes(&info
, volumes
, 1);
71 spl_parse_image_header(&spl_image
, header
);
73 #ifdef CONFIG_SPL_NAND_SUPPORT
74 if (bootdev
->boot_device
== BOOT_DEVICE_NAND
)
79 /* Use priorty 0 so that Ubi will override NAND and ONENAND methods */
80 SPL_LOAD_IMAGE_METHOD(0, BOOT_DEVICE_NAND
, spl_ubi_load_image
);
81 SPL_LOAD_IMAGE_METHOD(0, BOOT_DEVICE_ONENAND
, spl_ubi_load_image
);