Generic function to post the video bios. Based directly on the original patch by Ole Rohne. Signed-off-by: Michael Marineau <[email protected]> -- Michael Marineau [email protected] Oregon State University
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 <[email protected]> */ +#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:
signature.asc
Description: OpenPGP digital signature
- Follow-Ups:
- Re: [PATCH 1/3] Generic acpi vgapost
- From: Dave Airlie <[email protected]>
- Re: [PATCH 1/3] Generic acpi vgapost
- From: Jiri Slaby <[email protected]>
- Re: [PATCH 1/3] Generic acpi vgapost
- From: Pavel Machek <[email protected]>
- Re: [PATCH 1/3] Generic acpi vgapost
- References:
- [PATCH 0/3] Radeon acpi vgapost
- From: Michael Marineau <[email protected]>
- [PATCH 0/3] Radeon acpi vgapost
- Prev by Date: Incorrect CPU Frequency in /proc/cpuinfo
- Next by Date: Re: [PATCH 2/3] Radeon acpi vgapost
- Previous by thread: [PATCH 0/3] Radeon acpi vgapost
- Next by thread: Re: [PATCH 1/3] Generic acpi vgapost
- Index(es):