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"
21 // --- Root address space for IRQs -----------------------------------------
22 class Root_irq_rs : public Resource_space
25 bool request(Resource *parent, Device *, Resource *child, Device *)
27 child->parent(parent);
32 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);
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);
65 Root_mmio_rs::request(Resource *parent, Device *, Resource *child, Device *)
67 //printf("request resource at root level: "); child->dump();
68 if (Phys_space::space.alloc(Phys_space::Phys_region(child->start(), child->end())))
70 child->parent(parent);
74 d_printf(DBG_WARN, "WARNING: phys mmio resource allocation failed\n");
83 Root_mmio_rs::alloc(Resource *parent, Device *, Resource *child, Device *,
86 Resource::Size align = cxx::max<Resource::Size>(child->alignment(), L4_PAGESIZE - 1);
87 Phys_space::Phys_region phys = Phys_space::space.alloc(child->size(), align);
91 printf("ERROR: could not reserve physical space for resource\n");
98 child->start(phys.start());
99 child->parent(parent);
101 if (dlevel(DBG_DEBUG))
103 printf("allocated resource: ");
109 // --- End Root address space for MMIO --------------------------------------
114 Root_bus::Root_bus(char const *name)
115 : Hw::Device(), _pm(0)
119 // add root resource for IRQs
120 Root_resource *r = new Root_resource(Resource::Irq_res, new Root_irq_rs());
123 Resource_space *rs_mmio = new Root_mmio_rs();
124 // add root resource for non-prefetchable MMIO resources
125 r = new Root_resource(Resource::Mmio_res, rs_mmio);
126 r->add_flags(Resource::F_width_64bit);
129 // add root resource for prefetchable MMIO resources
130 r = new Root_resource(Resource::Mmio_res | Resource::F_prefetchable, rs_mmio);
131 r->add_flags(Resource::F_width_64bit);
134 // add root resource for IO ports
135 r = new Root_resource(Resource::Io_res, new Root_io_rs());
140 * \pre supports_pm() must be true
146 if ((res = ::Pm::pm_suspend_all()) < 0)
148 d_printf(DBG_ERR, "error: pm_suspend_all_failed: %d\n", res);
149 ::Pm::pm_resume_all();
155 if ((res = ::Pm::pm_resume_all()) < 0)
156 d_printf(DBG_ERR, "error: pm_resume_all failed: %d\n", res);