#define GSI_MAX_PCH_IRQ                (LOONGSON_PCH_IRQ_BASE + 256 - 1)
 
 extern int find_pch_pic(u32 gsi);
-extern int eiointc_get_node(int id);
-
 struct acpi_madt_lio_pic;
 struct acpi_madt_eio_pic;
 struct acpi_madt_ht_pic;
 
 }
 #endif
 
+static int __init
+acpi_parse_processor(union acpi_subtable_headers *header, const unsigned long end)
+{
+       struct acpi_madt_core_pic *processor = NULL;
+
+       processor = (struct acpi_madt_core_pic *)header;
+       if (BAD_MADT_ENTRY(processor, end))
+               return -EINVAL;
+
+       acpi_table_print_madt_entry(&header->common);
+#ifdef CONFIG_SMP
+       set_processor_mask(processor->core_id, processor->flags);
+#endif
+
+       return 0;
+}
+
+static int __init
+acpi_parse_eio_master(union acpi_subtable_headers *header, const unsigned long end)
+{
+       static int core = 0;
+       struct acpi_madt_eio_pic *eiointc = NULL;
+
+       eiointc = (struct acpi_madt_eio_pic *)header;
+       if (BAD_MADT_ENTRY(eiointc, end))
+               return -EINVAL;
+
+       core = eiointc->node * CORES_PER_EIO_NODE;
+       set_bit(core, &(loongson_sysconf.cores_io_master));
+
+       return 0;
+}
+
 static void __init acpi_process_madt(void)
 {
 #ifdef CONFIG_SMP
                __cpu_logical_map[i] = -1;
        }
 #endif
+       acpi_table_parse_madt(ACPI_MADT_TYPE_CORE_PIC,
+                       acpi_parse_processor, MAX_CORE_PIC);
+
+       acpi_table_parse_madt(ACPI_MADT_TYPE_EIO_PIC,
+                       acpi_parse_eio_master, MAX_IO_PICS);
 
        loongson_sysconf.nr_cpus = num_processors;
 }