This commit was generated by cvs2svn to track changes on a CVS vendor
[deliverable/binutils-gdb.git] / sim / ppc / device_table.h
CommitLineData
c906108c
SS
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
38typedef 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
44typedef 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
52typedef void (device_init_callback)
53 (device *me);
54
55typedef 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
63typedef 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
72typedef 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
80typedef 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
89typedef 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
98typedef 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
106typedef unsigned (device_dma_read_buffer_callback)
107 (device *me,
108 void *dest,
109 int space,
110 unsigned_word addr,
111 unsigned nr_bytes);
112
113typedef 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
121typedef 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
129typedef 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
138typedef 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
147typedef 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
154typedef 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
163typedef int (device_unit_decode_callback)
164 (device *bus,
165 const char *unit,
166 device_unit *address);
167
168typedef int (device_unit_encode_callback)
169 (device *bus,
170 const device_unit *unit_address,
171 char *buf,
172 int sizeof_buf);
173
174typedef 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
181typedef int (device_size_to_attach_size_callback)
182 (device *bus,
183 const device_unit *size,
184 unsigned *nr_bytes,
185 device *client);
186
187typedef 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
197typedef void (device_instance_delete_callback)
198 (device_instance *instance);
199
200typedef int (device_instance_read_callback)
201 (device_instance *instance,
202 void *buf,
203 unsigned_word len);
204
205typedef int (device_instance_write_callback)
206 (device_instance *instance,
207 const void *buf,
208 unsigned_word len);
209
210typedef int (device_instance_seek_callback)
211 (device_instance *instance,
212 unsigned_word pos_hi,
213 unsigned_word pos_lo);
214
215typedef 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
222typedef struct _device_instance_methods {
223 const char *name;
224 device_instance_method *method;
225} device_instance_methods;
226
227struct _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
235typedef device_instance *(device_create_instance_callback)
236 (device *me,
237 const char *full_path,
238 const char *args);
239
240typedef device_instance *(package_create_instance_callback)
241 (device_instance *parent,
242 const char *args);
243
244
245/* all else fails */
246
247typedef int (device_ioctl_callback)
248 (device *me,
249 cpu *processor,
250 unsigned_word cia,
251 device_ioctl_request request,
252 va_list ap);
253
254typedef void (device_usage_callback)
255 (int verbose);
256
257
258/* the callbacks */
259
260struct _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
292typedef struct _device_descriptor device_descriptor;
293struct _device_descriptor {
294 const char *name;
295 device_creator *creator;
296 const device_callbacks *callbacks;
297};
298
299extern 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
307extern device_address_callback passthrough_device_address_attach;
308extern device_address_callback passthrough_device_address_detach;
309extern device_dma_read_buffer_callback passthrough_device_dma_read_buffer;
310extern device_dma_write_buffer_callback passthrough_device_dma_write_buffer;
311
312extern device_unit_decode_callback ignore_device_unit_decode;
313
314extern device_init_callback generic_device_init_address;
315extern device_unit_decode_callback generic_device_unit_decode;
316extern device_unit_encode_callback generic_device_unit_encode;
317extern device_address_to_attach_address_callback generic_device_address_to_attach_address;
318extern device_size_to_attach_size_callback generic_device_size_to_attach_size;
319
320
321extern const device_callbacks passthrough_device_callbacks;
322
323#endif /* _DEVICE_TABLE_H_ */
This page took 0.047233 seconds and 4 git commands to generate.