Merge tag 'sched-urgent-2020-12-27' of git://git.kernel.org/pub/scm/linux/kernel...
[linux/fpc-iii.git] / arch / x86 / boot / tty.c
blobf7eb976b0a4b2475a5bf16d1049412bcf463b3e4
1 // SPDX-License-Identifier: GPL-2.0-only
2 /* -*- linux-c -*- ------------------------------------------------------- *
4 * Copyright (C) 1991, 1992 Linus Torvalds
5 * Copyright 2007 rPath, Inc. - All Rights Reserved
6 * Copyright 2009 Intel Corporation; author H. Peter Anvin
8 * ----------------------------------------------------------------------- */
11 * Very simple screen and serial I/O
14 #include "boot.h"
16 int early_serial_base;
18 #define XMTRDY 0x20
20 #define TXR 0 /* Transmit register (WRITE) */
21 #define LSR 5 /* Line Status */
24 * These functions are in .inittext so they can be used to signal
25 * error during initialization.
28 static void __section(".inittext") serial_putchar(int ch)
30 unsigned timeout = 0xffff;
32 while ((inb(early_serial_base + LSR) & XMTRDY) == 0 && --timeout)
33 cpu_relax();
35 outb(ch, early_serial_base + TXR);
38 static void __section(".inittext") bios_putchar(int ch)
40 struct biosregs ireg;
42 initregs(&ireg);
43 ireg.bx = 0x0007;
44 ireg.cx = 0x0001;
45 ireg.ah = 0x0e;
46 ireg.al = ch;
47 intcall(0x10, &ireg, NULL);
50 void __section(".inittext") putchar(int ch)
52 if (ch == '\n')
53 putchar('\r'); /* \n -> \r\n */
55 bios_putchar(ch);
57 if (early_serial_base != 0)
58 serial_putchar(ch);
61 void __section(".inittext") puts(const char *str)
63 while (*str)
64 putchar(*str++);
68 * Read the CMOS clock through the BIOS, and return the
69 * seconds in BCD.
72 static u8 gettime(void)
74 struct biosregs ireg, oreg;
76 initregs(&ireg);
77 ireg.ah = 0x02;
78 intcall(0x1a, &ireg, &oreg);
80 return oreg.dh;
84 * Read from the keyboard
86 int getchar(void)
88 struct biosregs ireg, oreg;
90 initregs(&ireg);
91 /* ireg.ah = 0x00; */
92 intcall(0x16, &ireg, &oreg);
94 return oreg.al;
97 static int kbd_pending(void)
99 struct biosregs ireg, oreg;
101 initregs(&ireg);
102 ireg.ah = 0x01;
103 intcall(0x16, &ireg, &oreg);
105 return !(oreg.eflags & X86_EFLAGS_ZF);
108 void kbd_flush(void)
110 for (;;) {
111 if (!kbd_pending())
112 break;
113 getchar();
117 int getchar_timeout(void)
119 int cnt = 30;
120 int t0, t1;
122 t0 = gettime();
124 while (cnt) {
125 if (kbd_pending())
126 return getchar();
128 t1 = gettime();
129 if (t0 != t1) {
130 cnt--;
131 t0 = t1;
135 return 0; /* Timeout! */