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
linux
async_tx.h
Go to the documentation of this file.
1
/*
2
* Copyright © 2006, Intel Corporation.
3
*
4
* This program is free software; you can redistribute it and/or modify it
5
* under the terms and conditions of the GNU General Public License,
6
* version 2, as published by the Free Software Foundation.
7
*
8
* This program is distributed in the hope it will be useful, but WITHOUT
9
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
11
* more details.
12
*
13
* You should have received a copy of the GNU General Public License along with
14
* this program; if not, write to the Free Software Foundation, Inc.,
15
* 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
16
*
17
*/
18
#ifndef _ASYNC_TX_H_
19
#define _ASYNC_TX_H_
20
#include <
linux/dmaengine.h
>
21
#include <
linux/spinlock.h
>
22
#include <
linux/interrupt.h
>
23
24
/* on architectures without dma-mapping capabilities we need to ensure
25
* that the asynchronous path compiles away
26
*/
27
#ifdef CONFIG_HAS_DMA
28
#define __async_inline
29
#else
30
#define __async_inline __always_inline
31
#endif
32
42
struct
dma_chan_ref
{
43
struct
dma_chan
*
chan
;
44
struct
list_head
node
;
45
struct
rcu_head
rcu
;
46
atomic_t
count
;
47
};
48
64
enum
async_tx_flags
{
65
ASYNC_TX_XOR_ZERO_DST
= (1 << 0),
66
ASYNC_TX_XOR_DROP_DST
= (1 << 1),
67
ASYNC_TX_ACK
= (1 << 2),
68
ASYNC_TX_FENCE
= (1 << 3),
69
};
70
79
struct
async_submit_ctl
{
80
enum
async_tx_flags
flags
;
81
struct
dma_async_tx_descriptor
*
depend_tx
;
82
dma_async_tx_callback
cb_fn
;
83
void
*
cb_param
;
84
void
*
scribble
;
85
};
86
87
#ifdef CONFIG_DMA_ENGINE
88
#define async_tx_issue_pending_all dma_issue_pending_all
89
98
static
inline
void
async_tx_issue_pending(
struct
dma_async_tx_descriptor
*
tx
)
99
{
100
if
(
likely
(tx)) {
101
struct
dma_chan
*
chan
= tx->
chan
;
102
struct
dma_device
*
dma
= chan->
device
;
103
104
dma->
device_issue_pending
(chan);
105
}
106
}
107
#ifdef CONFIG_ARCH_HAS_ASYNC_TX_FIND_CHANNEL
108
#include <
asm/async_tx.h
>
109
#else
110
#define async_tx_find_channel(dep, type, dst, dst_count, src, src_count, len) \
111
__async_tx_find_channel(dep, type)
112
struct
dma_chan
*
113
__async_tx_find_channel
(
struct
async_submit_ctl
*submit,
114
enum
dma_transaction_type
tx_type);
115
#endif
/* CONFIG_ARCH_HAS_ASYNC_TX_FIND_CHANNEL */
116
#else
117
static
inline
void
async_tx_issue_pending_all(
void
)
118
{
119
do
{ }
while
(0);
120
}
121
122
static
inline
void
async_tx_issue_pending(
struct
dma_async_tx_descriptor
*
tx
)
123
{
124
do
{ }
while
(0);
125
}
126
127
static
inline
struct
dma_chan
*
128
async_tx_find_channel
(
struct
async_submit_ctl
*submit,
129
enum
dma_transaction_type
tx_type,
struct
page
**
dst
,
130
int
dst_count,
struct
page
**
src
,
int
src_count,
131
size_t
len)
132
{
133
return
NULL
;
134
}
135
#endif
136
142
static
inline
void
143
async_tx_sync_epilog(
struct
async_submit_ctl
*submit)
144
{
145
if
(submit->
cb_fn
)
146
submit->
cb_fn
(submit->
cb_param
);
147
}
148
149
typedef
union
{
150
unsigned
long
addr
;
151
struct
page
*
page
;
152
dma_addr_t
dma
;
153
}
addr_conv_t
;
154
155
static
inline
void
156
init_async_submit(
struct
async_submit_ctl
*args,
enum
async_tx_flags
flags
,
157
struct
dma_async_tx_descriptor
*tx,
158
dma_async_tx_callback
cb_fn,
void
*cb_param,
159
addr_conv_t
*scribble)
160
{
161
args->
flags
=
flags
;
162
args->
depend_tx
=
tx
;
163
args->
cb_fn
= cb_fn;
164
args->
cb_param
= cb_param;
165
args->
scribble
= scribble;
166
}
167
168
void
async_tx_submit
(
struct
dma_chan
*
chan
,
struct
dma_async_tx_descriptor
*tx,
169
struct
async_submit_ctl
*submit);
170
171
struct
dma_async_tx_descriptor
*
172
async_xor
(
struct
page
*
dest
,
struct
page
**src_list,
unsigned
int
offset
,
173
int
src_cnt,
size_t
len,
struct
async_submit_ctl
*submit);
174
175
struct
dma_async_tx_descriptor
*
176
async_xor_val
(
struct
page
*
dest
,
struct
page
**src_list,
unsigned
int
offset
,
177
int
src_cnt,
size_t
len,
enum
sum_check_flags
*
result
,
178
struct
async_submit_ctl
*submit);
179
180
struct
dma_async_tx_descriptor
*
181
async_memcpy
(
struct
page
*
dest
,
struct
page
*
src
,
unsigned
int
dest_offset,
182
unsigned
int
src_offset,
size_t
len,
183
struct
async_submit_ctl
*submit);
184
185
struct
dma_async_tx_descriptor
*
186
async_memset
(
struct
page
*
dest
,
int
val
,
unsigned
int
offset
,
187
size_t
len,
struct
async_submit_ctl
*submit);
188
189
struct
dma_async_tx_descriptor
*
async_trigger_callback
(
struct
async_submit_ctl
*submit);
190
191
struct
dma_async_tx_descriptor
*
192
async_gen_syndrome
(
struct
page
**blocks,
unsigned
int
offset
,
int
src_cnt,
193
size_t
len,
struct
async_submit_ctl
*submit);
194
195
struct
dma_async_tx_descriptor
*
196
async_syndrome_val
(
struct
page
**blocks,
unsigned
int
offset
,
int
src_cnt,
197
size_t
len,
enum
sum_check_flags
*pqres,
struct
page
*spare,
198
struct
async_submit_ctl
*submit);
199
200
struct
dma_async_tx_descriptor
*
201
async_raid6_2data_recov
(
int
src_num,
size_t
bytes
,
int
faila,
int
failb,
202
struct
page
**
ptrs
,
struct
async_submit_ctl
*submit);
203
204
struct
dma_async_tx_descriptor
*
205
async_raid6_datap_recov
(
int
src_num,
size_t
bytes
,
int
faila,
206
struct
page
**
ptrs
,
struct
async_submit_ctl
*submit);
207
208
void
async_tx_quiesce
(
struct
dma_async_tx_descriptor
**tx);
209
#endif
/* _ASYNC_TX_H_ */
Generated on Thu Jan 10 2013 13:13:15 for Linux Kernel by
1.8.2