xref: /rk3399_rockchip-uboot/common/spl/spl_fat.c (revision 8cffe5bd0d601f64eca78d28b8a710ad6ca8edd2)
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