1 /* 2 * (C) Copyright 2010 3 * Texas Instruments, <www.ti.com> 4 * 5 * Aneesh V <aneesh@ti.com> 6 * 7 * SPDX-License-Identifier: GPL-2.0+ 8 */ 9 #include <common.h> 10 #include <spl.h> 11 #include <asm/u-boot.h> 12 #include <mmc.h> 13 #include <version.h> 14 #include <image.h> 15 16 DECLARE_GLOBAL_DATA_PTR; 17 18 static int mmc_load_image_raw(struct mmc *mmc, unsigned long sector) 19 { 20 unsigned long err; 21 u32 image_size_sectors; 22 struct image_header *header; 23 24 header = (struct image_header *)(CONFIG_SYS_TEXT_BASE - 25 sizeof(struct image_header)); 26 27 /* read image header to find the image size & load address */ 28 err = mmc->block_dev.block_read(0, sector, 1, header); 29 if (err == 0) 30 goto end; 31 32 if (image_get_magic(header) != IH_MAGIC) 33 return -1; 34 35 spl_parse_image_header(header); 36 37 /* convert size to sectors - round up */ 38 image_size_sectors = (spl_image.size + mmc->read_bl_len - 1) / 39 mmc->read_bl_len; 40 41 /* Read the header too to avoid extra memcpy */ 42 err = mmc->block_dev.block_read(0, sector, image_size_sectors, 43 (void *)spl_image.load_addr); 44 45 end: 46 #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT 47 if (err == 0) 48 printf("spl: mmc blk read err - %lu\n", err); 49 #endif 50 51 return (err == 0); 52 } 53 54 #ifdef CONFIG_SPL_OS_BOOT 55 static int mmc_load_image_raw_os(struct mmc *mmc) 56 { 57 if (!mmc->block_dev.block_read(0, 58 CONFIG_SYS_MMCSD_RAW_MODE_ARGS_SECTOR, 59 CONFIG_SYS_MMCSD_RAW_MODE_ARGS_SECTORS, 60 (void *)CONFIG_SYS_SPL_ARGS_ADDR)) { 61 #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT 62 printf("mmc args blk read error\n"); 63 #endif 64 return -1; 65 } 66 67 return mmc_load_image_raw(mmc, CONFIG_SYS_MMCSD_RAW_MODE_KERNEL_SECTOR); 68 } 69 #endif 70 71 void spl_mmc_load_image(void) 72 { 73 struct mmc *mmc; 74 int err; 75 u32 boot_mode; 76 77 mmc_initialize(gd->bd); 78 /* We register only one device. So, the dev id is always 0 */ 79 mmc = find_mmc_device(0); 80 if (!mmc) { 81 #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT 82 puts("spl: mmc device not found!!\n"); 83 #endif 84 hang(); 85 } 86 87 err = mmc_init(mmc); 88 if (err) { 89 #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT 90 printf("spl: mmc init failed: err - %d\n", err); 91 #endif 92 hang(); 93 } 94 95 boot_mode = spl_boot_mode(); 96 if (boot_mode == MMCSD_MODE_RAW) { 97 debug("boot mode - RAW\n"); 98 #ifdef CONFIG_SPL_OS_BOOT 99 if (spl_start_uboot() || mmc_load_image_raw_os(mmc)) 100 #endif 101 err = mmc_load_image_raw(mmc, 102 CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR); 103 #ifdef CONFIG_SPL_FAT_SUPPORT 104 } else if (boot_mode == MMCSD_MODE_FAT) { 105 debug("boot mode - FAT\n"); 106 #ifdef CONFIG_SPL_OS_BOOT 107 if (spl_start_uboot() || spl_load_image_fat_os(&mmc->block_dev, 108 CONFIG_SYS_MMC_SD_FAT_BOOT_PARTITION)) 109 #endif 110 err = spl_load_image_fat(&mmc->block_dev, 111 CONFIG_SYS_MMC_SD_FAT_BOOT_PARTITION, 112 CONFIG_SPL_FAT_LOAD_PAYLOAD_NAME); 113 #endif 114 #ifdef CONFIG_SUPPORT_EMMC_BOOT 115 } else if (boot_mode == MMCSD_MODE_EMMCBOOT) { 116 /* 117 * We need to check what the partition is configured to. 118 * 1 and 2 match up to boot0 / boot1 and 7 is user data 119 * which is the first physical partition (0). 120 */ 121 int part = (mmc->part_config >> 3) & PART_ACCESS_MASK; 122 123 if (part == 7) 124 part = 0; 125 126 if (mmc_switch_part(0, part)) { 127 #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT 128 puts("MMC partition switch failed\n"); 129 #endif 130 hang(); 131 } 132 #ifdef CONFIG_SPL_OS_BOOT 133 if (spl_start_uboot() || mmc_load_image_raw_os(mmc)) 134 #endif 135 err = mmc_load_image_raw(mmc, 136 CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR); 137 #endif 138 } else { 139 #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT 140 puts("spl: wrong MMC boot mode\n"); 141 #endif 142 hang(); 143 } 144 145 if (err) 146 hang(); 147 } 148