On Tue, 2015-05-05 at 16:41 +0100, Luis Henriques wrote: > On Tue, May 05, 2015 at 03:59:59PM +0100, Ben Hutchings wrote: > > On Tue, 2015-05-05 at 15:29 +0100, Luis Henriques wrote: > > > On Tue, May 05, 2015 at 10:10:04AM +0100, Luis Henriques wrote: > > > > On Mon, May 04, 2015 at 02:34:52PM +0100, Ben Hutchings wrote: > > > > > On Mon, 2015-05-04 at 12:20 +0100, Matt Fleming wrote: > > > > > > On Mon, 2015-05-04 at 02:33 +0100, Ben Hutchings wrote: > > > > > > > Would this be a sensible addition to 3.16-stable or any older stable > > > > > > > branch? > > > > > > > > > > > > > > commit 44be28e9dd9880dca3e2cbf7a844f2114e67f2cb > > > > > > > Author: Matt Fleming <matt.fleming@xxxxxxxxx> > > > > > > > Date: Fri Jun 13 12:39:55 2014 +0100 > > > > > > > > > > > > > > x86/reboot: Add EFI reboot quirk for ACPI Hardware Reduced flag > > > > > > > > > > > > I'm not sure what the support for ACPI hardware-reduced platforms (ASUS > > > > > > T100, etc) is like in the stable releases but if it does exist then yeah > > > > > > you probably want the above commit. The above commit should be a pretty > > > > > > low-risk change. > > > > > > > > > > I understand that the Asus T100 at least is mostly working under 3.16. > > > > > > > > > > > Be sure to also include commit 8562c99cdd30 ("efi/reboot: Add generic > > > > > > wrapper around EfiResetSystem()") and commit 0c5ed61adbdb ("efi/reboot: > > > > > > Allow powering off machines using EFI"). > > > > > > > > > > > Ok, it looks like the easy approach to bring this into 3.16 is to pick > > > the following commits (in this order): > > > > > > eeb9db09f738 x86/efi: Move all workarounds to a separate file quirks.c > > > 8562c99cdd30 efi/reboot: Add generic wrapper around EfiResetSystem() > > > 0c5ed61adbdb efi/reboot: Allow powering off machines using EFI > > > 44be28e9dd98 x86/reboot: Add EFI reboot quirk for ACPI Hardware Reduced flag > > > > > > All of these are clean cherry-picks (except for the last one that > > > needs same really small context adjustment). If there's no objection, > > > I'll be sending this out for review shortly. > > > > The first one is really too big according to stable rules. Sorry I > > raised this; I didn't realise there were all these dependencies. > > True, that commit simply moves code around but it's still huge. > > Anyway, a different approach would be to backport 44be28e9dd98 by > moving the changes done to quirks.c into efi.c. I'm attaching a > (just compile tested) backport bellow. > > Obviously, the 2 other commits are still required i.e. we're only > dropping eeb9db09f738 ("x86/efi: Move all workarounds to a separate > file quirks.c"). That would be my personal preference. Ben. > Cheers, > -- > Luís > > From 41aaf1bdee7e9423a35aee310703111eef96b6b3 Mon Sep 17 00:00:00 2001 > From: Matt Fleming <matt.fleming@xxxxxxxxx> > Date: Fri, 13 Jun 2014 12:39:55 +0100 > Subject: [PATCH] x86/reboot: Add EFI reboot quirk for ACPI Hardware Reduced > flag > > commit 44be28e9dd9880dca3e2cbf7a844f2114e67f2cb upstream. > > It appears that the BayTrail-T class of hardware requires EFI in order > to powerdown and reboot and no other reliable method exists. > > This quirk is generally applicable to all hardware that has the ACPI > Hardware Reduced bit set, since usually ACPI would be the preferred > method. > > Cc: Len Brown <len.brown@xxxxxxxxx> > Cc: Mark Salter <msalter@xxxxxxxxxx> > Cc: "Rafael J. Wysocki" <rafael.j.wysocki@xxxxxxxxx> > Signed-off-by: Matt Fleming <matt.fleming@xxxxxxxxx> > Cc: Ben Hutchings <ben@xxxxxxxxxxxxxxx> > [ luis: backported to 3.16: > - move changes from quirks.c into efi.c > - adjusted context ] > Signed-off-by: Luis Henriques <luis.henriques@xxxxxxxxxxxxx> > --- > arch/x86/include/asm/efi.h | 7 +++++++ > arch/x86/kernel/reboot.c | 18 ++++++++++++++++-- > arch/x86/platform/efi/efi.c | 23 +++++++++++++++++++++++ > drivers/firmware/efi/reboot.c | 8 ++++++++ > include/linux/efi.h | 1 + > 5 files changed, 55 insertions(+), 2 deletions(-) > > diff --git a/arch/x86/include/asm/efi.h b/arch/x86/include/asm/efi.h > index 1eb5f6433ad8..81396a9a9277 100644 > --- a/arch/x86/include/asm/efi.h > +++ b/arch/x86/include/asm/efi.h > @@ -156,6 +156,9 @@ static inline efi_status_t efi_thunk_set_virtual_address_map( > return EFI_SUCCESS; > } > #endif /* CONFIG_EFI_MIXED */ > + > +extern bool efi_reboot_required(void); > + > #else > /* > * IF EFI is not configured, have the EFI calls return -ENOSYS. > @@ -168,6 +171,10 @@ static inline efi_status_t efi_thunk_set_virtual_address_map( > #define efi_call5(_f, _a1, _a2, _a3, _a4, _a5) (-ENOSYS) > #define efi_call6(_f, _a1, _a2, _a3, _a4, _a5, _a6) (-ENOSYS) > static inline void parse_efi_setup(u64 phys_addr, u32 data_len) {} > +static inline bool efi_reboot_required(void) > +{ > + return false; > +} > #endif /* CONFIG_EFI */ > > #endif /* _ASM_X86_EFI_H */ > diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c > index 7c138543c500..587be13be0be 100644 > --- a/arch/x86/kernel/reboot.c > +++ b/arch/x86/kernel/reboot.c > @@ -28,6 +28,7 @@ > #include <linux/mc146818rtc.h> > #include <asm/realmode.h> > #include <asm/x86_init.h> > +#include <asm/efi.h> > > /* > * Power off function, if any > @@ -411,12 +412,25 @@ static struct dmi_system_id __initdata reboot_dmi_table[] = { > > static int __init reboot_init(void) > { > + int rv; > + > /* > * Only do the DMI check if reboot_type hasn't been overridden > * on the command line > */ > - if (reboot_default) > - dmi_check_system(reboot_dmi_table); > + if (!reboot_default) > + return 0; > + > + /* > + * The DMI quirks table takes precedence. If no quirks entry > + * matches and the ACPI Hardware Reduced bit is set, force EFI > + * reboot. > + */ > + rv = dmi_check_system(reboot_dmi_table); > + > + if (!rv && efi_reboot_required()) > + reboot_type = BOOT_EFI; > + > return 0; > } > core_initcall(reboot_init); > diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c > index 87fc96bcc13c..53a324606d11 100644 > --- a/arch/x86/platform/efi/efi.c > +++ b/arch/x86/platform/efi/efi.c > @@ -44,6 +44,7 @@ > #include <linux/io.h> > #include <linux/reboot.h> > #include <linux/bcd.h> > +#include <linux/acpi.h> > > #include <asm/setup.h> > #include <asm/efi.h> > @@ -1340,3 +1341,25 @@ void __init efi_apply_memmap_quirks(void) > if (is_uv_system()) > set_bit(EFI_OLD_MEMMAP, &efi.flags); > } > + > +/* > + * For most modern platforms the preferred method of powering off is via > + * ACPI. However, there are some that are known to require the use of > + * EFI runtime services and for which ACPI does not work at all. > + * > + * Using EFI is a last resort, to be used only if no other option > + * exists. > + */ > +bool efi_reboot_required(void) > +{ > + if (!acpi_gbl_reduced_hardware) > + return false; > + > + efi_reboot_quirk_mode = EFI_RESET_WARM; > + return true; > +} > + > +bool efi_poweroff_required(void) > +{ > + return !!acpi_gbl_reduced_hardware; > +} > diff --git a/drivers/firmware/efi/reboot.c b/drivers/firmware/efi/reboot.c > index e9eeeb3c6345..9c59d1c795d1 100644 > --- a/drivers/firmware/efi/reboot.c > +++ b/drivers/firmware/efi/reboot.c > @@ -5,6 +5,8 @@ > #include <linux/efi.h> > #include <linux/reboot.h> > > +int efi_reboot_quirk_mode = -1; > + > void efi_reboot(enum reboot_mode reboot_mode, const char *__unused) > { > int efi_mode; > @@ -22,6 +24,12 @@ void efi_reboot(enum reboot_mode reboot_mode, const char *__unused) > break; > } > > + /* > + * If a quirk forced an EFI reset mode, always use that. > + */ > + if (efi_reboot_quirk_mode != -1) > + efi_mode = efi_reboot_quirk_mode; > + > efi.reset_system(efi_mode, EFI_SUCCESS, 0, NULL); > } > > diff --git a/include/linux/efi.h b/include/linux/efi.h > index 2539aff31808..b3fac7c1656c 100644 > --- a/include/linux/efi.h > +++ b/include/linux/efi.h > @@ -876,6 +876,7 @@ extern void efi_reserve_boot_services(void); > extern int efi_get_fdt_params(struct efi_fdt_params *params, int verbose); > extern struct efi_memory_map memmap; > > +extern int efi_reboot_quirk_mode; > extern bool efi_poweroff_required(void); > > /* Iterate through an efi_memory_map */ -- Ben Hutchings Once a job is fouled up, anything done to improve it makes it worse.
Attachment:
signature.asc
Description: This is a digitally signed message part