Linux Audio

Check our new training course

Loading...
v5.9
  1// SPDX-License-Identifier: GPL-2.0-or-later
  2/*
  3 * polling mode stateless debugging stuff, originally for NS16550 Serial Ports
  4 *
  5 * c 2001 PPC 64 Team, IBM Corp
  6 */
  7
  8#include <stdarg.h>
  9#include <linux/types.h>
 10#include <linux/sched.h>
 11#include <linux/console.h>
 12#include <linux/init.h>
 13#include <asm/processor.h>
 14#include <asm/udbg.h>
 15
 16void (*udbg_putc)(char c);
 17void (*udbg_flush)(void);
 18int (*udbg_getc)(void);
 19int (*udbg_getc_poll)(void);
 20
 21/*
 22 * Early debugging facilities. You can enable _one_ of these via .config,
 23 * if you do so your kernel _will not boot_ on anything else. Be careful.
 24 */
 25void __init udbg_early_init(void)
 26{
 27#if defined(CONFIG_PPC_EARLY_DEBUG_LPAR)
 28	/* For LPAR machines that have an HVC console on vterm 0 */
 29	udbg_init_debug_lpar();
 30#elif defined(CONFIG_PPC_EARLY_DEBUG_LPAR_HVSI)
 31	/* For LPAR machines that have an HVSI console on vterm 0 */
 32	udbg_init_debug_lpar_hvsi();
 33#elif defined(CONFIG_PPC_EARLY_DEBUG_G5)
 34	/* For use on Apple G5 machines */
 35	udbg_init_pmac_realmode();
 36#elif defined(CONFIG_PPC_EARLY_DEBUG_RTAS_PANEL)
 37	/* RTAS panel debug */
 38	udbg_init_rtas_panel();
 39#elif defined(CONFIG_PPC_EARLY_DEBUG_RTAS_CONSOLE)
 40	/* RTAS console debug */
 41	udbg_init_rtas_console();
 42#elif defined(CONFIG_PPC_EARLY_DEBUG_MAPLE)
 43	/* Maple real mode debug */
 44	udbg_init_maple_realmode();
 45#elif defined(CONFIG_PPC_EARLY_DEBUG_PAS_REALMODE)
 46	udbg_init_pas_realmode();
 47#elif defined(CONFIG_PPC_EARLY_DEBUG_BOOTX)
 48	udbg_init_btext();
 49#elif defined(CONFIG_PPC_EARLY_DEBUG_44x)
 50	/* PPC44x debug */
 51	udbg_init_44x_as1();
 52#elif defined(CONFIG_PPC_EARLY_DEBUG_40x)
 53	/* PPC40x debug */
 54	udbg_init_40x_realmode();
 55#elif defined(CONFIG_PPC_EARLY_DEBUG_CPM)
 56	udbg_init_cpm();
 57#elif defined(CONFIG_PPC_EARLY_DEBUG_USBGECKO)
 58	udbg_init_usbgecko();
 59#elif defined(CONFIG_PPC_EARLY_DEBUG_MEMCONS)
 60	/* In memory console */
 61	udbg_init_memcons();
 62#elif defined(CONFIG_PPC_EARLY_DEBUG_EHV_BC)
 63	udbg_init_ehv_bc();
 64#elif defined(CONFIG_PPC_EARLY_DEBUG_PS3GELIC)
 65	udbg_init_ps3gelic();
 66#elif defined(CONFIG_PPC_EARLY_DEBUG_OPAL_RAW)
 67	udbg_init_debug_opal_raw();
 68#elif defined(CONFIG_PPC_EARLY_DEBUG_OPAL_HVSI)
 69	udbg_init_debug_opal_hvsi();
 70#endif
 71
 72#ifdef CONFIG_PPC_EARLY_DEBUG
 73	console_loglevel = CONSOLE_LOGLEVEL_DEBUG;
 74
 75	register_early_udbg_console();
 76#endif
 77}
 78
 79/* udbg library, used by xmon et al */
 80void udbg_puts(const char *s)
 81{
 82	if (udbg_putc) {
 83		char c;
 84
 85		if (s && *s != '\0') {
 86			while ((c = *s++) != '\0')
 87				udbg_putc(c);
 88		}
 89
 90		if (udbg_flush)
 91			udbg_flush();
 92	}
 93#if 0
 94	else {
 95		printk("%s", s);
 96	}
 97#endif
 98}
 99
