xref: /openbmc/linux/include/sound/memalloc.h (revision 427ae268)
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 
1283fbcaedSTakashi Iwai #include <asm/page.h>
1383fbcaedSTakashi Iwai 
141da177e4SLinus Torvalds struct device;
15a202bd1aSTakashi Iwai struct vm_area_struct;
161da177e4SLinus Torvalds 
171da177e4SLinus Torvalds /*
181da177e4SLinus Torvalds  * buffer device info
191da177e4SLinus Torvalds  */
201da177e4SLinus Torvalds struct snd_dma_device {
211da177e4SLinus Torvalds 	int type;			/* SNDRV_DMA_TYPE_XXX */
221da177e4SLinus Torvalds 	struct device *dev;		/* generic device */
231da177e4SLinus Torvalds };
241da177e4SLinus Torvalds 
25019d80dbSAntonio Ospite #define snd_dma_continuous_data(x)	((struct device *)(__force unsigned long)(x))
261da177e4SLinus Torvalds 
271da177e4SLinus Torvalds 
281da177e4SLinus Torvalds /*
291da177e4SLinus Torvalds  * buffer types
301da177e4SLinus Torvalds  */
311da177e4SLinus Torvalds #define SNDRV_DMA_TYPE_UNKNOWN		0	/* not defined */
321da177e4SLinus Torvalds #define SNDRV_DMA_TYPE_CONTINUOUS	1	/* continuous no-DMA memory */
331da177e4SLinus Torvalds #define SNDRV_DMA_TYPE_DEV		2	/* generic device continuous */
3442e748a0STakashi Iwai #define SNDRV_DMA_TYPE_DEV_UC		5	/* continuous non-cahced */
35cc6a8acdSTakashi Iwai #ifdef CONFIG_SND_DMA_SGBUF
361da177e4SLinus Torvalds #define SNDRV_DMA_TYPE_DEV_SG		3	/* generic device SG-buffer */
3742e748a0STakashi Iwai #define SNDRV_DMA_TYPE_DEV_UC_SG	6	/* SG non-cached */
38cc6a8acdSTakashi Iwai #else
39cc6a8acdSTakashi Iwai #define SNDRV_DMA_TYPE_DEV_SG	SNDRV_DMA_TYPE_DEV /* no SG-buf support */
4042e748a0STakashi Iwai #define SNDRV_DMA_TYPE_DEV_UC_SG	SNDRV_DMA_TYPE_DEV_UC
41cc6a8acdSTakashi Iwai #endif
42a5606f85STakashi Iwai #ifdef CONFIG_GENERIC_ALLOCATOR
4305503214SNicolin Chen #define SNDRV_DMA_TYPE_DEV_IRAM		4	/* generic device iram-buffer */
44a5606f85STakashi Iwai #else
45a5606f85STakashi Iwai #define SNDRV_DMA_TYPE_DEV_IRAM	SNDRV_DMA_TYPE_DEV
46a5606f85STakashi Iwai #endif
471fe7f397STakashi Iwai #define SNDRV_DMA_TYPE_VMALLOC		7	/* vmalloc'ed buffer */
481da177e4SLinus Torvalds 
491da177e4SLinus Torvalds /*
501da177e4SLinus Torvalds  * info for buffer allocation
511da177e4SLinus Torvalds  */
521da177e4SLinus Torvalds struct snd_dma_buffer {
531da177e4SLinus Torvalds 	struct snd_dma_device dev;	/* device type */
541da177e4SLinus Torvalds 	unsigned char *area;	/* virtual pointer */
551da177e4SLinus Torvalds 	dma_addr_t addr;	/* physical address */
561da177e4SLinus Torvalds 	size_t bytes;		/* buffer size in bytes */
571da177e4SLinus Torvalds 	void *private_data;	/* private for allocator; don't touch */
581da177e4SLinus Torvalds };
591da177e4SLinus Torvalds 
604cae99d9SPierre-Louis Bossart /*
614cae99d9SPierre-Louis Bossart  * return the pages matching with the given byte size
624cae99d9SPierre-Louis Bossart  */
634cae99d9SPierre-Louis Bossart static inline unsigned int snd_sgbuf_aligned_pages(size_t size)
644cae99d9SPierre-Louis Bossart {
654cae99d9SPierre-Louis Bossart 	return (size + PAGE_SIZE - 1) >> PAGE_SHIFT;
664cae99d9SPierre-Louis Bossart }
674cae99d9SPierre-Louis Bossart 
681da177e4SLinus Torvalds /* allocate/release a buffer */
691da177e4SLinus Torvalds int snd_dma_alloc_pages(int type, struct device *dev, size_t size,
701da177e4SLinus Torvalds 			struct snd_dma_buffer *dmab);
711da177e4SLinus Torvalds int snd_dma_alloc_pages_fallback(int type, struct device *dev, size_t size,
721da177e4SLinus Torvalds                                  struct snd_dma_buffer *dmab);
731da177e4SLinus Torvalds void snd_dma_free_pages(struct snd_dma_buffer *dmab);
74a202bd1aSTakashi Iwai int snd_dma_buffer_mmap(struct snd_dma_buffer *dmab,
75a202bd1aSTakashi Iwai 			struct vm_area_struct *area);
761da177e4SLinus Torvalds 
7737af81c5STakashi Iwai dma_addr_t snd_sgbuf_get_addr(struct snd_dma_buffer *dmab, size_t offset);
7837af81c5STakashi Iwai struct page *snd_sgbuf_get_page(struct snd_dma_buffer *dmab, size_t offset);
7937af81c5STakashi Iwai unsigned int snd_sgbuf_get_chunk_size(struct snd_dma_buffer *dmab,
8037af81c5STakashi Iwai 				      unsigned int ofs, unsigned int size);
8137af81c5STakashi Iwai 
82*427ae268STakashi Iwai /* device-managed memory allocator */
83*427ae268STakashi Iwai struct snd_dma_buffer *snd_devm_alloc_pages(struct device *dev, int type,
84*427ae268STakashi Iwai 					    size_t size);
85*427ae268STakashi Iwai 
861da177e4SLinus Torvalds #endif /* __SOUND_MEMALLOC_H */
871da177e4SLinus Torvalds 
88