Home | History | Annotate | Line # | Download | only in ppc
      1 /*  This file is part of the program psim.
      2 
      3     Copyright (C) 1994-1996, Andrew Cagney <cagney (at) highland.com.au>
      4 
      5     This program is free software; you can redistribute it and/or modify
      6     it under the terms of the GNU General Public License as published by
      7     the Free Software Foundation; either version 3 of the License, or
      8     (at your option) any later version.
      9 
     10     This program is distributed in the hope that it will be useful,
     11     but WITHOUT ANY WARRANTY; without even the implied warranty of
     12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     13     GNU General Public License for more details.
     14 
     15     You should have received a copy of the GNU General Public License
     16     along with this program; if not, see <http://www.gnu.org/licenses/>.
     17 
     18     */
     19 
     20 
     21 #ifndef _DEVICE_TABLE_H_
     22 #define _DEVICE_TABLE_H_
     23 
     24 #include "basics.h"
     25 #include "device.h"
     26 #include "tree.h"
     27 
     28 #include <string.h>
     29 
     30 
     31 typedef struct _device_callbacks device_callbacks;
     32 
     33 
     34 /* The creator, returns a pointer to any data that should be allocated
     35    once during (multiple) simulation runs */
     36 
     37 typedef void *(device_creator)
     38      (const char *name,
     39       const device_unit *unit_address,
     40       const char *args);
     41 
     42 
     43 /* two stages of initialization */
     44 
     45 typedef void (device_init_callback)
     46      (device *me);
     47 
     48 typedef struct _device_init_callbacks {
     49   device_init_callback *address; /* NULL - ignore */
     50   device_init_callback *data; /* NULL - ignore */
     51 } device_init_callbacks;
     52 
     53 
     54 /* attaching/detaching a devices address space to its parent */
     55 
     56 typedef void (device_address_callback)
     57      (device *me,
     58       attach_type attach,
     59       int space,
     60       unsigned_word addr,
     61       unsigned nr_bytes,
     62       access_type access,
     63       device *client); /*callback/default*/
     64 
     65 typedef struct _device_address_callbacks {
     66   device_address_callback *attach;
     67   device_address_callback *detach;
     68 } device_address_callbacks;
     69 
     70 
     71 /* I/O operations - from parent */
     72 
     73 typedef unsigned (device_io_read_buffer_callback)
     74      (device *me,
     75       void *dest,
     76       int space,
     77       unsigned_word addr,
     78       unsigned nr_bytes,
     79       cpu *processor,
     80       unsigned_word cia);
     81 
     82 typedef unsigned (device_io_write_buffer_callback)
     83      (device *me,
     84       const void *source,
     85       int space,
     86       unsigned_word addr,
     87       unsigned nr_bytes,
     88       cpu *processor,
     89       unsigned_word cia);
     90 
     91 typedef struct _device_io_callbacks { /* NULL - error */
     92   device_io_read_buffer_callback *read_buffer;
     93   device_io_write_buffer_callback *write_buffer;
     94 } device_io_callbacks;
     95 
     96 
     97 /* DMA transfers by a device via its parent */
     98 
     99 typedef unsigned (device_dma_read_buffer_callback)
    100      (device *me,
    101       void *dest,
    102       int space,
    103       unsigned_word addr,
    104       unsigned nr_bytes);
    105 
    106 typedef unsigned (device_dma_write_buffer_callback)
    107      (device *me,
    108       const void *source,
    109       int space,
    110       unsigned_word addr,
    111       unsigned nr_bytes,
    112       int violate_read_only_section);
    113 
    114 typedef struct _device_dma_callbacks { /* NULL - error */
    115   device_dma_read_buffer_callback *read_buffer;
    116   device_dma_write_buffer_callback *write_buffer;
    117 } device_dma_callbacks;
    118 
    119 
    120 /* Interrupts */
    121 
    122 typedef void (device_interrupt_event_callback)
    123      (device *me,
    124       int my_port,
    125       device *source,
    126       int source_port,
    127       int level,
    128       cpu *processor,
    129       unsigned_word cia);
    130 
    131 typedef void (device_child_interrupt_event_callback)
    132      (device *me,
    133       device *parent,
    134       device *source,
    135       int source_port,
    136       int level,
    137       cpu *processor,
    138       unsigned_word cia);
    139 
    140 typedef struct _device_interrupt_port_descriptor {
    141   const char *name;
    142   int number;
    143   int nr_ports;
    144   port_direction direction;
    145 } device_interrupt_port_descriptor;
    146 
    147 typedef struct _device_interrupt_callbacks {
    148   device_interrupt_event_callback *event;
    149   device_child_interrupt_event_callback *child_event;
    150   const device_interrupt_port_descriptor *ports;
    151 } device_interrupt_callbacks;
    152 
    153 
    154 /* symbolic value decoding */
    155 
    156 typedef int (device_unit_decode_callback)
    157      (device *bus,
    158       const char *unit,
    159       device_unit *address);
    160 
    161 typedef int (device_unit_encode_callback)
    162      (device *bus,
    163       const device_unit *unit_address,
    164       char *buf,
    165       int sizeof_buf);
    166 
    167 typedef int (device_address_to_attach_address_callback)
    168      (device *bus,
    169       const device_unit *address,
    170       int *attach_space,
    171       unsigned_word *attach_address,
    172       device *client);
    173 
    174 typedef int (device_size_to_attach_size_callback)
    175      (device *bus,
    176       const device_unit *size,
    177       unsigned *nr_bytes,
    178       device *client);
    179 
    180 typedef struct _device_convert_callbacks {
    181   device_unit_decode_callback *decode_unit;
    182   device_unit_encode_callback *encode_unit;
    183   device_address_to_attach_address_callback *address_to_attach_address;
    184   device_size_to_attach_size_callback *size_to_attach_size;
    185 } device_convert_callbacks;
    186 
    187 
    188 /* instances */
    189 
    190 typedef void (device_instance_delete_callback)
    191      (device_instance *instance);
    192 
    193 typedef int (device_instance_read_callback)
    194      (device_instance *instance,
    195       void *buf,
    196       unsigned_word len);
    197 
    198 typedef int (device_instance_write_callback)
    199      (device_instance *instance,
    200       const void *buf,
    201       unsigned_word len);
    202 
    203 typedef int (device_instance_seek_callback)
    204      (device_instance *instance,
    205       unsigned_word pos_hi,
    206       unsigned_word pos_lo);
    207 
    208 typedef int (device_instance_method)
    209      (device_instance *instance,
    210       int n_stack_args,
    211       unsigned_cell stack_args[/*n_stack_args*/],
    212       int n_stack_returns,
    213       unsigned_cell stack_returns[/*n_stack_returns*/]);
    214 
    215 typedef struct _device_instance_methods {
    216   const char *name;
    217   device_instance_method *method;
    218 } device_instance_methods;
    219 
    220 struct _device_instance_callbacks { /* NULL - error */
    221   device_instance_delete_callback *delete;
    222   device_instance_read_callback *read;
    223   device_instance_write_callback *write;
    224   device_instance_seek_callback *seek;
    225   const device_instance_methods *methods;
    226 };
    227 
    228 typedef device_instance *(device_create_instance_callback)
    229      (device *me,
    230       const char *full_path,
    231       const char *args);
    232 
    233 typedef device_instance *(package_create_instance_callback)
    234      (device_instance *parent,
    235       const char *args);
    236 
    237 
    238 /* all else fails */
    239 
    240 typedef int (device_ioctl_callback)
    241      (device *me,
    242       cpu *processor,
    243       unsigned_word cia,
    244       device_ioctl_request request,
    245       va_list ap);
    246 
    247 typedef void (device_usage_callback)
    248      (int verbose);
    249 
    250 
    251 /* the callbacks */
    252 
    253 struct _device_callbacks {
    254 
    255   /* initialization */
    256   device_init_callbacks init;
    257 
    258   /* address/data config - from child */
    259   device_address_callbacks address;
    260 
    261   /* address/data transfer - from parent */
    262   device_io_callbacks io;
    263 
    264   /* address/data transfer - from child */
    265   device_dma_callbacks dma;
    266 
    267   /* interrupt signalling */
    268   device_interrupt_callbacks interrupt;
    269 
    270   /* bus address decoding */
    271   device_convert_callbacks convert;
    272 
    273   /* instances */
    274   device_create_instance_callback *instance_create;
    275 
    276   /* back door to anything we've forgot */
    277   device_ioctl_callback *ioctl;
    278   device_usage_callback *usage;
    279 };
    280 
    281 
    282 /* Table of all the devices and a function to lookup/create a device
    283    from its name */
    284 
    285 typedef struct _device_descriptor device_descriptor;
    286 struct _device_descriptor {
    287   const char *name;
    288   device_creator *creator;
    289   const device_callbacks *callbacks;
    290 };
    291 
    292 extern const device_descriptor *const device_table[];
    293 #include "hw.h"
    294 
    295 
    296 /* Pass through, ignore and generic callback functions.  A call going
    297    towards the root device are passed on up, local calls are ignored
    298    and call downs abort */
    299 
    300 extern device_address_callback passthrough_device_address_attach;
    301 extern device_address_callback passthrough_device_address_detach;
    302 extern device_dma_read_buffer_callback passthrough_device_dma_read_buffer;
    303 extern device_dma_write_buffer_callback passthrough_device_dma_write_buffer;
    304 
    305 extern device_unit_decode_callback ignore_device_unit_decode;
    306 
    307 extern device_init_callback generic_device_init_address;
    308 extern device_unit_decode_callback generic_device_unit_decode;
    309 extern device_unit_encode_callback generic_device_unit_encode;
    310 extern device_address_to_attach_address_callback generic_device_address_to_attach_address;
    311 extern device_size_to_attach_size_callback generic_device_size_to_attach_size;
    312 
    313 
    314 extern const device_callbacks passthrough_device_callbacks;
    315 
    316 #endif /* _DEVICE_TABLE_H_ */
    317