1 /* This file is part of the program psim. 2 3 Copyright (C) 1994-1996, Andrew Cagney <cagney@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