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