Index: svn/src/mainboard/tyan/s2895/cache_as_ram_auto.c
===================================================================
--- svn.orig/src/mainboard/tyan/s2895/cache_as_ram_auto.c
+++ svn/src/mainboard/tyan/s2895/cache_as_ram_auto.c
@@ -1,3 +1,4 @@
+#define ASSEMBLY 1
 #define __ROMCC__
 
 #define K8_ALLOCATE_IO_RANGE 1
@@ -20,12 +21,11 @@
 #include "option_table.h"
 #include "pc80/mc146818rtc_early.c"
 
-#define post_code(x) outb(x, 0x80)
+#if CONFIG_USE_FAILOVER_IMAGE==0
 #include "pc80/serial.c"
 #include "arch/i386/lib/console.c"
 #include "ram/ramtest.c"
 
-
 #include <cpu/amd/model_fxx_rev.h>
 
 #include "northbridge/amd/amdk8/incoherent_ht.c"
@@ -34,6 +34,8 @@
 #include "cpu/amd/model_fxx/apic_timer.c"
 #include "lib/delay.c"
 
+#endif
+
 #include "cpu/x86/lapic/boot_cpu.c"
 #include "northbridge/amd/amdk8/reset_test.c"
 #include "superio/smsc/lpc47b397/lpc47b397_early_serial.c"
@@ -42,6 +44,8 @@
 
 #define SUPERIO_GPIO_IO_BASE 0x400
 
+#if CONFIG_USE_FAILOVER_IMAGE==0
+
 #include "cpu/x86/bist.h"
 
 #include "northbridge/amd/amdk8/debug.c"
