summaryrefslogtreecommitdiff
path: root/sys/arch/mvme88k/dev/vxreg.h
blob: 81f57542fc217d916af2319c2e95254e0fc44a15 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
/*	$OpenBSD: vxreg.h,v 1.2 2001/01/14 20:25:23 smurph Exp $ */

/*
 * Copyright (c) 1999 Steve Murphree, Jr. All rights reserved.
 *
 *   
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *	This product includes software developed by Dale Rahn.
 * 4. The name of the author may not be used to endorse or promote products
 *    derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */  

/* IPC - Intelligent Peripheral Controller */

struct vxreg {
/*0x0*/volatile u_short ipc_addrh;	 /* IPC addr reg, most significant */
/*0x2*/volatile u_short ipc_addrl;	 /* IPC addr reg, least significant */
/*0x4*/volatile u_char  ipc_amr;	  /* IPC address modifier reg */
/*0x5*/volatile u_char  unused1;   
/*0x6*/volatile u_short ipc_cr;	 /* IPC control ceg */
/*0x8*/volatile u_short ipc_sr;	 /* IPC status reg */
/*0xA*/volatile u_char  ipc_mdbp;	/* IPC model data byte pointer */
/*0xB*/volatile u_char  reserved3;   
/*0xC*/volatile u_char  ipc_avrp;	/* IPC abort vector reg pointer */
/*0xD*/volatile u_char  unused2;   
/*0xE*/volatile u_short ipc_tas;		 /* IPC test and set reg */
};

#define NOWAIT                0
#define WAIT                  1
#define WAIT_POLL             2

#define IPC_CR_SYSFI          0x1000   /* inhibit sysfail */
#define IPC_CR_ATTEN          0x2000   /* attention bit */
#define IPC_CR_RESET          0x4000   /* reset bit */
#define IPC_CR_BUSY           0x8000   /* busy bit */

#define IPC_SR_BUSERROR       0x4000   /* bus error */
#define IPC_SR_ERROR          0x8000   /* general error */
#define IPC_SR_INVAL          0xFFFF   /* invalid command */

#define IPC_TAS_COMPLETE      0x1000
#define IPC_TAS_VALID_STATUS  0x2000
#define IPC_TAS_VALID_CMD     0x4000
#define IPC_TAS_TAS           0x8000

#define IPC_CSR_CREATE        0x0001
#define IPC_CSR_DELETE        0x0002

#define CSW_OFFSET            0x0010

#define CMD_INIT              0x0000
#define CMD_READW             0x0001
#define CMD_WRITEW            0x0002
#define CMD_OPEN              0x0003
#define CMD_IOCTL             0x0004
#define CMD_CLOSE             0x0005
#define CMD_EVENT             0x0006
#define CMD_PROCCESED         0x00FF

#define IOCTL_LDOPEN          0x4400
#define IOCTL_LDCLOSE         0x4401
#define IOCTL_LDCHG           0x4402
#define IOCTL_LDGETT          0x4408
#define IOCTL_LDSETT          0x4409
#define IOCTL_TCGETA          0x5401   /* get dev termio struct */
#define IOCTL_TCSETA          0x5402   /* set dev termio struct */
#define IOCTL_TCSETAW         0x5403   /* set dev termio struct - wait */
#define IOCTL_TCSETAF         0x5404   /* set dev termio struct - wait - flush */
#define IOCTL_TCSBRK          0x5405   /* transmit a break seq */
#define IOCTL_TCXONC          0x5406   /* sus or res, xon or xoff, RTS or DTR */
#define IOCTL_TCFLSH          0x5407   /* Flush */
#define IOCTL_TCSETHW         0x5440   /* enable/disable HW handshake */
#define IOCTL_TCGETHW         0x5441   /* get current HW handshake info */
#define IOCTL_TCGETDL         0x5442   /* get daownloadable addr and mem size */
#define IOCTL_TCDLOAD         0x5443   /* download code/data to mem */
#define IOCTL_TCLINE          0x5444   /* copy line discipline */
#define IOCTL_TCEXEC          0x5445   /* exec code in local mem */
#define IOCTL_TCGETVR         0x5446   /* get version and revison of firmware */
#define IOCTL_TCGETDF         0x5447   /* get default termio stuct */
#define IOCTL_TCSETDF         0x5448   /* set default termio stuct */
#define IOCTL_TCGETSYM        0x5449   /* get firmware symbol table */
#define IOCTL_TCWHAT          0x544A   /* get all SCSI IDs of FW files */
#define IOCTL_TIOGETP         0x7408   /* get devs curr termio struct by sgttyb */
#define IOCTL_TIOSETP         0x7409   /* set devs curr termio struct by sgttyb */

