All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Kurt Borja" <kuurtb@gmail.com>
To: "Antheas Kapenekakis" <lkml@antheas.dev>
Cc: "Mario Limonciello" <superm1@kernel.org>,
	"Shyam Sundar S K" <Shyam-sundar.S-k@amd.com>,
	"Rafael J . Wysocki" <rafael@kernel.org>,
	"Hans de Goede" <hdegoede@redhat.com>,
	"Ilpo Järvinen" <ilpo.jarvinen@linux.intel.com>,
	"Luke D . Jones" <luke@ljones.dev>,
	"Mark Pearson" <mpearson-lenovo@squebb.ca>,
	"open list:AMD PMF DRIVER" <platform-driver-x86@vger.kernel.org>,
	"open list" <linux-kernel@vger.kernel.org>,
	"open list:ACPI" <linux-acpi@vger.kernel.org>,
	"Derek J . Clark" <derekjohn.clark@gmail.com>,
	me@kylegospodneti.ch, "Denis Benato" <benato.denis96@gmail.com>,
	"Mario Limonciello" <mario.limonciello@amd.com>
Subject: Re: [PATCH v2 1/1] ACPI: platform_profile: Treat quiet and low power the same
Date: Tue, 04 Mar 2025 08:53:59 -0500	[thread overview]
Message-ID: <D87J6E7DFLS0.1BY00BAZFWEH7@gmail.com> (raw)
In-Reply-To: <CAGwozwHXd6frhGCOrm8_tg2=M4sHCu_JBmqodWdKUF+AuL2TNw@mail.gmail.com>

