ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.6.tar.bz2
[linux-2.6.git] / include / asm-ia64 / sn / xtalk / xtalk.h
1 /*
2  * This file is subject to the terms and conditions of the GNU General Public
3  * License.  See the file "COPYING" in the main directory of this archive
4  * for more details.
5  *
6  * Copyright (C) 1992-1997, 2000-2003 Silicon Graphics, Inc.  All Rights Reserved.
7  */
8 #ifndef _ASM_IA64_SN_XTALK_XTALK_H
9 #define _ASM_IA64_SN_XTALK_XTALK_H
10 #include <linux/config.h>
11
12 #ifdef __KERNEL__
13 #include "asm/sn/sgi.h"
14 #endif
15
16
17 /*
18  * xtalk.h -- platform-independent crosstalk interface
19  */
20 /*
21  * User-level device driver visible types
22  */
23 typedef char            xwidgetnum_t;   /* xtalk widget number  (0..15) */
24
25 #define XWIDGET_NONE            (-1)
26
27 typedef int xwidget_part_num_t; /* xtalk widget part number */
28
29 #define XWIDGET_PART_NUM_NONE   (-1)
30
31 typedef int             xwidget_rev_num_t;      /* xtalk widget revision number */
32
33 #define XWIDGET_REV_NUM_NONE    (-1)
34
35 typedef int xwidget_mfg_num_t;  /* xtalk widget manufacturing ID */
36
37 #define XWIDGET_MFG_NUM_NONE    (-1)
38
39 typedef struct xtalk_piomap_s *xtalk_piomap_t;
40
41 /* It is often convenient to fold the XIO target port
42  * number into the XIO address.
43  */
44 #define XIO_NOWHERE     (0xFFFFFFFFFFFFFFFFull)
45 #define XIO_ADDR_BITS   (0x0000FFFFFFFFFFFFull)
46 #define XIO_PORT_BITS   (0xF000000000000000ull)
47 #define XIO_PORT_SHIFT  (60)
48
49 #define XIO_PACKED(x)   (((x)&XIO_PORT_BITS) != 0)
50 #define XIO_ADDR(x)     ((x)&XIO_ADDR_BITS)
51 #define XIO_PORT(x)     ((xwidgetnum_t)(((x)&XIO_PORT_BITS) >> XIO_PORT_SHIFT))
52 #define XIO_PACK(p,o)   ((((uint64_t)(p))<<XIO_PORT_SHIFT) | ((o)&XIO_ADDR_BITS))
53
54
55 /*
56  * Kernel/driver only definitions
57  */
58 #if __KERNEL__
59
60 #include <asm/types.h>
61 #include <asm/sn/types.h>
62 #include <asm/sn/ioerror.h>
63 #include <asm/sn/driver.h>
64 #include <asm/sn/dmamap.h>
65
66 struct xwidget_hwid_s;
67
68 /*
69  *    Acceptable flag bits for xtalk service calls
70  *
71  * XTALK_FIXED: require that mappings be established
72  *      using fixed sharable resources; address
73  *      translation results will be permanently
74  *      available. (PIOMAP_FIXED and DMAMAP_FIXED are
75  *      the same numeric value and are acceptable).
76  * XTALK_NOSLEEP: if any part of the operation would
77  *      sleep waiting for resoruces, return an error
78  *      instead. (PIOMAP_NOSLEEP and DMAMAP_NOSLEEP are
79  *      the same numeric value and are acceptable).
80  */
81 #define XTALK_FIXED             DMAMAP_FIXED
82 #define XTALK_NOSLEEP           DMAMAP_NOSLEEP
83
84 /* PIO MANAGEMENT */
85 typedef xtalk_piomap_t
86 xtalk_piomap_alloc_f    (vertex_hdl_t dev,      /* set up mapping for this device */
87                          device_desc_t dev_desc,        /* device descriptor */
88                          iopaddr_t xtalk_addr,  /* map for this xtalk_addr range */
89                          size_t byte_count,
90                          size_t byte_count_max,         /* maximum size of a mapping */
91                          unsigned int flags);   /* defined in sys/pio.h */
92 typedef void
93 xtalk_piomap_free_f     (xtalk_piomap_t xtalk_piomap);
94
95 typedef caddr_t
96 xtalk_piomap_addr_f     (xtalk_piomap_t xtalk_piomap,   /* mapping resources */
97                          iopaddr_t xtalk_addr,  /* map for this xtalk address */
98                          size_t byte_count);    /* map this many bytes */
99
100 typedef void
101 xtalk_piomap_done_f     (xtalk_piomap_t xtalk_piomap);
102
103 typedef caddr_t
104 xtalk_piotrans_addr_f   (vertex_hdl_t dev,      /* translate for this device */
105                          device_desc_t dev_desc,        /* device descriptor */
106                          iopaddr_t xtalk_addr,  /* Crosstalk address */
107                          size_t byte_count,     /* map this many bytes */
108                          unsigned int flags);   /* (currently unused) */
109
110 extern caddr_t
111 xtalk_pio_addr          (vertex_hdl_t dev,      /* translate for this device */
112                          device_desc_t dev_desc,        /* device descriptor */
113                          iopaddr_t xtalk_addr,  /* Crosstalk address */
114                          size_t byte_count,     /* map this many bytes */
115                          xtalk_piomap_t *xtalk_piomapp, /* RETURNS mapping resources */
116                          unsigned int flags);   /* (currently unused) */
117
118 /* DMA MANAGEMENT */
119
120 typedef struct xtalk_dmamap_s *xtalk_dmamap_t;
121
122 typedef xtalk_dmamap_t
123 xtalk_dmamap_alloc_f    (vertex_hdl_t dev,      /* set up mappings for this device */
124                          device_desc_t dev_desc,        /* device descriptor */
125                          size_t byte_count_max,         /* max size of a mapping */
126                          unsigned int flags);   /* defined in dma.h */
127
128 typedef void
129 xtalk_dmamap_free_f     (xtalk_dmamap_t dmamap);
130
131 typedef iopaddr_t
132 xtalk_dmamap_addr_f     (xtalk_dmamap_t dmamap,         /* use these mapping resources */
133                          paddr_t paddr,         /* map for this address */
134                          size_t byte_count);    /* map this many bytes */
135
136 typedef void
137 xtalk_dmamap_done_f     (xtalk_dmamap_t dmamap);
138
139 typedef iopaddr_t
140 xtalk_dmatrans_addr_f   (vertex_hdl_t dev,      /* translate for this device */
141                          device_desc_t dev_desc,        /* device descriptor */
142                          paddr_t paddr,         /* system physical address */
143                          size_t byte_count,     /* length */
144                          unsigned int flags);
145
146 typedef void
147 xtalk_dmamap_drain_f    (xtalk_dmamap_t map);   /* drain this map's channel */
148
149 typedef void
150 xtalk_dmaaddr_drain_f   (vertex_hdl_t vhdl,     /* drain channel from this device */
151                          paddr_t addr,          /* to this physical address */
152                          size_t bytes);         /* for this many bytes */
153
154 /* INTERRUPT MANAGEMENT */
155
156 /*
157  * A xtalk interrupt resource handle.  When resources are allocated
158  * in order to satisfy a xtalk_intr_alloc request, a xtalk_intr handle
159  * is returned.  xtalk_intr_connect associates a software handler with
160
161  * these system resources.
162  */
163 typedef struct xtalk_intr_s *xtalk_intr_t;
164
165
166 /*
167  * When a crosstalk device connects an interrupt, it passes in a function
168  * that knows how to set its xtalk interrupt register appropriately.  The
169  * low-level interrupt code may invoke this function later in order to
170  * migrate an interrupt transparently to the device driver(s) that use this
171  * interrupt.
172  *
173  * The argument passed to this function contains enough information for a
174  * crosstalk device to (re-)target an interrupt.  A function of this type
175  * must be supplied by every crosstalk driver.
176  */
177 typedef int
178 xtalk_intr_setfunc_f    (xtalk_intr_t intr_hdl);        /* interrupt handle */
179
180 typedef xtalk_intr_t
181 xtalk_intr_alloc_f      (vertex_hdl_t dev,      /* which crosstalk device */
182                          device_desc_t dev_desc,        /* device descriptor */
183                          vertex_hdl_t owner_dev);       /* owner of this intr */
184
185 typedef void
186 xtalk_intr_free_f       (xtalk_intr_t intr_hdl);
187
188 typedef int
189 xtalk_intr_connect_f    (xtalk_intr_t intr_hdl,         /* xtalk intr resource handle */
190                         intr_func_t intr_func,         /* xtalk intr handler */
191                         void *intr_arg, /* arg to intr handler */
192                         xtalk_intr_setfunc_f *setfunc,          /* func to set intr hw */
193                         void *setfunc_arg);     /* arg to setfunc */
194
195 typedef void
196 xtalk_intr_disconnect_f (xtalk_intr_t intr_hdl);
197
198 typedef vertex_hdl_t
199 xtalk_intr_cpu_get_f    (xtalk_intr_t intr_hdl);        /* xtalk intr resource handle */
200
201 /* CONFIGURATION MANAGEMENT */
202
203 typedef void
204 xtalk_provider_startup_f (vertex_hdl_t xtalk_provider);
205
206 typedef void
207 xtalk_provider_shutdown_f (vertex_hdl_t xtalk_provider);
208
209 typedef void
210 xtalk_widgetdev_enable_f (vertex_hdl_t, int);
211
212 typedef void
213 xtalk_widgetdev_shutdown_f (vertex_hdl_t, int);
214
215 /* Error Management */
216
217 /* Early Action Support */
218 typedef caddr_t
219 xtalk_early_piotrans_addr_f (xwidget_part_num_t part_num,
220                              xwidget_mfg_num_t mfg_num,
221                              int which,
222                              iopaddr_t xtalk_addr,
223                              size_t byte_count,
224                              unsigned int flags);
225
226 /*
227  * Adapters that provide a crosstalk interface adhere to this software interface.
228  */
229 typedef struct xtalk_provider_s {
230     /* PIO MANAGEMENT */
231     xtalk_piomap_alloc_f   *piomap_alloc;
232     xtalk_piomap_free_f    *piomap_free;
233     xtalk_piomap_addr_f    *piomap_addr;
234     xtalk_piomap_done_f    *piomap_done;
235     xtalk_piotrans_addr_f  *piotrans_addr;
236
237     /* DMA MANAGEMENT */
238     xtalk_dmamap_alloc_f   *dmamap_alloc;
239     xtalk_dmamap_free_f    *dmamap_free;
240     xtalk_dmamap_addr_f    *dmamap_addr;
241     xtalk_dmamap_done_f    *dmamap_done;
242     xtalk_dmatrans_addr_f  *dmatrans_addr;
243     xtalk_dmamap_drain_f   *dmamap_drain;
244     xtalk_dmaaddr_drain_f  *dmaaddr_drain;
245
246     /* INTERRUPT MANAGEMENT */
247     xtalk_intr_alloc_f     *intr_alloc;
248     xtalk_intr_alloc_f     *intr_alloc_nothd;
249     xtalk_intr_free_f      *intr_free;
250     xtalk_intr_connect_f   *intr_connect;
251     xtalk_intr_disconnect_f *intr_disconnect;
252
253     /* CONFIGURATION MANAGEMENT */
254     xtalk_provider_startup_f *provider_startup;
255     xtalk_provider_shutdown_f *provider_shutdown;
256 } xtalk_provider_t;
257
258 /* Crosstalk devices use these standard Crosstalk provider interfaces */
259 extern xtalk_piomap_alloc_f xtalk_piomap_alloc;
260 extern xtalk_piomap_free_f xtalk_piomap_free;
261 extern xtalk_piomap_addr_f xtalk_piomap_addr;
262 extern xtalk_piomap_done_f xtalk_piomap_done;
263 extern xtalk_piotrans_addr_f xtalk_piotrans_addr;
264 extern xtalk_dmamap_alloc_f xtalk_dmamap_alloc;
265 extern xtalk_dmamap_free_f xtalk_dmamap_free;
266 extern xtalk_dmamap_addr_f xtalk_dmamap_addr;
267 extern xtalk_dmamap_done_f xtalk_dmamap_done;
268 extern xtalk_dmatrans_addr_f xtalk_dmatrans_addr;
269 extern xtalk_dmamap_drain_f xtalk_dmamap_drain;
270 extern xtalk_dmaaddr_drain_f xtalk_dmaaddr_drain;
271 extern xtalk_intr_alloc_f xtalk_intr_alloc;
272 extern xtalk_intr_alloc_f xtalk_intr_alloc_nothd;
273 extern xtalk_intr_free_f xtalk_intr_free;
274 extern xtalk_intr_connect_f xtalk_intr_connect;
275 extern xtalk_intr_disconnect_f xtalk_intr_disconnect;
276 extern xtalk_intr_cpu_get_f xtalk_intr_cpu_get;
277 extern xtalk_provider_startup_f xtalk_provider_startup;
278 extern xtalk_provider_shutdown_f xtalk_provider_shutdown;
279 extern xtalk_widgetdev_enable_f xtalk_widgetdev_enable;
280 extern xtalk_widgetdev_shutdown_f xtalk_widgetdev_shutdown;
281 extern xtalk_early_piotrans_addr_f xtalk_early_piotrans_addr;
282
283 /* error management */
284
285 extern int              xtalk_error_handler(vertex_hdl_t,
286                                             int,
287                                             ioerror_mode_t,
288                                             ioerror_t *);
289
290 /*
291  * Generic crosstalk interface, for use with all crosstalk providers
292  * and all crosstalk devices.
293  */
294 typedef unchar xtalk_intr_vector_t;     /* crosstalk interrupt vector (0..255) */
295
296 #define XTALK_INTR_VECTOR_NONE  (xtalk_intr_vector_t)0
297
298 /* Generic crosstalk interrupt interfaces */
299 extern vertex_hdl_t     xtalk_intr_dev_get(xtalk_intr_t xtalk_intr);
300 extern xwidgetnum_t     xtalk_intr_target_get(xtalk_intr_t xtalk_intr);
301 extern xtalk_intr_vector_t xtalk_intr_vector_get(xtalk_intr_t xtalk_intr);
302 extern iopaddr_t        xtalk_intr_addr_get(xtalk_intr_t xtalk_intr);
303 extern vertex_hdl_t     xtalk_intr_cpu_get(xtalk_intr_t xtalk_intr);
304 extern void            *xtalk_intr_sfarg_get(xtalk_intr_t xtalk_intr);
305
306 /* Generic crosstalk pio interfaces */
307 extern vertex_hdl_t     xtalk_pio_dev_get(xtalk_piomap_t xtalk_piomap);
308 extern xwidgetnum_t     xtalk_pio_target_get(xtalk_piomap_t xtalk_piomap);
309 extern iopaddr_t        xtalk_pio_xtalk_addr_get(xtalk_piomap_t xtalk_piomap);
310 extern size_t           xtalk_pio_mapsz_get(xtalk_piomap_t xtalk_piomap);
311 extern caddr_t          xtalk_pio_kvaddr_get(xtalk_piomap_t xtalk_piomap);
312
313 /* Generic crosstalk dma interfaces */
314 extern vertex_hdl_t     xtalk_dma_dev_get(xtalk_dmamap_t xtalk_dmamap);
315 extern xwidgetnum_t     xtalk_dma_target_get(xtalk_dmamap_t xtalk_dmamap);
316
317 /* Register/unregister Crosstalk providers and get implementation handle */
318 extern void             xtalk_set_early_piotrans_addr(xtalk_early_piotrans_addr_f *);
319 extern void             xtalk_provider_register(vertex_hdl_t provider, xtalk_provider_t *xtalk_fns);
320 extern void             xtalk_provider_unregister(vertex_hdl_t provider);
321 extern xtalk_provider_t *xtalk_provider_fns_get(vertex_hdl_t provider);
322
323 /* Crosstalk Switch generic layer, for use by initialization code */
324 extern void             xswitch_census(vertex_hdl_t xswitchv);
325 extern void             xswitch_init_widgets(vertex_hdl_t xswitchv);
326
327 /* early init interrupt management */
328
329 typedef void
330 xwidget_intr_preset_f   (void *which_widget,
331                          int which_widget_intr,
332                          xwidgetnum_t targ,
333                          iopaddr_t addr,
334                          xtalk_intr_vector_t vect);
335
336 typedef void
337 xtalk_intr_prealloc_f   (void *which_xtalk,
338                          xtalk_intr_vector_t xtalk_vector,
339                          xwidget_intr_preset_f *preset_func,
340                          void *which_widget,
341                          int which_widget_intr);
342
343 typedef void
344 xtalk_intr_preconn_f    (void *which_xtalk,
345                          xtalk_intr_vector_t xtalk_vector,
346                          intr_func_t intr_func,
347                          intr_arg_t intr_arg);
348
349
350 #define XTALK_ADDR_TO_UPPER(xtalk_addr) (((iopaddr_t)(xtalk_addr) >> 32) & 0xffff)
351 #define XTALK_ADDR_TO_LOWER(xtalk_addr) ((iopaddr_t)(xtalk_addr) & 0xffffffff)
352
353 typedef xtalk_intr_setfunc_f *xtalk_intr_setfunc_t;
354
355 typedef void            xtalk_iter_f(vertex_hdl_t vhdl);
356
357 extern void             xtalk_iterate(char *prefix, xtalk_iter_f *func);
358
359 #endif                          /* __KERNEL__ */
360 #endif                          /* _ASM_IA64_SN_XTALK_XTALK_H */