Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 19 Aug 2020 11:55:13 -0600
From:      Ian Lepore <ian@freebsd.org>
To:        Johnny Sorocil <jsorocil@gmail.com>, freebsd-arm@freebsd.org
Subject:   Re: Disabling internal RTC ends up in hang
Message-ID:  <6d88bd5659b854d9af73cb9a325c719c3d7d9da9.camel@freebsd.org>
In-Reply-To: <CADxA8Sr%2Bmkx1GvgabFWOCaN3nURy=LoOH9VM9DduynWbW%2Bo_Mg@mail.gmail.com>
References:  <CADxA8Sq6TrjDBW0PH_HoywrKDjT=mKxH0F27XYLxDN=d=QHHyw@mail.gmail.com> <CADxA8Sr%2Bmkx1GvgabFWOCaN3nURy=LoOH9VM9DduynWbW%2Bo_Mg@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Wed, 2020-08-19 at 10:13 +0200, Johnny Sorocil wrote:
> I wan't to have the correct date on my ARM SBC (armv7 Orange Pi Zero
> board
> which doesn't have an RTC battery socket). Got an external I2C RTC
> module
> (DS3231) which is recognized and works (after adding device tree
> overlay):
> 
> root@arm2:~ # sysctl dev.ds3231
> dev.ds3231.0.32khz_enable: 1
> dev.ds3231.0.sqw_mode: interrupt
> dev.ds3231.0.sqw_freq: 1024
> dev.ds3231.0.bbsqw: 0
> dev.ds3231.0.temp_conv: 0
> dev.ds3231.0.temperature: 30.0C
> dev.ds3231.0.%parent: iicbus0
> dev.ds3231.0.%pnpinfo: name=ds3231@68 compat=maxim,ds3231
> dev.ds3231.0.%location: addr=0xd0
> dev.ds3231.0.%driver: ds3231
> dev.ds3231.0.%desc: Maxim DS3231 RTC
> dev.ds3231.%parent:
> 
> 
> Setting a date works - the system will have the correct date until
> power is
> disconnected. After power is connected again, system time is not read
> from
> RTC.
> 
> After powercycle:
> 
> root@arm2:~ # date
> Fri Jan  1 00:22:25 UTC 2010
> root@arm2:~ # ./ds1307 -a 0x68 -r
> 09:37:59 12/08/2020
> 
> NTP is not used. ds1307
> <https://raw.githubusercontent.com/vzaigrin/ds1307/master/DS1307.C>;
> program
> is used to directly read registers from the I2C module.
> 
> Disabling internal rtc (via device tree overlay) results in kernel
> panic &
> hang:
> 
> ---<<BOOT>>---
> Copyright (c) 1992-2019 The FreeBSD Project.
> Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993,
> 1994
>         The Regents of the University of California. All rights
> reserved.
> FreeBSD is a registered trademark of The FreeBSD Foundation.
> FreeBSD 12.1-RELEASE r354233 GENERIC arm
> FreeBSD clang version 8.0.1 (tags/RELEASE_801/final 366581) (based on
> LLVM 8.0.1)
> VT: init without driver.
> module_register: cannot register ofwbus/pcib from kernel; already
> loaded from kernel
> Module ofwbus/pcib failed to register: 17
> module_register: cannot register simplebus/pcib from kernel; already
> loaded from kernel
> Module simplebus/pcib failed to register: 17
> CPU: ARM Cortex-A7 r0p5 (ECO: 0x00000000)
> CPU Features:
>   Multiprocessing, Thumb2, Security, Virtualization, Generic Timer,
> VMSAv7,
>   PXN, LPAE, Coherent Walk
> Optional instructions:
>   SDIV/UDIV, UMULL, SMULL, SIMD(ext)
> LoUU:2 LoC:3 LoUIS:2
> Cache level 1:
>  32KB/64B 4-way data cache WB Read-Alloc Write-Alloc
>  32KB/32B 2-way instruction cache Read-Alloc
> Cache level 2:
>  512KB/64B 8-way unified cache WB Read-Alloc Write-Alloc
> real memory  = 536289280 (511 MB)
> avail memory = 509890560 (486 MB)
> No PSCI/SMCCC call function found
> FreeBSD/SMP: Multiprocessor System Detected: 4 CPUs
> random: unblocking device.
> random: entropy device external interface
> kbd0 at kbdmux0
> ofwbus0: <Open Firmware Device Tree>
> ofw_clkbus0: <OFW clocks bus> on ofwbus0
> clk_fixed0: <Fixed clock> on ofw_clkbus0
> clk_fixed1: <Fixed clock> on ofw_clkbus0
> simplebus0: <Flattened device tree simple bus> on ofwbus0
> regfix0: <Fixed Regulator> on ofwbus0
> regfix1: <Fixed Regulator> on ofwbus0
> regfix2: <Fixed Regulator> on ofwbus0
> regfix3: <Fixed Regulator> on ofwbus0
> ccu_h3ng0: <Allwinner H3/H5 Clock Control Unit NG> mem
> 0x1c20000-0x1c203ff on simplebus0
> ccu_h3ng0: Clock apb2 have unknown parent: osc32k
> ccu_h3ng0: Clock ahb1 have unknown parent: osc32k
> ccu_h3ng0: Clock cpux have unknown parent: osc32k
> panic: cannot finalize clkdom initialization
> 
> cpuid = 0
> time = 1
> Uptime: 1s
> Automatic reboot in 15 seconds - press a key on the console to abort
> Rebooting...
> Reset: watchdog device has not been initialized
> Reset failed!
> 
> 
> The same happens with -CURRENT with custom kernel compiled without
> aw_rtc
> device:
> 
> % cat usr/src/sys/arm/conf/MYKERNEL
> include GENERIC
> ident   MYKERNEL
> 
> nodevice        aw_rtc            # Allwinner On-chip RTC
> 
> Device tree overlay for disabling internal RTC is not enabled and
> after
> connecting serial console and booting that kernel:
> 
> ...
> simplebus0: <Flattened device tree simple bus> on ofwbus0
> regfix0: <Fixed Regulator> on ofwbus0
> regfix1: <Fixed Regulator> on ofwbus0
> regfix2: <Fixed Regulator> on ofwbus0
> regfix3: <Fixed Regulator> on ofwbus0
> ccu_h3ng0: <Allwinner H3/H5 Clock Control Unit NG> mem
> 0x1c20000-0x1c203ff on simplebus0
> ccu_h3ng0: Clock apb2 have unknown parent: osc32k
> ccu_h3ng0: Clock ahb1 have unknown parent: osc32k
> ccu_h3ng0: Clock cpux have unknown parent: osc32k
> panic: cannot finalize clkdom initialization
> 
> cpuid = 0
> time = 1
> KDB: stack backtrace:
> db_trace_self() at db_trace_self
>          pc = 0xc0578934  lr = 0xc0079eb0
> (db_trace_self_wrapper+0x30)
>          sp = 0xc0d14b98  fp = 0xc0d14cb0
> db_trace_self_wrapper() at db_trace_self_wrapper+0x30
>          pc = 0xc0079eb0  lr = 0xc02bf54c (vpanic+0x174)
>          sp = 0xc0d14cb8  fp = 0xc0d14cd8
>          r4 = 0x00000100  r5 = 0xc0a42b20
>          r6 = 0xc06a0af6  r7 = 0x00000000
> vpanic() at vpanic+0x174
>          pc = 0xc02bf54c  lr = 0xc02bf308 (doadump)
>          sp = 0xc0d14ce0  fp = 0xc0d14ce4
>          r4 = 0x000008c0  r5 = 0xd02f9800
>          r6 = 0x00000071  r7 = 0xc0d14d18
>          r8 = 0xc0d14d08  r9 = 0x00000001
>         r10 = 0x00000000
> doadump() at doadump
>          pc = 0xc02bf308  lr = 0xc05be870 (aw_ccung_write_4)
>          sp = 0xc0d14cec  fp = 0xc0d14d50
>          r4 = 0x00000000  r5 = 0xc0d14ce4
>          r6 = 0xc02bf308 r10 = 0xc0d14cec
> aw_ccung_write_4() at aw_ccung_write_4
>          pc = 0xc05be870  lr = 0xc02fc1b8 (device_attach+0x50c)
>          sp = 0xc0d14d58  fp = 0xc0d14da0
>          r4 = 0x00000000  r5 = 0xc0ae30a4
>          r6 = 0x80040001 r10 = 0x80000803
> device_attach() at device_attach+0x50c
>          pc = 0xc02fc1b8  lr = 0xc02fbc10
> (device_probe_and_attach+0x8c)
>          sp = 0xc0d14da8  fp = 0xc0d14dc0
>          r4 = 0xd00de400  r5 = 0xc2471f80
>          r6 = 0x5e4a6f28  r7 = 0x00000000
>          r8 = 0xc0a615a8  r9 = 0xc0a615ac
>         r10 = 0xc0a4278c
> device_probe_and_attach() at device_probe_and_attach+0x8c
>          pc = 0xc02fbc10  lr = 0xc02fdf5c (bus_generic_new_pass+0xb0)
>          sp = 0xc0d14dc8  fp = 0xc0d14de0
>          r4 = 0xd00de400  r5 = 0xc0848ef8
>          r6 = 0xc088cba0 r10 = 0xc0a4278c
> bus_generic_new_pass() at bus_generic_new_pass+0xb0
>          pc = 0xc02fdf5c  lr = 0xc02fdfa8 (bus_generic_new_pass+0xfc)
>          sp = 0xc0d14de8  fp = 0xc0d14e00
>          r4 = 0xd00df980  r5 = 0xc0848ef8
>          r6 = 0xd00e0000  r7 = 0x00000000
>          r8 = 0xc0a615a8 r10 = 0xc0a4278c
> bus_generic_new_pass() at bus_generic_new_pass+0xfc
>          pc = 0xc02fdfa8  lr = 0xc02fdfa8 (bus_generic_new_pass+0xfc)
>          sp = 0xc0d14e08  fp = 0xc0d14e20
>          r4 = 0xd00dfc00  r5 = 0xc0848ef8
>          r6 = 0xd00e0000  r7 = 0x00000000
>          r8 = 0xc0a615a8 r10 = 0xc0a4278c
> bus_generic_new_pass() at bus_generic_new_pass+0xfc
>          pc = 0xc02fdfa8  lr = 0xc02fdfa8 (bus_generic_new_pass+0xfc)
>          sp = 0xc0d14e28  fp = 0xc0d14e40
>          r4 = 0xd00dfc80  r5 = 0xc0848ef8
>          r6 = 0xd00e0000  r7 = 0x00000000
>          r8 = 0xc0a615a8 r10 = 0xc0a4278c
> bus_generic_new_pass() at bus_generic_new_pass+0xfc
>          pc = 0xc02fdfa8  lr = 0xc02f9490 (bus_set_pass+0x54)
>          sp = 0xc0d14e48  fp = 0xc0d14e60
>          r4 = 0xd00e78a0  r5 = 0xc0848ef8
>          r6 = 0xd00e0000  r7 = 0xc0a615a8
>          r8 = 0x7fffffff r10 = 0xc0a4278c
> bus_set_pass() at bus_set_pass+0x54
>          pc = 0xc02f9490  lr = 0xc0255904 (mi_startup+0x2a4)
>          sp = 0xc0d14e68  fp = 0xc0d14e90
>          r4 = 0xc08a48b4  r5 = 0xc0a42788
>          r6 = 0x00800001  r7 = 0x00000000
>          r8 = 0x03800000  r9 = 0xc0a42794
> mi_startup() at mi_startup+0x2a4
>          pc = 0xc0255904  lr = 0xc00002c4 (_start+0x144)
>          sp = 0xc0d14e98  fp = 0x00000000
>          r4 = 0xc00003f8  r5 = 0xc0b1c000
>          r6 = 0x00000000  r7 = 0x00c52078
>          r8 = 0xc0cdd000  r9 = 0x5af1e780
>         r10 = 0x00000000
> _start() at _start+0x144
>          pc = 0xc00002c4  lr = 0xc00002c4 (_start+0x144)
>          sp = 0xc0d14e98  fp = 0x00000000
> KDB: enter: panic
> [ thread pid 0 tid 100000 ]
> Stopped at      kdb_enter+0x58: ldrb    r15, [r15, r15, ror r15]!
> 
> It is possible to run at boot script which will fetch time from an
> external
> module and set system clock, but I am wondering if that can be done
> automatically (disabling internal rtc and using external)?
> Should it be possible to boot an ARM SBC without an internal RTC
> device?
> 

I think you may be running into a problem Andriy (avg@) described on
irc the other day:  the allwinner RTC hardware has no way to detect
whether it lost power, so it always supplies the time, even if it's
incorrect.  When there are multiple RTCs in the system, the kernel asks
them in the order they registered until one provides the time.

I suspect the panic is happening because the internal RTC also provides
the system 32khz clock, which is needed by other devices.

He cooked up this patch: http://paste.ubuntu.com/p/6hhtQbJC85/

With that patch in place, the 32khz clock would be available, but the
RTC would not supply the time unless it was correct.

-- Ian




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?6d88bd5659b854d9af73cb9a325c719c3d7d9da9.camel>