How to get a device_t
John Birrell
jb at cimlogic.com.au
Thu Aug 7 15:35:13 PDT 2003
On Thu, Aug 07, 2003 at 10:23:03AM -0400, John Baldwin wrote:
>
> On 07-Aug-2003 M. Warner Losh wrote:
> > In message: <20030807005810.GG35859 at cicely12.cicely.de>
> > Bernd Walter <ticso at cicely12.cicely.de> writes:
> >: The host bridge is not available yet at probing time of the host bridge.
> >: What we have is the host bridges parent (nexus) in the calling function.
> >: Either we hand out the parents device_t to nexus_pcib_is_host_bridge, or
> >: we find it out later.
> >
> > Don't you mean legacy_pcib_is_host_bridge? That's where the matching
> > is done in current right now (well, at least as of my last sync) If
> > so, passing the host bridge's device down to it would be trivial to
> > add. It would also allow other CPUs with builtin host bridges to do
> > similar tricks to the one that is done for the ELAN. These sorts of
> > features have been very common in other CPU families, and there's no
> > reason to think that there won't be more of them in the x86 family as
> > time goes on.
> >
> > I'm not sure that adding it to nexus at this stage of the boot would
> > truly work. Since the legacy device has decided to attach, the nexus
> > bus is already walking through its children. Adding a child during
> > that walk strikes me as dangerous, since we have no locking on the
> > children element of the device_t. Hmmm, looks I just found a source
> > of problems in my newbus locking code that might explain some weird
> > things happening when I enable it.... Thanks for making me go look :-)
>
> You would add it to legacy, not nexus. What you probably really want
> to do is to write a host-PCI bridge driver that attaches to the actual
> PCI device like 'hostb' and 'agp' do that creates a suitable child bus
> for the MMCR stuff. This works for both ACPI and non-ACPI and doesn't
> require hacking the legacy_pcib stuff.
I'm not convinced that any hacking is required other than passing the
device_t parent to nexus_pcib_is_host_bridge (in STABLE) as Bernd says.
I traced the boot on my system and the MMCR is initialised early (when
the Timecounter "ELAN" output occurs). Immediately following that
initialisation, 'pcib' is added as a child of 'nexus'. I don't see why
'mmcr' couldn't be added as a child of 'nexus' too. At this point,
nexus isn't walking through it's children so there shouldn't be a problem.
Then the ELAN specific devices (like GPIO and flash) can attach to 'mmcr'.
This seems straight forward. Maybe I'm missing something. 8-)
--
John Birrell
More information about the freebsd-hackers
mailing list