CBMEM CONSOLE: Add code using the new console driver.
[coreboot.git] / src / boot / hardwaremain.c
index 86ea097965e65b21c70efcc0ee92ec9487bd7f58..9b293c049a61833899abc886fb0cb7395ead7afe 100644 (file)
@@ -22,223 +22,90 @@ it with the version available from LANL.
 
 
 /*
- * C Bootstrap code for the LinuxBIOS
+ * C Bootstrap code for the coreboot
  */
 
-
 #include <console/console.h>
-#include <cpu/cpu.h>
-#include <mem.h>
 #include <version.h>
-#include <smp/start_stop.h>
-#include <boot/tables.h>
-#include <part/sizeram.h>
 #include <device/device.h>
 #include <device/pci.h>
-#include <device/chip.h>
 #include <delay.h>
-#include <part/hard_reset.h>
-#include <smp/atomic.h>
+#include <stdlib.h>
+#include <reset.h>
+#include <boot/tables.h>
 #include <boot/elf.h>
-
-
-#ifndef CONFIG_MAX_PHYSICAL_CPUS
-#define CONFIG_MAX_PHYSICAL_CPUS CONFIG_MAX_CPUS
+#include <cbfs.h>
+#if CONFIG_HAVE_ACPI_RESUME
+#include <arch/acpi.h>
 #endif
-
-#if CONFIG_FS_STREAM == 1
-extern int filo(struct lb_memory *);
+#if CONFIG_WRITE_HIGH_TABLES
+#include <cbmem.h>
 #endif
 
-/* The processor map. 
- * Now that SMP is in linuxbios, and Linux counts on us
- * giving accurate information about processors, we need a map
- * of what processors are out there. This could be a bit mask, 
- * but we will be optimistic and hope we someday run on 
- * REALLY BIG SMPs. Also we may need more than one bit of 
- * info per processor at some point. I hope we don't need 
- * anything more complex than an int.
- */
-static unsigned long processor_map[CONFIG_MAX_CPUS];
-
-static struct mem_range *get_ramsize(void)
-{
-       struct mem_range *mem = 0;
-       if (!mem) {
-               mem = sizeram();
-       }
-       if (!mem) {
-               printk_emerg("No memory size information!\n");
-               for(;;) {
-                       /* Ensure this loop is not optimized away */
-                       asm volatile("":/* outputs */:/*inputs */ :"memory");
-               }
-       }
-       return mem;
-}
-
-
-#if CONFIG_SMP == 1
-/* Number of cpus that are currently running in linuxbios */
-static atomic_t active_cpus = ATOMIC_INIT(1);
-
 /**
- * @brief Initialize secondary processors.
+ * @brief Main function of the RAM part of coreboot.
  *
+ * Coreboot is divided into Pre-RAM part and RAM part.
  *
- * @todo move this into a method of per cpu data structure.
+ * Device Enumeration:
+ *     In the dev_enumerate() phase,
  */
-void secondary_cpu_init(void)
-{
-       struct mem_range *mem;
-       unsigned long id;
-       int index;
-
-       atomic_inc(&active_cpus);
-
-       printk_debug("%s\n", __FUNCTION__);
-       mem = get_ramsize();
-       id = cpu_initialize(mem);
-       index = processor_index(id);
-       printk_debug("%s  %d/%u\n", __FUNCTION__ , index, id);
-       processor_map[index] = CPU_ENABLED;
-
-       atomic_dec(&active_cpus);
-       stop_cpu(id);
-}
-
-static void wait_for_other_cpus(void)
-{
-       int old_active_count, active_count;
-       int i;
-       old_active_count = 1;
-
-       active_count = atomic_read(&active_cpus);
-       while (active_count > 1) {
-               if (active_count != old_active_count) {
-                       printk_info("Waiting for %d CPUS to stop\n",
-                                   active_count);
-                       old_active_count = active_count;
-               }
-               active_count = atomic_read(&active_cpus);
-       }
-
-       for (i = 0; i < CONFIG_MAX_CPUS; i++) {
-               if (!(processor_map[i] & CPU_ENABLED)) {
-                       printk_err("CPU %d did not initialize!\n", i);
-                       processor_map[i] = 0;
-               }
-       }
-
-       printk_debug("All AP CPUs stopped\n");
-}
 
-#else /* CONIFG_SMP */
-#define wait_for_other_cpus() do {} while(0)
-#endif /* CONFIG_SMP */
+void hardwaremain(int boot_complete);
 
