Home | History | Annotate | Line # | Download | only in ic
dptreg.h revision 1.7
      1  1.7  ad /*	$NetBSD: dptreg.h,v 1.7 2000/02/24 18:47:55 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.7  ad #ifndef	_IC_DPTREG_H_
     31  1.7  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.4  ad #define DPT_ABORT_TIMEOUT	2000	/* milliseconds */
     43  1.4  ad #define DPT_MORE_TIMEOUT	1000	/* microseconds */
     44  1.7  ad #define DPT_SCRATCH_SIZE	256	/* bytes */
     45  1.1  ad 
     46  1.1  ad #ifdef _KERNEL
     47  1.1  ad 
     48  1.1  ad #define dpt_inb(x, o)	\
     49  1.1  ad     bus_space_read_1((x)->sc_iot, (x)->sc_ioh, (o))
     50  1.1  ad #define dpt_inw(x, o)	\
     51  1.5  ad     le16toh(bus_space_read_2((x)->sc_iot, (x)->sc_ioh, (o)))
     52  1.1  ad #define dpt_inl(x, o)	\
     53  1.5  ad     le32toh(bus_space_read_4((x)->sc_iot, (x)->sc_ioh, (o)))
     54  1.1  ad 
     55  1.1  ad #define dpt_outb(x, o, d) \
     56  1.1  ad     bus_space_write_1((x)->sc_iot, (x)->sc_ioh, (o), (d))
     57  1.1  ad #define dpt_outw(x, o, d) \
     58  1.5  ad     bus_space_write_2((x)->sc_iot, (x)->sc_ioh, (o), htole16(d))
     59  1.1  ad #define dpt_outl(x, o, d) \
     60  1.5  ad     bus_space_write_4((x)->sc_iot, (x)->sc_ioh, (o), htole32(d))
     61  1.1  ad 
     62  1.1  ad #endif	/* _KERNEL */
     63  1.1  ad 
     64  1.1  ad /*
     65  1.1  ad  * HBA registers
     66  1.1  ad  */
     67  1.6  ad #define HA_DATA			0
     68  1.6  ad #define HA_ERROR		1
     69  1.6  ad #define HA_DMA_BASE		2
     70  1.6  ad #define HA_ICMD_CODE2	       	4
     71  1.6  ad #define HA_ICMD_CODE1	       	5
     72  1.6  ad #define HA_ICMD			6
     73  1.1  ad 
     74  1.5  ad /* EATA commands. There are many more that we don't define or use. */
     75  1.6  ad #define HA_COMMAND		7
     76  1.1  ad #define   CP_PIO_GETCFG		0xf0	/* Read configuration data, PIO */
     77  1.1  ad #define   CP_PIO_CMD		0xf2	/* Execute command, PIO */
     78  1.1  ad #define   CP_DMA_GETCFG		0xfd	/* Read configuration data, DMA */
     79  1.1  ad #define   CP_DMA_CMD		0xff	/* Execute command, DMA */
     80  1.1  ad #define   CP_PIO_TRUNCATE	0xf4	/* Truncate transfer command, PIO */
     81  1.1  ad #define   CP_RESET		0xf9	/* Reset controller and SCSI bus */
     82  1.1  ad #define   CP_REBOOT		0x06	/* Reboot controller (last resort) */
     83  1.1  ad #define   CP_IMMEDIATE		0xfa	/* EATA immediate command */
     84  1.1  ad #define     CPI_GEN_ABORT	0x00	/* Generic abort */
     85  1.1  ad #define     CPI_SPEC_RESET	0x01	/* Specific reset */
     86  1.1  ad #define     CPI_BUS_RESET	0x02	/* Bus reset */
     87  1.1  ad #define     CPI_SPEC_ABORT	0x03	/* Specific abort */
     88  1.1  ad #define     CPI_QUIET_INTR	0x04	/* ?? */
     89  1.1  ad #define     CPI_ROM_DL_EN	0x05	/* ?? */
     90  1.1  ad #define     CPI_COLD_BOOT	0x06	/* Cold boot HBA */
     91  1.1  ad #define     CPI_FORCE_IO	0x07	/* ?? */
     92  1.1  ad #define     CPI_BUS_OFFLINE	0x08	/* Set SCSI bus offline */
     93  1.1  ad #define     CPI_RESET_MSKD_BUS	0x09	/* Reset masked bus */
     94  1.1  ad #define     CPI_POWEROFF_WARN	0x0a	/* Power about to fail */
     95  1.1  ad 
     96  1.6  ad #define HA_STATUS		7
     97  1.1  ad #define   HA_ST_ERROR		0x01
     98  1.3  ad #define   HA_ST_MORE		0x02
     99  1.1  ad #define   HA_ST_CORRECTD	0x04
    100  1.1  ad #define   HA_ST_DRQ		0x08
    101  1.1  ad #define   HA_ST_SEEK_COMPLETE	0x10
    102  1.1  ad #define   HA_ST_WRT_FLT		0x20
    103  1.1  ad #define   HA_ST_READY		0x40
    104  1.1  ad #define   HA_ST_BUSY		0x80
    105  1.1  ad #define   HA_ST_DATA_RDY	(HA_ST_SEEK_COMPLETE|HA_ST_READY|HA_ST_DRQ)
    106  1.1  ad 
    107  1.6  ad #define HA_AUX_STATUS		8
    108  1.1  ad #define   HA_AUX_BUSY		0x01
    109  1.1  ad #define   HA_AUX_INTR		0x02
    110  1.1  ad 
    111  1.1  ad /*
    112  1.1  ad  * Structure of an EATA command packet.
    113  1.1  ad  */
    114  1.1  ad struct eata_cp {
    115  1.7  ad 	u_int8_t	cp_ctl0;		/* Control flags 0 */
    116  1.7  ad 	u_int8_t	cp_senselen;		/* Request sense length */
    117  1.7  ad 	u_int8_t	cp_unused0[3];		/* Unused */
    118  1.7  ad 	u_int8_t	cp_ctl1;		/* Control flags 1 */
    119  1.7  ad 	u_int8_t	cp_ctl2;		/* Control flags 2 */
    120  1.7  ad 	u_int8_t	cp_ctl3;		/* Control flags 3 */
    121  1.7  ad 	u_int8_t	cp_ctl4;		/* Control flags 4 */
    122  1.7  ad 	u_int8_t	cp_msg[3];		/* Message bytes 0-3 */
    123  1.7  ad 	u_int8_t	cp_cdb_cmd;		/* SCSI CDB */
    124  1.7  ad 	u_int8_t	cp_cdb_more0[3];	/* SCSI CDB */
    125  1.7  ad 	u_int8_t	cp_cdb_len;		/* SCSI CDB */
    126  1.7  ad 	u_int8_t	cp_cdb_more1[7];	/* SCSI CDB */
    127  1.7  ad 	u_int32_t	cp_datalen;		/* Bytes of data/SG list */
    128  1.7  ad 	u_int32_t	cp_ccbid;		/* ID of software CCB */
    129  1.7  ad 	u_int32_t	cp_dataaddr;		/* Addr of data/SG list */
    130  1.7  ad 	u_int32_t	cp_stataddr;		/* Addr of status packet */
    131  1.7  ad 	u_int32_t	cp_senseaddr;		/* Addr of req. sense */
    132  1.1  ad };
    133  1.1  ad 
    134  1.7  ad #define CP_C0_SCSI_RESET	0x01	/* Cause a bus reset */
    135  1.7  ad #define CP_C0_HBA_INIT		0x02	/* Reinitialize HBA */
    136  1.7  ad #define CP_C0_AUTO_SENSE	0x04	/* Auto request sense on error */
    137  1.7  ad #define CP_C0_SCATTER		0x08	/* Do scatter/gather I/O */
    138  1.7  ad #define CP_C0_QUICK		0x10	/* Return no status packet */
    139  1.7  ad #define CP_C0_INTERPRET		0x20	/* HBA interprets SCSI CDB */
    140  1.7  ad #define CP_C0_DATA_OUT		0x40	/* Data out phase */
    141  1.7  ad #define CP_C0_DATA_IN		0x80	/* Data in phase */
    142  1.7  ad 
    143  1.7  ad #define CP_C1_TO_PHYS		0x01	/* Send to RAID component */
    144  1.7  ad #define CP_C1_RESERVED		0xfe
    145  1.7  ad 
    146  1.7  ad #define CP_C2_PHYS_UNIT		0x01	/* Physical unit on mirrored pair */
    147  1.7  ad #define CP_C2_NO_AT		0x02	/* No address translation */
    148  1.7  ad #define CP_C2_NO_CACHE		0x04	/* No HBA caching */
    149  1.7  ad #define CP_C2_RESERVED		0xf8
    150  1.7  ad 
    151  1.7  ad #define CP_C3_ID_MASK		0x1f	/* Target ID */
    152  1.7  ad #define CP_C3_ID_SHIFT		0
    153  1.7  ad #define CP_C3_CHANNEL_MASK	0xe0	/* Target channel */
    154  1.7  ad #define CP_C3_CHANNEL_SHIFT	5
    155  1.7  ad 
    156  1.7  ad #define CP_C4_LUN_MASK		0x07	/* Target LUN */
    157  1.7  ad #define CP_C4_LUN_SHIFT		0
    158  1.7  ad #define CP_C4_RESERVED		0x18
    159  1.7  ad #define CP_C4_LUN_TAR		0x20	/* CP is for target ROUTINE */
    160  1.7  ad #define CP_C4_DIS_PRI		0x40	/* Give disconnect privilege */
    161  1.7  ad #define CP_C4_IDENTIFY		0x80	/* Always true */
    162  1.7  ad 
    163  1.1  ad /*
    164  1.1  ad  * EATA status packet as returned by controller upon command completion. It
    165  1.1  ad  * contains status, message info and a handle on the initiating CCB.
    166  1.1  ad  */
    167  1.1  ad struct eata_sp {
    168  1.7  ad 	u_int8_t	sp_hba_status;		/* Host adapter status */
    169  1.1  ad 	u_int8_t	sp_scsi_status;		/* SCSI bus status */
    170  1.7  ad 	u_int8_t	sp_reserved[2];		/* Reserved */
    171  1.7  ad 	u_int32_t	sp_inv_residue;		/* Bytes not transfered */
    172  1.1  ad 	u_int32_t	sp_ccbid;		/* ID of software CCB */
    173  1.1  ad 	u_int8_t	sp_id_message;
    174  1.1  ad 	u_int8_t	sp_que_message;
    175  1.1  ad 	u_int8_t	sp_tag_message;
    176  1.1  ad 	u_int8_t	sp_messages[9];
    177  1.1  ad };
    178  1.1  ad 
    179  1.4  ad /*
    180  1.4  ad  * HBA status as returned by status packet. Bit 7 signals end of command.
    181  1.4  ad  */
    182  1.7  ad #define SP_HBA_NO_ERROR		0x00    /* No error on command */
    183  1.7  ad #define SP_HBA_ERROR_SEL_TO	0x01    /* Device selection timeout */
    184  1.7  ad #define SP_HBA_ERROR_CMD_TO	0x02    /* Device command timeout */
    185  1.7  ad #define SP_HBA_ERROR_RESET	0x03    /* SCSI bus was reset */
    186  1.7  ad #define SP_HBA_INIT_POWERUP	0x04    /* Initial controller power up */
    187  1.7  ad #define SP_HBA_UNX_BUSPHASE	0x05    /* Unexpected bus phase */
    188  1.7  ad #define SP_HBA_UNX_BUS_FREE	0x06    /* Unexpected bus free */
    189  1.7  ad #define SP_HBA_BUS_PARITY	0x07    /* SCSI bus parity error */
    190  1.7  ad #define SP_HBA_SCSI_HUNG	0x08    /* SCSI bus hung */
    191  1.7  ad #define SP_HBA_UNX_MSGRJCT	0x09    /* Unexpected message reject */
    192  1.7  ad #define SP_HBA_RESET_STUCK	0x0a    /* SCSI bus reset stuck */
    193  1.7  ad #define SP_HBA_RSENSE_FAIL	0x0b    /* Auto-request sense failed */
    194  1.7  ad #define SP_HBA_PARITY		0x0c    /* HBA memory parity error */
    195  1.7  ad #define SP_HBA_ABORT_NA		0x0d    /* CP aborted - not on bus */
    196  1.7  ad #define SP_HBA_ABORTED		0x0e    /* CP aborted - was on bus */
    197  1.7  ad #define SP_HBA_RESET_NA		0x0f    /* CP reset - not on bus */
    198  1.7  ad #define SP_HBA_RESET		0x10    /* CP reset - was on bus */
    199  1.7  ad #define SP_HBA_ECC		0x11    /* HBA memory ECC error */
    200  1.7  ad #define SP_HBA_PCI_PARITY	0x12    /* PCI parity error */
    201  1.7  ad #define SP_HBA_PCI_MASTER	0x13    /* PCI master abort */
    202  1.7  ad #define SP_HBA_PCI_TARGET	0x14    /* PCI target abort */
    203  1.7  ad #define SP_HBA_PCI_SIG_TARGET	0x15    /* PCI signalled target abort */
    204  1.7  ad #define SP_HBA_ABORT		0x20    /* Software abort (too many retries) */
    205  1.1  ad 
    206  1.1  ad /*
    207  1.1  ad  * Scatter-gather list element.
    208  1.1  ad  */
    209  1.1  ad struct eata_sg {
    210  1.1  ad 	u_int32_t	sg_addr;
    211  1.1  ad 	u_int32_t	sg_len;
    212  1.1  ad };
    213  1.1  ad 
    214  1.1  ad /*
    215  1.7  ad  * EATA configuration data as returned by HBA. XXX this is bogus - it
    216  1.7  ad  * doesn't sync up with the structure FreeBSD uses. [ad]
    217  1.1  ad  */
    218  1.1  ad struct eata_cfg {
    219  1.7  ad 	u_int8_t	ec_devtype;
    220  1.7  ad 	u_int8_t	ec_pagecode;
    221  1.7  ad 	u_int8_t	ec_reserved0;
    222  1.7  ad 	u_int8_t	ec_cfglen;		/* Length in bytes past here */
    223  1.7  ad 	u_int8_t	ec_eatasig[4];		/* EATA signature */
    224  1.7  ad 	u_int8_t	ec_eataversion;		/* EATA version number */
    225  1.7  ad 	u_int8_t	ec_feat0;		/* First feature byte */
    226  1.7  ad 	u_int8_t	ec_padlength[2];	/* Pad bytes for PIO cmds */
    227  1.7  ad 	u_int8_t	ec_hba[4];		/* Host adapter SCSI IDs */
    228  1.7  ad 	u_int8_t	ec_cplen[4];		/* Command packet length */
    229  1.7  ad 	u_int8_t	ec_splen[4];		/* Status packet length */
    230  1.7  ad 	u_int8_t	ec_queuedepth[2];	/* Controller queue depth */
    231  1.7  ad 	u_int8_t	ec_reserved1[2];
    232  1.7  ad 	u_int8_t	ec_sglen[2];		/* Maximum s/g list size */
    233  1.7  ad 	u_int8_t	ec_feat1;		/* 2nd feature byte */
    234  1.7  ad 	u_int8_t	ec_irq;			/* IRQ address */
    235  1.7  ad 	u_int8_t	ec_feat2;		/* 3rd feature byte */
    236  1.7  ad 	u_int8_t	ec_feat3;		/* 4th feature byte */
    237  1.7  ad 	u_int8_t	ec_maxlun;		/* Maximum LUN supported */
    238  1.7  ad 	u_int8_t	ec_feat4;		/* 5th feature byte */
    239  1.7  ad 	u_int8_t	ec_raidnum;		/* RAID host adapter humber */
    240  1.1  ad };
    241  1.1  ad 
    242  1.7  ad #define EC_F0_OVERLAP_CMDS	0x01	/* Overlapped cmds supported */
    243  1.7  ad #define EC_F0_TARGET_MODE	0x02	/* Target mode supported */
    244  1.7  ad #define EC_F0_TRUNC_NOT_REC	0x04	/* Truncate cmd not supported */
    245  1.7  ad #define EC_F0_MORE_SUPPORTED	0x08	/* More cmd supported */
    246  1.7  ad #define EC_F0_DMA_SUPPORTED	0x10	/* DMA mode supported */
    247  1.7  ad #define EC_F0_DMA_NUM_VALID	0x20	/* DMA channel field is valid */
    248  1.7  ad #define EC_F0_ATA_DEV		0x40	/* This is an ATA device */
    249  1.7  ad #define EC_F0_HBA_VALID		0x80	/* HBA field is valid */
    250  1.7  ad 
    251  1.7  ad #define EC_F1_IRQ_NUM_MASK	0x0f	/* IRQ number mask */
    252  1.7  ad #define EC_F1_IRQ_NUM_SHIFT	0
    253  1.7  ad #define EC_F1_IRQ_TRIGGER	0x10	/* IRQ trigger: 0 = edge, 1 = level */
    254  1.7  ad #define EC_F1_SECONDARY		0x20	/* Controller not at address 0x170 */
    255  1.7  ad #define EC_F1_DMA_NUM_MASK	0xc0 	/* DMA channel *index* for ISA */
    256  1.7  ad #define EC_F1_DMA_NUM_SHIFT	6
    257  1.7  ad 
    258  1.7  ad #define EC_F2_ISA_IO_DISABLE	0x01	/* ISA I/O address disabled */
    259  1.7  ad #define EC_F2_FORCE_ADDR	0x02	/* HBA forced to EISA/ISA address */
    260  1.7  ad #define EC_F2_SG_64K		0x04	/* 64kB of scatter/gather space */
    261  1.7  ad #define EC_F2_SG_UNALIGNED	0x08	/* Can do unaligned scatter/gather */
    262  1.7  ad #define EC_F2_RESERVED0		0x10	/* Reserved */
    263  1.7  ad #define EC_F2_RESERVED1		0x20	/* Reserved */
    264  1.7  ad #define EC_F2_RESERVED2		0x40	/* Reserved */
    265  1.7  ad #define EC_F2_RESERVED3		0x40	/* Reserved */
    266  1.7  ad 
    267  1.7  ad #define EC_F3_MAX_TARGET_MASK	0x1f	/* Maximum target ID supported */
    268  1.7  ad #define EC_F3_MAX_TARGET_SHIFT	0
    269  1.7  ad #define EC_F3_MAX_CHANNEL_MASK	0xe0	/* Maximum channel ID supported */
    270  1.7  ad #define EC_F3_MAX_CHANNEL_SHIFT	5
    271  1.7  ad 
    272  1.7  ad #define EC_F4_RESERVED0		0x01	/* Reserved */
    273  1.7  ad #define EC_F4_RESERVED1		0x02	/* Reserved */
    274  1.7  ad #define EC_F4_RESERVED2		0x04	/* Reserved */
    275  1.7  ad #define EC_F4_AUTO_TERM		0x08	/* Supports auto termination */
    276  1.7  ad #define EC_F4_PCIM1		0x10	/* PCI M1 chipset */
    277  1.7  ad #define EC_F4_BOGUS_RAID_ID	0x20	/* RAID ID may be questionable  */
    278  1.7  ad #define EC_F4_HBA_PCI		0x40	/* PCI adapter */
    279  1.7  ad #define EC_F4_HBA_EISA		0x80	/* EISA adapter */
    280  1.7  ad 
    281  1.1  ad /*
    282  1.1  ad  * How SCSI inquiry data breaks down for EATA boards.
    283  1.1  ad  */
    284  1.1  ad struct eata_inquiry_data {
    285  1.1  ad 	u_int8_t	ei_device;
    286  1.1  ad 	u_int8_t	ei_dev_qual2;
    287  1.1  ad 	u_int8_t	ei_version;
    288  1.1  ad 	u_int8_t 	ei_response_format;
    289  1.1  ad 	u_int8_t 	ei_additional_length;
    290  1.1  ad 	u_int8_t 	ei_unused[2];
    291  1.1  ad 	u_int8_t	ei_flags;
    292  1.7  ad 	char		ei_vendor[8];		/* Vendor, e.g: DPT, NEC */
    293  1.7  ad 	char		ei_model[7];		/* Model number */
    294  1.7  ad 	char		ei_suffix[9];		/* Model number suffix */
    295  1.7  ad 	char		ei_fw[3];		/* Firmware */
    296  1.7  ad 	char		ei_fwrev[1];		/* Firmware revision */
    297  1.1  ad 	u_int8_t	ei_extra[8];
    298  1.1  ad };
    299  1.1  ad 
    300  1.1  ad #endif	/* !defined _IC_DPTREG_H_ */
    301