xref: /rk3399_rockchip-uboot/include/environment.h (revision bc1bea613fb0b7d3ea1e9901141acc989fd801f8)
1c609719bSwdenk /*
2c609719bSwdenk  * (C) Copyright 2002
3c609719bSwdenk  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
4c609719bSwdenk  *
51a459660SWolfgang Denk  * SPDX-License-Identifier:	GPL-2.0+
6c609719bSwdenk  */
7c609719bSwdenk 
8c609719bSwdenk #ifndef _ENVIRONMENT_H_
96f403badSIgor Grinberg #define _ENVIRONMENT_H_
10c609719bSwdenk 
1178047ad1SJoseph Chen #include <stdbool.h>
12fb1c43ccSMaxime Ripard #include <linux/kconfig.h>
13fb1c43ccSMaxime Ripard 
14c609719bSwdenk /**************************************************************************
15c609719bSwdenk  *
16c609719bSwdenk  * The "environment" is stored as a list of '\0' terminated
17c609719bSwdenk  * "name=value" strings. The end of the list is marked by a double
18c609719bSwdenk  * '\0'. New entries are always added at the end. Deleting an entry
19c609719bSwdenk  * shifts the remaining entries to the front. Replacing an entry is a
20c609719bSwdenk  * combination of deleting the old value and adding the new one.
21c609719bSwdenk  *
22fc0b5948SRobert P. J. Day  * The environment is preceded by a 32 bit CRC over the data part.
23c609719bSwdenk  *
24fc0b5948SRobert P. J. Day  *************************************************************************/
25c609719bSwdenk 
265a1aceb0SJean-Christophe PLAGNIOL-VILLARD #if defined(CONFIG_ENV_IS_IN_FLASH)
270e8d1586SJean-Christophe PLAGNIOL-VILLARD # ifndef	CONFIG_ENV_ADDR
286d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #  define	CONFIG_ENV_ADDR	(CONFIG_SYS_FLASH_BASE + CONFIG_ENV_OFFSET)
29c609719bSwdenk # endif
300e8d1586SJean-Christophe PLAGNIOL-VILLARD # ifndef	CONFIG_ENV_OFFSET
316d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #  define	CONFIG_ENV_OFFSET (CONFIG_ENV_ADDR - CONFIG_SYS_FLASH_BASE)
32c609719bSwdenk # endif
330e8d1586SJean-Christophe PLAGNIOL-VILLARD # if !defined(CONFIG_ENV_ADDR_REDUND) && defined(CONFIG_ENV_OFFSET_REDUND)
34507651d6SIgor Grinberg #  define	CONFIG_ENV_ADDR_REDUND	\
35507651d6SIgor Grinberg 		(CONFIG_SYS_FLASH_BASE + CONFIG_ENV_OFFSET_REDUND)
36c609719bSwdenk # endif
370e8d1586SJean-Christophe PLAGNIOL-VILLARD # if defined(CONFIG_ENV_SECT_SIZE) || defined(CONFIG_ENV_SIZE)
380e8d1586SJean-Christophe PLAGNIOL-VILLARD #  ifndef	CONFIG_ENV_SECT_SIZE
390e8d1586SJean-Christophe PLAGNIOL-VILLARD #   define	CONFIG_ENV_SECT_SIZE	CONFIG_ENV_SIZE
40500545ccSwdenk #  endif
410e8d1586SJean-Christophe PLAGNIOL-VILLARD #  ifndef	CONFIG_ENV_SIZE
420e8d1586SJean-Christophe PLAGNIOL-VILLARD #   define	CONFIG_ENV_SIZE	CONFIG_ENV_SECT_SIZE
43c609719bSwdenk #  endif
44500545ccSwdenk # else
450e8d1586SJean-Christophe PLAGNIOL-VILLARD #  error "Both CONFIG_ENV_SECT_SIZE and CONFIG_ENV_SIZE undefined"
46500545ccSwdenk # endif
470e8d1586SJean-Christophe PLAGNIOL-VILLARD # if defined(CONFIG_ENV_ADDR_REDUND) && !defined(CONFIG_ENV_SIZE_REDUND)
480e8d1586SJean-Christophe PLAGNIOL-VILLARD #  define CONFIG_ENV_SIZE_REDUND	CONFIG_ENV_SIZE
49c609719bSwdenk # endif
506d0f6bcfSJean-Christophe PLAGNIOL-VILLARD # if	(CONFIG_ENV_ADDR >= CONFIG_SYS_MONITOR_BASE) &&		\
51507651d6SIgor Grinberg 	(CONFIG_ENV_ADDR + CONFIG_ENV_SIZE) <=			\
52507651d6SIgor Grinberg 	(CONFIG_SYS_MONITOR_BASE + CONFIG_SYS_MONITOR_LEN)
536f403badSIgor Grinberg #  define ENV_IS_EMBEDDED
54c609719bSwdenk # endif
550e8d1586SJean-Christophe PLAGNIOL-VILLARD # if defined(CONFIG_ENV_ADDR_REDUND) || defined(CONFIG_ENV_OFFSET_REDUND)
566f403badSIgor Grinberg #  define CONFIG_SYS_REDUNDAND_ENVIRONMENT
57c609719bSwdenk # endif
580a9e4e77SMike Frysinger # ifdef CONFIG_ENV_IS_EMBEDDED
590a9e4e77SMike Frysinger #  error "do not define CONFIG_ENV_IS_EMBEDDED in your board config"
600a9e4e77SMike Frysinger #  error "it is calculated automatically for you"
610a9e4e77SMike Frysinger # endif
625a1aceb0SJean-Christophe PLAGNIOL-VILLARD #endif	/* CONFIG_ENV_IS_IN_FLASH */
63c609719bSwdenk 
645707df77SBo Shen #if defined(CONFIG_ENV_IS_IN_MMC)
655707df77SBo Shen # ifdef CONFIG_ENV_OFFSET_REDUND
665707df77SBo Shen #  define CONFIG_SYS_REDUNDAND_ENVIRONMENT
675707df77SBo Shen # endif
685707df77SBo Shen #endif
695707df77SBo Shen 
7051bfee19SJean-Christophe PLAGNIOL-VILLARD #if defined(CONFIG_ENV_IS_IN_NAND)
71c9f7351bSBen Gardiner # if defined(CONFIG_ENV_OFFSET_OOB)
72c9f7351bSBen Gardiner #  ifdef CONFIG_ENV_OFFSET_REDUND
73c9f7351bSBen Gardiner #   error "CONFIG_ENV_OFFSET_REDUND is not supported when CONFIG_ENV_OFFSET_OOB"
74c9f7351bSBen Gardiner #   error "is set"
75c9f7351bSBen Gardiner #  endif
76c9f7351bSBen Gardiner extern unsigned long nand_env_oob_offset;
77c9f7351bSBen Gardiner #  define CONFIG_ENV_OFFSET nand_env_oob_offset
78c9f7351bSBen Gardiner # else
790e8d1586SJean-Christophe PLAGNIOL-VILLARD #  ifndef CONFIG_ENV_OFFSET
800e8d1586SJean-Christophe PLAGNIOL-VILLARD #   error "Need to define CONFIG_ENV_OFFSET when using CONFIG_ENV_IS_IN_NAND"
81e443c944SMarkus Klotzbuecher #  endif
820e8d1586SJean-Christophe PLAGNIOL-VILLARD #  ifdef CONFIG_ENV_OFFSET_REDUND
836d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #   define CONFIG_SYS_REDUNDAND_ENVIRONMENT
84e443c944SMarkus Klotzbuecher #  endif
85c9f7351bSBen Gardiner # endif /* CONFIG_ENV_OFFSET_OOB */
86c9f7351bSBen Gardiner # ifndef CONFIG_ENV_SIZE
87c9f7351bSBen Gardiner #  error "Need to define CONFIG_ENV_SIZE when using CONFIG_ENV_IS_IN_NAND"
88c9f7351bSBen Gardiner # endif
8951bfee19SJean-Christophe PLAGNIOL-VILLARD #endif /* CONFIG_ENV_IS_IN_NAND */
90e443c944SMarkus Klotzbuecher 
912b74433fSJoe Hershberger #if defined(CONFIG_ENV_IS_IN_UBI)
922b74433fSJoe Hershberger # ifndef CONFIG_ENV_UBI_PART
932b74433fSJoe Hershberger #  error "Need to define CONFIG_ENV_UBI_PART when using CONFIG_ENV_IS_IN_UBI"
942b74433fSJoe Hershberger # endif
952b74433fSJoe Hershberger # ifndef CONFIG_ENV_UBI_VOLUME
962b74433fSJoe Hershberger #  error "Need to define CONFIG_ENV_UBI_VOLUME when using CONFIG_ENV_IS_IN_UBI"
972b74433fSJoe Hershberger # endif
98785881f7SJoe Hershberger # if defined(CONFIG_ENV_UBI_VOLUME_REDUND)
99785881f7SJoe Hershberger #  define CONFIG_SYS_REDUNDAND_ENVIRONMENT
100785881f7SJoe Hershberger # endif
1012b74433fSJoe Hershberger # ifndef CONFIG_ENV_SIZE
1022b74433fSJoe Hershberger #  error "Need to define CONFIG_ENV_SIZE when using CONFIG_ENV_IS_IN_UBI"
1032b74433fSJoe Hershberger # endif
1042b74433fSJoe Hershberger # ifndef CONFIG_CMD_UBI
1052b74433fSJoe Hershberger #  error "Need to define CONFIG_CMD_UBI when using CONFIG_ENV_IS_IN_UBI"
1062b74433fSJoe Hershberger # endif
1072b74433fSJoe Hershberger #endif /* CONFIG_ENV_IS_IN_UBI */
1082b74433fSJoe Hershberger 
1090a9e4e77SMike Frysinger /* Embedded env is only supported for some flash types */
1100a9e4e77SMike Frysinger #ifdef CONFIG_ENV_IS_EMBEDDED
1110a9e4e77SMike Frysinger # if	!defined(CONFIG_ENV_IS_IN_FLASH)	&& \
1120a9e4e77SMike Frysinger 	!defined(CONFIG_ENV_IS_IN_NAND)		&& \
113efb06339SYoshihiro Shimoda 	!defined(CONFIG_ENV_IS_IN_ONENAND)	&& \
114efb06339SYoshihiro Shimoda 	!defined(CONFIG_ENV_IS_IN_SPI_FLASH)
1150a9e4e77SMike Frysinger #  error "CONFIG_ENV_IS_EMBEDDED not supported for your flash type"
1160a9e4e77SMike Frysinger # endif
1170a9e4e77SMike Frysinger #endif
1180a9e4e77SMike Frysinger 
1190a9e4e77SMike Frysinger /*
1200a9e4e77SMike Frysinger  * For the flash types where embedded env is supported, but it cannot be
1210a9e4e77SMike Frysinger  * calculated automatically (i.e. NAND), take the board opt-in.
1220a9e4e77SMike Frysinger  */
1230a9e4e77SMike Frysinger #if defined(CONFIG_ENV_IS_EMBEDDED) && !defined(ENV_IS_EMBEDDED)
1246f403badSIgor Grinberg # define ENV_IS_EMBEDDED
1250a9e4e77SMike Frysinger #endif
1260a9e4e77SMike Frysinger 
1270a9e4e77SMike Frysinger /* The build system likes to know if the env is embedded */
1280a9e4e77SMike Frysinger #ifdef DO_DEPS_ONLY
1290a9e4e77SMike Frysinger # ifdef ENV_IS_EMBEDDED
13033a6b9e9SWolfgang Denk #  ifndef CONFIG_ENV_IS_EMBEDDED
1310a9e4e77SMike Frysinger #   define CONFIG_ENV_IS_EMBEDDED
1320a9e4e77SMike Frysinger #  endif
1330a9e4e77SMike Frysinger # endif
13433a6b9e9SWolfgang Denk #endif
1350a9e4e77SMike Frysinger 
13637566090SMike Frysinger #include "compiler.h"
137c609719bSwdenk 
1386d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_SYS_REDUNDAND_ENVIRONMENT
13989cdab78SMike Frysinger # define ENV_HEADER_SIZE	(sizeof(uint32_t) + 1)
140b218ccb5SWolfgang Denk 
141b218ccb5SWolfgang Denk # define ACTIVE_FLAG   1
142b218ccb5SWolfgang Denk # define OBSOLETE_FLAG 0
143c609719bSwdenk #else
14489cdab78SMike Frysinger # define ENV_HEADER_SIZE	(sizeof(uint32_t))
145c609719bSwdenk #endif
146c609719bSwdenk 
147*bc1bea61SJoseph Chen /* Select the MAX from CONFIG_ENV_{,NAND,NOR}_SIZE */
1481e890c70SJoseph Chen #if defined(CONFIG_ENV_NAND_SIZE) && (CONFIG_ENV_SIZE < CONFIG_ENV_NAND_SIZE)
1491e890c70SJoseph Chen #define ENV_SIZE_VAL	CONFIG_ENV_NAND_SIZE
1501e890c70SJoseph Chen #else
1511e890c70SJoseph Chen #define ENV_SIZE_VAL	CONFIG_ENV_SIZE
1521e890c70SJoseph Chen #endif
153*bc1bea61SJoseph Chen #if defined(CONFIG_ENV_NOR_SIZE) && (ENV_SIZE_VAL < CONFIG_ENV_NOR_SIZE)
154*bc1bea61SJoseph Chen #undef ENV_SIZE_VAL
155*bc1bea61SJoseph Chen #define ENV_SIZE_VAL	CONFIG_ENV_NOR_SIZE
156*bc1bea61SJoseph Chen #endif
1571e890c70SJoseph Chen 
158a4223b74SMarek Vasut #ifdef CONFIG_ENV_AES
159a4223b74SMarek Vasut /* Make sure the payload is multiple of AES block size */
1601e890c70SJoseph Chen #define ENV_SIZE ((ENV_SIZE_VAL - ENV_HEADER_SIZE) & ~(16 - 1))
161a4223b74SMarek Vasut #else
1621e890c70SJoseph Chen #define ENV_SIZE (ENV_SIZE_VAL - ENV_HEADER_SIZE)
163a4223b74SMarek Vasut #endif
164c609719bSwdenk 
165c609719bSwdenk typedef struct environment_s {
16689cdab78SMike Frysinger 	uint32_t	crc;		/* CRC32 over data bytes	*/
1676d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_SYS_REDUNDAND_ENVIRONMENT
168c609719bSwdenk 	unsigned char	flags;		/* active/obsolete flags	*/
169c609719bSwdenk #endif
170c609719bSwdenk 	unsigned char	data[ENV_SIZE]; /* Environment data		*/
171a4223b74SMarek Vasut } env_t
172a4223b74SMarek Vasut #ifdef CONFIG_ENV_AES
173a4223b74SMarek Vasut /* Make sure the env is aligned to block size. */
174a4223b74SMarek Vasut __attribute__((aligned(16)))
175a4223b74SMarek Vasut #endif
176a4223b74SMarek Vasut ;
177c609719bSwdenk 
178994bc671SIgor Grinberg #ifdef ENV_IS_EMBEDDED
179994bc671SIgor Grinberg extern env_t environment;
180994bc671SIgor Grinberg #endif /* ENV_IS_EMBEDDED */
181994bc671SIgor Grinberg 
182d1459f0fSIgor Grinberg extern const unsigned char default_environment[];
18327aafe98SIgor Grinberg extern env_t *env_ptr;
18427aafe98SIgor Grinberg 
18527aafe98SIgor Grinberg #if defined(CONFIG_NEEDS_MANUAL_RELOC)
18627aafe98SIgor Grinberg extern void env_reloc(void);
18727aafe98SIgor Grinberg #endif
188d1459f0fSIgor Grinberg 
189ac77f42dSDmitry Lifshitz #ifdef CONFIG_ENV_IS_IN_MMC
190ac77f42dSDmitry Lifshitz #include <mmc.h>
191ac77f42dSDmitry Lifshitz 
192ac77f42dSDmitry Lifshitz extern int mmc_get_env_addr(struct mmc *mmc, int copy, u32 *env_addr);
1936e7b7df4SDmitry Lifshitz # ifdef CONFIG_SYS_MMC_ENV_PART
1946e7b7df4SDmitry Lifshitz extern uint mmc_get_env_part(struct mmc *mmc);
1956e7b7df4SDmitry Lifshitz # endif
196ac77f42dSDmitry Lifshitz #endif
197ac77f42dSDmitry Lifshitz 
1982eb1573fSMike Frysinger #ifndef DO_DEPS_ONLY
1992eb1573fSMike Frysinger 
200170ab110SJoe Hershberger #include <env_attr.h>
201170ab110SJoe Hershberger #include <env_callback.h>
2022598090bSJoe Hershberger #include <env_flags.h>
2032eb1573fSMike Frysinger #include <search.h>
2042eb1573fSMike Frysinger 
205203e94f6SSimon Glass /* Value for environment validity */
206203e94f6SSimon Glass enum env_valid {
207203e94f6SSimon Glass 	ENV_INVALID,	/* No valid environment */
208203e94f6SSimon Glass 	ENV_VALID,	/* First or only environment is valid */
209203e94f6SSimon Glass 	ENV_REDUND,	/* Redundant environment is valid */
210203e94f6SSimon Glass };
211203e94f6SSimon Glass 
2124415f1d1SSimon Glass enum env_location {
2134415f1d1SSimon Glass 	ENVL_EEPROM,
2144415f1d1SSimon Glass 	ENVL_EXT4,
2154415f1d1SSimon Glass 	ENVL_FAT,
2164415f1d1SSimon Glass 	ENVL_FLASH,
2174415f1d1SSimon Glass 	ENVL_MMC,
2184415f1d1SSimon Glass 	ENVL_NAND,
2194415f1d1SSimon Glass 	ENVL_NVRAM,
2204415f1d1SSimon Glass 	ENVL_ONENAND,
2214415f1d1SSimon Glass 	ENVL_REMOTE,
2224415f1d1SSimon Glass 	ENVL_SPI_FLASH,
2234415f1d1SSimon Glass 	ENVL_UBI,
2244415f1d1SSimon Glass 	ENVL_NOWHERE,
2252ba7147fSJoseph Chen 	ENVL_BLK,
2264415f1d1SSimon Glass 
2274415f1d1SSimon Glass 	ENVL_COUNT,
2284415f1d1SSimon Glass 	ENVL_UNKNOWN,
2294415f1d1SSimon Glass };
2304415f1d1SSimon Glass 
2314415f1d1SSimon Glass struct env_driver {
232ac358bebSSimon Glass 	const char *name;
2334415f1d1SSimon Glass 	enum env_location location;
2344415f1d1SSimon Glass 
2354415f1d1SSimon Glass 	/**
2364415f1d1SSimon Glass 	 * get_char() - Read a character from the environment
2374415f1d1SSimon Glass 	 *
2384415f1d1SSimon Glass 	 * This method is optional. If not provided, a default implementation
2394415f1d1SSimon Glass 	 * will read from gd->env_addr.
2404415f1d1SSimon Glass 	 *
2414415f1d1SSimon Glass 	 * @index: Index of character to read (0=first)
24221f63944SSimon Glass 	 * @return character read, or -ve on error
2434415f1d1SSimon Glass 	 */
24421f63944SSimon Glass 	int (*get_char)(int index);
2454415f1d1SSimon Glass 
2464415f1d1SSimon Glass 	/**
2474415f1d1SSimon Glass 	 * load() - Load the environment from storage
2484415f1d1SSimon Glass 	 *
2494415f1d1SSimon Glass 	 * This method is optional. If not provided, no environment will be
2504415f1d1SSimon Glass 	 * loaded.
251c5951991SSimon Glass 	 *
252c5951991SSimon Glass 	 * @return 0 if OK, -ve on error
2534415f1d1SSimon Glass 	 */
254c5951991SSimon Glass 	int (*load)(void);
2554415f1d1SSimon Glass 
2564415f1d1SSimon Glass 	/**
2574415f1d1SSimon Glass 	 * save() - Save the environment to storage
2584415f1d1SSimon Glass 	 *
2594415f1d1SSimon Glass 	 * This method is required for 'saveenv' to work.
2604415f1d1SSimon Glass 	 *
2614415f1d1SSimon Glass 	 * @return 0 if OK, -ve on error
2624415f1d1SSimon Glass 	 */
2634415f1d1SSimon Glass 	int (*save)(void);
2644415f1d1SSimon Glass 
2654415f1d1SSimon Glass 	/**
2664415f1d1SSimon Glass 	 * init() - Set up the initial pre-relocation environment
2674415f1d1SSimon Glass 	 *
2684415f1d1SSimon Glass 	 * This method is optional.
2694415f1d1SSimon Glass 	 *
2707938822aSSimon Glass 	 * @return 0 if OK, -ENOENT if no initial environment could be found,
2717938822aSSimon Glass 	 * other -ve on error
2724415f1d1SSimon Glass 	 */
2734415f1d1SSimon Glass 	int (*init)(void);
2744415f1d1SSimon Glass };
2754415f1d1SSimon Glass 
2764415f1d1SSimon Glass /* Declare a new environment location driver */
2774415f1d1SSimon Glass #define U_BOOT_ENV_LOCATION(__name)					\
2784415f1d1SSimon Glass 	ll_entry_declare(struct env_driver, __name, env_driver)
2794415f1d1SSimon Glass 
280ac358bebSSimon Glass /* Declare the name of a location */
281ac358bebSSimon Glass #ifdef CONFIG_CMD_SAVEENV
282ac358bebSSimon Glass #define ENV_NAME(_name) .name = _name,
283ac358bebSSimon Glass #else
284ac358bebSSimon Glass #define ENV_NAME(_name)
285ac358bebSSimon Glass #endif
286ac358bebSSimon Glass 
2874415f1d1SSimon Glass #ifdef CONFIG_CMD_SAVEENV
2884415f1d1SSimon Glass #define env_save_ptr(x) x
2894415f1d1SSimon Glass #else
2904415f1d1SSimon Glass #define env_save_ptr(x) NULL
2914415f1d1SSimon Glass #endif
2924415f1d1SSimon Glass 
2932eb1573fSMike Frysinger extern struct hsearch_data env_htab;
2942eb1573fSMike Frysinger 
295a8409f4fSWolfgang Denk /* Function that updates CRC of the enironment */
296a8409f4fSWolfgang Denk void env_crc_update(void);
297a8409f4fSWolfgang Denk 
298267541f7SJoe Hershberger /* Look up the variable from the default environment */
299723806ccSSimon Glass char *env_get_default(const char *name);
300267541f7SJoe Hershberger 
3015bb12dbdSHarald Welte /* [re]set to the default environment */
302ea882bafSWolfgang Denk void set_default_env(const char *s);
303ea882bafSWolfgang Denk 
30414569d26SJoseph Chen /* [re]set to the board environment */
30514569d26SJoseph Chen int set_board_env(const char *vars, int size, int flags, bool ready);
30614569d26SJoseph Chen 
307b64b7c3dSGerlando Falauto /* [re]set individual variables to their value in the default environment */
308b64b7c3dSGerlando Falauto int set_default_vars(int nvars, char * const vars[]);
309b64b7c3dSGerlando Falauto 
310ea882bafSWolfgang Denk /* Import from binary representation into hash table */
311ea882bafSWolfgang Denk int env_import(const char *buf, int check);
3125bb12dbdSHarald Welte 
3137ce1526eSMarek Vasut /* Export from hash table into binary representation */
3147ce1526eSMarek Vasut int env_export(env_t *env_out);
3157ce1526eSMarek Vasut 
31676768f5fSFiach Antaw #ifdef CONFIG_SYS_REDUNDAND_ENVIRONMENT
31776768f5fSFiach Antaw /* Select and import one of two redundant environments */
31876768f5fSFiach Antaw int env_import_redund(const char *buf1, const char *buf2);
31976768f5fSFiach Antaw #endif
32076768f5fSFiach Antaw 
321ac358bebSSimon Glass /**
322ac358bebSSimon Glass  * env_driver_lookup_default() - Look up the default environment driver
323ac358bebSSimon Glass  *
324ac358bebSSimon Glass  * @return pointer to driver, or NULL if none (which should not happen)
325ac358bebSSimon Glass  */
326ac358bebSSimon Glass struct env_driver *env_driver_lookup_default(void);
327ac358bebSSimon Glass 
328a69d0f60SSimon Glass /**
329a69d0f60SSimon Glass  * env_get_char() - Get a character from the early environment
330a69d0f60SSimon Glass  *
331a69d0f60SSimon Glass  * This reads from the pre-relocation environemnt
332a69d0f60SSimon Glass  *
333a69d0f60SSimon Glass  * @index: Index of character to read (0 = first)
334a69d0f60SSimon Glass  * @return character read, or -ve on error
335a69d0f60SSimon Glass  */
336a69d0f60SSimon Glass int env_get_char(int index);
337a69d0f60SSimon Glass 
338310fb14bSSimon Glass /**
339310fb14bSSimon Glass  * env_load() - Load the environment from storage
340310fb14bSSimon Glass  *
341310fb14bSSimon Glass  * @return 0 if OK, -ve on error
342310fb14bSSimon Glass  */
343310fb14bSSimon Glass int env_load(void);
344310fb14bSSimon Glass 
34501510091SSimon Glass /**
34601510091SSimon Glass  * env_save() - Save the environment to storage
34701510091SSimon Glass  *
34801510091SSimon Glass  * @return 0 if OK, -ve on error
34901510091SSimon Glass  */
35001510091SSimon Glass int env_save(void);
35101510091SSimon Glass 
352507651d6SIgor Grinberg #endif /* DO_DEPS_ONLY */
3532eb1573fSMike Frysinger 
354c609719bSwdenk #endif /* _ENVIRONMENT_H_ */
355