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