xref: /openbmc/linux/include/sound/memalloc.h (revision 37af81c5)
11a59d1b8SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */
21da177e4SLinus Torvalds /*
3c1017a4cSJaroslav Kysela  *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
41da177e4SLinus Torvalds  *                   Takashi Iwai <tiwai@suse.de>
51da177e4SLinus Torvalds  *
61da177e4SLinus Torvalds  *  Generic memory allocators
71da177e4SLinus Torvalds  */
81da177e4SLinus Torvalds 
91da177e4SLinus Torvalds #ifndef __SOUND_MEMALLOC_H
101da177e4SLinus Torvalds #define __SOUND_MEMALLOC_H
111da177e4SLinus Torvalds 
121da177e4SLinus Torvalds struct device;
13*37af81c5STakashi Iwai struct page;
141da177e4SLinus Torvalds 
151da177e4SLinus Torvalds /*
161da177e4SLinus Torvalds  * buffer device info
171da177e4SLinus Torvalds  */
181da177e4SLinus Torvalds struct snd_dma_device {
191da177e4SLinus Torvalds 	int type;			/* SNDRV_DMA_TYPE_XXX */
201da177e4SLinus Torvalds 	struct device *dev;		/* generic device */
211da177e4SLinus Torvalds };
221da177e4SLinus Torvalds 
23019d80dbSAntonio Ospite #define snd_dma_continuous_data(x)	((struct device *)(__force unsigned long)(x))
241da177e4SLinus Torvalds 
251da177e4SLinus Torvalds 
261da177e4SLinus Torvalds /*
271da177e4SLinus Torvalds  * buffer types
281da177e4SLinus Torvalds  */
291da177e4SLinus Torvalds #define SNDRV_DMA_TYPE_UNKNOWN		0	/* not defined */
301da177e4SLinus Torvalds #define SNDRV_DMA_TYPE_CONTINUOUS	1	/* continuous no-DMA memory */
311da177e4SLinus Torvalds #define SNDRV_DMA_TYPE_DEV		2	/* generic device continuous */
3242e748a0STakashi Iwai #define SNDRV_DMA_TYPE_DEV_UC		5	/* continuous non-cahced */
33cc6a8acdSTakashi Iwai #ifdef CONFIG_SND_DMA_SGBUF
341da177e4SLinus Torvalds #define SNDRV_DMA_TYPE_DEV_SG		3	/* generic device SG-buffer */
3542e748a0STakashi Iwai #define SNDRV_DMA_TYPE_DEV_UC_SG	6	/* SG non-cached */
36cc6a8acdSTakashi Iwai #else
37cc6a8acdSTakashi Iwai #define SNDRV_DMA_TYPE_DEV_SG	SNDRV_DMA_TYPE_DEV /* no SG-buf support */
3842e748a0STakashi Iwai #define SNDRV_DMA_TYPE_DEV_UC_SG	SNDRV_DMA_TYPE_DEV_UC
39cc6a8acdSTakashi Iwai #endif
40a5606f85STakashi Iwai #ifdef CONFIG_GENERIC_ALLOCATOR
4105503214SNicolin Chen #define SNDRV_DMA_TYPE_DEV_IRAM		4	/* generic device iram-buffer */
42a5606f85STakashi Iwai #else
43a5606f85STakashi Iwai #define SNDRV_DMA_TYPE_DEV_IRAM	SNDRV_DMA_TYPE_DEV
44a5606f85STakashi Iwai #endif
451fe7f397STakashi Iwai #define SNDRV_DMA_TYPE_VMALLOC		7	/* vmalloc'ed buffer */
461da177e4SLinus Torvalds 
471da177e4SLinus Torvalds /*
481da177e4SLinus Torvalds  * info for buffer allocation
491da177e4SLinus Torvalds  */
501da177e4SLinus Torvalds struct snd_dma_buffer {
511da177e4SLinus Torvalds 	struct snd_dma_device dev;	/* device type */
521da177e4SLinus Torvalds 	unsigned char *area;	/* virtual pointer */
531da177e4SLinus Torvalds 	dma_addr_t addr;	/* physical address */
541da177e4SLinus Torvalds 	size_t bytes;		/* buffer size in bytes */
551da177e4SLinus Torvalds 	void *private_data;	/* private for allocator; don't touch */
561da177e4SLinus Torvalds };
571da177e4SLinus Torvalds 
584cae99d9SPierre-Louis Bossart /*
594cae99d9SPierre-Louis Bossart  * return the pages matching with the given byte size
604cae99d9SPierre-Louis Bossart  */
614cae99d9SPierre-Louis Bossart static inline unsigned int snd_sgbuf_aligned_pages(size_t size)
624cae99d9SPierre-Louis Bossart {
634cae99d9SPierre-Louis Bossart 	return (size + PAGE_SIZE - 1) >> PAGE_SHIFT;
644cae99d9SPierre-Louis Bossart }
654cae99d9SPierre-Louis Bossart 
661da177e4SLinus Torvalds /* allocate/release a buffer */
671da177e4SLinus Torvalds int snd_dma_alloc_pages(int type, struct device *dev, size_t size,
681da177e4SLinus Torvalds 			struct snd_dma_buffer *dmab);
691da177e4SLinus Torvalds int snd_dma_alloc_pages_fallback(int type, struct device *dev, size_t size,
701da177e4SLinus Torvalds                                  struct snd_dma_buffer *dmab);
711da177e4SLinus Torvalds void snd_dma_free_pages(struct snd_dma_buffer *dmab);
721da177e4SLinus Torvalds 
73*37af81c5STakashi Iwai dma_addr_t snd_sgbuf_get_addr(struct snd_dma_buffer *dmab, size_t offset);
74*37af81c5STakashi Iwai struct page *snd_sgbuf_get_page(struct snd_dma_buffer *dmab, size_t offset);
75*37af81c5STakashi Iwai unsigned int snd_sgbuf_get_chunk_size(struct snd_dma_buffer *dmab,
76*37af81c5STakashi Iwai 				      unsigned int ofs, unsigned int size);
77*37af81c5STakashi Iwai 
781da177e4SLinus Torvalds #endif /* __SOUND_MEMALLOC_H */
791da177e4SLinus Torvalds 
80