summaryrefslogtreecommitdiffstats
path: root/drivers/dma/imx-dma.c
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2011-01-12 14:13:23 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2011-01-31 12:36:02 +0100
commitd07102a1bb0e759ce4571df30c62998ef5d8a8d3 (patch)
treef1b093f2a642600823ef733ca0da7245751a8a2b /drivers/dma/imx-dma.c
parentdmaengine i.MX dma: set maximum segment size for our device (diff)
downloadlinux-d07102a1bb0e759ce4571df30c62998ef5d8a8d3.tar.xz
linux-d07102a1bb0e759ce4571df30c62998ef5d8a8d3.zip
dmaengine i.MX dma: check sg entries for valid addresses and lengths
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers/dma/imx-dma.c')
-rw-r--r--drivers/dma/imx-dma.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/drivers/dma/imx-dma.c b/drivers/dma/imx-dma.c
index a46e1d9fa3e4..a1eac99a5fa1 100644
--- a/drivers/dma/imx-dma.c
+++ b/drivers/dma/imx-dma.c
@@ -243,6 +243,21 @@ static struct dma_async_tx_descriptor *imxdma_prep_slave_sg(
else
dmamode = DMA_MODE_WRITE;
+ switch (imxdmac->word_size) {
+ case DMA_SLAVE_BUSWIDTH_4_BYTES:
+ if (sgl->length & 3 || sgl->dma_address & 3)
+ return NULL;
+ break;
+ case DMA_SLAVE_BUSWIDTH_2_BYTES:
+ if (sgl->length & 1 || sgl->dma_address & 1)
+ return NULL;
+ break;
+ case DMA_SLAVE_BUSWIDTH_1_BYTE:
+ break;
+ default:
+ return NULL;
+ }
+
ret = imx_dma_setup_sg(imxdmac->imxdma_channel, sgl, sg_len,
dma_length, imxdmac->per_address, dmamode);
if (ret)