@@ -114,8 +118,117 @@ static inline int spd_read_byte(unsigned
 
 #include "cpu/amd/model_fxx/init_cpus.c"
 
+#endif
+
+#if ((CONFIG_HAVE_FAILOVER_BOOT==1) && (CONFIG_USE_FAILOVER_IMAGE == 1)) || ((CONFIG_HAVE_FAILOVER_BOOT==0) && (CONFIG_USE_FALLBACK_IMAGE == 1))
+
+#include "southbridge/nvidia/ck804/ck804_enable_rom.c"
+#include "northbridge/amd/amdk8/early_ht.c"
+
+static void sio_setup(void)
+{
+
+	unsigned value;
+	uint32_t dword;
+	uint8_t byte;
+
+	pci_write_config32(PCI_DEV(0, CK804_DEVN_BASE+1, 0), 0xac, 0x047f0400);
+
+	byte = pci_read_config8(PCI_DEV(0, CK804_DEVN_BASE+1 , 0), 0x7b);
+	byte |= 0x20;
+	pci_write_config8(PCI_DEV(0, CK804_DEVN_BASE+1 , 0), 0x7b, byte);
+
+	dword = pci_read_config32(PCI_DEV(0, CK804_DEVN_BASE+1 , 0), 0xa0);
+	dword |= (1<<29)|(1<<0);
+	pci_write_config32(PCI_DEV(0, CK804_DEVN_BASE+1 , 0), 0xa0, dword);
+
+	dword = pci_read_config32(PCI_DEV(0, CK804_DEVN_BASE+1, 0), 0xa4);
+	dword |= (1<<16);
+	pci_write_config32(PCI_DEV(0, CK804_DEVN_BASE+1 , 0), 0xa4, dword);
+
+	lpc47b397_enable_serial(SUPERIO_GPIO_DEV, SUPERIO_GPIO_IO_BASE);
+	value = lpc47b397_gpio_offset_in(SUPERIO_GPIO_IO_BASE, 0x77);
+	value &= 0xbf;
+	lpc47b397_gpio_offset_out(SUPERIO_GPIO_IO_BASE, 0x77, value);
+
+}
+
+void failover_process(unsigned long bist, unsigned long cpu_init_detectedx)
+{
+	unsigned last_boot_normal_x = last_boot_normal();
+
+	/* Is this a cpu only reset? or Is this a secondary cpu? */
+	if ((cpu_init_detectedx) || (!boot_cpu())) {
+	if (last_boot_normal_x) {
+	goto normal_image;
+	} else {
+	goto fallback_image;
+	}
+	}
+
+	/* Nothing special needs to be done to find bus 0 */
+	/* Allow the HT devices to be found */
+
+	enumerate_ht_chain();
+
+	sio_setup();
+
+	/* Setup the ck804 */
+	ck804_enable_rom();
+
+	/* Is this a deliberate reset by the bios */
+//	post_code(0x22);
+	if (bios_reset_detected() && last_boot_normal_x) {
+	goto normal_image;
+	}
+	/* This is the primary cpu how should I boot? */
+	else if (do_normal_boot()) {
+	goto normal_image;
+	}
+	else {
+	goto fallback_image;
+	}
+ normal_image:
+//	post_code(0x23);
+	__asm__ volatile ("jmp __normal_image"
+	: /* outputs */
+	: "a" (bist), "b"(cpu_init_detectedx) /* inputs */
+	);
+
+ fallback_image:
+//	post_code(0x25);
+#if CONFIG_HAVE_FAILOVER_BOOT==1
+	__asm__ volatile ("jmp __fallback_image"
+	: /* outputs */
+	: "a" (bist), "b" (cpu_init_detectedx) /* inputs */
+	)
+#endif
+	;
+}
+#endif
+
+void real_main(unsigned long bist, unsigned long cpu_init_detectedx);
+
 void cache_as_ram_main(unsigned long bist, unsigned long cpu_init_detectedx)
 {
+#if CONFIG_HAVE_FAILOVER_BOOT==1
+	#if CONFIG_USE_FAILOVER_IMAGE==1
+	failover_process(bist, cpu_init_detectedx);
+	#else
+	real_main(bist, cpu_init_detectedx);
+	#endif
+#else
+	#if CONFIG_USE_FALLBACK_IMAGE == 1
+	failover_process(bist, cpu_init_detectedx);
+	#endif
+	real_main(bist, cpu_init_detectedx);
+#endif
+}
+
+#if CONFIG_USE_FAILOVER_IMAGE==0
+
+void real_main(unsigned long bist, unsigned long cpu_init_detectedx)
+{
 	static const uint16_t spd_addr [] = {
 		(0xa<<3)|0, (0xa<<3)|2, 0, 0,
 		(0xa<<3)|1, (0xa<<3)|3, 0, 0,
@@ -135,7 +248,7 @@ void cache_as_ram_main(unsigned long bis
 		bsp_apicid = init_cpus(cpu_init_detectedx);
 	}
 
-	post_code(0x32);
+//	post_code(0x32);
 
 	lpc47b397_enable_serial(SERIAL_DEV, CONFIG_TTYS0_BASE);
 	uart_init();
@@ -197,3 +310,4 @@ void cache_as_ram_main(unsigned long bis
 
 	post_cache_as_ram();
 }
+#endif
Index: svn/src/mainboard/tyan/s2895/Config.lb
===================================================================
--- svn.orig/src/mainboard/tyan/s2895/Config.lb
+++ svn/src/mainboard/tyan/s2895/Config.lb
@@ -29,25 +29,10 @@ if CONFIG_HAVE_ACPI_TABLES
 end
 
 if CONFIG_USE_INIT
-if CONFIG_USE_FAILOVER_IMAGE
-	makerule ./auto.o
-		depends "$(CONFIG_MAINBOARD)/failover.c option_table.h"
-		action "$(CC) $(DISTRO_CFLAGS) $(CFLAGS) $(CPPFLAGS) -I$(TOP)/src -I. -c $(CONFIG_MAINBOARD)/failover.c -o $@"
-	end
-else
 	makerule ./auto.o
 		depends "$(CONFIG_MAINBOARD)/cache_as_ram_auto.c option_table.h"
 		action "$(CC) $(DISTRO_CFLAGS) $(CFLAGS) $(CPPFLAGS) -I$(TOP)/src -I. -c $(CONFIG_MAINBOARD)/cache_as_ram_auto.c -o $@"
 	end
-end
-else #CONFIG_USE_INIT
-if CONFIG_USE_FAILOVER_IMAGE
-	makerule ./auto.inc
-		depends "$(CONFIG_MAINBOARD)/failover.c option_table.h"
-		action "$(CC) $(DISTRO_CFLAGS) $(CFLAGS) $(CPPFLAGS) $(DEBUG_CFLAGS) -I$(TOP)/src -I. -c -S $(CONFIG_MAINBOARD)/failover.c -o $@"
-		action "perl -e 's/\.rodata/.rom.data/g' -pi $@"
-		action "perl -e 's/\.text/.section .rom.text/g' -pi $@"
-	end
 else
 	makerule ./auto.inc
 		depends "$(CONFIG_MAINBOARD)/cache_as_ram_auto.c option_table.h"
@@ -56,32 +41,51 @@ else
 		action "perl -e 's/\.text/.section .rom.text/g' -pi $@"
 	end
 end
-end #CONFIG_USE_INIT
 
 ##
 ## Build our 16 bit and 32 bit coreboot entry code
 ##
-if CONFIG_USE_FAILOVER_IMAGE
-	mainboardinit cpu/x86/16bit/entry16.inc
-	ldscript /cpu/x86/16bit/entry16.lds
+if CONFIG_HAVE_FAILOVER_BOOT
+	if CONFIG_USE_FAILOVER_IMAGE
+		mainboardinit cpu/x86/16bit/entry16.inc
+		ldscript /cpu/x86/16bit/entry16.lds
+	end
+else
+	if CONFIG_USE_FALLBACK_IMAGE
+		mainboardinit cpu/x86/16bit/entry16.inc
+		ldscript /cpu/x86/16bit/entry16.lds
+	end
 end
 
 mainboardinit cpu/x86/32bit/entry32.inc
 
 	if CONFIG_USE_INIT
 		ldscript /cpu/x86/32bit/entry32.lds
+	end
+
+	if CONFIG_USE_INIT
 		ldscript /cpu/amd/car/cache_as_ram.lds
 	end
 
 ##
 ## Build our reset vector (This is where coreboot is entered)
 ##
-if CONFIG_USE_FAILOVER_IMAGE
+if CONFIG_HAVE_FAILOVER_BOOT
+    if CONFIG_USE_FAILOVER_IMAGE
 	mainboardinit cpu/x86/16bit/reset16.inc
 	ldscript /cpu/x86/16bit/reset16.lds
+    else
+	mainboardinit cpu/x86/32bit/reset32.inc
+	ldscript /cpu/x86/32bit/reset32.lds
+    end
 else
+    if CONFIG_USE_FALLBACK_IMAGE
+	mainboardinit cpu/x86/16bit/reset16.inc
+	ldscript /cpu/x86/16bit/reset16.lds
+    else
 	mainboardinit cpu/x86/32bit/reset32.inc
 	ldscript /cpu/x86/32bit/reset32.lds
+    end
 end
 
 ##
@@ -93,9 +97,16 @@ ldscript /southbridge/nvidia/ck804/id.ld
 ##
 ## ROMSTRAP table for CK804
 ##
-if CONFIG_USE_FAILOVER_IMAGE
-	mainboardinit southbridge/nvidia/ck804/romstrap.inc
-	ldscript /southbridge/nvidia/ck804/romstrap.lds
+if CONFIG_HAVE_FAILOVER_BOOT
+	if CONFIG_USE_FAILOVER_IMAGE
+		mainboardinit southbridge/nvidia/ck804/romstrap.inc
+		ldscript /southbridge/nvidia/ck804/romstrap.lds
+	end
+else
+	if CONFIG_USE_FALLBACK_IMAGE
+		mainboardinit southbridge/nvidia/ck804/romstrap.inc
+		ldscript /southbridge/nvidia/ck804/romstrap.lds
+	end
 end
 
 ##
@@ -108,8 +119,14 @@ end
 ### Things are delicate and we test to see if we should
 ### failover to another image.
 ###
-if CONFIG_USE_FAILOVER_IMAGE
-	ldscript /arch/i386/lib/failover_failover.lds
+if CONFIG_HAVE_FAILOVER_BOOT
+	if CONFIG_USE_FAILOVER_IMAGE
+			ldscript /arch/i386/lib/failover_failover.lds
+	end
+else
+	if CONFIG_USE_FALLBACK_IMAGE
+			ldscript /arch/i386/lib/failover.lds
+	end
 end
 
 ##
Index: svn/targets/tyan/s2895/Config.lb
===================================================================
--- svn.orig/targets/tyan/s2895/Config.lb
+++ svn/targets/tyan/s2895/Config.lb
@@ -7,80 +7,21 @@ mainboard tyan/s2895
 
 # Tyan s2895
 romimage "normal"
-#       48K for SCSI FW
-#        option CONFIG_ROM_SIZE = 475136
-#       48K for SCSI FW and 48K for ATI ROM
-#       option CONFIG_ROM_SIZE = 425984 
-#       64K for Etherboot
-#        option CONFIG_ROM_SIZE = 458752 
-#	64K for NIC option 48K for Raid option rom
-#	option CONFIG_ROM_SIZE = 409600
 	option CONFIG_USE_FAILOVER_IMAGE=0
 	option CONFIG_USE_FALLBACK_IMAGE=0
-#	option CONFIG_ROM_IMAGE_SIZE=0x11800
-#	option CONFIG_ROM_IMAGE_SIZE=0x13800
-#	option CONFIG_ROM_IMAGE_SIZE=0x15000
 	option CONFIG_ROM_IMAGE_SIZE=0x20000
-#	option CONFIG_ROM_IMAGE_SIZE=0x17800
 	option CONFIG_XIP_ROM_SIZE=0x20000
 	option COREBOOT_EXTRA_VERSION="$(shell cat ../../VERSION)_Normal"
-#       payload ../../../payloads/tg3--ide_disk.zelf
-#        payload ../../../payloads/filo.elf
-#        payload ../../../payloads/filo_mem.elf
-#       payload ../../../payloads/filo.zelf
-#	payload ../../../payloads/tg3.zelf
-#	payload ../../../payloads/tg3--filo_hda2_vga.zelf
-#	payload ../../../../payloads/forcedeth--filo_hda2_vga.zelf
-#	payload ../../../payloads/forcedeth_vga.zelf
-#	payload ../../../payloads/forcedeth--filo_hda2_vga_5_4.zelf
-#	payload ../../../../../../elf/ram0_2.5_2.6.11.tiny.elf
-#	payload ../../../../../../elf/ram0_2.5_2.6.12.tiny.elf
-#	payload ../../../payloads/tg3--filo_hda2_vga_5_4.zelf
-#	 payload ../../../payloads/tg3_vga.zelf
-#	payload ../../../payloads/tg3--filo_hda2_vgax.zelf
-#        payload ../../../payloads/tg3--filo_hda2_com2.zelf
-#       payload ../../../payloads/e1000--filo.zelf
-#        payload ../../../payloads/tg3--e1000--filo.zelf
-#        payload ../../../payloads/tg3--eepro100--e1000--filo_hda2.zelf
 	payload ../payload.elf
 end
 
 romimage "fallback" 
 	option CONFIG_USE_FAILOVER_IMAGE=0
 	option CONFIG_USE_FALLBACK_IMAGE=1
-#	option CONFIG_ROM_IMAGE_SIZE=0x11800
-#	option CONFIG_ROM_IMAGE_SIZE=0x13800
-#	option CONFIG_ROM_IMAGE_SIZE=0x15000
 	option CONFIG_ROM_IMAGE_SIZE=0x20000
-#	option CONFIG_ROM_IMAGE_SIZE=0x17800
 	option CONFIG_XIP_ROM_SIZE=0x20000
 	option COREBOOT_EXTRA_VERSION="$(shell cat ../../VERSION)_Fallback"
-#       payload ../../../payloads/tg3--ide_disk.zelf
-#        payload ../../../payloads/filo.elf
-#        payload ../../../payloads/filo_mem.elf
-#       payload ../../../payloads/filo.zelf
-#	payload ../../../payloads/tg3.zelf
-#	payload ../../../payloads/tg3--filo_hda2_vga.zelf
-#	payload ../../../../payloads/forcedeth--filo_hda2_vga.zelf
-#	payload ../../../payloads/forcedeth_vga.zelf
-#	payload ../../../payloads/tg3--filo_hda2_vga_5_4.zelf
-#	payload ../../../payloads/tg3_vga.zelf
-#	payload ../../../payloads/tg3--filo_hda2_vgax.zelf
-#        payload ../../../payloads/tg3--filo_hda2_com2.zelf
-#       payload ../../../payloads/e1000--filo.zelf
-#        payload ../../../payloads/tg3--e1000--filo.zelf
-#        payload ../../../payloads/tg3--eepro100--e1000--filo_hda2.zelf
 	payload ../payload.elf
 end
 
-romimage "failover"
-	option CONFIG_USE_FAILOVER_IMAGE=1
-        option CONFIG_USE_FALLBACK_IMAGE=0
-        option CONFIG_ROM_IMAGE_SIZE=CONFIG_FAILOVER_SIZE
-        option CONFIG_XIP_ROM_SIZE=CONFIG_FAILOVER_SIZE
-        option COREBOOT_EXTRA_VERSION="$(shell cat ../../VERSION)_Failover"
-end
-
-
-buildrom ./coreboot.rom CONFIG_ROM_SIZE "normal" "fallback" "failover"
-#buildrom ./coreboot.rom CONFIG_ROM_SIZE "normal" "fallback" 
+buildrom ./coreboot.rom CONFIG_ROM_SIZE "normal" "fallback"
