RE: [PATCH] drm/amd: Only allow one entity to control ABM

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



[Public]

> -----Original Message-----
> From: amd-gfx <amd-gfx-bounces@xxxxxxxxxxxxxxxxxxxxx> On Behalf Of
> Christian König
> Sent: Tuesday, February 20, 2024 9:10 AM
> To: Alex Deucher <alexdeucher@xxxxxxxxx>
> Cc: Limonciello, Mario <Mario.Limonciello@xxxxxxx>; Wentland, Harry
> <Harry.Wentland@xxxxxxx>; amd-gfx@xxxxxxxxxxxxxxxxxxxxx; dri-
> devel@xxxxxxxxxxxxxxxxxxxxx; Mahfooz, Hamza <Hamza.Mahfooz@xxxxxxx>;
> Li, Sun peng (Leo) <Sunpeng.Li@xxxxxxx>
> Subject: Re: [PATCH] drm/amd: Only allow one entity to control ABM
>
> Am 19.02.24 um 16:28 schrieb Alex Deucher:
> > On Mon, Feb 19, 2024 at 10:19 AM Christian König
> > <christian.koenig@xxxxxxx> wrote:
> >> Am 16.02.24 um 19:37 schrieb Alex Deucher:
> >>> On Fri, Feb 16, 2024 at 10:42 AM Christian König
> >>> <christian.koenig@xxxxxxx> wrote:
> >>>> Am 16.02.24 um 16:12 schrieb Mario Limonciello:
> >>>>> On 2/16/2024 09:05, Harry Wentland wrote:
> >>>>>> On 2024-02-16 09:47, Christian König wrote:
> >>>>>>> Am 16.02.24 um 15:42 schrieb Mario Limonciello:
> >>>>>>>> On 2/16/2024 08:38, Christian König wrote:
> >>>>>>>>> Am 16.02.24 um 15:07 schrieb Mario Limonciello:
> >>>>>>>>>> By exporting ABM to sysfs it's possible that DRM master and
> >>>>>>>>>> software controlling the sysfs file fight over the value programmed
> for ABM.
> >>>>>>>>>>
> >>>>>>>>>> Adjust the module parameter behavior to control who control
> ABM:
> >>>>>>>>>> -2: DRM
> >>>>>>>>>> -1: sysfs (IE via software like power-profiles-daemon)
> >>>>>>>>> Well that sounds extremely awkward. Why should a
> >>>>>>>>> power-profiles-deamon has control over the panel power saving
> >>>>>>>>> features?
> >>>>>>>>>
> >>>>>>>>> I mean we are talking about things like reducing backlight
> >>>>>>>>> level when the is inactivity, don't we?
> >>>>>>>> We're talking about activating the ABM algorithm when the
> >>>>>>>> system is in power saving mode; not from inactivity.  This
> >>>>>>>> allows the user to squeeze out some extra power "just" in that
> situation.
> >>>>>>>>
> >>>>>>>> But given the comments on the other patch, I tend to agree with
> >>>>>>>> Harry's proposal instead that we just drop the DRM property
> >>>>>>>> entirely as there are no consumers of it.
> >>>>>>> Yeah, but even then the design to let this be controlled by an
> >>>>>>> userspace deamon is questionable. Stuff like that is handled
> >>>>>>> inside the kernel and not exposed to userspace usually.
> >>>>>>>
> >>>>> Regarding the "how" and "why" of PPD; besides this panel power
> >>>>> savings sysfs file there are two other things that are nominally changed.
> >>>>>
> >>>>> ACPI platform profile:
> >>>>> https://www.kernel.org/doc/html/latest/userspace-api/sysfs-platfor
> >>>>> m_profile.html
> >>>>>
> >>>>> AMD-Pstate EPP value:
> >>>>> https://www.kernel.org/doc/html//latest/admin-guide/pm/amd-
> pstate.
> >>>>> html
> >>>>>
> >>>>> When a user goes into "power saving" mode both of those are tweaked.
> >>>>> Before we introduced the EPP tweaking in PPD we did discuss a
> >>>>> callback within the kernel so that userspace could change "just"
> >>>>> the ACPI platform profile and everything else would react.  There
> >>>>> was pushback on this, and so instead knobs are offered for things
> >>>>> that should be tweaked and the userspace daemon can set up policy
> >>>>> for what to do when a a user uses a userspace client (such as
> >>>>> GNOME or KDE) to change the desired system profile.
> >>>> Ok, well who came up with the idea of the userspace deamon? Cause I
> >>>> think there will be even more push back on this approach.
> >>>>
> >>>> Basically when we go from AC to battery (or whatever) the drivers
> >>>> usually handle that all inside the kernel today. Involving
> >>>> userspace is only done when there is a need for that, e.g.
> >>>> inactivity detection or similar.
> >>> Well, we don't want policy in the kernel unless it's a platform or
> >>> hardware requirement.  Kernel should provide the knobs and then
> >>> userspace can set them however they want depending on user preference.
> >> Well, you not have the policy itself but usually the handling inside
> >> the kernel.
> >>
> >> In other words when I connect/disconnect AC from my laptop I can hear
> >> the fan changing, which is a switch in power state. Only the beep
> >> which comes out of the speakers as conformation is handled in userspace I
> think.
> >>
> >> And IIRC changing background light is also handled completely inside
> >> the kernel and when I close the lid the display turns off on its own
> >> and not because of some userspace deamon.
> >>
> >> So why is for this suddenly a userspace deamon involved?
> > It's a user preference.  Some people won't like ABM, some will.  They
> > set the policy from user space.  It's similar to the backlight level.
> > Some users always prefer a bright backlight regardless of AC/DC state,
> > others want the backlight to get brighter when on AC power.  The
> > kernel provides the knobs to set the ABM level and then user space can
> > specify the level and also device when they want it enabled (never,
> > only on DC, etc.).  The kernel driver for the backlight doesn't change
> > the backlight at AC/DC switch, userspace gets an event when the power
> > source changes and it then talks to the kernel to change the backlight
> > level.  I think lid is handled the same way.  Userspace gets a lid
> > event and it turns off the displays and maybe enters suspend or maybe
> > not depending on what the user wants.
>
> Ok, well that comes as a surprise. Which userspace component is responsible
> for this?

