|
@@ -13,12 +13,15 @@
|
|
|
#include <linux/nodemask.h>
|
|
|
#include <asm/io.h>
|
|
|
#include <linux/pci_ids.h>
|
|
|
+#include <linux/acpi.h>
|
|
|
#include <asm/types.h>
|
|
|
#include <asm/mmzone.h>
|
|
|
#include <asm/proto.h>
|
|
|
#include <asm/e820.h>
|
|
|
#include <asm/pci-direct.h>
|
|
|
#include <asm/numa.h>
|
|
|
+#include <asm/mpspec.h>
|
|
|
+#include <asm/apic.h>
|
|
|
|
|
|
static __init int find_northbridge(void)
|
|
|
{
|
|
@@ -44,6 +47,30 @@ static __init int find_northbridge(void)
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
|
+static __init void early_get_boot_cpu_id(void)
|
|
|
+{
|
|
|
+ /*
|
|
|
+ * need to get boot_cpu_id so can use that to create apicid_to_node
|
|
|
+ * in k8_scan_nodes()
|
|
|
+ */
|
|
|
+ /*
|
|
|
+ * Find possible boot-time SMP configuration:
|
|
|
+ */
|
|
|
+ early_find_smp_config();
|
|
|
+#ifdef CONFIG_ACPI
|
|
|
+ /*
|
|
|
+ * Read APIC information from ACPI tables.
|
|
|
+ */
|
|
|
+ early_acpi_boot_init();
|
|
|
+#endif
|
|
|
+ /*
|
|
|
+ * get boot-time SMP configuration:
|
|
|
+ */
|
|
|
+ if (smp_found_config)
|
|
|
+ early_get_smp_config();
|
|
|
+ early_init_lapic_mapping();
|
|
|
+}
|
|
|
+
|
|
|
int __init k8_scan_nodes(unsigned long start, unsigned long end)
|
|
|
{
|
|
|
unsigned long prevbase;
|
|
@@ -56,6 +83,7 @@ int __init k8_scan_nodes(unsigned long start, unsigned long end)
|
|
|
unsigned cores;
|
|
|
unsigned bits;
|
|
|
int j;
|
|
|
+ unsigned apicid_base;
|
|
|
|
|
|
if (!early_pci_allowed())
|
|
|
return -1;
|
|
@@ -174,11 +202,19 @@ int __init k8_scan_nodes(unsigned long start, unsigned long end)
|
|
|
/* use the coreid bits from early_identify_cpu */
|
|
|
bits = boot_cpu_data.x86_coreid_bits;
|
|
|
cores = (1<<bits);
|
|
|
+ apicid_base = 0;
|
|
|
+ /* need to get boot_cpu_id early for system with apicid lifting */
|
|
|
+ early_get_boot_cpu_id();
|
|
|
+ if (boot_cpu_physical_apicid > 0) {
|
|
|
+ printk(KERN_INFO "BSP APIC ID: %02x\n",
|
|
|
+ boot_cpu_physical_apicid);
|
|
|
+ apicid_base = boot_cpu_physical_apicid;
|
|
|
+ }
|
|
|
|
|
|
for (i = 0; i < 8; i++) {
|
|
|
if (nodes[i].start != nodes[i].end) {
|
|
|
nodeid = nodeids[i];
|
|
|
- for (j = 0; j < cores; j++)
|
|
|
+ for (j = apicid_base; j < cores + apicid_base; j++)
|
|
|
apicid_to_node[(nodeid << bits) + j] = i;
|
|
|
setup_node_bootmem(i, nodes[i].start, nodes[i].end);
|
|
|
}
|