xref: /openbmc/linux/arch/arm/kernel/early_printk.c (revision 75bf465f0bc33e9b776a46d6a1b9b990f5fb7c37)
1*d2912cb1SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
293fd03a8SCatalin Marinas /*
393fd03a8SCatalin Marinas  *  linux/arch/arm/kernel/early_printk.c
493fd03a8SCatalin Marinas  *
593fd03a8SCatalin Marinas  *  Copyright (C) 2009 Sascha Hauer <s.hauer@pengutronix.de>
693fd03a8SCatalin Marinas  */
793fd03a8SCatalin Marinas 
893fd03a8SCatalin Marinas #include <linux/kernel.h>
993fd03a8SCatalin Marinas #include <linux/console.h>
1093fd03a8SCatalin Marinas #include <linux/init.h>
11de880632SNicolas Pitre #include <linux/string.h>
1293fd03a8SCatalin Marinas 
13de880632SNicolas Pitre extern void printascii(const char *);
1493fd03a8SCatalin Marinas 
early_write(const char * s,unsigned n)1593fd03a8SCatalin Marinas static void early_write(const char *s, unsigned n)
1693fd03a8SCatalin Marinas {
17de880632SNicolas Pitre 	char buf[128];
18de880632SNicolas Pitre 	while (n) {
19de880632SNicolas Pitre 		unsigned l = min(n, sizeof(buf)-1);
20de880632SNicolas Pitre 		memcpy(buf, s, l);
21de880632SNicolas Pitre 		buf[l] = 0;
22de880632SNicolas Pitre 		s += l;
23de880632SNicolas Pitre 		n -= l;
24de880632SNicolas Pitre 		printascii(buf);
2593fd03a8SCatalin Marinas 	}
2693fd03a8SCatalin Marinas }
2793fd03a8SCatalin Marinas 
early_console_write(struct console * con,const char * s,unsigned n)2893fd03a8SCatalin Marinas static void early_console_write(struct console *con, const char *s, unsigned n)
2993fd03a8SCatalin Marinas {
3093fd03a8SCatalin Marinas 	early_write(s, n);
3193fd03a8SCatalin Marinas }
3293fd03a8SCatalin Marinas 
33d0380e6cSThomas Gleixner static struct console early_console_dev = {
3493fd03a8SCatalin Marinas 	.name =		"earlycon",
3593fd03a8SCatalin Marinas 	.write =	early_console_write,
3693fd03a8SCatalin Marinas 	.flags =	CON_PRINTBUFFER | CON_BOOT,
3793fd03a8SCatalin Marinas 	.index =	-1,
3893fd03a8SCatalin Marinas };
3993fd03a8SCatalin Marinas 
setup_early_printk(char * buf)4093fd03a8SCatalin Marinas static int __init setup_early_printk(char *buf)
4193fd03a8SCatalin Marinas {
42d0380e6cSThomas Gleixner 	early_console = &early_console_dev;
43d0380e6cSThomas Gleixner 	register_console(&early_console_dev);
4493fd03a8SCatalin Marinas 	return 0;
4593fd03a8SCatalin Marinas }
4693fd03a8SCatalin Marinas 
4793fd03a8SCatalin Marinas early_param("earlyprintk", setup_early_printk);
48