File: /usr/src/linux/include/asm-ia64/sn/iobus.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_IOBUS_H
11 #define _ASM_SN_IOBUS_H
12
13 #ifdef __cplusplus
14 extern "C" {
15 #endif
16
17 struct eframe_s;
18 struct piomap;
19 struct dmamap;
20
21
22 /* for ilvl_t interrupt level, for use with intr_block_level. Can't
23 * typedef twice without causing warnings, and some users of this header
24 * file do not already include driver.h, but expect ilvl_t to be defined,
25 * while others include both, leading to the warning ...
26 */
27
28 #include <asm/types.h>
29 #include <asm/sn/driver.h>
30
31
32 typedef __psunsigned_t iobush_t;
33
34 #if __KERNEL__
35 /* adapter handle */
36 typedef devfs_handle_t adap_t;
37 #endif
38
39
40 /* interrupt function */
41 typedef void *intr_arg_t;
42 typedef void intr_func_f(intr_arg_t);
43 typedef intr_func_f *intr_func_t;
44
45 #define INTR_ARG(n) ((intr_arg_t)(__psunsigned_t)(n))
46
47 /* system interrupt resource handle -- returned from intr_alloc */
48 typedef struct intr_s *intr_t;
49 #define INTR_HANDLE_NONE ((intr_t)0)
50
51 /*
52 * restore interrupt level value, returned from intr_block_level
53 * for use with intr_unblock_level.
54 */
55 typedef void *rlvl_t;
56
57
58 /*
59 * A basic, platform-independent description of I/O requirements for
60 * a device. This structure is usually formed by lboot based on information
61 * in configuration files. It contains information about PIO, DMA, and
62 * interrupt requirements for a specific instance of a device.
63 *
64 * The pio description is currently unused.
65 *
66 * The dma description describes bandwidth characteristics and bandwidth
67 * allocation requirements. (TBD)
68 *
69 * The Interrupt information describes the priority of interrupt, desired
70 * destination, policy (TBD), whether this is an error interrupt, etc.
71 * For now, interrupts are targeted to specific CPUs.
72 */
73
74 typedef struct device_desc_s {
75 /* pio description (currently none) */
76
77 /* dma description */
78 /* TBD: allocated badwidth requirements */
79
80 /* interrupt description */
81 devfs_handle_t intr_target; /* Hardware locator string */
82 int intr_policy; /* TBD */
83 ilvl_t intr_swlevel; /* software level for blocking intr */
84 char *intr_name; /* name of interrupt, if any */
85
86 int flags;
87 } *device_desc_t;
88
89 /* flag values */
90 #define D_INTR_ISERR 0x1 /* interrupt is for error handling */
91 #define D_IS_ASSOC 0x2 /* descriptor is associated with a dev */
92 #define D_INTR_NOTHREAD 0x4 /* Interrupt handler isn't threaded. */
93
94 #define INTR_SWLEVEL_NOTHREAD_DEFAULT 0 /* Default
95 * Interrupt level in case of
96 * non-threaded interrupt
97 * handlers
98 */
99 /*
100 * Drivers use these interfaces to manage device descriptors.
101 *
102 * To examine defaults:
103 * desc = device_desc_default_get(dev);
104 * device_desc_*_get(desc);
105 *
106 * To modify defaults:
107 * desc = device_desc_default_get(dev);
108 * device_desc_*_set(desc);
109 *
110 * To eliminate defaults:
111 * device_desc_default_set(dev, NULL);
112 *
113 * To override defaults:
114 * desc = device_desc_dup(dev);
115 * device_desc_*_set(desc,...);
116 * use device_desc in calls
117 * device_desc_free(desc);
118 *
119 * Software must not set or eliminate default device descriptors for a device while
120 * concurrently get'ing, dup'ing or using them. Default device descriptors can be
121 * changed only for a device that is quiescent. In general, device drivers have no
122 * need to permanently change defaults anyway -- they just override defaults, when
123 * necessary.
124 */
125 extern device_desc_t device_desc_dup(devfs_handle_t dev);
126 extern void device_desc_free(device_desc_t device_desc);
127 extern device_desc_t device_desc_default_get(devfs_handle_t dev);
128 extern void device_desc_default_set(devfs_handle_t dev, device_desc_t device_desc);
129
130 extern devfs_handle_t device_desc_intr_target_get(device_desc_t device_desc);
131 extern int device_desc_intr_policy_get(device_desc_t device_desc);
132 extern ilvl_t device_desc_intr_swlevel_get(device_desc_t device_desc);
133 extern char * device_desc_intr_name_get(device_desc_t device_desc);
134 extern int device_desc_flags_get(device_desc_t device_desc);
135
136 extern void device_desc_intr_target_set(device_desc_t device_desc, devfs_handle_t target);
137 extern void device_desc_intr_policy_set(device_desc_t device_desc, int policy);
138 extern void device_desc_intr_swlevel_set(device_desc_t device_desc, ilvl_t swlevel);
139 extern void device_desc_intr_name_set(device_desc_t device_desc, char *name);
140 extern void device_desc_flags_set(device_desc_t device_desc, int flags);
141
142
143 /* IO state */
144 #ifdef COMMENT
145 #define IO_STATE_EMPTY 0x01 /* non-existent */
146 #define IO_STATE_INITIALIZING 0x02 /* being initialized */
147 #define IO_STATE_ATTACHING 0x04 /* becoming active */
148 #define IO_STATE_ACTIVE 0x08 /* active */
149 #define IO_STATE_DETACHING 0x10 /* becoming inactive */
150 #define IO_STATE_INACTIVE 0x20 /* not in use */
151 #define IO_STATE_ERROR 0x40 /* problems */
152 #define IO_STATE_BAD_HARDWARE 0x80 /* broken hardware */
153 #endif
154
155 struct edt;
156
157
158 /* return codes */
159 #define RC_OK 0
160 #define RC_ERROR 1
161
162 /* bus configuration management op code */
163 #define IOBUS_CONFIG_ATTACH 0 /* vary on */
164 #define IOBUS_CONFIG_DETACH 1 /* vary off */
165 #define IOBUS_CONFIG_RECOVER 2 /* clear error then vary on */
166
167 /* get low-level PIO handle */
168 extern int pio_geth(struct piomap*, int bus, int bus_id, int subtype,
169 iopaddr_t addr, int size);
170
171 /* get low-level DMA handle */
172 extern int dma_geth(struct dmamap*, int bus_type, int bus_id, int dma_type,
173 int npages, int page_size, int flags);
174
175 #ifdef __cplusplus
176 }
177 #endif
178
179 /*
180 * Macros for page number and page offsets, using ps as page size
181 */
182 #define x_pnum(addr, ps) ((__psunsigned_t)(addr) / (__psunsigned_t)(ps))
183 #define x_poff(addr, ps) ((__psunsigned_t)(addr) & ((__psunsigned_t)(ps) - 1))
184
185 #endif /* _ASM_SN_IOBUS_H */
186