2 * (c) 2010 Technische Universität Dresden
3 * This file is part of TUD:OS and distributed under the terms of the
4 * GNU General Public License 2.
5 * Please see the COPYING-GPL-2 file for details.
14 Generic_device::alloc_child_resource(Resource *r, Device *cld)
16 bool found_as = false;
17 for (Resource_list::iterator br = resources()->begin();
18 br != resources()->end(); ++br)
26 if (!br->compatible(r, true))
31 if (br->provided()->alloc(*br, this, r, cld, parent() && !parent()->resource_allocated(*br)))
34 printf("allocated resource: ");
41 if (!found_as && parent())
42 return parent()->alloc_child_resource(r, cld);
44 printf("ERROR: could not reserve physical space for resource\n");
52 Device::request_resource(Resource *r)
56 // Are we the root device?
63 if (p->resource_allocated(r))
64 return; // already allocated
69 if (!p->request_child_resource(r, this))
72 printf("WARNING: could not request resource in parent resource\n");
79 Device::request_resources()
81 Resource_list const *rl = resources();
83 // Are we the root device?
87 for (Resource_list::iterator r = rl->begin();
94 Device::request_child_resources()
96 for (iterator dev = begin(0); dev != end(); ++dev)
98 // First, try to map all our resources of out child (dev) into
99 // provided resources of ourselves
100 (*dev)->request_resources();
102 // Second, recurse down to our child (dev)
103 (*dev)->request_child_resources();
108 // sortet set of resource, device pairs
117 Res_dev(Resource *r, Device *d) : r(r), d(d) {}
120 static bool res_cmp(Res_dev const &l, Res_dev const &r)
121 { return l.r->alignment() > r.r->alignment(); }
123 typedef std::multiset<Res_dev, bool (*)(Res_dev const &l, Res_dev const &r)> UAD;
128 Device::allocate_pending_resources()
130 allocate_pending_child_resources();
131 Device *p = parent();
136 UAD to_allocate(res_cmp);
138 for (Resource_list::iterator r = resources()->begin();
139 r != resources()->end(); ++r)
147 if (p->resource_allocated(*r))
150 printf("unallocated resource: ");
153 to_allocate.insert(Res_dev(*r, this));
156 for (UAD::const_iterator i = to_allocate.begin(); i != to_allocate.end(); ++i)
157 p->alloc_child_resource((*i).r, this);
161 Device::allocate_pending_child_resources()
163 UAD to_allocate(res_cmp);
165 for (iterator dev = begin(0); dev != end(); ++dev)
167 dev->allocate_pending_child_resources();
169 for (Resource_list::iterator r = dev->resources()->begin();
170 r != dev->resources()->end(); ++r)
178 if (resource_allocated(*r))
181 printf("unallocated resource: ");
184 to_allocate.insert(Res_dev(*r, *dev));
188 for (UAD::const_iterator i = to_allocate.begin(); i != to_allocate.end(); ++i)
189 alloc_child_resource((*i).r, (*i).d);
194 Generic_device::setup_resources()
196 for (iterator i = begin(0); i != end(); ++i)
197 i->setup_resources();
201 Generic_device::request_child_resource(Resource *r, Device *cld)
203 bool found_as = false;
207 // scan through all our resources and try to find a
208 // provided resource that is consumed by resource 'r'
209 for (Resource_list::iterator br = resources()->begin();
210 br != resources()->end(); ++br)
218 if (!br->compatible(r, exact))
223 if (br->provided()->request(*br, this, r, cld))
229 else if (!found_as && parent())
231 // If there is no proper resource provided by
232 // ourselves that fits resource r, than try to
233 // go up the hierarchy to our parent node
235 printf("try parent resource request...\n");
238 return parent()->request_child_resource(r, cld);