162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci *    Copyright IBM Corp. 2017
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#include <linux/console.h>
762306a36Sopenharmony_ci#include <linux/kernel.h>
862306a36Sopenharmony_ci#include <linux/init.h>
962306a36Sopenharmony_ci#include <asm/sclp.h>
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_cistatic void sclp_early_write(struct console *con, const char *s, unsigned int len)
1262306a36Sopenharmony_ci{
1362306a36Sopenharmony_ci	__sclp_early_printk(s, len);
1462306a36Sopenharmony_ci}
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_cistatic struct console sclp_early_console = {
1762306a36Sopenharmony_ci	.name  = "earlysclp",
1862306a36Sopenharmony_ci	.write = sclp_early_write,
1962306a36Sopenharmony_ci	.flags = CON_PRINTBUFFER | CON_BOOT,
2062306a36Sopenharmony_ci	.index = -1,
2162306a36Sopenharmony_ci};
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_cistatic int __init setup_early_printk(char *buf)
2462306a36Sopenharmony_ci{
2562306a36Sopenharmony_ci	if (early_console)
2662306a36Sopenharmony_ci		return 0;
2762306a36Sopenharmony_ci	/* Accept only "earlyprintk" and "earlyprintk=sclp" */
2862306a36Sopenharmony_ci	if (buf && !str_has_prefix(buf, "sclp"))
2962306a36Sopenharmony_ci		return 0;
3062306a36Sopenharmony_ci	if (!sclp.has_linemode && !sclp.has_vt220)
3162306a36Sopenharmony_ci		return 0;
3262306a36Sopenharmony_ci	early_console = &sclp_early_console;
3362306a36Sopenharmony_ci	register_console(early_console);
3462306a36Sopenharmony_ci	return 0;
3562306a36Sopenharmony_ci}
3662306a36Sopenharmony_ciearly_param("earlyprintk", setup_early_printk);
37