Re: [PATCH v6 0/6] Improve PCI memory mapping API

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Oct 22, 2024 at 10:51:53AM +0900, Damien Le Moal wrote:
> On 10/22/24 07:19, Bjorn Helgaas wrote:
> > On Sat, Oct 12, 2024 at 08:32:40PM +0900, Damien Le Moal wrote:
>
> DMA transfers that can be done using dedicated DMA rx/tx channels associated
> with the endpoint controller do not need to use this API as the mapping to
> the host PCI address space is automatically handled by the DMA driver.

I disagree with this part. It think that it depends on the DMA controller.

Looking at the manual for e.g. the embedded DMA controller on the DWC
controller (eDMA):
""
When you do not want the iATU to translate outbound requests that are generated by the
internal DMA module, then you must implement one of the following approaches:
- Ensure that the combination of DMA channel programming and iATU control register
programming, causes no translation of DMA traffic to be done in the iATU.
or
- Activate the DMA bypass mode to allow request TLPs which are initiated by the DMA
controller to pass through the iATU untranslated. You can activate DMA bypass mode by
setting the DMA Bypass field of the iATU Control 2 Register (IATU_REGION_C-
TRL_OFF_2_OUTBOUND_0).
""

However, we also know that, if there is no match in the iATU table:
""
The default behavior of the ATU when there is no address match in the outbound direction or no
TLP attribute match in the inbound direction, is to pass the transaction through.
""

I.e. if there is a iATU mapping (which is what pci_epc_map_addr() sets up),
the eDMA will take that into account. If there is none, it will go through
untranslated.


So for the eDMA embedded on the DWC controller, we do not strictly need to
call pci_epc_map_addr(). (However, we probably want to do it anyway, as long
as we haven't enabled DMA bypass mode, just to make sure that there is no
other iATU mapping in the mapping table that will affect our transfer.)

However, if you think about a generic DMA controller, e.g. an ARM primecell
pl330, I don't see how it that DMA controller will be able to perform
transfers correctly if there is not an iATU mapping for the region that it
is reading/writing to.

So the safest thing, that will work with any DMA controller is probably to
always call pci_epc_map_addr() before doing the transfer.


However, as I pointed out in:
https://lore.kernel.org/lkml/Zg5oeDzq5u3jmKIu@ryzen/

This behavior is still inconsistent between PCI EPF drivers:
E.g. for pci-epf-test.c:
When using dedicated DMA rx/tx channels (epf_test->dma_private == true),
and when FLAG_USE_DMA is set, it currently always calls pci_epc_map_addr()
before doing the transfer.

However for pci-epf-mhi.c:
When using dedicated DMA rx/tx channels and when MHI_EPF_USE_DMA is set,
it currently does not call pci_epc_map_addr() before doing the transfer.


Kind regards,
Niklas




[Index of Archives]     [DMA Engine]     [Linux Coverity]     [Linux USB]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Greybus]

  Powered by Linux