Blame view

include/sound/memalloc.h 3.72 KB
1a59d1b8e   Thomas Gleixner   treewide: Replace...
1
  /* SPDX-License-Identifier: GPL-2.0-or-later */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2
  /*
c1017a4cd   Jaroslav Kysela   [ALSA] Changed Ja...
3
   *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4
5
6
   *                   Takashi Iwai <tiwai@suse.de>
   * 
   *  Generic memory allocators
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7
8
9
10
   */
  
  #ifndef __SOUND_MEMALLOC_H
  #define __SOUND_MEMALLOC_H
345a9ca37   Takashi Iwai   ALSA: memalloc: F...
11
  #include <asm/page.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
12
13
14
15
16
17
18
19
20
  struct device;
  
  /*
   * buffer device info
   */
  struct snd_dma_device {
  	int type;			/* SNDRV_DMA_TYPE_XXX */
  	struct device *dev;		/* generic device */
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
21
  #define snd_dma_pci_data(pci)	(&(pci)->dev)
019d80db5   Antonio Ospite   ALSA: Force a cas...
22
  #define snd_dma_continuous_data(x)	((struct device *)(__force unsigned long)(x))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
23
24
25
26
27
28
29
30
  
  
  /*
   * buffer types
   */
  #define SNDRV_DMA_TYPE_UNKNOWN		0	/* not defined */
  #define SNDRV_DMA_TYPE_CONTINUOUS	1	/* continuous no-DMA memory */
  #define SNDRV_DMA_TYPE_DEV		2	/* generic device continuous */
42e748a0b   Takashi Iwai   ALSA: memalloc: A...
31
  #define SNDRV_DMA_TYPE_DEV_UC		5	/* continuous non-cahced */
cc6a8acde   Takashi Iwai   ALSA: Fix SG-buff...
32
  #ifdef CONFIG_SND_DMA_SGBUF
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
33
  #define SNDRV_DMA_TYPE_DEV_SG		3	/* generic device SG-buffer */
42e748a0b   Takashi Iwai   ALSA: memalloc: A...
34
  #define SNDRV_DMA_TYPE_DEV_UC_SG	6	/* SG non-cached */
cc6a8acde   Takashi Iwai   ALSA: Fix SG-buff...
35
36
  #else
  #define SNDRV_DMA_TYPE_DEV_SG	SNDRV_DMA_TYPE_DEV /* no SG-buf support */
42e748a0b   Takashi Iwai   ALSA: memalloc: A...
37
  #define SNDRV_DMA_TYPE_DEV_UC_SG	SNDRV_DMA_TYPE_DEV_UC
cc6a8acde   Takashi Iwai   ALSA: Fix SG-buff...
38
  #endif
a5606f856   Takashi Iwai   ALSA: Add ifdef C...
39
  #ifdef CONFIG_GENERIC_ALLOCATOR
055032142   Nicolin Chen   ALSA: Add SoC on-...
40
  #define SNDRV_DMA_TYPE_DEV_IRAM		4	/* generic device iram-buffer */
a5606f856   Takashi Iwai   ALSA: Add ifdef C...
41
42
43
  #else
  #define SNDRV_DMA_TYPE_DEV_IRAM	SNDRV_DMA_TYPE_DEV
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
44
45
46
47
48
49
50
51
52
53
54
  
  /*
   * info for buffer allocation
   */
  struct snd_dma_buffer {
  	struct snd_dma_device dev;	/* device type */
  	unsigned char *area;	/* virtual pointer */
  	dma_addr_t addr;	/* physical address */
  	size_t bytes;		/* buffer size in bytes */
  	void *private_data;	/* private for allocator; don't touch */
  };
4cae99d9b   Pierre-Louis Bossart   ALSA: memalloc: d...
55
56
57
58
59
60
61
  /*
   * return the pages matching with the given byte size
   */
  static inline unsigned int snd_sgbuf_aligned_pages(size_t size)
  {
  	return (size + PAGE_SIZE - 1) >> PAGE_SHIFT;
  }
cc6a8acde   Takashi Iwai   ALSA: Fix SG-buff...
62
  #ifdef CONFIG_SND_DMA_SGBUF
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
63
64
65
  /*
   * Scatter-Gather generic device pages
   */
77a23f269   Takashi Iwai   ALSA: Clean up SG...
66
67
68
69
  void *snd_malloc_sgbuf_pages(struct device *device,
  			     size_t size, struct snd_dma_buffer *dmab,
  			     size_t *res_size);
  int snd_free_sgbuf_pages(struct snd_dma_buffer *dmab);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
  struct snd_sg_page {
  	void *buf;
  	dma_addr_t addr;
  };
  
  struct snd_sg_buf {
  	int size;	/* allocated byte size */
  	int pages;	/* allocated pages */
  	int tblsize;	/* allocated table size */
  	struct snd_sg_page *table;	/* address table */
  	struct page **page_table;	/* page table (for vmap/vunmap) */
  	struct device *dev;
  };
  
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
85
86
   * return the physical address at the corresponding offset
   */
9d069dc00   Takashi Iwai   ALSA: Make snd_sg...
87
88
  static inline dma_addr_t snd_sgbuf_get_addr(struct snd_dma_buffer *dmab,
  					   size_t offset)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
89
  {
9d069dc00   Takashi Iwai   ALSA: Make snd_sg...
90
  	struct snd_sg_buf *sgbuf = dmab->private_data;
51e9f2e66   Takashi Iwai   ALSA: Allocate la...
91
  	dma_addr_t addr = sgbuf->table[offset >> PAGE_SHIFT].addr;
932e9dec3   Stefano Panella   ALSA: memalloc.h ...
92
  	addr &= ~((dma_addr_t)PAGE_SIZE - 1);
51e9f2e66   Takashi Iwai   ALSA: Allocate la...
93
  	return addr + offset % PAGE_SIZE;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
94
  }
77a23f269   Takashi Iwai   ALSA: Clean up SG...
95
96
97
  /*
   * return the virtual address at the corresponding offset
   */
9d069dc00   Takashi Iwai   ALSA: Make snd_sg...
98
99
  static inline void *snd_sgbuf_get_ptr(struct snd_dma_buffer *dmab,
  				     size_t offset)
77a23f269   Takashi Iwai   ALSA: Clean up SG...
100
  {
9d069dc00   Takashi Iwai   ALSA: Make snd_sg...
101
  	struct snd_sg_buf *sgbuf = dmab->private_data;
77a23f269   Takashi Iwai   ALSA: Clean up SG...
102
103
  	return sgbuf->table[offset >> PAGE_SHIFT].buf + offset % PAGE_SIZE;
  }
9d069dc00   Takashi Iwai   ALSA: Make snd_sg...
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
  
  unsigned int snd_sgbuf_get_chunk_size(struct snd_dma_buffer *dmab,
  				      unsigned int ofs, unsigned int size);
  #else
  /* non-SG versions */
  static inline dma_addr_t snd_sgbuf_get_addr(struct snd_dma_buffer *dmab,
  					    size_t offset)
  {
  	return dmab->addr + offset;
  }
  
  static inline void *snd_sgbuf_get_ptr(struct snd_dma_buffer *dmab,
  				      size_t offset)
  {
  	return dmab->area + offset;
  }
  
  #define snd_sgbuf_get_chunk_size(dmab, ofs, size)	(size)
cc6a8acde   Takashi Iwai   ALSA: Fix SG-buff...
122
  #endif /* CONFIG_SND_DMA_SGBUF */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
123
124
125
126
127
128
129
  
  /* allocate/release a buffer */
  int snd_dma_alloc_pages(int type, struct device *dev, size_t size,
  			struct snd_dma_buffer *dmab);
  int snd_dma_alloc_pages_fallback(int type, struct device *dev, size_t size,
                                   struct snd_dma_buffer *dmab);
  void snd_dma_free_pages(struct snd_dma_buffer *dmab);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
130
  #endif /* __SOUND_MEMALLOC_H */