[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