Can we hook a device as device to two different parent devices?
John-Mark Gurney
jmg at funkthat.com
Fri Jun 5 06:31:40 UTC 2020
Mark Millard wrote this message on Thu, Jun 04, 2020 at 16:01 -0700:
> [I'm only trying to follow along for my own edification
> in an area I'm not familiar with.]
>
> On 2020-Jun-4, at 14:53, John-Mark Gurney <jmg at funkthat.com> wrote:
>
> > Rajesh Kumar wrote this message on Fri, Jun 05, 2020 at 00:01 +0530:
> >> Thanks Warner and Andriy for your answers.
> >>
> >> Having said they are two separate instances, if the child driver calls the
> >> interface of two parents as below
> >> device1_interface(child_dev), then device_get_parent(child_dev) in the
> >> device1 interface will return device1 reference
> >> device2_interface(child_dev), then device_get_parent(child_dev) in the
> >> device2 interface will return device2 reference
> >>
> >> Is that right?
> >
> > I think you're confused. The device tree is a strict tree. This
> > means that a device can have ONLY one parent. The multiple parents
> > is simply saying that a device can attach at different points in the
> > tree...
> >
> > example, you have a device dev that is declared as possibly having both
this should have been: "a device driver dev".
> > pci and simplebus:
> >
> > nexus0
> > acpi0
> > pcib0
> > pci0
> > hostb0
> > pcib1
> > pci1
> > dev0
> > ofwbus0
> > simplebus1 pnpinfo compat=simple-bus
> > dev1
> >
> > This example (and entirely made up, I've merged the tree from two
> > different machines, running devinfo -v, only merged to make a point),
> > dev0, when calling device_get_parent, will get the pci1 device, and
> > dev1 when calling device_get_parent will get simplebus1...
> >
> > I think this might be what you said above, but couldn't follow the
> > device1_interface(child_dev) part, as that didn't make sense to me...
>
> You have 3 "dev" names mentioned above: dev, dev0, dev1
> You mention "dev" as the "device".
Yeah, seeing that now, I should have said the device driver
dev.. dev is not an instance of the device driver... only
dev0 and dev1 are instances (attached) of the device driver...
> So am I to infer that for "dev" only one of dev0 vs. dev1
dev is like em, or igb.. it's the device driver name... dev0
or dev1 is an instance of the driver...
> can be attached at a time (to its parent)? Code can still
each instance, dev0 or dev1 or devX, will be attached to a
(one) parent.. Each parent may have multiple instances of
dev, say pci1 having dev0, dev2 and dev3... and above,
simplebus1 could have dev1 and dev4 as children...
> find out what the alternative would be for the other one
> of the two, but having both dev0 and dev1 based attachments
> at the same time can not be done?
A device driver can be attached to different busses at the same
time, but each instance of that driver can only be attached to one
bus at a time...
Hope this clarifies things...
It's been a few years, but I did a presentation on writing device
drivers in FreeBSD:
https://people.freebsd.org/~jmg/drivers/freebsd.device.driver.slides.pdf
on slide 4, talking about if_re.c, you can see:
static devclass_t re_devclass;
DRIVER_MODULE(re, pci, re_driver, re_devclass, 0, 0);
DRIVER_MODULE(re, cardbus, re_driver, re_devclass, 0, 0);
DRIVER_MODULE(miibus, re, miibus_driver, miibus_devclass, 0, 0);
This shows that the re driver can be attached to either the pci bus,
or the cardbus... When you boot a machine, you could have re0 and re1
that are PCI cards installed in the machine.. and then later you could
plug in a cardbus card where the re driver attaches, and you'd now have
re2 under cardbus...
Warner has also done a presentation on newbus subclassing:
https://people.freebsd.org/~imp/bsdcan2013-slides.pdf
--
John-Mark Gurney Voice: +1 415 225 5579
"All that I will do, has been done, All that I have, has not."
More information about the freebsd-hackers
mailing list