-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
x86, setup: reorganize the early console setup
Separate early_serial_console from tty.c This allows for reuse of early_serial_console.c/string.c/printf.c/cmdline.c in boot/compressed/. -v2: according to hpa, don't include string.c etc -v3: compressed/misc.c must have early_serial_base as static, so move it back to tty.c for setup code Signed-off-by: Yinghai Lu <yinghai@kernel.org> LKML-Reference: <4C568D2B.205@kernel.org> Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
- Loading branch information
Yinghai Lu
authored and
H. Peter Anvin
committed
Aug 2, 2010
1 parent
22a57f5
commit f4ed287
Showing
7 changed files
with
186 additions
and
163 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,139 @@ | ||
#include "boot.h" | ||
|
||
#define DEFAULT_SERIAL_PORT 0x3f8 /* ttyS0 */ | ||
|
||
#define XMTRDY 0x20 | ||
|
||
#define DLAB 0x80 | ||
|
||
#define TXR 0 /* Transmit register (WRITE) */ | ||
#define RXR 0 /* Receive register (READ) */ | ||
#define IER 1 /* Interrupt Enable */ | ||
#define IIR 2 /* Interrupt ID */ | ||
#define FCR 2 /* FIFO control */ | ||
#define LCR 3 /* Line control */ | ||
#define MCR 4 /* Modem control */ | ||
#define LSR 5 /* Line Status */ | ||
#define MSR 6 /* Modem Status */ | ||
#define DLL 0 /* Divisor Latch Low */ | ||
#define DLH 1 /* Divisor latch High */ | ||
|
||
#define DEFAULT_BAUD 9600 | ||
|
||
static void early_serial_init(int port, int baud) | ||
{ | ||
unsigned char c; | ||
unsigned divisor; | ||
|
||
outb(0x3, port + LCR); /* 8n1 */ | ||
outb(0, port + IER); /* no interrupt */ | ||
outb(0, port + FCR); /* no fifo */ | ||
outb(0x3, port + MCR); /* DTR + RTS */ | ||
|
||
divisor = 115200 / baud; | ||
c = inb(port + LCR); | ||
outb(c | DLAB, port + LCR); | ||
outb(divisor & 0xff, port + DLL); | ||
outb((divisor >> 8) & 0xff, port + DLH); | ||
outb(c & ~DLAB, port + LCR); | ||
|
||
early_serial_base = port; | ||
} | ||
|
||
static void parse_earlyprintk(void) | ||
{ | ||
int baud = DEFAULT_BAUD; | ||
char arg[32]; | ||
int pos = 0; | ||
int port = 0; | ||
|
||
if (cmdline_find_option("earlyprintk", arg, sizeof arg) > 0) { | ||
char *e; | ||
|
||
if (!strncmp(arg, "serial", 6)) { | ||
port = DEFAULT_SERIAL_PORT; | ||
pos += 6; | ||
} | ||
|
||
if (arg[pos] == ',') | ||
pos++; | ||
|
||
if (!strncmp(arg, "ttyS", 4)) { | ||
static const int bases[] = { 0x3f8, 0x2f8 }; | ||
int idx = 0; | ||
|
||
if (!strncmp(arg + pos, "ttyS", 4)) | ||
pos += 4; | ||
|
||
if (arg[pos++] == '1') | ||
idx = 1; | ||
|
||
port = bases[idx]; | ||
} | ||
|
||
if (arg[pos] == ',') | ||
pos++; | ||
|
||
baud = simple_strtoull(arg + pos, &e, 0); | ||
if (baud == 0 || arg + pos == e) | ||
baud = DEFAULT_BAUD; | ||
} | ||
|
||
if (port) | ||
early_serial_init(port, baud); | ||
} | ||
|
||
#define BASE_BAUD (1843200/16) | ||
static unsigned int probe_baud(int port) | ||
{ | ||
unsigned char lcr, dll, dlh; | ||
unsigned int quot; | ||
|
||
lcr = inb(port + LCR); | ||
outb(lcr | DLAB, port + LCR); | ||
dll = inb(port + DLL); | ||
dlh = inb(port + DLH); | ||
outb(lcr, port + LCR); | ||
quot = (dlh << 8) | dll; | ||
|
||
return BASE_BAUD / quot; | ||
} | ||
|
||
static void parse_console_uart8250(void) | ||
{ | ||
char optstr[64], *options; | ||
int baud = DEFAULT_BAUD; | ||
int port = 0; | ||
|
||
/* | ||
* console=uart8250,io,0x3f8,115200n8 | ||
* need to make sure it is last one console ! | ||
*/ | ||
if (cmdline_find_option("console", optstr, sizeof optstr) <= 0) | ||
return; | ||
|
||
options = optstr; | ||
|
||
if (!strncmp(options, "uart8250,io,", 12)) | ||
port = simple_strtoull(options + 12, &options, 0); | ||
else if (!strncmp(options, "uart,io,", 8)) | ||
port = simple_strtoull(options + 8, &options, 0); | ||
else | ||
return; | ||
|
||
if (options && (options[0] == ',')) | ||
baud = simple_strtoull(options + 1, &options, 0); | ||
else | ||
baud = probe_baud(port); | ||
|
||
if (port) | ||
early_serial_init(port, baud); | ||
} | ||
|
||
void console_init(void) | ||
{ | ||
parse_earlyprintk(); | ||
|
||
if (!early_serial_base) | ||
parse_console_uart8250(); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
#ifndef BOOT_ISDIGIT_H | ||
|
||
#define BOOT_ISDIGIT_H | ||
|
||
static inline int isdigit(int ch) | ||
{ | ||
return (ch >= '0') && (ch <= '9'); | ||
} | ||
|
||
static inline int isxdigit(int ch) | ||
{ | ||
if (isdigit(ch)) | ||
return true; | ||
|
||
if ((ch >= 'a') && (ch <= 'f')) | ||
return true; | ||
|
||
return (ch >= 'A') && (ch <= 'F'); | ||
} | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.