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.
====
before:
 adi_mdma_Copy1D(hStream, pMemDest, pMemSrc, ADI_DMA_MSIZE_32BYTES, Bytes/32);
after:
 adi_mdma_Copy1D(hStream, pMemDest, pMemSrc, 0x520, Bytes/32);

Parents Reply Children
  • As I already uploaded the project, run it on the EZKIT and check the bug of the ADI peripheral driver (or system service) "adi_mdma_Copy1D".
    ADI should fix the bug or let me know a proper workaround.

    Regards
    amsk

  • 0
    •  Analog Employees 
    on Feb 5, 2019 9:14 AM over 1 year ago in reply to amsk
  • 0
    •  Analog Employees 
    on Feb 20, 2019 10:52 AM over 1 year ago in reply to amsk

    Hello,

    Apologies for the delay in response. We would suggest you put the below workaround in the "adi_mdma_Copy1D" API. Then you will find the exact throughput at any MSIZE.

    As per our suggestion please use the below API (ADI_DMA_MSIZE parameter) configuration in the code instead of old.

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

    Please note that customer manually needs to set the PSIZE as 1Byte(ADI_DMA_PSIZE_1BYTE) in the "adi_mdma_Copy1D" API.  The same information as already mentioned in the comment lines of  "adi_mdma_Copy1D" definition(Line No :2608) on "adi_mdma_bf60x.c" file.
    The comment is " Append MSize, keep PSize to zero (1 byte) ". So please follow as per comments in the driver file.

    Please let us know if you need any further clarification on this.

    Best regards,
    Santha kumari.K

  • 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

    amsk

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

    Hello,
     
    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
     
           Status=pDmaInfo->pReg->Status;
           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