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