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.
13 #include "hw_root_bus.h"
14 #include "phys_space.h"
19 // --- Root address space for IRQs -----------------------------------------
20 class Root_irq_rs : public Resource_space
23 bool request(Resource *parent, Device *, Resource *child, Device *)
25 child->parent(parent);
30 bool alloc(Resource *, Device *, Resource *, Device *, bool)
36 // --- Root address space for IO-Ports --------------------------------------
37 class Root_io_rs : public Resource_space
40 bool request(Resource *parent, Device *, Resource *child, Device *)
42 child->parent(parent);
47 bool alloc(Resource *parent, Device *, Resource *child, Device *, bool)
49 child->parent(parent);
58 // --- Root address space for MMIO -----------------------------------------
59 class Root_mmio_rs : public Resource_space
62 bool request(Resource *parent, Device *, Resource *child, Device *);
63 bool alloc(Resource *parent, Device *, Resource *child, Device *, bool);
68 Root_mmio_rs::request(Resource *parent, Device *, Resource *child, Device *)
70 //printf("request resource at root level: "); child->dump();
71 Adr_resource *x = dynamic_cast<Adr_resource*>(child);
74 && Phys_space::space.alloc(Phys_space::Phys_region(x->start(), x->end())))
76 child->parent(parent);
80 d_printf(DBG_WARN, "WARNING: phys mmio resource allocation failed\n");
89 Root_mmio_rs::alloc(Resource *parent, Device *, Resource *child, Device *,
93 Adr_resource *cld = dynamic_cast<Adr_resource *>(child);
98 Adr_resource::Size align = cxx::max<Adr_resource::Size>(cld->alignment(), L4_PAGESIZE - 1);
99 Phys_space::Phys_region phys = Phys_space::space.alloc(cld->size(), align);
103 printf("ERROR: could not reserve physical space for resource\n");
110 cld->start(phys.start());
111 child->parent(parent);
113 if (dlevel(DBG_DEBUG))
115 printf("allocated resource: ");
121 // --- End Root address space for MMIO --------------------------------------
126 Root_bus::Root_bus(char const *name)
127 : Hw::Device(), _name(name)
129 // add root resource for IRQs
130 Root_resource *r = new Root_resource(Resource::Irq_res, new Root_irq_rs());
133 Resource_space *rs_mmio = new Root_mmio_rs();
134 // add root resource for non-prefetchable MMIO resources
135 r = new Root_resource(Resource::Mmio_res, rs_mmio);
136 r->add_flags(Adr_resource::F_width_64bit);
139 // add root resource for prefetchable MMIO resources
140 r = new Root_resource(Resource::Mmio_res | Resource::F_prefetchable, rs_mmio);
141 r->add_flags(Adr_resource::F_width_64bit);
144 // add root resource for IO ports
145 r = new Root_resource(Resource::Io_res, new Root_io_rs());