Lines Matching +full:burst +full:- +full:length

4  * SPDX-License-Identifier: Apache-2.0
68 LOG_ERR("Source burst length (%u) and destination burst length(%u) must be equal", in dma_silabs_get_blocksize()
70 return -ENOTSUP; in dma_silabs_get_blocksize()
74 LOG_ERR("burst length (%u) and data size (%u) mismatch", src_blen, dst_blen); in dma_silabs_get_blocksize()
75 return -EINVAL; in dma_silabs_get_blocksize()
85 return -EINVAL; in dma_silabs_get_blocksize()
94 if (block->dest_scatter_count || block->source_gather_count || in dma_silabs_block_to_descriptor()
95 block->source_gather_interval || block->dest_scatter_interval || in dma_silabs_block_to_descriptor()
96 block->dest_reload_en || block->source_reload_en) { in dma_silabs_block_to_descriptor()
97 return -ENOTSUP; in dma_silabs_block_to_descriptor()
100 if ((block->source_gather_en || block->dest_scatter_en) && config->block_count == 1) { in dma_silabs_block_to_descriptor()
107 desc->xfer.structReq = 1; in dma_silabs_block_to_descriptor()
109 if (config->source_data_size != config->dest_data_size) { in dma_silabs_block_to_descriptor()
111 config->source_data_size, config->dest_data_size); in dma_silabs_block_to_descriptor()
112 return -ENOTSUP; in dma_silabs_block_to_descriptor()
115 if (config->source_data_size < 1 || config->source_data_size > 4) { in dma_silabs_block_to_descriptor()
116 return -ENOTSUP; in dma_silabs_block_to_descriptor()
119 src_size = config->source_data_size; in dma_silabs_block_to_descriptor()
120 desc->xfer.size = LOG2(src_size); in dma_silabs_block_to_descriptor()
122 if (block->block_size % config->source_data_size) { in dma_silabs_block_to_descriptor()
123 xfer_count = block->block_size / config->source_data_size; in dma_silabs_block_to_descriptor()
125 xfer_count = block->block_size / config->source_data_size - 1; in dma_silabs_block_to_descriptor()
129 return -ENOTSUP; in dma_silabs_block_to_descriptor()
132 desc->xfer.xferCnt = xfer_count; in dma_silabs_block_to_descriptor()
134 /* Warning : High LDMA blockSize (high burst) mean a large transfer in dma_silabs_block_to_descriptor()
135 * without LDMA controller re-arbitration. in dma_silabs_block_to_descriptor()
137 ret = dma_silabs_get_blocksize(config->source_burst_length, config->dest_burst_length, in dma_silabs_block_to_descriptor()
138 config->source_data_size); in dma_silabs_block_to_descriptor()
143 desc->xfer.blockSize = ret; in dma_silabs_block_to_descriptor()
148 desc->xfer.doneIfs = config->complete_callback_en; in dma_silabs_block_to_descriptor()
149 desc->xfer.reqMode = ldmaCtrlReqModeAll; in dma_silabs_block_to_descriptor()
150 desc->xfer.ignoreSrec = block->flow_control_mode; in dma_silabs_block_to_descriptor()
158 if (block->source_addr_adj != DMA_ADDR_ADJ_NO_CHANGE && in dma_silabs_block_to_descriptor()
159 block->source_addr_adj != chan_conf->xfer_config.ldmaCfgSrcIncSign) { in dma_silabs_block_to_descriptor()
160 return -ENOTSUP; in dma_silabs_block_to_descriptor()
163 if (block->source_addr_adj == DMA_ADDR_ADJ_NO_CHANGE) { in dma_silabs_block_to_descriptor()
164 desc->xfer.srcInc = ldmaCtrlSrcIncNone; in dma_silabs_block_to_descriptor()
166 desc->xfer.srcInc = ldmaCtrlSrcIncOne; in dma_silabs_block_to_descriptor()
169 if (block->dest_addr_adj == DMA_ADDR_ADJ_NO_CHANGE) { in dma_silabs_block_to_descriptor()
170 desc->xfer.dstInc = ldmaCtrlDstIncNone; in dma_silabs_block_to_descriptor()
172 desc->xfer.dstInc = ldmaCtrlDstIncOne; in dma_silabs_block_to_descriptor()
175 desc->xfer.srcAddrMode = ldmaCtrlSrcAddrModeAbs; in dma_silabs_block_to_descriptor()
176 desc->xfer.dstAddrMode = ldmaCtrlDstAddrModeAbs; in dma_silabs_block_to_descriptor()
178 if (block->source_address == 0) { in dma_silabs_block_to_descriptor()
181 if (block->dest_address == 0) { in dma_silabs_block_to_descriptor()
185 desc->xfer.srcAddr = block->source_address; in dma_silabs_block_to_descriptor()
186 desc->xfer.dstAddr = block->dest_address; in dma_silabs_block_to_descriptor()
198 next_desc = LDMA_DESCRIPTOR_LINKABS_LINKADDR_TO_ADDR(desc->xfer.linkAddr); in dma_silabs_release_descriptor()
199 ret = sys_mem_blocks_free(data->dma_desc_pool, 1, (void **)&desc); in dma_silabs_release_descriptor()
216 struct dma_block_config *head_block = config->head_block; in dma_silabs_configure_descriptor()
217 struct dma_block_config *block = config->head_block; in dma_silabs_configure_descriptor()
228 ret = sys_mem_blocks_alloc(data->dma_desc_pool, 1, (void **)&desc); in dma_silabs_configure_descriptor()
239 chan_conf->desc = desc; in dma_silabs_configure_descriptor()
241 prev_desc->xfer.linkAddr = LDMA_DESCRIPTOR_LINKABS_ADDR_TO_LINKADDR(desc); in dma_silabs_configure_descriptor()
242 prev_desc->xfer.linkMode = ldmaLinkModeAbs; in dma_silabs_configure_descriptor()
243 prev_desc->xfer.link = 1; in dma_silabs_configure_descriptor()
247 block = block->next_block; in dma_silabs_configure_descriptor()
250 prev_desc->xfer.linkAddr = in dma_silabs_configure_descriptor()
251 LDMA_DESCRIPTOR_LINKABS_ADDR_TO_LINKADDR(chan_conf->desc); in dma_silabs_configure_descriptor()
252 prev_desc->xfer.linkMode = ldmaLinkModeAbs; in dma_silabs_configure_descriptor()
253 prev_desc->xfer.link = 1; in dma_silabs_configure_descriptor()
260 (void)dma_silabs_release_descriptor(data, chan_conf->desc); in dma_silabs_configure_descriptor()
268 const struct dma_silabs_data *data = dev->data; in dma_silabs_irq_handler()
275 for (chnum = 0; chnum < data->dma_ctx.dma_channels; chnum++) { in dma_silabs_irq_handler()
276 chan = &data->dma_chan_table[chnum]; in dma_silabs_irq_handler()
280 if (chan->cb) { in dma_silabs_irq_handler()
281 chan->cb(dev, chan->user_data, chnum, -EIO); in dma_silabs_irq_handler()
289 if (chan->complete_callback_en) { in dma_silabs_irq_handler()
292 atomic_clear(&chan->busy); in dma_silabs_irq_handler()
295 if (chan->cb) { in dma_silabs_irq_handler()
296 chan->cb(dev, chan->user_data, chnum, status); in dma_silabs_irq_handler()
305 struct dma_silabs_data *data = dev->data; in dma_silabs_configure()
306 struct dma_silabs_channel *chan_conf = &data->dma_chan_table[channel]; in dma_silabs_configure()
307 LDMA_TransferCfg_t *xfer_config = &chan_conf->xfer_config; in dma_silabs_configure()
310 if (channel > data->dma_ctx.dma_channels) { in dma_silabs_configure()
311 return -EINVAL; in dma_silabs_configure()
315 return -EINVAL; in dma_silabs_configure()
318 if (atomic_get(&chan_conf->busy)) { in dma_silabs_configure()
320 return -EBUSY; in dma_silabs_configure()
324 ret = dma_silabs_release_descriptor(data, chan_conf->desc); in dma_silabs_configure()
329 if (config->dest_data_size != config->source_data_size) { in dma_silabs_configure()
331 return -ENOTSUP; in dma_silabs_configure()
334 if (config->source_handshake || config->dest_handshake || config->source_chaining_en || in dma_silabs_configure()
335 config->dest_chaining_en || config->linked_channel) { in dma_silabs_configure()
336 return -ENOTSUP; in dma_silabs_configure()
341 chan_conf->user_data = config->user_data; in dma_silabs_configure()
342 chan_conf->cb = config->dma_callback; in dma_silabs_configure()
343 chan_conf->dir = config->channel_direction; in dma_silabs_configure()
344 chan_conf->complete_callback_en = config->complete_callback_en; in dma_silabs_configure()
348 switch (config->channel_direction) { in dma_silabs_configure()
353 xfer_config->ldmaReqSel = config->dma_slot; in dma_silabs_configure()
359 return -ENOTSUP; in dma_silabs_configure()
363 if (config->channel_priority < ldmaCfgArbSlotsAs1 || in dma_silabs_configure()
364 config->channel_priority > ldmaCfgArbSlotsAs8) { in dma_silabs_configure()
365 return -EINVAL; in dma_silabs_configure()
367 xfer_config->ldmaCfgArbSlots = config->channel_priority; in dma_silabs_configure()
369 switch (config->head_block->source_addr_adj) { in dma_silabs_configure()
371 xfer_config->ldmaCfgSrcIncSign = ldmaCfgSrcIncSignPos; in dma_silabs_configure()
374 xfer_config->ldmaCfgSrcIncSign = ldmaCfgSrcIncSignNeg; in dma_silabs_configure()
377 xfer_config->ldmaCfgSrcIncSign = ldmaCfgSrcIncSignPos; in dma_silabs_configure()
380 LOG_ERR("Addr Adjustement error %d", config->head_block->source_addr_adj); in dma_silabs_configure()
384 switch (config->head_block->dest_addr_adj) { in dma_silabs_configure()
386 xfer_config->ldmaCfgDstIncSign = ldmaCfgDstIncSignPos; in dma_silabs_configure()
389 xfer_config->ldmaCfgDstIncSign = ldmaCfgDstIncSignNeg; in dma_silabs_configure()
392 xfer_config->ldmaCfgDstIncSign = ldmaCfgDstIncSignPos; in dma_silabs_configure()
403 atomic_set_bit(data->dma_ctx.atomic, channel); in dma_silabs_configure()
411 const struct dma_silabs_data *data = dev->data; in dma_silabs_start()
412 struct dma_silabs_channel *chan = &data->dma_chan_table[channel]; in dma_silabs_start()
414 if (channel > data->dma_ctx.dma_channels) { in dma_silabs_start()
415 return -EINVAL; in dma_silabs_start()
418 atomic_inc(&chan->busy); in dma_silabs_start()
420 LDMA_StartTransfer(channel, &chan->xfer_config, chan->desc); in dma_silabs_start()
427 const struct dma_silabs_data *data = dev->data; in dma_silabs_stop()
428 struct dma_silabs_channel *chan = &data->dma_chan_table[channel]; in dma_silabs_stop()
430 if (channel > data->dma_ctx.dma_channels) { in dma_silabs_stop()
431 return -EINVAL; in dma_silabs_stop()
436 atomic_clear(&chan->busy); in dma_silabs_stop()
446 const struct dma_silabs_data *data = dev->data; in dma_silabs_get_status()
448 if (channel > data->dma_ctx.dma_channels) { in dma_silabs_get_status()
449 return -EINVAL; in dma_silabs_get_status()
452 if (!atomic_test_bit(data->dma_ctx.atomic, channel)) { in dma_silabs_get_status()
453 return -EINVAL; in dma_silabs_get_status()
456 status->busy = data->dma_chan_table[channel].busy; in dma_silabs_get_status()
457 status->dir = data->dma_chan_table[channel].dir; in dma_silabs_get_status()
464 const struct dma_silabs_config *config = dev->config; in dma_silabs_init()
476 config->config_irq(dev); in dma_silabs_init()