dmaengine: edma: Implement protection for invalid max_burst
authorPeter Ujfalusi <peter.ujfalusi@ti.com>
Tue, 3 Oct 2017 08:35:37 +0000 (11:35 +0300)
committerVinod Koul <vinod.koul@intel.com>
Thu, 12 Oct 2017 16:43:06 +0000 (22:13 +0530)
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>
drivers/dma/edma.c

index 3879f80a4815cb27ba4329e29510752e34331ba4..6970355abdc9efc9788b998dc4a54530c78b7609 100644 (file)
@@ -891,6 +891,10 @@ static int edma_slave_config(struct dma_chan *chan,
            cfg->dst_addr_width == DMA_SLAVE_BUSWIDTH_8_BYTES)
                return -EINVAL;
 
+       if (cfg->src_maxburst > chan->device->max_burst ||
+           cfg->dst_maxburst > chan->device->max_burst)
+               return -EINVAL;
+
        memcpy(&echan->cfg, cfg, sizeof(echan->cfg));
 
        return 0;
@@ -1855,6 +1859,7 @@ static void edma_dma_init(struct edma_cc *ecc, bool legacy_mode)
        s_ddev->dst_addr_widths = EDMA_DMA_BUSWIDTHS;
        s_ddev->directions |= (BIT(DMA_DEV_TO_MEM) | BIT(DMA_MEM_TO_DEV));
        s_ddev->residue_granularity = DMA_RESIDUE_GRANULARITY_BURST;
+       s_ddev->max_burst = SZ_32K - 1; /* CIDX: 16bit signed */
 
        s_ddev->dev = ecc->dev;
        INIT_LIST_HEAD(&s_ddev->channels);