Message ID | 20241031040952.109057-19-mario.limonciello@amd.com (mailing list archive) |
---|---|
State | Changes Requested, archived |
Headers | show |
Series | Add support for binding ACPI platform profile to multiple drivers | expand |
On Thu, Oct 31, 2024, at 12:09 AM, Mario Limonciello wrote: > If for any reason multiple profile handlers don't agree on the profile > report the custom profile to userspace. > > Signed-off-by: Mario Limonciello <mario.limonciello@amd.com> > --- > drivers/acpi/platform_profile.c | 39 +++++++++++++++++++++++++++------ > 1 file changed, 32 insertions(+), 7 deletions(-) > > diff --git a/drivers/acpi/platform_profile.c b/drivers/acpi/platform_profile.c > index 3128bd16615b6..5baac1f9a9c0e 100644 > --- a/drivers/acpi/platform_profile.c > +++ b/drivers/acpi/platform_profile.c > @@ -51,6 +51,36 @@ static unsigned long platform_profile_get_choices(void) > return aggregate; > } > > +static int platform_profile_get_active(enum platform_profile_option *profile) > +{ > + struct platform_profile_handler *handler; > + enum platform_profile_option active = PLATFORM_PROFILE_LAST; > + enum platform_profile_option val; > + int err; > + > + lockdep_assert_held(&profile_lock); > + list_for_each_entry(handler, &platform_profile_handler_list, list) { > + 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; > + > + if (active != val && active != PLATFORM_PROFILE_LAST) { > + *profile = PLATFORM_PROFILE_CUSTOM; > + return 0; > + } > + active = val; > + } > + > + *profile = active; > + > + return 0; > +} > + > static ssize_t platform_profile_choices_show(struct device *dev, > struct device_attribute *attr, > char *buf) > @@ -81,18 +111,13 @@ static ssize_t platform_profile_show(struct device *dev, > int err; > > scoped_cond_guard(mutex_intr, return -ERESTARTSYS, &profile_lock) { > - if (!cur_profile) > + if (!platform_profile_is_registered()) > return -ENODEV; > - > - err = cur_profile->profile_get(cur_profile, &profile); > + err = platform_profile_get_active(&profile); > if (err) > return err; > } > > - /* Check that profile is valid index */ > - if (WARN_ON((profile < 0) || (profile >= ARRAY_SIZE(profile_names)))) > - return -EIO; > - > return sysfs_emit(buf, "%s\n", profile_names[profile]); > } > > -- > 2.43.0 Looks good to me. Reviewed-by: Mark Pearson <mpearson-lenovo@squebb.ca> Mark
diff --git a/drivers/acpi/platform_profile.c b/drivers/acpi/platform_profile.c index 3128bd16615b6..5baac1f9a9c0e 100644 --- a/drivers/acpi/platform_profile.c +++ b/drivers/acpi/platform_profile.c @@ -51,6 +51,36 @@ static unsigned long platform_profile_get_choices(void) return aggregate; } +static int platform_profile_get_active(enum platform_profile_option *profile) +{ + struct platform_profile_handler *handler; + enum platform_profile_option active = PLATFORM_PROFILE_LAST; + enum platform_profile_option val; + int err; + + lockdep_assert_held(&profile_lock); + list_for_each_entry(handler, &platform_profile_handler_list, list) { + 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; + + if (active != val && active != PLATFORM_PROFILE_LAST) { + *profile = PLATFORM_PROFILE_CUSTOM; + return 0; + } + active = val; + } + + *profile = active; + + return 0; +} + static ssize_t platform_profile_choices_show(struct device *dev, struct device_attribute *attr, char *buf) @@ -81,18 +111,13 @@ static ssize_t platform_profile_show(struct device *dev, int err; scoped_cond_guard(mutex_intr, return -ERESTARTSYS, &profile_lock) { - if (!cur_profile) + if (!platform_profile_is_registered()) return -ENODEV; - - err = cur_profile->profile_get(cur_profile, &profile); + err = platform_profile_get_active(&profile); if (err) return err; } - /* Check that profile is valid index */ - if (WARN_ON((profile < 0) || (profile >= ARRAY_SIZE(profile_names)))) - return -EIO; - return sysfs_emit(buf, "%s\n", profile_names[profile]); }
If for any reason multiple profile handlers don't agree on the profile report the custom profile to userspace. Signed-off-by: Mario Limonciello <mario.limonciello@amd.com> --- drivers/acpi/platform_profile.c | 39 +++++++++++++++++++++++++++------ 1 file changed, 32 insertions(+), 7 deletions(-)