uboot/include/env_internal.h
<<
>>
Prefs
   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#include <linux/kconfig.h>
  19
  20/**************************************************************************
  21 *
  22 * The "environment" is stored as a list of '\0' terminated
  23 * "name=value" strings. The end of the list is marked by a double
  24 * '\0'. New entries are always added at the end. Deleting an entry
  25 * shifts the remaining entries to the front. Replacing an entry is a
  26 * combination of deleting the old value and adding the new one.
  27 *
  28 * The environment is preceded by a 32 bit CRC over the data part.
  29 *
  30 *************************************************************************/
  31
  32#if defined(CONFIG_ENV_IS_IN_FLASH)
  33# ifndef        CONFIG_ENV_ADDR
  34#  define       CONFIG_ENV_ADDR (CONFIG_SYS_FLASH_BASE + CONFIG_ENV_OFFSET)
  35# endif
  36# ifndef        CONFIG_ENV_OFFSET
  37#  define       CONFIG_ENV_OFFSET (CONFIG_ENV_ADDR - CONFIG_SYS_FLASH_BASE)
  38# endif
  39# if !defined(CONFIG_ENV_ADDR_REDUND) && defined(CONFIG_ENV_OFFSET_REDUND)
  40#  define       CONFIG_ENV_ADDR_REDUND  \
  41                (CONFIG_SYS_FLASH_BASE + CONFIG_ENV_OFFSET_REDUND)
  42# endif
  43# if defined(CONFIG_ENV_SECT_SIZE) || defined(CONFIG_ENV_SIZE)
  44#  ifndef       CONFIG_ENV_SECT_SIZE
  45#   define      CONFIG_ENV_SECT_SIZE    CONFIG_ENV_SIZE
  46#  endif
  47#  ifndef       CONFIG_ENV_SIZE
  48#   define      CONFIG_ENV_SIZE CONFIG_ENV_SECT_SIZE
  49#  endif
  50# else
  51#  error "Both CONFIG_ENV_SECT_SIZE and CONFIG_ENV_SIZE undefined"
  52# endif
  53# if defined(CONFIG_ENV_ADDR_REDUND) && !defined(CONFIG_ENV_SIZE_REDUND)
  54#  define CONFIG_ENV_SIZE_REDUND        CONFIG_ENV_SIZE
  55# endif
  56# if    (CONFIG_ENV_ADDR >= CONFIG_SYS_MONITOR_BASE) &&         \
  57        (CONFIG_ENV_ADDR + CONFIG_ENV_SIZE) <=                  \
  58        (CONFIG_SYS_MONITOR_BASE + CONFIG_SYS_MONITOR_LEN)
  59#  define ENV_IS_EMBEDDED
  60# endif
  61# if defined(CONFIG_ENV_ADDR_REDUND) || defined(CONFIG_ENV_OFFSET_REDUND)
  62#  define CONFIG_SYS_REDUNDAND_ENVIRONMENT
  63# endif
  64# ifdef CONFIG_ENV_IS_EMBEDDED
  65#  error "do not define CONFIG_ENV_IS_EMBEDDED in your board config"
  66#  error "it is calculated automatically for you"
  67# endif
  68#endif  /* CONFIG_ENV_IS_IN_FLASH */
  69
  70#if defined(CONFIG_ENV_IS_IN_MMC)
  71# ifdef CONFIG_ENV_OFFSET_REDUND
  72#  define CONFIG_SYS_REDUNDAND_ENVIRONMENT
  73# endif
  74#endif
  75
  76#if defined(CONFIG_ENV_IS_IN_NAND)
  77# if defined(CONFIG_ENV_OFFSET_OOB)
  78#  ifdef CONFIG_ENV_OFFSET_REDUND
  79#   error "CONFIG_ENV_OFFSET_REDUND is not supported when CONFIG_ENV_OFFSET_OOB"
  80#   error "is set"
  81#  endif
  82extern unsigned long nand_env_oob_offset;
  83#  define CONFIG_ENV_OFFSET nand_env_oob_offset
  84# else
  85#  ifndef CONFIG_ENV_OFFSET
  86#   error "Need to define CONFIG_ENV_OFFSET when using CONFIG_ENV_IS_IN_NAND"
  87#  endif
  88#  ifdef CONFIG_ENV_OFFSET_REDUND
  89#   define CONFIG_SYS_REDUNDAND_ENVIRONMENT
  90#  endif
  91# endif /* CONFIG_ENV_OFFSET_OOB */
  92# ifndef CONFIG_ENV_SIZE
  93#  error "Need to define CONFIG_ENV_SIZE when using CONFIG_ENV_IS_IN_NAND"
  94# endif
  95#endif /* CONFIG_ENV_IS_IN_NAND */
  96
  97#if defined(CONFIG_ENV_IS_IN_UBI)
  98# ifndef CONFIG_ENV_UBI_PART
  99#  error "Need to define CONFIG_ENV_UBI_PART when using CONFIG_ENV_IS_IN_UBI"
 100# endif
 101# ifndef CONFIG_ENV_UBI_VOLUME
 102#  error "Need to define CONFIG_ENV_UBI_VOLUME when using CONFIG_ENV_IS_IN_UBI"
 103# endif
 104# if defined(CONFIG_ENV_UBI_VOLUME_REDUND)
 105#  define CONFIG_SYS_REDUNDAND_ENVIRONMENT
 106# endif
 107# ifndef CONFIG_ENV_SIZE
 108#  error "Need to define CONFIG_ENV_SIZE when using CONFIG_ENV_IS_IN_UBI"
 109# endif
 110# ifndef CONFIG_CMD_UBI
 111#  error "Need to define CONFIG_CMD_UBI when using CONFIG_ENV_IS_IN_UBI"
 112# endif
 113#endif /* CONFIG_ENV_IS_IN_UBI */
 114
 115/* Embedded env is only supported for some flash types */
 116#ifdef CONFIG_ENV_IS_EMBEDDED
 117# if    !defined(CONFIG_ENV_IS_IN_FLASH)        && \
 118        !defined(CONFIG_ENV_IS_IN_NAND)         && \
 119        !defined(CONFIG_ENV_IS_IN_ONENAND)      && \
 120        !defined(CONFIG_ENV_IS_IN_SPI_FLASH)
 121#  error "CONFIG_ENV_IS_EMBEDDED not supported for your flash type"
 122# endif
 123#endif
 124
 125/*
 126 * For the flash types where embedded env is supported, but it cannot be
 127 * calculated automatically (i.e. NAND), take the board opt-in.
 128 */
 129#if defined(CONFIG_ENV_IS_EMBEDDED) && !defined(ENV_IS_EMBEDDED)
 130# define ENV_IS_EMBEDDED
 131#endif
 132
 133/* The build system likes to know if the env is embedded */
 134#ifdef DO_DEPS_ONLY
 135# ifdef ENV_IS_EMBEDDED
 136#  ifndef CONFIG_ENV_IS_EMBEDDED
 137#   define CONFIG_ENV_IS_EMBEDDED
 138#  endif
 139# endif
 140#endif
 141
 142#include "compiler.h"
 143
 144#ifdef CONFIG_SYS_REDUNDAND_ENVIRONMENT
 145# define ENV_HEADER_SIZE        (sizeof(uint32_t) + 1)
 146#else
 147# define ENV_HEADER_SIZE        (sizeof(uint32_t))
 148#endif
 149
 150#define ENV_SIZE (CONFIG_ENV_SIZE - ENV_HEADER_SIZE)
 151
 152/*
 153 * If the environment is in RAM, allocate extra space for it in the malloc
 154 * region.
 155 */
 156#if defined(CONFIG_ENV_IS_EMBEDDED)
 157#define TOTAL_MALLOC_LEN        CONFIG_SYS_MALLOC_LEN
 158#elif (CONFIG_ENV_ADDR + CONFIG_ENV_SIZE < CONFIG_SYS_MONITOR_BASE) || \
 159      (CONFIG_ENV_ADDR >= CONFIG_SYS_MONITOR_BASE + CONFIG_SYS_MONITOR_LEN) || \
 160      defined(CONFIG_ENV_IS_IN_NVRAM)
 161#define TOTAL_MALLOC_LEN        (CONFIG_SYS_MALLOC_LEN + CONFIG_ENV_SIZE)
 162#else
 163#define TOTAL_MALLOC_LEN        CONFIG_SYS_MALLOC_LEN
 164#endif
 165
 166typedef struct environment_s {
 167        uint32_t        crc;            /* CRC32 over data bytes        */
 168#ifdef CONFIG_SYS_REDUNDAND_ENVIRONMENT
 169        unsigned char   flags;          /* active/obsolete flags ENVF_REDUND_ */
 170#endif
 171        unsigned char   data[ENV_SIZE]; /* Environment data             */
 172} env_t;
 173
 174#ifdef ENV_IS_EMBEDDED
 175extern env_t embedded_environment;
 176#endif /* ENV_IS_EMBEDDED */
 177
 178extern const unsigned char default_environment[];
 179
 180#ifndef DO_DEPS_ONLY
 181
 182#include <env_attr.h>
 183#include <env_callback.h>
 184#include <env_flags.h>
 185#include <search.h>
 186
 187enum env_location {
 188        ENVL_UNKNOWN,
 189        ENVL_EEPROM,
 190        ENVL_EXT4,
 191        ENVL_FAT,
 192        ENVL_FLASH,
 193        ENVL_MMC,
 194        ENVL_NAND,
 195        ENVL_NVRAM,
 196        ENVL_ONENAND,
 197        ENVL_REMOTE,
 198        ENVL_SPI_FLASH,
 199        ENVL_UBI,
 200        ENVL_NOWHERE,
 201
 202        ENVL_COUNT,
 203};
 204
 205/* value for the various operations we want to perform on the env */
 206enum env_operation {
 207        ENVOP_GET_CHAR, /* we want to call the get_char function */
 208        ENVOP_INIT,     /* we want to call the init function */
 209        ENVOP_LOAD,     /* we want to call the load function */
 210        ENVOP_SAVE,     /* we want to call the save function */
 211        ENVOP_ERASE,    /* we want to call the erase function */
 212};
 213
 214struct env_driver {
 215        const char *name;
 216        enum env_location location;
 217
 218        /**
 219         * load() - Load the environment from storage
 220         *
 221         * This method is optional. If not provided, no environment will be
 222         * loaded.
 223         *
 224         * @return 0 if OK, -ve on error
 225         */
 226        int (*load)(void);
 227
 228        /**
 229         * save() - Save the environment to storage
 230         *
 231         * This method is required for 'saveenv' to work.
 232         *
 233         * @return 0 if OK, -ve on error
 234         */
 235        int (*save)(void);
 236
 237        /**
 238         * erase() - Erase the environment on storage
 239         *
 240         * This method is optional and required for 'eraseenv' to work.
 241         *
 242         * @return 0 if OK, -ve on error
 243         */
 244        int (*erase)(void);
 245
 246        /**
 247         * init() - Set up the initial pre-relocation environment
 248         *
 249         * This method is optional.
 250         *
 251         * @return 0 if OK, -ENOENT if no initial environment could be found,
 252         * other -ve on error
 253         */
 254        int (*init)(void);
 255};
 256
 257/* Declare a new environment location driver */
 258#define U_BOOT_ENV_LOCATION(__name)                                     \
 259        ll_entry_declare(struct env_driver, __name, env_driver)
 260
 261/* Declare the name of a location */
 262#ifdef CONFIG_CMD_SAVEENV
 263#define ENV_NAME(_name) .name = _name,
 264#else
 265#define ENV_NAME(_name)
 266#endif
 267
 268#ifdef CONFIG_CMD_SAVEENV
 269#define env_save_ptr(x) x
 270#else
 271#define env_save_ptr(x) NULL
 272#endif
 273
 274extern struct hsearch_data env_htab;
 275
 276#endif /* DO_DEPS_ONLY */
 277
 278#endif /* _ENV_INTERNAL_H_ */
 279