All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mario Limonciello <mario.limonciello@amd.com>
To: "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>,
	"Mario Limonciello" <mario.limonciello@amd.com>
Subject: [PATCH v5 16/20] ACPI: platform_profile: Make sure all profile handlers agree on profile
Date: Thu, 7 Nov 2024 00:02:50 -0600	[thread overview]
Message-ID: <20241107060254.17615-17-mario.limonciello@amd.com> (raw)
In-Reply-To: <20241107060254.17615-1-mario.limonciello@amd.com>

If for any reason multiple profile handlers don't agree on the profile
return the custom profile.

Tested-by: Mark Pearson <mpearson-lenovo@squebb.ca>
Reviewed-by: Mark Pearson <mpearson-lenovo@squebb.ca>
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
---
v5:
 * Notify class profile of change to legacy interface
 * Don't show warning when writing custom string, document in last patch
   instead.
 * Adjust mutex use
---
 drivers/acpi/platform_profile.c | 101 ++++++++++++++++++++++++--------
 1 file changed, 76 insertions(+), 25 deletions(-)

diff --git a/drivers/acpi/platform_profile.c b/drivers/acpi/platform_profile.c
index b6f3388b4eef9..7f302ac4d3779 100644
--- a/drivers/acpi/platform_profile.c
+++ b/drivers/acpi/platform_profile.c
@@ -94,6 +94,22 @@ static int _store_class_profile(struct device *dev, void *data)
 	return err ? err : 0;
 }
 
+/**
+ * _notify_class_profile - Notify the class device of a profile change
+ * @dev: The class device
+ * @data: Unused
+ */
+static int _notify_class_profile(struct device *dev, void *data)
+{
+	struct platform_profile_handler *handler = dev_get_drvdata(dev);
+
+	lockdep_assert_held(&profile_lock);
+	sysfs_notify(&handler->class_dev->kobj, NULL, "platform_profile");
+	kobject_uevent(&handler->class_dev->kobj, KOBJ_CHANGE);
+
+	return 0;
+}
+
 /**
  * get_class_profile - Show the current profile for a class device
  * @dev: The class device
@@ -284,54 +300,89 @@ static ssize_t platform_profile_choices_show(struct device *dev,
 	return _commmon_choices_show(aggregate, buf);
 }
 
+/**
+ * _aggregate_profiles - Aggregate the profiles for legacy sysfs interface
+ * @dev: The device
+ * @data: The profile to return
+ * Return: 0 on success, -errno on failure
+ */
+static int _aggregate_profiles(struct device *dev, void *data)
+{
+	enum platform_profile_option *profile = data;
+	enum platform_profile_option val;
+	int err;
+
+	err = get_class_profile(dev, &val);
+	if (err)
+		return err;
+
+	if (*profile != PLATFORM_PROFILE_LAST && *profile != val)
+		*profile = PLATFORM_PROFILE_CUSTOM;
+	else
+		*profile = val;
+
+	return 0;
+}
+
+/**
+ * platform_profile_show - Show the current profile for legacy sysfs interface
+ * @dev: The device
+ * @attr: The attribute
+ * @buf: The buffer to write to
+ * Return: The number of bytes written
+ */
 static ssize_t platform_profile_show(struct device *dev,
-					struct device_attribute *attr,
-					char *buf)
+				     struct device_attribute *attr,
+				     char *buf)
 {
-	enum platform_profile_option profile = PLATFORM_PROFILE_BALANCED;
+	enum platform_profile_option profile = PLATFORM_PROFILE_LAST;
 	int err;
 
 	scoped_cond_guard(mutex_intr, return -ERESTARTSYS, &profile_lock) {
-		if (!cur_profile)
-			return -ENODEV;
-
-		err = cur_profile->profile_get(cur_profile, &profile);
+		err = class_for_each_device(&platform_profile_class, NULL,
+					    &profile, _aggregate_profiles);
 		if (err)
 			return err;
 	}
 
-	/* Check that profile is valid index */
-	if (WARN_ON((profile < 0) || (profile >= ARRAY_SIZE(profile_names))))
-		return -EIO;
+	/* no profile handler registered any more */
+	if (profile == PLATFORM_PROFILE_LAST)
+		return -EINVAL;
 
 	return sysfs_emit(buf, "%s\n", profile_names[profile]);
 }
 
+/**
+ * platform_profile_store - Set the profile for legacy sysfs interface
+ * @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 platform_profile_store(struct device *dev,
-			    struct device_attribute *attr,
-			    const char *buf, size_t count)
+				      struct device_attribute *attr,
+				      const char *buf, size_t count)
 {
-	int err, i;
+	int ret;
+	int i;
 
 	/* Scan for a matching profile */
 	i = sysfs_match_string(profile_names, buf);
-	if (i < 0)
+	if (i < 0 || PLATFORM_PROFILE_CUSTOM)
 		return -EINVAL;
 
 	scoped_cond_guard(mutex_intr, return -ERESTARTSYS, &profile_lock) {
-		if (!cur_profile)
-			return -ENODEV;
-
-		/* Check that platform supports this profile choice */
-		if (!test_bit(i, cur_profile->choices))
-			return -EOPNOTSUPP;
-
-		err = cur_profile->profile_set(cur_profile, i);
-		if (err)
-			return err;
+		ret = class_for_each_device(&platform_profile_class, NULL, &i,
+					    _store_class_profile);
+		if (ret)
+			return ret;
+		ret = class_for_each_device(&platform_profile_class, NULL, NULL,
+					    _notify_class_profile);
+		if (ret)
+			return ret;
 	}
 
-	sysfs_notify(acpi_kobj, NULL, "platform_profile");
 	return count;
 }
 
-- 
2.43.0


  parent reply	other threads:[~2024-11-07  6:03 UTC|newest]

Thread overview: 43+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-11-07  6:02 [PATCH v5 00/20] Add support for binding ACPI platform profile to multiple drivers Mario Limonciello
2024-11-07  6:02 ` [PATCH v5 01/20] ACPI: platform-profile: Add a name member to handlers Mario Limonciello
2024-11-07  6:02 ` [PATCH v5 02/20] platform/x86/dell: dell-pc: Create platform device Mario Limonciello
2024-11-07  8:07   ` Armin Wolf
2024-11-07  6:02 ` [PATCH v5 03/20] ACPI: platform_profile: Add platform handler argument to platform_profile_remove() Mario Limonciello
2024-11-07  6:02 ` [PATCH v5 04/20] ACPI: platform_profile: Move sanity check out of the mutex Mario Limonciello
2024-11-07  6:02 ` [PATCH v5 05/20] ACPI: platform_profile: Move matching string for new profile out of mutex Mario Limonciello
2024-11-07  6:02 ` [PATCH v5 06/20] ACPI: platform_profile: Use guard(mutex) for register/unregister Mario Limonciello
2024-11-07  6:02 ` [PATCH v5 07/20] ACPI: platform_profile: Use `scoped_cond_guard` Mario Limonciello
2024-11-07  6:02 ` [PATCH v5 08/20] ACPI: platform_profile: Create class for ACPI platform profile Mario Limonciello
2024-11-07  8:16   ` Armin Wolf
2024-11-07 21:09     ` Mario Limonciello
2024-11-08 17:34       ` Armin Wolf
2024-11-07  6:02 ` [PATCH v5 09/20] ACPI: platform_profile: Unregister class and sysfs group on module unload Mario Limonciello
2024-11-07  8:21   ` Armin Wolf
2024-11-07  6:02 ` [PATCH v5 10/20] ACPI: platform_profile: Add name attribute to class interface Mario Limonciello
2024-11-07  8:23   ` Armin Wolf
2024-11-07  6:02 ` [PATCH v5 11/20] ACPI: platform_profile: Add choices attribute for " Mario Limonciello
2024-11-07  8:28   ` Armin Wolf
2024-11-07 22:09     ` Mario Limonciello
2024-11-08 18:06       ` Armin Wolf
2024-11-08 19:25         ` Mario Limonciello
2024-11-08 19:44           ` Armin Wolf
2024-11-07  6:02 ` [PATCH v5 12/20] ACPI: platform_profile: Add profile " Mario Limonciello
2024-11-07  8:34   ` Armin Wolf
2024-11-07 21:41     ` Mario Limonciello
2024-11-08 18:00       ` Armin Wolf
2024-11-07  6:02 ` [PATCH v5 13/20] ACPI: platform_profile: Notify change events on register and unregister Mario Limonciello
2024-11-07  6:02 ` [PATCH v5 14/20] ACPI: platform_profile: Only show profiles common for all handlers Mario Limonciello
2024-11-07  6:02 ` [PATCH v5 15/20] ACPI: platform_profile: Add concept of a "custom" profile Mario Limonciello
2024-11-07  6:02 ` Mario Limonciello [this message]
2024-11-07  8:53   ` [PATCH v5 16/20] ACPI: platform_profile: Make sure all profile handlers agree on profile Armin Wolf
2024-11-07 10:28   ` kernel test robot
2024-11-07  6:02 ` [PATCH v5 17/20] ACPI: platform_profile: Check all profile handler to calculate next Mario Limonciello
2024-11-07  8:58   ` Armin Wolf
2024-11-07 22:05     ` Mario Limonciello
2024-11-08 18:10       ` Armin Wolf
2024-11-07  6:02 ` [PATCH v5 18/20] ACPI: platform_profile: Allow multiple handlers Mario Limonciello
2024-11-07  6:02 ` [PATCH v5 19/20] platform/x86/amd: pmf: Drop all quirks Mario Limonciello
2024-11-07  6:02 ` [PATCH v5 20/20] Documentation: Add documentation about class interface for platform profiles Mario Limonciello
2024-11-07  9:06 ` [PATCH v5 00/20] Add support for binding ACPI platform profile to multiple drivers Armin Wolf
2024-11-07 21:45   ` Mario Limonciello
2024-11-08 18:13     ` 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=20241107060254.17615-17-mario.limonciello@amd.com \
    --to=mario.limonciello@amd.com \
    --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=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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.