Unify Local APIC address definitions
[coreboot.git] / src / mainboard / arima / hdama / mptable.c
index 663d2e1ba89ad2fcc5a58457c3af9da3a7dc9565..f67327e891675066757fe7d01cff4606328c243f 100644 (file)
 #define HT_INIT_CONTROL 0x6c
 #define HTIC_BIOSR_Detect  (1<<5)
 
-/* If we assume a symmetric processor configuration we can
- * get all of the information we need to write the processor
- * entry from the bootstrap processor.
- * Plus I don't think linux really even cares.
- * Having the proper apicid's in the table so the non-bootstrap
- *  processors can be woken up should be enough.  Linux-2.6.11 work-around.
- */
-static void smp_write_processors_inorder(struct mp_config_table *mc)
-{
-        int boot_apic_id;
-       int order_id;
-        unsigned apic_version;
-        unsigned cpu_features;
-        unsigned cpu_feature_flags;
-        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;
-       /* order the output of the cpus to fix a bug in kernel 6 11 */
-       for(order_id = 0;order_id <256; order_id++) {
-            for(cpu = all_devices; cpu; cpu = cpu->next) {
-                unsigned long cpu_flag;
-                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 (boot_apic_id == cpu->path.apic.apic_id) {
-                        cpu_flag = MPC_CPU_ENABLED | MPC_CPU_BOOTPROCESSOR;
-                }
-               if(cpu->path.apic.apic_id == order_id) {
-                    smp_write_processor(mc,
-                        cpu->path.apic.apic_id, apic_version,
-                        cpu_flag, cpu_features, cpu_feature_flags);
-                   break;
-               }
-            }
-       }
-}
-
 static unsigned node_link_to_bus(unsigned node, unsigned link)
 {
        device_t dev;
@@ -123,9 +75,9 @@ static void *smp_write_config_table(void *v)
 
        mc = (void *)(((char *)v) + SMP_FLOATING_TABLE_LEN);
 
-       mptable_init(mc, "HDAMA       ", LAPIC_ADDR);
+       mptable_init(mc, LOCAL_APIC_ADDR);
 
-       smp_write_processors_inorder(mc);
+       smp_write_processors(mc);
 
        apicid_base = max_apicid() + 1;
        apicid_8111 = apicid_base;
@@ -198,10 +150,7 @@ static void *smp_write_config_table(void *v)
        mptable_add_isa_interrupts(mc, bus_isa, apicid_8111, 0);
 
        /* Standard local interrupt assignments */
-       smp_write_lintsrc(mc, mp_ExtINT, MP_IRQ_TRIGGER_DEFAULT|MP_IRQ_POLARITY_DEFAULT,
-               bus_isa, 0x00, MP_APIC_ALL, 0x00);
-       smp_write_lintsrc(mc, mp_NMI, MP_IRQ_TRIGGER_DEFAULT|MP_IRQ_POLARITY_DEFAULT,
-               bus_isa, 0x00, MP_APIC_ALL, 0x01);
+       mptable_lintsrc(mc, bus_isa);
 
        /* PCI Ints:         Type    Trigger                Polarity                 Bus ID      PCIDEVNUM|IRQ  APIC ID PIN# */
        /* On board nics */
@@ -251,11 +200,7 @@ static void *smp_write_config_table(void *v)
        /* There is no extension information... */
 
        /* Compute the checksums */
-       mc->mpe_checksum = smp_compute_checksum(smp_next_mpc_entry(mc), mc->mpe_length);
-       mc->mpc_checksum = smp_compute_checksum(mc, mc->mpc_length);
-       printk(BIOS_DEBUG, "Wrote the mp table end at: %p - %p\n",
-               mc, smp_next_mpe_entry(mc));
-       return smp_next_mpe_entry(mc);
+       return mptable_finalize(mc);
 }
 
 static void reboot_if_hotswap(void)
@@ -312,7 +257,7 @@ unsigned long write_smp_table(unsigned long addr)
        void *v;
        reboot_if_hotswap();
 
-       v = smp_write_floating_table(addr);
+       v = smp_write_floating_table(addr, 0);
        return (unsigned long)smp_write_config_table(v);
 }