Subject: Re: Parameter passing in the kernel
To: None <eeh@netbsd.org>
From: Jason R Thorpe <thorpej@zembu.com>
List: tech-kern
Date: 06/18/2001 16:00:31
On Mon, Jun 18, 2001 at 10:47:54PM -0000, eeh@netbsd.org wrote:
> With the layered device driver structure that is used extensively in
> NetBSD to provide machine, bus and in some cases chip independence we
> often find the following paradigm:
>
> static void
> xx_bus_attach (struct device *self, _ATTACH_ARGS_)
> {
> struct xx_softc *xx = (struct xx_softc *xx)self;
>
> _DO_SOME_STUFF_
>
> xx->xx_DATA1 = _DATA1_;
> xx->xx_DATA2 = _DATA2_;
> xx->xx_DATA3 = _DATA3_;
> xxattach (xx, _ATTACH_ARGS_);
> }
>
> Once device properties are added to the kernel, this will
> all change. You can read about device properties in the
> tech-kern archives.
Uh, I don't think so.
The code actually usually looks like this:
static void
xx_bus_attach (struct device *self, _ATTACH_ARGS_)
{
struct xx_softc *xx = (struct xx_softc *xx)self;
_DO_SOME_STUFF_
xx->xx_DATA1 = _DATA1_;
xx->xx_DATA2 = _DATA2_;
xx->xx_DATA3 = _DATA3_;
xxattach (xx);
}
Note that _DATA1_, _DATA2_, and _DATA3_ are generally derived in some
bus-specific way, but once derived, are bus-independent. This is the
case with e.g. the DMA tag, the space tags, the space handles, etc.
Especially with the space *handles*, a bus-specific call is sometimes
required (c.f. PCI).
Getting the DMA tag might be appropriate for properties, but the space
tag fetching might have to be encapsulated inside a bus-specific call.
--
-- Jason R. Thorpe <thorpej@zembu.com>