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