100int udbg_write(const char *s, int n)
101{
102	int remain = n;
103	char c;
104
105	if (!udbg_putc)
106		return 0;
107
108	if (s && *s != '\0') {
109		while (((c = *s++) != '\0') && (remain-- > 0)) {
110			udbg_putc(c);
111		}
112	}
113
114	if (udbg_flush)
115		udbg_flush();
116
117	return n - remain;
118}
119
120#define UDBG_BUFSIZE 256
121void udbg_printf(const char *fmt, ...)
122{
123	if (udbg_putc) {
124		char buf[UDBG_BUFSIZE];
125		va_list args;
126
127		va_start(args, fmt);
128		vsnprintf(buf, UDBG_BUFSIZE, fmt, args);
129		udbg_puts(buf);
130		va_end(args);
131	}
132}
133
134void __init udbg_progress(char *s, unsigned short hex)
135{
136	udbg_puts(s);
137	udbg_puts("\n");
138}
139
140/*
141 * Early boot console based on udbg
142 */
143static void udbg_console_write(struct console *con, const char *s,
144		unsigned int n)
145{
146	udbg_write(s, n);
147}
148
149static struct console udbg_console = {
150	.name	= "udbg",
151	.write	= udbg_console_write,
152	.flags	= CON_PRINTBUFFER | CON_ENABLED | CON_BOOT | CON_ANYTIME,
153	.index	= 0,
154};
155
156/*
157 * Called by setup_system after ppc_md->probe and ppc_md->early_init.
158 * Call it again after setting udbg_putc in ppc_md->setup_arch.
159 */
160void __init register_early_udbg_console(void)
161{
162	if (early_console)
163		return;
164
165	if (!udbg_putc)
166		return;
167
168	if (strstr(boot_command_line, "udbg-immortal")) {
169		printk(KERN_INFO "early console immortal !\n");
170		udbg_console.flags &= ~CON_BOOT;
171	}
172	early_console = &udbg_console;
173	register_console(&udbg_console);
174}
175
176#if 0   /* if you want to use this as a regular output console */
177console_initcall(register_udbg_console);
178#endif
v5.4
  1// SPDX-License-Identifier: GPL-2.0-or-later
  2/*
  3 * polling mode stateless debugging stuff, originally for NS16550 Serial Ports
  4 *
  5 * c 2001 PPC 64 Team, IBM Corp
  6 */
  7
  8#include <stdarg.h>
  9#include <linux/types.h>
 10#include <linux/sched.h>
 11#include <linux/console.h>
 12#include <linux/init.h>
 13#include <asm/processor.h>
 14#include <asm/udbg.h>
 15
 16void (*udbg_putc)(char c);
 17void (*udbg_flush)(void);
 18int (*udbg_getc)(void);
 19int (*udbg_getc_poll)(void);
 20
 21/*
 22 * Early debugging facilities. You can enable _one_ of these via .config,
 23 * if you do so your kernel _will not boot_ on anything else. Be careful.
 24 */
 25void __init udbg_early_init(void)
 26{
 27#if defined(CONFIG_PPC_EARLY_DEBUG_LPAR)
 28	/* For LPAR machines that have an HVC console on vterm 0 */
 29	udbg_init_debug_lpar();
 30#elif defined(CONFIG_PPC_EARLY_DEBUG_LPAR_HVSI)
 31	/* For LPAR machines that have an HVSI console on vterm 0 */
 32	udbg_init_debug_lpar_hvsi();
 33#elif defined(CONFIG_PPC_EARLY_DEBUG_G5)
 34	/* For use on Apple G5 machines */
 35	udbg_init_pmac_realmode();
 36#elif defined(CONFIG_PPC_EARLY_DEBUG_RTAS_PANEL)
 37	/* RTAS panel debug */
 38	udbg_init_rtas_panel();
 39#elif defined(CONFIG_PPC_EARLY_DEBUG_RTAS_CONSOLE)
 40	/* RTAS console debug */
 41	udbg_init_rtas_console();
 42#elif defined(CONFIG_PPC_EARLY_DEBUG_MAPLE)
 43	/* Maple real mode debug */
 44	udbg_init_maple_realmode();
 45#elif defined(CONFIG_PPC_EARLY_DEBUG_PAS_REALMODE)
 46	udbg_init_pas_realmode();
 47#elif defined(CONFIG_PPC_EARLY_DEBUG_BOOTX)
 48	udbg_init_btext();
 49#elif defined(CONFIG_PPC_EARLY_DEBUG_44x)
 50	/* PPC44x debug */
 51	udbg_init_44x_as1();
 52#elif defined(CONFIG_PPC_EARLY_DEBUG_40x)
 53	/* PPC40x debug */
 54	udbg_init_40x_realmode();
 55#elif defined(CONFIG_PPC_EARLY_DEBUG_CPM)
 56	udbg_init_cpm();
 57#elif defined(CONFIG_PPC_EARLY_DEBUG_USBGECKO)
 58	udbg_init_usbgecko();
 59#elif defined(CONFIG_PPC_EARLY_DEBUG_MEMCONS)
 60	/* In memory console */
 61	udbg_init_memcons();
 62#elif defined(CONFIG_PPC_EARLY_DEBUG_EHV_BC)
 63	udbg_init_ehv_bc();
 64#elif defined(CONFIG_PPC_EARLY_DEBUG_PS3GELIC)
 65	udbg_init_ps3gelic();
 66#elif defined(CONFIG_PPC_EARLY_DEBUG_OPAL_RAW)
 67	udbg_init_debug_opal_raw();
 68#elif defined(CONFIG_PPC_EARLY_DEBUG_OPAL_HVSI)
 69	udbg_init_debug_opal_hvsi();
 70#endif
 71
 72#ifdef CONFIG_PPC_EARLY_DEBUG
 73	console_loglevel = CONSOLE_LOGLEVEL_DEBUG;
 74
 75	register_early_udbg_console();
 76#endif
 77}
 78
 79/* udbg library, used by xmon et al */
 80void udbg_puts(const char *s)
 81{
 82	if (udbg_putc) {
 83		char c;
 84
 85		if (s && *s != '\0') {
 86			while ((c = *s++) != '\0')
 87				udbg_putc(c);
 88		}
 89
 90		if (udbg_flush)
 91			udbg_flush();
 92	}
 93#if 0
 94	else {
 95		printk("%s", s);
 96	}
 97#endif
 98}
 99
