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 * release the preallocated buffer if not yet done. 94 */ 95 static void snd_pcm_lib_preallocate_dma_free(struct snd_pcm_substream *substream) 96 { 97 do_free_pages(substream->pcm->card, &substream->dma_buffer); 98 } 99 100 /** 101 * snd_pcm_lib_preallocate_free - release the preallocated buffer of the specified substream. 102 * @substream: the pcm substream instance 103 * 104 * Releases the pre-allocated buffer of the given substream. 105 */ 106 void snd_pcm_lib_preallocate_free(struct snd_pcm_substream *substream) 107 { 108 snd_pcm_lib_preallocate_dma_free(substream); 109 } 110 111 /** 112 * snd_pcm_lib_preallocate_free_for_all - release all pre-allocated buffers on the pcm 113 * @pcm: the pcm instance 114 * 115 * Releases all the pre-allocated buffers on the given pcm. 116 */ 117 void snd_pcm_lib_preallocate_free_for_all(struct snd_pcm *pcm) 118 { 119 struct snd_pcm_substream *substream; 120 int stream; 121 122 for (stream = 0; stream < 2; stream++) 123 for (substream = pcm->streams[stream].substream; substream; substream = substream->next) 124 snd_pcm_lib_preallocate_free(substream); 125 } 126 EXPORT_SYMBOL(snd_pcm_lib_preallocate_free_for_all); 127 128 #ifdef CONFIG_SND_VERBOSE_PROCFS 129 /* 130 * read callback for prealloc proc file 131 * 132 * prints the current allocated size in kB. 133 */ 134 static void snd_pcm_lib_preallocate_proc_read(struct snd_info_entry *entry, 135 struct snd_info_buffer *buffer) 136 { 137 struct snd_pcm_substream *substream = entry->private_data; 138 snd_iprintf(buffer, "%lu\n", (unsigned long) substream->dma_buffer.bytes / 1024); 139 } 140 141 /* 142 * read callback for prealloc_max proc file 143 * 144 * prints the maximum allowed size in kB. 145 */ 146 static void snd_pcm_lib_preallocate_max_proc_read(struct snd_info_entry *entry, 147 struct snd_info_buffer *buffer) 148 { 149 struct snd_pcm_substream *substream = entry->private_data; 150 snd_iprintf(buffer, "%lu\n", (unsigned long) substream->dma_max / 1024); 151 } 152 153 /* 154 * write callback for prealloc proc file 155 * 156 * accepts the preallocation size in kB. 157 */ 158 static void snd_pcm_lib_preallocate_proc_write(struct snd_info_entry *entry, 159 struct snd_info_buffer *buffer) 160 { 161 struct snd_pcm_substream *substream = entry->private_data; 162 struct snd_card *card = substream->pcm->card; 163 char line[64], str[64]; 164 size_t size; 165 struct snd_dma_buffer new_dmab; 166 167 if (substream->runtime) { 168 buffer->error = -EBUSY; 169 return; 170 } 171 if (!snd_info_get_line(buffer, line, sizeof(line))) { 172 snd_info_get_str(str, line, sizeof(str)); 173 size = simple_strtoul(str, NULL, 10) * 1024; 174 if ((size != 0 && size < 8192) || size > substream->dma_max) { 175 buffer->error = -EINVAL; 176 return; 177 } 178 if (substream->dma_buffer.bytes == size) 179 return; 180 memset(&new_dmab, 0, sizeof(new_dmab)); 181 new_dmab.dev = substream->dma_buffer.dev; 182 if (size > 0) { 183 if (do_alloc_pages(card, 184 substream->dma_buffer.dev.type, 185 substream->dma_buffer.dev.dev, 186 size, &new_dmab) < 0) { 187 buffer->error = -ENOMEM; 188 return; 189 } 190 substream->buffer_bytes_max = size; 191 } else { 192 substream->buffer_bytes_max = UINT_MAX; 193 } 194 if (substream->dma_buffer.area) 195 do_free_pages(card, &substream->dma_buffer); 196 substream->dma_buffer = new_dmab; 197 } else { 198 buffer->error = -EINVAL; 199 } 200 } 201 202 static inline void preallocate_info_init(struct snd_pcm_substream *substream) 203 { 204 struct snd_info_entry *entry; 205 206 entry = snd_info_create_card_entry(substream->pcm->card, "prealloc", 207 substream->proc_root); 208 if (entry) { 209 snd_info_set_text_ops(entry, substream, 210 snd_pcm_lib_preallocate_proc_read); 211 entry->c.text.write = snd_pcm_lib_preallocate_proc_write; 212 entry->mode |= 0200; 213 } 214 entry = snd_info_create_card_entry(substream->pcm->card, "prealloc_max", 215 substream->proc_root); 216 if (entry) 217 snd_info_set_text_ops(entry, substream, 218 snd_pcm_lib_preallocate_max_proc_read); 219 } 220 221 #else /* !CONFIG_SND_VERBOSE_PROCFS */ 222 #define preallocate_info_init(s) 223 #endif /* CONFIG_SND_VERBOSE_PROCFS */ 224 225 /* 226 * pre-allocate the buffer and create a proc file for the substream 227 */ 228 static void preallocate_pages(struct snd_pcm_substream *substream, 229 int type, struct device *data, 230 size_t size, size_t max, bool managed) 231 { 232 if (snd_BUG_ON(substream->dma_buffer.dev.type)) 233 return; 234 235 substream->dma_buffer.dev.type = type; 236 substream->dma_buffer.dev.dev = data; 237 238 if (size > 0 && preallocate_dma && substream->number < maximum_substreams) 239 preallocate_pcm_pages(substream, size); 240 241 if (substream->dma_buffer.bytes > 0) 242 substream->buffer_bytes_max = substream->dma_buffer.bytes; 243 substream->dma_max = max; 244 if (max > 0) 245 preallocate_info_init(substream); 246 if (managed) 247 substream->managed_buffer_alloc = 1; 248 } 249 250 static void preallocate_pages_for_all(struct snd_pcm *pcm, int type, 251 void *data, size_t size, size_t max, 252 bool managed) 253 { 254 struct snd_pcm_substream *substream; 255 int stream; 256 257 for (stream = 0; stream < 2; stream++) 258 for (substream = pcm->streams[stream].substream; substream; 259 substream = substream->next) 260 preallocate_pages(substream, type, data, size, max, 261 managed); 262 } 263 264 /** 265 * snd_pcm_lib_preallocate_pages - pre-allocation for the given DMA type 266 * @substream: the pcm substream instance 267 * @type: DMA type (SNDRV_DMA_TYPE_*) 268 * @data: DMA type dependent data 269 * @size: the requested pre-allocation size in bytes 270 * @max: the max. allowed pre-allocation size 271 * 272 * Do pre-allocation for the given DMA buffer type. 273 */ 274 void snd_pcm_lib_preallocate_pages(struct snd_pcm_substream *substream, 275 int type, struct device *data, 276 size_t size, size_t max) 277 { 278 preallocate_pages(substream, type, data, size, max, false); 279 } 280 EXPORT_SYMBOL(snd_pcm_lib_preallocate_pages); 281 282 /** 283 * snd_pcm_lib_preallocate_pages_for_all - pre-allocation for continuous memory type (all substreams) 284 * @pcm: the pcm instance 285 * @type: DMA type (SNDRV_DMA_TYPE_*) 286 * @data: DMA type dependent data 287 * @size: the requested pre-allocation size in bytes 288 * @max: the max. allowed pre-allocation size 289 * 290 * Do pre-allocation to all substreams of the given pcm for the 291 * specified DMA type. 292 */ 293 void snd_pcm_lib_preallocate_pages_for_all(struct snd_pcm *pcm, 294 int type, void *data, 295 size_t size, size_t max) 296 { 297 preallocate_pages_for_all(pcm, type, data, size, max, false); 298 } 299 EXPORT_SYMBOL(snd_pcm_lib_preallocate_pages_for_all); 300 301 /** 302 * snd_pcm_set_managed_buffer - set up buffer management for a substream 303 * @substream: the pcm substream instance 304 * @type: DMA type (SNDRV_DMA_TYPE_*) 305 * @data: DMA type dependent data 306 * @size: the requested pre-allocation size in bytes 307 * @max: the max. allowed pre-allocation size 308 * 309 * Do pre-allocation for the given DMA buffer type, and set the managed 310 * buffer allocation mode to the given substream. 311 * In this mode, PCM core will allocate a buffer automatically before PCM 312 * hw_params ops call, and release the buffer after PCM hw_free ops call 313 * as well, so that the driver doesn't need to invoke the allocation and 314 * the release explicitly in its callback. 315 * When a buffer is actually allocated before the PCM hw_params call, it 316 * turns on the runtime buffer_changed flag for drivers changing their h/w 317 * parameters accordingly. 318 */ 319 void snd_pcm_set_managed_buffer(struct snd_pcm_substream *substream, int type, 320 struct device *data, size_t size, size_t max) 321 { 322 preallocate_pages(substream, type, data, size, max, true); 323 } 324 EXPORT_SYMBOL(snd_pcm_set_managed_buffer); 325 326 /** 327 * snd_pcm_set_managed_buffer_all - set up buffer management for all substreams 328 * for all substreams 329 * @pcm: the pcm instance 330 * @type: DMA type (SNDRV_DMA_TYPE_*) 331 * @data: DMA type dependent data 332 * @size: the requested pre-allocation size in bytes 333 * @max: the max. allowed pre-allocation size 334 * 335 * Do pre-allocation to all substreams of the given pcm for the specified DMA 336 * type and size, and set the managed_buffer_alloc flag to each substream. 337 */ 338 void snd_pcm_set_managed_buffer_all(struct snd_pcm *pcm, int type, 339 struct device *data, 340 size_t size, size_t max) 341 { 342 preallocate_pages_for_all(pcm, type, data, size, max, true); 343 } 344 EXPORT_SYMBOL(snd_pcm_set_managed_buffer_all); 345 346 #ifdef CONFIG_SND_DMA_SGBUF 347 /* 348 * snd_pcm_sgbuf_ops_page - get the page struct at the given offset 349 * @substream: the pcm substream instance 350 * @offset: the buffer offset 351 * 352 * Used as the page callback of PCM ops. 353 * 354 * Return: The page struct at the given buffer offset. %NULL on failure. 355 */ 356 struct page *snd_pcm_sgbuf_ops_page(struct snd_pcm_substream *substream, unsigned long offset) 357 { 358 struct snd_sg_buf *sgbuf = snd_pcm_substream_sgbuf(substream); 359 360 unsigned int idx = offset >> PAGE_SHIFT; 361 if (idx >= (unsigned int)sgbuf->pages) 362 return NULL; 363 return sgbuf->page_table[idx]; 364 } 365 #endif /* CONFIG_SND_DMA_SGBUF */ 366 367 /** 368 * snd_pcm_lib_malloc_pages - allocate the DMA buffer 369 * @substream: the substream to allocate the DMA buffer to 370 * @size: the requested buffer size in bytes 371 * 372 * Allocates the DMA buffer on the BUS type given earlier to 373 * snd_pcm_lib_preallocate_xxx_pages(). 374 * 375 * Return: 1 if the buffer is changed, 0 if not changed, or a negative 376 * code on failure. 377 */ 378 int snd_pcm_lib_malloc_pages(struct snd_pcm_substream *substream, size_t size) 379 { 380 struct snd_card *card = substream->pcm->card; 381 struct snd_pcm_runtime *runtime; 382 struct snd_dma_buffer *dmab = NULL; 383 384 if (PCM_RUNTIME_CHECK(substream)) 385 return -EINVAL; 386 if (snd_BUG_ON(substream->dma_buffer.dev.type == 387 SNDRV_DMA_TYPE_UNKNOWN)) 388 return -EINVAL; 389 runtime = substream->runtime; 390 391 if (runtime->dma_buffer_p) { 392 /* perphaps, we might free the large DMA memory region 393 to save some space here, but the actual solution 394 costs us less time */ 395 if (runtime->dma_buffer_p->bytes >= size) { 396 runtime->dma_bytes = size; 397 return 0; /* ok, do not change */ 398 } 399 snd_pcm_lib_free_pages(substream); 400 } 401 if (substream->dma_buffer.area != NULL && 402 substream->dma_buffer.bytes >= size) { 403 dmab = &substream->dma_buffer; /* use the pre-allocated buffer */ 404 } else { 405 dmab = kzalloc(sizeof(*dmab), GFP_KERNEL); 406 if (! dmab) 407 return -ENOMEM; 408 dmab->dev = substream->dma_buffer.dev; 409 if (do_alloc_pages(card, 410 substream->dma_buffer.dev.type, 411 substream->dma_buffer.dev.dev, 412 size, dmab) < 0) { 413 kfree(dmab); 414 return -ENOMEM; 415 } 416 } 417 snd_pcm_set_runtime_buffer(substream, dmab); 418 runtime->dma_bytes = size; 419 return 1; /* area was changed */ 420 } 421 EXPORT_SYMBOL(snd_pcm_lib_malloc_pages); 422 423 /** 424 * snd_pcm_lib_free_pages - release the allocated DMA buffer. 425 * @substream: the substream to release the DMA buffer 426 * 427 * Releases the DMA buffer allocated via snd_pcm_lib_malloc_pages(). 428 * 429 * Return: Zero if successful, or a negative error code on failure. 430 */ 431 int snd_pcm_lib_free_pages(struct snd_pcm_substream *substream) 432 { 433 struct snd_card *card = substream->pcm->card; 434 struct snd_pcm_runtime *runtime; 435 436 if (PCM_RUNTIME_CHECK(substream)) 437 return -EINVAL; 438 runtime = substream->runtime; 439 if (runtime->dma_area == NULL) 440 return 0; 441 if (runtime->dma_buffer_p != &substream->dma_buffer) { 442 /* it's a newly allocated buffer. release it now. */ 443 do_free_pages(card, runtime->dma_buffer_p); 444 kfree(runtime->dma_buffer_p); 445 } 446 snd_pcm_set_runtime_buffer(substream, NULL); 447 return 0; 448 } 449 EXPORT_SYMBOL(snd_pcm_lib_free_pages); 450 451 int _snd_pcm_lib_alloc_vmalloc_buffer(struct snd_pcm_substream *substream, 452 size_t size, gfp_t gfp_flags) 453 { 454 struct snd_pcm_runtime *runtime; 455 456 if (PCM_RUNTIME_CHECK(substream)) 457 return -EINVAL; 458 runtime = substream->runtime; 459 if (runtime->dma_area) { 460 if (runtime->dma_bytes >= size) 461 return 0; /* already large enough */ 462 vfree(runtime->dma_area); 463 } 464 runtime->dma_area = __vmalloc(size, gfp_flags); 465 if (!runtime->dma_area) 466 return -ENOMEM; 467 runtime->dma_bytes = size; 468 return 1; 469 } 470 EXPORT_SYMBOL(_snd_pcm_lib_alloc_vmalloc_buffer); 471 472 /** 473 * snd_pcm_lib_free_vmalloc_buffer - free vmalloc buffer 474 * @substream: the substream with a buffer allocated by 475 * snd_pcm_lib_alloc_vmalloc_buffer() 476 * 477 * Return: Zero if successful, or a negative error code on failure. 478 */ 479 int snd_pcm_lib_free_vmalloc_buffer(struct snd_pcm_substream *substream) 480 { 481 struct snd_pcm_runtime *runtime; 482 483 if (PCM_RUNTIME_CHECK(substream)) 484 return -EINVAL; 485 runtime = substream->runtime; 486 vfree(runtime->dma_area); 487 runtime->dma_area = NULL; 488 return 0; 489 } 490 EXPORT_SYMBOL(snd_pcm_lib_free_vmalloc_buffer); 491 492 /** 493 * snd_pcm_lib_get_vmalloc_page - map vmalloc buffer offset to page struct 494 * @substream: the substream with a buffer allocated by 495 * snd_pcm_lib_alloc_vmalloc_buffer() 496 * @offset: offset in the buffer 497 * 498 * This function is to be used as the page callback in the PCM ops. 499 * 500 * Return: The page struct, or %NULL on failure. 501 */ 502 struct page *snd_pcm_lib_get_vmalloc_page(struct snd_pcm_substream *substream, 503 unsigned long offset) 504 { 505 return vmalloc_to_page(substream->runtime->dma_area + offset); 506 } 507 EXPORT_SYMBOL(snd_pcm_lib_get_vmalloc_page); 508