We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
Hi All,
I m programming a linux device driver for 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 slave_sg 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, 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 transfer from peripheral to Memory is 16KB. But only data of size max burst(256bytes) is copied to destination buffer.
why i am not able to transfer my complete 16KB data from peripheral to memory buffer?
below is the runtime log: throw out by DMA
[ 20.760878] hsrx 48c00000.hsrx: rx-buff region :c55a0010 [ 20.760904] hsrx 48c00000.hsrx: proceeding to dma-> [ 20.760937] hsrx 48c00000.hsrx: using 4 pages for transfer [ 20.760967] hsrx 48c00000.hsrx: using dma1chan3 (rx) for DMA transfers [ 20.761012] hsrx 48c00000.hsrx: func: sg_alloc_table - return :0 [ 20.761050] hsrx 48c00000.hsrx: virtAddr: c55a0010 phy-addr: c6f9b400 [ 20.761089] hsrx 48c00000.hsrx: set RX/TX target page @ c55a1000, 4080 bytes, 12304 left [ 20.761126] hsrx 48c00000.hsrx: virtAddr: c55a1000 phy-addr: c6f9b420 [ 20.761164] hsrx 48c00000.hsrx: set RX/TX target page @ c55a2000, 4096 bytes, 8208 left [ 20.761199] hsrx 48c00000.hsrx: virtAddr: c55a2000 phy-addr: c6f9b440 [ 20.761237] hsrx 48c00000.hsrx: set RX/TX target page @ c55a3000, 4096 bytes, 4112 left [ 20.761273] hsrx 48c00000.hsrx: virtAddr: c55a3000 phy-addr: c6f9b460 [ 20.761310] hsrx 48c00000.hsrx: set RX/TX target page @ c55a4000, 4096 bytes, 16 left [ 20.761345] hsrx 48c00000.hsrx: virtAddr: c55a4000 phy-addr: c6f9b480 [ 20.761382] hsrx 48c00000.hsrx: set RX/TX target page @ c55a4010, 16 bytes, 0 left [ 20.761474] pl08xdmac 48200000.dma-controller: pl08x_prep_slave_sg prepare transaction of 4080 bytes from slave3 [ 20.761527] pl08xdmac 48200000.dma-controller: allocated DMA request signal 3 for xfer on slave3 [ 20.761636] pl08xdmac 48200000.dma-controller: src=0x2c000000/4 dst=0xc55a0010+/4 len=4080 [ 20.761670] pl08xdmac 48200000.dma-controller: mbus=src sbus=dst [ 20.761709] pl08xdmac 48200000.dma-controller: pl08x_fill_llis_for_desc max bytes per lli = 16380 [ 20.761754] pl08xdmac 48200000.dma-controller: pl08x_fill_llis_for_desc fill lli with single lli chunk of size 0x00000ff0 (remainder 0x00000ff0) [ 20.761810] pl08xdmac 48200000.dma-controller: src=0x2c000000/4 dst=0xc55a1000+/4 len=4096 [ 20.761843] pl08xdmac 48200000.dma-controller: mbus=src sbus=dst [ 20.761877] pl08xdmac 48200000.dma-controller: pl08x_fill_llis_for_desc max bytes per lli = 16380 [ 20.761919] pl08xdmac 48200000.dma-controller: pl08x_fill_llis_for_desc fill lli with single lli chunk of size 0x00001000 (remainder 0x00001000) [ 20.761970] pl08xdmac 48200000.dma-controller: src=0x2c000000/4 dst=0xc55a2000+/4 len=4096 [ 20.762001] pl08xdmac 48200000.dma-controller: mbus=src sbus=dst [ 20.762035] pl08xdmac 48200000.dma-controller: pl08x_fill_llis_for_desc max bytes per lli = 16380 [ 20.762077] pl08xdmac 48200000.dma-controller: pl08x_fill_llis_for_desc fill lli with single lli chunk of size 0x00001000 (remainder 0x00001000) [ 20.762127] pl08xdmac 48200000.dma-controller: src=0x2c000000/4 dst=0xc55a3000+/4 len=4096 [ 20.762158] pl08xdmac 48200000.dma-controller: mbus=src sbus=dst [ 20.762192] pl08xdmac 48200000.dma-controller: pl08x_fill_llis_for_desc max bytes per lli = 16380 [ 20.762234] pl08xdmac 48200000.dma-controller: pl08x_fill_llis_for_desc fill lli with single lli chunk of size 0x00001000 (remainder 0x00001000) [ 20.762284] pl08xdmac 48200000.dma-controller: src=0x2c000000/4 dst=0xc55a4000+/4 len=16 [ 20.762315] pl08xdmac 48200000.dma-controller: mbus=src sbus=dst [ 20.762349] pl08xdmac 48200000.dma-controller: pl08x_fill_llis_for_desc max bytes per lli = 16380 [ 20.762389] pl08xdmac 48200000.dma-controller: pl08x_fill_llis_for_desc fill lli with single lli chunk of size 0x00000010 (remainder 0x00000010) [ 20.762435] pl08xdmac 48200000.dma-controller: lli csrc cdst clli cctl [ 20.762493] pl08xdmac 48200000.dma-controller: 0 @c7000000: 0x2c000000 0xc55a0010 0xc7000010 0x184bf3fc [ 20.762548] pl08xdmac 48200000.dma-controller: 1 @c7000010: 0x2c000000 0xc55a1000 0xc7000020 0x184bf400 [ 20.762604] pl08xdmac 48200000.dma-controller: 2 @c7000020: 0x2c000000 0xc55a2000 0xc7000030 0x184bf400 [ 20.762659] pl08xdmac 48200000.dma-controller: 3 @c7000030: 0x2c000000 0xc55a3000 0xc7000040 0x184bf400 [ 20.762712] pl08xdmac 48200000.dma-controller: 4 @c7000040: 0x2c000000 0xc55a4000 0x00000000 0x984bf004 [ 20.762759] pl08xdmac 48200000.dma-controller: vchan c68ecd80: txd c5556300[2]: submitted [ 20.762828] pl08xdmac 48200000.dma-controller: allocated physical channel 0 for xfer on slave3 [ 20.762894] pl08xdmac 48200000.dma-controller: WRITE channel 0: csrc=0x2c000000, cdst=0xc55a0010, clli=0xc7000010, cctl=0x184bf3fc, ccfg=0x0000d006
Any help will be deeply appreciated.
Thanks & Regards,
Vivek T