lkml.org 
[lkml]   [2022]   [Mar]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH 10/25] dmaengine: dw-edma: Add PCIe bus address getter to the remote EP glue-driver
    On Thu, Mar 24, 2022 at 04:48:21AM +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@baikalelectronics.ru>
    >

    Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>

    Thanks,
    Mani

    > ---
    >
    > 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, &region, &res);
    > + return region.start;
    > +}
    > +
    > 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.35.1
    >

    \
     
     \ /
      Last update: 2022-03-24 18:43    [W:4.070 / U:1.056 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site