From: <Mario.Limonciello@dell.com>
To: <pali.rohar@gmail.com>, <greg@kroah.com>, <gnomes@lxorguk.ukuu.org.uk>
Cc: <dvhart@infradead.org>, <andy.shevchenko@gmail.com>,
<linux-kernel@vger.kernel.org>,
<platform-driver-x86@vger.kernel.org>, <luto@kernel.org>,
<quasisec@google.com>, <rjw@rjwysocki.net>, <mjg59@google.com>,
<hch@lst.de>
Subject: RE: [PATCH v9 17/17] tools/wmi: add a sample for dell smbios communication over WMI
Date: Wed, 18 Oct 2017 22:27:34 +0000 [thread overview]
Message-ID: <53c8c8aa295046d3a10b2bc8aeb6b610@ausx13mpc124.AMER.DELL.COM> (raw)
In-Reply-To: <e225d842e0274a1897c63089444a0814@ausx13mpc120.AMER.DELL.COM>
> -----Original Message-----
> From: Limonciello, Mario
> Sent: Wednesday, October 18, 2017 8:56 AM
> To: 'Pali Rohár' <pali.rohar@gmail.com>; Greg KH <greg@kroah.com>; Alan Cox
> <gnomes@lxorguk.ukuu.org.uk>
> Cc: dvhart@infradead.org; Andy Shevchenko <andy.shevchenko@gmail.com>;
> LKML <linux-kernel@vger.kernel.org>; platform-driver-x86@vger.kernel.org; Andy
> Lutomirski <luto@kernel.org>; quasisec@google.com; rjw@rjwysocki.net;
> mjg59@google.com; hch@lst.de
> Subject: RE: [PATCH v9 17/17] tools/wmi: add a sample for dell smbios
> communication over WMI
>
> > -----Original Message-----
> > From: Pali Rohár [mailto:pali.rohar@gmail.com]
> > Sent: Wednesday, October 18, 2017 2:29 AM
> > To: Greg KH <greg@kroah.com>; Alan Cox <gnomes@lxorguk.ukuu.org.uk>
> > Cc: dvhart@infradead.org; Andy Shevchenko <andy.shevchenko@gmail.com>;
> > LKML <linux-kernel@vger.kernel.org>; platform-driver-x86@vger.kernel.org;
> Andy
> > Lutomirski <luto@kernel.org>; quasisec@google.com; rjw@rjwysocki.net;
> > mjg59@google.com; hch@lst.de; Limonciello, Mario
> > <Mario_Limonciello@Dell.com>
> > Subject: Re: [PATCH v9 17/17] tools/wmi: add a sample for dell smbios
> > communication over WMI
> >
> > On Tuesday 17 October 2017 13:22:01 Mario Limonciello wrote:
> > > diff --git a/tools/wmi/dell-smbios-example.c b/tools/wmi/dell-smbios-
> example.c
> > > new file mode 100644
> > > index 000000000000..69c4dd9c6056
> > > --- /dev/null
> > > +++ b/tools/wmi/dell-smbios-example.c
> > > @@ -0,0 +1,214 @@
> > > +/*
> > > + * Sample application for SMBIOS communication over WMI interface
> > > + * Performs the following:
> > > + * - Simple class/select lookup for TPM information
> > > + * - Simple query of known tokens and their values
> > > + * - Simple activation of a token
> > > + *
> > > + * Copyright (C) 2017 Dell, Inc.
> > > + *
> > > + * This program is free software; you can redistribute it and/or modify
> > > + * it under the terms of the GNU General Public License version 2 as
> > > + * published by the Free Software Foundation.
> > > + */
> > > +
> > > +#include <errno.h>
> > > +#include <fcntl.h>
> > > +#include <stdio.h>
> > > +#include <stdlib.h>
> > > +#include <sys/ioctl.h>
> > > +#include <unistd.h>
> > > +
> > > +/* if uapi header isn't installed, this might not yet exist */
> > > +#ifndef __packed
> > > +#define __packed __attribute__((packed))
> > > +#endif
> > > +#include <linux/wmi.h>
> > > +
> > > +/* It would be better to discover these using udev, but for a simple
> > > + * application they're hardcoded
> > > + */
> > > +static const char *ioctl_devfs = "/dev/wmi/dell-smbios";
> > > +static const char *token_sysfs =
> > > + "/sys/bus/platform/devices/dell-smbios.0/tokens";
> > > +static const char *buffer_sysfs =
> > > + "/sys/bus/wmi/devices/A80593CE-A997-11DA-B012-
> > B622A1EF5492/required_buffer_size";
> >
> > Greg, Alan, could userspace expects those paths to be part of kernel
> > <--> userspace ABI? Looking e.g. at "dell-smbios.0" name and I'm not
> > sure if this is something which is going to be stable between kernel
> > versions and forever as part of ABI.
>
> In my sample application to be distributed with the kernel these are
> hardcoded paths, but if more dependencies were used, I would
> expect all 3 of these paths to be discovered using udev.
> I do include a comment for that point specifically.
>
> >
> > Also if everything is part of smbios API, would not it better to provide
> > everything via IOCTL over /dev/wmi/dell-smbios? I think this code is too
> > complicated, just because for correct IOCTL buffer size it needs to read
> > other properties via sysfs, etc... For me it looks like that it is not a
> > good API for userspace developers.
> >
> > --
>
> This does give me an idea, how about a read on the character device
> will return required buffer size instead of needing to find a sysfs
> attribute? This seems more intuitive to me.
So as to not send the whole series again only to get this idea shot down,
this is what it looks like (minus documentation updates).
Thoughts?
diff --git a/drivers/platform/x86/wmi.c b/drivers/platform/x86/wmi.c
index c7de80f96183..922a87d7cf34 100644
--- a/drivers/platform/x86/wmi.c
+++ b/drivers/platform/x86/wmi.c
@@ -799,23 +799,12 @@ static int wmi_dev_match(struct device *dev, struct device_driver *driver)
return 0;
}
-
-static long match_ioctl(struct file *filp, unsigned int cmd, unsigned long arg,
- int compat)
+static int wmi_char_open(struct inode *inode, struct file *filp)
{
- struct wmi_ioctl_buffer __user *input =
- (struct wmi_ioctl_buffer __user *) arg;
+ const char *driver_name = filp->f_path.dentry->d_iname;
struct wmi_driver *wdriver = NULL;
struct wmi_block *wblock = NULL;
struct wmi_block *next = NULL;
- const char *driver_name;
- u64 size;
- int ret;
-
- if (_IOC_TYPE(cmd) != WMI_IOC)
- return -ENOTTY;
-
- driver_name = filp->f_path.dentry->d_iname;
list_for_each_entry_safe(wblock, next, &wmi_block_list, list) {
wdriver = container_of(wblock->dev.dev.driver,
@@ -826,6 +815,52 @@ static long match_ioctl(struct file *filp, unsigned int cmd, unsigned long arg,
break;
}
+ if (!wdriver)
+ return -ENODEV;
+
+ filp->private_data = wblock;
+ nonseekable_open(inode, filp);
+ return 0;
+}
+
+static int wmi_char_release(struct inode *inode, struct file *filp)
+{
+ return 0;
+}
+
+static ssize_t wmi_char_read(struct file *filp, char __user *buffer,
+ size_t length, loff_t *offset)
+{
+ struct wmi_block *wblock = filp->private_data;
+ size_t count;
+
+ if (*offset != 0)
+ return 0;
+
+ count = sizeof(wblock->req_buf_size);
+ if (copy_to_user(buffer, &wblock->req_buf_size, count))
+ return -EFAULT;
+
+ *offset = count;
+ return count;
+}
+
+static long match_ioctl(struct file *filp, unsigned int cmd, unsigned long arg,
+ int compat)
+{
+ struct wmi_ioctl_buffer __user *input =
+ (struct wmi_ioctl_buffer __user *) arg;
+ struct wmi_block *wblock = filp->private_data;
+ struct wmi_driver *wdriver = NULL;
+ u64 size;
+ int ret;
+
+ if (_IOC_TYPE(cmd) != WMI_IOC)
+ return -ENOTTY;
+
+ wdriver = container_of(wblock->dev.dev.driver,
+ struct wmi_driver, driver);
+
if (!wdriver)
return -ENODEV;
@@ -886,6 +921,9 @@ static long wmi_compat_ioctl(struct file *filp, unsigned int cmd,
static const struct file_operations wmi_fops = {
.owner = THIS_MODULE,
+ .read = wmi_char_read,
+ .open = wmi_char_open,
+ .release = wmi_char_release,
.unlocked_ioctl = wmi_unlocked_ioctl,
#ifdef CONFIG_COMPAT
.compat_ioctl = wmi_compat_ioctl,
diff --git a/tools/wmi/dell-smbios-example.c b/tools/wmi/dell-smbios-example.c
index 69c4dd9c6056..a5f97647c9c5 100644
--- a/tools/wmi/dell-smbios-example.c
+++ b/tools/wmi/dell-smbios-example.c
@@ -31,8 +31,6 @@
static const char *ioctl_devfs = "/dev/wmi/dell-smbios";
static const char *token_sysfs =
"/sys/bus/platform/devices/dell-smbios.0/tokens";
-static const char *buffer_sysfs =
- "/sys/bus/wmi/devices/A80593CE-A997-11DA-B012-B622A1EF5492/required_buffer_size";
static void show_buffer(struct dell_wmi_smbios_buffer *buffer)
{
@@ -147,15 +145,13 @@ static int activate_token(struct dell_wmi_smbios_buffer *buffer,
static int query_buffer_size(__u64 *buffer_size)
{
- char buf[4096];
FILE *f;
- f = fopen(buffer_sysfs, "rb");
+ f = fopen(ioctl_devfs, "rb");
if (!f)
return -EINVAL;
- fread(buf, 1, 4096, f);
+ fread(buffer_size, sizeof(__u64), 1, f);
fclose(f);
- *buffer_size = strtol(buf, NULL, 10);
return EXIT_SUCCESS;
}
>
> Token information is provided over sysfs for multiple reasons.
> 1) It's applicable to all dispatchers. Even if the WMI dispatcher wasn't
> used it's useful for userspace to query through. For example the SMI call
> to get tokens in libsmbios can be simplified to just read sysfs files.
>
> 2) it's information not coming from ACPI-WMI. This series is setting
> precedent for how to interact with ACPI-WMI methods in userspace.
> putting in random data on the IOCTL that is not used in the ACPI-WMI
> method or provided by the WMI bus doesn't fit.
>
> 3) It is static information that won't change until you reboot.
next prev parent reply other threads:[~2017-10-18 22:27 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-10-17 18:21 [PATCH v9 00/17] Introduce support for Dell SMBIOS " Mario Limonciello
2017-10-17 18:21 ` [PATCH v9 01/17] platform/x86: wmi: Add new method wmidev_evaluate_method Mario Limonciello
2017-10-17 18:41 ` Pali Rohár
2017-10-17 18:21 ` [PATCH v9 02/17] platform/x86: dell-wmi: increase severity of some failures Mario Limonciello
2017-10-17 18:42 ` Pali Rohár
2017-10-17 18:21 ` [PATCH v9 03/17] platform/x86: dell-wmi: clean up wmi descriptor check Mario Limonciello
2017-10-17 18:44 ` Pali Rohár
2017-10-17 19:31 ` Mario.Limonciello
2017-10-17 18:21 ` [PATCH v9 04/17] platform/x86: dell-wmi: allow 32k return size in the descriptor Mario Limonciello
2017-10-17 18:46 ` Pali Rohár
2017-10-17 18:56 ` Mario.Limonciello
2017-10-17 18:21 ` [PATCH v9 05/17] platform/x86: dell-wmi-descriptor: split WMI descriptor into it's own driver Mario Limonciello
2017-10-17 18:59 ` Pali Rohár
2017-10-17 20:22 ` Mario.Limonciello
2017-10-17 18:21 ` [PATCH v9 06/17] platform/x86: wmi: Don't allow drivers to get each other's GUIDs Mario Limonciello
2017-10-17 19:00 ` Pali Rohár
2017-10-17 18:21 ` [PATCH v9 07/17] platform/x86: dell-smbios: only run if proper oem string is detected Mario Limonciello
2017-10-17 19:03 ` Pali Rohár
2017-10-17 19:10 ` Mario.Limonciello
2017-10-17 19:19 ` Mario.Limonciello
2017-10-17 19:25 ` Pali Rohár
2017-10-17 19:29 ` Mario.Limonciello
2017-10-17 18:21 ` [PATCH v9 08/17] platform/x86: dell-smbios: Add a sysfs interface for SMBIOS tokens Mario Limonciello
2017-10-17 18:21 ` [PATCH v9 09/17] platform/x86: dell-smbios: Introduce dispatcher for SMM calls Mario Limonciello
2017-10-17 18:21 ` [PATCH v9 10/17] platform/x86: dell-smbios-wmi: Add new WMI dispatcher driver Mario Limonciello
2017-10-17 19:10 ` Pali Rohár
2017-10-17 18:21 ` [PATCH v9 11/17] platform/x86: dell-smbios-smm: test for WSMT Mario Limonciello
2017-10-17 19:22 ` Pali Rohár
2017-10-18 19:09 ` Darren Hart
2017-10-18 19:10 ` Mario.Limonciello
2017-10-17 18:21 ` [PATCH v9 12/17] platform/x86: dell-smbios: Add filtering support Mario Limonciello
2017-10-17 18:21 ` [PATCH v9 13/17] platform/x86: wmi: Add sysfs attribute for required_buffer_size Mario Limonciello
2017-10-17 18:21 ` [PATCH v9 14/17] platform/x86: wmi: create userspace interface for drivers Mario Limonciello
2017-10-17 18:21 ` [PATCH v9 15/17] platform/x86: dell-smbios-wmi: introduce userspace interface Mario Limonciello
2017-10-17 18:22 ` [PATCH v9 16/17] platform/x86: shuffle headers to export for userspace Mario Limonciello
2017-10-17 18:22 ` [PATCH v9 17/17] tools/wmi: add a sample for dell smbios communication over WMI Mario Limonciello
2017-10-18 2:33 ` Edward O'Callaghan
2017-10-18 7:29 ` Pali Rohár
2017-10-18 13:55 ` Mario.Limonciello
2017-10-18 22:27 ` Mario.Limonciello [this message]
2017-10-19 3:12 ` Edward O'Callaghan
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=53c8c8aa295046d3a10b2bc8aeb6b610@ausx13mpc124.AMER.DELL.COM \
--to=mario.limonciello@dell.com \
--cc=andy.shevchenko@gmail.com \
--cc=dvhart@infradead.org \
--cc=gnomes@lxorguk.ukuu.org.uk \
--cc=greg@kroah.com \
--cc=hch@lst.de \
--cc=linux-kernel@vger.kernel.org \
--cc=luto@kernel.org \
--cc=mjg59@google.com \
--cc=pali.rohar@gmail.com \
--cc=platform-driver-x86@vger.kernel.org \
--cc=quasisec@google.com \
--cc=rjw@rjwysocki.net \
/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
all inboxes | Powered by JetHome®