Я программирую драйвер устройства Linux на собственный IP, SoC имеет контроллер ARM PL081 DMA.Пользовательский IP-адрес сопоставлен со строкой 3 запроса PL081.ниже приведена конфигурация подчиненного устройства.
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,
}
Я запрограммировал последовательность передачи dma следующим образом:
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);
Размер данных для передачи из периферийного устройства в память составляет 16 КБ.Но только данные размером 256 байт (из max_burst_size) копируются в целевой буфер.Почему я не могу скопировать полные 16 Кбайт данных с периферийного устройства в целевой буфер.Любая помощь будет принята с благодарностью.
ниже прикреплен журнал:
[ 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
Спасибо, Вивек Т.