2 * (c) 2010 Alexander Warg <warg@os.inf.tu-dresden.de>
3 * economic rights: Technische Universität Dresden (Germany)
5 * This file is part of TUD:OS and distributed under the terms of the
6 * GNU General Public License 2.
7 * Please see the COPYING-GPL-2 file for details.
16 Generic_device::alloc_child_resource(Resource *r, Device *cld)
18 bool found_as = false;
19 for (Resource_list::iterator br = resources()->begin();
20 br != resources()->end(); ++br)
31 if (!br->compatible(r, true))
36 if (br->provided()->alloc(*br, this, r, cld, parent() && !parent()->resource_allocated(*br)))
39 printf("allocated resource: ");
46 if (!found_as && parent())
47 return parent()->alloc_child_resource(r, cld);
49 printf("ERROR: could not reserve physical space for resource\n");
57 Device::request_resource(Resource *r)
61 // Are we the root device?
68 if (p->resource_allocated(r))
69 return; // already allocated
74 if (!p->request_child_resource(r, this))
77 printf("WARNING: could not request resource in parent resource\n");
84 Device::request_resources()
86 Resource_list const *rl = resources();
88 // Are we the root device?
92 for (Resource_list::iterator r = rl->begin();
100 Device::request_child_resources()
102 for (iterator dev = begin(0); dev != end(); ++dev)
104 // First, try to map all our resources of out child (dev) into
105 // provided resources of ourselves
106 (*dev)->request_resources();
108 // Second, recurse down to our child (dev)
109 (*dev)->request_child_resources();
114 // sortet set of resource, device pairs
123 Res_dev(Resource *r, Device *d) : r(r), d(d) {}
126 static bool res_cmp(Res_dev const &l, Res_dev const &r)
127 { return l.r->alignment() > r.r->alignment(); }
129 typedef std::multiset<Res_dev, bool (*)(Res_dev const &l, Res_dev const &r)> UAD;
134 Device::allocate_pending_resources()
136 allocate_pending_child_resources();
137 Device *p = parent();
142 UAD to_allocate(res_cmp);
144 for (Resource_list::iterator r = resources()->begin();
145 r != resources()->end(); ++r)
156 if (p->resource_allocated(*r))
159 printf("unallocated resource: ");
162 to_allocate.insert(Res_dev(*r, this));
165 for (UAD::const_iterator i = to_allocate.begin(); i != to_allocate.end(); ++i)
166 p->alloc_child_resource((*i).r, this);
170 Device::allocate_pending_child_resources()
172 UAD to_allocate(res_cmp);
174 for (iterator dev = begin(0); dev != end(); ++dev)
176 dev->allocate_pending_child_resources();
178 for (Resource_list::iterator r = dev->resources()->begin();
179 r != dev->resources()->end(); ++r)
190 if (resource_allocated(*r))
193 printf("unallocated resource: ");
196 to_allocate.insert(Res_dev(*r, *dev));
200 for (UAD::const_iterator i = to_allocate.begin(); i != to_allocate.end(); ++i)
201 alloc_child_resource((*i).r, (*i).d);
206 Generic_device::setup_resources()
208 for (iterator i = begin(0); i != end(); ++i)
209 i->setup_resources();
213 Generic_device::request_child_resource(Resource *r, Device *cld)
215 bool found_as = false;
219 // scan through all our resources and try to find a
220 // provided resource that is consumed by resource 'r'
221 for (Resource_list::iterator br = resources()->begin();
222 br != resources()->end(); ++br)
233 if (!br->compatible(r, exact))
238 if (br->provided()->request(*br, this, r, cld))
244 else if (!found_as && parent())
246 // If there is no proper resource provided by
247 // ourselves that fits resource r, than try to
248 // go up the hierarchy to our parent node
250 printf("try parent resource request...\n");
253 return parent()->request_child_resource(r, cld);