iopreg.h revision 1.7 1 1.7 christos /* $NetBSD: iopreg.h,v 1.7 2005/12/11 12:18:03 christos Exp $ */
2 1.2 briggs
3 1.2 briggs /*
4 1.4 briggs * Copyright (c) 2000 Allen Briggs.
5 1.4 briggs * All rights reserved.
6 1.4 briggs *
7 1.4 briggs * Redistribution and use in source and binary forms, with or without
8 1.4 briggs * modification, are permitted provided that the following conditions
9 1.4 briggs * are met:
10 1.4 briggs * 1. Redistributions of source code must retain the above copyright
11 1.4 briggs * notice, this list of conditions and the following disclaimer.
12 1.4 briggs * 2. Redistributions in binary form must reproduce the above copyright
13 1.4 briggs * notice, this list of conditions and the following disclaimer in the
14 1.4 briggs * documentation and/or other materials provided with the distribution.
15 1.4 briggs * 3. The name of the author may not be used to endorse or promote products
16 1.4 briggs * derived from this software without specific prior written permission.
17 1.4 briggs *
18 1.4 briggs * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19 1.4 briggs * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20 1.4 briggs * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21 1.4 briggs * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22 1.4 briggs * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23 1.4 briggs * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 1.4 briggs * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 1.4 briggs * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 1.4 briggs * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 1.4 briggs * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 1.2 briggs */
29 1.1 briggs
30 1.1 briggs #define IOP1_BASE 0x00004000
31 1.1 briggs
32 1.1 briggs #define SCC_IOP 0
33 1.1 briggs #define ISM_IOP 1
34 1.1 briggs
35 1.1 briggs #define IOP_CS_BYPASS 0x01
36 1.1 briggs #define IOP_CS_AUTOINC 0x02
37 1.1 briggs #define IOP_CS_RUN 0x04
38 1.1 briggs #define IOP_CS_IRQ 0x08
39 1.1 briggs #define IOP_CS_INT0 0x10
40 1.1 briggs #define IOP_CS_INT1 0x20
41 1.1 briggs #define IOP_CS_HWINT 0x40
42 1.1 briggs #define IOP_CS_DMAINACT 0x80
43 1.1 briggs
44 1.1 briggs #define IOP_RESET (IOP_CS_DMAINACT | IOP_CS_AUTOINC)
45 1.1 briggs #define IOP_BYPASS \
46 1.1 briggs (IOP_CS_BYPASS | IOP_CS_AUTOINC | IOP_CS_RUN | IOP_CS_DMAINACT)
47 1.1 briggs #define IOP_INTERRUPT (IOP_CS_INT0 | IOP_CS_INT1)
48 1.1 briggs
49 1.1 briggs #define OSS_INTLEVEL_OFFSET 0x0001A006
50 1.1 briggs
51 1.1 briggs typedef struct {
52 1.1 briggs volatile u_char ram_hi;
53 1.1 briggs u_char pad0;
54 1.1 briggs volatile u_char ram_lo;
55 1.1 briggs u_char pad1;
56 1.1 briggs volatile u_char control_status;
57 1.1 briggs u_char pad2[3];
58 1.1 briggs volatile u_char data;
59 1.1 briggs u_char pad3[23];
60 1.1 briggs union {
61 1.1 briggs struct {
62 1.1 briggs volatile u_char sccb_cmd;
63 1.1 briggs u_char pad0;
64 1.1 briggs volatile u_char scca_cmd;
65 1.1 briggs u_char pad1;
66 1.1 briggs volatile u_char sccb_data;
67 1.1 briggs u_char pad2;
68 1.1 briggs volatile u_char scca_data;
69 1.1 briggs u_char pad3;
70 1.1 briggs } scc;
71 1.1 briggs struct {
72 1.1 briggs volatile u_char wdata;
73 1.1 briggs u_char pad0;
74 1.1 briggs /* etc... */
75 1.1 briggs } iwm;
76 1.1 briggs } bypass;
77 1.1 briggs } IOPHW;
78 1.1 briggs
79 1.1 briggs #define IOP_MAXCHAN 7
80 1.1 briggs #define IOP_MAXMSG 8
81 1.1 briggs #define IOP_MSGLEN 32
82 1.1 briggs #define IOP_MSGBUFLEN (IOP_MSGLEN * IOP_MAXCHAN)
83 1.1 briggs
84 1.1 briggs #define IOP_MSG_IDLE 0 /* idle */
85 1.1 briggs #define IOP_MSG_NEW 1 /* new message sent */
86 1.1 briggs #define IOP_MSG_RECEIVED 2 /* message received; processing */
87 1.1 briggs #define IOP_MSG_COMPLETE 3 /* message processing complete */
88 1.1 briggs
89 1.1 briggs #define IOP_ADDR_MAX_SEND_CHAN 0x200
90 1.1 briggs #define IOP_ADDR_SEND_STATE 0x201
91 1.1 briggs #define IOP_ADDR_PATCH_CTRL 0x21F
92 1.1 briggs #define IOP_ADDR_SEND_MSG 0x220
93 1.1 briggs #define IOP_ADDR_MAX_RECV_CHAN 0x300
94 1.1 briggs #define IOP_ADDR_RECV_STATE 0x301
95 1.1 briggs #define IOP_ADDR_ALIVE 0x31F
96 1.1 briggs #define IOP_ADDR_RECV_MSG 0x320
97 1.1 briggs
98 1.1 briggs typedef struct {
99 1.1 briggs u_char pad1[0x200];
100 1.1 briggs u_char max_send_chan; /* maximum send channel # */
101 1.1 briggs u_char send_state[IOP_MAXCHAN]; /* send channel states */
102 1.1 briggs u_char pad2[23];
103 1.1 briggs u_char patch_ctrl; /* patch control flag */
104 1.1 briggs u_char send_msg[IOP_MSGBUFLEN]; /* send channel message data */
105 1.1 briggs u_char max_recv_chan; /* max. receive channel # */
106 1.1 briggs u_char recv_state[IOP_MAXCHAN]; /* receive channel states */
107 1.1 briggs u_char pad3[23];
108 1.1 briggs u_char alive; /* IOP alive flag */
109 1.1 briggs u_char recv_msg[IOP_MSGBUFLEN]; /* receive channel msg data */
110 1.1 briggs } IOPK;
111 1.1 briggs
112 1.1 briggs struct iop_msg;
113 1.1 briggs struct _s_IOP;
114 1.1 briggs
115 1.1 briggs typedef void (*iop_msg_handler)(struct _s_IOP *iop, struct iop_msg *);
116 1.1 briggs
117 1.1 briggs struct iop_msg {
118 1.1 briggs SIMPLEQ_ENTRY(iop_msg) iopm;
119 1.1 briggs int channel;
120 1.1 briggs int status;
121 1.1 briggs u_char msg[IOP_MSGLEN];
122 1.1 briggs
123 1.1 briggs /* The routine that will handle the message */
124 1.1 briggs iop_msg_handler handler;
125 1.1 briggs void *user_data;
126 1.1 briggs };
127 1.1 briggs
128 1.1 briggs #define IOP_MSGSTAT_IDLE 0 /* Message unused (invalid) */
129 1.1 briggs #define IOP_MSGSTAT_QUEUED 1 /* Message queued for send */
130 1.1 briggs #define IOP_MSGSTAT_SENDING 2 /* Message on IOP */
131 1.1 briggs #define IOP_MSGSTAT_SENT 3 /* Message complete */
132 1.1 briggs #define IOP_MSGSTAT_RECEIVING 4 /* Top of receive queue */
133 1.1 briggs #define IOP_MSGSTAT_RECEIVED 5 /* Msg received */
134 1.1 briggs #define IOP_MSGSTAT_UNEXPECTED 6 /* Unexpected msg received */
135 1.1 briggs
136 1.1 briggs typedef struct _s_IOP {
137 1.1 briggs IOPHW *iop;
138 1.1 briggs struct pool pool;
139 1.1 briggs SIMPLEQ_HEAD(, iop_msg) sendq[IOP_MAXCHAN];
140 1.1 briggs SIMPLEQ_HEAD(, iop_msg) recvq[IOP_MAXCHAN];
141 1.1 briggs iop_msg_handler listeners[IOP_MAXCHAN];
142 1.1 briggs void *listener_data[IOP_MAXCHAN];
143 1.1 briggs struct iop_msg unsolicited_msg;
144 1.1 briggs } IOP;
145 1.1 briggs
146 1.1 briggs #define IOP_LOADADDR(ioph,addr) (ioph->ram_lo = addr & 0xff, \
147 1.1 briggs ioph->ram_hi = (addr >> 8) & 0xff)
148 1.1 briggs
149 1.5 chs void iop_init(int);
150 1.5 chs void iop_upload(int, u_char *, u_long, u_long);
151 1.5 chs void iop_download(int, u_char *, u_long, u_long);
152 1.5 chs int iop_send_msg(int, int, u_char *, int, iop_msg_handler, void *);
153 1.5 chs int iop_queue_receipt(int, int, iop_msg_handler, void *);
154 1.5 chs int iop_register_listener(int, int, iop_msg_handler, void *);
155 1.1 briggs
156 1.6 rjs /* SWIM support */
157 1.6 rjs #define IOP_CHAN_SWIM 1
158 1.6 rjs
159 1.6 rjs #define IOP_SWIM_INITIALIZE 0x01
160 1.6 rjs #define IOP_SWIM_SHUTDOWN 0x02
161 1.6 rjs #define IOP_SWIM_START_POLLING 0x03
162 1.6 rjs #define IOP_SWIM_STOP_POLLING 0x04
163 1.6 rjs #define IOP_SWIM_SET_HFS_TAG_ADDR 0x05
164 1.6 rjs #define IOP_SWIM_DRIVE_STATUS 0x06
165 1.6 rjs #define IOP_SWIM_EJECT 0x07
166 1.6 rjs #define IOP_SWIM_FORMAT 0x08
167 1.6 rjs #define IOP_SWIM_FORMAT_VERIFY 0x09
168 1.6 rjs #define IOP_SWIM_WRITE 0x0a
169 1.6 rjs #define IOP_SWIM_READ 0x0b
170 1.6 rjs #define IOP_SWIM_READ_VERIFY 0x0c
171 1.6 rjs #define IOP_SWIM_CACHE_CONTROL 0x0d
172 1.6 rjs #define IOP_SWIM_TAG_BUFFER_CONTROL 0x0e
173 1.6 rjs #define IOP_SWIM_GET_ICON 0x0f
174 1.6 rjs #define IOP_SWIM_DISK_DUP_INFO 0x10
175 1.6 rjs #define IOP_SWIM_GET_RAW_DATA 0x11
176 1.6 rjs
177 1.6 rjs /*
178 1.6 rjs * The structure of a SWIM packet to/from the IOP is:
179 1.6 rjs * Request kind
180 1.6 rjs * Drive Number (if needed)
181 1.6 rjs * Error Code
182 1.6 rjs * Data (optional)
183 1.6 rjs */
184 1.6 rjs
185 1.1 briggs /* ADB support */
186 1.1 briggs #define IOP_CHAN_ADB 2
187 1.1 briggs
188 1.1 briggs #define IOP_ADB_FL_EXPLICIT 0x80 /* Non-zero if explicit command */
189 1.1 briggs #define IOP_ADB_FL_AUTOPOLL 0x40 /* Auto/SRQ polling enabled */
190 1.6 rjs #define IOP_ADB_FL_POLL_UPDATE 0x20 /* Update polling bit mask */
191 1.1 briggs #define IOP_ADB_FL_SRQ 0x04 /* SRQ detected */
192 1.1 briggs #define IOP_ADB_FL_TIMEOUT 0x02 /* Non-zero if timeout */
193 1.1 briggs
194 1.1 briggs /*
195 1.1 briggs * The structure of an ADB packet to/from the IOP is:
196 1.1 briggs * Flag byte (values above)
197 1.1 briggs * Count of bytes in data
198 1.1 briggs * Command byte
199 1.1 briggs * Data (optional)
200 1.1 briggs */
201