All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH] Global Data: Flagify have_console and env_valid
@ 2011-08-26 13:23 Graeme Russ
  2011-08-26 13:36 ` [U-Boot] [PATCH V2] " Graeme Russ
  0 siblings, 1 reply; 6+ messages in thread
From: Graeme Russ @ 2011-08-26 13:23 UTC (permalink / raw)
  To: u-boot


Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
---
 arch/arm/include/asm/global_data.h        |    5 ++-
 arch/avr32/include/asm/global_data.h      |    5 ++-
 arch/blackfin/include/asm/global_data.h   |    5 ++-
 arch/blackfin/lib/board.c                 |    2 -
 arch/m68k/include/asm/global_data.h       |    5 ++-
 arch/microblaze/include/asm/global_data.h |    5 ++-
 arch/mips/include/asm/global_data.h       |    5 ++-
 arch/nios2/include/asm/global_data.h      |    5 ++-
 arch/powerpc/cpu/mpc5xxx/i2c.c            |   20 ++++++------
 arch/powerpc/cpu/mpc8xx/i2c.c             |   12 ++++----
 arch/powerpc/include/asm/global_data.h    |    5 ++-
 arch/sh/include/asm/global_data.h         |    5 ++-
 arch/sparc/include/asm/global_data.h      |    5 ++-
 arch/x86/include/asm/global_data.h        |   36 +++++++++++-----------
 board/edb93xx/edb93xx.c                   |    2 +-
 board/matrix_vision/common/mv_common.c    |    2 +-
 board/zeus/zeus.c                         |    2 +-
 common/console.c                          |    4 +-
 common/env_common.c                       |    6 ++--
 common/env_dataflash.c                    |    6 ++--
 common/env_eeprom.c                       |   36 +++++++++++-----------
 common/env_flash.c                        |   26 ++++++++--------
 common/env_mgdisk.c                       |    2 +-
 common/env_mmc.c                          |    2 +-
 common/env_nand.c                         |   45 +++++++++++++++-------------
 common/env_nowhere.c                      |    2 +-
 common/env_nvram.c                        |    4 +-
 common/env_onenand.c                      |    4 +-
 common/env_sf.c                           |   31 +++++++++++--------
 drivers/i2c/ppc4xx_i2c.c                  |    2 +-
 drivers/i2c/soft_i2c.c                    |    6 ++--
 include/environment.h                     |   18 +++++++++++
 32 files changed, 177 insertions(+), 143 deletions(-)

diff --git a/arch/arm/include/asm/global_data.h b/arch/arm/include/asm/global_data.h
index 4fc51fd..b190aa1 100644
--- a/arch/arm/include/asm/global_data.h
+++ b/arch/arm/include/asm/global_data.h
@@ -37,9 +37,7 @@ typedef	struct	global_data {
 	bd_t		*bd;
 	unsigned long	flags;
 	unsigned long	baudrate;
-	unsigned long	have_console;	/* serial_init() was called */
 	unsigned long	env_addr;	/* Address  of Environment struct */
-	unsigned long	env_valid;	/* Checksum of Environment valid? */
 	unsigned long	fb_base;	/* base address of frame buffer */
 #ifdef CONFIG_FSL_ESDHC
 	unsigned long	sdhc_clk;
@@ -88,6 +86,9 @@ typedef	struct	global_data {
 #define	GD_FLG_LOGINIT		0x00020	/* Log Buffer has been initialized	*/
 #define GD_FLG_DISABLE_CONSOLE	0x00040	/* Disable console (in & out)		*/
 #define GD_FLG_ENV_READY	0x00080	/* Environment imported into hash table	*/
+#define GD_FLG_HAVE_CONSOLE	0x00100	/* serial_init() was called 		*/
+#define GD_FLG_PRI_ENV_VALID	0x00200	/* Primary environment valid		*/
+#define GD_FLG_RED_ENV_VALID	0x00400	/* Redundant environment valid		*/

 #define DECLARE_GLOBAL_DATA_PTR     register volatile gd_t *gd asm ("r8")

diff --git a/arch/avr32/include/asm/global_data.h b/arch/avr32/include/asm/global_data.h
index 4ef8fc5..010b358 100644
--- a/arch/avr32/include/asm/global_data.h
+++ b/arch/avr32/include/asm/global_data.h
@@ -37,10 +37,8 @@ typedef	struct	global_data {
 	unsigned long	flags;
 	unsigned long	baudrate;
 	unsigned long	stack_end;	/* highest stack address */
-	unsigned long	have_console;	/* serial_init() was called */
 	unsigned long	reloc_off;	/* Relocation Offset */
 	unsigned long	env_addr;	/* Address of env struct */
-	unsigned long	env_valid;	/* Checksum of env valid? */
 	unsigned long	cpu_hz;		/* cpu core clock frequency */
 #if defined(CONFIG_LCD)
 	void		*fb_base;	/* framebuffer address */
@@ -60,6 +58,9 @@ typedef	struct	global_data {
 #define	GD_FLG_LOGINIT		0x00020	/* Log Buffer has been initialized	*/
 #define GD_FLG_DISABLE_CONSOLE	0x00040	/* Disable console (in & out)		*/
 #define GD_FLG_ENV_READY	0x00080	/* Environment imported into hash table	*/
+#define GD_FLG_HAVE_CONSOLE	0x00100	/* serial_init() was called 		*/
+#define GD_FLG_PRI_ENV_VALID	0x00200	/* Primary environment valid		*/
+#define GD_FLG_RED_ENV_VALID	0x00400	/* Redundant environment valid		*/

 #define DECLARE_GLOBAL_DATA_PTR register gd_t *gd asm("r5")

diff --git a/arch/blackfin/include/asm/global_data.h b/arch/blackfin/include/asm/global_data.h
index eba5e93..73dbeed 100644
--- a/arch/blackfin/include/asm/global_data.h
+++ b/arch/blackfin/include/asm/global_data.h
@@ -44,10 +44,8 @@ typedef struct global_data {
 	unsigned long flags;
 	unsigned long board_type;
 	unsigned long baudrate;
-	unsigned long have_console;	/* serial_init() was called */
 	phys_size_t ram_size;		/* RAM size */
 	unsigned long env_addr;	/* Address  of Environment struct */
-	unsigned long env_valid;	/* Checksum of Environment valid? */
 #if defined(CONFIG_POST) || defined(CONFIG_LOGBUFFER)
 	unsigned long post_log_word;	/* Record POST activities */
 	unsigned long post_init_f_time;	/* When post_init_f started */
@@ -68,6 +66,9 @@ typedef struct global_data {
 #define	GD_FLG_LOGINIT		0x00020	/* Log Buffer has been initialized	*/
 #define GD_FLG_DISABLE_CONSOLE	0x00040	/* Disable console (in & out)		*/
 #define GD_FLG_ENV_READY	0x00080	/* Environment imported into hash table	*/
+#define GD_FLG_HAVE_CONSOLE	0x00100	/* serial_init() was called 		*/
+#define GD_FLG_PRI_ENV_VALID	0x00200	/* Primary environment valid		*/
+#define GD_FLG_RED_ENV_VALID	0x00400	/* Redundant environment valid		*/

 #define DECLARE_GLOBAL_DATA_PTR     register gd_t * volatile gd asm ("P3")

diff --git a/arch/blackfin/lib/board.c b/arch/blackfin/lib/board.c
index bfdb586..d388516 100644
--- a/arch/blackfin/lib/board.c
+++ b/arch/blackfin/lib/board.c
@@ -83,10 +83,8 @@ static void display_global_data(void)
 	printf(" |-flags: %lx\n", gd->flags);
 	printf(" |-board_type: %lx\n", gd->board_type);
 	printf(" |-baudrate: %lu\n", gd->baudrate);
-	printf(" |-have_console: %lx\n", gd->have_console);
 	printf(" |-ram_size: %lx\n", gd->ram_size);
 	printf(" |-env_addr: %lx\n", gd->env_addr);
-	printf(" |-env_valid: %lx\n", gd->env_valid);
 	printf(" |-jt(%p): %p\n", gd->jt, *(gd->jt));
 	printf(" \\-bd: %p\n", gd->bd);
 	printf("   |-bi_baudrate: %x\n", bd->bi_baudrate);
diff --git a/arch/m68k/include/asm/global_data.h b/arch/m68k/include/asm/global_data.h
index fc486fd..b95e810 100644
--- a/arch/m68k/include/asm/global_data.h
+++ b/arch/m68k/include/asm/global_data.h
@@ -55,8 +55,6 @@ typedef	struct	global_data {
 	unsigned long	reloc_off;	/* Relocation Offset */
 	unsigned long	reset_status;	/* reset status register at boot	*/
 	unsigned long	env_addr;	/* Address  of Environment struct	*/
-	unsigned long	env_valid;	/* Checksum of Environment valid?	*/
-	unsigned long	have_console;	/* serial_init() was called		*/
 #if defined(CONFIG_LCD) || defined(CONFIG_VIDEO)
 	unsigned long	fb_base;	/* Base addr of framebuffer memory */
 #endif
@@ -78,6 +76,9 @@ typedef	struct	global_data {
 #define	GD_FLG_LOGINIT		0x00020	/* Log Buffer has been initialized	*/
 #define GD_FLG_DISABLE_CONSOLE	0x00040	/* Disable console (in & out)		*/
 #define GD_FLG_ENV_READY	0x00080	/* Environment imported into hash table	*/
+#define GD_FLG_HAVE_CONSOLE	0x00100	/* serial_init() was called 		*/
+#define GD_FLG_PRI_ENV_VALID	0x00200	/* Primary environment valid		*/
+#define GD_FLG_RED_ENV_VALID	0x00400	/* Redundant environment valid		*/

 #if 0
 extern gd_t *global_data;
diff --git a/arch/microblaze/include/asm/global_data.h b/arch/microblaze/include/asm/global_data.h
index 557ad27..b37f934 100644
--- a/arch/microblaze/include/asm/global_data.h
+++ b/arch/microblaze/include/asm/global_data.h
@@ -38,9 +38,7 @@ typedef	struct	global_data {
 	bd_t		*bd;
 	unsigned long	flags;
 	unsigned long	baudrate;
-	unsigned long	have_console;	/* serial_init() was called */
 	unsigned long	env_addr;	/* Address  of Environment struct */
-	unsigned long	env_valid;	/* Checksum of Environment valid? */
 	unsigned long	fb_base;	/* base address of frame buffer */
 	void		**jt;		/* jump table */
 	char		env_buf[32];	/* buffer for getenv() before reloc. */
@@ -57,6 +55,9 @@ typedef	struct	global_data {
 #define	GD_FLG_LOGINIT		0x00020	/* Log Buffer has been initialized	*/
 #define GD_FLG_DISABLE_CONSOLE	0x00040	/* Disable console (in & out)		*/
 #define GD_FLG_ENV_READY	0x00080	/* Environment imported into hash table	*/
+#define GD_FLG_HAVE_CONSOLE	0x00100	/* serial_init() was called 		*/
+#define GD_FLG_PRI_ENV_VALID	0x00200	/* Primary environment valid		*/
+#define GD_FLG_RED_ENV_VALID	0x00400	/* Redundant environment valid		*/

 #define DECLARE_GLOBAL_DATA_PTR     register volatile gd_t *gd asm ("r31")

diff --git a/arch/mips/include/asm/global_data.h b/arch/mips/include/asm/global_data.h
index 271a290..a3a5f75 100644
--- a/arch/mips/include/asm/global_data.h
+++ b/arch/mips/include/asm/global_data.h
@@ -40,11 +40,9 @@ typedef	struct	global_data {
 	bd_t		*bd;
 	unsigned long	flags;
 	unsigned long	baudrate;
-	unsigned long	have_console;	/* serial_init() was called */
 	phys_size_t	ram_size;	/* RAM size */
 	unsigned long	reloc_off;	/* Relocation Offset */
 	unsigned long	env_addr;	/* Address  of Environment struct */
-	unsigned long	env_valid;	/* Checksum of Environment valid? */
 	void		**jt;		/* jump table */
 	char		env_buf[32];	/* buffer for getenv() before reloc. */
 } gd_t;
@@ -60,6 +58,9 @@ typedef	struct	global_data {
 #define	GD_FLG_LOGINIT		0x00020	/* Log Buffer has been initialized	*/
 #define GD_FLG_DISABLE_CONSOLE	0x00040	/* Disable console (in & out)		*/
 #define GD_FLG_ENV_READY	0x00080	/* Environment imported into hash table	*/
+#define GD_FLG_HAVE_CONSOLE	0x00100	/* serial_init() was called 		*/
+#define GD_FLG_PRI_ENV_VALID	0x00200	/* Primary environment valid		*/
+#define GD_FLG_RED_ENV_VALID	0x00400	/* Redundant environment valid		*/

 #define DECLARE_GLOBAL_DATA_PTR     register volatile gd_t *gd asm ("k0")

diff --git a/arch/nios2/include/asm/global_data.h b/arch/nios2/include/asm/global_data.h
index 2c4a719..a3d1801 100644
--- a/arch/nios2/include/asm/global_data.h
+++ b/arch/nios2/include/asm/global_data.h
@@ -28,10 +28,8 @@ typedef	struct	global_data {
 	unsigned long	flags;
 	unsigned long	baudrate;
 	unsigned long	cpu_clk;	/* CPU clock in Hz!		*/
-	unsigned long	have_console;	/* serial_init() was called */
 	phys_size_t	ram_size;	/* RAM size */
 	unsigned long	env_addr;	/* Address  of Environment struct */
-	unsigned long	env_valid;	/* Checksum of Environment valid */
 #if defined(CONFIG_POST) || defined(CONFIG_LOGBUFFER)
 	unsigned long	post_log_word;	/* Record POST activities */
 	unsigned long	post_init_f_time; /* When post_init_f started */
@@ -49,6 +47,9 @@ typedef	struct	global_data {
 #define	GD_FLG_LOGINIT		0x00020	/* Log Buffer has been initialized	*/
 #define GD_FLG_DISABLE_CONSOLE	0x00040	/* Disable console (in & out)		*/
 #define GD_FLG_ENV_READY	0x00080	/* Environment imported into hash table	*/
+#define GD_FLG_HAVE_CONSOLE	0x00100	/* serial_init() was called 		*/
+#define GD_FLG_PRI_ENV_VALID	0x00200	/* Primary environment valid		*/
+#define GD_FLG_RED_ENV_VALID	0x00400	/* Redundant environment valid		*/

 #define DECLARE_GLOBAL_DATA_PTR     register gd_t *gd asm ("gp")

diff --git a/arch/powerpc/cpu/mpc5xxx/i2c.c b/arch/powerpc/cpu/mpc5xxx/i2c.c
index 9fb330f..2ae8121 100644
--- a/arch/powerpc/cpu/mpc5xxx/i2c.c
+++ b/arch/powerpc/cpu/mpc5xxx/i2c.c
@@ -332,7 +332,7 @@ static int mpc_get_fdr(int speed)
 		if (gd->flags & GD_FLG_RELOC) {
 			fdr = divider;
 		} else {
-			if (gd->have_console)
+			if (gd->flags & GD_FLG_HAVE_CONSOLE)
 				printf("%ld kHz, ", best_speed / 1000);
 			return divider;
 		}
@@ -374,33 +374,33 @@ int i2c_read(uchar chip, uint addr, int alen, uchar *buf, int len)
 	xaddr[3] =  addr	& 0xFF;

 	if (wait_for_bb()) {
-		if (gd->have_console)
+		if (gd->flags & GD_FLG_HAVE_CONSOLE)
 			printf("i2c_read: bus is busy\n");
 		goto Done;
 	}

 	mpc_reg_out(&regs->mcr, I2C_STA, I2C_STA);
 	if (do_address(chip, 0)) {
-		if (gd->have_console)
+		if (gd->flags & GD_FLG_HAVE_CONSOLE)
 			printf("i2c_read: failed to address chip\n");
 		goto Done;
 	}

 	if (send_bytes(chip, &xaddr[4-alen], alen)) {
-		if (gd->have_console)
+		if (gd->flags & GD_FLG_HAVE_CONSOLE)
 			printf("i2c_read: send_bytes failed\n");
 		goto Done;
 	}

 	mpc_reg_out(&regs->mcr, I2C_RSTA, I2C_RSTA);
 	if (do_address(chip, 1)) {
-		if (gd->have_console)
+		if (gd->flags & GD_FLG_HAVE_CONSOLE)
 			printf("i2c_read: failed to address chip\n");
 		goto Done;
 	}

 	if (receive_bytes(chip, (char *)buf, len)) {
-		if (gd->have_console)
+		if (gd->flags & GD_FLG_HAVE_CONSOLE)
 			printf("i2c_read: receive_bytes failed\n");
 		goto Done;
 	}
@@ -423,26 +423,26 @@ int i2c_write(uchar chip, uint addr, int alen, uchar *buf, int len)
 	xaddr[3] =  addr	& 0xFF;

 	if (wait_for_bb()) {
-		if (gd->have_console)
+		if (gd->flags & GD_FLG_HAVE_CONSOLE)
 			printf("i2c_write: bus is busy\n");
 		goto Done;
 	}

 	mpc_reg_out(&regs->mcr, I2C_STA, I2C_STA);
 	if (do_address(chip, 0)) {
-		if (gd->have_console)
+		if (gd->flags & GD_FLG_HAVE_CONSOLE)
 			printf("i2c_write: failed to address chip\n");
 		goto Done;
 	}

 	if (send_bytes(chip, &xaddr[4-alen], alen)) {
-		if (gd->have_console)
+		if (gd->flags & GD_FLG_HAVE_CONSOLE)
 			printf("i2c_write: send_bytes failed\n");
 		goto Done;
 	}

 	if (send_bytes(chip, (char *)buf, len)) {
-		if (gd->have_console)
+		if (gd->flags & GD_FLG_HAVE_CONSOLE)
 			printf("i2c_write: send_bytes failed\n");
 		goto Done;
 	}
diff --git a/arch/powerpc/cpu/mpc8xx/i2c.c b/arch/powerpc/cpu/mpc8xx/i2c.c
index 338caba..e33d1a0 100644
--- a/arch/powerpc/cpu/mpc8xx/i2c.c
+++ b/arch/powerpc/cpu/mpc8xx/i2c.c
@@ -633,21 +633,21 @@ int i2c_read(uchar chip, uint addr, int alen, uchar *buffer, int len)

 	rc = i2c_send(&state, chip, 0, I2CF_START_COND, alen, &xaddr[4-alen]);
 	if (rc != 0) {
-		if (gd->have_console)
+		if (gd->flags & GD_FLG_HAVE_CONSOLE)
 			printf("i2c_read: i2c_send failed (%d)\n", rc);
 		return 1;
 	}

 	rc = i2c_receive(&state, chip, 0, I2CF_STOP_COND, len, buffer);
 	if (rc != 0) {
-		if (gd->have_console)
+		if (gd->flags & GD_FLG_HAVE_CONSOLE)
 			printf("i2c_read: i2c_receive failed (%d)\n", rc);
 		return 1;
 	}

 	rc = i2c_doio(&state);
 	if (rc != 0) {
-		if (gd->have_console)
+		if (gd->flags & GD_FLG_HAVE_CONSOLE)
 			printf("i2c_read: i2c_doio failed (%d)\n", rc);
 		return 1;
 	}
@@ -683,21 +683,21 @@ int i2c_write(uchar chip, uint addr, int alen, uchar *buffer, int len)

 	rc = i2c_send(&state, chip, 0, I2CF_START_COND, alen, &xaddr[4-alen]);
 	if (rc != 0) {
-		if (gd->have_console)
+		if (gd->flags & GD_FLG_HAVE_CONSOLE)
 			printf("i2c_write: first i2c_send failed (%d)\n", rc);
 		return 1;
 	}

 	rc = i2c_send(&state, 0, 0, I2CF_STOP_COND, len, buffer);
 	if (rc != 0) {
-		if (gd->have_console)
+		if (gd->flags & GD_FLG_HAVE_CONSOLE)
 			printf("i2c_write: second i2c_send failed (%d)\n", rc);
 		return 1;
 	}

 	rc = i2c_doio(&state);
 	if (rc != 0) {
-		if (gd->have_console)
+		if (gd->flags & GD_FLG_HAVE_CONSOLE)
 			printf("i2c_write: i2c_doio failed (%d)\n", rc);
 		return 1;
 	}
diff --git a/arch/powerpc/include/asm/global_data.h b/arch/powerpc/include/asm/global_data.h
index a33ca2f..5a73a24 100644
--- a/arch/powerpc/include/asm/global_data.h
+++ b/arch/powerpc/include/asm/global_data.h
@@ -136,8 +136,6 @@ typedef	struct	global_data {
 	unsigned long	arbiter_event_address;
 #endif
 	unsigned long	env_addr;	/* Address  of Environment struct	*/
-	unsigned long	env_valid;	/* Checksum of Environment valid?	*/
-	unsigned long	have_console;	/* serial_init() was called		*/
 #if defined(CONFIG_SYS_ALLOC_DPRAM) || defined(CONFIG_CPM2)
 	unsigned int	dp_alloc_base;
 	unsigned int	dp_alloc_top;
@@ -193,6 +191,9 @@ typedef	struct	global_data {
 #define	GD_FLG_LOGINIT		0x00020	/* Log Buffer has been initialized	*/
 #define GD_FLG_DISABLE_CONSOLE	0x00040	/* Disable console (in & out)		*/
 #define GD_FLG_ENV_READY	0x00080	/* Environment imported into hash table	*/
+#define GD_FLG_HAVE_CONSOLE	0x00100	/* serial_init() was called 		*/
+#define GD_FLG_PRI_ENV_VALID	0x00200	/* Primary environment valid		*/
+#define GD_FLG_RED_ENV_VALID	0x00400	/* Redundant environment valid		*/

 #if 1
 #define DECLARE_GLOBAL_DATA_PTR     register volatile gd_t *gd asm ("r2")
diff --git a/arch/sh/include/asm/global_data.h b/arch/sh/include/asm/global_data.h
index 0c09ba9..d27d21e 100644
--- a/arch/sh/include/asm/global_data.h
+++ b/arch/sh/include/asm/global_data.h
@@ -33,10 +33,8 @@ typedef	struct global_data
 	unsigned long	flags;
 	unsigned long	baudrate;
 	unsigned long	cpu_clk;	/* CPU clock in Hz! */
-	unsigned long	have_console;	/* serial_init() was called */
 	phys_size_t	ram_size;	/* RAM size */
 	unsigned long	env_addr;	/* Address  of Environment struct */
-	unsigned long	env_valid;	/* Checksum of Environment valid */
 	void		**jt;		/* Standalone app jump table */
 	char		env_buf[32];	/* buffer for getenv() before reloc. */
 } gd_t;
@@ -49,6 +47,9 @@ typedef	struct global_data
 #define	GD_FLG_LOGINIT		0x00020	/* Log Buffer has been initialized	*/
 #define GD_FLG_DISABLE_CONSOLE	0x00040	/* Disable console (in & out)		*/
 #define GD_FLG_ENV_READY	0x00080	/* Environment imported into hash table	*/
+#define GD_FLG_HAVE_CONSOLE	0x00100	/* serial_init() was called 		*/
+#define GD_FLG_PRI_ENV_VALID	0x00200	/* Primary environment valid		*/
+#define GD_FLG_RED_ENV_VALID	0x00400	/* Redundant environment valid		*/

 #define DECLARE_GLOBAL_DATA_PTR	register gd_t *gd asm ("r13")

diff --git a/arch/sparc/include/asm/global_data.h b/arch/sparc/include/asm/global_data.h
index 9b14674..08984f8 100644
--- a/arch/sparc/include/asm/global_data.h
+++ b/arch/sparc/include/asm/global_data.h
@@ -50,8 +50,6 @@ typedef struct global_data {
 	unsigned long reloc_off;	/* Relocation Offset */
 	unsigned long reset_status;	/* reset status register at boot        */
 	unsigned long env_addr;	/* Address  of Environment struct       */
-	unsigned long env_valid;	/* Checksum of Environment valid?       */
-	unsigned long have_console;	/* serial_init() was called */

 #if defined(CONFIG_LCD) || defined(CONFIG_VIDEO)
 	unsigned long fb_base;	/* Base address of framebuffer memory   */
@@ -85,6 +83,9 @@ typedef struct global_data {
 #define	GD_FLG_LOGINIT		0x00020	/* Log Buffer has been initialized	*/
 #define GD_FLG_DISABLE_CONSOLE	0x00040	/* Disable console (in & out)		*/
 #define GD_FLG_ENV_READY	0x00080	/* Environment imported into hash table	*/
+#define GD_FLG_HAVE_CONSOLE	0x00100	/* serial_init() was called 		*/
+#define GD_FLG_PRI_ENV_VALID	0x00200	/* Primary environment valid		*/
+#define GD_FLG_RED_ENV_VALID	0x00400	/* Redundant environment valid		*/

 #define DECLARE_GLOBAL_DATA_PTR     register volatile gd_t *gd asm ("%g7")

diff --git a/arch/x86/include/asm/global_data.h b/arch/x86/include/asm/global_data.h
index f8a16d6..2902e61 100644
--- a/arch/x86/include/asm/global_data.h
+++ b/arch/x86/include/asm/global_data.h
@@ -39,11 +39,9 @@ typedef	struct global_data {
 	bd_t		*bd;
 	unsigned long	flags;
 	unsigned long	baudrate;
-	unsigned long	have_console;	/* serial_init() was called */
 	unsigned long	reloc_off;	/* Relocation Offset */
 	unsigned long	load_off;	/* Load Offset */
 	unsigned long	env_addr;	/* Address  of Environment struct */
-	unsigned long	env_valid;	/* Checksum of Environment valid? */
 	unsigned long	cpu_clk;	/* CPU clock in Hz!		*/
 	unsigned long	bus_clk;
 	unsigned long	relocaddr;	/* Start address of U-Boot in RAM */
@@ -59,23 +57,21 @@ extern gd_t *gd;
 #endif

 /* Word Offsets into Global Data - MUST match struct gd_t */
-#define GD_BD		0
-#define GD_FLAGS	1
-#define GD_BAUDRATE	2
-#define GD_HAVE_CONSOLE	3
-#define GD_RELOC_OFF	4
-#define GD_LOAD_OFF	5
-#define GD_ENV_ADDR	6
-#define GD_ENV_VALID	7
-#define GD_CPU_CLK	8
-#define GD_BUS_CLK	9
-#define GD_RELOC_ADDR	10
-#define GD_START_ADDR_SP	11
-#define GD_RAM_SIZE	12
-#define GD_RESET_STATUS	13
-#define GD_JT		14
+#define GD_BD			0
+#define GD_FLAGS		1
+#define GD_BAUDRATE		2
+#define GD_RELOC_OFF		3
+#define GD_LOAD_OFF		4
+#define GD_ENV_ADDR		5
+#define GD_CPU_CLK		6
+#define GD_BUS_CLK		7
+#define GD_RELOC_ADDR		8
+#define GD_START_ADDR_SP	9
+#define GD_RAM_SIZE		10
+#define GD_RESET_STATUS		11
+#define GD_JT			12

-#define GD_SIZE		15
+#define GD_SIZE			13

 /*
  * Global Data Flags
@@ -90,6 +86,10 @@ extern gd_t *gd;
 #define GD_FLG_ENV_READY	0x00080	/* Environment imported into hash table	*/
 #define GD_FLG_COLD_BOOT	0x00100	/* Cold Boot */
 #define GD_FLG_WARM_BOOT	0x00200	/* Warm Boot */
+#define GD_FLG_HAVE_CONSOLE	0x00400	/* Warm Boot */
+#define GD_FLG_PRI_ENV_VALID	0x00800	/* Primary environment valid		*/
+#define GD_FLG_RED_ENV_VALID	0x01000	/* Redundant environment valid		*/
+

 #if 0
 #define DECLARE_GLOBAL_DATA_PTR
diff --git a/board/edb93xx/edb93xx.c b/board/edb93xx/edb93xx.c
index dde30ff..80dfec7 100644
--- a/board/edb93xx/edb93xx.c
+++ b/board/edb93xx/edb93xx.c
@@ -77,7 +77,7 @@ int board_init(void)
 	gd->bd->bi_boot_params = LINUX_BOOT_PARAM_ADDR;

 	/* We have a console */
-	gd->have_console = 1;
+	gd->flags &= GD_FLG_HAVE_CONSOLE;

 	return 0;
 }
diff --git a/board/matrix_vision/common/mv_common.c b/board/matrix_vision/common/mv_common.c
index 404c8b4..cadbe0b 100644
--- a/board/matrix_vision/common/mv_common.c
+++ b/board/matrix_vision/common/mv_common.c
@@ -56,7 +56,7 @@ void mv_reset_environment(void)
 		}
 	}

-	gd->env_valid = 0;
+	SET_NO_ENV_VALID();
 	env_relocate();

 	for (i = 0; i < MV_KEEP_ENTRIES; i++) {
diff --git a/board/zeus/zeus.c b/board/zeus/zeus.c
index 18cb85f..c877c65 100644
--- a/board/zeus/zeus.c
+++ b/board/zeus/zeus.c
@@ -224,7 +224,7 @@ static int restore_default(void)

 	set_default_env("");

-	gd->env_valid = 1;
+	SET_PRIMARY_ENV_VALID();

 	/*
 	 * Read board specific values from I2C EEPROM
diff --git a/common/console.c b/common/console.c
index 8c650e0..6b69ecd 100644
--- a/common/console.c
+++ b/common/console.c
@@ -404,7 +404,7 @@ static int ctrlc_disabled = 0;	/* see disable_ctrl() */
 static int ctrlc_was_pressed = 0;
 int ctrlc(void)
 {
-	if (!ctrlc_disabled && gd->have_console) {
+	if (!ctrlc_disabled && (gd->flags & GD_FLG_HAVE_CONSOLE)) {
 		if (tstc()) {
 			switch (getc()) {
 			case 0x03:		/* ^C - Control C */
@@ -522,7 +522,7 @@ int console_assign(int file, const char *devname)
 /* Called before relocation - use serial functions */
 int console_init_f(void)
 {
-	gd->have_console = 1;
+	gd->flags &= GD_FLG_HAVE_CONSOLE;

 #ifdef CONFIG_SILENT_CONSOLE
 	if (getenv("silent") != NULL)
diff --git a/common/env_common.c b/common/env_common.c
index 19149b5..aaf7304 100644
--- a/common/env_common.c
+++ b/common/env_common.c
@@ -136,7 +136,7 @@ static uchar env_get_char_init (int index)
 	uchar c;

 	/* if crc was bad, use the default environment */
-	if (gd->env_valid)
+	if (gd->flags & (GD_FLG_PRI_ENV_VALID | GD_FLG_RED_ENV_VALID))
 		c = env_get_char_spec(index);
 	else
 		c = default_environment[index];
@@ -164,7 +164,7 @@ uchar env_get_char (int index)

 const uchar *env_get_addr (int index)
 {
-	if (gd->env_valid)
+	if (gd->flags & (GD_FLG_PRI_ENV_VALID | GD_FLG_RED_ENV_VALID))
 		return (uchar *)(gd->env_addr + index);
 	else
 		return &default_environment[index];
@@ -234,7 +234,7 @@ void env_relocate (void)

 	env_reloc();
 #endif
-	if (gd->env_valid == 0) {
+	if (!(gd->flags & (GD_FLG_PRI_ENV_VALID | GD_FLG_RED_ENV_VALID))) {
 #if defined(CONFIG_ENV_IS_NOWHERE)	/* Environment not changable */
 		set_default_env(NULL);
 #else
diff --git a/common/env_dataflash.c b/common/env_dataflash.c
index 1d57079..d90ec05 100644
--- a/common/env_dataflash.c
+++ b/common/env_dataflash.c
@@ -92,7 +92,7 @@ int env_init(void)
 	unsigned off;
 	uchar buf[64];

-	if (gd->env_valid)
+	if (gd->flags & (GD_FLG_PRI_ENV_VALID | GD_FLG_RED_ENV_VALID))
 		return 0;

 	AT91F_DataflashInit();	/* prepare for DATAFLASH read/write */
@@ -116,10 +116,10 @@ int env_init(void)

 	if (crc == new) {
 		gd->env_addr  = offsetof(env_t,data);
-		gd->env_valid = 1;
+		SET_PRIMARY_ENV_VALID();
 	} else {
 		gd->env_addr  = (ulong)&default_environment[0];
-		gd->env_valid = 0;
+		SET_NO_ENV_VALID();
 	}

 	return 0;
diff --git a/common/env_eeprom.c b/common/env_eeprom.c
index 0a179ad..24b017a 100644
--- a/common/env_eeprom.c
+++ b/common/env_eeprom.c
@@ -101,7 +101,7 @@ uchar env_get_char_spec (int index)
 	off = CONFIG_ENV_OFFSET;

 #ifdef CONFIG_ENV_OFFSET_REDUND
-	if (gd->env_valid == 2)
+	if (gd->flags & GD_FLG_RED_ENV_VALID)
 		off = CONFIG_ENV_OFFSET_REDUND;
 #endif
 	eeprom_bus_read(CONFIG_SYS_DEF_EEPROM_ADDR,
@@ -117,7 +117,7 @@ void env_relocate_spec (void)
 	unsigned int off = CONFIG_ENV_OFFSET;

 #ifdef CONFIG_ENV_OFFSET_REDUND
-	if (gd->env_valid == 2)
+	if (gd->flags & GD_FLG_RED_ENV_VALID)
 		off = CONFIG_ENV_OFFSET_REDUND;
 #endif
 	eeprom_bus_read(CONFIG_SYS_DEF_EEPROM_ADDR,
@@ -151,7 +151,7 @@ int saveenv(void)
 	env_new.crc = crc32(0, env_new.data, ENV_SIZE);

 #ifdef CONFIG_ENV_OFFSET_REDUND
-	if (gd->env_valid == 1) {
+	if (gd->flags & GD_FLG_PRI_ENV_VALID) {
 		off = CONFIG_ENV_OFFSET_REDUND;
 		off_red = CONFIG_ENV_OFFSET;
 	}
@@ -170,10 +170,10 @@ int saveenv(void)
 				  off_red + offsetof(env_t,flags),
 				  (uchar *)&flag_obsolete,
 				  1);
-		if (gd->env_valid == 1)
-			gd->env_valid = 2;
+		if (gd->flags & GD_FLG_PRI_ENV_VALID)
+			SET_REDUNDANT_ENV_VALID();
 		else
-			gd->env_valid = 1;
+			SET_PRIMARY_ENV_VALID();

 	}
 #endif
@@ -233,31 +233,31 @@ int env_init(void)

 	if (!crc_ok[0] && !crc_ok[1]) {
 		gd->env_addr  = 0;
-		gd->env_valid = 0;
+		SET_NO_ENV_VALID();

 		return 0;
 	} else if (crc_ok[0] && !crc_ok[1]) {
-		gd->env_valid = 1;
+		SET_PRIMARY_ENV_VALID();
 	}
 	else if (!crc_ok[0] && crc_ok[1]) {
-		gd->env_valid = 2;
+		SET_REDUNDANT_ENV_VALID();
 	} else {
 		/* both ok - check serial */
 		if (flags[0] == ACTIVE_FLAG && flags[1] == OBSOLETE_FLAG)
-			gd->env_valid = 1;
+			SET_PRIMARY_ENV_VALID();
 		else if (flags[0] == OBSOLETE_FLAG && flags[1] == ACTIVE_FLAG)
-			gd->env_valid = 2;
+			SET_REDUNDANT_ENV_VALID();
 		else if (flags[0] == 0xFF && flags[1] == 0)
-			gd->env_valid = 2;
+			SET_REDUNDANT_ENV_VALID();
 		else if(flags[1] == 0xFF && flags[0] == 0)
-			gd->env_valid = 1;
+			SET_PRIMARY_ENV_VALID();
 		else /* flags are equal - almost impossible */
-			gd->env_valid = 1;
+			SET_PRIMARY_ENV_VALID();
 	}

-	if (gd->env_valid == 2)
+	if (gd->flags & GD_FLG_RED_ENV_VALID)
 		gd->env_addr = off_env[1] + offsetof(env_t,data);
-	else if (gd->env_valid == 1)
+	else if (gd->flags & GD_FLG_PRI_ENV_VALID)
 		gd->env_addr = off_env[0] + offsetof(env_t,data);

 	return (0);
@@ -292,10 +292,10 @@ int env_init(void)

 	if (crc == new) {
 		gd->env_addr  = offsetof(env_t,data);
-		gd->env_valid = 1;
+		SET_PRIMARY_ENV_VALID();
 	} else {
 		gd->env_addr  = 0;
-		gd->env_valid = 0;
+		SET_NO_ENV_VALID();
 	}

 	return (0);
diff --git a/common/env_flash.c b/common/env_flash.c
index 50ca4ffa..20586e1 100644
--- a/common/env_flash.c
+++ b/common/env_flash.c
@@ -100,28 +100,28 @@ int  env_init(void)

 	if (crc1_ok && ! crc2_ok) {
 		gd->env_addr  = addr1;
-		gd->env_valid = 1;
+		SET_PRIMARY_ENV_VALID();
 	} else if (! crc1_ok && crc2_ok) {
 		gd->env_addr  = addr2;
-		gd->env_valid = 1;
+		SET_PRIMARY_ENV_VALID();
 	} else if (! crc1_ok && ! crc2_ok) {
 		gd->env_addr  = addr_default;
-		gd->env_valid = 0;
+		SET_NO_ENV_VALID();
 	} else if (flag1 == ACTIVE_FLAG && flag2 == OBSOLETE_FLAG) {
 		gd->env_addr  = addr1;
-		gd->env_valid = 1;
+		SET_PRIMARY_ENV_VALID();
 	} else if (flag1 == OBSOLETE_FLAG && flag2 == ACTIVE_FLAG) {
 		gd->env_addr  = addr2;
-		gd->env_valid = 1;
+		SET_PRIMARY_ENV_VALID();
 	} else if (flag1 == flag2) {
 		gd->env_addr  = addr1;
-		gd->env_valid = 2;
+		SET_REDUNDANT_ENV_VALID();
 	} else if (flag1 == 0xFF) {
 		gd->env_addr  = addr1;
-		gd->env_valid = 2;
+		SET_REDUNDANT_ENV_VALID();
 	} else if (flag2 == 0xFF) {
 		gd->env_addr  = addr2;
-		gd->env_valid = 2;
+		SET_REDUNDANT_ENV_VALID();
 	}

 	return 0;
@@ -244,12 +244,12 @@ int  env_init(void)
 {
 	if (crc32(0, env_ptr->data, ENV_SIZE) == env_ptr->crc) {
 		gd->env_addr  = (ulong)&(env_ptr->data);
-		gd->env_valid = 1;
+		SET_PRIMARY_ENV_VALID();
 		return(0);
 	}

 	gd->env_addr  = (ulong)&default_environment[0];
-	gd->env_valid = 0;
+	SET_NO_ENV_VALID();
 	return 0;
 }

@@ -351,7 +351,7 @@ void env_relocate_spec(void)
 	    flash_addr_new->crc) {
 		char flag = OBSOLETE_FLAG;

-		gd->env_valid = 2;
+		SET_REDUNDANT_ENV_VALID();
 		flash_sect_protect(0, (ulong)flash_addr_new, end_addr_new);
 		flash_write(&flag,
 			    (ulong)&(flash_addr_new->flags),
@@ -363,7 +363,7 @@ void env_relocate_spec(void)
 	    (flash_addr->flags & ACTIVE_FLAG) == ACTIVE_FLAG) {
 		char flag = ACTIVE_FLAG;

-		gd->env_valid = 2;
+		SET_REDUNDANT_ENV_VALID();
 		flash_sect_protect(0, (ulong)flash_addr, end_addr);
 		flash_write(&flag,
 			    (ulong)&(flash_addr->flags),
@@ -371,7 +371,7 @@ void env_relocate_spec(void)
 		flash_sect_protect(1, (ulong)flash_addr, end_addr);
 	}

-	if (gd->env_valid == 2)
+	if (gd->flags & GD_FLG_RED_ENV_VALID)
 		puts ("*** Warning - some problems detected "
 		      "reading environment; recovered successfully\n\n");
 #endif /* CONFIG_ENV_ADDR_REDUND */
diff --git a/common/env_mgdisk.c b/common/env_mgdisk.c
index a69923b..0a91317 100644
--- a/common/env_mgdisk.c
+++ b/common/env_mgdisk.c
@@ -78,7 +78,7 @@ int env_init(void)
 {
 	/* use default */
 	gd->env_addr = (ulong)&default_environment[0];
-	gd->env_valid = 1;
+	SET_PRIMARY_ENV_VALID();

 	return 0;
 }
diff --git a/common/env_mmc.c b/common/env_mmc.c
index 83f40f4..b69efcb 100644
--- a/common/env_mmc.c
+++ b/common/env_mmc.c
@@ -73,7 +73,7 @@ int env_init(void)
 {
 	/* use default */
 	gd->env_addr = (ulong)&default_environment[0];
-	gd->env_valid = 1;
+	SET_PRIMARY_ENV_VALID();

 	return 0;
 }
diff --git a/common/env_nand.c b/common/env_nand.c
index 14446a6..9440a1e 100644
--- a/common/env_nand.c
+++ b/common/env_nand.c
@@ -108,41 +108,41 @@ int env_init(void)

 	if (!crc1_ok && !crc2_ok) {
 		gd->env_addr  = 0;
-		gd->env_valid = 0;
+		SET_NO_ENV_VALID();

 		return 0;
 	} else if (crc1_ok && !crc2_ok) {
-		gd->env_valid = 1;
+		SET_PRIMARY_ENV_VALID();
 	}
 #ifdef CONFIG_ENV_OFFSET_REDUND
 	else if (!crc1_ok && crc2_ok) {
-		gd->env_valid = 2;
+		SET_REDUNDANT_ENV_VALID();
 	} else {
 		/* both ok - check serial */
 		if(tmp_env1->flags == 255 && tmp_env2->flags == 0)
-			gd->env_valid = 2;
+			SET_REDUNDANT_ENV_VALID();
 		else if(tmp_env2->flags == 255 && tmp_env1->flags == 0)
-			gd->env_valid = 1;
+			SET_PRIMARY_ENV_VALID();
 		else if(tmp_env1->flags > tmp_env2->flags)
-			gd->env_valid = 1;
+			SET_PRIMARY_ENV_VALID();
 		else if(tmp_env2->flags > tmp_env1->flags)
-			gd->env_valid = 2;
+			SET_REDUNDANT_ENV_VALID();
 		else /* flags are equal - almost impossible */
-			gd->env_valid = 1;
+			SET_PRIMARY_ENV_VALID();
 	}

-	if (gd->env_valid == 2)
+	if (gd->flags & GD_FLG_RED_ENV_VALID)
 		env_ptr = tmp_env2;
 	else
 #endif
-	if (gd->env_valid == 1)
+	if (gd->flags & GD_FLG_PRI_ENV_VALID)
 		env_ptr = tmp_env1;

 	gd->env_addr = (ulong)env_ptr->data;

 #else /* ENV_IS_EMBEDDED || CONFIG_NAND_ENV_DST */
 	gd->env_addr  = (ulong)&default_environment[0];
-	gd->env_valid = 1;
+	SET_PRIMARY_ENV_VALID();
 #endif /* ENV_IS_EMBEDDED || CONFIG_NAND_ENV_DST */

 	return (0);
@@ -208,7 +208,7 @@ int saveenv(void)
 	env_new.crc   = crc32(0, env_new.data, ENV_SIZE);
 	env_new.flags = ++env_flags; /* increase the serial */

-	if(gd->env_valid == 1) {
+	if(gd->flags & GD_FLG_PRI_ENV_VALID) {
 		puts("Erasing redundant NAND...\n");
 		nand_erase_options.offset = CONFIG_ENV_OFFSET_REDUND;
 		if (nand_erase_opts(&nand_info[0], &nand_erase_options))
@@ -234,7 +234,10 @@ int saveenv(void)

 	puts("done\n");

-	gd->env_valid = (gd->env_valid == 2 ? 1 : 2);
+	if (gd->flags & GD_FLG_RED_ENV_VALID)
+		SET_PRIMARY_ENV_VALID();
+	else
+		SET_REDUNDANT_ENV_VALID();

 	return ret;
 }
@@ -373,27 +376,27 @@ void env_relocate_spec(void)
 		set_default_env("!bad CRC");
 		return;
 	} else if (crc1_ok && !crc2_ok) {
-		gd->env_valid = 1;
+		SET_PRIMARY_ENV_VALID();
 	} else if (!crc1_ok && crc2_ok) {
-		gd->env_valid = 2;
+		SET_REDUNDANT_ENV_VALID();
 	} else {
 		/* both ok - check serial */
 		if (tmp_env1->flags == 255 && tmp_env2->flags == 0)
-			gd->env_valid = 2;
+			SET_REDUNDANT_ENV_VALID();
 		else if (tmp_env2->flags == 255 && tmp_env1->flags == 0)
-			gd->env_valid = 1;
+			SET_PRIMARY_ENV_VALID();
 		else if (tmp_env1->flags > tmp_env2->flags)
-			gd->env_valid = 1;
+			SET_PRIMARY_ENV_VALID();
 		else if (tmp_env2->flags > tmp_env1->flags)
-			gd->env_valid = 2;
+			SET_REDUNDANT_ENV_VALID();
 		else /* flags are equal - almost impossible */
-			gd->env_valid = 1;
+			SET_PRIMARY_ENV_VALID();

 	}

 	free(env_ptr);

-	if (gd->env_valid == 1)
+	if (gd->flags & GD_FLG_PRI_ENV_VALID)
 		ep = tmp_env1;
 	else
 		ep = tmp_env2;
diff --git a/common/env_nowhere.c b/common/env_nowhere.c
index 75ef78d..9441575 100644
--- a/common/env_nowhere.c
+++ b/common/env_nowhere.c
@@ -52,7 +52,7 @@ uchar env_get_char_spec(int index)
 int env_init(void)
 {
 	gd->env_addr  = (ulong)&default_environment[0];
-	gd->env_valid = 0;
+	SET_NO_ENV_VALID();

 	return (0);
 }
diff --git a/common/env_nvram.c b/common/env_nvram.c
index 544ce47..78ea38b 100644
--- a/common/env_nvram.c
+++ b/common/env_nvram.c
@@ -131,10 +131,10 @@ int env_init(void)
 	if (crc32(0, env_ptr->data, ENV_SIZE) == env_ptr->crc) {
 		gd->env_addr  = (ulong)&(env_ptr->data);
 #endif
-		gd->env_valid = 1;
+		SET_PRIMARY_ENV_VALID();
 	} else {
 		gd->env_addr  = (ulong)&default_environment[0];
-		gd->env_valid = 0;
+		SET_NO_ENV_VALID();
 	}
 	return (0);
 }
diff --git a/common/env_onenand.c b/common/env_onenand.c
index 5e04a06..5201b35 100644
--- a/common/env_onenand.c
+++ b/common/env_onenand.c
@@ -90,7 +90,7 @@ void env_relocate_spec(void)

 	rc = env_import(buf, 1);
 	if (rc)
-		gd->env_valid = 1;
+		SET_PRIMARY_ENV_VALID();
 }

 int saveenv(void)
@@ -145,7 +145,7 @@ int env_init(void)
 {
 	/* use default */
 	gd->env_addr = (ulong) & default_environment[0];
-	gd->env_valid = 1;
+	SET_PRIMARY_ENV_VALID();

 	return 0;
 }
diff --git a/common/env_sf.c b/common/env_sf.c
index d3b36d0..0e9d136 100644
--- a/common/env_sf.c
+++ b/common/env_sf.c
@@ -99,7 +99,7 @@ int saveenv(void)
 	env_new.crc   = crc32(0, env_new.data, ENV_SIZE);
 	env_new.flags = ACTIVE_FLAG;

-	if (gd->env_valid == 1) {
+	if (gd->flags & GD_FLG_PRI_ENV_VALID) {
 		env_new_offset = CONFIG_ENV_OFFSET_REDUND;
 		env_offset = CONFIG_ENV_OFFSET;
 	} else {
@@ -156,9 +156,14 @@ int saveenv(void)

 	puts("done\n");

-	gd->env_valid = (gd->env_valid == 2 ? 1 : 2);
+	if (gd->flags & GD_FLG_RED_ENV_VALID) {
+		SET_PRIMARY_ENV_VALID();
+		printf("Valid environment: Primary\n");
+	} else {
+		SET_REDUNDANT_ENV_VALID();
+		printf("Valid environment: Redundant\n");
+	}

-	printf("Valid environment: %d\n", (int)gd->env_valid);

  done:
 	if (saved_buffer)
@@ -210,28 +215,28 @@ void env_relocate_spec(void)
 		set_default_env("!bad CRC");
 		goto err_read;
 	} else if (crc1_ok && !crc2_ok) {
-		gd->env_valid = 1;
+		SET_PRIMARY_ENV_VALID();
 	} else if (!crc1_ok && crc2_ok) {
-		gd->env_valid = 2;
+		SET_REDUNDANT_ENV_VALID();
 	} else if (tmp_env1->flags == ACTIVE_FLAG &&
 		   tmp_env2->flags == OBSOLETE_FLAG) {
-		gd->env_valid = 1;
+		SET_PRIMARY_ENV_VALID();
 	} else if (tmp_env1->flags == OBSOLETE_FLAG &&
 		   tmp_env2->flags == ACTIVE_FLAG) {
-		gd->env_valid = 2;
+		SET_REDUNDANT_ENV_VALID();
 	} else if (tmp_env1->flags == tmp_env2->flags) {
-		gd->env_valid = 2;
+		SET_REDUNDANT_ENV_VALID();
 	} else if (tmp_env1->flags == 0xFF) {
-		gd->env_valid = 2;
+		SET_REDUNDANT_ENV_VALID();
 	} else {
 		/*
 		 * this differs from code in env_flash.c, but I think a sane
 		 * default path is desirable.
 		 */
-		gd->env_valid = 2;
+		SET_REDUNDANT_ENV_VALID();
 	}

-	if (gd->env_valid == 1)
+	if (gd->flags & GD_FLG_PRI_ENV_VALID)
 		ep = tmp_env1;
 	else
 		ep = tmp_env2;
@@ -350,7 +355,7 @@ void env_relocate_spec(void)
 	ret = env_import(buf, 1);

 	if (ret)
-		gd->env_valid = 1;
+		SET_PRIMARY_ENV_VALID();
 out:
 	spi_flash_free(env_flash);
 	env_flash = NULL;
@@ -361,7 +366,7 @@ int env_init(void)
 {
 	/* SPI flash isn't usable before relocation */
 	gd->env_addr = (ulong)&default_environment[0];
-	gd->env_valid = 1;
+	SET_PRIMARY_ENV_VALID();

 	return 0;
 }
diff --git a/drivers/i2c/ppc4xx_i2c.c b/drivers/i2c/ppc4xx_i2c.c
index c1cbe55..4c980d5 100644
--- a/drivers/i2c/ppc4xx_i2c.c
+++ b/drivers/i2c/ppc4xx_i2c.c
@@ -396,7 +396,7 @@ static int ppc4xx_i2c_transfer(uchar chip, uint addr, int alen, uchar *buffer,
 #endif
 	if ((ret = i2c_transfer(read, chip << 1, &xaddr[4 - alen], alen,
 				buffer, len)) != 0) {
-		if (gd->have_console) {
+		if (gd->flags & GD_FLG_HAVE_CONSOLE) {
 			printf("I2C %s: failed %d\n",
 			       read ? "read" : "write", ret);
 		}
diff --git a/drivers/i2c/soft_i2c.c b/drivers/i2c/soft_i2c.c
index 9b02e89..9e1dd44 100644
--- a/drivers/i2c/soft_i2c.c
+++ b/drivers/i2c/soft_i2c.c
@@ -118,9 +118,9 @@ DECLARE_GLOBAL_DATA_PTR;


 #ifdef DEBUG_I2C
-#define PRINTD(fmt,args...)	do {	\
-	if (gd->have_console)		\
-		printf (fmt ,##args);	\
+#define PRINTD(fmt,args...)	do {		\
+	if (gd->flags & GD_FLG_HAVE_CONSOLE)	\
+		printf (fmt ,##args);		\
 	} while (0)
 #else
 #define PRINTD(fmt,args...)
diff --git a/include/environment.h b/include/environment.h
index 6394a96..5f2b583 100644
--- a/include/environment.h
+++ b/include/environment.h
@@ -152,6 +152,24 @@ typedef	struct environment_s {
 	unsigned char	data[ENV_SIZE]; /* Environment data		*/
 } env_t;

+#define SET_NO_ENV_VALID()				\
+	do {						\
+		gd->flags &= ~(GD_FLG_PRI_ENV_VALID |	\
+				GD_FLG_RED_ENV_VALID);	\
+	} while (0)
+
+#define SET_PRIMARY_ENV_VALID()				\
+	do {						\
+		SET_NO_ENV_VALID();			\
+		gd->flags |= GD_FLG_PRI_ENV_VALID;	\
+	} while (0)
+
+#define SET_REDUNDANT_ENV_VALID()			\
+	do {						\
+		SET_NO_ENV_VALID();			\
+		gd->flags |= GD_FLG_RED_ENV_VALID;	\
+	} while (0)
+
 #ifndef DO_DEPS_ONLY

 #include <search.h>
--
1.7.5.2.317.g391b14

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [U-Boot] [PATCH V2] Global Data: Flagify have_console and env_valid
  2011-08-26 13:23 [U-Boot] [PATCH] Global Data: Flagify have_console and env_valid Graeme Russ
@ 2011-08-26 13:36 ` Graeme Russ
  2011-08-26 20:15   ` Mike Frysinger
  2011-10-06 21:48   ` Wolfgang Denk
  0 siblings, 2 replies; 6+ messages in thread
From: Graeme Russ @ 2011-08-26 13:36 UTC (permalink / raw)
  To: u-boot


Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
---
Changes since V1:
 - In common/console.c, gd->flags &= GD_FLG_HAVE_CONSOLE change to |=

 arch/arm/include/asm/global_data.h        |    5 ++-
 arch/avr32/include/asm/global_data.h      |    5 ++-
 arch/blackfin/include/asm/global_data.h   |    5 ++-
 arch/blackfin/lib/board.c                 |    2 -
 arch/m68k/include/asm/global_data.h       |    5 ++-
 arch/microblaze/include/asm/global_data.h |    5 ++-
 arch/mips/include/asm/global_data.h       |    5 ++-
 arch/nios2/include/asm/global_data.h      |    5 ++-
 arch/powerpc/cpu/mpc5xxx/i2c.c            |   20 ++++++------
 arch/powerpc/cpu/mpc8xx/i2c.c             |   12 ++++----
 arch/powerpc/include/asm/global_data.h    |    5 ++-
 arch/sh/include/asm/global_data.h         |    5 ++-
 arch/sparc/include/asm/global_data.h      |    5 ++-
 arch/x86/include/asm/global_data.h        |   36 +++++++++++-----------
 board/edb93xx/edb93xx.c                   |    2 +-
 board/matrix_vision/common/mv_common.c    |    2 +-
 board/zeus/zeus.c                         |    2 +-
 common/console.c                          |    4 +-
 common/env_common.c                       |    6 ++--
 common/env_dataflash.c                    |    6 ++--
 common/env_eeprom.c                       |   36 +++++++++++-----------
 common/env_flash.c                        |   26 ++++++++--------
 common/env_mgdisk.c                       |    2 +-
 common/env_mmc.c                          |    2 +-
 common/env_nand.c                         |   45 +++++++++++++++-------------
 common/env_nowhere.c                      |    2 +-
 common/env_nvram.c                        |    4 +-
 common/env_onenand.c                      |    4 +-
 common/env_sf.c                           |   31 +++++++++++--------
 drivers/i2c/ppc4xx_i2c.c                  |    2 +-
 drivers/i2c/soft_i2c.c                    |    6 ++--
 include/environment.h                     |   18 +++++++++++
 32 files changed, 177 insertions(+), 143 deletions(-)

