summaryrefslogtreecommitdiff
path: root/sim/ppc/device.h
diff options
context:
space:
mode:
Diffstat (limited to 'sim/ppc/device.h')
-rw-r--r--sim/ppc/device.h797
1 files changed, 0 insertions, 797 deletions
diff --git a/sim/ppc/device.h b/sim/ppc/device.h
deleted file mode 100644
index 56c8ce54d99..00000000000
--- a/sim/ppc/device.h
+++ /dev/null
@@ -1,797 +0,0 @@
-/* This file is part of the program psim.
-
- Copyright (C) 1994-1997, Andrew Cagney <cagney@highland.com.au>
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
- */
-
-
-#ifndef _DEVICE_H_
-#define _DEVICE_H_
-
-#ifndef INLINE_DEVICE
-#define INLINE_DEVICE
-#endif
-
-/* declared in basics.h, this object is used everywhere */
-/* typedef struct _device device; */
-
-
-/* Introduction:
-
- As explained in earlier sections, the device, device instance,
- property and interrupts lie at the heart of PSIM's device model.
-
- In the below a synopsis of the device object and the operations it
- supports are given. Details of this object can be found in the
- files <<device.h>> and <<device.c>>.
-
- */
-
-
-/* Device creation: */
-
-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);
-
-
-/* Device initialization: */
-
-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);
-
-
-/* Relationships:
-
- A device is able to determine its relationship to other devices
- within the tree. Operations include querying for a devices parent,
- sibling, child, name, and path (from the root).
-
- */
-
-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]; /* unused cells are zero */
-} 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);
-
-
-/* Convert an Open Firmware size into a form suitable for attach
- address calls.
-
- Return a zero result if the address should be ignored when looking
- for attach addresses */
-
-INLINE_DEVICE\
-(int) device_address_to_attach_address
-(device *me,
- const device_unit *address,
- int *attach_space,
- unsigned_word *attach_address,
- device *client);
-
-
-/* Convert an Open Firmware size into a form suitable for attach
- address calls
-
- Return a zero result if the address should be ignored */
-
-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);
-
-
-/* Properties:
-
- Attached to a device are a number of properties. Each property has
- a size and type (both of which can be queried). A device is able
- to iterate over or query and set a properties value.
-
- */
-
-/* The following are valid property types. The property `array' is
- for generic untyped data. */
-
-typedef enum {
- array_property,
- boolean_property,
- ihandle_property, /*runtime*/
- 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;
-};
-
-
-/* iterate through the properties attached to a device */
-
-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); /* NULL for first property */
-
-
-/* Manipulate the properties belonging to a given device.
-
- SET on the other hand will force the properties value. The
- simulation is aborted if the property was present but of a
- conflicting type.
-
- FIND returns the specified properties value, aborting the
- simulation if the property is missing. Code locating a property
- should first check its type (using device_find_property above) and
- then obtain its value using the below.
-
- void device_add_<type>_property(device *, const char *, <type>)
- void device_add_*_array_property(device *, const char *, const <type>*, int)
- void device_set_*_property(device *, const char *, <type>)
- void device_set_*_array_property(device *, const char *, const <type>*, int)
- <type> device_find_*_property(device *, const char *)
- int device_find_*_array_property(device *, const char *, int, <type>*)
-
- */
-
-
-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_word *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);
-
-
-
-/* Instances:
-
- As with IEEE1275, a device can be opened, creating an instance.
- Instances provide more abstract interfaces to the underlying
- hardware. For example, the instance methods for a disk may include
- code that is able to interpret file systems found on disks. Such
- methods would there for allow the manipulation of files on the
- disks file system. The operations would be implemented using the
- basic block I/O model provided by the disk.
-
- This model includes methods that faciliate the creation of device
- instance and (should a given device support it) standard operations
- on those instances.
-
- */
-
-typedef struct _device_instance_callbacks device_instance_callbacks;
-
-INLINE_DEVICE\
-(device_instance *) device_create_instance_from
-(device *me, /*OR*/ 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[/*n_stack_args*/],
- int n_stack_returns,
- unsigned_cell stack_returns[/*n_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);
-
-
-/* Interrupts:
-
- */
-
-/* Interrupt Source
-
- A device drives its interrupt line using the call
-
- */
-
-INLINE_DEVICE\
-(void) device_interrupt_event
-(device *me,
- int my_port,
- int value,
- cpu *processor,
- unsigned_word cia);
-
-/* This interrupt event will then be propogated to any attached
- interrupt destinations.
-
- Any interpretation of PORT and VALUE is model dependant. However
- as guidelines the following are recommended: PCI interrupts a-d
- correspond to lines 0-3; level sensative interrupts be requested
- with a value of one and withdrawn with a value of 0; edge sensative
- interrupts always have a value of 1, the event its self is treated
- as the interrupt.
-
-
- Interrupt Destinations
-
- Attached to each interrupt line of a device can be zero or more
- desitinations. These destinations consist of a device/port pair.
- A destination is attached/detached to a device line using the
- attach and detach calls. */
-
-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);
-
-
-/* DESTINATION is attached (detached) to LINE of the device ME
-
-
- Interrupt conversion
-
- Users refer to interrupt port numbers symbolically. For instance a
- device may refer to its `INT' signal which is internally
- represented by port 3.
-
- To convert to/from the symbolic and internal representation of a
- port name/number. The following functions are available. */
-
-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);
-
-
-/* Hardware operations:
-
- */
-
-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);
-
-
-/* Conversly, the device pci1000,1@1 my need to perform a dma transfer
- into the cpu/memory core. Just as I/O moves towards the leaves,
- dma transfers move towards the core via the initiating devices
- parent nodes. The root device (special) converts the DMA transfer
- into reads/writes to memory */
-
-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);
-
-/* To avoid the need for an intermediate (bridging) node to ask each
- of its child devices in turn if an IO access is intended for them,
- parent nodes maintain a table mapping addresses directly to
- specific devices. When a device is `connected' to its bus it
- attaches its self to its parent. */
-
-/* Address access attributes */
-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;
-
-/* Address attachement types */
-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); /*callback/default*/
-
-INLINE_DEVICE\
-(void) device_detach_address
-(device *me,
- attach_type attach,
- int space,
- unsigned_word addr,
- unsigned nr_bytes,
- access_type access,
- device *client); /*callback/default*/
-
-/* Utilities:
-
- */
-
-/* IOCTL::
-
- Often devices require `out of band' operations to be performed.
- For instance a pal device may need to notify a PCI bridge device
- that an interrupt ack cycle needs to be performed on the PCI bus.
- Within PSIM such operations are performed by using the generic
- ioctl call <<device_ioctl()>>.
-
- */
-
-typedef enum {
- device_ioctl_break, /* unsigned_word requested_break */
- device_ioctl_set_trace, /* void */
- device_ioctl_create_stack, /* unsigned_word *sp, char **argv, char **envp */
- device_ioctl_change_media, /* const char *new_image (possibly NULL) */
- nr_device_ioctl_requests,
-} device_ioctl_request;
-
-EXTERN_DEVICE\
-(int) device_ioctl
-(device *me,
- cpu *processor,
- unsigned_word cia,
- device_ioctl_request request,
- ...);
-
-
-/* Error reporting::
-
- So that errors originating from devices appear in a consistent
- format, the <<device_error()>> function can be used. Formats and
- outputs the error message before aborting the simulation
-
- Devices should use this function to abort the simulation except
- when the abort reason leaves the simulation in a hazardous
- condition (for instance a failed malloc).
-
- */
-
-EXTERN_DEVICE\
-(void volatile) device_error
-(device *me,
- const char *fmt,
- ...) __attribute__ ((format (printf, 2, 3)));
-
-INLINE_DEVICE\
-(int) device_trace
-(device *me);
-
-
-
-/* External representation:
-
- Both device nodes and device instances, in OpenBoot firmware have
- an external representation (phandles and ihandles) and these values
- are both stored in the device tree in property nodes and passed
- between the client program and the simulator during emulation
- calls.
-
- To limit the potential risk associated with trusing `data' from the
- client program, the following mapping operators `safely' convert
- between the two representations
-
- */
-
-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);
-
-
-/* Event queue:
-
- The device inherets certain event queue operations from the main
- simulation. */
-
-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 /* _DEVICE_H_ */