Re: [PATCH]: ACPI: Skip the power state check in power transition

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

 



On Sunday 17 May 2009 8:08:23 pm yakui_zhao wrote:
> On Fri, 2009-05-15 at 02:49 +0800, Bjorn Helgaas wrote:

> > I'd *like* to remove this whole chunk, which would allow us to remove
> > acpi_power_nocheck, the DMI table, and the kernel parameter completely:
> > 
> >         /*
> >          * Get device's current power state
> >          */
> >         if (!acpi_power_nocheck) {
> >                 /*
> >                  * 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,
> >                  * the device can't be transisted to the correct power state.
> >                  * So if the acpi_power_nocheck is set, it is unnecessary to
> >                  * get the power state by calling acpi_bus_get_power.
> >                  */
> >                 acpi_bus_get_power(device->handle, &device->power.state);
> >         }
> >         if ((state == device->power.state) && !device->flags.force_power_state) {
> >                 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device is already at D%d\n",
> >                                   state));
> >                 return 0;
> >         }
> > 
> > Then we could also remove the "force_power_state" ugliness.  But I'm
> > afraid of breaking something because I don't understand the subtleties
> > of power transitions.
> The flag of "force_power_state" can't be removed. For example: The ACPI
> fan is in Off state. But the bogus bios reports that it is in D0 state.
> If there is no flag of "force_power_state", we can't turn on the FAN
> device.

OK, we need more investigation before removing this code from
acpi_bus_set_power(), so let's defer that.

> > ACPI: never check power state after _ON/_OFF
> > 
> > From: Bjorn Helgaas <bjorn.helgaas@xxxxxx>
> > 
> > We used to evaluate _STA to check the power state of a device after
> > running _ON or _OFF.  But as far as I can tell, there's no benefit
> > to evaluating _STA, and sometimes we trip over bugs when BIOSes don't
> > implement _STA correctly.
> > 
> > Yakui says Windows XP doesn't evaluate _STA during power transition.
> > So let's skip it in Linux, too.
> It is also OK that the power state is never checked during power
> transition. I verify this on Windows XP. In such case we can delete the
> DMI check, kernel parameter, the code related with power state check.
> 
> But we don't know whether the power state check is still skipped during
> power transition on windows 7.
> 
> So IMO the better solution is still to keep the kernel parameter. It
> will break nothing. And the default value is to skip the power state
> check in power transition.

I can't quite tell whether you think we still need the checks in
acpi_power_on() and acpi_power_off_device().  You proposed setting
"acpi_power_nocheck = 1" by default, which would cause us to bypass
the checks.

Removing the checks completely from those paths only means we wouldn't
be able to use "acpi.power_nocheck=0" to force checking the state after
a transition.  I really don't think users are going to do that, so I
don't think it's worth cluttering the code with those checks.

I'll post that patch again in a separate thread.

Bjorn

> > References:
> >     http://bugzilla.kernel.org/show_bug.cgi?id=13243
> >     http://marc.info/?l=linux-acpi&m=124166053803753&w=2
> >     http://marc.info/?l=linux-acpi&m=124175761408256&w=2
> >     http://marc.info/?l=linux-acpi&m=124210593114061&w=2
> > 
> > Signed-off-by: Bjorn Helgaas <bjorn.helgaas@xxxxxx>
> > CC: Yakui Zhao <yakui.zhao@xxxxxxxxx>
> > CC: Matthew Garrett <mjg59@xxxxxxxxxxxxx>
> > CC: "Rafael J. Wysocki" <rjw@xxxxxxx>
> > CC: Witold Szczeponik <Witold.Szczeponik@xxxxxxx>
> > CC: Len Brown <lenb@xxxxxxxxxx>
> > ---
> >  drivers/acpi/power.c |   28 ++--------------------------
> >  1 files changed, 2 insertions(+), 26 deletions(-)
> > 
> > diff --git a/drivers/acpi/power.c b/drivers/acpi/power.c
> > index 56665a6..d74365d 100644
> > --- a/drivers/acpi/power.c
> > +++ b/drivers/acpi/power.c
> > @@ -194,7 +194,7 @@ static int acpi_power_get_list_state(struct acpi_handle_list *list, int *state)
> >  
> >  static int acpi_power_on(acpi_handle handle, struct acpi_device *dev)
> >  {
> > -	int result = 0, state;
> > +	int result = 0;
> >  	int found = 0;
> >  	acpi_status status = AE_OK;
> >  	struct acpi_power_resource *resource = NULL;
> > @@ -236,18 +236,6 @@ static int acpi_power_on(acpi_handle handle, struct acpi_device *dev)
> >  	if (ACPI_FAILURE(status))
> >  		return -ENODEV;
> >  
> > -	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;
> >  
> > @@ -258,7 +246,7 @@ static int acpi_power_on(acpi_handle handle, struct acpi_device *dev)
> >  
> >  static int acpi_power_off_device(acpi_handle handle, struct acpi_device *dev)
> >  {
> > -	int result = 0, state;
> > +	int result = 0;
> >  	acpi_status status = AE_OK;
> >  	struct acpi_power_resource *resource = NULL;
> >  	struct list_head *node, *next;
> > @@ -293,18 +281,6 @@ static int acpi_power_off_device(acpi_handle handle, struct acpi_device *dev)
> >  	if (ACPI_FAILURE(status))
> >  		return -ENODEV;
> >  
> > -	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(handle, &state);
> > -		if (result)
> > -			return result;
> > -		if (state != ACPI_POWER_RESOURCE_STATE_OFF)
> > -			return -ENOEXEC;
> > -	}
> > -
> >  	/* Update the power resource's _device_ power state */
> >  	resource->device->power.state = ACPI_STATE_D3;
> >  
> 
> 

--
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