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 <linux/compiler.h> 12 #include <asm/u-boot.h> 13 #include <mmc.h> 14 #include <image.h> 15 16 DECLARE_GLOBAL_DATA_PTR; 17 18 static int mmc_load_image_raw_sector(struct mmc *mmc, unsigned long sector) 19 { 20 unsigned long count; 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 count = mmc->block_dev.block_read(0, sector, 1, header); 29 if (count == 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 count = mmc->block_dev.block_read(0, sector, image_size_sectors, 43 (void *) spl_image.load_addr); 44 45 end: 46 if (count == 0) { 47 #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT 48 puts("spl: mmc block read error\n"); 49 #endif 50 return -1; 51 } 52 53 return 0; 54 } 55 56 #ifdef CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_PARTITION 57 static int mmc_load_image_raw_partition(struct mmc *mmc, int partition) 58 { 59 disk_partition_t info; 60 int err; 61 62 err = get_partition_info(&mmc->block_dev, partition, &info); 63 if (err) { 64 #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT 65 puts("spl: partition error\n"); 66 #endif 67 return -1; 68 } 69 70 return mmc_load_image_raw_sector(mmc, info.start); 71 } 72 #endif 73 74 #ifdef CONFIG_SPL_OS_BOOT 75 static int mmc_load_image_raw_os(struct mmc *mmc) 76 { 77 unsigned long count; 78 79 count = mmc->block_dev.block_read(0, 80 CONFIG_SYS_MMCSD_RAW_MODE_ARGS_SECTOR, 81 CONFIG_SYS_MMCSD_RAW_MODE_ARGS_SECTORS, 82 (void *) CONFIG_SYS_SPL_ARGS_ADDR); 83 if (count == 0) { 84 #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT 85 puts("spl: mmc block read error\n"); 86 #endif 87 return -1; 88 } 89 90 return mmc_load_image_raw_sector(mmc, 91 CONFIG_SYS_MMCSD_RAW_MODE_KERNEL_SECTOR); 92 } 93 #endif 94 95 void spl_mmc_load_image(void) 96 { 97 struct mmc *mmc; 98 u32 boot_mode; 99 int err; 100 __maybe_unused int part; 101 102 mmc_initialize(gd->bd); 103 104 /* We register only one device. So, the dev id is always 0 */ 105 mmc = find_mmc_device(0); 106 if (!mmc) { 107 #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT 108 puts("spl: mmc device not found\n"); 109 #endif 110 hang(); 111 } 112 113 err = mmc_init(mmc); 114 if (err) { 115 #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT 116 printf("spl: mmc init failed with error: %d\n", err); 117 #endif 118 hang(); 119 } 120 121 boot_mode = spl_boot_mode(); 122 switch (boot_mode) { 123 case MMCSD_MODE_RAW: 124 debug("spl: mmc boot mode: raw\n"); 125 126 #ifdef CONFIG_SPL_OS_BOOT 127 if (!spl_start_uboot()) { 128 err = mmc_load_image_raw_os(mmc); 129 if (!err) 130 return; 131 } 132 #endif 133 #if defined(CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_PARTITION) 134 err = mmc_load_image_raw_partition(mmc, 135 CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_PARTITION); 136 if (!err) 137 return; 138 #elif defined(CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR) 139 err = mmc_load_image_raw_sector(mmc, 140 CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR); 141 if (!err) 142 return; 143 #endif 144 case MMCSD_MODE_FS: 145 debug("spl: mmc boot mode: fs\n"); 146 147 #ifdef CONFIG_SYS_MMCSD_FS_BOOT_PARTITION 148 #ifdef CONFIG_SPL_FAT_SUPPORT 149 #ifdef CONFIG_SPL_OS_BOOT 150 if (!spl_start_uboot()) { 151 err = spl_load_image_fat_os(&mmc->block_dev, 152 CONFIG_SYS_MMCSD_FS_BOOT_PARTITION); 153 if (!err) 154 return; 155 } 156 #endif 157 #ifdef CONFIG_SPL_FS_LOAD_PAYLOAD_NAME 158 err = spl_load_image_fat(&mmc->block_dev, 159 CONFIG_SYS_MMCSD_FS_BOOT_PARTITION, 160 CONFIG_SPL_FS_LOAD_PAYLOAD_NAME); 161 if (!err) 162 return; 163 #endif 164 #endif 165 #ifdef CONFIG_SPL_EXT_SUPPORT 166 #ifdef CONFIG_SPL_OS_BOOT 167 if (!spl_start_uboot()) { 168 err = spl_load_image_ext_os(&mmc->block_dev, 169 CONFIG_SYS_MMCSD_FS_BOOT_PARTITION); 170 if (!err) 171 return; 172 } 173 #endif 174 #ifdef CONFIG_SPL_FS_LOAD_PAYLOAD_NAME 175 err = spl_load_image_ext(&mmc->block_dev, 176 CONFIG_SYS_MMCSD_FS_BOOT_PARTITION, 177 CONFIG_SPL_FS_LOAD_PAYLOAD_NAME); 178 if (!err) 179 return; 180 #endif 181 #endif 182 #endif 183 #ifdef CONFIG_SUPPORT_EMMC_BOOT 184 case MMCSD_MODE_EMMCBOOT: 185 /* 186 * We need to check what the partition is configured to. 187 * 1 and 2 match up to boot0 / boot1 and 7 is user data 188 * which is the first physical partition (0). 189 */ 190 part = (mmc->part_config >> 3) & PART_ACCESS_MASK; 191 192 if (part == 7) 193 part = 0; 194 195 if (mmc_switch_part(0, part)) { 196 #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT 197 puts("spl: mmc partition switch failed\n"); 198 #endif 199 hang(); 200 } 201 202 #ifdef CONFIG_SPL_OS_BOOT 203 if (!spl_start_uboot()) { 204 err = mmc_load_image_raw_os(mmc); 205 if (!err) 206 return; 207 } 208 #endif 209 #if defined(CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_PARTITION) 210 err = mmc_load_image_raw_partition(mmc, 211 CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_PARTITION); 212 if (!err) 213 return; 214 #elif defined(CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR) 215 err = mmc_load_image_raw_sector(mmc, 216 CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR); 217 if (!err) 218 return; 219 #endif 220 #endif 221 case MMCSD_MODE_UNDEFINED: 222 default: 223 #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT 224 if (err) 225 puts("spl: mmc: no boot mode left to try\n"); 226 else 227 puts("spl: mmc: wrong boot mode\n"); 228 #endif 229 hang(); 230 } 231 } 232