On Tue Mar 4, 2025 at 8:32 AM -05, Antheas Kapenekakis wrote:
> On Tue, 4 Mar 2025 at 14:28, Kurt Borja <kuurtb@gmail.com> wrote:
>>
>> Hi all,
>>
>> On Tue Mar 4, 2025 at 7:49 AM -05, Mario Limonciello wrote:
>> >
>> >
>> > On 3/4/25 02:38, Antheas Kapenekakis wrote:
>> >> On Tue, 4 Mar 2025 at 07:48, Mario Limonciello <superm1@kernel.org> wrote:
>> >>>
>> >>> From: Mario Limonciello <mario.limonciello@amd.com>
>> >>>
>> >>> When two drivers don't support all the same profiles the legacy interface
>> >>> only exports the common profiles.
>> >>>
>> >>> This causes problems for cases where one driver uses low-power but another
>> >>> uses quiet because the result is that neither is exported to sysfs.
>> >>>
>> >>> If one platform profile handler supports quiet and the other
>> >>> supports low power treat them as the same for the purpose of
>> >>> the sysfs interface.
>> >>>
>> >>> Fixes: 688834743d67 ("ACPI: platform_profile: Allow multiple handlers")
>> >>> Reported-by: Antheas Kapenekakis <lkml@antheas.dev>
>> >>> Closes: https://lore.kernel.org/platform-driver-x86/e64b771e-3255-42ad-9257-5b8fc6c24ac9@gmx.de/T/#mc068042dd29df36c16c8af92664860fc4763974b
>> >>> Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
>> >>> ---
>> >>>   drivers/acpi/platform_profile.c | 38 ++++++++++++++++++++++++++++++---
>> >>>   1 file changed, 35 insertions(+), 3 deletions(-)
>> >>>
>> >>> diff --git a/drivers/acpi/platform_profile.c b/drivers/acpi/platform_profile.c
>> >>> index 2ad53cc6aae53..d9a7cc5891734 100644
>> >>> --- a/drivers/acpi/platform_profile.c
>> >>> +++ b/drivers/acpi/platform_profile.c
>> >>> @@ -73,8 +73,20 @@ static int _store_class_profile(struct device *dev, void *data)
>> >>>
>> >>>          lockdep_assert_held(&profile_lock);
>> >>>          handler = to_pprof_handler(dev);
>> >>> -       if (!test_bit(*bit, handler->choices))
>> >>> -               return -EOPNOTSUPP;
>> >>> +       if (!test_bit(*bit, handler->choices)) {
>> >>> +               switch (*bit) {
>> >>> +               case PLATFORM_PROFILE_QUIET:
>> >>> +                       *bit = PLATFORM_PROFILE_LOW_POWER;
>> >>> +                       break;
>> >>> +               case PLATFORM_PROFILE_LOW_POWER:
>> >>> +                       *bit = PLATFORM_PROFILE_QUIET;
>> >>> +                       break;
>> >>> +               default:
>> >>> +                       return -EOPNOTSUPP;
>> >>> +               }
>> >>> +               if (!test_bit(*bit, handler->choices))
>> >>> +                       return -EOPNOTSUPP;
>> >>> +       }
>> >>>
>> >>>          return handler->ops->profile_set(dev, *bit);
>> >>>   }
>> >>> @@ -252,8 +264,16 @@ static int _aggregate_choices(struct device *dev, void *data)
>> >>>          handler = to_pprof_handler(dev);
>> >>>          if (test_bit(PLATFORM_PROFILE_LAST, aggregate))
>> >>>                  bitmap_copy(aggregate, handler->choices, PLATFORM_PROFILE_LAST);
>> >>> -       else
>> >>> +       else {
>> >>> +               /* treat quiet and low power the same for aggregation purposes */
>> >>> +               if (test_bit(PLATFORM_PROFILE_QUIET, handler->choices) &&
>> >>> +                   test_bit(PLATFORM_PROFILE_LOW_POWER, aggregate))
>> >>> +                       set_bit(PLATFORM_PROFILE_QUIET, aggregate);
>> >>> +               else if (test_bit(PLATFORM_PROFILE_LOW_POWER, handler->choices) &&
>> >>> +                        test_bit(PLATFORM_PROFILE_QUIET, aggregate))
>> >>> +                       set_bit(PLATFORM_PROFILE_LOW_POWER, aggregate);
>> >>>                  bitmap_and(aggregate, handler->choices, aggregate, PLATFORM_PROFILE_LAST);
>> >>> +       }
>> >>
>> >> So you end up showing both? If that's the case, isn't it equivalent to
>> >> just make amd-pmf show both quiet and low-power?
>> >>
>> >> I guess it is not ideal for framework devices. But if asus devices end
>> >> up showing both, then it should be ok for framework devices to show
>> >> both.
>> >>
>> >> I like the behavior of the V1 personally.
>> >
>> > No; this doesn't cause it to show both.  It only causes one to show up.
>> > I confirmed it with a contrived situation on my laptop that forced
>> > multiple profile handlers that supported a mix.
>> >
>> >
>> > # cat /sys/firmware/acpi/platform_profile*
>> > low-power
>> > low-power balanced performance
>> >
>> > # cat /sys/class/platform-profile/platform-profile-*/profile
>> > quiet
>> > quiet
>> > quiet
>> > quiet
>> > quiet
>> > quiet
>> > quiet
>> > quiet
>> > quiet
>> > quiet
>> > quiet
>> > quiet
>> > quiet
>> > quiet
>> > quiet
>> > quiet
>> > quiet
>> > quiet
>> > quiet
>> > quiet
>> > quiet
>> > quiet
>> > quiet
>> > quiet
>> > low-power
>> >
>> >>
>> >>>          return 0;
>> >>>   }
>> >>> @@ -305,6 +325,13 @@ static int _aggregate_profiles(struct device *dev, void *data)
>> >>>          if (err)
>> >>>                  return err;
>> >>>
>> >>> +       /* treat low-power and quiet as the same */
>> >>> +       if ((*profile == PLATFORM_PROFILE_LOW_POWER &&
>> >>> +            val == PLATFORM_PROFILE_QUIET) ||
>> >>> +           (*profile == PLATFORM_PROFILE_QUIET &&
>> >>> +            val == PLATFORM_PROFILE_LOW_POWER))
>> >>> +               *profile = val;
>> >>> +
>> >>>          if (*profile != PLATFORM_PROFILE_LAST && *profile != val)
>> >>>                  *profile = PLATFORM_PROFILE_CUSTOM;
>> >>>          else
>> >>> @@ -531,6 +558,11 @@ struct device *platform_profile_register(struct device *dev, const char *name,
>> >>>                  dev_err(dev, "Failed to register platform_profile class device with empty choices\n");
>> >>>                  return ERR_PTR(-EINVAL);
>> >>>          }
>> >>> +       if (test_bit(PLATFORM_PROFILE_QUIET, pprof->choices) &&
>> >>> +           test_bit(PLATFORM_PROFILE_LOW_POWER, pprof->choices)) {
>> >>> +               dev_err(dev, "Failed to register platform_profile class device with both quiet and low-power\n");
>> >>> +               return ERR_PTR(-EINVAL);
>> >>> +       }
>> >>
>> >> Can you avoid failing here? It caused a lot of issues in the past (the
>> >> WMI driver bails). a dev_err should be enough. Since you do not fail
>> >> maybe it can be increased to dev_crit.
>> >>
>> >> There is at least one driver that implements both currently, and a fix
>> >> would have to precede this patch.
>> >
>> > Oh, acer-wmi?  Kurt; can you please comment?  Are both simultaneous?
>>
>> There are a few laptops supported by alienware-wmi that definitely have
>> both (including mine). The acer-wmi and the samsung-galaxybook drivers
>> also probe for available choices dynamically, so some of those devices
>> may be affected by this too.
>>
>> So yes, we shouldn't fail registration here.
>>
>> Anyway, I like this approach more than v1. What do you think about
>> constraining this fix to the legacy interface?
>
> AFAIK new interface is ok and should not be modified. None of the
> previous solutions touched it (well, changing quiet to low-power did).
> But I still expect the legacy interface to work the same way on 6.14.

