CV-Bowen opened a new pull request, #18159:
URL: https://github.com/apache/nuttx/pull/18159

   ## Summary
   
   This PR adds power management support and various stability improvements to 
the rpmsg_port_spi and rpmsg_port_spi_slave drivers.
   
   ### Why is this change needed?
   
   The rpmsg_port_spi transport layer lacked proper power management support, 
which could lead to:
   - System entering low power state during active SPI transfers
   - Unnecessary power consumption due to SPI GPIO leak current when peer is 
shutdown
   - Incorrect transfer lengths causing communication failures
   
   ### What does this change do?
   
   1. **Power Management Support**
      - Add PM wakelock support to prevent system sleep during active transfers
      - Unbind SPI controller when peer shuts down to reduce GPIO leak current
      - Notify remote core before local reboot for graceful service cleanup
   
   2. **Bug Fixes**
      - Fix uninitialized cmdhdr->len causing incorrect SPI exchange lengths
      - Fix build errors with implicit function declarations
      - Check CRC value only when CRC is enabled (allows asymmetric CRC config)
   
   3. **Performance Improvements**
      - Add zero-copy receive support via new getrecvbuf callback in SPI slave
      - Optimize PM lock/unlock operations in inactive path
   
   4. **Code Quality**
      - Update GPIO pin type to pinset_t for correctness
      - Add RPMSG_PORT_SPI_ prefix to BYTES2WORDS macro
      - Increase default RX thread stack size to prevent overflow
   
   ## Commits
   
   | # | Commit | Description |
   |---|--------|-------------|
   | 1 | drivers/rpmsg_port_spi/slave: add pm ops support | Add low power 
support for rpmsg port spi/slave transport |
   | 2 | drivers/rpmsg_port_spi/slave: notify remote core when reboot | Send 
shutdown command to remote core before local reboot |
   | 3 | drivers/rpmsg_port_spi: check crc value only when enabled | Allow 
asymmetric CRC configuration between cores |
   | 4 | drivers/rpmsg_port_spi: call pm_action(false) in inactive path | 
Optimize PM lock/unlock operations |
   | 5 | drivers/rpmsg_port_spi/slave: add RPMSG_PORT_SPI_ prefix | Code format 
optimization for BYTES2WORDS macro |
   | 6 | drivers/rpmsg_port_spi_slave: unbind spictrl when peer shutdown | 
Reduce leak current caused by SPI GPIO |
   | 7 | drivers/rpmsg_port_spi/slave: remove pm prepare ops | Use PM wakelock 
instead of prepare ops |
   | 8 | drivers/rpmsg_port_spi/slave: increase rx thread stack size | Prevent 
stack overflow in RX thread |
   | 9 | drivers/rpmsg_port_spi: fix build error | Fix implicit function 
declaration warnings |
   | 10 | drivers/rpmsg_port_spi/slave: update pin type to pinset_t | Correct 
GPIO pin number type |
   | 11 | drivers/rpmsg_port_spi: fix SPI exchange length calculation | Fix 
uninitialized cmdhdr->len issue |
   | 12 | spi/slave: add getrecvbuf callback for zero-copy receive | Enable 
zero-copy data transfer in SPI slave |
   
   ## Impact
   
   - **Stability**: Improved - fixes transfer length bugs and adds graceful 
shutdown
   - **Compatibility**: Backward compatible - new SPI slave callback is optional
   - **Performance**: Improved - zero-copy receive reduces CPU overhead
   - **Power**: Improved - proper PM support reduces power consumption
   
   ## Files Changed
   
   ```
    drivers/rpmsg/Kconfig                |   7 +-
    drivers/rpmsg/rpmsg_port_spi.c       | 148 +++++++++++++++-
    drivers/rpmsg/rpmsg_port_spi_slave.c | 178 +++++++++++++++++++-
    include/nuttx/spi/slave.h            |  26 +++
    4 files changed, 340 insertions(+), 19 deletions(-)
   ```
   
   ## Testing
   
   ### Build Verification
   
   ```bash
   # Build for QEMU ARM64 dual-core
   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
   ```
   
   ### Test Environment
   
   - Host: Ubuntu 22.04
   - Target: QEMU ARM64 dual-core (Cortex-A53)
   - Configuration: qemu-armv8a:rpserver, qemu-armv8a:rpproxy
   
   ### Test Steps
   
   1. Start QEMU server (terminal 1):
   ```bash
   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
   ```
   
   2. Start QEMU proxy (terminal 2):
   ```bash
   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
   ```
   
   3. Run test commands on server:
   ```bash
   ❯ 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> [    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> uname -a
   NuttX server 12.10.0 ff29c1ca6f9 Jan 26 2026 16:59:47 arm64 qemu-armv8a
   server> rpmsg ping all
   nsh: rpmsg: missing required argument(s)
   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:
   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, 16833504 ns
   [    0.000000] [ 7] [ EMERG] [server] min: 0 s, 16833504 ns
   [    0.000000] [ 7] [ EMERG] [server] max: 0 s, 16833504 ns
   [    0.000000] [ 7] [ EMERG] [server] rate: 0.008079 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, 7807008 ns
   [    0.000000] [ 7] [ EMERG] [server] min: 0 s, 7807008 ns
   [    0.000000] [ 7] [ EMERG] [server] max: 0 s, 7807008 ns
   [    0.000000] [ 7] [ EMERG] [server] rate: 0.017420 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