[U-Boot] [PATCH v8 00/31] dma: add channels support

Tom Rini trini at konsulko.com
Mon Nov 26 23:15:17 UTC 2018


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
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20181126/ad0bf55c/attachment.sig>


More information about the U-Boot mailing list