This patch also permanently alias quiet and low-power for the new
interface, if either one is not available.

>
> What happens if there is one handler that does low-power and one that
> does quiet? Is one choice preferred? And then are writes accepted in
> both?
>
> I cannot have the same device requiring low-power and quiet depending
> on kernel version or boot. I do tdp controls per manufacturer.

I'm not sure what you mean here.

-- 
 ~ Kurt

>
>> --
>>  ~ Kurt
>>
>> >
>> >>
>> >>>
>> >>>          guard(mutex)(&profile_lock);
>> >>>
>> >>> --
>> >>> 2.43.0
>> >>>
>>


  parent reply	other threads:[~2025-03-04 13:54 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-03-04  6:47 [PATCH v2 0/1] Add quiet/low power compat code Mario Limonciello
2025-03-04  6:47 ` [PATCH v2 1/1] ACPI: platform_profile: Treat quiet and low power the same Mario Limonciello
2025-03-04  8:38   ` Antheas Kapenekakis
2025-03-04 12:49     ` Mario Limonciello
2025-03-04 13:06       ` Antheas Kapenekakis
2025-03-04 13:26       ` Kurt Borja
2025-03-04 13:32         ` Antheas Kapenekakis
2025-03-04 13:53           ` Derek J. Clark
2025-03-04 13:53           ` Kurt Borja [this message]
2025-03-04 14:02             ` Antheas Kapenekakis
2025-03-04 14:08       ` Rafael J. Wysocki
2025-03-04 14:52         ` Mario Limonciello
2025-03-04 14:58           ` Rafael J. Wysocki
2025-03-04 16:23             ` Ilpo Järvinen
2025-03-04 15:24   ` Derek J. Clark

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=D87J6E7DFLS0.1BY00BAZFWEH7@gmail.com \
    --to=kuurtb@gmail.com \
    --cc=Shyam-sundar.S-k@amd.com \
    --cc=benato.denis96@gmail.com \
    --cc=derekjohn.clark@gmail.com \
    --cc=hdegoede@redhat.com \
    --cc=ilpo.jarvinen@linux.intel.com \
    --cc=linux-acpi@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=lkml@antheas.dev \
    --cc=luke@ljones.dev \
    --cc=mario.limonciello@amd.com \
    --cc=me@kylegospodneti.ch \
    --cc=mpearson-lenovo@squebb.ca \
    --cc=platform-driver-x86@vger.kernel.org \
    --cc=rafael@kernel.org \
    --cc=superm1@kernel.org \
    /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.