[FE training-materials-updates] kernel: dma: Mention dmaengine

Maxime Ripard maxime.ripard at free-electrons.com
Mon Apr 20 09:02:59 CEST 2015


Repository : git://git.free-electrons.com/training-materials.git

On branch  : master
Link       : http://git.free-electrons.com/training-materials/commit/?id=1b59ef9deffe2de610e42d360d4f9597f626d9d3

>---------------------------------------------------------------

commit 1b59ef9deffe2de610e42d360d4f9597f626d9d3
Author: Maxime Ripard <maxime.ripard at free-electrons.com>
Date:   Fri Feb 13 16:48:16 2015 +0100

    kernel: dma: Mention dmaengine
    
    Introduce some slides on the difference between peripheral DMA and using a DMA
    controller, and the slave API for dmaengine.
    
    Signed-off-by: Maxime Ripard <maxime.ripard at free-electrons.com>


>---------------------------------------------------------------

1b59ef9deffe2de610e42d360d4f9597f626d9d3
 .../dma-controller.dia                             | Bin 0 -> 2406 bytes
 .../dma-descriptors.dia                            | Bin 0 -> 2048 bytes
 .../kernel-driver-development-dma.tex              |  66 +++++++++++++++++++++
 .../peripheral-dma.dia                             | Bin 0 -> 1462 bytes
 4 files changed, 66 insertions(+)

diff --git a/slides/kernel-driver-development-dma/dma-controller.dia b/slides/kernel-driver-development-dma/dma-controller.dia
new file mode 100644
index 0000000..47d6dd1
Binary files /dev/null and b/slides/kernel-driver-development-dma/dma-controller.dia differ
diff --git a/slides/kernel-driver-development-dma/dma-descriptors.dia b/slides/kernel-driver-development-dma/dma-descriptors.dia
new file mode 100644
index 0000000..2e3b8b0
Binary files /dev/null and b/slides/kernel-driver-development-dma/dma-descriptors.dia differ
diff --git a/slides/kernel-driver-development-dma/kernel-driver-development-dma.tex b/slides/kernel-driver-development-dma/kernel-driver-development-dma.tex
index 65eb110..27d90fb 100644
--- a/slides/kernel-driver-development-dma/kernel-driver-development-dma.tex
+++ b/slides/kernel-driver-development-dma/kernel-driver-development-dma.tex
@@ -8,6 +8,29 @@
 \end{frame}
 
 \begin{frame}
+  \frametitle{Peripheral DMA}
+  \begin{center}
+    \includegraphics[height=0.7\textheight]{slides/kernel-driver-development-dma/peripheral-dma.pdf}
+  \end{center}
+\end{frame}
+
+\begin{frame}
+  \frametitle{DMA Controllers}
+  \begin{center}
+    \includegraphics[width=\textwidth]{slides/kernel-driver-development-dma/dma-controller.pdf}
+  \end{center}
+\end{frame}
+
+\begin{frame}
+  \frametitle{DMA descriptors}
+  \begin{center}
+    \includegraphics[width=\textwidth]{slides/kernel-driver-development-dma/dma-descriptors.pdf}
+  \end{center}
+\end{frame}
+
+\subsection{DMA Usage}
+
+\begin{frame}
   \frametitle{Constraints with a DMA}
   \begin{itemize}
   \item A DMA deals with physical addresses, so:
@@ -162,3 +185,46 @@ void dma_unmap_single(struct device *dev, dma_addr_t handdle,
     mappings.
   \end{itemize}
 \end{frame}
+
+\subsection{DMA transfers}
+
+\begin{frame}
+  \frametitle{Starting DMA transfers}
+  \begin{itemize}
+  \item If the device you're writing a driver for is doing peripheral
+    DMA, no external API is involved.
+  \item If it relies on an external DMA controller, you'll need to
+    \begin{itemize}
+    \item Ask the hardware to use DMA, so that it will drive its
+      request line
+    \item Use Linux DMAEngine framework, especially its slave API
+    \end{itemize}
+  \end{itemize}
+\end{frame}
+
+\begin{frame}
+  \frametitle{DMAEngine Slave API}
+  \begin{itemize}
+  \item In order to start a DMA transfer, you need to call the
+    following functions from your driver
+    \begin{enumerate}
+    \item Request a channel for exclusive use with
+      \code{dma_request_channel}, or one of its variants
+    \item Configure it for our use case, by filling a
+      \code{dma_slave_config} structures with various parameters
+      (source and destination adresses, accesses width, etc.) and
+      passing it as an argument to \code{dmaengine_slave_config}
+    \item Start a new transaction with
+      \code{dmaengine_prep_slave_single} or
+      \code{dmaengine_prep_slave_sg}
+    \item Put the transaction in the driver pending queue using
+      \code{dmaengine_submit}
+    \item And finally ask the driver to process all pending
+      transactions using \code{dmaengine_issue_pending}
+    \end{enumerate}
+  \item Of course, this needs to be done in addition to the DMA
+    mapping seen previously
+  \item Some framework abstract it away from you, such as \code{SPI}
+    and \code{ASoC}
+  \end{itemize}
+\end{frame}
diff --git a/slides/kernel-driver-development-dma/peripheral-dma.dia b/slides/kernel-driver-development-dma/peripheral-dma.dia
new file mode 100644
index 0000000..91fdf0d
Binary files /dev/null and b/slides/kernel-driver-development-dma/peripheral-dma.dia differ



More information about the training-materials-updates mailing list