1 // SPDX-License-Identifier: GPL-2.0+
4 * Texas Instruments, <www.ti.com>
6 * Aneesh V <aneesh@ti.com>
13 #include <linux/compiler.h>
15 #include <asm/u-boot.h>
20 static int mmc_load_legacy(struct spl_image_info *spl_image,
21 struct spl_boot_device *bootdev,
23 ulong sector, struct image_header *header)
25 u32 image_offset_sectors;
26 u32 image_size_sectors;
31 ret = spl_parse_image_header(spl_image, bootdev, header);
35 /* convert offset to sectors - round down */
36 image_offset_sectors = spl_image->offset / mmc->read_bl_len;
37 /* calculate remaining offset */
38 image_offset = spl_image->offset % mmc->read_bl_len;
40 /* convert size to sectors - round up */
41 image_size_sectors = (spl_image->size + mmc->read_bl_len - 1) /
44 /* Read the header too to avoid extra memcpy */
45 count = blk_dread(mmc_get_blk_desc(mmc),
46 sector + image_offset_sectors,
48 (void *)(ulong)spl_image->load_addr);
49 debug("read %x sectors to %lx\n", image_size_sectors,
50 spl_image->load_addr);
51 if (count != image_size_sectors)
55 memmove((void *)(ulong)spl_image->load_addr,
56 (void *)(ulong)spl_image->load_addr + image_offset,
62 static ulong h_spl_load_read(struct spl_load_info *load, ulong sector,
63 ulong count, void *buf)
65 struct mmc *mmc = load->dev;
67 return blk_dread(mmc_get_blk_desc(mmc), sector, count, buf);
70 static __maybe_unused unsigned long spl_mmc_raw_uboot_offset(int part)
72 #if IS_ENABLED(CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR)
74 return CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_DATA_PART_OFFSET;
81 int mmc_load_image_raw_sector(struct spl_image_info *spl_image,
82 struct spl_boot_device *bootdev,
83 struct mmc *mmc, unsigned long sector)
86 struct image_header *header;
87 struct blk_desc *bd = mmc_get_blk_desc(mmc);
90 header = spl_get_load_buffer(-sizeof(*header), bd->blksz);
92 /* read image header to find the image size & load address */
93 count = blk_dread(bd, sector, 1, header);
94 debug("hdr read sector %lx, count=%lu\n", sector, count);
100 if (IS_ENABLED(CONFIG_SPL_LOAD_FIT) &&
101 image_get_magic(header) == FDT_MAGIC) {
102 struct spl_load_info load;
104 debug("Found FIT\n");
107 load.filename = NULL;
108 load.bl_len = mmc->read_bl_len;
109 load.read = h_spl_load_read;
110 ret = spl_load_simple_fit(spl_image, &load, sector, header);
111 } else if (IS_ENABLED(CONFIG_SPL_LOAD_IMX_CONTAINER)) {
112 struct spl_load_info load;
116 load.filename = NULL;
117 load.bl_len = mmc->read_bl_len;
118 load.read = h_spl_load_read;
120 ret = spl_load_imx_container(spl_image, &load, sector);
122 ret = mmc_load_legacy(spl_image, bootdev, mmc, sector, header);
127 #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
128 puts("mmc_load_image_raw_sector: mmc block read error\n");
136 static int spl_mmc_get_device_index(u32 boot_device)
138 switch (boot_device) {
139 case BOOT_DEVICE_MMC1:
141 case BOOT_DEVICE_MMC2:
142 case BOOT_DEVICE_MMC2_2:
146 #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
147 printf("spl: unsupported mmc boot device.\n");
153 static int spl_mmc_find_device(struct mmc **mmcp, u32 boot_device)
157 mmc_dev = spl_mmc_get_device_index(boot_device);
161 #if CONFIG_IS_ENABLED(DM_MMC)
162 err = mmc_init_device(mmc_dev);
164 err = mmc_initialize(NULL);
167 #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
168 printf("spl: could not initialize mmc. error: %d\n", err);
172 *mmcp = find_mmc_device(mmc_dev);
173 err = *mmcp ? 0 : -ENODEV;
175 #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
176 printf("spl: could not find mmc device %d. error: %d\n",
185 #ifdef CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION
186 static int mmc_load_image_raw_partition(struct spl_image_info *spl_image,
187 struct spl_boot_device *bootdev,
188 struct mmc *mmc, int partition,
189 unsigned long sector)
191 struct disk_partition info;
194 #ifdef CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION_TYPE
196 /* Only support MBR so DOS_ENTRY_NUMBERS */
197 for (type_part = 1; type_part <= DOS_ENTRY_NUMBERS; type_part++) {
198 err = part_get_info(mmc_get_blk_desc(mmc), type_part, &info);
202 CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_PARTITION_TYPE) {
203 partition = type_part;
209 err = part_get_info(mmc_get_blk_desc(mmc), partition, &info);
211 #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
212 puts("spl: partition error\n");
217 #ifdef CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR
218 return mmc_load_image_raw_sector(spl_image, bootdev, mmc, info.start + sector);
220 return mmc_load_image_raw_sector(spl_image, bootdev, mmc, info.start);
225 #if CONFIG_IS_ENABLED(FALCON_BOOT_MMCSD)
226 static int mmc_load_image_raw_os(struct spl_image_info *spl_image,
227 struct spl_boot_device *bootdev,
232 #if defined(CONFIG_SYS_MMCSD_RAW_MODE_ARGS_SECTOR)
235 count = blk_dread(mmc_get_blk_desc(mmc),
236 CONFIG_SYS_MMCSD_RAW_MODE_ARGS_SECTOR,
237 CONFIG_SYS_MMCSD_RAW_MODE_ARGS_SECTORS,
238 (void *) CONFIG_SYS_SPL_ARGS_ADDR);
239 if (count != CONFIG_SYS_MMCSD_RAW_MODE_ARGS_SECTORS) {
240 #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
241 puts("mmc_load_image_raw_os: mmc block read error\n");
245 #endif /* CONFIG_SYS_MMCSD_RAW_MODE_ARGS_SECTOR */
247 ret = mmc_load_image_raw_sector(spl_image, bootdev, mmc,
248 CONFIG_SYS_MMCSD_RAW_MODE_KERNEL_SECTOR);
252 if (spl_image->os != IH_OS_LINUX && spl_image->os != IH_OS_TEE) {
253 puts("Expected image is not found. Trying to start U-boot\n");
260 static int mmc_load_image_raw_os(struct spl_image_info *spl_image,
261 struct spl_boot_device *bootdev,
268 #ifndef CONFIG_SPL_OS_BOOT
269 int spl_start_uboot(void)
275 #ifdef CONFIG_SYS_MMCSD_FS_BOOT_PARTITION
276 static int spl_mmc_do_fs_boot(struct spl_image_info *spl_image,
277 struct spl_boot_device *bootdev,
279 const char *filename)
283 #ifdef CONFIG_SPL_FS_FAT
284 if (!spl_start_uboot()) {
285 err = spl_load_image_fat_os(spl_image, bootdev, mmc_get_blk_desc(mmc),
286 CONFIG_SYS_MMCSD_FS_BOOT_PARTITION);
290 #ifdef CONFIG_SPL_FS_LOAD_PAYLOAD_NAME
291 err = spl_load_image_fat(spl_image, bootdev, mmc_get_blk_desc(mmc),
292 CONFIG_SYS_MMCSD_FS_BOOT_PARTITION,
298 #ifdef CONFIG_SPL_FS_EXT4
299 if (!spl_start_uboot()) {
300 err = spl_load_image_ext_os(spl_image, bootdev, mmc_get_blk_desc(mmc),
301 CONFIG_SYS_MMCSD_FS_BOOT_PARTITION);
305 #ifdef CONFIG_SPL_FS_LOAD_PAYLOAD_NAME
306 err = spl_load_image_ext(spl_image, bootdev, mmc_get_blk_desc(mmc),
307 CONFIG_SYS_MMCSD_FS_BOOT_PARTITION,
314 #if defined(CONFIG_SPL_FS_FAT) || defined(CONFIG_SPL_FS_EXT4)
321 static int spl_mmc_do_fs_boot(struct spl_image_info *spl_image,
322 struct spl_boot_device *bootdev,
324 const char *filename)
330 u32 __weak spl_mmc_boot_mode(struct mmc *mmc, const u32 boot_device)
332 #if defined(CONFIG_SPL_FS_FAT) || defined(CONFIG_SPL_FS_EXT4)
333 return MMCSD_MODE_FS;
334 #elif defined(CONFIG_SUPPORT_EMMC_BOOT)
335 return MMCSD_MODE_EMMCBOOT;
337 return MMCSD_MODE_RAW;
341 #ifdef CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION
342 int __weak spl_mmc_boot_partition(const u32 boot_device)
344 return CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_PARTITION;
348 unsigned long __weak spl_mmc_get_uboot_raw_sector(struct mmc *mmc,
349 unsigned long raw_sect)
354 int default_spl_mmc_emmc_boot_partition(struct mmc *mmc)
357 #ifdef CONFIG_SYS_MMCSD_RAW_MODE_EMMC_BOOT_PARTITION
358 part = CONFIG_SYS_MMCSD_RAW_MODE_EMMC_BOOT_PARTITION;
361 * We need to check what the partition is configured to.
362 * 1 and 2 match up to boot0 / boot1 and 7 is user data
363 * which is the first physical partition (0).
365 part = (mmc->part_config >> 3) & PART_ACCESS_MASK;
372 int __weak spl_mmc_emmc_boot_partition(struct mmc *mmc)
374 return default_spl_mmc_emmc_boot_partition(mmc);
377 int spl_mmc_load(struct spl_image_info *spl_image,
378 struct spl_boot_device *bootdev,
379 const char *filename,
381 unsigned long raw_sect)
383 static struct mmc *mmc;
386 __maybe_unused int part = 0;
388 /* Perform peripheral init only once */
390 err = spl_mmc_find_device(&mmc, bootdev->boot_device);
397 #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
398 printf("spl: mmc init failed with error: %d\n", err);
404 boot_mode = spl_mmc_boot_mode(mmc, bootdev->boot_device);
407 case MMCSD_MODE_EMMCBOOT:
408 part = spl_mmc_emmc_boot_partition(mmc);
410 if (CONFIG_IS_ENABLED(MMC_TINY))
411 err = mmc_switch_part(mmc, part);
413 err = blk_dselect_hwpart(mmc_get_blk_desc(mmc), part);
416 #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
417 puts("spl: mmc partition switch failed\n");
423 debug("spl: mmc boot mode: raw\n");
425 if (!spl_start_uboot()) {
426 err = mmc_load_image_raw_os(spl_image, bootdev, mmc);
431 raw_sect = spl_mmc_get_uboot_raw_sector(mmc, raw_sect);
433 #ifdef CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION
434 err = mmc_load_image_raw_partition(spl_image, bootdev,
440 #ifdef CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR
441 err = mmc_load_image_raw_sector(spl_image, bootdev, mmc,
442 raw_sect + spl_mmc_raw_uboot_offset(part));
446 /* If RAW mode fails, try FS mode. */
448 debug("spl: mmc boot mode: fs\n");
450 err = spl_mmc_do_fs_boot(spl_image, bootdev, mmc, filename);
455 #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
457 puts("spl: mmc: wrong boot mode\n");
464 int spl_mmc_load_image(struct spl_image_info *spl_image,
465 struct spl_boot_device *bootdev)
467 return spl_mmc_load(spl_image, bootdev,
468 #ifdef CONFIG_SPL_FS_LOAD_PAYLOAD_NAME
469 CONFIG_SPL_FS_LOAD_PAYLOAD_NAME,
473 #ifdef CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_PARTITION
474 spl_mmc_boot_partition(bootdev->boot_device),
478 #ifdef CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR
479 CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR);
485 SPL_LOAD_IMAGE_METHOD("MMC1", 0, BOOT_DEVICE_MMC1, spl_mmc_load_image);
486 SPL_LOAD_IMAGE_METHOD("MMC2", 0, BOOT_DEVICE_MMC2, spl_mmc_load_image);
487 SPL_LOAD_IMAGE_METHOD("MMC2_2", 0, BOOT_DEVICE_MMC2_2, spl_mmc_load_image);