* Early PCI auto-configuration
@ 2000-10-26 22:46 Mark A. Greer
2000-10-26 23:26 ` Benjamin Herrenschmidt
0 siblings, 1 reply; 8+ messages in thread
From: Mark A. Greer @ 2000-10-26 22:46 UTC (permalink / raw)
To: linuxppc-dev
[The discussion below is based on the latest fsmlabs 5005 repository
code]
Disclaimer: I'm fairly new to linux PPC so my apologies if this has been
discussed before.
My problem: The firmware on a couple platform I need to support do
absolutely _no_ PCI device initialization.
To make things work for these boards in the current setup, I need to use
one of the pcibios_fixup() or pcibios_fixup_bus() hooks to walk the
entire bus tree, setup the devices (including bridges), and sort out all
the stuff that's already been put in the the "resource" entries--or am I
missing something??
I would prefer to run a "pci auto-configurator" that sets up all the
devices and bridges before pci_init() runs so I don't waste as much time
reading bad info and they trying to fix it all up later. The "fixup"
routines can still be used for minor tweaks and interrupt routing, etc.
I was thinking of doing it this ways...
>From the xxx_find_bridges() routine, call "pci_auto_scan_hose()" which
walks the entire bus hierarchy under each "hose" sorting out resources,
enumerating the buses, setting up bridges and their bounds, etc.
pci_init() will run some time later and pick up reasonable BAR values.
To make this work, I will add 4 fields to the pci_controller [or "hose"]
structure that have the upper and lower bounds for PCI I/O and memory
space for each hose. This is what the auto-configurator will use to
constrain his resource allocations.
Also, while I'm at it, add 2 more fields to pci_controller, one an array
of 32*8 int's that contian the devfn value of any devfn's that the
auto-configurator should skip. The other is the number of valid entries
in the array. This is useful--to me anyway--because I want the
auto-configurator to skip the host bridge itself. Also, on some
platforms, the host bridge also has an external IDSEL line that is
hooked up to a PCI address line. Some bridges can not handle having
themselves selected so that device needs to be skipped.
Any comments? Is there a better way? Am I getting carried away?
Thanks,
Mark
--
Mark A. Greer (mgreer@mvista.com; 480-517-0287)
MontaVista Software, Inc.
2141 E. Broadway Road, Suite 108
Tempe, AZ 85282
** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/
^ permalink raw reply [flat|nested] 8+ messages in thread* Re: Early PCI auto-configuration 2000-10-26 22:46 Early PCI auto-configuration Mark A. Greer @ 2000-10-26 23:26 ` Benjamin Herrenschmidt 2000-10-27 2:23 ` Matt Porter ` (2 more replies) 0 siblings, 3 replies; 8+ messages in thread From: Benjamin Herrenschmidt @ 2000-10-26 23:26 UTC (permalink / raw) To: mgreer, linuxppc-dev > >[The discussion below is based on the latest fsmlabs 5005 repository >code] You mean linuxppc_2_5, I guess ? >My problem: The firmware on a couple platform I need to support do >absolutely _no_ PCI device initialization. > >To make things work for these boards in the current setup, I need to use >one of the pcibios_fixup() or pcibios_fixup_bus() hooks to walk the >entire bus tree, setup the devices (including bridges), and sort out all >the stuff that's already been put in the the "resource" entries--or am I >missing something?? Well, if you set pci_assign_all_busses to 1 before pci_init() (do it during your setup_arch, when creating your hose), the kernel will at least setup bus numbers for you. You still have to handle allocation of device resources. The current code has no per-hose resources that would allow the common PPC PCI code to then assign resources to devices on the bus. So you need your own at fixup time. >I would prefer to run a "pci auto-configurator" that sets up all the >devices and bridges before pci_init() runs so I don't waste as much time >reading bad info and they trying to fix it all up later. The "fixup" >routines can still be used for minor tweaks and interrupt routing, etc. Well, the kernel can behave quite well with unconfigured devices as long as your implementation of pcibios_enable_device() configures it. Of course, you need to configure the interrupt controller and other such vital devices early. >I was thinking of doing it this ways... > >From the xxx_find_bridges() routine, call "pci_auto_scan_hose()" which >walks the entire bus hierarchy under each "hose" sorting out resources, >enumerating the buses, setting up bridges and their bounds, etc. >pci_init() will run some time later and pick up reasonable BAR values. There is no reason to do it at this point since the pci_scan_bus() can assign bus numbers and have no trouble with wrong resources. >To make this work, I will add 4 fields to the pci_controller [or "hose"] >structure that have the upper and lower bounds for PCI I/O and memory >space for each hose. This is what the auto-configurator will use to >constrain his resource allocations. That's what I call per-hose resource. That's I think the good way, but _please_, if you implement that, support multiple (disconiuous) resources per hose ;) On PowerMac, for example, we have a theorical limit of something like 28 decoded memory ranges :) In real life, I don't think we'll have more than 2 or 3 of them on a given bus however. Then, you could implement your autoconfigurator (triggered via a global that defaults to 0, something like pci_assign_all_devices) just after the pci_scan_bus() pass. But if I understand Geert code correctly, except for IDE devices & VGA cards, the pcibios_assign_resources() function will assign bases addresses to unassigned devices. This is done by the call to pcibios_assign_resources(), and works if your bus resources & ranges have been setup properly. You may still need some fixup around, I'm really curious about what is needed, and if the exception done for IDE & VGA cannot be changed to be special "rules" of the PPC common pci code that would be enabled by setup_arch(). You may also want to look at pci_assign_unassigned_resources() (in drivers/pci/setup-res.c) and friends. They do things a bit differently, but it might match more closely what you want. >Also, while I'm at it, add 2 more fields to pci_controller, one an array >of 32*8 int's that contian the devfn value of any devfn's that the >auto-configurator should skip. That's a good idea to handle the special cases discussed above, like skipping VGA & IDE on some machines. >The other is the number of valid entries >in the array. This is useful--to me anyway--because I want the >auto-configurator to skip the host bridge itself. Also, on some >platforms, the host bridge also has an external IDSEL line that is >hooked up to a PCI address line. Some bridges can not handle having >themselves selected so that device needs to be skipped. > Please, keep me in contact, I'm really interested in what you end up doing. Regards, Ben. ** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/ ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Early PCI auto-configuration 2000-10-26 23:26 ` Benjamin Herrenschmidt @ 2000-10-27 2:23 ` Matt Porter 2000-10-27 3:01 ` Frank Rowand 2000-10-27 17:24 ` Geert Uytterhoeven 2 siblings, 0 replies; 8+ messages in thread From: Matt Porter @ 2000-10-27 2:23 UTC (permalink / raw) To: Benjamin Herrenschmidt; +Cc: mgreer, linuxppc-dev On Fri, Oct 27, 2000 at 01:26:59AM +0200, Benjamin Herrenschmidt wrote: > >My problem: The firmware on a couple platform I need to support do > >absolutely _no_ PCI device initialization. <snip> > You may also want to look at pci_assign_unassigned_resources() (in > drivers/pci/setup-res.c) and friends. They do things a bit differently, > but it might match more closely what you want. This stuff is the key. After a good read of alpha's usage of the setup-res.c, setup-irq.c, and setup-bus.c code I'm really impressed with how they are using it to accomplish what Mark has been doing with an autoconfigurator that runs before the first busscan (in 2.2 that was the best solution). Tracing through arch/alpha/kernel/pci.c around the call to to pci_assign_unassigned_resources() is a good way to get a feel of how the generic resource handling code can be used to accomplish autoconfiguration in a post bus scan way. It's not as pretty as doing it right the first time but the code is already there and easy to hook in to...see following snippet: [loop to scan all pci controllers] pcibios_size_bridges(); pci_assign_unassigned_resources(); pci_fixup_irqs(alpha_mv.pci_swizzle, alpha_mv.pci_map_irq); pci_set_bus_ranges(); After doing some PCI bus swizzle routines for the embedded Motorola boards for 2.2 (prep_pci.c), it's nice to see a generic swizzle routine that can be passed an irq map to do the dirty work in the new resources framework. -- Matt Porter MontaVista Software, Inc. mporter@mvista.com ** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/ ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Early PCI auto-configuration 2000-10-26 23:26 ` Benjamin Herrenschmidt 2000-10-27 2:23 ` Matt Porter @ 2000-10-27 3:01 ` Frank Rowand 2000-10-27 17:24 ` Geert Uytterhoeven 2 siblings, 0 replies; 8+ messages in thread From: Frank Rowand @ 2000-10-27 3:01 UTC (permalink / raw) To: Benjamin Herrenschmidt; +Cc: mgreer, linuxppc-dev Benjamin Herrenschmidt wrote: > > > > >[The discussion below is based on the latest fsmlabs 5005 repository > >code] > > You mean linuxppc_2_5, I guess ? > > >My problem: The firmware on a couple platform I need to support do > >absolutely _no_ PCI device initialization. < stuff deleted > > You may also want to look at pci_assign_unassigned_resources() (in > drivers/pci/setup-res.c) and friends. They do things a bit differently, > but it might match more closely what you want. Note that pci_assign_unassigned_resources() gets called by the Alpha, MIPS, and ARM kernels for this purpose, if I understand correctly... -- Frank Rowand <frank_rowand@mvista.com> MontaVista Software, Inc ** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/ ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Early PCI auto-configuration 2000-10-26 23:26 ` Benjamin Herrenschmidt 2000-10-27 2:23 ` Matt Porter 2000-10-27 3:01 ` Frank Rowand @ 2000-10-27 17:24 ` Geert Uytterhoeven 2000-10-27 19:06 ` Mark A. Greer 2000-11-16 23:05 ` header file location Frank Rowand 2 siblings, 2 replies; 8+ messages in thread From: Geert Uytterhoeven @ 2000-10-27 17:24 UTC (permalink / raw) To: Benjamin Herrenschmidt; +Cc: mgreer, linuxppc-dev On Fri, 27 Oct 2000, Benjamin Herrenschmidt wrote: > >[The discussion below is based on the latest fsmlabs 5005 repository > >code] > > You mean linuxppc_2_5, I guess ? > > >My problem: The firmware on a couple platform I need to support do > >absolutely _no_ PCI device initialization. > But if I understand Geert code correctly, except for IDE devices & VGA I copied that code from ia32, with some minor modifications to make it work with the Open Firmware on my LongTrail. > cards, the pcibios_assign_resources() function will assign bases > addresses to unassigned devices. This is done by the call to > pcibios_assign_resources(), and works if your bus resources & ranges have > been setup properly. Yep. If you set up the bus resources correctly, that code will assign all unassigned resources automatically (and reassign conflicting resources) from the ranges specified by the bus resources. BTW, before I did this on PPC, I played with PCI resource assignment on a MIPS board, where the firmware didn't do any PCI assignments (except for Ethernet, to boot images using TFTP), which is exactly what you want. For reference, that code is in arch/mips/ddb5074/pci.c. Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds ** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/ ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Early PCI auto-configuration 2000-10-27 17:24 ` Geert Uytterhoeven @ 2000-10-27 19:06 ` Mark A. Greer 2000-11-16 23:05 ` header file location Frank Rowand 1 sibling, 0 replies; 8+ messages in thread From: Mark A. Greer @ 2000-10-27 19:06 UTC (permalink / raw) To: Geert Uytterhoeven; +Cc: Benjamin Herrenschmidt, linuxppc-dev Geert Uytterhoeven wrote: > <cut> > > > cards, the pcibios_assign_resources() function will assign bases > > addresses to unassigned devices. This is done by the call to > > pcibios_assign_resources(), and works if your bus resources & ranges have > > been setup properly. > > Yep. If you set up the bus resources correctly, that code will assign all > unassigned resources automatically (and reassign conflicting resources) from > the ranges specified by the bus resources. > > BTW, before I did this on PPC, I played with PCI resource assignment on a MIPS > board, where the firmware didn't do any PCI assignments (except for Ethernet, > to boot images using TFTP), which is exactly what you want. For reference, that > code is in arch/mips/ddb5074/pci.c. Geert, Ben, Matt, Thanks for the feedback. I've looked through much of the code you guys pointed out and it does look like it will do what I want. I'll hook it up and see how it goes. Mark ** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/ ^ permalink raw reply [flat|nested] 8+ messages in thread
* header file location 2000-10-27 17:24 ` Geert Uytterhoeven 2000-10-27 19:06 ` Mark A. Greer @ 2000-11-16 23:05 ` Frank Rowand 2000-11-17 6:52 ` Geert Uytterhoeven 1 sibling, 1 reply; 8+ messages in thread From: Frank Rowand @ 2000-11-16 23:05 UTC (permalink / raw) To: linuxppc-dev Is there any documentation of how to decide where to put header files. I especially am trying to understand the distinction between include/asm-ppc/ and arch/ppc/kernel/ Thanks, -Frank -- Frank Rowand <frank_rowand@mvista.com> MontaVista Software, Inc ** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/ ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: header file location 2000-11-16 23:05 ` header file location Frank Rowand @ 2000-11-17 6:52 ` Geert Uytterhoeven 0 siblings, 0 replies; 8+ messages in thread From: Geert Uytterhoeven @ 2000-11-17 6:52 UTC (permalink / raw) To: frowand; +Cc: linuxppc-dev On Thu, 16 Nov 2000, Frank Rowand wrote: > Is there any documentation of how to decide where to put header files. I especially > am trying to understand the distinction between include/asm-ppc/ and arch/ppc/kernel/ If the includes are used in arch/ppc/kernel/ only, put them there. If they are needed elsewehere as well (arch/ppc/mm/, drivers/..., userspace), put them in include/asm-ppc/. Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds ** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/ ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2000-11-17 6:52 UTC | newest] Thread overview: 8+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2000-10-26 22:46 Early PCI auto-configuration Mark A. Greer 2000-10-26 23:26 ` Benjamin Herrenschmidt 2000-10-27 2:23 ` Matt Porter 2000-10-27 3:01 ` Frank Rowand 2000-10-27 17:24 ` Geert Uytterhoeven 2000-10-27 19:06 ` Mark A. Greer 2000-11-16 23:05 ` header file location Frank Rowand 2000-11-17 6:52 ` Geert Uytterhoeven
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).