Path: blob/master/arch/mips/sibyte/common/cfe_console.c
26481 views
// SPDX-License-Identifier: GPL-2.01#include <linux/init.h>2#include <linux/errno.h>3#include <linux/console.h>45#include <asm/sibyte/board.h>67#include <asm/fw/cfe/cfe_api.h>8#include <asm/fw/cfe/cfe_error.h>910extern int cfe_cons_handle;1112static void cfe_console_write(struct console *cons, const char *str,13unsigned int count)14{15int i, last, written;1617for (i=0, last=0; i<count; i++) {18if (!str[i])19/* XXXKW can/should this ever happen? */20return;21if (str[i] == '\n') {22do {23written = cfe_write(cfe_cons_handle, &str[last], i-last);24if (written < 0)25;26last += written;27} while (last < i);28while (cfe_write(cfe_cons_handle, "\r", 1) <= 0)29;30}31}32if (last != count) {33do {34written = cfe_write(cfe_cons_handle, &str[last], count-last);35if (written < 0)36;37last += written;38} while (last < count);39}4041}4243static int cfe_console_setup(struct console *cons, char *str)44{45char consdev[32];46/* XXXKW think about interaction with 'console=' cmdline arg */47/* If none of the console options are configured, the build will break. */48if (cfe_getenv("BOOT_CONSOLE", consdev, 32) >= 0) {49#ifdef CONFIG_SERIAL_SB1250_DUART50if (!strcmp(consdev, "uart0")) {51setleds("u0cn");52} else if (!strcmp(consdev, "uart1")) {53setleds("u1cn");54} else55#endif56#ifdef CONFIG_VGA_CONSOLE57if (!strcmp(consdev, "pcconsole0")) {58setleds("pccn");59} else60#endif61return -ENODEV;62}63return 0;64}6566static struct console sb1250_cfe_cons = {67.name = "cfe",68.write = cfe_console_write,69.setup = cfe_console_setup,70.flags = CON_PRINTBUFFER,71.index = -1,72};7374static int __init sb1250_cfe_console_init(void)75{76register_console(&sb1250_cfe_cons);77return 0;78}7980console_initcall(sb1250_cfe_console_init);818283