Lines Matching refs:dmab
28 static const struct snd_malloc_ops *snd_dma_get_ops(struct snd_dma_buffer *dmab);
31 static void *snd_dma_sg_fallback_alloc(struct snd_dma_buffer *dmab, size_t size);
34 static void *__snd_dma_alloc_pages(struct snd_dma_buffer *dmab, size_t size) in __snd_dma_alloc_pages() argument
36 const struct snd_malloc_ops *ops = snd_dma_get_ops(dmab); in __snd_dma_alloc_pages()
40 return ops->alloc(dmab, size); in __snd_dma_alloc_pages()
60 struct snd_dma_buffer *dmab) in snd_dma_alloc_dir_pages() argument
64 if (WARN_ON(!dmab)) in snd_dma_alloc_dir_pages()
68 dmab->dev.type = type; in snd_dma_alloc_dir_pages()
69 dmab->dev.dev = device; in snd_dma_alloc_dir_pages()
70 dmab->dev.dir = dir; in snd_dma_alloc_dir_pages()
71 dmab->bytes = 0; in snd_dma_alloc_dir_pages()
72 dmab->addr = 0; in snd_dma_alloc_dir_pages()
73 dmab->private_data = NULL; in snd_dma_alloc_dir_pages()
74 dmab->area = __snd_dma_alloc_pages(dmab, size); in snd_dma_alloc_dir_pages()
75 if (!dmab->area) in snd_dma_alloc_dir_pages()
77 dmab->bytes = size; in snd_dma_alloc_dir_pages()
98 struct snd_dma_buffer *dmab) in snd_dma_alloc_pages_fallback() argument
102 while ((err = snd_dma_alloc_pages(type, device, size, dmab)) < 0) { in snd_dma_alloc_pages_fallback()
110 if (! dmab->area) in snd_dma_alloc_pages_fallback()
122 void snd_dma_free_pages(struct snd_dma_buffer *dmab) in snd_dma_free_pages() argument
124 const struct snd_malloc_ops *ops = snd_dma_get_ops(dmab); in snd_dma_free_pages()
127 ops->free(dmab); in snd_dma_free_pages()
157 struct snd_dma_buffer *dmab; in snd_devm_alloc_dir_pages() local
164 dmab = devres_alloc(__snd_release_pages, sizeof(*dmab), GFP_KERNEL); in snd_devm_alloc_dir_pages()
165 if (!dmab) in snd_devm_alloc_dir_pages()
168 err = snd_dma_alloc_dir_pages(type, dev, dir, size, dmab); in snd_devm_alloc_dir_pages()
170 devres_free(dmab); in snd_devm_alloc_dir_pages()
174 devres_add(dev, dmab); in snd_devm_alloc_dir_pages()
175 return dmab; in snd_devm_alloc_dir_pages()
186 int snd_dma_buffer_mmap(struct snd_dma_buffer *dmab, in snd_dma_buffer_mmap() argument
191 if (!dmab) in snd_dma_buffer_mmap()
193 ops = snd_dma_get_ops(dmab); in snd_dma_buffer_mmap()
195 return ops->mmap(dmab, area); in snd_dma_buffer_mmap()
207 void snd_dma_buffer_sync(struct snd_dma_buffer *dmab, in snd_dma_buffer_sync() argument
212 if (!dmab || !dmab->dev.need_sync) in snd_dma_buffer_sync()
214 ops = snd_dma_get_ops(dmab); in snd_dma_buffer_sync()
216 ops->sync(dmab, mode); in snd_dma_buffer_sync()
228 dma_addr_t snd_sgbuf_get_addr(struct snd_dma_buffer *dmab, size_t offset) in snd_sgbuf_get_addr() argument
230 const struct snd_malloc_ops *ops = snd_dma_get_ops(dmab); in snd_sgbuf_get_addr()
233 return ops->get_addr(dmab, offset); in snd_sgbuf_get_addr()
235 return dmab->addr + offset; in snd_sgbuf_get_addr()
246 struct page *snd_sgbuf_get_page(struct snd_dma_buffer *dmab, size_t offset) in snd_sgbuf_get_page() argument
248 const struct snd_malloc_ops *ops = snd_dma_get_ops(dmab); in snd_sgbuf_get_page()
251 return ops->get_page(dmab, offset); in snd_sgbuf_get_page()
253 return virt_to_page(dmab->area + offset); in snd_sgbuf_get_page()
266 unsigned int snd_sgbuf_get_chunk_size(struct snd_dma_buffer *dmab, in snd_sgbuf_get_chunk_size() argument
269 const struct snd_malloc_ops *ops = snd_dma_get_ops(dmab); in snd_sgbuf_get_chunk_size()
272 return ops->get_chunk_size(dmab, ofs, size); in snd_sgbuf_get_chunk_size()
321 static void *snd_dma_continuous_alloc(struct snd_dma_buffer *dmab, size_t size) in snd_dma_continuous_alloc() argument
323 return do_alloc_pages(dmab->dev.dev, size, &dmab->addr, false); in snd_dma_continuous_alloc()
326 static void snd_dma_continuous_free(struct snd_dma_buffer *dmab) in snd_dma_continuous_free() argument
328 do_free_pages(dmab->area, dmab->bytes, false); in snd_dma_continuous_free()
331 static int snd_dma_continuous_mmap(struct snd_dma_buffer *dmab, in snd_dma_continuous_mmap() argument
335 dmab->addr >> PAGE_SHIFT, in snd_dma_continuous_mmap()
349 static void *snd_dma_vmalloc_alloc(struct snd_dma_buffer *dmab, size_t size) in snd_dma_vmalloc_alloc() argument
354 static void snd_dma_vmalloc_free(struct snd_dma_buffer *dmab) in snd_dma_vmalloc_free() argument
356 vfree(dmab->area); in snd_dma_vmalloc_free()
359 static int snd_dma_vmalloc_mmap(struct snd_dma_buffer *dmab, in snd_dma_vmalloc_mmap() argument
362 return remap_vmalloc_range(area, dmab->area, 0); in snd_dma_vmalloc_mmap()
365 #define get_vmalloc_page_addr(dmab, offset) \ argument
366 page_to_phys(vmalloc_to_page((dmab)->area + (offset)))
368 static dma_addr_t snd_dma_vmalloc_get_addr(struct snd_dma_buffer *dmab, in snd_dma_vmalloc_get_addr() argument
371 return get_vmalloc_page_addr(dmab, offset) + offset % PAGE_SIZE; in snd_dma_vmalloc_get_addr()
374 static struct page *snd_dma_vmalloc_get_page(struct snd_dma_buffer *dmab, in snd_dma_vmalloc_get_page() argument
377 return vmalloc_to_page(dmab->area + offset); in snd_dma_vmalloc_get_page()
381 snd_dma_vmalloc_get_chunk_size(struct snd_dma_buffer *dmab, in snd_dma_vmalloc_get_chunk_size() argument
390 addr = get_vmalloc_page_addr(dmab, start); in snd_dma_vmalloc_get_chunk_size()
396 if (get_vmalloc_page_addr(dmab, start) != addr) in snd_dma_vmalloc_get_chunk_size()
417 static void *snd_dma_iram_alloc(struct snd_dma_buffer *dmab, size_t size) in snd_dma_iram_alloc() argument
419 struct device *dev = dmab->dev.dev; in snd_dma_iram_alloc()
426 dmab->private_data = pool; in snd_dma_iram_alloc()
428 p = gen_pool_dma_alloc_align(pool, size, &dmab->addr, PAGE_SIZE); in snd_dma_iram_alloc()
436 dmab->dev.type = SNDRV_DMA_TYPE_DEV; in snd_dma_iram_alloc()
437 return __snd_dma_alloc_pages(dmab, size); in snd_dma_iram_alloc()
440 static void snd_dma_iram_free(struct snd_dma_buffer *dmab) in snd_dma_iram_free() argument
442 struct gen_pool *pool = dmab->private_data; in snd_dma_iram_free()
444 if (pool && dmab->area) in snd_dma_iram_free()
445 gen_pool_free(pool, (unsigned long)dmab->area, dmab->bytes); in snd_dma_iram_free()
448 static int snd_dma_iram_mmap(struct snd_dma_buffer *dmab, in snd_dma_iram_mmap() argument
453 dmab->addr >> PAGE_SHIFT, in snd_dma_iram_mmap()
468 static void *snd_dma_dev_alloc(struct snd_dma_buffer *dmab, size_t size) in snd_dma_dev_alloc() argument
470 return dma_alloc_coherent(dmab->dev.dev, size, &dmab->addr, DEFAULT_GFP); in snd_dma_dev_alloc()
473 static void snd_dma_dev_free(struct snd_dma_buffer *dmab) in snd_dma_dev_free() argument
475 dma_free_coherent(dmab->dev.dev, dmab->bytes, dmab->area, dmab->addr); in snd_dma_dev_free()
478 static int snd_dma_dev_mmap(struct snd_dma_buffer *dmab, in snd_dma_dev_mmap() argument
481 return dma_mmap_coherent(dmab->dev.dev, area, in snd_dma_dev_mmap()
482 dmab->area, dmab->addr, dmab->bytes); in snd_dma_dev_mmap()
496 static void *snd_dma_wc_alloc(struct snd_dma_buffer *dmab, size_t size) in snd_dma_wc_alloc() argument
498 return do_alloc_pages(dmab->dev.dev, size, &dmab->addr, true); in snd_dma_wc_alloc()
501 static void snd_dma_wc_free(struct snd_dma_buffer *dmab) in snd_dma_wc_free() argument
503 do_free_pages(dmab->area, dmab->bytes, true); in snd_dma_wc_free()
506 static int snd_dma_wc_mmap(struct snd_dma_buffer *dmab, in snd_dma_wc_mmap() argument
510 return snd_dma_continuous_mmap(dmab, area); in snd_dma_wc_mmap()
513 static void *snd_dma_wc_alloc(struct snd_dma_buffer *dmab, size_t size) in snd_dma_wc_alloc() argument
515 return dma_alloc_wc(dmab->dev.dev, size, &dmab->addr, DEFAULT_GFP); in snd_dma_wc_alloc()
518 static void snd_dma_wc_free(struct snd_dma_buffer *dmab) in snd_dma_wc_free() argument
520 dma_free_wc(dmab->dev.dev, dmab->bytes, dmab->area, dmab->addr); in snd_dma_wc_free()
523 static int snd_dma_wc_mmap(struct snd_dma_buffer *dmab, in snd_dma_wc_mmap() argument
526 return dma_mmap_wc(dmab->dev.dev, area, in snd_dma_wc_mmap()
527 dmab->area, dmab->addr, dmab->bytes); in snd_dma_wc_mmap()
540 static void *snd_dma_noncontig_alloc(struct snd_dma_buffer *dmab, size_t size) in snd_dma_noncontig_alloc() argument
545 sgt = dma_alloc_noncontiguous(dmab->dev.dev, size, dmab->dev.dir, in snd_dma_noncontig_alloc()
548 if (!sgt && !get_dma_ops(dmab->dev.dev)) { in snd_dma_noncontig_alloc()
549 if (dmab->dev.type == SNDRV_DMA_TYPE_DEV_WC_SG) in snd_dma_noncontig_alloc()
550 dmab->dev.type = SNDRV_DMA_TYPE_DEV_WC_SG_FALLBACK; in snd_dma_noncontig_alloc()
552 dmab->dev.type = SNDRV_DMA_TYPE_DEV_SG_FALLBACK; in snd_dma_noncontig_alloc()
553 return snd_dma_sg_fallback_alloc(dmab, size); in snd_dma_noncontig_alloc()
559 dmab->dev.need_sync = dma_need_sync(dmab->dev.dev, in snd_dma_noncontig_alloc()
561 p = dma_vmap_noncontiguous(dmab->dev.dev, size, sgt); in snd_dma_noncontig_alloc()
563 dmab->private_data = sgt; in snd_dma_noncontig_alloc()
565 dmab->addr = snd_sgbuf_get_addr(dmab, 0); in snd_dma_noncontig_alloc()
567 dma_free_noncontiguous(dmab->dev.dev, size, sgt, dmab->dev.dir); in snd_dma_noncontig_alloc()
572 static void snd_dma_noncontig_free(struct snd_dma_buffer *dmab) in snd_dma_noncontig_free() argument
574 dma_vunmap_noncontiguous(dmab->dev.dev, dmab->area); in snd_dma_noncontig_free()
575 dma_free_noncontiguous(dmab->dev.dev, dmab->bytes, dmab->private_data, in snd_dma_noncontig_free()
576 dmab->dev.dir); in snd_dma_noncontig_free()
579 static int snd_dma_noncontig_mmap(struct snd_dma_buffer *dmab, in snd_dma_noncontig_mmap() argument
582 return dma_mmap_noncontiguous(dmab->dev.dev, area, in snd_dma_noncontig_mmap()
583 dmab->bytes, dmab->private_data); in snd_dma_noncontig_mmap()
586 static void snd_dma_noncontig_sync(struct snd_dma_buffer *dmab, in snd_dma_noncontig_sync() argument
590 if (dmab->dev.dir == DMA_TO_DEVICE) in snd_dma_noncontig_sync()
592 invalidate_kernel_vmap_range(dmab->area, dmab->bytes); in snd_dma_noncontig_sync()
593 dma_sync_sgtable_for_cpu(dmab->dev.dev, dmab->private_data, in snd_dma_noncontig_sync()
594 dmab->dev.dir); in snd_dma_noncontig_sync()
596 if (dmab->dev.dir == DMA_FROM_DEVICE) in snd_dma_noncontig_sync()
598 flush_kernel_vmap_range(dmab->area, dmab->bytes); in snd_dma_noncontig_sync()
599 dma_sync_sgtable_for_device(dmab->dev.dev, dmab->private_data, in snd_dma_noncontig_sync()
600 dmab->dev.dir); in snd_dma_noncontig_sync()
604 static inline void snd_dma_noncontig_iter_set(struct snd_dma_buffer *dmab, in snd_dma_noncontig_iter_set() argument
608 struct sg_table *sgt = dmab->private_data; in snd_dma_noncontig_iter_set()
614 static dma_addr_t snd_dma_noncontig_get_addr(struct snd_dma_buffer *dmab, in snd_dma_noncontig_get_addr() argument
619 snd_dma_noncontig_iter_set(dmab, &iter.base, offset); in snd_dma_noncontig_get_addr()
624 static struct page *snd_dma_noncontig_get_page(struct snd_dma_buffer *dmab, in snd_dma_noncontig_get_page() argument
629 snd_dma_noncontig_iter_set(dmab, &iter, offset); in snd_dma_noncontig_get_page()
635 snd_dma_noncontig_get_chunk_size(struct snd_dma_buffer *dmab, in snd_dma_noncontig_get_chunk_size() argument
644 snd_dma_noncontig_iter_set(dmab, &iter.base, start); in snd_dma_noncontig_get_chunk_size()
676 static void *snd_dma_sg_wc_alloc(struct snd_dma_buffer *dmab, size_t size) in snd_dma_sg_wc_alloc() argument
678 void *p = snd_dma_noncontig_alloc(dmab, size); in snd_dma_sg_wc_alloc()
679 struct sg_table *sgt = dmab->private_data; in snd_dma_sg_wc_alloc()
684 if (dmab->dev.type != SNDRV_DMA_TYPE_DEV_WC_SG) in snd_dma_sg_wc_alloc()
691 static void snd_dma_sg_wc_free(struct snd_dma_buffer *dmab) in snd_dma_sg_wc_free() argument
693 struct sg_table *sgt = dmab->private_data; in snd_dma_sg_wc_free()
698 snd_dma_noncontig_free(dmab); in snd_dma_sg_wc_free()
701 static int snd_dma_sg_wc_mmap(struct snd_dma_buffer *dmab, in snd_dma_sg_wc_mmap() argument
705 return dma_mmap_noncontiguous(dmab->dev.dev, area, in snd_dma_sg_wc_mmap()
706 dmab->bytes, dmab->private_data); in snd_dma_sg_wc_mmap()
726 static void __snd_dma_sg_fallback_free(struct snd_dma_buffer *dmab, in __snd_dma_sg_fallback_free() argument
729 bool wc = dmab->dev.type == SNDRV_DMA_TYPE_DEV_WC_SG_FALLBACK; in __snd_dma_sg_fallback_free()
739 static void *snd_dma_sg_fallback_alloc(struct snd_dma_buffer *dmab, size_t size) in snd_dma_sg_fallback_alloc() argument
745 bool wc = dmab->dev.type == SNDRV_DMA_TYPE_DEV_WC_SG_FALLBACK; in snd_dma_sg_fallback_alloc()
760 p = do_alloc_pages(dmab->dev.dev, PAGE_SIZE, &sgbuf->addrs[i], wc); in snd_dma_sg_fallback_alloc()
769 dmab->private_data = sgbuf; in snd_dma_sg_fallback_alloc()
771 dmab->addr = snd_sgbuf_get_addr(dmab, 0); in snd_dma_sg_fallback_alloc()
775 __snd_dma_sg_fallback_free(dmab, sgbuf); in snd_dma_sg_fallback_alloc()
779 static void snd_dma_sg_fallback_free(struct snd_dma_buffer *dmab) in snd_dma_sg_fallback_free() argument
781 vunmap(dmab->area); in snd_dma_sg_fallback_free()
782 __snd_dma_sg_fallback_free(dmab, dmab->private_data); in snd_dma_sg_fallback_free()
785 static int snd_dma_sg_fallback_mmap(struct snd_dma_buffer *dmab, in snd_dma_sg_fallback_mmap() argument
788 struct snd_dma_sg_fallback *sgbuf = dmab->private_data; in snd_dma_sg_fallback_mmap()
790 if (dmab->dev.type == SNDRV_DMA_TYPE_DEV_WC_SG_FALLBACK) in snd_dma_sg_fallback_mmap()
809 static void *snd_dma_noncoherent_alloc(struct snd_dma_buffer *dmab, size_t size) in snd_dma_noncoherent_alloc() argument
813 p = dma_alloc_noncoherent(dmab->dev.dev, size, &dmab->addr, in snd_dma_noncoherent_alloc()
814 dmab->dev.dir, DEFAULT_GFP); in snd_dma_noncoherent_alloc()
816 dmab->dev.need_sync = dma_need_sync(dmab->dev.dev, dmab->addr); in snd_dma_noncoherent_alloc()
820 static void snd_dma_noncoherent_free(struct snd_dma_buffer *dmab) in snd_dma_noncoherent_free() argument
822 dma_free_noncoherent(dmab->dev.dev, dmab->bytes, dmab->area, in snd_dma_noncoherent_free()
823 dmab->addr, dmab->dev.dir); in snd_dma_noncoherent_free()
826 static int snd_dma_noncoherent_mmap(struct snd_dma_buffer *dmab, in snd_dma_noncoherent_mmap() argument
830 return dma_mmap_pages(dmab->dev.dev, area, in snd_dma_noncoherent_mmap()
832 virt_to_page(dmab->area)); in snd_dma_noncoherent_mmap()
835 static void snd_dma_noncoherent_sync(struct snd_dma_buffer *dmab, in snd_dma_noncoherent_sync() argument
839 if (dmab->dev.dir != DMA_TO_DEVICE) in snd_dma_noncoherent_sync()
840 dma_sync_single_for_cpu(dmab->dev.dev, dmab->addr, in snd_dma_noncoherent_sync()
841 dmab->bytes, dmab->dev.dir); in snd_dma_noncoherent_sync()
843 if (dmab->dev.dir != DMA_FROM_DEVICE) in snd_dma_noncoherent_sync()
844 dma_sync_single_for_device(dmab->dev.dev, dmab->addr, in snd_dma_noncoherent_sync()
845 dmab->bytes, dmab->dev.dir); in snd_dma_noncoherent_sync()
882 static const struct snd_malloc_ops *snd_dma_get_ops(struct snd_dma_buffer *dmab) in snd_dma_get_ops() argument
884 if (WARN_ON_ONCE(!dmab)) in snd_dma_get_ops()
886 if (WARN_ON_ONCE(dmab->dev.type <= SNDRV_DMA_TYPE_UNKNOWN || in snd_dma_get_ops()
887 dmab->dev.type >= ARRAY_SIZE(snd_dma_ops))) in snd_dma_get_ops()
889 return snd_dma_ops[dmab->dev.type]; in snd_dma_get_ops()