1/*
2 * Copyright 2003, Axel D��rfler, axeld@pinc-software.de. All rights reserved.
3 * Copyright 2019, Adrien Destugues, pulkomandy@pulkomandy.tk
4 * Distributed under the terms of the MIT License.
5 */
6#ifndef OPEN_FIRMWARE_H
7#define OPEN_FIRMWARE_H
8
9
10#include <SupportDefs.h>
11
12
13#define OF_FAILED	(-1)
14
15
16/* global device tree/properties access */
17extern intptr_t gChosen;
18
19
20template<typename AddressType, typename SizeType>
21struct of_region {
22	AddressType base;
23	SizeType size;
24} _PACKED;
25
26struct of_arguments {
27	const char	*name;
28	intptr_t	num_args;
29	intptr_t	num_returns;
30	intptr_t	data[0];
31
32#ifdef __cplusplus
33	intptr_t &Argument(int index) { return data[index]; }
34	intptr_t &ReturnValue(int index) { return data[num_args + index]; }
35#endif
36};
37
38
39#ifdef __cplusplus
40extern "C" {
41#endif
42
43extern status_t of_init(intptr_t (*openFirmwareEntry)(void *));
44
45/* device tree functions */
46extern intptr_t of_finddevice(const char *device);
47extern intptr_t of_child(intptr_t node);
48extern intptr_t of_peer(intptr_t node);
49extern intptr_t of_parent(intptr_t node);
50extern intptr_t of_instance_to_path(uint32_t instance, char *pathBuffer,
51	intptr_t bufferSize);
52extern intptr_t of_instance_to_package(uint32_t instance);
53extern intptr_t of_getprop(intptr_t package, const char *property, void *buffer,
54	intptr_t bufferSize);
55extern intptr_t of_setprop(intptr_t package, const char *property, const void *buffer,
56	intptr_t bufferSize);
57extern intptr_t of_nextprop(intptr_t package, const char *previousProperty,
58	char *nextProperty);
59extern intptr_t of_getproplen(intptr_t package, const char *property);
60extern intptr_t of_package_to_path(intptr_t package, char *pathBuffer,
61	intptr_t bufferSize);
62
63/* I/O functions */
64extern intptr_t of_open(const char *nodeName);
65extern void of_close(intptr_t handle);
66extern intptr_t of_read(intptr_t handle, void *buffer, intptr_t bufferSize);
67extern intptr_t of_write(intptr_t handle, const void *buffer, intptr_t bufferSize);
68extern intptr_t of_seek(intptr_t handle, off_t pos);
69extern intptr_t of_blocks(intptr_t handle);
70extern intptr_t of_block_size(intptr_t handle);
71
72/* memory functions */
73extern intptr_t of_release(void *virtualAddress, intptr_t size);
74extern void *of_claim(void *virtualAddress, intptr_t size, intptr_t align);
75
76/* misc functions */
77extern intptr_t of_call_client_function(const char *method, intptr_t numArgs,
78	intptr_t numReturns, ...);
79extern intptr_t of_interpret(const char *command, intptr_t numArgs,
80	intptr_t numReturns, ...);
81extern intptr_t of_call_method(uint32_t handle, const char *method,
82	intptr_t numArgs, intptr_t numReturns, ...);
83extern intptr_t of_test(const char *service);
84extern intptr_t of_milliseconds(void);
85extern void of_exit(void);
86
87#ifdef __cplusplus
88}
89#endif
90
91#endif	/* OPEN_FIRMWARE_H */
92