Describe the bug
Title: rp1_pio_sm_config_xfer_internal() should support external DMA buffer configuration (zero-copy use cases)
Description:
The current implementation of rp1_pio_sm_config_xfer_internal() always allocates internal DMA buffers using dma_alloc_coherent(). However, rp1_pio_sm_xfer_data() supports passing an external dma_addr, allowing the user to manage DMA buffers independently.
This creates an inconsistency:
- The configuration function (
*_config_xfer_internal) does not allow setting up the DMA channel and FIFO transfer without also allocating bounce buffers.
- The transfer function (
*_xfer_data) allows external buffers, but the configuration function does not account for this setup.
Further info iam defining a driver for a radio card (called radioberry). To use the pio makes it really nice and iam offload the CPU in my first experiments i saw a reduction from 40% CPU util to 4%.
Curious to the reply?
Johan
This prevents more advanced or zero-copy DMA use cases, where DMA buffers are allocated and managed externally (e.g., shared buffers, user-mapped memory, etc.).
Suggested improvement:
Enhance rp1_pio_sm_config_xfer_internal() to support different DMA buffer allocation modes:
enum rp1_pio_dma_alloc_mode {
RP1_PIO_DMA_ALLOC_INTERNAL, // current behavior
RP1_PIO_DMA_ALLOC_EXTERNAL, // setup DMA channel, but skip buffer allocation
RP1_PIO_DMA_ALLOC_NONE // configure only, without managing any buffers
};
This would allow developers to configure DMA with:
- Internal bounce buffers (default),
- Externally managed buffers (used with pre-mapped
dma_addr),
- Or just set up the DMA channel and slave config (for full manual control).
Benefits:
- Supports zero-copy DMA patterns.
- Provides flexibility for integrating with other subsystems.
- Maintains backward compatibility.
Steps to reproduce the behaviour
no steps but just looking into the code
Device (s)
Raspberry Pi 5
System
latest.
Logs
No response
Additional context
No response
Describe the bug
Title:
rp1_pio_sm_config_xfer_internal()should support external DMA buffer configuration (zero-copy use cases)Description:
The current implementation of
rp1_pio_sm_config_xfer_internal()always allocates internal DMA buffers usingdma_alloc_coherent(). However,rp1_pio_sm_xfer_data()supports passing an externaldma_addr, allowing the user to manage DMA buffers independently.This creates an inconsistency:
*_config_xfer_internal) does not allow setting up the DMA channel and FIFO transfer without also allocating bounce buffers.*_xfer_data) allows external buffers, but the configuration function does not account for this setup.Further info iam defining a driver for a radio card (called radioberry). To use the pio makes it really nice and iam offload the CPU in my first experiments i saw a reduction from 40% CPU util to 4%.
Curious to the reply?
Johan
This prevents more advanced or zero-copy DMA use cases, where DMA buffers are allocated and managed externally (e.g., shared buffers, user-mapped memory, etc.).
Suggested improvement:
Enhance
rp1_pio_sm_config_xfer_internal()to support different DMA buffer allocation modes:This would allow developers to configure DMA with:
dma_addr),Benefits:
Steps to reproduce the behaviour
no steps but just looking into the code
Device (s)
Raspberry Pi 5
System
latest.
Logs
No response
Additional context
No response