/* 6.3.2.1 Client interface */


typedef struct _of_test_service {
	const char *service;
	int n_args;
	int n_returns;
	/*in*/
	const char *name;
	/*out*/
	int missing;
} of_test_service;

int of_test(const char *name, int *missing);


/* 6.3.2.2 Device tree */


typedef struct _of_peer_service {
	const char *service;
	int n_args;
	int n_returns;
	/*in*/
	int phandle;
	/*out*/
	int sibling_phandle;
} of_peer_service;

int of_peer(int phandle, int *sibling_phandle);


typedef struct _of_child_service {
	const char *service;
	int n_args;
	int n_returns;
	/*in*/
	int phandle;
	/*out*/
	int child_phandle;
} of_child_service;

int of_child(int phandle, int *child_phandle);


typedef struct _of_parent_service {
	const char *service;
	int n_args;
	int n_returns;
	/*in*/
	int phandle;
	/*out*/
	int parent_phandle;
} of_parent_service;

int of_child(int phandle, int *parent_phandle);


typedef struct _of_instance_to_package_service {
	const char *service;
	int n_args;
	int n_returns;
	/*in*/
	int ihandle;
	/*out*/
	int phandle;
} of_instance_to_package_service;

int of_instance_to_package(int ihandle, int *phandle);


typedef struct _of_getproplen_service {
	const char *service;
	int n_args;
	int n_returns;
	/*in*/
	int phandle;
	const char *name;
	/*out*/
	int proplen;
} of_getproplen_service;

int of_getproplen(int phandle, const char *name, int *proplen);


typedef struct _of_getprop_service {
	const char *service;
	int n_args;
	int n_returns;
	/*in*/
	int phandle;
	const char *name;
	void *buf;
	int buflen;
	/*out*/
	int size;
} of_getprop_service;

int of_getprop(int phandle, const char *name, void *buf, int buflen,
	       int *size);


typedef struct _of_nextprop_service {
	const char *service;
	int n_args;
	int n_returns;
	/*in*/
	int phandle;
	const char *previous;
	void *buf;
	/*out*/
	int flag;
} of_nextprop_service;

int of_nextprop(int phandle, const char *previous, void *buf, int *flag);


typedef struct _of_setprop_service {
	const char *service;
	int n_args;
	int n_returns;
	/*in*/
	int phandle;
	const char *name;
	void *buf;
	int len;
	/*out*/
	int size;
} of_setprop_service;

int of_setprop(int phandle, const char *name, void *buf, int len, int *size);


typedef struct _of_canon_service {
	const char *service;
	int n_args;
	int n_returns;
	/*in*/
	const char *device_specifier;
	void *buf;
	int buflen;
	/*out*/
	int length;
} of_canon_service;

int of_canon(const char *device_specifier, void *buf, int buflen, int *length);


typedef struct _of_finddevice_service {
	const char *service;
	int n_args;
	int n_returns;
	/*in*/
	const char *device_specifier;
	/*out*/
	int phandle;
} of_finddevice_service;

int of_finddevice(const char *device_specifier, int *phandle);


typedef struct _of_instance_to_path_service {
	const char *service;
	int n_args;
	int n_returns;
	/*in*/
	int ihandle;
	void *buf;
	int buflen;
	/*out*/
	int length;
} of_instance_to_path_service;

int of_instance_to_path(int ihandle, void *buf, int buflen, int *length);


typedef struct _of_package_to_path_service {
	const char *service;
	int n_args;
	int n_returns;
	/*in*/
	int phandle;
	void *buf;
	int buflen;
	/*out*/
	int length;
} of_package_to_path_service;

int of_package_to_path(int phandle, void *buf, int buflen, int *length);


typedef struct _of_call_method_service {
	const char *service;
	int n_args;
	int n_returns;
	/*in*/
	const char *method;
	int ihandle;
	/*...*/
	int args[0]; 
} of_call_method_service;

int of_call_method(const char *method, int ihandle, ...);


