Date: Tue, 23 Feb 2010 12:46:40 +0530 From: Rajat Jain <rajatjain@juniper.net> To: <freebsd-new-bus@freebsd.org>, <freebsd-arch@freebsd.org> Cc: freebsd-ia32@freebsd.org, freebsd-ppc@freebsd.org Subject: Strategy for PCI resource management (for supporting hot-plug) Message-ID: <8506939B503B404A84BBB12293FC45F606B88C39@emailbng3.jnpr.net>
next in thread | raw e-mail | index | archive | help
Hi, I'm trying to add PCI-E hotplug support to the FreeBSD. As a first step for the PCI-E hotplug support, I'm trying to decide on a resource management / allocation strategy for the PCI memory / IO and the bus numbers. Can you please comment on the following approach that I am considering for resource allocation: PROBLEM STATEMENT: ------------------ Given a memory range [A->B], IO range [C->D], and limited (256) bus numbers, enumerate the PCI tree of a system, leaving enough "holes" in between to allow addition of future devices. PROPOSED STRATEGY: ------------------ 1) When booting, start enumerating in a depth-first-search order. While enumeration, always keep track of: * The next bus number (x) that can be allocated * The next Memory space pointer (A + y) starting which allocation can be=20 done. ("y" is the memory already allocated). * The next IO Space pointer (C + z) starting which allocation can be done. ("z" is the IO space already allocated). Keep incrementing the above as the resources are allocated. 2) Allocate bus numbers sequentially while traversing down from root to a leaf node (end point). When going down traversing a bridge: * Allocate the next available bus number (x) to the secondary bus of=20 bridge. * Temporarily mark the subordinate bridge as 0xFF (to allow discovery of=20 maximum buses). * Temporarily assign all the remaining available memory space to bridge [(A+x) -> B]. Ditto for IO space. 3) When a leaf node (End point) is reached, allocate the memory / IO resource requested by the device, and increment the pointers.=20 4) While passing a bridge in the upward direction, tweak the bridge registers such that its resources are ONLY ENOUGH to address the needs of all the PCI tree below it, and if it has its own internal memory mapped registers, some memory for it as well. The above is the standard depth-first algorithm for resource allocation. Here is the addition to support hot-plug: At each bridge that supports hot-plug, in addition to the resources that would have normally been allocated to this bridge, additionally pre-allocate and assign to bridge (in anticipation of any new devices that may be added later): a) "RSRVE_NUM_BUS" number of busses, to cater to any bridges, PCI trees=20 present on the device plugged. b) "RSRVE_MEM" amount of memory space, to cater to all the PCI devices that=20 may be attached later on. c) "RESRVE_IO" amount of IO space, to cater to all PCI devices that may be=20 attached later on. Please note that the above RSRVE* are constants defining the amount of resources to be set aside for /below each HOT-PLUGGABLE bridge; their values may be tweaked via a compile time option or via a sysctl.=20 FEW COMMENTS ------------ =20 1) The strategy is fairly generic and tweak-able since it does not waste a lot of resources (The developer neds to pick up a smart bvalue for howmuch resources to reserve at each hot-pluggable slot): * The reservations shall be done only for hot-pluggable bridges * The developer can tweak the values (even disable it) for how much=20 Resources shall be allocated for each hot-pluggable bridge. =20 2) One point of debate is what happens if there are too much resource demands in the system (too many devices or the developer configures too many resources to be allocated for each hot-pluggable devices). For e.g. consider that while enumeration we find that all the resources are already allocated, while there are more devices that need resources. So do we simply do not enumerate them? Etc... Overall, how does the above look? Thanks & Best Regards, Rajat Jain
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?8506939B503B404A84BBB12293FC45F606B88C39>