lkml.org 
[lkml]   [2022]   [Jun]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3 08/24] dmaengine: dw-edma: Add PCIe bus address getter to the remote EP glue-driver
    Date
    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>
    Tested-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>

    ---

    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-06-10 11:19    [W:4.335 / U:0.224 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site