/* 6.3.2.3 Device I/O */


typedef struct _of_open_service {
	const char *service;
	int n_args;
	int n_returns;
	/*in*/
	const char *device_specifier;
	/*out*/
	int ihandle;
} of_open_service;

int of_open(const char *device_specifier,
	    int *ihandle);


typedef struct _of_close_service {
	const char *service;
	int n_args;
	int n_returns;
	/*in*/
	int ihandle;
	/*out*/
} of_close_service;

int of_close(int ihandle);


typedef struct _of_read_service {
	const char *service;
	int n_args;
	int n_returns;
	/*in*/
	int ihandle;
	void *addr;
	int len;
	/*out*/
	int actual;
} of_read_service;

int of_read(int ihandle, void *addr, int len, int *actual);


typedef struct _of_write_service {
	const char *service;
	int n_args;
	int n_returns;
	/*in*/
	int ihandle;
	void *addr;
	int len;
	/*out*/
	int actual;
} of_write_service;

int of_write(int ihandle, void *addr, int len, int *actual);


typedef struct _of_seek_service {
	const char *service;
	int n_args;
	int n_returns;
	/*in*/
	int ihandle;
	int pos_hi;
	int pos_lo;
	/*out*/
	int status;
} of_seek_service;

int of_seek(int ihandle, int pos_hi, int pos_lo, int *status);


/* 6.3.2.4 Memory */


typedef struct _of_claim_service {
	const char *service;
	int n_args;
	int n_returns;
	/*in*/
	void *virt;
	int size;
	int align;
	/*out*/
	void *baseaddr;
} of_claim_service;

int of_claim(void *virt, int size, int align, void **baseaddr);


typedef struct _of_release_service {
	const char *service;
	int n_args;
	int n_returns;
	/*in*/
	void *virt;
	int size;
	int align;
	/*out*/
} of_release_service;

int of_release(void *virt, int size);


/* 6.3.2.5 Control transfer */


typedef struct _of_boot_service {
	const char *service;
	int n_args;
	int n_returns;
	/*in*/
	const char *bootspec;
	/*out*/
} of_boot_service;

int of_boot(const char *bootspec);


typedef struct _of_enter_service {
	const char *service;
	int n_args;
	int n_returns;
	/*in*/
	/*out*/
} of_enter_service;

int of_enter(void);


typedef struct _of_exit_service {
	const char *service;
	int n_args;
	int n_returns;
	/*in*/
	/*out*/
} of_exit_service;

int of_exit(void);


typedef struct _of_chain_service {
	const char *service;
	int n_args;
	int n_returns;
	/*in*/
	void *virt;
	int size;
	void *entry;
	void *args;
	int len;
	/*out*/
} of_chain_service;

int of_chain(void *virt, int size, void *entry, void *args, int len);


/* 6.3.2.6 User interface */


typedef struct _of_interpret_service {
	const char *service;
	int n_args;
	int n_returns;
	/*in*/
	const char *cmd;
	int args[0];
	/*...*/
	/*out*/
	/*...*/
} of_interpret_service;

int of_interpret(const char *arg, ...);


typedef struct _of_set_callback_service {
	const char *service;
	int n_args;
	int n_returns;
	/*in*/
	void *newfunc;
	/*out*/
	void *oldfunc;
} of_set_callback_service;

int of_set_callback(void *newfunc, void **oldfunc);


typedef struct _of_set_symbol_lookup_service {
	const char *service;
	int n_args;
	int n_returns;
	/*in*/
	void *sym_to_value;
	void *value_to_sym;
	/*out*/
} of_set_symbol_lookup_service;

int of_set_symbol_lookup(void *sym_to_value, void *value_to_sym);


/* 6.3.2.7 Time */


typedef struct _of_milliseconds_service {
	const char *service;
	int n_args;
	int n_returns;
	/*in*/
	/*out*/
	int ms;
} of_milliseconds_service;

int of_milliseconds(int *ms);
