Add a driver to read teh system time from the EFI rtc. This allows arm64
to use this to get the time on boot.
Details
So far only tested on ThunderX
Diff Detail
- Repository
- rS FreeBSD src repository - subversion
- Lint
Lint Not Applicable - Unit
Tests Not Applicable
Event Timeline
| sys/dev/efidev/efirtc.c | ||
|---|---|---|
| 48 ↗ | (On Diff #33935) | Does this line require some external code to create the efirtc device ? I mean that this seems to prevent the driver to work on amd64, while I think it is desirable to have the ability to use it on x86. |
| 67 ↗ | (On Diff #33935) | Uneeded empty line. Perhaps, if using this on amd64, driver should check the efirt state and not attach blindly. On amd64, efirt was changed to load even if efi table is not present. Also efirt should order its initialization after the efirt init. |
| 76 ↗ | (On Diff #33935) | Same. |
| sys/modules/efirt/Makefile | ||
| 9 ↗ | (On Diff #33935) | Perhaps group all human-readable sources first, and put the XXX_if.h generated files on its own separate SRCS line. |
- Be stricter when we use the driver
- Update style base on feedback from kib
| sys/dev/efidev/efirtc.c | ||
|---|---|---|
| 48 ↗ | (On Diff #33935) | It should add it as a child of nexus, however I haven't tried it on x86. |
| 67 ↗ | (On Diff #33935) | How do you mean? The efirt driver will be loaded at SI_SUB_VM_CONF where this will be later in SI_SUB_DRIVERS. If they have been loaded at boot they will be in order. I'm not sure how they interace when loaded as a module, however clock_register doesn't seem to allow a new device to be used after boot. |
this looks good to my eye... Stretch goal would be to allow adding clocks at runtime, but it's unclear what that would mean or how useful that would be given our current use cases....
I believe that the patch was already tested on arm64, IMO amd64 would be much more interesting.
Also useful would be something with U-Boot that returns an error when querying the time.
Attempting to set the time on OD1000:
root@od1000:~ # date 1711171600
timeout stopping cpus
panic: invalid fpcurthread
cpuid = 2
time = 1510952400
KDB: stack backtrace:
db_trace_self() at db_trace_self_wrapper+0x28
pc = 0xffff00000060d8f8 lr = 0xffff000000086eec
sp = 0xffff0000e64e93e0 fp = 0xffff0000e64e95f0
db_trace_self_wrapper() at vpanic+0x184
pc = 0xffff000000086eec lr = 0xffff000000316a48
sp = 0xffff0000e64e9600 fp = 0xffff0000e64e9680
vpanic() at kassert_panic+0x158
pc = 0xffff000000316a48 lr = 0xffff0000003168c0
sp = 0xffff0000e64e9690 fp = 0xffff0000e64e9750
kassert_panic() at fpu_kern_enter+0x68
pc = 0xffff0000003168c0 lr = 0xffff000000628974
sp = 0xffff0000e64e9760 fp = 0xffff0000e64e9780
fpu_kern_enter() at efi_enter+0x70
pc = 0xffff000000628974 lr = 0xffff0000000ca26c
sp = 0xffff0000e64e9790 fp = 0xffff0000e64e97b0
efi_enter() at efi_set_time+0x20
pc = 0xffff0000000ca26c lr = 0xffff0000000ca2dc
sp = 0xffff0000e64e97c0 fp = 0xffff0000e64e97e0
efi_set_time() at efirtc_settime+0x4c
pc = 0xffff0000000ca2dc lr = 0xffff0000000ca9c4
sp = 0xffff0000e64e97f0 fp = 0xffff0000e64e9830
efirtc_settime() at settime_task_func+0xc0
pc = 0xffff0000000ca9c4 lr = 0xffff0000003603e8
sp = 0xffff0000e64e9840 fp = 0xffff0000e64e9860
settime_task_func() at taskqueue_run_locked+0x104
pc = 0xffff0000003603e8 lr = 0xffff000000369144
sp = 0xffff0000e64e9870 fp = 0xffff0000e64e98e0
taskqueue_run_locked() at taskqueue_thread_loop+0x9c
pc = 0xffff000000369144 lr = 0xffff000000369fac
sp = 0xffff0000e64e98f0 fp = 0xffff0000e64e9910
taskqueue_thread_loop() at fork_exit+0x7c
pc = 0xffff000000369fac lr = 0xffff0000002dacfc
sp = 0xffff0000e64e9920 fp = 0xffff0000e64e9950
fork_exit() at fork_trampoline+0x10
pc = 0xffff0000002dacfc lr = 0xffff00000062701c
sp = 0xffff0000e64e9960 fp = 0x0000000000000000
KDB: enter: panic
[ thread pid 0 tid 100008 ]
Stopped at 0
db>I believe that the patch was already tested on arm64, IMO amd64 would be much more interesting.
Yes, but I think we can reasonably do that later on; this can be committed for arm64 first.
Tested successfully on SoftIron OverDrive 1000 after applying fpu_kern_enter fix from @andrew via IRC
| sys/dev/efidev/efirtc.c | ||
|---|---|---|
| 127 ↗ | (On Diff #35326) | what about tm_tz and tm_dst? |
| sys/dev/efidev/efirtc.c | ||
|---|---|---|
| 127 ↗ | (On Diff #35326) | I'm not sure how best to handle them. I expect we are given UTC here. SDhould we be adjusting the time sent to the firmware based on the time zone, or just zeroing these? |
| sys/dev/efidev/efirtc.c | ||
|---|---|---|
| 127 ↗ | (On Diff #35326) | Good question, probably we want to store UTC in the rtc, but we should at least not write uninitialized values to tm_tz and tm_dst :-) |