Annotation of 43BSDReno/share/doc/smm/02.config/6.t, revision 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.