mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-24 19:45:06 +08:00
e44b7b7525
Move wakeup code to .c, so that video mode setting code can be shared between boot and wakeup. Remove nasty assembly code in 64-bit case by re-using trampoline code. Stack setup was fixed to clear high 16bits of %esp, maybe that fixes some machines. .c code sharing and morse code was done H. Peter Anvin, Sam Ravnborg reviewed kbuild related stuff, and it seems okay to him. Rafael did some cleanups. [rjw: * Made the patch stop breaking compilation on x86-32 * Added arch/x86/kernel/acpi/sleep.h * Got rid of compiler warnings in arch/x86/kernel/acpi/sleep.c * Fixed 32-bit compilation on x86-64 systems * Added include/asm-x86/trampoline.h and fixed the non-SMP compilation on 64-bit x86 * Removed arch/x86/kernel/acpi/sleep_32.c which was not used * Fixed some breakage caused by the integration of smpboot.c done under us in the meantime] Signed-off-by: Pavel Machek <pavel@suse.cz> Signed-off-by: H. Peter Anvin <hpa@zytor.com> Reviewed-by: Sam Ravnborg <sam@ravnborg.org> Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl> Signed-off-by: Ingo Molnar <mingo@elte.hu>
82 lines
1.5 KiB
C
82 lines
1.5 KiB
C
#include "wakeup.h"
|
|
#include "boot.h"
|
|
|
|
static void udelay(int loops)
|
|
{
|
|
while (loops--)
|
|
io_delay(); /* Approximately 1 us */
|
|
}
|
|
|
|
static void beep(unsigned int hz)
|
|
{
|
|
u8 enable;
|
|
|
|
if (!hz) {
|
|
enable = 0x00; /* Turn off speaker */
|
|
} else {
|
|
u16 div = 1193181/hz;
|
|
|
|
outb(0xb6, 0x43); /* Ctr 2, squarewave, load, binary */
|
|
io_delay();
|
|
outb(div, 0x42); /* LSB of counter */
|
|
io_delay();
|
|
outb(div >> 8, 0x42); /* MSB of counter */
|
|
io_delay();
|
|
|
|
enable = 0x03; /* Turn on speaker */
|
|
}
|
|
inb(0x61); /* Dummy read of System Control Port B */
|
|
io_delay();
|
|
outb(enable, 0x61); /* Enable timer 2 output to speaker */
|
|
io_delay();
|
|
}
|
|
|
|
#define DOT_HZ 880
|
|
#define DASH_HZ 587
|
|
#define US_PER_DOT 125000
|
|
|
|
/* Okay, this is totally silly, but it's kind of fun. */
|
|
static void send_morse(const char *pattern)
|
|
{
|
|
char s;
|
|
|
|
while ((s = *pattern++)) {
|
|
switch (s) {
|
|
case '.':
|
|
beep(DOT_HZ);
|
|
udelay(US_PER_DOT);
|
|
beep(0);
|
|
udelay(US_PER_DOT);
|
|
break;
|
|
case '-':
|
|
beep(DASH_HZ);
|
|
udelay(US_PER_DOT * 3);
|
|
beep(0);
|
|
udelay(US_PER_DOT);
|
|
break;
|
|
default: /* Assume it's a space */
|
|
udelay(US_PER_DOT * 3);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
void main(void)
|
|
{
|
|
/* Kill machine if structures are wrong */
|
|
if (wakeup_header.real_magic != 0x12345678)
|
|
while (1);
|
|
|
|
if (wakeup_header.realmode_flags & 4)
|
|
send_morse("...-");
|
|
|
|
if (wakeup_header.realmode_flags & 1)
|
|
asm volatile("lcallw $0xc000,$3");
|
|
|
|
if (wakeup_header.realmode_flags & 2) {
|
|
/* Need to call BIOS */
|
|
probe_cards(0);
|
|
set_mode(wakeup_header.video_mode);
|
|
}
|
|
}
|