Message ID | 20241202055031.8038-21-mario.limonciello@amd.com |
---|---|
State | Superseded |
Headers | show |
Series | Add support for binding ACPI platform profile to multiple drivers | expand |
On Sun, 1 Dec 2024, Mario Limonciello wrote: > Multiple drivers may attempt to register platform profile handlers, > but only one may be registered and the behavior is non-deterministic > for which one wins. It's mostly controlled by probing order. > > This can be problematic if one driver changes CPU settings and another > driver notifies the EC for changing fan curves. > > Modify the ACPI platform profile handler to let multiple drivers > register platform profile handlers and abstract this detail from userspace. > > To avoid undefined behaviors only offer profiles that are commonly > advertised across multiple handlers. > > If any problems occur when changing profiles for any driver, then the > drivers that were already changed remain changed and the legacy sysfs > handler will report 'custom'. > > Tested-by: Mark Pearson <mpearson-lenovo@squebb.ca> > Tested-by: Matthew Schwartz <matthew.schwartz@linux.dev> > Reviewed-by: Mark Pearson <mpearson-lenovo@squebb.ca> > Reviewed-by: Armin Wolf <W_Armin@gmx.de> > Signed-off-by: Mario Limonciello <mario.limonciello@amd.com> > --- > drivers/acpi/platform_profile.c | 11 ----------- > 1 file changed, 11 deletions(-) > > diff --git a/drivers/acpi/platform_profile.c b/drivers/acpi/platform_profile.c > index 289b5d43638ae..2e38aa410b3ad 100644 > --- a/drivers/acpi/platform_profile.c > +++ b/drivers/acpi/platform_profile.c > @@ -10,7 +10,6 @@ > #include <linux/platform_profile.h> > #include <linux/sysfs.h> > > -static struct platform_profile_handler *cur_profile; > static DEFINE_MUTEX(profile_lock); > > static const char * const profile_names[] = { > @@ -399,8 +398,6 @@ static const struct attribute_group platform_profile_group = { > > void platform_profile_notify(struct platform_profile_handler *pprof) > { > - if (!cur_profile) > - return; > scoped_cond_guard(mutex_intr, return, &profile_lock) { > _notify_class_profile(pprof->class_dev, NULL); > } > @@ -463,9 +460,6 @@ int platform_profile_register(struct platform_profile_handler *pprof) > } > > guard(mutex)(&profile_lock); > - /* We can only have one active profile */ > - if (cur_profile) > - return -EEXIST; > > /* create class interface for individual handler */ > pprof->minor = ida_alloc(&platform_profile_ida, GFP_KERNEL); > @@ -481,8 +475,6 @@ int platform_profile_register(struct platform_profile_handler *pprof) > > sysfs_notify(acpi_kobj, NULL, "platform_profile"); > > - cur_profile = pprof; > - > err = sysfs_update_group(acpi_kobj, &platform_profile_group); > if (err) > goto cleanup_cur; > @@ -490,7 +482,6 @@ int platform_profile_register(struct platform_profile_handler *pprof) > return 0; > > cleanup_cur: > - cur_profile = NULL; > device_unregister(pprof->class_dev); > > cleanup_ida: > @@ -505,8 +496,6 @@ int platform_profile_remove(struct platform_profile_handler *pprof) > int id; > guard(mutex)(&profile_lock); > > - cur_profile = NULL; > - > id = pprof->minor; > device_unregister(pprof->class_dev); > ida_free(&platform_profile_ida, id); > Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
diff --git a/drivers/acpi/platform_profile.c b/drivers/acpi/platform_profile.c index 289b5d43638ae..2e38aa410b3ad 100644 --- a/drivers/acpi/platform_profile.c +++ b/drivers/acpi/platform_profile.c @@ -10,7 +10,6 @@ #include <linux/platform_profile.h> #include <linux/sysfs.h> -static struct platform_profile_handler *cur_profile; static DEFINE_MUTEX(profile_lock); static const char * const profile_names[] = { @@ -399,8 +398,6 @@ static const struct attribute_group platform_profile_group = { void platform_profile_notify(struct platform_profile_handler *pprof) { - if (!cur_profile) - return; scoped_cond_guard(mutex_intr, return, &profile_lock) { _notify_class_profile(pprof->class_dev, NULL); } @@ -463,9 +460,6 @@ int platform_profile_register(struct platform_profile_handler *pprof) } guard(mutex)(&profile_lock); - /* We can only have one active profile */ - if (cur_profile) - return -EEXIST; /* create class interface for individual handler */ pprof->minor = ida_alloc(&platform_profile_ida, GFP_KERNEL); @@ -481,8 +475,6 @@ int platform_profile_register(struct platform_profile_handler *pprof) sysfs_notify(acpi_kobj, NULL, "platform_profile"); - cur_profile = pprof; - err = sysfs_update_group(acpi_kobj, &platform_profile_group); if (err) goto cleanup_cur; @@ -490,7 +482,6 @@ int platform_profile_register(struct platform_profile_handler *pprof) return 0; cleanup_cur: - cur_profile = NULL; device_unregister(pprof->class_dev); cleanup_ida: @@ -505,8 +496,6 @@ int platform_profile_remove(struct platform_profile_handler *pprof) int id; guard(mutex)(&profile_lock); - cur_profile = NULL; - id = pprof->minor; device_unregister(pprof->class_dev); ida_free(&platform_profile_ida, id);