Unverified Commit 27de1f54 authored by Anup Patel's avatar Anup Patel Committed by Palmer Dabbelt
Browse files

tty/serial: Add RISC-V SBI earlycon support



In RISC-V, the M-mode runtime firmware provide SBI calls for
debug prints. This patch adds earlycon support using RISC-V
SBI console calls. To enable it, just pass "earlycon=sbi" in
kernel parameters.

Signed-off-by: default avatarAnup Patel <anup@brainfault.org>
Acked-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: default avatarPalmer Dabbelt <palmer@sifive.com>
Signed-off-by: default avatarPalmer Dabbelt <palmer@sifive.com>
parent 80100942
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -85,6 +85,18 @@ config SERIAL_EARLYCON_ARM_SEMIHOST
	  with "earlycon=smh" on the kernel command line. The console is
	  enabled when early_param is processed.

config SERIAL_EARLYCON_RISCV_SBI
	bool "Early console using RISC-V SBI"
	depends on RISCV
	select SERIAL_CORE
	select SERIAL_CORE_CONSOLE
	select SERIAL_EARLYCON
	help
	  Support for early debug console using RISC-V SBI. This enables
	  the console before standard serial driver is probed. This is enabled
	  with "earlycon=sbi" on the kernel command line. The console is
	  enabled when early_param is processed.

config SERIAL_SB1250_DUART
	tristate "BCM1xxx on-chip DUART serial support"
	depends on SIBYTE_SB1xxx_SOC=y
+1 −0
Original line number Diff line number Diff line
@@ -7,6 +7,7 @@ obj-$(CONFIG_SERIAL_CORE) += serial_core.o

obj-$(CONFIG_SERIAL_EARLYCON) += earlycon.o
obj-$(CONFIG_SERIAL_EARLYCON_ARM_SEMIHOST) += earlycon-arm-semihost.o
obj-$(CONFIG_SERIAL_EARLYCON_RISCV_SBI) += earlycon-riscv-sbi.o

# These Sparc drivers have to appear before others such as 8250
# which share ttySx minor node space.  Otherwise console device
+28 −0
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0
/*
 * RISC-V SBI based earlycon
 *
 * Copyright (C) 2018 Anup Patel <anup@brainfault.org>
 */
#include <linux/kernel.h>
#include <linux/console.h>
#include <linux/init.h>
#include <linux/serial_core.h>
#include <asm/sbi.h>

static void sbi_console_write(struct console *con,
			      const char *s, unsigned int n)
{
	int i;

	for (i = 0; i < n; ++i)
		sbi_console_putchar(s[i]);
}

static int __init early_sbi_setup(struct earlycon_device *device,
				  const char *opt)
{
	device->con->write = sbi_console_write;
	return 0;
}
EARLYCON_DECLARE(sbi, early_sbi_setup);