Page MenuHomeFreeBSD

uart: Honour clock-frequency in FDT for UART_FDT_CLASS if present

Authored by jrtc27 on May 11 2024, 12:34 AM.
Referenced Files
F89071276: D45159.diff
Tue, Jul 23, 2:59 AM
Unknown Object (File)
May 18 2024, 8:43 PM
Unknown Object (File)
May 17 2024, 6:04 PM
Unknown Object (File)
May 15 2024, 7:20 PM
Unknown Object (File)
May 12 2024, 7:12 PM
Unknown Object (File)
May 12 2024, 12:08 PM
Unknown Object (File)
May 12 2024, 12:08 PM
Unknown Object (File)
May 12 2024, 11:50 AM



The StarFive VisionFive 2 has a Synopsys DesignWare ABP UART, whose
driver uses UART_FDT_CLASS rather than UART_FDT_CLASS_AND_DEVICE as it
has its own separate newbus driver. This UART is driven by a 24MHz clock
as specified in the FDT, but we don't currently look at the property
here, instead passing down 0 and letting the default value be used in
the 8250 driver (~1.8MHz). As a result the divisor is misconfigured for
the current baud rate for the entire kernel boot process. Once the
newbus driver attaches the correct frequency is saved in the softc, but
that does not take effect until the next time ns8250_param is called and
the divisor is recalculated, namely when userspace runs and /dev/console
is opened (note that ns8250_init does not get called when the newbus
device corresponding to the current console attaches).

Fix this issue by attemmpting to get the current clock frequency as for
the UART_FDT_CLASS_AND_DEVICE_CASE, but falling back to 0 rather than
failing on error.

Diff Detail

rG FreeBSD src repository
Lint Passed
No Test Coverage
Build Status
Buildable 57660
Build 54548: arc lint + arc unit

Event Timeline

jrtc27 created this revision.

It's hard to tell if this was a deliberate design choice or just not thought to be needed when the current UART_FDT_CLASS(_AND_DEVICE) framework was added, but I don't see a good alternative to this. Note that snps and tegra_uart are the only in-tree UART_FDT_CLASS users, and both wrap ns8250.

This revision is now accepted and ready to land.May 11 2024, 8:42 PM

Thank you for finding the proper fix! Working fine on my end.