Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/include/sound/memalloc.h
10820 views
1
/*
2
* Copyright (c) by Jaroslav Kysela <[email protected]>
3
* Takashi Iwai <[email protected]>
4
*
5
* Generic memory allocators
6
*
7
*
8
* This program is free software; you can redistribute it and/or modify
9
* it under the terms of the GNU General Public License as published by
10
* the Free Software Foundation; either version 2 of the License, or
11
* (at your option) any later version.
12
*
13
* This program is distributed in the hope that it will be useful,
14
* but WITHOUT ANY WARRANTY; without even the implied warranty of
15
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
* GNU General Public License for more details.
17
*
18
* You should have received a copy of the GNU General Public License
19
* along with this program; if not, write to the Free Software
20
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21
*
22
*/
23
24
#ifndef __SOUND_MEMALLOC_H
25
#define __SOUND_MEMALLOC_H
26
27
struct device;
28
29
/*
30
* buffer device info
31
*/
32
struct snd_dma_device {
33
int type; /* SNDRV_DMA_TYPE_XXX */
34
struct device *dev; /* generic device */
35
};
36
37
#ifndef snd_dma_pci_data
38
#define snd_dma_pci_data(pci) (&(pci)->dev)
39
#define snd_dma_isa_data() NULL
40
#define snd_dma_continuous_data(x) ((struct device *)(unsigned long)(x))
41
#endif
42
43
44
/*
45
* buffer types
46
*/
47
#define SNDRV_DMA_TYPE_UNKNOWN 0 /* not defined */
48
#define SNDRV_DMA_TYPE_CONTINUOUS 1 /* continuous no-DMA memory */
49
#define SNDRV_DMA_TYPE_DEV 2 /* generic device continuous */
50
#ifdef CONFIG_SND_DMA_SGBUF
51
#define SNDRV_DMA_TYPE_DEV_SG 3 /* generic device SG-buffer */
52
#else
53
#define SNDRV_DMA_TYPE_DEV_SG SNDRV_DMA_TYPE_DEV /* no SG-buf support */
54
#endif
55
56
/*
57
* info for buffer allocation
58
*/
59
struct snd_dma_buffer {
60
struct snd_dma_device dev; /* device type */
61
unsigned char *area; /* virtual pointer */
62
dma_addr_t addr; /* physical address */
63
size_t bytes; /* buffer size in bytes */
64
void *private_data; /* private for allocator; don't touch */
65
};
66
67
#ifdef CONFIG_SND_DMA_SGBUF
68
/*
69
* Scatter-Gather generic device pages
70
*/
71
void *snd_malloc_sgbuf_pages(struct device *device,
72
size_t size, struct snd_dma_buffer *dmab,
73
size_t *res_size);
74
int snd_free_sgbuf_pages(struct snd_dma_buffer *dmab);
75
76
struct snd_sg_page {
77
void *buf;
78
dma_addr_t addr;
79
};
80
81
struct snd_sg_buf {
82
int size; /* allocated byte size */
83
int pages; /* allocated pages */
84
int tblsize; /* allocated table size */
85
struct snd_sg_page *table; /* address table */
86
struct page **page_table; /* page table (for vmap/vunmap) */
87
struct device *dev;
88
};
89
90
/*
91
* return the pages matching with the given byte size
92
*/
93
static inline unsigned int snd_sgbuf_aligned_pages(size_t size)
94
{
95
return (size + PAGE_SIZE - 1) >> PAGE_SHIFT;
96
}
97
98
/*
99
* return the physical address at the corresponding offset
100
*/
101
static inline dma_addr_t snd_sgbuf_get_addr(struct snd_sg_buf *sgbuf, size_t offset)
102
{
103
dma_addr_t addr = sgbuf->table[offset >> PAGE_SHIFT].addr;
104
addr &= PAGE_MASK;
105
return addr + offset % PAGE_SIZE;
106
}
107
108
/*
109
* return the virtual address at the corresponding offset
110
*/
111
static inline void *snd_sgbuf_get_ptr(struct snd_sg_buf *sgbuf, size_t offset)
112
{
113
return sgbuf->table[offset >> PAGE_SHIFT].buf + offset % PAGE_SIZE;
114
}
115
#endif /* CONFIG_SND_DMA_SGBUF */
116
117
/* allocate/release a buffer */
118
int snd_dma_alloc_pages(int type, struct device *dev, size_t size,
119
struct snd_dma_buffer *dmab);
120
int snd_dma_alloc_pages_fallback(int type, struct device *dev, size_t size,
121
struct snd_dma_buffer *dmab);
122
void snd_dma_free_pages(struct snd_dma_buffer *dmab);
123
124
/* buffer-preservation managements */
125
126
#define snd_dma_pci_buf_id(pci) (((unsigned int)(pci)->vendor << 16) | (pci)->device)
127
128
size_t snd_dma_get_reserved_buf(struct snd_dma_buffer *dmab, unsigned int id);
129
int snd_dma_reserve_buf(struct snd_dma_buffer *dmab, unsigned int id);
130
131
/* basic memory allocation functions */
132
void *snd_malloc_pages(size_t size, gfp_t gfp_flags);
133
void snd_free_pages(void *ptr, size_t size);
134
135
#endif /* __SOUND_MEMALLOC_H */
136
137
138