xref: /openbmc/u-boot/include/environment.h (revision 7d3ca0f8)
1  /*
2   * (C) Copyright 2002
3   * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
4   *
5   * SPDX-License-Identifier:	GPL-2.0+
6   */
7  
8  #ifndef _ENVIRONMENT_H_
9  #define _ENVIRONMENT_H_
10  
11  /**************************************************************************
12   *
13   * The "environment" is stored as a list of '\0' terminated
14   * "name=value" strings. The end of the list is marked by a double
15   * '\0'. New entries are always added at the end. Deleting an entry
16   * shifts the remaining entries to the front. Replacing an entry is a
17   * combination of deleting the old value and adding the new one.
18   *
19   * The environment is preceeded by a 32 bit CRC over the data part.
20   *
21   **************************************************************************
22   */
23  
24  #if defined(CONFIG_ENV_IS_IN_FLASH)
25  # ifndef	CONFIG_ENV_ADDR
26  #  define	CONFIG_ENV_ADDR	(CONFIG_SYS_FLASH_BASE + CONFIG_ENV_OFFSET)
27  # endif
28  # ifndef	CONFIG_ENV_OFFSET
29  #  define	CONFIG_ENV_OFFSET (CONFIG_ENV_ADDR - CONFIG_SYS_FLASH_BASE)
30  # endif
31  # if !defined(CONFIG_ENV_ADDR_REDUND) && defined(CONFIG_ENV_OFFSET_REDUND)
32  #  define	CONFIG_ENV_ADDR_REDUND	\
33  		(CONFIG_SYS_FLASH_BASE + CONFIG_ENV_OFFSET_REDUND)
34  # endif
35  # if defined(CONFIG_ENV_SECT_SIZE) || defined(CONFIG_ENV_SIZE)
36  #  ifndef	CONFIG_ENV_SECT_SIZE
37  #   define	CONFIG_ENV_SECT_SIZE	CONFIG_ENV_SIZE
38  #  endif
39  #  ifndef	CONFIG_ENV_SIZE
40  #   define	CONFIG_ENV_SIZE	CONFIG_ENV_SECT_SIZE
41  #  endif
42  # else
43  #  error "Both CONFIG_ENV_SECT_SIZE and CONFIG_ENV_SIZE undefined"
44  # endif
45  # if defined(CONFIG_ENV_ADDR_REDUND) && !defined(CONFIG_ENV_SIZE_REDUND)
46  #  define CONFIG_ENV_SIZE_REDUND	CONFIG_ENV_SIZE
47  # endif
48  # if	(CONFIG_ENV_ADDR >= CONFIG_SYS_MONITOR_BASE) &&		\
49  	(CONFIG_ENV_ADDR + CONFIG_ENV_SIZE) <=			\
50  	(CONFIG_SYS_MONITOR_BASE + CONFIG_SYS_MONITOR_LEN)
51  #  define ENV_IS_EMBEDDED
52  # endif
53  # if defined(CONFIG_ENV_ADDR_REDUND) || defined(CONFIG_ENV_OFFSET_REDUND)
54  #  define CONFIG_SYS_REDUNDAND_ENVIRONMENT
55  # endif
56  # ifdef CONFIG_ENV_IS_EMBEDDED
57  #  error "do not define CONFIG_ENV_IS_EMBEDDED in your board config"
58  #  error "it is calculated automatically for you"
59  # endif
60  #endif	/* CONFIG_ENV_IS_IN_FLASH */
61  
62  #if defined(CONFIG_ENV_IS_IN_MMC)
63  # ifdef CONFIG_ENV_OFFSET_REDUND
64  #  define CONFIG_SYS_REDUNDAND_ENVIRONMENT
65  # endif
66  #endif
67  
68  #if defined(CONFIG_ENV_IS_IN_NAND)
69  # if defined(CONFIG_ENV_OFFSET_OOB)
70  #  ifdef CONFIG_ENV_OFFSET_REDUND
71  #   error "CONFIG_ENV_OFFSET_REDUND is not supported when CONFIG_ENV_OFFSET_OOB"
72  #   error "is set"
73  #  endif
74  extern unsigned long nand_env_oob_offset;
75  #  define CONFIG_ENV_OFFSET nand_env_oob_offset
76  # else
77  #  ifndef CONFIG_ENV_OFFSET
78  #   error "Need to define CONFIG_ENV_OFFSET when using CONFIG_ENV_IS_IN_NAND"
79  #  endif
80  #  ifdef CONFIG_ENV_OFFSET_REDUND
81  #   define CONFIG_SYS_REDUNDAND_ENVIRONMENT
82  #  endif
83  # endif /* CONFIG_ENV_OFFSET_OOB */
84  # ifndef CONFIG_ENV_SIZE
85  #  error "Need to define CONFIG_ENV_SIZE when using CONFIG_ENV_IS_IN_NAND"
86  # endif
87  #endif /* CONFIG_ENV_IS_IN_NAND */
88  
89  #if defined(CONFIG_ENV_IS_IN_UBI)
90  # ifndef CONFIG_ENV_UBI_PART
91  #  error "Need to define CONFIG_ENV_UBI_PART when using CONFIG_ENV_IS_IN_UBI"
92  # endif
93  # ifndef CONFIG_ENV_UBI_VOLUME
94  #  error "Need to define CONFIG_ENV_UBI_VOLUME when using CONFIG_ENV_IS_IN_UBI"
95  # endif
96  # if defined(CONFIG_ENV_UBI_VOLUME_REDUND)
97  #  define CONFIG_SYS_REDUNDAND_ENVIRONMENT
98  # endif
99  # ifndef CONFIG_ENV_SIZE
100  #  error "Need to define CONFIG_ENV_SIZE when using CONFIG_ENV_IS_IN_UBI"
101  # endif
102  # ifndef CONFIG_CMD_UBI
103  #  error "Need to define CONFIG_CMD_UBI when using CONFIG_ENV_IS_IN_UBI"
104  # endif
105  #endif /* CONFIG_ENV_IS_IN_UBI */
106  
107  /* Embedded env is only supported for some flash types */
108  #ifdef CONFIG_ENV_IS_EMBEDDED
109  # if	!defined(CONFIG_ENV_IS_IN_FLASH)	&& \
110  	!defined(CONFIG_ENV_IS_IN_NAND)		&& \
111  	!defined(CONFIG_ENV_IS_IN_ONENAND)	&& \
112  	!defined(CONFIG_ENV_IS_IN_SPI_FLASH)
113  #  error "CONFIG_ENV_IS_EMBEDDED not supported for your flash type"
114  # endif
115  #endif
116  
117  /*
118   * For the flash types where embedded env is supported, but it cannot be
119   * calculated automatically (i.e. NAND), take the board opt-in.
120   */
121  #if defined(CONFIG_ENV_IS_EMBEDDED) && !defined(ENV_IS_EMBEDDED)
122  # define ENV_IS_EMBEDDED
123  #endif
124  
125  /* The build system likes to know if the env is embedded */
126  #ifdef DO_DEPS_ONLY
127  # ifdef ENV_IS_EMBEDDED
128  #  ifndef CONFIG_ENV_IS_EMBEDDED
129  #   define CONFIG_ENV_IS_EMBEDDED
130  #  endif
131  # endif
132  #endif
133  
134  #include "compiler.h"
135  
136  #ifdef CONFIG_SYS_REDUNDAND_ENVIRONMENT
137  # define ENV_HEADER_SIZE	(sizeof(uint32_t) + 1)
138  
139  # define ACTIVE_FLAG   1
140  # define OBSOLETE_FLAG 0
141  #else
142  # define ENV_HEADER_SIZE	(sizeof(uint32_t))
143  #endif
144  
145  #if defined(CONFIG_CMD_SAVEENV) && !defined(CONFIG_ENV_IS_NOWHERE)
146  extern char *env_name_spec;
147  #endif
148  
149  #ifdef CONFIG_ENV_AES
150  /* Make sure the payload is multiple of AES block size */
151  #define ENV_SIZE ((CONFIG_ENV_SIZE - ENV_HEADER_SIZE) & ~(16 - 1))
152  #else
153  #define ENV_SIZE (CONFIG_ENV_SIZE - ENV_HEADER_SIZE)
154  #endif
155  
156  typedef struct environment_s {
157  	uint32_t	crc;		/* CRC32 over data bytes	*/
158  #ifdef CONFIG_SYS_REDUNDAND_ENVIRONMENT
159  	unsigned char	flags;		/* active/obsolete flags	*/
160  #endif
161  	unsigned char	data[ENV_SIZE]; /* Environment data		*/
162  } env_t
163  #ifdef CONFIG_ENV_AES
164  /* Make sure the env is aligned to block size. */
165  __attribute__((aligned(16)))
166  #endif
167  ;
168  
169  #ifdef ENV_IS_EMBEDDED
170  extern env_t environment;
171  #endif /* ENV_IS_EMBEDDED */
172  
173  extern const unsigned char default_environment[];
174  extern env_t *env_ptr;
175  
176  extern void env_relocate_spec(void);
177  extern unsigned char env_get_char_spec(int);
178  
179  #if defined(CONFIG_NEEDS_MANUAL_RELOC)
180  extern void env_reloc(void);
181  #endif
182  
183  #ifndef DO_DEPS_ONLY
184  
185  #include <env_attr.h>
186  #include <env_callback.h>
187  #include <env_flags.h>
188  #include <search.h>
189  
190  extern struct hsearch_data env_htab;
191  
192  /* Function that returns a character from the environment */
193  unsigned char env_get_char(int);
194  
195  /* Function that returns a pointer to a value from the environment */
196  const unsigned char *env_get_addr(int);
197  unsigned char env_get_char_memory(int index);
198  
199  /* Function that updates CRC of the enironment */
200  void env_crc_update(void);
201  
202  /* Look up the variable from the default environment */
203  char *getenv_default(const char *name);
204  
205  /* [re]set to the default environment */
206  void set_default_env(const char *s);
207  
208  /* [re]set individual variables to their value in the default environment */
209  int set_default_vars(int nvars, char * const vars[]);
210  
211  /* Import from binary representation into hash table */
212  int env_import(const char *buf, int check);
213  
214  /* Export from hash table into binary representation */
215  int env_export(env_t *env_out);
216  
217  #endif /* DO_DEPS_ONLY */
218  
219  #endif /* _ENVIRONMENT_H_ */
220