xref: /original-bsd/sys/tahoe/vba/vbavar.h (revision 542201aa)
1 /*	vbavar.h	1.6	87/04/01	*/
2 
3 /*
4  * This file contains definitions related to the kernel structures
5  * for dealing with the VERSAbus adapters.
6  *
7  * Each VERSAbus has a vba_hd structure.
8  * Each VERSAbus controller which is not a device has a vba_ctlr structure.
9  * Each VERSAbus device has a vba_device structure.
10  */
11 
12 #ifndef LOCORE
13 /*
14  * Per-vba structure.
15  */
16 struct	vba_hd {
17 	int	vh_lastiv;		/* last interrupt vector assigned */
18 };
19 
20 /*
21  * Per-controller structure.
22  * (E.g. one for each disk and tape controller, and other things
23  * which use and release buffered data paths.)
24  *
25  * If a controller has devices attached, then there are
26  * cross-referenced vba_drive structures.
27  * This structure is the one which is queued in VERSAbus resource wait,
28  * and saves the information about VERSAbus resources which are used.
29  * The queue of devices waiting to transfer is also attached here.
30  */
31 struct vba_ctlr {
32 	struct	vba_driver *um_driver;
33 	short	um_ctlr;	/* controller index in driver */
34 	short	um_vbanum;	/* the vba it is on */
35 	short	um_alive;	/* controller exists */
36 	int	(**um_intr)();	/* interrupt handler(s) */
37 	caddr_t	um_addr;	/* address of device in i/o space */
38 	struct	vba_hd *um_hd;
39 /* the driver saves the prototype command here for use in its go routine */
40 	int	um_cmd;		/* communication to dgo() */
41 	int	um_vbinfo;	/* save VERSAbus registers, etc */
42 	struct	buf um_tab;	/* queue of devices for this controller */
43 };
44 
45 /*
46  * Per ``device'' structure.
47  * (A controller has devices or uses and releases buffered data paths).
48  * (Everything else is a ``device''.)
49  *
50  * If a controller has many drives attached, then there will
51  * be several vba_device structures associated with a single vba_ctlr
52  * structure.
53  *
54  * This structure contains all the information necessary to run
55  * a VERSAbus device.  It also contains information
56  * for slaves of VERSAbus controllers as to which device on the slave
57  * this is.  A flags field here can also be given in the system specification
58  * and is used to tell which tty lines are hard wired or other device
59  * specific parameters.
60  */
61 struct vba_device {
62 	struct	vba_driver *ui_driver;
63 	short	ui_unit;	/* unit number on the system */
64 	short	ui_ctlr;	/* mass ctlr number; -1 if none */
65 	short	ui_vbanum;	/* the vba it is on */
66 	short	ui_slave;	/* slave on controller */
67 	int	(**ui_intr)();	/* interrupt handler(s) */
68 	caddr_t	ui_addr;	/* address of device in i/o space */
69 	short	ui_dk;		/* if init 1 set to number for iostat */
70 	long	ui_flags;	/* parameter from system specification */
71 	short	ui_alive;	/* device exists */
72 	short	ui_type;	/* driver specific type information */
73 	caddr_t	ui_physaddr;	/* phys addr, for standalone (dump) code */
74 /* this is the forward link in a list of devices on a controller */
75 	struct	vba_device *ui_forw;
76 /* if the device is connected to a controller, this is the controller */
77 	struct	vba_ctlr *ui_mi;
78 	struct	vba_hd *ui_hd;
79 };
80 #endif
81 
82 /*
83  * Per-driver structure.
84  *
85  * Each VERSAbus driver defines entries for a set of routines
86  * as well as an array of types which are acceptable to it.
87  * These are used at boot time by the configuration program.
88  */
89 struct vba_driver {
90 	int	(*ud_probe)();		/* see if a driver is really there */
91 	int	(*ud_slave)();		/* see if a slave is there */
92 	int	(*ud_attach)();		/* setup driver for a slave */
93 	int	(*ud_dgo)();		/* fill csr/ba to start transfer */
94 	long	*ud_addr;		/* device csr addresses */
95 	char	*ud_dname;		/* name of a device */
96 	struct	vba_device **ud_dinfo;	/* backpointers to vbdinit structs */
97 	char	*ud_mname;		/* name of a controller */
98 	struct	vba_ctlr **ud_minfo;	/* backpointers to vbminit structs */
99 };
100 
101 /*
102  * Common state for Versabus driver I/O resources,
103  * including memory for intermediate buffer and page map,
104  * allocated by vbainit.
105  */
106 struct vb_buf {
107 	/* these fields set up once by vbainit */
108 	int	vb_flags;		/* device parameters */
109 	struct	pte *vb_map;		/* private page entries */
110 	caddr_t	vb_utl;			/* virtual addresses mapped by vb_map */
111 	caddr_t	vb_rawbuf;		/* intermediate buffer */
112 	u_long	vb_physbuf;		/* phys addr of intermediate buffer */
113 	u_long	vb_bufsize;		/* intermediate buffer size */
114 	u_long	vb_maxphys;		/* physical address limit */
115 	/* remaining fields apply to current transfer: */
116 	int	vb_copy;		/* copy to/from intermediate buffer */
117 	int	vb_iskernel;		/* is to/from kernel address space */
118 };
119 
120 /*
121  * flags to vbainit
122  */
123 #define	VB_32BIT	0x00		/* device uses 32-bit addressing */
124 #define	VB_24BIT	0x01		/* device uses 24-bit addressing */
125 #define	VB_20BIT	0x02		/* device uses 20-bit addressing */
126 #define	VB_SCATTER	0x04		/* device does scatter-gather */
127 
128 /*
129  * hardware addressing limits
130  */
131 #define	VB_MAXADDR20	0x000fffff	/* highest addr for 20-bit */
132 #define	VB_MAXADDR24	0x007fffff	/* highest addr for 23/24-bit */
133 #define	VB_MAXADDR32	0x3effffff	/* highest addr for 32-bit */
134 
135 /*
136  * Statistics on vba operations.
137  */
138 struct vbastat {
139 	u_long	k_raw;		/* to/from contiguous kernel DMA buffer */
140 	u_long	u_raw;		/* to/from contiguous user DMA buffer */
141 	u_long	k_copy;		/* copied to/from kernel */
142 	u_long	u_copy;		/* copied to/from user */
143 	u_long	k_sg;		/* scatter-gather to/from kernel */
144 	u_long	u_sg;		/* scatter-gather to/from user */
145 };
146 
147 #ifndef LOCORE
148 #ifdef KERNEL
149 /*
150  * VBA related kernel variables
151  */
152 int	numvba;					/* number of uba's */
153 struct	vba_hd vba_hd[];
154 struct	vbastat vbastat;
155 
156 /*
157  * Vbminit and vbdinit initialize the mass storage controller and
158  * device tables specifying possible devices.
159  */
160 extern	struct	vba_ctlr vbminit[];
161 extern	struct	vba_device vbdinit[];
162 
163 /*
164  * VERSAbus device address space is mapped by VMEMmap
165  * into virtual address vmem[][].
166  */
167 extern	struct pte VMEMmap[];	/* vba device addr pte's */
168 extern	caddr_t vmem;		/* vba device addr space */
169 u_long	vbasetup();
170 #endif KERNEL
171 #endif !LOCORE
172