All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Chen, Gong" <gong.chen@linux.intel.com>
To: tony.luck@intel.com, bp@alien8.de
Cc: linux-kernel@vger.kernel.org, linux-acpi@vger.kernel.org, "Chen,
	Gong" <gong.chen@linux.intel.com>
Subject: [PATCH 4/8] DMI: Parse memory device (type 17) in SMBIOS
Date: Fri, 11 Oct 2013 02:32:42 -0400	[thread overview]
Message-ID: <1381473166-29303-5-git-send-email-gong.chen@linux.intel.com> (raw)
In-Reply-To: <1381473166-29303-1-git-send-email-gong.chen@linux.intel.com>

This patch adds a new interface to decode memory device (type 17)
to help error reporting on DIMMs.

Original-author: Tony Luck <tony.luck@intel.com>
Signed-off-by: Chen, Gong <gong.chen@linux.intel.com>
---
 arch/ia64/kernel/setup.c    |  1 +
 arch/x86/kernel/setup.c     |  1 +
 drivers/firmware/dmi_scan.c | 60 +++++++++++++++++++++++++++++++++++++++++++++
 include/linux/dmi.h         |  5 ++++
 4 files changed, 67 insertions(+)

diff --git a/arch/ia64/kernel/setup.c b/arch/ia64/kernel/setup.c
index 4fc2e95..d86669b 100644
--- a/arch/ia64/kernel/setup.c
+++ b/arch/ia64/kernel/setup.c
@@ -1063,6 +1063,7 @@ check_bugs (void)
 static int __init run_dmi_scan(void)
 {
 	dmi_scan_machine();
+	dmi_memdev_walk();
 	dmi_set_dump_stack_arch_desc();
 	return 0;
 }
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
index f0de629..918d489 100644
--- a/arch/x86/kernel/setup.c
+++ b/arch/x86/kernel/setup.c
@@ -993,6 +993,7 @@ void __init setup_arch(char **cmdline_p)
 		efi_init();
 
 	dmi_scan_machine();
+	dmi_memdev_walk();
 	dmi_set_dump_stack_arch_desc();
 
 	/*
diff --git a/drivers/firmware/dmi_scan.c b/drivers/firmware/dmi_scan.c
index fa0affb..ca3619d 100644
--- a/drivers/firmware/dmi_scan.c
+++ b/drivers/firmware/dmi_scan.c
@@ -25,6 +25,13 @@ static int dmi_initialized;
 /* DMI system identification string used during boot */
 static char dmi_ids_string[128] __initdata;
 
+static struct dmi_memdev_info {
+	const char *device;
+	const char *bank;
+	u16 handle;
+} *dmi_memdev;
+static int dmi_memdev_nr;
+
 static const char * __init dmi_string_nosave(const struct dmi_header *dm, u8 s)
 {
 	const u8 *bp = ((u8 *) dm) + dm->length;
@@ -322,6 +329,42 @@ static void __init dmi_save_extended_devices(const struct dmi_header *dm)
 	dmi_save_one_device(*d & 0x7f, dmi_string_nosave(dm, *(d - 1)));
 }
 
