aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter Ujfalusi <peter.ujfalusi@ti.com>2017-10-03 04:35:37 -0400
committerVinod Koul <vinod.koul@intel.com>2017-10-12 12:43:06 -0400
commitea09ea51ddb9c5026e3f2090598049302c194427 (patch)
tree01314c2cab163f8b6602836c9635937bbac20893
parent2bd6bf03f4c1c59381d62c61d03f6cc3fe71f66e (diff)
dmaengine: edma: Implement protection for invalid max_burst
the device's max_burst to 32767 (CIDX is 16bit signed value) so clients can take this into consideration when setting up the transfer. During slave transfer preparation check if the requested maxburst is valid. Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com> Signed-off-by: Vinod Koul <vinod.koul@intel.com>
-rw-r--r--drivers/dma/edma.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/drivers/dma/edma.c b/drivers/dma/edma.c
index 3879f80a4815..6970355abdc9 100644
--- a/drivers/dma/edma.c
+++ b/drivers/dma/edma.c
@@ -891,6 +891,10 @@ static int edma_slave_config(struct dma_chan *chan,
891 cfg->dst_addr_width == DMA_SLAVE_BUSWIDTH_8_BYTES) 891 cfg->dst_addr_width == DMA_SLAVE_BUSWIDTH_8_BYTES)
892 return -EINVAL; 892 return -EINVAL;
893 893
894 if (cfg->src_maxburst > chan->device->max_burst ||
895 cfg->dst_maxburst > chan->device->max_burst)
896 return -EINVAL;
897
894 memcpy(&echan->cfg, cfg, sizeof(echan->cfg)); 898 memcpy(&echan->cfg, cfg, sizeof(echan->cfg));
895 899
896 return 0; 900 return 0;
@@ -1855,6 +1859,7 @@ static void edma_dma_init(struct edma_cc *ecc, bool legacy_mode)
1855 s_ddev->dst_addr_widths = EDMA_DMA_BUSWIDTHS; 1859 s_ddev->dst_addr_widths = EDMA_DMA_BUSWIDTHS;
1856 s_ddev->directions |= (BIT(DMA_DEV_TO_MEM) | BIT(DMA_MEM_TO_DEV)); 1860 s_ddev->directions |= (BIT(DMA_DEV_TO_MEM) | BIT(DMA_MEM_TO_DEV));
1857 s_ddev->residue_granularity = DMA_RESIDUE_GRANULARITY_BURST; 1861 s_ddev->residue_granularity = DMA_RESIDUE_GRANULARITY_BURST;
1862 s_ddev->max_burst = SZ_32K - 1; /* CIDX: 16bit signed */
1858 1863
1859 s_ddev->dev = ecc->dev; 1864 s_ddev->dev = ecc->dev;
1860 INIT_LIST_HEAD(&s_ddev->channels); 1865 INIT_LIST_HEAD(&s_ddev->channels);