diff options
author | Ishizaki Kou <kou.ishizaki@toshiba.co.jp> | 2007-02-02 02:43:21 -0500 |
---|---|---|
committer | Paul Mackerras <paulus@samba.org> | 2007-02-06 22:03:21 -0500 |
commit | d7480a9feaa970d9c37462f21bc27ebab2c56b0b (patch) | |
tree | 4dbd599f52d6d6abd96d11371e5aa00611854d55 /arch | |
parent | fe4a0cf1c2e79c3c256992c4f731734ecacb45c3 (diff) |
[POWERPC] Celleb: support udbg
This patch adds udbg support for Celleb platform.
Signed-off-by: Kou Ishizaki <kou.ishizaki@toshiba.co.jp>
Acked-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Paul Mackerras <paulus@samba.org>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/powerpc/kernel/udbg.c | 2 | ||||
-rw-r--r-- | arch/powerpc/platforms/celleb/udbg_beat.c | 97 |
2 files changed, 99 insertions, 0 deletions
diff --git a/arch/powerpc/kernel/udbg.c b/arch/powerpc/kernel/udbg.c index 5730906b23d5..e225a761dc2a 100644 --- a/arch/powerpc/kernel/udbg.c +++ b/arch/powerpc/kernel/udbg.c | |||
@@ -45,6 +45,8 @@ void __init udbg_early_init(void) | |||
45 | #elif defined(CONFIG_PPC_EARLY_DEBUG_ISERIES) | 45 | #elif defined(CONFIG_PPC_EARLY_DEBUG_ISERIES) |
46 | /* For iSeries - hit Ctrl-x Ctrl-x to see the output */ | 46 | /* For iSeries - hit Ctrl-x Ctrl-x to see the output */ |
47 | udbg_init_iseries(); | 47 | udbg_init_iseries(); |
48 | #elif defined(CONFIG_PPC_EARLY_DEBUG_BEAT) | ||
49 | udbg_init_debug_beat(); | ||
48 | #endif | 50 | #endif |
49 | } | 51 | } |
50 | 52 | ||
diff --git a/arch/powerpc/platforms/celleb/udbg_beat.c b/arch/powerpc/platforms/celleb/udbg_beat.c new file mode 100644 index 000000000000..d888c4674c62 --- /dev/null +++ b/arch/powerpc/platforms/celleb/udbg_beat.c | |||
@@ -0,0 +1,97 @@ | |||
1 | /* | ||
2 | * udbg function for Beat | ||
3 | * | ||
4 | * (C) Copyright 2006 TOSHIBA CORPORATION | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License along | ||
17 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
18 | * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||
19 | */ | ||
20 | |||
21 | #include <linux/kernel.h> | ||
22 | #include <linux/console.h> | ||
23 | |||
24 | #include <asm/machdep.h> | ||
25 | #include <asm/prom.h> | ||
26 | #include <asm/udbg.h> | ||
27 | |||
28 | #include "beat.h" | ||
29 | |||
30 | #define celleb_vtermno 0 | ||
31 | |||
32 | static void udbg_putc_beat(char c) | ||
33 | { | ||
34 | unsigned long rc; | ||
35 | |||
36 | if (c == '\n') | ||
37 | udbg_putc_beat('\r'); | ||
38 | |||
39 | rc = beat_put_term_char(celleb_vtermno, 1, (uint64_t)c << 56, 0); | ||
40 | } | ||
41 | |||
42 | /* Buffered chars getc */ | ||
43 | static long inbuflen; | ||
44 | static long inbuf[2]; /* must be 2 longs */ | ||
45 | |||
46 | static int udbg_getc_poll_beat(void) | ||
47 | { | ||
48 | /* The interface is tricky because it may return up to 16 chars. | ||
49 | * We save them statically for future calls to udbg_getc(). | ||
50 | */ | ||
51 | char ch, *buf = (char *)inbuf; | ||
52 | int i; | ||
53 | long rc; | ||
54 | if (inbuflen == 0) { | ||
55 | /* get some more chars. */ | ||
56 | inbuflen = 0; | ||
57 | rc = beat_get_term_char(celleb_vtermno, &inbuflen, inbuf+0, inbuf+1); | ||
58 | if (rc != 0) | ||
59 | inbuflen = 0; /* otherwise inbuflen is garbage */ | ||
60 | } | ||
61 | if (inbuflen <= 0 || inbuflen > 16) { | ||
62 | /* Catch error case as well as other oddities (corruption) */ | ||
63 | inbuflen = 0; | ||
64 | return -1; | ||
65 | } | ||
66 | ch = buf[0]; | ||
67 | for (i = 1; i < inbuflen; i++) /* shuffle them down. */ | ||
68 | buf[i-1] = buf[i]; | ||
69 | inbuflen--; | ||
70 | return ch; | ||
71 | } | ||
72 | |||
73 | static int udbg_getc_beat(void) | ||
74 | { | ||
75 | int ch; | ||
76 | for (;;) { | ||
77 | ch = udbg_getc_poll_beat(); | ||
78 | if (ch == -1) { | ||
79 | /* This shouldn't be needed...but... */ | ||
80 | volatile unsigned long delay; | ||
81 | for (delay=0; delay < 2000000; delay++) | ||
82 | ; | ||
83 | } else { | ||
84 | return ch; | ||
85 | } | ||
86 | } | ||
87 | } | ||
88 | |||
89 | /* call this from early_init() for a working debug console on | ||
90 | * vterm capable LPAR machines | ||
91 | */ | ||
92 | void __init udbg_init_debug_beat(void) | ||
93 | { | ||
94 | udbg_putc = udbg_putc_beat; | ||
95 | udbg_getc = udbg_getc_beat; | ||
96 | udbg_getc_poll = udbg_getc_poll_beat; | ||
97 | } | ||