- HDAMA boots!
[coreboot.git] / src / arch / i386 / smp / mpspec.c
index 3bb5fa198531ae5c6a7f06eefe457cfc10336b38..daeb78435dcc485baab3a75c83e58bf5dc2377ce 100644 (file)
@@ -1,10 +1,11 @@
 #include <console/console.h>
+#include <device/device.h>
+#include <device/path.h>
 #include <cpu/cpu.h>
-#include <smp/start_stop.h>
 #include <arch/smp/mpspec.h>
 #include <string.h>
-#include <cpu/p5/cpuid.h>
-#include <cpu/p6/apic.h>
+#include <arch/cpu.h>
+#include <cpu/x86/lapic.h>
 
 unsigned char smp_compute_checksum(void *v, int len)
 {
@@ -94,33 +95,38 @@ void smp_write_processor(struct mp_config_table *mc,
  * Having the proper apicid's in the table so the non-bootstrap
  *  processors can be woken up should be enough.
  */
-void smp_write_processors(struct mp_config_table *mc, 
-                       unsigned long *processor_map)
+void smp_write_processors(struct mp_config_table *mc)
 {
-       int i;
-       int processor_id;
+       int boot_apic_id;
        unsigned apic_version;
        unsigned cpu_features;
        unsigned cpu_feature_flags;
-       int eax, ebx, ecx, edx;
-       processor_id = this_processors_id();
-       apic_version = apic_read(APIC_LVR) & 0xff;
-       cpuid(1, &eax, &ebx, &ecx, &edx);
-       cpu_features = eax;
-       cpu_feature_flags = edx;
-       for(i = 0; i < MAX_CPUS; i++) {
-               unsigned long cpu_apicid = initial_apicid[i];
+       struct cpuid_result result;
+       device_t cpu;
+       
+       boot_apic_id = lapicid();
+       apic_version = lapic_read(LAPIC_LVR) & 0xff;
+       result = cpuid(1);
+       cpu_features = result.eax;
+       cpu_feature_flags = result.edx;
+       for(cpu = all_devices; cpu; cpu = cpu->next) {
                unsigned long cpu_flag;
-               if(initial_apicid[i]==-1)
+               if ((cpu->path.type != DEVICE_PATH_APIC) || 
+                       (cpu->bus->dev->path.type != DEVICE_PATH_APIC_CLUSTER))
+               {
+                       continue;
+               }
+               if (!cpu->enabled) {
                        continue;
-               cpu_flag = MPC_CPU_ENABLED
-               if (processor_map[i] & CPU_BOOTPROCESSOR) {
-                       cpu_flag |= MPC_CPU_BOOTPROCESSOR;
                }
-               smp_write_processor(mc, cpu_apicid, apic_version,
+               cpu_flag = MPC_CPU_ENABLED;
+               if (boot_apic_id == cpu->path.u.apic.apic_id) {
+                       cpu_flag = MPC_CPU_ENABLED | MPC_CPU_BOOTPROCESSOR;
+               }
+               smp_write_processor(mc, 
+                       cpu->path.u.apic.apic_id, apic_version,
                        cpu_flag, cpu_features, cpu_feature_flags
                );
-       
        }
 }