Re: [PATCH 3/4] ACPI: Add "acpi.power_nocheck=1" to disable power state check in power transitio

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

 



On Tue, 2008-07-15 at 10:41 +0800, Zhao Yakui wrote:
> On Mon, 2008-07-14 at 12:39 +0200, Thomas Renninger wrote:
> > On Monday 14 July 2008 09:39:34 Zhao Yakui wrote:
> > > From: Zhao Yakui <yakui.zhao@xxxxxxxxx>
> > >
> > >    Maybe the incorrect power state is returned on the bogus bios, which
> > > is different with the real power state. For example: the bios returns D0
> > > state and the real power state is D3. OS expects to set the device to D0
> > > state. In  such case if OS uses the power state returned by the BIOS and
> > > checks the device power state very strictly in power transition, the device
> > > can't be transited to the correct power state.
> > >
> > >    So the boot option of "acpi.power_nocheck=1" is added to avoid checking
> > > the device power state in the course of device power transition.
> > >
> > > http://bugzilla.kernel.org/show_bug.cgi?id=8049
> > > http://bugzilla.kernel.org/show_bug.cgi?id=11000
> > >
> > > Signed-off-by: Zhao Yakui <yakui.zhao@xxxxxxxxx>
> > > Signed-off-by: Zhang Rui <rui.zhang@xxxxxxxxx>
> > > Signed-off-by: Li Shaohua <shaohua.li@xxxxxxxxx>
> > >
> > > ---
> > >  Documentation/kernel-parameters.txt |    7 ++++++
> > >  drivers/acpi/bus.c                  |   14 +++++++++++-
> > >  drivers/acpi/power.c                |   42
> > > ++++++++++++++++++++++++++---------- include/acpi/acpi_drivers.h         | 
> > >   1
> > >  4 files changed, 52 insertions(+), 12 deletions(-)
> > >
> > > Index: linux-2.6/Documentation/kernel-parameters.txt
> > > ===================================================================
> > > --- linux-2.6.orig/Documentation/kernel-parameters.txt
> > > +++ linux-2.6/Documentation/kernel-parameters.txt
> > > @@ -224,6 +224,13 @@ and is between 256 and 4096 characters.
> > >  			The number can be in decimal or prefixed with 0x in hex.
> > >  			Warning: Many of these options can produce a lot of
> > >  			output and make your system unusable. Be very careful.
> > > +	acpi.power_nocheck=	[HW,ACPI]
> > > +			Format: 1/0 enable/disable the check of power state.
> > > +			On some bogus BIOS the _PSC object/_STA object of
> > > +			power resource can't return the correct device power
> > > +			state. In such case it is unneccessary to check its
> > > +			power state again in power transition.
> > > +			1 : disable the power state check
> > >
> > >  	acpi_pm_good	[X86-32,X86-64]
> > >  			Override the pmtimer bug detection: force the kernel
> > > Index: linux-2.6/drivers/acpi/power.c
> > > ===================================================================
> > > --- linux-2.6.orig/drivers/acpi/power.c
> > > +++ linux-2.6/drivers/acpi/power.c
> > > @@ -54,6 +54,14 @@ ACPI_MODULE_NAME("power");
> > >  #define ACPI_POWER_RESOURCE_STATE_OFF	0x00
> > >  #define ACPI_POWER_RESOURCE_STATE_ON	0x01
> > >  #define ACPI_POWER_RESOURCE_STATE_UNKNOWN 0xFF
> > > +
> > > +#ifdef MODULE_PARAM_PREFIX
> > > +#undef MODULE_PARAM_PREFIX
> > > +#endif
> > > +#define MODULE_PARAM_PREFIX "acpi."
> > > +int acpi_power_nocheck;
> > > +module_param_named(power_nocheck, acpi_power_nocheck, bool, 000);
> > > +
> > >  static int acpi_power_add(struct acpi_device *device);
> > >  static int acpi_power_remove(struct acpi_device *device, int type);
> > >  static int acpi_power_resume(struct acpi_device *device);
> > > @@ -228,12 +236,18 @@ static int acpi_power_on(acpi_handle han
> > >  	if (ACPI_FAILURE(status))
> > >  		return -ENODEV;
> > >
> > > -	result = acpi_power_get_state(resource->device->handle, &state);
> > > -	if (result)
> > > -		return result;
> > > -	if (state != ACPI_POWER_RESOURCE_STATE_ON)
> > > -		return -ENOEXEC;
> > > -
> > > +	if (!acpi_power_nocheck) {
> > > +		/*
> > > +		 * If acpi_power_nocheck is set, it is unnecessary to check
> > > +		 * the power state after power transition.
> > > +		 */
> > > +		result = acpi_power_get_state(resource->device->handle,
> > > +				&state);
> > > +		if (result)
> > > +			return result;
> > > +		if (state != ACPI_POWER_RESOURCE_STATE_ON)
> > > +			return -ENOEXEC;
> > > +	}
> > >  	/* Update the power resource's _device_ power state */
> > >  	resource->device->power.state = ACPI_STATE_D0;
> > 
> > A fat ACPI_EXCEPTION that the power state is bogus and already point to the 
> > acpi.power_nocheck boot param before returning -ENOEXEC would help to find 
> > this boot param for affected machines?
> Good idea. Before the -ENOEXEC is returned, had better print some
> warning message and suggest trying the boot option of
> acpi.power_nocheck=1.
> > I wonder whether this (acpi.power_nocheck=1) could even get the default, maybe 
> > after waiting for reponse about how many machines really show this and why...

Yes. that's what we want to do at the beginning.
Currently, using acpi.power_nocheck=1 by default without many tests is
too aggressive. But some warning messages being printed out when the
driver doesn't work with acpi.power_nocheck=0 will help a lot. :)

thanks,
rui


--
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux IBM ACPI]     [Linux Power Management]     [Linux Kernel]     [Linux Laptop]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]     [Linux Resources]

  Powered by Linux