linux/include/sound/memalloc.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-or-later */
   2/*
   3 *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
   4 *                   Takashi Iwai <tiwai@suse.de>
   5 * 
   6 *  Generic memory allocators
   7 */
   8
   9#ifndef __SOUND_MEMALLOC_H
  10#define __SOUND_MEMALLOC_H
  11
  12#include <asm/page.h>
  13
  14struct device;
  15struct vm_area_struct;
  16
  17/*
  18 * buffer device info
  19 */
  20struct snd_dma_device {
  21        int type;                       /* SNDRV_DMA_TYPE_XXX */
  22        struct device *dev;             /* generic device */
  23};
  24
  25#define snd_dma_continuous_data(x)      ((struct device *)(__force unsigned long)(x))
  26
  27
  28/*
  29 * buffer types
  30 */
  31#define SNDRV_DMA_TYPE_UNKNOWN          0       /* not defined */
  32#define SNDRV_DMA_TYPE_CONTINUOUS       1       /* continuous no-DMA memory */
  33#define SNDRV_DMA_TYPE_DEV              2       /* generic device continuous */
  34#define SNDRV_DMA_TYPE_DEV_WC           5       /* continuous write-combined */
  35#ifdef CONFIG_SND_DMA_SGBUF
  36#define SNDRV_DMA_TYPE_DEV_SG           3       /* generic device SG-buffer */
  37#define SNDRV_DMA_TYPE_DEV_WC_SG        6       /* SG write-combined */
  38#else
  39#define SNDRV_DMA_TYPE_DEV_SG   SNDRV_DMA_TYPE_DEV /* no SG-buf support */
  40#define SNDRV_DMA_TYPE_DEV_WC_SG        SNDRV_DMA_TYPE_DEV_WC
  41#endif
  42#ifdef CONFIG_GENERIC_ALLOCATOR
  43#define SNDRV_DMA_TYPE_DEV_IRAM         4       /* generic device iram-buffer */
  44#else
  45#define SNDRV_DMA_TYPE_DEV_IRAM SNDRV_DMA_TYPE_DEV
  46#endif
  47#define SNDRV_DMA_TYPE_VMALLOC          7       /* vmalloc'ed buffer */
  48
  49/*
  50 * info for buffer allocation
  51 */
  52struct snd_dma_buffer {
  53        struct snd_dma_device dev;      /* device type */
  54        unsigned char *area;    /* virtual pointer */
  55        dma_addr_t addr;        /* physical address */
  56        size_t bytes;           /* buffer size in bytes */
  57        void *private_data;     /* private for allocator; don't touch */
  58};
  59
  60/*
  61 * return the pages matching with the given byte size
  62 */
  63static inline unsigned int snd_sgbuf_aligned_pages(size_t size)
  64{
  65        return (size + PAGE_SIZE - 1) >> PAGE_SHIFT;
  66}
  67
  68/* allocate/release a buffer */
  69int snd_dma_alloc_pages(int type, struct device *dev, size_t size,
  70                        struct snd_dma_buffer *dmab);
  71int snd_dma_alloc_pages_fallback(int type, struct device *dev, size_t size,
  72                                 struct snd_dma_buffer *dmab);
  73void snd_dma_free_pages(struct snd_dma_buffer *dmab);
  74int snd_dma_buffer_mmap(struct snd_dma_buffer *dmab,
  75                        struct vm_area_struct *area);
  76
  77dma_addr_t snd_sgbuf_get_addr(struct snd_dma_buffer *dmab, size_t offset);
  78struct page *snd_sgbuf_get_page(struct snd_dma_buffer *dmab, size_t offset);
  79unsigned int snd_sgbuf_get_chunk_size(struct snd_dma_buffer *dmab,
  80                                      unsigned int ofs, unsigned int size);
  81
  82/* device-managed memory allocator */
  83struct snd_dma_buffer *snd_devm_alloc_pages(struct device *dev, int type,
  84                                            size_t size);
  85
  86#endif /* __SOUND_MEMALLOC_H */
  87
  88