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 35/50] firmware: Break out system_event_log in dmi-sysfs
Date: Wed, 16 Mar 2011 14:11:13 -0700 [thread overview]
Message-ID: <1300309888-5028-35-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 optional type 15 entry of the DMI table describes a non-volatile
storage-backed system event log.
In preparation for the next commit which exposes the raw bits of the
event log to userland, create a new sub-directory within the dmi entry
called "system_event_log" and expose attribute files that describe the
event log itself.
Currently, only a single child object is permitted within a
dmi_sysfs_entry. We simply point at this child from the dmi_sysfs_entry
if it exists.
Signed-off-by: Mike Waychison <mikew@google.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/firmware/dmi-sysfs.c | 159 ++++++++++++++++++++++++++++++++++++++++++
1 files changed, 159 insertions(+), 0 deletions(-)
diff --git a/drivers/firmware/dmi-sysfs.c b/drivers/firmware/dmi-sysfs.c
index 2d8a04a..d209610 100644
--- a/drivers/firmware/dmi-sysfs.c
+++ b/drivers/firmware/dmi-sysfs.c
@@ -35,6 +35,7 @@ struct dmi_sysfs_entry {
int instance;
int position;
struct list_head list;
+ struct kobject *child;
};
/*
@@ -77,6 +78,10 @@ struct dmi_sysfs_mapped_attribute dmi_sysfs_attr_##_entry##_##_name = { \
/*************************************************
* Generic DMI entry support.
*************************************************/
+static void dmi_entry_free(struct kobject *kobj)
+{
+ kfree(kobj);
+}
static struct dmi_sysfs_entry *to_entry(struct kobject *kobj)
{
@@ -186,6 +191,146 @@ static size_t dmi_entry_length(const struct dmi_header *dh)
}
/*************************************************
+ * Support bits for specialized DMI entry support
+ *************************************************/
+struct dmi_entry_attr_show_data {
+ struct attribute *attr;
+ char *buf;
+};
+
+static ssize_t dmi_entry_attr_show_helper(struct dmi_sysfs_entry *entry,
+ const struct dmi_header *dh,
+ void *_data)
+{
+ struct dmi_entry_attr_show_data *data = _data;
+ struct dmi_sysfs_mapped_attribute *attr;
+
+ attr = container_of(data->attr,
+ struct dmi_sysfs_mapped_attribute, attr);
+ return attr->show(entry, dh, data->buf);
+}
+
+static ssize_t dmi_entry_attr_show(struct kobject *kobj,
+ struct attribute *attr,
+ char *buf)
+{
+ struct dmi_entry_attr_show_data data = {
+ .attr = attr,
+ .buf = buf,
+ };
+ /* Find the entry according to our parent and call the
+ * normalized show method hanging off of the attribute */
+ return find_dmi_entry(to_entry(kobj->parent),
+ dmi_entry_attr_show_helper, &data);
+}
+
+static const struct sysfs_ops dmi_sysfs_specialize_attr_ops = {
+ .show = dmi_entry_attr_show,
+};
+
+/*************************************************
+ * Specialized DMI entry support.
+ *************************************************/
+
+/*** Type 15 - System Event Table ***/
+
+#define DMI_SEL_ACCESS_METHOD_IO8 0x00
+#define DMI_SEL_ACCESS_METHOD_IO2x8 0x01
+#define DMI_SEL_ACCESS_METHOD_IO16 0x02
+#define DMI_SEL_ACCESS_METHOD_PHYS32 0x03
+#define DMI_SEL_ACCESS_METHOD_GPNV 0x04
+
+struct dmi_system_event_log {
+ struct dmi_header header;
+ u16 area_length;
+ u16 header_start_offset;
+ u16 data_start_offset;
+ u8 access_method;
+ u8 status;
+ u32 change_token;
+ union {
+ struct {
+ u16 index_addr;
+ u16 data_addr;
+ } io;
+ u32 phys_addr32;
+ u16 gpnv_handle;
+ u32 access_method_address;
+ };
+ u8 header_format;
+ u8 type_descriptors_supported_count;
+ u8 per_log_type_descriptor_length;
+ u8 supported_log_type_descriptos[0];
+} __packed;
+
+static const struct dmi_system_event_log *to_sel(const struct dmi_header *dh)
+{
+ return (const struct dmi_system_event_log *)dh;
+}
+
+#define DMI_SYSFS_SEL_FIELD(_field) \
+static ssize_t dmi_sysfs_sel_##_field(struct dmi_sysfs_entry *entry, \
+ const struct dmi_header *dh, \
+ char *buf) \
+{ \
+ const struct dmi_system_event_log *sel = to_sel(dh); \
+ if (sizeof(*sel) > dmi_entry_length(dh)) \
+ return -EIO; \
+ return sprintf(buf, "%u\n", sel->_field); \
+} \
+static DMI_SYSFS_MAPPED_ATTR(sel, _field)
+
+DMI_SYSFS_SEL_FIELD(area_length);
+DMI_SYSFS_SEL_FIELD(header_start_offset);
+DMI_SYSFS_SEL_FIELD(data_start_offset);
+DMI_SYSFS_SEL_FIELD(access_method);
+DMI_SYSFS_SEL_FIELD(status);
+DMI_SYSFS_SEL_FIELD(change_token);
+DMI_SYSFS_SEL_FIELD(access_method_address);
+DMI_SYSFS_SEL_FIELD(header_format);
+DMI_SYSFS_SEL_FIELD(type_descriptors_supported_count);
+DMI_SYSFS_SEL_FIELD(per_log_type_descriptor_length);
+
+static struct attribute *dmi_sysfs_sel_attrs[] = {
+ &dmi_sysfs_attr_sel_area_length.attr,
+ &dmi_sysfs_attr_sel_header_start_offset.attr,
+ &dmi_sysfs_attr_sel_data_start_offset.attr,
+ &dmi_sysfs_attr_sel_access_method.attr,
+ &dmi_sysfs_attr_sel_status.attr,
+ &dmi_sysfs_attr_sel_change_token.attr,
+ &dmi_sysfs_attr_sel_access_method_address.attr,
+ &dmi_sysfs_attr_sel_header_format.attr,
+ &dmi_sysfs_attr_sel_type_descriptors_supported_count.attr,
+ &dmi_sysfs_attr_sel_per_log_type_descriptor_length.attr,
+ NULL,
+};
+
+
+static struct kobj_type dmi_system_event_log_ktype = {
+ .release = dmi_entry_free,
+ .sysfs_ops = &dmi_sysfs_specialize_attr_ops,
+ .default_attrs = dmi_sysfs_sel_attrs,
+};
+
+static int dmi_system_event_log(struct dmi_sysfs_entry *entry)
+{
+ int ret;
+
+ entry->child = kzalloc(sizeof(*entry->child), GFP_KERNEL);
+ if (!entry->child)
+ return -ENOMEM;
+ ret = kobject_init_and_add(entry->child,
+ &dmi_system_event_log_ktype,
+ &entry->kobj,
+ "system_event_log");
+ if (ret)
+ goto out_free;
+out_free:
+ kfree(entry->child);
+ return ret;
+}
+
+/*************************************************
* Generic DMI entry support.
*************************************************/
@@ -325,6 +470,18 @@ static void __init dmi_sysfs_register_handle(const struct dmi_header *dh,
list_add_tail(&entry->list, &entry_list);
spin_unlock(&entry_list_lock);
+ /* Handle specializations by type */
+ switch (dh->type) {
+ case DMI_ENTRY_SYSTEM_EVENT_LOG:
+ *ret = dmi_system_event_log(entry);
+ break;
+ default:
+ /* No specialization */
+ break;
+ }
+ if (*ret)
+ goto out_err;
+
/* Create the raw binary file to access the entry */
*ret = sysfs_create_bin_file(&entry->kobj, &dmi_entry_raw_attr);
if (*ret)
@@ -332,6 +489,7 @@ static void __init dmi_sysfs_register_handle(const struct dmi_header *dh,
return;
out_err:
+ kobject_put(entry->child);
kobject_put(&entry->kobj);
return;
}
@@ -342,6 +500,7 @@ static void cleanup_entry_list(void)
/* No locks, we are on our way out */
list_for_each_entry_safe(entry, next, &entry_list, list) {
+ kobject_put(entry->child);
kobject_put(&entry->kobj);
}
}
--
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 ` Greg Kroah-Hartman [this message]
2011-03-16 21:11 ` [PATCH 36/50] firmware: Expose DMI type 15 System Event Log Greg Kroah-Hartman
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-35-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
Powered by JetHome