uboot/common/spl/spl_fat.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2/*
   3 * (C) Copyright 2014
   4 * Texas Instruments, <www.ti.com>
   5 *
   6 * Dan Murphy <dmurphy@ti.com>
   7 *
   8 * FAT Image Functions copied from spl_mmc.c
   9 */
  10
  11#include <common.h>
  12#include <env.h>
  13#include <log.h>
  14#include <spl.h>
  15#include <asm/u-boot.h>
  16#include <fat.h>
  17#include <errno.h>
  18#include <image.h>
  19#include <linux/libfdt.h>
  20
  21static int fat_registered;
  22
  23static int spl_register_fat_device(struct blk_desc *block_dev, int partition)
  24{
  25        int err = 0;
  26
  27        if (fat_registered)
  28                return err;
  29
  30        err = fat_register_device(block_dev, partition);
  31        if (err) {
  32#ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
  33                printf("%s: fat register err - %d\n", __func__, err);
  34#endif
  35                return err;
  36        }
  37
  38        fat_registered = 1;
  39
  40        return err;
  41}
  42
  43static ulong spl_fit_read(struct spl_load_info *load, ulong file_offset,
  44                          ulong size, void *buf)
  45{
  46        loff_t actread;
  47        int ret;
  48        char *filename = (char *)load->filename;
  49
  50        ret = fat_read_file(filename, buf, file_offset, size, &actread);
  51        if (ret)
  52                return ret;
  53
  54        return actread;
  55}
  56
  57int spl_load_image_fat(struct spl_image_info *spl_image,
  58                       struct blk_desc *block_dev, int partition,
  59                       const char *filename)
  60{
  61        int err;
  62        struct image_header *header;
  63
  64        err = spl_register_fat_device(block_dev, partition);
  65        if (err)
  66                goto end;
  67
  68        header = spl_get_load_buffer(-sizeof(*header), sizeof(*header));
  69
  70        err = file_fat_read(filename, header, sizeof(struct image_header));
  71        if (err <= 0)
  72                goto end;
  73
  74        if (IS_ENABLED(CONFIG_SPL_LOAD_FIT_FULL) &&
  75            image_get_magic(header) == FDT_MAGIC) {
  76                err = file_fat_read(filename, (void *)CONFIG_SYS_LOAD_ADDR, 0);
  77                if (err <= 0)
  78                        goto end;
  79                err = spl_parse_image_header(spl_image,
  80                                (struct image_header *)CONFIG_SYS_LOAD_ADDR);
  81                if (err == -EAGAIN)
  82                        return err;
  83                if (err == 0)
  84                        err = 1;
  85        } else if (IS_ENABLED(CONFIG_SPL_LOAD_FIT) &&
  86            image_get_magic(header) == FDT_MAGIC) {
  87                struct spl_load_info load;
  88
  89                debug("Found FIT\n");
  90                load.read = spl_fit_read;
  91                load.bl_len = 1;
  92                load.filename = (void *)filename;
  93                load.priv = NULL;
  94
  95                return spl_load_simple_fit(spl_image, &load, 0, header);
  96        } else {
  97                err = spl_parse_image_header(spl_image, header);
  98                if (err)
  99                        goto end;
 100
 101                err = file_fat_read(filename,
 102                                    (u8 *)(uintptr_t)spl_image->load_addr, 0);
 103        }
 104
 105end:
 106#ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
 107        if (err <= 0)
 108                printf("%s: error reading image %s, err - %d\n",
 109                       __func__, filename, err);
 110#endif
 111
 112        return (err <= 0);
 113}
 114
 115#ifdef CONFIG_SPL_OS_BOOT
 116int spl_load_image_fat_os(struct spl_image_info *spl_image,
 117                          struct blk_desc *block_dev, int partition)
 118{
 119        int err;
 120        __maybe_unused char *file;
 121
 122        err = spl_register_fat_device(block_dev, partition);
 123        if (err)
 124                return err;
 125
 126#if defined(CONFIG_SPL_ENV_SUPPORT) && defined(CONFIG_SPL_OS_BOOT)
 127        file = env_get("falcon_args_file");
 128        if (file) {
 129                err = file_fat_read(file, (void *)CONFIG_SYS_SPL_ARGS_ADDR, 0);
 130                if (err <= 0) {
 131                        printf("spl: error reading image %s, err - %d, falling back to default\n",
 132                               file, err);
 133                        goto defaults;
 134                }
 135                file = env_get("falcon_image_file");
 136                if (file) {
 137                        err = spl_load_image_fat(spl_image, block_dev,
 138                                                 partition, file);
 139                        if (err != 0) {
 140                                puts("spl: falling back to default\n");
 141                                goto defaults;
 142                        }
 143
 144                        return 0;
 145                } else
 146                        puts("spl: falcon_image_file not set in environment, falling back to default\n");
 147        } else
 148                puts("spl: falcon_args_file not set in environment, falling back to default\n");
 149
 150defaults:
 151#endif
 152
 153        err = file_fat_read(CONFIG_SPL_FS_LOAD_ARGS_NAME,
 154                            (void *)CONFIG_SYS_SPL_ARGS_ADDR, 0);
 155        if (err <= 0) {
 156#ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
 157                printf("%s: error reading image %s, err - %d\n",
 158                       __func__, CONFIG_SPL_FS_LOAD_ARGS_NAME, err);
 159#endif
 160                return -1;
 161        }
 162
 163        return spl_load_image_fat(spl_image, block_dev, partition,
 164                        CONFIG_SPL_FS_LOAD_KERNEL_NAME);
 165}
 166#else
 167int spl_load_image_fat_os(struct spl_image_info *spl_image,
 168                          struct blk_desc *block_dev, int partition)
 169{
 170        return -ENOSYS;
 171}
 172#endif
 173