Re: [PATCH v4] ACPI: device_sysfs: Add sysfs support for _PLD

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Heikki,

Thank you for the review!

On Wed, Feb 2, 2022 at 12:19 AM Heikki Krogerus
<heikki.krogerus@xxxxxxxxxxxxxxx> wrote:
>
> Hi Won,
>
> On Tue, Feb 01, 2022 at 01:55:18AM +0000, Won Chung wrote:
> > When ACPI table includes _PLD fields for a device, create a new
> > directory (pld) in sysfs to share _PLD fields.
>
> I think you need to explain what needs this information in user space.
>
> > Signed-off-by: Won Chung <wonchung@xxxxxxxxxx>
> > ---
> >  Documentation/ABI/testing/sysfs-bus-acpi | 107 +++++++++++++++++++++++
> >  drivers/acpi/device_sysfs.c              |  55 ++++++++++++
> >  include/acpi/acpi_bus.h                  |   1 +
> >  3 files changed, 163 insertions(+)
> >
> > diff --git a/Documentation/ABI/testing/sysfs-bus-acpi b/Documentation/ABI/testing/sysfs-bus-acpi
> > index 58abacf59b2a..b8b71c8f3cfd 100644
> > --- a/Documentation/ABI/testing/sysfs-bus-acpi
> > +++ b/Documentation/ABI/testing/sysfs-bus-acpi
> > @@ -96,3 +96,110 @@ Description:
> >               hardware, if the _HRV control method is present.  It is mostly
> >               useful for non-PCI devices because lspci can list the hardware
> >               version for PCI devices.
> > +
> > +What:                /sys/bus/acpi/devices/.../pld/
> > +Date:                Feb, 2022
> > +Contact:     Won Chung <wonchung@xxxxxxxxxx>
> > +Description:
> > +             This directory contains the output of the device object's _PLD
> > +             control method, if present. This information provides details
> > +             on physical location of a device.
> > +
> > +What:                /sys/bus/acpi/devices/.../pld/revision
> > +Date:                Feb, 2022
> > +Contact:     Won Chung <wonchung@xxxxxxxxxx>
> > +Description:
> > +             The current revision is 0x2.
> > +
> > +What:           /sys/bus/acpi/devices/.../pld/group_token
> > +Date:           Feb, 2022
> > +Contact:        Won Chung <wonchung@xxxxxxxxxx>
> > +Description:
> > +             Unique numerical value identifying a group.
> > +
> > +What:           /sys/bus/acpi/devices/.../pld/group_position
> > +Date:           Feb, 2022
> > +Contact:        Won Chung <wonchung@xxxxxxxxxx>
> > +Description:
> > +             Identifies this device connection point’s position in the group.
> > +
> > +What:           /sys/bus/acpi/devices/.../pld/user_visible
> > +Date:           Feb, 2022
> > +Contact:        Won Chung <wonchung@xxxxxxxxxx>
> > +Description:
> > +             Set if the device connection point can be seen by the user
> > +             without disassembly.
> > +
> > +What:           /sys/bus/acpi/devices/.../pld/dock
> > +Date:           Feb, 2022
> > +Contact:        Won Chung <wonchung@xxxxxxxxxx>
> > +Description:
> > +             Set if the device connection point resides in a docking station
> > +             or port replicator.
> > +
> > +What:           /sys/bus/acpi/devices/.../pld/bay
> > +Date:           Feb, 2022
> > +Contact:        Won Chung <wonchung@xxxxxxxxxx>
> > +Description:
> > +             Set if describing a device in a bay or if device connection
> > +             point is a bay.
> > +
> > +What:           /sys/bus/acpi/devices/.../pld/lid
> > +Date:           Feb, 2022
> > +Contact:        Won Chung <wonchung@xxxxxxxxxx>
> > +Description:
> > +             Set if this device connection point resides on the lid of
> > +             laptop system.
> > +
> > +What:           /sys/bus/acpi/devices/.../pld/panel
> > +Date:           Feb, 2022
> > +Contact:        Won Chung <wonchung@xxxxxxxxxx>
> > +Description:
> > +             Describes which panel surface of the system’s housing the
> > +             device connection point resides on:
> > +             0 - Top
> > +             1 - Bottom
> > +             2 - Left
> > +             3 - Right
> > +             4 - Front
> > +             5 - Back
> > +             6 - Unknown (Vertical Position and Horizontal Position will be
> > +             ignored)
> > +
> > +What:           /sys/bus/acpi/devices/.../pld/vertical_position
> > +Date:           Feb, 2022
> > +Contact:        Won Chung <wonchung@xxxxxxxxxx>
> > +Description:
> > +             0 - Upper
> > +             1 - Center
> > +             2 - Lower
> > +
> > +What:           /sys/bus/acpi/devices/.../pld/horizontal_position
> > +Date:           Feb, 2022
> > +Contact:        Won Chung <wonchung@xxxxxxxxxx>
> > +Description:
> > +             ACPI specification does not define horizontal position field.
> > +             Can be used as either
> > +             0 - Left
> > +             1 - Center
> > +             2 - Right
> > +             or
> > +             0 - Leftmost
> > +             and higher numbers going toward the right.
> > +
> > +What:           /sys/bus/acpi/devices/.../pld/shape
> > +Date:           Feb, 2022
> > +Contact:        Won Chung <wonchung@xxxxxxxxxx>
> > +Description:
> > +             Describes the shape of the device connection point.
> > +             0 - Round
> > +             1 - Oval
> > +             2 - Square
> > +             3 - Vertical Rectangle
> > +             4 - Horizontal Rectangle
> > +             5 - Vertical Trapezoid
> > +             6 - Horizontal Trapezoid
> > +             7 - Unknown - Shape rendered as a Rectangle with dotted lines
> > +             8 - Chamfered
> > +             15:9 - Reserved
> > +
> > diff --git a/drivers/acpi/device_sysfs.c b/drivers/acpi/device_sysfs.c
> > index d5d6403ba07b..610be93635a0 100644
> > --- a/drivers/acpi/device_sysfs.c
> > +++ b/drivers/acpi/device_sysfs.c
> > @@ -509,6 +509,49 @@ static ssize_t status_show(struct device *dev, struct device_attribute *attr,
> >  }
> >  static DEVICE_ATTR_RO(status);
> >
> > +#define DEV_ATTR_PLD_PROP(prop) \
> > +     static ssize_t prop##_show(struct device *dev, struct device_attribute *attr, \
> > +             char *buf) \
> > +{ \
> > +     struct acpi_device *acpi_dev = to_acpi_device(dev); \
> > +     if (acpi_dev->pld == NULL) \
> > +             return -EIO; \
> > +     return sprintf(buf, "%u\n", acpi_dev->pld->prop); \
> > +}; \
>
> Ah, you are storing the _PLD below. Before there were concerns about
> the memory that the cached _PLD information would consume. Another way
> of doing this would be to just always evaluate the _PLD here.
>
> Rafael needs to comment on this. My personal opinion is that let's
> just store the thing.
>