#define IPC_EIO               5     /* I/O error */
#define IPC_ENXIO             6     /* no such device or address */
#define IPC_ENOMEM            12    /* not enough space */
#define IPC_EEXIST            17    /* device or address exists */
#define IPC_EINVAL            22    /* invalid caommand argument */

/*
 *	Index into c_cc[VNCC];
 */
#define  VVINTR   0  /* ISIG */
#define  VVQUIT   1  /* ISIG */
#define  VVERASE  2  /* ICANON */
#define  VVKILL   3  /* ICANON */
#define  VVEOF    4  /* ICANON */
#define  VVEOL    5  /* ICANON */
#define  VVSWTCH  6

/*
 * Input flags - software input processing
 */
#define  VIGNBRK  0000001   /* ignore BREAK condition */
#define  VBRKINT  0000002   /* map BREAK to SIGINTR */
#define  VIGNPAR  0000004   /* ignore (discard) parity errors */
#define  VPARMRK  0000010   /* mark parity and framing errors */
#define  VINPCK   0000020   /* enable checking of parity errors */
#define  VISTRIP  0000040   /* strip 8th bit off chars */
#define  VINLCR   0000100   /* map NL into CR */
#define  VIGNCR   0000200   /* ignore CR */
#define  VICRNL   0000400   /* map CR to NL (ala CRMOD) */
#define  VIUCLC   0001000   /* translate upper to lower case */
#define  VIXON    0002000   /* enable output flow control */
#define  VIXANY   0004000   /* any char will restart after stop */
#define  VIXOFF   0010000   /* enable input flow control */

/*
 * Output flags - software output processing
 */
#define  VOPOST   0000001   /* enable following output processing */
#define  VOLCUC   0000002   /* translate lower case to upper case */
#define  VONLCR   0000004   /* map NL to CR-NL (ala CRMOD) */
#define  VOCRNL   0000010   /* map CR to NL */
#define  VONOCR   0000020   /* No CR output at column 0 */
#define  VONLRET  0000040   /* NL performs the CR function */
#define  VOFILL   0000100
#define  VOFDEL   0000200
#define  VOXTABS  0014000   /* expand tabs to spaces */

/*
 * Control flags - hardware control of terminal
 */

#define  VCBAUD   0000017   /* baud rate */
#define  VB0      0000000   /* hang up */
#define  VB50     0000001
#define  VB75     0000002
#define  VB110    0000003
#define  VB134    0000004
#define  VB150    0000005
#define  VB200    0000006
#define  VB300    0000007
#define  VB600    0000010
#define  VB1200   0000011
#define  VB1800   0000012
#define  VB2400   0000013
#define  VB4800   0000014
#define  VB9600   0000015
#define  VB19200  0000016
#define  VB38400  0000017
#define  VEXTA    0000016
#define  VEXTB    0000017
#define  VCSIZE   0000060   /* character size mask */
#define  VCS5     0000000   /* 5 bits (pseudo) */
#define  VCS6     0000020   /* 6 bits */
#define  VCS7     0000040   /* 7 bits */
#define  VCS8     0000060   /* 8 bits */
#define  VCSTOPB  0000100   /* send 2 stop bits */
#define  VCREAD   0000200   /* enable receiver */
#define  VPARENB  0000400   /* parity enable */
#define  VPARODD  0001000   /* odd parity, else even */
#define  VHUPCL   0002000   /* hang up on last close */
#define  VCLOCAL  0004000   /* ignore modem status lines */

