Annotation of 43BSDReno/share/doc/smm/02.config/6.t, revision 1.1.1.1

1.1       root        1: .\" Copyright (c) 1983 Regents of the University of California.
                      2: .\" All rights reserved.  The Berkeley software License Agreement
                      3: .\" specifies the terms and conditions for redistribution.
                      4: .\"
                      5: .\"    @(#)6.t 6.2 (Berkeley) 6/3/86
                      6: .\"
                      7: .\".ds RH "Adding New Devices
                      8: .ne 2i
                      9: .NH
                     10: ADDING NEW SYSTEM SOFTWARE
                     11: .PP
                     12: This section is not for the novice, it describes
                     13: some of the inner workings of the configuration process as
                     14: well as the pertinent parts of the system autoconfiguration process.
                     15: It is intended to give
                     16: those people who intend to install new device drivers and/or
                     17: other system facilities sufficient information to do so in the
                     18: manner which will allow others to easily share the changes.
                     19: .PP
                     20: This section is broken into four parts:
                     21: .IP \(bu 3
                     22: general guidelines to be followed in modifying system code,
                     23: .IP \(bu 3
                     24: how to add non-standard system facilities to 4.3BSD,
                     25: .IP \(bu 3
                     26: how to add a device driver to 4.3BSD, and
                     27: .IP \(bu 3
                     28: how UNIBUS device drivers are autoconfigured under 4.3BSD on the VAX.
                     29: .NH 2
                     30: Modifying system code
                     31: .PP
                     32: If you wish to make site-specific modifications to the system
                     33: it is best to bracket them with
                     34: .DS
                     35: #ifdef SITENAME
                     36: \&...
                     37: #endif
                     38: .DE
                     39: to allow your source to be easily distributed to others, and
                     40: also to simplify \fIdiff\fP\|(1) listings.  If you choose not
                     41: to use a source code control system (e.g. SCCS, RCS), and
                     42: perhaps even if you do, it is
                     43: recommended that you save the old code with something
                     44: of the form:
                     45: .DS
                     46: #ifndef SITENAME
                     47: \&...
                     48: #endif
                     49: .DE
                     50: We try to isolate our site-dependent code in individual files
                     51: which may be configured with pseudo-device specifications.
                     52: .PP
                     53: Indicate machine-specific code with ``#ifdef vax'' (or other machine,
                     54: as appropriate).
                     55: 4.2BSD underwent extensive work to make it extremely portable to
                     56: machines with similar architectures\- you may someday find
                     57: yourself trying to use a single copy of the source code on
                     58: multiple machines.
                     59: .PP
                     60: Use \fIlint\fP periodically if you make changes to the system.
                     61: The 4.3BSD kernel has only two lines of lint in it.  It
                     62: is very simple to lint the kernel.  Use the LINT configuration
                     63: file, designed to pull in as much of the kernel source code as
                     64: possible, in the following manner.
                     65: .DS
                     66: $ cd /sys/conf
                     67: $ mkdir ../LINT
                     68: $ config LINT
                     69: $ cd ../LINT
                     70: $ make depend
                     71: $ make assym.s
                     72: $ make \-k lint > linterrs 2>&1 &
                     73: (or for users of \fIcsh\fP\|(1))
                     74: % make \-k >& linterrs
                     75: .DE
                     76: This takes about an hour on a lightly loaded
                     77: VAX-11/750, but is well worth it.
                     78: .NH 2
                     79: Adding non-standard system facilities
                     80: .PP
                     81: This section considers the work needed to augment 
                     82: .IR config 's
                     83: data base files for non-standard system facilities.
                     84: .I Config
                     85: uses a set of files that list the source modules that may be required
                     86: when building a system.
                     87: The data bases are taken from the directory in which
                     88: .I config
                     89: is run, normally /sys/conf.
                     90: Three such files may be used:
                     91: .IR files ,
                     92: .IR files .machine,
                     93: and
                     94: .IR files .ident.
                     95: The first is common to all systems,
                     96: the second contains files unique to a single machine type,
                     97: and the third is an optional list of modules for use on a specific machine.
                     98: This last file may override specifications in the first two.
                     99: The format of the 
                    100: .I files
                    101: file has grown somewhat complex over time.  Entries are normally of
                    102: the form
                    103: .IP
                    104: .nf
                    105: .DT
                    106: \fIdir/source.c\fP     \fItype\fP       \fIoption-list\fP \fImodifiers\fP
                    107: .LP
                    108: for example,
                    109: .IP
                    110: .nf
                    111: .DT
                    112: \fIvaxuba/foo.c\fP     \fBoptional\fP  foo     \fBdevice-driver\fP
                    113: .LP
                    114: The
                    115: .I type
                    116: is one of
                    117: .B standard
                    118: or
                    119: .BR optional .
                    120: Files marked as standard are included in all system configurations.
                    121: Optional file specifications include a list of one or more system
                    122: options that together require the inclusion of this module.
                    123: The options in the list may be either names of devices that may
                    124: be in the configuration file,
                    125: or the names of system options that may be defined.
                    126: An optional file may be listed multiple times with different options;
                    127: if all of the options for any of the entries are satisfied,
                    128: the module is included.
                    129: .PP
                    130: If a file is specified as a
                    131: .IR device-driver ,
                    132: any special compilation options for device drivers will be invoked.
                    133: On the VAX this results in the use of the
                    134: .B \-i
                    135: option for the C optimizer.  This is required when pointer references
                    136: are made to memory locations in the VAX I/O address space.
                    137: .PP
                    138: Two other optional keywords modify the usage of the file.
                    139: .I Config
                    140: understands that certain files are used especially for
                    141: kernel profiling.  These files are indicated in the
                    142: .I files
                    143: files with a 
                    144: .I profiling-routine
                    145: keyword.  For example, the current profiling subroutines
                    146: are sequestered off in a separate file with the following
                    147: entry:
                    148: .IP
                    149: .nf
                    150: .DT
                    151: \fIsys/subr_mcount.c\fP        \fBoptional\fP  \fBprofiling-routine\fP
                    152: .fi
                    153: .LP
                    154: The 
                    155: .I profiling-routine
                    156: keyword forces
                    157: .I config
                    158: not to compile the source file with the 
                    159: .B \-pg
                    160: option.
                    161: .PP
                    162: The second keyword which can be of use is the
                    163: .I config-dependent
                    164: keyword.  This causes
                    165: .I config
                    166: to compile the indicated module with the global configuration
                    167: parameters.  This allows certain modules, such as
                    168: .I machdep.c
                    169: to size system data structures based on the maximum number
                    170: of users configured for the system.
                    171: .NH 2
                    172: Adding device drivers to 4.3BSD
                    173: .PP
                    174: The I/O system and
                    175: .I config
                    176: have been designed to easily allow new device support to be added.
                    177: The system source directories are organized as follows:
                    178: .DS
                    179: .TS
                    180: lw(1.0i) l.
                    181: /sys/h machine independent include files
                    182: /sys/sys       machine-independent system source files
                    183: /sys/conf      site configuration files and basic templates
                    184: /sys/net       network-protocol-independent, but network-related code
                    185: /sys/netinet   DARPA Internet code
                    186: /sys/netimp    IMP support code
                    187: /sys/netns     Xerox NS code
                    188: /sys/vax       VAX-specific mainline code
                    189: /sys/vaxif     VAX network interface code
                    190: /sys/vaxmba    VAX MASSBUS device drivers and related code
                    191: /sys/vaxuba    VAX UNIBUS device drivers and related code
                    192: .TE
                    193: .DE
                    194: .PP
                    195: Existing block and character device drivers for the VAX 
                    196: reside in ``/sys/vax'', ``/sys/vaxmba'', and ``/sys/vaxuba''.  Network
                    197: interface drivers reside in ``/sys/vaxif''.  Any new device
                    198: drivers should be placed in the appropriate source code directory
                    199: and named so as not to conflict with existing devices.
                    200: Normally, definitions for things like device registers are placed in
                    201: a separate file in the same directory.  For example, the ``dh''
                    202: device driver is named ``dh.c'' and its associated include file is
                    203: named ``dhreg.h''.
                    204: .PP
                    205: Once the source for the device driver has been placed in a directory,
                    206: the file ``/sys/conf/files.machine'', and possibly
                    207: ``/sys/conf/devices.machine'' should be modified.  The 
                    208: .I files
                    209: files in the conf directory contain a line for each C source or binary-only
                    210: file in the system.  Those files which are machine independent are
                    211: located in ``/sys/conf/files,'' while machine specific files
                    212: are in ``/sys/conf/files.machine.''  The ``devices.machine'' file
                    213: is used to map device names to major block device numbers.  If the device
                    214: driver being added provides support for a new disk
                    215: you will want to modify this file (the format is obvious).
                    216: .PP
                    217: In addition to including the driver in the
                    218: .I files
                    219: file, it must also be added to the device configuration tables.  These
                    220: are located in ``/sys/vax/conf.c'', or similar for machines other than
                    221: the VAX.  If you don't understand what to add to this file, you should
                    222: study an entry for an existing driver. 
                    223: Remember that the position in the
                    224: device table specifies the major device number.
                    225: The block major number is needed in the ``devices.machine'' file
                    226: if the device is a disk.
                    227: .PP
                    228: With the configuration information in place, your configuration
                    229: file appropriately modified, and a system reconfigured and rebooted
                    230: you should incorporate the shell commands needed to install the special
                    231: files in the file system to the file ``/dev/MAKEDEV'' or
                    232: ``/dev/MAKEDEV.local''.  This is discussed in the document ``Installing
                    233: and Operating 4.3BSD on the VAX''.
                    234: .NH 2
                    235: Autoconfiguration on the VAX
                    236: .PP
                    237: 4.3BSD requires all device drivers to conform to a
                    238: set of rules which allow the system to:
                    239: .IP 1)
                    240: support multiple UNIBUS and MASSBUS adapters,
                    241: .IP 2)
                    242: support system configuration at boot time, and
                    243: .IP 3)
                    244: manage resources so as not to crash when devices request
                    245: resources which are unavailable.
                    246: .LP
                    247: In addition, devices such as the RK07 which require
                    248: everyone else to get off the UNIBUS when they are running
                    249: need cooperation from other DMA devices if they are to work.
                    250: Since it is unlikely that you will be writing a device driver
                    251: for a MASSBUS device, this section is devoted exclusively to
                    252: describing the I/O system and autoconfiguration process as it
                    253: applies to UNIBUS devices.
                    254: .PP
                    255: Each UNIBUS on a VAX has a set of resources:
                    256: .IP \(bu
                    257: 496 map registers which are used to convert from the 18-bit UNIBUS
                    258: addresses into the much larger VAX memory address space.
                    259: .IP \(bu
                    260: Some number of buffered data paths (3 on an 11/750, 15 on an 11/780, 0
                    261: on an 11/730) which are used by high speed devices to transfer
                    262: data using fewer bus cycles.
                    263: .LP
                    264: There is a structure of type \fIstruct uba_hd\fR in the system per UNIBUS 
                    265: adapter used to manage these resources.  This structure also contains
                    266: a linked list where devices waiting for resources to complete DMA UNIBUS
                    267: activity have requests waiting.
                    268: .PP
                    269: There are three central structures in the writing of drivers for UNIBUS
                    270: controllers; devices which do not do DMA I/O can often use only two
                    271: of these structures.  The structures are \fIstruct uba_ctlr\fR, the
                    272: UNIBUS controller structure, \fIstruct uba_device\fR the UNIBUS
                    273: device structure, and \fIstruct uba_driver\fR, the UNIBUS driver structure.
                    274: The \fIuba_ctlr\fR and \fIuba_device\fR structures are in
                    275: one-to-one correspondence with the definitions of controllers and
                    276: devices in the system configuration.
                    277: Each driver has a \fIstruct uba_driver\fR structure specifying an internal
                    278: interface to the rest of the system.
                    279: .PP
                    280: Thus a specification
                    281: .DS
                    282: controller sc0 at uba0 csr 0176700 vector upintr
                    283: .DE
                    284: would cause a \fIstruct uba_ctlr\fR to be declared and initialized in
                    285: the file \fIioconf.c\fR for the system configured from this description.
                    286: Similarly specifying
                    287: .DS
                    288: disk up0 at sc0 drive 0
                    289: .DE
                    290: would declare a related \fIuba_device\fR in the same file.
                    291: The \fIup.c\fR driver which implements this driver specifies in
                    292: its declarations:
                    293: .DS
                    294: int     upprobe(), upslave(), upattach(), updgo(), upintr();
                    295: struct  uba_ctlr *upminfo[NSC];
                    296: struct  uba_device *updinfo[NUP];
                    297: u_short upstd[] = { 0776700, 0774400, 0776300, 0 };
                    298: struct  uba_driver scdriver =
                    299:     { upprobe, upslave, upattach, updgo, upstd, "up", updinfo, "sc", upminfo };
                    300: .DE
                    301: initializing the \fIuba_driver\fR structure.
                    302: The driver will support some number of controllers named \fIsc0\fR, \fIsc1\fR,
                    303: etc, and some number of drives named \fIup0\fR, \fIup1\fR, etc. where the
                    304: drives may be on any of the controllers (that is there is a single
                    305: linear name space for devices, separate from the controllers.)
                    306: .PP
                    307: We now explain the fields in the various structures.  It may help
                    308: to look at a copy of \fIvaxuba/ubareg.h\fR, \fIvaxuba/ubavar.h\fR and drivers
                    309: such as \fIup.c\fR and \fIdz.c\fR while reading the descriptions of
                    310: the various structure fields.
                    311: .SH
                    312: uba_driver structure
                    313: .PP
                    314: One of these structures exists per driver.  It is initialized in
                    315: the driver and contains functions used by the configuration program
                    316: and by the UNIBUS resource routines.  The fields of the structure are:
                    317: .IP \fBud_probe\fP
                    318: A routine which, given a \fIcaddr_t\fR address as argument,
                    319: should attempt to determine that the device is present
                    320: at that address in virtual memory,
                    321: and should cause an interrupt from the device.
                    322: When probing controllers, two additional arguments are supplied:
                    323: the controller index, and a pointer to the \fIuba_ctlr\fP structure.
                    324: Device probe routines receive a pointer to the \fIuba_device\fP structure
                    325: as second argument.
                    326: Both of these structures are described below.
                    327: Neither is normally used, but devices that must record status or device
                    328: type information from the probe routine may require them.
                    329: .PP
                    330: The autoconfiguration routine attempts to verify that the specified address
                    331: responds before calling the probe routine.
                    332: However, the device may not actually exist or may be of a different type,
                    333: and therefore the probe routine should use delays
                    334: (via the DELAY(n) macro which delays for \fIn\fR microseconds) rather than
                    335: waiting for specific events to occur.  The routine must \fBnot\fR
                    336: declare its argument as a \fIregister\fR parameter, but \fBmust\fR declare
                    337: .DS
                    338: register int br, cvec;
                    339: .DE
                    340: as local variables.  At boot time the system takes special measures
                    341: that these variables are ``value-result'' parameters.  The \fIbr\fR
                    342: is the IPL of the device when it interrupts, and the \fIcvec\fR
                    343: is the interrupt vector address on the UNIBUS.  These registers
                    344: are actually filled in in the interrupt handler when an interrupt occurs.
                    345: .IP
                    346: As an example, here is the \fIup.c\fR
                    347: probe routine:
                    348: .DS
                    349: upprobe(reg)
                    350:         caddr_t reg;
                    351: {
                    352:         register int br, cvec;
                    353: 
                    354: #ifdef lint     
                    355:         br = 0; cvec = br; br = cvec; upintr(0);
                    356: #endif
                    357:         ((struct updevice *)reg)->upcs1 = UP_IE|UP_RDY;
                    358:         DELAY(10);
                    359:         ((struct updevice *)reg)->upcs1 = 0;
                    360:         return (sizeof (struct updevice));
                    361: }
                    362: .DE
                    363: The definitions for \fIlint\fR serve to indicate to it that the
                    364: \fIbr\fR and \fIcvec\fR variables are value-result.
                    365: The call to the interrupt routine satisfies lint that the interrupt
                    366: handler is used.
                    367: The cod here enable interrupts on the device and write the ready bit UP_RDY.
                    368: The 10 microsecond delay insures that the interrupt enable will
                    369: not be canceled before the interrupt can be posted.  The return of
                    370: ``sizeof (struct updevice)'' here indicates that the probe routine
                    371: is satisfied that the device is present (the value returned is not
                    372: currently used, but future plans dictate that you should return the amount
                    373: of space in the device's register bank).  A probe routine may use
                    374: the function ``badaddr'' to see
                    375: if certain other addresses are accessible on the UNIBUS (without generating
                    376: a machine check), or look at the contents of locations where certain
                    377: registers should be.  If the registers contents are not acceptable or
                    378: the addresses don't respond, the probe routine can return 0 and the
                    379: device will not be considered to be there.
                    380: .IP
                    381: One other thing to note is that the action of different VAXen when illegal
                    382: addresses are accessed on the UNIBUS may differ.  Some of the machines
                    383: may generate machine checks and some may cause UNIBUS errors.  Such
                    384: considerations are handled by the configuration program and the driver
                    385: writer need not be concerned with them.
                    386: .IP
                    387: It is also possible to write a very simple probe routine for a one-of-a-kind
                    388: device if probing is difficult or impossible.  Such a routine would include
                    389: statements of the form:
                    390: .DS
                    391: br = 0x15;
                    392: cvec = 0200;
                    393: .DE
                    394: for instance, to declare that the device ran at UNIBUS br5 and interrupted
                    395: through vector 0200 on the UNIBUS.
                    396: .IP \fBud_slave\fP
                    397: This routine is called with a \fIuba_device\fR structure (yet to
                    398: be described) and the address of the device controller.  It should
                    399: determine whether a particular slave device of a controller is
                    400: present, returning 1 if it is and 0 if it is not.
                    401: As an example here is the slave routine for \fIup.c\fR.
                    402: .DS
                    403: upslave(ui, reg)
                    404:         struct uba_device *ui;
                    405:         caddr_t reg;
                    406: {
                    407:         register struct updevice *upaddr = (struct updevice *)reg;
                    408: 
                    409:         upaddr->upcs1 = 0;              /* conservative */
                    410:         upaddr->upcs2 = ui->ui_slave;
                    411:         if (upaddr->upcs2 & UPCS2_NED) {
                    412:                 upaddr->upcs1 = UP_DCLR | UP_GO;
                    413:                 return (0);
                    414:         }
                    415:         return (1);
                    416: }
                    417: .DE
                    418: Here the code fetches the slave (disk unit) number from the \fIui_slave\fR
                    419: field of the \fIuba_device\fR structure, and sees if the controller
                    420: responds that that is a non-existent driver (NED).  If the drive is not present,
                    421: a drive clear is issued to clean the state of the controller, and 0 is
                    422: returned indicating that the slave is not there.  Otherwise a 1 is returned.
                    423: .IP \fBud_attach\fP
                    424: The attach routine is called after the autoconfigure code and the driver concur
                    425: that a peripheral exists attached to a controller.  This is the routine
                    426: where internal driver state about the peripheral can be initialized.
                    427: Here is the \fIattach\fR routine from the \fIup.c\fR driver:
                    428: .DS
                    429: .DT
                    430: upattach(ui)
                    431:         register struct uba_device *ui;
                    432: {
                    433:         register struct updevice *upaddr;
                    434: 
                    435:         if (upwstart == 0) {
                    436:                 timeout(upwatch, (caddr_t)0, hz);
                    437:                 upwstart++;
                    438:         }
                    439:         if (ui->ui_dk >= 0)
                    440:                 dk_mspw[ui->ui_dk] = .0000020345;
                    441:         upip[ui->ui_ctlr][ui->ui_slave] = ui;
                    442:         up_softc[ui->ui_ctlr].sc_ndrive++;
                    443:        ui->ui_type = upmaptype(ui);
                    444: }
                    445: .DE
                    446: The attach routine here performs a number of functions.  The first
                    447: time any drive is attached to the controller it starts the timeout
                    448: routine which watches the disk drives to make sure that interrupts
                    449: aren't lost.  It also initializes, for devices which have been assigned
                    450: \fIiostat\fR numbers (when ui->ui_dk >= 0), the transfer rate of the
                    451: device in the array \fIdk_mspw\fR, the fraction of a second it takes
                    452: to transfer 16 bit word.  It then initializes an inverting pointer
                    453: in the array \fIupip\fR which will be used later to determine, for a
                    454: particular \fIup\fR controller and slave number, the corresponding
                    455: \fIuba_device\fR.  It increments the count of the number of devices
                    456: on this controller, so that search commands can later be avoided
                    457: if the count is exactly 1.  It then attempts to decipher the actual
                    458: type of drive attached to the controller in a controller-specific
                    459: way.  On the EMULEX SC-21 it may ask for the number of tracks on
                    460: the device and use this to decide what the drive type is.  The drive
                    461: type is used to setup disk partition mapping tables and other
                    462: device specific information.
                    463: .IP \fBud_dgo\fP
                    464: .br
                    465: This is the routine which is called by the UNIBUS resource management
                    466: routines when an operation is ready to be started (because the required
                    467: resources have been allocated).  The routine in \fIup.c\fR is:
                    468: .DS
                    469: updgo(um)
                    470:         struct uba_ctlr *um;
                    471: {
                    472:         register struct updevice *upaddr = (struct updevice *)um->um_addr;
                    473: 
                    474:         upaddr->upba = um->um_ubinfo;
                    475:         upaddr->upcs1 = um->um_cmd|((um->um_ubinfo>>8)&0x300);
                    476: }
                    477: .DE
                    478: This routine uses the field \fIum_ubinfo\fR of the \fIuba_ctlr\fR
                    479: structure which is where the UNIBUS routines store the UNIBUS
                    480: map allocation information.  In particular, the low 18 bits of this
                    481: word give the UNIBUS address assigned to the transfer.  The assignment
                    482: to \fIupba\fR in the go routine places the low 16 bits of the UNIBUS
                    483: address in the disk UNIBUS address register.  The next assignment
                    484: places the disk operation command and the extended (high 2) address
                    485: bits in the device control-status register, starting the I/O operation.
                    486: The field \fIum_cmd\fR was initialized with the command to be stuffed
                    487: here in the driver code itself before the call to the \fIubago\fR
                    488: routine which eventually resulted in the call to \fIupdgo\fR.
                    489: .IP \fBud_addr\fP
                    490: This is a zero-terminated list of the conventional addresses
                    491: for the device control registers in UNIBUS space.
                    492: This information is used by the system
                    493: to look for instances of the device supported by the driver.
                    494: When the system probes for the device it first checks for a
                    495: control-status register located at the address indicated in
                    496: the configuration file (if supplied), then uses the list of
                    497: conventional addresses pointed to be \fIud_addr\fP.
                    498: .IP \fBud_dname\fP
                    499: This is the name of a \fIdevice\fR supported by this controller; thus the
                    500: disks on a SC-21 controller are called \fIup0\fR, \fIup1\fR, etc.
                    501: That is because this field contains \fIup\fR.
                    502: .IP \fBud_dinfo\fP
                    503: This is an array of back pointers to the \fIuba_device\fR structures for
                    504: each device attached to the controller.  Each driver defines a set of
                    505: controllers and a set of devices.  The device address space is always
                    506: one-dimensional, so that the presence of extra controllers may be
                    507: masked away (e.g. by pattern matching) to take advantage of hardware
                    508: redundancy.  This field is filled in by the configuration program,
                    509: and used by the driver.
                    510: .IP \fBud_mname\fP
                    511: The name of a controller, e.g. \fIsc\fR for the \fIup.c\fR driver.
                    512: The first SC-21 is called \fIsc0\fR, etc.
                    513: .IP \fBud_minfo\fP
                    514: The backpointer array to the structures for the controllers.
                    515: .IP \fBud_xclu\fP
                    516: If non-zero specifies that the controller requires exclusive
                    517: use of the UNIBUS when it is running.  This is non-zero currently
                    518: only for the RK611 controller for the RK07 disks to map around a hardware
                    519: problem.  It could also be used if 6250bpi tape drives are to be used
                    520: on the UNIBUS to insure that they get the bandwidth that they need
                    521: (basically the whole bus).
                    522: .IP \fBud_ubamem\fP
                    523: This is an optional entry point to the driver to configure UNIBUS memory
                    524: associated with a device.
                    525: If this field in the driver structure is null, it is ignored.
                    526: Otherwise, it is called before beginning to probe for devices
                    527: when configuration of a UNIBUS is begun.
                    528: The driver must probe for the existence of its memory,
                    529: and is then responsible for allocating the map registers corresponding
                    530: to the device memory addresses so that the registers are not used for other
                    531: purposes.
                    532: The \fBud_ubamem\fP returns 0 on success and \-1 on failure.
                    533: A return value of 1 indicates that the memory exists, and that there
                    534: is no further configuration required for the device.
                    535: .SH
                    536: uba_ctlr structure
                    537: .PP
                    538: One of these structures exists per-controller.
                    539: The fields link the controller to its UNIBUS adapter and contain the
                    540: state information about the devices on the controller.  The fields are:
                    541: .IP \fBum_driver\fP
                    542: A pointer to the \fIstruct uba_device\fR for this driver, which has
                    543: fields as defined above.
                    544: .IP \fBum_ctlr\fP
                    545: The controller number for this controller, e.g. the 0 in \fIsc0\fR.
                    546: .IP \fBum_alive\fP
                    547: Set to 1 if the controller is considered alive; currently, always set
                    548: for any structure encountered during normal operation.  That is, the
                    549: driver will have a handle on a \fIuba_ctlr\fR structure only if the
                    550: configuration routines set this field to a 1 and entered it into the
                    551: driver tables.
                    552: .IP \fBum_intr\fP
                    553: The interrupt vector routines for this device.  These are generated
                    554: by \fIconfig\fP and this field is initialized in the
                    555: \fIioconf.c\fR file.
                    556: .IP \fBum_hd\fP
                    557: .br
                    558: A back-pointer to the UNIBUS adapter to which this controller is attached.
                    559: .IP \fBum_cmd\fP
                    560: A place for the driver to store the command which is to be given to
                    561: the device before calling the routine \fIubago\fR with the devices
                    562: \fIuba_device\fR structure.  This information is then retrieved when the
                    563: device go routine is called and stuffed in the device control status register
                    564: to start the I/O operation.
                    565: .IP \fBum_ubinfo\fP
                    566: Information about the UNIBUS resources allocated to the device.  This is
                    567: normally only used in device driver go routine (as \fIupdgo\fR above)
                    568: and occasionally in exceptional condition handling such as ECC correction.
                    569: .IP \fBum_tab\fP
                    570: This buffer structure is a place where the driver hangs the device structures
                    571: which are ready to transfer.  Each driver allocates a buf structure for each
                    572: device (e.g. \fIupdtab\fR in the \fIup.c\fR driver) for this purpose.
                    573: You can think of this structure as a device-control-block, and the
                    574: buf structures linked to it as the unit-control-blocks.
                    575: The code for dealing with this structure is stylized; see the \fIrk.c\fR
                    576: or \fIup.c\fR driver for the details.  If the \fIubago\fR routine
                    577: is to be used, the structure attached to this \fIbuf\fR structure
                    578: must be:
                    579: .RS
                    580: .IP \(bu 3
                    581: A chain of \fIbuf\fR structures for each waiting device on this controller.
                    582: .IP \(bu 3
                    583: On each waiting \fIbuf\fR structure another \fIbuf\fR structure which is
                    584: the one containing the parameters of the I/O operation.
                    585: .RE
                    586: .SH
                    587: uba_device structure
                    588: .PP
                    589: One of these structures exist for each device attached to a UNIBUS
                    590: controller.  Devices which are not attached to controllers or which
                    591: perform no buffered data path
                    592: DMA I/O may have only a device structure.  Thus \fIdz\fR
                    593: and \fIdh\fR devices have only \fIuba_device\fR structures.
                    594: The fields are:
                    595: .IP \fBui_driver\fP
                    596: A pointer to the \fIstruct uba_driver\fR structure for this device type.
                    597: .IP \fBui_unit\fP
                    598: The unit number of this device, e.g. 0 in \fBup0\fR, or 1 in \fBdh1\fR.
                    599: .IP \fBui_ctlr\fP
                    600: .br
                    601: The number of the controller on which this device is attached, or \-1
                    602: if this device is not on a controller.
                    603: .IP \fBui_ubanum\fP
                    604: The number of the UNIBUS on which this device is attached.
                    605: .IP \fBui_slave\fP
                    606: The slave number of this device on the controller which it is attached to,
                    607: or \-1 if the device is not a slave.  Thus a disk which was unit 2 on
                    608: a SC-21 would have \fIui_slave\fR 2; it might or might not be \fIup2\fR,
                    609: that depends on the system configuration specification.
                    610: .IP \fBui_intr\fP
                    611: .br
                    612: The interrupt vector entries for this device, copied into the UNIBUS
                    613: interrupt vector at boot time.  The values of these fields are filled
                    614: in by \fIconfig\fP to small code segments which it
                    615: generates in the file \fIubglue.s\fR.
                    616: .IP \fBui_addr\fP
                    617: The control-status register address of this device.
                    618: .IP \fBui_dk\fP
                    619: .br
                    620: The iostat number assigned to this device.  Numbers are assigned to
                    621: disks only, and are small nonnegative integers which index the various
                    622: \fIdk_*\fP arrays in <\fIsys/dk.h\fP>.
                    623: .IP \fBui_flags\fP
                    624: The optional ``flags \fIxxx\fP'' parameter from the configuration
                    625: specification was copied to this field, to be interpreted by the driver.
                    626: If \fIflags\fP was not specified, then this field will contain a 0.
                    627: .IP \fBui_alive\fP
                    628: The device is really there.  Presently set to 1 when a device is
                    629: determined to be alive, and left 1.
                    630: .IP \fBui_type\fP
                    631: The device type, to be used by the driver internally.
                    632: .IP \fBui_physaddr\fP
                    633: The physical memory address of the device control-status register.
                    634: This is typically used in the device dump routines.
                    635: .IP \fBui_mi\fP
                    636: .br
                    637: A \fIstruct uba_ctlr\fP pointer to the controller (if any) on which
                    638: this device resides.
                    639: .IP \fBui_hd\fP
                    640: .br
                    641: A \fIstruct uba_hd\fP pointer to the UNIBUS on which this device resides.
                    642: .SH
                    643: UNIBUS resource management routines
                    644: .PP
                    645: UNIBUS drivers are supported by a collection of utility routines
                    646: which manage UNIBUS resources.  If a driver attempts to bypass the
                    647: UNIBUS routines, other drivers may not operate properly.
                    648: The major routines are: \fIuballoc\fP to allocate UNIBUS resources,
                    649: \fIubarelse\fP to release previously allocated resources, and
                    650: \fIubago\fP to initiate DMA.  When allocating UNIBUS resources
                    651: you may request that you
                    652: .IP NEEDBDP
                    653: if you need a buffered data path,
                    654: .IP HAVEBDP
                    655: if you already have a buffered data path and just want new
                    656: mapping registers (and access to the UNIBUS),
                    657: .IP CANTWAIT
                    658: if you are calling (potentially) from interrupt level, and
                    659: .IP NEED16
                    660: if the device uses only 16 address bits, and thus requires
                    661: map registers from the first 64K of UNIBUS address space.
                    662: .LP
                    663: If the presentation here does not answer all the questions
                    664: you may have, consult the file /sys/vaxuba/uba.c
                    665: .SH
                    666: Autoconfiguration requirements
                    667: .PP
                    668: Basically all you have to do is write a \fIud_probe\fP and a \fIud_attach\fP
                    669: routine for the controller.  It suffices to have a \fIud_probe\fP routine
                    670: which just initializes \fIbr\fP and \fIcvec\fP, and a \fIud_attach\fP
                    671: routine which does nothing.
                    672: Making the device fully configurable requires, of course, more work,
                    673: but is worth it if you expect the device to be in common usage
                    674: and want to share it with others.
                    675: .PP
                    676: If you managed to create all the needed hooks, then make sure you include
                    677: the necessary header files; the ones included by \fIvaxuba/ct.c\fP are nearly
                    678: minimal.  Order is important here, don't be surprised at undefined structure
                    679: complaints if you order the includes incorrectly.
                    680: Finally, if you get the device configured in, you can try bootstrapping
                    681: and see if configuration messages print out about your device.
                    682: It is a good idea to have some messages in the probe routine so that
                    683: you can see that it is being called and what is going on.
                    684: If it is not called, then you probably have the control-status
                    685: register address wrong in the system configuration.  The autoconfigure
                    686: code notices that the device doesn't exist in this case,
                    687: and the probe will never be called.
                    688: .PP
                    689: Assuming that your probe routine works and you manage
                    690: to generate an interrupt, then you are basically back to where you
                    691: would have been under older versions of UNIX.
                    692: Just be sure to use the \fIui_ctlr\fP field of the \fIuba_device\fP
                    693: structures to address the device; compiling in funny constants
                    694: will make your driver only work on the CPU type you have (780, 750, or 730).
                    695: .PP
                    696: Other bad things that might happen while you are setting up the configuration
                    697: stuff:
                    698: .IP \(bu 3
                    699: You get ``nexus zero vector'' errors from the system.  This will happen
                    700: if you cause a device to interrupt, but take away the interrupt enable
                    701: so fast that the UNIBUS adapter cancels the interrupt and confuses
                    702: the processor.  The best thing to do it to put a modest delay in the
                    703: probe code between the instructions which should cause and interrupt and
                    704: the clearing of the interrupt enable.  (You should clear interrupt
                    705: enable before you leave the probe routine so the device doesn't interrupt
                    706: more and confuse the system while it is configuring other devices.)
                    707: .IP \(bu 3
                    708: The device refuses to interrupt or interrupts with a ``zero vector''.
                    709: This typically indicates a problem with the hardware or, for devices
                    710: which emulate other devices, that the emulation is incomplete.  Devices
                    711: may fail to present interrupt vectors because they have configuration
                    712: switches set wrong, or because they are being accessed in inappropriate ways.
                    713: Incomplete emulation can cause ``maintenance mode'' features to not work
                    714: properly, and these features are often needed to force device interrupts.

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.