]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/libvbus/lib/src/vbus.cc
update
[l4.git] / l4 / pkg / libvbus / lib / src / vbus.cc
1 /*
2  * (c) 2009 Adam Lackorzynski <adam@os.inf.tu-dresden.de>,
3  *          Alexander Warg <warg@os.inf.tu-dresden.de>,
4  *          Torsten Frenzel <frenzel@os.inf.tu-dresden.de>
5  *     economic rights: Technische Universität Dresden (Germany)
6  *
7  * This file is part of TUD:OS and distributed under the terms of the
8  * GNU General Public License 2.
9  * Please see the COPYING-GPL-2 file for details.
10  */
11 #include <l4/vbus/vbus.h>
12 #include <l4/cxx/ipc_stream>
13 #include <l4/util/splitlog2.h>
14
15 #include <l4/vbus/vdevice-ops.h>
16
17 int
18 l4vbus_get_device_by_hid(l4_cap_idx_t vbus, l4vbus_device_handle_t parent,
19                          l4vbus_device_handle_t *child, char const *hid,
20                          int depth, l4vbus_device_t *devinfo)
21 {
22   L4::Ipc::Iostream s(l4_utcb());
23   s << parent << l4_uint32_t(L4vbus_vdevice_get_by_hid) << *child << depth
24     << hid;
25   int err = l4_error(s.call(vbus));
26   if (err < 0)
27     return err;
28
29   if (child)
30     s >> *child;
31   else
32     s.skip<l4vbus_device_handle_t>(1);
33   if (devinfo)
34     s.get(*devinfo);
35   else
36     s.skip<l4vbus_device_t>(1);
37   return err;
38 }
39
40 int
41 l4vbus_get_next_device(l4_cap_idx_t vbus, l4vbus_device_handle_t parent,
42                        l4vbus_device_handle_t *child, int depth,
43                        l4vbus_device_t *devinfo)
44 {
45   L4::Ipc::Iostream s(l4_utcb());
46   s << parent << l4_uint32_t(L4vbus_vdevice_get_next) << *child << depth;
47   int err = l4_error(s.call(vbus));
48   if (err < 0)
49     return err;
50
51   s >> *child;
52
53   if (devinfo)
54     s.get(*devinfo);
55
56   return err;
57 }
58
59 int
60 l4vbus_get_resource(l4_cap_idx_t vbus, l4vbus_device_handle_t dev,
61                     int res_idx, l4vbus_resource_t *res)
62 {
63   L4::Ipc::Iostream s(l4_utcb());
64   s << dev << l4_uint32_t(L4vbus_vdevice_get_resource) << res_idx;
65   int err = l4_error(s.call(vbus));
66   if (err < 0)
67     return err;
68
69   s.get(*res);
70   return err;
71 }
72
73 static
74 int
75 __vbus_request_port(l4_cap_idx_t vbus, l4vbus_resource_t const &res)
76 {
77   l4vbus_resource_t r;
78   r.type = res.type;
79   r.start = res.start;
80   while (r.start <= res.end)
81     {
82       l4_uint16_t log2_size = l4util_splitlog2_size(r.start, res.end);
83       r.end = r.start + (1UL << log2_size) -1;
84
85       L4::Ipc::Iostream s(l4_utcb());
86       s << l4vbus_device_handle_t(0)
87         << L4::Opcode(L4vbus_vbus_request_resource);
88       s.put(r);
89       s << L4::Ipc::Rcv_fpage::io(r.start, log2_size, 0);
90
91       long err= l4_error(s.call(vbus));
92       if (err < 0)
93         return err;
94       r.start += (1 << log2_size);
95     }
96
97   return 0;
98 }
99
100 int
101 l4vbus_request_resource(l4_cap_idx_t vbus, l4vbus_resource_t *res,
102                         int /*flags*/)
103 {
104   if (res->type == L4VBUS_RESOURCE_PORT)
105     return __vbus_request_port(vbus, *res);
106   return -L4_EINVAL;
107 }
108
109 int
110 l4vbus_release_resource(l4_cap_idx_t vbus, l4vbus_resource_t *res)
111 {
112   L4::Ipc::Iostream s(l4_utcb());
113   s << l4vbus_device_handle_t(0)
114     << l4_uint32_t(L4vbus_vbus_release_resource) << res->type << res->start
115     << res->end;
116   int err = l4_error(s.call(vbus));
117
118   return err;
119 }
120
121 int
122 l4vbus_vicu_get_cap(l4_cap_idx_t vbus, l4vbus_device_handle_t icu,
123                     l4_cap_idx_t res)
124 {
125   L4::Ipc::Iostream s(l4_utcb());
126   s << icu << l4_uint32_t(L4vbus_vicu_get_cap);
127   s << L4::Ipc::Small_buf(res);
128   int err = l4_error(s.call(vbus));
129
130   return err;
131
132 }