Module Name:    src
Committed By:   jmcneill
Date:           Mon Aug 24 02:15:46 UTC 2009

Modified Files:
        src/sys/arch/amd64/acpi: acpi_wakecode.S
        src/sys/arch/i386/acpi: acpi_wakecode.S
        src/sys/arch/i386/stand/lib: vbe.c
        src/sys/arch/x86/acpi: acpi_wakeup.c
        src/sys/arch/x86/include: bootinfo.h
        src/sys/arch/x86/x86: genfb_machdep.c

Log Message:
Pass the VBE mode number from the bootloader to the kernel, and then
make the ACPI wakecode aware of it. Restore the desired VBE mode on resume
when acpi_vbios_reset=1, so suspend/resume with genfb console will work.


To generate a diff of this commit:
cvs rdiff -u -r1.7 -r1.8 src/sys/arch/amd64/acpi/acpi_wakecode.S
cvs rdiff -u -r1.12 -r1.13 src/sys/arch/i386/acpi/acpi_wakecode.S
cvs rdiff -u -r1.2 -r1.3 src/sys/arch/i386/stand/lib/vbe.c
cvs rdiff -u -r1.15 -r1.16 src/sys/arch/x86/acpi/acpi_wakeup.c
cvs rdiff -u -r1.15 -r1.16 src/sys/arch/x86/include/bootinfo.h
cvs rdiff -u -r1.2 -r1.3 src/sys/arch/x86/x86/genfb_machdep.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/amd64/acpi/acpi_wakecode.S
diff -u src/sys/arch/amd64/acpi/acpi_wakecode.S:1.7 src/sys/arch/amd64/acpi/acpi_wakecode.S:1.8
--- src/sys/arch/amd64/acpi/acpi_wakecode.S:1.7	Sun May 25 17:20:29 2008
+++ src/sys/arch/amd64/acpi/acpi_wakecode.S	Mon Aug 24 02:15:46 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: acpi_wakecode.S,v 1.7 2008/05/25 17:20:29 joerg Exp $	*/
+/*	$NetBSD: acpi_wakecode.S,v 1.8 2009/08/24 02:15:46 jmcneill Exp $	*/
 
 /*-
  * Copyright (c) 2007 Joerg Sonnenberger <jo...@netbsd.org>
@@ -125,6 +125,20 @@
 	outb	%al,$0x61
 1:
 
+	/* If we need to restore a VESA VBE mode, do it now */
+	cmpb	$0,WAKEUP_vesa_modenum
+	je	1f
+	movw	WAKEUP_vesa_modenum,%bx
+	orw	$0x4000,%bx
+	movw	$0x4f02,%ax
+	int	$0x10
+
+	/* paranoia */
+	movw	%cs,%ax
+	movw	%ax,%ds
+	movw	%ax,%ss
+1:
+
 	/* Load temporary 32bit GDT */
 	data32 addr32 lgdt	tmp_gdt
 

Index: src/sys/arch/i386/acpi/acpi_wakecode.S
diff -u src/sys/arch/i386/acpi/acpi_wakecode.S:1.12 src/sys/arch/i386/acpi/acpi_wakecode.S:1.13
--- src/sys/arch/i386/acpi/acpi_wakecode.S:1.12	Mon Apr 28 20:23:23 2008
+++ src/sys/arch/i386/acpi/acpi_wakecode.S	Mon Aug 24 02:15:46 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: acpi_wakecode.S,v 1.12 2008/04/28 20:23:23 martin Exp $	*/
+/*	$NetBSD: acpi_wakecode.S,v 1.13 2009/08/24 02:15:46 jmcneill Exp $	*/
 
 /*-
  * Copyright (c) 2002 The NetBSD Foundation, Inc.
@@ -121,6 +121,20 @@
 	outb	%al,$0x61
 1:
 
+	/* If we need to restore a VESA VBE mode, do it now */
+	cmpb	$0,WAKEUP_vesa_modenum
+	je	1f
+	movw	WAKEUP_vesa_modenum,%bx
+	orw	$0x4000,%bx
+	movw	$0x4f02,%ax
+	int	$0x10
+
+	/* paranoia */
+	movw	%cs,%ax
+	movw	%ax,%ds
+	movw	%ax,%ss
+1:
+
 	/* Load GDT while non-paging */
 	lgdt	tmp_gdt
 
@@ -199,5 +213,7 @@
 
 	.global WAKEUP_vbios_reset
 WAKEUP_vbios_reset:	.byte 0
+	.global WAKEUP_vesa_modenum
+WAKEUP_vesa_modenum:	.word 0
 	.global WAKEUP_beep_on_reset
 WAKEUP_beep_on_reset:	.byte 0

