Skip to content

Commit d14dd4d

Browse files
committed
[nrf fromlist] drivers: nordic: Adapt drivers to changes in DMM API
dmm_buffer_out_release and dmm_buffer_in_release now have one additional argument which is the allocated length. Length need to be know to correctly free the buffer as internal heap allocator cannot determine the size of the buffer just based on the address of the buffer. Allocated length may be different then valid data length in the buffer thus dmm_buffer_in_release requires additional argument, too. Upstream PR #: 95306 Signed-off-by: Krzysztof Chruściński <[email protected]>
1 parent 83a9995 commit d14dd4d

File tree

6 files changed

+36
-30
lines changed

6 files changed

+36
-30
lines changed

drivers/adc/adc_nrfx_saadc.c

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -611,6 +611,7 @@ static int start_read(const struct device *dev,
611611
uint8_t active_channel_cnt = 0U;
612612
uint8_t channel_id = 0U;
613613
void *samples_buffer;
614+
size_t samples;
614615

615616
/* Signal an error if channel selection is invalid (no channels or
616617
* a non-existing one is selected).
@@ -681,12 +682,11 @@ static int start_read(const struct device *dev,
681682

682683
m_data.active_channel_cnt = active_channel_cnt;
683684
m_data.user_buffer = sequence->buffer;
685+
samples = m_data.internal_timer_enabled ?
686+
(1 + sequence->options->extra_samplings) : active_channel_cnt;
684687

685688
error = dmm_buffer_in_prepare(
686-
m_data.mem_reg, m_data.user_buffer,
687-
(m_data.internal_timer_enabled
688-
? NRFX_SAADC_SAMPLES_TO_BYTES(1 + sequence->options->extra_samplings)
689-
: NRFX_SAADC_SAMPLES_TO_BYTES(active_channel_cnt)),
689+
m_data.mem_reg, m_data.user_buffer, NRFX_SAADC_SAMPLES_TO_BYTES(samples),
690690
&samples_buffer);
691691
if (error != 0) {
692692
LOG_ERR("DMM buffer allocation failed err=%d", error);
@@ -696,11 +696,7 @@ static int start_read(const struct device *dev,
696696
/* Buffer is filled in chunks, each chunk composed of number of samples equal to number
697697
* of active channels. Buffer pointer is advanced and reloaded after each chunk.
698698
*/
699-
nrfx_err = nrfx_saadc_buffer_set(
700-
samples_buffer,
701-
(m_data.internal_timer_enabled
702-
? (1 + sequence->options->extra_samplings)
703-
: active_channel_cnt));
699+
nrfx_err = nrfx_saadc_buffer_set(samples_buffer, samples);
704700
if (nrfx_err != NRFX_SUCCESS) {
705701
LOG_ERR("Failed to set buffer: 0x%08x", nrfx_err);
706702
return -EINVAL;
@@ -745,13 +741,13 @@ static void event_handler(const nrfx_saadc_evt_t *event)
745741
nrfx_err_t err;
746742

747743
if (event->type == NRFX_SAADC_EVT_DONE) {
748-
dmm_buffer_in_release(
749-
m_data.mem_reg, m_data.user_buffer,
750-
(m_data.internal_timer_enabled
744+
size_t len = m_data.internal_timer_enabled
751745
? NRFX_SAADC_SAMPLES_TO_BYTES(
752746
1 + m_data.ctx.sequence.options->extra_samplings)
753-
: NRFX_SAADC_SAMPLES_TO_BYTES(m_data.active_channel_cnt)),
754-
event->data.done.p_buffer);
747+
: NRFX_SAADC_SAMPLES_TO_BYTES(m_data.active_channel_cnt);
748+
749+
dmm_buffer_in_release(
750+
m_data.mem_reg, m_data.user_buffer, len, event->data.done.p_buffer, len);
755751

756752
if (has_single_ended(&m_data.ctx.sequence)) {
757753
correct_single_ended(&m_data.ctx.sequence, m_data.user_buffer,

drivers/audio/dmic_nrfx_pdm.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,8 @@ static void event_handler(const struct device *dev, const nrfx_pdm_evt_t *evt)
145145
return;
146146
}
147147
ret = dmm_buffer_in_release(drv_cfg->mem_reg, mem_slab_buffer,
148-
drv_data->block_size, evt->buffer_released);
148+
drv_data->block_size, evt->buffer_released,
149+
drv_data->block_size);
149150
if (ret < 0) {
150151
LOG_ERR("Failed to release buffer: %d", ret);
151152
return;
@@ -169,7 +170,8 @@ static void event_handler(const struct device *dev, const nrfx_pdm_evt_t *evt)
169170
return;
170171
}
171172
ret = dmm_buffer_in_release(drv_cfg->mem_reg, mem_slab_buffer,
172-
drv_data->block_size, evt->buffer_released);
173+
drv_data->block_size, evt->buffer_released,
174+
drv_data->block_size);
173175
if (ret < 0) {
174176
LOG_ERR("Failed to release buffer: %d", ret);
175177
stop_pdm(drv_data);

drivers/i2s/i2s_nrf_tdm.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -301,7 +301,7 @@ static void free_tx_buffer(struct tdm_drv_data *drv_data, struct tdm_buf *buf)
301301
{
302302
const struct tdm_drv_cfg *drv_cfg = drv_data->drv_cfg;
303303

304-
(void)dmm_buffer_out_release(drv_cfg->mem_reg, buf->dmm_buf);
304+
(void)dmm_buffer_out_release(drv_cfg->mem_reg, buf->dmm_buf, buf->size);
305305
k_mem_slab_free(drv_data->tx.cfg.mem_slab, buf->mem_block);
306306
LOG_DBG("Freed TX %p", buf->mem_block);
307307
}
@@ -310,7 +310,8 @@ static void free_rx_buffer(struct tdm_drv_data *drv_data, struct tdm_buf *buf)
310310
{
311311
const struct tdm_drv_cfg *drv_cfg = drv_data->drv_cfg;
312312

313-
(void)dmm_buffer_in_release(drv_cfg->mem_reg, buf->mem_block, buf->size, buf->dmm_buf);
313+
(void)dmm_buffer_in_release(drv_cfg->mem_reg, buf->mem_block, buf->size, buf->dmm_buf,
314+
buf->size);
314315
k_mem_slab_free(drv_data->rx.cfg.mem_slab, buf->mem_block);
315316
LOG_DBG("Freed RX %p", buf->mem_block);
316317
}
@@ -641,7 +642,8 @@ static int tdm_nrf_read(const struct device *dev, void **mem_block, size_t *size
641642
LOG_DBG("Released RX %p", buf.mem_block);
642643

643644
if (ret == 0) {
644-
(void)dmm_buffer_in_release(drv_cfg->mem_reg, buf.mem_block, buf.size, buf.dmm_buf);
645+
(void)dmm_buffer_in_release(drv_cfg->mem_reg, buf.mem_block, buf.size, buf.dmm_buf,
646+
buf.size);
645647
*mem_block = buf.mem_block;
646648
*size = buf.size;
647649
}

drivers/serial/uart_nrfx_uarte.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2404,7 +2404,8 @@ static void endrx_isr(const struct device *dev)
24042404
#ifdef CONFIG_HAS_NORDIC_DMM
24052405
const struct uarte_nrfx_config *config = dev->config;
24062406
int err =
2407-
dmm_buffer_in_release(config->mem_reg, async_rx->usr_buf, rx_amount, async_rx->buf);
2407+
dmm_buffer_in_release(config->mem_reg, async_rx->usr_buf, rx_amount,
2408+
async_rx->buf, async_rx->buf_len);
24082409

24092410
(void)err;
24102411
__ASSERT_NO_MSG(err == 0);
@@ -2554,7 +2555,8 @@ static void rxto_isr(const struct device *dev)
25542555

25552556
if (async_rx->buf) {
25562557
#ifdef CONFIG_HAS_NORDIC_DMM
2557-
(void)dmm_buffer_in_release(config->mem_reg, async_rx->usr_buf, 0, async_rx->buf);
2558+
(void)dmm_buffer_in_release(config->mem_reg, async_rx->usr_buf, 0, async_rx->buf,
2559+
async_rx->buf_len);
25582560
async_rx->buf = async_rx->usr_buf;
25592561
#endif
25602562
rx_buf_release(dev, async_rx->buf);
@@ -2789,7 +2791,7 @@ static void uarte_nrfx_isr_async(const void *arg)
27892791
int ret;
27902792

27912793
ret = dmm_buffer_in_release(config->mem_reg, async_rx->usr_buf, async_rx->buf_len,
2792-
async_rx->buf);
2794+
async_rx->buf, async_rx->buf_len);
27932795

27942796
(void)ret;
27952797
__ASSERT_NO_MSG(ret == 0);

drivers/spi/spi_nrfx_spim.c

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -558,9 +558,10 @@ static void transfer_next_chunk(const struct device *dev)
558558

559559
/* On nrfx_spim_xfer() error */
560560
dmm_buffer_in_release(dev_config->mem_reg, rx_buf, xfer.rx_length,
561-
(void **)&xfer.p_rx_buffer);
561+
(void **)&xfer.p_rx_buffer, xfer.rx_length);
562562
in_alloc_failed:
563-
dmm_buffer_out_release(dev_config->mem_reg, (void **)&xfer.p_tx_buffer);
563+
dmm_buffer_out_release(dev_config->mem_reg, (void **)&xfer.p_tx_buffer,
564+
xfer.tx_length);
564565
}
565566

566567
out_alloc_failed:
@@ -588,12 +589,14 @@ static void event_handler(const nrfx_spim_evt_t *p_event, void *p_context)
588589

589590
if (spi_context_tx_buf_on(&dev_data->ctx)) {
590591
dmm_buffer_out_release(dev_config->mem_reg,
591-
(void **)p_event->xfer_desc.p_tx_buffer);
592+
(void **)p_event->xfer_desc.p_tx_buffer,
593+
dev_data->chunk_len);
592594
}
593595

594596
if (spi_context_rx_buf_on(&dev_data->ctx)) {
595597
dmm_buffer_in_release(dev_config->mem_reg, dev_data->ctx.rx_buf,
596-
dev_data->chunk_len, p_event->xfer_desc.p_rx_buffer);
598+
dev_data->chunk_len, p_event->xfer_desc.p_rx_buffer,
599+
dev_data->chunk_len);
597600
}
598601

599602
#ifdef SPI_BUFFER_IN_RAM

drivers/spi/spi_nrfx_spis.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -243,9 +243,9 @@ static int prepare_for_transfer(const struct device *dev,
243243
return 0;
244244

245245
buffers_set_failed:
246-
dmm_buffer_in_release(dev_config->mem_reg, rx_buf, rx_buf_len, dmm_rx_buf);
246+
dmm_buffer_in_release(dev_config->mem_reg, rx_buf, rx_buf_len, dmm_rx_buf, rx_buf_len);
247247
in_alloc_failed:
248-
dmm_buffer_out_release(dev_config->mem_reg, (void *)dmm_tx_buf);
248+
dmm_buffer_out_release(dev_config->mem_reg, (void *)dmm_tx_buf, tx_buf_len);
249249
out_alloc_failed:
250250
return err;
251251
}
@@ -418,12 +418,13 @@ static void event_handler(const nrfx_spis_evt_t *p_event, void *p_context)
418418
int err;
419419

420420

421-
err = dmm_buffer_out_release(dev_config->mem_reg, p_event->p_tx_buf);
421+
err = dmm_buffer_out_release(dev_config->mem_reg, p_event->p_tx_buf,
422+
p_event->tx_buf_size);
422423
(void)err;
423424
__ASSERT_NO_MSG(err == 0);
424425

425426
err = dmm_buffer_in_release(dev_config->mem_reg, dev_data->ctx.rx_buf,
426-
p_event->rx_amount, p_event->p_rx_buf);
427+
p_event->rx_amount, p_event->p_rx_buf, p_event->rx_buf_size);
427428
__ASSERT_NO_MSG(err == 0);
428429

429430
spi_context_complete(&dev_data->ctx, dev_data->dev,

0 commit comments

Comments
 (0)