platform-driver-x86.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Hans de Goede <hdegoede@redhat.com>
To: "Daniel Dadap" <ddadap@nvidia.com>,
	"Ben Skeggs" <bskeggs@redhat.com>,
	"Karol Herbst" <kherbst@redhat.com>, Lyude <lyude@redhat.com>,
	"Maarten Lankhorst" <maarten.lankhorst@linux.intel.com>,
	"Maxime Ripard" <mripard@kernel.org>,
	"Thomas Zimmermann" <tzimmermann@suse.de>,
	"Jani Nikula" <jani.nikula@linux.intel.com>,
	"Joonas Lahtinen" <joonas.lahtinen@linux.intel.com>,
	"Rodrigo Vivi" <rodrigo.vivi@intel.com>,
	"Tvrtko Ursulin" <tvrtko.ursulin@linux.intel.com>,
	"Alex Deucher" <alexander.deucher@amd.com>,
	"Christian König" <christian.koenig@amd.com>,
	Xinhui <Xinhui.Pan@amd.com>,
	"Rafael J . Wysocki" <rafael@kernel.org>,
	"Mika Westerberg" <mika.westerberg@linux.intel.com>,
	"Lukas Wunner" <lukas@wunner.de>,
	"Mark Gross" <markgross@kernel.org>,
	"Andy Shevchenko" <andy@kernel.org>
Cc: nouveau@lists.freedesktop.org, Daniel Vetter <daniel@ffwll.ch>,
	David Airlie <airlied@linux.ie>,
	intel-gfx <intel-gfx@lists.freedesktop.org>,
	dri-devel@lists.freedesktop.org, amd-gfx@lists.freedesktop.org,
	Len Brown <lenb@kernel.org>,
	linux-acpi@vger.kernel.org, platform-driver-x86@vger.kernel.org
Subject: Re: [PATCH v2 01/29] ACPI: video: Add acpi_video_backlight_use_native() helper
Date: Tue, 2 Aug 2022 13:31:41 +0200	[thread overview]
Message-ID: <331ebd23-d2a4-bb33-5462-b9bd3284ab69@redhat.com> (raw)
In-Reply-To: <20e4ffcf-2a3a-e671-5f98-1602b78df3cb@nvidia.com>

Hi Daniel,

