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