diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig index 90e3983..21597b7 100644 --- a/drivers/serial/Kconfig +++ b/drivers/serial/Kconfig @@ -850,4 +850,10 @@ config SYS_SDMR depends on MPC8XX_CONS default 0 +config XEN_DEBUG_SERIAL + bool "XEN debug serial support" + depends on XEN + help + This is not pv console, it needs CONFIG_VERBOSE_DEBUG in XEN. + endmenu diff --git a/drivers/serial/Makefile b/drivers/serial/Makefile index e4a92bb..08d53ec 100644 --- a/drivers/serial/Makefile +++ b/drivers/serial/Makefile @@ -70,6 +70,7 @@ obj-$(CONFIG_OWL_SERIAL) += serial_owl.o obj-$(CONFIG_OMAP_SERIAL) += serial_omap.o obj-$(CONFIG_MTK_SERIAL) += serial_mtk.o obj-$(CONFIG_SIFIVE_SERIAL) += serial_sifive.o +obj-$(CONFIG_XEN_DEBUG_SERIAL) += serial_xen.o ifndef CONFIG_SPL_BUILD obj-$(CONFIG_USB_TTY) += usbtty.o diff --git a/drivers/serial/serial.c b/drivers/serial/serial.c index baeaeaa..193fcc3 100644 --- a/drivers/serial/serial.c +++ b/drivers/serial/serial.c @@ -126,6 +126,7 @@ serial_initfunc(pl01x_serial_initialize); serial_initfunc(pxa_serial_initialize); serial_initfunc(sh_serial_initialize); serial_initfunc(mtk_serial_initialize); +serial_initfunc(xen_debug_serial_initialize); /** * serial_register() - Register serial driver with serial driver core @@ -180,6 +181,7 @@ void serial_initialize(void) pxa_serial_initialize(); sh_serial_initialize(); mtk_serial_initialize(); + xen_debug_serial_initialize(); serial_assign(default_serial_console()->name); } diff --git a/drivers/serial/serial_xen.c b/drivers/serial/serial_xen.c new file mode 100644 index 0000000..ce0c363 --- /dev/null +++ b/drivers/serial/serial_xen.c @@ -0,0 +1,70 @@ +/* + * Copyright 2018 NXP + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#include +#include +#include +#include + +extern void xenprintf(const char *buf); +extern void xenprintc(const char c); +#ifndef CONFIG_DM_SERIAL + +static void xen_debug_serial_putc(const char c) +{ + /* If \n, also do \r */ + if (c == '\n') + serial_putc('\r'); + + xenprintc(c); +} + +static void xen_debug_serial_puts(const char *buf) +{ + xenprintf(buf); +} + +static int xen_debug_serial_start(void) +{ + return 0; +} + +static void xen_debug_serial_setbrg(void) +{ + +} + +static int xen_debug_serial_getc(void) +{ + return 0; +} + +static int xen_debug_serial_tstc(void) +{ + return 0; +} + +static struct serial_device xen_debug_serial_drv = { + .name = "xen_debug_serial", + .start = xen_debug_serial_start, + .stop = NULL, + .setbrg = xen_debug_serial_setbrg, + .putc = xen_debug_serial_putc, + .puts = xen_debug_serial_puts, + .getc = xen_debug_serial_getc, + .tstc = xen_debug_serial_tstc, +}; + +void xen_debug_serial_initialize(void) +{ + serial_register(&xen_debug_serial_drv); +} + +__weak struct serial_device *default_serial_console(void) +{ + return &xen_debug_serial_drv; +} +#endif