drivers/serial: Refactor PL011 to be general-purpose#18837
drivers/serial: Refactor PL011 to be general-purpose#18837linguini1 wants to merge 1 commit intoapache:masterfrom
Conversation
This commit refactors the PL011 UART driver so that it can be re-used for any number of UART interfaces depending on the board/chip. This commit also hooks the UART interface configuration/selection for PL011 UART interfaces into the same Kconfig used for regular UART interfaces. Now UART interfaces are configured in a standard, extensible way. Signed-off-by: Matteo Golin <matteo.golin@gmail.com>
|
I am able to run the $ qemu-system-aarch64 -cpu cortex-a53 -nographic -machine virt,virtualization=on,gic-version=3 -net none -chardev stdio,id=con,mux=on -serial chardev:con -mon chardev=con,mode=readline -kernel ./nuttx
NuttShell (NSH) NuttX-12.13.0
nsh> ps
TID PID PPID PRI POLICY TYPE NPX STATE EVENT SIGMASK STACK USED FILLED COMMAND
0 0 0 0 FIFO Kthread - Ready 0000000000000000 0008144 0001616 19.8% Idle_Task
1 0 0 192 RR Kthread - Waiting Semaphore 0000000000000000 0008080 0001200 14.8% hpwork 0x404196a0 0x40419728
3 3 0 100 RR Task - Running 0000000000000000 0008112 0003728 45.9% nsh_main
nsh> ls
/:
dev/
proc/
tmp/
nsh>It's also odd that it works for SMP. |
|
@raiden00pl Do you have any idea why this change might cause NTFC to fail with a boot timeout on |
|
no idea. NTFC should export nuttx.elf in CI artifacts, but for some reason these are not present for qemu-armv8a:citest and qemu-armv8a:citest_smp. What's funny - it works for all other targets citest targets. Now I see that this target uses cmake, so that might be the reason for the missing elf in the artifacts. |
| * | ||
| ***************************************************************************/ | ||
|
|
||
| void pl011_serialinit(void) |
There was a problem hiding this comment.
why drop the default implementation which could avoid the code duplication in the common case. it's better that:
- keep pl011_serialinit/pl011_earlyserialinit if one of CONFIG_UARTx_PL011 is enabled
- add pl011_dev_init, so the special case could call the new function directly.
There was a problem hiding this comment.
Because this function is no longer useful. It needs access to the device structs for the PL011 interfaces in order to register them, but these are defined outside this module now.
If we keep this function, then we can no longer:
- Define an arbitrary number of interfaces
- Use the standard UART config options for configuring PL011 UART
It should now be up to the chip logic to register the UART interfaces instead, as with all other UART drivers. Otherwise we don't have the benefits and we must also maintain two separate ways of doing things. There are only 3 boards that use PL011 right now, so it's not a super common case.
There was a problem hiding this comment.
but the similar config duplicated in the many places now. I would prefer to keep the origin global definition, so the common usage could be simplified.
There was a problem hiding this comment.
I'm not sure there's a way around that except by maintaining two interfaces for PL011 registration and all the old Kconfig options. Plus, I will have to add some refactoring for more granular interrupt management.
Let me brainstorm and get back to you, maybe I can keep the init function and still remove the PL011-specific Kconfig functions. The main challenge is selection of the base addresses and IRQ numbers.
I'll try building with CMake in case that reveals what the issue might be. |
Summary
This commit refactors the PL011 UART driver so that it can be re-used for any number of UART interfaces depending on the board/chip. This commit also hooks the UART interface configuration/selection for PL011 UART interfaces into the same Kconfig used for regular UART interfaces. Now UART interfaces are configured in a standard, extensible way.
Related to #18836. Needed to unblock progress on the RPi4B PL011 UART interfaces for GSoC 2026.
Impact
Impacts only the 4 (simulator) boards that used PL011 UART.
Testing
For each of the QEMU boards, I tested their
gdbstubdemos since those configurations use both UART interfaces, not just a console.QEMU ARMv8A
Details
QEMU ARMv7A
Details
For the FVP boards, I tested compilation only.
The CXD32 and and Goldfish chips don't have any defconfigs to test.