From: dmukhin@xen.org
To: Stefano Stabellini <sstabellini@kernel.org>
Cc: xen-devel@lists.xenproject.org, andrew.cooper3@citrix.com,
anthony.perard@vates.tech, jbeulich@suse.com, julien@xen.org,
michal.orzel@amd.com, roger.pau@citrix.com, dmukhin@ford.com
Subject: Re: [PATCH v5 02/15] xen/8250-uart: update definitions
Date: Mon, 1 Sep 2025 15:28:28 -0700 [thread overview]
Message-ID: <aLYeDIrXwMPt4w5y@kraken> (raw)
In-Reply-To: <alpine.DEB.2.22.394.2508291232390.341243@ubuntu-linux-20-04-desktop>
On Fri, Aug 29, 2025 at 12:32:46PM -0700, Stefano Stabellini wrote:
> On Thu, 27 Aug 2025, dmukhin@xen.org wrote:
> > From: Denis Mukhin <dmukhin@ford.com>
> >
> > Added missing definitions needed for NS16550 UART emulator.
> >
> > Newly introduced MSR definitions re-used in the existing ns16550 driver.
> >
> > Also, corrected FCR DMA definition bit#3 (0x08) as per:
> > https://www.ti.com/lit/ds/symlink/tl16c550c.pdf
> > See "7.7.2 FIFO Control Register (FCR)".
> >
> > Signed-off-by: Denis Mukhin <dmukhin@ford.com>
> > ---
> > Changes since v4:
> > - reused newly introduced UART_IIR and UART_IER bits in ns16550 driver
> > - Link to v4: https://lore.kernel.org/xen-devel/20250731192130.3948419-5-dmukhin@ford.com/
> > ---
> > xen/drivers/char/ns16550.c | 16 ++++++------
> > xen/include/xen/8250-uart.h | 50 ++++++++++++++++++++++++++++++-------
> > 2 files changed, 49 insertions(+), 17 deletions(-)
> >
> > diff --git a/xen/drivers/char/ns16550.c b/xen/drivers/char/ns16550.c
> > index df7fff7f81df..0e80fadbb894 100644
> > --- a/xen/drivers/char/ns16550.c
> > +++ b/xen/drivers/char/ns16550.c
> > @@ -388,7 +388,7 @@ static void __init cf_check ns16550_init_preirq(struct serial_port *port)
> >
> > /* Check this really is a 16550+. Otherwise we have no FIFOs. */
> > if ( uart->fifo_size <= 1 &&
> > - ((ns_read_reg(uart, UART_IIR) & 0xc0) == 0xc0) &&
> > + ((ns_read_reg(uart, UART_IIR) & UART_IIR_FE) == UART_IIR_FE) &&
> > ((ns_read_reg(uart, UART_FCR) & UART_FCR_TRG14) == UART_FCR_TRG14) )
> > uart->fifo_size = 16;
> > }
> > @@ -728,20 +728,20 @@ static int __init check_existence(struct ns16550 *uart)
> > * Mask out IER[7:4] bits for test as some UARTs (e.g. TL
> > * 16C754B) allow only to modify them if an EFR bit is set.
> > */
> > - scratch2 = ns_read_reg(uart, UART_IER) & 0x0f;
> > - ns_write_reg(uart,UART_IER, 0x0F);
> > - scratch3 = ns_read_reg(uart, UART_IER) & 0x0f;
> > + scratch2 = ns_read_reg(uart, UART_IER) & UART_IER_MASK;
> > + ns_write_reg(uart, UART_IER, UART_IER_MASK);
> > + scratch3 = ns_read_reg(uart, UART_IER) & UART_IER_MASK;
> > ns_write_reg(uart, UART_IER, scratch);
> > - if ( (scratch2 != 0) || (scratch3 != 0x0F) )
> > + if ( (scratch2 != 0) || (scratch3 != UART_IER_MASK) )
> > return 0;
> >
> > /*
> > * Check to see if a UART is really there.
> > * Use loopback test mode.
> > */
> > - ns_write_reg(uart, UART_MCR, UART_MCR_LOOP | 0x0A);
> > - status = ns_read_reg(uart, UART_MSR) & 0xF0;
> > - return (status == 0x90);
> > + ns_write_reg(uart, UART_MCR, UART_MCR_LOOP | UART_MCR_RTS | UART_MCR_OUT2);
> > + status = ns_read_reg(uart, UART_MSR) & UART_MSR_STATUS;
> > + return (status == (UART_MSR_CTS | UART_MSR_DCD));
> > }
> >
> > #ifdef CONFIG_HAS_PCI
> > diff --git a/xen/include/xen/8250-uart.h b/xen/include/xen/8250-uart.h
> > index d13352940c13..bc11cdc376c9 100644
> > --- a/xen/include/xen/8250-uart.h
> > +++ b/xen/include/xen/8250-uart.h
> > @@ -32,6 +32,7 @@
> > #define UART_MCR 0x04 /* Modem control */
> > #define UART_LSR 0x05 /* line status */
> > #define UART_MSR 0x06 /* Modem status */
> > +#define UART_SCR 0x07 /* Scratch pad */
> > #define UART_USR 0x1f /* Status register (DW) */
> > #define UART_DLL 0x00 /* divisor latch (ls) (DLAB=1) */
> > #define UART_DLM 0x01 /* divisor latch (ms) (DLAB=1) */
> > @@ -42,6 +43,8 @@
> > #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_MASK \
> > + (UART_IER_ERDAI | UART_IER_ETHREI | UART_IER_ELSI | UART_IER_EMSI)
> >
> > /* Interrupt Identification Register */
> > #define UART_IIR_NOINT 0x01 /* no interrupt pending */
> > @@ -51,12 +54,19 @@
> > #define UART_IIR_THR 0x02 /* - tx reg. empty */
> > #define UART_IIR_MSI 0x00 /* - MODEM status */
> > #define UART_IIR_BSY 0x07 /* - busy detect (DW) */
> > +#define UART_IIR_FE 0xc0 /* FIFO enabled (2 bits) */
> >
> > /* FIFO Control Register */
> > -#define UART_FCR_ENABLE 0x01 /* enable FIFO */
> > -#define UART_FCR_CLRX 0x02 /* clear Rx FIFO */
> > -#define UART_FCR_CLTX 0x04 /* clear Tx FIFO */
> > -#define UART_FCR_DMA 0x10 /* enter DMA mode */
> > +#define UART_FCR_ENABLE BIT(0, U) /* enable FIFO */
> > +#define UART_FCR_CLRX BIT(1, U) /* clear Rx FIFO */
> > +#define UART_FCR_CLTX BIT(2, U) /* clear Tx FIFO */
> > +#define UART_FCR_DMA BIT(3, U) /* enter DMA mode */
> > +#define UART_FCR_RESERVED0 BIT(4, U) /* reserved; always 0 */
> > +#define UART_FCR_RESERVED1 BIT(5, U) /* reserved; always 0 */
> > +#define UART_FCR_RTB0 BIT(6, U) /* receiver trigger bit #0 */
> > +#define UART_FCR_RTB1 BIT(7, U) /* receiver trigger bit #1 */
> > +#define UART_FCR_TRG_MASK (UART_FCR_RTB0 | UART_FCR_RTB1)
> > +
> > #define UART_FCR_TRG1 0x00 /* Rx FIFO trig lev 1 */
> > #define UART_FCR_TRG4 0x40 /* Rx FIFO trig lev 4 */
> > #define UART_FCR_TRG8 0x80 /* Rx FIFO trig lev 8 */
> > @@ -96,11 +106,32 @@
> > #define UART_LCR_CONF_MODE_B 0xBF /* Configuration mode B */
> >
> > /* Modem Control Register */
> > -#define UART_MCR_DTR 0x01 /* Data Terminal Ready */
> > -#define UART_MCR_RTS 0x02 /* Request to Send */
> > -#define UART_MCR_OUT2 0x08 /* OUT2: interrupt mask */
> > -#define UART_MCR_LOOP 0x10 /* Enable loopback test mode */
> > -#define UART_MCR_TCRTLR 0x40 /* Access TCR/TLR (TI16C752, EFR[4]=1) */
> > +#define UART_MCR_DTR BIT(0, U) /* Data Terminal Ready */
> > +#define UART_MCR_RTS BIT(1, U) /* Request to Send */
> > +#define UART_MCR_OUT1 BIT(2, U) /* OUT1: interrupt mask */
>
> is OUT1 an interrupt mask actually?
Yep, thanks, that should be just "Output #1".
>
>
> > +#define UART_MCR_OUT2 BIT(3, U) /* OUT2: interrupt mask */
> > +#define UART_MCR_LOOP BIT(4, U) /* Enable loopback test mode */
> > +#define UART_MCR_RESERVED0 BIT(5, U) /* Reserved #0 */
> > +#define UART_MCR_TCRTLR BIT(6, U) /* Access TCR/TLR (TI16C752, EFR[4]=1) */
> > +#define UART_MCR_RESERVED1 BIT(7, U) /* Reserved #1 */
> > +#define UART_MCR_MASK \
> > + (UART_MCR_DTR | UART_MCR_RTS | \
> > + UART_MCR_OUT1 | UART_MCR_OUT2 | \
> > + UART_MCR_LOOP | UART_MCR_TCRTLR)
> > +
> > +/* Modem Status Register */
> > +#define UART_MSR_DCTS BIT(0, U) /* Change in CTS */
> > +#define UART_MSR_DDSR BIT(1, U) /* Change in DSR */
> > +#define UART_MSR_TERI BIT(2, U) /* Change in RI */
> > +#define UART_MSR_DDCD BIT(3, U) /* Change in CTS */
>
> Changes in DCD, can be done on commit
Will fix.
>
>
> > +#define UART_MSR_CTS BIT(4, U)
> > +#define UART_MSR_DSR BIT(5, U)
> > +#define UART_MSR_RI BIT(6, U)
> > +#define UART_MSR_DCD BIT(7, U)
> > +#define UART_MSR_CHANGE \
> > + (UART_MSR_DCTS | UART_MSR_DDSR | UART_MSR_TERI | UART_MSR_DDCD)
> > +#define UART_MSR_STATUS \
> > + (UART_MSR_CTS | UART_MSR_DSR | UART_MSR_RI | UART_MSR_DCD)
> >
> > /* Line Status Register */
> > #define UART_LSR_DR 0x01 /* Data ready */
> > @@ -111,6 +142,7 @@
> > #define UART_LSR_THRE 0x20 /* Xmit hold reg empty */
> > #define UART_LSR_TEMT 0x40 /* Xmitter empty */
> > #define UART_LSR_ERR 0x80 /* Error */
> > +#define UART_LSR_MASK (UART_LSR_OE | UART_LSR_BI)
> >
> > /* These parity settings can be ORed directly into the LCR. */
> > #define UART_PARITY_NONE (0<<3)
> > --
> > 2.51.0
> >
next prev parent reply other threads:[~2025-09-01 22:28 UTC|newest]
Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-08-28 23:53 [PATCH v5 00/15] x86: introduce NS16550-compatible UART emulator dmukhin
2025-08-28 23:53 ` [PATCH v5 01/15] emul/vuart: introduce framework for UART emulators dmukhin
2025-08-29 19:27 ` Stefano Stabellini
2025-09-01 8:14 ` Jan Beulich
2025-09-01 22:27 ` dmukhin
2025-09-02 6:14 ` Jan Beulich
2025-09-01 22:11 ` dmukhin
2025-08-28 23:53 ` [PATCH v5 02/15] xen/8250-uart: update definitions dmukhin
2025-08-29 19:32 ` Stefano Stabellini
2025-09-01 22:28 ` dmukhin [this message]
2025-08-28 23:53 ` [PATCH v5 03/15] emul/ns16x50: implement emulator stub dmukhin
2025-08-29 19:57 ` Stefano Stabellini
2025-09-01 23:11 ` dmukhin
2025-09-02 9:32 ` Jan Beulich
2025-09-05 23:34 ` dmukhin
2025-09-06 0:07 ` dmukhin
2025-09-02 9:36 ` Jan Beulich
2025-09-05 23:34 ` dmukhin
2025-08-28 23:53 ` [PATCH v5 04/15] emul/ns16x50: implement DLL/DLM registers dmukhin
2025-08-28 23:53 ` [PATCH v5 05/15] emul/ns16x50: implement EIR/IIR registers dmukhin
2025-08-29 20:14 ` Stefano Stabellini
2025-09-05 22:05 ` dmukhin
2025-08-28 23:54 ` [PATCH v5 06/15] emul/ns16x50: implement THR/RBR registers dmukhin
2025-08-29 20:28 ` Stefano Stabellini
2025-08-29 20:34 ` Stefano Stabellini
2025-09-05 22:29 ` dmukhin
2025-09-05 22:20 ` dmukhin
2025-08-28 23:54 ` [PATCH v5 07/15] emul/ns16x50: implement FCR register (write-only) dmukhin
2025-08-29 20:38 ` Stefano Stabellini
2025-09-05 22:33 ` dmukhin
2025-08-28 23:54 ` [PATCH v5 08/15] emul/ns16x50: implement LCR/LSR registers dmukhin
2025-08-28 23:54 ` [PATCH v5 09/15] emul/ns16x50: implement MCR/MSR registers dmukhin
2025-08-28 23:54 ` [PATCH v5 10/15] emul/ns16x50: implement SCR register dmukhin
2025-08-28 23:54 ` [PATCH v5 11/15] emul/ns16x50: implement put_rx() hook dmukhin
2025-08-28 23:54 ` [PATCH v5 12/15] emul/ns16550: implement dump_state() hook dmukhin
2025-08-28 23:54 ` [PATCH v5 13/15] x86/domain: enable per-domain I/O port bitmaps dmukhin
2025-08-29 21:43 ` Stefano Stabellini
2025-09-05 22:38 ` dmukhin
2025-08-28 23:54 ` [PATCH v5 14/15] xen/domain: allocate d->irq_caps before arch-specific initialization dmukhin
2025-08-29 21:46 ` Stefano Stabellini
2025-09-05 22:43 ` dmukhin
2025-08-28 23:54 ` [PATCH v5 15/15] emul/ns16x50: implement IRQ emulation via vIOAPIC dmukhin
2025-08-29 22:21 ` Stefano Stabellini
2025-09-05 22:54 ` dmukhin
2025-09-05 23:01 ` Stefano Stabellini
2025-09-05 23:44 ` dmukhin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=aLYeDIrXwMPt4w5y@kraken \
--to=dmukhin@xen.org \
--cc=andrew.cooper3@citrix.com \
--cc=anthony.perard@vates.tech \
--cc=dmukhin@ford.com \
--cc=jbeulich@suse.com \
--cc=julien@xen.org \
--cc=michal.orzel@amd.com \
--cc=roger.pau@citrix.com \
--cc=sstabellini@kernel.org \
--cc=xen-devel@lists.xenproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.