CV-Bowen opened a new pull request, #18163:
URL: https://github.com/apache/nuttx/pull/18163
## Summary
This PR contains a series of improvements and bug fixes for the
`rpmsg_port_uart` driver, focusing on stability, debugging capabilities, and
power management features.
### Key Changes
1. **Power Management Support**: Added support for wake up by peer core
(Linux) with new commands (STAYWAKE/RELAXWAKE/STAYWAKEACK) to enable proper
sleep/wake coordination between cores.
2. **Ping-Pong Wake/Ack Mechanism**: Fixed the mismatch wake/ack issue by
implementing a ping-pong wake/ack protocol to prevent stale ACK commands from
incorrectly waking up new wakeup processes.
3. **RX Recursive Logic**: Fixed a deadlock scenario where TX thread could
hang forever when trying to wake up peer while RX thread was blocked on TX
buffer processing.
4. **Debug Enhancements**:
- Added debug buffer to record history receive data
- Added dump support for rx/tx thread backtrace
- Added dump ops in rpmsg_port for timeout debugging
- Enhanced error logging with more detailed information
5. **Reboot Notifier**: Added reboot notifier to send power off command to
peer, allowing proper cleanup of rpmsg connections.
6. **Error Handling Improvements**: Changed from panic to error logging when
receive errors occur, allowing continued operation and firmware updates via adb.
7. **Code Cleanup**: Unified timeout usage, renamed variables for
consistency, and extracted command processing to standalone function.
### Commits (21 total)
| # | Commit | Description |
|---|--------|-------------|
| 1 | `76946a330a59` | Zero next when hit RPMSG_PORT_UART_RX_WAIT_START
twice |
| 2 | `c10c3ac5ebba` | Unify the timeout usage |
| 3 | `496b46d8efc7` | Do not panic when received error happened |
| 4 | `882688c07390` | Reserved more commands for future use |
| 5 | `ae7bf0ce5128` | Switch the uart IO to GPIO when peer poweroff |
| 6 | `7597b3e6f107` | Change some important debug logs level |
| 7 | `ad0a8e5efb29` | Process the commands as much as possible |
| 8 | `b6c344dba108` | Support wake up by peer core (Linux) |
| 9 | `c73224496ab7` | Add reboot notifier for rpmsg_port_uart |
| 10 | `ffc48819214b` | Add debug buffer for rpmsg_port_uart |
| 11 | `de02171b3bca` | Dump error data when recv error char |
| 12 | `f8bbbdd52218` | Use ping-pong wake/ack to fix the mismatch wake/ack
issue |
| 13 | `42c93def05e2` | Rename tx/rxwakelock to tx/rx_wakelock |
| 14 | `e2b8c859a7f3` | Move the command process to a function |
| 15 | `73476f1dedb7` | Notify the lower transport when no free buffers |
| 16 | `db232d1f1237` | Support the rx recursive logic |
| 17 | `6ecdd4be6a7b` | Support dump ops and dump when get buffer timeout |
| 18 | `50c4f47354a6` | Add rpmsg_port_uart dump support |
| 19 | `7c40dd940e33` | Do rpmsg_port_unreigster when connected |
| 20 | `eb50cf6e6245` | Clear the connected stats first when recv poweroff |
| 21 | `3696b8112bca` | Fix some compile warnings |
### Files Changed
```
drivers/rpmsg/Kconfig | 1 +
drivers/rpmsg/rpmsg_port.c | 29 ++-
drivers/rpmsg/rpmsg_port.h | 17 +-
drivers/rpmsg/rpmsg_port_spi.c | 1 +
drivers/rpmsg/rpmsg_port_spi_slave.c | 1 +
drivers/rpmsg/rpmsg_port_uart.c | 727
+++++++++++++++++++++++++++--------
6 files changed, 593 insertions(+), 183 deletions(-)
```
## Impact
- **Stability**: Improved - fixes several race conditions and deadlock
scenarios
- **Compatibility**: Backward compatible - reserved more commands for future
use
- **Code Quality**: Improved - better code organization and naming
conventions
- **No Breaking Changes**: All changes are backward compatible
## Testing
Building
```c
cmake -B cmake_out/v8a_server -DBOARD_CONFIG=qemu-armv8a:rpserver -GNinja
cmake --build cmake_out/v8a_server
cmake -B cmake_out/v8a_proxy -DBOARD_CONFIG=qemu-armv8a:rpproxy -GNinja
cmake --build cmake_out/v8a_proxy
```
Running
```c
qemu-system-aarch64 -cpu cortex-a53 -nographic \
-machine virt,virtualization=on,gic-version=3 \
-chardev stdio,id=con,mux=on -serial chardev:con \
-object
memory-backend-file,discard-data=on,id=shmmem-shmem0,mem-path=/dev/shm/my_shmem0,size=4194304,share=yes
\
-device ivshmem-plain,id=shmem0,memdev=shmmem-shmem0,addr=0xb \
-device virtio-serial-device,bus=virtio-mmio-bus.0 \
-chardev socket,path=/tmp/rpmsg_port_uart_socket,server=on,wait=off,id=foo \
-device virtconsole,chardev=foo \
-mon chardev=con,mode=readline -kernel ./nuttx/cmake_out/v8a_server/nuttx \
-gdb tcp::7775
qemu-system-aarch64 -cpu cortex-a53 -nographic \
-machine virt,virtualization=on,gic-version=3 \
-chardev stdio,id=con,mux=on -serial chardev:con \
-object
memory-backend-file,discard-data=on,id=shmmem-shmem0,mem-path=/dev/shm/my_shmem0,size=4194304,share=yes
\
-device ivshmem-plain,id=shmem0,memdev=shmmem-shmem0,addr=0xb \
-device virtio-serial-device,bus=virtio-mmio-bus.0 \
-chardev socket,path=/tmp/rpmsg_port_uart_socket,server=off,id=foo \
-device virtconsole,chardev=foo \
-mon chardev=con,mode=readline -kernel ./nuttx/cmake_out/v8a_proxy/nuttx \
-gdb tcp::7776
```
LOG:
```c
❯ qemu-system-aarch64 -cpu cortex-a53 -nographic \
-machine virt,virtualization=on,gic-version=3 \
-chardev stdio,id=con,mux=on -serial chardev:con \
-object
memory-backend-file,discard-data=on,id=shmmem-shmem0,mem-path=/dev/shm/my_shmem0,size=4194304,share=yes
\
-device ivshmem-plain,id=shmem0,memdev=shmmem-shmem0,addr=0xb \
-device virtio-serial-device,bus=virtio-mmio-bus.0 \
-chardev socket,path=/tmp/rpmsg_port_uart_socket,server=on,wait=off,id=foo \
-device virtconsole,chardev=foo \
-mon chardev=con,mode=readline -kernel ./nuttx/cmake_out/v8a_server/nuttx \
-gdb tcp::7775
[ 0.000000] [ 0] [ INFO] [server] pci_register_rptun_ivshmem_driver:
Register ivshmem driver, id=0, cpuname=proxy, master=1
[ 0.000000] [ 3] [ INFO] [server] pci_scan_bus: pci_scan_bus for bus 0
[ 0.000000] [ 3] [ INFO] [server] pci_scan_bus: class = 00000600,
hdr_type = 00000000
[ 0.000000] [ 3] [ INFO] [server] pci_scan_bus: 00:00 [1b36:0008]
[ 0.000000] [ 3] [ INFO] [server] pci_setup_device: pbar0 set bad mask
[ 0.000000] [ 3] [ INFO] [server] pci_setup_device: pbar1 set bad mask
[ 0.000000] [ 3] [ INFO] [server] pci_setup_device: pbar2 set bad mask
[ 0.000000] [ 3] [ INFO] [server] pci_setup_device: pbar3 set bad mask
[ 0.000000] [ 3] [ INFO] [server] pci_setup_device: pbar4 set bad mask
[ 0.000000] [ 3] [ INFO] [server] pci_setup_device: pbar5 set bad mask
[ 0.000000] [ 3] [ INFO] [server] pci_scan_bus: class = 00000200,
hdr_type = 00000000
[ 0.000000] [ 3] [ INFO] [server] pci_scan_bus: 00:08 [1af4:1000]
[ 0.000000] [ 3] [ INFO] [server] pci_setup_device: pbar0:
mask64=fffffffe 32bytes
[ 0.000000] [ 3] [ INFO] [server] pci_setup_device: pbar1:
mask64=fffffff0 4096bytes
[ 0.000000] [ 3] [ INFO] [server] pci_setup_device: pbar2 set bad mask
[ 0.000000] [ 3] [ INFO] [server] pci_setup_device: pbar3 set bad mask
[ 0.000000] [ 3] [ INFO] [server] pci_setup_device: pbar4:
mask64=fffffffffffffff0 16384bytes
[ 0.000000] [ 3] [ INFO] [server] pci_scan_bus: class = 00000500,
hdr_type = 00000000
[ 0.000000] [ 3] [ INFO] [server] pci_scan_bus: 00:58 [1af4:1110]
[ 0.000000] [ 3] [ INFO] [server] pci_setup_device: pbar0:
mask64=fffffff0 256bytes
[ 0.000000] [ 3] [ INFO] [server] pci_setup_device: pbar1 set bad mask
[ 0.000000] [ 3] [ INFO] [server] pci_setup_device: pbar2:
mask64=fffffffffffffff0 4194304bytes
[ 0.000000] [ 3] [ INFO] [server] pci_setup_device: pbar4 set bad mask
[ 0.000000] [ 3] [ INFO] [server] pci_setup_device: pbar5 set bad mask
[ 0.000000] [ 3] [ INFO] [server] ivshmem_probe: shmem addr=0x10400000
size=4194304 reg=0x10008000
[ 0.000000] [ 3] [ INFO] [server] rptun_ivshmem_probe: shmem
addr=0x10400000 size=4194304
NuttShell (NSH) NuttX-12.10.0
server>
server>
server>
server>
server>
server> [ 0.000000] [ 0] [ INFO] [proxy]
pci_register_rptun_ivshmem_driver: Register ivshmem driver, id=0,
cpuname=server, master=0
[ 0.000000] [ 3] [ INFO] [proxy] pci_scan_bus: pci_scan_bus for bus 0
[ 0.000000] [ 3] [ INFO] [proxy] pci_scan_bus: class = 00000600,
hdr_type = 00000000
[ 0.000000] [ 3] [ INFO] [proxy] pci_scan_bus: 00:00 [1b36:0008]
[ 0.000000] [ 3] [ INFO] [proxy] pci_setup_device: pbar0 set bad mask
[ 0.000000] [ 3] [ INFO] [proxy] pci_setup_device: pbar1 set bad mask
[ 0.000000] [ 3] [ INFO] [proxy] pci_setup_device: pbar2 set bad mask
[ 0.000000] [ 3] [ INFO] [proxy] pci_setup_device: pbar3 set bad mask
[ 0.000000] [ 3] [ INFO] [proxy] pci_setup_device: pbar4 set bad mask
[ 0.000000] [ 3] [ INFO] [proxy] pci_setup_device: pbar5 set bad mask
[ 0.000000] [ 3] [ INFO] [proxy] pci_scan_bus: class = 00000200,
hdr_type = 00000000
[ 0.000000] [ 3] [ INFO] [proxy] pci_scan_bus: 00:08 [1af4:1000]
[ 0.000000] [ 3] [ INFO] [proxy] pci_setup_device: pbar0:
mask64=fffffffe 32bytes
[ 0.000000] [ 3] [ INFO] [proxy] pci_setup_device: pbar1:
mask64=fffffff0 4096bytes
[ 0.000000] [ 3] [ INFO] [proxy] pci_setup_device: pbar2 set bad mask
[ 0.000000] [ 3] [ INFO] [proxy] pci_setup_device: pbar3 set bad mask
[ 0.000000] [ 3] [ INFO] [proxy] pci_setup_device: pbar4:
mask64=fffffffffffffff0 16384bytes
[ 0.000000] [ 3] [ INFO] [proxy] pci_scan_bus: class = 00000500,
hdr_type = 00000000
[ 0.000000] [ 3] [ INFO] [proxy] pci_scan_bus: 00:58 [1af4:1110]
[ 0.000000] [ 3] [ INFO] [proxy] pci_setup_device: pbar0:
mask64=fffffff0 256bytes
[ 0.000000] [ 3] [ INFO] [proxy] pci_setup_device: pbar1 set bad mask
[ 0.000000] [ 3] [ INFO] [proxy] pci_setup_device: pbar2:
mask64=fffffffffffffff0 4194304bytes
[ 0.000000] [ 3] [ INFO] [proxy] pci_setup_device: pbar4 set bad mask
[ 0.000000] [ 3] [ INFO] [proxy] pci_setup_device: pbar5 set bad mask
[ 0.000000] [ 3] [ INFO] [proxy] ivshmem_probe: shmem addr=0x10400000
size=4194304 reg=0x10008000
[ 0.000000] [ 3] [ INFO] [proxy] rptun_ivshmem_probe: shmem
addr=0x10400000 size=4194304
[ 0.000000] [ 3] [ INFO] [proxy] rptun_ivshmem_probe: Start the wdog
server>
server>
server> ps
TID PID PPID PRI POLICY TYPE NPX STATE EVENT SIGMASK
STACK USED FILLED COMMAND
0 0 0 0 FIFO Kthread - Ready
0000000000000000 0008128 0001792 22.0% Idle_Task
1 0 0 192 FIFO Kthread - Waiting Semaphore
0000000000000000 0008064 0001344 16.6% hpwork 0x4047ac60 0x4047ace0
2 0 0 100 FIFO Kthread - Waiting Semaphore
0000000000000000 0008064 0001344 16.6% lpwork 0x4047ad10 0x4047ad90
5 0 0 224 FIFO Kthread - Waiting Semaphore
0000000000000000 0008064 0002128 26.3% rpmsg-uart-rx proxy2 0x404b0048
6 0 0 224 FIFO Kthread - Waiting Event
0000000000000000 0008064 0001968 24.4% rpmsg-uart-tx proxy2 0x404b0048
7 7 0 100 FIFO Task - Running
0000000000000000 0008096 0004176 51.5% nsh_main
8 0 0 224 FIFO Kthread - Waiting Semaphore
0000000000000000 0008064 0002208 27.3% rpmsg-virtio proxy 0x40494b18
server>
server>
server> rpmsg dump all
[ 0.000000] [ 7] [ EMERG] [server] Local: server Remote: proxy Headrx 7
[ 0.000000] [ 7] [ EMERG] [server] Dump rpmsg info between cpu (master:
yes)server <==> proxy:
[ 0.000000] [ 7] [ EMERG] [server] rpmsg vq RX:
[ 0.000000] [ 7] [ EMERG] [server] rpmsg vq TX:
[ 0.000000] [ 7] [ EMERG] [server] rpmsg ept list:
[ 0.000000] [ 7] [ EMERG] [server] ept NS
[ 0.000000] [ 7] [ EMERG] [server] ept rpmsg-sensor
[ 0.000000] [ 7] [ EMERG] [server] ept rpmsg-ping
[ 0.000000] [ 7] [ EMERG] [server] ept rpmsg-syslog
[ 0.000000] [ 7] [ EMERG] [server] rpmsg buffer list:
[ 0.000000] [ 7] [ EMERG] [server] RX buffer, total 8, pending 0
[ 0.000000] [ 7] [ EMERG] [server] TX buffer, total 8, pending 0
[ 0.000000] [ 7] [ EMERG] [server] Remote: proxy2 state: 1
[ 0.000000] [ 7] [ EMERG] [server] ept NS
[ 0.000000] [ 7] [ EMERG] [server] ept rpmsg-sensor
[ 0.000000] [ 7] [ EMERG] [server] ept rpmsg-ping
[ 0.000000] [ 7] [ EMERG] [server] rpmsg_port queue RX: {used: 0, avail:
8}
[ 0.000000] [ 7] [ EMERG] [server] rpmsg buffer list:
[ 0.000000] [ 7] [ EMERG] [server] rpmsg_port queue TX: {used: 0, avail:
8}
[ 0.000000] [ 7] [ EMERG] [server] rpmsg buffer list:
[ 0.000000] [ 7] [ ALERT] [server] sched_dumpstack: backtrace| 5:
0x00000000402a83e8 0x00000000402aa100 0x000000004029c024 0x000000004028cb64
0x00000000402e3a08 0x00000000402e3ab8 0x00000000402bcaec 0x00000000402bcf74
[ 0.000000] [ 7] [ ALERT] [server] sched_dumpstack: backtrace| 5:
0x00000000402acdb0
[ 0.000000] [ 7] [ ALERT] [server] sched_dumpstack: backtrace| 6:
0x00000000402a8808 0x00000000402f5958 0x00000000402bbec0 0x00000000402bd05c
0x00000000402acdb0
server>
server>
server> uname -a
NuttX server 12.10.0 4a5c10d742d Jan 26 2026 21:02:43 arm64 qemu-armv8a
server>
server>
server>
server> rpmsg ping all 1 1 1 1
[ 0.000000] [ 7] [ EMERG] [server] ping times: 1
[ 0.000000] [ 7] [ EMERG] [server] buffer_len: 1520, send_len: 17
[ 0.000000] [ 7] [ EMERG] [server] avg: 0 s, 17177808 ns
[ 0.000000] [ 7] [ EMERG] [server] min: 0 s, 17177808 ns
[ 0.000000] [ 7] [ EMERG] [server] max: 0 s, 17177808 ns
[ 0.000000] [ 7] [ EMERG] [server] rate: 0.007917 Mbits/sec
[ 0.000000] [ 7] [ EMERG] [server] ping times: 1
[ 0.000000] [ 7] [ EMERG] [server] buffer_len: 2024, send_len: 17
[ 0.000000] [ 7] [ EMERG] [server] avg: 0 s, 15456496 ns
[ 0.000000] [ 7] [ EMERG] [server] min: 0 s, 15456496 ns
[ 0.000000] [ 7] [ EMERG] [server] max: 0 s, 15456496 ns
[ 0.000000] [ 7] [ EMERG] [server] rate: 0.008798 Mbits/sec
server>
```
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]