* [PATCH] acpi: fix brightness level is initialized to zero when BIOS does not restore the brightness value to _BQC.
@ 2012-10-01 5:39 Alex Hung
2012-10-01 6:47 ` joeyli
0 siblings, 1 reply; 11+ messages in thread
From: Alex Hung @ 2012-10-01 5:39 UTC (permalink / raw)
To: alex.hung, rui.zhang, linux-acpi
Signed-off-by: Alex Hung <alex.hung@canonical.com>
---
drivers/acpi/video.c | 4 ++++
1 files changed, 4 insertions(+), 0 deletions(-)
diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c
index 42b226e..eaa9573 100644
--- a/drivers/acpi/video.c
+++ b/drivers/acpi/video.c
@@ -724,6 +724,10 @@ acpi_video_init_brightness(struct acpi_video_device *device)
if (level_old == br->levels[i])
level = level_old;
}
+
+ if (level == 0)
+ level = br->levels[(br->count) / 2 + 1];
+
goto set_level;
}
--
1.7.0.4
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH] acpi: fix brightness level is initialized to zero when BIOS does not restore the brightness value to _BQC.
2012-10-01 5:39 [PATCH] acpi: fix brightness level is initialized to zero when BIOS does not restore the brightness value to _BQC Alex Hung
@ 2012-10-01 6:47 ` joeyli
2012-10-01 7:03 ` Alex Hung
0 siblings, 1 reply; 11+ messages in thread
From: joeyli @ 2012-10-01 6:47 UTC (permalink / raw)
To: Alex Hung; +Cc: rui.zhang, linux-acpi
Hi Alex,
於 一,2012-10-01 於 13:39 +0800,Alex Hung 提到:
> Signed-off-by: Alex Hung <alex.hung@canonical.com>
> ---
> drivers/acpi/video.c | 4 ++++
> 1 files changed, 4 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c
> index 42b226e..eaa9573 100644
> --- a/drivers/acpi/video.c
> +++ b/drivers/acpi/video.c
> @@ -724,6 +724,10 @@ acpi_video_init_brightness(struct acpi_video_device *device)
> if (level_old == br->levels[i])
> level = level_old;
> }
> +
> + if (level == 0)
> + level = br->levels[(br->count) / 2 + 1];
Looks here used the 50% brightness level.
Per comment in video.c, we want set the backlight to max_level when
level_old is invalid:
if (!br->flags._BQC_use_index) {
/*
* Set the backlight to the initial state.
* On some buggy laptops, _BQC returns an uninitialized value
* when invoked for the first time, i.e. level_old is invalid.
* set the backlight to max_level in this case
*/
I think here used max_level to fulfill it, e.g.
+ if (level == 0)
+ level = max_level;
How do you think?
> +
> goto set_level;
> }
>
Thanks a lot!
Joey Lee
--
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] acpi: fix brightness level is initialized to zero when BIOS does not restore the brightness value to _BQC.
2012-10-01 6:47 ` joeyli
@ 2012-10-01 7:03 ` Alex Hung
2012-10-01 7:17 ` joeyli
0 siblings, 1 reply; 11+ messages in thread
From: Alex Hung @ 2012-10-01 7:03 UTC (permalink / raw)
To: joeyli; +Cc: rui.zhang, linux-acpi
On 10/01/2012 02:47 PM, joeyli wrote:
> Hi Alex,
>
> 於 一,2012-10-01 於 13:39 +0800,Alex Hung 提到:
>> Signed-off-by: Alex Hung <alex.hung@canonical.com>
>> ---
>> drivers/acpi/video.c | 4 ++++
>> 1 files changed, 4 insertions(+), 0 deletions(-)
>>
>> diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c
>> index 42b226e..eaa9573 100644
>> --- a/drivers/acpi/video.c
>> +++ b/drivers/acpi/video.c
>> @@ -724,6 +724,10 @@ acpi_video_init_brightness(struct acpi_video_device *device)
>> if (level_old == br->levels[i])
>> level = level_old;
>> }
>> +
>> + if (level == 0)
>> + level = br->levels[(br->count) / 2 + 1];
>
> Looks here used the 50% brightness level.
>
> Per comment in video.c, we want set the backlight to max_level when
> level_old is invalid:
>
> if (!br->flags._BQC_use_index) {
> /*
> * Set the backlight to the initial state.
> * On some buggy laptops, _BQC returns an uninitialized value
> * when invoked for the first time, i.e. level_old is invalid.
> * set the backlight to max_level in this case
> */
>
> I think here used max_level to fulfill it, e.g.
>
> + if (level == 0)
> + level = max_level;
>
> How do you think?
Hi Joey,
I was debating with myself which level to be set, ex. 50%, ~75% or 100%,
and I think 50% *might* be closer to normal use-case (just a personal
guess).
However, "max_level" seems to fit best if we treat the initial zero
brightness in invalid. I can modify it according it that's preferred.
Thanks for the feedback.
Cheers,
Alex Hung
>
>> +
>> goto set_level;
>> }
>>
>
> Thanks a lot!
> Joey Lee
>
>
>
>
--
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] acpi: fix brightness level is initialized to zero when BIOS does not restore the brightness value to _BQC.
2012-10-01 7:03 ` Alex Hung
@ 2012-10-01 7:17 ` joeyli
2012-10-01 8:34 ` joeyli
0 siblings, 1 reply; 11+ messages in thread
From: joeyli @ 2012-10-01 7:17 UTC (permalink / raw)
To: Alex Hung; +Cc: rui.zhang, linux-acpi
於 一,2012-10-01 於 15:03 +0800,Alex Hung 提到:
> On 10/01/2012 02:47 PM, joeyli wrote:
> > Hi Alex,
> >
> > 於 一,2012-10-01 於 13:39 +0800,Alex Hung 提到:
> >> Signed-off-by: Alex Hung <alex.hung@canonical.com>
> >> ---
> >> drivers/acpi/video.c | 4 ++++
> >> 1 files changed, 4 insertions(+), 0 deletions(-)
> >>
> >> diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c
> >> index 42b226e..eaa9573 100644
> >> --- a/drivers/acpi/video.c
> >> +++ b/drivers/acpi/video.c
> >> @@ -724,6 +724,10 @@ acpi_video_init_brightness(struct acpi_video_device *device)
> >> if (level_old == br->levels[i])
> >> level = level_old;
> >> }
> >> +
> >> + if (level == 0)
> >> + level = br->levels[(br->count) / 2 + 1];
> >
> > Looks here used the 50% brightness level.
> >
> > Per comment in video.c, we want set the backlight to max_level when
> > level_old is invalid:
> >
> > if (!br->flags._BQC_use_index) {
> > /*
> > * Set the backlight to the initial state.
> > * On some buggy laptops, _BQC returns an uninitialized value
> > * when invoked for the first time, i.e. level_old is invalid.
> > * set the backlight to max_level in this case
> > */
> >
> > I think here used max_level to fulfill it, e.g.
> >
> > + if (level == 0)
> > + level = max_level;
> >
> > How do you think?
> Hi Joey,
>
> I was debating with myself which level to be set, ex. 50%, ~75% or 100%,
> and I think 50% *might* be closer to normal use-case (just a personal
> guess).
>
> However, "max_level" seems to fit best if we treat the initial zero
> brightness in invalid. I can modify it according it that's preferred.
>
> Thanks for the feedback.
>
> Cheers,
> Alex Hung
>
hm.... I have a question for what's the BIOS's problem that causes
'level == 0'?
That implied the issue machine's max_level is 0?
/*
* Set the level to maximum and check if _BQC uses indexed value
*/
result = acpi_video_device_lcd_set_level(device, max_level); /* write max_level purposely, then read level back, compare them */
...
result = acpi_video_device_lcd_get_level_current(device, &level, 0);
...
br->flags._BQC_use_index = (level == max_level ? 0 : 1);
if (!br->flags._BQC_use_index) { /* _BQC_use_index is 0 will run into if, means level == max_level */
So, looks the 'level == max_level == 0' when level_old is invalid.
Just wonder what's defect of BIOS (in _BCL?) causes problem.
Thanks a lot!
Joey Lee
--
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] acpi: fix brightness level is initialized to zero when BIOS does not restore the brightness value to _BQC.
2012-10-01 7:17 ` joeyli
@ 2012-10-01 8:34 ` joeyli
2012-10-01 9:11 ` Alex Hung
0 siblings, 1 reply; 11+ messages in thread
From: joeyli @ 2012-10-01 8:34 UTC (permalink / raw)
To: Alex Hung; +Cc: rui.zhang, linux-acpi
於 一,2012-10-01 於 15:17 +0800,joeyli 提到:
> 於 一,2012-10-01 於 15:03 +0800,Alex Hung 提到:
> > On 10/01/2012 02:47 PM, joeyli wrote:
> > > Hi Alex,
> > >
> > > 於 一,2012-10-01 於 13:39 +0800,Alex Hung 提到:
> > >> Signed-off-by: Alex Hung <alex.hung@canonical.com>
> > >> ---
> > >> drivers/acpi/video.c | 4 ++++
> > >> 1 files changed, 4 insertions(+), 0 deletions(-)
> > >>
> > >> diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c
> > >> index 42b226e..eaa9573 100644
> > >> --- a/drivers/acpi/video.c
> > >> +++ b/drivers/acpi/video.c
> > >> @@ -724,6 +724,10 @@ acpi_video_init_brightness(struct acpi_video_device *device)
> > >> if (level_old == br->levels[i])
> > >> level = level_old;
> > >> }
> > >> +
> > >> + if (level == 0)
> > >> + level = br->levels[(br->count) / 2 + 1];
> > >
> > > Looks here used the 50% brightness level.
> > >
> > > Per comment in video.c, we want set the backlight to max_level when
> > > level_old is invalid:
> > >
> > > if (!br->flags._BQC_use_index) {
> > > /*
> > > * Set the backlight to the initial state.
> > > * On some buggy laptops, _BQC returns an uninitialized value
> > > * when invoked for the first time, i.e. level_old is invalid.
> > > * set the backlight to max_level in this case
> > > */
> > >
> > > I think here used max_level to fulfill it, e.g.
> > >
> > > + if (level == 0)
> > > + level = max_level;
> > >
> > > How do you think?
> > Hi Joey,
> >
> > I was debating with myself which level to be set, ex. 50%, ~75% or 100%,
> > and I think 50% *might* be closer to normal use-case (just a personal
> > guess).
> >
> > However, "max_level" seems to fit best if we treat the initial zero
> > brightness in invalid. I can modify it according it that's preferred.
> >
> > Thanks for the feedback.
> >
> > Cheers,
> > Alex Hung
> >
>
> hm.... I have a question for what's the BIOS's problem that causes
> 'level == 0'?
> That implied the issue machine's max_level is 0?
>
> /*
> * Set the level to maximum and check if _BQC uses indexed value
> */
> result = acpi_video_device_lcd_set_level(device, max_level); /* write max_level purposely, then read level back, compare them */
> ...
> result = acpi_video_device_lcd_get_level_current(device, &level, 0);
> ...
> br->flags._BQC_use_index = (level == max_level ? 0 : 1);
> if (!br->flags._BQC_use_index) { /* _BQC_use_index is 0 will run into if, means level == max_level */
>
> So, looks the 'level == max_level == 0' when level_old is invalid.
>
> Just wonder what's defect of BIOS (in _BCL?) causes problem.
>
>
Sorry for my misunderstood!
I think that's possible the level_old is 0 and there have a 0 value in
the return package from _BCL.
Could you please share the _BCL in DSDT from issue machine? Does there
have 0 value in _BCL?
Thanks a lot!
Joey Lee
--
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] acpi: fix brightness level is initialized to zero when BIOS does not restore the brightness value to _BQC.
2012-10-01 8:34 ` joeyli
@ 2012-10-01 9:11 ` Alex Hung
2012-10-01 9:19 ` joeyli
0 siblings, 1 reply; 11+ messages in thread
From: Alex Hung @ 2012-10-01 9:11 UTC (permalink / raw)
To: joeyli; +Cc: rui.zhang, linux-acpi
On 10/01/2012 04:34 PM, joeyli wrote:
> 於 一,2012-10-01 於 15:17 +0800,joeyli 提到:
>> 於 一,2012-10-01 於 15:03 +0800,Alex Hung 提到:
>>> On 10/01/2012 02:47 PM, joeyli wrote:
>>>> Hi Alex,
>>>>
>>>> 於 一,2012-10-01 於 13:39 +0800,Alex Hung 提到:
>>>>> Signed-off-by: Alex Hung <alex.hung@canonical.com>
>>>>> ---
>>>>> drivers/acpi/video.c | 4 ++++
>>>>> 1 files changed, 4 insertions(+), 0 deletions(-)
>>>>>
>>>>> diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c
>>>>> index 42b226e..eaa9573 100644
>>>>> --- a/drivers/acpi/video.c
>>>>> +++ b/drivers/acpi/video.c
>>>>> @@ -724,6 +724,10 @@ acpi_video_init_brightness(struct acpi_video_device *device)
>>>>> if (level_old == br->levels[i])
>>>>> level = level_old;
>>>>> }
>>>>> +
>>>>> + if (level == 0)
>>>>> + level = br->levels[(br->count) / 2 + 1];
>>>>
>>>> Looks here used the 50% brightness level.
>>>>
>>>> Per comment in video.c, we want set the backlight to max_level when
>>>> level_old is invalid:
>>>>
>>>> if (!br->flags._BQC_use_index) {
>>>> /*
>>>> * Set the backlight to the initial state.
>>>> * On some buggy laptops, _BQC returns an uninitialized value
>>>> * when invoked for the first time, i.e. level_old is invalid.
>>>> * set the backlight to max_level in this case
>>>> */
>>>>
>>>> I think here used max_level to fulfill it, e.g.
>>>>
>>>> + if (level == 0)
>>>> + level = max_level;
>>>>
>>>> How do you think?
>>> Hi Joey,
>>>
>>> I was debating with myself which level to be set, ex. 50%, ~75% or 100%,
>>> and I think 50% *might* be closer to normal use-case (just a personal
>>> guess).
>>>
>>> However, "max_level" seems to fit best if we treat the initial zero
>>> brightness in invalid. I can modify it according it that's preferred.
>>>
>>> Thanks for the feedback.
>>>
>>> Cheers,
>>> Alex Hung
>>>
>>
>> hm.... I have a question for what's the BIOS's problem that causes
>> 'level == 0'?
>> That implied the issue machine's max_level is 0?
>>
>> /*
>> * Set the level to maximum and check if _BQC uses indexed value
>> */
>> result = acpi_video_device_lcd_set_level(device, max_level); /* write max_level purposely, then read level back, compare them */
>> ...
>> result = acpi_video_device_lcd_get_level_current(device, &level, 0);
>> ...
>> br->flags._BQC_use_index = (level == max_level ? 0 : 1);
>> if (!br->flags._BQC_use_index) { /* _BQC_use_index is 0 will run into if, means level == max_level */
>>
>> So, looks the 'level == max_level == 0' when level_old is invalid.
>>
>> Just wonder what's defect of BIOS (in _BCL?) causes problem.
>>
>>
>
> Sorry for my misunderstood!
>
> I think that's possible the level_old is 0 and there have a 0 value in
> the return package from _BCL.
>
Yes, there is nothing wrong with _BCL and _BQC except that _BQC returns
a zero initially.
> Could you please share the _BCL in DSDT from issue machine? Does there
> have 0 value in _BCL?
_BCL returns below data and there is a zero in the list.
[ 744.572289] Brightness[0] = 100
[ 744.572293] Brightness[1] = 50
[ 744.572295] Brightness[2] = 0
[ 744.572297] Brightness[3] = 10
[ 744.572299] Brightness[4] = 20
[ 744.572301] Brightness[5] = 30
[ 744.572303] Brightness[6] = 40
[ 744.572305] Brightness[7] = 50
[ 744.572306] Brightness[8] = 60
[ 744.572308] Brightness[9] = 70
[ 744.572310] Brightness[10] = 80
[ 744.572312] Brightness[11] = 90
[ 744.572314] Brightness[12] = 100
The below is the complete _BCL for references
Method (_BCL, 0, Serialized)
{
Name (_T_0, Zero)
If (_OSI ("NOT_WINP_KEY"))
{
While (One)
{
Store (LCDD, _T_0)
If (LEqual (_T_0, 0x303CAF06))
{
Return (AUOL)
}
Else
{
If (LEqual (_T_0, 0x1475AE0D))
{
Return (CMIL)
}
Else
{
If (LEqual (_T_0, 0x033FE430))
{
Return (LGDL)
}
Else
{
If (LEqual (_T_0, 0x3942A34C))
{
Return (SAML)
}
Else
{
Return (DEFL)
}
}
}
}
Break
}
}
Else
{
Return (Package (0x0D)
{
0x64,
0x32,
Zero,
0x0A,
0x14,
0x1E,
0x28,
0x32,
0x3C,
0x46,
0x50,
0x5A,
0x64
})
}
}
>
>
> Thanks a lot!
> Joey Lee
>
>
--
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] acpi: fix brightness level is initialized to zero when BIOS does not restore the brightness value to _BQC.
2012-10-01 9:11 ` Alex Hung
@ 2012-10-01 9:19 ` joeyli
2012-10-01 13:36 ` Zhang, Rui
0 siblings, 1 reply; 11+ messages in thread
From: joeyli @ 2012-10-01 9:19 UTC (permalink / raw)
To: Alex Hung; +Cc: rui.zhang, linux-acpi
於 一,2012-10-01 於 17:11 +0800,Alex Hung 提到:
> On 10/01/2012 04:34 PM, joeyli wrote:
> > 於 一,2012-10-01 於 15:17 +0800,joeyli 提到:
> >> 於 一,2012-10-01 於 15:03 +0800,Alex Hung 提到:
> >>> On 10/01/2012 02:47 PM, joeyli wrote:
> >>>> Hi Alex,
> >>>>
> >>>> 於 一,2012-10-01 於 13:39 +0800,Alex Hung 提到:
> >>>>> Signed-off-by: Alex Hung <alex.hung@canonical.com>
> >>>>> ---
> >>>>> drivers/acpi/video.c | 4 ++++
> >>>>> 1 files changed, 4 insertions(+), 0 deletions(-)
> >>>>>
> >>>>> diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c
> >>>>> index 42b226e..eaa9573 100644
> >>>>> --- a/drivers/acpi/video.c
> >>>>> +++ b/drivers/acpi/video.c
> >>>>> @@ -724,6 +724,10 @@ acpi_video_init_brightness(struct acpi_video_device *device)
> >>>>> if (level_old == br->levels[i])
> >>>>> level = level_old;
> >>>>> }
> >>>>> +
> >>>>> + if (level == 0)
> >>>>> + level = br->levels[(br->count) / 2 + 1];
> >>>>
> >>>> Looks here used the 50% brightness level.
> >>>>
> >>>> Per comment in video.c, we want set the backlight to max_level when
> >>>> level_old is invalid:
> >>>>
> >>>> if (!br->flags._BQC_use_index) {
> >>>> /*
> >>>> * Set the backlight to the initial state.
> >>>> * On some buggy laptops, _BQC returns an uninitialized value
> >>>> * when invoked for the first time, i.e. level_old is invalid.
> >>>> * set the backlight to max_level in this case
> >>>> */
> >>>>
> >>>> I think here used max_level to fulfill it, e.g.
> >>>>
> >>>> + if (level == 0)
> >>>> + level = max_level;
> >>>>
> >>>> How do you think?
> >>> Hi Joey,
> >>>
> >>> I was debating with myself which level to be set, ex. 50%, ~75% or 100%,
> >>> and I think 50% *might* be closer to normal use-case (just a personal
> >>> guess).
> >>>
> >>> However, "max_level" seems to fit best if we treat the initial zero
> >>> brightness in invalid. I can modify it according it that's preferred.
> >>>
> >>> Thanks for the feedback.
> >>>
> >>> Cheers,
> >>> Alex Hung
> >>>
> >>
> >> hm.... I have a question for what's the BIOS's problem that causes
> >> 'level == 0'?
> >> That implied the issue machine's max_level is 0?
> >>
> >> /*
> >> * Set the level to maximum and check if _BQC uses indexed value
> >> */
> >> result = acpi_video_device_lcd_set_level(device, max_level); /* write max_level purposely, then read level back, compare them */
> >> ...
> >> result = acpi_video_device_lcd_get_level_current(device, &level, 0);
> >> ...
> >> br->flags._BQC_use_index = (level == max_level ? 0 : 1);
> >> if (!br->flags._BQC_use_index) { /* _BQC_use_index is 0 will run into if, means level == max_level */
> >>
> >> So, looks the 'level == max_level == 0' when level_old is invalid.
> >>
> >> Just wonder what's defect of BIOS (in _BCL?) causes problem.
> >>
> >>
> >
> > Sorry for my misunderstood!
> >
> > I think that's possible the level_old is 0 and there have a 0 value in
> > the return package from _BCL.
> >
>
> Yes, there is nothing wrong with _BCL and _BQC except that _BQC returns
> a zero initially.
>
> > Could you please share the _BCL in DSDT from issue machine? Does there
> > have 0 value in _BCL?
>
> _BCL returns below data and there is a zero in the list.
>
> [ 744.572289] Brightness[0] = 100
> [ 744.572293] Brightness[1] = 50
> [ 744.572295] Brightness[2] = 0
> [ 744.572297] Brightness[3] = 10
> [ 744.572299] Brightness[4] = 20
> [ 744.572301] Brightness[5] = 30
> [ 744.572303] Brightness[6] = 40
> [ 744.572305] Brightness[7] = 50
> [ 744.572306] Brightness[8] = 60
> [ 744.572308] Brightness[9] = 70
> [ 744.572310] Brightness[10] = 80
> [ 744.572312] Brightness[11] = 90
> [ 744.572314] Brightness[12] = 100
>
> The below is the complete _BCL for references
>
> Method (_BCL, 0, Serialized)
> {
> Name (_T_0, Zero)
> If (_OSI ("NOT_WINP_KEY"))
> {
> While (One)
> {
> Store (LCDD, _T_0)
> If (LEqual (_T_0, 0x303CAF06))
> {
> Return (AUOL)
> }
> Else
> {
> If (LEqual (_T_0, 0x1475AE0D))
> {
> Return (CMIL)
> }
> Else
> {
> If (LEqual (_T_0, 0x033FE430))
> {
> Return (LGDL)
> }
> Else
> {
> If (LEqual (_T_0, 0x3942A34C))
> {
> Return (SAML)
> }
> Else
> {
> Return (DEFL)
> }
> }
> }
> }
>
> Break
> }
> }
> Else
> {
> Return (Package (0x0D)
> {
> 0x64,
> 0x32,
> Zero,
Yes, have Zero value in _BCL return package.
> 0x0A,
> 0x14,
> 0x1E,
> 0x28,
> 0x32,
> 0x3C,
> 0x46,
> 0x50,
> 0x5A,
> 0x64
> })
> }
> }
>
>
According to the above information, it make sense now!
Thank a lot!
Joey Lee
--
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 11+ messages in thread
* RE: [PATCH] acpi: fix brightness level is initialized to zero when BIOS does not restore the brightness value to _BQC.
2012-10-01 9:19 ` joeyli
@ 2012-10-01 13:36 ` Zhang, Rui
2012-10-01 15:26 ` Alex Hung
0 siblings, 1 reply; 11+ messages in thread
From: Zhang, Rui @ 2012-10-01 13:36 UTC (permalink / raw)
To: joeyli, Alex Hung; +Cc: linux-acpi@vger.kernel.org
I think this is probably what you're looking for,
/*
* Some BIOSes claim they use minimum backlight at boot,
* and this may bring dimming screen after boot
*/
static bool use_bios_initial_backlight = 1;
module_param(use_bios_initial_backlight, bool, 0644);
Lowest brightness level does not equal black screen.
It is not a bug if a platform wants to set its brightness to lowest brightness level during boot.
If it IS in your case, you can use this module parameter to ignore the initial _BQC value and use max_level instead.
Thanks,
rui
> -----Original Message-----
> From: joeyli [mailto:jlee@suse.com]
> Sent: Monday, October 01, 2012 5:19 PM
> To: Alex Hung
> Cc: Zhang, Rui; linux-acpi@vger.kernel.org
> Subject: Re: [PATCH] acpi: fix brightness level is initialized to zero
> when BIOS does not restore the brightness value to _BQC.
> Importance: High
>
> 於 一,2012-10-01 於 17:11 +0800,Alex Hung 提到:
> > On 10/01/2012 04:34 PM, joeyli wrote:
> > > 於 一,2012-10-01 於 15:17 +0800,joeyli 提到:
> > >> 於 一,2012-10-01 於 15:03 +0800,Alex Hung 提到:
> > >>> On 10/01/2012 02:47 PM, joeyli wrote:
> > >>>> Hi Alex,
> > >>>>
> > >>>> 於 一,2012-10-01 於 13:39 +0800,Alex Hung 提到:
> > >>>>> Signed-off-by: Alex Hung <alex.hung@canonical.com>
> > >>>>> ---
> > >>>>> drivers/acpi/video.c | 4 ++++
> > >>>>> 1 files changed, 4 insertions(+), 0 deletions(-)
> > >>>>>
> > >>>>> diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c index
> > >>>>> 42b226e..eaa9573 100644
> > >>>>> --- a/drivers/acpi/video.c
> > >>>>> +++ b/drivers/acpi/video.c
> > >>>>> @@ -724,6 +724,10 @@ acpi_video_init_brightness(struct
> acpi_video_device *device)
> > >>>>> if (level_old == br->levels[i])
> > >>>>> level = level_old;
> > >>>>> }
> > >>>>> +
> > >>>>> + if (level == 0)
> > >>>>> + level = br->levels[(br->count) / 2 + 1];
> > >>>>
> > >>>> Looks here used the 50% brightness level.
> > >>>>
> > >>>> Per comment in video.c, we want set the backlight to max_level
> > >>>> when level_old is invalid:
> > >>>>
> > >>>> if (!br->flags._BQC_use_index) {
> > >>>> /*
> > >>>> * Set the backlight to the initial state.
> > >>>> * On some buggy laptops, _BQC returns an
> uninitialized value
> > >>>> * when invoked for the first time, i.e.
> level_old is invalid.
> > >>>> * set the backlight to max_level in this case
> > >>>> */
> > >>>>
> > >>>> I think here used max_level to fulfill it, e.g.
> > >>>>
> > >>>> + if (level == 0)
> > >>>> + level = max_level;
> > >>>>
> > >>>> How do you think?
> > >>> Hi Joey,
> > >>>
> > >>> I was debating with myself which level to be set, ex. 50%, ~75%
> or
> > >>> 100%, and I think 50% *might* be closer to normal use-case (just
> a
> > >>> personal guess).
> > >>>
> > >>> However, "max_level" seems to fit best if we treat the initial
> > >>> zero brightness in invalid. I can modify it according it that's
> preferred.
> > >>>
> > >>> Thanks for the feedback.
> > >>>
> > >>> Cheers,
> > >>> Alex Hung
> > >>>
> > >>
> > >> hm.... I have a question for what's the BIOS's problem that causes
> > >> 'level == 0'?
> > >> That implied the issue machine's max_level is 0?
> > >>
> > >> /*
> > >> * Set the level to maximum and check if _BQC uses indexed
> value
> > >> */
> > >> result = acpi_video_device_lcd_set_level(device, max_level);
> /* write max_level purposely, then read level back, compare
> them */
> > >> ...
> > >> result = acpi_video_device_lcd_get_level_current(device,
> &level, 0);
> > >> ...
> > >> br->flags._BQC_use_index = (level == max_level ? 0 : 1);
> > >> if (!br->flags._BQC_use_index) { /*
> _BQC_use_index is 0 will run into if, means level == max_level */
> > >>
> > >> So, looks the 'level == max_level == 0' when level_old is invalid.
> > >>
> > >> Just wonder what's defect of BIOS (in _BCL?) causes problem.
> > >>
> > >>
> > >
> > > Sorry for my misunderstood!
> > >
> > > I think that's possible the level_old is 0 and there have a 0 value
> > > in the return package from _BCL.
> > >
> >
> > Yes, there is nothing wrong with _BCL and _BQC except that _BQC
> > returns a zero initially.
> >
> > > Could you please share the _BCL in DSDT from issue machine? Does
> > > there have 0 value in _BCL?
> >
> > _BCL returns below data and there is a zero in the list.
> >
> > [ 744.572289] Brightness[0] = 100
> > [ 744.572293] Brightness[1] = 50
> > [ 744.572295] Brightness[2] = 0
> > [ 744.572297] Brightness[3] = 10
> > [ 744.572299] Brightness[4] = 20
> > [ 744.572301] Brightness[5] = 30
> > [ 744.572303] Brightness[6] = 40
> > [ 744.572305] Brightness[7] = 50
> > [ 744.572306] Brightness[8] = 60
> > [ 744.572308] Brightness[9] = 70
> > [ 744.572310] Brightness[10] = 80
> > [ 744.572312] Brightness[11] = 90
> > [ 744.572314] Brightness[12] = 100
> >
> > The below is the complete _BCL for references
> >
> > Method (_BCL, 0, Serialized)
> > {
> > Name (_T_0, Zero)
> > If (_OSI ("NOT_WINP_KEY"))
> > {
> > While (One)
> > {
> > Store (LCDD, _T_0)
> > If (LEqual (_T_0, 0x303CAF06))
> > {
> > Return (AUOL)
> > }
> > Else
> > {
> > If (LEqual (_T_0, 0x1475AE0D))
> > {
> > Return (CMIL)
> > }
> > Else
> > {
> > If (LEqual (_T_0, 0x033FE430))
> > {
> > Return (LGDL)
> > }
> > Else
> > {
> > If (LEqual (_T_0,
> 0x3942A34C))
> > {
> > Return (SAML)
> > }
> > Else
> > {
> > Return (DEFL)
> > }
> > }
> > }
> > }
> >
> > Break
> > }
> > }
> > Else
> > {
> > Return (Package (0x0D)
> > {
> > 0x64,
> > 0x32,
> > Zero,
>
> Yes, have Zero value in _BCL return package.
>
> > 0x0A,
> > 0x14,
> > 0x1E,
> > 0x28,
> > 0x32,
> > 0x3C,
> > 0x46,
> > 0x50,
> > 0x5A,
> > 0x64
> > })
> > }
> > }
> >
> >
>
> According to the above information, it make sense now!
>
>
> Thank a lot!
> Joey Lee
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] acpi: fix brightness level is initialized to zero when BIOS does not restore the brightness value to _BQC.
2012-10-01 13:36 ` Zhang, Rui
@ 2012-10-01 15:26 ` Alex Hung
2012-10-08 4:34 ` Zhang, Rui
0 siblings, 1 reply; 11+ messages in thread
From: Alex Hung @ 2012-10-01 15:26 UTC (permalink / raw)
To: Zhang, Rui; +Cc: joeyli, linux-acpi@vger.kernel.org
Hi Rui,
Yes the module parameter is used temporarily. However, we want to
eliminate the need of using any parameter since non-technical users
won't know them without any help.
The question of whether lowest lowest brightness equals black screen is
debatable and I heard good / bad stories from both sides and they all
makes sense. This, however, does not necessarily play a role here. The
patch is to fix a problem - brightness is set to lowest value (not
user-friendly) when it was not intended.
I also agree that there is nothing wrong with platform setting the
brightness to lowest level during boot and that's a side-effect of this
patch indeed.. In fact, it took me a few weeks to decide it may be an
improvement for the below reasons.
1. In most of cases, lowest level is less desirable or less commonly
used. If a BIOS returns uninitialized valube such as a zero in this
case, Linux causes confusion and problems to users with such platforms.
Comparing to the side-effect, this (may) benefits more users.
2. I also checked ACPI sepc and it says:
B.5.4 _BQC (Brightness Query Current level)
This method returns the current brightness level of a built-in display
output device.
The definition makes it hard to argue that it is a BIOS bug not to
restore previous brightness to _BQC. I think it is ambiguous and this
small fix eliminates very dim screen (whether complete black or not) at
boot time.
PS. This may not be relevant, but Windows restores the previous
brightness without BIOS's _BQC, and therefore it does not suffer from
very dim / black screen.
Cheers,
Alex Hung
On 10/01/2012 09:36 PM, Zhang, Rui wrote:
> I think this is probably what you're looking for,
>
> /*
> * Some BIOSes claim they use minimum backlight at boot,
> * and this may bring dimming screen after boot
> */
> static bool use_bios_initial_backlight = 1;
> module_param(use_bios_initial_backlight, bool, 0644);
>
>
> Lowest brightness level does not equal black screen.
> It is not a bug if a platform wants to set its brightness to lowest brightness level during boot.
> If it IS in your case, you can use this module parameter to ignore the initial _BQC value and use max_level instead.
>
> Thanks,
> rui
>
>> -----Original Message-----
>> From: joeyli [mailto:jlee@suse.com]
>> Sent: Monday, October 01, 2012 5:19 PM
>> To: Alex Hung
>> Cc: Zhang, Rui; linux-acpi@vger.kernel.org
>> Subject: Re: [PATCH] acpi: fix brightness level is initialized to zero
>> when BIOS does not restore the brightness value to _BQC.
>> Importance: High
>>
>> 於 一,2012-10-01 於 17:11 +0800,Alex Hung 提到:
>>> On 10/01/2012 04:34 PM, joeyli wrote:
>>>> 於 一,2012-10-01 於 15:17 +0800,joeyli 提到:
>>>>> 於 一,2012-10-01 於 15:03 +0800,Alex Hung 提到:
>>>>>> On 10/01/2012 02:47 PM, joeyli wrote:
>>>>>>> Hi Alex,
>>>>>>>
>>>>>>> 於 一,2012-10-01 於 13:39 +0800,Alex Hung 提到:
>>>>>>>> Signed-off-by: Alex Hung <alex.hung@canonical.com>
>>>>>>>> ---
>>>>>>>> drivers/acpi/video.c | 4 ++++
>>>>>>>> 1 files changed, 4 insertions(+), 0 deletions(-)
>>>>>>>>
>>>>>>>> diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c index
>>>>>>>> 42b226e..eaa9573 100644
>>>>>>>> --- a/drivers/acpi/video.c
>>>>>>>> +++ b/drivers/acpi/video.c
>>>>>>>> @@ -724,6 +724,10 @@ acpi_video_init_brightness(struct
>> acpi_video_device *device)
>>>>>>>> if (level_old == br->levels[i])
>>>>>>>> level = level_old;
>>>>>>>> }
>>>>>>>> +
>>>>>>>> + if (level == 0)
>>>>>>>> + level = br->levels[(br->count) / 2 + 1];
>>>>>>>
>>>>>>> Looks here used the 50% brightness level.
>>>>>>>
>>>>>>> Per comment in video.c, we want set the backlight to max_level
>>>>>>> when level_old is invalid:
>>>>>>>
>>>>>>> if (!br->flags._BQC_use_index) {
>>>>>>> /*
>>>>>>> * Set the backlight to the initial state.
>>>>>>> * On some buggy laptops, _BQC returns an
>> uninitialized value
>>>>>>> * when invoked for the first time, i.e.
>> level_old is invalid.
>>>>>>> * set the backlight to max_level in this case
>>>>>>> */
>>>>>>>
>>>>>>> I think here used max_level to fulfill it, e.g.
>>>>>>>
>>>>>>> + if (level == 0)
>>>>>>> + level = max_level;
>>>>>>>
>>>>>>> How do you think?
>>>>>> Hi Joey,
>>>>>>
>>>>>> I was debating with myself which level to be set, ex. 50%, ~75%
>> or
>>>>>> 100%, and I think 50% *might* be closer to normal use-case (just
>> a
>>>>>> personal guess).
>>>>>>
>>>>>> However, "max_level" seems to fit best if we treat the initial
>>>>>> zero brightness in invalid. I can modify it according it that's
>> preferred.
>>>>>>
>>>>>> Thanks for the feedback.
>>>>>>
>>>>>> Cheers,
>>>>>> Alex Hung
>>>>>>
>>>>>
>>>>> hm.... I have a question for what's the BIOS's problem that causes
>>>>> 'level == 0'?
>>>>> That implied the issue machine's max_level is 0?
>>>>>
>>>>> /*
>>>>> * Set the level to maximum and check if _BQC uses indexed
>> value
>>>>> */
>>>>> result = acpi_video_device_lcd_set_level(device, max_level);
>> /* write max_level purposely, then read level back, compare
>> them */
>>>>> ...
>>>>> result = acpi_video_device_lcd_get_level_current(device,
>> &level, 0);
>>>>> ...
>>>>> br->flags._BQC_use_index = (level == max_level ? 0 : 1);
>>>>> if (!br->flags._BQC_use_index) { /*
>> _BQC_use_index is 0 will run into if, means level == max_level */
>>>>>
>>>>> So, looks the 'level == max_level == 0' when level_old is invalid.
>>>>>
>>>>> Just wonder what's defect of BIOS (in _BCL?) causes problem.
>>>>>
>>>>>
>>>>
>>>> Sorry for my misunderstood!
>>>>
>>>> I think that's possible the level_old is 0 and there have a 0 value
>>>> in the return package from _BCL.
>>>>
>>>
>>> Yes, there is nothing wrong with _BCL and _BQC except that _BQC
>>> returns a zero initially.
>>>
>>>> Could you please share the _BCL in DSDT from issue machine? Does
>>>> there have 0 value in _BCL?
>>>
>>> _BCL returns below data and there is a zero in the list.
>>>
>>> [ 744.572289] Brightness[0] = 100
>>> [ 744.572293] Brightness[1] = 50
>>> [ 744.572295] Brightness[2] = 0
>>> [ 744.572297] Brightness[3] = 10
>>> [ 744.572299] Brightness[4] = 20
>>> [ 744.572301] Brightness[5] = 30
>>> [ 744.572303] Brightness[6] = 40
>>> [ 744.572305] Brightness[7] = 50
>>> [ 744.572306] Brightness[8] = 60
>>> [ 744.572308] Brightness[9] = 70
>>> [ 744.572310] Brightness[10] = 80
>>> [ 744.572312] Brightness[11] = 90
>>> [ 744.572314] Brightness[12] = 100
>>>
>>> The below is the complete _BCL for references
>>>
>>> Method (_BCL, 0, Serialized)
>>> {
>>> Name (_T_0, Zero)
>>> If (_OSI ("NOT_WINP_KEY"))
>>> {
>>> While (One)
>>> {
>>> Store (LCDD, _T_0)
>>> If (LEqual (_T_0, 0x303CAF06))
>>> {
>>> Return (AUOL)
>>> }
>>> Else
>>> {
>>> If (LEqual (_T_0, 0x1475AE0D))
>>> {
>>> Return (CMIL)
>>> }
>>> Else
>>> {
>>> If (LEqual (_T_0, 0x033FE430))
>>> {
>>> Return (LGDL)
>>> }
>>> Else
>>> {
>>> If (LEqual (_T_0,
>> 0x3942A34C))
>>> {
>>> Return (SAML)
>>> }
>>> Else
>>> {
>>> Return (DEFL)
>>> }
>>> }
>>> }
>>> }
>>>
>>> Break
>>> }
>>> }
>>> Else
>>> {
>>> Return (Package (0x0D)
>>> {
>>> 0x64,
>>> 0x32,
>>> Zero,
>>
>> Yes, have Zero value in _BCL return package.
>>
>>> 0x0A,
>>> 0x14,
>>> 0x1E,
>>> 0x28,
>>> 0x32,
>>> 0x3C,
>>> 0x46,
>>> 0x50,
>>> 0x5A,
>>> 0x64
>>> })
>>> }
>>> }
>>>
>>>
>>
>> According to the above information, it make sense now!
>>
>>
>> Thank a lot!
>> Joey Lee
>
--
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 11+ messages in thread
* RE: [PATCH] acpi: fix brightness level is initialized to zero when BIOS does not restore the brightness value to _BQC.
2012-10-01 15:26 ` Alex Hung
@ 2012-10-08 4:34 ` Zhang, Rui
2012-10-08 4:39 ` Alex Hung
0 siblings, 1 reply; 11+ messages in thread
From: Zhang, Rui @ 2012-10-08 4:34 UTC (permalink / raw)
To: Alex Hung; +Cc: joeyli, linux-acpi@vger.kernel.org
> -----Original Message-----
> From: Alex Hung [mailto:alex.hung@canonical.com]
> Sent: Monday, October 01, 2012 11:27 PM
> To: Zhang, Rui
> Cc: joeyli; linux-acpi@vger.kernel.org
> Subject: Re: [PATCH] acpi: fix brightness level is initialized to zero
> when BIOS does not restore the brightness value to _BQC.
> Importance: High
>
> Hi Rui,
>
> Yes the module parameter is used temporarily. However, we want to
> eliminate the need of using any parameter since non-technical users
> won't know them without any help.
>
> The question of whether lowest lowest brightness equals black screen is
> debatable and I heard good / bad stories from both sides and they all
> makes sense. This, however, does not necessarily play a role here. The
> patch is to fix a problem - brightness is set to lowest value (not
> user-friendly) when it was not intended.
>
> I also agree that there is nothing wrong with platform setting the
> brightness to lowest level during boot and that's a side-effect of this
> patch indeed.. In fact, it took me a few weeks to decide it may be an
> improvement for the below reasons.
>
> 1. In most of cases, lowest level is less desirable or less commonly
> used. If a BIOS returns uninitialized valube such as a zero in this
> case, Linux causes confusion and problems to users with such platforms.
> Comparing to the side-effect, this (may) benefits more users.
>
> 2. I also checked ACPI sepc and it says:
>
> B.5.4 _BQC (Brightness Query Current level) This method returns the
> current brightness level of a built-in display output device.
>
> The definition makes it hard to argue that it is a BIOS bug not to
> restore previous brightness to _BQC. I think it is ambiguous and this
> small fix eliminates very dim screen (whether complete black or not) at
> boot time.
>
> PS. This may not be relevant, but Windows restores the previous
> brightness without BIOS's _BQC,
Where does windows get the previous brightness?
> and therefore it does not suffer from
> very dim / black screen.
>
> Cheers,
> Alex Hung
>
>
> On 10/01/2012 09:36 PM, Zhang, Rui wrote:
> > I think this is probably what you're looking for,
> >
> > /*
> > * Some BIOSes claim they use minimum backlight at boot,
> > * and this may bring dimming screen after boot
> > */
> > static bool use_bios_initial_backlight = 1;
> > module_param(use_bios_initial_backlight, bool, 0644);
> >
> >
> > Lowest brightness level does not equal black screen.
> > It is not a bug if a platform wants to set its brightness to lowest
> brightness level during boot.
> > If it IS in your case, you can use this module parameter to ignore
> the initial _BQC value and use max_level instead.
> >
> > Thanks,
> > rui
> >
> >> -----Original Message-----
> >> From: joeyli [mailto:jlee@suse.com]
> >> Sent: Monday, October 01, 2012 5:19 PM
> >> To: Alex Hung
> >> Cc: Zhang, Rui; linux-acpi@vger.kernel.org
> >> Subject: Re: [PATCH] acpi: fix brightness level is initialized to
> >> zero when BIOS does not restore the brightness value to _BQC.
> >> Importance: High
> >>
> >> 於 一,2012-10-01 於 17:11 +0800,Alex Hung 提到:
> >>> On 10/01/2012 04:34 PM, joeyli wrote:
> >>>> 於 一,2012-10-01 於 15:17 +0800,joeyli 提到:
> >>>>> 於 一,2012-10-01 於 15:03 +0800,Alex Hung 提到:
> >>>>>> On 10/01/2012 02:47 PM, joeyli wrote:
> >>>>>>> Hi Alex,
> >>>>>>>
> >>>>>>> 於 一,2012-10-01 於 13:39 +0800,Alex Hung 提到:
> >>>>>>>> Signed-off-by: Alex Hung <alex.hung@canonical.com>
> >>>>>>>> ---
> >>>>>>>> drivers/acpi/video.c | 4 ++++
> >>>>>>>> 1 files changed, 4 insertions(+), 0 deletions(-)
> >>>>>>>>
> >>>>>>>> diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c index
> >>>>>>>> 42b226e..eaa9573 100644
> >>>>>>>> --- a/drivers/acpi/video.c
> >>>>>>>> +++ b/drivers/acpi/video.c
> >>>>>>>> @@ -724,6 +724,10 @@ acpi_video_init_brightness(struct
> >> acpi_video_device *device)
> >>>>>>>> if (level_old == br->levels[i])
> >>>>>>>> level = level_old;
> >>>>>>>> }
> >>>>>>>> +
> >>>>>>>> + if (level == 0)
> >>>>>>>> + level = br->levels[(br->count) / 2 + 1];
> >>>>>>>
> >>>>>>> Looks here used the 50% brightness level.
> >>>>>>>
> >>>>>>> Per comment in video.c, we want set the backlight to max_level
> >>>>>>> when level_old is invalid:
> >>>>>>>
> >>>>>>> if (!br->flags._BQC_use_index) {
> >>>>>>> /*
> >>>>>>> * Set the backlight to the initial state.
> >>>>>>> * On some buggy laptops, _BQC returns an
> >> uninitialized value
> >>>>>>> * when invoked for the first time, i.e.
> >> level_old is invalid.
> >>>>>>> * set the backlight to max_level in this
> case
> >>>>>>> */
> >>>>>>>
> >>>>>>> I think here used max_level to fulfill it, e.g.
> >>>>>>>
> >>>>>>> + if (level == 0)
> >>>>>>> + level = max_level;
> >>>>>>>
> >>>>>>> How do you think?
> >>>>>> Hi Joey,
> >>>>>>
> >>>>>> I was debating with myself which level to be set, ex. 50%, ~75%
> >> or
> >>>>>> 100%, and I think 50% *might* be closer to normal use-case (just
> >> a
> >>>>>> personal guess).
> >>>>>>
> >>>>>> However, "max_level" seems to fit best if we treat the initial
> >>>>>> zero brightness in invalid. I can modify it according it that's
> >> preferred.
> >>>>>>
> >>>>>> Thanks for the feedback.
> >>>>>>
> >>>>>> Cheers,
> >>>>>> Alex Hung
> >>>>>>
> >>>>>
> >>>>> hm.... I have a question for what's the BIOS's problem that
> causes
> >>>>> 'level == 0'?
> >>>>> That implied the issue machine's max_level is 0?
> >>>>>
> >>>>> /*
> >>>>> * Set the level to maximum and check if _BQC uses
> indexed
> >> value
> >>>>> */
> >>>>> result = acpi_video_device_lcd_set_level(device,
> max_level);
> >> /* write max_level purposely, then read level back, compare
> them */
> >>>>> ...
> >>>>> result =
> acpi_video_device_lcd_get_level_current(device,
> >> &level, 0);
> >>>>> ...
> >>>>> br->flags._BQC_use_index = (level == max_level ? 0 :
> 1);
> >>>>> if (!br->flags._BQC_use_index) {
> /*
> >> _BQC_use_index is 0 will run into if, means level == max_level */
> >>>>>
> >>>>> So, looks the 'level == max_level == 0' when level_old is invalid.
> >>>>>
> >>>>> Just wonder what's defect of BIOS (in _BCL?) causes problem.
> >>>>>
> >>>>>
> >>>>
> >>>> Sorry for my misunderstood!
> >>>>
> >>>> I think that's possible the level_old is 0 and there have a 0
> value
> >>>> in the return package from _BCL.
> >>>>
> >>>
> >>> Yes, there is nothing wrong with _BCL and _BQC except that _BQC
> >>> returns a zero initially.
> >>>
> >>>> Could you please share the _BCL in DSDT from issue machine? Does
> >>>> there have 0 value in _BCL?
> >>>
> >>> _BCL returns below data and there is a zero in the list.
> >>>
> >>> [ 744.572289] Brightness[0] = 100
> >>> [ 744.572293] Brightness[1] = 50
> >>> [ 744.572295] Brightness[2] = 0
> >>> [ 744.572297] Brightness[3] = 10
> >>> [ 744.572299] Brightness[4] = 20
> >>> [ 744.572301] Brightness[5] = 30
> >>> [ 744.572303] Brightness[6] = 40
> >>> [ 744.572305] Brightness[7] = 50
> >>> [ 744.572306] Brightness[8] = 60
> >>> [ 744.572308] Brightness[9] = 70
> >>> [ 744.572310] Brightness[10] = 80
> >>> [ 744.572312] Brightness[11] = 90
> >>> [ 744.572314] Brightness[12] = 100
> >>>
> >>> The below is the complete _BCL for references
> >>>
> >>> Method (_BCL, 0, Serialized)
> >>> {
> >>> Name (_T_0, Zero)
> >>> If (_OSI ("NOT_WINP_KEY"))
> >>> {
> >>> While (One)
> >>> {
> >>> Store (LCDD, _T_0)
> >>> If (LEqual (_T_0, 0x303CAF06))
> >>> {
> >>> Return (AUOL)
> >>> }
> >>> Else
> >>> {
> >>> If (LEqual (_T_0, 0x1475AE0D))
> >>> {
> >>> Return (CMIL)
> >>> }
> >>> Else
> >>> {
> >>> If (LEqual (_T_0, 0x033FE430))
> >>> {
> >>> Return (LGDL)
> >>> }
> >>> Else
> >>> {
> >>> If (LEqual (_T_0,
> >> 0x3942A34C))
> >>> {
> >>> Return (SAML)
> >>> }
> >>> Else
> >>> {
> >>> Return (DEFL)
> >>> }
> >>> }
> >>> }
> >>> }
> >>>
> >>> Break
> >>> }
> >>> }
> >>> Else
> >>> {
> >>> Return (Package (0x0D)
> >>> {
> >>> 0x64,
> >>> 0x32,
> >>> Zero,
> >>
> >> Yes, have Zero value in _BCL return package.
> >>
> >>> 0x0A,
> >>> 0x14,
> >>> 0x1E,
> >>> 0x28,
> >>> 0x32,
> >>> 0x3C,
> >>> 0x46,
> >>> 0x50,
> >>> 0x5A,
> >>> 0x64
> >>> })
> >>> }
> >>> }
> >>>
> >>>
> >>
> >> According to the above information, it make sense now!
> >>
> >>
> >> Thank a lot!
> >> Joey Lee
> >
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] acpi: fix brightness level is initialized to zero when BIOS does not restore the brightness value to _BQC.
2012-10-08 4:34 ` Zhang, Rui
@ 2012-10-08 4:39 ` Alex Hung
0 siblings, 0 replies; 11+ messages in thread
From: Alex Hung @ 2012-10-08 4:39 UTC (permalink / raw)
To: Zhang, Rui; +Cc: joeyli, linux-acpi@vger.kernel.org
On 10/08/2012 12:34 PM, Zhang, Rui wrote:
>> -----Original Message-----
>> From: Alex Hung [mailto:alex.hung@canonical.com]
>> Sent: Monday, October 01, 2012 11:27 PM
>> To: Zhang, Rui
>> Cc: joeyli; linux-acpi@vger.kernel.org
>> Subject: Re: [PATCH] acpi: fix brightness level is initialized to zero
>> when BIOS does not restore the brightness value to _BQC.
>> Importance: High
>>
>> Hi Rui,
>>
>> Yes the module parameter is used temporarily. However, we want to
>> eliminate the need of using any parameter since non-technical users
>> won't know them without any help.
>>
>> The question of whether lowest lowest brightness equals black screen is
>> debatable and I heard good / bad stories from both sides and they all
>> makes sense. This, however, does not necessarily play a role here. The
>> patch is to fix a problem - brightness is set to lowest value (not
>> user-friendly) when it was not intended.
>>
>> I also agree that there is nothing wrong with platform setting the
>> brightness to lowest level during boot and that's a side-effect of this
>> patch indeed.. In fact, it took me a few weeks to decide it may be an
>> improvement for the below reasons.
>>
>> 1. In most of cases, lowest level is less desirable or less commonly
>> used. If a BIOS returns uninitialized valube such as a zero in this
>> case, Linux causes confusion and problems to users with such platforms.
>> Comparing to the side-effect, this (may) benefits more users.
>>
>> 2. I also checked ACPI sepc and it says:
>>
>> B.5.4 _BQC (Brightness Query Current level) This method returns the
>> current brightness level of a built-in display output device.
>>
>> The definition makes it hard to argue that it is a BIOS bug not to
>> restore previous brightness to _BQC. I think it is ambiguous and this
>> small fix eliminates very dim screen (whether complete black or not) at
>> boot time.
>>
>> PS. This may not be relevant, but Windows restores the previous
>> brightness without BIOS's _BQC,
>
> Where does windows get the previous brightness?
It seems Windows remember the brightness before shutting down and uses
that value when it boots up. It was observed in Windows 7.
>
>> and therefore it does not suffer from
>> very dim / black screen.
>>
>> Cheers,
>> Alex Hung
>>
>>
>> On 10/01/2012 09:36 PM, Zhang, Rui wrote:
>>> I think this is probably what you're looking for,
>>>
>>> /*
>>> * Some BIOSes claim they use minimum backlight at boot,
>>> * and this may bring dimming screen after boot
>>> */
>>> static bool use_bios_initial_backlight = 1;
>>> module_param(use_bios_initial_backlight, bool, 0644);
>>>
>>>
>>> Lowest brightness level does not equal black screen.
>>> It is not a bug if a platform wants to set its brightness to lowest
>> brightness level during boot.
>>> If it IS in your case, you can use this module parameter to ignore
>> the initial _BQC value and use max_level instead.
>>>
>>> Thanks,
>>> rui
>>>
>>>> -----Original Message-----
>>>> From: joeyli [mailto:jlee@suse.com]
>>>> Sent: Monday, October 01, 2012 5:19 PM
>>>> To: Alex Hung
>>>> Cc: Zhang, Rui; linux-acpi@vger.kernel.org
>>>> Subject: Re: [PATCH] acpi: fix brightness level is initialized to
>>>> zero when BIOS does not restore the brightness value to _BQC.
>>>> Importance: High
>>>>
>>>> 於 一,2012-10-01 於 17:11 +0800,Alex Hung 提到:
>>>>> On 10/01/2012 04:34 PM, joeyli wrote:
>>>>>> 於 一,2012-10-01 於 15:17 +0800,joeyli 提到:
>>>>>>> 於 一,2012-10-01 於 15:03 +0800,Alex Hung 提到:
>>>>>>>> On 10/01/2012 02:47 PM, joeyli wrote:
>>>>>>>>> Hi Alex,
>>>>>>>>>
>>>>>>>>> 於 一,2012-10-01 於 13:39 +0800,Alex Hung 提到:
>>>>>>>>>> Signed-off-by: Alex Hung <alex.hung@canonical.com>
>>>>>>>>>> ---
>>>>>>>>>> drivers/acpi/video.c | 4 ++++
>>>>>>>>>> 1 files changed, 4 insertions(+), 0 deletions(-)
>>>>>>>>>>
>>>>>>>>>> diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c index
>>>>>>>>>> 42b226e..eaa9573 100644
>>>>>>>>>> --- a/drivers/acpi/video.c
>>>>>>>>>> +++ b/drivers/acpi/video.c
>>>>>>>>>> @@ -724,6 +724,10 @@ acpi_video_init_brightness(struct
>>>> acpi_video_device *device)
>>>>>>>>>> if (level_old == br->levels[i])
>>>>>>>>>> level = level_old;
>>>>>>>>>> }
>>>>>>>>>> +
>>>>>>>>>> + if (level == 0)
>>>>>>>>>> + level = br->levels[(br->count) / 2 + 1];
>>>>>>>>>
>>>>>>>>> Looks here used the 50% brightness level.
>>>>>>>>>
>>>>>>>>> Per comment in video.c, we want set the backlight to max_level
>>>>>>>>> when level_old is invalid:
>>>>>>>>>
>>>>>>>>> if (!br->flags._BQC_use_index) {
>>>>>>>>> /*
>>>>>>>>> * Set the backlight to the initial state.
>>>>>>>>> * On some buggy laptops, _BQC returns an
>>>> uninitialized value
>>>>>>>>> * when invoked for the first time, i.e.
>>>> level_old is invalid.
>>>>>>>>> * set the backlight to max_level in this
>> case
>>>>>>>>> */
>>>>>>>>>
>>>>>>>>> I think here used max_level to fulfill it, e.g.
>>>>>>>>>
>>>>>>>>> + if (level == 0)
>>>>>>>>> + level = max_level;
>>>>>>>>>
>>>>>>>>> How do you think?
>>>>>>>> Hi Joey,
>>>>>>>>
>>>>>>>> I was debating with myself which level to be set, ex. 50%, ~75%
>>>> or
>>>>>>>> 100%, and I think 50% *might* be closer to normal use-case (just
>>>> a
>>>>>>>> personal guess).
>>>>>>>>
>>>>>>>> However, "max_level" seems to fit best if we treat the initial
>>>>>>>> zero brightness in invalid. I can modify it according it that's
>>>> preferred.
>>>>>>>>
>>>>>>>> Thanks for the feedback.
>>>>>>>>
>>>>>>>> Cheers,
>>>>>>>> Alex Hung
>>>>>>>>
>>>>>>>
>>>>>>> hm.... I have a question for what's the BIOS's problem that
>> causes
>>>>>>> 'level == 0'?
>>>>>>> That implied the issue machine's max_level is 0?
>>>>>>>
>>>>>>> /*
>>>>>>> * Set the level to maximum and check if _BQC uses
>> indexed
>>>> value
>>>>>>> */
>>>>>>> result = acpi_video_device_lcd_set_level(device,
>> max_level);
>>>> /* write max_level purposely, then read level back, compare
>> them */
>>>>>>> ...
>>>>>>> result =
>> acpi_video_device_lcd_get_level_current(device,
>>>> &level, 0);
>>>>>>> ...
>>>>>>> br->flags._BQC_use_index = (level == max_level ? 0 :
>> 1);
>>>>>>> if (!br->flags._BQC_use_index) {
>> /*
>>>> _BQC_use_index is 0 will run into if, means level == max_level */
>>>>>>>
>>>>>>> So, looks the 'level == max_level == 0' when level_old is invalid.
>>>>>>>
>>>>>>> Just wonder what's defect of BIOS (in _BCL?) causes problem.
>>>>>>>
>>>>>>>
>>>>>>
>>>>>> Sorry for my misunderstood!
>>>>>>
>>>>>> I think that's possible the level_old is 0 and there have a 0
>> value
>>>>>> in the return package from _BCL.
>>>>>>
>>>>>
>>>>> Yes, there is nothing wrong with _BCL and _BQC except that _BQC
>>>>> returns a zero initially.
>>>>>
>>>>>> Could you please share the _BCL in DSDT from issue machine? Does
>>>>>> there have 0 value in _BCL?
>>>>>
>>>>> _BCL returns below data and there is a zero in the list.
>>>>>
>>>>> [ 744.572289] Brightness[0] = 100
>>>>> [ 744.572293] Brightness[1] = 50
>>>>> [ 744.572295] Brightness[2] = 0
>>>>> [ 744.572297] Brightness[3] = 10
>>>>> [ 744.572299] Brightness[4] = 20
>>>>> [ 744.572301] Brightness[5] = 30
>>>>> [ 744.572303] Brightness[6] = 40
>>>>> [ 744.572305] Brightness[7] = 50
>>>>> [ 744.572306] Brightness[8] = 60
>>>>> [ 744.572308] Brightness[9] = 70
>>>>> [ 744.572310] Brightness[10] = 80
>>>>> [ 744.572312] Brightness[11] = 90
>>>>> [ 744.572314] Brightness[12] = 100
>>>>>
>>>>> The below is the complete _BCL for references
>>>>>
>>>>> Method (_BCL, 0, Serialized)
>>>>> {
>>>>> Name (_T_0, Zero)
>>>>> If (_OSI ("NOT_WINP_KEY"))
>>>>> {
>>>>> While (One)
>>>>> {
>>>>> Store (LCDD, _T_0)
>>>>> If (LEqual (_T_0, 0x303CAF06))
>>>>> {
>>>>> Return (AUOL)
>>>>> }
>>>>> Else
>>>>> {
>>>>> If (LEqual (_T_0, 0x1475AE0D))
>>>>> {
>>>>> Return (CMIL)
>>>>> }
>>>>> Else
>>>>> {
>>>>> If (LEqual (_T_0, 0x033FE430))
>>>>> {
>>>>> Return (LGDL)
>>>>> }
>>>>> Else
>>>>> {
>>>>> If (LEqual (_T_0,
>>>> 0x3942A34C))
>>>>> {
>>>>> Return (SAML)
>>>>> }
>>>>> Else
>>>>> {
>>>>> Return (DEFL)
>>>>> }
>>>>> }
>>>>> }
>>>>> }
>>>>>
>>>>> Break
>>>>> }
>>>>> }
>>>>> Else
>>>>> {
>>>>> Return (Package (0x0D)
>>>>> {
>>>>> 0x64,
>>>>> 0x32,
>>>>> Zero,
>>>>
>>>> Yes, have Zero value in _BCL return package.
>>>>
>>>>> 0x0A,
>>>>> 0x14,
>>>>> 0x1E,
>>>>> 0x28,
>>>>> 0x32,
>>>>> 0x3C,
>>>>> 0x46,
>>>>> 0x50,
>>>>> 0x5A,
>>>>> 0x64
>>>>> })
>>>>> }
>>>>> }
>>>>>
>>>>>
>>>>
>>>> According to the above information, it make sense now!
>>>>
>>>>
>>>> Thank a lot!
>>>> Joey Lee
>>>
>
--
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2012-10-08 4:39 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-10-01 5:39 [PATCH] acpi: fix brightness level is initialized to zero when BIOS does not restore the brightness value to _BQC Alex Hung
2012-10-01 6:47 ` joeyli
2012-10-01 7:03 ` Alex Hung
2012-10-01 7:17 ` joeyli
2012-10-01 8:34 ` joeyli
2012-10-01 9:11 ` Alex Hung
2012-10-01 9:19 ` joeyli
2012-10-01 13:36 ` Zhang, Rui
2012-10-01 15:26 ` Alex Hung
2012-10-08 4:34 ` Zhang, Rui
2012-10-08 4:39 ` Alex Hung
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).