Message ID | 20181110210649.8992-1-grygorii.strashko@ti.com |
---|---|
Headers | show |
Series | dma: add channels support | expand |
On Mon, Nov 26, 2018 at 07:00:08PM +0100, Álvaro Fernández Rojas wrote: > In order to add bcm6348-enet support, dma-uclass must be extended to support > dma channels and reworked to operate like the other dm uclass (clk, reset...). > > === > > A DMA is a feature of computer systems that allows certain hardware > subsystems to access main system memory, independent of the CPU. > DMA channels are typically generated externally to the HW module > consuming them, by an entity this API calls a DMA provider. This API > provides a standard means for drivers to enable and disable DMAs, and to > copy, send and receive data using DMA. > > DMA channel API: > dma_get_by_index() > dma_get_by_name() > dma_request() > dma_free() > dma_enable() > dma_disable() > dma_prepare_rcv_buf() > dma_receive() > dma_send() > > A driver that implements UCLASS_DMA is a DMA provider. A provider will > often implement multiple separate DMAs channels, since the hardware it manages > often has this capability. dma_uclass.h describes the interface which > DMA providers must implement. > > DMA consumers/clients are the HW modules driven by the DMA channels. > > DMA consumer DMA_MEM_TO_DEV (transmit) usage example (based on networking). > Note. In u-boot dma_send() is sync operation always - it'll start transfer and > will poll for it to complete: > - get/request dma channel > struct dma dma_tx; > ret = dma_get_by_name(common->dev, "tx0", &dma_tx); > if (ret) ... > > - enable dma channel > ret = dma_enable(&dma_tx); > if (ret) ... > > - dma transmit DMA_MEM_TO_DEV. > struct ti_drv_packet_data packet_data; > > packet_data.opt1 = val1; > packet_data.opt2 = val2; > ret = dma_send(&dma_tx, packet, length, &packet_data); > if (ret) .. > > DMA consumer DMA_DEV_TO_MEM (receive) usage example (based on networking). > Note. dma_receive() is sync operation always - it'll start transfer > (if required) and will poll for it to complete (or for any previously > configured dev2mem transfer to complete): > - get/request dma channel > struct dma dma_rx; > ret = dma_get_by_name(common->dev, "rx0", &dma_rx); > if (ret) ... > > - enable dma channel > ret = dma_enable(&dma_rx); > if (ret) ... > > - dma receive DMA_DEV_TO_MEM. > struct ti_drv_packet_data packet_data; > > len = dma_receive(&dma_rx, (void **)packet, &packet_data); > if (ret < 0) ... > > DMA consumer DMA_DEV_TO_MEM (receive) zero-copy usage example (based on > networking). Networking subsystem allows to configure and use few receive > buffers (dev2mem), as Networking RX DMA channels usually implemented > as streaming interface > - get/request dma channel > struct dma dma_rx; > ret = dma_get_by_name(common->dev, "rx0", &dma_rx); > if (ret) ... > > for (i = 0; i < RX_DESC_NUM; i++) { > ret = dma_prepare_rcv_buf(&dma_rx, > net_rx_packets[i], > RX_BUF_SIZE); > if (ret) ... > } > > - enable dma channel > ret = dma_enable(&dma_rx); > if (ret) ... > > - dma receive DMA_DEV_TO_MEM. > struct ti_drv_packet_data packet_data; > void *packet; > > len = dma_receive(&dma_rx, &packet, &packet_data); > if (ret < 0) .. > > /* packet - points on buffer prepared by dma_prepare_rcv_buf(). > process packet*/ > > - return buffer back to DAM channel > ret = dma_prepare_rcv_buf(&dma_rx, > net_rx_packets[rx_next], > RX_BUF_SIZE); > Can you please split this into 2 parts, the generic DMA portion, and the bcm6368-enet/etc part? Thanks! -- Tom