xref: /rk3399_rockchip-uboot/include/environment.h (revision fc0b5948e0c15a3aebbe1f409665af30b3ae5ba3)
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 
11c609719bSwdenk /**************************************************************************
12c609719bSwdenk  *
13c609719bSwdenk  * The "environment" is stored as a list of '\0' terminated
14c609719bSwdenk  * "name=value" strings. The end of the list is marked by a double
15c609719bSwdenk  * '\0'. New entries are always added at the end. Deleting an entry
16c609719bSwdenk  * shifts the remaining entries to the front. Replacing an entry is a
17c609719bSwdenk  * combination of deleting the old value and adding the new one.
18c609719bSwdenk  *
19*fc0b5948SRobert P. J. Day  * The environment is preceded by a 32 bit CRC over the data part.
20c609719bSwdenk  *
21*fc0b5948SRobert P. J. Day  *************************************************************************/
22c609719bSwdenk 
235a1aceb0SJean-Christophe PLAGNIOL-VILLARD #if defined(CONFIG_ENV_IS_IN_FLASH)
240e8d1586SJean-Christophe PLAGNIOL-VILLARD # ifndef	CONFIG_ENV_ADDR
256d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #  define	CONFIG_ENV_ADDR	(CONFIG_SYS_FLASH_BASE + CONFIG_ENV_OFFSET)
26c609719bSwdenk # endif
270e8d1586SJean-Christophe PLAGNIOL-VILLARD # ifndef	CONFIG_ENV_OFFSET
286d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #  define	CONFIG_ENV_OFFSET (CONFIG_ENV_ADDR - CONFIG_SYS_FLASH_BASE)
29c609719bSwdenk # endif
300e8d1586SJean-Christophe PLAGNIOL-VILLARD # if !defined(CONFIG_ENV_ADDR_REDUND) && defined(CONFIG_ENV_OFFSET_REDUND)
31507651d6SIgor Grinberg #  define	CONFIG_ENV_ADDR_REDUND	\
32507651d6SIgor Grinberg 		(CONFIG_SYS_FLASH_BASE + CONFIG_ENV_OFFSET_REDUND)
33c609719bSwdenk # endif
340e8d1586SJean-Christophe PLAGNIOL-VILLARD # if defined(CONFIG_ENV_SECT_SIZE) || defined(CONFIG_ENV_SIZE)
350e8d1586SJean-Christophe PLAGNIOL-VILLARD #  ifndef	CONFIG_ENV_SECT_SIZE
360e8d1586SJean-Christophe PLAGNIOL-VILLARD #   define	CONFIG_ENV_SECT_SIZE	CONFIG_ENV_SIZE
37500545ccSwdenk #  endif
380e8d1586SJean-Christophe PLAGNIOL-VILLARD #  ifndef	CONFIG_ENV_SIZE
390e8d1586SJean-Christophe PLAGNIOL-VILLARD #   define	CONFIG_ENV_SIZE	CONFIG_ENV_SECT_SIZE
40c609719bSwdenk #  endif
41500545ccSwdenk # else
420e8d1586SJean-Christophe PLAGNIOL-VILLARD #  error "Both CONFIG_ENV_SECT_SIZE and CONFIG_ENV_SIZE undefined"
43500545ccSwdenk # endif
440e8d1586SJean-Christophe PLAGNIOL-VILLARD # if defined(CONFIG_ENV_ADDR_REDUND) && !defined(CONFIG_ENV_SIZE_REDUND)
450e8d1586SJean-Christophe PLAGNIOL-VILLARD #  define CONFIG_ENV_SIZE_REDUND	CONFIG_ENV_SIZE
46c609719bSwdenk # endif
476d0f6bcfSJean-Christophe PLAGNIOL-VILLARD # if	(CONFIG_ENV_ADDR >= CONFIG_SYS_MONITOR_BASE) &&		\
48507651d6SIgor Grinberg 	(CONFIG_ENV_ADDR + CONFIG_ENV_SIZE) <=			\
49507651d6SIgor Grinberg 	(CONFIG_SYS_MONITOR_BASE + CONFIG_SYS_MONITOR_LEN)
506f403badSIgor Grinberg #  define ENV_IS_EMBEDDED
51c609719bSwdenk # endif
520e8d1586SJean-Christophe PLAGNIOL-VILLARD # if defined(CONFIG_ENV_ADDR_REDUND) || defined(CONFIG_ENV_OFFSET_REDUND)
536f403badSIgor Grinberg #  define CONFIG_SYS_REDUNDAND_ENVIRONMENT
54c609719bSwdenk # endif
550a9e4e77SMike Frysinger # ifdef CONFIG_ENV_IS_EMBEDDED
560a9e4e77SMike Frysinger #  error "do not define CONFIG_ENV_IS_EMBEDDED in your board config"
570a9e4e77SMike Frysinger #  error "it is calculated automatically for you"
580a9e4e77SMike Frysinger # endif
595a1aceb0SJean-Christophe PLAGNIOL-VILLARD #endif	/* CONFIG_ENV_IS_IN_FLASH */
60c609719bSwdenk 
615707df77SBo Shen #if defined(CONFIG_ENV_IS_IN_MMC)
625707df77SBo Shen # ifdef CONFIG_ENV_OFFSET_REDUND
635707df77SBo Shen #  define CONFIG_SYS_REDUNDAND_ENVIRONMENT
645707df77SBo Shen # endif
655707df77SBo Shen #endif
665707df77SBo Shen 
6751bfee19SJean-Christophe PLAGNIOL-VILLARD #if defined(CONFIG_ENV_IS_IN_NAND)
68c9f7351bSBen Gardiner # if defined(CONFIG_ENV_OFFSET_OOB)
69c9f7351bSBen Gardiner #  ifdef CONFIG_ENV_OFFSET_REDUND
70c9f7351bSBen Gardiner #   error "CONFIG_ENV_OFFSET_REDUND is not supported when CONFIG_ENV_OFFSET_OOB"
71c9f7351bSBen Gardiner #   error "is set"
72c9f7351bSBen Gardiner #  endif
73c9f7351bSBen Gardiner extern unsigned long nand_env_oob_offset;
74c9f7351bSBen Gardiner #  define CONFIG_ENV_OFFSET nand_env_oob_offset
75c9f7351bSBen Gardiner # else
760e8d1586SJean-Christophe PLAGNIOL-VILLARD #  ifndef CONFIG_ENV_OFFSET
770e8d1586SJean-Christophe PLAGNIOL-VILLARD #   error "Need to define CONFIG_ENV_OFFSET when using CONFIG_ENV_IS_IN_NAND"
78e443c944SMarkus Klotzbuecher #  endif
790e8d1586SJean-Christophe PLAGNIOL-VILLARD #  ifdef CONFIG_ENV_OFFSET_REDUND
806d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #   define CONFIG_SYS_REDUNDAND_ENVIRONMENT
81e443c944SMarkus Klotzbuecher #  endif
82c9f7351bSBen Gardiner # endif /* CONFIG_ENV_OFFSET_OOB */
83c9f7351bSBen Gardiner # ifndef CONFIG_ENV_SIZE
84c9f7351bSBen Gardiner #  error "Need to define CONFIG_ENV_SIZE when using CONFIG_ENV_IS_IN_NAND"
85c9f7351bSBen Gardiner # endif
8651bfee19SJean-Christophe PLAGNIOL-VILLARD #endif /* CONFIG_ENV_IS_IN_NAND */
87e443c944SMarkus Klotzbuecher 
882b74433fSJoe Hershberger #if defined(CONFIG_ENV_IS_IN_UBI)
892b74433fSJoe Hershberger # ifndef CONFIG_ENV_UBI_PART
902b74433fSJoe Hershberger #  error "Need to define CONFIG_ENV_UBI_PART when using CONFIG_ENV_IS_IN_UBI"
912b74433fSJoe Hershberger # endif
922b74433fSJoe Hershberger # ifndef CONFIG_ENV_UBI_VOLUME
932b74433fSJoe Hershberger #  error "Need to define CONFIG_ENV_UBI_VOLUME when using CONFIG_ENV_IS_IN_UBI"
942b74433fSJoe Hershberger # endif
95785881f7SJoe Hershberger # if defined(CONFIG_ENV_UBI_VOLUME_REDUND)
96785881f7SJoe Hershberger #  define CONFIG_SYS_REDUNDAND_ENVIRONMENT
97785881f7SJoe Hershberger # endif
982b74433fSJoe Hershberger # ifndef CONFIG_ENV_SIZE
992b74433fSJoe Hershberger #  error "Need to define CONFIG_ENV_SIZE when using CONFIG_ENV_IS_IN_UBI"
1002b74433fSJoe Hershberger # endif
1012b74433fSJoe Hershberger # ifndef CONFIG_CMD_UBI
1022b74433fSJoe Hershberger #  error "Need to define CONFIG_CMD_UBI when using CONFIG_ENV_IS_IN_UBI"
1032b74433fSJoe Hershberger # endif
1042b74433fSJoe Hershberger #endif /* CONFIG_ENV_IS_IN_UBI */
1052b74433fSJoe Hershberger 
1060a9e4e77SMike Frysinger /* Embedded env is only supported for some flash types */
1070a9e4e77SMike Frysinger #ifdef CONFIG_ENV_IS_EMBEDDED
1080a9e4e77SMike Frysinger # if	!defined(CONFIG_ENV_IS_IN_FLASH)	&& \
1090a9e4e77SMike Frysinger 	!defined(CONFIG_ENV_IS_IN_NAND)		&& \
110efb06339SYoshihiro Shimoda 	!defined(CONFIG_ENV_IS_IN_ONENAND)	&& \
111efb06339SYoshihiro Shimoda 	!defined(CONFIG_ENV_IS_IN_SPI_FLASH)
1120a9e4e77SMike Frysinger #  error "CONFIG_ENV_IS_EMBEDDED not supported for your flash type"
1130a9e4e77SMike Frysinger # endif
1140a9e4e77SMike Frysinger #endif
1150a9e4e77SMike Frysinger 
1160a9e4e77SMike Frysinger /*
1170a9e4e77SMike Frysinger  * For the flash types where embedded env is supported, but it cannot be
1180a9e4e77SMike Frysinger  * calculated automatically (i.e. NAND), take the board opt-in.
1190a9e4e77SMike Frysinger  */
1200a9e4e77SMike Frysinger #if defined(CONFIG_ENV_IS_EMBEDDED) && !defined(ENV_IS_EMBEDDED)
1216f403badSIgor Grinberg # define ENV_IS_EMBEDDED
1220a9e4e77SMike Frysinger #endif
1230a9e4e77SMike Frysinger 
1240a9e4e77SMike Frysinger /* The build system likes to know if the env is embedded */
1250a9e4e77SMike Frysinger #ifdef DO_DEPS_ONLY
1260a9e4e77SMike Frysinger # ifdef ENV_IS_EMBEDDED
12733a6b9e9SWolfgang Denk #  ifndef CONFIG_ENV_IS_EMBEDDED
1280a9e4e77SMike Frysinger #   define CONFIG_ENV_IS_EMBEDDED
1290a9e4e77SMike Frysinger #  endif
1300a9e4e77SMike Frysinger # endif
13133a6b9e9SWolfgang Denk #endif
1320a9e4e77SMike Frysinger 
13337566090SMike Frysinger #include "compiler.h"
134c609719bSwdenk 
1356d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_SYS_REDUNDAND_ENVIRONMENT
13689cdab78SMike Frysinger # define ENV_HEADER_SIZE	(sizeof(uint32_t) + 1)
137b218ccb5SWolfgang Denk 
138b218ccb5SWolfgang Denk # define ACTIVE_FLAG   1
139b218ccb5SWolfgang Denk # define OBSOLETE_FLAG 0
140c609719bSwdenk #else
14189cdab78SMike Frysinger # define ENV_HEADER_SIZE	(sizeof(uint32_t))
142c609719bSwdenk #endif
143c609719bSwdenk 
144d09b1787SIgor Grinberg #if defined(CONFIG_CMD_SAVEENV) && !defined(CONFIG_ENV_IS_NOWHERE)
145d09b1787SIgor Grinberg extern char *env_name_spec;
146d09b1787SIgor Grinberg #endif
147c609719bSwdenk 
148a4223b74SMarek Vasut #ifdef CONFIG_ENV_AES
149a4223b74SMarek Vasut /* Make sure the payload is multiple of AES block size */
150a4223b74SMarek Vasut #define ENV_SIZE ((CONFIG_ENV_SIZE - ENV_HEADER_SIZE) & ~(16 - 1))
151a4223b74SMarek Vasut #else
1520e8d1586SJean-Christophe PLAGNIOL-VILLARD #define ENV_SIZE (CONFIG_ENV_SIZE - ENV_HEADER_SIZE)
153a4223b74SMarek Vasut #endif
154c609719bSwdenk 
155c609719bSwdenk typedef struct environment_s {
15689cdab78SMike Frysinger 	uint32_t	crc;		/* CRC32 over data bytes	*/
1576d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_SYS_REDUNDAND_ENVIRONMENT
158c609719bSwdenk 	unsigned char	flags;		/* active/obsolete flags	*/
159c609719bSwdenk #endif
160c609719bSwdenk 	unsigned char	data[ENV_SIZE]; /* Environment data		*/
161a4223b74SMarek Vasut } env_t
162a4223b74SMarek Vasut #ifdef CONFIG_ENV_AES
163a4223b74SMarek Vasut /* Make sure the env is aligned to block size. */
164a4223b74SMarek Vasut __attribute__((aligned(16)))
165a4223b74SMarek Vasut #endif
166a4223b74SMarek Vasut ;
167c609719bSwdenk 
168994bc671SIgor Grinberg #ifdef ENV_IS_EMBEDDED
169994bc671SIgor Grinberg extern env_t environment;
170994bc671SIgor Grinberg #endif /* ENV_IS_EMBEDDED */
171994bc671SIgor Grinberg 
172d1459f0fSIgor Grinberg extern const unsigned char default_environment[];
17327aafe98SIgor Grinberg extern env_t *env_ptr;
17427aafe98SIgor Grinberg 
17527aafe98SIgor Grinberg extern void env_relocate_spec(void);
17627aafe98SIgor Grinberg extern unsigned char env_get_char_spec(int);
17727aafe98SIgor Grinberg 
17827aafe98SIgor Grinberg #if defined(CONFIG_NEEDS_MANUAL_RELOC)
17927aafe98SIgor Grinberg extern void env_reloc(void);
18027aafe98SIgor Grinberg #endif
181d1459f0fSIgor Grinberg 
182ac77f42dSDmitry Lifshitz #ifdef CONFIG_ENV_IS_IN_MMC
183ac77f42dSDmitry Lifshitz #include <mmc.h>
184ac77f42dSDmitry Lifshitz 
185ac77f42dSDmitry Lifshitz extern int mmc_get_env_addr(struct mmc *mmc, int copy, u32 *env_addr);
1866e7b7df4SDmitry Lifshitz # ifdef CONFIG_SYS_MMC_ENV_PART
1876e7b7df4SDmitry Lifshitz extern uint mmc_get_env_part(struct mmc *mmc);
1886e7b7df4SDmitry Lifshitz # endif
189ac77f42dSDmitry Lifshitz #endif
190ac77f42dSDmitry Lifshitz 
1912eb1573fSMike Frysinger #ifndef DO_DEPS_ONLY
1922eb1573fSMike Frysinger 
193170ab110SJoe Hershberger #include <env_attr.h>
194170ab110SJoe Hershberger #include <env_callback.h>
1952598090bSJoe Hershberger #include <env_flags.h>
1962eb1573fSMike Frysinger #include <search.h>
1972eb1573fSMike Frysinger 
1982eb1573fSMike Frysinger extern struct hsearch_data env_htab;
1992eb1573fSMike Frysinger 
200b502611bSJoakim Tjernlund /* Function that returns a character from the environment */
201b502611bSJoakim Tjernlund unsigned char env_get_char(int);
202a8409f4fSWolfgang Denk 
203a8409f4fSWolfgang Denk /* Function that returns a pointer to a value from the environment */
204147c7169SMike Frysinger const unsigned char *env_get_addr(int);
205a8409f4fSWolfgang Denk unsigned char env_get_char_memory(int index);
206a8409f4fSWolfgang Denk 
207a8409f4fSWolfgang Denk /* Function that updates CRC of the enironment */
208a8409f4fSWolfgang Denk void env_crc_update(void);
209a8409f4fSWolfgang Denk 
210267541f7SJoe Hershberger /* Look up the variable from the default environment */
211267541f7SJoe Hershberger char *getenv_default(const char *name);
212267541f7SJoe Hershberger 
2135bb12dbdSHarald Welte /* [re]set to the default environment */
214ea882bafSWolfgang Denk void set_default_env(const char *s);
215ea882bafSWolfgang Denk 
216b64b7c3dSGerlando Falauto /* [re]set individual variables to their value in the default environment */
217b64b7c3dSGerlando Falauto int set_default_vars(int nvars, char * const vars[]);
218b64b7c3dSGerlando Falauto 
219ea882bafSWolfgang Denk /* Import from binary representation into hash table */
220ea882bafSWolfgang Denk int env_import(const char *buf, int check);
2215bb12dbdSHarald Welte 
2227ce1526eSMarek Vasut /* Export from hash table into binary representation */
2237ce1526eSMarek Vasut int env_export(env_t *env_out);
2247ce1526eSMarek Vasut 
225507651d6SIgor Grinberg #endif /* DO_DEPS_ONLY */
2262eb1573fSMike Frysinger 
227c609719bSwdenk #endif /* _ENVIRONMENT_H_ */
228