On 7/21/22 23:30, Daniel Dadap wrote:
> 
> On 7/21/22 16:24, Daniel Dadap wrote:
>>
>> On 7/12/22 14:38, Hans de Goede wrote:
>>> ATM on x86 laptops where we want userspace to use the acpi_video backlight
>>> device we often register both the GPU's native backlight device and
>>> acpi_video's firmware acpi_video# backlight device. This relies on
>>> userspace preferring firmware type backlight devices over native ones, but
>>> registering 2 backlight devices for a single display really is undesirable.
>>>
>>> On x86 laptops where the native GPU backlight device should be used,
>>> the registering of other backlight devices is avoided by their drivers
>>> using acpi_video_get_backlight_type() and only registering their backlight
>>> if the return value matches their type.
>>>
>>> acpi_video_get_backlight_type() uses
>>> backlight_device_get_by_type(BACKLIGHT_RAW) to determine if a native
>>> driver is available and will never return native if this returns
>>> false. This means that the GPU's native backlight registering code
>>> cannot just call acpi_video_get_backlight_type() to determine if it
>>> should register its backlight, since acpi_video_get_backlight_type() will
>>> never return native until the native backlight has already registered.
>>>
>>> To fix this add a new internal native function parameter to
>>> acpi_video_get_backlight_type(), which when set to true will make
>>> acpi_video_get_backlight_type() behave as if a native backlight has
>>> already been registered.
>>>
>>> And add a new acpi_video_backlight_use_native() helper, which sets this
>>> to true, for use in native GPU backlight code.
>>>
>>> Changes in v2:
>>> - Replace adding a native parameter to acpi_video_get_backlight_type() with
>>>    adding a new acpi_video_backlight_use_native() helper.
>>>
>>> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
>>> ---
>>>   drivers/acpi/video_detect.c | 24 ++++++++++++++++++++----
>>>   include/acpi/video.h        |  5 +++++
>>>   2 files changed, 25 insertions(+), 4 deletions(-)
>>>
>>> diff --git a/drivers/acpi/video_detect.c b/drivers/acpi/video_detect.c
>>> index becc198e4c22..4346c990022d 100644
>>> --- a/drivers/acpi/video_detect.c
>>> +++ b/drivers/acpi/video_detect.c
>>> @@ -17,8 +17,9 @@
>>>    * Otherwise vendor specific drivers like thinkpad_acpi, asus-laptop,
>>>    * sony_acpi,... can take care about backlight brightness.
>>>    *
>>> - * Backlight drivers can use acpi_video_get_backlight_type() to determine
>>> - * which driver should handle the backlight.
>>> + * Backlight drivers can use acpi_video_get_backlight_type() to determine which
>>> + * driver should handle the backlight. RAW/GPU-driver backlight drivers must
>>> + * use the acpi_video_backlight_use_native() helper for this.
>>>    *
>>>    * If CONFIG_ACPI_VIDEO is neither set as "compiled in" (y) nor as a module (m)
>>>    * this file will not be compiled and acpi_video_get_backlight_type() will
>>> @@ -548,9 +549,10 @@ static int acpi_video_backlight_notify(struct notifier_block *nb,
>>>    * Arguably the native on win8 check should be done first, but that would
>>>    * be a behavior change, which may causes issues.
>>>    */
>>> -enum acpi_backlight_type acpi_video_get_backlight_type(void)
>>> +static enum acpi_backlight_type __acpi_video_get_backlight_type(bool native)
>>>   {
>>>       static DEFINE_MUTEX(init_mutex);
>>> +    static bool native_available;
>>>       static bool init_done;
>>>       static long video_caps;
>>>   @@ -570,6 +572,8 @@ enum acpi_backlight_type acpi_video_get_backlight_type(void)
>>>               backlight_notifier_registered = true;
>>>           init_done = true;
>>>       }
>>> +    if (native)
>>> +        native_available = true;
>>>       mutex_unlock(&init_mutex);
>>>         if (acpi_backlight_cmdline != acpi_backlight_undef)
>>> @@ -581,13 +585,25 @@ enum acpi_backlight_type acpi_video_get_backlight_type(void)
>>>       if (!(video_caps & ACPI_VIDEO_BACKLIGHT))
>>>           return acpi_backlight_vendor;
>>>   -    if (acpi_osi_is_win8() && backlight_device_get_by_type(BACKLIGHT_RAW))
>>> +    if (acpi_osi_is_win8() &&
>>> +        (native_available || backlight_device_get_by_type(BACKLIGHT_RAW)))
>>>           return acpi_backlight_native;
>>>         return acpi_backlight_video;
>>
>>
>> So I ran into a minor problem when testing the NVIDIA proprietary driver against this change set, after checking acpi_video_backlight_use_native() before registering the NVIDIA proprietary driver's backlight handler. Namely, for the case where a user installs the NVIDIA proprietary driver after the video.ko has already registered its backlight handler, we end up with both the firmware and native handlers registered simultaneously, since the ACPI video driver no longer unregisters its backlight handler. In this state, desktop environments end up preferring the registered but non-functional firmware handler from video.ko. (Manually twiddling the sysfs interface for the native NVIDIA handler works fine.) When rebooting the system after installing the NVIDIA proprietary driver, it is able to register its native handler before the delayed work to register the ACPI video backlight handler fires, so we end up with only one (native) handler, and userspace is happy.
>>
>> Maybe this will be moot later on, when the existing sysfs interface is deprecated, and it probably isn't a huge deal, since a reboot fixes things (I imagine installing an in-tree DRM/KMS driver on an already running kernel isn't really a thing, which is why this isn't a problem with the in-tree drivers), but would it make sense to unregister the ACPI video backlight handler here before returning acpi_backlight_native? That way, we'll briefly end up with zero backlight handlers rather than briefly ending up with two of them. Not sure if that's really any better, though.
>>
> 
> Thinking about this a little more, maybe it's better not to overly complicate things, and just assert that users of the NVIDIA proprietary driver will need to reboot after installation in order to get the backlight working, at least until we get further along in this effort and the backlight interface transitions to the DRM connector property you have proposed.

Right, this series stops unregistering the acpi_video# /sys/class/backlight
devices because the idea is to never register them in the first place.

Registering them in the first place causes 2 problems:

1. It causes userspace to see udev events for the register + unregister
and by the time the systemd backlight level save/restore helper runs
from udev the unregister has already happened and it logs ugly errors.
More in general this kinda racy behavior just is ugly.

2. On some hw merely registering the backlight device, which I think
at least tries to retrieve the current level through ACPI, is causing
issues. So now we have DMI quirks to force the native backlight on
some devices, even though the heuristics also say native eventually,
just to avoid the race. Avoiding the add + remove dance allows
us to drop a bunch of quirks and likely also fixes issues on other
devices which we don't yet know need the quirk.


So this patch-set changes the acpi_video.c code to no longer register
the acpi_video# backlight devices at init time *at all*. Instead native
drivers are supposed to now call acpi_video_register_backlight()
when they have found an internal panel. But to avoid this causing
the acpi_video# backlight devices to not show up at all in some
cases (e.g. native kms drivers blacklisted) the acpi_video code
also calls acpi_video_register_backlight() itself after 8 seconds.

I believe this is what you are hitting, the 8 seconds have passed
before the nvidia driver calls acpi_video_backlight_use_native(),
so the acpi_video# backlight devices have registered (and no longer
go away).