/*
 * "Local" flags - dumping ground for other state
 *
 * Warning: some flags in this structure begin with
 * the letter "I" and look like they belong in the
 * input flag.
 */

#define  VISIG    0000001   /* enable signals INTR, QUIT, [D]SUSP */
#define  VICANON  0000002   /* canonicalize input lines */
#define  VXCASE   0000004   /* canonical upper/lower case */
#define  VECHO    0000010   /* enable echoing */
#define  VECHOE   0000020   /* visually erase chars */
#define  VECHOK   0000040   /* echo NL after line kill */
#define  VECHONL  0000100   /* echo NL even if ECHO is off */
#define  VNOFLSH  0000200   /* don't flush after interrupt */


#define  VNCC     9  /* 18 bytes */
struct termio {
	volatile unsigned short c_iflag;
	volatile unsigned short c_oflag;
	volatile unsigned short c_cflag;
	volatile unsigned short c_lflag;
	volatile char           c_line;
	volatile unsigned char  c_cc[VNCC];
};

struct vx_sgttyb {      /* 6 bytes */
	volatile char  sg_ispeed;
	volatile char  sg_ospeed;
	volatile char  sg_erase;
	volatile char  sg_kill;
	volatile short  sg_flags;
};

struct termcb {      /* 6 bytes */
	volatile char  st_flgs;
	volatile char  st_termt;
	volatile char  st_crow;
	volatile char  st_ccol;
	volatile char  st_vrow;
	volatile char  st_lrow;
};

struct ctdesc {
	unsigned short csw,
	resv;
	unsigned long  magic,
	lcnt,
	fatal,
	error,
	faddr,
	expdata,
	readdata;
};

struct dl_info {     /* 18 bytes */
	volatile unsigned long  host_addr;
	volatile unsigned long  ipc_addr;
	volatile unsigned long  count;
	volatile unsigned long  extra_long;
	volatile unsigned short extra_short;
};

struct packet {      /* 68 bytes */
	volatile u_long  link;       /* was eyecatcher */
	volatile u_char  command_pipe_number;
	volatile u_char  status_pipe_number;
	volatile char    filler0[4];
	volatile short   command;
	volatile char    filler1[1];
	volatile char    command_dependent;
	volatile char    filler2[2];
	volatile u_char  device_number;
	volatile char    filler3[1];
	volatile short   ioctl_cmd_h;
	volatile short   ioctl_cmd_l;
	volatile short   ioctl_arg_h;
	volatile short   ioctl_arg_l;
	volatile short   ioctl_mode_h;
	volatile short   ioctl_mode_l;
	volatile char    filler4[6];
	volatile short   error_h;   
	volatile short   error_l;   
	volatile short   event_code;
	volatile char    filler5[6];
	union {
		struct  termio  tio;
		struct  termcb  tcb;
		struct  vx_sgttyb  sgt;
		struct  dl_info dl;
		long    param;
	} parameter_block;
	short   reserved;    /* for alignment */
} packet;

struct ioctl_a_packet {      /* 68 bytes */
	volatile u_long  link;       /* was eyecatcher */
	volatile u_char  command_pipe_number;
	volatile u_char  status_pipe_number;
	volatile char    filler0[4];
	volatile short   command;
	volatile char    filler1[1];
	volatile char    command_dependent;
	volatile char    filler2[2];
	volatile u_char  device_number;
	volatile char    filler3[1];
	volatile short   ioctl_cmd_h;
	volatile short   ioctl_cmd_l;
	volatile short   ioctl_arg_h;
	volatile short   ioctl_arg_l;
	volatile short   ioctl_mode_h;
	volatile short   ioctl_mode_l;
	volatile char    filler4[6];
	volatile short   error_h;   
	volatile short   error_l;   
	volatile short   event_code;
	volatile char    filler5[6];
	volatile unsigned short c_iflag;
	volatile unsigned short c_oflag;
	volatile unsigned short c_cflag;
	volatile unsigned short c_lflag;
	volatile char           c_line;
	volatile unsigned char  c_cc[VNCC];
	short   reserved;    /* for alignment */
};

