ACPI: processor: unify arch_acpi_processor_init_pdc
[safe/jmp/linux-2.6] / drivers / acpi / numa.c
index 25ceae9..7ad48df 100644 (file)
 #include <linux/types.h>
 #include <linux/errno.h>
 #include <linux/acpi.h>
+#include <linux/numa.h>
 #include <acpi/acpi_bus.h>
-#include <acpi/acmacros.h>
+
+#define PREFIX "ACPI: "
 
 #define ACPI_NUMA      0x80000000
 #define _COMPONENT     ACPI_NUMA
@@ -39,14 +41,14 @@ static nodemask_t nodes_found_map = NODE_MASK_NONE;
 
 /* maps to convert between proximity domain and logical node ID */
 static int pxm_to_node_map[MAX_PXM_DOMAINS]
-                               = { [0 ... MAX_PXM_DOMAINS - 1] = NID_INVAL };
+                       = { [0 ... MAX_PXM_DOMAINS - 1] = NUMA_NO_NODE };
 static int node_to_pxm_map[MAX_NUMNODES]
-                               = { [0 ... MAX_NUMNODES - 1] = PXM_INVAL };
+                       = { [0 ... MAX_NUMNODES - 1] = PXM_INVAL };
 
 int pxm_to_node(int pxm)
 {
        if (pxm < 0)
-               return NID_INVAL;
+               return NUMA_NO_NODE;
        return pxm_to_node_map[pxm];
 }
 
@@ -67,9 +69,9 @@ int acpi_map_pxm_to_node(int pxm)
 {
        int node = pxm_to_node_map[pxm];
 
-       if (node < 0){
+       if (node < 0) {
                if (nodes_weight(nodes_found_map) >= MAX_NUMNODES)
-                       return NID_INVAL;
+                       return NUMA_NO_NODE;
                node = first_unset_node(nodes_found_map);
                __acpi_map_pxm_to_node(pxm, node);
                node_set(node, nodes_found_map);
@@ -78,16 +80,6 @@ int acpi_map_pxm_to_node(int pxm)
        return node;
 }
 
-#if 0
-void __cpuinit acpi_unmap_pxm_to_node(int node)
-{
-       int pxm = node_to_pxm_map[node];
-       pxm_to_node_map[pxm] = NID_INVAL;
-       node_to_pxm_map[node] = PXM_INVAL;
-       node_clear(node, nodes_found_map);
-}
-#endif  /*  0  */
-
 static void __init
 acpi_table_print_srat_entry(struct acpi_subtable_header *header)
 {
@@ -132,6 +124,21 @@ acpi_table_print_srat_entry(struct acpi_subtable_header *header)
 #endif                         /* ACPI_DEBUG_OUTPUT */
                break;
 
+       case ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY:
+#ifdef ACPI_DEBUG_OUTPUT
+               {
+                       struct acpi_srat_x2apic_cpu_affinity *p =
+                           (struct acpi_srat_x2apic_cpu_affinity *)header;
+                       ACPI_DEBUG_PRINT((ACPI_DB_INFO,
+                                         "SRAT Processor (x2apicid[0x%08x]) in"
+                                         " proximity domain %d %s\n",
+                                         p->apic_id,
+                                         p->proximity_domain,
+                                         (p->flags & ACPI_SRAT_CPU_ENABLED) ?
+                                         "enabled" : "disabled"));
+               }
+#endif                         /* ACPI_DEBUG_OUTPUT */
+               break;
        default:
                printk(KERN_WARNING PREFIX
                       "Found unsupported SRAT entry (type = 0x%x)\n",
@@ -181,8 +188,35 @@ static int __init acpi_parse_slit(struct acpi_table_header *table)
        return 0;
 }
 
+void __init __attribute__ ((weak))
+acpi_numa_x2apic_affinity_init(struct acpi_srat_x2apic_cpu_affinity *pa)
+{
+       printk(KERN_WARNING PREFIX
+              "Found unsupported x2apic [0x%08x] SRAT entry\n", pa->apic_id);
+       return;
+}
+
+
+static int __init
+acpi_parse_x2apic_affinity(struct acpi_subtable_header *header,
+                          const unsigned long end)
+{
+       struct acpi_srat_x2apic_cpu_affinity *processor_affinity;
+
+       processor_affinity = (struct acpi_srat_x2apic_cpu_affinity *)header;
+       if (!processor_affinity)
+               return -EINVAL;
+
+       acpi_table_print_srat_entry(header);
+
+       /* let architecture-dependent part to do it */
+       acpi_numa_x2apic_affinity_init(processor_affinity);
+
+       return 0;
+}
+
 static int __init
-acpi_parse_processor_affinity(struct acpi_subtable_header * header,
+acpi_parse_processor_affinity(struct acpi_subtable_header *header,
                              const unsigned long end)
 {
        struct acpi_srat_cpu_affinity *processor_affinity;
@@ -240,20 +274,24 @@ acpi_table_parse_srat(enum acpi_srat_type id,
 
 int __init acpi_numa_init(void)
 {
+       int ret = 0;
+
        /* SRAT: Static Resource Affinity Table */
        if (!acpi_table_parse(ACPI_SIG_SRAT, acpi_parse_srat)) {
+               acpi_table_parse_srat(ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY,
+                                     acpi_parse_x2apic_affinity, NR_CPUS);
                acpi_table_parse_srat(ACPI_SRAT_TYPE_CPU_AFFINITY,
                                      acpi_parse_processor_affinity, NR_CPUS);
-               acpi_table_parse_srat(ACPI_SRAT_TYPE_MEMORY_AFFINITY,
-                                     acpi_parse_memory_affinity,
-                                     NR_NODE_MEMBLKS);
+               ret = acpi_table_parse_srat(ACPI_SRAT_TYPE_MEMORY_AFFINITY,
+                                           acpi_parse_memory_affinity,
+                                           NR_NODE_MEMBLKS);
        }
 
        /* SLIT: System Locality Information Table */
        acpi_table_parse(ACPI_SIG_SLIT, acpi_parse_slit);
 
        acpi_numa_arch_fixup();
-       return 0;
+       return ret;
 }
 
 int acpi_get_pxm(acpi_handle h)
@@ -278,7 +316,7 @@ int acpi_get_node(acpi_handle *handle)
        int pxm, node = -1;
 
        pxm = acpi_get_pxm(handle);
-       if (pxm >= 0)
+       if (pxm >= 0 && pxm < MAX_PXM_DOMAINS)
                node = acpi_map_pxm_to_node(pxm);
 
        return node;