xref: /rk3399_rockchip-uboot/include/environment.h (revision 5707df7796f3d2791bdfaa29e682b1d3cc33f90e)
1c609719bSwdenk /*
2c609719bSwdenk  * (C) Copyright 2002
3c609719bSwdenk  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
4c609719bSwdenk  *
5c609719bSwdenk  * See file CREDITS for list of people who contributed to this
6c609719bSwdenk  * project.
7c609719bSwdenk  *
8c609719bSwdenk  * This program is free software; you can redistribute it and/or
9c609719bSwdenk  * modify it under the terms of the GNU General Public License as
10c609719bSwdenk  * published by the Free Software Foundation; either version 2 of
11c609719bSwdenk  * the License, or (at your option) any later version.
12c609719bSwdenk  *
13c609719bSwdenk  * This program is distributed in the hope that it will be useful,
14c609719bSwdenk  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15c609719bSwdenk  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16c609719bSwdenk  * GNU General Public License for more details.
17c609719bSwdenk  *
18c609719bSwdenk  * You should have received a copy of the GNU General Public License
19c609719bSwdenk  * along with this program; if not, write to the Free Software
20c609719bSwdenk  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
21c609719bSwdenk  * MA 02111-1307 USA
22c609719bSwdenk  */
23c609719bSwdenk 
24c609719bSwdenk #ifndef _ENVIRONMENT_H_
256f403badSIgor Grinberg #define _ENVIRONMENT_H_
26c609719bSwdenk 
27c609719bSwdenk /**************************************************************************
28c609719bSwdenk  *
29c609719bSwdenk  * The "environment" is stored as a list of '\0' terminated
30c609719bSwdenk  * "name=value" strings. The end of the list is marked by a double
31c609719bSwdenk  * '\0'. New entries are always added at the end. Deleting an entry
32c609719bSwdenk  * shifts the remaining entries to the front. Replacing an entry is a
33c609719bSwdenk  * combination of deleting the old value and adding the new one.
34c609719bSwdenk  *
35c609719bSwdenk  * The environment is preceeded by a 32 bit CRC over the data part.
36c609719bSwdenk  *
37c609719bSwdenk  **************************************************************************
38c609719bSwdenk  */
39c609719bSwdenk 
405a1aceb0SJean-Christophe PLAGNIOL-VILLARD #if defined(CONFIG_ENV_IS_IN_FLASH)
410e8d1586SJean-Christophe PLAGNIOL-VILLARD # ifndef	CONFIG_ENV_ADDR
426d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #  define	CONFIG_ENV_ADDR	(CONFIG_SYS_FLASH_BASE + CONFIG_ENV_OFFSET)
43c609719bSwdenk # endif
440e8d1586SJean-Christophe PLAGNIOL-VILLARD # ifndef	CONFIG_ENV_OFFSET
456d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #  define	CONFIG_ENV_OFFSET (CONFIG_ENV_ADDR - CONFIG_SYS_FLASH_BASE)
46c609719bSwdenk # endif
470e8d1586SJean-Christophe PLAGNIOL-VILLARD # if !defined(CONFIG_ENV_ADDR_REDUND) && defined(CONFIG_ENV_OFFSET_REDUND)
48507651d6SIgor Grinberg #  define	CONFIG_ENV_ADDR_REDUND	\
49507651d6SIgor Grinberg 		(CONFIG_SYS_FLASH_BASE + CONFIG_ENV_OFFSET_REDUND)
50c609719bSwdenk # endif
510e8d1586SJean-Christophe PLAGNIOL-VILLARD # if defined(CONFIG_ENV_SECT_SIZE) || defined(CONFIG_ENV_SIZE)
520e8d1586SJean-Christophe PLAGNIOL-VILLARD #  ifndef	CONFIG_ENV_SECT_SIZE
530e8d1586SJean-Christophe PLAGNIOL-VILLARD #   define	CONFIG_ENV_SECT_SIZE	CONFIG_ENV_SIZE
54500545ccSwdenk #  endif
550e8d1586SJean-Christophe PLAGNIOL-VILLARD #  ifndef	CONFIG_ENV_SIZE
560e8d1586SJean-Christophe PLAGNIOL-VILLARD #   define	CONFIG_ENV_SIZE	CONFIG_ENV_SECT_SIZE
57c609719bSwdenk #  endif
58500545ccSwdenk # else
590e8d1586SJean-Christophe PLAGNIOL-VILLARD #  error "Both CONFIG_ENV_SECT_SIZE and CONFIG_ENV_SIZE undefined"
60500545ccSwdenk # endif
610e8d1586SJean-Christophe PLAGNIOL-VILLARD # if defined(CONFIG_ENV_ADDR_REDUND) && !defined(CONFIG_ENV_SIZE_REDUND)
620e8d1586SJean-Christophe PLAGNIOL-VILLARD #  define CONFIG_ENV_SIZE_REDUND	CONFIG_ENV_SIZE
63c609719bSwdenk # endif
646d0f6bcfSJean-Christophe PLAGNIOL-VILLARD # if	(CONFIG_ENV_ADDR >= CONFIG_SYS_MONITOR_BASE) &&		\
65507651d6SIgor Grinberg 	(CONFIG_ENV_ADDR + CONFIG_ENV_SIZE) <=			\
66507651d6SIgor Grinberg 	(CONFIG_SYS_MONITOR_BASE + CONFIG_SYS_MONITOR_LEN)
676f403badSIgor Grinberg #  define ENV_IS_EMBEDDED
68c609719bSwdenk # endif
690e8d1586SJean-Christophe PLAGNIOL-VILLARD # if defined(CONFIG_ENV_ADDR_REDUND) || defined(CONFIG_ENV_OFFSET_REDUND)
706f403badSIgor Grinberg #  define CONFIG_SYS_REDUNDAND_ENVIRONMENT
71c609719bSwdenk # endif
720a9e4e77SMike Frysinger # ifdef CONFIG_ENV_IS_EMBEDDED
730a9e4e77SMike Frysinger #  error "do not define CONFIG_ENV_IS_EMBEDDED in your board config"
740a9e4e77SMike Frysinger #  error "it is calculated automatically for you"
750a9e4e77SMike Frysinger # endif
765a1aceb0SJean-Christophe PLAGNIOL-VILLARD #endif	/* CONFIG_ENV_IS_IN_FLASH */
77c609719bSwdenk 
78*5707df77SBo Shen #if defined(CONFIG_ENV_IS_IN_MMC)
79*5707df77SBo Shen # ifdef CONFIG_ENV_OFFSET_REDUND
80*5707df77SBo Shen #  define CONFIG_SYS_REDUNDAND_ENVIRONMENT
81*5707df77SBo Shen # endif
82*5707df77SBo Shen #endif
83*5707df77SBo Shen 
8451bfee19SJean-Christophe PLAGNIOL-VILLARD #if defined(CONFIG_ENV_IS_IN_NAND)
85c9f7351bSBen Gardiner # if defined(CONFIG_ENV_OFFSET_OOB)
86c9f7351bSBen Gardiner #  ifdef CONFIG_ENV_OFFSET_REDUND
87c9f7351bSBen Gardiner #   error "CONFIG_ENV_OFFSET_REDUND is not supported when CONFIG_ENV_OFFSET_OOB"
88c9f7351bSBen Gardiner #   error "is set"
89c9f7351bSBen Gardiner #  endif
90c9f7351bSBen Gardiner extern unsigned long nand_env_oob_offset;
91c9f7351bSBen Gardiner #  define CONFIG_ENV_OFFSET nand_env_oob_offset
92c9f7351bSBen Gardiner # else
930e8d1586SJean-Christophe PLAGNIOL-VILLARD #  ifndef CONFIG_ENV_OFFSET
940e8d1586SJean-Christophe PLAGNIOL-VILLARD #   error "Need to define CONFIG_ENV_OFFSET when using CONFIG_ENV_IS_IN_NAND"
95e443c944SMarkus Klotzbuecher #  endif
960e8d1586SJean-Christophe PLAGNIOL-VILLARD #  ifdef CONFIG_ENV_OFFSET_REDUND
976d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #   define CONFIG_SYS_REDUNDAND_ENVIRONMENT
98e443c944SMarkus Klotzbuecher #  endif
99c9f7351bSBen Gardiner # endif /* CONFIG_ENV_OFFSET_OOB */
100c9f7351bSBen Gardiner # ifndef CONFIG_ENV_SIZE
101c9f7351bSBen Gardiner #  error "Need to define CONFIG_ENV_SIZE when using CONFIG_ENV_IS_IN_NAND"
102c9f7351bSBen Gardiner # endif
10351bfee19SJean-Christophe PLAGNIOL-VILLARD #endif /* CONFIG_ENV_IS_IN_NAND */
104e443c944SMarkus Klotzbuecher 
1052b74433fSJoe Hershberger #if defined(CONFIG_ENV_IS_IN_UBI)
1062b74433fSJoe Hershberger # ifndef CONFIG_ENV_UBI_PART
1072b74433fSJoe Hershberger #  error "Need to define CONFIG_ENV_UBI_PART when using CONFIG_ENV_IS_IN_UBI"
1082b74433fSJoe Hershberger # endif
1092b74433fSJoe Hershberger # ifndef CONFIG_ENV_UBI_VOLUME
1102b74433fSJoe Hershberger #  error "Need to define CONFIG_ENV_UBI_VOLUME when using CONFIG_ENV_IS_IN_UBI"
1112b74433fSJoe Hershberger # endif
112785881f7SJoe Hershberger # if defined(CONFIG_ENV_UBI_VOLUME_REDUND)
113785881f7SJoe Hershberger #  define CONFIG_SYS_REDUNDAND_ENVIRONMENT
114785881f7SJoe Hershberger # endif
1152b74433fSJoe Hershberger # ifndef CONFIG_ENV_SIZE
1162b74433fSJoe Hershberger #  error "Need to define CONFIG_ENV_SIZE when using CONFIG_ENV_IS_IN_UBI"
1172b74433fSJoe Hershberger # endif
1182b74433fSJoe Hershberger # ifndef CONFIG_CMD_UBI
1192b74433fSJoe Hershberger #  error "Need to define CONFIG_CMD_UBI when using CONFIG_ENV_IS_IN_UBI"
1202b74433fSJoe Hershberger # endif
1212b74433fSJoe Hershberger #endif /* CONFIG_ENV_IS_IN_UBI */
1222b74433fSJoe Hershberger 
1230a9e4e77SMike Frysinger /* Embedded env is only supported for some flash types */
1240a9e4e77SMike Frysinger #ifdef CONFIG_ENV_IS_EMBEDDED
1250a9e4e77SMike Frysinger # if	!defined(CONFIG_ENV_IS_IN_FLASH)	&& \
1260a9e4e77SMike Frysinger 	!defined(CONFIG_ENV_IS_IN_NAND)		&& \
127efb06339SYoshihiro Shimoda 	!defined(CONFIG_ENV_IS_IN_ONENAND)	&& \
128efb06339SYoshihiro Shimoda 	!defined(CONFIG_ENV_IS_IN_SPI_FLASH)
1290a9e4e77SMike Frysinger #  error "CONFIG_ENV_IS_EMBEDDED not supported for your flash type"
1300a9e4e77SMike Frysinger # endif
1310a9e4e77SMike Frysinger #endif
1320a9e4e77SMike Frysinger 
1330a9e4e77SMike Frysinger /*
1340a9e4e77SMike Frysinger  * For the flash types where embedded env is supported, but it cannot be
1350a9e4e77SMike Frysinger  * calculated automatically (i.e. NAND), take the board opt-in.
1360a9e4e77SMike Frysinger  */
1370a9e4e77SMike Frysinger #if defined(CONFIG_ENV_IS_EMBEDDED) && !defined(ENV_IS_EMBEDDED)
1386f403badSIgor Grinberg # define ENV_IS_EMBEDDED
1390a9e4e77SMike Frysinger #endif
1400a9e4e77SMike Frysinger 
1410a9e4e77SMike Frysinger /* The build system likes to know if the env is embedded */
1420a9e4e77SMike Frysinger #ifdef DO_DEPS_ONLY
1430a9e4e77SMike Frysinger # ifdef ENV_IS_EMBEDDED
14433a6b9e9SWolfgang Denk #  ifndef CONFIG_ENV_IS_EMBEDDED
1450a9e4e77SMike Frysinger #   define CONFIG_ENV_IS_EMBEDDED
1460a9e4e77SMike Frysinger #  endif
1470a9e4e77SMike Frysinger # endif
14833a6b9e9SWolfgang Denk #endif
1490a9e4e77SMike Frysinger 
15037566090SMike Frysinger #include "compiler.h"
151c609719bSwdenk 
1526d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_SYS_REDUNDAND_ENVIRONMENT
15389cdab78SMike Frysinger # define ENV_HEADER_SIZE	(sizeof(uint32_t) + 1)
154b218ccb5SWolfgang Denk 
155b218ccb5SWolfgang Denk # define ACTIVE_FLAG   1
156b218ccb5SWolfgang Denk # define OBSOLETE_FLAG 0
157c609719bSwdenk #else
15889cdab78SMike Frysinger # define ENV_HEADER_SIZE	(sizeof(uint32_t))
159c609719bSwdenk #endif
160c609719bSwdenk 
161d09b1787SIgor Grinberg #if defined(CONFIG_CMD_SAVEENV) && !defined(CONFIG_ENV_IS_NOWHERE)
162d09b1787SIgor Grinberg extern char *env_name_spec;
163d09b1787SIgor Grinberg #endif
164c609719bSwdenk 
1650e8d1586SJean-Christophe PLAGNIOL-VILLARD #define ENV_SIZE (CONFIG_ENV_SIZE - ENV_HEADER_SIZE)
166c609719bSwdenk 
167c609719bSwdenk typedef struct environment_s {
16889cdab78SMike Frysinger 	uint32_t	crc;		/* CRC32 over data bytes	*/
1696d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_SYS_REDUNDAND_ENVIRONMENT
170c609719bSwdenk 	unsigned char	flags;		/* active/obsolete flags	*/
171c609719bSwdenk #endif
172c609719bSwdenk 	unsigned char	data[ENV_SIZE]; /* Environment data		*/
173c609719bSwdenk } env_t;
174c609719bSwdenk 
175994bc671SIgor Grinberg #ifdef ENV_IS_EMBEDDED
176994bc671SIgor Grinberg extern env_t environment;
177994bc671SIgor Grinberg #endif /* ENV_IS_EMBEDDED */
178994bc671SIgor Grinberg 
179d1459f0fSIgor Grinberg extern const unsigned char default_environment[];
18027aafe98SIgor Grinberg extern env_t *env_ptr;
18127aafe98SIgor Grinberg 
18227aafe98SIgor Grinberg extern void env_relocate_spec(void);
18327aafe98SIgor Grinberg extern unsigned char env_get_char_spec(int);
18427aafe98SIgor Grinberg 
18527aafe98SIgor Grinberg #if defined(CONFIG_NEEDS_MANUAL_RELOC)
18627aafe98SIgor Grinberg extern void env_reloc(void);
18727aafe98SIgor Grinberg #endif
188d1459f0fSIgor Grinberg 
1892eb1573fSMike Frysinger #ifndef DO_DEPS_ONLY
1902eb1573fSMike Frysinger 
191170ab110SJoe Hershberger #include <env_attr.h>
192170ab110SJoe Hershberger #include <env_callback.h>
1932598090bSJoe Hershberger #include <env_flags.h>
1942eb1573fSMike Frysinger #include <search.h>
1952eb1573fSMike Frysinger 
1962eb1573fSMike Frysinger extern struct hsearch_data env_htab;
1972eb1573fSMike Frysinger 
198b502611bSJoakim Tjernlund /* Function that returns a character from the environment */
199b502611bSJoakim Tjernlund unsigned char env_get_char(int);
200a8409f4fSWolfgang Denk 
201a8409f4fSWolfgang Denk /* Function that returns a pointer to a value from the environment */
202147c7169SMike Frysinger const unsigned char *env_get_addr(int);
203a8409f4fSWolfgang Denk unsigned char env_get_char_memory(int index);
204a8409f4fSWolfgang Denk 
205a8409f4fSWolfgang Denk /* Function that updates CRC of the enironment */
206a8409f4fSWolfgang Denk void env_crc_update(void);
207a8409f4fSWolfgang Denk 
208267541f7SJoe Hershberger /* Look up the variable from the default environment */
209267541f7SJoe Hershberger char *getenv_default(const char *name);
210267541f7SJoe Hershberger 
2115bb12dbdSHarald Welte /* [re]set to the default environment */
212ea882bafSWolfgang Denk void set_default_env(const char *s);
213ea882bafSWolfgang Denk 
214b64b7c3dSGerlando Falauto /* [re]set individual variables to their value in the default environment */
215b64b7c3dSGerlando Falauto int set_default_vars(int nvars, char * const vars[]);
216b64b7c3dSGerlando Falauto 
217ea882bafSWolfgang Denk /* Import from binary representation into hash table */
218ea882bafSWolfgang Denk int env_import(const char *buf, int check);
2195bb12dbdSHarald Welte 
220507651d6SIgor Grinberg #endif /* DO_DEPS_ONLY */
2212eb1573fSMike Frysinger 
222c609719bSwdenk #endif /* _ENVIRONMENT_H_ */
223