From: Michael Marineau <marineam@engr.orst.edu>
To: Andrew Morton <akpm@osdl.org>, benh@kernel.crashing.org
Cc: Pavel Machek <pavel@ucw.cz>, linux-kernel@vger.kernel.org
Subject: [PATCH 1/3] Generic acpi vgapost
Date: Sat, 27 Aug 2005 18:27:47 -0700 [thread overview]
Message-ID: <43111313.8000800@engr.orst.edu> (raw)
In-Reply-To: <43111298.80507@engr.orst.edu>
[-- Attachment #1.1: Type: text/plain, Size: 219 bytes --]
Generic function to post the video bios.
Based directly on the original patch by Ole Rohne.
Signed-off-by: Michael Marineau <marineam@engr.orst.edu>
--
Michael Marineau
marineam@engr.orst.edu
Oregon State University
[-- Attachment #1.2: acpi-vgapost.patch --]
[-- Type: text/x-patch, Size: 3466 bytes --]
Index: linux-2.6.13-rc7/arch/i386/kernel/acpi/sleep.c
===================================================================
--- linux-2.6.13-rc7.orig/arch/i386/kernel/acpi/sleep.c
+++ linux-2.6.13-rc7/arch/i386/kernel/acpi/sleep.c
@@ -5,6 +5,7 @@
* Copyright (C) 2001-2003 Pavel Machek <pavel@suse.cz>
*/
+#include <linux/module.h>
#include <linux/acpi.h>
#include <linux/bootmem.h>
#include <linux/dmi.h>
@@ -56,6 +57,34 @@ void acpi_restore_state_mem (void)
zap_low_mappings();
}
+/*
+ * acpi_vgapost
+ */
+
+extern void do_vgapost_lowlevel (unsigned long);
+
+void acpi_vgapost (unsigned long slot)
+{
+ unsigned long flags, saved_video_flags = acpi_video_flags;
+
+ acpi_video_flags = (slot & 0xffff) << 16 | 1;
+
+ /* Map low memory and copy information */
+ init_low_mapping(swapper_pg_dir, USER_PTRS_PER_PGD);
+ memcpy((void *) acpi_wakeup_address, &wakeup_start, &wakeup_end - &wakeup_start);
+ acpi_copy_wakeup_routine(acpi_wakeup_address);
+
+ /* Tunnel thru real mode */
+ local_irq_save(flags);
+ do_vgapost_lowlevel(acpi_wakeup_address);
+ local_irq_restore(flags);
+
+ /* Restore mapping etc */
+ zap_low_mappings();
+ acpi_video_flags = saved_video_flags;
+}
+EXPORT_SYMBOL (acpi_vgapost);
+
/**
* acpi_reserve_bootmem - do _very_ early ACPI initialisation
*
Index: linux-2.6.13-rc7/arch/i386/kernel/acpi/wakeup.S
===================================================================
--- linux-2.6.13-rc7.orig/arch/i386/kernel/acpi/wakeup.S
+++ linux-2.6.13-rc7/arch/i386/kernel/acpi/wakeup.S
@@ -171,6 +171,32 @@ check_vesa:
_setbad: jmp setbad
+#
+# Real mode switch - verbatim from reboot.c
+#
+go_real:
+ movl %cr0, %eax
+ andl $0x00000011, %eax
+ orl $0x60000000, %eax
+ movl %eax, %cr0
+ movl %eax, %cr3
+ movl %cr0, %ebx
+ andl $0x60000000, %ebx
+ jz 1f
+ wbinvd
+1: andb $0x10, %al
+ movl %eax, %cr0
+go_real_jmp: .byte 0xea
+go_real_jmp_off: .word 0x0000
+go_real_jmp_seg: .word 0x0000
+#
+# Real mode descriptor table
+#
+ .align 8
+go_real_desc: .quad 0x0000000000000000
+go_real_cseg: .quad 0x00009a000000ffff
+go_real_dseg: .quad 0x000092000000ffff
+
.code32
ALIGN
@@ -310,6 +336,59 @@ ENTRY(do_suspend_lowlevel_s4bios)
call acpi_enter_sleep_state_s4bios
ret
+ENTRY(do_vgapost_lowlevel)
+ # Convert target offset to physical address
+ movl %eax, %ecx
+ subl $__PAGE_OFFSET, %ecx
+ # Fixup GDT pointer
+ movl %ecx, %edx
+ addl $go_real_desc - wakeup_start, %edx
+ movl %edx, go_real_gdt + 2
+ # Fixup 16-bit CS descriptor
+ movl %ecx, %edx
+ movw %dx, go_real_cseg - wakeup_start + 2 (%eax)
+ shrl $16, %edx
+ movb %dl, go_real_cseg - wakeup_start + 4 (%eax)
+ movb %dh, go_real_cseg - wakeup_start + 7 (%eax)
+ # Fixup 16-bit jump
+ movl %ecx, %edx
+ shrl $4, %edx
+ movw %dx, go_real_jmp_seg - wakeup_start (%eax)
+ # Save state and registers
+ call save_processor_state
+ call save_registers
+ # Reload page table with low mapping
+ movl $swapper_pg_dir-__PAGE_OFFSET, %eax
+ movl %eax, %cr3
+ # Load IDTR and GDTR for real mode
+ lidt go_real_idt
+ lgdt go_real_gdt
+ # Load DS & al
+ movl $0x0010, %eax
+ movl %eax, %ss
+ movl %eax, %ds
+ movl %eax, %es
+ movl %eax, %fs
+ movl %eax, %gs
+ # Load CS
+ call $0x0008, $(go_real - wakeup_start)
+ # Phony return code
+ call restore_registers
+ call restore_processor_state
+ ret
+
+ .align 4
+ .word 0
+go_real_idt:
+ .word 0x3ff
+ .long 0
+
+ .align 4
+ .word 0
+go_real_gdt:
+ .word 3*8-1
+ .long 0
+
ALIGN
# saved registers
saved_gdt: .long 0,0
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 256 bytes --]
next prev parent reply other threads:[~2005-08-28 1:27 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-08-28 1:25 [PATCH 0/3] Radeon acpi vgapost Michael Marineau
2005-08-28 1:27 ` Michael Marineau [this message]
2005-08-28 8:07 ` [PATCH 1/3] Generic " Pavel Machek
2005-08-28 20:56 ` Jiri Slaby
2005-08-30 10:51 ` Dave Airlie
2005-08-28 1:31 ` [PATCH 2/3] Radeon " Michael Marineau
2005-08-28 1:34 ` [PATCH 3/3] Documentation update for radeonfb Michael Marineau
2005-08-28 5:12 ` [PATCH 0/3] Radeon acpi vgapost Nishanth Aravamudan
2005-08-28 7:44 ` Michael Marineau
2005-08-28 18:08 ` Nishanth Aravamudan
2005-08-28 6:54 ` Manuel Lauss
2005-08-28 7:31 ` [PATCH 4/3] Radeon acpi vgapost only Rv250 (M9) Michael Marineau
2005-08-28 12:50 ` [PATCH 0/3] Radeon acpi vgapost Matthew Garrett
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=43111313.8000800@engr.orst.edu \
--to=marineam@engr.orst.edu \
--cc=akpm@osdl.org \
--cc=benh@kernel.crashing.org \
--cc=linux-kernel@vger.kernel.org \
--cc=pavel@ucw.cz \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox