Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752727AbdLHAQs (ORCPT ); Thu, 7 Dec 2017 19:16:48 -0500 Received: from mail-pf0-f195.google.com ([209.85.192.195]:35355 "EHLO mail-pf0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752312AbdLHAQp (ORCPT ); Thu, 7 Dec 2017 19:16:45 -0500 X-Google-Smtp-Source: AGs4zMbRy4OtMj637Tr5aByCwOzAS1rZQUMhCMPtc65bIvX42uiY0SRSn4Bex/Uy2UMEDxYL1z9RNg== Subject: [PATCH] tty: New RISC-V SBI console driver Date: Thu, 7 Dec 2017 16:10:15 -0800 Message-Id: <20171208001015.27735-1-palmer@sifive.com> X-Mailer: git-send-email 2.13.6 Cc: patches@groups.riscv.org, linux-kernel@vger.kernel.org, Palmer Dabbelt From: Palmer Dabbelt To: gregkh@linuxfoundation.org, jslaby@suse.com Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4301 Lines: 154 From: Palmer Dabbelt The RISC-V ISA defines a simple console that is availiable via SBI calls on all systems. This patch adds a driver for this console interface that can act as both a target for early printk and as the system console. The core arch code already enables the early printk support when CONFIG_HVC_RISCV_SBI is defined. There is one checkpatch.pl warning here: to check the MAINTAINERS file. They're all matched by the "K: riscv" line. Signed-off-by: Palmer Dabbelt --- arch/riscv/include/asm/hvc_riscv_sbi.h | 12 ++++++ drivers/tty/hvc/Kconfig | 11 +++++ drivers/tty/hvc/Makefile | 1 + drivers/tty/hvc/hvc_riscv_sbi.c | 75 ++++++++++++++++++++++++++++++++++ 4 files changed, 99 insertions(+) create mode 100644 arch/riscv/include/asm/hvc_riscv_sbi.h create mode 100644 drivers/tty/hvc/hvc_riscv_sbi.c diff --git a/arch/riscv/include/asm/hvc_riscv_sbi.h b/arch/riscv/include/asm/hvc_riscv_sbi.h new file mode 100644 index 000000000000..41723ed7bd97 --- /dev/null +++ b/arch/riscv/include/asm/hvc_riscv_sbi.h @@ -0,0 +1,12 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +#ifndef _ASM_RISCV_HVC_RISCV_SBI_H +#define _ASM_RISCV_HVC_RISCV_SBI_H + +/* + * We always support CONFIG_EARLY_PRINTK via the SBI console driver because it + * works well enough that there's no penalty to doing so. + */ +extern struct console riscv_sbi_early_console_dev __initdata; + +#endif diff --git a/drivers/tty/hvc/Kconfig b/drivers/tty/hvc/Kconfig index fec457edad14..5e267bb002af 100644 --- a/drivers/tty/hvc/Kconfig +++ b/drivers/tty/hvc/Kconfig @@ -97,6 +97,17 @@ config HVC_BFIN_JTAG the HVC driver. If you don't have JTAG, then you probably don't want this option. +config HVC_RISCV_SBI + bool "RISC-V SBI console support" + depends on RISCV + select HVC_DRIVER + default y + help + This enables support for console output via RISC-V SBI calls, which + is normally used only during boot to output printk. + + If you don't know what do to here, say Y. + config HVCS tristate "IBM Hypervisor Virtual Console Server support" depends on PPC_PSERIES && HVC_CONSOLE diff --git a/drivers/tty/hvc/Makefile b/drivers/tty/hvc/Makefile index 0b02ec7f1dfd..83079ae000ae 100644 --- a/drivers/tty/hvc/Makefile +++ b/drivers/tty/hvc/Makefile @@ -11,4 +11,5 @@ obj-$(CONFIG_HVC_XEN) += hvc_xen.o obj-$(CONFIG_HVC_IUCV) += hvc_iucv.o obj-$(CONFIG_HVC_UDBG) += hvc_udbg.o obj-$(CONFIG_HVC_BFIN_JTAG) += hvc_bfin_jtag.o +obj-$(CONFIG_HVC_RISCV_SBI) += hvc_riscv_sbi.o obj-$(CONFIG_HVCS) += hvcs.o diff --git a/drivers/tty/hvc/hvc_riscv_sbi.c b/drivers/tty/hvc/hvc_riscv_sbi.c new file mode 100644 index 000000000000..83ef0dcc24e0 --- /dev/null +++ b/drivers/tty/hvc/hvc_riscv_sbi.c @@ -0,0 +1,75 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +#include +#include +#include +#include +#include + +#include +#include + +#include "hvc_console.h" + +static int hvc_sbi_tty_put(uint32_t vtermno, const char *buf, int count) +{ + int i; + + for (i = 0; i < count; i++) + sbi_console_putchar(buf[i]); + + return i; +} + +static int hvc_sbi_tty_get(uint32_t vtermno, char *buf, int count) +{ + int i, c; + + for (i = 0; i < count; i++) { + c = sbi_console_getchar(); + if (c < 0) + break; + buf[i] = c; + } + + return i; +} + +static const struct hv_ops hvc_sbi_ops = { + .get_chars = hvc_sbi_tty_get, + .put_chars = hvc_sbi_tty_put, +}; + +static int __init hvc_sbi_init(void) +{ + return PTR_ERR_OR_ZERO(hvc_alloc(0, 0, &hvc_sbi_ops, 16)); +} +device_initcall(hvc_sbi_init); + +static int __init hvc_sbi_console_init(void) +{ + hvc_instantiate(0, 0, &hvc_sbi_ops); + add_preferred_console("hvc", 0, NULL); + + return 0; +} +console_initcall(hvc_sbi_console_init); + +static void sbi_console_write(struct console *co, const char *buf, + unsigned int n) +{ + int i; + + for (i = 0; i < n; ++i) { + if (buf[i] == '\n') + sbi_console_putchar('\r'); + sbi_console_putchar(buf[i]); + } +} + +struct console riscv_sbi_early_console_dev __initdata = { + .name = "early", + .write = sbi_console_write, + .flags = CON_PRINTBUFFER | CON_BOOT | CON_ANYTIME, + .index = -1 +}; -- 2.13.6