blob: b602e8ac46b6be055e6811697023006b9f3b48fd [file] [log] [blame]
wdenkc6097192002-11-03 00:24:07 +00001/*
2 * (C) Copyright 2002
3 * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
4 *
Wolfgang Denk1a459662013-07-08 09:37:19 +02005 * SPDX-License-Identifier: GPL-2.0+
wdenkc6097192002-11-03 00:24:07 +00006 */
7
8#ifndef _ENVIRONMENT_H_
Igor Grinberg6f403ba2011-12-25 01:42:57 +00009#define _ENVIRONMENT_H_
wdenkc6097192002-11-03 00:24:07 +000010
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 *
Robert P. J. Dayfc0b5942016-09-07 14:27:59 -040019 * The environment is preceded by a 32 bit CRC over the data part.
wdenkc6097192002-11-03 00:24:07 +000020 *
Robert P. J. Dayfc0b5942016-09-07 14:27:59 -040021 *************************************************************************/
wdenkc6097192002-11-03 00:24:07 +000022
Jean-Christophe PLAGNIOL-VILLARD5a1aceb2008-09-10 22:48:04 +020023#if defined(CONFIG_ENV_IS_IN_FLASH)
Igor Grinberg507651d2011-11-07 01:13:55 +000024# ifndef CONFIG_ENV_ADDR
25# define CONFIG_ENV_ADDR (CONFIG_SYS_FLASH_BASE + CONFIG_ENV_OFFSET)
wdenkc6097192002-11-03 00:24:07 +000026# endif
Igor Grinberg507651d2011-11-07 01:13:55 +000027# ifndef CONFIG_ENV_OFFSET
28# define CONFIG_ENV_OFFSET (CONFIG_ENV_ADDR - CONFIG_SYS_FLASH_BASE)
wdenkc6097192002-11-03 00:24:07 +000029# endif
Jean-Christophe PLAGNIOL-VILLARD0e8d1582008-09-10 22:48:06 +020030# if !defined(CONFIG_ENV_ADDR_REDUND) && defined(CONFIG_ENV_OFFSET_REDUND)
Igor Grinberg507651d2011-11-07 01:13:55 +000031# define CONFIG_ENV_ADDR_REDUND \
32 (CONFIG_SYS_FLASH_BASE + CONFIG_ENV_OFFSET_REDUND)
wdenkc6097192002-11-03 00:24:07 +000033# endif
Jean-Christophe PLAGNIOL-VILLARD0e8d1582008-09-10 22:48:06 +020034# if defined(CONFIG_ENV_SECT_SIZE) || defined(CONFIG_ENV_SIZE)
Igor Grinberg507651d2011-11-07 01:13:55 +000035# ifndef CONFIG_ENV_SECT_SIZE
36# define CONFIG_ENV_SECT_SIZE CONFIG_ENV_SIZE
wdenk500545c2003-03-06 14:23:06 +000037# endif
Igor Grinberg507651d2011-11-07 01:13:55 +000038# ifndef CONFIG_ENV_SIZE
39# define CONFIG_ENV_SIZE CONFIG_ENV_SECT_SIZE
wdenk500545c2003-03-06 14:23:06 +000040# endif
41# else
Jean-Christophe PLAGNIOL-VILLARD0e8d1582008-09-10 22:48:06 +020042# error "Both CONFIG_ENV_SECT_SIZE and CONFIG_ENV_SIZE undefined"
wdenkc6097192002-11-03 00:24:07 +000043# endif
Jean-Christophe PLAGNIOL-VILLARD0e8d1582008-09-10 22:48:06 +020044# if defined(CONFIG_ENV_ADDR_REDUND) && !defined(CONFIG_ENV_SIZE_REDUND)
45# define CONFIG_ENV_SIZE_REDUND CONFIG_ENV_SIZE
wdenkc6097192002-11-03 00:24:07 +000046# endif
Igor Grinberg507651d2011-11-07 01:13:55 +000047# if (CONFIG_ENV_ADDR >= CONFIG_SYS_MONITOR_BASE) && \
48 (CONFIG_ENV_ADDR + CONFIG_ENV_SIZE) <= \
49 (CONFIG_SYS_MONITOR_BASE + CONFIG_SYS_MONITOR_LEN)
Igor Grinberg6f403ba2011-12-25 01:42:57 +000050# define ENV_IS_EMBEDDED
wdenkc6097192002-11-03 00:24:07 +000051# endif
Jean-Christophe PLAGNIOL-VILLARD0e8d1582008-09-10 22:48:06 +020052# if defined(CONFIG_ENV_ADDR_REDUND) || defined(CONFIG_ENV_OFFSET_REDUND)
Igor Grinberg6f403ba2011-12-25 01:42:57 +000053# define CONFIG_SYS_REDUNDAND_ENVIRONMENT
wdenkc6097192002-11-03 00:24:07 +000054# endif
Mike Frysinger0a9e4e72009-07-24 16:34:32 -040055# 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
Jean-Christophe PLAGNIOL-VILLARD5a1aceb2008-09-10 22:48:04 +020059#endif /* CONFIG_ENV_IS_IN_FLASH */
wdenkc6097192002-11-03 00:24:07 +000060
Bo Shen5707df72013-05-15 09:38:16 +080061#if defined(CONFIG_ENV_IS_IN_MMC)
62# ifdef CONFIG_ENV_OFFSET_REDUND
63# define CONFIG_SYS_REDUNDAND_ENVIRONMENT
64# endif
65#endif
66
Jean-Christophe PLAGNIOL-VILLARD51bfee12008-09-10 22:47:58 +020067#if defined(CONFIG_ENV_IS_IN_NAND)
Ben Gardinerc9f73512010-07-05 13:27:07 -040068# 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 */
Jean-Christophe PLAGNIOL-VILLARD0e8d1582008-09-10 22:48:06 +020083# ifndef CONFIG_ENV_SIZE
84# error "Need to define CONFIG_ENV_SIZE when using CONFIG_ENV_IS_IN_NAND"
Markus Klotzbuechere443c942006-03-20 18:02:44 +010085# endif
Jean-Christophe PLAGNIOL-VILLARD51bfee12008-09-10 22:47:58 +020086#endif /* CONFIG_ENV_IS_IN_NAND */
Markus Klotzbuechere443c942006-03-20 18:02:44 +010087
Joe Hershberger2b744332013-04-08 10:32:51 +000088#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
Joe Hershberger785881f2013-04-08 10:32:52 +000095# if defined(CONFIG_ENV_UBI_VOLUME_REDUND)
96# define CONFIG_SYS_REDUNDAND_ENVIRONMENT
97# endif
Joe Hershberger2b744332013-04-08 10:32:51 +000098# 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
Mike Frysinger0a9e4e72009-07-24 16:34:32 -0400106/* Embedded env is only supported for some flash types */
107#ifdef CONFIG_ENV_IS_EMBEDDED
Igor Grinberg507651d2011-11-07 01:13:55 +0000108# 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)
Mike Frysinger0a9e4e72009-07-24 16:34:32 -0400112# 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)
Igor Grinberg6f403ba2011-12-25 01:42:57 +0000121# define ENV_IS_EMBEDDED
Mike Frysinger0a9e4e72009-07-24 16:34:32 -0400122#endif
123
124/* The build system likes to know if the env is embedded */
125#ifdef DO_DEPS_ONLY
126# ifdef ENV_IS_EMBEDDED
Wolfgang Denk33a6b9e2011-07-30 14:01:08 +0000127# ifndef CONFIG_ENV_IS_EMBEDDED
128# define CONFIG_ENV_IS_EMBEDDED
129# endif
Mike Frysinger0a9e4e72009-07-24 16:34:32 -0400130# endif
131#endif
132
Mike Frysinger37566092009-07-02 19:23:25 -0400133#include "compiler.h"
wdenkc6097192002-11-03 00:24:07 +0000134
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200135#ifdef CONFIG_SYS_REDUNDAND_ENVIRONMENT
Mike Frysinger89cdab72008-03-31 11:02:01 -0400136# define ENV_HEADER_SIZE (sizeof(uint32_t) + 1)
Wolfgang Denkb218ccb2010-06-22 15:44:16 +0200137
138# define ACTIVE_FLAG 1
139# define OBSOLETE_FLAG 0
wdenkc6097192002-11-03 00:24:07 +0000140#else
Mike Frysinger89cdab72008-03-31 11:02:01 -0400141# define ENV_HEADER_SIZE (sizeof(uint32_t))
wdenkc6097192002-11-03 00:24:07 +0000142#endif
143
Igor Grinbergd09b1782011-11-07 01:13:59 +0000144#if defined(CONFIG_CMD_SAVEENV) && !defined(CONFIG_ENV_IS_NOWHERE)
145extern char *env_name_spec;
146#endif
wdenkc6097192002-11-03 00:24:07 +0000147
Marek Vasuta4223b72014-03-05 19:59:51 +0100148#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
Jean-Christophe PLAGNIOL-VILLARD0e8d1582008-09-10 22:48:06 +0200152#define ENV_SIZE (CONFIG_ENV_SIZE - ENV_HEADER_SIZE)
Marek Vasuta4223b72014-03-05 19:59:51 +0100153#endif
wdenkc6097192002-11-03 00:24:07 +0000154
Igor Grinberg507651d2011-11-07 01:13:55 +0000155typedef struct environment_s {
Mike Frysinger89cdab72008-03-31 11:02:01 -0400156 uint32_t crc; /* CRC32 over data bytes */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +0200157#ifdef CONFIG_SYS_REDUNDAND_ENVIRONMENT
wdenkc6097192002-11-03 00:24:07 +0000158 unsigned char flags; /* active/obsolete flags */
159#endif
160 unsigned char data[ENV_SIZE]; /* Environment data */
Marek Vasuta4223b72014-03-05 19:59:51 +0100161} env_t
162#ifdef CONFIG_ENV_AES
163/* Make sure the env is aligned to block size. */
164__attribute__((aligned(16)))
165#endif
166;
wdenkc6097192002-11-03 00:24:07 +0000167
Igor Grinberg994bc672011-11-17 06:07:23 +0000168#ifdef ENV_IS_EMBEDDED
169extern env_t environment;
170#endif /* ENV_IS_EMBEDDED */
171
Igor Grinbergd1459f02011-11-07 01:13:57 +0000172extern const unsigned char default_environment[];
Igor Grinberg27aafe92011-11-07 01:14:11 +0000173extern 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
Igor Grinbergd1459f02011-11-07 01:13:57 +0000181
Dmitry Lifshitzac77f422014-07-30 13:19:05 +0300182#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);
Dmitry Lifshitz6e7b7df2014-07-30 13:19:06 +0300186# ifdef CONFIG_SYS_MMC_ENV_PART
187extern uint mmc_get_env_part(struct mmc *mmc);
188# endif
Dmitry Lifshitzac77f422014-07-30 13:19:05 +0300189#endif
190
Mike Frysinger2eb15732010-12-08 06:26:04 -0500191#ifndef DO_DEPS_ONLY
192
Joe Hershberger170ab112012-12-11 22:16:24 -0600193#include <env_attr.h>
194#include <env_callback.h>
Joe Hershberger25980902012-12-11 22:16:31 -0600195#include <env_flags.h>
Mike Frysinger2eb15732010-12-08 06:26:04 -0500196#include <search.h>
197
198extern struct hsearch_data env_htab;
199
Joakim Tjernlundb5026112008-07-06 12:30:09 +0200200/* Function that returns a character from the environment */
Igor Grinberg507651d2011-11-07 01:13:55 +0000201unsigned char env_get_char(int);
Wolfgang Denka8409f42008-05-14 12:22:49 +0200202
203/* Function that returns a pointer to a value from the environment */
Mike Frysinger147c7162011-04-23 23:43:21 +0000204const unsigned char *env_get_addr(int);
Igor Grinberg507651d2011-11-07 01:13:55 +0000205unsigned char env_get_char_memory(int index);
Wolfgang Denka8409f42008-05-14 12:22:49 +0200206
207/* Function that updates CRC of the enironment */
Igor Grinberg507651d2011-11-07 01:13:55 +0000208void env_crc_update(void);
Wolfgang Denka8409f42008-05-14 12:22:49 +0200209
Joe Hershberger267541f2012-12-11 22:16:34 -0600210/* Look up the variable from the default environment */
211char *getenv_default(const char *name);
212
Harald Welte5bb12db2008-07-07 15:40:39 +0800213/* [re]set to the default environment */
Wolfgang Denkea882ba2010-06-20 23:33:59 +0200214void set_default_env(const char *s);
215
Gerlando Falautob64b7c32012-08-24 00:11:41 +0000216/* [re]set individual variables to their value in the default environment */
217int set_default_vars(int nvars, char * const vars[]);
218
Wolfgang Denkea882ba2010-06-20 23:33:59 +0200219/* Import from binary representation into hash table */
220int env_import(const char *buf, int check);
Harald Welte5bb12db2008-07-07 15:40:39 +0800221
Marek Vasut7ce15262014-03-05 19:59:50 +0100222/* Export from hash table into binary representation */
223int env_export(env_t *env_out);
224
Igor Grinberg507651d2011-11-07 01:13:55 +0000225#endif /* DO_DEPS_ONLY */
Mike Frysinger2eb15732010-12-08 06:26:04 -0500226
Igor Grinberg507651d2011-11-07 01:13:55 +0000227#endif /* _ENVIRONMENT_H_ */