Index: src/sys/arch/i386/stand/lib/vbe.c
diff -u src/sys/arch/i386/stand/lib/vbe.c:1.2 src/sys/arch/i386/stand/lib/vbe.c:1.3
--- src/sys/arch/i386/stand/lib/vbe.c:1.2	Tue Feb 17 23:17:39 2009
+++ src/sys/arch/i386/stand/lib/vbe.c	Mon Aug 24 02:15:46 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: vbe.c,v 1.2 2009/02/17 23:17:39 jmcneill Exp $ */
+/* $NetBSD: vbe.c,v 1.3 2009/08/24 02:15:46 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2009 Jared D. McNeill <jmcne...@invisible.ca>
@@ -166,6 +166,7 @@
 	fb.gpos = mi.GreenFieldPosition;
 	fb.bnum = mi.BlueMaskSize;
 	fb.bpos = mi.BlueFieldPosition;
+	fb.vbemode = modenum;
 
 	framebuffer_configure(&fb);
 

Index: src/sys/arch/x86/acpi/acpi_wakeup.c
diff -u src/sys/arch/x86/acpi/acpi_wakeup.c:1.15 src/sys/arch/x86/acpi/acpi_wakeup.c:1.16
--- src/sys/arch/x86/acpi/acpi_wakeup.c:1.15	Tue Aug 18 16:41:03 2009
+++ src/sys/arch/x86/acpi/acpi_wakeup.c	Mon Aug 24 02:15:46 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: acpi_wakeup.c,v 1.15 2009/08/18 16:41:03 jmcneill Exp $	*/
+/*	$NetBSD: acpi_wakeup.c,v 1.16 2009/08/24 02:15:46 jmcneill Exp $	*/
 
 /*-
  * Copyright (c) 2002 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: acpi_wakeup.c,v 1.15 2009/08/18 16:41:03 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: acpi_wakeup.c,v 1.16 2009/08/24 02:15:46 jmcneill Exp $");
 
 /*-
  * Copyright (c) 2001 Takanori Watanabe <takaw...@jp.freebsd.org>
@@ -111,6 +111,7 @@
 
 static int acpi_md_node = CTL_EOL;
 int acpi_md_vbios_reset = 1; /* Referenced by dev/pci/vga_pci.c */
+int acpi_md_vesa_modenum = 0; /* Referenced by arch/x86/x86/genfb_machdep.c */
 static int acpi_md_beep_on_reset = 0;
 
 static int	sysctl_md_acpi_vbios_reset(SYSCTLFN_ARGS);
@@ -150,9 +151,11 @@
 	memcpy( (void *)acpi_wakeup_vaddr, wakecode, sizeof(wakecode));
 
 	if (CPU_IS_PRIMARY(ci)) {
+		WAKECODE_FIXUP(WAKEUP_vesa_modenum, uint16_t, acpi_md_vesa_modenum);
 		WAKECODE_FIXUP(WAKEUP_vbios_reset, uint8_t, acpi_md_vbios_reset);
 		WAKECODE_FIXUP(WAKEUP_beep_on_reset, uint8_t, acpi_md_beep_on_reset);
 	} else {
+		WAKECODE_FIXUP(WAKEUP_vesa_modenum, uint16_t, 0);
 		WAKECODE_FIXUP(WAKEUP_vbios_reset, uint8_t, 0);
 		WAKECODE_FIXUP(WAKEUP_beep_on_reset, uint8_t, 0);
 	}

Index: src/sys/arch/x86/include/bootinfo.h
diff -u src/sys/arch/x86/include/bootinfo.h:1.15 src/sys/arch/x86/include/bootinfo.h:1.16
--- src/sys/arch/x86/include/bootinfo.h:1.15	Mon Feb 16 22:29:33 2009
+++ src/sys/arch/x86/include/bootinfo.h	Mon Aug 24 02:15:46 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: bootinfo.h,v 1.15 2009/02/16 22:29:33 jmcneill Exp $	*/
+/*	$NetBSD: bootinfo.h,v 1.16 2009/08/24 02:15:46 jmcneill Exp $	*/
 
 /*
  * Copyright (c) 1997
@@ -195,7 +195,8 @@
 	uint8_t rpos;
 	uint8_t gpos;
 	uint8_t bpos;
-	uint8_t reserved[16];
+	uint16_t vbemode;
+	uint8_t reserved[14];
 };
 
 #endif /* _LOCORE */

Index: src/sys/arch/x86/x86/genfb_machdep.c
diff -u src/sys/arch/x86/x86/genfb_machdep.c:1.2 src/sys/arch/x86/x86/genfb_machdep.c:1.3
--- src/sys/arch/x86/x86/genfb_machdep.c:1.2	Tue Feb 17 02:21:13 2009
+++ src/sys/arch/x86/x86/genfb_machdep.c	Mon Aug 24 02:15:46 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: genfb_machdep.c,v 1.2 2009/02/17 02:21:13 jmcneill Exp $ */
+/* $NetBSD: genfb_machdep.c,v 1.3 2009/08/24 02:15:46 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2009 Jared D. McNeill <jmcne...@invisible.ca>
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: genfb_machdep.c,v 1.2 2009/02/17 02:21:13 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: genfb_machdep.c,v 1.3 2009/08/24 02:15:46 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/conf.h>
@@ -52,10 +52,15 @@
 
 #include "wsdisplay.h"
 #include "genfb.h"
+#include "acpica.h"
 
 #if NWSDISPLAY > 0 && NGENFB > 0
 struct vcons_screen x86_genfb_console_screen;
 
+#if NACPICA > 0
+extern int acpi_md_vesa_modenum;
+#endif
+
 static struct wsscreen_descr x86_genfb_stdscreen = {
 	"std",
 	0, 0,
@@ -104,6 +109,10 @@
 		return 0;
 	}
 
+#if NACPICA > 0
+	acpi_md_vesa_modenum = fbinfo->vbemode;
+#endif
+
 	wsfont_init();
 
 	ri->ri_width = fbinfo->width;

Reply via email to