xref: /csrg-svn/sys/vax/uba/ubavar.h (revision 34284)
1 /*
2  * Copyright (c) 1982, 1986 Regents of the University of California.
3  * All rights reserved.  The Berkeley software License Agreement
4  * specifies the terms and conditions for redistribution.
5  *
6  *	@(#)ubavar.h	7.4 (Berkeley) 05/14/88
7  */
8 
9 /*
10  * This file contains definitions related to the kernel structures
11  * for dealing with the unibus adapters.
12  *
13  * Each uba has a uba_hd structure.
14  * Each unibus controller which is not a device has a uba_ctlr structure.
15  * Each unibus device has a uba_device structure.
16  */
17 
18 #ifndef LOCORE
19 /*
20  * Per-uba structure.
21  *
22  * This structure holds the interrupt vector for the uba,
23  * and its address in physical and virtual space.  At boot time
24  * we determine the devices attached to the uba's and their
25  * interrupt vectors, filling in uh_vec.  We free the map
26  * register and bdp resources of the uba into the structures
27  * defined here.
28  *
29  * During normal operation, resources are allocated and returned
30  * to the structures here.  We watch the number of passive releases
31  * on each uba, and if the number is excessive may reset the uba.
32  *
33  * When uba resources are needed and not available, or if a device
34  * which can tolerate no other uba activity (rk07) gets on the bus,
35  * then device drivers may have to wait to get to the bus and are
36  * queued here.  It is also possible for processes to block in
37  * the unibus driver in resource wait (mrwant, bdpwant); these
38  * wait states are also recorded here.
39  */
40 struct	uba_hd {
41 	int	uh_type;		/* type of adaptor */
42 	struct	uba_regs *uh_uba;	/* virt addr of uba adaptor regs */
43 	struct	uba_regs *uh_physuba;	/* phys addr of uba adaptor regs */
44 	struct	pte *uh_mr;		/* start of page map */
45 	int	uh_memsize;		/* size of uba memory, pages */
46 	caddr_t	uh_mem;			/* start of uba memory address space */
47 	caddr_t	uh_iopage;		/* start of uba io page */
48 	int	(**uh_vec)();		/* interrupt vector */
49 	struct	uba_device *uh_actf;	/* head of queue to transfer */
50 	struct	uba_device *uh_actl;	/* tail of queue to transfer */
51 	short	uh_mrwant;		/* someone is waiting for map reg */
52 	short	uh_bdpwant;		/* someone awaits bdp's */
53 	int	uh_bdpfree;		/* free bdp's */
54 	int	uh_hangcnt;		/* number of ticks hung */
55 	int	uh_zvcnt;		/* number of recent 0 vectors */
56 	long	uh_zvtime;		/* time over which zvcnt accumulated */
57 	int	uh_zvtotal;		/* total number of 0 vectors */
58 	int	uh_errcnt;		/* number of errors */
59 	int	uh_lastiv;		/* last free interrupt vector */
60 	short	uh_users;		/* transient bdp use count */
61 	short	uh_xclu;		/* an rk07 is using this uba! */
62 	int	uh_lastmem;		/* limit of any unibus memory */
63 #define	UAMSIZ	100
64 	struct	map *uh_map;		/* buffered data path regs free */
65 };
66 
67 /* given a pointer to uba_regs, find DWBUA registers */
68 /* this should be replaced with a union in uba_hd */
69 #define	BUA(uba)	((struct dwbua_regs *)(uba))
70 
71 /*
72  * Per-controller structure.
73  * (E.g. one for each disk and tape controller, and other things
74  * which use and release buffered data paths.)
75  *
76  * If a controller has devices attached, then there are
77  * cross-referenced uba_drive structures.
78  * This structure is the one which is queued in unibus resource wait,
79  * and saves the information about unibus resources which are used.
80  * The queue of devices waiting to transfer is also attached here.
81  */
82 struct uba_ctlr {
83 	struct	uba_driver *um_driver;
84 	short	um_ctlr;	/* controller index in driver */
85 	short	um_ubanum;	/* the uba it is on */
86 	short	um_alive;	/* controller exists */
87 	int	(**um_intr)();	/* interrupt handler(s) */
88 	caddr_t	um_addr;	/* address of device in i/o space */
89 	struct	uba_hd *um_hd;
90 /* the driver saves the prototype command here for use in its go routine */
91 	int	um_cmd;		/* communication to dgo() */
92 	int	um_ubinfo;	/* save unibus registers, etc */
93 	int	um_bdp;		/* for controllers that hang on to bdp's */
94 	struct	buf um_tab;	/* queue of devices for this controller */
95 };
96 
97 /*
98  * Per ``device'' structure.
99  * (A controller has devices or uses and releases buffered data paths).
100  * (Everything else is a ``device''.)
101  *
102  * If a controller has many drives attached, then there will
103  * be several uba_device structures associated with a single uba_ctlr
104  * structure.
105  *
106  * This structure contains all the information necessary to run
107  * a unibus device such as a dz or a dh.  It also contains information
108  * for slaves of unibus controllers as to which device on the slave
109  * this is.  A flags field here can also be given in the system specification
110  * and is used to tell which dz lines are hard wired or other device
111  * specific parameters.
112  */
113 struct uba_device {
114 	struct	uba_driver *ui_driver;
115 	short	ui_unit;	/* unit number on the system */
116 	short	ui_ctlr;	/* mass ctlr number; -1 if none */
117 	short	ui_ubanum;	/* the uba it is on */
118 	short	ui_slave;	/* slave on controller */
119 	int	(**ui_intr)();	/* interrupt handler(s) */
120 	caddr_t	ui_addr;	/* address of device in i/o space */
121 	short	ui_dk;		/* if init 1 set to number for iostat */
122 	int	ui_flags;	/* parameter from system specification */
123 	short	ui_alive;	/* device exists */
124 	short	ui_type;	/* driver specific type information */
125 	caddr_t	ui_physaddr;	/* phys addr, for standalone (dump) code */
126 /* this is the forward link in a list of devices on a controller */
127 	struct	uba_device *ui_forw;
128 /* if the device is connected to a controller, this is the controller */
129 	struct	uba_ctlr *ui_mi;
130 	struct	uba_hd *ui_hd;
131 };
132 
133 /*
134  * Per-driver structure.
135  *
136  * Each unibus driver defines entries for a set of routines
137  * as well as an array of types which are acceptable to it.
138  * These are used at boot time by the configuration program.
139  */
140 struct uba_driver {
141 	int	(*ud_probe)();		/* see if a driver is really there */
142 	int	(*ud_slave)();		/* see if a slave is there */
143 	int	(*ud_attach)();		/* setup driver for a slave */
144 	int	(*ud_dgo)();		/* fill csr/ba to start transfer */
145 	u_short	*ud_addr;		/* device csr addresses */
146 	char	*ud_dname;		/* name of a device */
147 	struct	uba_device **ud_dinfo;	/* backpointers to ubdinit structs */
148 	char	*ud_mname;		/* name of a controller */
149 	struct	uba_ctlr **ud_minfo;	/* backpointers to ubminit structs */
150 	short	ud_xclu;		/* want exclusive use of bdp's */
151 	short	ud_keepbdp;		/* hang on to bdp's once allocated */
152 	int	(*ud_ubamem)();		/* see if dedicated memory is present */
153 };
154 #endif
155 
156 /*
157  * Flags to UBA map/bdp allocation routines
158  */
159 #define	UBA_NEEDBDP	0x01		/* transfer needs a bdp */
160 #define	UBA_CANTWAIT	0x02		/* don't block me */
161 #define	UBA_NEED16	0x04		/* need 16 bit addresses only */
162 #define	UBA_HAVEBDP	0x08		/* use bdp specified in high bits */
163 
164 /*
165  * Macros to bust return word from map allocation routines.
166  */
167 #define	UBAI_BDP(i)	((int)(((unsigned)(i))>>28))
168 #define	UBAI_NMR(i)	((int)((i)>>18)&0x3ff)
169 #define	UBAI_MR(i)	((int)((i)>>9)&0x1ff)
170 #define	UBAI_BOFF(i)	((int)((i)&0x1ff))
171 #define	UBAI_ADDR(i)	((int)((i)&0x3ffff))	/* uba addr (boff+mr) */
172 
173 #ifndef LOCORE
174 #ifdef KERNEL
175 #define	ubago(ui)	ubaqueue(ui, 0)
176 
177 /*
178  * UBA related kernel variables
179  */
180 int	numuba;					/* number of uba's */
181 struct	uba_hd uba_hd[];
182 
183 /*
184  * Ubminit and ubdinit initialize the mass storage controller and
185  * device tables specifying possible devices.
186  */
187 extern	struct	uba_ctlr ubminit[];
188 extern	struct	uba_device ubdinit[];
189 
190 /*
191  * UNIBUS device address space is mapped by UMEMmap
192  * into virtual address umem[][].
193  * The IO page is mapped to the last 8K of each.
194  * This should be enlarged for the Q22 bus.
195  */
196 extern	struct pte UMEMmap[][512];	/* uba device addr pte's */
197 extern	char umem[][512*NBPG];		/* uba device addr space */
198 
199 /*
200  * Since some VAXen vector their unibus interrupts
201  * just adjacent to the system control block, we must
202  * allocate space there when running on ``any'' cpu.  This space is
203  * used for the vectors for all ubas.
204  */
205 extern	int (*UNIvec[][128])();			/* unibus vec for ubas */
206 extern	int (*eUNIvec)();			/* end of unibus vec */
207 
208 #if defined(VAX780) || defined(VAX8600)
209 /*
210  * On DW780's, we must set the scb vectors for the nexus of the
211  * UNIbus adaptors to vector to locore unibus adaptor interrupt dispatchers
212  * which make 780's look like the other VAXen.
213  */
214 extern	Xua0int(), Xua1int(), Xua2int(), Xua3int();
215 #endif VAX780
216 #endif KERNEL
217 #endif !LOCORE
218