On Mon, Mar 10, 2014 at 9:30 PM, Jassi Brar <jassisinghbrar@xxxxxxxxx> wrote: > On Thu, Mar 6, 2014 at 7:18 PM, Srikanth Thokala <sthokal@xxxxxxxxxx> wrote: > >> +static struct dma_async_tx_descriptor * >> +xilinx_vdma_dma_prep_interleaved(struct dma_chan *dchan, >> + struct dma_interleaved_template *xt, >> + unsigned long flags) >> +{ >> + struct xilinx_vdma_chan *chan = to_xilinx_chan(dchan); >> + struct xilinx_vdma_tx_descriptor *desc; >> + struct xilinx_vdma_tx_segment *segment; >> + struct xilinx_vdma_tx_segment *prev = NULL; >> + int i; >> + >> + if ((xt->dir != DMA_MEM_TO_DEV) && (xt->dir != DMA_DEV_TO_MEM)) >> + return NULL; >> + >> + if (!xt->numf || !xt->sgl[0].size) >> + return NULL; >> + >> + /* Allocate a transaction descriptor. */ >> + desc = xilinx_vdma_alloc_tx_descriptor(chan); >> + if (!desc) >> + return NULL; >> + >> + dma_async_tx_descriptor_init(&desc->async_tx, &chan->common); >> + desc->async_tx.tx_submit = xilinx_vdma_tx_submit; >> + desc->async_tx.cookie = 0; >> + async_tx_ack(&desc->async_tx); >> + >> + /* Build the list of transaction segments. */ >> + for (i = 0; i < xt->frame_size; i++) { >> + struct xilinx_vdma_desc_hw *hw; >> + >> + /* Allocate the link descriptor from DMA pool */ >> + segment = xilinx_vdma_alloc_tx_segment(chan); >> + if (!segment) >> + goto error; >> + >> + /* Fill in the hardware descriptor */ >> + hw = &segment->hw; >> + hw->vsize = xt->numf; >> + hw->hsize = xt->sgl[0].size; >> + hw->stride = xt->sgl[0].icg << >> + XILINX_VDMA_FRMDLY_STRIDE_STRIDE_SHIFT; >> > It seems the xt->frame_size is (should be?) always going to be 1? > If yes, the for-loop isn't needed. > If no, you should probably use 'i' as the index to sgl[], and not always 0. It can be either '1': User can queue each segment and submit all the segments at once as a single async tx descriptor. I am using this for scatter-gather mode of operation where the src_start/dst_start is different for each segment. 'Number of frames': In this case the driver gets contiguous frame buffer memory and it prepares segments with addresses as multiples of src_start/dst_start. Please let me know if you see any issues in this implementation. Thanks Srikanth > -- > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/ -- To unsubscribe from this list: send the line "unsubscribe dmaengine" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html