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