293 lines
9.9 KiB
Groff
293 lines
9.9 KiB
Groff
.\" $NetBSD: autoconf.9,v 1.10 2002/04/02 14:14:45 heinz Exp $
|
|
.\"
|
|
.\" Copyright (c) 2001 The NetBSD Foundation, Inc.
|
|
.\" All rights reserved.
|
|
.\"
|
|
.\" This code is derived from software contributed to The NetBSD Foundation
|
|
.\" by Gregory McGarry.
|
|
.\"
|
|
.\" Redistribution and use in source and binary forms, with or without
|
|
.\" modification, are permitted provided that the following conditions
|
|
.\" are met:
|
|
.\" 1. Redistributions of source code must retain the above copyright
|
|
.\" notice, this list of conditions and the following disclaimer.
|
|
.\" 2. Redistributions in binary form must reproduce the above copyright
|
|
.\" notice, this list of conditions and the following disclaimer in the
|
|
.\" documentation and/or other materials provided with the distribution.
|
|
.\" 3. All advertising materials mentioning features or use of this software
|
|
.\" must display the following acknowledgement:
|
|
.\" This product includes software developed by the NetBSD
|
|
.\" Foundation, Inc. and its contributors.
|
|
.\" 4. Neither the name of The NetBSD Foundation nor the names of its
|
|
.\" contributors may be used to endorse or promote products derived
|
|
.\" from this software without specific prior written permission.
|
|
.\"
|
|
.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
|
|
.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
|
.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
.\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
|
|
.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
.\" POSSIBILITY OF SUCH DAMAGE.
|
|
.\"
|
|
.Dd June 17, 2001
|
|
.Dt AUTOCONF 9
|
|
.Os
|
|
.Sh NAME
|
|
.Nm autoconf ,
|
|
.Nm config_search ,
|
|
.Nm config_found_sm ,
|
|
.Nm config_found ,
|
|
.Nm config_attach ,
|
|
.Nm config_detach ,
|
|
.Nm config_activate ,
|
|
.Nm config_deactivate ,
|
|
.Nm config_defer ,
|
|
.Nm config_interrupts ,
|
|
.Nm config_pending_incr ,
|
|
.Nm config_pending_decr
|
|
.Nd autoconfiguration framework
|
|
.Sh SYNOPSIS
|
|
.Fd #include \*[Lt]sys/param.h\*[Gt]
|
|
.Fd #include \*[Lt]sys/device.h\*[Gt]
|
|
.Fd #include \*[Lt]sys/error.h\*[Gt]
|
|
.Ft struct cfdata *
|
|
.Fn config_search "cfmatch_t func" "struct device *parent" "void *aux"
|
|
.Ft struct device *
|
|
.Fn config_found_sm "struct device *parent" "void *aux" "cfprint_t print" \
|
|
"cfmatch_t submatch"
|
|
.Ft struct device *
|
|
.Fn config_found "struct device *parent" "void *aux" "cfprint_t print"
|
|
.Ft struct device *
|
|
.Fn config_attach "struct device *parent" "struct cfdata *cf" "void *aux" \
|
|
"cfprint_t print"
|
|
.Ft int
|
|
.Fn config_detach "struct device *dev" "int flags"
|
|
.Ft int
|
|
.Fn config_activate "struct device *dev"
|
|
.Ft int
|
|
.Fn config_deactivate "struct device *dev"
|
|
.Ft int
|
|
.Fn config_defer "struct device *dev" "void (*func)(struct device *)"
|
|
.Ft void
|
|
.Fn config_interrupts "struct device *dev" "void (*func)(struct device *)"
|
|
.Ft void
|
|
.Fn config_pending_incr
|
|
.Ft void
|
|
.Fn config_pending_decr
|
|
.Sh DESCRIPTION
|
|
Autoconfiguration is the process of matching hardware devices with an
|
|
appropriate device driver. In its most basic form, autoconfiguration
|
|
consists of the recursive process of finding and attaching all devices
|
|
on a bus, including other busses.
|
|
.Pp
|
|
The autoconfiguration framework supports
|
|
.Em direct configuration
|
|
where the bus driver can determine the devices present. The
|
|
autoconfiguration framework also supports
|
|
.Em indirect configuration
|
|
where the drivers must probe the bus looking for the presence of a device.
|
|
Direct configuration is preferred since it can find hardware
|
|
regardless of the presence of proper drivers.
|
|
.Pp
|
|
The autoconfiguration process occurs at system bootstrap and is driven
|
|
by a table generated from a
|
|
.Do
|
|
machine description
|
|
.Dc
|
|
file by
|
|
.Xr config 8 .
|
|
For a description of the
|
|
.Xr config 8
|
|
.Do
|
|
device definition
|
|
.Dc
|
|
language, see
|
|
.Xr config 9 .
|
|
.Pp
|
|
Each device must have a name consisting of an alphanumeric string that
|
|
ends with a unit number. The unit number identifies an instance of
|
|
the driver. Device data structures are allocated dynamically during
|
|
autoconfiguration, giving a unique address for each instance.
|
|
.Sh FUNCTIONS
|
|
.Bl -tag -width compact
|
|
.It Fn config_search "func" "parent" "aux"
|
|
Performs indirect configuration of physical devices.
|
|
.Fn config_search
|
|
iterates over all potential children, calling the given
|
|
function
|
|
.Fa func
|
|
for each one. If
|
|
.Fa func
|
|
is NULL,
|
|
.Fn config_search
|
|
applies each child's match function instead. The argument
|
|
.Fa parent
|
|
is the pointer to the parent's device structure. The given
|
|
.Fa aux
|
|
argument describes the device that has been found and is simply passed
|
|
on through
|
|
.Fa func
|
|
to the child.
|
|
.Fn config_search
|
|
returns a pointer to the best-matched child or NULL otherwise.
|
|
.Pp
|
|
The role of
|
|
.Fa func
|
|
is to call
|
|
the match function for each device and call
|
|
.Fn config_attach
|
|
for any positive matches. If
|
|
.Fa func
|
|
is NULL, then the parent should record the return value from
|
|
.Fn config_search
|
|
and call
|
|
.Fn config_attach
|
|
itself.
|
|
.Pp
|
|
Note that this function is designed so that it can be used to apply an
|
|
arbitrary function to all potential children. In this case callers
|
|
may choose to ignore the return value.
|
|
.It Fn config_found_sm "parent" "aux" "print" "submatch"
|
|
Performs direct configuration on a physical device.
|
|
.Fn config_found_sm
|
|
is called by the parent and in turn calls the
|
|
.Fa submatch
|
|
function to call the match function as
|
|
determined by the configuration table. If
|
|
.Fa submatch
|
|
is NULL, the driver match functions are called directly. The argument
|
|
.Fa parent
|
|
is the pointer to the parent's device structure. The given
|
|
.Fa aux
|
|
argument describes the device that has been found. The
|
|
.Em softc
|
|
structure for the matched device will be allocated, and the
|
|
appropriate driver attach function will be called. If the device is
|
|
matched, the system prints the name of the child and parent devices,
|
|
and then calls the
|
|
.Fa print
|
|
function to produce additional information if desired. If no driver
|
|
takes a match, the same
|
|
.Fa print
|
|
function is called to complain. The print function is called with the
|
|
.Fa aux
|
|
argument and, if the matches failed, the full name (including unit
|
|
number) of the parent device, otherwise NULL. The
|
|
.Fa print
|
|
function must return an integer value.
|
|
.Pp
|
|
Two special strings,
|
|
.Do
|
|
not configured
|
|
.Dc
|
|
and
|
|
.Do
|
|
unsupported
|
|
.Dc
|
|
will be appended automatically to non-driver reports if the return
|
|
value is UNCONF or UNSUPP respectively; otherwise the function should
|
|
return the value QUIET.
|
|
.Pp
|
|
.Fn config_found_sm
|
|
returns a pointer to the attached device's
|
|
.Em softc
|
|
structure if the device is attached, NULL otherwise. Most callers can
|
|
ignore this value, since the system will already have printed a
|
|
diagnostic.
|
|
.It Fn config_found "parent" "aux" "print"
|
|
This function is equivalent to calling
|
|
.Fn config_found_sm "parent" "aux" "print" "submatch"
|
|
with
|
|
.Fa submatch
|
|
set to NULL and is provided for compatibility with older drivers.
|
|
.It Fn config_attach "parent" "cf" "aux" "print"
|
|
Attach a found device. Allocates the memory for the
|
|
.Em softc
|
|
structure and calls the drivers attach function according to the
|
|
configuration table.
|
|
If successful,
|
|
.Fn config_attach
|
|
returns the
|
|
.Em softc .
|
|
If unsuccessful, it returns NULL.
|
|
.It Fn config_detach "dev" "flags"
|
|
Called by the parent to detach the child device. The second argument
|
|
.Em flags
|
|
contains detachment flags. Valid values are DETACH_FORCE (force
|
|
detachment (eg. because of hardware removal) and DETACH_QUIET (do not
|
|
print a notice).
|
|
.Fn config_detach
|
|
returns zero if successful and an error code otherwise.
|
|
.Fn config_detach
|
|
is always called from a thread context, allowing
|
|
.Xr sleep 9
|
|
to be called while the device detaches itself.
|
|
.It Fn config_activate "dev"
|
|
Called by the parent to activate the child device
|
|
.Fa dev .
|
|
It is called to activate resources and initialise other kernel
|
|
subsystems (such as the network subsystem).
|
|
.Fn config_activate
|
|
is called from interrupt context after the device has been attached.
|
|
.It Fn config_deactivate "dev"
|
|
Called by the parent to deactivate the child device
|
|
.Fa dev .
|
|
.Fn config_deactivate
|
|
is called from interrupt context to immediately relinquish resources
|
|
and notify dependent kernel subsystems that the device is about to be
|
|
detached. At some later point
|
|
.Fn config_detach
|
|
will be called to finalise the removal of the device.
|
|
.It Fn config_defer "dev" "func"
|
|
Called by the child to defer the remainder of its configuration until
|
|
all its parent's devices have been attached. At this point, the
|
|
function
|
|
.Fa func
|
|
is called with the argument
|
|
.Fa dev .
|
|
.It Fn config_interrupts "struct device *dev" "void (*func)(struct device *)"
|
|
Called by the child to defer the remainder of its configuration until
|
|
interrupts are enabled. At this point, the function
|
|
.Fa func
|
|
is called with the argument
|
|
.Fa dev .
|
|
.It Fn config_pending_incr
|
|
Increment the
|
|
.Va config_pending
|
|
semaphore. It is used to account for deferred configurations before
|
|
mounting the root file system.
|
|
.It Fn config_pending_decr
|
|
Decrement the
|
|
.Va config_pending
|
|
semaphore. It is used to account for deferred configurations before
|
|
mounting the root file system.
|
|
.El
|
|
.Sh CODE REFERENCES
|
|
This section describes places within the
|
|
.Nx
|
|
source tree where actual code implementing or utilising the
|
|
autoconfiguration framework can be found. All pathnames are relative
|
|
to
|
|
.Pa /usr/src .
|
|
.Pp
|
|
The autoconfiguration framework itself is implemented within the file
|
|
.Pa sys/kern/subr_autoconf.c .
|
|
Data structures and function prototypes for the framework are located in
|
|
.Pa sys/sys/device.h .
|
|
.Sh SEE ALSO
|
|
.Xr config 8 ,
|
|
.Xr config 9 ,
|
|
.Xr driver 9
|
|
.Sh HISTORY
|
|
Autoconfiguration first appeared in
|
|
.Bx 4.1 .
|
|
The autoconfiguration framework was completely revised in
|
|
.Bx 4.4 .
|
|
The detach and activate/deactivate interfaces appeared in
|
|
.Nx 1.5 .
|