struct envelope {	      /* 12 bytes */
	volatile u_long          link;
	volatile u_long          packet_ptr;
	volatile char            valid_flag;
	volatile char            reserved1;
	volatile char            reserved[2];
};

struct channel {        /* 24 bytes */
	volatile short             command_pipe_head_ptr_h;
	volatile short             command_pipe_head_ptr_l;
	volatile short             command_pipe_tail_ptr_h;
	volatile short             command_pipe_tail_ptr_l;
	volatile short             status_pipe_head_ptr_h;
	volatile short             status_pipe_head_ptr_l;
	volatile short             status_pipe_tail_ptr_h;
	volatile short             status_pipe_tail_ptr_l;
	volatile char              interrupt_level;
	volatile char              interrupt_vec;
	volatile char              channel_priority;
	volatile char              address_modifier;
	volatile char              channel_number;
	volatile char              valid;
	volatile char              datasize;
	volatile char              reserved;
};

#define WRING_DATA_SIZE 4096   /* for a total struct size of 4104 (4K + 6 + 2 bytes) */
#define WRING_BUF_SIZE WRING_DATA_SIZE
struct wring {
	volatile unsigned short reserved;
	volatile unsigned short put;
	volatile unsigned short get;
	volatile char           data[WRING_BUF_SIZE];
   char                    res[2]; /* for alignment */
};

#define RRING_DATA_SIZE 2048   /* for a total struct size of 2054 (2K + 6 + 2 bytes) */
#define RRING_BUF_SIZE RRING_DATA_SIZE
struct rring {
	volatile unsigned short reserved;
	volatile unsigned short put;
	volatile unsigned short get;
	volatile char           data[RRING_BUF_SIZE];
   char                    res[2]; /* for alignment */
};

#define EOFRAME  0xA
#define DELIMITER  0x1

struct init_info {      /* 88 bytes */
	volatile u_short        write_ring_ptr_h;
	volatile u_short        write_ring_ptr_l;
	volatile u_short        read_ring_ptr_h;
	volatile u_short        read_ring_ptr_l;
	volatile unsigned short write_ring_size;
	volatile unsigned short read_ring_size;
	volatile struct termio  def_termio;
	volatile unsigned short reserved1;
	volatile unsigned short reserved2;
	volatile unsigned short reserved3;
	volatile unsigned short reserved4;
	volatile char           init_data[56];
};

struct init_packet {
	volatile char              eye_catcher[4];
	volatile unsigned char     command_pipe_number;
	volatile unsigned char     status_pipe_number;
	volatile char              filler_0[4];
	volatile short             command;
	volatile char              filler_1[3];
	volatile char              interrupt_level;
	volatile char              filler_2[2];
	volatile short             init_info_ptr_h;
	volatile short             init_info_ptr_l;
	volatile char              filler_3[7];
	volatile char              interrupt_vec;
	volatile char              filler_4[6];
	volatile short             error_h;   
	volatile short             error_l;   
};

struct event_packet {
	volatile char              eye_catcher[4];
	volatile unsigned char     command_pipe_number;
	volatile unsigned char     status_pipe_number;
	volatile char              filler_0[4];
	volatile short             command;
	volatile char              filler_1[4];
	volatile char              device_number;
	volatile char              filler_2[19];
	volatile short             error_h;   
	volatile short             error_l;   
#define  E_INTR      0x0001
#define  E_QUIT      0x0002
#define  E_HUP       0x0004
#define  E_DCD       0x0008
#define  E_DSR       0x0010
#define  E_CTS       0x0020
#define  E_LOST_DCD  0x0040
#define  E_LOST_DSR  0x0080
#define  E_LOST_CTS  0x0100
#define  E_PR_FAULT  0x0200
#define  E_PR_POUT   0x0400
#define  E_PR_SELECT 0x0800
#define  E_SWITCH    0x4000
#define  E_BREAK     0x8000
	volatile unsigned short    event_code;		/* returned from IPC */
};

