2022-09-20 23:56:23

by Maciej W. Rozycki

[permalink] [raw]
Subject: [PATCH v2 0/3] serial: 8250: Let drivers request full 16550A feature probing

Hi,

This is v2 of the series, addressing a small issue pointed out in the
original submission and adds a third patch to switch to using BIT_ULL.
See individual changes for further details. The original cover letter
follows.

A recent change has added a SERIAL_8250_16550A_VARIANTS option, which
lets one request the 8250 driver not to probe for 16550A device features
so as to reduce the driver's device startup time in virtual machines.
This has turned out problematic to a more recent update for the OxSemi
Tornado series PCIe devices, whose new baud rate generator handling code
actually requires switching hardware into the enhanced mode for correct
operation, which actually requires 16550A device features to have been
probed for.

This small patch series fixes the issue by letting individual device
subdrivers to request full 16550A device feature probing by means of a
flag regardless of the SERIAL_8250_16550A_VARIANTS setting chosen.

The changes have been verified with an OXPCIe952 device, in the native
UART mode and a 64-bit RISC-V system as well as in the legacy UART mode
and a 32-bit x86 system.

Credit to Anders for reporting this issue and then working through the
resolution.

Maciej


2022-09-21 00:39:34

by Maciej W. Rozycki

[permalink] [raw]
Subject: [PATCH v2 1/3] serial: 8250: Let drivers request full 16550A feature probing

A SERIAL_8250_16550A_VARIANTS configuration option has been recently
defined that lets one request the 8250 driver not to probe for 16550A
device features so as to reduce the driver's device startup time in
virtual machines.

Some actual hardware devices require these features to have been fully
determined however for their driver to work correctly, so define a flag
to let drivers request full 16550A feature probing on a device-by-device
basis if required regardless of the SERIAL_8250_16550A_VARIANTS option
setting chosen.

Signed-off-by: Maciej W. Rozycki <[email protected]>
Reported-by: Anders Blomdell <[email protected]>
Fixes: dc56ecb81a0a ("serial: 8250: Support disabling mdelay-filled probes of 16550A variants")
Cc: [email protected] # v5.6+
---
Changes from v1:

- Use `u64' rather than `__u64' as the data type.
---
drivers/tty/serial/8250/8250_port.c | 3 ++-
include/linux/serial_core.h | 3 ++-
2 files changed, 4 insertions(+), 2 deletions(-)

linux-serial-8250-full-probe.diff
Index: linux-macro/drivers/tty/serial/8250/8250_port.c
===================================================================
--- linux-macro.orig/drivers/tty/serial/8250/8250_port.c
+++ linux-macro/drivers/tty/serial/8250/8250_port.c
@@ -1021,7 +1021,8 @@ static void autoconfig_16550a(struct uar
up->port.type = PORT_16550A;
up->capabilities |= UART_CAP_FIFO;

- if (!IS_ENABLED(CONFIG_SERIAL_8250_16550A_VARIANTS))
+ if (!IS_ENABLED(CONFIG_SERIAL_8250_16550A_VARIANTS) &&
+ !(up->port.flags & UPF_FULL_PROBE))
return;

/*
Index: linux-macro/include/linux/serial_core.h
===================================================================
--- linux-macro.orig/include/linux/serial_core.h
+++ linux-macro/include/linux/serial_core.h
@@ -414,7 +414,7 @@ struct uart_icount {
__u32 buf_overrun;
};

-typedef unsigned int __bitwise upf_t;
+typedef u64 __bitwise upf_t;
typedef unsigned int __bitwise upstat_t;

struct uart_port {
@@ -522,6 +522,7 @@ struct uart_port {
#define UPF_FIXED_PORT ((__force upf_t) (1 << 29))
#define UPF_DEAD ((__force upf_t) (1 << 30))
#define UPF_IOREMAP ((__force upf_t) (1 << 31))
+#define UPF_FULL_PROBE ((__force upf_t) (1ULL << 32))

#define __UPF_CHANGE_MASK 0x17fff
#define UPF_CHANGE_MASK ((__force upf_t) __UPF_CHANGE_MASK)