GNU Linux-libre 4.19.264-gnu1
[releases.git] / sound / core / pcm_memory.c
1 /*
2  *  Digital Audio (PCM) abstract layer
3  *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
4  *
5  *
6  *   This program is free software; you can redistribute it and/or modify
7  *   it under the terms of the GNU General Public License as published by
8  *   the Free Software Foundation; either version 2 of the License, or
9  *   (at your option) any later version.
10  *
11  *   This program is distributed in the hope that it will be useful,
12  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *   GNU General Public License for more details.
15  *
16  *   You should have received a copy of the GNU General Public License
17  *   along with this program; if not, write to the Free Software
18  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
19  *
20  */
21
22 #include <linux/io.h>
23 #include <linux/time.h>
24 #include <linux/init.h>
25 #include <linux/slab.h>
26 #include <linux/moduleparam.h>
27 #include <linux/vmalloc.h>
28 #include <linux/export.h>
29 #include <sound/core.h>
30 #include <sound/pcm.h>
31 #include <sound/info.h>
32 #include <sound/initval.h>
33
34 static int preallocate_dma = 1;
35 module_param(preallocate_dma, int, 0444);
36 MODULE_PARM_DESC(preallocate_dma, "Preallocate DMA memory when the PCM devices are initialized.");
37
38 static int maximum_substreams = 4;
39 module_param(maximum_substreams, int, 0444);
40 MODULE_PARM_DESC(maximum_substreams, "Maximum substreams with preallocated DMA memory.");
41
42 static const size_t snd_minimum_buffer = 16384;
43
44
45 /*
46  * try to allocate as the large pages as possible.
47  * stores the resultant memory size in *res_size.
48  *
49  * the minimum size is snd_minimum_buffer.  it should be power of 2.
50  */
51 static int preallocate_pcm_pages(struct snd_pcm_substream *substream, size_t size)
52 {
53         struct snd_dma_buffer *dmab = &substream->dma_buffer;
54         size_t orig_size = size;
55         int err;
56
57         do {
58                 if ((err = snd_dma_alloc_pages(dmab->dev.type, dmab->dev.dev,
59                                                size, dmab)) < 0) {
60                         if (err != -ENOMEM)
61                                 return err; /* fatal error */
62                 } else
63                         return 0;
64                 size >>= 1;
65         } while (size >= snd_minimum_buffer);
66         dmab->bytes = 0; /* tell error */
67         pr_warn("ALSA pcmC%dD%d%c,%d:%s: cannot preallocate for size %zu\n",
68                 substream->pcm->card->number, substream->pcm->device,
69                 substream->stream ? 'c' : 'p', substream->number,
70                 substream->pcm->name, orig_size);
71         return 0;
72 }
73
74 /*
75  * release the preallocated buffer if not yet done.
76  */
77 static void snd_pcm_lib_preallocate_dma_free(struct snd_pcm_substream *substream)
78 {
79         if (substream->dma_buffer.area == NULL)
80                 return;
81         snd_dma_free_pages(&substream->dma_buffer);
82         substream->dma_buffer.area = NULL;
83 }
84
85 /**
86  * snd_pcm_lib_preallocate_free - release the preallocated buffer of the specified substream.
87  * @substream: the pcm substream instance
88  *
89  * Releases the pre-allocated buffer of the given substream.
90  *
91  * Return: Zero if successful, or a negative error code on failure.
92  */
93 int snd_pcm_lib_preallocate_free(struct snd_pcm_substream *substream)
94 {
95         snd_pcm_lib_preallocate_dma_free(substream);
96 #ifdef CONFIG_SND_VERBOSE_PROCFS
97         snd_info_free_entry(substream->proc_prealloc_max_entry);
98         substream->proc_prealloc_max_entry = NULL;
99         snd_info_free_entry(substream->proc_prealloc_entry);
100         substream->proc_prealloc_entry = NULL;
101 #endif
102         return 0;
103 }
104
105 /**
106  * snd_pcm_lib_preallocate_free_for_all - release all pre-allocated buffers on the pcm
107  * @pcm: the pcm instance
108  *
109  * Releases all the pre-allocated buffers on the given pcm.
110  *
111  * Return: Zero if successful, or a negative error code on failure.
112  */
113 int snd_pcm_lib_preallocate_free_for_all(struct snd_pcm *pcm)
114 {
115         struct snd_pcm_substream *substream;
116         int stream;
117
118         for (stream = 0; stream < 2; stream++)
119                 for (substream = pcm->streams[stream].substream; substream; substream = substream->next)
120                         snd_pcm_lib_preallocate_free(substream);
121         return 0;
122 }
123 EXPORT_SYMBOL(snd_pcm_lib_preallocate_free_for_all);
124
125 #ifdef CONFIG_SND_VERBOSE_PROCFS
126 /*
127  * read callback for prealloc proc file
128  *
129  * prints the current allocated size in kB.
130  */
131 static void snd_pcm_lib_preallocate_proc_read(struct snd_info_entry *entry,
132                                               struct snd_info_buffer *buffer)
133 {
134         struct snd_pcm_substream *substream = entry->private_data;
135         snd_iprintf(buffer, "%lu\n", (unsigned long) substream->dma_buffer.bytes / 1024);
136 }
137
138 /*
139  * read callback for prealloc_max proc file
140  *
141  * prints the maximum allowed size in kB.
142  */
143 static void snd_pcm_lib_preallocate_max_proc_read(struct snd_info_entry *entry,
144                                                   struct snd_info_buffer *buffer)
145 {
146         struct snd_pcm_substream *substream = entry->private_data;
147         snd_iprintf(buffer, "%lu\n", (unsigned long) substream->dma_max / 1024);
148 }
149
150 /*
151  * write callback for prealloc proc file
152  *
153  * accepts the preallocation size in kB.
154  */
155 static void snd_pcm_lib_preallocate_proc_write(struct snd_info_entry *entry,
156                                                struct snd_info_buffer *buffer)
157 {
158         struct snd_pcm_substream *substream = entry->private_data;
159         char line[64], str[64];
160         size_t size;
161         struct snd_dma_buffer new_dmab;
162
163         mutex_lock(&substream->pcm->open_mutex);
164         if (substream->runtime) {
165                 buffer->error = -EBUSY;
166                 goto unlock;
167         }
168         if (!snd_info_get_line(buffer, line, sizeof(line))) {
169                 snd_info_get_str(str, line, sizeof(str));
170                 size = simple_strtoul(str, NULL, 10) * 1024;
171                 if ((size != 0 && size < 8192) || size > substream->dma_max) {
172                         buffer->error = -EINVAL;
173                         goto unlock;
174                 }
175                 if (substream->dma_buffer.bytes == size)
176                         goto unlock;
177                 memset(&new_dmab, 0, sizeof(new_dmab));
178                 new_dmab.dev = substream->dma_buffer.dev;
179                 if (size > 0) {
180                         if (snd_dma_alloc_pages(substream->dma_buffer.dev.type,
181                                                 substream->dma_buffer.dev.dev,
182                                                 size, &new_dmab) < 0) {
183                                 buffer->error = -ENOMEM;
184                                 goto unlock;
185                         }
186                         substream->buffer_bytes_max = size;
187                 } else {
188                         substream->buffer_bytes_max = UINT_MAX;
189                 }
190                 if (substream->dma_buffer.area)
191                         snd_dma_free_pages(&substream->dma_buffer);
192                 substream->dma_buffer = new_dmab;
193         } else {
194                 buffer->error = -EINVAL;
195         }
196  unlock:
197         mutex_unlock(&substream->pcm->open_mutex);
198 }
199
200 static inline void preallocate_info_init(struct snd_pcm_substream *substream)
201 {
202         struct snd_info_entry *entry;
203
204         if ((entry = snd_info_create_card_entry(substream->pcm->card, "prealloc", substream->proc_root)) != NULL) {
205                 entry->c.text.read = snd_pcm_lib_preallocate_proc_read;
206                 entry->c.text.write = snd_pcm_lib_preallocate_proc_write;
207                 entry->mode |= 0200;
208                 entry->private_data = substream;
209                 if (snd_info_register(entry) < 0) {
210                         snd_info_free_entry(entry);
211                         entry = NULL;
212                 }
213         }
214         substream->proc_prealloc_entry = entry;
215         if ((entry = snd_info_create_card_entry(substream->pcm->card, "prealloc_max", substream->proc_root)) != NULL) {
216                 entry->c.text.read = snd_pcm_lib_preallocate_max_proc_read;
217                 entry->private_data = substream;
218                 if (snd_info_register(entry) < 0) {
219                         snd_info_free_entry(entry);
220                         entry = NULL;
221                 }
222         }
223         substream->proc_prealloc_max_entry = entry;
224 }
225
226 #else /* !CONFIG_SND_VERBOSE_PROCFS */
227 #define preallocate_info_init(s)
228 #endif /* CONFIG_SND_VERBOSE_PROCFS */
229
230 /*
231  * pre-allocate the buffer and create a proc file for the substream
232  */
233 static int snd_pcm_lib_preallocate_pages1(struct snd_pcm_substream *substream,
234                                           size_t size, size_t max)
235 {
236
237         if (size > 0 && preallocate_dma && substream->number < maximum_substreams)
238                 preallocate_pcm_pages(substream, size);
239
240         if (substream->dma_buffer.bytes > 0)
241                 substream->buffer_bytes_max = substream->dma_buffer.bytes;
242         substream->dma_max = max;
243         preallocate_info_init(substream);
244         return 0;
245 }
246
247
248 /**
249  * snd_pcm_lib_preallocate_pages - pre-allocation for the given DMA type
250  * @substream: the pcm substream instance
251  * @type: DMA type (SNDRV_DMA_TYPE_*)
252  * @data: DMA type dependent data
253  * @size: the requested pre-allocation size in bytes
254  * @max: the max. allowed pre-allocation size
255  *
256  * Do pre-allocation for the given DMA buffer type.
257  *
258  * Return: Zero if successful, or a negative error code on failure.
259  */
260 int snd_pcm_lib_preallocate_pages(struct snd_pcm_substream *substream,
261                                   int type, struct device *data,
262                                   size_t size, size_t max)
263 {
264         substream->dma_buffer.dev.type = type;
265         substream->dma_buffer.dev.dev = data;
266         return snd_pcm_lib_preallocate_pages1(substream, size, max);
267 }
268 EXPORT_SYMBOL(snd_pcm_lib_preallocate_pages);
269
270 /**
271  * snd_pcm_lib_preallocate_pages_for_all - pre-allocation for continuous memory type (all substreams)
272  * @pcm: the pcm instance
273  * @type: DMA type (SNDRV_DMA_TYPE_*)
274  * @data: DMA type dependent data
275  * @size: the requested pre-allocation size in bytes
276  * @max: the max. allowed pre-allocation size
277  *
278  * Do pre-allocation to all substreams of the given pcm for the
279  * specified DMA type.
280  *
281  * Return: Zero if successful, or a negative error code on failure.
282  */
283 int snd_pcm_lib_preallocate_pages_for_all(struct snd_pcm *pcm,
284                                           int type, void *data,
285                                           size_t size, size_t max)
286 {
287         struct snd_pcm_substream *substream;
288         int stream, err;
289
290         for (stream = 0; stream < 2; stream++)
291                 for (substream = pcm->streams[stream].substream; substream; substream = substream->next)
292                         if ((err = snd_pcm_lib_preallocate_pages(substream, type, data, size, max)) < 0)
293                                 return err;
294         return 0;
295 }
296 EXPORT_SYMBOL(snd_pcm_lib_preallocate_pages_for_all);
297
298 #ifdef CONFIG_SND_DMA_SGBUF
299 /**
300  * snd_pcm_sgbuf_ops_page - get the page struct at the given offset
301  * @substream: the pcm substream instance
302  * @offset: the buffer offset
303  *
304  * Used as the page callback of PCM ops.
305  *
306  * Return: The page struct at the given buffer offset. %NULL on failure.
307  */
308 struct page *snd_pcm_sgbuf_ops_page(struct snd_pcm_substream *substream, unsigned long offset)
309 {
310         struct snd_sg_buf *sgbuf = snd_pcm_substream_sgbuf(substream);
311
312         unsigned int idx = offset >> PAGE_SHIFT;
313         if (idx >= (unsigned int)sgbuf->pages)
314                 return NULL;
315         return sgbuf->page_table[idx];
316 }
317 EXPORT_SYMBOL(snd_pcm_sgbuf_ops_page);
318 #endif /* CONFIG_SND_DMA_SGBUF */
319
320 /**
321  * snd_pcm_lib_malloc_pages - allocate the DMA buffer
322  * @substream: the substream to allocate the DMA buffer to
323  * @size: the requested buffer size in bytes
324  *
325  * Allocates the DMA buffer on the BUS type given earlier to
326  * snd_pcm_lib_preallocate_xxx_pages().
327  *
328  * Return: 1 if the buffer is changed, 0 if not changed, or a negative
329  * code on failure.
330  */
331 int snd_pcm_lib_malloc_pages(struct snd_pcm_substream *substream, size_t size)
332 {
333         struct snd_pcm_runtime *runtime;
334         struct snd_dma_buffer *dmab = NULL;
335
336         if (PCM_RUNTIME_CHECK(substream))
337                 return -EINVAL;
338         if (snd_BUG_ON(substream->dma_buffer.dev.type ==
339                        SNDRV_DMA_TYPE_UNKNOWN))
340                 return -EINVAL;
341         runtime = substream->runtime;
342
343         if (runtime->dma_buffer_p) {
344                 /* perphaps, we might free the large DMA memory region
345                    to save some space here, but the actual solution
346                    costs us less time */
347                 if (runtime->dma_buffer_p->bytes >= size) {
348                         runtime->dma_bytes = size;
349                         return 0;       /* ok, do not change */
350                 }
351                 snd_pcm_lib_free_pages(substream);
352         }
353         if (substream->dma_buffer.area != NULL &&
354             substream->dma_buffer.bytes >= size) {
355                 dmab = &substream->dma_buffer; /* use the pre-allocated buffer */
356         } else {
357                 dmab = kzalloc(sizeof(*dmab), GFP_KERNEL);
358                 if (! dmab)
359                         return -ENOMEM;
360                 dmab->dev = substream->dma_buffer.dev;
361                 if (snd_dma_alloc_pages(substream->dma_buffer.dev.type,
362                                         substream->dma_buffer.dev.dev,
363                                         size, dmab) < 0) {
364                         kfree(dmab);
365                         return -ENOMEM;
366                 }
367         }
368         snd_pcm_set_runtime_buffer(substream, dmab);
369         runtime->dma_bytes = size;
370         return 1;                       /* area was changed */
371 }
372 EXPORT_SYMBOL(snd_pcm_lib_malloc_pages);
373
374 /**
375  * snd_pcm_lib_free_pages - release the allocated DMA buffer.
376  * @substream: the substream to release the DMA buffer
377  *
378  * Releases the DMA buffer allocated via snd_pcm_lib_malloc_pages().
379  *
380  * Return: Zero if successful, or a negative error code on failure.
381  */
382 int snd_pcm_lib_free_pages(struct snd_pcm_substream *substream)
383 {
384         struct snd_pcm_runtime *runtime;
385
386         if (PCM_RUNTIME_CHECK(substream))
387                 return -EINVAL;
388         runtime = substream->runtime;
389         if (runtime->dma_area == NULL)
390                 return 0;
391         if (runtime->dma_buffer_p != &substream->dma_buffer) {
392                 /* it's a newly allocated buffer.  release it now. */
393                 snd_dma_free_pages(runtime->dma_buffer_p);
394                 kfree(runtime->dma_buffer_p);
395         }
396         snd_pcm_set_runtime_buffer(substream, NULL);
397         return 0;
398 }
399 EXPORT_SYMBOL(snd_pcm_lib_free_pages);
400
401 int _snd_pcm_lib_alloc_vmalloc_buffer(struct snd_pcm_substream *substream,
402                                       size_t size, gfp_t gfp_flags)
403 {
404         struct snd_pcm_runtime *runtime;
405
406         if (PCM_RUNTIME_CHECK(substream))
407                 return -EINVAL;
408         runtime = substream->runtime;
409         if (runtime->dma_area) {
410                 if (runtime->dma_bytes >= size)
411                         return 0; /* already large enough */
412                 vfree(runtime->dma_area);
413         }
414         runtime->dma_area = __vmalloc(size, gfp_flags, PAGE_KERNEL);
415         if (!runtime->dma_area)
416                 return -ENOMEM;
417         runtime->dma_bytes = size;
418         return 1;
419 }
420 EXPORT_SYMBOL(_snd_pcm_lib_alloc_vmalloc_buffer);
421
422 /**
423  * snd_pcm_lib_free_vmalloc_buffer - free vmalloc buffer
424  * @substream: the substream with a buffer allocated by
425  *      snd_pcm_lib_alloc_vmalloc_buffer()
426  *
427  * Return: Zero if successful, or a negative error code on failure.
428  */
429 int snd_pcm_lib_free_vmalloc_buffer(struct snd_pcm_substream *substream)
430 {
431         struct snd_pcm_runtime *runtime;
432
433         if (PCM_RUNTIME_CHECK(substream))
434                 return -EINVAL;
435         runtime = substream->runtime;
436         vfree(runtime->dma_area);
437         runtime->dma_area = NULL;
438         return 0;
439 }
440 EXPORT_SYMBOL(snd_pcm_lib_free_vmalloc_buffer);
441
442 /**
443  * snd_pcm_lib_get_vmalloc_page - map vmalloc buffer offset to page struct
444  * @substream: the substream with a buffer allocated by
445  *      snd_pcm_lib_alloc_vmalloc_buffer()
446  * @offset: offset in the buffer
447  *
448  * This function is to be used as the page callback in the PCM ops.
449  *
450  * Return: The page struct, or %NULL on failure.
451  */
452 struct page *snd_pcm_lib_get_vmalloc_page(struct snd_pcm_substream *substream,
453                                           unsigned long offset)
454 {
455         return vmalloc_to_page(substream->runtime->dma_area + offset);
456 }
457 EXPORT_SYMBOL(snd_pcm_lib_get_vmalloc_page);