iopreg.h revision 1.2.8.2 1 1.2.8.2 briggs /* $NetBSD: iopreg.h,v 1.2.8.2 1999/06/28 04:33:22 briggs Exp $ */
2 1.2.8.2 briggs
3 1.2.8.2 briggs /*
4 1.2.8.2 briggs * Freely contributed to The NetBSD Foundation.
5 1.2.8.2 briggs * XXX - Do paperwork and put a proper copyright here.
6 1.2.8.2 briggs */
7 1.2.8.2 briggs
8 1.2.8.2 briggs #include <sys/pool.h>
9 1.2.8.2 briggs #include <sys/queue.h>
10 1.2.8.2 briggs
11 1.2.8.2 briggs #define IOP1_BASE 0x00004000
12 1.2.8.2 briggs
13 1.2.8.2 briggs #define SCC_IOP 0
14 1.2.8.2 briggs #define ISM_IOP 1
15 1.2.8.2 briggs
16 1.2.8.2 briggs #define IOP_CS_BYPASS 0x01
17 1.2.8.2 briggs #define IOP_CS_AUTOINC 0x02
18 1.2.8.2 briggs #define IOP_CS_RUN 0x04
19 1.2.8.2 briggs #define IOP_CS_IRQ 0x08
20 1.2.8.2 briggs #define IOP_CS_INT0 0x10
21 1.2.8.2 briggs #define IOP_CS_INT1 0x20
22 1.2.8.2 briggs #define IOP_CS_HWINT 0x40
23 1.2.8.2 briggs #define IOP_CS_DMAINACT 0x80
24 1.2.8.2 briggs
25 1.2.8.2 briggs #define IOP_RESET (IOP_CS_DMAINACT | IOP_CS_AUTOINC)
26 1.2.8.2 briggs #define IOP_BYPASS \
27 1.2.8.2 briggs (IOP_CS_BYPASS | IOP_CS_AUTOINC | IOP_CS_RUN | IOP_CS_DMAINACT)
28 1.2.8.2 briggs #define IOP_INTERRUPT (IOP_CS_INT0 | IOP_CS_INT1)
29 1.2.8.2 briggs
30 1.2.8.2 briggs #define OSS_INTLEVEL_OFFSET 0x0001A006
31 1.2.8.2 briggs
32 1.2.8.2 briggs typedef struct {
33 1.2.8.2 briggs volatile u_char ram_hi;
34 1.2.8.2 briggs u_char pad0;
35 1.2.8.2 briggs volatile u_char ram_lo;
36 1.2.8.2 briggs u_char pad1;
37 1.2.8.2 briggs volatile u_char control_status;
38 1.2.8.2 briggs u_char pad2[3];
39 1.2.8.2 briggs volatile u_char data;
40 1.2.8.2 briggs u_char pad3[23];
41 1.2.8.2 briggs union {
42 1.2.8.2 briggs struct {
43 1.2.8.2 briggs volatile u_char sccb_cmd;
44 1.2.8.2 briggs u_char pad0;
45 1.2.8.2 briggs volatile u_char scca_cmd;
46 1.2.8.2 briggs u_char pad1;
47 1.2.8.2 briggs volatile u_char sccb_data;
48 1.2.8.2 briggs u_char pad2;
49 1.2.8.2 briggs volatile u_char scca_data;
50 1.2.8.2 briggs u_char pad3;
51 1.2.8.2 briggs } scc;
52 1.2.8.2 briggs struct {
53 1.2.8.2 briggs volatile u_char wdata;
54 1.2.8.2 briggs u_char pad0;
55 1.2.8.2 briggs /* etc... */
56 1.2.8.2 briggs } iwm;
57 1.2.8.2 briggs } bypass;
58 1.2.8.2 briggs } IOPHW;
59 1.2.8.2 briggs
60 1.2.8.2 briggs #define IOP_MAXCHAN 7
61 1.2.8.2 briggs #define IOP_MAXMSG 8
62 1.2.8.2 briggs #define IOP_MSGLEN 32
63 1.2.8.2 briggs #define IOP_MSGBUFLEN (IOP_MSGLEN * IOP_MAXCHAN)
64 1.2.8.2 briggs
65 1.2.8.2 briggs #define IOP_MSG_IDLE 0 /* idle */
66 1.2.8.2 briggs #define IOP_MSG_NEW 1 /* new message sent */
67 1.2.8.2 briggs #define IOP_MSG_RECEIVED 2 /* message received; processing */
68 1.2.8.2 briggs #define IOP_MSG_COMPLETE 3 /* message processing complete */
69 1.2.8.2 briggs
70 1.2.8.2 briggs #define IOP_ADDR_MAX_SEND_CHAN 0x200
71 1.2.8.2 briggs #define IOP_ADDR_SEND_STATE 0x201
72 1.2.8.2 briggs #define IOP_ADDR_PATCH_CTRL 0x21F
73 1.2.8.2 briggs #define IOP_ADDR_SEND_MSG 0x220
74 1.2.8.2 briggs #define IOP_ADDR_MAX_RECV_CHAN 0x300
75 1.2.8.2 briggs #define IOP_ADDR_RECV_STATE 0x301
76 1.2.8.2 briggs #define IOP_ADDR_ALIVE 0x31F
77 1.2.8.2 briggs #define IOP_ADDR_RECV_MSG 0x320
78 1.2.8.2 briggs
79 1.2.8.2 briggs typedef struct {
80 1.2.8.2 briggs u_char pad1[0x200];
81 1.2.8.2 briggs u_char max_send_chan; /* maximum send channel # */
82 1.2.8.2 briggs u_char send_state[IOP_MAXCHAN]; /* send channel states */
83 1.2.8.2 briggs u_char pad2[23];
84 1.2.8.2 briggs u_char patch_ctrl; /* patch control flag */
85 1.2.8.2 briggs u_char send_msg[IOP_MSGBUFLEN]; /* send channel message data */
86 1.2.8.2 briggs u_char max_recv_chan; /* max. receive channel # */
87 1.2.8.2 briggs u_char recv_state[IOP_MAXCHAN]; /* receive channel states */
88 1.2.8.2 briggs u_char pad3[23];
89 1.2.8.2 briggs u_char alive; /* IOP alive flag */
90 1.2.8.2 briggs u_char recv_msg[IOP_MSGBUFLEN]; /* receive channel msg data */
91 1.2.8.2 briggs } IOPK;
92 1.2.8.2 briggs
93 1.2.8.2 briggs struct iop_msg;
94 1.2.8.2 briggs struct _s_IOP;
95 1.2.8.2 briggs
96 1.2.8.2 briggs typedef void (*iop_msg_handler)(struct _s_IOP *iop, struct iop_msg *);
97 1.2.8.2 briggs
98 1.2.8.2 briggs struct iop_msg {
99 1.2.8.2 briggs SIMPLEQ_ENTRY(iop_msg) iopm;
100 1.2.8.2 briggs int channel;
101 1.2.8.2 briggs int status;
102 1.2.8.2 briggs u_char msg[IOP_MSGLEN];
103 1.2.8.2 briggs
104 1.2.8.2 briggs /* The routine that will handle the message */
105 1.2.8.2 briggs iop_msg_handler handler;
106 1.2.8.2 briggs void *user_data;
107 1.2.8.2 briggs };
108 1.2.8.2 briggs
109 1.2.8.2 briggs #define IOP_MSGSTAT_IDLE 0 /* Message unused (invalid) */
110 1.2.8.2 briggs #define IOP_MSGSTAT_QUEUED 1 /* Message queued for send */
111 1.2.8.2 briggs #define IOP_MSGSTAT_SENDING 2 /* Message on IOP */
112 1.2.8.2 briggs #define IOP_MSGSTAT_SENT 3 /* Message complete */
113 1.2.8.2 briggs #define IOP_MSGSTAT_RECEIVING 4 /* Top of receive queue */
114 1.2.8.2 briggs #define IOP_MSGSTAT_RECEIVED 5 /* Msg received */
115 1.2.8.2 briggs #define IOP_MSGSTAT_UNEXPECTED 6 /* Unexpected msg received */
116 1.2.8.2 briggs
117 1.2.8.2 briggs typedef struct _s_IOP {
118 1.2.8.2 briggs IOPHW *iop;
119 1.2.8.2 briggs struct pool pool;
120 1.2.8.2 briggs SIMPLEQ_HEAD(, iop_msg) sendq[IOP_MAXCHAN];
121 1.2.8.2 briggs SIMPLEQ_HEAD(, iop_msg) recvq[IOP_MAXCHAN];
122 1.2.8.2 briggs iop_msg_handler listeners[IOP_MAXCHAN];
123 1.2.8.2 briggs void *listener_data[IOP_MAXCHAN];
124 1.2.8.2 briggs struct iop_msg unsolicited_msg;
125 1.2.8.2 briggs } IOP;
126 1.2.8.2 briggs
127 1.2.8.2 briggs #define IOP_LOADADDR(ioph,addr) (ioph->ram_lo = addr & 0xff, \
128 1.2.8.2 briggs ioph->ram_hi = (addr >> 8) & 0xff)
129 1.2.8.2 briggs
130 1.2.8.2 briggs void iop_init __P((int fullinit));
131 1.2.8.2 briggs void iop_upload __P((int iop, u_char *mem, u_long nb, u_long iopbase));
132 1.2.8.2 briggs void iop_download __P((int iop, u_char *mem, u_long nb, u_long iopbase));
133 1.2.8.2 briggs int iop_send_msg __P((int iopn, int chan, u_char *msg, int msglen,
134 1.2.8.2 briggs iop_msg_handler handler, void *udata));
135 1.2.8.2 briggs int iop_queue_receipt __P((int iopn, int chan, iop_msg_handler handler,
136 1.2.8.2 briggs void *user_data));
137 1.2.8.2 briggs int iop_register_listener __P((int iopn, int chan, iop_msg_handler handler,
138 1.2.8.2 briggs void *user_data));
139 1.2.8.2 briggs
140 1.2.8.2 briggs /* ADB support */
141 1.2.8.2 briggs #define IOP_CHAN_ADB 2
142 1.2.8.2 briggs
143 1.2.8.2 briggs #define IOP_ADB_FL_EXPLICIT 0x80 /* Non-zero if explicit command */
144 1.2.8.2 briggs #define IOP_ADB_FL_AUTOPOLL 0x40 /* Auto/SRQ polling enabled */
145 1.2.8.2 briggs #define IOP_ADB_FL_SRQ 0x04 /* SRQ detected */
146 1.2.8.2 briggs #define IOP_ADB_FL_TIMEOUT 0x02 /* Non-zero if timeout */
147 1.2.8.2 briggs
148 1.2.8.2 briggs /*
149 1.2.8.2 briggs * The structure of an ADB packet to/from the IOP is:
150 1.2.8.2 briggs * Flag byte (values above)
151 1.2.8.2 briggs * Count of bytes in data
152 1.2.8.2 briggs * Command byte
153 1.2.8.2 briggs * Data (optional)
154 1.2.8.2 briggs */
155