Update ia64 patch to 2.5.69-030521, throwing away the parts included
[linux-flexiantxendom0-3.2.10.git] / include / asm-ia64 / sn / alenlist.h
1 /* $Id$
2  *
3  * This file is subject to the terms and conditions of the GNU General Public
4  * License.  See the file "COPYING" in the main directory of this archive
5  * for more details.
6  *
7  * Copyright (C) 1992 - 1997, 2000-2003 Silicon Graphics, Inc. All rights reserved.
8  */
9 #ifndef _ASM_IA64_SN_ALENLIST_H
10 #define _ASM_IA64_SN_ALENLIST_H
11
12 #include <linux/types.h>
13
14 /* Definition of Address/Length List */
15
16 /*
17  * An Address/Length List is used when setting up for an I/O DMA operation.
18  * A driver creates an Address/Length List that describes to the the DMA 
19  * interface where in memory the DMA should go.  The bus interface sets up 
20  * mapping registers, if required, and returns a suitable list of "physical 
21  * addresses" or "I/O address" to the driver.  The driver then uses these 
22  * to set up an appropriate scatter/gather operation(s).
23  */
24
25 #ifdef __cplusplus
26 extern "C" {
27 #endif
28
29 /*
30  * An Address/Length List Address.  It'll get cast to the appropriate type,
31  * and must be big enough to hold the largest possible address in any
32  * supported address space.
33  */
34 typedef u64 alenaddr_t;
35 typedef u64 uvaddr_t;
36
37 typedef struct alenlist_s *alenlist_t;
38
39 /* 
40  * For tracking progress as we walk down an address/length list.
41  */
42 typedef struct alenlist_cursor_s *alenlist_cursor_t;
43
44 /*
45  * alenlist representation that can be passed via an idl
46  */
47 struct external_alenlist {
48         alenaddr_t      addr;
49         size_t          len;
50 };
51 typedef struct external_alenlist *external_alenlist_t;
52
53
54 /* Return codes from alenlist routines.  */
55 #define ALENLIST_FAILURE (-1)
56 #define ALENLIST_SUCCESS 0
57
58
59 /* Flags to alenlist routines */
60 #define AL_NOSLEEP      0x01            /* Do not sleep, waiting for memory */
61 #define AL_NOCOMPACT    0x02            /* Do not try to compact adjacent entries */
62 #define AL_LEAVE_CURSOR 0x04            /* Do not update cursor */
63
64
65 /* Create an Address/Length List, and clear it of all entries.  */
66 extern alenlist_t alenlist_create(unsigned flags);
67
68 /* Grow/shrink an Address/Length List and FIX its size. */
69 extern int alenlist_grow(alenlist_t, size_t npairs);
70
71 /* Clear an Address/Length List so that it now describes 0 pairs. */
72 extern void alenlist_clear(alenlist_t alenlist);
73
74 /*
75  * Convenience function to create an Address/Length List and then append 
76  * the specified Address/Length Pair.  Exactly the same as alenlist_create 
77  * followed by alenlist_append.  Can be used when a small list (e.g. 1 pair)
78  * is adequate.
79  */
80 extern alenlist_t
81 alenpair_init(  alenaddr_t address,                     /* init to this address */
82                 size_t length);                         /* init to this length */
83
84 /* 
85  * Peek at the head of an Address/Length List.  This does *NOT* update
86  * the internal cursor.
87  */
88 extern int
89 alenpair_get(   alenlist_t alenlist,            /* in: get from this List */
90                 alenaddr_t *address,            /* out: address */
91                 size_t *length);                /* out: length */
92
93 /* Free the space consumed by an Address/Length List. */
94 extern void alenlist_destroy(alenlist_t alenlist);
95
96 /*
97  * Indicate that we're done using an Address/Length List.
98  * If we are the last user, destroy the List.
99  */
100 extern void
101 alenlist_done(alenlist_t alenlist);
102
103 /* Append another Pair to a List */
104 extern int alenlist_append(alenlist_t alenlist,         /* append to this list */
105                         alenaddr_t address,             /* address to append */
106                         size_t length,                  /* length to append */
107                         unsigned flags);
108
109 /* 
110  * Replace a Pair in the middle of a List, and return old values.
111  * (not generally useful for drivers; used by bus providers).
112  */
113 extern int
114 alenlist_replace(       alenlist_t alenlist,            /* in: replace in this list */
115                         alenlist_cursor_t cursorp,      /* inout: which item to replace */
116                         alenaddr_t *addrp,              /* inout: address */
117                         size_t *lengthp,                /* inout: length */
118                         unsigned flags);
119
120
121 /* Get the next Pair from a List */
122 extern int alenlist_get(alenlist_t alenlist,            /* in: get from this list */
123                         alenlist_cursor_t cursorp,      /* inout: which item to get */
124                         size_t maxlength,               /* in: at most length */
125                         alenaddr_t *addr,               /* out: address */
126                         size_t *length,                 /* out: length */
127                         unsigned flags);
128
129
130 /* Return the number of Pairs stored in this List */
131 extern int alenlist_size(alenlist_t alenlist);
132
133 /* Concatenate two Lists. */
134 extern void alenlist_concat(    alenlist_t from,        /* copy from this list */
135                                 alenlist_t to);         /* to this list */
136
137 /* Create a copy of an Address/Length List */
138 extern alenlist_t alenlist_clone(alenlist_t old,        /* clone this list */
139                                  unsigned flags);
140
141
142 /* Allocate and initialize an Address/Length List Cursor */
143 extern alenlist_cursor_t alenlist_cursor_create(alenlist_t alenlist, unsigned flags);
144
145 /* Free an Address/Length List Cursor */
146 extern void alenlist_cursor_destroy(alenlist_cursor_t cursorp);
147
148 /*
149  * Initialize an Address/Length List Cursor in order to walk thru an
150  * Address/Length List from the beginning.
151  */
152 extern int alenlist_cursor_init(alenlist_t alenlist, 
153                                 size_t offset, 
154                                 alenlist_cursor_t cursorp);
155
156 /* Clone an Address/Length List Cursor. */
157 extern int alenlist_cursor_clone(alenlist_t alenlist, 
158                                 alenlist_cursor_t cursorp_in, 
159                                 alenlist_cursor_t cursorp_out);
160
161 /* 
162  * Return the number of bytes passed so far according to the specified
163  * Address/Length List Cursor.
164  */
165 extern size_t alenlist_cursor_offset(alenlist_t alenlist, alenlist_cursor_t cursorp);
166
167
168
169
170 /* Convert from a Kernel Virtual Address to a Physical Address/Length List */
171 extern alenlist_t kvaddr_to_alenlist(   alenlist_t alenlist, 
172                                         caddr_t kvaddr, 
173                                         size_t length, 
174                                         unsigned flags);
175
176 /* Convert from a User Virtual Address to a Physical Address/Length List */
177 extern alenlist_t uvaddr_to_alenlist(   alenlist_t alenlist,
178                                         uvaddr_t vaddr, 
179                                         size_t length,
180                                         unsigned flags);
181
182 /* Convert from a buf struct to a Physical Address/Length List */
183 struct buf;
184 extern alenlist_t buf_to_alenlist(      alenlist_t alenlist, 
185                                         struct buf *buf, 
186                                         unsigned flags);
187
188
189 /* 
190  * Tracking position as we walk down an Address/Length List.
191  * This structure is NOT generally for use by device drivers.
192  */
193 struct alenlist_cursor_s {
194         struct alenlist_s       *al_alenlist;   /* which list */
195         size_t                  al_offset;      /* total bytes passed by cursor */
196         struct alenlist_chunk_s *al_chunk;      /* which chunk in alenlist */
197         unsigned int            al_index;       /* which pair in chunk */
198         size_t                  al_bcount;      /* offset into address/length pair */
199 };
200
201 #ifdef __cplusplus
202 }
203 #endif
204
205 #endif /* _ASM_IA64_SN_ALENLIST_H */