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
6 * Copyright (C) 1992-1997, 2000-2003 Silicon Graphics, Inc. All Rights Reserved.
8 #ifndef _ASM_IA64_SN_XTALK_XTALK_H
9 #define _ASM_IA64_SN_XTALK_XTALK_H
10 #include <linux/config.h>
13 #include "asm/sn/sgi.h"
18 * xtalk.h -- platform-independent crosstalk interface
21 * User-level device driver visible types
23 typedef char xwidgetnum_t; /* xtalk widget number (0..15) */
25 #define XWIDGET_NONE (-1)
27 typedef int xwidget_part_num_t; /* xtalk widget part number */
29 #define XWIDGET_PART_NUM_NONE (-1)
31 typedef int xwidget_rev_num_t; /* xtalk widget revision number */
33 #define XWIDGET_REV_NUM_NONE (-1)
35 typedef int xwidget_mfg_num_t; /* xtalk widget manufacturing ID */
37 #define XWIDGET_MFG_NUM_NONE (-1)
39 typedef struct xtalk_piomap_s *xtalk_piomap_t;
41 /* It is often convenient to fold the XIO target port
42 * number into the XIO address.
44 #define XIO_NOWHERE (0xFFFFFFFFFFFFFFFFull)
45 #define XIO_ADDR_BITS (0x0000FFFFFFFFFFFFull)
46 #define XIO_PORT_BITS (0xF000000000000000ull)
47 #define XIO_PORT_SHIFT (60)
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))
56 * Kernel/driver only definitions
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>
66 struct xwidget_hwid_s;
69 * Acceptable flag bits for xtalk service calls
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).
81 #define XTALK_FIXED DMAMAP_FIXED
82 #define XTALK_NOSLEEP DMAMAP_NOSLEEP
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 */
90 size_t byte_count_max, /* maximum size of a mapping */
91 unsigned int flags); /* defined in sys/pio.h */
93 xtalk_piomap_free_f (xtalk_piomap_t xtalk_piomap);
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 */
101 xtalk_piomap_done_f (xtalk_piomap_t xtalk_piomap);
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) */
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) */
120 typedef struct xtalk_dmamap_s *xtalk_dmamap_t;
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 */
129 xtalk_dmamap_free_f (xtalk_dmamap_t dmamap);
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 */
137 xtalk_dmamap_done_f (xtalk_dmamap_t dmamap);
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 */
147 xtalk_dmamap_drain_f (xtalk_dmamap_t map); /* drain this map's channel */
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 */
154 /* INTERRUPT MANAGEMENT */
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
161 * these system resources.
163 typedef struct xtalk_intr_s *xtalk_intr_t;
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
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.
178 xtalk_intr_setfunc_f (xtalk_intr_t intr_hdl); /* interrupt handle */
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 */
186 xtalk_intr_free_f (xtalk_intr_t intr_hdl);
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 */
196 xtalk_intr_disconnect_f (xtalk_intr_t intr_hdl);
199 xtalk_intr_cpu_get_f (xtalk_intr_t intr_hdl); /* xtalk intr resource handle */
201 /* CONFIGURATION MANAGEMENT */
204 xtalk_provider_startup_f (vertex_hdl_t xtalk_provider);
207 xtalk_provider_shutdown_f (vertex_hdl_t xtalk_provider);
210 xtalk_widgetdev_enable_f (vertex_hdl_t, int);
213 xtalk_widgetdev_shutdown_f (vertex_hdl_t, int);
215 /* Error Management */
217 /* Early Action Support */
219 xtalk_early_piotrans_addr_f (xwidget_part_num_t part_num,
220 xwidget_mfg_num_t mfg_num,
222 iopaddr_t xtalk_addr,
227 * Adapters that provide a crosstalk interface adhere to this software interface.
229 typedef struct xtalk_provider_s {
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;
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;
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;
253 /* CONFIGURATION MANAGEMENT */
254 xtalk_provider_startup_f *provider_startup;
255 xtalk_provider_shutdown_f *provider_shutdown;
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;
283 /* error management */
285 extern int xtalk_error_handler(vertex_hdl_t,
291 * Generic crosstalk interface, for use with all crosstalk providers
292 * and all crosstalk devices.
294 typedef unchar xtalk_intr_vector_t; /* crosstalk interrupt vector (0..255) */
296 #define XTALK_INTR_VECTOR_NONE (xtalk_intr_vector_t)0
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);
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);
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);
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);
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);
327 /* early init interrupt management */
330 xwidget_intr_preset_f (void *which_widget,
331 int which_widget_intr,
334 xtalk_intr_vector_t vect);
337 xtalk_intr_prealloc_f (void *which_xtalk,
338 xtalk_intr_vector_t xtalk_vector,
339 xwidget_intr_preset_f *preset_func,
341 int which_widget_intr);
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);
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)
353 typedef xtalk_intr_setfunc_f *xtalk_intr_setfunc_t;
355 typedef void xtalk_iter_f(vertex_hdl_t vhdl);
357 extern void xtalk_iterate(char *prefix, xtalk_iter_f *func);
359 #endif /* __KERNEL__ */
360 #endif /* _ASM_IA64_SN_XTALK_XTALK_H */