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