xref: /rk3399_rockchip-uboot/include/environment.h (revision 4415f1d1f1c57d43f6bc8ff156554c2b2da45b52)
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 
11fb1c43ccSMaxime Ripard #include <linux/kconfig.h>
12fb1c43ccSMaxime Ripard 
13c609719bSwdenk /**************************************************************************
14c609719bSwdenk  *
15c609719bSwdenk  * The "environment" is stored as a list of '\0' terminated
16c609719bSwdenk  * "name=value" strings. The end of the list is marked by a double
17c609719bSwdenk  * '\0'. New entries are always added at the end. Deleting an entry
18c609719bSwdenk  * shifts the remaining entries to the front. Replacing an entry is a
19c609719bSwdenk  * combination of deleting the old value and adding the new one.
20c609719bSwdenk  *
21fc0b5948SRobert P. J. Day  * The environment is preceded by a 32 bit CRC over the data part.
22c609719bSwdenk  *
23fc0b5948SRobert P. J. Day  *************************************************************************/
24c609719bSwdenk 
255a1aceb0SJean-Christophe PLAGNIOL-VILLARD #if defined(CONFIG_ENV_IS_IN_FLASH)
260e8d1586SJean-Christophe PLAGNIOL-VILLARD # ifndef	CONFIG_ENV_ADDR
276d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #  define	CONFIG_ENV_ADDR	(CONFIG_SYS_FLASH_BASE + CONFIG_ENV_OFFSET)
28c609719bSwdenk # endif
290e8d1586SJean-Christophe PLAGNIOL-VILLARD # ifndef	CONFIG_ENV_OFFSET
306d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #  define	CONFIG_ENV_OFFSET (CONFIG_ENV_ADDR - CONFIG_SYS_FLASH_BASE)
31c609719bSwdenk # endif
320e8d1586SJean-Christophe PLAGNIOL-VILLARD # if !defined(CONFIG_ENV_ADDR_REDUND) && defined(CONFIG_ENV_OFFSET_REDUND)
33507651d6SIgor Grinberg #  define	CONFIG_ENV_ADDR_REDUND	\
34507651d6SIgor Grinberg 		(CONFIG_SYS_FLASH_BASE + CONFIG_ENV_OFFSET_REDUND)
35c609719bSwdenk # endif
360e8d1586SJean-Christophe PLAGNIOL-VILLARD # if defined(CONFIG_ENV_SECT_SIZE) || defined(CONFIG_ENV_SIZE)
370e8d1586SJean-Christophe PLAGNIOL-VILLARD #  ifndef	CONFIG_ENV_SECT_SIZE
380e8d1586SJean-Christophe PLAGNIOL-VILLARD #   define	CONFIG_ENV_SECT_SIZE	CONFIG_ENV_SIZE
39500545ccSwdenk #  endif
400e8d1586SJean-Christophe PLAGNIOL-VILLARD #  ifndef	CONFIG_ENV_SIZE
410e8d1586SJean-Christophe PLAGNIOL-VILLARD #   define	CONFIG_ENV_SIZE	CONFIG_ENV_SECT_SIZE
42c609719bSwdenk #  endif
43500545ccSwdenk # else
440e8d1586SJean-Christophe PLAGNIOL-VILLARD #  error "Both CONFIG_ENV_SECT_SIZE and CONFIG_ENV_SIZE undefined"
45500545ccSwdenk # endif
460e8d1586SJean-Christophe PLAGNIOL-VILLARD # if defined(CONFIG_ENV_ADDR_REDUND) && !defined(CONFIG_ENV_SIZE_REDUND)
470e8d1586SJean-Christophe PLAGNIOL-VILLARD #  define CONFIG_ENV_SIZE_REDUND	CONFIG_ENV_SIZE
48c609719bSwdenk # endif
496d0f6bcfSJean-Christophe PLAGNIOL-VILLARD # if	(CONFIG_ENV_ADDR >= CONFIG_SYS_MONITOR_BASE) &&		\
50507651d6SIgor Grinberg 	(CONFIG_ENV_ADDR + CONFIG_ENV_SIZE) <=			\
51507651d6SIgor Grinberg 	(CONFIG_SYS_MONITOR_BASE + CONFIG_SYS_MONITOR_LEN)
526f403badSIgor Grinberg #  define ENV_IS_EMBEDDED
53c609719bSwdenk # endif
540e8d1586SJean-Christophe PLAGNIOL-VILLARD # if defined(CONFIG_ENV_ADDR_REDUND) || defined(CONFIG_ENV_OFFSET_REDUND)
556f403badSIgor Grinberg #  define CONFIG_SYS_REDUNDAND_ENVIRONMENT
56c609719bSwdenk # endif
570a9e4e77SMike Frysinger # ifdef CONFIG_ENV_IS_EMBEDDED
580a9e4e77SMike Frysinger #  error "do not define CONFIG_ENV_IS_EMBEDDED in your board config"
590a9e4e77SMike Frysinger #  error "it is calculated automatically for you"
600a9e4e77SMike Frysinger # endif
615a1aceb0SJean-Christophe PLAGNIOL-VILLARD #endif	/* CONFIG_ENV_IS_IN_FLASH */
62c609719bSwdenk 
635707df77SBo Shen #if defined(CONFIG_ENV_IS_IN_MMC)
645707df77SBo Shen # ifdef CONFIG_ENV_OFFSET_REDUND
655707df77SBo Shen #  define CONFIG_SYS_REDUNDAND_ENVIRONMENT
665707df77SBo Shen # endif
675707df77SBo Shen #endif
685707df77SBo Shen 
6951bfee19SJean-Christophe PLAGNIOL-VILLARD #if defined(CONFIG_ENV_IS_IN_NAND)
70c9f7351bSBen Gardiner # if defined(CONFIG_ENV_OFFSET_OOB)
71c9f7351bSBen Gardiner #  ifdef CONFIG_ENV_OFFSET_REDUND
72c9f7351bSBen Gardiner #   error "CONFIG_ENV_OFFSET_REDUND is not supported when CONFIG_ENV_OFFSET_OOB"
73c9f7351bSBen Gardiner #   error "is set"
74c9f7351bSBen Gardiner #  endif
75c9f7351bSBen Gardiner extern unsigned long nand_env_oob_offset;
76c9f7351bSBen Gardiner #  define CONFIG_ENV_OFFSET nand_env_oob_offset
77c9f7351bSBen Gardiner # else
780e8d1586SJean-Christophe PLAGNIOL-VILLARD #  ifndef CONFIG_ENV_OFFSET
790e8d1586SJean-Christophe PLAGNIOL-VILLARD #   error "Need to define CONFIG_ENV_OFFSET when using CONFIG_ENV_IS_IN_NAND"
80e443c944SMarkus Klotzbuecher #  endif
810e8d1586SJean-Christophe PLAGNIOL-VILLARD #  ifdef CONFIG_ENV_OFFSET_REDUND
826d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #   define CONFIG_SYS_REDUNDAND_ENVIRONMENT
83e443c944SMarkus Klotzbuecher #  endif
84c9f7351bSBen Gardiner # endif /* CONFIG_ENV_OFFSET_OOB */
85c9f7351bSBen Gardiner # ifndef CONFIG_ENV_SIZE
86c9f7351bSBen Gardiner #  error "Need to define CONFIG_ENV_SIZE when using CONFIG_ENV_IS_IN_NAND"
87c9f7351bSBen Gardiner # endif
8851bfee19SJean-Christophe PLAGNIOL-VILLARD #endif /* CONFIG_ENV_IS_IN_NAND */
89e443c944SMarkus Klotzbuecher 
902b74433fSJoe Hershberger #if defined(CONFIG_ENV_IS_IN_UBI)
912b74433fSJoe Hershberger # ifndef CONFIG_ENV_UBI_PART
922b74433fSJoe Hershberger #  error "Need to define CONFIG_ENV_UBI_PART when using CONFIG_ENV_IS_IN_UBI"
932b74433fSJoe Hershberger # endif
942b74433fSJoe Hershberger # ifndef CONFIG_ENV_UBI_VOLUME
952b74433fSJoe Hershberger #  error "Need to define CONFIG_ENV_UBI_VOLUME when using CONFIG_ENV_IS_IN_UBI"
962b74433fSJoe Hershberger # endif
97785881f7SJoe Hershberger # if defined(CONFIG_ENV_UBI_VOLUME_REDUND)
98785881f7SJoe Hershberger #  define CONFIG_SYS_REDUNDAND_ENVIRONMENT
99785881f7SJoe Hershberger # endif
1002b74433fSJoe Hershberger # ifndef CONFIG_ENV_SIZE
1012b74433fSJoe Hershberger #  error "Need to define CONFIG_ENV_SIZE when using CONFIG_ENV_IS_IN_UBI"
1022b74433fSJoe Hershberger # endif
1032b74433fSJoe Hershberger # ifndef CONFIG_CMD_UBI
1042b74433fSJoe Hershberger #  error "Need to define CONFIG_CMD_UBI when using CONFIG_ENV_IS_IN_UBI"
1052b74433fSJoe Hershberger # endif
1062b74433fSJoe Hershberger #endif /* CONFIG_ENV_IS_IN_UBI */
1072b74433fSJoe Hershberger 
1080a9e4e77SMike Frysinger /* Embedded env is only supported for some flash types */
1090a9e4e77SMike Frysinger #ifdef CONFIG_ENV_IS_EMBEDDED
1100a9e4e77SMike Frysinger # if	!defined(CONFIG_ENV_IS_IN_FLASH)	&& \
1110a9e4e77SMike Frysinger 	!defined(CONFIG_ENV_IS_IN_NAND)		&& \
112efb06339SYoshihiro Shimoda 	!defined(CONFIG_ENV_IS_IN_ONENAND)	&& \
113efb06339SYoshihiro Shimoda 	!defined(CONFIG_ENV_IS_IN_SPI_FLASH)
1140a9e4e77SMike Frysinger #  error "CONFIG_ENV_IS_EMBEDDED not supported for your flash type"
1150a9e4e77SMike Frysinger # endif
1160a9e4e77SMike Frysinger #endif
1170a9e4e77SMike Frysinger 
1180a9e4e77SMike Frysinger /*
1190a9e4e77SMike Frysinger  * For the flash types where embedded env is supported, but it cannot be
1200a9e4e77SMike Frysinger  * calculated automatically (i.e. NAND), take the board opt-in.
1210a9e4e77SMike Frysinger  */
1220a9e4e77SMike Frysinger #if defined(CONFIG_ENV_IS_EMBEDDED) && !defined(ENV_IS_EMBEDDED)
1236f403badSIgor Grinberg # define ENV_IS_EMBEDDED
1240a9e4e77SMike Frysinger #endif
1250a9e4e77SMike Frysinger 
1260a9e4e77SMike Frysinger /* The build system likes to know if the env is embedded */
1270a9e4e77SMike Frysinger #ifdef DO_DEPS_ONLY
1280a9e4e77SMike Frysinger # ifdef ENV_IS_EMBEDDED
12933a6b9e9SWolfgang Denk #  ifndef CONFIG_ENV_IS_EMBEDDED
1300a9e4e77SMike Frysinger #   define CONFIG_ENV_IS_EMBEDDED
1310a9e4e77SMike Frysinger #  endif
1320a9e4e77SMike Frysinger # endif
13333a6b9e9SWolfgang Denk #endif
1340a9e4e77SMike Frysinger 
13537566090SMike Frysinger #include "compiler.h"
136c609719bSwdenk 
1376d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_SYS_REDUNDAND_ENVIRONMENT
13889cdab78SMike Frysinger # define ENV_HEADER_SIZE	(sizeof(uint32_t) + 1)
139b218ccb5SWolfgang Denk 
140b218ccb5SWolfgang Denk # define ACTIVE_FLAG   1
141b218ccb5SWolfgang Denk # define OBSOLETE_FLAG 0
142c609719bSwdenk #else
14389cdab78SMike Frysinger # define ENV_HEADER_SIZE	(sizeof(uint32_t))
144c609719bSwdenk #endif
145c609719bSwdenk 
146d09b1787SIgor Grinberg #if defined(CONFIG_CMD_SAVEENV) && !defined(CONFIG_ENV_IS_NOWHERE)
147d09b1787SIgor Grinberg extern char *env_name_spec;
148d09b1787SIgor Grinberg #endif
149c609719bSwdenk 
150a4223b74SMarek Vasut #ifdef CONFIG_ENV_AES
151a4223b74SMarek Vasut /* Make sure the payload is multiple of AES block size */
152a4223b74SMarek Vasut #define ENV_SIZE ((CONFIG_ENV_SIZE - ENV_HEADER_SIZE) & ~(16 - 1))
153a4223b74SMarek Vasut #else
1540e8d1586SJean-Christophe PLAGNIOL-VILLARD #define ENV_SIZE (CONFIG_ENV_SIZE - ENV_HEADER_SIZE)
155a4223b74SMarek Vasut #endif
156c609719bSwdenk 
157c609719bSwdenk typedef struct environment_s {
15889cdab78SMike Frysinger 	uint32_t	crc;		/* CRC32 over data bytes	*/
1596d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_SYS_REDUNDAND_ENVIRONMENT
160c609719bSwdenk 	unsigned char	flags;		/* active/obsolete flags	*/
161c609719bSwdenk #endif
162c609719bSwdenk 	unsigned char	data[ENV_SIZE]; /* Environment data		*/
163a4223b74SMarek Vasut } env_t
164a4223b74SMarek Vasut #ifdef CONFIG_ENV_AES
165a4223b74SMarek Vasut /* Make sure the env is aligned to block size. */
166a4223b74SMarek Vasut __attribute__((aligned(16)))
167a4223b74SMarek Vasut #endif
168a4223b74SMarek Vasut ;
169c609719bSwdenk 
170994bc671SIgor Grinberg #ifdef ENV_IS_EMBEDDED
171994bc671SIgor Grinberg extern env_t environment;
172994bc671SIgor Grinberg #endif /* ENV_IS_EMBEDDED */
173994bc671SIgor Grinberg 
174d1459f0fSIgor Grinberg extern const unsigned char default_environment[];
17527aafe98SIgor Grinberg extern env_t *env_ptr;
17627aafe98SIgor Grinberg 
17727aafe98SIgor Grinberg extern void env_relocate_spec(void);
17827aafe98SIgor Grinberg extern unsigned char env_get_char_spec(int);
17927aafe98SIgor Grinberg 
18027aafe98SIgor Grinberg #if defined(CONFIG_NEEDS_MANUAL_RELOC)
18127aafe98SIgor Grinberg extern void env_reloc(void);
18227aafe98SIgor Grinberg #endif
183d1459f0fSIgor Grinberg 
184ac77f42dSDmitry Lifshitz #ifdef CONFIG_ENV_IS_IN_MMC
185ac77f42dSDmitry Lifshitz #include <mmc.h>
186ac77f42dSDmitry Lifshitz 
187ac77f42dSDmitry Lifshitz extern int mmc_get_env_addr(struct mmc *mmc, int copy, u32 *env_addr);
1886e7b7df4SDmitry Lifshitz # ifdef CONFIG_SYS_MMC_ENV_PART
1896e7b7df4SDmitry Lifshitz extern uint mmc_get_env_part(struct mmc *mmc);
1906e7b7df4SDmitry Lifshitz # endif
191ac77f42dSDmitry Lifshitz #endif
192ac77f42dSDmitry Lifshitz 
1932eb1573fSMike Frysinger #ifndef DO_DEPS_ONLY
1942eb1573fSMike Frysinger 
195170ab110SJoe Hershberger #include <env_attr.h>
196170ab110SJoe Hershberger #include <env_callback.h>
1972598090bSJoe Hershberger #include <env_flags.h>
1982eb1573fSMike Frysinger #include <search.h>
1992eb1573fSMike Frysinger 
200203e94f6SSimon Glass /* Value for environment validity */
201203e94f6SSimon Glass enum env_valid {
202203e94f6SSimon Glass 	ENV_INVALID,	/* No valid environment */
203203e94f6SSimon Glass 	ENV_VALID,	/* First or only environment is valid */
204203e94f6SSimon Glass 	ENV_REDUND,	/* Redundant environment is valid */
205203e94f6SSimon Glass };
206203e94f6SSimon Glass 
207*4415f1d1SSimon Glass enum env_location {
208*4415f1d1SSimon Glass 	ENVL_DATAFLASH,
209*4415f1d1SSimon Glass 	ENVL_EEPROM,
210*4415f1d1SSimon Glass 	ENVL_EXT4,
211*4415f1d1SSimon Glass 	ENVL_FAT,
212*4415f1d1SSimon Glass 	ENVL_FLASH,
213*4415f1d1SSimon Glass 	ENVL_MMC,
214*4415f1d1SSimon Glass 	ENVL_NAND,
215*4415f1d1SSimon Glass 	ENVL_NVRAM,
216*4415f1d1SSimon Glass 	ENVL_ONENAND,
217*4415f1d1SSimon Glass 	ENVL_REMOTE,
218*4415f1d1SSimon Glass 	ENVL_SPI_FLASH,
219*4415f1d1SSimon Glass 	ENVL_UBI,
220*4415f1d1SSimon Glass 	ENVL_NOWHERE,
221*4415f1d1SSimon Glass 
222*4415f1d1SSimon Glass 	ENVL_COUNT,
223*4415f1d1SSimon Glass 	ENVL_UNKNOWN,
224*4415f1d1SSimon Glass };
225*4415f1d1SSimon Glass 
226*4415f1d1SSimon Glass struct env_driver {
227*4415f1d1SSimon Glass 	enum env_location location;
228*4415f1d1SSimon Glass 
229*4415f1d1SSimon Glass 	/**
230*4415f1d1SSimon Glass 	 * get_char() - Read a character from the environment
231*4415f1d1SSimon Glass 	 *
232*4415f1d1SSimon Glass 	 * This method is optional. If not provided, a default implementation
233*4415f1d1SSimon Glass 	 * will read from gd->env_addr.
234*4415f1d1SSimon Glass 	 *
235*4415f1d1SSimon Glass 	 * @index: Index of character to read (0=first)
236*4415f1d1SSimon Glass 	 * @return character read
237*4415f1d1SSimon Glass 	 */
238*4415f1d1SSimon Glass 	unsigned char (*get_char)(int index);
239*4415f1d1SSimon Glass 
240*4415f1d1SSimon Glass 	/**
241*4415f1d1SSimon Glass 	 * load() - Load the environment from storage
242*4415f1d1SSimon Glass 	 *
243*4415f1d1SSimon Glass 	 * This method is optional. If not provided, no environment will be
244*4415f1d1SSimon Glass 	 * loaded.
245*4415f1d1SSimon Glass 	 */
246*4415f1d1SSimon Glass 	void (*load)(void);
247*4415f1d1SSimon Glass 
248*4415f1d1SSimon Glass 	/**
249*4415f1d1SSimon Glass 	 * save() - Save the environment to storage
250*4415f1d1SSimon Glass 	 *
251*4415f1d1SSimon Glass 	 * This method is required for 'saveenv' to work.
252*4415f1d1SSimon Glass 	 *
253*4415f1d1SSimon Glass 	 * @return 0 if OK, -ve on error
254*4415f1d1SSimon Glass 	 */
255*4415f1d1SSimon Glass 	int (*save)(void);
256*4415f1d1SSimon Glass 
257*4415f1d1SSimon Glass 	/**
258*4415f1d1SSimon Glass 	 * init() - Set up the initial pre-relocation environment
259*4415f1d1SSimon Glass 	 *
260*4415f1d1SSimon Glass 	 * This method is optional.
261*4415f1d1SSimon Glass 	 *
262*4415f1d1SSimon Glass 	 * @return 0 if OK, -ve on error
263*4415f1d1SSimon Glass 	 */
264*4415f1d1SSimon Glass 	int (*init)(void);
265*4415f1d1SSimon Glass };
266*4415f1d1SSimon Glass 
267*4415f1d1SSimon Glass /* Declare a new environment location driver */
268*4415f1d1SSimon Glass #define U_BOOT_ENV_LOCATION(__name)					\
269*4415f1d1SSimon Glass 	ll_entry_declare(struct env_driver, __name, env_driver)
270*4415f1d1SSimon Glass 
271*4415f1d1SSimon Glass #ifdef CONFIG_CMD_SAVEENV
272*4415f1d1SSimon Glass #define env_save_ptr(x) x
273*4415f1d1SSimon Glass #else
274*4415f1d1SSimon Glass #define env_save_ptr(x) NULL
275*4415f1d1SSimon Glass #endif
276*4415f1d1SSimon Glass 
2772eb1573fSMike Frysinger extern struct hsearch_data env_htab;
2782eb1573fSMike Frysinger 
279b502611bSJoakim Tjernlund /* Function that returns a character from the environment */
280b502611bSJoakim Tjernlund unsigned char env_get_char(int);
281a8409f4fSWolfgang Denk 
282a8409f4fSWolfgang Denk /* Function that updates CRC of the enironment */
283a8409f4fSWolfgang Denk void env_crc_update(void);
284a8409f4fSWolfgang Denk 
285267541f7SJoe Hershberger /* Look up the variable from the default environment */
286267541f7SJoe Hershberger char *getenv_default(const char *name);
287267541f7SJoe Hershberger 
2885bb12dbdSHarald Welte /* [re]set to the default environment */
289ea882bafSWolfgang Denk void set_default_env(const char *s);
290ea882bafSWolfgang Denk 
291b64b7c3dSGerlando Falauto /* [re]set individual variables to their value in the default environment */
292b64b7c3dSGerlando Falauto int set_default_vars(int nvars, char * const vars[]);
293b64b7c3dSGerlando Falauto 
294ea882bafSWolfgang Denk /* Import from binary representation into hash table */
295ea882bafSWolfgang Denk int env_import(const char *buf, int check);
2965bb12dbdSHarald Welte 
2977ce1526eSMarek Vasut /* Export from hash table into binary representation */
2987ce1526eSMarek Vasut int env_export(env_t *env_out);
2997ce1526eSMarek Vasut 
30076768f5fSFiach Antaw #ifdef CONFIG_SYS_REDUNDAND_ENVIRONMENT
30176768f5fSFiach Antaw /* Select and import one of two redundant environments */
30276768f5fSFiach Antaw int env_import_redund(const char *buf1, const char *buf2);
30376768f5fSFiach Antaw #endif
30476768f5fSFiach Antaw 
305507651d6SIgor Grinberg #endif /* DO_DEPS_ONLY */
3062eb1573fSMike Frysinger 
307c609719bSwdenk #endif /* _ENVIRONMENT_H_ */
308