- First pass through with with device tree enhancement merge. Most of the mechanisms...
[coreboot.git] / src / mainboard / arima / hdama / failover.c
index 8eeeaef7e1b056cdf76f25f959b51bf2f30c18d9..e351cae83d04f60ce4e447345c648e5e3d5b6cb5 100644 (file)
@@ -3,36 +3,67 @@
 #include <device/pci_def.h>
 #include <device/pci_ids.h>
 #include <arch/io.h>
-#include "arch/romcc_io.h"
+#include <arch/romcc_io.h>
+#include <cpu/x86/lapic.h>
 #include "pc80/mc146818rtc_early.c"
 #include "southbridge/amd/amd8111/amd8111_enable_rom.c"
 #include "northbridge/amd/amdk8/early_ht.c"
-#include "cpu/p6/boot_cpu.c"
+#include "cpu/x86/lapic/boot_cpu.c"
 #include "northbridge/amd/amdk8/reset_test.c"
 
-static void main(void)
+static unsigned long main(unsigned long bist)
 {
-       /* Nothing special needs to be done to find bus 0 */
-       /* Allow the HT devices to be found */
-       enumerate_ht_chain(0);
-
-       /* Setup the 8111 */
-       amd8111_enable_rom();
+       /* Make cerain my local apic is useable */
+       enable_lapic();
 
-       /* Is this a cpu reset? */
+       /* Is this a cpu only reset? */
        if (cpu_init_detected()) {
                if (last_boot_normal()) {
-                       asm("jmp __normal_image");
+                       goto normal_image;
                } else {
-                       asm("jmp __cpu_reset");
+                       goto cpu_reset;
                }
        }
        /* Is this a secondary cpu? */
-       else if (!boot_cpu() && last_boot_normal()) {
-               asm("jmp __normal_image");
+       if (!boot_cpu()) {
+               if (last_boot_normal()) {
+                       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();
+       
+       /* Setup the 8111 */
+       amd8111_enable_rom();
+
+       /* Is this a deliberate reset by the bios */
+       if (bios_reset_detected() && last_boot_normal()) {
+               goto normal_image;
        }
        /* This is the primary cpu how should I boot? */
        else if (do_normal_boot()) {
-               asm("jmp __normal_image");
+               goto normal_image;
+       }
+       else {
+               goto fallback_image;
        }
+ normal_image:
+       asm volatile ("jmp __normal_image" 
+               : /* outputs */ 
+               : "a" (bist) /* inputs */
+               : /* clobbers */
+               );
+ cpu_reset:
+       asm volatile ("jmp __cpu_reset"
+               : /* outputs */ 
+               : "a"(bist) /* inputs */
+               : /* clobbers */
+               );
+ fallback_image:
+       return bist;
 }