From: Greg Kroah-Hartman <gregkh@suse.de>
To: linux-kernel@vger.kernel.org
Cc: Mike Waychison <mikew@google.com>, Greg Kroah-Hartman <gregkh@suse.de>
Subject: [PATCH 36/50] firmware: Expose DMI type 15 System Event Log
Date: Wed, 16 Mar 2011 14:11:14 -0700 [thread overview]
Message-ID: <1300309888-5028-36-git-send-email-gregkh@suse.de> (raw)
In-Reply-To: <1300309888-5028-1-git-send-email-gregkh@suse.de>
From: Mike Waychison <mikew@google.com>
The System Event Log described by DMI entry type 15 may be backed by
either memory or may be indirectly accessed via an IO index/data
register pair.
In order to get read access to this log, expose it in the
"system_event_log" sub-directory of type 15 DMI entries, ie:
/sys/firmware/dmi/entries/15-0/system_event_log/raw_event_log.
This commit handles both IO accessed and memory access system event
logs. OEM specific access and GPNV support is explicitly not handled
and we error out in the logs when we do not recognize the access method.
Signed-off-by: Mike Waychison <mikew@google.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/firmware/dmi-sysfs.c | 143 ++++++++++++++++++++++++++++++++++++++++++
1 files changed, 143 insertions(+), 0 deletions(-)
diff --git a/drivers/firmware/dmi-sysfs.c b/drivers/firmware/dmi-sysfs.c
index d209610..a5afd80 100644
--- a/drivers/firmware/dmi-sysfs.c
+++ b/drivers/firmware/dmi-sysfs.c
@@ -312,6 +312,140 @@ static struct kobj_type dmi_system_event_log_ktype = {
.default_attrs = dmi_sysfs_sel_attrs,
};
+typedef u8 (*sel_io_reader)(const struct dmi_system_event_log *sel,
+ loff_t offset);
+
+static DEFINE_MUTEX(io_port_lock);
+
+static u8 read_sel_8bit_indexed_io(const struct dmi_system_event_log *sel,
+ loff_t offset)
+{
+ u8 ret;
+
+ mutex_lock(&io_port_lock);
+ outb((u8)offset, sel->io.index_addr);
+ ret = inb(sel->io.data_addr);
+ mutex_unlock(&io_port_lock);
+ return ret;
+}
+
+static u8 read_sel_2x8bit_indexed_io(const struct dmi_system_event_log *sel,
+ loff_t offset)
+{
+ u8 ret;
+
+ mutex_lock(&io_port_lock);
+ outb((u8)offset, sel->io.index_addr);
+ outb((u8)(offset >> 8), sel->io.index_addr + 1);
+ ret = inb(sel->io.data_addr);
+ mutex_unlock(&io_port_lock);
+ return ret;
+}
+
+static u8 read_sel_16bit_indexed_io(const struct dmi_system_event_log *sel,
+ loff_t offset)
+{
+ u8 ret;
+
+ mutex_lock(&io_port_lock);
+ outw((u16)offset, sel->io.index_addr);
+ ret = inb(sel->io.data_addr);
+ mutex_unlock(&io_port_lock);
+ return ret;
+}
+
+static sel_io_reader sel_io_readers[] = {
+ [DMI_SEL_ACCESS_METHOD_IO8] = read_sel_8bit_indexed_io,
+ [DMI_SEL_ACCESS_METHOD_IO2x8] = read_sel_2x8bit_indexed_io,
+ [DMI_SEL_ACCESS_METHOD_IO16] = read_sel_16bit_indexed_io,
+};
+
+static ssize_t dmi_sel_raw_read_io(struct dmi_sysfs_entry *entry,
+ const struct dmi_system_event_log *sel,
+ char *buf, loff_t pos, size_t count)
+{
+ ssize_t wrote = 0;
+
+ sel_io_reader io_reader = sel_io_readers[sel->access_method];
+
+ while (count && pos < sel->area_length) {
+ count--;
+ *(buf++) = io_reader(sel, pos++);
+ wrote++;
+ }
+
+ return wrote;
+}
+
+static ssize_t dmi_sel_raw_read_phys32(struct dmi_sysfs_entry *entry,
+ const struct dmi_system_event_log *sel,
+ char *buf, loff_t pos, size_t count)
+{
+ u8 __iomem *mapped;
+ ssize_t wrote = 0;
+
+ mapped = ioremap(sel->access_method_address, sel->area_length);
+ if (!mapped)
+ return -EIO;
+
+ while (count && pos < sel->area_length) {
+ count--;
+ *(buf++) = readb(mapped + pos++);
+ wrote++;
+ }
+
+ iounmap(mapped);
+ return wrote;
+}
+
+static ssize_t dmi_sel_raw_read_helper(struct dmi_sysfs_entry *entry,
+ const struct dmi_header *dh,
+ void *_state)
+{
+ struct dmi_read_state *state = _state;
+ const struct dmi_system_event_log *sel = to_sel(dh);
+
+ if (sizeof(*sel) > dmi_entry_length(dh))
+ return -EIO;
+
+ switch (sel->access_method) {
+ case DMI_SEL_ACCESS_METHOD_IO8:
+ case DMI_SEL_ACCESS_METHOD_IO2x8:
+ case DMI_SEL_ACCESS_METHOD_IO16:
+ return dmi_sel_raw_read_io(entry, sel, state->buf,
+ state->pos, state->count);
+ case DMI_SEL_ACCESS_METHOD_PHYS32:
+ return dmi_sel_raw_read_phys32(entry, sel, state->buf,
+ state->pos, state->count);
+ case DMI_SEL_ACCESS_METHOD_GPNV:
+ pr_info("dmi-sysfs: GPNV support missing.\n");
+ return -EIO;
+ default:
+ pr_info("dmi-sysfs: Unknown access method %02x\n",
+ sel->access_method);
+ return -EIO;
+ }
+}
+
+static ssize_t dmi_sel_raw_read(struct file *filp, struct kobject *kobj,
+ struct bin_attribute *bin_attr,
+ char *buf, loff_t pos, size_t count)
+{
+ struct dmi_sysfs_entry *entry = to_entry(kobj->parent);
+ struct dmi_read_state state = {
+ .buf = buf,
+ .pos = pos,
+ .count = count,
+ };
+
+ return find_dmi_entry(entry, dmi_sel_raw_read_helper, &state);
+}
+
+static struct bin_attribute dmi_sel_raw_attr = {
+ .attr = {.name = "raw_event_log", .mode = 0400},
+ .read = dmi_sel_raw_read,
+};
+
static int dmi_system_event_log(struct dmi_sysfs_entry *entry)
{
int ret;
@@ -325,6 +459,15 @@ static int dmi_system_event_log(struct dmi_sysfs_entry *entry)
"system_event_log");
if (ret)
goto out_free;
+
+ ret = sysfs_create_bin_file(entry->child, &dmi_sel_raw_attr);
+ if (ret)
+ goto out_del;
+
+ return 0;
+
+out_del:
+ kobject_del(entry->child);
out_free:
kfree(entry->child);
return ret;
--
1.7.4.1
next prev parent reply other threads:[~2011-03-16 21:24 UTC|newest]
Thread overview: 57+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-03-16 20:52 [GIT PATCH] driver core patches for .39 Greg KH
2011-03-16 21:10 ` [PATCH 01/50] driver-core: document restrictions on device_rename() Greg Kroah-Hartman
2011-03-16 21:10 ` [PATCH 02/50] docs/sysfs: Update directory/kobject documentation Greg Kroah-Hartman
2011-03-16 21:10 ` [PATCH 03/50] docs/sysfs: show() methods should use scnprintf() Greg Kroah-Hartman
2011-03-16 21:10 ` [PATCH 04/50] kobject: Add missing format attribute specifications Greg Kroah-Hartman
2011-03-16 21:10 ` [PATCH 05/50] Dynamic debug: Add more flags Greg Kroah-Hartman
2011-03-17 17:56 ` Jason Baron
2011-03-17 18:02 ` Greg KH
2011-03-18 10:22 ` Ingo Molnar
2011-03-18 11:19 ` Bart Van Assche
2011-03-16 21:10 ` [PATCH 06/50] firmware_classs: change val uevent's type to bool Greg Kroah-Hartman
2011-03-16 21:10 ` [PATCH 07/50] sysdev: Fixup warning message Greg Kroah-Hartman
2011-03-16 21:10 ` [PATCH 08/50] debugfs: remove module_exit() Greg Kroah-Hartman
2011-03-16 21:10 ` [PATCH 09/50] sysdev: Do not register with sysdev when erroring on add Greg Kroah-Hartman
2011-03-16 21:10 ` [PATCH 10/50] Translate Documentation/SecurityBugs into Chinese Greg Kroah-Hartman
2011-03-16 21:10 ` [PATCH 11/50] pch_phub: add new device ML7213 Greg Kroah-Hartman
2011-03-16 21:10 ` [PATCH 12/50] dynamic_debug: add #include <linux/sched.h> Greg Kroah-Hartman
2011-03-16 21:10 ` [PATCH 13/50] memory hotplug: Allow memory blocks to span multiple memory sections Greg Kroah-Hartman
2011-03-16 21:10 ` [PATCH 14/50] memory hotplug: Update phys_index to [start|end]_section_nr Greg Kroah-Hartman
2011-03-16 21:10 ` [PATCH 15/50] memory hotplug: Define memory_block_size_bytes for powerpc/pseries Greg Kroah-Hartman
2011-03-16 21:10 ` [PATCH 16/50] memory hotplug: Define memory_block_size_bytes for x86_64 with CONFIG_X86_UV Greg Kroah-Hartman
2011-03-16 21:10 ` [PATCH 17/50] memory hotplug: sysfs probe routine should add all memory sections Greg Kroah-Hartman
2011-03-16 21:10 ` [PATCH 18/50] driver core: Replace the dangerous to_root_device macro with an inline function Greg Kroah-Hartman
2011-03-16 21:10 ` [PATCH 19/50] sysfs: Capitalize description of SYSFS_DEPRECATED{_V2} options Greg Kroah-Hartman
2011-03-16 21:10 ` [PATCH 20/50] Fix a mistake Chinese character in Documentation/zh_CN/SubmittingPatches Greg Kroah-Hartman
2011-03-16 21:10 ` [PATCH 21/50] drivers:misc: ti-st: register with channel IDs Greg Kroah-Hartman
2011-03-16 21:11 ` [PATCH 22/50] drivers:misc: ti-st: move from rfkill to sysfs Greg Kroah-Hartman
2011-03-16 21:11 ` [PATCH 23/50] drivers:misc: ti-st: fix error codes Greg Kroah-Hartman
2011-03-16 21:11 ` [PATCH 24/50] drivers:misc: ti-st: set right debug levels for logs Greg Kroah-Hartman
2011-03-16 21:11 ` [PATCH 25/50] drivers:misc: ti-st: firmware download optimization Greg Kroah-Hartman
2011-03-16 21:11 ` [PATCH 26/50] drivers:misc: ti-st: fix hci-ll on wake_ind collision Greg Kroah-Hartman
2011-03-16 21:11 ` [PATCH 27/50] drivers:misc: ti-st: remove multiple gpio handling Greg Kroah-Hartman
2011-03-16 21:11 ` [PATCH 28/50] kobject.h: fix build when CONFIG_HOTPLUG is disabled Greg Kroah-Hartman
2011-03-16 21:11 ` [PATCH 29/50] debugfs: Fix filesystem reference counting on debugfs_remove() failure Greg Kroah-Hartman
2011-03-16 21:11 ` [PATCH 30/50] Translat Documentation/SubmittingChecklist into Chinese Greg Kroah-Hartman
2011-03-16 21:11 ` [PATCH 31/50] Translate linux-2.6/Documentation/magic-number.txt " Greg Kroah-Hartman
2011-03-16 21:11 ` [PATCH 32/50] Driver core: convert platform_{get,set}_drvdata to static inline functions Greg Kroah-Hartman
2011-03-16 21:11 ` [PATCH 33/50] firmware: Add DMI entry types to the headers Greg Kroah-Hartman
2011-03-16 21:11 ` [PATCH 34/50] firmware: Basic dmi-sysfs support Greg Kroah-Hartman
2011-03-16 21:11 ` [PATCH 35/50] firmware: Break out system_event_log in dmi-sysfs Greg Kroah-Hartman
2011-03-16 21:11 ` Greg Kroah-Hartman [this message]
2011-03-16 21:11 ` [PATCH 37/50] firmware: Add documentation for /sys/firmware/dmi Greg Kroah-Hartman
2011-03-18 20:53 ` Valdis.Kletnieks
2011-03-18 23:50 ` [PATCH] firmware: Fix grammar in sysfs-firmware-dmi doc Mike Waychison
2011-03-16 21:11 ` [PATCH 38/50] firmware: Fix unaligned memory accesses in dmi-sysfs Greg Kroah-Hartman
2011-03-16 21:11 ` [PATCH 39/50] Fix spelling mistakes in Documentation/zh_CN/SubmittingPatches Greg Kroah-Hartman
2011-03-16 21:11 ` [PATCH 40/50] UIO: add PRUSS UIO driver support Greg Kroah-Hartman
2011-03-16 21:11 ` [PATCH 41/50] kref: Fix typo in kref documentation Greg Kroah-Hartman
2011-03-16 21:11 ` [PATCH 42/50] drivers:misc: ti-st: fix debugging code Greg Kroah-Hartman
2011-03-16 21:11 ` [PATCH 43/50] efivars: move efivars globals into struct efivars Greg Kroah-Hartman
2011-03-16 21:11 ` [PATCH 44/50] efivars: Make efivars bin_attributes dynamic Greg Kroah-Hartman
2011-03-16 21:11 ` [PATCH 45/50] efivars: parameterize efivars Greg Kroah-Hartman
2011-03-16 21:11 ` [PATCH 46/50] efivars: Split out variable registration Greg Kroah-Hartman
2011-03-16 21:11 ` [PATCH 47/50] efivars: Parameterize operations Greg Kroah-Hartman
2011-03-16 21:11 ` [PATCH 48/50] efivars: Expose efivars functionality to external drivers Greg Kroah-Hartman
2011-03-16 21:11 ` [PATCH 49/50] efivars: Add Documentation Greg Kroah-Hartman
2011-03-16 21:11 ` [PATCH 50/50] printk: do not mangle valid userspace syslog prefixes Greg Kroah-Hartman
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=1300309888-5028-36-git-send-email-gregkh@suse.de \
--to=gregkh@suse.de \
--cc=linux-kernel@vger.kernel.org \
--cc=mikew@google.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).