IIRC, Systemd-logind handles most of the power events.

Alex

>
> Christian.
>
> >
> > Alex
> >
> >> Christian.
> >>
> >>> Alex
> >>>
> >>>
> >>>>>> I think we'll need a bit in our kernel docs describing ABM.
> >>>>>> Assumptions around what it is and does seem to lead to confusion.
> >>>>>>
> >>>>>> The thing is that ABM has a visual impact that not all users
> >>>>>> like. It would make sense for users to be able to change the ABM
> >>>>>> level as desired, and/or configure their power profiles to select
> >>>>>> a certain ABM level.
> >>>>>>
> >>>>>> ABM will reduce the backlight and compensate by adjusting
> >>>>>> brightness and contrast of the image. It has 5 levels: 0, 1, 2,
> >>>>>> 3, 4. 0 means off. 4 means maximum backlight reduction. IMO, 1
> >>>>>> and 2 look okay. 3 and 4 can be quite impactful, both to power and
> visual fidelity.
> >>>>>>
> >>>>> Aside from this patch Hamza did make some improvements to the kdoc
> >>>>> in the recent patches, can you read through again and see if you
> >>>>> think it still needs improvements?
> >>>> Well what exactly is the requirement? That we have different ABM
> >>>> settings for AC and battery? If yes providing different DRM
> >>>> properties would sound like the right approach to me.
> >>>>
> >>>> Regards,
> >>>> Christian.
> >>>>
> >>>>>> Harry
> >>>>>>
> >>>>>>> Regards,
> >>>>>>> Christian.
> >>>>>>>
> >>>>>>>>> Regards,
> >>>>>>>>> Christian.
> >>>>>>>>>
> >>>>>>>>>> 0-4: User via command line
> >>>>>>>>>>
> >>>>>>>>>> Also introduce a Kconfig option that allows distributions to
> >>>>>>>>>> choose the default policy that is appropriate for them.
> >>>>>>>>>>
> >>>>>>>>>> Fixes: f97e4303da16 ("drm/amd/display: add
> >>>>>>>>>> panel_power_savings sysfs entry to eDP connectors")
> >>>>>>>>>> Signed-off-by: Mario Limonciello <mario.limonciello@xxxxxxx>
> >>>>>>>>>> ---
> >>>>>>>>>> Cc: Hamza Mahfooz <Hamza.Mahfooz@xxxxxxx>
> >>>>>>>>>> Cc: Harry Wentland <Harry.Wentland@xxxxxxx>
> >>>>>>>>>> Cc: Sun peng (Leo) Li <Sunpeng.Li@xxxxxxx>
> >>>>>>>>>>      drivers/gpu/drm/amd/amdgpu/Kconfig            | 72
> >>>>>>>>>> +++++++++++++++++++
> >>>>>>>>>>      drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c       | 23 +++---
> >>>>>>>>>>      .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c |  6 +-
> >>>>>>>>>>      3 files changed, 90 insertions(+), 11 deletions(-)
> >>>>>>>>>>
> >>>>>>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/Kconfig
> >>>>>>>>>> b/drivers/gpu/drm/amd/amdgpu/Kconfig
> >>>>>>>>>> index 22d88f8ef527..2ab57ccf6f21 100644
> >>>>>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/Kconfig
> >>>>>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/Kconfig
> >>>>>>>>>> @@ -80,6 +80,78 @@ config DRM_AMDGPU_WERROR
> >>>>>>>>>>            Add -Werror to the build flags for amdgpu.ko.
> >>>>>>>>>>            Only enable this if you are warning code for amdgpu.ko.
> >>>>>>>>>> +choice
> >>>>>>>>>> +    prompt "Amdgpu panel power Savings"
> >>>>>>>>>> +    default AMDGPU_SYSFS_ABM
> >>>>>>>>>> +    help
> >>>>>>>>>> +        Control the default behavior for adaptive panel
> >>>>>>>>>> +power
> >>>>>>>>>> savings.
> >>>>>>>>>> +
> >>>>>>>>>> +        Panel power savings features will sacrifice color accuracy
> >>>>>>>>>> +        in exchange for power savings.
> >>>>>>>>>> +
> >>>>>>>>>> +        This can be configured for:
> >>>>>>>>>> +        - dynamic control by the DRM master
> >>>>>>>>>> +        - dynamic control by sysfs nodes
> >>>>>>>>>> +        - statically by the user at kernel compile time
> >>>>>>>>>> +
> >>>>>>>>>> +        This value can also be overridden by the amdgpu.abmlevel
> >>>>>>>>>> +        module parameter.
> >>>>>>>>>> +
> >>>>>>>>>> +config AMDGPU_DRM_ABM
> >>>>>>>>>> +    bool "DRM Master control"
> >>>>>>>>>> +    help
> >>>>>>>>>> +        Export a property called 'abm_level' that can be
> >>>>>>>>>> +        manipulated by the DRM master for supported hardware.
> >>>>>>>>>> +
> >>>>>>>>>> +config AMDGPU_SYSFS_ABM
> >>>>>>>>>> +    bool "sysfs control"
> >>>>>>>>>> +    help
> >>>>>>>>>> +        Export a sysfs file 'panel_power_savings' that can be
> >>>>>>>>>> +        manipulated by userspace for supported hardware.
> >>>>>>>>>> +
> >>>>>>>>>> +config AMDGPU_HARDCODE_ABM0
> >>>>>>>>>> +    bool "No Panel power savings"
> >>>>>>>>>> +    help
> >>>>>>>>>> +        Disable panel power savings.
> >>>>>>>>>> +        It can only overridden by the kernel command line.
> >>>>>>>>>> +
> >>>>>>>>>> +config AMDGPU_HARDCODE_ABM1
> >>>>>>>>>> +    bool "25% Panel power savings"
> >>>>>>>>>> +    help
> >>>>>>>>>> +        Set the ABM panel power savings algorithm to 25%.
> >>>>>>>>>> +        It can only overridden by the kernel command line.
> >>>>>>>>>> +
> >>>>>>>>>> +config AMDGPU_HARDCODE_ABM2
> >>>>>>>>>> +    bool "50% Panel power savings"
> >>>>>>>>>> +    help
> >>>>>>>>>> +        Set the ABM panel power savings algorithm to 50%.
> >>>>>>>>>> +        It can only overridden by the kernel command line.
> >>>>>>>>>> +
> >>>>>>>>>> +config AMDGPU_HARDCODE_ABM3
> >>>>>>>>>> +    bool "75% Panel power savings"
> >>>>>>>>>> +    help
> >>>>>>>>>> +        Set the ABM panel power savings algorithm to 75%.
> >>>>>>>>>> +        It can only overridden by the kernel command line.
> >>>>>>>>>> +
> >>>>>>>>>> +config AMDGPU_HARDCODE_ABM4
> >>>>>>>>>> +    bool "100% Panel power savings"
> >>>>>>>>>> +    help
> >>>>>>>>>> +        Set the ABM panel power savings algorithm to 100%.
> >>>>>>>>>> +        It can only overridden by the kernel command line.
> >>>>>>>>>> +endchoice
> >>>>>>>>>> +
> >>>>>>>>>> +config AMDGPU_ABM_POLICY
> >>>>>>>>>> +    int
> >>>>>>>>>> +    default -2 if AMDGPU_DRM_ABM
> >>>>>>>>>> +    default -1 if AMDGPU_SYSFS_ABM
> >>>>>>>>>> +    default 0 if AMDGPU_HARDCODE_ABM0
> >>>>>>>>>> +    default 1 if AMDGPU_HARDCODE_ABM1
> >>>>>>>>>> +    default 2 if AMDGPU_HARDCODE_ABM2
> >>>>>>>>>> +    default 3 if AMDGPU_HARDCODE_ABM3
> >>>>>>>>>> +    default 4 if AMDGPU_HARDCODE_ABM4
> >>>>>>>>>> +    default -1
> >>>>>>>>>> +
> >>>>>>>>>> +
> >>>>>>>>>>      source "drivers/gpu/drm/amd/acp/Kconfig"
> >>>>>>>>>>      source "drivers/gpu/drm/amd/display/Kconfig"
> >>>>>>>>>>      source "drivers/gpu/drm/amd/amdkfd/Kconfig"
> >>>>>>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
> >>>>>>>>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
> >>>>>>>>>> index af7fae7907d7..00d6c8b58716 100644
> >>>>>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
> >>>>>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
> >>>>>>>>>> @@ -844,17 +844,24 @@ module_param_named(visualconfirm,
> >>>>>>>>>> amdgpu_dc_visual_confirm, uint, 0444);
> >>>>>>>>>>       * DOC: abmlevel (uint)
> >>>>>>>>>>       * Override the default ABM (Adaptive Backlight
> >>>>>>>>>> Management) level used for DC
> >>>>>>>>>>       * enabled hardware. Requires DMCU to be supported and
> loaded.
> >>>>>>>>>> - * Valid levels are 0-4. A value of 0 indicates that ABM
> >>>>>>>>>> should be disabled by
> >>>>>>>>>> - * default. Values 1-4 control the maximum allowable
> >>>>>>>>>> brightness reduction via
> >>>>>>>>>> - * the ABM algorithm, with 1 being the least reduction and 4
> >>>>>>>>>> being the most
> >>>>>>>>>> - * reduction.
> >>>>>>>>>> + * Valid levels are -2 through 4.
> >>>>>>>>>>       *
> >>>>>>>>>> - * Defaults to -1, or disabled. Userspace can only override
> >>>>>>>>>> this level after
> >>>>>>>>>> - * boot if it's set to auto.
> >>>>>>>>>> + *  -2: indicates that ABM should be controlled by DRM
> >>>>>>>>>> + property
> >>>>>>>>>> 'abm_level.
> >>>>>>>>>> + *  -1: indicates that ABM should be controlled by the sysfs file
> >>>>>>>>>> + *      'panel_power_savings'.
> >>>>>>>>>> + *   0: indicates that ABM should be disabled.
> >>>>>>>>>> + * 1-4: control the maximum allowable brightness reduction via
> >>>>>>>>>> + *      the ABM algorithm, with 1 being the least reduction and
> >>>>>>>>>> 4 being the most
> >>>>>>>>>> + *      reduction.
> >>>>>>>>>> + *
> >>>>>>>>>> + * Both the DRM property 'abm_level' and the sysfs file
> >>>>>>>>>> 'panel_power_savings'
> >>>>>>>>>> + * will only be available on supported hardware configurations.
> >>>>>>>>>> + *
> >>>>>>>>>> + * The default value is configured by kernel configuration
> >>>>>>>>>> option AMDGPU_ABM_POLICY
> >>>>>>>>>>       */
> >>>>>>>>>> -int amdgpu_dm_abm_level = -1;
> >>>>>>>>>> +int amdgpu_dm_abm_level = CONFIG_AMDGPU_ABM_POLICY;
> >>>>>>>>>>      MODULE_PARM_DESC(abmlevel,
> >>>>>>>>>> -         "ABM level (0 = off, 1-4 = backlight reduction level,
> >>>>>>>>>> -1 auto (default))");
> >>>>>>>>>> +         "ABM level (0 = off, 1-4 = backlight reduction
> >>>>>>>>>> + level,
> >>>>>>>>>> -1 = sysfs control, -2 = drm control");
> >>>>>>>>>>      module_param_named(abmlevel, amdgpu_dm_abm_level, int,
> 0444);
> >>>>>>>>>>      int amdgpu_backlight = -1; diff --git
> >>>>>>>>>> a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> >>>>>>>>>> b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> >>>>>>>>>> index b9ac3d2f8029..147fe744f82e 100644
> >>>>>>>>>> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> >>>>>>>>>> +++
> b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> >>>>>>>>>> @@ -6515,7 +6515,7 @@ static void
> >>>>>>>>>> amdgpu_dm_connector_unregister(struct drm_connector
> *connector)
> >>>>>>>>>>          struct amdgpu_dm_connector *amdgpu_dm_connector =
> >>>>>>>>>> to_amdgpu_dm_connector(connector);
> >>>>>>>>>>          if (connector->connector_type ==
> DRM_MODE_CONNECTOR_eDP &&
> >>>>>>>>>> -        amdgpu_dm_abm_level < 0)
> >>>>>>>>>> +        amdgpu_dm_abm_level == -1)
> >>>>>>>>>> sysfs_remove_group(&connector->kdev->kobj,
> &amdgpu_group);
> >>>>>>>>>> drm_dp_aux_unregister(&amdgpu_dm_connector-
> >dm_dp_aux.aux);
> >>>>>>>>>> @@ -6623,7 +6623,7 @@
> >>>>>>>>>> amdgpu_dm_connector_late_register(struct
> >>>>>>>>>> drm_connector *connector)
> >>>>>>>>>>          int r;
> >>>>>>>>>>          if (connector->connector_type ==
> DRM_MODE_CONNECTOR_eDP &&
> >>>>>>>>>> -        amdgpu_dm_abm_level < 0) {
> >>>>>>>>>> +        amdgpu_dm_abm_level == -1) {
> >>>>>>>>>>              r = sysfs_create_group(&connector->kdev->kobj,
> >>>>>>>>>>                             &amdgpu_group);
> >>>>>>>>>>              if (r)
> >>>>>>>>>> @@ -7654,7 +7654,7 @@ void
> >>>>>>>>>> amdgpu_dm_connector_init_helper(struct
> >>>>>>>>>> amdgpu_display_manager *dm,
> >>>>>>>>>>          if (connector_type == DRM_MODE_CONNECTOR_eDP &&
> >>>>>>>>>>              (dc_is_dmcu_initialized(adev->dm.dc) ||
> >>>>>>>>>> -         adev->dm.dc->ctx->dmub_srv) && amdgpu_dm_abm_level
> < 0) {
> >>>>>>>>>> +         adev->dm.dc->ctx->dmub_srv) && amdgpu_dm_abm_level
> >>>>>>>>>> + ==
> >>>>>>>>>> -2) {
> >>>>>>>>>> drm_object_attach_property(&aconnector->base.base,
> >>>>>>>>>> adev->mode_info.abm_level_property, 0);
> >>>>>>>>>>          }





[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux