Skip to content

Commit 14afce1

Browse files
committed
dma: dma_sg: allocate on specific heap
Add a heap parameter to DMA scatter-gather allocation interface. This makes it possible to control how allocations are done for the DMA buffers. Signed-off-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
1 parent 3db6d48 commit 14afce1

11 files changed

Lines changed: 39 additions & 32 deletions

File tree

posix/include/sof/lib/dma.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535

3636
struct comp_buffer;
3737
struct comp_dev;
38+
struct k_heap;
3839

3940
/** \addtogroup sof_dma_drivers DMA Drivers
4041
* DMA Drivers API specification.
@@ -511,13 +512,14 @@ static inline void dma_sg_init(struct dma_sg_elem_array *ea)
511512
ea->elems = NULL;
512513
}
513514

514-
int dma_sg_alloc(struct dma_sg_elem_array *ea,
515+
int dma_sg_alloc(struct k_heap *heap,
516+
struct dma_sg_elem_array *ea,
515517
uint32_t flags,
516518
uint32_t direction,
517519
uint32_t buffer_count, uint32_t buffer_bytes,
518520
uintptr_t dma_buffer_addr, uintptr_t external_addr);
519521

520-
void dma_sg_free(struct dma_sg_elem_array *ea);
522+
void dma_sg_free(struct k_heap *heap, struct dma_sg_elem_array *ea);
521523

522524
/**
523525
* \brief Get the total size of SG buffer

src/audio/dai-legacy.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -379,7 +379,7 @@ static int dai_playback_params(struct comp_dev *dev, uint32_t period_bytes,
379379

380380
comp_info(dev, "fifo 0x%x", fifo);
381381

382-
err = dma_sg_alloc(&config->elem_array, SOF_MEM_FLAG_USER,
382+
err = dma_sg_alloc(NULL, &config->elem_array, SOF_MEM_FLAG_USER,
383383
config->direction,
384384
period_count,
385385
period_bytes,
@@ -444,7 +444,7 @@ static int dai_capture_params(struct comp_dev *dev, uint32_t period_bytes,
444444

445445
comp_info(dev, "fifo 0x%x", fifo);
446446

447-
err = dma_sg_alloc(&config->elem_array, SOF_MEM_FLAG_USER,
447+
err = dma_sg_alloc(NULL, &config->elem_array, SOF_MEM_FLAG_USER,
448448
config->direction,
449449
period_count,
450450
period_bytes,
@@ -709,7 +709,7 @@ void dai_common_reset(struct dai_data *dd, struct comp_dev *dev)
709709
if (!dd->delayed_dma_stop)
710710
dai_dma_release(dd, dev);
711711

712-
dma_sg_free(&config->elem_array);
712+
dma_sg_free(NULL, &config->elem_array);
713713

714714
if (dd->dma_buffer) {
715715
buffer_free(dd->dma_buffer);

src/audio/dai-zephyr.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -843,7 +843,7 @@ static int dai_set_sg_config(struct dai_data *dd, struct comp_dev *dev, uint32_t
843843
} while (--max_block_count > 0);
844844
}
845845

846-
err = dma_sg_alloc(&config->elem_array, SOF_MEM_FLAG_USER,
846+
err = dma_sg_alloc(NULL, &config->elem_array, SOF_MEM_FLAG_USER,
847847
config->direction,
848848
period_count,
849849
period_bytes,
@@ -1124,7 +1124,7 @@ int dai_common_params(struct dai_data *dd, struct comp_dev *dev,
11241124
if (err < 0) {
11251125
buffer_free(dd->dma_buffer);
11261126
dd->dma_buffer = NULL;
1127-
dma_sg_free(&config->elem_array);
1127+
dma_sg_free(NULL, &config->elem_array);
11281128
rfree(dd->z_config);
11291129
dd->z_config = NULL;
11301130
}
@@ -1255,7 +1255,7 @@ void dai_common_reset(struct dai_data *dd, struct comp_dev *dev)
12551255
if (!dd->delayed_dma_stop)
12561256
dai_dma_release(dd, dev);
12571257

1258-
dma_sg_free(&config->elem_array);
1258+
dma_sg_free(NULL, &config->elem_array);
12591259
if (dd->z_config) {
12601260
rfree(dd->z_config->head_block);
12611261
rfree(dd->z_config);

src/audio/host-legacy.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -445,7 +445,7 @@ static int create_local_elems(struct host_data *hd, struct comp_dev *dev, uint32
445445
elem_array = &hd->local.elem_array;
446446

447447
/* config buffer will be used as proxy */
448-
err = dma_sg_alloc(&hd->config.elem_array, SOF_MEM_FLAG_USER,
448+
err = dma_sg_alloc(NULL, &hd->config.elem_array, SOF_MEM_FLAG_USER,
449449
dir, 1, 0, 0, 0);
450450
if (err < 0) {
451451
comp_err(dev, "dma_sg_alloc() failed");
@@ -455,7 +455,7 @@ static int create_local_elems(struct host_data *hd, struct comp_dev *dev, uint32
455455
elem_array = &hd->config.elem_array;
456456
}
457457

458-
err = dma_sg_alloc(elem_array, SOF_MEM_FLAG_USER, dir, buffer_count,
458+
err = dma_sg_alloc(NULL, elem_array, SOF_MEM_FLAG_USER, dir, buffer_count,
459459
buffer_bytes,
460460
(uintptr_t)(audio_stream_get_addr(&hd->dma_buffer->stream)), 0);
461461
if (err < 0) {
@@ -615,7 +615,7 @@ void host_common_free(struct host_data *hd)
615615
dma_put(hd->dma);
616616

617617
ipc_msg_free(hd->msg);
618-
dma_sg_free(&hd->config.elem_array);
618+
dma_sg_free(NULL, &hd->config.elem_array);
619619
}
620620

621621
static void host_free(struct comp_dev *dev)
@@ -937,9 +937,9 @@ void host_common_reset(struct host_data *hd, uint16_t state)
937937
}
938938

939939
/* free all DMA elements */
940-
dma_sg_free(&hd->host.elem_array);
941-
dma_sg_free(&hd->local.elem_array);
942-
dma_sg_free(&hd->config.elem_array);
940+
dma_sg_free(NULL, &hd->host.elem_array);
941+
dma_sg_free(NULL, &hd->local.elem_array);
942+
dma_sg_free(NULL, &hd->config.elem_array);
943943

944944
/* It's safe that cleaning out `hd->config` after `dma_sg_free` for config.elem_array */
945945
memset(&hd->config, 0, sizeof(hd->config));

src/audio/host-zephyr.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -610,7 +610,7 @@ static int create_local_elems(struct host_data *hd, struct comp_dev *dev,
610610
elem_array = &hd->local.elem_array;
611611

612612
/* config buffer will be used as proxy */
613-
err = dma_sg_alloc(&hd->config.elem_array, SOF_MEM_FLAG_USER,
613+
err = dma_sg_alloc(NULL, &hd->config.elem_array, SOF_MEM_FLAG_USER,
614614
dir, 1, 0, 0, 0);
615615
if (err < 0) {
616616
comp_err(dev, "dma_sg_alloc() failed");
@@ -620,7 +620,7 @@ static int create_local_elems(struct host_data *hd, struct comp_dev *dev,
620620
elem_array = &hd->config.elem_array;
621621
}
622622

623-
err = dma_sg_alloc(elem_array, SOF_MEM_FLAG_USER, dir, buffer_count,
623+
err = dma_sg_alloc(NULL, elem_array, SOF_MEM_FLAG_USER, dir, buffer_count,
624624
buffer_bytes,
625625
(uintptr_t)audio_stream_get_addr(&hd->dma_buffer->stream), 0);
626626
if (err < 0) {
@@ -787,7 +787,7 @@ __cold void host_common_free(struct host_data *hd)
787787
sof_dma_put(hd->dma);
788788

789789
ipc_msg_free(hd->msg);
790-
dma_sg_free(&hd->config.elem_array);
790+
dma_sg_free(NULL, &hd->config.elem_array);
791791
}
792792

793793
__cold static void host_free(struct comp_dev *dev)
@@ -1177,9 +1177,9 @@ void host_common_reset(struct host_data *hd, uint16_t state)
11771177
}
11781178

11791179
/* free all DMA elements */
1180-
dma_sg_free(&hd->host.elem_array);
1181-
dma_sg_free(&hd->local.elem_array);
1182-
dma_sg_free(&hd->config.elem_array);
1180+
dma_sg_free(NULL, &hd->host.elem_array);
1181+
dma_sg_free(NULL, &hd->local.elem_array);
1182+
dma_sg_free(NULL, &hd->config.elem_array);
11831183

11841184
/* free DMA buffer */
11851185
if (hd->dma_buffer) {

src/ipc/ipc3/handler.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -878,7 +878,7 @@ static int ipc_dma_trace_config(uint32_t header)
878878

879879
error:
880880
#if CONFIG_HOST_PTABLE
881-
dma_sg_free(&elem_array);
881+
dma_sg_free(NULL, &elem_array);
882882

883883
processing_error:
884884
#endif

src/ipc/ipc3/host-page-table.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,6 @@ int ipc_process_host_buffer(struct ipc *ipc,
239239

240240
return 0;
241241
error:
242-
dma_sg_free(elem_array);
242+
dma_sg_free(NULL, elem_array);
243243
return err;
244244
}

src/lib/dma.c

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -285,19 +285,22 @@ void dma_put(struct dma *dma)
285285
}
286286
#endif
287287

288-
int dma_sg_alloc(struct dma_sg_elem_array *elem_array,
288+
int dma_sg_alloc(struct k_heap *heap,
289+
struct dma_sg_elem_array *elem_array,
289290
uint32_t flags,
290291
uint32_t direction,
291292
uint32_t buffer_count, uint32_t buffer_bytes,
292293
uintptr_t dma_buffer_addr, uintptr_t external_addr)
293294
{
294295
int i;
295296

296-
elem_array->elems = rzalloc(SOF_MEM_FLAG_USER,
297-
sizeof(struct dma_sg_elem) * buffer_count);
297+
elem_array->elems = sof_heap_alloc(heap, SOF_MEM_FLAG_USER,
298+
sizeof(struct dma_sg_elem) * buffer_count, 0);
298299
if (!elem_array->elems)
299300
return -ENOMEM;
300301

302+
memset(elem_array->elems, 0, sizeof(struct dma_sg_elem) * buffer_count);
303+
301304
for (i = 0; i < buffer_count; i++) {
302305
elem_array->elems[i].size = buffer_bytes;
303306
// TODO: may count offsets once
@@ -319,9 +322,9 @@ int dma_sg_alloc(struct dma_sg_elem_array *elem_array,
319322
return 0;
320323
}
321324

322-
void dma_sg_free(struct dma_sg_elem_array *elem_array)
325+
void dma_sg_free(struct k_heap *heap, struct dma_sg_elem_array *elem_array)
323326
{
324-
rfree(elem_array->elems);
327+
sof_heap_free(heap, elem_array->elems);
325328
dma_sg_init(elem_array);
326329
}
327330

src/probe/probe.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ static int probe_dma_init(struct probe_dma_ext *dma, uint32_t direction)
175175
dma->config.dest_width = sizeof(uint32_t);
176176
dma->config.cyclic = 0;
177177

178-
err = dma_sg_alloc(&dma->config.elem_array, SOF_MEM_FLAG_USER,
178+
err = dma_sg_alloc(NULL, &dma->config.elem_array, SOF_MEM_FLAG_USER,
179179
dma->config.direction, elem_num, elem_size, elem_addr, 0);
180180
if (err < 0)
181181
return err;
@@ -254,7 +254,7 @@ static int probe_dma_init(struct probe_dma_ext *dma, uint32_t direction)
254254
static int probe_dma_deinit(struct probe_dma_ext *dma)
255255
{
256256
int err = 0;
257-
dma_sg_free(&dma->config.elem_array);
257+
dma_sg_free(NULL, &dma->config.elem_array);
258258
#if CONFIG_ZEPHYR_NATIVE_DRIVERS
259259
err = dma_stop(dma->dc.dmac->z_dev, dma->dc.chan->index);
260260
#else

src/trace/dma-trace.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -407,7 +407,7 @@ void dma_trace_disable(struct dma_trace_data *d)
407407
#if (CONFIG_HOST_PTABLE)
408408
/* Free up the host SG if it is set */
409409
if (d->host_size) {
410-
dma_sg_free(&d->config.elem_array);
410+
dma_sg_free(NULL, &d->config.elem_array);
411411
d->host_size = 0;
412412
}
413413
#endif

0 commit comments

Comments
 (0)