This is not only a problem when installing the nvidia binary driver
for the first time. It can also be a problem if the binary driver
is not in the initrd and leaving the initrd takes longer then
8 seconds, say because of a diskcrypt password. So I believe that
this really can be a problem with the nvidia binary driver.

But I think this is easy to fix. We could make the 8 second
delay configurable by replacing the ACPI_VIDEO_REGISTER_BACKLIGHT_DELAY
define with a module-parameter; and we could make "0" as value mean
that acpi_video.c will never call acpi_video_register_backlight()
itself.

Since the various (also counting distor packaging) nvidia binary
driver installers already all modify the kernel commandline to
blacklist nouveau, then the installers can just also pass this
parameter and then acpi_video.c will never register the acpi_video#.

This does mean that the nvidia binary driver then must call
acpi_video_register_backlight() when an internal panel is found.

Note the current patches to amdgpu/nouveau skip the calling of
acpi_video_register_backlight() when
the acpi_video_backlight_use_native() call returns true and they
have registered their own backlight. But calling it always is ok
*as long as the driver is driving the laptops internal panel* !

acpi_video_register_backlight() contains:

       if (acpi_video_get_backlight_type() != acpi_backlight_video)
                return 0;

So calling it when a native backlight has already been registered
is a no-op.

Please let me know if the proposed solution works for you and
if you want me to make ACPI_VIDEO_REGISTER_BACKLIGHT_DELAY a
module-option for the next version.

Regards,

Hans


p.s.

I think that eventually I might even try to make the new
module-param default to 0 / default to not having acpi_video.c
do the registering itself ever and see how that goes...




