ведомое периферийное устройство к DMA PL081 в ядре Linux, не в состоянии скопировать полные данные с периферийного устройства в Mem-буфер? - PullRequest
0 голосов
/ 21 января 2019

Я программирую драйвер устройства 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

Спасибо, Вивек Т.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...