drivers: dma: siwx91x: DMA reload bug fix

Current DMA driver reload function only works for 8-bit
data. This is due to incorrect interpretation of size
argument. Added changes to support other xfer sizes.

Signed-off-by: Sai Santhosh Malae <Santhosh.Malae@silabs.com>
This commit is contained in:
Sai Santhosh Malae 2025-05-08 21:13:30 +05:30 committed by Anas Nashif
commit 5572e49bc9

View file

@ -420,10 +420,11 @@ static int siwx91x_dma_reload(const struct device *dev, uint32_t channel, uint32
const struct dma_siwx91x_config *cfg = dev->config; const struct dma_siwx91x_config *cfg = dev->config;
struct dma_siwx91x_data *data = dev->data; struct dma_siwx91x_data *data = dev->data;
void *udma_handle = &data->udma_handle; void *udma_handle = &data->udma_handle;
uint32_t desc_src_addr; void *desc_src_addr;
uint32_t desc_dst_addr; void *desc_dst_addr;
uint32_t length; uint32_t length;
RSI_UDMA_DESC_T *udma_table = cfg->sram_desc_addr; RSI_UDMA_DESC_T *udma_table = cfg->sram_desc_addr;
uint8_t xfer_size = 1 << udma_table[channel].vsUDMAChaConfigData1.srcSize;
/* Expecting a fixed channel number between 0-31 for dma0 and 0-11 for ulpdma */ /* Expecting a fixed channel number between 0-31 for dma0 and 0-11 for ulpdma */
if (channel >= data->dma_ctx.dma_channels) { if (channel >= data->dma_ctx.dma_channels) {
@ -438,31 +439,32 @@ static int siwx91x_dma_reload(const struct device *dev, uint32_t channel, uint32
/* Update new channel info to dev->data structure */ /* Update new channel info to dev->data structure */
data->chan_info[channel].SrcAddr = src; data->chan_info[channel].SrcAddr = src;
data->chan_info[channel].DestAddr = dst; data->chan_info[channel].DestAddr = dst;
data->chan_info[channel].Size = size; data->chan_info[channel].Size = size / xfer_size;
/* Update new transfer size to dev->data structure */ /* Update new transfer size to dev->data structure */
if (size >= DMA_MAX_TRANSFER_COUNT) { if (data->chan_info[channel].Size >= DMA_MAX_TRANSFER_COUNT) {
data->chan_info[channel].Cnt = DMA_MAX_TRANSFER_COUNT - 1; data->chan_info[channel].Cnt = DMA_MAX_TRANSFER_COUNT;
} else { } else {
data->chan_info[channel].Cnt = size; data->chan_info[channel].Cnt = size / xfer_size;
} }
/* Program the DMA descriptors with new transfer data information. */ /* Program the DMA descriptors with new transfer data information. */
if (udma_table[channel].vsUDMAChaConfigData1.srcInc != UDMA_SRC_INC_NONE) { if (udma_table[channel].vsUDMAChaConfigData1.srcInc != UDMA_SRC_INC_NONE) {
length = data->chan_info[channel].Cnt length = data->chan_info[channel].Cnt
<< udma_table[channel].vsUDMAChaConfigData1.srcInc; << udma_table[channel].vsUDMAChaConfigData1.srcInc;
desc_src_addr = src + (length - 1); desc_src_addr = (void *)(src + length - 1);
udma_table[channel].pSrcEndAddr = (void *)desc_src_addr; udma_table[channel].pSrcEndAddr = desc_src_addr;
} }
if (udma_table[channel].vsUDMAChaConfigData1.dstInc != UDMA_SRC_INC_NONE) { if (udma_table[channel].vsUDMAChaConfigData1.dstInc != UDMA_SRC_INC_NONE) {
length = data->chan_info[channel].Cnt length = data->chan_info[channel].Cnt
<< udma_table[channel].vsUDMAChaConfigData1.dstInc; << udma_table[channel].vsUDMAChaConfigData1.dstInc;
desc_dst_addr = dst + (length - 1); desc_dst_addr = (void *)(dst + length - 1);
udma_table[channel].pDstEndAddr = (void *)desc_dst_addr; udma_table[channel].pDstEndAddr = desc_dst_addr;
} }
udma_table[channel].vsUDMAChaConfigData1.totalNumOfDMATrans = data->chan_info[channel].Cnt; udma_table[channel].vsUDMAChaConfigData1.totalNumOfDMATrans =
data->chan_info[channel].Cnt - 1;
udma_table[channel].vsUDMAChaConfigData1.transferType = UDMA_MODE_BASIC; udma_table[channel].vsUDMAChaConfigData1.transferType = UDMA_MODE_BASIC;
return 0; return 0;