linux-pci.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: Bjorn Helgaas <helgaas@kernel.org>
Cc: Stuart Hayes <stuart.w.hayes@gmail.com>,
	Bjorn Helgaas <bhelgaas@google.com>,
	linux-pci@vger.kernel.org, Christoph Hellwig <hch@infradead.org>,
	Dan Carpenter <dan.carpenter@oracle.com>
Subject: Re: [PATCH v2] Expose PCIe SSD Status LED Management DSM in sysfs
Date: Sat, 14 Nov 2020 00:19:11 +0100	[thread overview]
Message-ID: <X68Ub0rSmUlrRXkm@kroah.com> (raw)
In-Reply-To: <20201113213842.GA1135242@bjorn-Precision-5520>

On Fri, Nov 13, 2020 at 03:38:42PM -0600, Bjorn Helgaas wrote:
> [+cc Christoph, Dan, Greg (for "one value per file" question below)]
> 
> On Tue, Nov 10, 2020 at 09:37:35AM -0600, Stuart Hayes wrote:
> > This patch will expose the PCIe SSD Status LED Management interface in
> > sysfs for devices that have the relevant _DSM method, per the "_DSM
> > additions for PCIe SSD Status LED Management" ECN to the PCI Firmware
> > Specification revision 3.2.
> > 
> > The interface is exposed in two sysfs files, ssdleds_supported_states (RO)
> > and ssdleds_current_state (RW).
> > 
> > Signed-off-by: Stuart Hayes <stuart.w.hayes@gmail.com>
> > ---
> > 
> > v2: made PCI_SSDLEDS dependent on PCI and ACPI
> >     remove unused variable
> >     warn if call to sysfs_create_group fails
> >     include header file with function prototypes
> >     change logical OR to bitwise
> > 
> > ---
> >  Documentation/ABI/testing/sysfs-bus-pci |  14 ++
> >  drivers/pci/Kconfig                     |   7 +
> >  drivers/pci/Makefile                    |   1 +
> >  drivers/pci/pci-ssdleds.c               | 194 ++++++++++++++++++++++++
> >  drivers/pci/pci-sysfs.c                 |   1 +
> >  drivers/pci/pci.h                       |  11 ++
> >  6 files changed, 228 insertions(+)
> >  create mode 100644 drivers/pci/pci-ssdleds.c
> > 
> > diff --git a/Documentation/ABI/testing/sysfs-bus-pci b/Documentation/ABI/testing/sysfs-bus-pci
> > index 77ad9ec3c801..18ca73b764ac 100644
> > --- a/Documentation/ABI/testing/sysfs-bus-pci
> > +++ b/Documentation/ABI/testing/sysfs-bus-pci
> > @@ -366,3 +366,17 @@ Contact:	Heiner Kallweit <hkallweit1@gmail.com>
> >  Description:	If ASPM is supported for an endpoint, these files can be
> >  		used to disable or enable the individual power management
> >  		states. Write y/1/on to enable, n/0/off to disable.
> > +
> > +What:		/sys/bus/pci/devices/.../ssdleds_supported_states
> > +Date:		October 2020
> > +Contact:	Stuart Hayes <stuart.w.hayes@gmail.com>
> > +Description:	If the device supports the ACPI _DSM method to control the
> > +		PCIe SSD LED states, ssdleds_supported_states (read only)
> > +		will show the LED states that are supported by the _DSM.
> > +
> > +What:		/sys/bus/pci/devices/.../ssdleds_current_state
> > +Date:		October 2020
> > +Contact:	Stuart Hayes <stuart.w.hayes@gmail.com>
> > +Description:	If the device supports the ACPI _DSM method to control the
> > +		PCIe SSD LED states, ssdleds_current_state will show or set
> > +		the current LED states that are active.
> > diff --git a/drivers/pci/Kconfig b/drivers/pci/Kconfig
> > index 0c473d75e625..48049866145f 100644
> > --- a/drivers/pci/Kconfig
> > +++ b/drivers/pci/Kconfig
> > @@ -182,6 +182,13 @@ config PCI_LABEL
> >  	def_bool y if (DMI || ACPI)
> >  	select NLS
> >  
> > +config PCI_SSDLEDS
> > +	def_bool y if (ACPI && PCI)

That only should be set if the machine can not boot without it.

For a blinky light, that's not the case.

And why isn't this code using the existing LED subsystem?  Don't create
random new driver-specific sysfs files that do things the existing class
drivers do please.


