On Tue, 17 Dec 2019 10:58:49 +0100, Cezary Rojewski wrote: > > Add simple malloc and free methods for memory management for compress > streams. Based on snd_pcm_lib_malloc_pages and snd_pcm_lib_free_pages > implementation. I see no user of these functions in the series. How these are supposed to be used? Takashi > > Signed-off-by: Cezary Rojewski <cezary.rojewski@xxxxxxxxx> > Signed-off-by: Divya Prakash <divya1.prakash@xxxxxxxxx> > --- > include/sound/compress_driver.h | 5 ++++ > sound/core/compress_offload.c | 42 +++++++++++++++++++++++++++++++++ > 2 files changed, 47 insertions(+) > > diff --git a/include/sound/compress_driver.h b/include/sound/compress_driver.h > index 00f633c0c3ba..6ce8effa0b12 100644 > --- a/include/sound/compress_driver.h > +++ b/include/sound/compress_driver.h > @@ -67,6 +67,7 @@ struct snd_compr_runtime { > * @metadata_set: metadata set flag, true when set > * @next_track: has userspace signal next track transition, true when set > * @private_data: pointer to DSP private data > + * @dma_buffer: allocated buffer if any > */ > struct snd_compr_stream { > const char *name; > @@ -78,6 +79,7 @@ struct snd_compr_stream { > bool metadata_set; > bool next_track; > void *private_data; > + struct snd_dma_buffer dma_buffer; > }; > > /** > @@ -212,6 +214,9 @@ snd_compr_set_runtime_buffer(struct snd_compr_stream *stream, > } > } > > +int snd_compr_malloc_pages(struct snd_compr_stream *stream, size_t size); > +int snd_compr_free_pages(struct snd_compr_stream *stream); > + > int snd_compr_stop_error(struct snd_compr_stream *stream, > snd_pcm_state_t state); > > diff --git a/sound/core/compress_offload.c b/sound/core/compress_offload.c > index f34ce564d92c..dfb20ceb2d30 100644 > --- a/sound/core/compress_offload.c > +++ b/sound/core/compress_offload.c > @@ -488,6 +488,48 @@ snd_compr_get_codec_caps(struct snd_compr_stream *stream, unsigned long arg) > } > #endif /* !COMPR_CODEC_CAPS_OVERFLOW */ > > +int snd_compr_malloc_pages(struct snd_compr_stream *stream, size_t size) > +{ > + struct snd_dma_buffer *dmab; > + int ret; > + > + if (snd_BUG_ON(!(stream) || !(stream)->runtime)) > + return -EINVAL; > + dmab = kzalloc(sizeof(*dmab), GFP_KERNEL); > + if (!dmab) > + return -ENOMEM; > + dmab->dev = stream->dma_buffer.dev; > + ret = snd_dma_alloc_pages(dmab->dev.type, dmab->dev.dev, size, dmab); > + if (ret < 0) { > + kfree(dmab); > + return ret; > + } > + > + snd_compr_set_runtime_buffer(stream, dmab); > + stream->runtime->dma_bytes = size; > + return 1; > +} > +EXPORT_SYMBOL(snd_compr_malloc_pages); > + > +int snd_compr_free_pages(struct snd_compr_stream *stream) > +{ > + struct snd_compr_runtime *runtime = stream->runtime; > + > + if (snd_BUG_ON(!(stream) || !(stream)->runtime)) > + return -EINVAL; > + if (!runtime->dma_area) > + return 0; > + if (runtime->dma_buffer_p != &stream->dma_buffer) { > + /* It's a newly allocated buffer. Release it now. */ > + snd_dma_free_pages(runtime->dma_buffer_p); > + kfree(runtime->dma_buffer_p); > + } > + > + snd_compr_set_runtime_buffer(stream, NULL); > + return 0; > +} > +EXPORT_SYMBOL(snd_compr_free_pages); > + > /* revisit this with snd_pcm_preallocate_xxx */ > static int snd_compr_allocate_buffer(struct snd_compr_stream *stream, > struct snd_compr_params *params) > -- > 2.17.1 > _______________________________________________ Alsa-devel mailing list Alsa-devel@xxxxxxxxxxxxxxxx https://mailman.alsa-project.org/mailman/listinfo/alsa-devel