1
2
3
4
5
6
7
8
9
10
11
12#include <stdarg.h>
13#include <linux/types.h>
14#include <linux/sched.h>
15#include <linux/console.h>
16#include <linux/init.h>
17#include <asm/processor.h>
18#include <asm/udbg.h>
19
20void (*udbg_putc)(char c);
21void (*udbg_flush)(void);
22int (*udbg_getc)(void);
23int (*udbg_getc_poll)(void);
24
25
26
27
28
29void __init udbg_early_init(void)
30{
31#if defined(CONFIG_PPC_EARLY_DEBUG_LPAR)
32
33 udbg_init_debug_lpar();
34#elif defined(CONFIG_PPC_EARLY_DEBUG_G5)
35
36 udbg_init_pmac_realmode();
37#elif defined(CONFIG_PPC_EARLY_DEBUG_RTAS_PANEL)
38
39 udbg_init_rtas_panel();
40#elif defined(CONFIG_PPC_EARLY_DEBUG_RTAS_CONSOLE)
41
42 udbg_init_rtas_console();
43#elif defined(CONFIG_PPC_EARLY_DEBUG_MAPLE)
44
45 udbg_init_maple_realmode();
46#elif defined(CONFIG_PPC_EARLY_DEBUG_ISERIES)
47
48 udbg_init_iseries();
49#elif defined(CONFIG_PPC_EARLY_DEBUG_BEAT)
50 udbg_init_debug_beat();
51#elif defined(CONFIG_PPC_EARLY_DEBUG_PAS_REALMODE)
52 udbg_init_pas_realmode();
53#elif defined(CONFIG_BOOTX_TEXT)
54 udbg_init_btext();
55#elif defined(CONFIG_PPC_EARLY_DEBUG_44x)
56
57 udbg_init_44x_as1();
58#elif defined(CONFIG_PPC_EARLY_DEBUG_40x)
59
60 udbg_init_40x_realmode();
61#elif defined(CONFIG_PPC_EARLY_DEBUG_CPM)
62 udbg_init_cpm();
63#endif
64
65#ifdef CONFIG_PPC_EARLY_DEBUG
66 console_loglevel = 10;
67#endif
68}
69
70
71void udbg_puts(const char *s)
72{
73 if (udbg_putc) {
74 char c;
75
76 if (s && *s != '\0') {
77 while ((c = *s++) != '\0')
78 udbg_putc(c);
79 }
80
81 if (udbg_flush)
82 udbg_flush();
83 }
84#if 0
85 else {
86 printk("%s", s);
87 }
88#endif
89}
90
91int udbg_write(const char *s, int n)
92{
93 int remain = n;
94 char c;
95
96 if (!udbg_putc)
97 return 0;
98
99 if (s && *s != '\0') {
100 while (((c = *s++) != '\0') && (remain-- > 0)) {
101 udbg_putc(c);
102 }
103 }
104
105 if (udbg_flush)
106 udbg_flush();
107
108 return n - remain;
109}
110
111int udbg_read(char *buf, int buflen)
112{
113 char *p = buf;
114 int i, c;
115
116 if (!udbg_getc)
117 return 0;
118
119 for (i = 0; i < buflen; ++i) {
120 do {
121 c = udbg_getc();
122 if (c == -1 && i == 0)
123 return -1;
124
125 } while (c == 0x11 || c == 0x13);
126 if (c == 0 || c == -1)
127 break;
128 *p++ = c;
129 }
130
131 return i;
132}
133
134#define UDBG_BUFSIZE 256
135void udbg_printf(const char *fmt, ...)
136{
137 char buf[UDBG_BUFSIZE];
138 va_list args;
139
140 va_start(args, fmt);
141 vsnprintf(buf, UDBG_BUFSIZE, fmt, args);
142 udbg_puts(buf);
143 va_end(args);
144}
145
146void __init udbg_progress(char *s, unsigned short hex)
147{
148 udbg_puts(s);
149 udbg_puts("\n");
150}
151
152
153
154
155static void udbg_console_write(struct console *con, const char *s,
156 unsigned int n)
157{
158 udbg_write(s, n);
159}
160
161static struct console udbg_console = {
162 .name = "udbg",
163 .write = udbg_console_write,
164 .flags = CON_PRINTBUFFER | CON_ENABLED | CON_BOOT | CON_ANYTIME,
165 .index = 0,
166};
167
168static int early_console_initialized;
169
170
171
172
173
174void __init register_early_udbg_console(void)
175{
176 if (early_console_initialized)
177 return;
178
179 if (!udbg_putc)
180 return;
181
182 if (strstr(boot_command_line, "udbg-immortal")) {
183 printk(KERN_INFO "early console immortal !\n");
184 udbg_console.flags &= ~CON_BOOT;
185 }
186 early_console_initialized = 1;
187 register_console(&udbg_console);
188}
189
190#if 0
191console_initcall(register_udbg_console);
192#endif
193