Date: Tue, 14 Jul 2009 11:51:29 -0400 From: John Baldwin <jhb@freebsd.org> To: Norbert Koch <nkoch@demig.de> Cc: freebsd-hackers@freebsd.org Subject: Re: bus device driver Message-ID: <200907141151.29971.jhb@freebsd.org> In-Reply-To: <4A5CA4AA.6050307@demig.de> References: <4A5B3F1B.3040207@demig.de> <200907140849.51702.jhb@freebsd.org> <4A5CA4AA.6050307@demig.de>
next in thread | previous in thread | raw e-mail | index | archive | help
On Tuesday 14 July 2009 11:30:50 am Norbert Koch wrote: > > > From a hardware perspective, how do your devices know which addresses to > > decode? Do they consume subranges of BARs or are they assigned fixed > > addresses somehow? Do they have programmable decoders of some sort > > themselves? If you wish to have the PCI bus assign you resources then that > > implies that your PCI device has a BAR and that you want to request resources > > for that BAR and then hand out subranges of that to your children. If that > > is the case, then you will need to allocate the resources for the BAR for the > > PCI device from the PCI bus. Then your bus driver for the PCI device will > > need to suballoc from that BAR to your children devices. > > > > > My device decodes one ram address range (16MB) and gives me > one interrupt line. > As my sub-devices operate on partial address areas my idea was to > let them all call bus_alloc_resource() with the same rid parameter (= > BAR selector) > and different offsets. So the bookkeeping should be done by the pci > driver, right? No. First of all, the PCI bus driver will only allocate resources for direct children. It simply passes requests up the tree for grandchildren (this is how ISA devices behind a PCI-ISA bridge request resources). In this case, you will want to allocate resources for your BAR and your interrupt using bus_alloc_resource() during your attach routine. You can then either share the resources directly with your children by returning your resource values in your own bus_alloc_resource() method (see ppc(4) for an example of this) or subdivide your resource to make new resources (the easiest way to do this is probably to create a rman from your resource and then use rman_reserve_resource() to sub-allocate chunks of that to your children). For the interrupt resource you can just return your own resource pointer directly in your bus_alloc_resource() routine. -- John Baldwin
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200907141151.29971.jhb>