[TEST] DMA_ATTR_FORCE_CONTIGUOUS test code

Test DMA_ATTR_FORCE_CONTIGUOUS with IOMMU:

    echo iommu > /dev/ttySC3

Expected result:

    __alloc_iova:213: size 4096 dma_limit 0x000000ffffffffff force_aperture 1 aperture_start 0x0000000000000000 aperture_end 0x00000000ffffffff
    __alloc_iova:216: new dma_limit 0x00000000ffffffff
    iommu: map: iova 0xfffff000 pa 0x0000000679491000 size 0x1000 pgsize 4096
    iommu: iommu_map:1348: domain->pgsize_bitmap = 0x40201000
    arm-lpae io-pgtable: __arm_lpae_map:317: iova 0xfffff000 phys 0x0000000679491000 size 4096 lvl 1 ptep 0xffffffc63bb29000
    arm-lpae io-pgtable: __arm_lpae_map:319: increasing ptep to 0xffffffc63bb29018
    ipmmu-vmsa e67b0000.mmu: __arm_lpae_alloc_pages:224 dma_map_single(0xffffffc63a356000, 4096) returned 0x000000067a356000
    ipmmu-vmsa e67b0000.mmu: __arm_lpae_alloc_pages:224 dma_map_single(0xffffffc63a148000, 4096) returned 0x000000067a148000
    iommu:      mapped 1 chunks (ret = 0) GOOD!
    rcar-dmac e6700000.dma-controller: ===== Testing using plain DMA attributes =====
    rcar-dmac e6700000.dma-controller: Allocating 16777216 bytes of DMA memory using iommu_dma_ops
    __iommu_dma_alloc_pages:272: 16777216 bytes
    __iommu_dma_alloc_pages:308: Got block of 512 pages at virt 0xffffffc639600000 phys 0x0000000679600000, continuing...
    __iommu_dma_alloc_pages:308: Got block of 512 pages at virt 0xffffffc637800000 phys 0x0000000677800000, continuing...
    __iommu_dma_alloc_pages:308: Got block of 512 pages at virt 0xffffffc637a00000 phys 0x0000000677a00000, continuing...
    __iommu_dma_alloc_pages:308: Got block of 512 pages at virt 0xffffffc637400000 phys 0x0000000677400000, continuing...
    __iommu_dma_alloc_pages:308: Got block of 512 pages at virt 0xffffffc637600000 phys 0x0000000677600000, continuing...
    __iommu_dma_alloc_pages:308: Got block of 512 pages at virt 0xffffffc637000000 phys 0x0000000677000000, continuing...
    __iommu_dma_alloc_pages:308: Got block of 512 pages at virt 0xffffffc637200000 phys 0x0000000677200000, continuing...
    __iommu_dma_alloc_pages:308: Got block of 512 pages at virt 0xffffffc636c00000 phys 0x0000000676c00000
    __alloc_iova:213: size 16777216 dma_limit 0x000000ffffffffff force_aperture 1 aperture_start 0x0000000000000000 aperture_end 0x00000000ffffffff
    __alloc_iova:216: new dma_limit 0x00000000ffffffff
    sg_alloc_table_from_pages:405: size 16777216
      pfn[0] = 0x679600
    sg_alloc_table_from_pages:412: need 5 chunks
    iommu_map_sg:327: domain->ops->map_sg = default_iommu_map_sg
    iommu: default_iommu_map_sg:1455: iommu_map va 0xfe000000 phys 0x0000000679600000 len 2097152
    iommu: map: iova 0xfe000000 pa 0x0000000679600000 size 0x200000 pgsize 2097152
    iommu: iommu_map:1348: domain->pgsize_bitmap = 0x40201000
    arm-lpae io-pgtable: __arm_lpae_map:317: iova 0xfe000000 phys 0x0000000679600000 size 2097152 lvl 1 ptep 0xffffffc63bb29000
    arm-lpae io-pgtable: __arm_lpae_map:319: increasing ptep to 0xffffffc63bb29018
    iommu:      mapped 1 chunks (ret = 0) GOOD!
    iommu: default_iommu_map_sg:1455: iommu_map va 0xfe200000 phys 0x0000000677800000 len 4194304
    iommu: map: iova 0xfe200000 pa 0x0000000677800000 size 0x400000 pgsize 2097152
    iommu: iommu_map:1348: domain->pgsize_bitmap = 0x40201000
    arm-lpae io-pgtable: __arm_lpae_map:317: iova 0xfe200000 phys 0x0000000677800000 size 2097152 lvl 1 ptep 0xffffffc63bb29000
    arm-lpae io-pgtable: __arm_lpae_map:319: increasing ptep to 0xffffffc63bb29018
    arm-lpae io-pgtable: __arm_lpae_map:317: iova 0xfe400000 phys 0x0000000677a00000 size 2097152 lvl 1 ptep 0xffffffc63bb29000
    arm-lpae io-pgtable: __arm_lpae_map:319: increasing ptep to 0xffffffc63bb29018
    iommu:      mapped 2 chunks (ret = 0) GOOD!
    iommu: default_iommu_map_sg:1455: iommu_map va 0xfe600000 phys 0x0000000677400000 len 4194304
    iommu: map: iova 0xfe600000 pa 0x0000000677400000 size 0x400000 pgsize 2097152
    iommu: iommu_map:1348: domain->pgsize_bitmap = 0x40201000
    arm-lpae io-pgtable: __arm_lpae_map:317: iova 0xfe600000 phys 0x0000000677400000 size 2097152 lvl 1 ptep 0xffffffc63bb29000
    arm-lpae io-pgtable: __arm_lpae_map:319: increasing ptep to 0xffffffc63bb29018
    arm-lpae io-pgtable: __arm_lpae_map:317: iova 0xfe800000 phys 0x0000000677600000 size 2097152 lvl 1 ptep 0xffffffc63bb29000
    arm-lpae io-pgtable: __arm_lpae_map:319: increasing ptep to 0xffffffc63bb29018
    iommu:      mapped 2 chunks (ret = 0) GOOD!
    iommu: default_iommu_map_sg:1455: iommu_map va 0xfea00000 phys 0x0000000677000000 len 4194304
    iommu: map: iova 0xfea00000 pa 0x0000000677000000 size 0x400000 pgsize 2097152
    iommu: iommu_map:1348: domain->pgsize_bitmap = 0x40201000
    arm-lpae io-pgtable: __arm_lpae_map:317: iova 0xfea00000 phys 0x0000000677000000 size 2097152 lvl 1 ptep 0xffffffc63bb29000
    arm-lpae io-pgtable: __arm_lpae_map:319: increasing ptep to 0xffffffc63bb29018
    arm-lpae io-pgtable: __arm_lpae_map:317: iova 0xfec00000 phys 0x0000000677200000 size 2097152 lvl 1 ptep 0xffffffc63bb29000
    arm-lpae io-pgtable: __arm_lpae_map:319: increasing ptep to 0xffffffc63bb29018
    iommu:      mapped 2 chunks (ret = 0) GOOD!
    iommu: default_iommu_map_sg:1455: iommu_map va 0xfee00000 phys 0x0000000676c00000 len 2097152
    iommu: map: iova 0xfee00000 pa 0x0000000676c00000 size 0x200000 pgsize 2097152
    iommu: iommu_map:1348: domain->pgsize_bitmap = 0x40201000
    arm-lpae io-pgtable: __arm_lpae_map:317: iova 0xfee00000 phys 0x0000000676c00000 size 2097152 lvl 1 ptep 0xffffffc63bb29000
    arm-lpae io-pgtable: __arm_lpae_map:319: increasing ptep to 0xffffffc63bb29018
    iommu:      mapped 1 chunks (ret = 0) GOOD!
    [0] virt 0xffffff8009b34000 phys 0x0000000679600000 iova 0x00000000fe000000
    [512] virt 0xffffff8009d34000 phys 0x0000000677800000 iova 0x00000000fe200000
    [1536] virt 0xffffff800a134000 phys 0x0000000677400000 iova 0x00000000fe600000
    [2560] virt 0xffffff800a534000 phys 0x0000000677000000 iova 0x00000000fea00000
    [3584] virt 0xffffff800a934000 phys 0x0000000676c00000 iova 0x00000000fee00000
    iommu: unmap this: iova 0xfe000000 size 0x1000000
    iommu: unmapped: iova 0xfe000000 size 0x200000
    iommu: unmapped: iova 0xfe200000 size 0x200000
    iommu: unmapped: iova 0xfe400000 size 0x200000
    iommu: unmapped: iova 0xfe600000 size 0x200000
    iommu: unmapped: iova 0xfe800000 size 0x200000
    iommu: unmapped: iova 0xfea00000 size 0x200000
    iommu: unmapped: iova 0xfec00000 size 0x200000
    iommu: unmapped: iova 0xfee00000 size 0x200000
    iommu:      unmapped 8 chunks
    __iommu_dma_free_pages:246: freeing 4096 pages
    rcar-dmac e6700000.dma-controller: DMA contiguous test: ***** FAIL *****
    rcar-dmac e6700000.dma-controller: ===== Testing with DMA_ATTR_FORCE_CONTIGUOUS =====
    rcar-dmac e6700000.dma-controller: Allocating 16777216 bytes of DMA memory using iommu_dma_ops
    rcar-dmac e6700000.dma-controller: __iommu_alloc_attrs:615: 16777216 bytes with DMA_ATTR_FORCE_CONTIGUOUS
    rcar-dmac e6700000.dma-controller: dma_alloc_from_contiguous:199: count 4096 align 9 => pages 0xffffffbf01b27000 virt 0xffffffc07c200000
    rcar-dmac e6700000.dma-controller: __iommu_alloc_attrs:620: dma_alloc_from_contiguous() returned pages at virt 0xffffffc07c200000 phys 0x00000000bc200000
    __alloc_iova:213: size 16777216 dma_limit 0x000000ffffffffff force_aperture 1 aperture_start 0x0000000000000000 aperture_end 0x00000000ffffffff
    __alloc_iova:216: new dma_limit 0x00000000ffffffff
    iommu: map: iova 0xfe000000 pa 0x00000000bc200000 size 0x1000000 pgsize 2097152
    iommu: iommu_map:1348: domain->pgsize_bitmap = 0x40201000
    arm-lpae io-pgtable: __arm_lpae_map:317: iova 0xfe000000 phys 0x00000000bc200000 size 2097152 lvl 1 ptep 0xffffffc63bb29000
    arm-lpae io-pgtable: __arm_lpae_map:319: increasing ptep to 0xffffffc63bb29018
    arm-lpae io-pgtable: __arm_lpae_map:317: iova 0xfe200000 phys 0x00000000bc400000 size 2097152 lvl 1 ptep 0xffffffc63bb29000
    arm-lpae io-pgtable: __arm_lpae_map:319: increasing ptep to 0xffffffc63bb29018
    arm-lpae io-pgtable: __arm_lpae_map:317: iova 0xfe400000 phys 0x00000000bc600000 size 2097152 lvl 1 ptep 0xffffffc63bb29000
    arm-lpae io-pgtable: __arm_lpae_map:319: increasing ptep to 0xffffffc63bb29018
    arm-lpae io-pgtable: __arm_lpae_map:317: iova 0xfe600000 phys 0x00000000bc800000 size 2097152 lvl 1 ptep 0xffffffc63bb29000
    arm-lpae io-pgtable: __arm_lpae_map:319: increasing ptep to 0xffffffc63bb29018
    arm-lpae io-pgtable: __arm_lpae_map:317: iova 0xfe800000 phys 0x00000000bca00000 size 2097152 lvl 1 ptep 0xffffffc63bb29000
    arm-lpae io-pgtable: __arm_lpae_map:319: increasing ptep to 0xffffffc63bb29018
    arm-lpae io-pgtable: __arm_lpae_map:317: iova 0xfea00000 phys 0x00000000bcc00000 size 2097152 lvl 1 ptep 0xffffffc63bb29000
    arm-lpae io-pgtable: __arm_lpae_map:319: increasing ptep to 0xffffffc63bb29018
    arm-lpae io-pgtable: __arm_lpae_map:317: iova 0xfec00000 phys 0x00000000bce00000 size 2097152 lvl 1 ptep 0xffffffc63bb29000
    arm-lpae io-pgtable: __arm_lpae_map:319: increasing ptep to 0xffffffc63bb29018
    arm-lpae io-pgtable: __arm_lpae_map:317: iova 0xfee00000 phys 0x00000000bd000000 size 2097152 lvl 1 ptep 0xffffffc63bb29000
    arm-lpae io-pgtable: __arm_lpae_map:319: increasing ptep to 0xffffffc63bb29018
    iommu:      mapped 8 chunks (ret = 0) GOOD!
    __iommu_alloc_attrs:634: __dma_flush_area virt ffffffc07c200000 size 16777216
    [0] virt 0xffffff800ab35000 phys 0x00000000bc200000 iova 0x00000000fe000000
    iommu: unmap this: iova 0xfe000000 size 0x1000000
    iommu: unmapped: iova 0xfe000000 size 0x200000
    iommu: unmapped: iova 0xfe200000 size 0x200000
    iommu: unmapped: iova 0xfe400000 size 0x200000
    iommu: unmapped: iova 0xfe600000 size 0x200000
    iommu: unmapped: iova 0xfe800000 size 0x200000
    iommu: unmapped: iova 0xfea00000 size 0x200000
    iommu: unmapped: iova 0xfec00000 size 0x200000
    iommu: unmapped: iova 0xfee00000 size 0x200000
    iommu:      unmapped 8 chunks
    rcar-dmac e6700000.dma-controller: __iommu_free_attrs:688: freeing 4096 pages with DMA_ATTR_FORCE_CONTIGUOUS
    rcar-dmac e6700000.dma-controller: dma_release_from_contiguous:216: pages 0xffffffbf02990000 virt 0xffffffc0be000000 count 4096
    rcar-dmac e6700000.dma-controller: DMA contiguous test: ***** PASS *****
    rcar-dmac e6700000.dma-controller: ===== Test completed =====
    sci_request_dma:1859
    __iommu_dma_alloc_pages:272: 4096 bytes
    __iommu_dma_alloc_pages:308: Got block of 1 pages at virt 0xffffffc639602000 phys 0x0000000679602000
    __alloc_iova:213: size 4096 dma_limit 0x000000ffffffffff force_aperture 1 aperture_start 0x0000000000000000 aperture_end 0x00000000ffffffff
    __alloc_iova:216: new dma_limit 0x00000000ffffffff
    sg_alloc_table_from_pages:405: size 4096
      pfn[0] = 0x679602
    sg_alloc_table_from_pages:412: need 1 chunks
    iommu_map_sg:327: domain->ops->map_sg = default_iommu_map_sg
    iommu: default_iommu_map_sg:1455: iommu_map va 0xffffe000 phys 0x0000000679602000 len 4096
    iommu: map: iova 0xffffe000 pa 0x0000000679602000 size 0x1000 pgsize 4096
    iommu: iommu_map:1348: domain->pgsize_bitmap = 0x40201000
    arm-lpae io-pgtable: __arm_lpae_map:317: iova 0xffffe000 phys 0x0000000679602000 size 4096 lvl 1 ptep 0xffffffc63bb29000
    arm-lpae io-pgtable: __arm_lpae_map:319: increasing ptep to 0xffffffc63bb29018
    iommu:      mapped 1 chunks (ret = 0) GOOD!
    sci_request_dma:1862 dma_alloc_coherent() returned buf 0xffffff8008004000 dma 0x00000000ffffe000
    sh-sci e6c50000.serial: BRG: 9600+0 bps using DL 96 SR 32
    sh-sci e6c50000.serial: Using clk scif for 9600+0 bps
    __alloc_iova:213: size 4096 dma_limit 0x000000ffffffffff force_aperture 1 aperture_start 0x0000000000000000 aperture_end 0x00000000ffffffff
    __alloc_iova:216: new dma_limit 0x00000000ffffffff
    iommu: map: iova 0xffffd000 pa 0x00000000e6c50000 size 0x1000 pgsize 4096
    iommu: iommu_map:1348: domain->pgsize_bitmap = 0x40201000
    arm-lpae io-pgtable: __arm_lpae_map:317: iova 0xffffd000 phys 0x00000000e6c50000 size 4096 lvl 1 ptep 0xffffffc63bb29000
    arm-lpae io-pgtable: __arm_lpae_map:319: increasing ptep to 0xffffffc63bb29018
    iommu:      mapped 1 chunks (ret = 0) GOOD!
    iommu: unmap this: iova 0xfffff000 size 0x1000
    iommu: unmapped: iova 0xfffff000 size 0x1000
    iommu:      unmapped 1 chunks
    iommu: unmap this: iova 0xffffd000 size 0x1000
    iommu: unmapped: iova 0xffffd000 size 0x1000
    iommu:      unmapped 1 chunks
    iommu: unmap this: iova 0xffffe000 size 0x1000
    iommu: unmapped: iova 0xffffe000 size 0x1000
    iommu:      unmapped 1 chunks
    __iommu_dma_free_pages:246: freeing 1 pages

