|  | /* | 
|  | * Generic 16550 kgdb support intended to be useful on a variety | 
|  | * of platforms.  To enable this support, it is necessary to set | 
|  | * the CONFIG_GEN550 option.  Any virtual mapping of the serial | 
|  | * port(s) to be used can be accomplished by setting | 
|  | * ppc_md.early_serial_map to a platform-specific mapping function. | 
|  | * | 
|  | * Adapted from ppc4xx_kgdb.c. | 
|  | * | 
|  | * Author: Matt Porter <mporter@kernel.crashing.org> | 
|  | * | 
|  | * 2002-2004 (c) MontaVista Software, Inc.  This file is licensed under | 
|  | * the terms of the GNU General Public License version 2.  This program | 
|  | * is licensed "as is" without any warranty of any kind, whether express | 
|  | * or implied. | 
|  | */ | 
|  |  | 
|  | #include <linux/types.h> | 
|  | #include <linux/kernel.h> | 
|  |  | 
|  | #include <asm/machdep.h> | 
|  |  | 
|  | extern unsigned long serial_init(int, void *); | 
|  | extern unsigned long serial_getc(unsigned long); | 
|  | extern unsigned long serial_putc(unsigned long, unsigned char); | 
|  |  | 
|  | #if defined(CONFIG_KGDB_TTYS0) | 
|  | #define KGDB_PORT 0 | 
|  | #elif defined(CONFIG_KGDB_TTYS1) | 
|  | #define KGDB_PORT 1 | 
|  | #elif defined(CONFIG_KGDB_TTYS2) | 
|  | #define KGDB_PORT 2 | 
|  | #elif defined(CONFIG_KGDB_TTYS3) | 
|  | #define KGDB_PORT 3 | 
|  | #else | 
|  | #error "invalid kgdb_tty port" | 
|  | #endif | 
|  |  | 
|  | static volatile unsigned int kgdb_debugport; | 
|  |  | 
|  | void putDebugChar(unsigned char c) | 
|  | { | 
|  | if (kgdb_debugport == 0) | 
|  | kgdb_debugport = serial_init(KGDB_PORT, NULL); | 
|  |  | 
|  | serial_putc(kgdb_debugport, c); | 
|  | } | 
|  |  | 
|  | int getDebugChar(void) | 
|  | { | 
|  | if (kgdb_debugport == 0) | 
|  | kgdb_debugport = serial_init(KGDB_PORT, NULL); | 
|  |  | 
|  | return(serial_getc(kgdb_debugport)); | 
|  | } | 
|  |  | 
|  | void kgdb_interruptible(int enable) | 
|  | { | 
|  | return; | 
|  | } | 
|  |  | 
|  | void putDebugString(char* str) | 
|  | { | 
|  | while (*str != '\0') { | 
|  | putDebugChar(*str); | 
|  | str++; | 
|  | } | 
|  | putDebugChar('\r'); | 
|  | return; | 
|  | } | 
|  |  | 
|  | /* | 
|  | * Note: gen550_init() must be called already on the port we are going | 
|  | * to use. | 
|  | */ | 
|  | void | 
|  | gen550_kgdb_map_scc(void) | 
|  | { | 
|  | printk(KERN_DEBUG "kgdb init\n"); | 
|  | if (ppc_md.early_serial_map) | 
|  | ppc_md.early_serial_map(); | 
|  | kgdb_debugport = serial_init(KGDB_PORT, NULL); | 
|  | } |