On 11/05/2012 12:35 PM, Ondrej Zary wrote: > On Friday 26 October 2012 10:56:44 Ondrej Zary wrote: >> Some MSI laptop BIOSes are broken - INT 15h code uses port 92h to enable >> A20 line but resume code assumes that KBC was used. >> The laptop will not resume from S3 otherwise but powers off after a while >> and then powers on again stuck with a blank screen. >> >> Fix it by enabling A20 using KBC. Affected laptop list and DMI data are >> from bug reports at Ubuntu Launchpad. >> >> Also add kernel parameter to easily activate this quirk on any system. >> >> Only compile tested. The original patch was tested with EX600 and PR200. >> >> Fixes https://bugzilla.kernel.org/show_bug.cgi?id=12878 > > The bug was marked as RESOLVED CODE_FIX but I wonder what happened to this > patch. Was it applied? Or is someone working on a better way to fix this > problem? > Sorry, I managed to forget about this. Is there any way you could test this patch by any chance? I would be a lot happier if this works as a general solution rather than relying on a quirk... -hpa
>From 5513340abd845eaa28fe2394f7e0296599f2d9e7 Mon Sep 17 00:00:00 2001 From: "H. Peter Anvin" <hpa@xxxxxxxxxxxxxxx> Date: Mon, 10 Dec 2012 13:17:48 -0800 Subject: [PATCH] x86, suspend: Run A20 test on resume If A20 is disabled on resume, we may have to explicitly enable it. Rather than creating a bunch of ad hoc code, use the same code we would on system startup. Note: the startup code implicitly assumes BIOS, specifically that int $0x15 is enabled. However, for non-BIOS platforms to have A20 closed on resume seems extremely unlikely, since pretty much all non-BIOS firmware run in 32- or 64-bit mode. Reported-by: Ondrej Zary <linux@xxxxxxxxxxxxxxxxxxxx> Link: http://lkml.kernel.org/r/201210240847.52417.linux@xxxxxxxxxxxxxxxxxxxx Signed-off-by: H. Peter Anvin <hpa@xxxxxxxxxxxxxxx> --- arch/x86/realmode/rm/Makefile | 2 +- arch/x86/realmode/rm/a20.c | 1 + arch/x86/realmode/rm/wakemain.c | 3 +++ 3 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 arch/x86/realmode/rm/a20.c diff --git a/arch/x86/realmode/rm/Makefile b/arch/x86/realmode/rm/Makefile index 8869287..7e2ff68 100644 --- a/arch/x86/realmode/rm/Makefile +++ b/arch/x86/realmode/rm/Makefile @@ -10,7 +10,7 @@ always := realmode.bin realmode.relocs wakeup-objs := wakeup_asm.o wakemain.o video-mode.o -wakeup-objs += copy.o bioscall.o regs.o +wakeup-objs += copy.o bioscall.o regs.o a20.o # The link order of the video-*.o modules can matter. In particular, # video-vga.o *must* be listed first, followed by video-vesa.o. # Hardware-specific drivers should follow in the order they should be diff --git a/arch/x86/realmode/rm/a20.c b/arch/x86/realmode/rm/a20.c new file mode 100644 index 0000000..e71d518 --- /dev/null +++ b/arch/x86/realmode/rm/a20.c @@ -0,0 +1 @@ +#include "../../boot/a20.c" diff --git a/arch/x86/realmode/rm/wakemain.c b/arch/x86/realmode/rm/wakemain.c index 91405d5..6e0d548 100644 --- a/arch/x86/realmode/rm/wakemain.c +++ b/arch/x86/realmode/rm/wakemain.c @@ -79,4 +79,7 @@ void main(void) probe_cards(0); set_mode(wakeup_header.video_mode); } + + /* If A20 is closed, fix now */ + enable_a20(); } -- 1.7.11.7