1
2 #include "of1275.h"
3 #include "endian.h"
4 static int (*of1275_server) (void *) = (int (*)(void *)) -1;
5
_start(void * residual_data_structure,void * program_entry_point,int (* client_interface_handler)(void *),void * args,int argslen)6 _start(void *residual_data_structure,
7 void *program_entry_point,
8 int (*client_interface_handler) (void *), void *args, int argslen)
9 {
10 int status;
11 of1275_server = client_interface_handler;
12 status = main();
13 of1275_exit(status);
14 }
15
16 /* 6.3.2.1 Client interface */
17
18
of1275_test(const char * name,int * missing)19 int of1275_test(const char *name, int *missing)
20 {
21 int result;
22 static of1275_test_service s;
23 s.service = "test";
24 s.n_args = 1;
25 s.n_returns = 1;
26 s.name = name;
27 result = of1275_server(&s);
28 *missing = s.missing;
29 return result;
30 }
31
32
33 /* 6.3.2.2 Device tree */
34
35
of1275_peer(int phandle,int * sibling_phandle)36 int of1275_peer(int phandle, int *sibling_phandle)
37 {
38 int result;
39 static of1275_peer_service s;
40 s.service = "peer";
41 s.n_args = 1;
42 s.n_returns = 1;
43 s.phandle = phandle;
44 result = of1275_server(&s);
45 *sibling_phandle = s.sibling_phandle;
46 return result;
47 }
48
of1275_child(int phandle,int * child_phandle)49 int of1275_child(int phandle, int *child_phandle)
50 {
51 int result;
52 static of1275_child_service s;
53 s.service = "child";
54 s.n_args = 1;
55 s.n_returns = 1;
56 s.phandle = phandle;
57 result = of1275_server(&s);
58 *child_phandle = s.child_phandle;
59 return result;
60 }
61
of1275_parent(int phandle,int * parent_phandle)62 int of1275_parent(int phandle, int *parent_phandle)
63 {
64 int result;
65 static of1275_parent_service s;
66 s.service = "parent";
67 s.n_args = 1;
68 s.n_returns = 1;
69 s.phandle = phandle;
70 result = of1275_server(&s);
71 *parent_phandle = s.parent_phandle;
72 return result;
73 }
74
of1275_instance_to_package(int ihandle,int * phandle)75 int of1275_instance_to_package(int ihandle, int *phandle)
76 {
77 int result;
78 static of1275_instance_to_package_service s;
79 s.service = "instance-to-package";
80 s.n_args = 1;
81 s.n_returns = 1;
82 s.ihandle = ihandle;
83 result = of1275_server(&s);
84 *phandle = s.phandle;
85 return result;
86 }
87
of1275_getproplen(int phandle,const char * name,int * proplen)88 int of1275_getproplen(int phandle, const char *name, int *proplen)
89 {
90 int result;
91 static of1275_getproplen_service s;
92 s.service = "getproplen";
93 s.n_args = 2;
94 s.n_returns = 1;
95 s.phandle = phandle;
96 s.name = name;
97 result = of1275_server(&s);
98 *proplen = s.proplen;
99 return result;
100 }
101
102 int
of1275_getprop(int phandle,const char * name,void * buf,int buflen,int * size)103 of1275_getprop(int phandle, const char *name, void *buf, int buflen,
104 int *size)
105 {
106 int result;
107 static of1275_getprop_service s;
108 s.service = "getprop";
109 s.n_args = 4;
110 s.n_returns = 1;
111 s.phandle = phandle;
112 s.name = name;
113 s.buf = buf;
114 s.buflen = buflen;
115 result = of1275_server(&s);
116 *size = s.size;
117 return result;
118 }
119
120 int
of1275_nextprop(int phandle,const char * previous,void * buf,int * flag)121 of1275_nextprop(int phandle, const char *previous, void *buf, int *flag)
122 {
123 int result;
124 static of1275_nextprop_service s;
125 s.service = "nextprop";
126 s.n_args = 3;
127 s.n_returns = 1;
128 s.phandle = phandle;
129 s.previous = previous;
130 s.buf = buf;
131 result = of1275_server(&s);
132 *flag = s.flag;
133 return result;
134 }
135
136 int
of1275_setprop(int phandle,const char * name,void * buf,int len,int * size)137 of1275_setprop(int phandle, const char *name, void *buf, int len,
138 int *size)
139 {
140 int result;
141 static of1275_setprop_service s;
142 s.service = "setprop";
143 s.n_args = 4;
144 s.n_returns = 1;
145 s.phandle = phandle;
146 s.name = name;
147 s.buf = buf;
148 s.len = len;
149 result = of1275_server(&s);
150 *size = s.size;
151 return result;
152 }
153
154 int
of1275_canon(const char * device_specifier,void * buf,int buflen,int * length)155 of1275_canon(const char *device_specifier, void *buf, int buflen,
156 int *length)
157 {
158 int result;
159 static of1275_canon_service s;
160 s.service = "canon";
161 s.n_args = 3;
162 s.n_returns = 1;
163 s.device_specifier = device_specifier;
164 s.buf = buf;
165 s.buflen = buflen;
166 result = of1275_server(&s);
167 *length = s.length;
168 return result;
169 }
170
of1275_finddevice(const char * device_specifier,int * phandle)171 int of1275_finddevice(const char *device_specifier, int *phandle)
172 {
173 int result;
174 static of1275_finddevice_service s;
175 s.service = "finddevice";
176 s.n_args = 1;
177 s.n_returns = 1;
178 s.device_specifier = device_specifier;
179 result = of1275_server(&s);
180 *phandle = s.phandle;
181 return result;
182 }
183
184 int
of1275_instance_to_path(int ihandle,void * buf,int buflen,int * length)185 of1275_instance_to_path(int ihandle, void *buf, int buflen, int *length)
186 {
187 int result;
188 static of1275_instance_to_path_service s;
189 s.service = "instance-to-path";
190 s.n_args = 3;
191 s.n_returns = 1;
192 s.ihandle = ihandle;
193 s.buf = buf;
194 s.buflen = buflen;
195 result = of1275_server(&s);
196 *length = s.length;
197 return result;
198 }
199
of1275_package_to_path(int phandle,void * buf,int buflen,int * length)200 int of1275_package_to_path(int phandle, void *buf, int buflen, int *length)
201 {
202 int result;
203 static of1275_package_to_path_service s;
204 s.service = "package-to-path";
205 s.n_args = 3;
206 s.n_returns = 1;
207 s.phandle = phandle;
208 s.buf = buf;
209 s.buflen = buflen;
210 result = of1275_server(&s);
211 *length = s.length;
212 return result;
213 }
214
215 /* int of1275_call_method(const char *method, int ihandle, ...); */
216
217
218 /* 6.3.2.3 Device I/O */
219
220
of1275_open(const char * device_specifier,int * ihandle)221 int of1275_open(const char *device_specifier, int *ihandle)
222 {
223 int result;
224 static of1275_open_service s;
225 s.service = "open";
226 s.n_args = 1;
227 s.n_returns = 1;
228 s.device_specifier = device_specifier;
229 result = of1275_server(&s);
230 *ihandle = s.ihandle;
231 return result;
232 }
233
of1275_close(int ihandle)234 int of1275_close(int ihandle)
235 {
236 int result;
237 static of1275_close_service s;
238 s.service = "close";
239 s.n_args = 1;
240 s.n_returns = 0;
241 s.ihandle = ihandle;
242 result = of1275_server(&s);
243 return result;
244 }
245
of1275_read(int ihandle,void * addr,int len,int * actual)246 int of1275_read(int ihandle, void *addr, int len, int *actual)
247 {
248 int result;
249 static of1275_read_service s;
250 s.service = "read";
251 s.n_args = 3;
252 s.n_returns = 1;
253 s.ihandle = ihandle;
254 s.addr = addr;
255 s.len = len;
256 result = of1275_server(&s);
257 *actual = s.actual;
258 return result;
259 }
260
of1275_write(int ihandle,void * addr,int len,int * actual)261 int of1275_write(int ihandle, void *addr, int len, int *actual)
262 {
263 int result;
264 static of1275_write_service s;
265 s.service = "write";
266 s.n_args = 3;
267 s.n_returns = 1;
268 s.ihandle = ihandle;
269 s.addr = addr;
270 s.len = len;
271 result = of1275_server(&s);
272 *actual = s.actual;
273 return result;
274 }
275
of1275_seek(int ihandle,int pos_hi,int pos_lo,int * status)276 int of1275_seek(int ihandle, int pos_hi, int pos_lo, int *status)
277 {
278 int result;
279 static of1275_seek_service s;
280 s.service = "seek";
281 s.n_args = 3;
282 s.n_returns = 1;
283 s.ihandle = ihandle;
284 s.pos_hi = pos_hi;
285 s.pos_lo = pos_lo;
286 result = of1275_server(&s);
287 *status = s.status;
288 return result;
289 }
290
291
292 /* 6.3.2.4 Memory */
293
294
of1275_claim(void * virt,int size,int align,void ** baseaddr)295 int of1275_claim(void *virt, int size, int align, void **baseaddr)
296 {
297 int result;
298 static of1275_claim_service s;
299 s.service = "claim";
300 s.n_args = 3;
301 s.n_returns = 1;
302 s.virt = virt;
303 s.size = size;
304 s.align = align;
305 result = of1275_server(&s);
306 *baseaddr = s.baseaddr;
307 return result;
308 }
309
of1275_release(void * virt,int size)310 int of1275_release(void *virt, int size)
311 {
312 int result;
313 static of1275_release_service s;
314 s.service = "release";
315 s.n_args = 2;
316 s.n_returns = 0;
317 s.virt = virt;
318 s.size = size;
319 result = of1275_server(&s);
320 return result;
321 }
322
323
324 /* 6.3.2.5 Control transfer */
325
326
of1275_boot(const char * bootspec)327 int of1275_boot(const char *bootspec)
328 {
329 int result;
330 static of1275_boot_service s;
331 s.service = "boot";
332 s.n_args = 1;
333 s.n_returns = 0;
334 s.bootspec = bootspec;
335 result = of1275_server(&s);
336 return result;
337 }
338
of1275_enter(void)339 int of1275_enter(void)
340 {
341 int result;
342 static of1275_enter_service s;
343 s.service = "enter";
344 s.n_args = 0;
345 s.n_returns = 0;
346 result = of1275_server(&s);
347 return result;
348 }
349
of1275_exit(int status)350 int of1275_exit(int status)
351 {
352 int result;
353 static of1275_exit_service s;
354 s.service = "exit";
355 s.n_args = 1;
356 s.n_returns = 0;
357 s.status = status;
358 result = of1275_server(&s);
359 return result;
360 }
361
362 /* int of1275_chain(void *virt, int size, void *entry, void *args, int len); */
363
364
365 /* 6.3.2.6 User interface */
366
367
368 /* int of1275_interpret(const char *arg, ...); */
369
of1275_set_callback(void * newfunc,void ** oldfunc)370 int of1275_set_callback(void *newfunc, void **oldfunc)
371 {
372 int result;
373 static of1275_set_callback_service s;
374 s.service = "set-callback";
375 s.n_args = 1;
376 s.n_returns = 1;
377 s.newfunc = newfunc;
378 result = of1275_server(&s);
379 *oldfunc = s.oldfunc;
380 return result;
381 }
382
of1275_set_symbol_lookup(void * sym_to_value,void * value_to_sym)383 int of1275_set_symbol_lookup(void *sym_to_value, void *value_to_sym)
384 {
385 int result;
386 static of1275_set_symbol_lookup_service s;
387 s.service = "set-symbol-lookup";
388 s.n_args = 2;
389 s.n_returns = 0;
390 s.sym_to_value = sym_to_value;
391 s.value_to_sym = s.value_to_sym;
392 result = of1275_server(&s);
393 return result;
394 }
395
396
397 /* 6.3.2.7 Time */
398
of1275_milliseconds(int * ms)399 int of1275_milliseconds(int *ms)
400 {
401 int result;
402 static of1275_milliseconds_service s;
403 s.service = "milliseconds";
404 s.n_args = 0;
405 s.n_returns = 1;
406 result = of1275_server(&s);
407 *ms = s.ms;
408 return result;
409 }
410
411
of_find_integer_property(const char * device,const char * property)412 int of_find_integer_property(const char *device, const char *property)
413 {
414 int phandle;
415 int integer;
416 int size;
417 /* find the device's phandle */
418 if (of1275_finddevice(device, &phandle) < 0) {
419 //printk("of1275: no such device '%s'\n", device);
420 exit(1);
421 }
422 /* find the device's property */
423 of1275_getprop(phandle, property, &integer,
424 sizeof(integer), &size);
425 if (size < sizeof(integer)) {
426 //printk("of1275: unknown integer property '%s'\n", property);
427 exit(1);
428 }
429 return ntohl(integer);
430 }
431
432 void
of_find_string_property(const char * device,const char * property,char * string,int sizeof_string)433 of_find_string_property(const char *device,
434 const char *property,
435 char *string, int sizeof_string)
436 {
437 int phandle;
438 int size;
439 /* find the device's phandle */
440 if (of1275_finddevice(device, &phandle) < 0) {
441 //printk("of1275: no such device '%s'\n", device);
442 exit(1);
443 }
444
445 /* find the device's property */
446 of1275_getprop(phandle, property, string, sizeof_string, &size);
447 if (size == 0 || size >= sizeof_string) {
448 //printk("of1275: unknown string property '%s'\n", property);
449 exit(1);
450 }
451 }
452