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]

Reply via email to