Re: [PATCH v6 2/6] PCI: endpoint: Add DMA auxiliary resource metadata

From: Frank Li

Date: Tue Aug 04 2026 - 11:34:11 EST


On Tue, Aug 04, 2026 at 12:38:51PM +0900, Koichiro Den wrote:
> Extend EPC auxiliary resource metadata so endpoint functions can
> discover controller-owned DMA registers, logical DMA channels, and
> descriptor memory.
>
> The DMA metadata is intentionally generic at the EPC layer. A backend
> reports the register layout, channel counts, logical channel resources,
> and descriptor memory resources. Logical channels carry hardware channel
> numbers and refer to descriptor memory by ID; reserving or delegating
> those channels is handled by separate EPC operations so resource metadata
> stays independent of any backend-specific DMA provider. Descriptor memory
> is identified separately so one memory resource can be shared by multiple
> channels.
>
> For DesignWare controllers, reg_layout_data carries the eDMA/HDMA map
> format so a consumer can distinguish legacy, unroll, HDMA compatible,
> and HDMA native register layouts without making the EPC API itself
> DesignWare-specific.
>
> Signed-off-by: Koichiro Den <den@xxxxxxxxxxxxx>
> ---

Reviewed-by: Frank Li <Frank.Li@xxxxxxx>

> Changes in v6:
> - No changes.
>
> include/linux/pci-epc.h | 46 +++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 46 insertions(+)
>
> diff --git a/include/linux/pci-epc.h b/include/linux/pci-epc.h
> index f247cf9bcf1a..8c89cb6d6733 100644
> --- a/include/linux/pci-epc.h
> +++ b/include/linux/pci-epc.h
> @@ -65,6 +65,9 @@ struct pci_epc_map {
> * enum pci_epc_aux_resource_type - auxiliary resource type identifiers
> * @PCI_EPC_AUX_DOORBELL_MMIO: Doorbell MMIO, that might be outside the DMA
> * controller register window
> + * @PCI_EPC_AUX_DMA_CTRL_MMIO: DMA controller MMIO register window
> + * @PCI_EPC_AUX_DMA_CHAN: Logical DMA channel
> + * @PCI_EPC_AUX_DMA_DESC_MEM: DMA descriptor memory
> *
> * EPC backends may expose auxiliary blocks (e.g. DMA engines) by mapping their
> * register windows and descriptor memories into BAR space. This enum
> @@ -72,6 +75,29 @@ struct pci_epc_map {
> */
> enum pci_epc_aux_resource_type {
> PCI_EPC_AUX_DOORBELL_MMIO,
> + PCI_EPC_AUX_DMA_CTRL_MMIO,
> + PCI_EPC_AUX_DMA_CHAN,
> + PCI_EPC_AUX_DMA_DESC_MEM,
> +};
> +
> +/**
> + * enum pci_epc_aux_dma_reg_layout - DMA controller register layout
> + * @PCI_EPC_AUX_DMA_REG_LAYOUT_UNKNOWN: unknown or uninitialized layout
> + * @PCI_EPC_AUX_DMA_REG_LAYOUT_DW_EDMA: Synopsys DesignWare eDMA/HDMA layout
> + */
> +enum pci_epc_aux_dma_reg_layout {
> + PCI_EPC_AUX_DMA_REG_LAYOUT_UNKNOWN = 0,
> + PCI_EPC_AUX_DMA_REG_LAYOUT_DW_EDMA,
> +};
> +
> +/**
> + * enum pci_epc_aux_dma_dir - DMA channel direction relative to the endpoint
> + * @PCI_EPC_AUX_DMA_EP_TO_RC: channel moves data from endpoint to root complex
> + * @PCI_EPC_AUX_DMA_RC_TO_EP: channel moves data from root complex to endpoint
> + */
> +enum pci_epc_aux_dma_dir {
> + PCI_EPC_AUX_DMA_EP_TO_RC,
> + PCI_EPC_AUX_DMA_RC_TO_EP,
> };
>
> /**
> @@ -99,6 +125,26 @@ struct pci_epc_aux_resource {
> int irq; /* IRQ number for the doorbell handler */
> u32 data; /* write value to ring the doorbell */
> } db_mmio;
> +
> + /* PCI_EPC_AUX_DMA_CTRL_MMIO */
> + struct {
> + enum pci_epc_aux_dma_reg_layout reg_layout;
> + u32 reg_layout_data;
> + u16 ep_to_rc_ch_cnt;
> + u16 rc_to_ep_ch_cnt;
> + } dma_ctrl;
> +
> + /* PCI_EPC_AUX_DMA_CHAN */
> + struct {
> + enum pci_epc_aux_dma_dir dir;
> + u16 hw_ch;
> + u16 desc_mem_id;
> + } dma_chan;
> +
> + /* PCI_EPC_AUX_DMA_DESC_MEM */
> + struct {
> + u16 id;
> + } dma_desc;
> } u;
> };
>
> --
> 2.51.0
>