#ifndef _DEVICE_H_
#define _DEVICE_H_
#ifndef INLINE_DEVICE
#define INLINE_DEVICE
#endif
INLINE_DEVICE\
(device *) device_create
(device *parent,
const char *base,
const char *name,
const char *unit_address,
const char *args);
INLINE_DEVICE\
(void) device_usage
(int verbose);
INLINE_DEVICE\
(void) device_clean
(device *root,
void *data);
INLINE_DEVICE\
(void) device_init_static_properties
(device *me,
void *data);
INLINE_DEVICE\
(void) device_init_address
(device *me,
void *data);
INLINE_DEVICE\
(void) device_init_runtime_properties
(device *me,
void *data);
INLINE_DEVICE\
(void) device_init_data
(device *me,
void *data);
INLINE_DEVICE\
(device *) device_parent
(device *me);
INLINE_DEVICE\
(device *) device_root
(device *me);
INLINE_DEVICE\
(device *) device_sibling
(device *me);
INLINE_DEVICE\
(device *) device_child
(device *me);
INLINE_DEVICE\
(const char *) device_name
(device *me);
INLINE_DEVICE\
(const char *) device_base
(device *me);
INLINE_DEVICE\
(const char *) device_path
(device *me);
INLINE_DEVICE\
(void *) device_data
(device *me);
INLINE_DEVICE\
(psim *) device_system
(device *me);
typedef struct _device_unit {
int nr_cells;
unsigned_cell cells[4];
} device_unit;
INLINE_DEVICE\
(const device_unit *) device_unit_address
(device *me);
INLINE_DEVICE\
(int) device_decode_unit
(device *bus,
const char *unit,
device_unit *address);
INLINE_DEVICE\
(int) device_encode_unit
(device *bus,
const device_unit *unit_address,
char *buf,
int sizeof_buf);
INLINE_DEVICE\
(int) device_address_to_attach_address
(device *me,
const device_unit *address,
int *attach_space,
unsigned_word *attach_address,
device *client);
INLINE_DEVICE\
(int) device_size_to_attach_size
(device *me,
const device_unit *size,
unsigned *nr_bytes,
device *client);
INLINE_DEVICE\
(unsigned) device_nr_address_cells
(device *me);
INLINE_DEVICE\
(unsigned) device_nr_size_cells
(device *me);
typedef enum {
array_property,
boolean_property,
ihandle_property,
integer_property,
range_array_property,
reg_array_property,
string_property,
string_array_property,
} device_property_type;
typedef struct _device_property device_property;
struct _device_property {
device *owner;
const char *name;
device_property_type type;
unsigned sizeof_array;
const void *array;
const device_property *original;
object_disposition disposition;
};
INLINE_DEVICE\
(const device_property *) device_next_property
(const device_property *previous);
INLINE_DEVICE\
(const device_property *) device_find_property
(device *me,
const char *property);
INLINE_DEVICE\
(void) device_add_array_property
(device *me,
const char *property,
const void *array,
int sizeof_array);
INLINE_DEVICE\
(void) device_set_array_property
(device *me,
const char *property,
const void *array,
int sizeof_array);
INLINE_DEVICE\
(const device_property *) device_find_array_property
(device *me,
const char *property);
INLINE_DEVICE\
(void) device_add_boolean_property
(device *me,
const char *property,
int bool);
INLINE_DEVICE\
(int) device_find_boolean_property
(device *me,
const char *property);
typedef struct _ihandle_runtime_property_spec {
const char *full_path;
} ihandle_runtime_property_spec;
INLINE_DEVICE\
(void) device_add_ihandle_runtime_property
(device *me,
const char *property,
const ihandle_runtime_property_spec *ihandle);
INLINE_DEVICE\
(void) device_find_ihandle_runtime_property
(device *me,
const char *property,
ihandle_runtime_property_spec *ihandle);
INLINE_DEVICE\
(void) device_set_ihandle_property
(device *me,
const char *property,
device_instance *ihandle);
INLINE_DEVICE\
(device_instance *) device_find_ihandle_property
(device *me,
const char *property);
INLINE_DEVICE\
(void) device_add_integer_property
(device *me,
const char *property,
signed_cell integer);
INLINE_DEVICE\
(signed_cell) device_find_integer_property
(device *me,
const char *property);
INLINE_DEVICE\
(int) device_find_integer_array_property
(device *me,
const char *property,
unsigned index,
signed_cell *integer);
typedef struct _range_property_spec {
device_unit child_address;
device_unit parent_address;
device_unit size;
} range_property_spec;
INLINE_DEVICE\
(void) device_add_range_array_property
(device *me,
const char *property,
const range_property_spec *ranges,
unsigned nr_ranges);
INLINE_DEVICE\
(int) device_find_range_array_property
(device *me,
const char *property,
unsigned index,
range_property_spec *range);
typedef struct _reg_property_spec {
device_unit address;
device_unit size;
} reg_property_spec;
INLINE_DEVICE\
(void) device_add_reg_array_property
(device *me,
const char *property,
const reg_property_spec *reg,
unsigned nr_regs);
INLINE_DEVICE\
(int) device_find_reg_array_property
(device *me,
const char *property,
unsigned index,
reg_property_spec *reg);
INLINE_DEVICE\
(void) device_add_string_property
(device *me,
const char *property,
const char *string);
INLINE_DEVICE\
(const char *) device_find_string_property
(device *me,
const char *property);
typedef const char *string_property_spec;
INLINE_DEVICE\
(void) device_add_string_array_property
(device *me,
const char *property,
const string_property_spec *strings,
unsigned nr_strings);
INLINE_DEVICE\
(int) device_find_string_array_property
(device *me,
const char *property,
unsigned index,
string_property_spec *string);
INLINE_DEVICE\
(void) device_add_duplicate_property
(device *me,
const char *property,
const device_property *original);
typedef struct _device_instance_callbacks device_instance_callbacks;
INLINE_DEVICE\
(device_instance *) device_create_instance_from
(device *me, device_instance *parent,
void *data,
const char *path,
const char *args,
const device_instance_callbacks *callbacks);
INLINE_DEVICE\
(device_instance *) device_create_instance
(device *me,
const char *full_path,
const char *args);
INLINE_DEVICE\
(void) device_instance_delete
(device_instance *instance);
INLINE_DEVICE\
(int) device_instance_read
(device_instance *instance,
void *addr,
unsigned_word len);
INLINE_DEVICE\
(int) device_instance_write
(device_instance *instance,
const void *addr,
unsigned_word len);
INLINE_DEVICE\
(int) device_instance_seek
(device_instance *instance,
unsigned_word pos_hi,
unsigned_word pos_lo);
INLINE_DEVICE\
(int) device_instance_call_method
(device_instance *instance,
const char *method,
int n_stack_args,
unsigned_cell stack_args[],
int n_stack_returns,
unsigned_cell stack_returns[]);
INLINE_DEVICE\
(device *) device_instance_device
(device_instance *instance);
INLINE_DEVICE\
(const char *) device_instance_path
(device_instance *instance);
INLINE_DEVICE\
(void *) device_instance_data
(device_instance *instance);
INLINE_DEVICE\
(void) device_interrupt_event
(device *me,
int my_port,
int value,
cpu *processor,
unsigned_word cia);
INLINE_DEVICE\
(void) device_interrupt_attach
(device *me,
int my_port,
device *dest,
int dest_port,
object_disposition disposition);
INLINE_DEVICE\
(void) device_interrupt_detach
(device *me,
int my_port,
device *dest,
int dest_port);
typedef void (device_interrupt_traverse_function)
(device *me,
int my_port,
device *dest,
int my_dest,
void *data);
INLINE_DEVICE\
(void) device_interrupt_traverse
(device *me,
device_interrupt_traverse_function *handler,
void *data);
INLINE_DEVICE\
(int) device_interrupt_decode
(device *me,
const char *symbolic_name,
port_direction direction);
INLINE_DEVICE\
(int) device_interrupt_encode
(device *me,
int port_number,
char *buf,
int sizeof_buf,
port_direction direction);
INLINE_DEVICE\
(unsigned) device_io_read_buffer
(device *me,
void *dest,
int space,
unsigned_word addr,
unsigned nr_bytes,
cpu *processor,
unsigned_word cia);
INLINE_DEVICE\
(unsigned) device_io_write_buffer
(device *me,
const void *source,
int space,
unsigned_word addr,
unsigned nr_bytes,
cpu *processor,
unsigned_word cia);
INLINE_DEVICE\
(unsigned) device_dma_read_buffer
(device *me,
void *dest,
int space,
unsigned_word addr,
unsigned nr_bytes);
INLINE_DEVICE\
(unsigned) device_dma_write_buffer
(device *me,
const void *source,
int space,
unsigned_word addr,
unsigned nr_bytes,
int violate_read_only_section);
typedef enum _access_type {
access_invalid = 0,
access_read = 1,
access_write = 2,
access_read_write = 3,
access_exec = 4,
access_read_exec = 5,
access_write_exec = 6,
access_read_write_exec = 7,
} access_type;
typedef enum _attach_type {
attach_invalid,
attach_raw_memory,
attach_callback,
} attach_type;
INLINE_DEVICE\
(void) device_attach_address
(device *me,
attach_type attach,
int space,
unsigned_word addr,
unsigned nr_bytes,
access_type access,
device *client);
INLINE_DEVICE\
(void) device_detach_address
(device *me,
attach_type attach,
int space,
unsigned_word addr,
unsigned nr_bytes,
access_type access,
device *client);
typedef enum {
device_ioctl_break,
device_ioctl_set_trace,
device_ioctl_create_stack,
device_ioctl_change_media,
nr_device_ioctl_requests,
} device_ioctl_request;
EXTERN_DEVICE\
(int) device_ioctl
(device *me,
cpu *processor,
unsigned_word cia,
device_ioctl_request request,
...);
EXTERN_DEVICE\
(void volatile) device_error
(device *me,
const char *fmt,
...) __attribute__ ((format (printf, 2, 3)));
INLINE_DEVICE\
(int) device_trace
(device *me);
INLINE_DEVICE\
(device *) external_to_device
(device *tree_member,
unsigned_cell phandle);
INLINE_DEVICE\
(unsigned_cell) device_to_external
(device *me);
INLINE_DEVICE\
(device_instance *) external_to_device_instance
(device *tree_member,
unsigned_cell ihandle);
INLINE_DEVICE\
(unsigned_cell) device_instance_to_external
(device_instance *me);
typedef void device_event_handler(void *data);
INLINE_DEVICE\
(event_entry_tag) device_event_queue_schedule
(device *me,
signed64 delta_time,
device_event_handler *handler,
void *data);
INLINE_EVENTS\
(void) device_event_queue_deschedule
(device *me,
event_entry_tag event_to_remove);
INLINE_EVENTS\
(signed64) device_event_queue_time
(device *me);
#endif