By "always evaluate the _PLD here", you mean something like
  acpi_get_physical_device_location(dev->handle, &pld)
for every _PLD field, right?

I will wait for Rafael's comment on this.

> > +static DEVICE_ATTR_RO(prop)
> > +
> > +DEV_ATTR_PLD_PROP(revision);
> > +DEV_ATTR_PLD_PROP(group_token);
> > +DEV_ATTR_PLD_PROP(group_position);
> > +DEV_ATTR_PLD_PROP(user_visible);
> > +DEV_ATTR_PLD_PROP(dock);
> > +DEV_ATTR_PLD_PROP(bay);
> > +DEV_ATTR_PLD_PROP(lid);
> > +DEV_ATTR_PLD_PROP(panel);
> > +DEV_ATTR_PLD_PROP(vertical_position);
> > +DEV_ATTR_PLD_PROP(horizontal_position);
> > +DEV_ATTR_PLD_PROP(shape);
> > +
> > +static struct attribute *dev_attr_pld[] = {
> > +     &dev_attr_revision.attr,
> > +     &dev_attr_group_token.attr,
> > +     &dev_attr_group_position.attr,
> > +     &dev_attr_user_visible.attr,
> > +     &dev_attr_dock.attr,
> > +     &dev_attr_bay.attr,
> > +     &dev_attr_lid.attr,
> > +     &dev_attr_panel.attr,
> > +     &dev_attr_vertical_position.attr,
> > +     &dev_attr_horizontal_position.attr,
> > +     &dev_attr_shape.attr,
> > +     NULL,
> > +};
> > +
> > +static struct attribute_group dev_attr_pld_group = {
> > +     .name = "pld",
> > +     .attrs = dev_attr_pld,
> > +};
> > +
> >  /**
> >   * acpi_device_setup_files - Create sysfs attributes of an ACPI device.
> >   * @dev: ACPI device object.
> > @@ -595,6 +638,16 @@ int acpi_device_setup_files(struct acpi_device *dev)
> >                                                   &dev_attr_real_power_state);
> >       }
> >
> > +     if (acpi_has_method(dev->handle, "_PLD")) {
> > +             status = acpi_get_physical_device_location(dev->handle,
> > +                     &dev->pld);
> > +             if (ACPI_FAILURE(status))
> > +                     goto end;
> > +             result = device_add_group(&dev->dev, &dev_attr_pld_group);
> > +             if (result)
> > +                     goto end;
> > +     }
>
> You probable want to store the pld in acpi_store_pld_crc(). Perhaps
> also rename that function to just acpi_store_pld() at the same time.
>
> Here you just want to create the sysfs group.
>

Got it. I will send v5 with this change.

> >       acpi_expose_nondev_subnodes(&dev->dev.kobj, &dev->data);
> >
> >  end:
> > @@ -645,4 +698,6 @@ void acpi_device_remove_files(struct acpi_device *dev)
> >               device_remove_file(&dev->dev, &dev_attr_status);
> >       if (dev->handle)
> >               device_remove_file(&dev->dev, &dev_attr_path);
> > +     if (acpi_has_method(dev->handle, "_PLD"))
> > +             device_remove_group(&dev->dev, &dev_attr_pld_group);
> >  }
> > diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h
> > index ca88c4706f2b..929e726a666b 100644
> > --- a/include/acpi/acpi_bus.h
> > +++ b/include/acpi/acpi_bus.h
> > @@ -381,6 +381,7 @@ struct acpi_device {
> >       struct acpi_hotplug_context *hp;
> >       struct acpi_driver *driver;
> >       const struct acpi_gpio_mapping *driver_gpios;
> > +     struct acpi_pld_info *pld;
> >       void *driver_data;
> >       struct device dev;
> >       unsigned int physical_node_count;
> > --
>
> thanks,
>
> --
> heikki

Thank you,
Won




[Index of Archives]     [Linux IBM ACPI]     [Linux Power Management]     [Linux Kernel]     [Linux Laptop]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]     [Linux Resources]

  Powered by Linux