OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [linux-2.4/] [include/] [asm-ia64/] [sn/] [alenlist.h] - Blame information for rev 1774

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1275 phoenix
/* $Id: alenlist.h,v 1.1.1.1 2004-04-15 02:42:28 phoenix Exp $
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 */

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.