From 536f962af956db5fcd1b61e1fba282fd6ffb2a56 Mon Sep 17 00:00:00 2001
From: Daniel J Blueman <daniel@numascale.com>
Date: Mon, 30 Mar 2015 17:34:54 +0800
Subject: [PATCH] Add common info struct

Signed-off-by: Daniel J Blueman <daniel@numascale.com>
---
 arch/x86/include/asm/numachip/numachip_common.h | 42 +++++++++++++++++++++++++
 arch/x86/kernel/apic/apic_numachip.c            | 24 ++++++++++++--
 2 files changed, 64 insertions(+), 2 deletions(-)
 create mode 100644 arch/x86/include/asm/numachip/numachip_common.h

diff --git a/arch/x86/include/asm/numachip/numachip_common.h b/arch/x86/include/asm/numachip/numachip_common.h
new file mode 100644
index 0000000..45296bb
--- /dev/null
+++ b/arch/x86/include/asm/numachip/numachip_common.h
@@ -0,0 +1,42 @@
+/*
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file "COPYING" in the main directory of this archive
+ * for more details.
+ *
+ * Numascale NumaConnect-Specific Header file
+ *
+ * Copyright (C) 2011 Numascale AS. All rights reserved.
+ *
+ * Send feedback to <support@numascale.com>
+ *
+ */
+
+#ifndef _ASM_X86_NUMACHIP_NUMACHIP_COMMON_H
+#define _ASM_X86_NUMACHIP_NUMACHIP_COMMON_H
+
+struct numachip_info {
+	unsigned layout : 4;
+	unsigned size_x : 4;
+	unsigned size_y : 4;
+	unsigned size_z : 4;
+	unsigned northbridges : 3;
+	unsigned neigh_ht : 3;
+	unsigned neigh_link : 2;
+	unsigned symmetric : 1;
+	unsigned renumbering : 1;
+	unsigned remote_io : 1;
+	unsigned observer : 1;
+	unsigned cores : 8;
+	unsigned ht : 3;
+	u8 partition;
+	u16 fabric_nodes : 12;
+	u16 part_start : 12;
+	u16 part_nodes : 12;
+	unsigned pad : 7;
+	char firmware_ver[18];
+} __attribute__((packed));
+
+extern struct numachip_info *numachip_info;
+extern int numachip_system;
+
+#endif
diff --git a/arch/x86/kernel/apic/apic_numachip.c b/arch/x86/kernel/apic/apic_numachip.c
index c2fd21f..165ed70 100644
--- a/arch/x86/kernel/apic/apic_numachip.c
+++ b/arch/x86/kernel/apic/apic_numachip.c
@@ -21,16 +21,19 @@
 #include <linux/init.h>
 #include <linux/hardirq.h>
 #include <linux/delay.h>
+#include <linux/acpi.h>
 
 #include <asm/numachip/numachip.h>
 #include <asm/numachip/numachip_csr.h>
+#include <asm/numachip/numachip_common.h>
 #include <asm/smp.h>
 #include <asm/apic.h>
 #include <asm/ipi.h>
 #include <asm/apic_flat_64.h>
 #include <asm/pgtable.h>
 
-static int numachip_system __read_mostly;
+int numachip_system __read_mostly;
+struct numachip_info *numachip_info __read_mostly;
 
 static const struct apic apic_numachip;
 
@@ -161,11 +164,29 @@ static void fixup_cpu_id(struct cpuinfo_x86 *c, int node)
 	}
 }
 
+static int parse_oemn(struct acpi_table_header *table)
+{
+	char verstr[sizeof(numachip_info->firmware_ver) + 1];
+	numachip_info = kzalloc(sizeof(*numachip_info), GFP_KERNEL);
+	BUG_ON(!numachip_info);
+	memcpy(numachip_info, (char *)table + sizeof(struct acpi_table_header), sizeof(*numachip_info));
+
+	/* NULL-terminate firmware version string */
+	strncpy(verstr, numachip_info->firmware_ver, sizeof(numachip_info->firmware_ver));
+	if (numachip_info->layout >= 5)
+		pr_err("Numaconnect firmware %s\n", verstr);
+
+	return 0;
+}
+
 static int __init numachip_system_init(void)
 {
 	if (!numachip_system)
 		return 0;
 
+	if (acpi_table_parse("OEMN", parse_oemn))
+		panic("NumaConnect: OEMN table parsing failed\n");
+
 	init_extra_mapping_uc(NUMACHIP_LCSR_BASE, NUMACHIP_LCSR_SIZE);
 	init_extra_mapping_uc(NUMACHIP_GCSR_BASE, NUMACHIP_GCSR_SIZE);
 
@@ -237,4 +258,3 @@ static const struct apic apic_numachip __refconst = {
 	.safe_wait_icr_idle		= native_safe_apic_wait_icr_idle,
 };
 apic_driver(apic_numachip);
-
-- 
1.9.1

