MDMA throughput with DMA service

I tested EE-401 "SC58x_MDMA_Throughput" with the following settings on ADZS-SC584-EZLITE.
 1) MDMA2
 2) SYSCLK = 225 MHz
 3) DMA count = 16384 bytes
 4) MSIZE = 32
 5) PSIZE = 4
 6) from C1L1S1 to C1L1S1

The measured throughput is 893.9 MB/s.

I changed the code to use the DMA Service "adi_mdma_Copy1D" instead of "MDMA_CONFIG".
The throughput is degraded to 224.7 MB/s.
Does the DMA Service support maximum theoretical throughput?

I think it is caused by setting DMA_CFG.PSIZE=0 and DMA_CFG.EN=1 simultaneously in the DMA service (MDmaUpdateXferStatus()).
I modified the code as shown below, the throughput changed to 895.6 MB/s.
 adi_mdma_Copy1D(hStream, pMemDest, pMemSrc, ADI_DMA_MSIZE_32BYTES, Bytes/32);
 adi_mdma_Copy1D(hStream, pMemDest, pMemSrc, 0x520, Bytes/32);

Parents Reply
  • Hi

    Thank you for responding.
    I tested the workaround but the throughput is still low.

    adi_mdma_Copy1D (hMemDmaStream, dst, src, ADI_DMA_MSIZE_32BYTES|ADI_DMA_PSIZE_1BYTE, buffer_size >> 5);

    This is actually same as the following because  "ADI_DMA_PSIZE_1BYTE" is defined as 0 on "adi_mdma_bf60x.h".

    adi_mdma_Copy1D (hMemDmaStream, dst, src, ADI_DMA_MSIZE_32BYTES, buffer_size >> 5);

    The same information as already mentioned in the comment lines of  "adi_mdma_Copy1D" definition(Line No :2608) on "adi_mdma_bf60x.c" file.

    If PSize is zero at this line no 2608, pMDmaChannel->DescRegCache.Config.PSize is set to zero.
    So DMA_CFG.PSIZE is set to zero finally.
    According to HRM, DMA_CFG.PSIZE can be 2 (4 bytes) or 3 (8 bytes), but PSIZE=0 is undefined.

    Best Regards


  • +1
    •  Analog Employees 
    on Oct 24, 2019 10:08 AM in reply to amsk

    Our sincere apologize for the delayed response. We found that there is a bug "adi_mdma_Copy1D" API
    By default both MSIZE and PSIZE value are 4 bytes. While calling "adi_mdma_Copy1D" API, it changes PSIZE while re-configuring DMA configuration register with the received arguments (MSIZE) and this reduces the throughput drastically.
    Could you please add the below lines of code at line no: 2608 in adi_mdma_bf60x.c file for updating the PSize in DMA configuration register. And declare variables PSize,Status inside adi_mdma_Copy1D API
           PSize = GetMaxPSize (Status, MSize);

            /* Append MSize, keep PSize to zero (1 byte) */
            MSizePSizeCfg = (uint32_t) eElementWidth|PSize;

    After applying this fix, the throughput has been increased into 895.8MBps. Please find the attached screenshot for your reference.

    Best Regards,
    Santha kumari.K