]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/lib/uart/ppc32/of1275.h
update
[l4.git] / kernel / fiasco / src / lib / uart / ppc32 / of1275.h
1 #ifndef L4_CXX_OF1275_H__
2 #define L4_CXX_OF1275_H__
3
4 #include <stdarg.h>
5 #include <string.h>
6
7 namespace L4 {
8
9         class Of
10         {
11
12         private:
13                 /* declarations */
14                 struct prom_args 
15                 {
16                         const char *service;
17                         int nargs;
18                         int nret;
19                         void *args[10];
20                         prom_args(const char *s, int na, int nr) : service(s), nargs(na), nret(nr) {}
21                 };
22                 
23                 typedef int (*prom_entry)(struct prom_args *);
24                 
25                 /* attributes */
26                 prom_entry _prom;
27                 
28                 //int prom_call(const char *service, int nargs, int nret, ...) const;
29         protected:
30                 enum {
31                         PROM_ERROR = -1u
32                 };
33                 
34                 
35                 typedef void *ihandle_t; 
36                 typedef void *phandle_t;
37                 
38                 typedef struct 
39                 {
40                         unsigned long len;
41                         char          data[];
42                 } of_item_t;
43
44                 /* methods */
45                 unsigned prom_call(const char *service, int nargs, int nret, ...) const
46                 {
47                         struct prom_args args = prom_args(service, nargs, nret);
48                         va_list list;
49
50                         va_start(list, nret);
51                         for(int i = 0; i < nargs; i++)
52                                 args.args[i] = va_arg(list, void*);
53                         va_end(list);
54
55                         for(int i = 0; i < nret; i++)
56                                 args.args[nargs + i] = 0;
57
58                         if(_prom(&args) < 0)
59                                 return PROM_ERROR;
60
61                         return (nret > 0) ? (int)args.args[nargs] : 0;
62                 }
63
64
65                 inline int prom_getprop(phandle_t node, const char *pname,  void *value, 
66                                 size_t size)
67                 {
68                         return prom_call("getprop", 4, 1, node, pname, (unsigned long)value,
69                                         (unsigned long)size);
70                 }
71
72                 inline int prom_next_node(phandle_t *nodep)
73                 {
74                         phandle_t node;
75
76                         if ((node = *nodep) != 0
77                             && (*nodep = (phandle_t)prom_call("child", 1, 1, node)) != 0)
78                                 return 1;
79                         if ((*nodep = (phandle_t)prom_call("peer", 1, 1, node)) != 0)
80                                 return 1;
81                         for (;;) {
82                                 if ((node = (phandle_t)prom_call("parent", 1, 1, node)) == 0)
83                                         return 0;
84                                 if ((*nodep = (phandle_t)prom_call("peer", 1, 1, node)) != 0)
85                                         return 1;
86                         }
87                 }
88                 
89                 template<typename T>
90                 static inline bool handle_valid(T p)
91                 {
92                         return ((unsigned)p != 0 && (unsigned)p != PROM_ERROR);
93                 }
94         
95         public:
96                 Of() : _prom(0) {}
97                 Of(unsigned long prom) : _prom(reinterpret_cast<prom_entry>(prom)) {}
98                 
99                 template<typename T>
100                 inline void set_prom(T prom) 
101                 {
102                         _prom = reinterpret_cast<prom_entry>(prom);
103                 }
104         };
105 };
106
107 #endif
108
109