1773b5940SDan Murphy /* 2773b5940SDan Murphy * (C) Copyright 2014 3773b5940SDan Murphy * Texas Instruments, <www.ti.com> 4773b5940SDan Murphy * 5773b5940SDan Murphy * Dan Murphy <dmurphy@ti.com> 6773b5940SDan Murphy * 7773b5940SDan Murphy * SPDX-License-Identifier: GPL-2.0+ 8773b5940SDan Murphy * 9773b5940SDan Murphy * FAT Image Functions copied from spl_mmc.c 10773b5940SDan Murphy */ 11773b5940SDan Murphy 12773b5940SDan Murphy #include <common.h> 13773b5940SDan Murphy #include <spl.h> 14773b5940SDan Murphy #include <asm/u-boot.h> 15773b5940SDan Murphy #include <fat.h> 16773b5940SDan Murphy #include <image.h> 17773b5940SDan Murphy 18773b5940SDan Murphy static int fat_registered; 19773b5940SDan Murphy 20773b5940SDan Murphy #ifdef CONFIG_SPL_FAT_SUPPORT 21773b5940SDan Murphy static int spl_register_fat_device(block_dev_desc_t *block_dev, int partition) 22773b5940SDan Murphy { 23773b5940SDan Murphy int err = 0; 24773b5940SDan Murphy 25773b5940SDan Murphy if (fat_registered) 26773b5940SDan Murphy return err; 27773b5940SDan Murphy 28773b5940SDan Murphy err = fat_register_device(block_dev, partition); 29773b5940SDan Murphy if (err) { 30773b5940SDan Murphy #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT 31*8cffe5bdSDan Murphy printf("%s: fat register err - %d\n", __func__, err); 32773b5940SDan Murphy #endif 33773b5940SDan Murphy hang(); 34773b5940SDan Murphy } 35773b5940SDan Murphy 36773b5940SDan Murphy fat_registered = 1; 37773b5940SDan Murphy 38773b5940SDan Murphy return err; 39773b5940SDan Murphy } 40773b5940SDan Murphy 41773b5940SDan Murphy int spl_load_image_fat(block_dev_desc_t *block_dev, 42773b5940SDan Murphy int partition, 43773b5940SDan Murphy const char *filename) 44773b5940SDan Murphy { 45773b5940SDan Murphy int err; 46773b5940SDan Murphy struct image_header *header; 47773b5940SDan Murphy 48773b5940SDan Murphy err = spl_register_fat_device(block_dev, partition); 49*8cffe5bdSDan Murphy if (err) 50773b5940SDan Murphy goto end; 51773b5940SDan Murphy 52773b5940SDan Murphy header = (struct image_header *)(CONFIG_SYS_TEXT_BASE - 53773b5940SDan Murphy sizeof(struct image_header)); 54773b5940SDan Murphy 55773b5940SDan Murphy err = file_fat_read(filename, header, sizeof(struct image_header)); 56773b5940SDan Murphy if (err <= 0) 57773b5940SDan Murphy goto end; 58773b5940SDan Murphy 59773b5940SDan Murphy spl_parse_image_header(header); 60773b5940SDan Murphy 61773b5940SDan Murphy err = file_fat_read(filename, (u8 *)spl_image.load_addr, 0); 62773b5940SDan Murphy 63773b5940SDan Murphy end: 64773b5940SDan Murphy #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT 65773b5940SDan Murphy if (err <= 0) 66*8cffe5bdSDan Murphy printf("%s: error reading image %s, err - %d\n", 67*8cffe5bdSDan Murphy __func__, filename, err); 68773b5940SDan Murphy #endif 69773b5940SDan Murphy 70773b5940SDan Murphy return (err <= 0); 71773b5940SDan Murphy } 72773b5940SDan Murphy 73773b5940SDan Murphy #ifdef CONFIG_SPL_OS_BOOT 74773b5940SDan Murphy int spl_load_image_fat_os(block_dev_desc_t *block_dev, int partition) 75773b5940SDan Murphy { 76773b5940SDan Murphy int err; 77773b5940SDan Murphy 78773b5940SDan Murphy err = spl_register_fat_device(block_dev, partition); 79*8cffe5bdSDan Murphy if (err) 80*8cffe5bdSDan Murphy return err; 81773b5940SDan Murphy 82773b5940SDan Murphy err = file_fat_read(CONFIG_SPL_FAT_LOAD_ARGS_NAME, 83773b5940SDan Murphy (void *)CONFIG_SYS_SPL_ARGS_ADDR, 0); 84773b5940SDan Murphy if (err <= 0) { 85773b5940SDan Murphy #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT 86*8cffe5bdSDan Murphy printf("%s: error reading image %s, err - %d\n", 87*8cffe5bdSDan Murphy __func__, CONFIG_SPL_FAT_LOAD_ARGS_NAME, err); 88773b5940SDan Murphy #endif 89773b5940SDan Murphy return -1; 90773b5940SDan Murphy } 91773b5940SDan Murphy 92773b5940SDan Murphy return spl_load_image_fat(block_dev, partition, 93773b5940SDan Murphy CONFIG_SPL_FAT_LOAD_KERNEL_NAME); 94773b5940SDan Murphy } 95773b5940SDan Murphy #endif 96773b5940SDan Murphy #endif 97