> Date: Tue, 11 Jan 2022 20:13:59 +0900
> From: SASANO Takayoshi <[email protected]>
>
> Hello.
>
> > I have a few more suggestions below. I think the other bits were
> > fine, but can you post the full diff with the fixes suggested below to
> > be sure?
>
> okay, I refelected your suggestion and attach the full diff.
> Regards,
ok kettenis@
> Index: dev/fdt/com_fdt.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/fdt/com_fdt.c,v
> retrieving revision 1.6
> diff -u -p -u -p -r1.6 com_fdt.c
> --- dev/fdt/com_fdt.c 24 Oct 2021 17:52:26 -0000 1.6
> +++ dev/fdt/com_fdt.c 11 Jan 2022 11:05:58 -0000
> @@ -33,8 +33,6 @@
> #include <dev/ofw/ofw_clock.h>
> #include <dev/ofw/ofw_pinctrl.h>
>
> -#define com_usr 31 /* Synopsys DesignWare UART */
> -
> int com_fdt_match(struct device *, void *, void *);
> void com_fdt_attach(struct device *, struct device *, void *);
> int com_fdt_intr_designware(void *);
> @@ -144,8 +142,10 @@ com_fdt_attach(struct device *parent, st
> sc->sc_reg_shift = OF_getpropint(faa->fa_node, "reg-shift", shift);
>
> if (OF_is_compatible(faa->fa_node, "snps,dw-apb-uart") ||
> - OF_is_compatible(faa->fa_node, "marvell,armada-38x-uart"))
> + OF_is_compatible(faa->fa_node, "marvell,armada-38x-uart")) {
> + sc->sc_uarttype = COM_UART_DW_APB;
> intr = com_fdt_intr_designware;
> + }
>
> if (OF_is_compatible(faa->fa_node, "ti,omap3-uart") ||
> OF_is_compatible(faa->fa_node, "ti,omap4-uart"))
> Index: dev/ic/com.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/ic/com.c,v
> retrieving revision 1.174
> diff -u -p -u -p -r1.174 com.c
> --- dev/ic/com.c 6 May 2021 20:35:21 -0000 1.174
> +++ dev/ic/com.c 11 Jan 2022 11:05:59 -0000
> @@ -1300,7 +1300,8 @@ void
> com_attach_subr(struct com_softc *sc)
> {
> int probe = 0;
> - u_int8_t lcr;
> + u_int8_t lcr, fifo;
> + u_int32_t cpr;
>
> sc->sc_ier = 0;
> /* disable interrupts */
> @@ -1480,6 +1481,27 @@ com_attach_subr(struct com_softc *sc)
> SET(sc->sc_hwflags, COM_HW_FIFO);
> sc->sc_fifolen = 256;
> break;
> + case COM_UART_DW_APB:
> + printf(": dw16550");
> + SET(sc->sc_hwflags, COM_HW_FIFO);
> + cpr = bus_space_read_4(sc->sc_iot, sc->sc_ioh, com_cpr << 2);
> + sc->sc_fifolen = CPR_FIFO_MODE(cpr) * 16;
> + if (sc->sc_fifolen) {
> + printf(", %d byte fifo\n", sc->sc_fifolen);
> + } else {
> + printf("\n");
> + /*
> + * The DW-APB configuration on the Allwinner H6 SoC
> + * does not provide the CPR register and will be
> + * detected as having no FIFO. But it does have a
> + * 256-byte FIFO and with the FIFO disabled the
> + * LSR_RXRDY bit remains set even if the input
> + * buffer is empty. As a workaround, treat as a
> + * 1-byte FIFO.
> + */
> + sc->sc_fifolen = 1;
> + }
> + break;
> default:
> panic("comattach: bad fifo type");
> }
> @@ -1496,10 +1518,13 @@ com_attach_subr(struct com_softc *sc)
> }
>
> /* clear and disable fifo */
> - com_write_reg(sc, com_fifo, FIFO_RCV_RST | FIFO_XMT_RST);
> + /* DW-APB UART cannot turn off FIFO here (ddb will not work) */
> + fifo = (sc->sc_uarttype == COM_UART_DW_APB) ?
> + (FIFO_ENABLE | FIFO_TRIGGER_1) : 0;
> + com_write_reg(sc, com_fifo, fifo | FIFO_RCV_RST | FIFO_XMT_RST);
> if (ISSET(com_read_reg(sc, com_lsr), LSR_RXRDY))
> (void)com_read_reg(sc, com_data);
> - com_write_reg(sc, com_fifo, 0);
> + com_write_reg(sc, com_fifo, fifo);
>
> sc->sc_mcr = 0;
> com_write_reg(sc, com_mcr, sc->sc_mcr);
> Index: dev/ic/comreg.h
> ===================================================================
> RCS file: /cvs/src/sys/dev/ic/comreg.h,v
> retrieving revision 1.20
> diff -u -p -u -p -r1.20 comreg.h
> --- dev/ic/comreg.h 14 Aug 2020 18:14:11 -0000 1.20
> +++ dev/ic/comreg.h 11 Jan 2022 11:05:59 -0000
> @@ -180,6 +180,9 @@
> #define ISR_TXPL 0x08 /* negative transmit data polarity */
> #define ISR_RXPL 0x10 /* negative receive data polarity */
>
> +/* component parameter register (Synopsys DesignWare APB UART) */
> +#define CPR_FIFO_MODE(x) (((x) >> 16) & 0xff)
> +
> #define COM_NPORTS 8
>
> /* Exar XR17V35X */
> Index: dev/ic/comvar.h
> ===================================================================
> RCS file: /cvs/src/sys/dev/ic/comvar.h,v
> retrieving revision 1.58
> diff -u -p -u -p -r1.58 comvar.h
> --- dev/ic/comvar.h 14 Aug 2020 18:14:11 -0000 1.58
> +++ dev/ic/comvar.h 11 Jan 2022 11:05:59 -0000
> @@ -104,6 +104,7 @@ struct com_softc {
> #define COM_UART_XR16850 0x10 /* 128 byte fifo */
> #define COM_UART_OX16C950 0x11 /* 128 byte fifo */
> #define COM_UART_XR17V35X 0x12 /* 256 byte fifo */
> +#define COM_UART_DW_APB 0x13 /* configurable */
>
> u_char sc_hwflags;
> #define COM_HW_NOIEN 0x01
> Index: dev/ic/ns16550reg.h
> ===================================================================
> RCS file: /cvs/src/sys/dev/ic/ns16550reg.h,v
> retrieving revision 1.5
> diff -u -p -u -p -r1.5 ns16550reg.h
> --- dev/ic/ns16550reg.h 2 Jun 2003 23:28:02 -0000 1.5
> +++ dev/ic/ns16550reg.h 11 Jan 2022 11:05:59 -0000
> @@ -50,3 +50,9 @@
> #define com_lsr 5 /* line status register (R/W) */
> #define com_msr 6 /* modem status register (R/W) */
> #define com_scratch 7 /* scratch register (R/W) */
> +
> +/*
> + * Synopsys DesignWare APB UART additional registers
> + */
> +#define com_usr 31 /* UART status register (R) */
> +#define com_cpr 61 /* component parameter register (R) */
>