|
|
1.1 root 1: /* @(#)mbvar.h 1.1 86/02/03 SMI */
2:
3: /*
4: * Copyright (c) 1985 by Sun Microsystems, Inc.
5: */
6:
7: /*
8: * This file contains definitions related to the kernel structures
9: * for dealing with the Mainbus.
10: *
11: * The Mainbus has an mb_hd structure.
12: * Each Mainbus controller which is not a device has an mb_ctlr structure.
13: * Each Mainbus device has an mb_device structure.
14: */
15:
16: #ifndef LOCORE
17: /*
18: * The Mainbus structure.
19: *
20: * At boot time we determine the devices attached to the Mainbus.
21: *
22: * During normal operation, resources are allocated and returned
23: * to the structures here.
24: *
25: * When Mainbus resources are needed and not available, or if a device
26: * which can tolerate no other Mainbus activity gets on the bus,
27: * then device drivers may have to wait to get to the bus and are
28: * queued here.
29: */
30: struct mb_hd {
31: struct mb_ctlr *mh_actf; /* head of queue to transfer */
32: struct mb_ctlr *mh_actl; /* tail of queue to transfer */
33: struct mb_driver *mh_intr[8]; /* linked list of interrupt routines */
34: struct map *mh_map; /* DVMA resource map */
35: short mh_users; /* transient use count */
36: short mh_xclu; /* a bus hog is using the Mainbus */
37: char mh_mrwant; /* someone is waiting for map reg */
38: };
39:
40: /*
41: * Per-controller structure.
42: * (E.g. one for each disk and tape controller)
43: *
44: * If a controller has devices attached, then there are
45: * cross-referenced mb_device structures.
46: * This structure is the one which is queued in Mainbus resource wait,
47: * and saves the information about Mainbus resources which are used.
48: * The queue of devices waiting to transfer is also attached here.
49: */
50: struct mb_ctlr {
51: struct mb_driver *mc_driver;
52: short mc_ctlr; /* controller index in driver */
53: short mc_alive; /* controller exists */
54: caddr_t mc_addr; /* address of device in i/o space */
55: int mc_intpri; /* interrupt priority level */
56: struct vec *mc_intr; /* if vectored interrupts used */
57: u_int mc_space; /* encode bits for addr device space */
58: struct mb_hd *mc_mh;
59: int mc_mbinfo; /* Mainbus resource allocation info */
60: char mc_rw; /* READ or WRITE */
61: struct buf mc_tab; /* queue of devices for this controller */
62: struct mb_ctlr *mc_forw; /* link in transfer queue */
63: };
64:
65: /*
66: * Per ``device'' structure.
67: * (A controller has devices or uses and releases Mainbus memory).
68: * (Everything else is a ``device''.)
69: *
70: * If a controller has many drives attached, then there will
71: * be several mb_device structures associated with a single mb_ctlr
72: * structure.
73: *
74: * This structure contains all the information necessary to run a Mainbus
75: * device such as a serial line interface. It also contains information
76: * for slaves of Mainbus controllers as to which device on the slave
77: * this is. A flags field here can also be given in the system specification
78: * and is used to tell which mux lines are hard wired or other device
79: * specific parameters.
80: */
81: struct mb_device {
82: struct mb_driver *md_driver;
83: short md_unit; /* unit number on the system */
84: short md_ctlr; /* mass ctlr number; -1 if none */
85: short md_slave; /* slave on controller */
86: caddr_t md_addr; /* address of device in i/o space */
87: int md_intpri; /* interrupt priority */
88: short md_dk; /* if init 1 set to number for iostat */
89: int md_flags; /* parameter from system specification */
90: struct vec *md_intr; /* if vectored interrupts used */
91: u_int md_space; /* encode bits for addr device space */
92: short md_alive; /* device exists */
93: short md_type; /* driver specific type information */
94: /* if the device is connected to a controller, this is the controller */
95: struct mb_ctlr *md_mc;
96: struct mb_hd *md_hd;
97: };
98:
99: /*
100: * Per-driver structure.
101: *
102: * Each Mainbus driver defines entries for a set of routines
103: * as well as an array of types which are acceptable to it.
104: * These are used at boot time by the configuration program.
105: */
106: struct mb_driver {
107: int (*mdr_probe)(); /* see if a driver is really there */
108: int (*mdr_slave)(); /* see if a slave is there */
109: int (*mdr_attach)(); /* setup driver for a slave */
110: int (*mdr_go)(); /* routine to start transfer */
111: int (*mdr_done)(); /* routine to finish transfer */
112: int (*mdr_intr)(); /* polling interrupt routine */
113: int mdr_size; /* amount of memory space needed */
114: char *mdr_dname; /* name of a device */
115: struct mb_device **mdr_dinfo; /* backpointers to mbdinit structs */
116: char *mdr_cname; /* name of a controller */
117: struct mb_ctlr **mdr_cinfo; /* backpointers to mbcinit structs */
118: short mdr_flags; /* want exclusive use of Mainbus */
119: struct mb_driver *mdr_link; /* interrupt routine linked list */
120: };
121:
122: /* Driver flags */
123: #define MDR_XCLU 01 /* needs exclusive use of bus */
124: #define MDR_BIODMA 02 /* block device does Mainbus DMA */
125: #define MDR_SWAB 04 /* Mainbus buffer must be swabbed */
126: #define MDR_OBIO 010 /* device in on-board I/O space */
127:
128:
129: /* Flags to mbsetup */
130: #define MB_CANTWAIT 01 /* don't block me */
131:
132: /*
133: * If mbcookie.mbi_mapreg < dvmasize, then mbi_mapreg is the
134: * starting map register within DVMA space which is mapped
135: * in mbsetup() and unmapped in mbrelse(). Otherwise
136: * mbi_mapreg is the starting page of contigously mapped
137: * region within an external "mainbus" mapping region
138: * (e.g. Multibus Memory or VMEbus) as checked and
139: * approved by buscheck().
140: */
141: struct mbcookie {
142: unsigned int
143: mbi_mapreg:(32-PGSHIFT),/* starting map register (page) */
144: mbi_offset:PGSHIFT; /* byte offset */
145: };
146:
147: /*
148: * Macros to bust return word from map allocation routines.
149: */
150: #define MBI_MR(i) ((int)((unsigned)(i)>>PGSHIFT))
151: #define MBI_ADDR(i) ((int)(i))
152:
153: struct vec {
154: int (*v_func)(); /* interrupt function to call */
155: int v_vec; /* vector number (64-255) */
156: int *v_vptr; /* pointer to value passed */
157: };
158:
159: #endif !LOCORE
160:
161: /* Convert interrupt prio to SR */
162: #define pritospl(n) (SR_SMODE|((n)<<8))
163:
164: /* Maximum interrupt priority used by Mainbus DMA */
165: #define SPLMB 4
166:
167: #ifndef LOCORE
168: #ifdef KERNEL
169: /*
170: * Mainbus related kernel variables
171: */
172: extern struct mb_hd mb_hd;
173:
174: /*
175: * Mbcinit and mbdinit initialize the mass storage controller and
176: * device tables specifying possible devices.
177: */
178: extern struct mb_ctlr mbcinit[];
179: extern struct mb_device mbdinit[];
180:
181: #ifdef sun2
182: extern char mbio[]; /* mb device addr space */
183: #endif
184:
185: struct map *iopbmap;
186: #define IOPBMEM (0x2000/NBPG) /* 8k's worth of pages for IOPB crud */
187: #define IOPBMAPSIZE 64
188:
189: #define DVMAMAPSIZE 25
190: extern char DVMA[];
191:
192: #endif KERNEL
193: #endif !LOCORE
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.