with below comment fixed:
Acked-by: Chengwen Feng <[email protected]>

On 10/13/2025 12:21 PM, Vamsi Krishna wrote:
> From: Vamsi Attunuru <[email protected]>
> 
> Modern DMA hardware supports data transfers between multiple DMA
> devices, facilitating data communication across isolated domains,
> containers, or operating systems. These DMA transfers function as
> standard memory-to-memory operations, but with source or destination
> addresses residing in different process or OS address space. The
> exchange of these addresses between processes is handled through
> private driver mechanism, which are beyond the scope of this
> specification change.
> 
> This commit introduces new capability flags to advertise driver support
> for inter-process and inter-OS domain DMA transfers. It adds a mechanism
> to specify source and destination handlers via the vchan configuration.
> Until standardized control-plane APIs are defined for various categories
> of DMA devices, these handler details can be exchanged through private
> driver mechanisms.
> 
> Signed-off-by: Vamsi Attunuru <[email protected]>
> ---
> V3 changes:
> * Fix v2 review comments
> V2 changes:
> * Seperate out the control-plane APIs
> * Address v0 review comments
> * Add validation checks
> * Rename the enums
> 
>  lib/dmadev/rte_dmadev.c       | 19 +++++++++++
>  lib/dmadev/rte_dmadev.h       | 59 +++++++++++++++++++++++++++++++++++
>  lib/dmadev/rte_dmadev_trace.h |  3 ++
>  3 files changed, 81 insertions(+)
> 
> diff --git a/lib/dmadev/rte_dmadev.c b/lib/dmadev/rte_dmadev.c
> index 17ee0808a9..d6792449bf 100644
> --- a/lib/dmadev/rte_dmadev.c
> +++ b/lib/dmadev/rte_dmadev.c
> @@ -659,6 +659,21 @@ rte_dma_vchan_setup(int16_t dev_id, uint16_t vchan,
>               RTE_DMA_LOG(ERR, "Device %d vchan out range!", dev_id);
>               return -EINVAL;
>       }
> +     if (conf->domain.type != RTE_DMA_INTER_DOMAIN_NONE &&
> +         conf->direction != RTE_DMA_DIR_MEM_TO_MEM) {
> +             RTE_DMA_LOG(ERR, "Device %d inter domain only support 
> mem-to-mem transfer", dev_id);
> +             return -EINVAL;
> +     }
> +     if (conf->domain.type == RTE_DMA_INTER_OS_DOMAIN &&
> +         !(dev_info.dev_capa & RTE_DMA_CAPA_INTER_OS_DOMAIN)) {
> +             RTE_DMA_LOG(ERR, "Device %d does not support inter os domain", 
> dev_id);
> +             return -EINVAL;
> +     }
> +     if (conf->domain.type == RTE_DMA_INTER_PROCESS_DOMAIN &&
> +         !(dev_info.dev_capa & RTE_DMA_CAPA_INTER_PROCESS_DOMAIN)) {
> +             RTE_DMA_LOG(ERR, "Device %d does not support inter process 
> domain", dev_id);
> +             return -EINVAL;
> +     }
>       if (conf->direction != RTE_DMA_DIR_MEM_TO_MEM &&
>           conf->direction != RTE_DMA_DIR_MEM_TO_DEV &&
>           conf->direction != RTE_DMA_DIR_DEV_TO_MEM &&
> @@ -805,6 +820,8 @@ dma_capability_name(uint64_t capability)
>               { RTE_DMA_CAPA_HANDLES_ERRORS, "handles_errors" },
>               { RTE_DMA_CAPA_M2D_AUTO_FREE,  "m2d_auto_free"  },
>               { RTE_DMA_CAPA_PRI_POLICY_SP,  "pri_policy_sp" },
> +             { RTE_DMA_CAPA_INTER_PROCESS_DOMAIN, "inter_process_domain" },
> +             { RTE_DMA_CAPA_INTER_OS_DOMAIN, "inter_os_domain" },
>               { RTE_DMA_CAPA_OPS_COPY,    "copy"    },
>               { RTE_DMA_CAPA_OPS_COPY_SG, "copy_sg" },
>               { RTE_DMA_CAPA_OPS_FILL,    "fill"    },
> @@ -1014,6 +1031,8 @@ dmadev_handle_dev_info(const char *cmd __rte_unused,
>       ADD_CAPA(dma_caps, dev_capa, RTE_DMA_CAPA_HANDLES_ERRORS);
>       ADD_CAPA(dma_caps, dev_capa, RTE_DMA_CAPA_M2D_AUTO_FREE);
>       ADD_CAPA(dma_caps, dev_capa, RTE_DMA_CAPA_PRI_POLICY_SP);
> +     ADD_CAPA(dma_caps, dev_capa, RTE_DMA_CAPA_INTER_PROCESS_DOMAIN);
> +     ADD_CAPA(dma_caps, dev_capa, RTE_DMA_CAPA_INTER_OS_DOMAIN);
>       ADD_CAPA(dma_caps, dev_capa, RTE_DMA_CAPA_OPS_COPY);
>       ADD_CAPA(dma_caps, dev_capa, RTE_DMA_CAPA_OPS_COPY_SG);
>       ADD_CAPA(dma_caps, dev_capa, RTE_DMA_CAPA_OPS_FILL);
> diff --git a/lib/dmadev/rte_dmadev.h b/lib/dmadev/rte_dmadev.h
> index 550dbfbf75..4f735bb0c9 100644
> --- a/lib/dmadev/rte_dmadev.h
> +++ b/lib/dmadev/rte_dmadev.h
> @@ -265,6 +265,18 @@ int16_t rte_dma_next_dev(int16_t start_dev_id);
>   * known from 'nb_priorities' field in struct rte_dma_info.
>   */
>  #define RTE_DMA_CAPA_PRI_POLICY_SP   RTE_BIT64(8)
> +/** Support inter-process DMA transfers.
> + *
> + * When this bit is set, the DMA device can perform memory transfers between
> + * different process memory spaces.
> + */
> +#define RTE_DMA_CAPA_INTER_PROCESS_DOMAIN    RTE_BIT64(9)
> +/** Support inter-OS domain DMA transfers.
> + *
> + * The DMA device can perform memory transfers across different operating
> + * system domains.
> + */
> +#define RTE_DMA_CAPA_INTER_OS_DOMAIN         RTE_BIT64(10)
>  
>  /** Support copy operation.
>   * This capability start with index of 32, so that it could leave gap between
> @@ -418,8 +430,13 @@ int rte_dma_close(int16_t dev_id);
>   */
>  enum rte_dma_direction {
>       /** DMA transfer direction - from memory to memory.
> +      * When the device supports inter-process or inter-OS domain transfers,
> +      * the field `type` in `struct rte_dma_vchan_conf::domain` specifies the
> +      * type of domain. For memory-to-memory transfers within the same domain
> +      * or process, `type` should be set to `RTE_DMA_INTER_DOMAIN_NONE`.
>        *
>        * @see struct rte_dma_vchan_conf::direction
> +      * @see struct rte_dma_inter_domain_param::type
>        */
>       RTE_DMA_DIR_MEM_TO_MEM,
>       /** DMA transfer direction - from memory to device.
> @@ -564,6 +581,39 @@ struct rte_dma_auto_free_param {
>       uint64_t reserved[2];
>  };
>  
> +/**
> + * Inter-DMA transfer domain type.
> + *
> + * This enum defines the types of transfer domains applicable to DMA 
> operations.
> + * It helps categorize whether a DMA transfer is occurring within the same 
> domain,
> + * across different processes, or between distinct operating system domains.
> + *
> + * @see struct rte_dma_inter_domain_param:type
> + */
> +enum rte_dma_inter_domain_type {
> +     /**< No inter-domain transfer; standard DMA within same domaini. */
> +     RTE_DMA_INTER_DOMAIN_NONE,
> +     /**< Transfer occurs between different user-space processes. */
> +     RTE_DMA_INTER_PROCESS_DOMAIN,
> +     /**< Transfer spans across different operating system domains. */
> +     RTE_DMA_INTER_OS_DOMAIN,

If comment located before define, it should prefix with ** not **<


> +};
> +
> +/**
> + * Parameters for inter-process or inter-OS DMA transfers.
> + *
> + * This structure defines the parameters required to perform DMA transfers
> + * across different domains, such as between processes or operating systems.
> + * It includes the domain type and handler identifiers for both the source
> + * and destination domains.

I think we could add more comment about how to config use the src/dst handler.
as I comment in before mail:

It's mean local process if the src/dst_handler is zero?
for example, I setup a inter-os domain param, if the src_handle is none zero 
and dst_handle is zero,
then all DMA copy will from another OS to local process.
     all DMA fill will write to local process.

If the src_handle is zero and dst_handle is non-zero,
then all DMA copy will from local process to another OS domain
     all DMA fill will write to another OS domain.

If both src_handle and dst_handle is non-zero,
then all DMA copy will from another OS to another OS domain
     all DMA fill will write to another OS domain.

> + */
> +struct rte_dma_inter_domain_param {
> +     enum rte_dma_inter_domain_type type; /**< Type of inter-domain. */
> +     uint16_t src_handler; /**< Source domain handler identifier. */
> +     uint16_t dst_handler; /**< Destination domain handler identifier. */
> +     uint64_t reserved[2]; /**< Reserved for future fields. */

Please move above comment before define to keep the whole header-file 
consistency.

> +};
> +
>  /**
>   * A structure used to configure a virtual DMA channel.
>   *
> @@ -601,6 +651,15 @@ struct rte_dma_vchan_conf {
>        * @see struct rte_dma_auto_free_param
>        */
>       struct rte_dma_auto_free_param auto_free;
> +     /** Parameters for inter-process or inter-OS domain DMA transfers. This 
> field
> +      * specifies the source and destination domain handlers required for DMA
> +      * operations that span across different processes or operating system 
> domains.
> +      *
> +      * @see RTE_DMA_CAPA_INTER_PROCESS_DOMAIN
> +      * @see RTE_DMA_CAPA_INTER_OS_DOMAIN
> +      * @see struct rte_dma_inter_domain_param
> +      */
> +     struct rte_dma_inter_domain_param domain;
>  };
>  
>  /**
> diff --git a/lib/dmadev/rte_dmadev_trace.h b/lib/dmadev/rte_dmadev_trace.h
> index 1de92655f2..fa619c4090 100644
> --- a/lib/dmadev/rte_dmadev_trace.h
> +++ b/lib/dmadev/rte_dmadev_trace.h
> @@ -79,6 +79,9 @@ RTE_TRACE_POINT(
>       rte_trace_point_emit_int(conf->dst_port.port_type);
>       rte_trace_point_emit_u64(conf->dst_port.pcie.val);
>       rte_trace_point_emit_ptr(conf->auto_free.m2d.pool);
> +     rte_trace_point_emit_int(conf->domain.type);
> +     rte_trace_point_emit_u16(conf->domain.src_handler);
> +     rte_trace_point_emit_u16(conf->domain.dst_handler);
>       rte_trace_point_emit_int(ret);
>  )
>  

BTW: please add the UT (test_dmadev_api.c) for above vchan_setup modify, this 
could be another commit I think.


Reply via email to