Test DMA_ATTR_FORCE_CONTIGUOUS with SWIOTLB:

    echo swiotlb > /dev/ttySC1

Expected result:

    rcar-dmac e7300000.dma-controller: ===== Testing using plain DMA attributes =====
    rcar-dmac e7300000.dma-controller: Allocating 16777216 bytes of DMA memory using swiotlb_dma_ops
    rcar-dmac e7300000.dma-controller: dma_alloc_from_contiguous:199: count 4096 align 9 => pages 0xffffffbf01b5f000 virt 0xffffffc07d200000
    rcar-dmac e7300000.dma-controller: __dma_alloc_coherent:113: dma_alloc_from_contiguous() returned pages at virt 0xffffffc07d200000 phys 0x00000000bd200000
    rcar-dmac e7300000.dma-controller: __dma_alloc_coherent:121: returned dma address 0x00000000bd200000
    [0] virt 0xffffff8009b2b000 phys 0x00000000bd200000 iova 0x00000000bd200000
    rcar-dmac e7300000.dma-controller: dma_release_from_contiguous:216: pages 0xffffffbf01b5f000 virt 0xffffffc07d200000 count 4096
    rcar-dmac e7300000.dma-controller: DMA contiguous test: ***** PASS *****
    rcar-dmac e7300000.dma-controller: ===== Testing with DMA_ATTR_FORCE_CONTIGUOUS =====
    rcar-dmac e7300000.dma-controller: Allocating 16777216 bytes of DMA memory using swiotlb_dma_ops
    rcar-dmac e7300000.dma-controller: dma_alloc_from_contiguous:199: count 4096 align 9 => pages 0xffffffbf01b5f000 virt 0xffffffc07d200000
    rcar-dmac e7300000.dma-controller: __dma_alloc_coherent:113: dma_alloc_from_contiguous() returned pages at virt 0xffffffc07d200000 phys 0x00000000bd200000
    rcar-dmac e7300000.dma-controller: __dma_alloc_coherent:121: returned dma address 0x00000000bd200000
    [0] virt 0xffffff800ab2c000 phys 0x00000000bd200000 iova 0x00000000bd200000
    rcar-dmac e7300000.dma-controller: dma_release_from_contiguous:216: pages 0xffffffbf01b5f000 virt 0xffffffc07d200000 count 4096
    rcar-dmac e7300000.dma-controller: DMA contiguous test: ***** PASS *****
    rcar-dmac e7300000.dma-controller: ===== Test completed =====
    sci_request_dma:1859
    rcar-dmac e7300000.dma-controller: dma_alloc_from_contiguous:199: count 1 align 0 => pages 0xffffffbf01b20ee0 virt 0xffffffc07c044000
    rcar-dmac e7300000.dma-controller: __dma_alloc_coherent:113: dma_alloc_from_contiguous() returned pages at virt 0xffffffc07c044000 phys 0x00000000bc044000
    rcar-dmac e7300000.dma-controller: __dma_alloc_coherent:121: returned dma address 0x00000000bc044000
    sci_request_dma:1862 dma_alloc_coherent() returned buf 0xffffff8008004000 dma 0x00000000bc044000
    sh-sci e6e68000.serial: BRG: 9600+0 bps using DL 96 SR 32
    sh-sci e6e68000.serial: Using clk scif for 9600+0 bps
    rcar-dmac e7300000.dma-controller: dma_release_from_contiguous:216: pages 0xffffffbf01b20ee0 virt 0xffffffc07c044000 count 1

Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
16 files changed