xref: /openbmc/u-boot/include/environment.h (revision 77c07e7ed36cae250a3562ee4bed0fa537960354)
183d290c5STom Rini /* SPDX-License-Identifier: GPL-2.0+ */
2c609719bSwdenk /*
3c609719bSwdenk  * (C) Copyright 2002
4c609719bSwdenk  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
5c609719bSwdenk  */
6c609719bSwdenk 
7c609719bSwdenk #ifndef _ENVIRONMENT_H_
86f403badSIgor Grinberg #define _ENVIRONMENT_H_
9c609719bSwdenk 
10fb1c43ccSMaxime Ripard #include <linux/kconfig.h>
11fb1c43ccSMaxime Ripard 
12c609719bSwdenk /**************************************************************************
13c609719bSwdenk  *
14c609719bSwdenk  * The "environment" is stored as a list of '\0' terminated
15c609719bSwdenk  * "name=value" strings. The end of the list is marked by a double
16c609719bSwdenk  * '\0'. New entries are always added at the end. Deleting an entry
17c609719bSwdenk  * shifts the remaining entries to the front. Replacing an entry is a
18c609719bSwdenk  * combination of deleting the old value and adding the new one.
19c609719bSwdenk  *
20fc0b5948SRobert P. J. Day  * The environment is preceded by a 32 bit CRC over the data part.
21c609719bSwdenk  *
22fc0b5948SRobert P. J. Day  *************************************************************************/
23c609719bSwdenk 
245a1aceb0SJean-Christophe PLAGNIOL-VILLARD #if defined(CONFIG_ENV_IS_IN_FLASH)
250e8d1586SJean-Christophe PLAGNIOL-VILLARD # ifndef	CONFIG_ENV_ADDR
266d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #  define	CONFIG_ENV_ADDR	(CONFIG_SYS_FLASH_BASE + CONFIG_ENV_OFFSET)
27c609719bSwdenk # endif
280e8d1586SJean-Christophe PLAGNIOL-VILLARD # ifndef	CONFIG_ENV_OFFSET
296d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #  define	CONFIG_ENV_OFFSET (CONFIG_ENV_ADDR - CONFIG_SYS_FLASH_BASE)
30c609719bSwdenk # endif
310e8d1586SJean-Christophe PLAGNIOL-VILLARD # if !defined(CONFIG_ENV_ADDR_REDUND) && defined(CONFIG_ENV_OFFSET_REDUND)
32507651d6SIgor Grinberg #  define	CONFIG_ENV_ADDR_REDUND	\
33507651d6SIgor Grinberg 		(CONFIG_SYS_FLASH_BASE + CONFIG_ENV_OFFSET_REDUND)
34c609719bSwdenk # endif
350e8d1586SJean-Christophe PLAGNIOL-VILLARD # if defined(CONFIG_ENV_SECT_SIZE) || defined(CONFIG_ENV_SIZE)
360e8d1586SJean-Christophe PLAGNIOL-VILLARD #  ifndef	CONFIG_ENV_SECT_SIZE
370e8d1586SJean-Christophe PLAGNIOL-VILLARD #   define	CONFIG_ENV_SECT_SIZE	CONFIG_ENV_SIZE
38500545ccSwdenk #  endif
390e8d1586SJean-Christophe PLAGNIOL-VILLARD #  ifndef	CONFIG_ENV_SIZE
400e8d1586SJean-Christophe PLAGNIOL-VILLARD #   define	CONFIG_ENV_SIZE	CONFIG_ENV_SECT_SIZE
41c609719bSwdenk #  endif
42500545ccSwdenk # else
430e8d1586SJean-Christophe PLAGNIOL-VILLARD #  error "Both CONFIG_ENV_SECT_SIZE and CONFIG_ENV_SIZE undefined"
44500545ccSwdenk # endif
450e8d1586SJean-Christophe PLAGNIOL-VILLARD # if defined(CONFIG_ENV_ADDR_REDUND) && !defined(CONFIG_ENV_SIZE_REDUND)
460e8d1586SJean-Christophe PLAGNIOL-VILLARD #  define CONFIG_ENV_SIZE_REDUND	CONFIG_ENV_SIZE
47c609719bSwdenk # endif
486d0f6bcfSJean-Christophe PLAGNIOL-VILLARD # if	(CONFIG_ENV_ADDR >= CONFIG_SYS_MONITOR_BASE) &&		\
49507651d6SIgor Grinberg 	(CONFIG_ENV_ADDR + CONFIG_ENV_SIZE) <=			\
50507651d6SIgor Grinberg 	(CONFIG_SYS_MONITOR_BASE + CONFIG_SYS_MONITOR_LEN)
516f403badSIgor Grinberg #  define ENV_IS_EMBEDDED
52c609719bSwdenk # endif
530e8d1586SJean-Christophe PLAGNIOL-VILLARD # if defined(CONFIG_ENV_ADDR_REDUND) || defined(CONFIG_ENV_OFFSET_REDUND)
546f403badSIgor Grinberg #  define CONFIG_SYS_REDUNDAND_ENVIRONMENT
55c609719bSwdenk # endif
560a9e4e77SMike Frysinger # ifdef CONFIG_ENV_IS_EMBEDDED
570a9e4e77SMike Frysinger #  error "do not define CONFIG_ENV_IS_EMBEDDED in your board config"
580a9e4e77SMike Frysinger #  error "it is calculated automatically for you"
590a9e4e77SMike Frysinger # endif
605a1aceb0SJean-Christophe PLAGNIOL-VILLARD #endif	/* CONFIG_ENV_IS_IN_FLASH */
61c609719bSwdenk 
625707df77SBo Shen #if defined(CONFIG_ENV_IS_IN_MMC)
635707df77SBo Shen # ifdef CONFIG_ENV_OFFSET_REDUND
645707df77SBo Shen #  define CONFIG_SYS_REDUNDAND_ENVIRONMENT
655707df77SBo Shen # endif
665707df77SBo Shen #endif
675707df77SBo Shen 
6851bfee19SJean-Christophe PLAGNIOL-VILLARD #if defined(CONFIG_ENV_IS_IN_NAND)
69c9f7351bSBen Gardiner # if defined(CONFIG_ENV_OFFSET_OOB)
70c9f7351bSBen Gardiner #  ifdef CONFIG_ENV_OFFSET_REDUND
71c9f7351bSBen Gardiner #   error "CONFIG_ENV_OFFSET_REDUND is not supported when CONFIG_ENV_OFFSET_OOB"
72c9f7351bSBen Gardiner #   error "is set"
73c9f7351bSBen Gardiner #  endif
74c9f7351bSBen Gardiner extern unsigned long nand_env_oob_offset;
75c9f7351bSBen Gardiner #  define CONFIG_ENV_OFFSET nand_env_oob_offset
76c9f7351bSBen Gardiner # else
770e8d1586SJean-Christophe PLAGNIOL-VILLARD #  ifndef CONFIG_ENV_OFFSET
780e8d1586SJean-Christophe PLAGNIOL-VILLARD #   error "Need to define CONFIG_ENV_OFFSET when using CONFIG_ENV_IS_IN_NAND"
79e443c944SMarkus Klotzbuecher #  endif
800e8d1586SJean-Christophe PLAGNIOL-VILLARD #  ifdef CONFIG_ENV_OFFSET_REDUND
816d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #   define CONFIG_SYS_REDUNDAND_ENVIRONMENT
82e443c944SMarkus Klotzbuecher #  endif
83c9f7351bSBen Gardiner # endif /* CONFIG_ENV_OFFSET_OOB */
84c9f7351bSBen Gardiner # ifndef CONFIG_ENV_SIZE
85c9f7351bSBen Gardiner #  error "Need to define CONFIG_ENV_SIZE when using CONFIG_ENV_IS_IN_NAND"
86c9f7351bSBen Gardiner # endif
8751bfee19SJean-Christophe PLAGNIOL-VILLARD #endif /* CONFIG_ENV_IS_IN_NAND */
88e443c944SMarkus Klotzbuecher 
892b74433fSJoe Hershberger #if defined(CONFIG_ENV_IS_IN_UBI)
902b74433fSJoe Hershberger # ifndef CONFIG_ENV_UBI_PART
912b74433fSJoe Hershberger #  error "Need to define CONFIG_ENV_UBI_PART when using CONFIG_ENV_IS_IN_UBI"
922b74433fSJoe Hershberger # endif
932b74433fSJoe Hershberger # ifndef CONFIG_ENV_UBI_VOLUME
942b74433fSJoe Hershberger #  error "Need to define CONFIG_ENV_UBI_VOLUME when using CONFIG_ENV_IS_IN_UBI"
952b74433fSJoe Hershberger # endif
96785881f7SJoe Hershberger # if defined(CONFIG_ENV_UBI_VOLUME_REDUND)
97785881f7SJoe Hershberger #  define CONFIG_SYS_REDUNDAND_ENVIRONMENT
98785881f7SJoe Hershberger # endif
992b74433fSJoe Hershberger # ifndef CONFIG_ENV_SIZE
1002b74433fSJoe Hershberger #  error "Need to define CONFIG_ENV_SIZE when using CONFIG_ENV_IS_IN_UBI"
1012b74433fSJoe Hershberger # endif
1022b74433fSJoe Hershberger # ifndef CONFIG_CMD_UBI
1032b74433fSJoe Hershberger #  error "Need to define CONFIG_CMD_UBI when using CONFIG_ENV_IS_IN_UBI"
1042b74433fSJoe Hershberger # endif
1052b74433fSJoe Hershberger #endif /* CONFIG_ENV_IS_IN_UBI */
1062b74433fSJoe Hershberger 
1070a9e4e77SMike Frysinger /* Embedded env is only supported for some flash types */
1080a9e4e77SMike Frysinger #ifdef CONFIG_ENV_IS_EMBEDDED
1090a9e4e77SMike Frysinger # if	!defined(CONFIG_ENV_IS_IN_FLASH)	&& \
1100a9e4e77SMike Frysinger 	!defined(CONFIG_ENV_IS_IN_NAND)		&& \
111efb06339SYoshihiro Shimoda 	!defined(CONFIG_ENV_IS_IN_ONENAND)	&& \
112efb06339SYoshihiro Shimoda 	!defined(CONFIG_ENV_IS_IN_SPI_FLASH)
1130a9e4e77SMike Frysinger #  error "CONFIG_ENV_IS_EMBEDDED not supported for your flash type"
1140a9e4e77SMike Frysinger # endif
1150a9e4e77SMike Frysinger #endif
1160a9e4e77SMike Frysinger 
1170a9e4e77SMike Frysinger /*
1180a9e4e77SMike Frysinger  * For the flash types where embedded env is supported, but it cannot be
1190a9e4e77SMike Frysinger  * calculated automatically (i.e. NAND), take the board opt-in.
1200a9e4e77SMike Frysinger  */
1210a9e4e77SMike Frysinger #if defined(CONFIG_ENV_IS_EMBEDDED) && !defined(ENV_IS_EMBEDDED)
1226f403badSIgor Grinberg # define ENV_IS_EMBEDDED
1230a9e4e77SMike Frysinger #endif
1240a9e4e77SMike Frysinger 
1250a9e4e77SMike Frysinger /* The build system likes to know if the env is embedded */
1260a9e4e77SMike Frysinger #ifdef DO_DEPS_ONLY
1270a9e4e77SMike Frysinger # ifdef ENV_IS_EMBEDDED
12833a6b9e9SWolfgang Denk #  ifndef CONFIG_ENV_IS_EMBEDDED
1290a9e4e77SMike Frysinger #   define CONFIG_ENV_IS_EMBEDDED
1300a9e4e77SMike Frysinger #  endif
1310a9e4e77SMike Frysinger # endif
13233a6b9e9SWolfgang Denk #endif
1330a9e4e77SMike Frysinger 
13437566090SMike Frysinger #include "compiler.h"
135c609719bSwdenk 
1366d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_SYS_REDUNDAND_ENVIRONMENT
13789cdab78SMike Frysinger # define ENV_HEADER_SIZE	(sizeof(uint32_t) + 1)
138b218ccb5SWolfgang Denk 
139b218ccb5SWolfgang Denk # define ACTIVE_FLAG   1
140b218ccb5SWolfgang Denk # define OBSOLETE_FLAG 0
141c609719bSwdenk #else
14289cdab78SMike Frysinger # define ENV_HEADER_SIZE	(sizeof(uint32_t))
143c609719bSwdenk #endif
144c609719bSwdenk 
1450e8d1586SJean-Christophe PLAGNIOL-VILLARD #define ENV_SIZE (CONFIG_ENV_SIZE - ENV_HEADER_SIZE)
146c609719bSwdenk 
147c609719bSwdenk typedef struct environment_s {
14889cdab78SMike Frysinger 	uint32_t	crc;		/* CRC32 over data bytes	*/
1496d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_SYS_REDUNDAND_ENVIRONMENT
150c609719bSwdenk 	unsigned char	flags;		/* active/obsolete flags	*/
151c609719bSwdenk #endif
152c609719bSwdenk 	unsigned char	data[ENV_SIZE]; /* Environment data		*/
153c6831c74STom Rini } env_t;
154c609719bSwdenk 
155994bc671SIgor Grinberg #ifdef ENV_IS_EMBEDDED
156994bc671SIgor Grinberg extern env_t environment;
157994bc671SIgor Grinberg #endif /* ENV_IS_EMBEDDED */
158994bc671SIgor Grinberg 
159d1459f0fSIgor Grinberg extern const unsigned char default_environment[];
16027aafe98SIgor Grinberg 
16127aafe98SIgor Grinberg #if defined(CONFIG_NEEDS_MANUAL_RELOC)
16227aafe98SIgor Grinberg extern void env_reloc(void);
16327aafe98SIgor Grinberg #endif
164d1459f0fSIgor Grinberg 
1652eb1573fSMike Frysinger #ifndef DO_DEPS_ONLY
1662eb1573fSMike Frysinger 
167170ab110SJoe Hershberger #include <env_attr.h>
168170ab110SJoe Hershberger #include <env_callback.h>
1692598090bSJoe Hershberger #include <env_flags.h>
1702eb1573fSMike Frysinger #include <search.h>
1712eb1573fSMike Frysinger 
172203e94f6SSimon Glass /* Value for environment validity */
173203e94f6SSimon Glass enum env_valid {
174203e94f6SSimon Glass 	ENV_INVALID,	/* No valid environment */
175203e94f6SSimon Glass 	ENV_VALID,	/* First or only environment is valid */
176203e94f6SSimon Glass 	ENV_REDUND,	/* Redundant environment is valid */
177203e94f6SSimon Glass };
178203e94f6SSimon Glass 
1794415f1d1SSimon Glass enum env_location {
180e1caa584SYork Sun 	ENVL_UNKNOWN,
1814415f1d1SSimon Glass 	ENVL_EEPROM,
1824415f1d1SSimon Glass 	ENVL_EXT4,
1834415f1d1SSimon Glass 	ENVL_FAT,
1844415f1d1SSimon Glass 	ENVL_FLASH,
1854415f1d1SSimon Glass 	ENVL_MMC,
1864415f1d1SSimon Glass 	ENVL_NAND,
1874415f1d1SSimon Glass 	ENVL_NVRAM,
1884415f1d1SSimon Glass 	ENVL_ONENAND,
1894415f1d1SSimon Glass 	ENVL_REMOTE,
1904415f1d1SSimon Glass 	ENVL_SPI_FLASH,
1914415f1d1SSimon Glass 	ENVL_UBI,
1924415f1d1SSimon Glass 	ENVL_NOWHERE,
1934415f1d1SSimon Glass 
1944415f1d1SSimon Glass 	ENVL_COUNT,
1954415f1d1SSimon Glass };
1964415f1d1SSimon Glass 
1978a3a7e22SMaxime Ripard /* value for the various operations we want to perform on the env */
1988a3a7e22SMaxime Ripard enum env_operation {
1998a3a7e22SMaxime Ripard 	ENVOP_GET_CHAR,	/* we want to call the get_char function */
2008a3a7e22SMaxime Ripard 	ENVOP_INIT,	/* we want to call the init function */
2018a3a7e22SMaxime Ripard 	ENVOP_LOAD,	/* we want to call the load function */
2028a3a7e22SMaxime Ripard 	ENVOP_SAVE,	/* we want to call the save function */
2038a3a7e22SMaxime Ripard };
2048a3a7e22SMaxime Ripard 
2054415f1d1SSimon Glass struct env_driver {
206ac358bebSSimon Glass 	const char *name;
2074415f1d1SSimon Glass 	enum env_location location;
2084415f1d1SSimon Glass 
2094415f1d1SSimon Glass 	/**
2104415f1d1SSimon Glass 	 * load() - Load the environment from storage
2114415f1d1SSimon Glass 	 *
2124415f1d1SSimon Glass 	 * This method is optional. If not provided, no environment will be
2134415f1d1SSimon Glass 	 * loaded.
214c5951991SSimon Glass 	 *
215c5951991SSimon Glass 	 * @return 0 if OK, -ve on error
2164415f1d1SSimon Glass 	 */
217c5951991SSimon Glass 	int (*load)(void);
2184415f1d1SSimon Glass 
2194415f1d1SSimon Glass 	/**
2204415f1d1SSimon Glass 	 * save() - Save the environment to storage
2214415f1d1SSimon Glass 	 *
2224415f1d1SSimon Glass 	 * This method is required for 'saveenv' to work.
2234415f1d1SSimon Glass 	 *
2244415f1d1SSimon Glass 	 * @return 0 if OK, -ve on error
2254415f1d1SSimon Glass 	 */
2264415f1d1SSimon Glass 	int (*save)(void);
2274415f1d1SSimon Glass 
2284415f1d1SSimon Glass 	/**
2294415f1d1SSimon Glass 	 * init() - Set up the initial pre-relocation environment
2304415f1d1SSimon Glass 	 *
2314415f1d1SSimon Glass 	 * This method is optional.
2324415f1d1SSimon Glass 	 *
2337938822aSSimon Glass 	 * @return 0 if OK, -ENOENT if no initial environment could be found,
2347938822aSSimon Glass 	 * other -ve on error
2354415f1d1SSimon Glass 	 */
2364415f1d1SSimon Glass 	int (*init)(void);
2374415f1d1SSimon Glass };
2384415f1d1SSimon Glass 
2394415f1d1SSimon Glass /* Declare a new environment location driver */
2404415f1d1SSimon Glass #define U_BOOT_ENV_LOCATION(__name)					\
2414415f1d1SSimon Glass 	ll_entry_declare(struct env_driver, __name, env_driver)
2424415f1d1SSimon Glass 
243ac358bebSSimon Glass /* Declare the name of a location */
244ac358bebSSimon Glass #ifdef CONFIG_CMD_SAVEENV
245ac358bebSSimon Glass #define ENV_NAME(_name) .name = _name,
246ac358bebSSimon Glass #else
247ac358bebSSimon Glass #define ENV_NAME(_name)
248ac358bebSSimon Glass #endif
249ac358bebSSimon Glass 
2504415f1d1SSimon Glass #ifdef CONFIG_CMD_SAVEENV
2514415f1d1SSimon Glass #define env_save_ptr(x) x
2524415f1d1SSimon Glass #else
2534415f1d1SSimon Glass #define env_save_ptr(x) NULL
2544415f1d1SSimon Glass #endif
2554415f1d1SSimon Glass 
2562eb1573fSMike Frysinger extern struct hsearch_data env_htab;
2572eb1573fSMike Frysinger 
258a8409f4fSWolfgang Denk /* Function that updates CRC of the enironment */
259a8409f4fSWolfgang Denk void env_crc_update(void);
260a8409f4fSWolfgang Denk 
261267541f7SJoe Hershberger /* Look up the variable from the default environment */
262723806ccSSimon Glass char *env_get_default(const char *name);
263267541f7SJoe Hershberger 
2645bb12dbdSHarald Welte /* [re]set to the default environment */
265*c5d548a9SYaniv Levinsky void set_default_env(const char *s, int flags);
266ea882bafSWolfgang Denk 
267b64b7c3dSGerlando Falauto /* [re]set individual variables to their value in the default environment */
268477f8116SYaniv Levinsky int set_default_vars(int nvars, char * const vars[], int flags);
269b64b7c3dSGerlando Falauto 
270ea882bafSWolfgang Denk /* Import from binary representation into hash table */
271ea882bafSWolfgang Denk int env_import(const char *buf, int check);
2725bb12dbdSHarald Welte 
2737ce1526eSMarek Vasut /* Export from hash table into binary representation */
2747ce1526eSMarek Vasut int env_export(env_t *env_out);
2757ce1526eSMarek Vasut 
27676768f5fSFiach Antaw #ifdef CONFIG_SYS_REDUNDAND_ENVIRONMENT
27776768f5fSFiach Antaw /* Select and import one of two redundant environments */
27831f044bdSSimon Goldschmidt int env_import_redund(const char *buf1, int buf1_status,
27931f044bdSSimon Goldschmidt 		      const char *buf2, int buf2_status);
28076768f5fSFiach Antaw #endif
28176768f5fSFiach Antaw 
282ac358bebSSimon Glass /**
283a69d0f60SSimon Glass  * env_get_char() - Get a character from the early environment
284a69d0f60SSimon Glass  *
285919d25c9SShyam Saini  * This reads from the pre-relocation environment
286a69d0f60SSimon Glass  *
287a69d0f60SSimon Glass  * @index: Index of character to read (0 = first)
288a69d0f60SSimon Glass  * @return character read, or -ve on error
289a69d0f60SSimon Glass  */
290a69d0f60SSimon Glass int env_get_char(int index);
291a69d0f60SSimon Glass 
292310fb14bSSimon Glass /**
293310fb14bSSimon Glass  * env_load() - Load the environment from storage
294310fb14bSSimon Glass  *
295310fb14bSSimon Glass  * @return 0 if OK, -ve on error
296310fb14bSSimon Glass  */
297310fb14bSSimon Glass int env_load(void);
298310fb14bSSimon Glass 
29901510091SSimon Glass /**
30001510091SSimon Glass  * env_save() - Save the environment to storage
30101510091SSimon Glass  *
30201510091SSimon Glass  * @return 0 if OK, -ve on error
30301510091SSimon Glass  */
30401510091SSimon Glass int env_save(void);
30501510091SSimon Glass 
3067bcdf195SSiva Durga Prasad Paladugu /**
3077bcdf195SSiva Durga Prasad Paladugu  * env_fix_drivers() - Updates envdriver as per relocation
3087bcdf195SSiva Durga Prasad Paladugu  */
3097bcdf195SSiva Durga Prasad Paladugu void env_fix_drivers(void);
3107bcdf195SSiva Durga Prasad Paladugu 
3119925f1dbSAlex Kiernan void eth_parse_enetaddr(const char *addr, uint8_t *enetaddr);
3129925f1dbSAlex Kiernan int eth_env_get_enetaddr(const char *name, uint8_t *enetaddr);
3139925f1dbSAlex Kiernan int eth_env_set_enetaddr(const char *name, const uint8_t *enetaddr);
3149925f1dbSAlex Kiernan 
315507651d6SIgor Grinberg #endif /* DO_DEPS_ONLY */
3162eb1573fSMike Frysinger 
317c609719bSwdenk #endif /* _ENVIRONMENT_H_ */
318