> Date: Mon, 20 Dec 2021 20:14:31 +0900
> From: SASANO Takayoshi <u...@mx5.nisiq.net>
> 
> Hello,
> 
> > Can you send out a diff with just the com(4) changes?
> 
> Sure, attached after signature.
> Best regards,

Sorry for the late reply.  I keep getting distracted.  But there is a
bit of problem with this diff:

> 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      20 Dec 2021 11:06:09 -0000
> @@ -1300,7 +1300,7 @@ void
>  com_attach_subr(struct com_softc *sc)
>  {
>       int probe = 0;
> -     u_int8_t lcr;
> +     u_int8_t lcr, fifo;
>  
>       sc->sc_ier = 0;
>       /* disable interrupts */
> @@ -1480,6 +1480,25 @@ 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(": DesignWare APB UART, ");
> +             SET(sc->sc_hwflags, COM_HW_FIFO);
> +             sc->sc_fifolen = CPR_FIFO_MODE(com_read_reg(sc, com_cpr)) * 16;

The com_read_reg() function returns a uint8_t, which means that only
the lower 8 bits of the CPR register are returned.  So what you need
here is something like

                cpr = bus_space_read_4(sc->sc_iot, sc->sc_ioh, com_cpr << 2);
                sc->sc_fifolen = CPR_FIFO_MODE(cpr) * 16;

With that change, the Rockchip RK3399 UART reports a 64-byte FIFO,
which matches the datasheet for that SoC.

What happens on the H6 and H616 with that code?  Does it also report a
non-zero FIFO size?  In that case we probably should change the code a
bit.

> +             if (sc->sc_fifolen) {
> +                     printf("%d byte fifo\n", sc->sc_fifolen);
> +             } else {
> +                     printf("no fifo\n");
> +                     /*
> +                      * Allwinner H6's DW-APB configuration does not have
> +                      * CPR register and detect as no fifo.
> +                      * But this UART has 256 bytes FIFO and disabling FIFO
> +                      * makes problem; LSR_RXRDY is still set after
> +                      * reading com_data when FIFO is disabled (errata?).
> +                      * For workaround, treat as 1 byte FIFO.
> +                      */
> +                     sc->sc_fifolen = 1;
> +             }
> +             break;
>       default:
>               panic("comattach: bad fifo type");
>       }
> @@ -1496,10 +1515,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   20 Dec 2021 11:06:09 -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   20 Dec 2021 11:06:09 -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       20 Dec 2021 11:06:09 -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) */
> 

Reply via email to