>>>   }
>>> +
>>> +enum acpi_backlight_type acpi_video_get_backlight_type(void)
>>> +{
>>> +    return __acpi_video_get_backlight_type(false);
>>> +}
>>>   EXPORT_SYMBOL(acpi_video_get_backlight_type);
>>>   +bool acpi_video_backlight_use_native(void)
>>> +{
>>> +    return __acpi_video_get_backlight_type(true) == acpi_backlight_native;
>>> +}
>>> +EXPORT_SYMBOL(acpi_video_backlight_use_native);
>>> +
>>>   /*
>>>    * Set the preferred backlight interface type based on DMI info.
>>>    * This function allows DMI blacklists to be implemented by external
>>> diff --git a/include/acpi/video.h b/include/acpi/video.h
>>> index db8548ff03ce..4705e339c252 100644
>>> --- a/include/acpi/video.h
>>> +++ b/include/acpi/video.h
>>> @@ -56,6 +56,7 @@ extern void acpi_video_unregister(void);
>>>   extern int acpi_video_get_edid(struct acpi_device *device, int type,
>>>                      int device_id, void **edid);
>>>   extern enum acpi_backlight_type acpi_video_get_backlight_type(void);
>>> +extern bool acpi_video_backlight_use_native(void);
>>>   extern void acpi_video_set_dmi_backlight_type(enum acpi_backlight_type type);
>>>   /*
>>>    * Note: The value returned by acpi_video_handles_brightness_key_presses()
>>> @@ -77,6 +78,10 @@ static inline enum acpi_backlight_type acpi_video_get_backlight_type(void)
>>>   {
>>>       return acpi_backlight_vendor;
>>>   }
>>> +static inline bool acpi_video_backlight_use_native(void)
>>> +{
>>> +    return true;
>>> +}
>>>   static inline void acpi_video_set_dmi_backlight_type(enum acpi_backlight_type type)
>>>   {
>>>   }
> 


  reply	other threads:[~2022-08-02 11:31 UTC|newest]

Thread overview: 58+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-07-12 19:38 [PATCH v2 00/29] drm/kms: Stop registering multiple /sys/class/backlight devs for a single display Hans de Goede
2022-07-12 19:38 ` [PATCH v2 01/29] ACPI: video: Add acpi_video_backlight_use_native() helper Hans de Goede
2022-07-21 21:24   ` Daniel Dadap
2022-07-21 21:30     ` Daniel Dadap
2022-08-02 11:31       ` Hans de Goede [this message]
2022-08-02 16:49         ` Daniel Dadap
2022-08-17 15:05           ` Hans de Goede
2022-08-17 20:18             ` Daniel Dadap
2022-08-24 11:08               ` Hans de Goede
2022-07-12 19:38 ` [PATCH v2 02/29] drm/i915: Don't register backlight when another backlight should be used Hans de Goede
2022-07-12 19:38 ` [PATCH v2 03/29] drm/amdgpu: " Hans de Goede
2022-07-20 16:44   ` Alex Deucher
2022-07-20 16:46     ` Alex Deucher
2022-08-17 13:05       ` Hans de Goede
2022-07-12 19:38 ` [PATCH v2 04/29] drm/radeon: " Hans de Goede
2022-07-20 16:45   ` Alex Deucher
2022-07-12 19:38 ` [PATCH v2 05/29] drm/nouveau: " Hans de Goede
2022-07-14 21:04   ` Lyude Paul
2022-07-12 19:38 ` [PATCH v2 06/29] ACPI: video: Drop backlight_device_get_by_type() call from acpi_video_get_backlight_type() Hans de Goede
2022-07-12 19:38 ` [PATCH v2 07/29] ACPI: video: Remove acpi_video_bus from list before tearing it down Hans de Goede
2022-07-12 19:38 ` [PATCH v2 08/29] ACPI: video: Simplify acpi_video_unregister_backlight() Hans de Goede
2022-07-12 19:38 ` [PATCH v2 09/29] ACPI: video: Make backlight class device registration a separate step Hans de Goede
2022-07-20 16:50   ` Alex Deucher
2022-07-12 19:38 ` [PATCH v2 10/29] ACPI: video: Remove code to unregister acpi_video backlight when a native backlight registers Hans de Goede
2022-07-12 19:38 ` [PATCH v2 11/29] drm/i915: Call acpi_video_register_backlight() (v2) Hans de Goede
2022-07-12 19:38 ` [PATCH v2 12/29] drm/nouveau: Register ACPI video backlight when nv_backlight registration fails Hans de Goede
2022-07-12 19:38 ` [PATCH v2 13/29] drm/amdgpu: Register ACPI video backlight when skipping amdgpu backlight registration Hans de Goede
2022-07-20 16:53   ` Alex Deucher
2022-07-12 19:38 ` [PATCH v2 14/29] drm/radeon: Register ACPI video backlight when skipping radeon " Hans de Goede
2022-07-20 16:54   ` Alex Deucher
2022-07-12 19:38 ` [PATCH v2 15/29] ACPI: video: Refactor acpi_video_get_backlight_type() a bit Hans de Goede
2022-07-12 19:38 ` [PATCH v2 16/29] ACPI: video: Add Nvidia WMI EC brightness control detection Hans de Goede
2022-07-12 20:13   ` Daniel Dadap
2022-07-15 11:59     ` Hans de Goede
2022-07-15 15:32       ` Daniel Dadap
2022-07-15 16:04         ` Hans de Goede
2022-08-17 12:22       ` Hans de Goede
2022-08-17 16:57         ` Daniel Dadap
2022-07-12 19:38 ` [PATCH v2 17/29] ACPI: video: Add Apple GMUX " Hans de Goede
2022-07-12 19:38 ` [PATCH v2 18/29] platform/x86: apple-gmux: Stop calling acpi/video.h functions Hans de Goede
2022-07-12 19:39 ` [PATCH v2 19/29] platform/x86: toshiba_acpi: Stop using acpi_video_set_dmi_backlight_type() Hans de Goede
2022-07-12 19:39 ` [PATCH v2 20/29] platform/x86: acer-wmi: Move backlight DMI quirks to acpi/video_detect.c Hans de Goede
2022-07-12 20:24   ` Daniel Dadap
2022-07-15 12:01     ` Hans de Goede
2022-07-12 19:39 ` [PATCH v2 21/29] platform/x86: asus-wmi: Drop DMI chassis-type check from backlight handling Hans de Goede
2022-07-12 19:39 ` [PATCH v2 22/29] platform/x86: asus-wmi: Move acpi_backlight=vendor quirks to ACPI video_detect.c Hans de Goede
2022-07-12 19:39 ` [PATCH v2 23/29] platform/x86: asus-wmi: Move acpi_backlight=native " Hans de Goede
2022-07-12 19:39 ` [PATCH v2 24/29] platform/x86: samsung-laptop: Move acpi_backlight=[vendor|native] " Hans de Goede
2022-07-12 19:39 ` [PATCH v2 25/29] ACPI: video: Remove acpi_video_set_dmi_backlight_type() Hans de Goede
2022-07-12 19:39 ` [PATCH v2 26/29] ACPI: video: Drop "Samsung X360" acpi_backlight=native quirk Hans de Goede
2022-07-12 19:39 ` [PATCH v2 27/29] ACPI: video: Drop Clevo/TUXEDO NL5xRU and NL5xNU acpi_backlight=native quirks Hans de Goede
2022-07-13 17:07   ` Werner Sembach
2022-07-13 17:21     ` Limonciello, Mario
2022-07-14 19:43       ` Hans de Goede
2022-07-12 19:39 ` [PATCH v2 28/29] ACPI: video: Fix indentation of video_detect_dmi_table[] entries Hans de Goede
2022-07-12 19:39 ` [PATCH v2 29/29] drm/todo: Add entry about dealing with brightness control on devices with > 1 panel Hans de Goede
2022-07-14 18:42 ` [PATCH v2 00/29] drm/kms: Stop registering multiple /sys/class/backlight devs for a single display Rafael J. Wysocki
2022-07-14 21:49 ` Lyude Paul

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=331ebd23-d2a4-bb33-5462-b9bd3284ab69@redhat.com \
    --to=hdegoede@redhat.com \
    --cc=Xinhui.Pan@amd.com \
    --cc=airlied@linux.ie \
    --cc=alexander.deucher@amd.com \
    --cc=amd-gfx@lists.freedesktop.org \
    --cc=andy@kernel.org \
    --cc=bskeggs@redhat.com \
    --cc=christian.koenig@amd.com \
    --cc=daniel@ffwll.ch \
    --cc=ddadap@nvidia.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=jani.nikula@linux.intel.com \
    --cc=joonas.lahtinen@linux.intel.com \
    --cc=kherbst@redhat.com \
    --cc=lenb@kernel.org \
    --cc=linux-acpi@vger.kernel.org \
    --cc=lukas@wunner.de \
    --cc=lyude@redhat.com \
    --cc=maarten.lankhorst@linux.intel.com \
    --cc=markgross@kernel.org \
    --cc=mika.westerberg@linux.intel.com \
    --cc=mripard@kernel.org \
    --cc=nouveau@lists.freedesktop.org \
    --cc=platform-driver-x86@vger.kernel.org \
    --cc=rafael@kernel.org \
    --cc=rodrigo.vivi@intel.com \
    --cc=tvrtko.ursulin@linux.intel.com \
    --cc=tzimmermann@suse.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).