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