Use case: Copy buffer from A to B using the IPU's internal DMA engine.
I developed a driver for a RTOS which uses the Image Converter sub-module and IDMAC channels 47 and 50.The ROT, FLR and FUD options are all set to zero (i.e. no actual rotation and no image flipping). Pixel size is three bytes. Buffers are placed in SDRAM.
With these settings a throughput of 120MB/s is achieved for 3MB buffers (== 1024*1024 pixels). This is significantly worse than memcpy() at about 350MB/s as well as the documented pixel rate of 100Mpixels/s (==300MB/s) in the imx6 reference manual ch. 184.108.40.206.5.3.
What can I do to achive better throughput with the IPU? (Note that the SDMA can't be used because that won't work with PCIe, which I want to use).
In your initial post, you mentioned your desire to use the IPU to transfer data via PCIe. Were you able to manage that? If so, could you describe how you did it and the throughput you achieved?
By sending the data through the Image Converter's Main Processing Section instead of the Rotation Section, throughput was increased to 350 MB/s. This solution uses IDMAC channels 11 and 22.
in general Image Converter sub-module is quite slow, it may take up to 4clocks/pixel
processing. One can try to play with using real time channels, marking IPU accesses
with an AXI ID to bypass the PL301’s arbitration. Please check IMX6DQRM
sect.220.127.116.11 Real time channel mode,
36.4.8 GPR (IOMUXC_GPR7),
18.104.22.168.1 Handling real time channels,
Table 37-14. Channel Parameters Memory
AXI Id field
Use of real time channels did not have any effect, unfortunately.
I increased the IPU clock frequency to 270 MHz and that increased throughput somewhat.
Do you have any other ideas?