diff --git a/arch/arm/include/asm/global_data.h b/arch/arm/include/asm/global_data.h
index 4fc51fd..b190aa1 100644
--- a/arch/arm/include/asm/global_data.h
+++ b/arch/arm/include/asm/global_data.h
@@ -37,9 +37,7 @@ typedef	struct	global_data {
 	bd_t		*bd;
 	unsigned long	flags;
 	unsigned long	baudrate;
-	unsigned long	have_console;	/* serial_init() was called */
 	unsigned long	env_addr;	/* Address  of Environment struct */
-	unsigned long	env_valid;	/* Checksum of Environment valid? */
 	unsigned long	fb_base;	/* base address of frame buffer */
 #ifdef CONFIG_FSL_ESDHC
 	unsigned long	sdhc_clk;
@@ -88,6 +86,9 @@ typedef	struct	global_data {
 #define	GD_FLG_LOGINIT		0x00020	/* Log Buffer has been initialized	*/
 #define GD_FLG_DISABLE_CONSOLE	0x00040	/* Disable console (in & out)		*/
 #define GD_FLG_ENV_READY	0x00080	/* Environment imported into hash table	*/
+#define GD_FLG_HAVE_CONSOLE	0x00100	/* serial_init() was called 		*/
+#define GD_FLG_PRI_ENV_VALID	0x00200	/* Primary environment valid		*/
+#define GD_FLG_RED_ENV_VALID	0x00400	/* Redundant environment valid		*/

 #define DECLARE_GLOBAL_DATA_PTR     register volatile gd_t *gd asm ("r8")

diff --git a/arch/avr32/include/asm/global_data.h b/arch/avr32/include/asm/global_data.h
index 4ef8fc5..010b358 100644
--- a/arch/avr32/include/asm/global_data.h
+++ b/arch/avr32/include/asm/global_data.h
@@ -37,10 +37,8 @@ typedef	struct	global_data {
 	unsigned long	flags;
 	unsigned long	baudrate;
 	unsigned long	stack_end;	/* highest stack address */
-	unsigned long	have_console;	/* serial_init() was called */
 	unsigned long	reloc_off;	/* Relocation Offset */
 	unsigned long	env_addr;	/* Address of env struct */
-	unsigned long	env_valid;	/* Checksum of env valid? */
 	unsigned long	cpu_hz;		/* cpu core clock frequency */
 #if defined(CONFIG_LCD)
 	void		*fb_base;	/* framebuffer address */
@@ -60,6 +58,9 @@ typedef	struct	global_data {
 #define	GD_FLG_LOGINIT		0x00020	/* Log Buffer has been initialized	*/
 #define GD_FLG_DISABLE_CONSOLE	0x00040	/* Disable console (in & out)		*/
 #define GD_FLG_ENV_READY	0x00080	/* Environment imported into hash table	*/
+#define GD_FLG_HAVE_CONSOLE	0x00100	/* serial_init() was called 		*/
+#define GD_FLG_PRI_ENV_VALID	0x00200	/* Primary environment valid		*/
+#define GD_FLG_RED_ENV_VALID	0x00400	/* Redundant environment valid		*/

 #define DECLARE_GLOBAL_DATA_PTR register gd_t *gd asm("r5")

diff --git a/arch/blackfin/include/asm/global_data.h b/arch/blackfin/include/asm/global_data.h
index eba5e93..73dbeed 100644
--- a/arch/blackfin/include/asm/global_data.h
+++ b/arch/blackfin/include/asm/global_data.h
@@ -44,10 +44,8 @@ typedef struct global_data {
 	unsigned long flags;
 	unsigned long board_type;
 	unsigned long baudrate;
-	unsigned long have_console;	/* serial_init() was called */
 	phys_size_t ram_size;		/* RAM size */
 	unsigned long env_addr;	/* Address  of Environment struct */
-	unsigned long env_valid;	/* Checksum of Environment valid? */
 #if defined(CONFIG_POST) || defined(CONFIG_LOGBUFFER)
 	unsigned long post_log_word;	/* Record POST activities */
 	unsigned long post_init_f_time;	/* When post_init_f started */
@@ -68,6 +66,9 @@ typedef struct global_data {
 #define	GD_FLG_LOGINIT		0x00020	/* Log Buffer has been initialized	*/
 #define GD_FLG_DISABLE_CONSOLE	0x00040	/* Disable console (in & out)		*/
 #define GD_FLG_ENV_READY	0x00080	/* Environment imported into hash table	*/
+#define GD_FLG_HAVE_CONSOLE	0x00100	/* serial_init() was called 		*/
+#define GD_FLG_PRI_ENV_VALID	0x00200	/* Primary environment valid		*/
+#define GD_FLG_RED_ENV_VALID	0x00400	/* Redundant environment valid		*/

 #define DECLARE_GLOBAL_DATA_PTR     register gd_t * volatile gd asm ("P3")

diff --git a/arch/blackfin/lib/board.c b/arch/blackfin/lib/board.c
index bfdb586..d388516 100644
--- a/arch/blackfin/lib/board.c
+++ b/arch/blackfin/lib/board.c
@@ -83,10 +83,8 @@ static void display_global_data(void)
 	printf(" |-flags: %lx\n", gd->flags);
 	printf(" |-board_type: %lx\n", gd->board_type);
 	printf(" |-baudrate: %lu\n", gd->baudrate);
-	printf(" |-have_console: %lx\n", gd->have_console);
 	printf(" |-ram_size: %lx\n", gd->ram_size);
 	printf(" |-env_addr: %lx\n", gd->env_addr);
-	printf(" |-env_valid: %lx\n", gd->env_valid);
 	printf(" |-jt(%p): %p\n", gd->jt, *(gd->jt));
 	printf(" \\-bd: %p\n", gd->bd);
 	printf("   |-bi_baudrate: %x\n", bd->bi_baudrate);
diff --git a/arch/m68k/include/asm/global_data.h b/arch/m68k/include/asm/global_data.h
index fc486fd..b95e810 100644
--- a/arch/m68k/include/asm/global_data.h
+++ b/arch/m68k/include/asm/global_data.h
@@ -55,8 +55,6 @@ typedef	struct	global_data {
 	unsigned long	reloc_off;	/* Relocation Offset */
 	unsigned long	reset_status;	/* reset status register at boot	*/
 	unsigned long	env_addr;	/* Address  of Environment struct	*/
-	unsigned long	env_valid;	/* Checksum of Environment valid?	*/
-	unsigned long	have_console;	/* serial_init() was called		*/
 #if defined(CONFIG_LCD) || defined(CONFIG_VIDEO)
 	unsigned long	fb_base;	/* Base addr of framebuffer memory */
 #endif
@@ -78,6 +76,9 @@ typedef	struct	global_data {
 #define	GD_FLG_LOGINIT		0x00020	/* Log Buffer has been initialized	*/
 #define GD_FLG_DISABLE_CONSOLE	0x00040	/* Disable console (in & out)		*/
 #define GD_FLG_ENV_READY	0x00080	/* Environment imported into hash table	*/
+#define GD_FLG_HAVE_CONSOLE	0x00100	/* serial_init() was called 		*/
+#define GD_FLG_PRI_ENV_VALID	0x00200	/* Primary environment valid		*/
+#define GD_FLG_RED_ENV_VALID	0x00400	/* Redundant environment valid		*/

 #if 0
 extern gd_t *global_data;
diff --git a/arch/microblaze/include/asm/global_data.h b/arch/microblaze/include/asm/global_data.h
index 557ad27..b37f934 100644
--- a/arch/microblaze/include/asm/global_data.h
+++ b/arch/microblaze/include/asm/global_data.h
@@ -38,9 +38,7 @@ typedef	struct	global_data {
 	bd_t		*bd;
 	unsigned long	flags;
 	unsigned long	baudrate;
-	unsigned long	have_console;	/* serial_init() was called */
 	unsigned long	env_addr;	/* Address  of Environment struct */
-	unsigned long	env_valid;	/* Checksum of Environment valid? */
 	unsigned long	fb_base;	/* base address of frame buffer */
 	void		**jt;		/* jump table */
 	char		env_buf[32];	/* buffer for getenv() before reloc. */
@@ -57,6 +55,9 @@ typedef	struct	global_data {
 #define	GD_FLG_LOGINIT		0x00020	/* Log Buffer has been initialized	*/
 #define GD_FLG_DISABLE_CONSOLE	0x00040	/* Disable console (in & out)		*/
 #define GD_FLG_ENV_READY	0x00080	/* Environment imported into hash table	*/
+#define GD_FLG_HAVE_CONSOLE	0x00100	/* serial_init() was called 		*/
+#define GD_FLG_PRI_ENV_VALID	0x00200	/* Primary environment valid		*/
+#define GD_FLG_RED_ENV_VALID	0x00400	/* Redundant environment valid		*/

 #define DECLARE_GLOBAL_DATA_PTR     register volatile gd_t *gd asm ("r31")

diff --git a/arch/mips/include/asm/global_data.h b/arch/mips/include/asm/global_data.h
index 271a290..a3a5f75 100644
--- a/arch/mips/include/asm/global_data.h
+++ b/arch/mips/include/asm/global_data.h
@@ -40,11 +40,9 @@ typedef	struct	global_data {
 	bd_t		*bd;
 	unsigned long	flags;
 	unsigned long	baudrate;
-	unsigned long	have_console;	/* serial_init() was called */
 	phys_size_t	ram_size;	/* RAM size */
 	unsigned long	reloc_off;	/* Relocation Offset */
 	unsigned long	env_addr;	/* Address  of Environment struct */
-	unsigned long	env_valid;	/* Checksum of Environment valid? */
 	void		**jt;		/* jump table */
 	char		env_buf[32];	/* buffer for getenv() before reloc. */
 } gd_t;
@@ -60,6 +58,9 @@ typedef	struct	global_data {
 #define	GD_FLG_LOGINIT		0x00020	/* Log Buffer has been initialized	*/
 #define GD_FLG_DISABLE_CONSOLE	0x00040	/* Disable console (in & out)		*/
 #define GD_FLG_ENV_READY	0x00080	/* Environment imported into hash table	*/
+#define GD_FLG_HAVE_CONSOLE	0x00100	/* serial_init() was called 		*/
+#define GD_FLG_PRI_ENV_VALID	0x00200	/* Primary environment valid		*/
+#define GD_FLG_RED_ENV_VALID	0x00400	/* Redundant environment valid		*/

 #define DECLARE_GLOBAL_DATA_PTR     register volatile gd_t *gd asm ("k0")

diff --git a/arch/nios2/include/asm/global_data.h b/arch/nios2/include/asm/global_data.h
index 2c4a719..a3d1801 100644
--- a/arch/nios2/include/asm/global_data.h
+++ b/arch/nios2/include/asm/global_data.h
@@ -28,10 +28,8 @@ typedef	struct	global_data {
 	unsigned long	flags;
 	unsigned long	baudrate;
 	unsigned long	cpu_clk;	/* CPU clock in Hz!		*/
-	unsigned long	have_console;	/* serial_init() was called */
 	phys_size_t	ram_size;	/* RAM size */
 	unsigned long	env_addr;	/* Address  of Environment struct */
-	unsigned long	env_valid;	/* Checksum of Environment valid */
 #if defined(CONFIG_POST) || defined(CONFIG_LOGBUFFER)
 	unsigned long	post_log_word;	/* Record POST activities */
 	unsigned long	post_init_f_time; /* When post_init_f started */
@@ -49,6 +47,9 @@ typedef	struct	global_data {
 #define	GD_FLG_LOGINIT		0x00020	/* Log Buffer has been initialized	*/
 #define GD_FLG_DISABLE_CONSOLE	0x00040	/* Disable console (in & out)		*/
 #define GD_FLG_ENV_READY	0x00080	/* Environment imported into hash table	*/
+#define GD_FLG_HAVE_CONSOLE	0x00100	/* serial_init() was called 		*/
+#define GD_FLG_PRI_ENV_VALID	0x00200	/* Primary environment valid		*/
+#define GD_FLG_RED_ENV_VALID	0x00400	/* Redundant environment valid		*/

 #define DECLARE_GLOBAL_DATA_PTR     register gd_t *gd asm ("gp")

diff --git a/arch/powerpc/cpu/mpc5xxx/i2c.c b/arch/powerpc/cpu/mpc5xxx/i2c.c
index 9fb330f..2ae8121 100644
--- a/arch/powerpc/cpu/mpc5xxx/i2c.c
+++ b/arch/powerpc/cpu/mpc5xxx/i2c.c
@@ -332,7 +332,7 @@ static int mpc_get_fdr(int speed)
 		if (gd->flags & GD_FLG_RELOC) {
 			fdr = divider;
 		} else {
-			if (gd->have_console)
+			if (gd->flags & GD_FLG_HAVE_CONSOLE)
 				printf("%ld kHz, ", best_speed / 1000);
 			return divider;
 		}
@@ -374,33 +374,33 @@ int i2c_read(uchar chip, uint addr, int alen, uchar *buf, int len)
 	xaddr[3] =  addr	& 0xFF;

 	if (wait_for_bb()) {
-		if (gd->have_console)
+		if (gd->flags & GD_FLG_HAVE_CONSOLE)
 			printf("i2c_read: bus is busy\n");
 		goto Done;
 	}

 	mpc_reg_out(&regs->mcr, I2C_STA, I2C_STA);
 	if (do_address(chip, 0)) {
-		if (gd->have_console)
+		if (gd->flags & GD_FLG_HAVE_CONSOLE)
 			printf("i2c_read: failed to address chip\n");
 		goto Done;
 	}

 	if (send_bytes(chip, &xaddr[4-alen], alen)) {
-		if (gd->have_console)
+		if (gd->flags & GD_FLG_HAVE_CONSOLE)
 			printf("i2c_read: send_bytes failed\n");
 		goto Done;
 	}

 	mpc_reg_out(&regs->mcr, I2C_RSTA, I2C_RSTA);
 	if (do_address(chip, 1)) {
-		if (gd->have_console)
+		if (gd->flags & GD_FLG_HAVE_CONSOLE)
 			printf("i2c_read: failed to address chip\n");
 		goto Done;
 	}

 	if (receive_bytes(chip, (char *)buf, len)) {
-		if (gd->have_console)
+		if (gd->flags & GD_FLG_HAVE_CONSOLE)
 			printf("i2c_read: receive_bytes failed\n");
 		goto Done;
 	}
@@ -423,26 +423,26 @@ int i2c_write(uchar chip, uint addr, int alen, uchar *buf, int len)
 	xaddr[3] =  addr	& 0xFF;

 	if (wait_for_bb()) {
-		if (gd->have_console)
+		if (gd->flags & GD_FLG_HAVE_CONSOLE)
 			printf("i2c_write: bus is busy\n");
 		goto Done;
 	}

 	mpc_reg_out(&regs->mcr, I2C_STA, I2C_STA);
 	if (do_address(chip, 0)) {
-		if (gd->have_console)
+		if (gd->flags & GD_FLG_HAVE_CONSOLE)
 			printf("i2c_write: failed to address chip\n");
 		goto Done;
 	}

 	if (send_bytes(chip, &xaddr[4-alen], alen)) {
-		if (gd->have_console)
+		if (gd->flags & GD_FLG_HAVE_CONSOLE)
 			printf("i2c_write: send_bytes failed\n");
 		goto Done;
 	}

 	if (send_bytes(chip, (char *)buf, len)) {
-		if (gd->have_console)
+		if (gd->flags & GD_FLG_HAVE_CONSOLE)
 			printf("i2c_write: send_bytes failed\n");
 		goto Done;
 	}
diff --git a/arch/powerpc/cpu/mpc8xx/i2c.c b/arch/powerpc/cpu/mpc8xx/i2c.c
index 338caba..e33d1a0 100644
--- a/arch/powerpc/cpu/mpc8xx/i2c.c
+++ b/arch/powerpc/cpu/mpc8xx/i2c.c
@@ -633,21 +633,21 @@ int i2c_read(uchar chip, uint addr, int alen, uchar *buffer, int len)

 	rc = i2c_send(&state, chip, 0, I2CF_START_COND, alen, &xaddr[4-alen]);
 	if (rc != 0) {
-		if (gd->have_console)
+		if (gd->flags & GD_FLG_HAVE_CONSOLE)
 			printf("i2c_read: i2c_send failed (%d)\n", rc);
 		return 1;
 	}

 	rc = i2c_receive(&state, chip, 0, I2CF_STOP_COND, len, buffer);
 	if (rc != 0) {
-		if (gd->have_console)
+		if (gd->flags & GD_FLG_HAVE_CONSOLE)
 			printf("i2c_read: i2c_receive failed (%d)\n", rc);
 		return 1;
 	}

 	rc = i2c_doio(&state);
 	if (rc != 0) {
-		if (gd->have_console)
+		if (gd->flags & GD_FLG_HAVE_CONSOLE)
 			printf("i2c_read: i2c_doio failed (%d)\n", rc);
 		return 1;
 	}
@@ -683,21 +683,21 @@ int i2c_write(uchar chip, uint addr, int alen, uchar *buffer, int len)

 	rc = i2c_send(&state, chip, 0, I2CF_START_COND, alen, &xaddr[4-alen]);
 	if (rc != 0) {
-		if (gd->have_console)
+		if (gd->flags & GD_FLG_HAVE_CONSOLE)
 			printf("i2c_write: first i2c_send failed (%d)\n", rc);
 		return 1;
 	}

 	rc = i2c_send(&state, 0, 0, I2CF_STOP_COND, len, buffer);
 	if (rc != 0) {
-		if (gd->have_console)
+		if (gd->flags & GD_FLG_HAVE_CONSOLE)
 			printf("i2c_write: second i2c_send failed (%d)\n", rc);
 		return 1;
 	}

 	rc = i2c_doio(&state);
 	if (rc != 0) {
-		if (gd->have_console)
+		if (gd->flags & GD_FLG_HAVE_CONSOLE)
 			printf("i2c_write: i2c_doio failed (%d)\n", rc);
 		return 1;
 	}
diff --git a/arch/powerpc/include/asm/global_data.h b/arch/powerpc/include/asm/global_data.h
index a33ca2f..5a73a24 100644
--- a/arch/powerpc/include/asm/global_data.h
+++ b/arch/powerpc/include/asm/global_data.h
@@ -136,8 +136,6 @@ typedef	struct	global_data {
 	unsigned long	arbiter_event_address;
 #endif
 	unsigned long	env_addr;	/* Address  of Environment struct	*/
-	unsigned long	env_valid;	/* Checksum of Environment valid?	*/
-	unsigned long	have_console;	/* serial_init() was called		*/
 #if defined(CONFIG_SYS_ALLOC_DPRAM) || defined(CONFIG_CPM2)
 	unsigned int	dp_alloc_base;
 	unsigned int	dp_alloc_top;
@@ -193,6 +191,9 @@ typedef	struct	global_data {
 #define	GD_FLG_LOGINIT		0x00020	/* Log Buffer has been initialized	*/
 #define GD_FLG_DISABLE_CONSOLE	0x00040	/* Disable console (in & out)		*/
 #define GD_FLG_ENV_READY	0x00080	/* Environment imported into hash table	*/
+#define GD_FLG_HAVE_CONSOLE	0x00100	/* serial_init() was called 		*/
+#define GD_FLG_PRI_ENV_VALID	0x00200	/* Primary environment valid		*/
+#define GD_FLG_RED_ENV_VALID	0x00400	/* Redundant environment valid		*/

 #if 1
 #define DECLARE_GLOBAL_DATA_PTR     register volatile gd_t *gd asm ("r2")
diff --git a/arch/sh/include/asm/global_data.h b/arch/sh/include/asm/global_data.h
index 0c09ba9..d27d21e 100644
--- a/arch/sh/include/asm/global_data.h
+++ b/arch/sh/include/asm/global_data.h
@@ -33,10 +33,8 @@ typedef	struct global_data
 	unsigned long	flags;
 	unsigned long	baudrate;
 	unsigned long	cpu_clk;	/* CPU clock in Hz! */
-	unsigned long	have_console;	/* serial_init() was called */
 	phys_size_t	ram_size;	/* RAM size */
 	unsigned long	env_addr;	/* Address  of Environment struct */
-	unsigned long	env_valid;	/* Checksum of Environment valid */
 	void		**jt;		/* Standalone app jump table */
 	char		env_buf[32];	/* buffer for getenv() before reloc. */
 } gd_t;
@@ -49,6 +47,9 @@ typedef	struct global_data
 #define	GD_FLG_LOGINIT		0x00020	/* Log Buffer has been initialized	*/
 #define GD_FLG_DISABLE_CONSOLE	0x00040	/* Disable console (in & out)		*/
 #define GD_FLG_ENV_READY	0x00080	/* Environment imported into hash table	*/
+#define GD_FLG_HAVE_CONSOLE	0x00100	/* serial_init() was called 		*/
+#define GD_FLG_PRI_ENV_VALID	0x00200	/* Primary environment valid		*/
+#define GD_FLG_RED_ENV_VALID	0x00400	/* Redundant environment valid		*/

 #define DECLARE_GLOBAL_DATA_PTR	register gd_t *gd asm ("r13")

diff --git a/arch/sparc/include/asm/global_data.h b/arch/sparc/include/asm/global_data.h
index 9b14674..08984f8 100644
--- a/arch/sparc/include/asm/global_data.h
+++ b/arch/sparc/include/asm/global_data.h
@@ -50,8 +50,6 @@ typedef struct global_data {
 	unsigned long reloc_off;	/* Relocation Offset */
 	unsigned long reset_status;	/* reset status register at boot        */
 	unsigned long env_addr;	/* Address  of Environment struct       */
-	unsigned long env_valid;	/* Checksum of Environment valid?       */
-	unsigned long have_console;	/* serial_init() was called */

 #if defined(CONFIG_LCD) || defined(CONFIG_VIDEO)
 	unsigned long fb_base;	/* Base address of framebuffer memory   */
@@ -85,6 +83,9 @@ typedef struct global_data {
 #define	GD_FLG_LOGINIT		0x00020	/* Log Buffer has been initialized	*/
 #define GD_FLG_DISABLE_CONSOLE	0x00040	/* Disable console (in & out)		*/
 #define GD_FLG_ENV_READY	0x00080	/* Environment imported into hash table	*/
+#define GD_FLG_HAVE_CONSOLE	0x00100	/* serial_init() was called 		*/
+#define GD_FLG_PRI_ENV_VALID	0x00200	/* Primary environment valid		*/
+#define GD_FLG_RED_ENV_VALID	0x00400	/* Redundant environment valid		*/

 #define DECLARE_GLOBAL_DATA_PTR     register volatile gd_t *gd asm ("%g7")

diff --git a/arch/x86/include/asm/global_data.h b/arch/x86/include/asm/global_data.h
index f8a16d6..2902e61 100644
--- a/arch/x86/include/asm/global_data.h
+++ b/arch/x86/include/asm/global_data.h
@@ -39,11 +39,9 @@ typedef	struct global_data {
 	bd_t		*bd;
 	unsigned long	flags;
 	unsigned long	baudrate;
-	unsigned long	have_console;	/* serial_init() was called */
 	unsigned long	reloc_off;	/* Relocation Offset */
 	unsigned long	load_off;	/* Load Offset */
 	unsigned long	env_addr;	/* Address  of Environment struct */
-	unsigned long	env_valid;	/* Checksum of Environment valid? */
 	unsigned long	cpu_clk;	/* CPU clock in Hz!		*/
 	unsigned long	bus_clk;
 	unsigned long	relocaddr;	/* Start address of U-Boot in RAM */
@@ -59,23 +57,21 @@ extern gd_t *gd;
 #endif

 /* Word Offsets into Global Data - MUST match struct gd_t */
-#define GD_BD		0
-#define GD_FLAGS	1
-#define GD_BAUDRATE	2
-#define GD_HAVE_CONSOLE	3
-#define GD_RELOC_OFF	4
-#define GD_LOAD_OFF	5
-#define GD_ENV_ADDR	6
-#define GD_ENV_VALID	7
-#define GD_CPU_CLK	8
-#define GD_BUS_CLK	9
-#define GD_RELOC_ADDR	10
-#define GD_START_ADDR_SP	11
-#define GD_RAM_SIZE	12
-#define GD_RESET_STATUS	13
-#define GD_JT		14
+#define GD_BD			0
+#define GD_FLAGS		1
+#define GD_BAUDRATE		2
+#define GD_RELOC_OFF		3
+#define GD_LOAD_OFF		4
+#define GD_ENV_ADDR		5
+#define GD_CPU_CLK		6
+#define GD_BUS_CLK		7
+#define GD_RELOC_ADDR		8
+#define GD_START_ADDR_SP	9
+#define GD_RAM_SIZE		10
+#define GD_RESET_STATUS		11
+#define GD_JT			12

-#define GD_SIZE		15
+#define GD_SIZE			13

 /*
  * Global Data Flags
@@ -90,6 +86,10 @@ extern gd_t *gd;
 #define GD_FLG_ENV_READY	0x00080	/* Environment imported into hash table	*/
 #define GD_FLG_COLD_BOOT	0x00100	/* Cold Boot */
 #define GD_FLG_WARM_BOOT	0x00200	/* Warm Boot */
+#define GD_FLG_HAVE_CONSOLE	0x00400	/* Warm Boot */
+#define GD_FLG_PRI_ENV_VALID	0x00800	/* Primary environment valid		*/
+#define GD_FLG_RED_ENV_VALID	0x01000	/* Redundant environment valid		*/
+

 #if 0
 #define DECLARE_GLOBAL_DATA_PTR
diff --git a/board/edb93xx/edb93xx.c b/board/edb93xx/edb93xx.c
index dde30ff..80dfec7 100644
--- a/board/edb93xx/edb93xx.c
+++ b/board/edb93xx/edb93xx.c
@@ -77,7 +77,7 @@ int board_init(void)
 	gd->bd->bi_boot_params = LINUX_BOOT_PARAM_ADDR;

 	/* We have a console */
-	gd->have_console = 1;
+	gd->flags &= GD_FLG_HAVE_CONSOLE;

 	return 0;
 }
diff --git a/board/matrix_vision/common/mv_common.c b/board/matrix_vision/common/mv_common.c
index 404c8b4..cadbe0b 100644
--- a/board/matrix_vision/common/mv_common.c
+++ b/board/matrix_vision/common/mv_common.c
@@ -56,7 +56,7 @@ void mv_reset_environment(void)
 		}
 	}

-	gd->env_valid = 0;
+	SET_NO_ENV_VALID();
 	env_relocate();

 	for (i = 0; i < MV_KEEP_ENTRIES; i++) {
diff --git a/board/zeus/zeus.c b/board/zeus/zeus.c
index 18cb85f..c877c65 100644
--- a/board/zeus/zeus.c
+++ b/board/zeus/zeus.c
@@ -224,7 +224,7 @@ static int restore_default(void)

 	set_default_env("");

-	gd->env_valid = 1;
+	SET_PRIMARY_ENV_VALID();

 	/*
 	 * Read board specific values from I2C EEPROM
diff --git a/common/console.c b/common/console.c
index 8c650e0..acc4df3 100644
--- a/common/console.c
+++ b/common/console.c
@@ -404,7 +404,7 @@ static int ctrlc_disabled = 0;	/* see disable_ctrl() */
 static int ctrlc_was_pressed = 0;
 int ctrlc(void)
 {
-	if (!ctrlc_disabled && gd->have_console) {
+	if (!ctrlc_disabled && (gd->flags & GD_FLG_HAVE_CONSOLE)) {
 		if (tstc()) {
 			switch (getc()) {
 			case 0x03:		/* ^C - Control C */
@@ -522,7 +522,7 @@ int console_assign(int file, const char *devname)
 /* Called before relocation - use serial functions */
 int console_init_f(void)
 {
-	gd->have_console = 1;
+	gd->flags |= GD_FLG_HAVE_CONSOLE;

 #ifdef CONFIG_SILENT_CONSOLE
 	if (getenv("silent") != NULL)
diff --git a/common/env_common.c b/common/env_common.c
index 19149b5..aaf7304 100644
--- a/common/env_common.c
+++ b/common/env_common.c
@@ -136,7 +136,7 @@ static uchar env_get_char_init (int index)
 	uchar c;

 	/* if crc was bad, use the default environment */
-	if (gd->env_valid)
+	if (gd->flags & (GD_FLG_PRI_ENV_VALID | GD_FLG_RED_ENV_VALID))
 		c = env_get_char_spec(index);
 	else
 		c = default_environment[index];
@@ -164,7 +164,7 @@ uchar env_get_char (int index)

 const uchar *env_get_addr (int index)
 {
-	if (gd->env_valid)
+	if (gd->flags & (GD_FLG_PRI_ENV_VALID | GD_FLG_RED_ENV_VALID))
 		return (uchar *)(gd->env_addr + index);
 	else
 		return &default_environment[index];
@@ -234,7 +234,7 @@ void env_relocate (void)

 	env_reloc();
 #endif
-	if (gd->env_valid == 0) {
+	if (!(gd->flags & (GD_FLG_PRI_ENV_VALID | GD_FLG_RED_ENV_VALID))) {
 #if defined(CONFIG_ENV_IS_NOWHERE)	/* Environment not changable */
 		set_default_env(NULL);
 #else
diff --git a/common/env_dataflash.c b/common/env_dataflash.c
index 1d57079..d90ec05 100644
--- a/common/env_dataflash.c
+++ b/common/env_dataflash.c
@@ -92,7 +92,7 @@ int env_init(void)
 	unsigned off;
 	uchar buf[64];

-	if (gd->env_valid)
+	if (gd->flags & (GD_FLG_PRI_ENV_VALID | GD_FLG_RED_ENV_VALID))
 		return 0;

 	AT91F_DataflashInit();	/* prepare for DATAFLASH read/write */
@@ -116,10 +116,10 @@ int env_init(void)

 	if (crc == new) {
 		gd->env_addr  = offsetof(env_t,data);
-		gd->env_valid = 1;
+		SET_PRIMARY_ENV_VALID();
 	} else {
 		gd->env_addr  = (ulong)&default_environment[0];
-		gd->env_valid = 0;
+		SET_NO_ENV_VALID();
 	}

 	return 0;
diff --git a/common/env_eeprom.c b/common/env_eeprom.c
index 0a179ad..24b017a 100644
--- a/common/env_eeprom.c
+++ b/common/env_eeprom.c
@@ -101,7 +101,7 @@ uchar env_get_char_spec (int index)
 	off = CONFIG_ENV_OFFSET;

 #ifdef CONFIG_ENV_OFFSET_REDUND
-	if (gd->env_valid == 2)
+	if (gd->flags & GD_FLG_RED_ENV_VALID)
 		off = CONFIG_ENV_OFFSET_REDUND;
 #endif
 	eeprom_bus_read(CONFIG_SYS_DEF_EEPROM_ADDR,
@@ -117,7 +117,7 @@ void env_relocate_spec (void)
 	unsigned int off = CONFIG_ENV_OFFSET;

 #ifdef CONFIG_ENV_OFFSET_REDUND
-	if (gd->env_valid == 2)
+	if (gd->flags & GD_FLG_RED_ENV_VALID)
 		off = CONFIG_ENV_OFFSET_REDUND;
 #endif
 	eeprom_bus_read(CONFIG_SYS_DEF_EEPROM_ADDR,
@@ -151,7 +151,7 @@ int saveenv(void)
 	env_new.crc = crc32(0, env_new.data, ENV_SIZE);

 #ifdef CONFIG_ENV_OFFSET_REDUND
-	if (gd->env_valid == 1) {
+	if (gd->flags & GD_FLG_PRI_ENV_VALID) {
 		off = CONFIG_ENV_OFFSET_REDUND;
 		off_red = CONFIG_ENV_OFFSET;
 	}
@@ -170,10 +170,10 @@ int saveenv(void)
 				  off_red + offsetof(env_t,flags),
 				  (uchar *)&flag_obsolete,
 				  1);
-		if (gd->env_valid == 1)
-			gd->env_valid = 2;
+		if (gd->flags & GD_FLG_PRI_ENV_VALID)
+			SET_REDUNDANT_ENV_VALID();
 		else
-			gd->env_valid = 1;
+			SET_PRIMARY_ENV_VALID();

 	}
 #endif
@@ -233,31 +233,31 @@ int env_init(void)

 	if (!crc_ok[0] && !crc_ok[1]) {
 		gd->env_addr  = 0;
-		gd->env_valid = 0;
+		SET_NO_ENV_VALID();

 		return 0;
 	} else if (crc_ok[0] && !crc_ok[1]) {
-		gd->env_valid = 1;
+		SET_PRIMARY_ENV_VALID();
 	}
 	else if (!crc_ok[0] && crc_ok[1]) {
-		gd->env_valid = 2;
+		SET_REDUNDANT_ENV_VALID();
 	} else {
 		/* both ok - check serial */
 		if (flags[0] == ACTIVE_FLAG && flags[1] == OBSOLETE_FLAG)
-			gd->env_valid = 1;
+			SET_PRIMARY_ENV_VALID();
 		else if (flags[0] == OBSOLETE_FLAG && flags[1] == ACTIVE_FLAG)
-			gd->env_valid = 2;
+			SET_REDUNDANT_ENV_VALID();
 		else if (flags[0] == 0xFF && flags[1] == 0)
-			gd->env_valid = 2;
+			SET_REDUNDANT_ENV_VALID();
 		else if(flags[1] == 0xFF && flags[0] == 0)
-			gd->env_valid = 1;
+			SET_PRIMARY_ENV_VALID();
 		else /* flags are equal - almost impossible */
-			gd->env_valid = 1;
+			SET_PRIMARY_ENV_VALID();
 	}

-	if (gd->env_valid == 2)
+	if (gd->flags & GD_FLG_RED_ENV_VALID)
 		gd->env_addr = off_env[1] + offsetof(env_t,data);
-	else if (gd->env_valid == 1)
+	else if (gd->flags & GD_FLG_PRI_ENV_VALID)
 		gd->env_addr = off_env[0] + offsetof(env_t,data);

 	return (0);
@@ -292,10 +292,10 @@ int env_init(void)

 	if (crc == new) {
 		gd->env_addr  = offsetof(env_t,data);
-		gd->env_valid = 1;
+		SET_PRIMARY_ENV_VALID();
 	} else {
 		gd->env_addr  = 0;
-		gd->env_valid = 0;
+		SET_NO_ENV_VALID();
 	}

 	return (0);
diff --git a/common/env_flash.c b/common/env_flash.c
index 50ca4ffa..20586e1 100644
--- a/common/env_flash.c
+++ b/common/env_flash.c
@@ -100,28 +100,28 @@ int  env_init(void)

 	if (crc1_ok && ! crc2_ok) {
 		gd->env_addr  = addr1;
-		gd->env_valid = 1;
+		SET_PRIMARY_ENV_VALID();
 	} else if (! crc1_ok && crc2_ok) {
 		gd->env_addr  = addr2;
-		gd->env_valid = 1;
+		SET_PRIMARY_ENV_VALID();
 	} else if (! crc1_ok && ! crc2_ok) {
 		gd->env_addr  = addr_default;
-		gd->env_valid = 0;
+		SET_NO_ENV_VALID();
 	} else if (flag1 == ACTIVE_FLAG && flag2 == OBSOLETE_FLAG) {
 		gd->env_addr  = addr1;
-		gd->env_valid = 1;
+		SET_PRIMARY_ENV_VALID();
 	} else if (flag1 == OBSOLETE_FLAG && flag2 == ACTIVE_FLAG) {
 		gd->env_addr  = addr2;
-		gd->env_valid = 1;
+		SET_PRIMARY_ENV_VALID();
 	} else if (flag1 == flag2) {
 		gd->env_addr  = addr1;
-		gd->env_valid = 2;
+		SET_REDUNDANT_ENV_VALID();
 	} else if (flag1 == 0xFF) {
 		gd->env_addr  = addr1;
-		gd->env_valid = 2;
+		SET_REDUNDANT_ENV_VALID();
 	} else if (flag2 == 0xFF) {
 		gd->env_addr  = addr2;
-		gd->env_valid = 2;
+		SET_REDUNDANT_ENV_VALID();
 	}

 	return 0;
@@ -244,12 +244,12 @@ int  env_init(void)
 {
 	if (crc32(0, env_ptr->data, ENV_SIZE) == env_ptr->crc) {
 		gd->env_addr  = (ulong)&(env_ptr->data);
-		gd->env_valid = 1;
+		SET_PRIMARY_ENV_VALID();
 		return(0);
 	}

 	gd->env_addr  = (ulong)&default_environment[0];
-	gd->env_valid = 0;
+	SET_NO_ENV_VALID();
 	return 0;
 }

@@ -351,7 +351,7 @@ void env_relocate_spec(void)
 	    flash_addr_new->crc) {
 		char flag = OBSOLETE_FLAG;

-		gd->env_valid = 2;
+		SET_REDUNDANT_ENV_VALID();
 		flash_sect_protect(0, (ulong)flash_addr_new, end_addr_new);
 		flash_write(&flag,
 			    (ulong)&(flash_addr_new->flags),
@@ -363,7 +363,7 @@ void env_relocate_spec(void)
 	    (flash_addr->flags & ACTIVE_FLAG) == ACTIVE_FLAG) {
 		char flag = ACTIVE_FLAG;

-		gd->env_valid = 2;
+		SET_REDUNDANT_ENV_VALID();
 		flash_sect_protect(0, (ulong)flash_addr, end_addr);
 		flash_write(&flag,
 			    (ulong)&(flash_addr->flags),
@@ -371,7 +371,7 @@ void env_relocate_spec(void)
 		flash_sect_protect(1, (ulong)flash_addr, end_addr);
 	}

-	if (gd->env_valid == 2)
+	if (gd->flags & GD_FLG_RED_ENV_VALID)
 		puts ("*** Warning - some problems detected "
 		      "reading environment; recovered successfully\n\n");
 #endif /* CONFIG_ENV_ADDR_REDUND */
diff --git a/common/env_mgdisk.c b/common/env_mgdisk.c
index a69923b..0a91317 100644
--- a/common/env_mgdisk.c
+++ b/common/env_mgdisk.c
@@ -78,7 +78,7 @@ int env_init(void)
 {
 	/* use default */
 	gd->env_addr = (ulong)&default_environment[0];
-	gd->env_valid = 1;
+	SET_PRIMARY_ENV_VALID();

 	return 0;
 }
diff --git a/common/env_mmc.c b/common/env_mmc.c
index 83f40f4..b69efcb 100644
--- a/common/env_mmc.c
+++ b/common/env_mmc.c
@@ -73,7 +73,7 @@ int env_init(void)
 {
 	/* use default */
 	gd->env_addr = (ulong)&default_environment[0];
-	gd->env_valid = 1;
+	SET_PRIMARY_ENV_VALID();

 	return 0;
 }
diff --git a/common/env_nand.c b/common/env_nand.c
index 14446a6..9440a1e 100644
--- a/common/env_nand.c
+++ b/common/env_nand.c
@@ -108,41 +108,41 @@ int env_init(void)

 	if (!crc1_ok && !crc2_ok) {
 		gd->env_addr  = 0;
-		gd->env_valid = 0;
+		SET_NO_ENV_VALID();

 		return 0;
 	} else if (crc1_ok && !crc2_ok) {
-		gd->env_valid = 1;
+		SET_PRIMARY_ENV_VALID();
 	}
 #ifdef CONFIG_ENV_OFFSET_REDUND
 	else if (!crc1_ok && crc2_ok) {
-		gd->env_valid = 2;
+		SET_REDUNDANT_ENV_VALID();
 	} else {
 		/* both ok - check serial */
 		if(tmp_env1->flags == 255 && tmp_env2->flags == 0)
-			gd->env_valid = 2;
+			SET_REDUNDANT_ENV_VALID();
 		else if(tmp_env2->flags == 255 && tmp_env1->flags == 0)
-			gd->env_valid = 1;
+			SET_PRIMARY_ENV_VALID();
 		else if(tmp_env1->flags > tmp_env2->flags)
-			gd->env_valid = 1;
+			SET_PRIMARY_ENV_VALID();
 		else if(tmp_env2->flags > tmp_env1->flags)
-			gd->env_valid = 2;
+			SET_REDUNDANT_ENV_VALID();
 		else /* flags are equal - almost impossible */
-			gd->env_valid = 1;
+			SET_PRIMARY_ENV_VALID();
 	}

-	if (gd->env_valid == 2)
+	if (gd->flags & GD_FLG_RED_ENV_VALID)
 		env_ptr = tmp_env2;
 	else
 #endif
-	if (gd->env_valid == 1)
+	if (gd->flags & GD_FLG_PRI_ENV_VALID)
 		env_ptr = tmp_env1;

 	gd->env_addr = (ulong)env_ptr->data;

 #else /* ENV_IS_EMBEDDED || CONFIG_NAND_ENV_DST */
 	gd->env_addr  = (ulong)&default_environment[0];
-	gd->env_valid = 1;
+	SET_PRIMARY_ENV_VALID();
 #endif /* ENV_IS_EMBEDDED || CONFIG_NAND_ENV_DST */

 	return (0);
@@ -208,7 +208,7 @@ int saveenv(void)
 	env_new.crc   = crc32(0, env_new.data, ENV_SIZE);
 	env_new.flags = ++env_flags; /* increase the serial */

-	if(gd->env_valid == 1) {
+	if(gd->flags & GD_FLG_PRI_ENV_VALID) {
 		puts("Erasing redundant NAND...\n");
 		nand_erase_options.offset = CONFIG_ENV_OFFSET_REDUND;
 		if (nand_erase_opts(&nand_info[0], &nand_erase_options))
@@ -234,7 +234,10 @@ int saveenv(void)

 	puts("done\n");

-	gd->env_valid = (gd->env_valid == 2 ? 1 : 2);
+	if (gd->flags & GD_FLG_RED_ENV_VALID)
+		SET_PRIMARY_ENV_VALID();
+	else
+		SET_REDUNDANT_ENV_VALID();

 	return ret;
 }
@@ -373,27 +376,27 @@ void env_relocate_spec(void)
 		set_default_env("!bad CRC");
 		return;
 	} else if (crc1_ok && !crc2_ok) {
-		gd->env_valid = 1;
+		SET_PRIMARY_ENV_VALID();
 	} else if (!crc1_ok && crc2_ok) {
-		gd->env_valid = 2;
+		SET_REDUNDANT_ENV_VALID();
 	} else {
 		/* both ok - check serial */
 		if (tmp_env1->flags == 255 && tmp_env2->flags == 0)
-			gd->env_valid = 2;
+			SET_REDUNDANT_ENV_VALID();
 		else if (tmp_env2->flags == 255 && tmp_env1->flags == 0)
-			gd->env_valid = 1;
+			SET_PRIMARY_ENV_VALID();
 		else if (tmp_env1->flags > tmp_env2->flags)
-			gd->env_valid = 1;
+			SET_PRIMARY_ENV_VALID();
 		else if (tmp_env2->flags > tmp_env1->flags)
-			gd->env_valid = 2;
+			SET_REDUNDANT_ENV_VALID();
 		else /* flags are equal - almost impossible */
-			gd->env_valid = 1;
+			SET_PRIMARY_ENV_VALID();

 	}

 	free(env_ptr);

-	if (gd->env_valid == 1)
+	if (gd->flags & GD_FLG_PRI_ENV_VALID)
 		ep = tmp_env1;
 	else
 		ep = tmp_env2;
diff --git a/common/env_nowhere.c b/common/env_nowhere.c
index 75ef78d..9441575 100644
--- a/common/env_nowhere.c
+++ b/common/env_nowhere.c
@@ -52,7 +52,7 @@ uchar env_get_char_spec(int index)
 int env_init(void)
 {
 	gd->env_addr  = (ulong)&default_environment[0];
-	gd->env_valid = 0;
+	SET_NO_ENV_VALID();

 	return (0);
 }
diff --git a/common/env_nvram.c b/common/env_nvram.c
index 544ce47..78ea38b 100644
--- a/common/env_nvram.c
+++ b/common/env_nvram.c
@@ -131,10 +131,10 @@ int env_init(void)
 	if (crc32(0, env_ptr->data, ENV_SIZE) == env_ptr->crc) {
 		gd->env_addr  = (ulong)&(env_ptr->data);
 #endif
-		gd->env_valid = 1;
+		SET_PRIMARY_ENV_VALID();
 	} else {
 		gd->env_addr  = (ulong)&default_environment[0];
-		gd->env_valid = 0;
+		SET_NO_ENV_VALID();
 	}
 	return (0);
 }
diff --git a/common/env_onenand.c b/common/env_onenand.c
index 5e04a06..5201b35 100644
--- a/common/env_onenand.c
+++ b/common/env_onenand.c
@@ -90,7 +90,7 @@ void env_relocate_spec(void)

 	rc = env_import(buf, 1);
 	if (rc)
-		gd->env_valid = 1;
+		SET_PRIMARY_ENV_VALID();
 }

 int saveenv(void)
@@ -145,7 +145,7 @@ int env_init(void)
 {
 	/* use default */
 	gd->env_addr = (ulong) & default_environment[0];
-	gd->env_valid = 1;
+	SET_PRIMARY_ENV_VALID();

 	return 0;
 }
diff --git a/common/env_sf.c b/common/env_sf.c
index d3b36d0..0e9d136 100644
--- a/common/env_sf.c
+++ b/common/env_sf.c
@@ -99,7 +99,7 @@ int saveenv(void)
 	env_new.crc   = crc32(0, env_new.data, ENV_SIZE);
 	env_new.flags = ACTIVE_FLAG;

-	if (gd->env_valid == 1) {
+	if (gd->flags & GD_FLG_PRI_ENV_VALID) {
 		env_new_offset = CONFIG_ENV_OFFSET_REDUND;
 		env_offset = CONFIG_ENV_OFFSET;
 	} else {
@@ -156,9 +156,14 @@ int saveenv(void)

 	puts("done\n");

-	gd->env_valid = (gd->env_valid == 2 ? 1 : 2);
+	if (gd->flags & GD_FLG_RED_ENV_VALID) {
+		SET_PRIMARY_ENV_VALID();
+		printf("Valid environment: Primary\n");
+	} else {
+		SET_REDUNDANT_ENV_VALID();
+		printf("Valid environment: Redundant\n");
+	}

-	printf("Valid environment: %d\n", (int)gd->env_valid);

  done:
 	if (saved_buffer)
@@ -210,28 +215,28 @@ void env_relocate_spec(void)
 		set_default_env("!bad CRC");
 		goto err_read;
 	} else if (crc1_ok && !crc2_ok) {
-		gd->env_valid = 1;
+		SET_PRIMARY_ENV_VALID();
 	} else if (!crc1_ok && crc2_ok) {
-		gd->env_valid = 2;
+		SET_REDUNDANT_ENV_VALID();
 	} else if (tmp_env1->flags == ACTIVE_FLAG &&
 		   tmp_env2->flags == OBSOLETE_FLAG) {
-		gd->env_valid = 1;
+		SET_PRIMARY_ENV_VALID();
 	} else if (tmp_env1->flags == OBSOLETE_FLAG &&
 		   tmp_env2->flags == ACTIVE_FLAG) {
-		gd->env_valid = 2;
+		SET_REDUNDANT_ENV_VALID();
 	} else if (tmp_env1->flags == tmp_env2->flags) {
-		gd->env_valid = 2;
+		SET_REDUNDANT_ENV_VALID();
 	} else if (tmp_env1->flags == 0xFF) {
-		gd->env_valid = 2;
+		SET_REDUNDANT_ENV_VALID();
 	} else {
 		/*
 		 * this differs from code in env_flash.c, but I think a sane
 		 * default path is desirable.
 		 */
-		gd->env_valid = 2;
+		SET_REDUNDANT_ENV_VALID();
 	}

-	if (gd->env_valid == 1)
+	if (gd->flags & GD_FLG_PRI_ENV_VALID)
 		ep = tmp_env1;
 	else
 		ep = tmp_env2;
@@ -350,7 +355,7 @@ void env_relocate_spec(void)
 	ret = env_import(buf, 1);

 	if (ret)
-		gd->env_valid = 1;
+		SET_PRIMARY_ENV_VALID();
 out:
 	spi_flash_free(env_flash);
 	env_flash = NULL;
@@ -361,7 +366,7 @@ int env_init(void)
 {
 	/* SPI flash isn't usable before relocation */
 	gd->env_addr = (ulong)&default_environment[0];
-	gd->env_valid = 1;
+	SET_PRIMARY_ENV_VALID();

 	return 0;
 }
diff --git a/drivers/i2c/ppc4xx_i2c.c b/drivers/i2c/ppc4xx_i2c.c
index c1cbe55..4c980d5 100644
--- a/drivers/i2c/ppc4xx_i2c.c
+++ b/drivers/i2c/ppc4xx_i2c.c
@@ -396,7 +396,7 @@ static int ppc4xx_i2c_transfer(uchar chip, uint addr, int alen, uchar *buffer,
 #endif
 	if ((ret = i2c_transfer(read, chip << 1, &xaddr[4 - alen], alen,
 				buffer, len)) != 0) {
-		if (gd->have_console) {
+		if (gd->flags & GD_FLG_HAVE_CONSOLE) {
 			printf("I2C %s: failed %d\n",
 			       read ? "read" : "write", ret);
 		}
diff --git a/drivers/i2c/soft_i2c.c b/drivers/i2c/soft_i2c.c
index 9b02e89..9e1dd44 100644
--- a/drivers/i2c/soft_i2c.c
+++ b/drivers/i2c/soft_i2c.c
@@ -118,9 +118,9 @@ DECLARE_GLOBAL_DATA_PTR;


 #ifdef DEBUG_I2C
-#define PRINTD(fmt,args...)	do {	\
-	if (gd->have_console)		\
-		printf (fmt ,##args);	\
+#define PRINTD(fmt,args...)	do {		\
+	if (gd->flags & GD_FLG_HAVE_CONSOLE)	\
+		printf (fmt ,##args);		\
 	} while (0)
 #else
 #define PRINTD(fmt,args...)
diff --git a/include/environment.h b/include/environment.h
index 6394a96..5f2b583 100644
--- a/include/environment.h
+++ b/include/environment.h
@@ -152,6 +152,24 @@ typedef	struct environment_s {
 	unsigned char	data[ENV_SIZE]; /* Environment data		*/
 } env_t;

+#define SET_NO_ENV_VALID()				\
+	do {						\
+		gd->flags &= ~(GD_FLG_PRI_ENV_VALID |	\
+				GD_FLG_RED_ENV_VALID);	\
+	} while (0)
+
+#define SET_PRIMARY_ENV_VALID()				\
+	do {						\
+		SET_NO_ENV_VALID();			\
+		gd->flags |= GD_FLG_PRI_ENV_VALID;	\
+	} while (0)
+
+#define SET_REDUNDANT_ENV_VALID()			\
+	do {						\
+		SET_NO_ENV_VALID();			\
+		gd->flags |= GD_FLG_RED_ENV_VALID;	\
+	} while (0)
+
 #ifndef DO_DEPS_ONLY

 #include <search.h>
--
1.7.5.2.317.g391b14

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [U-Boot] [PATCH V2] Global Data: Flagify have_console and env_valid
  2011-08-26 13:36 ` [U-Boot] [PATCH V2] " Graeme Russ
@ 2011-08-26 20:15   ` Mike Frysinger
  2011-08-26 22:36     ` Graeme Russ
  2011-08-29 18:47     ` Scott Wood
  2011-10-06 21:48   ` Wolfgang Denk
  1 sibling, 2 replies; 6+ messages in thread
From: Mike Frysinger @ 2011-08-26 20:15 UTC (permalink / raw)
  To: u-boot

looks sane enough to me

when changing the global_data structure, do we need to bump the u-boot 
standalone API number (XF_VERSION in exports.h) ?  and i vaguely recall global 
data being passed to like Linux for some arches ?  although looking at the 
number of #ifdef's in there, maybe that's already been a long lost battle.
-mike
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: This is a digitally signed message part.
Url : http://lists.denx.de/pipermail/u-boot/attachments/20110826/5a428713/attachment.pgp 

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [U-Boot] [PATCH V2] Global Data: Flagify have_console and env_valid
  2011-08-26 20:15   ` Mike Frysinger
@ 2011-08-26 22:36     ` Graeme Russ
  2011-08-29 18:47     ` Scott Wood
  1 sibling, 0 replies; 6+ messages in thread
From: Graeme Russ @ 2011-08-26 22:36 UTC (permalink / raw)
  To: u-boot

Hi Mike,

On 27/08/11 06:15, Mike Frysinger wrote:
> looks sane enough to me
> 
> when changing the global_data structure, do we need to bump the u-boot 
> standalone API number (XF_VERSION in exports.h) ?  and i vaguely recall global 
> data being passed to like Linux for some arches ?  although looking at the 
> number of #ifdef's in there, maybe that's already been a long lost battle.

That's a very interesting point. As far as I can tell, XF_VERSION needs to
be incremented when either the global data data structure is modified, or
if functions are added to or removed from the export list. Commit
3469424cb6d939c7aedf1e0efdec44a797c0a18c seems to confirm this:

  Note that the location of the standalone application jump table pointer
  in the global data structure is affected by this change, breaking
  execution of standalone applications compiled for previous versions of
  U-Boot.

So I think your point about the #ifdef's in global data is very
interesting. There are a _lot_ of board level defines (LCD, PCI, POST etc)

Question for Wolfgang I think :)

Regards,

Graeme

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [U-Boot] [PATCH V2] Global Data: Flagify have_console and env_valid
  2011-08-26 20:15   ` Mike Frysinger
  2011-08-26 22:36     ` Graeme Russ
@ 2011-08-29 18:47     ` Scott Wood
  1 sibling, 0 replies; 6+ messages in thread
From: Scott Wood @ 2011-08-29 18:47 UTC (permalink / raw)
  To: u-boot

On 08/26/2011 03:15 PM, Mike Frysinger wrote:
> looks sane enough to me
> 
> when changing the global_data structure, do we need to bump the u-boot 
> standalone API number (XF_VERSION in exports.h) ?  and i vaguely recall global 
> data being passed to like Linux for some arches ?  although looking at the 
> number of #ifdef's in there, maybe that's already been a long lost battle.

The data passed to Linux in the non-device-tree case was bd_t, not gd_t.

Of course, that's full of ifdefs too, at least on powerpc. :-P

-Scott

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [U-Boot] [PATCH V2] Global Data: Flagify have_console and env_valid
  2011-08-26 13:36 ` [U-Boot] [PATCH V2] " Graeme Russ
  2011-08-26 20:15   ` Mike Frysinger
@ 2011-10-06 21:48   ` Wolfgang Denk
  1 sibling, 0 replies; 6+ messages in thread
From: Wolfgang Denk @ 2011-10-06 21:48 UTC (permalink / raw)
  To: u-boot

Dear Graeme Russ,

In message <1314365780-15051-1-git-send-email-graeme.russ@gmail.com> you wrote:
> 
> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
> ---
> Changes since V1:
>  - In common/console.c, gd->flags &= GD_FLG_HAVE_CONSOLE change to |=
> 
>  arch/arm/include/asm/global_data.h        |    5 ++-
>  arch/avr32/include/asm/global_data.h      |    5 ++-
>  arch/blackfin/include/asm/global_data.h   |    5 ++-
>  arch/blackfin/lib/board.c                 |    2 -
>  arch/m68k/include/asm/global_data.h       |    5 ++-
>  arch/microblaze/include/asm/global_data.h |    5 ++-
>  arch/mips/include/asm/global_data.h       |    5 ++-
>  arch/nios2/include/asm/global_data.h      |    5 ++-
>  arch/powerpc/cpu/mpc5xxx/i2c.c            |   20 ++++++------
>  arch/powerpc/cpu/mpc8xx/i2c.c             |   12 ++++----
>  arch/powerpc/include/asm/global_data.h    |    5 ++-
>  arch/sh/include/asm/global_data.h         |    5 ++-
>  arch/sparc/include/asm/global_data.h      |    5 ++-
>  arch/x86/include/asm/global_data.h        |   36 +++++++++++-----------
>  board/edb93xx/edb93xx.c                   |    2 +-
>  board/matrix_vision/common/mv_common.c    |    2 +-
>  board/zeus/zeus.c                         |    2 +-
>  common/console.c                          |    4 +-
>  common/env_common.c                       |    6 ++--
>  common/env_dataflash.c                    |    6 ++--
>  common/env_eeprom.c                       |   36 +++++++++++-----------
>  common/env_flash.c                        |   26 ++++++++--------
>  common/env_mgdisk.c                       |    2 +-
>  common/env_mmc.c                          |    2 +-
>  common/env_nand.c                         |   45 +++++++++++++++-------------
>  common/env_nowhere.c                      |    2 +-
>  common/env_nvram.c                        |    4 +-
>  common/env_onenand.c                      |    4 +-
>  common/env_sf.c                           |   31 +++++++++++--------
>  drivers/i2c/ppc4xx_i2c.c                  |    2 +-
>  drivers/i2c/soft_i2c.c                    |    6 ++--
>  include/environment.h                     |   18 +++++++++++
>  32 files changed, 177 insertions(+), 143 deletions(-)

Checkpatch says:

total: 3 errors, 43 warnings, 901 lines checked

Please clean up and resubmit.  Thanks.

Best regards,

Wolfgang Denk

-- 
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
Q: How do you spell "onomatopoeia"?
A: The way it sounds.

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2011-10-06 21:48 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-08-26 13:23 [U-Boot] [PATCH] Global Data: Flagify have_console and env_valid Graeme Russ
2011-08-26 13:36 ` [U-Boot] [PATCH V2] " Graeme Russ
2011-08-26 20:15   ` Mike Frysinger
2011-08-26 22:36     ` Graeme Russ
2011-08-29 18:47     ` Scott Wood
2011-10-06 21:48   ` Wolfgang Denk

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.