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