From: Armin Wolf <W_Armin@gmx.de>
To: "Mario Limonciello" <mario.limonciello@amd.com>,
"Hans de Goede" <hdegoede@redhat.com>,
"Ilpo Järvinen" <ilpo.jarvinen@linux.intel.com>
Cc: "Rafael J . Wysocki" <rafael@kernel.org>,
"Len Brown" <lenb@kernel.org>,
"Maximilian Luz" <luzmaximilian@gmail.com>,
"Lee Chun-Yi" <jlee@suse.com>,
"Shyam Sundar S K" <Shyam-sundar.S-k@amd.com>,
"Corentin Chary" <corentin.chary@gmail.com>,
"Luke D . Jones" <luke@ljones.dev>,
"Ike Panhc" <ike.pan@canonical.com>,
"Henrique de Moraes Holschuh" <hmh@hmh.eng.br>,
"Alexis Belmonte" <alexbelm48@gmail.com>,
"Uwe Kleine-König" <u.kleine-koenig@pengutronix.de>,
"Ai Chao" <aichao@kylinos.cn>, "Gergo Koteles" <soyer@irl.hu>,
"open list" <linux-kernel@vger.kernel.org>,
"open list:ACPI" <linux-acpi@vger.kernel.org>,
"open list:MICROSOFT SURFACE PLATFORM PROFILE DRIVER"
<platform-driver-x86@vger.kernel.org>,
"open list:THINKPAD ACPI EXTRAS DRIVER"
<ibm-acpi-devel@lists.sourceforge.net>,
"Mark Pearson" <mpearson-lenovo@squebb.ca>,
"Matthew Schwartz" <matthew.schwartz@linux.dev>
Subject: Re: [PATCH v4 12/20] ACPI: platform_profile: Add profile attribute for class interface
Date: Wed, 6 Nov 2024 05:10:31 +0100 [thread overview]
Message-ID: <dad36f32-5970-48c2-9ee1-78163958bf02@gmx.de> (raw)
In-Reply-To: <20241105153316.378-13-mario.limonciello@amd.com>
Am 05.11.24 um 16:33 schrieb Mario Limonciello:
> Reading and writing the `profile` sysfs file will use the callbacks for
> the platform profile handler to read or set the given profile.
>
> Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
> ---
> drivers/acpi/platform_profile.c | 118 ++++++++++++++++++++++++++++++++
> 1 file changed, 118 insertions(+)
>
> diff --git a/drivers/acpi/platform_profile.c b/drivers/acpi/platform_profile.c
> index e1b6569c4ee70..79083d0bb22e3 100644
> --- a/drivers/acpi/platform_profile.c
> +++ b/drivers/acpi/platform_profile.c
> @@ -65,6 +65,78 @@ static int _get_class_choices(struct device *dev, unsigned long *choices)
> return 0;
> }
>
> +/**
> + * _store_class_profile - Set the profile for a class device
> + * @dev: The class device
> + * @data: The profile to set
> + */
> +static int _store_class_profile(struct device *dev, void *data)
> +{
> + enum platform_profile_option profile;
> + unsigned long choices;
> + int *i = (int *)data;
> + int err;
> +
> + err = _get_class_choices(dev, &choices);
> + if (err)
> + return err;
> +
> + scoped_cond_guard(mutex_intr, return -ERESTARTSYS, &profile_lock) {
> + struct platform_profile_handler *handler;
> +
> + if (!test_bit(*i, &choices))
> + return -EOPNOTSUPP;
> +
> + handler = dev_get_drvdata(dev);
> + err = handler->profile_get(handler, &profile);
> + if (err)
> + return err;
> +
> + err = handler->profile_set(handler, *i);
> + if (err) {
> + int recover_err;
> +
> + dev_err(dev, "Failed to set profile: %d\n", err);
> + recover_err = handler->profile_set(handler, profile);
> + if (recover_err)
> + dev_err(dev, "Failed to reset profile: %d\n", recover_err);
> + }
The whole recovery handling seems unnecessary to me. In setting the platform profile fails, then
we should just return an error. The platform profile handler will tell us the current platform
profile anyway.
> + sysfs_notify(&handler->class_dev->kobj, NULL, "platform_profile");
> + kobject_uevent(&handler->class_dev->kobj, KOBJ_CHANGE);
Please avoid sending those events when the platform profile is changed through the class sysfs interface.
> + }
> +
> + sysfs_notify(acpi_kobj, NULL, "platform_profile");
Please avoid sending this event when the platform profile is changed through the legacy sysfs interface.
> + return err ? err : 0;
> +}
> +
> +/**
> + * get_class_profile - Show the current profile for a class device
> + * @dev: The class device
> + * @profile: The profile to return
> + * Return: 0 on success, -errno on failure
> + */
> +static int get_class_profile(struct device *dev,
> + enum platform_profile_option *profile)
> +{
> + struct platform_profile_handler *handler;
> + enum platform_profile_option val;
> + int err;
> +
> + scoped_cond_guard(mutex_intr, return -ERESTARTSYS, &profile_lock) {
> + handler = dev_get_drvdata(dev);
> + err = handler->profile_get(handler, &val);
> + if (err) {
> + pr_err("Failed to get profile for handler %s\n", handler->name);
> + return err;
> + }
> + }
> +
> + if (WARN_ON(val >= PLATFORM_PROFILE_LAST))
> + return -EINVAL;
> + *profile = val;
> +
> + return 0;
> +}
>
> /**
> * name_show - Show the name of the profile handler
> @@ -102,12 +174,58 @@ static ssize_t choices_show(struct device *dev,
> return _commmon_choices_show(choices, buf);
> }
>
> +/**
> + * profile_show - Show the current profile for a class device
> + * @dev: The device
> + * @attr: The attribute
> + * @buf: The buffer to write to
> + * Return: The number of bytes written
> + */
> +static ssize_t profile_show(struct device *dev,
> + struct device_attribute *attr,
> + char *buf)
> +{
> + enum platform_profile_option profile = PLATFORM_PROFILE_LAST;
> + int err;
> +
> + err = get_class_profile(dev, &profile);
> + if (err)
> + return err;
> +
> + return sysfs_emit(buf, "%s\n", profile_names[profile]);
> +}
> +
> +/**
> + * profile_store - Set the profile for a class device
> + * @dev: The device
> + * @attr: The attribute
> + * @buf: The buffer to read from
> + * @count: The number of bytes to read
> + * Return: The number of bytes read
> + */
> +static ssize_t profile_store(struct device *dev,
> + struct device_attribute *attr,
> + const char *buf, size_t count)
> +{
> + int i, ret;
> +
> + i = sysfs_match_string(profile_names, buf);
> + if (i < 0)
> + return -EINVAL;
> +
> + ret = _store_class_profile(dev, (void *)(long)&i);
Please just pass &i.
Thanks,
Armin Wolf
> +
> + return ret ? ret : count;
> +}
>
> static DEVICE_ATTR_RO(name);
> static DEVICE_ATTR_RO(choices);
> +static DEVICE_ATTR_RW(profile);
> +
> static struct attribute *profile_attrs[] = {
> &dev_attr_name.attr,
> &dev_attr_choices.attr,
> + &dev_attr_profile.attr,
> NULL
> };
> ATTRIBUTE_GROUPS(profile);
next prev parent reply other threads:[~2024-11-06 4:11 UTC|newest]
Thread overview: 55+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-11-05 15:32 [PATCH v4 00/20] Add support for binding ACPI platform profile to multiple drivers Mario Limonciello
2024-11-05 15:32 ` [PATCH v4 01/20] ACPI: platform-profile: Add a name member to handlers Mario Limonciello
2024-11-06 3:27 ` Armin Wolf
2024-11-05 15:32 ` [PATCH v4 02/20] platform/x86/dell: dell-pc: Create platform device Mario Limonciello
2024-11-06 19:37 ` Armin Wolf
2024-11-05 15:32 ` [PATCH v4 03/20] ACPI: platform_profile: Add device pointer into platform profile handler Mario Limonciello
2024-11-06 3:32 ` Armin Wolf
2024-11-05 15:33 ` [PATCH v4 04/20] ACPI: platform_profile: Add platform handler argument to platform_profile_remove() Mario Limonciello
2024-11-06 3:34 ` Armin Wolf
2024-11-05 15:33 ` [PATCH v4 05/20] ACPI: platform_profile: Move sanity check out of the mutex Mario Limonciello
2024-11-06 3:35 ` Armin Wolf
2024-11-05 15:33 ` [PATCH v4 06/20] ACPI: platform_profile: Move matching string for new profile out of mutex Mario Limonciello
2024-11-05 15:38 ` Ilpo Järvinen
2024-11-06 3:36 ` Armin Wolf
2024-11-05 15:33 ` [PATCH v4 07/20] ACPI: platform_profile: Use guard(mutex) for register/unregister Mario Limonciello
2024-11-06 3:37 ` Armin Wolf
2024-11-05 15:33 ` [PATCH v4 08/20] ACPI: platform_profile: Use `scoped_cond_guard` Mario Limonciello
2024-11-05 15:54 ` Ilpo Järvinen
2024-11-05 15:33 ` [PATCH v4 09/20] ACPI: platform_profile: Create class for ACPI platform profile Mario Limonciello
2024-11-06 3:53 ` Armin Wolf
2024-11-05 15:33 ` [PATCH v4 10/20] ACPI: platform_profile: Add name attribute to class interface Mario Limonciello
2024-11-06 3:56 ` Armin Wolf
2024-11-05 15:33 ` [PATCH v4 11/20] ACPI: platform_profile: Add choices attribute for " Mario Limonciello
2024-11-06 1:09 ` kernel test robot
2024-11-06 4:00 ` Armin Wolf
2024-11-05 15:33 ` [PATCH v4 12/20] ACPI: platform_profile: Add profile " Mario Limonciello
2024-11-06 4:10 ` Armin Wolf [this message]
2024-11-06 5:46 ` Mario Limonciello
2024-11-06 19:15 ` Armin Wolf
2024-11-05 15:33 ` [PATCH v4 13/20] ACPI: platform_profile: Notify change events on register and unregister Mario Limonciello
2024-11-06 19:40 ` Armin Wolf
2024-11-06 19:44 ` Mario Limonciello
2024-11-06 20:58 ` Armin Wolf
2024-11-05 15:33 ` [PATCH v4 14/20] ACPI: platform_profile: Only show profiles common for all handlers Mario Limonciello
2024-11-06 19:41 ` Armin Wolf
2024-11-06 19:44 ` Mario Limonciello
2024-11-05 15:33 ` [PATCH v4 15/20] ACPI: platform_profile: Add concept of a "custom" profile Mario Limonciello
2024-11-06 19:17 ` Armin Wolf
2024-11-05 15:33 ` [PATCH v4 16/20] ACPI: platform_profile: Make sure all profile handlers agree on profile Mario Limonciello
2024-11-06 20:58 ` Armin Wolf
2024-11-06 21:25 ` Mario Limonciello
2024-11-06 21:31 ` Armin Wolf
2024-11-05 15:33 ` [PATCH v4 17/20] ACPI: platform_profile: Check all profile handler to calculate next Mario Limonciello
2024-11-06 20:55 ` Armin Wolf
2024-11-05 15:33 ` [PATCH v4 18/20] ACPI: platform_profile: Allow multiple handlers Mario Limonciello
2024-11-06 19:21 ` Armin Wolf
2024-11-06 19:33 ` Armin Wolf
2024-11-06 19:34 ` Mario Limonciello
2024-11-05 15:33 ` [PATCH v4 19/20] platform/x86/amd: pmf: Drop all quirks Mario Limonciello
2024-11-06 19:30 ` Armin Wolf
2024-11-05 15:33 ` [PATCH v4 20/20] Documentation: Add documentation about class interface for platform profiles Mario Limonciello
2024-11-05 22:49 ` Mark Pearson
2024-11-05 22:47 ` [PATCH v4 00/20] Add support for binding ACPI platform profile to multiple drivers Mark Pearson
2024-11-06 1:11 ` Mario Limonciello
2024-11-06 21:04 ` Armin Wolf
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=dad36f32-5970-48c2-9ee1-78163958bf02@gmx.de \
--to=w_armin@gmx.de \
--cc=Shyam-sundar.S-k@amd.com \
--cc=aichao@kylinos.cn \
--cc=alexbelm48@gmail.com \
--cc=corentin.chary@gmail.com \
--cc=hdegoede@redhat.com \
--cc=hmh@hmh.eng.br \
--cc=ibm-acpi-devel@lists.sourceforge.net \
--cc=ike.pan@canonical.com \
--cc=ilpo.jarvinen@linux.intel.com \
--cc=jlee@suse.com \
--cc=lenb@kernel.org \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=luke@ljones.dev \
--cc=luzmaximilian@gmail.com \
--cc=mario.limonciello@amd.com \
--cc=matthew.schwartz@linux.dev \
--cc=mpearson-lenovo@squebb.ca \
--cc=platform-driver-x86@vger.kernel.org \
--cc=rafael@kernel.org \
--cc=soyer@irl.hu \
--cc=u.kleine-koenig@pengutronix.de \
/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