xref: /openbmc/u-boot/env/fat.c (revision 0649cd0d4908d9b983a0361b8665938ef25701be)
1*0649cd0dSSimon Glass /*
2*0649cd0dSSimon Glass  * (c) Copyright 2011 by Tigris Elektronik GmbH
3*0649cd0dSSimon Glass  *
4*0649cd0dSSimon Glass  * Author:
5*0649cd0dSSimon Glass  *  Maximilian Schwerin <mvs@tigris.de>
6*0649cd0dSSimon Glass  *
7*0649cd0dSSimon Glass  * SPDX-License-Identifier:	GPL-2.0+
8*0649cd0dSSimon Glass  */
9*0649cd0dSSimon Glass 
10*0649cd0dSSimon Glass #include <common.h>
11*0649cd0dSSimon Glass 
12*0649cd0dSSimon Glass #include <command.h>
13*0649cd0dSSimon Glass #include <environment.h>
14*0649cd0dSSimon Glass #include <linux/stddef.h>
15*0649cd0dSSimon Glass #include <malloc.h>
16*0649cd0dSSimon Glass #include <memalign.h>
17*0649cd0dSSimon Glass #include <search.h>
18*0649cd0dSSimon Glass #include <errno.h>
19*0649cd0dSSimon Glass #include <fat.h>
20*0649cd0dSSimon Glass #include <mmc.h>
21*0649cd0dSSimon Glass 
22*0649cd0dSSimon Glass char *env_name_spec = "FAT";
23*0649cd0dSSimon Glass 
24*0649cd0dSSimon Glass env_t *env_ptr;
25*0649cd0dSSimon Glass 
26*0649cd0dSSimon Glass DECLARE_GLOBAL_DATA_PTR;
27*0649cd0dSSimon Glass 
28*0649cd0dSSimon Glass int env_init(void)
29*0649cd0dSSimon Glass {
30*0649cd0dSSimon Glass 	/* use default */
31*0649cd0dSSimon Glass 	gd->env_addr = (ulong)&default_environment[0];
32*0649cd0dSSimon Glass 	gd->env_valid = 1;
33*0649cd0dSSimon Glass 
34*0649cd0dSSimon Glass 	return 0;
35*0649cd0dSSimon Glass }
36*0649cd0dSSimon Glass 
37*0649cd0dSSimon Glass #ifdef CONFIG_CMD_SAVEENV
38*0649cd0dSSimon Glass int saveenv(void)
39*0649cd0dSSimon Glass {
40*0649cd0dSSimon Glass 	env_t	env_new;
41*0649cd0dSSimon Glass 	struct blk_desc *dev_desc = NULL;
42*0649cd0dSSimon Glass 	disk_partition_t info;
43*0649cd0dSSimon Glass 	int dev, part;
44*0649cd0dSSimon Glass 	int err;
45*0649cd0dSSimon Glass 	loff_t size;
46*0649cd0dSSimon Glass 
47*0649cd0dSSimon Glass 	err = env_export(&env_new);
48*0649cd0dSSimon Glass 	if (err)
49*0649cd0dSSimon Glass 		return err;
50*0649cd0dSSimon Glass 
51*0649cd0dSSimon Glass 	part = blk_get_device_part_str(CONFIG_ENV_FAT_INTERFACE,
52*0649cd0dSSimon Glass 					CONFIG_ENV_FAT_DEVICE_AND_PART,
53*0649cd0dSSimon Glass 					&dev_desc, &info, 1);
54*0649cd0dSSimon Glass 	if (part < 0)
55*0649cd0dSSimon Glass 		return 1;
56*0649cd0dSSimon Glass 
57*0649cd0dSSimon Glass 	dev = dev_desc->devnum;
58*0649cd0dSSimon Glass 	if (fat_set_blk_dev(dev_desc, &info) != 0) {
59*0649cd0dSSimon Glass 		printf("\n** Unable to use %s %d:%d for saveenv **\n",
60*0649cd0dSSimon Glass 		       CONFIG_ENV_FAT_INTERFACE, dev, part);
61*0649cd0dSSimon Glass 		return 1;
62*0649cd0dSSimon Glass 	}
63*0649cd0dSSimon Glass 
64*0649cd0dSSimon Glass 	err = file_fat_write(CONFIG_ENV_FAT_FILE, (void *)&env_new, 0, sizeof(env_t),
65*0649cd0dSSimon Glass 			     &size);
66*0649cd0dSSimon Glass 	if (err == -1) {
67*0649cd0dSSimon Glass 		printf("\n** Unable to write \"%s\" from %s%d:%d **\n",
68*0649cd0dSSimon Glass 			CONFIG_ENV_FAT_FILE, CONFIG_ENV_FAT_INTERFACE, dev, part);
69*0649cd0dSSimon Glass 		return 1;
70*0649cd0dSSimon Glass 	}
71*0649cd0dSSimon Glass 
72*0649cd0dSSimon Glass 	puts("done\n");
73*0649cd0dSSimon Glass 	return 0;
74*0649cd0dSSimon Glass }
75*0649cd0dSSimon Glass #endif /* CONFIG_CMD_SAVEENV */
76*0649cd0dSSimon Glass 
77*0649cd0dSSimon Glass void env_relocate_spec(void)
78*0649cd0dSSimon Glass {
79*0649cd0dSSimon Glass 	ALLOC_CACHE_ALIGN_BUFFER(char, buf, CONFIG_ENV_SIZE);
80*0649cd0dSSimon Glass 	struct blk_desc *dev_desc = NULL;
81*0649cd0dSSimon Glass 	disk_partition_t info;
82*0649cd0dSSimon Glass 	int dev, part;
83*0649cd0dSSimon Glass 	int err;
84*0649cd0dSSimon Glass 
85*0649cd0dSSimon Glass 	part = blk_get_device_part_str(CONFIG_ENV_FAT_INTERFACE,
86*0649cd0dSSimon Glass 					CONFIG_ENV_FAT_DEVICE_AND_PART,
87*0649cd0dSSimon Glass 					&dev_desc, &info, 1);
88*0649cd0dSSimon Glass 	if (part < 0)
89*0649cd0dSSimon Glass 		goto err_env_relocate;
90*0649cd0dSSimon Glass 
91*0649cd0dSSimon Glass 	dev = dev_desc->devnum;
92*0649cd0dSSimon Glass 	if (fat_set_blk_dev(dev_desc, &info) != 0) {
93*0649cd0dSSimon Glass 		printf("\n** Unable to use %s %d:%d for loading the env **\n",
94*0649cd0dSSimon Glass 		       CONFIG_ENV_FAT_INTERFACE, dev, part);
95*0649cd0dSSimon Glass 		goto err_env_relocate;
96*0649cd0dSSimon Glass 	}
97*0649cd0dSSimon Glass 
98*0649cd0dSSimon Glass 	err = file_fat_read(CONFIG_ENV_FAT_FILE, buf, CONFIG_ENV_SIZE);
99*0649cd0dSSimon Glass 	if (err == -1) {
100*0649cd0dSSimon Glass 		printf("\n** Unable to read \"%s\" from %s%d:%d **\n",
101*0649cd0dSSimon Glass 			CONFIG_ENV_FAT_FILE, CONFIG_ENV_FAT_INTERFACE, dev, part);
102*0649cd0dSSimon Glass 		goto err_env_relocate;
103*0649cd0dSSimon Glass 	}
104*0649cd0dSSimon Glass 
105*0649cd0dSSimon Glass 	env_import(buf, 1);
106*0649cd0dSSimon Glass 	return;
107*0649cd0dSSimon Glass 
108*0649cd0dSSimon Glass err_env_relocate:
109*0649cd0dSSimon Glass 	set_default_env(NULL);
110*0649cd0dSSimon Glass }
111