Prepare v2024.10
[platform/kernel/u-boot.git] / include / env_internal.h
1 /* SPDX-License-Identifier: GPL-2.0+ */
2 /*
3  * Internal environment header file. This includes direct access to environment
4  * information such as its size and offset, direct access to the default
5  * environment and embedded environment (if used). It also provides environment
6  * drivers with various declarations.
7  *
8  * It should not be included by board files, drivers and code other than that
9  * related to the environment implementation.
10  *
11  * (C) Copyright 2002
12  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
13  */
14
15 #ifndef _ENV_INTERNAL_H_
16 #define _ENV_INTERNAL_H_
17
18 /**************************************************************************
19  *
20  * The "environment" is stored as a list of '\0' terminated
21  * "name=value" strings. The end of the list is marked by a double
22  * '\0'. New entries are always added at the end. Deleting an entry
23  * shifts the remaining entries to the front. Replacing an entry is a
24  * combination of deleting the old value and adding the new one.
25  *
26  * The environment is preceded by a 32 bit CRC over the data part.
27  *
28  *************************************************************************/
29
30 #if defined(CONFIG_ENV_IS_IN_FLASH)
31 # if    defined(CONFIG_ENV_ADDR_REDUND) && \
32         ((CONFIG_ENV_ADDR >= CONFIG_SYS_MONITOR_BASE) &&                \
33         (CONFIG_ENV_ADDR_REDUND + CONFIG_ENV_SIZE) <=           \
34         (CONFIG_SYS_MONITOR_BASE + CONFIG_SYS_MONITOR_LEN))
35 #  define ENV_IS_EMBEDDED
36 # endif
37 # if    (CONFIG_ENV_ADDR >= CONFIG_SYS_MONITOR_BASE) &&         \
38         (CONFIG_ENV_ADDR + CONFIG_ENV_SIZE) <=                  \
39         (CONFIG_SYS_MONITOR_BASE + CONFIG_SYS_MONITOR_LEN)
40 #  define ENV_IS_EMBEDDED
41 # endif
42 #endif  /* CONFIG_ENV_IS_IN_FLASH */
43
44 #if defined(CONFIG_ENV_IS_IN_NAND)
45 # if defined(CONFIG_ENV_OFFSET_OOB)
46 #  ifdef CONFIG_ENV_OFFSET_REDUND
47 #   error "CONFIG_ENV_OFFSET_REDUND is not supported when CONFIG_ENV_OFFSET_OOB"
48 #   error "is set"
49 #  endif
50 extern unsigned long nand_env_oob_offset;
51 # endif /* CONFIG_ENV_OFFSET_OOB */
52 #endif /* CONFIG_ENV_IS_IN_NAND */
53
54 #include "compiler.h"
55
56 #ifdef CONFIG_SYS_REDUNDAND_ENVIRONMENT
57 # define ENV_HEADER_SIZE        (sizeof(uint32_t) + 1)
58 #else
59 # define ENV_HEADER_SIZE        (sizeof(uint32_t))
60 #endif
61
62 #define ENV_SIZE (CONFIG_ENV_SIZE - ENV_HEADER_SIZE)
63
64 /*
65  * If the environment is in RAM, allocate extra space for it in the malloc
66  * region.
67  */
68 #if defined(ENV_IS_EMBEDDED)
69 #define TOTAL_MALLOC_LEN        CONFIG_SYS_MALLOC_LEN
70 #elif (CONFIG_ENV_ADDR + CONFIG_ENV_SIZE < CONFIG_SYS_MONITOR_BASE) || \
71       (CONFIG_ENV_ADDR >= CONFIG_SYS_MONITOR_BASE + CONFIG_SYS_MONITOR_LEN) || \
72       defined(CONFIG_ENV_IS_IN_NVRAM)
73 #define TOTAL_MALLOC_LEN        (CONFIG_SYS_MALLOC_LEN + CONFIG_ENV_SIZE)
74 #else
75 #define TOTAL_MALLOC_LEN        CONFIG_SYS_MALLOC_LEN
76 #endif
77
78 typedef struct environment_s {
79         uint32_t        crc;            /* CRC32 over data bytes        */
80 #ifdef CONFIG_SYS_REDUNDAND_ENVIRONMENT
81         unsigned char   flags;          /* active/obsolete flags ENVF_REDUND_ */
82 #endif
83         unsigned char   data[ENV_SIZE]; /* Environment data             */
84 } env_t;
85
86 #ifdef ENV_IS_EMBEDDED
87 extern env_t embedded_environment;
88 #endif /* ENV_IS_EMBEDDED */
89
90 #ifdef CONFIG_DEFAULT_ENV_IS_RW
91 extern char default_environment[];
92 #else
93 extern const char default_environment[];
94 #endif
95
96 #ifndef DO_DEPS_ONLY
97
98 #include <env_attr.h>
99 #include <env_callback.h>
100 #include <env_flags.h>
101 #include <search.h>
102
103 enum env_location {
104         ENVL_UNKNOWN,
105         ENVL_EEPROM,
106         ENVL_EXT4,
107         ENVL_FAT,
108         ENVL_FLASH,
109         ENVL_MMC,
110         ENVL_NAND,
111         ENVL_NVRAM,
112         ENVL_ONENAND,
113         ENVL_REMOTE,
114         ENVL_SPI_FLASH,
115         ENVL_UBI,
116         ENVL_NOWHERE,
117
118         ENVL_COUNT,
119 };
120
121 /* value for the various operations we want to perform on the env */
122 enum env_operation {
123         ENVOP_GET_CHAR, /* we want to call the get_char function */
124         ENVOP_INIT,     /* we want to call the init function */
125         ENVOP_LOAD,     /* we want to call the load function */
126         ENVOP_SAVE,     /* we want to call the save function */
127         ENVOP_ERASE,    /* we want to call the erase function */
128 };
129
130 struct env_driver {
131         const char *name;
132         enum env_location location;
133
134         /**
135          * load() - Load the environment from storage
136          *
137          * This method is required for loading environment
138          *
139          * @return 0 if OK, -ve on error
140          */
141         int (*load)(void);
142
143         /**
144          * save() - Save the environment to storage
145          *
146          * This method is required for 'saveenv' to work.
147          *
148          * @return 0 if OK, -ve on error
149          */
150         int (*save)(void);
151
152         /**
153          * erase() - Erase the environment on storage
154          *
155          * This method is optional and required for 'eraseenv' to work.
156          *
157          * @return 0 if OK, -ve on error
158          */
159         int (*erase)(void);
160
161         /**
162          * init() - Set up the initial pre-relocation environment
163          *
164          * This method is optional.
165          *
166          * @return 0 if OK, -ENOENT if no initial environment could be found,
167          * other -ve on error
168          */
169         int (*init)(void);
170 };
171
172 /* Declare a new environment location driver */
173 #define U_BOOT_ENV_LOCATION(__name)                                     \
174         ll_entry_declare(struct env_driver, __name, env_driver)
175
176 /* Declare the name of a location */
177 #ifdef CONFIG_CMD_SAVEENV
178 #define ENV_NAME(_name) .name = _name,
179 #else
180 #define ENV_NAME(_name)
181 #endif
182
183 #ifdef CONFIG_CMD_SAVEENV
184 #define env_save_ptr(x) x
185 #else
186 #define env_save_ptr(x) NULL
187 #endif
188
189 #define ENV_SAVE_PTR(x) (CONFIG_IS_ENABLED(SAVEENV) ? (x) : NULL)
190 #define ENV_ERASE_PTR(x) (IS_ENABLED(CONFIG_CMD_ERASEENV) ? (x) : NULL)
191
192 extern struct hsearch_data env_htab;
193
194 /**
195  * env_do_env_set() - Perform the actual setting of an environment variable
196  *
197  * Due to the number of places we may need to set an environmental variable
198  * from we have an exposed internal function that performs the real work and
199  * then call this from both the command line function as well as other
200  * locations.
201  *
202  * Return: 0 on success or 1 on failure
203  */
204 int env_do_env_set(int flag, int argc, char *const argv[], int env_flag);
205
206 /**
207  * env_ext4_get_intf() - Provide the interface for env in EXT4
208  *
209  * It is a weak function allowing board to overidde the default interface for
210  * U-Boot env in EXT4: CONFIG_ENV_EXT4_INTERFACE
211  *
212  * Return: string of interface, empty if not supported
213  */
214 const char *env_ext4_get_intf(void);
215
216 /**
217  * env_ext4_get_dev_part() - Provide the device and partition for env in EXT4
218  *
219  * It is a weak function allowing board to overidde the default device and
220  * partition used for U-Boot env in EXT4: CONFIG_ENV_EXT4_DEVICE_AND_PART
221  *
222  * Return: string of device and partition
223  */
224 const char *env_ext4_get_dev_part(void);
225
226 /**
227  * arch_env_get_location()- Provide the best location for the U-Boot environment
228  *
229  * It is a weak function allowing board to overidde the environment location
230  * on architecture level. This has lower priority than env_get_location(),
231  * which can be defined on board level.
232  *
233  * @op: operations performed on the environment
234  * @prio: priority between the multiple environments, 0 being the
235  *        highest priority
236  * Return:  an enum env_location value on success, or -ve error code.
237  */
238 enum env_location arch_env_get_location(enum env_operation op, int prio);
239
240 /**
241  * env_get_location()- Provide the best location for the U-Boot environment
242  *
243  * It is a weak function allowing board to overidde the environment location
244  * on board level. This has higher priority than arch_env_get_location(),
245  * which can be defined on architecture level.
246  *
247  * @op: operations performed on the environment
248  * @prio: priority between the multiple environments, 0 being the
249  *        highest priority
250  * Return:  an enum env_location value on success, or -ve error code.
251  */
252 enum env_location env_get_location(enum env_operation op, int prio);
253
254 /**
255  * env_fat_get_intf() - Provide the interface for env in FAT
256  *
257  * It is a weak function allowing board to overidde the default interface for
258  * U-Boot env in FAT: CONFIG_ENV_FAT_INTERFACE
259  *
260  * Return: string of interface, empty if not supported
261  */
262 const char *env_fat_get_intf(void);
263
264 /**
265  * env_fat_get_dev_part() - Provide the device and partition for env in FAT
266  *
267  * It is a weak function allowing board to overidde the default device and
268  * partition used for U-Boot env in FAT: CONFIG_ENV_FAT_DEVICE_AND_PART
269  *
270  * Return: string of device and partition
271  */
272 char *env_fat_get_dev_part(void);
273 #endif /* DO_DEPS_ONLY */
274
275 #endif /* _ENV_INTERNAL_H_ */