struct open_packet {
	volatile char              eye_catcher[4];
	volatile unsigned char     command_pipe_number;
	volatile unsigned char     status_pipe_number;
	volatile char              filler_0[4];
	volatile short             command;
	volatile char              filler_1[4];
	volatile char              device_number;
   volatile char              filler_2[19];
	volatile short             error_h;   
	volatile short             error_l;   
	volatile unsigned short    event_code;		/* returned from IPC */
};

struct close_packet {
	volatile char              eye_catcher[4];
	volatile unsigned char     command_pipe_number;
	volatile unsigned char     status_pipe_number;
	volatile char              filler_0[4];
	volatile short             command;
	volatile char              filler_1[4];
	volatile char              device_number;
   volatile char              filler_2[19];
	volatile short             error_h;   
	volatile short             error_l;   
	volatile unsigned short    event_code;		/* returned from IPC */
};

struct read_wakeup_packet {
	volatile char              eye_catcher[4];
	volatile unsigned char     command_pipe_number;
	volatile unsigned char     status_pipe_number;
	volatile char              filler_0[4];
	volatile short             command;
	volatile char              filler_1[4];
	volatile char              device_number;
   volatile char              filler_2[19];
	volatile short             error_h;   
	volatile short             error_l;   
};

struct write_wakeup_packet {
	volatile char              eye_catcher[4];
	volatile unsigned char     command_pipe_number;
	volatile unsigned char     status_pipe_number;
	volatile char              filler_0[4];
	volatile short             command;
	volatile char              filler_1[4];
	volatile char              device_number;
   volatile char              filler_2[19];
	volatile short             error_h;   
	volatile short             error_l;   
};

/*
 * All structures must reside in dual port user memory. 
 * ($FFxx0100 to $FFxxFFF0)
 * All structures must be word aligned (see byte counts above)
 *
 *       +--------------------------------+
 *       |  IPC Control/Status Register   | $FFxx0000
 *       |          (16 bytes)            |
 *       |--------------------------------|
 *       |  Confidence Test Descriptor    | $FFxx0010
 *       |          (32 bytes)            |
 *       |--------------------------------|
 *       |          Dump Area             | $FFxx0030
 *       |         (208 bytes)            |
 *       |--------------------------------|
 *       |                                | $FFxx0100
 *       |                                |
 *       :          User Space            :
 *       :                                :
 *       :        (65,264 bytes)          :
 *       |                                |
 *       |                                |
 *       |--------------------------------|
 *       |  Interrupt Vector Registers    | $FFxxFFF0
 *       |          (16 bytes)            |
 *       +--------------------------------+
 */
#define  ALIGNIT(p)           (((u_int)(p) + 7) & ~7)

#define  NENVELOPES           30
#define  NPACKETS             NENVELOPES
#define  USER_AREA            (sc->board_addr + 0x0100)
#define  CHANNEL_H            (sc->board_addr + 0x0100)
#define  ENVELOPE_AREA        (CHANNEL_H + sizeof(struct channel))
#define  ENVELOPE_AREA_SIZE   (NENVELOPES * sizeof(struct envelope))
#define  PACKET_AREA          (ENVELOPE_AREA + ENVELOPE_AREA_SIZE)
#define  PACKET_AREA_SIZE     (NPACKETS * sizeof(struct packet))
#define  INIT_INFO_AREA       (PACKET_AREA + PACKET_AREA_SIZE)
#define  INIT_INFO_AREA_SIZE  (9 * sizeof(struct init_info))
#define  WRING_AREA           ALIGNIT(INIT_INFO_AREA + INIT_INFO_AREA_SIZE)
#define  WRING_AREA_SIZE      (9 * sizeof(struct wring))
#define  RRING_AREA           (WRING_AREA + WRING_AREA_SIZE)
#define  RRING_AREA_SIZE      (9 * sizeof(struct rring))
#define  USER_AREA_SIZE       (RRING_AREA + RRING_AREA_SIZE - USER_AREA)

#define  LO(x) (u_short)((unsigned long)x & 0x0000FFFF)
#define  HI(x) (u_short)((unsigned long)x >> 16)