<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic sdma memory to meory error in i.MX Processors</title>
    <link>https://community.nxp.com/t5/i-MX-Processors/sdma-memory-to-meory-error/m-p/609782#M91963</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;software : Linux-4.1.18&lt;/P&gt;&lt;P&gt;hardware: I.MX6q&lt;/P&gt;&lt;P&gt;The file imx-sdma.c is linux/driver/dma/imx-sdma.c.&lt;/P&gt;&lt;P&gt;Error line :&amp;nbsp; dma_m2m_desc = dma_m2m_chan-&amp;gt;device-&amp;gt;device_prep_dma_sg(dma_m2m_chan,sg2, 3, sg, 3, 0);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dma_m2m_desc = dma_m2m_chan-&amp;gt;device-&amp;gt;device_prep_dma_memcpy(dma_m2m_chan, dma_dst, dma_src, SDMA_BUF_SIZE,0);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; The two dma_m2m2_desc is all null&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;#include &amp;lt;linux/module.h&amp;gt;&lt;BR /&gt;#include &amp;lt;linux/slab.h&amp;gt;&lt;BR /&gt;#include &amp;lt;linux/sched.h&amp;gt;&lt;BR /&gt;#include &amp;lt;linux/mman.h&amp;gt;&lt;BR /&gt;#include &amp;lt;linux/init.h&amp;gt;&lt;BR /&gt;#include &amp;lt;linux/dma-mapping.h&amp;gt;&lt;BR /&gt;#include &amp;lt;linux/fs.h&amp;gt;&lt;BR /&gt;#include &amp;lt;linux/version.h&amp;gt;&lt;BR /&gt;#include &amp;lt;linux/delay.h&amp;gt;&lt;BR /&gt;#if (LINUX_VERSION_CODE &amp;gt;= KERNEL_VERSION(3,0,35))&lt;BR /&gt;#include &amp;lt;linux/platform_data/dma-imx.h&amp;gt;&lt;BR /&gt;#else&lt;BR /&gt;#include &amp;lt;mach/dma.h&amp;gt;&lt;BR /&gt;#endif&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;#include &amp;lt;linux/dmaengine.h&amp;gt;&lt;BR /&gt;#include &amp;lt;linux/device.h&amp;gt;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;#include &amp;lt;linux/io.h&amp;gt;&lt;BR /&gt;#include &amp;lt;linux/delay.h&amp;gt;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;static int gMajor; /* major number of device */&lt;BR /&gt;static struct class *dma_tm_class;&lt;BR /&gt;u32 *wbuf, *wbuf2, *wbuf3, *wbuf4;&lt;BR /&gt;u32 *rbuf, *rbuf2, *rbuf3, *rbuf4;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;struct dma_chan *dma_m2m_chan;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;struct completion dma_m2m_ok;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;struct scatterlist sg[3], sg2[3];&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;#define SDMA_BUF_SIZE&amp;nbsp; 1024&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;static bool dma_m2m_filter(struct dma_chan *chan, void *param)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if (!imx_dma_is_general_purpose(chan))&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;return false;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;chan-&amp;gt;private = param;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;return true;&lt;BR /&gt;}&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;int sdma_open(struct inode * inode, struct file * filp)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dma_cap_mask_t dma_m2m_mask;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;struct imx_dma_data m2m_dma_data = {0};&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;init_completion(&amp;amp;dma_m2m_ok);&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dma_cap_zero(dma_m2m_mask);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dma_cap_set(DMA_SLAVE, dma_m2m_mask);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;m2m_dma_data.peripheral_type = IMX_DMATYPE_MEMORY;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;m2m_dma_data.priority = DMA_PRIO_HIGH;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dma_m2m_chan = dma_request_channel(dma_m2m_mask, dma_m2m_filter, &amp;amp;m2m_dma_data);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if (!dma_m2m_chan) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;printk("Error opening the SDMA memory to memory channel\n");&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;return -EINVAL;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;wbuf = kzalloc(SDMA_BUF_SIZE, GFP_DMA);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if(!wbuf) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;printk("error wbuf !!!!!!!!!!!\n");&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;return -1;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;wbuf2 = kzalloc(SDMA_BUF_SIZE/2, GFP_DMA);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if(!wbuf2) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;printk("error wbuf2 !!!!!!!!!!!\n");&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;return -1;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;wbuf3 = kzalloc(SDMA_BUF_SIZE, GFP_DMA);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if(!wbuf3) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;printk("error wbuf3 !!!!!!!!!!!\n");&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;return -1;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;wbuf4 = kzalloc(SDMA_BUF_SIZE, GFP_DMA);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if(!wbuf4) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;printk("error wbuf4 !!!!!!!!!!!\n");&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;return -1;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;rbuf = kzalloc(SDMA_BUF_SIZE, GFP_DMA);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if(!rbuf) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;printk("error rbuf !!!!!!!!!!!\n");&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;return -1;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;rbuf2 = kzalloc(SDMA_BUF_SIZE/2, GFP_DMA);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if(!rbuf2) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;printk("error rbuf2 !!!!!!!!!!!\n");&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;return -1;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;rbuf3 = kzalloc(SDMA_BUF_SIZE, GFP_DMA);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if(!rbuf3) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;printk("error rbuf3 !!!!!!!!!!!\n");&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;return -1;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;rbuf4 = kzalloc(SDMA_BUF_SIZE, GFP_DMA);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if(!rbuf4) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;printk("error rbuf4 !!!!!!!!!!!\n");&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;return -1;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;return 0;&lt;BR /&gt;}&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;int sdma_release(struct inode * inode, struct file * filp)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dma_release_channel(dma_m2m_chan);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dma_m2m_chan = NULL;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;kfree(wbuf);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;kfree(wbuf2);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;kfree(wbuf3);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;kfree(wbuf4);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;kfree(rbuf);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;kfree(rbuf2);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;kfree(rbuf3);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;kfree(rbuf4);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;return 0;&lt;BR /&gt;}&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;ssize_t sdma_read (struct file *filp, char __user * buf, size_t count,&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;loff_t * offset)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;int i;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;for (i=0; i&amp;lt;SDMA_BUF_SIZE/4; i++) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if (*(rbuf+i) != *(wbuf+i)) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;printk("buffer 1 copy falled!\n");&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;return 0;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;printk("buffer 1 copy passed!\n");&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;for (i=0; i&amp;lt;SDMA_BUF_SIZE/2/4; i++) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if (*(rbuf2+i) != *(wbuf2+i)) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;printk("buffer 2 copy falled!\n");&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;return 0;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;printk("buffer 2 copy passed!\n");&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;for (i=0; i&amp;lt;SDMA_BUF_SIZE/4; i++) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if (*(rbuf3+i) != *(wbuf3+i)) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;printk("buffer 3 copy falled!\n");&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;return 0;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;printk("buffer 3 copy passed!\n");&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;#if (LINUX_VERSION_CODE &amp;gt;= KERNEL_VERSION(3,0,35))&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;for (i=0; i&amp;lt;SDMA_BUF_SIZE/4; i++) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if (*(rbuf4+i) != *(wbuf4+i)) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;printk("buffer 4 copy falled!,r=%x,w=%x,%d\n", *(rbuf4+i), *(wbuf4+i), i);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;return 0;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;printk("buffer 4 copy passed!\n");&lt;BR /&gt;#endif&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;return 0;&lt;BR /&gt;}&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;static void dma_m2m_callback(void *data)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;printk("in %s\n",__func__);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;complete(&amp;amp;dma_m2m_ok);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;return ;&lt;BR /&gt;}&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;ssize_t sdma_write(struct file * filp, const char __user * buf, size_t count,&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;loff_t * offset)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;u32 *index1, *index2, *index3, i, ret;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;struct dma_slave_config dma_m2m_config = {0};&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;struct dma_async_tx_descriptor *dma_m2m_desc;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;u32 *index4 = wbuf4;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dma_addr_t dma_src, dma_dst;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;index1 = wbuf;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;index2 = wbuf2;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;index3 = wbuf3;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;for (i=0; i&amp;lt;SDMA_BUF_SIZE/4; i++) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*(index1 + i) = 0x12121212;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;for (i=0; i&amp;lt;SDMA_BUF_SIZE/2/4; i++) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*(index2 + i) = 0x34343434;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;for (i=0; i&amp;lt;SDMA_BUF_SIZE/4; i++) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*(index3 + i) = 0x56565656;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;for (i=0; i&amp;lt;SDMA_BUF_SIZE/4; i++) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*(index4 + i) = 0x56565656;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;#if 0&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;for (i=0; i&amp;lt;SDMA_BUF_SIZE/4; i++) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;printk("input data_%d : %x\n", i, *(wbuf+i));&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;for (i=0; i&amp;lt;SDMA_BUF_SIZE/2/4; i++) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;printk("input data2_%d : %x\n", i, *(wbuf2+i));&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;for (i=0; i&amp;lt;SDMA_BUF_SIZE/4; i++) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;printk("input data3_%d : %x\n", i, *(wbuf3+i));&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;BR /&gt;#endif&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dma_m2m_config.direction = DMA_MEM_TO_MEM;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dma_m2m_config.dst_addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dmaengine_slave_config(dma_m2m_chan, &amp;amp;dma_m2m_config);&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;sg_init_table(sg, 3);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;sg_set_buf(&amp;amp;sg[0], wbuf, SDMA_BUF_SIZE);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;sg_set_buf(&amp;amp;sg[1], wbuf2, SDMA_BUF_SIZE/2);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;sg_set_buf(&amp;amp;sg[2], wbuf3, SDMA_BUF_SIZE);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;ret = dma_map_sg(NULL, sg, 3, dma_m2m_config.direction);&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;#if (LINUX_VERSION_CODE &amp;lt;= KERNEL_VERSION(3,0,35))&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dma_m2m_desc = dma_m2m_chan-&amp;gt;device-&amp;gt;device_prep_slave_sg(dma_m2m_chan,sg, 3, dma_m2m_config.direction, 1);&lt;BR /&gt;#endif&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;sg_init_table(sg2, 3);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;sg_set_buf(&amp;amp;sg2[0], rbuf, SDMA_BUF_SIZE);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;sg_set_buf(&amp;amp;sg2[1], rbuf2, SDMA_BUF_SIZE/2);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;sg_set_buf(&amp;amp;sg2[2], rbuf3, SDMA_BUF_SIZE);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;ret = dma_map_sg(NULL, sg2, 3, dma_m2m_config.direction);&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;#if (LINUX_VERSION_CODE &amp;lt;= KERNEL_VERSION(3,0,35))&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dma_m2m_desc = dma_m2m_chan-&amp;gt;device-&amp;gt;device_prep_slave_sg(dma_m2m_chan,sg2, 3, dma_m2m_config.direction, 0);&lt;BR /&gt;#else&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dma_m2m_desc = dma_m2m_chan-&amp;gt;device-&amp;gt;device_prep_dma_sg(dma_m2m_chan,sg2, 3, sg, 3, 0);&lt;BR /&gt;#endif&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dma_m2m_desc-&amp;gt;callback = dma_m2m_callback;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dmaengine_submit(dma_m2m_desc);&lt;BR /&gt;#if (LINUX_VERSION_CODE &amp;gt;= KERNEL_VERSION(3,0,35))&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dma_async_issue_pending(dma_m2m_chan);&lt;BR /&gt;#endif&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;wait_for_completion(&amp;amp;dma_m2m_ok);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dma_unmap_sg(NULL, sg, 3, dma_m2m_config.direction);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dma_unmap_sg(NULL, sg2, 3, dma_m2m_config.direction);&lt;BR /&gt;#if (LINUX_VERSION_CODE &amp;gt;= KERNEL_VERSION(3,0,35))&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dma_src = dma_map_single(NULL, wbuf4, SDMA_BUF_SIZE, DMA_TO_DEVICE);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dma_dst = dma_map_single(NULL, rbuf4, SDMA_BUF_SIZE, DMA_FROM_DEVICE);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dma_m2m_desc = dma_m2m_chan-&amp;gt;device-&amp;gt;device_prep_dma_memcpy(dma_m2m_chan, dma_dst, dma_src, SDMA_BUF_SIZE,0);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if (!dma_m2m_desc)&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;printk("prep error!!\n");&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dma_m2m_desc-&amp;gt;callback = dma_m2m_callback;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dmaengine_submit(dma_m2m_desc);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dma_async_issue_pending(dma_m2m_chan);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;wait_for_completion(&amp;amp;dma_m2m_ok);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dma_unmap_single(NULL, dma_src, SDMA_BUF_SIZE, DMA_TO_DEVICE);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dma_unmap_single(NULL, dma_dst, SDMA_BUF_SIZE, DMA_FROM_DEVICE);&lt;BR /&gt;#endif&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;return 0;&lt;BR /&gt;}&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;struct file_operations dma_fops = {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;open:&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;sdma_open,&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;release:&amp;nbsp;&amp;nbsp; &amp;nbsp;sdma_release,&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;read:&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;sdma_read,&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;write:&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;sdma_write,&lt;BR /&gt;};&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;int __init sdma_init_module(void)&lt;BR /&gt;{&lt;BR /&gt;#if (LINUX_VERSION_CODE &amp;gt;= KERNEL_VERSION(2,6,26))&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;struct device *temp_class;&lt;BR /&gt;#else&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;struct class_device *temp_class;&lt;BR /&gt;#endif&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;int error;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;/* register a character device */&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;error = register_chrdev(0, "sdma_test", &amp;amp;dma_fops);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if (error &amp;lt; 0) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;printk("SDMA test driver can't get major number\n");&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;return error;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;gMajor = error;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;printk("SDMA test major number = %d\n",gMajor);&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dma_tm_class = class_create(THIS_MODULE, "sdma_test");&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if (IS_ERR(dma_tm_class)) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;printk(KERN_ERR "Error creating sdma test module class.\n");&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;unregister_chrdev(gMajor, "sdma_test");&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;return PTR_ERR(dma_tm_class);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;#if (LINUX_VERSION_CODE &amp;gt;= KERNEL_VERSION(2,6,28))&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;temp_class = device_create(dma_tm_class, NULL,&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; MKDEV(gMajor, 0), NULL, "sdma_test");&lt;BR /&gt;#elif (LINUX_VERSION_CODE &amp;gt;= KERNEL_VERSION(2,6,26))&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;temp_class = device_create(dma_tm_class, NULL,&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; MKDEV(gMajor, 0), "sdma_test");&lt;BR /&gt;#else&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;temp_class = class_device_create(dma_tm_class, NULL,&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MKDEV(gMajor, 0), NULL,&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "sdma_test");&lt;BR /&gt;#endif&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if (IS_ERR(temp_class)) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;printk(KERN_ERR "Error creating sdma test class device.\n");&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;class_destroy(dma_tm_class);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;unregister_chrdev(gMajor, "sdma_test");&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;return -1;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;printk("SDMA test Driver Module loaded\n");&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;return 0;&lt;BR /&gt;}&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;static void sdma_cleanup_module(void)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;unregister_chrdev(gMajor, "sdma_test");&lt;BR /&gt;#if (LINUX_VERSION_CODE &amp;gt;= KERNEL_VERSION(2,6,26))&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;device_destroy(dma_tm_class, MKDEV(gMajor, 0));&lt;BR /&gt;#else&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;class_device_destroy(dma_tm_class, MKDEV(gMajor, 0));&lt;BR /&gt;#endif&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;class_destroy(dma_tm_class);&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;printk("SDMA test Driver Module Unloaded\n");&lt;BR /&gt;}&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;module_init(sdma_init_module);&lt;BR /&gt;module_exit(sdma_cleanup_module);&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;MODULE_AUTHOR("Freescale Semiconductor");&lt;BR /&gt;MODULE_DESCRIPTION("SDMA test driver");&lt;BR /&gt;MODULE_LICENSE("GPL");&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Original Attachment has been moved to: &lt;A _jive_internal="true" href="https://community.nxp.com/docs/DOC-336789"&gt;imx-sdma.c.zip&lt;/A&gt;&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Original Attachment has been moved to: &lt;A _jive_internal="true" href="https://community.nxp.com/docs/DOC-336789"&gt;mxc_sdma_memcopy_test.c.zip&lt;/A&gt;&lt;/STRONG&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Thu, 12 Jan 2017 02:00:58 GMT</pubDate>
    <dc:creator>sharpjison</dc:creator>
    <dc:date>2017-01-12T02:00:58Z</dc:date>
    <item>
      <title>sdma memory to meory error</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/sdma-memory-to-meory-error/m-p/609782#M91963</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;software : Linux-4.1.18&lt;/P&gt;&lt;P&gt;hardware: I.MX6q&lt;/P&gt;&lt;P&gt;The file imx-sdma.c is linux/driver/dma/imx-sdma.c.&lt;/P&gt;&lt;P&gt;Error line :&amp;nbsp; dma_m2m_desc = dma_m2m_chan-&amp;gt;device-&amp;gt;device_prep_dma_sg(dma_m2m_chan,sg2, 3, sg, 3, 0);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dma_m2m_desc = dma_m2m_chan-&amp;gt;device-&amp;gt;device_prep_dma_memcpy(dma_m2m_chan, dma_dst, dma_src, SDMA_BUF_SIZE,0);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; The two dma_m2m2_desc is all null&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;#include &amp;lt;linux/module.h&amp;gt;&lt;BR /&gt;#include &amp;lt;linux/slab.h&amp;gt;&lt;BR /&gt;#include &amp;lt;linux/sched.h&amp;gt;&lt;BR /&gt;#include &amp;lt;linux/mman.h&amp;gt;&lt;BR /&gt;#include &amp;lt;linux/init.h&amp;gt;&lt;BR /&gt;#include &amp;lt;linux/dma-mapping.h&amp;gt;&lt;BR /&gt;#include &amp;lt;linux/fs.h&amp;gt;&lt;BR /&gt;#include &amp;lt;linux/version.h&amp;gt;&lt;BR /&gt;#include &amp;lt;linux/delay.h&amp;gt;&lt;BR /&gt;#if (LINUX_VERSION_CODE &amp;gt;= KERNEL_VERSION(3,0,35))&lt;BR /&gt;#include &amp;lt;linux/platform_data/dma-imx.h&amp;gt;&lt;BR /&gt;#else&lt;BR /&gt;#include &amp;lt;mach/dma.h&amp;gt;&lt;BR /&gt;#endif&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;#include &amp;lt;linux/dmaengine.h&amp;gt;&lt;BR /&gt;#include &amp;lt;linux/device.h&amp;gt;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;#include &amp;lt;linux/io.h&amp;gt;&lt;BR /&gt;#include &amp;lt;linux/delay.h&amp;gt;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;static int gMajor; /* major number of device */&lt;BR /&gt;static struct class *dma_tm_class;&lt;BR /&gt;u32 *wbuf, *wbuf2, *wbuf3, *wbuf4;&lt;BR /&gt;u32 *rbuf, *rbuf2, *rbuf3, *rbuf4;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;struct dma_chan *dma_m2m_chan;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;struct completion dma_m2m_ok;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;struct scatterlist sg[3], sg2[3];&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;#define SDMA_BUF_SIZE&amp;nbsp; 1024&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;static bool dma_m2m_filter(struct dma_chan *chan, void *param)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if (!imx_dma_is_general_purpose(chan))&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;return false;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;chan-&amp;gt;private = param;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;return true;&lt;BR /&gt;}&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;int sdma_open(struct inode * inode, struct file * filp)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dma_cap_mask_t dma_m2m_mask;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;struct imx_dma_data m2m_dma_data = {0};&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;init_completion(&amp;amp;dma_m2m_ok);&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dma_cap_zero(dma_m2m_mask);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dma_cap_set(DMA_SLAVE, dma_m2m_mask);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;m2m_dma_data.peripheral_type = IMX_DMATYPE_MEMORY;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;m2m_dma_data.priority = DMA_PRIO_HIGH;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dma_m2m_chan = dma_request_channel(dma_m2m_mask, dma_m2m_filter, &amp;amp;m2m_dma_data);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if (!dma_m2m_chan) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;printk("Error opening the SDMA memory to memory channel\n");&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;return -EINVAL;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;wbuf = kzalloc(SDMA_BUF_SIZE, GFP_DMA);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if(!wbuf) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;printk("error wbuf !!!!!!!!!!!\n");&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;return -1;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;wbuf2 = kzalloc(SDMA_BUF_SIZE/2, GFP_DMA);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if(!wbuf2) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;printk("error wbuf2 !!!!!!!!!!!\n");&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;return -1;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;wbuf3 = kzalloc(SDMA_BUF_SIZE, GFP_DMA);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if(!wbuf3) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;printk("error wbuf3 !!!!!!!!!!!\n");&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;return -1;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;wbuf4 = kzalloc(SDMA_BUF_SIZE, GFP_DMA);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if(!wbuf4) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;printk("error wbuf4 !!!!!!!!!!!\n");&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;return -1;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;rbuf = kzalloc(SDMA_BUF_SIZE, GFP_DMA);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if(!rbuf) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;printk("error rbuf !!!!!!!!!!!\n");&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;return -1;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;rbuf2 = kzalloc(SDMA_BUF_SIZE/2, GFP_DMA);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if(!rbuf2) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;printk("error rbuf2 !!!!!!!!!!!\n");&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;return -1;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;rbuf3 = kzalloc(SDMA_BUF_SIZE, GFP_DMA);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if(!rbuf3) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;printk("error rbuf3 !!!!!!!!!!!\n");&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;return -1;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;rbuf4 = kzalloc(SDMA_BUF_SIZE, GFP_DMA);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if(!rbuf4) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;printk("error rbuf4 !!!!!!!!!!!\n");&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;return -1;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;return 0;&lt;BR /&gt;}&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;int sdma_release(struct inode * inode, struct file * filp)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dma_release_channel(dma_m2m_chan);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dma_m2m_chan = NULL;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;kfree(wbuf);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;kfree(wbuf2);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;kfree(wbuf3);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;kfree(wbuf4);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;kfree(rbuf);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;kfree(rbuf2);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;kfree(rbuf3);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;kfree(rbuf4);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;return 0;&lt;BR /&gt;}&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;ssize_t sdma_read (struct file *filp, char __user * buf, size_t count,&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;loff_t * offset)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;int i;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;for (i=0; i&amp;lt;SDMA_BUF_SIZE/4; i++) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if (*(rbuf+i) != *(wbuf+i)) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;printk("buffer 1 copy falled!\n");&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;return 0;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;printk("buffer 1 copy passed!\n");&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;for (i=0; i&amp;lt;SDMA_BUF_SIZE/2/4; i++) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if (*(rbuf2+i) != *(wbuf2+i)) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;printk("buffer 2 copy falled!\n");&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;return 0;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;printk("buffer 2 copy passed!\n");&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;for (i=0; i&amp;lt;SDMA_BUF_SIZE/4; i++) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if (*(rbuf3+i) != *(wbuf3+i)) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;printk("buffer 3 copy falled!\n");&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;return 0;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;printk("buffer 3 copy passed!\n");&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;#if (LINUX_VERSION_CODE &amp;gt;= KERNEL_VERSION(3,0,35))&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;for (i=0; i&amp;lt;SDMA_BUF_SIZE/4; i++) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if (*(rbuf4+i) != *(wbuf4+i)) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;printk("buffer 4 copy falled!,r=%x,w=%x,%d\n", *(rbuf4+i), *(wbuf4+i), i);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;return 0;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;printk("buffer 4 copy passed!\n");&lt;BR /&gt;#endif&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;return 0;&lt;BR /&gt;}&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;static void dma_m2m_callback(void *data)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;printk("in %s\n",__func__);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;complete(&amp;amp;dma_m2m_ok);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;return ;&lt;BR /&gt;}&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;ssize_t sdma_write(struct file * filp, const char __user * buf, size_t count,&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;loff_t * offset)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;u32 *index1, *index2, *index3, i, ret;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;struct dma_slave_config dma_m2m_config = {0};&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;struct dma_async_tx_descriptor *dma_m2m_desc;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;u32 *index4 = wbuf4;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dma_addr_t dma_src, dma_dst;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;index1 = wbuf;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;index2 = wbuf2;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;index3 = wbuf3;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;for (i=0; i&amp;lt;SDMA_BUF_SIZE/4; i++) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*(index1 + i) = 0x12121212;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;for (i=0; i&amp;lt;SDMA_BUF_SIZE/2/4; i++) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*(index2 + i) = 0x34343434;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;for (i=0; i&amp;lt;SDMA_BUF_SIZE/4; i++) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*(index3 + i) = 0x56565656;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;for (i=0; i&amp;lt;SDMA_BUF_SIZE/4; i++) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*(index4 + i) = 0x56565656;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;#if 0&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;for (i=0; i&amp;lt;SDMA_BUF_SIZE/4; i++) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;printk("input data_%d : %x\n", i, *(wbuf+i));&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;for (i=0; i&amp;lt;SDMA_BUF_SIZE/2/4; i++) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;printk("input data2_%d : %x\n", i, *(wbuf2+i));&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;for (i=0; i&amp;lt;SDMA_BUF_SIZE/4; i++) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;printk("input data3_%d : %x\n", i, *(wbuf3+i));&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;BR /&gt;#endif&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dma_m2m_config.direction = DMA_MEM_TO_MEM;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dma_m2m_config.dst_addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dmaengine_slave_config(dma_m2m_chan, &amp;amp;dma_m2m_config);&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;sg_init_table(sg, 3);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;sg_set_buf(&amp;amp;sg[0], wbuf, SDMA_BUF_SIZE);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;sg_set_buf(&amp;amp;sg[1], wbuf2, SDMA_BUF_SIZE/2);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;sg_set_buf(&amp;amp;sg[2], wbuf3, SDMA_BUF_SIZE);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;ret = dma_map_sg(NULL, sg, 3, dma_m2m_config.direction);&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;#if (LINUX_VERSION_CODE &amp;lt;= KERNEL_VERSION(3,0,35))&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dma_m2m_desc = dma_m2m_chan-&amp;gt;device-&amp;gt;device_prep_slave_sg(dma_m2m_chan,sg, 3, dma_m2m_config.direction, 1);&lt;BR /&gt;#endif&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;sg_init_table(sg2, 3);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;sg_set_buf(&amp;amp;sg2[0], rbuf, SDMA_BUF_SIZE);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;sg_set_buf(&amp;amp;sg2[1], rbuf2, SDMA_BUF_SIZE/2);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;sg_set_buf(&amp;amp;sg2[2], rbuf3, SDMA_BUF_SIZE);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;ret = dma_map_sg(NULL, sg2, 3, dma_m2m_config.direction);&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;#if (LINUX_VERSION_CODE &amp;lt;= KERNEL_VERSION(3,0,35))&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dma_m2m_desc = dma_m2m_chan-&amp;gt;device-&amp;gt;device_prep_slave_sg(dma_m2m_chan,sg2, 3, dma_m2m_config.direction, 0);&lt;BR /&gt;#else&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dma_m2m_desc = dma_m2m_chan-&amp;gt;device-&amp;gt;device_prep_dma_sg(dma_m2m_chan,sg2, 3, sg, 3, 0);&lt;BR /&gt;#endif&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dma_m2m_desc-&amp;gt;callback = dma_m2m_callback;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dmaengine_submit(dma_m2m_desc);&lt;BR /&gt;#if (LINUX_VERSION_CODE &amp;gt;= KERNEL_VERSION(3,0,35))&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dma_async_issue_pending(dma_m2m_chan);&lt;BR /&gt;#endif&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;wait_for_completion(&amp;amp;dma_m2m_ok);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dma_unmap_sg(NULL, sg, 3, dma_m2m_config.direction);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dma_unmap_sg(NULL, sg2, 3, dma_m2m_config.direction);&lt;BR /&gt;#if (LINUX_VERSION_CODE &amp;gt;= KERNEL_VERSION(3,0,35))&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dma_src = dma_map_single(NULL, wbuf4, SDMA_BUF_SIZE, DMA_TO_DEVICE);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dma_dst = dma_map_single(NULL, rbuf4, SDMA_BUF_SIZE, DMA_FROM_DEVICE);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dma_m2m_desc = dma_m2m_chan-&amp;gt;device-&amp;gt;device_prep_dma_memcpy(dma_m2m_chan, dma_dst, dma_src, SDMA_BUF_SIZE,0);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if (!dma_m2m_desc)&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;printk("prep error!!\n");&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dma_m2m_desc-&amp;gt;callback = dma_m2m_callback;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dmaengine_submit(dma_m2m_desc);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dma_async_issue_pending(dma_m2m_chan);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;wait_for_completion(&amp;amp;dma_m2m_ok);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dma_unmap_single(NULL, dma_src, SDMA_BUF_SIZE, DMA_TO_DEVICE);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dma_unmap_single(NULL, dma_dst, SDMA_BUF_SIZE, DMA_FROM_DEVICE);&lt;BR /&gt;#endif&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;return 0;&lt;BR /&gt;}&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;struct file_operations dma_fops = {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;open:&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;sdma_open,&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;release:&amp;nbsp;&amp;nbsp; &amp;nbsp;sdma_release,&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;read:&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;sdma_read,&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;write:&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;sdma_write,&lt;BR /&gt;};&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;int __init sdma_init_module(void)&lt;BR /&gt;{&lt;BR /&gt;#if (LINUX_VERSION_CODE &amp;gt;= KERNEL_VERSION(2,6,26))&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;struct device *temp_class;&lt;BR /&gt;#else&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;struct class_device *temp_class;&lt;BR /&gt;#endif&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;int error;&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;/* register a character device */&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;error = register_chrdev(0, "sdma_test", &amp;amp;dma_fops);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if (error &amp;lt; 0) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;printk("SDMA test driver can't get major number\n");&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;return error;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;gMajor = error;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;printk("SDMA test major number = %d\n",gMajor);&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;dma_tm_class = class_create(THIS_MODULE, "sdma_test");&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if (IS_ERR(dma_tm_class)) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;printk(KERN_ERR "Error creating sdma test module class.\n");&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;unregister_chrdev(gMajor, "sdma_test");&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;return PTR_ERR(dma_tm_class);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;#if (LINUX_VERSION_CODE &amp;gt;= KERNEL_VERSION(2,6,28))&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;temp_class = device_create(dma_tm_class, NULL,&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; MKDEV(gMajor, 0), NULL, "sdma_test");&lt;BR /&gt;#elif (LINUX_VERSION_CODE &amp;gt;= KERNEL_VERSION(2,6,26))&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;temp_class = device_create(dma_tm_class, NULL,&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; MKDEV(gMajor, 0), "sdma_test");&lt;BR /&gt;#else&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;temp_class = class_device_create(dma_tm_class, NULL,&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MKDEV(gMajor, 0), NULL,&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "sdma_test");&lt;BR /&gt;#endif&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if (IS_ERR(temp_class)) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;printk(KERN_ERR "Error creating sdma test class device.\n");&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;class_destroy(dma_tm_class);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;unregister_chrdev(gMajor, "sdma_test");&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;return -1;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;printk("SDMA test Driver Module loaded\n");&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;return 0;&lt;BR /&gt;}&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;static void sdma_cleanup_module(void)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;unregister_chrdev(gMajor, "sdma_test");&lt;BR /&gt;#if (LINUX_VERSION_CODE &amp;gt;= KERNEL_VERSION(2,6,26))&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;device_destroy(dma_tm_class, MKDEV(gMajor, 0));&lt;BR /&gt;#else&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;class_device_destroy(dma_tm_class, MKDEV(gMajor, 0));&lt;BR /&gt;#endif&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;class_destroy(dma_tm_class);&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;printk("SDMA test Driver Module Unloaded\n");&lt;BR /&gt;}&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;module_init(sdma_init_module);&lt;BR /&gt;module_exit(sdma_cleanup_module);&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;MODULE_AUTHOR("Freescale Semiconductor");&lt;BR /&gt;MODULE_DESCRIPTION("SDMA test driver");&lt;BR /&gt;MODULE_LICENSE("GPL");&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Original Attachment has been moved to: &lt;A _jive_internal="true" href="https://community.nxp.com/docs/DOC-336789"&gt;imx-sdma.c.zip&lt;/A&gt;&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Original Attachment has been moved to: &lt;A _jive_internal="true" href="https://community.nxp.com/docs/DOC-336789"&gt;mxc_sdma_memcopy_test.c.zip&lt;/A&gt;&lt;/STRONG&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 12 Jan 2017 02:00:58 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/sdma-memory-to-meory-error/m-p/609782#M91963</guid>
      <dc:creator>sharpjison</dc:creator>
      <dc:date>2017-01-12T02:00:58Z</dc:date>
    </item>
    <item>
      <title>Re: sdma memory to meory error</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/sdma-memory-to-meory-error/m-p/609783#M91964</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Sharp&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;one can check with official nxp L4.1.15&lt;/P&gt;&lt;P&gt;&lt;A _jive_internal="true" class="link-titled" href="https://community.nxp.com/thread/440728?commentID=862063#comment" title="https://community.nxp.com/message/862063?commentID=862063#comment-862063"&gt;https://community.nxp.com/message/862063?commentID=862063#comment-862063&lt;/A&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;sorry, L4.1.18 not officially supported by nxp, below link nxp bsp releases&lt;/P&gt;&lt;P&gt;&lt;A class="link-titled" href="http://www.nxp.com/products/microcontrollers-and-processors/arm-processors/i.mx-applications-processors/i.mx-6-processors/i.mx6qp/i.mx-6-series-software-and-development-tool-resources:IMX6_SW" title="http://www.nxp.com/products/microcontrollers-and-processors/arm-processors/i.mx-applications-processors/i.mx-6-processors/i.mx6qp/i.mx-6-series-software-and-development-tool-resources:IMX6_SW"&gt;i.MX 6 Series Software and Development Tool|NXP&lt;/A&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Best regards&lt;BR /&gt;igor&lt;BR /&gt;-----------------------------------------------------------------------------------------------------------------------&lt;BR /&gt;Note: If this post answers your question, please click the Correct Answer button. Thank you!&lt;BR /&gt;-----------------------------------------------------------------------------------------------------------------------&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 16 Jan 2017 05:37:21 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/sdma-memory-to-meory-error/m-p/609783#M91964</guid>
      <dc:creator>igorpadykov</dc:creator>
      <dc:date>2017-01-16T05:37:21Z</dc:date>
    </item>
  </channel>
</rss>