100int udbg_write(const char *s, int n)
101{
102	int remain = n;
103	char c;
104
105	if (!udbg_putc)
106		return 0;
107
108	if (s && *s != '\0') {
109		while (((c = *s++) != '\0') && (remain-- > 0)) {
110			udbg_putc(c);
111		}
112	}
113
114	if (udbg_flush)
115		udbg_flush();
116
117	return n - remain;
118}
119
120#define UDBG_BUFSIZE 256
121void udbg_printf(const char *fmt, ...)
122{
123	char buf[UDBG_BUFSIZE];
124	va_list args;
 
125
126	va_start(args, fmt);
127	vsnprintf(buf, UDBG_BUFSIZE, fmt, args);
128	udbg_puts(buf);
129	va_end(args);
 
130}
131
132void __init udbg_progress(char *s, unsigned short hex)
133{
134	udbg_puts(s);
135	udbg_puts("\n");
136}
137
138/*
139 * Early boot console based on udbg
140 */
141static void udbg_console_write(struct console *con, const char *s,
142		unsigned int n)
143{
144	udbg_write(s, n);
145}
146
147static struct console udbg_console = {
148	.name	= "udbg",
149	.write	= udbg_console_write,
150	.flags	= CON_PRINTBUFFER | CON_ENABLED | CON_BOOT | CON_ANYTIME,
151	.index	= 0,
152};
153
154/*
155 * Called by setup_system after ppc_md->probe and ppc_md->early_init.
156 * Call it again after setting udbg_putc in ppc_md->setup_arch.
157 */
158void __init register_early_udbg_console(void)
159{
160	if (early_console)
161		return;
162
163	if (!udbg_putc)
164		return;
165
166	if (strstr(boot_command_line, "udbg-immortal")) {
167		printk(KERN_INFO "early console immortal !\n");
168		udbg_console.flags &= ~CON_BOOT;
169	}
170	early_console = &udbg_console;
171	register_console(&udbg_console);
172}
173
174#if 0   /* if you want to use this as a regular output console */
175console_initcall(register_udbg_console);
176#endif