Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 06 Oct 2006 09:42:31 -0600 (MDT)
From:      "M. Warner Losh" <imp@bsdimp.com>
To:        namaskar_alok@yahoo.co.in
Cc:        freebsd-new-bus@freebsd.org
Subject:   Re: Device enumeration process
Message-ID:  <20061006.094231.-1572283957.imp@bsdimp.com>
In-Reply-To: <20061006073434.71730.qmail@web8913.mail.in.yahoo.com>
References:  <20060930.124334.-432842007.imp@bsdimp.com> <20061006073434.71730.qmail@web8913.mail.in.yahoo.com>

next in thread | previous in thread | raw e-mail | index | archive | help
In message: <20061006073434.71730.qmail@web8913.mail.in.yahoo.com>
            Alok Barsode <namaskar_alok@yahoo.co.in> writes:
: Thanks for ur earliers replies. They helped me a lot
: in understanding the newbus architecture. 
: I am involved in a freeBSD port to a freescale board. 

Cool!  Remind me: is the freescale an arm design or a Power PC one?

: When i/o configuration is in progress during startup,
: are the drivers for specific busses alreay assosciated
: with them or the association happens at run time ?

The drivers are associated with the busses at compile time (as
extended via modules that are loaded).  The assignment of specific
device nodes to drivers is done at run time.

: for example : 
: when nexus is being attached to root_bus,
: the method devclass_find_internal("nexus", 0, TRUE) is
: invoked(in method make_device).Now does a nexus
: devclass already exist ( it is created through the
: macro DRIVER_MODULE(nexus, root, nexus_driver,
: nexus_devclass, 0, 0);) or it is created at runtime ? 
: 
: if it is created at runtime how the nexus_driver get
: assciated with nexus? 

nexus_driver gets associated with nexus here:

/*
 * Determine i/o configuration for a machine.
 */
static void
configure_first(dummy)
        void *dummy;
{
 
        /* nexus0 is the top of the i386 device tree */
        device_add_child(root_bus, "nexus", 0);
}
 
at least tenatively associated.  configure_first is run via the
SYSINIT at SI_SUB_CONFIGURE as the first thing.  In fact, all the
autoconf look similar in this respect.  The arm one does the same
thing.

If you look at sys/arm/at91/at91.c, you'll see code:

static void
at91_identify(driver_t *drv, device_t parent)
{

        BUS_ADD_CHILD(parent, 0, "atmelarm", 0);
}

which is how the atmelbus gets added to nexus.  Again, the atmelbus is
about the best example I can easily find in the tree...

Warner



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20061006.094231.-1572283957.imp>