asle_set_backlight() needs to accept backlight request only if the
firmware controls the backlight. It used the following expression for
this purpose:
acpi_video_get_backlight_type() == acpi_backlight_native
This expression works well in practice, but has two semantic problems.
One is that it actually determines if a backlight device which directly
modifies hardware registers ("native backlight") exists. It is possible
that a device which does not have backlight at all incorrectly triggers
asle_set_backlight(), and the expression does not cover such a case.
Another problem is that acpi_video_get_backlight_type() always return
acpi_backlight_vendor in reality if CONFIG_ACPI_VIDEO is unset. It
means even its ability to determine the existence of native backlight is
somewhat limited.
This change introduces a new function backlight_device_non_raw_exists(),
which returns if the firmware is controlling the backlight, and is
always available if backlight support is enabled.
Signed-off-by: Akihiko Odaki <redacted>
---
drivers/gpu/drm/i915/display/intel_opregion.c | 3 ++-
drivers/video/backlight/backlight.c | 18 ++++++++++++++++++
include/linux/backlight.h | 1 +
3 files changed, 21 insertions(+), 1 deletion(-)
@@ -2,6 +2,7 @@#ifndef __ACPI_VIDEO_H#define __ACPI_VIDEO_H+#include<linux/bits.h> /* for BIT */#include<linux/errno.h> /* for ENODEV */#include<linux/types.h> /* for bool */
@@ -387,7 +387,7 @@ static int acpi_fujitsu_bl_add(struct acpi_device *device)structfujitsu_bl*priv;intret;-if(acpi_video_get_backlight_type()!=acpi_backlight_vendor)+if(!(acpi_video_get_backlight_types()&ACPI_BACKLIGHT_VENDOR))return-ENODEV;priv=devm_kzalloc(&device->dev,sizeof(*priv),GFP_KERNEL);
@@ -819,7 +819,7 @@ static int acpi_fujitsu_laptop_add(struct acpi_device *device)/* Sync backlight power status */if(fujitsu_bl&&fujitsu_bl->bl_device&&-acpi_video_get_backlight_type()==acpi_backlight_vendor){+(acpi_video_get_backlight_types()&ACPI_BACKLIGHT_VENDOR)){if(call_fext_func(fext,FUNC_BACKLIGHT,0x2,BACKLIGHT_PARAM_POWER,0x0)==BACKLIGHT_OFF)fujitsu_bl->bl_device->props.power=FB_BLANK_POWERDOWN;
@@ -1633,7 +1633,7 @@ static int ideapad_acpi_add(struct platform_device *pdev)dev_info(&pdev->dev,"DYTC interface is not available\n");}-if(acpi_video_get_backlight_type()==acpi_backlight_vendor){+if((acpi_video_get_backlight_types()&ACPI_BACKLIGHT_VENDOR)){err=ideapad_backlight_init(priv);if(err&&err!=-ENODEV)gotobacklight_failed;
@@ -3201,7 +3201,7 @@ static int sony_nc_add(struct acpi_device *device)sony_nc_function_setup(device,sony_pf_device);}-if(acpi_video_get_backlight_type()==acpi_backlight_vendor)+if((acpi_video_get_backlight_types()&ACPI_BACKLIGHT_VENDOR))sony_nc_backlight_setup();/* create sony_pf sysfs attributes related to the SNC device */
@@ -3547,7 +3547,7 @@ static int __init hotkey_init(struct ibm_init_struct *iibm)/* Do not issue duplicate brightness change events to*userspace.tpacpi_detect_brightness_capabilities()musthave*beencalledbeforethispoint*/-if(acpi_video_get_backlight_type()!=acpi_backlight_vendor){+if(!(acpi_video_get_backlight_types()&ACPI_BACKLIGHT_VENDOR)){pr_info("This ThinkPad has standard ACPI backlight brightness control, supported by the ACPI video driver\n");pr_notice("Disabling thinkpad-acpi brightness events by default...\n");
@@ -6983,7 +6983,7 @@ static int __init brightness_init(struct ibm_init_struct *iibm)return-ENODEV;}-if(acpi_video_get_backlight_type()!=acpi_backlight_vendor){+if(!(acpi_video_get_backlight_types()&ACPI_BACKLIGHT_VENDOR)){if(brightness_enable>1){pr_info("Standard ACPI backlight interface available, not loading native one\n");return-ENODEV;
Commit 2600bfa3df99 ("ACPI: video: Add acpi_video_backlight_use_native()
helper") and following commits made native backlight unavailable if
CONFIG_ACPI_VIDEO is set and the backlight feature of ACPI video is
unavailable, which broke the backlight functionality on Lenovo ThinkPad
C13 Yoga Chromebook. Allow to fall back to native backlight in such
cases.
Signed-off-by: Akihiko Odaki <redacted>
---
drivers/acpi/video_detect.c | 4 ++--
include/acpi/video.h | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
@@ -732,8 +732,8 @@ static int __acpi_video_get_backlight_types(bool native)returnACPI_BACKLIGHT_VIDEO;}-/* No ACPI video (old hw), use vendor specific fw methods. */-returnACPI_BACKLIGHT_VENDOR;+/* No ACPI video, use native or vendor specific fw methods. */+returnACPI_BACKLIGHT_VENDOR|ACPI_BACKLIGHT_NATIVE;}intacpi_video_get_backlight_types(void)
From: Jani Nikula <jani.nikula@linux.intel.com> Date: 2022-10-24 12:05:44
On Mon, 24 Oct 2022, Akihiko Odaki [off-list ref] wrote:
Commit 2600bfa3df99 ("ACPI: video: Add acpi_video_backlight_use_native()
helper") and following commits made native backlight unavailable if
CONFIG_ACPI_VIDEO is set and the backlight feature of ACPI video is
unavailable, which broke the backlight functionality on Lenovo ThinkPad
C13 Yoga Chromebook. Allow to fall back to native backlight in such
cases.
Where's the bug report with relevant logs, kconfigs, etc?
BR,
Jani.
acpi_video_get_backlight_type() is deprecated and now there is
no user of it.
Signed-off-by: Akihiko Odaki <redacted>
---
Documentation/gpu/todo.rst | 8 +++----
drivers/acpi/video_detect.c | 46 +++++++++++++++++++------------------
include/acpi/video.h | 31 +++++++------------------
3 files changed, 36 insertions(+), 49 deletions(-)
@@ -687,7 +687,7 @@ On x86/ACPI devices there can be multiple backlight firmware interfaces: register programming by the KMS driver. To deal with this backlight drivers used on x86/ACPI call-acpi_video_get_backlight_type() which has heuristics (+quirks) to select+acpi_video_get_backlight_types() which has heuristics (+quirks) to select which backlight interface to use; and backlight drivers which do not match the returned type will not register themselves, so that only one backlight device gets registered (in a single GPU setup, see below).
@@ -696,7 +696,7 @@ At the moment this more or less assumes that there will only be 1 (internal) panel on a system. On systems with 2 panels this may be a problem, depending on-what interface acpi_video_get_backlight_type() selects:+what interface acpi_video_get_backlight_types() selects:1. native: in this case the KMS driver is expected to know which backlight device belongs to which output so everything should just work.
@@ -708,11 +708,11 @@ Things will break on systems with multiple panels where the 2 panels need a different type of control. E.g. one panel needs ACPI video backlight control, where as the other is using native backlight control. Currently in this case only one of the 2 required backlight devices will get registered, based on-the acpi_video_get_backlight_type() return value.+the acpi_video_get_backlight_types() return value. If this (theoretical) case ever shows up, then supporting this will need some work. A possible solution here would be to pass a device and connector-name-to acpi_video_get_backlight_type() so that it can deal with this.+to acpi_video_get_backlight_types() so that it can deal with this. Note in a way we already have a case where userspace sees 2 panels, in dual GPU laptop setups with a mux. On those systems we may see
@@ -699,19 +701,19 @@ static enum acpi_backlight_type __acpi_video_get_backlight_type(bool native)*Thebelowheuristics/detectionstepsareinorderofdescending*presedence.Thecommandlinetakespresedenceoveranythingelse.*/-if(acpi_backlight_cmdline!=acpi_backlight_undef)+if(acpi_backlight_cmdline!=ACPI_BACKLIGHT_UNDEF)returnacpi_backlight_cmdline;/* DMI quirks override any autodetection. */-if(acpi_backlight_dmi!=acpi_backlight_undef)+if(acpi_backlight_dmi!=ACPI_BACKLIGHT_UNDEF)returnacpi_backlight_dmi;/* Special cases such as nvidia_wmi_ec and apple gmux. */if(nvidia_wmi_ec_present)-returnacpi_backlight_nvidia_wmi_ec;+returnACPI_BACKLIGHT_NVIDIA_WMI_EC;if(apple_gmux_present())-returnacpi_backlight_apple_gmux;+returnACPI_BACKLIGHT_APPLE_GMUX;/* On systems with ACPI video use either native or ACPI video. */if(video_caps&ACPI_VIDEO_BACKLIGHT){
@@ -725,23 +727,23 @@ static enum acpi_backlight_type __acpi_video_get_backlight_type(bool native)*isusuallynotthebestchoice.*/if(acpi_osi_is_win8()&&native_available)-returnacpi_backlight_native;+returnACPI_BACKLIGHT_NATIVE;else-returnacpi_backlight_video;+returnACPI_BACKLIGHT_VIDEO;}/* No ACPI video (old hw), use vendor specific fw methods. */-returnacpi_backlight_vendor;+returnACPI_BACKLIGHT_VENDOR;}-enumacpi_backlight_typeacpi_video_get_backlight_type(void)+intacpi_video_get_backlight_types(void){-return__acpi_video_get_backlight_type(false);+return__acpi_video_get_backlight_types(false);}-EXPORT_SYMBOL(acpi_video_get_backlight_type);+EXPORT_SYMBOL(acpi_video_get_backlight_types);boolacpi_video_backlight_use_native(void){-return__acpi_video_get_backlight_type(true)==acpi_backlight_native;+return!!(__acpi_video_get_backlight_types(true)&ACPI_BACKLIGHT_NATIVE);}EXPORT_SYMBOL(acpi_video_backlight_use_native);
On Mon, 24 Oct 2022, Akihiko Odaki [off-list ref] wrote:
quoted
Commit 2600bfa3df99 ("ACPI: video: Add acpi_video_backlight_use_native()
helper") and following commits made native backlight unavailable if
CONFIG_ACPI_VIDEO is set and the backlight feature of ACPI video is
unavailable, which broke the backlight functionality on Lenovo ThinkPad
C13 Yoga Chromebook. Allow to fall back to native backlight in such
cases.
Where's the bug report with relevant logs, kconfigs, etc?
I haven't filed one. Should I? Please tell me where to report and what
information you would need (to bugzilla.kernel.org with things mentioned
in Documentation/admin-guide/reporting-issues.rst?)
Regards,
Akihiko Odaki
From: Hans de Goede <hidden> Date: 2022-10-24 14:52:06
Hi,
On 10/24/22 14:58, Akihiko Odaki wrote:
On 2022/10/24 20:53, Hans de Goede wrote:
quoted
Hi Akihiko,
On 10/24/22 13:34, Akihiko Odaki wrote:
quoted
Commit 2600bfa3df99 ("ACPI: video: Add acpi_video_backlight_use_native()
helper") and following commits made native backlight unavailable if
CONFIG_ACPI_VIDEO is set and the backlight feature of ACPI video is
unavailable, which broke the backlight functionality on Lenovo ThinkPad
C13 Yoga Chromebook. Allow to fall back to native backlight in such
cases.
I appreciate your work on this, but what this in essence does is
it allows 2 backlight drivers (vendor + native) to get registered
for the same panel again. While the whole goal of the backlight refactor
series landing in 6.1 was to make it so that there always is only
*1* backlight device registered instead of (possibly) registering
multiple and letting userspace figure it out. It is also important
to only always have 1 backlight device per panel for further
upcoming changes.
So nack for this solution, sorry.
I am aware that this breaks backlight control on some Chromebooks,
this was already reported and I wrote a long reply explaining why
things are done the way they are done now and also suggesting
2 possible (much simpler) fixes, see:
https://lore.kernel.org/linux-acpi/42a5f2c9-a1dc-8fc0-7334-fe6c390ecfbb@redhat.com/
Unfortunately the reported has not followed-up on this and
I don't have the hardware to test this myself.
Can you please try implementing 1 of the fixes suggested there
and then submit that upstream ?
Regards,
Hans
Hi Hans,
Thanks for reviewing and letting me know the prior attempt.
In this case, there is only a native backlight device and no vendor backlight device so the duplication of backlight devices does not happen. I think it is better to handle such a case without quirks.
Adding a single heuristic for all chromebooks is something completely different
then adding per model quirks which indeed ideally should be avoided (but this
is not always possible).
I understand it is still questionable to cover the case by allowing duplication when both of a vendor backlight device and native one. To explain my understanding and reasoning for *not* trying to apply the de-duplication rule to the vendor/native combination, let me first describe that the de-duplication which happens in acpi_video_get_backlight_type() is a heuristics and limited.
As the background of acpi_video_get_backlight_type(), there is an assumption that it should be common that both of the firmware, implementing ACPI, and the kernel have code to drive backlight. In the case, the more reliable one should be picked instead of using both, and that is what the statements in `if (video_caps & ACPI_VIDEO_BACKLIGHT)` does.
However, the method has two limitations:
1. It does not cover the case where two backlight devices with the same type exist.
This only happens when there are 2 panels; or 2 gpus driving a single panel
which are both special cases where we actually want 2 backlight devices.
2. The underlying assumption does not apply to vendor/native combination.
Regarding the second limitation, I don't even understand the difference between vendor and native. My guess is that a vendor backlight device uses vendor-specific ACPI interface, and a native one directly uses hardware registers. If my guess is correct, the difference between vendor and native does not imply that both of them are likely to exist at the same time. As the conclusion, there is no more motivation to try to de-duplicate the vendor/native combination than to try to de-duplicate combination of devices with a single type.
Of course, it is better if we could also avoid registering two devices with one type for one physical device. Possibly we can do so by providing a parameter to indicate that it is for the same "internal" backlight to devm_backlight_device_register(), and let the function check for the duplication. However, this rule may be too restrict, or may have problems I missed.
Based on the discussion above, we can deduce three possibilities:
a. There is no reason to distinguish vendor and native in this case, and we can stick to my current proposal.
b. There is a valid reason to distinguish vendor and native, and we can adopt the same strategy that already adopted for ACPI video/vendor combination.
c. We can implement de-duplication in devm_backlight_device_register().
d. The other possible options are not worth, and we can just implement quirks specific to Chromebook/coreboot.
In case b, it should be noted that vendor and native backlight device do not require ACPI video, and CONFIG_ACPI_VIDEO may not be enabled. In the case, the de-duplication needs to be implemented in backlight class device.
I have been working on the ACPI/x86 backlight detection code since 2015, please trust
me when I say that allowing both vendor + native backlight devices at the same time
is a bad idea.
I'm currently in direct contact with the ChromeOS team about fixing the Chromebook
backlight issue introduced in 6.1-rc1.
If you wan to help, please read:
https://lore.kernel.org/linux-acpi/42a5f2c9-a1dc-8fc0-7334-fe6c390ecfbb@redhat.com/
And try implementing 1 if the 2 solutions suggested there.
Regards,
Hans
Hi Akihiko,
On 10/24/22 13:34, Akihiko Odaki wrote:
quoted
Commit 2600bfa3df99 ("ACPI: video: Add
acpi_video_backlight_use_native()
helper") and following commits made native backlight unavailable if
CONFIG_ACPI_VIDEO is set and the backlight feature of ACPI video is
unavailable, which broke the backlight functionality on Lenovo
ThinkPad
C13 Yoga Chromebook. Allow to fall back to native backlight in such
cases.
I appreciate your work on this, but what this in essence does is
it allows 2 backlight drivers (vendor + native) to get registered
for the same panel again. While the whole goal of the backlight
refactor
series landing in 6.1 was to make it so that there always is only
*1* backlight device registered instead of (possibly) registering
multiple and letting userspace figure it out. It is also important
to only always have 1 backlight device per panel for further
upcoming changes.
So nack for this solution, sorry.
I am aware that this breaks backlight control on some Chromebooks,
this was already reported and I wrote a long reply explaining why
things are done the way they are done now and also suggesting
2 possible (much simpler) fixes, see:
https://lore.kernel.org/linux-acpi/42a5f2c9-a1dc-8fc0-7334-fe6c390ecfbb@redhat.com/
Unfortunately the reported has not followed-up on this and
I don't have the hardware to test this myself.
Can you please try implementing 1 of the fixes suggested there
and then submit that upstream ?
Regards,
Hans
Hi Hans,
Thanks for reviewing and letting me know the prior attempt.
In this case, there is only a native backlight device and no vendor
backlight device so the duplication of backlight devices does not
happen. I think it is better to handle such a case without quirks.
Adding a single heuristic for all chromebooks is something completely
different
then adding per model quirks which indeed ideally should be avoided
(but this
is not always possible).
quoted
I understand it is still questionable to cover the case by allowing
duplication when both of a vendor backlight device and native one. To
explain my understanding and reasoning for *not* trying to apply the
de-duplication rule to the vendor/native combination, let me first
describe that the de-duplication which happens in
acpi_video_get_backlight_type() is a heuristics and limited.
As the background of acpi_video_get_backlight_type(), there is an
assumption that it should be common that both of the firmware,
implementing ACPI, and the kernel have code to drive backlight. In
the case, the more reliable one should be picked instead of using
both, and that is what the statements in `if (video_caps &
ACPI_VIDEO_BACKLIGHT)` does.
However, the method has two limitations:
1. It does not cover the case where two backlight devices with the
same type exist.
This only happens when there are 2 panels; or 2 gpus driving a single
panel
which are both special cases where we actually want 2 backlight devices.
quoted
2. The underlying assumption does not apply to vendor/native
combination.
Regarding the second limitation, I don't even understand the
difference between vendor and native. My guess is that a vendor
backlight device uses vendor-specific ACPI interface, and a native
one directly uses hardware registers. If my guess is correct, the
difference between vendor and native does not imply that both of them
are likely to exist at the same time. As the conclusion, there is no
more motivation to try to de-duplicate the vendor/native combination
than to try to de-duplicate combination of devices with a single type.
Of course, it is better if we could also avoid registering two
devices with one type for one physical device. Possibly we can do so
by providing a parameter to indicate that it is for the same
"internal" backlight to devm_backlight_device_register(), and let the
function check for the duplication. However, this rule may be too
restrict, or may have problems I missed.
Based on the discussion above, we can deduce three possibilities:
a. There is no reason to distinguish vendor and native in this case,
and we can stick to my current proposal.
b. There is a valid reason to distinguish vendor and native, and we
can adopt the same strategy that already adopted for ACPI
video/vendor combination.
c. We can implement de-duplication in devm_backlight_device_register().
d. The other possible options are not worth, and we can just
implement quirks specific to Chromebook/coreboot.
In case b, it should be noted that vendor and native backlight device
do not require ACPI video, and CONFIG_ACPI_VIDEO may not be enabled.
In the case, the de-duplication needs to be implemented in backlight
class device.
I have been working on the ACPI/x86 backlight detection code since
2015, please trust
me when I say that allowing both vendor + native backlight devices at
the same time
is a bad idea.
I'm currently in direct contact with the ChromeOS team about fixing
the Chromebook
backlight issue introduced in 6.1-rc1.
If you wan to help, please read:
https://lore.kernel.org/linux-acpi/42a5f2c9-a1dc-8fc0-7334-fe6c390ecfbb@redhat.com/
And try implementing 1 if the 2 solutions suggested there.
Regards,
Hans
Hi,
I just wanted to confirm your intention that we should distinguish
vendor and native. In the case I think it is better to modify
__acpi_video_get_backlight_type() and add "native_available" check in
case of no ACPI video as already done for the ACPI video/native
combination.
Unfortunately this has one pitfall though: it does not work if
CONFIG_ACPI_VIDEO is disabled. If it is, acpi_video_get_backlight_type()
always return acpi_backlight_vendor, and
acpi_video_backlight_use_native() always returns true. It is not a
regression but the current behavior. Fixing it requires also refactoring
touching both of ACPI video and backlight class driver so I guess I'm
not an appropriate person to do that, and I should just add
"native_available" check to __acpi_video_get_backlight_type().
Does that sound good?
Well, it would not be that easy since just adding native_available
cannot handle the case where the vendor driver gets registered first.
Checking with "native_available" was possible for ACPI video/vendor
combination because ACPI video registers its backlight after some delay.
I still think it does not overcomplicate things to modify
__acpi_video_get_backlight_type() so that it can use both of vendor and
native as fallback while preventing duplicate registration.
Regards,
Akihiko Odaki
Hi Akihiko,
On 10/24/22 13:34, Akihiko Odaki wrote:
quoted
Commit 2600bfa3df99 ("ACPI: video: Add acpi_video_backlight_use_native()
helper") and following commits made native backlight unavailable if
CONFIG_ACPI_VIDEO is set and the backlight feature of ACPI video is
unavailable, which broke the backlight functionality on Lenovo ThinkPad
C13 Yoga Chromebook. Allow to fall back to native backlight in such
cases.
I appreciate your work on this, but what this in essence does is
it allows 2 backlight drivers (vendor + native) to get registered
for the same panel again. While the whole goal of the backlight refactor
series landing in 6.1 was to make it so that there always is only
*1* backlight device registered instead of (possibly) registering
multiple and letting userspace figure it out. It is also important
to only always have 1 backlight device per panel for further
upcoming changes.
So nack for this solution, sorry.
I am aware that this breaks backlight control on some Chromebooks,
this was already reported and I wrote a long reply explaining why
things are done the way they are done now and also suggesting
2 possible (much simpler) fixes, see:
https://lore.kernel.org/linux-acpi/42a5f2c9-a1dc-8fc0-7334-fe6c390ecfbb@redhat.com/
Unfortunately the reported has not followed-up on this and
I don't have the hardware to test this myself.
Can you please try implementing 1 of the fixes suggested there
and then submit that upstream ?
Regards,
Hans
Hi Hans,
Thanks for reviewing and letting me know the prior attempt.
In this case, there is only a native backlight device and no vendor
backlight device so the duplication of backlight devices does not
happen. I think it is better to handle such a case without quirks.
I understand it is still questionable to cover the case by allowing
duplication when both of a vendor backlight device and native one. To
explain my understanding and reasoning for *not* trying to apply the
de-duplication rule to the vendor/native combination, let me first
describe that the de-duplication which happens in
acpi_video_get_backlight_type() is a heuristics and limited.
As the background of acpi_video_get_backlight_type(), there is an
assumption that it should be common that both of the firmware,
implementing ACPI, and the kernel have code to drive backlight. In the
case, the more reliable one should be picked instead of using both, and
that is what the statements in `if (video_caps & ACPI_VIDEO_BACKLIGHT)`
does.
However, the method has two limitations:
1. It does not cover the case where two backlight devices with the same
type exist.
2. The underlying assumption does not apply to vendor/native combination.
Regarding the second limitation, I don't even understand the difference
between vendor and native. My guess is that a vendor backlight device
uses vendor-specific ACPI interface, and a native one directly uses
hardware registers. If my guess is correct, the difference between
vendor and native does not imply that both of them are likely to exist
at the same time. As the conclusion, there is no more motivation to try
to de-duplicate the vendor/native combination than to try to
de-duplicate combination of devices with a single type.
Of course, it is better if we could also avoid registering two devices
with one type for one physical device. Possibly we can do so by
providing a parameter to indicate that it is for the same "internal"
backlight to devm_backlight_device_register(), and let the function
check for the duplication. However, this rule may be too restrict, or
may have problems I missed.
Based on the discussion above, we can deduce three possibilities:
a. There is no reason to distinguish vendor and native in this case, and
we can stick to my current proposal.
b. There is a valid reason to distinguish vendor and native, and we can
adopt the same strategy that already adopted for ACPI video/vendor
combination.
c. We can implement de-duplication in devm_backlight_device_register().
d. The other possible options are not worth, and we can just implement
quirks specific to Chromebook/coreboot.
In case b, it should be noted that vendor and native backlight device do
not require ACPI video, and CONFIG_ACPI_VIDEO may not be enabled. In the
case, the de-duplication needs to be implemented in backlight class device.
Regards,
Akihiko Odaki
Hi Akihiko,
On 10/24/22 13:34, Akihiko Odaki wrote:
quoted
Commit 2600bfa3df99 ("ACPI: video: Add acpi_video_backlight_use_native()
helper") and following commits made native backlight unavailable if
CONFIG_ACPI_VIDEO is set and the backlight feature of ACPI video is
unavailable, which broke the backlight functionality on Lenovo ThinkPad
C13 Yoga Chromebook. Allow to fall back to native backlight in such
cases.
I appreciate your work on this, but what this in essence does is
it allows 2 backlight drivers (vendor + native) to get registered
for the same panel again. While the whole goal of the backlight refactor
series landing in 6.1 was to make it so that there always is only
*1* backlight device registered instead of (possibly) registering
multiple and letting userspace figure it out. It is also important
to only always have 1 backlight device per panel for further
upcoming changes.
So nack for this solution, sorry.
I am aware that this breaks backlight control on some Chromebooks,
this was already reported and I wrote a long reply explaining why
things are done the way they are done now and also suggesting
2 possible (much simpler) fixes, see:
https://lore.kernel.org/linux-acpi/42a5f2c9-a1dc-8fc0-7334-fe6c390ecfbb@redhat.com/
Unfortunately the reported has not followed-up on this and
I don't have the hardware to test this myself.
Can you please try implementing 1 of the fixes suggested there
and then submit that upstream ?
Regards,
Hans
Hi Hans,
Thanks for reviewing and letting me know the prior attempt.
In this case, there is only a native backlight device and no vendor backlight device so the duplication of backlight devices does not happen. I think it is better to handle such a case without quirks.
Adding a single heuristic for all chromebooks is something completely different
then adding per model quirks which indeed ideally should be avoided (but this
is not always possible).
quoted
I understand it is still questionable to cover the case by allowing duplication when both of a vendor backlight device and native one. To explain my understanding and reasoning for *not* trying to apply the de-duplication rule to the vendor/native combination, let me first describe that the de-duplication which happens in acpi_video_get_backlight_type() is a heuristics and limited.
As the background of acpi_video_get_backlight_type(), there is an assumption that it should be common that both of the firmware, implementing ACPI, and the kernel have code to drive backlight. In the case, the more reliable one should be picked instead of using both, and that is what the statements in `if (video_caps & ACPI_VIDEO_BACKLIGHT)` does.
However, the method has two limitations:
1. It does not cover the case where two backlight devices with the same type exist.
This only happens when there are 2 panels; or 2 gpus driving a single panel
which are both special cases where we actually want 2 backlight devices.
quoted
2. The underlying assumption does not apply to vendor/native combination.
Regarding the second limitation, I don't even understand the difference between vendor and native. My guess is that a vendor backlight device uses vendor-specific ACPI interface, and a native one directly uses hardware registers. If my guess is correct, the difference between vendor and native does not imply that both of them are likely to exist at the same time. As the conclusion, there is no more motivation to try to de-duplicate the vendor/native combination than to try to de-duplicate combination of devices with a single type.
Of course, it is better if we could also avoid registering two devices with one type for one physical device. Possibly we can do so by providing a parameter to indicate that it is for the same "internal" backlight to devm_backlight_device_register(), and let the function check for the duplication. However, this rule may be too restrict, or may have problems I missed.
Based on the discussion above, we can deduce three possibilities:
a. There is no reason to distinguish vendor and native in this case, and we can stick to my current proposal.
b. There is a valid reason to distinguish vendor and native, and we can adopt the same strategy that already adopted for ACPI video/vendor combination.
c. We can implement de-duplication in devm_backlight_device_register().
d. The other possible options are not worth, and we can just implement quirks specific to Chromebook/coreboot.
In case b, it should be noted that vendor and native backlight device do not require ACPI video, and CONFIG_ACPI_VIDEO may not be enabled. In the case, the de-duplication needs to be implemented in backlight class device.
I have been working on the ACPI/x86 backlight detection code since 2015, please trust
me when I say that allowing both vendor + native backlight devices at the same time
is a bad idea.
I'm currently in direct contact with the ChromeOS team about fixing the Chromebook
backlight issue introduced in 6.1-rc1.
If you wan to help, please read:
https://lore.kernel.org/linux-acpi/42a5f2c9-a1dc-8fc0-7334-fe6c390ecfbb@redhat.com/
And try implementing 1 if the 2 solutions suggested there.
Regards,
Hans
Hi,
I just wanted to confirm your intention that we should distinguish vendor and native. In the case I think it is better to modify __acpi_video_get_backlight_type() and add "native_available" check in case of no ACPI video as already done for the ACPI video/native combination.
Unfortunately this has one pitfall though: it does not work if CONFIG_ACPI_VIDEO is disabled. If it is, acpi_video_get_backlight_type() always return acpi_backlight_vendor, and acpi_video_backlight_use_native() always returns true. It is not a regression but the current behavior. Fixing it requires also refactoring touching both of ACPI video and backlight class driver so I guess I'm not an appropriate person to do that, and I should just add "native_available" check to __acpi_video_get_backlight_type().
Does that sound good?
Well, it would not be that easy since just adding native_available cannot handle the case where the vendor driver gets registered first. Checking with "native_available" was possible for ACPI video/vendor combination because ACPI video registers its backlight after some delay. I still think it does not overcomplicate things to modify __acpi_video_get_backlight_type() so that it can use both of vendor and native as fallback while preventing duplicate registration.
It should be the smaller indeed. Modifying
__acpi_video_get_backlight_type() so that it can fall back to either of
vendor and native requires all of the vendor drivers to use something
like acpi_video_backlight_use_native() but for vendor. It certainly
requires 22 patches.
That aside, the first patch in this series can be applied without the
later patches so you may have a look at it. It's fine if you don't merge
it though since it does not fix really a pragmatic bug as its message says.
Regards,
Akihiko Odaki
Hi Akihiko,
On 10/24/22 13:34, Akihiko Odaki wrote:
quoted
Commit 2600bfa3df99 ("ACPI: video: Add acpi_video_backlight_use_native()
helper") and following commits made native backlight unavailable if
CONFIG_ACPI_VIDEO is set and the backlight feature of ACPI video is
unavailable, which broke the backlight functionality on Lenovo ThinkPad
C13 Yoga Chromebook. Allow to fall back to native backlight in such
cases.
I appreciate your work on this, but what this in essence does is
it allows 2 backlight drivers (vendor + native) to get registered
for the same panel again. While the whole goal of the backlight refactor
series landing in 6.1 was to make it so that there always is only
*1* backlight device registered instead of (possibly) registering
multiple and letting userspace figure it out. It is also important
to only always have 1 backlight device per panel for further
upcoming changes.
So nack for this solution, sorry.
I am aware that this breaks backlight control on some Chromebooks,
this was already reported and I wrote a long reply explaining why
things are done the way they are done now and also suggesting
2 possible (much simpler) fixes, see:
https://lore.kernel.org/linux-acpi/42a5f2c9-a1dc-8fc0-7334-fe6c390ecfbb@redhat.com/
Unfortunately the reported has not followed-up on this and
I don't have the hardware to test this myself.
Can you please try implementing 1 of the fixes suggested there
and then submit that upstream ?
Regards,
Hans
Hi Hans,
Thanks for reviewing and letting me know the prior attempt.
In this case, there is only a native backlight device and no vendor backlight device so the duplication of backlight devices does not happen. I think it is better to handle such a case without quirks.
Adding a single heuristic for all chromebooks is something completely different
then adding per model quirks which indeed ideally should be avoided (but this
is not always possible).
quoted
I understand it is still questionable to cover the case by allowing duplication when both of a vendor backlight device and native one. To explain my understanding and reasoning for *not* trying to apply the de-duplication rule to the vendor/native combination, let me first describe that the de-duplication which happens in acpi_video_get_backlight_type() is a heuristics and limited.
As the background of acpi_video_get_backlight_type(), there is an assumption that it should be common that both of the firmware, implementing ACPI, and the kernel have code to drive backlight. In the case, the more reliable one should be picked instead of using both, and that is what the statements in `if (video_caps & ACPI_VIDEO_BACKLIGHT)` does.
However, the method has two limitations:
1. It does not cover the case where two backlight devices with the same type exist.
This only happens when there are 2 panels; or 2 gpus driving a single panel
which are both special cases where we actually want 2 backlight devices.
quoted
2. The underlying assumption does not apply to vendor/native combination.
Regarding the second limitation, I don't even understand the difference between vendor and native. My guess is that a vendor backlight device uses vendor-specific ACPI interface, and a native one directly uses hardware registers. If my guess is correct, the difference between vendor and native does not imply that both of them are likely to exist at the same time. As the conclusion, there is no more motivation to try to de-duplicate the vendor/native combination than to try to de-duplicate combination of devices with a single type.
Of course, it is better if we could also avoid registering two devices with one type for one physical device. Possibly we can do so by providing a parameter to indicate that it is for the same "internal" backlight to devm_backlight_device_register(), and let the function check for the duplication. However, this rule may be too restrict, or may have problems I missed.
Based on the discussion above, we can deduce three possibilities:
a. There is no reason to distinguish vendor and native in this case, and we can stick to my current proposal.
b. There is a valid reason to distinguish vendor and native, and we can adopt the same strategy that already adopted for ACPI video/vendor combination.
c. We can implement de-duplication in devm_backlight_device_register().
d. The other possible options are not worth, and we can just implement quirks specific to Chromebook/coreboot.
In case b, it should be noted that vendor and native backlight device do not require ACPI video, and CONFIG_ACPI_VIDEO may not be enabled. In the case, the de-duplication needs to be implemented in backlight class device.
I have been working on the ACPI/x86 backlight detection code since 2015, please trust
me when I say that allowing both vendor + native backlight devices at the same time
is a bad idea.
I'm currently in direct contact with the ChromeOS team about fixing the Chromebook
backlight issue introduced in 6.1-rc1.
If you wan to help, please read:
https://lore.kernel.org/linux-acpi/42a5f2c9-a1dc-8fc0-7334-fe6c390ecfbb@redhat.com/
And try implementing 1 if the 2 solutions suggested there.
Regards,
Hans
Hi,
I just wanted to confirm your intention that we should distinguish
vendor and native. In the case I think it is better to modify
__acpi_video_get_backlight_type() and add "native_available" check in
case of no ACPI video as already done for the ACPI video/native combination.
Unfortunately this has one pitfall though: it does not work if
CONFIG_ACPI_VIDEO is disabled. If it is, acpi_video_get_backlight_type()
always return acpi_backlight_vendor, and
acpi_video_backlight_use_native() always returns true. It is not a
regression but the current behavior. Fixing it requires also refactoring
touching both of ACPI video and backlight class driver so I guess I'm
not an appropriate person to do that, and I should just add
"native_available" check to __acpi_video_get_backlight_type().
Does that sound good?
Regards,
Akihiko Odaki
From: Jani Nikula <jani.nikula@linux.intel.com> Date: 2022-10-24 19:46:29
On Tue, 25 Oct 2022, Akihiko Odaki [off-list ref] wrote:
That aside, the first patch in this series can be applied without the
later patches so you may have a look at it. It's fine if you don't merge
it though since it does not fix really a pragmatic bug as its message says.
I think it's problematic because it needlessly ties i915 backlight
operation to existence of backlight devices that may not be related to
Intel GPU at all. The direction should be multiple supported backlight
devices, across GPUs and connectors, but only one per display.
BR,
Jani.
--
Jani Nikula, Intel Open Source Graphics Center
On Monday 24 October 2022 21:58:57 Akihiko Odaki wrote:
Regarding the second limitation, I don't even understand the difference
between vendor and native. My guess is that a vendor backlight device uses
vendor-specific ACPI interface, and a native one directly uses hardware
registers. If my guess is correct, the difference between vendor and native
does not imply that both of them are likely to exist at the same time. As
the conclusion, there is no more motivation to try to de-duplicate the
vendor/native combination than to try to de-duplicate combination of devices
with a single type.
Hello! I just want to point one thing. On some Dell laptops there are
3 different ways (= 3 different APIs) how to control display backlight.
There is ACPI driver (uses ACPI), GPU/DRM driver (i915.ko; uses directly
HW) and platform vendor driver (dell-laptop.ko; uses vendor BIOS or
firmware API). Just every driver has different pre-calculated scaling
values. So sometimes user wants to choose different driver just because
it allows to set backlight level with "better" granularity. Registering
all 3 device drivers is bad as user does not want to see 3 display
panels and forcing registration of specific one without runtime option
is also bad (some of those drivers do not have to be suitable or has
worse granularity as other).
From: Hans de Goede <hidden> Date: 2022-10-24 22:47:54
Hi,
On 10/24/22 15:14, Pali Rohár wrote:
On Monday 24 October 2022 21:58:57 Akihiko Odaki wrote:
quoted
Regarding the second limitation, I don't even understand the difference
between vendor and native. My guess is that a vendor backlight device uses
vendor-specific ACPI interface, and a native one directly uses hardware
registers. If my guess is correct, the difference between vendor and native
does not imply that both of them are likely to exist at the same time. As
the conclusion, there is no more motivation to try to de-duplicate the
vendor/native combination than to try to de-duplicate combination of devices
with a single type.
Hello! I just want to point one thing. On some Dell laptops there are
3 different ways (= 3 different APIs) how to control display backlight.
There is ACPI driver (uses ACPI), GPU/DRM driver (i915.ko; uses directly
HW) and platform vendor driver (dell-laptop.ko; uses vendor BIOS or
firmware API).
Right and that is just one example of laptops which can register both
vendor + native backlight devices, which is why this whole series is
a bad idea.
Regards,
Hans
Just every driver has different pre-calculated scaling
values. So sometimes user wants to choose different driver just because
it allows to set backlight level with "better" granularity. Registering
all 3 device drivers is bad as user does not want to see 3 display
panels and forcing registration of specific one without runtime option
is also bad (some of those drivers do not have to be suitable or has
worse granularity as other).
From: Hans de Goede <hidden> Date: 2022-10-24 23:14:49
Hi Akihiko,
On 10/24/22 13:34, Akihiko Odaki wrote:
Commit 2600bfa3df99 ("ACPI: video: Add acpi_video_backlight_use_native()
helper") and following commits made native backlight unavailable if
CONFIG_ACPI_VIDEO is set and the backlight feature of ACPI video is
unavailable, which broke the backlight functionality on Lenovo ThinkPad
C13 Yoga Chromebook. Allow to fall back to native backlight in such
cases.
I appreciate your work on this, but what this in essence does is
it allows 2 backlight drivers (vendor + native) to get registered
for the same panel again. While the whole goal of the backlight refactor
series landing in 6.1 was to make it so that there always is only
*1* backlight device registered instead of (possibly) registering
multiple and letting userspace figure it out. It is also important
to only always have 1 backlight device per panel for further
upcoming changes.
So nack for this solution, sorry.
I am aware that this breaks backlight control on some Chromebooks,
this was already reported and I wrote a long reply explaining why
things are done the way they are done now and also suggesting
2 possible (much simpler) fixes, see:
https://lore.kernel.org/linux-acpi/42a5f2c9-a1dc-8fc0-7334-fe6c390ecfbb@redhat.com/
Unfortunately the reported has not followed-up on this and
I don't have the hardware to test this myself.
Can you please try implementing 1 of the fixes suggested there
and then submit that upstream ?
Regards,
Hans
From: Hans de Goede <hidden> Date: 2022-10-24 23:29:27
Hi,
On 10/24/22 13:56, Akihiko Odaki wrote:
On 2022/10/24 20:48, Jani Nikula wrote:
quoted
On Mon, 24 Oct 2022, Akihiko Odaki [off-list ref] wrote:
quoted
Commit 2600bfa3df99 ("ACPI: video: Add acpi_video_backlight_use_native()
helper") and following commits made native backlight unavailable if
CONFIG_ACPI_VIDEO is set and the backlight feature of ACPI video is
unavailable, which broke the backlight functionality on Lenovo ThinkPad
C13 Yoga Chromebook. Allow to fall back to native backlight in such
cases.
Where's the bug report with relevant logs, kconfigs, etc?
I haven't filed one. Should I? Please tell me where to report and what information you would need (to bugzilla.kernel.org with things mentioned in Documentation/admin-guide/reporting-issues.rst?)
As mentioned in my other email this is a known issue, and your effort
to fix this is appreciated very much, but I don't believe your solution
to be the right one.
See: https://lore.kernel.org/linux-acpi/42a5f2c9-a1dc-8fc0-7334-fe6c390ecfbb@redhat.com/
for more details and possible solutions. Please try implementing one of
those solutions for your Chromebook. I unfortunately do not have hw to
test this myself.
Regards,
Hans
From: Hans de Goede <hidden> Date: 2022-10-24 23:56:31
Hi,
On 10/24/22 16:31, Akihiko Odaki wrote:
On 2022/10/24 23:06, Akihiko Odaki wrote:
quoted
On 2022/10/24 22:21, Hans de Goede wrote:
quoted
Hi,
On 10/24/22 14:58, Akihiko Odaki wrote:
quoted
On 2022/10/24 20:53, Hans de Goede wrote:
quoted
Hi Akihiko,
On 10/24/22 13:34, Akihiko Odaki wrote:
quoted
Commit 2600bfa3df99 ("ACPI: video: Add acpi_video_backlight_use_native()
helper") and following commits made native backlight unavailable if
CONFIG_ACPI_VIDEO is set and the backlight feature of ACPI video is
unavailable, which broke the backlight functionality on Lenovo ThinkPad
C13 Yoga Chromebook. Allow to fall back to native backlight in such
cases.
I appreciate your work on this, but what this in essence does is
it allows 2 backlight drivers (vendor + native) to get registered
for the same panel again. While the whole goal of the backlight refactor
series landing in 6.1 was to make it so that there always is only
*1* backlight device registered instead of (possibly) registering
multiple and letting userspace figure it out. It is also important
to only always have 1 backlight device per panel for further
upcoming changes.
So nack for this solution, sorry.
I am aware that this breaks backlight control on some Chromebooks,
this was already reported and I wrote a long reply explaining why
things are done the way they are done now and also suggesting
2 possible (much simpler) fixes, see:
https://lore.kernel.org/linux-acpi/42a5f2c9-a1dc-8fc0-7334-fe6c390ecfbb@redhat.com/
Unfortunately the reported has not followed-up on this and
I don't have the hardware to test this myself.
Can you please try implementing 1 of the fixes suggested there
and then submit that upstream ?
Regards,
Hans
Hi Hans,
Thanks for reviewing and letting me know the prior attempt.
In this case, there is only a native backlight device and no vendor backlight device so the duplication of backlight devices does not happen. I think it is better to handle such a case without quirks.
Adding a single heuristic for all chromebooks is something completely different
then adding per model quirks which indeed ideally should be avoided (but this
is not always possible).
quoted
I understand it is still questionable to cover the case by allowing duplication when both of a vendor backlight device and native one. To explain my understanding and reasoning for *not* trying to apply the de-duplication rule to the vendor/native combination, let me first describe that the de-duplication which happens in acpi_video_get_backlight_type() is a heuristics and limited.
As the background of acpi_video_get_backlight_type(), there is an assumption that it should be common that both of the firmware, implementing ACPI, and the kernel have code to drive backlight. In the case, the more reliable one should be picked instead of using both, and that is what the statements in `if (video_caps & ACPI_VIDEO_BACKLIGHT)` does.
However, the method has two limitations:
1. It does not cover the case where two backlight devices with the same type exist.
This only happens when there are 2 panels; or 2 gpus driving a single panel
which are both special cases where we actually want 2 backlight devices.
quoted
2. The underlying assumption does not apply to vendor/native combination.
Regarding the second limitation, I don't even understand the difference between vendor and native. My guess is that a vendor backlight device uses vendor-specific ACPI interface, and a native one directly uses hardware registers. If my guess is correct, the difference between vendor and native does not imply that both of them are likely to exist at the same time. As the conclusion, there is no more motivation to try to de-duplicate the vendor/native combination than to try to de-duplicate combination of devices with a single type.
Of course, it is better if we could also avoid registering two devices with one type for one physical device. Possibly we can do so by providing a parameter to indicate that it is for the same "internal" backlight to devm_backlight_device_register(), and let the function check for the duplication. However, this rule may be too restrict, or may have problems I missed.
Based on the discussion above, we can deduce three possibilities:
a. There is no reason to distinguish vendor and native in this case, and we can stick to my current proposal.
b. There is a valid reason to distinguish vendor and native, and we can adopt the same strategy that already adopted for ACPI video/vendor combination.
c. We can implement de-duplication in devm_backlight_device_register().
d. The other possible options are not worth, and we can just implement quirks specific to Chromebook/coreboot.
In case b, it should be noted that vendor and native backlight device do not require ACPI video, and CONFIG_ACPI_VIDEO may not be enabled. In the case, the de-duplication needs to be implemented in backlight class device.
I have been working on the ACPI/x86 backlight detection code since 2015, please trust
me when I say that allowing both vendor + native backlight devices at the same time
is a bad idea.
I'm currently in direct contact with the ChromeOS team about fixing the Chromebook
backlight issue introduced in 6.1-rc1.
If you wan to help, please read:
https://lore.kernel.org/linux-acpi/42a5f2c9-a1dc-8fc0-7334-fe6c390ecfbb@redhat.com/
And try implementing 1 if the 2 solutions suggested there.
Regards,
Hans
Hi,
I just wanted to confirm your intention that we should distinguish vendor and native. In the case I think it is better to modify __acpi_video_get_backlight_type() and add "native_available" check in case of no ACPI video as already done for the ACPI video/native combination.
Unfortunately this has one pitfall though: it does not work if CONFIG_ACPI_VIDEO is disabled. If it is, acpi_video_get_backlight_type() always return acpi_backlight_vendor, and acpi_video_backlight_use_native() always returns true. It is not a regression but the current behavior. Fixing it requires also refactoring touching both of ACPI video and backlight class driver so I guess I'm not an appropriate person to do that, and I should just add "native_available" check to __acpi_video_get_backlight_type().
Does that sound good?
Well, it would not be that easy since just adding native_available cannot handle the case where the vendor driver gets registered first. Checking with "native_available" was possible for ACPI video/vendor combination because ACPI video registers its backlight after some delay. I still think it does not overcomplicate things to modify __acpi_video_get_backlight_type() so that it can use both of vendor and native as fallback while preventing duplicate registration.
From: Jonathan Woithe <jwoithe@just42.net> Date: 2022-10-25 01:03:05
On Mon, Oct 24, 2022 at 08:35:00PM +0900, Akihiko Odaki wrote:
acpi_video_get_backlight_type() is now deprecated.
The practical impact of this patch series on fujitsu-laptop is obviously
very minor assuming the new acpi_video_get_backlight_types() function
functions as advertised. Accordingly, as maintainer of fujitsu-laptop I
will defer to the opinions of others who maintain the lower level
infrastructure which is more substantially affected by the bulk of the
changes in this series.
I note that Hans has naked the series and I'm happy to go along with that.
Regards
jonathan
@@ -387,7 +387,7 @@ static int acpi_fujitsu_bl_add(struct acpi_device *device)structfujitsu_bl*priv;intret;-if(acpi_video_get_backlight_type()!=acpi_backlight_vendor)+if(!(acpi_video_get_backlight_types()&ACPI_BACKLIGHT_VENDOR))return-ENODEV;priv=devm_kzalloc(&device->dev,sizeof(*priv),GFP_KERNEL);
@@ -819,7 +819,7 @@ static int acpi_fujitsu_laptop_add(struct acpi_device *device)/* Sync backlight power status */if(fujitsu_bl&&fujitsu_bl->bl_device&&-acpi_video_get_backlight_type()==acpi_backlight_vendor){+(acpi_video_get_backlight_types()&ACPI_BACKLIGHT_VENDOR)){if(call_fext_func(fext,FUNC_BACKLIGHT,0x2,BACKLIGHT_PARAM_POWER,0x0)==BACKLIGHT_OFF)fujitsu_bl->bl_device->props.power=FB_BLANK_POWERDOWN;
On Tue, 25 Oct 2022, Akihiko Odaki [off-list ref] wrote:
quoted
That aside, the first patch in this series can be applied without the
later patches so you may have a look at it. It's fine if you don't merge
it though since it does not fix really a pragmatic bug as its message says.
I think it's problematic because it needlessly ties i915 backlight
operation to existence of backlight devices that may not be related to
Intel GPU at all. The direction should be multiple supported backlight
devices, across GPUs and connectors, but only one per display.
BR,
Jani.
Unfortunately it is the current situation (even without this patch), and
this patch is not meant to fix the particular issue.
This patch replaces the following expression:
acpi_video_get_backlight_type() == acpi_backlight_native
As you can see, acpi_video_get_backlight_type() doesn't take a parameter
which represents the backlight currently being operated. The problem is
known and documented in "Brightness handling on devices with multiple
internal panels" section of Documentation/gpu/todo.rst.
The exiting solution is based on the assumption that no device with i915
and multiple internal backlights.
Regards,
Akihiko Odaki