On Fri, Jan 13, 2023 at 08:13:50PM +0300, Serge Semin wrote: > In general the Synopsys PCIe EndPoint IP prototype kit can be attached to > a PCIe bus with any PCIe Host controller including to the one with > distinctive from CPU address space. Due to that we need to make sure that > the source and destination addresses of the DMA-slave devices are properly > converted to the PCIe bus address space, otherwise the DMA transaction > will not only work as expected, but may cause the memory corruption with > subsequent system crash. Let's do that by introducing a new > dw_edma_pcie_address() method defined in the dw-edma-pcie.c, which will > perform the denoted translation by using the pcibios_resource_to_bus() > method. > > Fixes: 41aaff2a2ac0 ("dmaengine: Add Synopsys eDMA IP PCIe glue-logic") > Signed-off-by: Serge Semin <Sergey.Semin@xxxxxxxxxxxxxxxxxxxx> > Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@xxxxxxxxxx> > Tested-by: Manivannan Sadhasivam <manivannan.sadhasivam@xxxxxxxxxx> > Acked-by: Vinod Koul <vkoul@xxxxxxxxxx> > > --- > > Note this patch depends on the patch "dmaengine: dw-edma: Add CPU to PCIe > bus address translation" from this series. > --- > drivers/dma/dw-edma/dw-edma-pcie.c | 15 +++++++++++++++ > 1 file changed, 15 insertions(+) > > diff --git a/drivers/dma/dw-edma/dw-edma-pcie.c b/drivers/dma/dw-edma/dw-edma-pcie.c > index 04c95cba1244..f530bacfd716 100644 > --- a/drivers/dma/dw-edma/dw-edma-pcie.c > +++ b/drivers/dma/dw-edma/dw-edma-pcie.c > @@ -95,8 +95,23 @@ static int dw_edma_pcie_irq_vector(struct device *dev, unsigned int nr) > return pci_irq_vector(to_pci_dev(dev), nr); > } > > +static u64 dw_edma_pcie_address(struct device *dev, phys_addr_t cpu_addr) > +{ > + struct pci_dev *pdev = to_pci_dev(dev); > + struct pci_bus_region region; > + struct resource res = { > + .flags = IORESOURCE_MEM, > + .start = cpu_addr, > + .end = cpu_addr, > + }; > + > + pcibios_resource_to_bus(pdev->bus, ®ion, &res); > + return region.start; > +} This doesn't look DW-specific. Do you expect other implementations that are specific, or could this be a generic function that shares some implementation with pci_bus_address()? > static const struct dw_edma_core_ops dw_edma_pcie_core_ops = { > .irq_vector = dw_edma_pcie_irq_vector, > + .pci_address = dw_edma_pcie_address, > }; > > static void dw_edma_pcie_get_vsec_dma_data(struct pci_dev *pdev, > -- > 2.39.0 > >