+static void __init count_mem_devices(const struct dmi_header *dm, void *v)
+{
+	if (dm->type != DMI_ENTRY_MEM_DEVICE)
+		return;
+	dmi_memdev_nr++;
+}
+
+static void __init save_mem_devices(const struct dmi_header *dm, void *v)
+{
+	const char *d = (const char *)dm;
+	static int nr;
+
+	if (dm->type != DMI_ENTRY_MEM_DEVICE)
+		return;
+	if (nr >= dmi_memdev_nr) {
+		pr_warn_once("Too many DIMM entries in SMBIOS table\n");
+		return;
+	}
+	dmi_memdev[nr].handle = dm->handle;
+	dmi_memdev[nr].device = dmi_string(dm, d[0x10]);
+	dmi_memdev[nr].bank = dmi_string(dm, d[0x11]);
+	nr++;
+}
+
+void __init dmi_memdev_walk(void)
+{
+	if (!dmi_available)
+		return;
+
+	if (dmi_walk_early(count_mem_devices) == 0 && dmi_memdev_nr) {
+		dmi_memdev = dmi_alloc(sizeof(*dmi_memdev) * dmi_memdev_nr);
+		if (dmi_memdev)
+			dmi_walk_early(save_mem_devices);
+	}
+}
+
 /*
  *	Process a DMI table entry. Right now all we care about are the BIOS
  *	and machine entries. For 2.5 we should pull the smbus controller info
@@ -815,3 +858,20 @@ bool dmi_match(enum dmi_field f, const char *str)
 	return !strcmp(info, str);
 }
 EXPORT_SYMBOL_GPL(dmi_match);
+
+void dmi_memdev_name(u16 handle, const char **bank, const char **device)
+{
+	int n;
+
+	if (dmi_memdev == NULL)
+		return;
+
+	for (n = 0; n < dmi_memdev_nr; n++) {
+		if (handle == dmi_memdev[n].handle) {
+			*bank = dmi_memdev[n].bank;
+			*device = dmi_memdev[n].device;
+			break;
+		}
+	}
+}
+EXPORT_SYMBOL_GPL(dmi_memdev_name);
diff --git a/include/linux/dmi.h b/include/linux/dmi.h
index b6eb7a0..f820f0a 100644
--- a/include/linux/dmi.h
+++ b/include/linux/dmi.h
@@ -99,6 +99,7 @@ extern const char * dmi_get_system_info(int field);
 extern const struct dmi_device * dmi_find_device(int type, const char *name,
 	const struct dmi_device *from);
 extern void dmi_scan_machine(void);
+extern void dmi_memdev_walk(void);
 extern void dmi_set_dump_stack_arch_desc(void);
 extern bool dmi_get_date(int field, int *yearp, int *monthp, int *dayp);
 extern int dmi_name_in_vendors(const char *str);
@@ -107,6 +108,7 @@ extern int dmi_available;
 extern int dmi_walk(void (*decode)(const struct dmi_header *, void *),
 	void *private_data);
 extern bool dmi_match(enum dmi_field f, const char *str);
+extern void dmi_memdev_name(u16 handle, const char **bank, const char **device);
 
 #else
 
@@ -115,6 +117,7 @@ static inline const char * dmi_get_system_info(int field) { return NULL; }
 static inline const struct dmi_device * dmi_find_device(int type, const char *name,
 	const struct dmi_device *from) { return NULL; }
 static inline void dmi_scan_machine(void) { return; }
+static inline void dmi_memdev_walk(void) { }
 static inline void dmi_set_dump_stack_arch_desc(void) { }
 static inline bool dmi_get_date(int field, int *yearp, int *monthp, int *dayp)
 {
@@ -133,6 +136,8 @@ static inline int dmi_walk(void (*decode)(const struct dmi_header *, void *),
 	void *private_data) { return -1; }
 static inline bool dmi_match(enum dmi_field f, const char *str)
 	{ return false; }
+static inline void dmi_memdev_name(u16 handle, const char **bank,
+		const char **device) { }
 static inline const struct dmi_system_id *
 	dmi_first_match(const struct dmi_system_id *list) { return NULL; }
 
-- 
1.8.4.rc3


  parent reply	other threads:[~2013-10-11  6:47 UTC|newest]

Thread overview: 87+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-10-11  6:32 Extended H/W error log driver Chen, Gong
2013-10-11  6:32 ` [PATCH 1/8] ACPI, APEI, CPER: Fix status check during error printing Chen, Gong
2013-10-11  8:50   ` Borislav Petkov
2013-10-11  6:32 ` [PATCH 2/8] ACPI, CPER: Update cper info Chen, Gong
2013-10-11  9:06   ` Borislav Petkov
2013-10-11  9:06     ` Borislav Petkov
2013-10-11 15:47     ` Borislav Petkov
2013-10-16  1:57       ` Joe Perches
2013-10-16  2:46         ` Chen Gong
2013-10-16  3:10           ` Joe Perches
2013-10-15 18:17   ` Naveen N. Rao
2013-10-16  1:39     ` Chen Gong
2013-10-17 12:21       ` Naveen N. Rao
2013-10-18 11:06         ` Naveen N. Rao
2013-10-11  6:32 ` [PATCH 3/8] ACPI, x86: Extended error log driver for x86 platform Chen, Gong
2013-10-11 15:24   ` Borislav Petkov
2013-10-14  3:16     ` Chen Gong
2013-10-14 10:26       ` Borislav Petkov
2013-10-14 13:03         ` Chen Gong
2013-10-14 13:28           ` Borislav Petkov
2013-10-14 16:50         ` Tony Luck
2013-10-14 17:07           ` Borislav Petkov
2013-10-14 17:16             ` Tony Luck
2013-10-11  6:32 ` Chen, Gong [this message]
2013-10-11 15:40   ` [PATCH 4/8] DMI: Parse memory device (type 17) in SMBIOS Borislav Petkov
2013-10-14  3:21     ` Chen Gong
2013-10-14 10:30       ` Borislav Petkov
2013-10-15 19:00   ` Naveen N. Rao
2013-10-11  6:32 ` [PATCH 5/8] ACPI, APEI, CPER: Add UEFI 2.4 support for memory error Chen, Gong
2013-10-11 15:41   ` Borislav Petkov
2013-10-15 17:26   ` Naveen N. Rao
2013-10-16  1:35     ` Chen Gong
2013-10-11  6:32 ` [PATCH 6/8] ACPI, APEI, CPER: Enhance memory reporting capability Chen, Gong
2013-10-11 15:49   ` Borislav Petkov
2013-10-15 19:18   ` Naveen N. Rao
2013-10-11  6:32 ` [PATCH 7/8] ACPI, APEI, CPER: Cleanup CPER memory error output format Chen, Gong
2013-10-11 16:02   ` Borislav Petkov
2013-10-14  4:55     ` Chen Gong
2013-10-14 10:36       ` Borislav Petkov
2013-10-14 17:12         ` Tony Luck
2013-10-14 18:47           ` Borislav Petkov
2013-10-14 21:03             ` Tony Luck
2013-10-14 21:50               ` Borislav Petkov
2013-10-15  9:18                 ` Chen Gong
2013-10-15 10:13                   ` Borislav Petkov
2013-10-15 11:28           ` Naveen N. Rao
2013-10-15 11:41           ` Naveen N. Rao
2013-10-15 12:29             ` Borislav Petkov
2013-10-15 16:42               ` Joe Perches
2013-10-15 16:49                 ` Tony Luck
2013-10-15 16:56                   ` Borislav Petkov
2013-10-11  6:32 ` [PATCH 8/8] ACPI / trace: Add trace interface for eMCA driver Chen, Gong
2013-10-11  7:52   ` Borislav Petkov
2013-10-11 16:14   ` Borislav Petkov
2013-10-14  7:07     ` Chen Gong
2013-10-15 16:54   ` Naveen N. Rao
2013-10-15 17:00     ` Borislav Petkov
2013-10-15 17:30       ` Naveen N. Rao
2013-10-15 17:47         ` Borislav Petkov
2013-10-16  0:43         ` Mauro Carvalho Chehab
2013-10-16  9:16           ` Borislav Petkov
2013-10-16 10:35             ` Mauro Carvalho Chehab
2013-10-16 10:42               ` Borislav Petkov
2013-10-16 11:55                 ` Mauro Carvalho Chehab
2013-10-16 12:20                   ` Borislav Petkov
2013-10-16 20:47                   ` Luck, Tony
2013-10-17 10:34                     ` Mauro Carvalho Chehab
2013-10-17 21:35                       ` Luck, Tony
2013-10-16 20:35               ` Luck, Tony
2013-10-17 10:32                 ` Mauro Carvalho Chehab
2013-10-16  9:50     ` Chen Gong
2013-10-16 10:49       ` Borislav Petkov
2013-10-18 11:04         ` Naveen N. Rao
2013-10-11  7:00 ` Extended H/W error log driver Joe Perches
2013-10-11  8:04 ` Borislav Petkov
2013-10-11 14:54   ` Luck, Tony
2013-10-11 14:54     ` Luck, Tony
2013-10-11 15:27     ` Borislav Petkov
2013-10-14  6:49   ` Chen Gong
2013-10-14 10:55     ` Borislav Petkov
2013-10-15  4:07       ` Chen Gong
2013-10-15  9:28         ` Borislav Petkov
2013-10-15 16:15           ` Tony Luck
2013-10-15 19:10             ` Naveen N. Rao
2013-10-15 19:23               ` Borislav Petkov
2013-10-17 12:07                 ` Naveen N. Rao
2013-10-17 13:04                   ` Borislav Petkov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1381473166-29303-5-git-send-email-gong.chen@linux.intel.com \
    --to=gong.chen@linux.intel.com \
    --cc=bp@alien8.de \
    --cc=linux-acpi@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=tony.luck@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.