]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - common/spl/spl_ext.c
Merge branch 'master' of git://git.denx.de/u-boot-arm
[karo-tx-uboot.git] / common / spl / spl_ext.c
1 /*
2  * SPDX-License-Identifier:     GPL-2.0+
3  */
4
5 #include <common.h>
6 #include <spl.h>
7 #include <asm/u-boot.h>
8 #include <ext4fs.h>
9 #include <image.h>
10
11 #ifdef CONFIG_SPL_EXT_SUPPORT
12 int spl_load_image_ext(block_dev_desc_t *block_dev,
13                                                 int partition,
14                                                 const char *filename)
15 {
16         s32 err;
17         struct image_header *header;
18         int filelen;
19         disk_partition_t part_info = {};
20
21         header = (struct image_header *)(CONFIG_SYS_TEXT_BASE -
22                                                 sizeof(struct image_header));
23
24         if (get_partition_info(block_dev,
25                                partition, &part_info)) {
26                 printf("spl: no partition table found\n");
27                 return -1;
28         }
29
30         ext4fs_set_blk_dev(block_dev, &part_info);
31
32         err = ext4fs_mount(0);
33         if (!err) {
34 #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
35                 printf("%s: ext4fs mount err - %d\n", __func__, err);
36 #endif
37                 goto end;
38         }
39
40         filelen = err = ext4fs_open(filename);
41         if (err < 0) {
42                 puts("spl: ext4fs_open failed\n");
43                 goto end;
44         }
45         err = ext4fs_read((char *)header, sizeof(struct image_header));
46         if (err <= 0) {
47                 puts("spl: ext4fs_read failed\n");
48                 goto end;
49         }
50
51         spl_parse_image_header(header);
52
53         err = ext4fs_read((char *)spl_image.load_addr, filelen);
54
55 end:
56 #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
57         if (err <= 0)
58                 printf("%s: error reading image %s, err - %d\n",
59                        __func__, filename, err);
60 #endif
61
62         return err <= 0;
63 }
64
65 #ifdef CONFIG_SPL_OS_BOOT
66 int spl_load_image_ext_os(block_dev_desc_t *block_dev, int partition)
67 {
68         int err;
69         int filelen;
70         disk_partition_t part_info = {};
71         __maybe_unused char *file;
72
73         if (get_partition_info(block_dev,
74                                partition, &part_info)) {
75                 printf("spl: no partition table found\n");
76                 return -1;
77         }
78
79         ext4fs_set_blk_dev(block_dev, &part_info);
80
81         err = ext4fs_mount(0);
82         if (!err) {
83 #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
84                 printf("%s: ext4fs mount err - %d\n", __func__, err);
85 #endif
86                 return -1;
87         }
88
89 #if defined(CONFIG_SPL_ENV_SUPPORT) && defined(CONFIG_SPL_OS_BOOT)
90         file = getenv("falcon_args_file");
91         if (file) {
92                 filelen = err = ext4fs_open(file);
93                 if (err < 0) {
94                         puts("spl: ext4fs_open failed\n");
95                         goto defaults;
96                 }
97                 err = ext4fs_read((void *)CONFIG_SYS_SPL_ARGS_ADDR, filelen);
98                 if (err <= 0) {
99                         printf("spl: error reading image %s, err - %d, falling back to default\n",
100                                file, err);
101                         goto defaults;
102                 }
103                 file = getenv("falcon_image_file");
104                 if (file) {
105                         err = spl_load_image_ext(block_dev, partition, file);
106                         if (err != 0) {
107                                 puts("spl: falling back to default\n");
108                                 goto defaults;
109                         }
110
111                         return 0;
112                 } else {
113                         puts("spl: falcon_image_file not set in environment, falling back to default\n");
114                 }
115         } else {
116                 puts("spl: falcon_args_file not set in environment, falling back to default\n");
117         }
118
119 defaults:
120 #endif
121
122         filelen = err = ext4fs_open(CONFIG_SPL_FS_LOAD_ARGS_NAME);
123         if (err < 0)
124                 puts("spl: ext4fs_open failed\n");
125
126         err = ext4fs_read((void *)CONFIG_SYS_SPL_ARGS_ADDR, filelen);
127         if (err <= 0) {
128 #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
129                 printf("%s: error reading image %s, err - %d\n",
130                        __func__, CONFIG_SPL_FS_LOAD_ARGS_NAME, err);
131 #endif
132                 return -1;
133         }
134
135         return spl_load_image_ext(block_dev, partition,
136                         CONFIG_SPL_FS_LOAD_KERNEL_NAME);
137 }
138 #endif
139 #endif