-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge tag 'dmaengine-4.2-rc1' of git://git.infradead.org/users/vkoul/…
…slave-dma Pull dmaengine updates from Vinod Koul: "This time we have support for few new devices, few new features and odd fixes spread thru the subsystem. New devices added: - support for CSRatlas7 dma controller - Allwinner H3(sun8i) controller - TI DMA crossbar driver on DRA7x - new pxa driver New features added: - memset support is bought back now that we have a user in xdmac controller - interleaved transfers support different source and destination strides - supporting DMA routers and configuration thru DT - support for reusing descriptors - xdmac memset and interleaved transfer support - hdmac support for interleaved transfers - omap-dma support for memcpy Others: - Constify platform_device_id - mv_xor fixes and improvements" * tag 'dmaengine-4.2-rc1' of git://git.infradead.org/users/vkoul/slave-dma: (46 commits) dmaengine: xgene: fix file permission dmaengine: fsl-edma: clear pending interrupts on initialization dmaengine: xdmac: Add memset support Documentation: dmaengine: document DMA_CTRL_ACK dmaengine: virt-dma: don't always free descriptor upon completion dmaengine: Revert "drivers/dma: remove unused support for MEMSET operations" dmaengine: hdmac: Implement interleaved transfers dmaengine: Move icg helpers to global header dmaengine: mv_xor: improve descriptors list handling and reduce locking dmaengine: mv_xor: Enlarge descriptor pool size dmaengine: mv_xor: add support for a38x command in descriptor mode dmaengine: mv_xor: Rename function for consistent naming dmaengine: mv_xor: bug fix for racing condition in descriptors cleanup dmaengine: pl330: fix wording in mcbufsz message dmaengine: sirf: add CSRatlas7 SoC support dmaengine: xgene-dma: Fix "incorrect type in assignement" warnings dmaengine: fix kernel-doc documentation dmaengine: pxa_dma: add support for legacy transition dmaengine: pxa_dma: add debug information dmaengine: pxa: add pxa dmaengine driver ...
- Loading branch information
Showing
40 changed files
with
3,329 additions
and
497 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
Texas Instruments DMA Crossbar (DMA request router) | ||
|
||
Required properties: | ||
- compatible: "ti,dra7-dma-crossbar" for DRA7xx DMA crossbar | ||
- reg: Memory map for accessing module | ||
- #dma-cells: Should be set to <1>. | ||
Clients should use the crossbar request number (input) | ||
- dma-requests: Number of DMA requests the crossbar can receive | ||
- dma-masters: phandle pointing to the DMA controller | ||
|
||
The DMA controller node need to have the following poroperties: | ||
- dma-requests: Number of DMA requests the controller can handle | ||
|
||
Optional properties: | ||
- ti,dma-safe-map: Safe routing value for unused request lines | ||
|
||
Example: | ||
|
||
/* DMA controller */ | ||
sdma: dma-controller@4a056000 { | ||
compatible = "ti,omap4430-sdma"; | ||
reg = <0x4a056000 0x1000>; | ||
interrupts = <GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>, | ||
<GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>, | ||
<GIC_SPI 9 IRQ_TYPE_LEVEL_HIGH>, | ||
<GIC_SPI 10 IRQ_TYPE_LEVEL_HIGH>; | ||
#dma-cells = <1>; | ||
dma-channels = <32>; | ||
dma-requests = <127>; | ||
}; | ||
|
||
/* DMA crossbar */ | ||
sdma_xbar: dma-router@4a002b78 { | ||
compatible = "ti,dra7-dma-crossbar"; | ||
reg = <0x4a002b78 0xfc>; | ||
#dma-cells = <1>; | ||
dma-requests = <205>; | ||
ti,dma-safe-map = <0>; | ||
dma-masters = <&sdma>; | ||
}; | ||
|
||
/* DMA client */ | ||
uart1: serial@4806a000 { | ||
compatible = "ti,omap4-uart"; | ||
reg = <0x4806a000 0x100>; | ||
interrupts-extended = <&gic GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>; | ||
ti,hwmods = "uart1"; | ||
clock-frequency = <48000000>; | ||
status = "disabled"; | ||
dmas = <&sdma_xbar 49>, <&sdma_xbar 50>; | ||
dma-names = "tx", "rx"; | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,153 @@ | ||
PXA/MMP - DMA Slave controller | ||
============================== | ||
|
||
Constraints | ||
----------- | ||
a) Transfers hot queuing | ||
A driver submitting a transfer and issuing it should be granted the transfer | ||
is queued even on a running DMA channel. | ||
This implies that the queuing doesn't wait for the previous transfer end, | ||
and that the descriptor chaining is not only done in the irq/tasklet code | ||
triggered by the end of the transfer. | ||
A transfer which is submitted and issued on a phy doesn't wait for a phy to | ||
stop and restart, but is submitted on a "running channel". The other | ||
drivers, especially mmp_pdma waited for the phy to stop before relaunching | ||
a new transfer. | ||
|
||
b) All transfers having asked for confirmation should be signaled | ||
Any issued transfer with DMA_PREP_INTERRUPT should trigger a callback call. | ||
This implies that even if an irq/tasklet is triggered by end of tx1, but | ||
at the time of irq/dma tx2 is already finished, tx1->complete() and | ||
tx2->complete() should be called. | ||
|
||
c) Channel running state | ||
A driver should be able to query if a channel is running or not. For the | ||
multimedia case, such as video capture, if a transfer is submitted and then | ||
a check of the DMA channel reports a "stopped channel", the transfer should | ||
not be issued until the next "start of frame interrupt", hence the need to | ||
know if a channel is in running or stopped state. | ||
|
||
d) Bandwidth guarantee | ||
The PXA architecture has 4 levels of DMAs priorities : high, normal, low. | ||
The high prorities get twice as much bandwidth as the normal, which get twice | ||
as much as the low priorities. | ||
A driver should be able to request a priority, especially the real-time | ||
ones such as pxa_camera with (big) throughputs. | ||
|
||
Design | ||
------ | ||
a) Virtual channels | ||
Same concept as in sa11x0 driver, ie. a driver was assigned a "virtual | ||
channel" linked to the requestor line, and the physical DMA channel is | ||
assigned on the fly when the transfer is issued. | ||
|
||
b) Transfer anatomy for a scatter-gather transfer | ||
+------------+-----+---------------+----------------+-----------------+ | ||
| desc-sg[0] | ... | desc-sg[last] | status updater | finisher/linker | | ||
+------------+-----+---------------+----------------+-----------------+ | ||
|
||
This structure is pointed by dma->sg_cpu. | ||
The descriptors are used as follows : | ||
- desc-sg[i]: i-th descriptor, transferring the i-th sg | ||
element to the video buffer scatter gather | ||
- status updater | ||
Transfers a single u32 to a well known dma coherent memory to leave | ||
a trace that this transfer is done. The "well known" is unique per | ||
physical channel, meaning that a read of this value will tell which | ||
is the last finished transfer at that point in time. | ||
- finisher: has ddadr=DADDR_STOP, dcmd=ENDIRQEN | ||
- linker: has ddadr= desc-sg[0] of next transfer, dcmd=0 | ||
|
||
c) Transfers hot-chaining | ||
Suppose the running chain is : | ||
Buffer 1 Buffer 2 | ||
+---------+----+---+ +----+----+----+---+ | ||
| d0 | .. | dN | l | | d0 | .. | dN | f | | ||
+---------+----+-|-+ ^----+----+----+---+ | ||
| | | ||
+----+ | ||
|
||
After a call to dmaengine_submit(b3), the chain will look like : | ||
Buffer 1 Buffer 2 Buffer 3 | ||
+---------+----+---+ +----+----+----+---+ +----+----+----+---+ | ||
| d0 | .. | dN | l | | d0 | .. | dN | l | | d0 | .. | dN | f | | ||
+---------+----+-|-+ ^----+----+----+-|-+ ^----+----+----+---+ | ||
| | | | | ||
+----+ +----+ | ||
new_link | ||
|
||
If while new_link was created the DMA channel stopped, it is _not_ | ||
restarted. Hot-chaining doesn't break the assumption that | ||
dma_async_issue_pending() is to be used to ensure the transfer is actually started. | ||
|
||
One exception to this rule : | ||
- if Buffer1 and Buffer2 had all their addresses 8 bytes aligned | ||
- and if Buffer3 has at least one address not 4 bytes aligned | ||
- then hot-chaining cannot happen, as the channel must be stopped, the | ||
"align bit" must be set, and the channel restarted As a consequence, | ||
such a transfer tx_submit() will be queued on the submitted queue, and | ||
this specific case if the DMA is already running in aligned mode. | ||
|
||
d) Transfers completion updater | ||
Each time a transfer is completed on a channel, an interrupt might be | ||
generated or not, up to the client's request. But in each case, the last | ||
descriptor of a transfer, the "status updater", will write the latest | ||
transfer being completed into the physical channel's completion mark. | ||
|
||
This will speed up residue calculation, for large transfers such as video | ||
buffers which hold around 6k descriptors or more. This also allows without | ||
any lock to find out what is the latest completed transfer in a running | ||
DMA chain. | ||
|
||
e) Transfers completion, irq and tasklet | ||
When a transfer flagged as "DMA_PREP_INTERRUPT" is finished, the dma irq | ||
is raised. Upon this interrupt, a tasklet is scheduled for the physical | ||
channel. | ||
The tasklet is responsible for : | ||
- reading the physical channel last updater mark | ||
- calling all the transfer callbacks of finished transfers, based on | ||
that mark, and each transfer flags. | ||
If a transfer is completed while this handling is done, a dma irq will | ||
be raised, and the tasklet will be scheduled once again, having a new | ||
updater mark. | ||
|
||
f) Residue | ||
Residue granularity will be descriptor based. The issued but not completed | ||
transfers will be scanned for all of their descriptors against the | ||
currently running descriptor. | ||
|
||
g) Most complicated case of driver's tx queues | ||
The most tricky situation is when : | ||
- there are not "acked" transfers (tx0) | ||
- a driver submitted an aligned tx1, not chained | ||
- a driver submitted an aligned tx2 => tx2 is cold chained to tx1 | ||
- a driver issued tx1+tx2 => channel is running in aligned mode | ||
- a driver submitted an aligned tx3 => tx3 is hot-chained | ||
- a driver submitted an unaligned tx4 => tx4 is put in submitted queue, | ||
not chained | ||
- a driver issued tx4 => tx4 is put in issued queue, not chained | ||
- a driver submitted an aligned tx5 => tx5 is put in submitted queue, not | ||
chained | ||
- a driver submitted an aligned tx6 => tx6 is put in submitted queue, | ||
cold chained to tx5 | ||
|
||
This translates into (after tx4 is issued) : | ||
- issued queue | ||
+-----+ +-----+ +-----+ +-----+ | ||
| tx1 | | tx2 | | tx3 | | tx4 | | ||
+---|-+ ^---|-+ ^-----+ +-----+ | ||
| | | | | ||
+---+ +---+ | ||
- submitted queue | ||
+-----+ +-----+ | ||
| tx5 | | tx6 | | ||
+---|-+ ^-----+ | ||
| | | ||
+---+ | ||
- completed queue : empty | ||
- allocated queue : tx0 | ||
|
||
It should be noted that after tx3 is completed, the channel is stopped, and | ||
restarted in "unaligned mode" to handle tx4. | ||
|
||
Author: Robert Jarzmik <robert.jarzmik@free.fr> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.