2 * (C) Copyright 2000-2002
3 * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
5 * (C) Copyright 2001 Sysgo Real-Time Solutions, GmbH <www.elinos.com>
6 * Andreas Heppel <aheppel@sysgo.de>
8 * See file CREDITS for list of people who contributed to this
11 * This program is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU General Public License as
13 * published by the Free Software Foundation; either version 2 of
14 * the License, or (at your option) any later version.
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
29 #include <environment.h>
30 #include <linux/stddef.h>
33 DECLARE_GLOBAL_DATA_PTR;
38 #define DEBUGF(fmt,args...) printf(fmt ,##args)
40 #define DEBUGF(fmt,args...)
43 extern env_t *env_ptr;
45 extern void env_relocate_spec(void);
46 extern uchar env_get_char_spec(int);
48 static uchar env_get_char_init(int index);
49 uchar (*env_get_char)(int) = env_get_char_init;
51 /************************************************************************
52 * Default settings to be used when no valid environment is found
55 #define MK_STR(x) XMK_STR(x)
57 uchar default_environment[] = {
58 #ifdef CONFIG_BOOTARGS
59 "bootargs=" CONFIG_BOOTARGS "\0"
61 #ifdef CONFIG_BOOTCOMMAND
62 "bootcmd=" CONFIG_BOOTCOMMAND "\0"
64 #ifdef CONFIG_RAMBOOTCOMMAND
65 "ramboot=" CONFIG_RAMBOOTCOMMAND "\0"
67 #ifdef CONFIG_NFSBOOTCOMMAND
68 "nfsboot=" CONFIG_NFSBOOTCOMMAND "\0"
70 #if defined(CONFIG_BOOTDELAY) && (CONFIG_BOOTDELAY >= 0)
71 "bootdelay=" MK_STR(CONFIG_BOOTDELAY) "\0"
73 #if defined(CONFIG_BAUDRATE) && (CONFIG_BAUDRATE >= 0)
74 "baudrate=" MK_STR(CONFIG_BAUDRATE) "\0"
76 #ifdef CONFIG_LOADS_ECHO
77 "loads_echo=" MK_STR(CONFIG_LOADS_ECHO) "\0"
80 "ethaddr=" MK_STR(CONFIG_ETHADDR) "\0"
82 #ifdef CONFIG_ETH1ADDR
83 "eth1addr=" MK_STR(CONFIG_ETH1ADDR) "\0"
85 #ifdef CONFIG_ETH2ADDR
86 "eth2addr=" MK_STR(CONFIG_ETH2ADDR) "\0"
88 #ifdef CONFIG_ETH3ADDR
89 "eth3addr=" MK_STR(CONFIG_ETH3ADDR) "\0"
92 "ipaddr=" MK_STR(CONFIG_IPADDR) "\0"
94 #ifdef CONFIG_SERVERIP
95 "serverip=" MK_STR(CONFIG_SERVERIP) "\0"
98 "autoload=" CFG_AUTOLOAD "\0"
100 #ifdef CONFIG_ROOTPATH
101 "rootpath=" MK_STR(CONFIG_ROOTPATH) "\0"
103 #ifdef CONFIG_GATEWAYIP
104 "gatewayip=" MK_STR(CONFIG_GATEWAYIP) "\0"
106 #ifdef CONFIG_NETMASK
107 "netmask=" MK_STR(CONFIG_NETMASK) "\0"
109 #ifdef CONFIG_HOSTNAME
110 "hostname=" MK_STR(CONFIG_HOSTNAME) "\0"
112 #ifdef CONFIG_BOOTFILE
113 "bootfile=" MK_STR(CONFIG_BOOTFILE) "\0"
115 #ifdef CONFIG_LOADADDR
116 "loadaddr=" MK_STR(CONFIG_LOADADDR) "\0"
118 #ifdef CONFIG_CLOCKS_IN_MHZ
121 #if defined(CONFIG_PCI_BOOTDELAY) && (CONFIG_PCI_BOOTDELAY > 0)
122 "pcidelay=" MK_STR(CONFIG_PCI_BOOTDELAY) "\0"
124 #ifdef CONFIG_NETCONSOLE_PORT
125 "ncport=" MK_STR(CONFIG_NETCONSOLE_PORT) "\0"
127 #ifdef CONFIG_EXTRA_ENV_SETTINGS
128 CONFIG_EXTRA_ENV_SETTINGS
132 #if defined(CFG_ENV_IS_IN_NAND) /* Environment is in Nand Flash */
133 int default_environment_size = sizeof(default_environment);
136 void env_crc_update(void){
137 env_ptr->crc = crc32(0, env_ptr->data, ENV_SIZE);
140 static uchar env_get_char_init(int index){
143 /* if crc was bad, use the default environment */
145 c = env_get_char_spec(index);
147 c = default_environment[index];
153 uchar env_get_char_memory(int index){
155 return(*((uchar *)(gd->env_addr + index)));
157 return(default_environment[index]);
161 uchar *env_get_addr(int index){
163 return(((uchar *)(gd->env_addr + index)));
165 return(&default_environment[index]);
169 void env_relocate(void){
170 DEBUGF("%s[%d] offset = 0x%lx\n", __FUNCTION__,__LINE__, gd->reloc_off);
172 #if defined(ENV_IS_EMBEDDED)
174 * The environment buffer is embedded with the text segment,
175 * just relocate the environment pointer
177 env_ptr = (env_t *)((ulong)env_ptr + gd->reloc_off);
178 DEBUGF("%s[%d] embedded ENV at %p\n", __FUNCTION__,__LINE__,env_ptr);
181 * We must allocate a buffer for the environment
183 env_ptr = (env_t *)malloc(CFG_ENV_SIZE);
184 DEBUGF("%s[%d] malloced ENV at %p\n", __FUNCTION__,__LINE__,env_ptr);
188 * After relocation to RAM, we can always use the "memory" functions
190 env_get_char = env_get_char_memory;
192 if(gd->env_valid == 0){
193 #if defined(CFG_ENV_IS_NOWHERE) /* Environment not changable */
194 //puts("Using default environment\n\n");
196 puts("** Warning: bad env CRC, using default,\n"
197 " use 'saveenv' to save it in FLASH\n\n");
200 if(sizeof(default_environment) > ENV_SIZE){
201 puts("## Error: default environment is too large\n");
205 memset(env_ptr, 0, sizeof(env_t));
206 memcpy(env_ptr->data, default_environment, sizeof(default_environment));
207 #ifdef CFG_REDUNDAND_ENVIRONMENT
208 env_ptr->flags = 0xFF;
215 gd->env_addr = (ulong)&(env_ptr->data);