slave peripheral device to DMA PL081 in linux kernel, not able to copy complete data from peripheral to Mem-buffer?

0

I m programming a linux device driver to custom IP, the SoC has ARM PL081 DMA controller. The custom-IP is mapped to request line 3 of PL081. below is the slave configuration.

struct dma_slave_config rx_conf = {
    .src_addr = hsrx_local->phy_rx_addr,
    .direction = DMA_DEV_TO_MEM,
    .device_fc = false,
    .src_maxburst = 256,
    .src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES,
}

i have programmed the dma transfer sequence as follows:

dmaengine_slave_config(hsrx_local->dma_rx_channel, &rx_conf);
pages = DIV_ROUND_UP(HSRX_FIFO_SIZE, PAGE_SIZE);
ret = sg_alloc_table(&sgt_rx, 5, GFP_ATOMIC);

for_each_sg(sgtab->sgl, sg, sgtab->nents, i) {
            if (bytesleft < (PAGE_SIZE - offset_in_page(hsrx_local->membuff)))
                mapbytes = bytesleft;
            else
                mapbytes = PAGE_SIZE - offset_in_page(hsrx_local->membuff);
            phy_addr = virt_to_page(bufp);
            dev_info(hsrx_local->dev,"virtAddr: %8p\tphy-addr: %8p\n", (void *)hsrx_local->membuff, (void *)phy_addr);
//          sg_set_page(sg, virt_to_page(hsrx_local->membuff),
            sg_set_page(sg, phy_addr,
                    mapbytes, offset_in_page(hsrx_local->membuff));
            bufp += mapbytes;
            bytesleft -= mapbytes;
            dev_info(hsrx_local->dev,
                    "set RX/TX target page @ %p, %d bytes, %d left\n",
                    hsrx_local->membuff, mapbytes, bytesleft);
        }
    }

rx_sglen = dma_map_sg(hsrx_local->dma_rx_channel->device->dev,
            sgt_rx.sgl,
            sgt_rx.nents, DMA_FROM_DEVICE);
    if (!rx_sglen)
        goto err_rx_sgmap;

rxdesc = dmaengine_prep_slave_sg(hsrx_local->dma_rx_channel,
            sgt_rx.sgl,
            rx_sglen,
            DMA_DEV_TO_MEM,
            DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
    if (!rxdesc)
        goto err_rxdesc;

    rxdesc->callback = axidma_sync_callback;
    rxdesc->callback_param = &rx_cmp;

rx_cookie = dmaengine_submit(rxdesc);
ret = dma_submit_error(rx_cookie);

The data size to be tranfer from peripheral to Memory is 16KB. But only data of 256 byte(of max_burst_size) is copied to destination buffer. why am i not able to copy complete 16 KBytes data to from peripheral to destination buffer. Any help would be deeply appreciated.

below is the attached log:

[   31.526679] hsrx 48c00000.hsrx: in tasklet bottom half function
[   31.526713] hsrx 48c00000.hsrx: rx-buff region  :c55a0010
[   31.526739] hsrx 48c00000.hsrx: proceeding to dma->
[   31.526771] hsrx 48c00000.hsrx: using 4 pages for transfer
[   31.526802] hsrx 48c00000.hsrx: using dma1chan3 (rx) for DMA transfers
[   31.526846] hsrx 48c00000.hsrx: func: sg_alloc_table - return :0 
[   31.526884] hsrx 48c00000.hsrx: virtAddr: c55a0010   phy-addr: c6f9b400
[   31.526924] hsrx 48c00000.hsrx: set RX/TX target page @ c55a1000, 4080 bytes, 12304 left
[   31.526960] hsrx 48c00000.hsrx: virtAddr: c55a1000   phy-addr: c6f9b420
[   31.526998] hsrx 48c00000.hsrx: set RX/TX target page @ c55a2000, 4096 bytes, 8208 left
[   31.527034] hsrx 48c00000.hsrx: virtAddr: c55a2000   phy-addr: c6f9b440
[   31.527071] hsrx 48c00000.hsrx: set RX/TX target page @ c55a3000, 4096 bytes, 4112 left
[   31.527107] hsrx 48c00000.hsrx: virtAddr: c55a3000   phy-addr: c6f9b460
[   31.527144] hsrx 48c00000.hsrx: set RX/TX target page @ c55a4000, 4096 bytes, 16 left
[   31.527179] hsrx 48c00000.hsrx: virtAddr: c55a4000   phy-addr: c6f9b480
[   31.527216] hsrx 48c00000.hsrx: set RX/TX target page @ c55a4010, 16 bytes, 0 left
[   31.527309] pl08xdmac 48200000.dma-controller: pl08x_prep_slave_sg prepare transaction of 4080 bytes from slave3
[   31.527362] pl08xdmac 48200000.dma-controller: allocated DMA request signal 3 for xfer on slave3
[   31.527471] pl08xdmac 48200000.dma-controller: src=0x2c000000/4 dst=0xc55a0010+/4 len=4080
[   31.527506] pl08xdmac 48200000.dma-controller: mbus=src sbus=dst
[   31.527544] pl08xdmac 48200000.dma-controller: pl08x_fill_llis_for_desc max bytes per lli = 16380
[   31.527589] pl08xdmac 48200000.dma-controller: pl08x_fill_llis_for_desc fill lli with single lli chunk of size 0x00000ff0 (remainder 0x00000ff0)
[   31.527645] pl08xdmac 48200000.dma-controller: src=0x2c000000/4 dst=0xc55a1000+/4 len=4096
[   31.527677] pl08xdmac 48200000.dma-controller: mbus=src sbus=dst
[   31.527711] pl08xdmac 48200000.dma-controller: pl08x_fill_llis_for_desc max bytes per lli = 16380
[   31.527751] pl08xdmac 48200000.dma-controller: pl08x_fill_llis_for_desc fill lli with single lli chunk of size 0x00001000 (remainder 0x00001000)
[   31.527802] pl08xdmac 48200000.dma-controller: src=0x2c000000/4 dst=0xc55a2000+/4 len=4096
[   31.527833] pl08xdmac 48200000.dma-controller: mbus=src sbus=dst
[   31.527867] pl08xdmac 48200000.dma-controller: pl08x_fill_llis_for_desc max bytes per lli = 16380
[   31.527907] pl08xdmac 48200000.dma-controller: pl08x_fill_llis_for_desc fill lli with single lli chunk of size 0x00001000 (remainder 0x00001000)
[   31.527957] pl08xdmac 48200000.dma-controller: src=0x2c000000/4 dst=0xc55a3000+/4 len=4096
[   31.527989] pl08xdmac 48200000.dma-controller: mbus=src sbus=dst
[   31.528022] pl08xdmac 48200000.dma-controller: pl08x_fill_llis_for_desc max bytes per lli = 16380
[   31.528063] pl08xdmac 48200000.dma-controller: pl08x_fill_llis_for_desc fill lli with single lli chunk of size 0x00001000 (remainder 0x00001000)
[   31.528112] pl08xdmac 48200000.dma-controller: src=0x2c000000/4 dst=0xc55a4000+/4 len=16
[   31.528144] pl08xdmac 48200000.dma-controller: mbus=src sbus=dst
[   31.528178] pl08xdmac 48200000.dma-controller: pl08x_fill_llis_for_desc max bytes per lli = 16380
[   31.528217] pl08xdmac 48200000.dma-controller: pl08x_fill_llis_for_desc fill lli with single lli chunk of size 0x00000010 (remainder 0x00000010)
[   31.528264] pl08xdmac 48200000.dma-controller: lli            csrc       cdst       clli       cctl
[   31.528322] pl08xdmac 48200000.dma-controller:   0 @c7000000: 0x2c000000 0xc55a0010 0xc7000010 0x184bf3fc
[   31.528377] pl08xdmac 48200000.dma-controller:   1 @c7000010: 0x2c000000 0xc55a1000 0xc7000020 0x184bf400
[   31.528433] pl08xdmac 48200000.dma-controller:   2 @c7000020: 0x2c000000 0xc55a2000 0xc7000030 0x184bf400
[   31.528488] pl08xdmac 48200000.dma-controller:   3 @c7000030: 0x2c000000 0xc55a3000 0xc7000040 0x184bf400
[   31.528541] pl08xdmac 48200000.dma-controller:   4 @c7000040: 0x2c000000 0xc55a4000 0x00000000 0x984bf004
[   31.528588] pl08xdmac 48200000.dma-controller: vchan c68ecd80: txd c5555600[2]: submitted
[   31.528618]  (null): submit successful, issuing async pending
[   31.528658] pl08xdmac 48200000.dma-controller: allocated physical channel 0 for xfer on slave3
[   31.528722] pl08xdmac 48200000.dma-controller: WRITE channel 0: csrc=0x2c000000, cdst=0xc55a0010, clli=0xc7000010, cctl=0x184bf3fc, ccfg=0x0000d006
write- completed bytes : 16384

Thanks, Vivek T.

linux
linux-kernel
arm
linux-device-driver
dma
asked on Stack Overflow Jan 21, 2019 by user7836120 • edited Jan 22, 2019 by user7836120

0 Answers

Nobody has answered this question yet.


User contributions licensed under CC BY-SA 3.0