> Date: Sat, 27 Nov 2021 06:22:34 +0900 > From: SASANO Takayoshi <u...@mx5.nisiq.net> > > Hello, > > I am still trying to run OpenBSD on Orange Pi One Plus(Allwinner H6). > At least following fixes are needed. > > - add AXP805 support to axppmic > - add DW-UART FIFO fix to com > (previously posted at > https://www.mail-archive.com/arm@openbsd.org/msg02146.html > but not tested on Rockchip and Marvell yet) > - add Allwinner H6 USB-PHY support to ehci_fdt > - add Allwinner H6 clock/reset setting to sxiccmu > > On Orange Pi One Plus, AXP805 PMIC can access from I2C and RSB. > Linux uses RSB but U-Boot (2021.10) DTB uses I2C. > sxirsb has "early 1" option to initialize before other devices, > so sxitwi needs same thing.
A few ok's below for basically everything but the com(4) changes. But please split those up (combining the sxiccmu bits of course). Will try to test the com(4) changes soon. > Even if these fix are applied, dwxe cannot find ethernet PHY (RT8211). > Orange Pi One Plus' Schematics and DTB defines PHY address as 0x01, > but actually probed at 0x00 (MII broadcast) and 0x07. > We have to modify DTB or take measures such misconfiguration. How does it show up when you change the DTB such that it uses 0x07? > type 0x2 pa 0x40000000 va 0x40000000 pages 0x4000 attr 0x8 > type 0x7 pa 0x44000000 va 0x44000000 pages 0x3ef5 attr 0x8 > type 0x9 pa 0x47ef5000 va 0x47ef5000 pages 0x16 attr 0x8 > type 0x7 pa 0x47f0b000 va 0x47f0b000 pages 0x32eda attr 0x8 > type 0x2 pa 0x7ade5000 va 0x7ade5000 pages 0x9 attr 0x8 > type 0x7 pa 0x7adee000 va 0x7adee000 pages 0x1 attr 0x8 > type 0x2 pa 0x7adef000 va 0x7adef000 pages 0x100 attr 0x8 > type 0x1 pa 0x7aeef000 va 0x7aeef000 pages 0x2a attr 0x8 > type 0x4 pa 0x7af19000 va 0x7af19000 pages 0x8 attr 0x8 > type 0x6 pa 0x7af21000 va 0x1b0a748000 pages 0x4 attr 0x8000000000000008 > type 0x4 pa 0x7af25000 va 0x7af25000 pages 0x1 attr 0x8 > type 0x6 pa 0x7af26000 va 0x1b0a74d000 pages 0x4 attr 0x8000000000000008 > type 0x4 pa 0x7af2a000 va 0x7af2a000 pages 0xc attr 0x8 > type 0x2 pa 0x7af36000 va 0x7af36000 pages 0x501a attr 0x8 > type 0x5 pa 0x7ff50000 va 0x1b0f777000 pages 0x10 attr 0x8000000000000008 > type 0x2 pa 0x7ff60000 va 0x7ff60000 pages 0xa0 attr 0x8 > [ using 8879376 bytes of bsd ELF symbol table ] > Copyright (c) 1982, 1986, 1989, 1991, 1993 > The Regents of the University of California. All rights reserved. > Copyright (c) 1995-2021 OpenBSD. All rights reserved. https://www.OpenBSD.org > > OpenBSD 7.0-current (GENERIC.MP) #60: Sat Nov 27 05:43:28 JST 2021 > > u...@openbsd-current-vm.uaa.org.uk:/usr/src/sys/arch/arm64/compile/GENERIC.MP > real mem = 987557888 (941MB) > avail mem = 918450176 (875MB) > random: boothowto does not indicate good seed > mainbus0 at root: OrangePi One Plus > psci0 at mainbus0: PSCI 1.1, SMCCC 1.2 > cpu0 at mainbus0 mpidr 0: ARM Cortex-A53 r0p4 > cpu0: 32KB 64b/line 2-way L1 VIPT I-cache, 32KB 64b/line 4-way L1 D-cache > cpu0: 512KB 64b/line 16-way L2 cache > cpu0: CRC32,SHA2,SHA1,AES+PMULL,ASID16 > cpu1 at mainbus0 mpidr 1: ARM Cortex-A53 r0p4 > cpu1: 32KB 64b/line 2-way L1 VIPT I-cache, 32KB 64b/line 4-way L1 D-cache > cpu1: 512KB 64b/line 16-way L2 cache > cpu1: CRC32,SHA2,SHA1,AES+PMULL,ASID16 > cpu2 at mainbus0 mpidr 2: ARM Cortex-A53 r0p4 > cpu2: 32KB 64b/line 2-way L1 VIPT I-cache, 32KB 64b/line 4-way L1 D-cache > cpu2: 512KB 64b/line 16-way L2 cache > cpu2: CRC32,SHA2,SHA1,AES+PMULL,ASID16 > cpu3 at mainbus0 mpidr 3: ARM Cortex-A53 r0p4 > cpu3: 32KB 64b/line 2-way L1 VIPT I-cache, 32KB 64b/line 4-way L1 D-cache > cpu3: 512KB 64b/line 16-way L2 cache > cpu3: CRC32,SHA2,SHA1,AES+PMULL,ASID16 > efi0 at mainbus0: UEFI 2.8 > efi0: Das U-Boot rev 0x20211000 > apm0 at mainbus0 > "display-engine" at mainbus0 not configured > "osc24M_clk" at mainbus0 not configured > "pmu" at mainbus0 not configured > agtimer0 at mainbus0: 24000 kHz > simplebus0 at mainbus0: "soc" > sxisyscon0 at simplebus0 > sxiccmu0 at simplebus0 > sxisid0 at simplebus0 > sxipio0 at simplebus0: 108 pins > ampintc0 at simplebus0 nirq 192, ncpu 4 ipi: 0, 1: "interrupt-controller" > sxiccmu1 at simplebus0 > sxipio1 at simplebus0: 16 pins > sxitwi0 at simplebus0 > iic0 at sxitwi0 > axppmic0 at iic0 addr 0x36: AXP805 > "bus" at simplebus0 not configured > "video-codec" at simplebus0 not configured > "gpu" at simplebus0 not configured > "crypto" at simplebus0 not configured > "dma-controller" at simplebus0 not configured > "mailbox" at simplebus0 not configured > "iommu" at simplebus0 not configured > sximmc0 at simplebus0 > sdmmc0 at sximmc0: 4-bit, sd high-speed, mmc high-speed, dma > com0 at simplebus0: DesignWare APB UART, no fifo > com0: console > dwxe0 at simplebus0: address 02:07:11:b5:5a:5a > dwxe0: no PHY found! > "usb" at simplebus0 not configured > "phy" at simplebus0 not configured > ehci0 at simplebus0 > usb0 at ehci0: USB revision 2.0 > uhub0 at usb0 configuration 1 interface 0 "Generic EHCI root hub" rev > 2.00/1.00 addr 1 > ohci0 at simplebus0: version 1.0 > ehci1 at simplebus0 > usb1 at ehci1: USB revision 2.0 > uhub1 at usb1 configuration 1 interface 0 "Generic EHCI root hub" rev > 2.00/1.00 addr 1 > ohci1 at simplebus0: version 1.0 > "hdmi" at simplebus0 not configured > "hdmi-phy" at simplebus0 not configured > "tcon-top" at simplebus0 not configured > "lcd-controller" at simplebus0 not configured > "rtc" at simplebus0 not configured > sxidog0 at simplebus0 > "interrupt-controller" at simplebus0 not configured > "ir" at simplebus0 not configured > "thermal-sensor" at simplebus0 not configured > gpio0 at sxipio0: 32 pins > gpio1 at sxipio0: 32 pins > gpio2 at sxipio0: 32 pins > gpio3 at sxipio0: 32 pins > gpio4 at sxipio0: 32 pins > gpio5 at sxipio0: 32 pins > gpio6 at sxipio0: 32 pins > gpio7 at sxipio0: 32 pins > gpio8 at sxipio1: 32 pins > gpio9 at sxipio1: 32 pins > usb2 at ohci0: USB revision 1.0 > uhub2 at usb2 configuration 1 interface 0 "Generic OHCI root hub" rev > 1.00/1.00 addr 1 > usb3 at ohci1: USB revision 1.0 > uhub3 at usb3 configuration 1 interface 0 "Generic OHCI root hub" rev > 1.00/1.00 addr 1 > "connector" at mainbus0 not configured > "ext_osc32k_clk" at mainbus0 not configured > gpioleds0 at mainbus0: "orangepi:red:power" > "vcc5v" at mainbus0 not configured > "gmac-3v3" at mainbus0 not configured > "binman" at mainbus0 not configured > dt: 451 probes > scsibus0 at sdmmc0: 2 targets, initiator 0 > sd0 at scsibus0 targ 1 lun 0: <SD/MMC, SD16G, 0030> removable > sd0: 14784MB, 512 bytes/sector, 30277632 sectors > umass0 at uhub1 port 1 configuration 1 interface 0 "USB Storage USB Storage" > rev 2.00/14.04 addr 2 > umass0: using SCSI over Bulk-Only > scsibus1 at umass0: 2 targets, initiator 0 > sd1 at scsibus1 targ 1 lun 0: <Generic, STORAGE DEVICE, 1404> removable > sd1: 14768MB, 512 bytes/sector, 30244864 sectors > vscsi0 at root > scsibus2 at vscsi0: 256 targets > softraid0 at root > scsibus3 at softraid0: 256 targets > root on sd0a (225f855485964206.a) swap on sd0b dump on sd0b > WARNING: CHECK AND RESET THE DATE! > warning: /dev/console does not exist > init: not found > panic: no init > Stopped at panic+0x160 [/usr/src/sys/kern/subr_prf.c:202]: cmp w21, > #0 > x0 > TID PID UID PRFLAGS PFLAGS CPU COMMAND > 478035 7254 0 0x14000 0x200 1 zerothread > *200532 1 0 0 0 2 swapper > db_enter() at panic+0x15c [/usr/src/sys/kern/subr_prf.c:231] > panic() at start_init+0x2a0 [/usr/src/sys/kern/init_main.c:761] > start_init() at proc_trampoline+0x10 > https://www.openbsd.org/ddb.html describes the minimum info required in bug > reports. Insufficient info makes it difficult to find and fix bugs. > ddb{2}> > > -- > SASANO Takayoshi (JG1UAA) <u...@mx5.nisiq.net> > > Index: arch/arm64/conf/GENERIC > =================================================================== > RCS file: /cvs/src/sys/arch/arm64/conf/GENERIC,v > retrieving revision 1.214 > diff -u -p -u -p -r1.214 GENERIC > --- arch/arm64/conf/GENERIC 22 Nov 2021 20:25:50 -0000 1.214 > +++ arch/arm64/conf/GENERIC 26 Nov 2021 20:44:38 -0000 > @@ -295,7 +295,7 @@ sdmmc* at sximmc? # SD/MMC bus > sxisid* at fdt? early 1 > sxisyscon* at fdt? early 1 # System controller > sxitemp* at fdt? # Temperature sensor > -sxitwi* at fdt? # I2C controller > +sxitwi* at fdt? early 1 # I2C controller > iic* at sxitwi? # I2C bus > dwxe* at fdt? > > @@ -481,6 +481,7 @@ uk* at scsibus? > > # I2C devices > abcrtc* at iic? # Abracon x80x RTC > +axppmic* at iic? # AXP80x PMIC > cwfg* at iic? # CellWise CW201x fuel gauge > dsxrtc* at iic? # DS3231 RTC > escodec* at iic? # ES8316 audio codec This bit is ok kettenis@ > Index: dev/fdt/axppmic.c > =================================================================== > RCS file: /cvs/src/sys/dev/fdt/axppmic.c,v > retrieving revision 1.11 > diff -u -p -u -p -r1.11 axppmic.c > --- dev/fdt/axppmic.c 24 Oct 2021 17:52:26 -0000 1.11 > +++ dev/fdt/axppmic.c 26 Nov 2021 20:44:39 -0000 > @@ -293,6 +293,7 @@ struct axppmic_device axppmic_devices[] > { "x-powers,axp221", "AXP221", axp221_regdata, axp221_sensdata }, > { "x-powers,axp223", "AXP223", axp221_regdata, axp221_sensdata }, > { "x-powers,axp803", "AXP803", axp803_regdata, axp803_sensdata }, > + { "x-powers,axp805", "AXP805", axp806_regdata }, > { "x-powers,axp806", "AXP806", axp806_regdata }, > { "x-powers,axp809", "AXP809", axp809_regdata, axp221_sensdata } > }; > @@ -491,8 +492,10 @@ axppmic_attach_common(struct axppmic_sof > sc->sc_sensdata = device->sensdata; > > /* Switch AXP806 into master or slave mode. */ > - if (strcmp(name, "x-powers,axp806") == 0) { > - if (OF_getproplen(node, "x-powers,master-mode") == 0) { > + if (strcmp(name, "x-powers,axp805") == 0 || > + strcmp(name, "x-powers,axp806") == 0) { > + if (OF_getproplen(node, "x-powers,master-mode") == 0 || > + OF_getproplen(node, "x-powers,self-working-mode") == 0) { > axppmic_write_reg(sc, AXP806_REG_ADDR_EXT, > AXP806_REG_ADDR_EXT_MASTER_MODE); > } else { This is 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 26 Nov 2021 20:44:39 -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")) I still want to test this bit. > Index: dev/fdt/ehci_fdt.c > =================================================================== > RCS file: /cvs/src/sys/dev/fdt/ehci_fdt.c,v > retrieving revision 1.7 > diff -u -p -u -p -r1.7 ehci_fdt.c > --- dev/fdt/ehci_fdt.c 24 Oct 2021 17:52:26 -0000 1.7 > +++ dev/fdt/ehci_fdt.c 26 Nov 2021 20:44:39 -0000 > @@ -174,6 +174,7 @@ struct ehci_phy ehci_phys[] = { > { "allwinner,sun8i-h3-usb-phy", sun4i_phy_init }, > { "allwinner,sun8i-r40-usb-phy", sun4i_phy_init }, > { "allwinner,sun8i-v3s-usb-phy", sun4i_phy_init }, > + { "allwinner,sun50i-h6-usb-phy", sun4i_phy_init }, > { "allwinner,sun50i-a64-usb-phy", sun4i_phy_init }, > { "allwinner,sun9i-a80-usb-phy", sun9i_phy_init }, > }; > @@ -274,6 +275,7 @@ sun4i_phy_init(struct ehci_fdt_softc *sc > */ > if (OF_is_compatible(node, "allwinner,sun8i-h3-usb-phy") || > OF_is_compatible(node, "allwinner,sun8i-r40-usb-phy") || > + OF_is_compatible(node, "allwinner,sun50i-h6-usb-phy") || > OF_is_compatible(node, "allwinner,sun50i-a64-usb-phy")) { > val = bus_space_read_4(sc->sc.iot, sc->sc.ioh, 0x810); > val &= ~(1 << 1); ok kettenis@ > Index: dev/fdt/sxiccmu.c > =================================================================== > RCS file: /cvs/src/sys/dev/fdt/sxiccmu.c,v > retrieving revision 1.29 > diff -u -p -u -p -r1.29 sxiccmu.c > --- dev/fdt/sxiccmu.c 24 Oct 2021 17:52:27 -0000 1.29 > +++ dev/fdt/sxiccmu.c 26 Nov 2021 20:44:39 -0000 > @@ -1311,15 +1311,30 @@ sxiccmu_h3_r_get_frequency(struct sxiccm > return 0; > } > > + Can you change this blank line into a comment: /* Allwinner H6 */ > +#define H6_AHB3_CFG_REG 0x051c > +#define H6_AHB3_CLK_FACTOR_N(x) (((x) >> 8) & 0x3) > +#define H6_AHB3_CLK_FACTOR_M(x) (((x) >> 0) & 0x3) > + > uint32_t > sxiccmu_h6_get_frequency(struct sxiccmu_softc *sc, uint32_t idx) > { > + uint32_t reg, m, n; > + uint32_t freq; > + > switch (idx) { > case H6_CLK_PLL_PERIPH0: > /* Not hardcoded, but recommended. */ > return 600000000; > case H6_CLK_PLL_PERIPH0_2X: > return sxiccmu_h6_get_frequency(sc, H6_CLK_PLL_PERIPH0) * 2; > + case H6_CLK_AHB3: > + reg = SXIREAD4(sc, H6_AHB3_CFG_REG); > + /* assume PLL_PERIPH0 source */ > + freq = sxiccmu_h6_get_frequency(sc, H6_CLK_PLL_PERIPH0); > + m = H6_AHB3_CLK_FACTOR_M(reg) + 1; > + n = 1 << H6_AHB3_CLK_FACTOR_N(reg); > + return freq / (m * n); > case H6_CLK_APB2: > /* XXX Controlled by a MUX. */ > return 24000000; > Index: dev/fdt/sxiccmu_clocks.h > =================================================================== > RCS file: /cvs/src/sys/dev/fdt/sxiccmu_clocks.h,v > retrieving revision 1.31 > diff -u -p -u -p -r1.31 sxiccmu_clocks.h > --- dev/fdt/sxiccmu_clocks.h 29 Sep 2020 21:05:05 -0000 1.31 > +++ dev/fdt/sxiccmu_clocks.h 26 Nov 2021 20:44:39 -0000 > @@ -408,6 +408,7 @@ struct sxiccmu_ccu_bit sun8i_h3_r_gates[ > > #define H6_CLK_PLL_PERIPH0 3 > #define H6_CLK_PLL_PERIPH0_2X 4 > +#define H6_CLK_AHB3 25 > #define H6_CLK_APB1 26 > #define H6_CLK_APB2 27 > #define H6_CLK_MMC0 64 > @@ -420,8 +421,12 @@ struct sxiccmu_ccu_bit sun8i_h3_r_gates[ > #define H6_CLK_BUS_UART1 71 > #define H6_CLK_BUS_UART2 72 > #define H6_CLK_BUS_UART3 73 > +#define H6_CLK_BUS_EMAC 84 > #define H6_CLK_USB_OHCI0 104 > +#define H6_CLK_USB_PHY0 105 > +#define H6_CLK_USB_PHY1 106 > #define H6_CLK_USB_OHCI3 107 > +#define H6_CLK_USB_PHY3 108 > #define H6_CLK_BUS_OHCI0 111 > #define H6_CLK_BUS_OHCI3 112 > #define H6_CLK_BUS_EHCI0 113 > @@ -440,8 +445,12 @@ struct sxiccmu_ccu_bit sun50i_h6_gates[] > [H6_CLK_BUS_UART1] = { 0x090c, 1, H6_CLK_APB2 }, > [H6_CLK_BUS_UART2] = { 0x090c, 2, H6_CLK_APB2 }, > [H6_CLK_BUS_UART3] = { 0x090c, 3, H6_CLK_APB2 }, > + [H6_CLK_BUS_EMAC] = { 0x097c, 0, H6_CLK_AHB3 }, > [H6_CLK_USB_OHCI0] = { 0x0a70, 31 }, > + [H6_CLK_USB_PHY0] = { 0x0a70, 29 }, > + [H6_CLK_USB_PHY1] = { 0x0a74, 29 }, > [H6_CLK_USB_OHCI3] = { 0x0a7c, 31 }, > + [H6_CLK_USB_PHY3] = { 0x0a7c, 29 }, > [H6_CLK_BUS_OHCI0] = { 0x0a8c, 0 }, > [H6_CLK_BUS_OHCI3] = { 0x0a8c, 3 }, > [H6_CLK_BUS_EHCI0] = { 0x0a8c, 4 }, > @@ -451,10 +460,12 @@ struct sxiccmu_ccu_bit sun50i_h6_gates[] > #define H6_R_CLK_APB1 2 > #define H6_R_CLK_APB2 3 > #define H6_R_CLK_APB2_I2C 8 > +#define H6_R_CLK_APB2_RSB 13 > > struct sxiccmu_ccu_bit sun50i_h6_r_gates[] = { > [H6_R_CLK_APB1] = { 0xffff, 0xff }, > - [H6_R_CLK_APB2_I2C] = { 0x019c, 1, H6_R_CLK_APB2 }, > + [H6_R_CLK_APB2_I2C] = { 0x019c, 0, H6_R_CLK_APB2 }, > + [H6_R_CLK_APB2_RSB] = { 0x01bc, 0, H6_R_CLK_APB2 }, > }; > > /* R40 */ > @@ -833,6 +844,10 @@ struct sxiccmu_ccu_bit sun8i_h3_r_resets > #define H6_RST_BUS_UART1 22 > #define H6_RST_BUS_UART2 23 > #define H6_RST_BUS_UART3 24 > +#define H6_RST_BUS_EMAC 33 > +#define H6_RST_USB_PHY0 44 > +#define H6_RST_USB_PHY1 45 > +#define H6_RST_USB_PHY3 46 > #define H6_RST_BUS_OHCI0 48 > #define H6_RST_BUS_OHCI3 49 > #define H6_RST_BUS_EHCI0 50 > @@ -846,6 +861,10 @@ struct sxiccmu_ccu_bit sun50i_h6_resets[ > [H6_RST_BUS_UART1] = { 0x090c, 17 }, > [H6_RST_BUS_UART2] = { 0x090c, 18 }, > [H6_RST_BUS_UART3] = { 0x090c, 19 }, > + [H6_RST_BUS_EMAC] = { 0x097c, 16 }, > + [H6_RST_USB_PHY0] = { 0x0a70, 30 }, > + [H6_RST_USB_PHY1] = { 0x0a74, 30 }, > + [H6_RST_USB_PHY3] = { 0x0a7c, 30 }, > [H6_RST_BUS_OHCI0] = { 0x0a8c, 16 }, > [H6_RST_BUS_OHCI3] = { 0x0a8c, 19 }, > [H6_RST_BUS_EHCI0] = { 0x0a8c, 20 }, > @@ -853,9 +872,11 @@ struct sxiccmu_ccu_bit sun50i_h6_resets[ > }; > > #define H6_R_RST_APB2_I2C 4 > +#define H6_R_RST_APB2_RSB 7 > > struct sxiccmu_ccu_bit sun50i_h6_r_resets[] = { > [H6_R_RST_APB2_I2C] = { 0x019c, 16 }, > + [H6_R_RST_APB2_RSB] = { 0x01bc, 16 }, > }; > > /* R40 */ ok kettenis@ with the change above > 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 26 Nov 2021 20:44:39 -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; > + 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 26 Nov 2021 20:44:39 -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 26 Nov 2021 20:44:39 -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 26 Nov 2021 20:44:39 -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) */ > Still need to test these bits.