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