> > +static int ssdleds_dsm_get(struct device *dev, char *buf, u64 dsm_func)
> > +{
> > +	acpi_handle handle;
> > +	union acpi_object *out_obj;
> > +	struct pci_ssdleds_dsm_output *dsm_output;
> > +
> > +	handle = ACPI_HANDLE(dev);
> > +	if (!handle)
> > +		return -ENODEV;
> > +
> > +	out_obj = acpi_evaluate_dsm_typed(handle, &pci_ssdleds_dsm_guid, 0x1,
> > +				      dsm_func, NULL, ACPI_TYPE_BUFFER);
> > +	if (!out_obj)
> > +		return -EIO;
> > +
> > +	if (out_obj->buffer.length < 8) {
> > +		ACPI_FREE(out_obj);
> > +		return -EIO;
> > +	}
> > +
> > +	dsm_output = (struct pci_ssdleds_dsm_output *)out_obj->buffer.pointer;
> > +	if (dsm_output->status != 0) {
> > +		ACPI_FREE(out_obj);
> > +		return -EIO;
> > +	}
> > +
> > +	scnprintf(buf, PAGE_SIZE, "%#x\n", dsm_output->state);
> 
> Similarly, I would consider returning dsm_output->state and moving the
> scnprintf() so the sysfs-specific stuff is in the caller.
> 
> It looks like you just expose the hex value that encodes things like:
> 
>   OK
>   Locate
>   Fail
>   Rebuild
>   ...
> 
> The hex value is sort of a pain to interpret, especially since the PCI
> specs are not public.  Maybe consider decoding it?  If you did decode
> it, that might be a way to reduce this to a single file instead of
> having both "supported_states" and "current_state" -- the single file
> could list all the supported states, with the current states
> highlighted somehow.
> 
> Not sure if that would run afoul of the sysfs "one value per file"
> rule.  CC'd Greg in case he wants to chime in.

That's a valid way of displaying options for a sysfs file that can
be specific unique values.


> > +static struct device_attribute ssdleds_attr_current = {
> > +	.attr = {.name = "ssdleds_current_state", .mode = 0644},
> > +	.show = ssdleds_current_show,
> > +	.store = ssdleds_current_store,
> > +};
> 
> Can these use DEVICE_ATTR_RW() and friends?

They should, never open-code something like this.

> 
> > +static struct device_attribute ssdleds_attr_supported = {
> > +	.attr = {.name = "ssdleds_supported_states", .mode = 0444},
> > +	.show = ssdleds_supported_show,
> > +};

DEVICE_ATTR_RO();

> > +
> > +static struct attribute *ssdleds_attributes[] = {
> > +	&ssdleds_attr_current.attr,
> > +	&ssdleds_attr_supported.attr,
> > +	NULL,
> > +};
> > +
> > +static const struct attribute_group ssdleds_attr_group = {
> > +	.attrs = ssdleds_attributes,
> > +	.is_visible = ssdleds_attr_visible,
> > +};

ATTRIBUTE_GROUPS()?

> > +void pci_create_ssdleds_files(struct pci_dev *pdev)
> > +{
> > +	if (sysfs_create_group(&pdev->dev.kobj, &ssdleds_attr_group))
> > +		pci_warn(pdev, "Unable to create ssdleds attributes\n");

You just raced userspace and lost.  Just add this to the default groups
for the device and the core will handle it all for you automatically.

Hint, when you find yourself calling a sysfs_*() call from driver code,
that's a huge flag that you are doing something wrong.

> > +void pci_remove_ssdleds_files(struct pci_dev *pdev)
> > +{
> > +	sysfs_remove_group(&pdev->dev.kobj, &ssdleds_attr_group);
> > +}
> 
> I'm not a real sysfs expert, but I *think* that if you follow the
> pattern in pci_dev_attr_groups[] in pci-sysfs.c, you won't need these
> create/remove functions.

Yes, that is true.

thanks,

greg k-h

  reply	other threads:[~2020-11-13 23:18 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-11-10 15:37 [PATCH v2] Expose PCIe SSD Status LED Management DSM in sysfs Stuart Hayes
2020-11-11  7:05 ` Christoph Hellwig
2020-11-12  4:48   ` Stuart Hayes
2020-11-13 14:14 ` Dan Carpenter
2020-11-13 21:38 ` Bjorn Helgaas
2020-11-13 23:19   ` Greg Kroah-Hartman [this message]
2020-11-16 22:25     ` Stuart Hayes
2020-11-17  7:07       ` Greg Kroah-Hartman
2020-11-15  6:38 ` Krzysztof Wilczyński

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=X68Ub0rSmUlrRXkm@kroah.com \
    --to=gregkh@linuxfoundation.org \
    --cc=bhelgaas@google.com \
    --cc=dan.carpenter@oracle.com \
    --cc=hch@infradead.org \
    --cc=helgaas@kernel.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=stuart.w.hayes@gmail.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).