[PATCH 1/1] ACPI: introduce kernel parameter acpi_sleep=sci_force_enable
Kamal Mostafa
kamal at canonical.com
Thu Apr 22 17:56:48 UTC 2010
On Thu, 2010-04-22 at 18:31 +0100, Andy Whitcroft wrote:
> From: Zhang Rui <rui.zhang at intel.com>
>
> Introduce kernel parameter acpi_sleep=sci_force_enable
>
I think this is a great idea, but how about making the kernel parameter
able to force the SCI_EN behavior on /or/ force it off? So that if the
parameter is specified at all then it overrides the dmi-based blacklist
altogether. I.e. something like acpi_sleep_force_sci=on and
acpi_sleep_force_sci=off.
-Kamal
> some laptop requires SCI_EN being set directly on resume,
> or else they hung somewhere in the resume code path.
>
> We already have a blacklist for these laptops but we still need
> this option, especially when debugging some suspend/resume problems,
> in case there are systems that need this workaround and are not yet
> in the blacklist.
>
> Signed-off-by: Zhang Rui <rui.zhang at intel.com>
> Acked-by: Rafael J. Wysocki <rjw at sisk.pl>
> Signed-off-by: Len Brown <len.brown at intel.com>
>
> (cherry picked from commit d7f0eea9e431e1b8b0742a74db1a9490730b2a25 upstream)
> BugLink: http://bugs.launchpad.net/bugs/553498
>
> Signed-off-by: Andy Whitcroft <apw at canonical.com>
> ---
> Documentation/kernel-parameters.txt | 5 ++++-
> arch/x86/kernel/acpi/sleep.c | 2 ++
> drivers/acpi/sleep.c | 29 +++++++++++++++++------------
> include/linux/acpi.h | 1 +
> 4 files changed, 24 insertions(+), 13 deletions(-)
>
> diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
> index 345c399..5f6aa11 100644
> --- a/Documentation/kernel-parameters.txt
> +++ b/Documentation/kernel-parameters.txt
> @@ -241,7 +241,7 @@ and is between 256 and 4096 characters. It is defined in the file
>
> acpi_sleep= [HW,ACPI] Sleep options
> Format: { s3_bios, s3_mode, s3_beep, s4_nohwsig,
> - old_ordering, s4_nonvs }
> + old_ordering, s4_nonvs, sci_force_enable }
> See Documentation/power/video.txt for information on
> s3_bios and s3_mode.
> s3_beep is for debugging; it makes the PC's speaker beep
> @@ -254,6 +254,9 @@ and is between 256 and 4096 characters. It is defined in the file
> of _PTS is used by default).
> s4_nonvs prevents the kernel from saving/restoring the
> ACPI NVS memory during hibernation.
> + sci_force_enable causes the kernel to set SCI_EN directly
> + on resume from S1/S3 (which is against the ACPI spec,
> + but some broken systems don't work without it).
>
> acpi_use_timer_override [HW,ACPI]
> Use timer override. For some broken Nvidia NF5 boards
> diff --git a/arch/x86/kernel/acpi/sleep.c b/arch/x86/kernel/acpi/sleep.c
> index ca93638..8b85734 100644
> --- a/arch/x86/kernel/acpi/sleep.c
> +++ b/arch/x86/kernel/acpi/sleep.c
> @@ -162,6 +162,8 @@ static int __init acpi_sleep_setup(char *str)
> #endif
> if (strncmp(str, "old_ordering", 12) == 0)
> acpi_old_suspend_ordering();
> + if (strncmp(str, "sci_force_enable", 16) == 0)
> + acpi_set_sci_en_on_resume();
> str = strchr(str, ',');
> if (str != NULL)
> str += strspn(str, ", \t");
> diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c
> index cf3101f..22f4831 100644
> --- a/drivers/acpi/sleep.c
> +++ b/drivers/acpi/sleep.c
> @@ -81,6 +81,23 @@ static int acpi_sleep_prepare(u32 acpi_state)
> #ifdef CONFIG_ACPI_SLEEP
> static u32 acpi_target_sleep_state = ACPI_STATE_S0;
> /*
> + * According to the ACPI specification the BIOS should make sure that ACPI is
> + * enabled and SCI_EN bit is set on wake-up from S1 - S3 sleep states. Still,
> + * some BIOSes don't do that and therefore we use acpi_enable() to enable ACPI
> + * on such systems during resume. Unfortunately that doesn't help in
> + * particularly pathological cases in which SCI_EN has to be set directly on
> + * resume, although the specification states very clearly that this flag is
> + * owned by the hardware. The set_sci_en_on_resume variable will be set in such
> + * cases.
> + */
> +static bool set_sci_en_on_resume;
> +
> +void __init acpi_set_sci_en_on_resume(void)
> +{
> + set_sci_en_on_resume = true;
> +}
> +
> +/*
> * ACPI 1.0 wants us to execute _PTS before suspending devices, so we allow the
> * user to request that behavior by using the 'acpi_old_suspend_ordering'
> * kernel command line option that causes the following variable to be set.
> @@ -170,18 +187,6 @@ static void acpi_pm_end(void)
> #endif /* CONFIG_ACPI_SLEEP */
>
> #ifdef CONFIG_SUSPEND
> -/*
> - * According to the ACPI specification the BIOS should make sure that ACPI is
> - * enabled and SCI_EN bit is set on wake-up from S1 - S3 sleep states. Still,
> - * some BIOSes don't do that and therefore we use acpi_enable() to enable ACPI
> - * on such systems during resume. Unfortunately that doesn't help in
> - * particularly pathological cases in which SCI_EN has to be set directly on
> - * resume, although the specification states very clearly that this flag is
> - * owned by the hardware. The set_sci_en_on_resume variable will be set in such
> - * cases.
> - */
> -static bool set_sci_en_on_resume;
> -
> extern void do_suspend_lowlevel(void);
>
> static u32 acpi_suspend_states[] = {
> diff --git a/include/linux/acpi.h b/include/linux/acpi.h
> index c010b94..07432a1 100644
> --- a/include/linux/acpi.h
> +++ b/include/linux/acpi.h
> @@ -251,6 +251,7 @@ int acpi_check_mem_region(resource_size_t start, resource_size_t n,
> void __init acpi_no_s4_hw_signature(void);
> void __init acpi_old_suspend_ordering(void);
> void __init acpi_s4_no_nvs(void);
> +void __init acpi_set_sci_en_on_resume(void);
> #endif /* CONFIG_PM_SLEEP */
>
> struct acpi_osc_context {
> --
> 1.7.0.4
>
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: This is a digitally signed message part
URL: <https://lists.ubuntu.com/archives/kernel-team/attachments/20100422/71f8fbee/attachment.sig>
More information about the kernel-team
mailing list