2 * (c) 2010 Adam Lackorzynski <adam@os.inf.tu-dresden.de>,
3 * Alexander Warg <warg@os.inf.tu-dresden.de>
4 * economic rights: Technische Universität Dresden (Germany)
6 * This file is part of TUD:OS and distributed under the terms of the
7 * GNU General Public License 2.
8 * Please see the COPYING-GPL-2 file for details.
10 #include "hw_root_bus.h"
11 #include "phys_space.h"
17 // --- Root address space for IRQs -----------------------------------------
18 class Root_irq_rs : public Resource_space
21 bool request(Resource *parent, Device *, Resource *child, Device *)
23 child->parent(parent);
28 bool alloc(Resource *, Device *, Resource *, Device *, bool)
34 // --- Root address space for IO-Ports --------------------------------------
35 class Root_io_rs : public Resource_space
38 bool request(Resource *parent, Device *, Resource *child, Device *)
40 child->parent(parent);
45 bool alloc(Resource *parent, Device *, Resource *child, Device *, bool)
47 child->parent(parent);
56 // --- Root address space for MMIO -----------------------------------------
57 class Root_mmio_rs : public Resource_space
60 bool request(Resource *parent, Device *, Resource *child, Device *);
61 bool alloc(Resource *parent, Device *, Resource *child, Device *, bool);
66 Root_mmio_rs::request(Resource *parent, Device *, Resource *child, Device *)
68 //printf("request resource at root level: "); child->dump();
69 Adr_resource *x = dynamic_cast<Adr_resource*>(child);
72 && Phys_space::space.alloc(Phys_space::Phys_region(x->start(), x->end())))
74 child->parent(parent);
79 printf("WARNING: phys mmio resource allocation failed\n");
87 Root_mmio_rs::alloc(Resource *parent, Device *, Resource *child, Device *,
91 Adr_resource *cld = dynamic_cast<Adr_resource *>(child);
96 Adr_resource::Size align = cxx::max<Adr_resource::Size>(cld->alignment(), L4_PAGESIZE - 1);
97 Phys_space::Phys_region phys = Phys_space::space.alloc(cld->size(), align);
101 printf("ERROR: could not reserve physical space for resource\n");
108 cld->start(phys.start());
109 child->parent(parent);
111 if (Io_config::cfg->verbose())
113 printf("allocated resource: ");
119 // --- End Root address space for MMIO --------------------------------------
124 Root_bus::Root_bus(char const *name)
125 : Hw::Device(), _name(name)
127 // add root resource for IRQs
128 Root_resource *r = new Root_resource(Resource::Irq_res, new Root_irq_rs());
131 Resource_space *rs_mmio = new Root_mmio_rs();
132 // add root resource for non-prefetchable MMIO resources
133 r = new Root_resource(Resource::Mmio_res, rs_mmio);
134 r->add_flags(Adr_resource::F_width_64bit);
137 // add root resource for prefetchable MMIO resources
138 r = new Root_resource(Resource::Mmio_res | Resource::F_prefetchable, rs_mmio);
139 r->add_flags(Adr_resource::F_width_64bit);
142 // add root resource for IO ports
143 r = new Root_resource(Resource::Io_res, new Root_io_rs());