[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH RFC 1/6] xen/arm: platforms: Add earlyprintk and serial support for Tegra boards.
From: "Kyle J. Temkin" <temkink@xxxxxxxxxxxx> Tegra boards feature a NS16550-compatible serial mapped into the MMIO space. Add support for its use both as a full-featured serial port and as an earlyprintk driver. Adds a new "needs_rtoie" (requires Rx Timeout Interrupt) quirk, as some platforms-- including Tegra-- require the NS16550 Rx timeout interrupt to be enabled for receive to function properly. The same quirk is applied in the eqvuialent Linux driver [1]. [1] https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=4539c24fe4f92c09ee668ef959d3e8180df619b9 Signed-off-by: Kyle Temkin <temkink@xxxxxxxxxxxx> --- xen/arch/arm/Rules.mk | 1 + xen/drivers/char/ns16550.c | 16 +++++++++++++++- xen/include/xen/8250-uart.h | 1 + 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/xen/arch/arm/Rules.mk b/xen/arch/arm/Rules.mk index 93304be..2a1473a 100644 --- a/xen/arch/arm/Rules.mk +++ b/xen/arch/arm/Rules.mk @@ -44,6 +44,7 @@ EARLY_PRINTK_vexpress := pl011,0x1c090000 EARLY_PRINTK_xgene-mcdivitt := 8250,0x1c021000,2 EARLY_PRINTK_xgene-storm := 8250,0x1c020000,2 EARLY_PRINTK_zynqmp := cadence,0xff000000 +EARLY_PRINTK_tegra := 8250,0x70006000,2 ifneq ($(EARLY_PRINTK_$(CONFIG_EARLY_PRINTK)),) EARLY_PRINTK_CFG := $(subst $(comma), ,$(EARLY_PRINTK_$(CONFIG_EARLY_PRINTK))) diff --git a/xen/drivers/char/ns16550.c b/xen/drivers/char/ns16550.c index 1da103a..bffdb35 100644 --- a/xen/drivers/char/ns16550.c +++ b/xen/drivers/char/ns16550.c @@ -64,6 +64,7 @@ static struct ns16550 { unsigned int timeout_ms; bool_t intr_works; bool_t dw_usr_bsy; + bool_t needs_rtoie; #ifdef CONFIG_HAS_PCI /* PCI card parameters. */ bool_t pb_bdf_enable; /* if =1, pb-bdf effective, port behind bridge */ @@ -652,12 +653,23 @@ static void ns16550_setup_postirq(struct ns16550 *uart) { if ( uart->irq > 0 ) { + u8 ier_value = 0; + /* Master interrupt enable; also keep DTR/RTS asserted. */ ns_write_reg(uart, UART_MCR, UART_MCR_OUT2 | UART_MCR_DTR | UART_MCR_RTS); /* Enable receive interrupts. */ - ns_write_reg(uart, UART_IER, UART_IER_ERDAI); + ier_value = UART_IER_ERDAI; + + /* + * If we're on a platform that needs Rx timeouts enabled, also + * set Rx TimeOut Interrupt Enable (RTOIE). + */ + if ( uart->needs_rtoie ) + ier_value |= UART_IER_RTOIE; + + ns_write_reg(uart, UART_IER, ier_value); } if ( uart->irq >= 0 ) @@ -1273,6 +1285,7 @@ static int __init ns16550_uart_dt_init(struct dt_device_node *dev, uart->irq = res; uart->dw_usr_bsy = dt_device_is_compatible(dev, "snps,dw-apb-uart"); + uart->needs_rtoie = dt_device_is_compatible(dev, "nvidia,tegra20-uart"); uart->vuart.base_addr = uart->io_base; uart->vuart.size = uart->io_size; @@ -1293,6 +1306,7 @@ static const struct dt_device_match ns16550_dt_match[] __initconst = DT_MATCH_COMPATIBLE("ns16550"), DT_MATCH_COMPATIBLE("ns16550a"), DT_MATCH_COMPATIBLE("snps,dw-apb-uart"), + DT_MATCH_COMPATIBLE("nvidia,tegra20-uart"), { /* sentinel */ }, }; diff --git a/xen/include/xen/8250-uart.h b/xen/include/xen/8250-uart.h index c6b62c8..2ad0ee6 100644 --- a/xen/include/xen/8250-uart.h +++ b/xen/include/xen/8250-uart.h @@ -41,6 +41,7 @@ #define UART_IER_ETHREI 0x02 /* tx reg. empty */ #define UART_IER_ELSI 0x04 /* rx line status */ #define UART_IER_EMSI 0x08 /* MODEM status */ +#define UART_IER_RTOIE 0x10 /* rx timeout */ /* Interrupt Identificatiegister */ #define UART_IIR_NOINT 0x01 /* no interrupt pending */ -- 2.9.2 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |