Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
include
sound
memalloc.h
Go to the documentation of this file.
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_dma_buffer
*dmab,
102
size_t
offset
)
103
{
104
struct
snd_sg_buf *sgbuf = dmab->
private_data
;
105
dma_addr_t
addr
= sgbuf->table[offset >>
PAGE_SHIFT
].addr;
106
addr &=
PAGE_MASK
;
107
return
addr + offset %
PAGE_SIZE
;
108
}
109
110
/*
111
* return the virtual address at the corresponding offset
112
*/
113
static
inline
void
*snd_sgbuf_get_ptr(
struct
snd_dma_buffer
*dmab,
114
size_t
offset
)
115
{
116
struct
snd_sg_buf *sgbuf = dmab->
private_data
;
117
return
sgbuf->table[offset >>
PAGE_SHIFT
].buf + offset %
PAGE_SIZE
;
118
}
119
120
unsigned
int
snd_sgbuf_get_chunk_size
(
struct
snd_dma_buffer
*dmab,
121
unsigned
int
ofs,
unsigned
int
size);
122
#else
123
/* non-SG versions */
124
static
inline
dma_addr_t
snd_sgbuf_get_addr(
struct
snd_dma_buffer
*dmab,
125
size_t
offset
)
126
{
127
return
dmab->
addr
+
offset
;
128
}
129
130
static
inline
void
*snd_sgbuf_get_ptr(
struct
snd_dma_buffer
*dmab,
131
size_t
offset
)
132
{
133
return
dmab->
area
+
offset
;
134
}
135
136
#define snd_sgbuf_get_chunk_size(dmab, ofs, size) (size)
137
138
#endif
/* CONFIG_SND_DMA_SGBUF */
139
140
/* allocate/release a buffer */
141
int
snd_dma_alloc_pages
(
int
type
,
struct
device
*
dev
,
size_t
size,
142
struct
snd_dma_buffer
*dmab);
143
int
snd_dma_alloc_pages_fallback
(
int
type
,
struct
device
*
dev
,
size_t
size,
144
struct
snd_dma_buffer
*dmab);
145
void
snd_dma_free_pages
(
struct
snd_dma_buffer
*dmab);
146
147
/* buffer-preservation managements */
148
149
#define snd_dma_pci_buf_id(pci) (((unsigned int)(pci)->vendor << 16) | (pci)->device)
150
151
size_t
snd_dma_get_reserved_buf
(
struct
snd_dma_buffer
*dmab,
unsigned
int
id
);
152
int
snd_dma_reserve_buf
(
struct
snd_dma_buffer
*dmab,
unsigned
int
id
);
153
154
/* basic memory allocation functions */
155
void
*
snd_malloc_pages
(
size_t
size,
gfp_t
gfp_flags);
156
void
snd_free_pages
(
void
*
ptr
,
size_t
size);
157
158
#endif
/* __SOUND_MEMALLOC_H */
159
Generated on Thu Jan 10 2013 14:53:34 for Linux Kernel by
1.8.2