-/**
- * @brief Main program of LinuxBIOS
- *
- * @param boot_complete
- */
 void hardwaremain(int boot_complete)
 {
-       /* Processor ID of the BOOT cpu (i.e. the one running this code) */
-       unsigned long boot_cpu;
-       int boot_index;
-       struct mem_range *mem, *tmem;
        struct lb_memory *lb_mem;
-       unsigned long totalmem;
 
-       post_code(0x80);
-       
-       CONFIGURE(CONF_PASS_PRE_CONSOLE);
+       post_code(POST_ENTRY_RAMSTAGE);
 
-       /* displayinit MUST PRECEDE ALL PRINTK! */
+       /* console_init() MUST PRECEDE ALL printk()! */
        console_init();
-       
-       post_code(0x39);
-       printk_notice("LinuxBIOS-%s%s %s %s...\n", 
-                     linuxbios_version, linuxbios_extra_version,
-                     linuxbios_build, (boot_complete)?"rebooting":"booting");
 
-       post_code(0x40);
+       post_code(POST_CONSOLE_READY);
+
+       printk(BIOS_NOTICE, "coreboot-%s%s %s %s...\n",
+                     coreboot_version, coreboot_extra_version, coreboot_build,
+                     (boot_complete)?"rebooting":"booting");
+
+       post_code(POST_CONSOLE_BOOT_MSG);
 
        /* If we have already booted attempt a hard reboot */
        if (boot_complete) {
                hard_reset();
        }
 
-       CONFIGURE(CONF_PASS_PRE_PCI);
+       /* FIXME: Is there a better way to handle this? */
+       init_timer();
 
-       /* determine how software can generate PCI configuration transactions
-        * in this system  */
-       printk_info("Finding PCI configuration type.\n");
-       pci_set_method();
-       post_code(0x5f);
-
-       /* convert static device structures into dynamic device structures
-        * before probing dynamic devices. */
-       enumerate_static_devices();
-
-       /* probe the existence of dynamic devices and construct the dynamic
-        * device tree. */
+       /* Find the devices we don't have hard coded knowledge about. */
        dev_enumerate();
-       post_code(0x66);
-
-       /* probe and assign the resources required by the dynamic devices */
+       post_code(POST_DEVICE_ENUMERATION_COMPLETE);
+       /* Now compute and assign the bus resources. */
        dev_configure();
-       post_code(0x88);
-
-       /* enable the resources probed and assigned in dev_configure() */
+       post_code(POST_DEVICE_CONFIGURATION_COMPLETE);
+       /* Now actually enable devices on the bus */
        dev_enable();
-
-       /* do the device specific init in additional to simple resources
-        * allocation performed in dev_enable() */
+       /* And of course initialize devices on the bus */
        dev_initialize();
-       post_code(0x89);
+       post_code(POST_DEVICES_ENABLED);
 
-       CONFIGURE(CONF_PASS_POST_PCI);
-
-       /* this is done last because some devices may 'steal' memory from
-        * the system during device initialization. */
-       mem = get_ramsize();
-       post_code(0x70);
-       for (totalmem = 0, tmem = mem; tmem->sizek; tmem++) {
-               totalmem += tmem->sizek;
-       }
-       /* Round to the nearest mega */
-       printk_info("totalram: %ldM\n", (totalmem + 512) >> 10);
-
-       /* fully initialize the boot processor */
-       boot_cpu = cpu_initialize(mem);
-       boot_index = processor_index(boot_cpu);
-       printk_spew("BOOT CPU is %d\n", boot_cpu);
-       processor_map[boot_index] = CPU_BOOTPROCESSOR|CPU_ENABLED;
-
-       /* start up other processors, it works like a pthread_create() or
-        * fork(), instead of running the initialization code for all devices
-        * as the boot processor, they start from secondary_cpu_init(), doing
-        * cpu initialization only. */
-       post_code(0x75);
-       startup_other_cpus(processor_map);
-
-       /* like pthread_join() or wait(), wait other processors finishing
-        * their execution of secondary_cpu_init() and make certain we are
-        * the only cpu running in LinuxBIOS */
-       wait_for_other_cpus();
-
-       /* Now that we have collected all of our information, write our
-        * configuration tables. */
-       lb_mem = write_tables(mem, processor_map);
-
-       CONFIGURE(CONF_PASS_PRE_BOOT);
-
-#if CONFIG_FS_STREAM == 1
-       filo(lb_mem);
-#else
-       elfboot(lb_mem);
+#if CONFIG_WRITE_HIGH_TABLES == 1
+       cbmem_initialize();
+#if CONFIG_CONSOLE_CBMEM
+       cbmemc_reinit();
+#endif
 #endif
+#if CONFIG_HAVE_ACPI_RESUME == 1
+       suspend_resume();
+       post_code(0x8a);
+#endif
+
+       /* Now that we have collected all of our information
+        * write our configuration tables.
+        */
+       lb_mem = write_tables();
+       cbfs_load_payload(lb_mem, CONFIG_CBFS_PREFIX "/payload");
+       printk(BIOS_ERR, "Boot failed.\n");
 }