dptreg.h revision 1.1 1 1.1 ad /* $NetBSD: dptreg.h,v 1.1 1999/09/27 23:41:47 ad Exp $ */
2 1.1 ad
3 1.1 ad /*
4 1.1 ad * Copyright (c) 1999 Andy Doran <ad (at) NetBSD.org>
5 1.1 ad * All rights reserved.
6 1.1 ad *
7 1.1 ad * Redistribution and use in source and binary forms, with or without
8 1.1 ad * modification, are permitted provided that the following conditions
9 1.1 ad * are met:
10 1.1 ad * 1. Redistributions of source code must retain the above copyright
11 1.1 ad * notice, this list of conditions and the following disclaimer.
12 1.1 ad * 2. Redistributions in binary form must reproduce the above copyright
13 1.1 ad * notice, this list of conditions and the following disclaimer in the
14 1.1 ad * documentation and/or other materials provided with the distribution.
15 1.1 ad *
16 1.1 ad * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17 1.1 ad * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 1.1 ad * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 1.1 ad * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20 1.1 ad * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 1.1 ad * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 1.1 ad * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 1.1 ad * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 1.1 ad * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 1.1 ad * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 1.1 ad * SUCH DAMAGE.
27 1.1 ad *
28 1.1 ad */
29 1.1 ad
30 1.1 ad #ifndef _IC_DPTREG_H_
31 1.1 ad #define _IC_DPTREG_H_ 1
32 1.1 ad
33 1.1 ad /* Hardware limits */
34 1.1 ad #define DPT_MAX_TARGETS 16
35 1.1 ad #define DPT_MAX_LUNS 8
36 1.1 ad #define DPT_MAX_CHANNELS 3
37 1.1 ad
38 1.1 ad /* Software parameters */
39 1.1 ad #define DPT_MAX_XFER ((DPT_SG_SIZE - 1) << PGSHIFT)
40 1.1 ad #define DPT_MAX_CCBS 256
41 1.1 ad #define DPT_SG_SIZE 64
42 1.1 ad #define DPT_ABORT_TIMEOUT 2000
43 1.1 ad
44 1.1 ad #ifdef _KERNEL
45 1.1 ad
46 1.1 ad #if BYTE_ORDER == LITTLE_ENDIAN
47 1.1 ad #define SWAP32(x) bswap32((x))
48 1.1 ad #define SWAP16(x) bswap16((x))
49 1.1 ad #define RSWAP32(x) (x)
50 1.1 ad #define RSWAP16(x) (x)
51 1.1 ad #else
52 1.1 ad #define SWAP32(x) (x)
53 1.1 ad #define SWAP16(x) (x)
54 1.1 ad #define RSWAP32(x) bswap32((x))
55 1.1 ad #define RSWAP16(x) bswap16((x))
56 1.1 ad #endif
57 1.1 ad
58 1.1 ad #define dpt_inb(x, o) \
59 1.1 ad bus_space_read_1((x)->sc_iot, (x)->sc_ioh, (o))
60 1.1 ad
61 1.1 ad #define dpt_inw(x, o) \
62 1.1 ad RSWAP16(bus_space_read_2((x)->sc_iot, (x)->sc_ioh, (o)))
63 1.1 ad
64 1.1 ad #define dpt_inl(x, o) \
65 1.1 ad RSWAP32(bus_space_read_4((x)->sc_iot, (x)->sc_ioh, (o)))
66 1.1 ad
67 1.1 ad #define dpt_outb(x, o, d) \
68 1.1 ad bus_space_write_1((x)->sc_iot, (x)->sc_ioh, (o), (d))
69 1.1 ad
70 1.1 ad #define dpt_outw(x, o, d) \
71 1.1 ad bus_space_write_2((x)->sc_iot, (x)->sc_ioh, (o), RSWAP16(d))
72 1.1 ad
73 1.1 ad #define dpt_outl(x, o, d) \
74 1.1 ad bus_space_write_4((x)->sc_iot, (x)->sc_ioh, (o), RSWAP32(d))
75 1.1 ad
76 1.1 ad #endif /* _KERNEL */
77 1.1 ad
78 1.1 ad /*
79 1.1 ad * HBA registers
80 1.1 ad */
81 1.1 ad #define HA_BASE 0x10
82 1.1 ad #define HA_DATA (HA_BASE + 0)
83 1.1 ad #define HA_ERROR (HA_BASE + 1)
84 1.1 ad #define HA_DMA_BASE (HA_BASE + 2)
85 1.1 ad #define HA_ICMD_CODE2 (HA_BASE + 4)
86 1.1 ad #define HA_ICMD_CODE1 (HA_BASE + 5)
87 1.1 ad #define HA_ICMD (HA_BASE + 6)
88 1.1 ad
89 1.1 ad /* EATA commands. There are many more the we don't define or use. */
90 1.1 ad #define HA_COMMAND (HA_BASE + 7)
91 1.1 ad #define CP_PIO_GETCFG 0xf0 /* Read configuration data, PIO */
92 1.1 ad #define CP_PIO_CMD 0xf2 /* Execute command, PIO */
93 1.1 ad #define CP_DMA_GETCFG 0xfd /* Read configuration data, DMA */
94 1.1 ad #define CP_DMA_CMD 0xff /* Execute command, DMA */
95 1.1 ad #define CP_PIO_TRUNCATE 0xf4 /* Truncate transfer command, PIO */
96 1.1 ad #define CP_RESET 0xf9 /* Reset controller and SCSI bus */
97 1.1 ad #define CP_REBOOT 0x06 /* Reboot controller (last resort) */
98 1.1 ad #define CP_IMMEDIATE 0xfa /* EATA immediate command */
99 1.1 ad #define CPI_GEN_ABORT 0x00 /* Generic abort */
100 1.1 ad #define CPI_SPEC_RESET 0x01 /* Specific reset */
101 1.1 ad #define CPI_BUS_RESET 0x02 /* Bus reset */
102 1.1 ad #define CPI_SPEC_ABORT 0x03 /* Specific abort */
103 1.1 ad #define CPI_QUIET_INTR 0x04 /* ?? */
104 1.1 ad #define CPI_ROM_DL_EN 0x05 /* ?? */
105 1.1 ad #define CPI_COLD_BOOT 0x06 /* Cold boot HBA */
106 1.1 ad #define CPI_FORCE_IO 0x07 /* ?? */
107 1.1 ad #define CPI_BUS_OFFLINE 0x08 /* Set SCSI bus offline */
108 1.1 ad #define CPI_RESET_MSKD_BUS 0x09 /* Reset masked bus */
109 1.1 ad #define CPI_POWEROFF_WARN 0x0a /* Power about to fail */
110 1.1 ad
111 1.1 ad #define HA_STATUS (HA_BASE + 7)
112 1.1 ad #define HA_ST_ERROR 0x01
113 1.1 ad #define HA_ST_INDEX 0x02
114 1.1 ad #define HA_ST_CORRECTD 0x04
115 1.1 ad #define HA_ST_DRQ 0x08
116 1.1 ad #define HA_ST_SEEK_COMPLETE 0x10
117 1.1 ad #define HA_ST_WRT_FLT 0x20
118 1.1 ad #define HA_ST_READY 0x40
119 1.1 ad #define HA_ST_BUSY 0x80
120 1.1 ad #define HA_ST_DATA_RDY (HA_ST_SEEK_COMPLETE|HA_ST_READY|HA_ST_DRQ)
121 1.1 ad
122 1.1 ad #define HA_AUX_STATUS (HA_BASE + 8)
123 1.1 ad #define HA_AUX_BUSY 0x01
124 1.1 ad #define HA_AUX_INTR 0x02
125 1.1 ad
126 1.1 ad /*
127 1.1 ad * Structure of an EATA command packet.
128 1.1 ad */
129 1.1 ad struct eata_cp {
130 1.1 ad u_int8_t cp_scsireset :1; /* cause a bus reset */
131 1.1 ad u_int8_t cp_hbainit :1; /* cause HBA to reinitialize */
132 1.1 ad u_int8_t cp_autosense :1; /* auto request sense on err */
133 1.1 ad u_int8_t cp_scatter :1; /* doing SG I/O */
134 1.1 ad u_int8_t cp_quick :1; /* return no status packet */
135 1.1 ad u_int8_t cp_interpret :1; /* HBA interprets SCSI CDB */
136 1.1 ad u_int8_t cp_dataout :1; /* data out phase */
137 1.1 ad u_int8_t cp_datain :1; /* data in phase */
138 1.1 ad u_int8_t cp_senselen; /* request sense length */
139 1.1 ad u_int8_t cp_unused0[3]; /* unused */
140 1.1 ad u_int8_t cp_tophys :1; /* send to RAID component */
141 1.1 ad u_int8_t cp_unused1 :7; /* unused */
142 1.1 ad u_int8_t cp_physunit :1; /* phys unit on mirrored pair */
143 1.1 ad u_int8_t cp_noat :1; /* no address translation */
144 1.1 ad u_int8_t cp_nocache :1; /* no HBA caching */
145 1.1 ad u_int8_t cp_unused2 :5; /* unused */
146 1.1 ad u_int8_t cp_id :5; /* SCSI device id of target */
147 1.1 ad u_int8_t cp_channel :3; /* SCSI channel id */
148 1.1 ad u_int8_t cp_lun :3; /* SCSI LUN id */
149 1.1 ad u_int8_t cp_unused3 :2; /* unused */
150 1.1 ad u_int8_t cp_luntar :1; /* CP is for target ROUTINE */
151 1.1 ad u_int8_t cp_dispri :1; /* give disconnect privilege */
152 1.1 ad u_int8_t cp_identify :1; /* always true */
153 1.1 ad u_int8_t cp_msg[3]; /* message bytes 0-3 */
154 1.1 ad
155 1.1 ad /* Partial SCSI CDB ref */
156 1.1 ad u_int8_t cp_scsi_cmd;
157 1.1 ad u_int8_t cp_extent :1;
158 1.1 ad u_int8_t cp_bytchk :1;
159 1.1 ad u_int8_t cp_reladr :1;
160 1.1 ad u_int8_t cp_cmplst :1;
161 1.1 ad u_int8_t cp_fmtdata :1;
162 1.1 ad u_int8_t cp_cdblun :3;
163 1.1 ad u_int8_t cp_page;
164 1.1 ad u_int8_t cp_unused4;
165 1.1 ad u_int8_t cp_len;
166 1.1 ad u_int8_t cp_link :1;
167 1.1 ad u_int8_t cp_flag :1;
168 1.1 ad u_int8_t cp_unused5 :4;
169 1.1 ad u_int8_t cp_vendor :2;
170 1.1 ad u_int8_t cp_cdbmore[6];
171 1.1 ad
172 1.1 ad u_int32_t cp_datalen; /* length in bytes of data/SG list */
173 1.1 ad u_int32_t cp_ccbid; /* ID of software CCB */
174 1.1 ad u_int32_t cp_dataaddr; /* address of data/SG list */
175 1.1 ad u_int32_t cp_stataddr; /* addr for status packet */
176 1.1 ad u_int32_t cp_senseaddr; /* addr of req. sense (err only) */
177 1.1 ad };
178 1.1 ad
179 1.1 ad /*
180 1.1 ad * EATA status packet as returned by controller upon command completion. It
181 1.1 ad * contains status, message info and a handle on the initiating CCB.
182 1.1 ad */
183 1.1 ad struct eata_sp {
184 1.1 ad u_int8_t sp_hba_status : 7; /* host adapter status */
185 1.1 ad u_int8_t sp_eoc : 1; /* end of command (unsafe) */
186 1.1 ad u_int8_t sp_scsi_status; /* SCSI bus status */
187 1.1 ad u_int8_t sp_reserved[2]; /* reserved */
188 1.1 ad u_int32_t sp_inv_residue; /* bytes not transfered */
189 1.1 ad u_int32_t sp_ccbid; /* ID of software CCB */
190 1.1 ad u_int8_t sp_id_message;
191 1.1 ad u_int8_t sp_que_message;
192 1.1 ad u_int8_t sp_tag_message;
193 1.1 ad u_int8_t sp_messages[9];
194 1.1 ad };
195 1.1 ad
196 1.1 ad /* HBA status as returned by status packet */
197 1.1 ad #define HA_NO_ERROR 0x00 /* No error on command */
198 1.1 ad #define HA_ERROR_SEL_TO 0x01 /* Device selection timeout */
199 1.1 ad #define HA_ERROR_CMD_TO 0x02 /* Device command timeout */
200 1.1 ad #define HA_ERROR_RESET 0x03 /* SCSI bus was reset */
201 1.1 ad #define HA_INIT_POWERUP 0x04 /* Initial controller power up */
202 1.1 ad #define HA_UNX_BUSPHASE 0x05 /* Unexpected bus phase */
203 1.1 ad #define HA_UNX_BUS_FREE 0x06 /* Unexpected bus free */
204 1.1 ad #define HA_BUS_PARITY 0x07 /* SCSI bus parity error */
205 1.1 ad #define HA_SCSI_HUNG 0x08 /* SCSI bus hung */
206 1.1 ad #define HA_UNX_MSGRJCT 0x09 /* Unexpected message reject */
207 1.1 ad #define HA_RESET_STUCK 0x0A /* SCSI bus reset stuck */
208 1.1 ad #define HA_RSENSE_FAIL 0x0B /* Auto-request sense failed */
209 1.1 ad #define HA_PARITY 0x0C /* HBA memory parity error */
210 1.1 ad #define HA_ABORT_NA 0x0D /* CP aborted - not on bus */
211 1.1 ad #define HA_ABORTED 0x0E /* CP aborted - was on bus */
212 1.1 ad #define HA_RESET_NA 0x0F /* CP reset - not on bus */
213 1.1 ad #define HA_RESET 0x10 /* CP reset - was on bus */
214 1.1 ad #define HA_ECC 0x11 /* HBA memory ECC error */
215 1.1 ad #define HA_PCI_PARITY 0x12 /* PCI parity error */
216 1.1 ad #define HA_PCI_MASTER 0x13 /* PCI master abort */
217 1.1 ad #define HA_PCI_TARGET 0x14 /* PCI target abort */
218 1.1 ad #define HA_PCI_SIGNAL_TARGET 0x15 /* PCI signalled target abort */
219 1.1 ad #define HA_ABORT 0x20 /* Software abort (too many retries) */
220 1.1 ad
221 1.1 ad /*
222 1.1 ad * Scatter-gather list element.
223 1.1 ad */
224 1.1 ad struct eata_sg {
225 1.1 ad u_int32_t sg_addr;
226 1.1 ad u_int32_t sg_len;
227 1.1 ad };
228 1.1 ad
229 1.1 ad /*
230 1.1 ad * EATA configuration data as returned by HBA. XXX this is bogus, some fields
231 1.1 ad * don't *seem* to be filled on my SmartCache III. Also, it doesn't sync up
232 1.1 ad * with the structure FreeBSD uses. [ad]
233 1.1 ad */
234 1.1 ad struct eata_cfg {
235 1.1 ad u_int8_t dc_devtype;
236 1.1 ad u_int8_t dc_pagecode;
237 1.1 ad u_int8_t dc_reserved0;
238 1.1 ad u_int8_t dc_cfglen; /* Length in bytes after this field */
239 1.1 ad u_int8_t dc_eatasig[4]; /* EATA signature */
240 1.1 ad u_int8_t dc_eataversion; /* EATA version number */
241 1.1 ad u_int8_t dc_overlapcmds : 1; /* Overlapped cmds supported */
242 1.1 ad u_int8_t dc_targetmode : 1; /* Target mode supported */
243 1.1 ad u_int8_t dc_trunnotrec : 1; /* Truncate cmd not supported */
244 1.1 ad u_int8_t dc_moresupported:1; /* More cmd supported */
245 1.1 ad u_int8_t dc_dmasupported : 1; /* DMA mode supported */
246 1.1 ad u_int8_t dc_dmanumvalid : 1; /* DMA channel field is valid */
247 1.1 ad u_int8_t dc_atadev : 1; /* This is an ATA device */
248 1.1 ad u_int8_t dc_hbavalid : 1; /* HBA field is valid */
249 1.1 ad u_int8_t dc_padlength[2]; /* Pad bytes for PIO cmds */
250 1.1 ad u_int8_t dc_hba[4]; /* Host adapter SCSI IDs */
251 1.1 ad u_int8_t dc_cplen[4]; /* Command packet length */
252 1.1 ad u_int8_t dc_splen[4]; /* Status packet length */
253 1.1 ad u_int8_t dc_queuedepth[2]; /* Controller queue depth */
254 1.1 ad u_int8_t dc_reserved1[2];
255 1.1 ad u_int8_t dc_sglen[2]; /* Maximum scatter gather list size */
256 1.1 ad u_int8_t dc_irqnum : 4; /* IRQ number */
257 1.1 ad u_int8_t dc_irqtrigger : 1; /* IRQ trigger: 0 = edge, 1 = level */
258 1.1 ad u_int8_t dc_secondary : 1; /* Controller not at address 0x170 */
259 1.1 ad u_int8_t dc_dmanum : 2; /* DMA channel index for ISA */
260 1.1 ad u_int8_t dc_irq; /* IRQ address */
261 1.1 ad u_int8_t dc_iodisable : 1; /* ISA I/O address disabled */
262 1.1 ad u_int8_t dc_forceaddr : 1; /* PCI forced to an EISA/ISA addr */
263 1.1 ad u_int8_t dc_sg64k : 1; /* 64K of SG space */
264 1.1 ad u_int8_t dc_sgunaligned : 1; /* Can do unaligned SG, otherwise 4 */
265 1.1 ad u_int8_t dc_reserved2 : 4; /* Reserved */
266 1.1 ad u_int8_t dc_maxtarget : 5; /* Maximun SCSI target ID supported */
267 1.1 ad u_int8_t dc_maxchannel : 3; /* Maximun channel number supported */
268 1.1 ad u_int8_t dc_maxlun; /* Maximum LUN supported */
269 1.1 ad u_int8_t dc_reserved3 : 3; /* Reserved field */
270 1.1 ad u_int8_t dc_autoterm : 1; /* Support auto term (low byte) */
271 1.1 ad u_int8_t dc_pcim1 : 1; /* PCI M1 chipset */
272 1.1 ad u_int8_t dc_bogusraidid : 1; /* Raid ID may be questionable */
273 1.1 ad u_int8_t dc_pci : 1; /* PCI adapter */
274 1.1 ad u_int8_t dc_eisa : 1; /* EISA adapter */
275 1.1 ad u_int8_t dc_raidnum; /* RAID host adapter humber */
276 1.1 ad };
277 1.1 ad
278 1.1 ad /*
279 1.1 ad * How SCSI inquiry data breaks down for EATA boards.
280 1.1 ad */
281 1.1 ad struct eata_inquiry_data {
282 1.1 ad u_int8_t ei_device;
283 1.1 ad u_int8_t ei_dev_qual2;
284 1.1 ad u_int8_t ei_version;
285 1.1 ad u_int8_t ei_response_format;
286 1.1 ad u_int8_t ei_additional_length;
287 1.1 ad u_int8_t ei_unused[2];
288 1.1 ad u_int8_t ei_flags;
289 1.1 ad char ei_vendor[8]; /* Vendor, e.g: DPT, NEC */
290 1.1 ad char ei_model[7]; /* Model number */
291 1.1 ad char ei_suffix[9]; /* Model number suffix */
292 1.1 ad char ei_fw[3]; /* Firmware */
293 1.1 ad char ei_fwrev[1]; /* Firmware revision */
294 1.1 ad u_int8_t ei_extra[8];
295 1.1 ad };
296 1.1 ad
297 1.1 ad #endif /* !defined _IC_DPTREG_H_ */
298