Question about transfer memory using DMAC belonging to IOMMU group
Hi all, Now I'm trying to transfer between arbitrary memories using DMAC channel with dma_request_channel(). This transfer works fine. However, when DMAC belongs to an IOMMU group, it fails. I tried to transfer memory allocated from "reserved-memory" of the other device (not IOMMU master), and it failed. It's possible to transfer the allocated memory by calling dma_alloc_cohenrent() with DMAC device. The dmatest is an example. I think it's necessary to join the device associated with the reserved-memory to the same IOMMU group as DMAC or something. In case of using arm-smmu-v3, that will cause BUG_ON() when specifying the same "iommus" property in devicetree as DMAC. Are there any methods to join the device to the IOMMU group? Or transfer arbitrary memories using DMAC belonging to the IOMMU group? Thank you, --- Best Regards Kunihiko Hayashi ___ iommu mailing list iommu@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/iommu
Re: [PATCH] swiotlb: Fix type of max_slot
On Tue, 2 Mar 2021 15:20:08 -0500 Konrad Rzeszutek Wilk wrote: > On 3/2/21 12:21 PM, Kunihiko Hayashi wrote: > > After the refactoring phase, the type of max_slot has changed from unsigned > > long to unsigned int. The return type of the function get_max_slots() and > > the 4th argument type of iommu_is_span_boundary() are different from the > > type of max_slot. Finally, asserts BUG_ON in iommu_is_span_boundary(). > > > Cc: Christoph Hellwig > > Fixes: 567d877f9a7d ("swiotlb: refactor swiotlb_tbl_map_single") > > Signed-off-by: Kunihiko Hayashi > > I think this is all good. Looking at Linus's master I see: > > > 537 unsigned long max_slots = get_max_slots(boundary_mask); > > ? Thanks for the information, and sorry for that. I found it in next-20210226: 567d877f9a7d ("swiotlb: refactor swiotlb_tbl_map_single") And it has already fixed in next-20210301: 26a7e094783d ("swiotlb: refactor swiotlb_tbl_map_single") $ git diff 567d877f9a7d..26a7e094783d diff --git a/kernel/dma/swiotlb.c b/kernel/dma/swiotlb.c index 381c24e..6962cb4 100644 --- a/kernel/dma/swiotlb.c +++ b/kernel/dma/swiotlb.c @@ -496,7 +496,7 @@ static int find_slots(struct device *dev, size_t alloc_size) unsigned long boundary_mask = dma_get_seg_boundary(dev); dma_addr_t tbl_dma_addr = phys_to_dma_unencrypted(dev, io_tlb_start) & boundary_mask; - unsigned int max_slots = get_max_slots(boundary_mask); + unsigned long max_slots = get_max_slots(boundary_mask); unsigned int nslots = nr_slots(alloc_size), stride = 1; unsigned int index, wrap, count = 0, i; unsigned long flags; Thank you, --- Best Regards, Kunihiko Hayashi ___ iommu mailing list iommu@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/iommu
[PATCH] swiotlb: Fix type of max_slot
After the refactoring phase, the type of max_slot has changed from unsigned long to unsigned int. The return type of the function get_max_slots() and the 4th argument type of iommu_is_span_boundary() are different from the type of max_slot. Finally, asserts BUG_ON in iommu_is_span_boundary(). Cc: Christoph Hellwig Fixes: 567d877f9a7d ("swiotlb: refactor swiotlb_tbl_map_single") Signed-off-by: Kunihiko Hayashi --- kernel/dma/swiotlb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/dma/swiotlb.c b/kernel/dma/swiotlb.c index 369e4c3..c10e855 100644 --- a/kernel/dma/swiotlb.c +++ b/kernel/dma/swiotlb.c @@ -534,7 +534,7 @@ static int find_slots(struct device *dev, phys_addr_t orig_addr, unsigned long boundary_mask = dma_get_seg_boundary(dev); dma_addr_t tbl_dma_addr = phys_to_dma_unencrypted(dev, io_tlb_start) & boundary_mask; - unsigned int max_slots = get_max_slots(boundary_mask); + unsigned long max_slots = get_max_slots(boundary_mask); unsigned int iotlb_align_mask = dma_get_min_align_mask(dev) & ~(IO_TLB_SIZE - 1); unsigned int nslots = nr_slots(alloc_size), stride; -- 2.7.4 ___ iommu mailing list iommu@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/iommu