1*86d7f5d3SJohn Marino /* 2*86d7f5d3SJohn Marino ********************************************************************* 3*86d7f5d3SJohn Marino * FILE NAME : amd.h 4*86d7f5d3SJohn Marino * BY : C.L. Huang (ching@tekram.com.tw) 5*86d7f5d3SJohn Marino * Erich Chen (erich@tekram.com.tw) 6*86d7f5d3SJohn Marino * Description: Device Driver for the amd53c974 PCI Bus Master 7*86d7f5d3SJohn Marino * SCSI Host adapter found on cards such as 8*86d7f5d3SJohn Marino * the Tekram DC-390(T). 9*86d7f5d3SJohn Marino * (C)Copyright 1995-1999 Tekram Technology Co., Ltd. 10*86d7f5d3SJohn Marino * 11*86d7f5d3SJohn Marino * Redistribution and use in source and binary forms, with or without 12*86d7f5d3SJohn Marino * modification, are permitted provided that the following conditions 13*86d7f5d3SJohn Marino * are met: 14*86d7f5d3SJohn Marino * 1. Redistributions of source code must retain the above copyright 15*86d7f5d3SJohn Marino * notice, this list of conditions and the following disclaimer. 16*86d7f5d3SJohn Marino * 2. Redistributions in binary form must reproduce the above copyright 17*86d7f5d3SJohn Marino * notice, this list of conditions and the following disclaimer in the 18*86d7f5d3SJohn Marino * documentation and/or other materials provided with the distribution. 19*86d7f5d3SJohn Marino * 3. The name of the author may not be used to endorse or promote products 20*86d7f5d3SJohn Marino * derived from this software without specific prior written permission. 21*86d7f5d3SJohn Marino * 22*86d7f5d3SJohn Marino * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 23*86d7f5d3SJohn Marino * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 24*86d7f5d3SJohn Marino * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 25*86d7f5d3SJohn Marino * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 26*86d7f5d3SJohn Marino * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 27*86d7f5d3SJohn Marino * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 28*86d7f5d3SJohn Marino * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 29*86d7f5d3SJohn Marino * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 30*86d7f5d3SJohn Marino * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 31*86d7f5d3SJohn Marino * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32*86d7f5d3SJohn Marino ********************************************************************* 33*86d7f5d3SJohn Marino * $FreeBSD: src/sys/pci/amd.h,v 1.1.4.1 2000/04/14 13:16:54 nyan Exp $ 34*86d7f5d3SJohn Marino * $DragonFly: src/sys/dev/disk/amd/amd.h,v 1.2 2003/06/17 04:28:56 dillon Exp $ 35*86d7f5d3SJohn Marino */ 36*86d7f5d3SJohn Marino 37*86d7f5d3SJohn Marino #ifndef AMD_H 38*86d7f5d3SJohn Marino #define AMD_H 39*86d7f5d3SJohn Marino 40*86d7f5d3SJohn Marino #define AMD_TRANS_CUR 0x01 /* Modify current neogtiation status */ 41*86d7f5d3SJohn Marino #define AMD_TRANS_ACTIVE 0x03 /* Assume this is the active target */ 42*86d7f5d3SJohn Marino #define AMD_TRANS_GOAL 0x04 /* Modify negotiation goal */ 43*86d7f5d3SJohn Marino #define AMD_TRANS_USER 0x08 /* Modify user negotiation settings */ 44*86d7f5d3SJohn Marino 45*86d7f5d3SJohn Marino /* 46*86d7f5d3SJohn Marino * Per target transfer parameters. 47*86d7f5d3SJohn Marino */ 48*86d7f5d3SJohn Marino struct amd_transinfo { 49*86d7f5d3SJohn Marino u_int8_t period; 50*86d7f5d3SJohn Marino u_int8_t offset; 51*86d7f5d3SJohn Marino }; 52*86d7f5d3SJohn Marino 53*86d7f5d3SJohn Marino struct amd_target_info { 54*86d7f5d3SJohn Marino /* 55*86d7f5d3SJohn Marino * Records the currently active and user/default settings for 56*86d7f5d3SJohn Marino * tagged queueing and disconnection for each target. 57*86d7f5d3SJohn Marino */ 58*86d7f5d3SJohn Marino u_int8_t disc_tag; 59*86d7f5d3SJohn Marino #define AMD_CUR_DISCENB 0x01 60*86d7f5d3SJohn Marino #define AMD_CUR_TAGENB 0x02 61*86d7f5d3SJohn Marino #define AMD_USR_DISCENB 0x04 62*86d7f5d3SJohn Marino #define AMD_USR_TAGENB 0x08 63*86d7f5d3SJohn Marino u_int8_t CtrlR1; 64*86d7f5d3SJohn Marino u_int8_t CtrlR3; 65*86d7f5d3SJohn Marino u_int8_t CtrlR4; 66*86d7f5d3SJohn Marino u_int8_t sync_period_reg; 67*86d7f5d3SJohn Marino u_int8_t sync_offset_reg; 68*86d7f5d3SJohn Marino 69*86d7f5d3SJohn Marino /* 70*86d7f5d3SJohn Marino * Currently active transfer settings. 71*86d7f5d3SJohn Marino */ 72*86d7f5d3SJohn Marino struct amd_transinfo current; 73*86d7f5d3SJohn Marino /* 74*86d7f5d3SJohn Marino * Transfer settings we wish to achieve 75*86d7f5d3SJohn Marino * through negotiation. 76*86d7f5d3SJohn Marino */ 77*86d7f5d3SJohn Marino struct amd_transinfo goal; 78*86d7f5d3SJohn Marino /* 79*86d7f5d3SJohn Marino * User defined or default transfer settings. 80*86d7f5d3SJohn Marino */ 81*86d7f5d3SJohn Marino struct amd_transinfo user; 82*86d7f5d3SJohn Marino }; 83*86d7f5d3SJohn Marino 84*86d7f5d3SJohn Marino /* 85*86d7f5d3SJohn Marino * Scatter/Gather Segment entry. 86*86d7f5d3SJohn Marino */ 87*86d7f5d3SJohn Marino struct amd_sg { 88*86d7f5d3SJohn Marino u_int32_t SGXLen; 89*86d7f5d3SJohn Marino u_int32_t SGXPtr; 90*86d7f5d3SJohn Marino }; 91*86d7f5d3SJohn Marino 92*86d7f5d3SJohn Marino /* 93*86d7f5d3SJohn Marino * Chipset feature limits 94*86d7f5d3SJohn Marino */ 95*86d7f5d3SJohn Marino #define MAX_SCSI_ID 8 96*86d7f5d3SJohn Marino #define AMD_MAX_SYNC_OFFSET 15 97*86d7f5d3SJohn Marino #define AMD_TARGET_MAX 7 98*86d7f5d3SJohn Marino #define AMD_LUN_MAX 7 99*86d7f5d3SJohn Marino #define AMD_NSEG (btoc(MAXPHYS) + 1) 100*86d7f5d3SJohn Marino #define AMD_MAXTRANSFER_SIZE 0xFFFFFF /* restricted by 24 bit counter */ 101*86d7f5d3SJohn Marino #define MAX_DEVICES 10 102*86d7f5d3SJohn Marino #define MAX_TAGS_CMD_QUEUE 256 103*86d7f5d3SJohn Marino #define MAX_CMD_PER_LUN 6 104*86d7f5d3SJohn Marino #define MAX_SRB_CNT 256 105*86d7f5d3SJohn Marino #define MAX_START_JOB 256 106*86d7f5d3SJohn Marino 107*86d7f5d3SJohn Marino /* 108*86d7f5d3SJohn Marino * BIT position to integer mapping. 109*86d7f5d3SJohn Marino */ 110*86d7f5d3SJohn Marino #define BIT(N) (0x01 << N) 111*86d7f5d3SJohn Marino 112*86d7f5d3SJohn Marino /* 113*86d7f5d3SJohn Marino * EEPROM storage offsets and data structures. 114*86d7f5d3SJohn Marino */ 115*86d7f5d3SJohn Marino typedef struct _EEprom { 116*86d7f5d3SJohn Marino u_int8_t EE_MODE1; 117*86d7f5d3SJohn Marino u_int8_t EE_SPEED; 118*86d7f5d3SJohn Marino u_int8_t xx1; 119*86d7f5d3SJohn Marino u_int8_t xx2; 120*86d7f5d3SJohn Marino } EEprom, *PEEprom; 121*86d7f5d3SJohn Marino 122*86d7f5d3SJohn Marino #define EE_ADAPT_SCSI_ID 64 123*86d7f5d3SJohn Marino #define EE_MODE2 65 124*86d7f5d3SJohn Marino #define EE_DELAY 66 125*86d7f5d3SJohn Marino #define EE_TAG_CMD_NUM 67 126*86d7f5d3SJohn Marino #define EE_DATA_SIZE 128 127*86d7f5d3SJohn Marino #define EE_CHECKSUM 0x1234 128*86d7f5d3SJohn Marino 129*86d7f5d3SJohn Marino /* 130*86d7f5d3SJohn Marino * EE_MODE1 bits definition 131*86d7f5d3SJohn Marino */ 132*86d7f5d3SJohn Marino #define PARITY_CHK BIT(0) 133*86d7f5d3SJohn Marino #define SYNC_NEGO BIT(1) 134*86d7f5d3SJohn Marino #define EN_DISCONNECT BIT(2) 135*86d7f5d3SJohn Marino #define SEND_START BIT(3) 136*86d7f5d3SJohn Marino #define TAG_QUEUING BIT(4) 137*86d7f5d3SJohn Marino 138*86d7f5d3SJohn Marino /* 139*86d7f5d3SJohn Marino * EE_MODE2 bits definition 140*86d7f5d3SJohn Marino */ 141*86d7f5d3SJohn Marino #define MORE2_DRV BIT(0) 142*86d7f5d3SJohn Marino #define GREATER_1G BIT(1) 143*86d7f5d3SJohn Marino #define RST_SCSI_BUS BIT(2) 144*86d7f5d3SJohn Marino #define ACTIVE_NEGATION BIT(3) 145*86d7f5d3SJohn Marino #define NO_SEEK BIT(4) 146*86d7f5d3SJohn Marino #define LUN_CHECK BIT(5) 147*86d7f5d3SJohn Marino 148*86d7f5d3SJohn Marino #define ENABLE_CE 1 149*86d7f5d3SJohn Marino #define DISABLE_CE 0 150*86d7f5d3SJohn Marino #define EEPROM_READ 0x80 151*86d7f5d3SJohn Marino 152*86d7f5d3SJohn Marino #define AMD_TAG_WILDCARD ((u_int)(~0)) 153*86d7f5d3SJohn Marino 154*86d7f5d3SJohn Marino /* 155*86d7f5d3SJohn Marino * SCSI Request Block 156*86d7f5d3SJohn Marino */ 157*86d7f5d3SJohn Marino struct amd_srb { 158*86d7f5d3SJohn Marino TAILQ_ENTRY(amd_srb) links; 159*86d7f5d3SJohn Marino u_int8_t CmdBlock[12]; 160*86d7f5d3SJohn Marino union ccb *pccb; 161*86d7f5d3SJohn Marino bus_dmamap_t dmamap; 162*86d7f5d3SJohn Marino struct amd_sg *pSGlist; 163*86d7f5d3SJohn Marino 164*86d7f5d3SJohn Marino u_int32_t TotalXferredLen; 165*86d7f5d3SJohn Marino u_int32_t SGPhysAddr; /* a segment starting address */ 166*86d7f5d3SJohn Marino u_int32_t SGToBeXferLen; /* to be xfer length */ 167*86d7f5d3SJohn Marino u_int32_t Segment0[2]; 168*86d7f5d3SJohn Marino u_int32_t Segment1[2]; 169*86d7f5d3SJohn Marino 170*86d7f5d3SJohn Marino struct amd_sg SGsegment[AMD_NSEG]; 171*86d7f5d3SJohn Marino struct amd_sg Segmentx;/* a one entry of S/G list table */ 172*86d7f5d3SJohn Marino u_int8_t *pMsgPtr; 173*86d7f5d3SJohn Marino u_int16_t SRBState; 174*86d7f5d3SJohn Marino 175*86d7f5d3SJohn Marino u_int8_t AdaptStatus; 176*86d7f5d3SJohn Marino u_int8_t TargetStatus; 177*86d7f5d3SJohn Marino u_int8_t MsgCnt; 178*86d7f5d3SJohn Marino u_int8_t EndMessage; 179*86d7f5d3SJohn Marino u_int8_t TagNumber; 180*86d7f5d3SJohn Marino u_int8_t SGcount; 181*86d7f5d3SJohn Marino u_int8_t SGIndex; 182*86d7f5d3SJohn Marino u_int8_t IORBFlag; /* ;81h-Reset, 2-retry */ 183*86d7f5d3SJohn Marino 184*86d7f5d3SJohn Marino u_int8_t SRBStatus; 185*86d7f5d3SJohn Marino u_int8_t SRBFlag; 186*86d7f5d3SJohn Marino /* ; b0-AutoReqSense,b6-Read,b7-write */ 187*86d7f5d3SJohn Marino /* ; b4-settimeout,b5-Residual valid */ 188*86d7f5d3SJohn Marino u_int8_t ScsiCmdLen; 189*86d7f5d3SJohn Marino }; 190*86d7f5d3SJohn Marino 191*86d7f5d3SJohn Marino TAILQ_HEAD(srb_queue, amd_srb); 192*86d7f5d3SJohn Marino 193*86d7f5d3SJohn Marino /* 194*86d7f5d3SJohn Marino * Per-adapter, software configuration. 195*86d7f5d3SJohn Marino */ 196*86d7f5d3SJohn Marino struct amd_softc { 197*86d7f5d3SJohn Marino device_t dev; 198*86d7f5d3SJohn Marino bus_space_tag_t tag; 199*86d7f5d3SJohn Marino bus_space_handle_t bsh; 200*86d7f5d3SJohn Marino bus_dma_tag_t buffer_dmat; /* dmat for buffer I/O */ 201*86d7f5d3SJohn Marino int unit; 202*86d7f5d3SJohn Marino 203*86d7f5d3SJohn Marino int last_phase; 204*86d7f5d3SJohn Marino int cur_target; 205*86d7f5d3SJohn Marino int cur_lun; 206*86d7f5d3SJohn Marino struct amd_srb *active_srb; 207*86d7f5d3SJohn Marino struct amd_srb *untagged_srbs[AMD_TARGET_MAX+1][AMD_LUN_MAX+1]; 208*86d7f5d3SJohn Marino struct amd_target_info tinfo[AMD_TARGET_MAX+1]; 209*86d7f5d3SJohn Marino u_int16_t disc_count[AMD_TARGET_MAX+1][AMD_LUN_MAX+1]; 210*86d7f5d3SJohn Marino 211*86d7f5d3SJohn Marino struct srb_queue free_srbs; 212*86d7f5d3SJohn Marino struct srb_queue waiting_srbs; 213*86d7f5d3SJohn Marino struct srb_queue running_srbs; 214*86d7f5d3SJohn Marino 215*86d7f5d3SJohn Marino struct amd_srb *pTmpSRB; 216*86d7f5d3SJohn Marino 217*86d7f5d3SJohn Marino u_int16_t SRBCount; 218*86d7f5d3SJohn Marino 219*86d7f5d3SJohn Marino u_int16_t max_id; 220*86d7f5d3SJohn Marino u_int16_t max_lun; 221*86d7f5d3SJohn Marino 222*86d7f5d3SJohn Marino /* Hooks into the CAM XPT */ 223*86d7f5d3SJohn Marino struct cam_sim *psim; 224*86d7f5d3SJohn Marino struct cam_path *ppath; 225*86d7f5d3SJohn Marino 226*86d7f5d3SJohn Marino u_int8_t msgin_buf[6]; 227*86d7f5d3SJohn Marino u_int8_t msgout_buf[6]; 228*86d7f5d3SJohn Marino u_int msgin_index; 229*86d7f5d3SJohn Marino u_int msgout_index; 230*86d7f5d3SJohn Marino u_int msgout_len; 231*86d7f5d3SJohn Marino 232*86d7f5d3SJohn Marino u_int8_t status; 233*86d7f5d3SJohn Marino u_int8_t AdaptSCSIID; /* ; Adapter SCSI Target ID */ 234*86d7f5d3SJohn Marino u_int8_t AdaptSCSILUN; /* ; Adapter SCSI LUN */ 235*86d7f5d3SJohn Marino 236*86d7f5d3SJohn Marino u_int8_t ACBFlag; 237*86d7f5d3SJohn Marino 238*86d7f5d3SJohn Marino u_int8_t Gmode2; 239*86d7f5d3SJohn Marino 240*86d7f5d3SJohn Marino u_int8_t HostID_Bit; 241*86d7f5d3SJohn Marino 242*86d7f5d3SJohn Marino u_int8_t InitDCB_flag[8][8]; /* flag of initDCB for device */ 243*86d7f5d3SJohn Marino struct amd_srb SRB_array[MAX_SRB_CNT]; /* +45Ch, Len= */ 244*86d7f5d3SJohn Marino struct amd_srb TmpSRB; 245*86d7f5d3SJohn Marino /* Setup data stored in an 93c46 serial eeprom */ 246*86d7f5d3SJohn Marino u_int8_t eepromBuf[EE_DATA_SIZE]; 247*86d7f5d3SJohn Marino }; 248*86d7f5d3SJohn Marino 249*86d7f5d3SJohn Marino /* 250*86d7f5d3SJohn Marino * ----SRB State machine definition 251*86d7f5d3SJohn Marino */ 252*86d7f5d3SJohn Marino #define SRB_FREE 0 253*86d7f5d3SJohn Marino #define SRB_READY BIT(1) 254*86d7f5d3SJohn Marino #define SRB_MSGOUT BIT(2) /* ;arbitration+msg_out 1st byte */ 255*86d7f5d3SJohn Marino #define SRB_MSGIN BIT(3) 256*86d7f5d3SJohn Marino #define SRB_MSGIN_MULTI BIT(4) 257*86d7f5d3SJohn Marino #define SRB_COMMAND BIT(5) 258*86d7f5d3SJohn Marino #define SRB_START BIT(6) /* ;arbitration+msg_out+command_out */ 259*86d7f5d3SJohn Marino #define SRB_DISCONNECT BIT(7) 260*86d7f5d3SJohn Marino #define SRB_DATA_XFER BIT(8) 261*86d7f5d3SJohn Marino #define SRB_XFERPAD BIT(9) 262*86d7f5d3SJohn Marino #define SRB_STATUS BIT(10) 263*86d7f5d3SJohn Marino #define SRB_COMPLETED BIT(11) 264*86d7f5d3SJohn Marino #define SRB_ABORT_SENT BIT(12) 265*86d7f5d3SJohn Marino #define DO_SYNC_NEGO BIT(13) 266*86d7f5d3SJohn Marino #define SRB_UNEXPECT_RESEL BIT(14) 267*86d7f5d3SJohn Marino 268*86d7f5d3SJohn Marino /* 269*86d7f5d3SJohn Marino * ---ACB Flag 270*86d7f5d3SJohn Marino */ 271*86d7f5d3SJohn Marino #define RESET_DEV BIT(0) 272*86d7f5d3SJohn Marino #define RESET_DETECT BIT(1) 273*86d7f5d3SJohn Marino #define RESET_DONE BIT(2) 274*86d7f5d3SJohn Marino 275*86d7f5d3SJohn Marino /* 276*86d7f5d3SJohn Marino * ---DCB Flag 277*86d7f5d3SJohn Marino */ 278*86d7f5d3SJohn Marino #define ABORT_DEV_ BIT(0) 279*86d7f5d3SJohn Marino 280*86d7f5d3SJohn Marino /* 281*86d7f5d3SJohn Marino * ---SRB status 282*86d7f5d3SJohn Marino */ 283*86d7f5d3SJohn Marino #define SRB_OK BIT(0) 284*86d7f5d3SJohn Marino #define ABORTION BIT(1) 285*86d7f5d3SJohn Marino #define OVER_RUN BIT(2) 286*86d7f5d3SJohn Marino #define UNDER_RUN BIT(3) 287*86d7f5d3SJohn Marino #define PARITY_ERROR BIT(4) 288*86d7f5d3SJohn Marino #define SRB_ERROR BIT(5) 289*86d7f5d3SJohn Marino 290*86d7f5d3SJohn Marino /* 291*86d7f5d3SJohn Marino * ---SRB Flags 292*86d7f5d3SJohn Marino */ 293*86d7f5d3SJohn Marino #define DATAOUT BIT(7) 294*86d7f5d3SJohn Marino #define DATAIN BIT(6) 295*86d7f5d3SJohn Marino #define RESIDUAL_VALID BIT(5) 296*86d7f5d3SJohn Marino #define ENABLE_TIMER BIT(4) 297*86d7f5d3SJohn Marino #define RESET_DEV0 BIT(2) 298*86d7f5d3SJohn Marino #define ABORT_DEV BIT(1) 299*86d7f5d3SJohn Marino #define AUTO_REQSENSE BIT(0) 300*86d7f5d3SJohn Marino 301*86d7f5d3SJohn Marino /* 302*86d7f5d3SJohn Marino * ---Adapter status 303*86d7f5d3SJohn Marino */ 304*86d7f5d3SJohn Marino #define H_STATUS_GOOD 0 305*86d7f5d3SJohn Marino #define H_SEL_TIMEOUT 0x11 306*86d7f5d3SJohn Marino #define H_OVER_UNDER_RUN 0x12 307*86d7f5d3SJohn Marino #define H_UNEXP_BUS_FREE 0x13 308*86d7f5d3SJohn Marino #define H_TARGET_PHASE_F 0x14 309*86d7f5d3SJohn Marino #define H_INVALID_CCB_OP 0x16 310*86d7f5d3SJohn Marino #define H_LINK_CCB_BAD 0x17 311*86d7f5d3SJohn Marino #define H_BAD_TARGET_DIR 0x18 312*86d7f5d3SJohn Marino #define H_DUPLICATE_CCB 0x19 313*86d7f5d3SJohn Marino #define H_BAD_CCB_OR_SG 0x1A 314*86d7f5d3SJohn Marino #define H_ABORT 0x0FF 315*86d7f5d3SJohn Marino 316*86d7f5d3SJohn Marino /* 317*86d7f5d3SJohn Marino * AMD specific "status" codes returned in the SCSI status byte. 318*86d7f5d3SJohn Marino */ 319*86d7f5d3SJohn Marino #define AMD_SCSI_STAT_UNEXP_BUS_F 0xFD /* ; Unexpect Bus Free */ 320*86d7f5d3SJohn Marino #define AMD_SCSI_STAT_BUS_RST_DETECT 0xFE /* ; Scsi Bus Reset detected */ 321*86d7f5d3SJohn Marino #define AMD_SCSI_STAT_SEL_TIMEOUT 0xFF /* ; Selection Time out */ 322*86d7f5d3SJohn Marino 323*86d7f5d3SJohn Marino /* 324*86d7f5d3SJohn Marino * ---Sync_Mode 325*86d7f5d3SJohn Marino */ 326*86d7f5d3SJohn Marino #define SYNC_DISABLE 0 327*86d7f5d3SJohn Marino #define SYNC_ENABLE BIT(0) 328*86d7f5d3SJohn Marino #define SYNC_NEGO_DONE BIT(1) 329*86d7f5d3SJohn Marino #define WIDE_ENABLE BIT(2) 330*86d7f5d3SJohn Marino #define WIDE_NEGO_DONE BIT(3) 331*86d7f5d3SJohn Marino #define EN_TAG_QUEUING BIT(4) 332*86d7f5d3SJohn Marino #define EN_ATN_STOP BIT(5) 333*86d7f5d3SJohn Marino 334*86d7f5d3SJohn Marino #define SYNC_NEGO_OFFSET 15 335*86d7f5d3SJohn Marino 336*86d7f5d3SJohn Marino /* 337*86d7f5d3SJohn Marino * ---SCSI bus phase 338*86d7f5d3SJohn Marino */ 339*86d7f5d3SJohn Marino #define SCSI_DATA_OUT 0 340*86d7f5d3SJohn Marino #define SCSI_DATA_IN 1 341*86d7f5d3SJohn Marino #define SCSI_COMMAND 2 342*86d7f5d3SJohn Marino #define SCSI_STATUS 3 343*86d7f5d3SJohn Marino #define SCSI_NOP0 4 344*86d7f5d3SJohn Marino #define SCSI_ARBITRATING 5 345*86d7f5d3SJohn Marino #define SCSI_MSG_OUT 6 346*86d7f5d3SJohn Marino #define SCSI_MSG_IN 7 347*86d7f5d3SJohn Marino #define SCSI_BUS_FREE 8 348*86d7f5d3SJohn Marino 349*86d7f5d3SJohn Marino /* 350*86d7f5d3SJohn Marino *========================================================== 351*86d7f5d3SJohn Marino * AMD 53C974 Registers bit Definition 352*86d7f5d3SJohn Marino *========================================================== 353*86d7f5d3SJohn Marino */ 354*86d7f5d3SJohn Marino 355*86d7f5d3SJohn Marino /* 356*86d7f5d3SJohn Marino * ------SCSI Register------- 357*86d7f5d3SJohn Marino * Command Reg.(+0CH) 358*86d7f5d3SJohn Marino */ 359*86d7f5d3SJohn Marino #define DMA_COMMAND BIT(7) 360*86d7f5d3SJohn Marino #define NOP_CMD 0 361*86d7f5d3SJohn Marino #define CLEAR_FIFO_CMD 1 362*86d7f5d3SJohn Marino #define RST_DEVICE_CMD 2 363*86d7f5d3SJohn Marino #define RST_SCSI_BUS_CMD 3 364*86d7f5d3SJohn Marino #define INFO_XFER_CMD 0x10 365*86d7f5d3SJohn Marino #define INITIATOR_CMD_CMPLTE 0x11 366*86d7f5d3SJohn Marino #define MSG_ACCEPTED_CMD 0x12 367*86d7f5d3SJohn Marino #define XFER_PAD_BYTE 0x18 368*86d7f5d3SJohn Marino #define SET_ATN_CMD 0x1A 369*86d7f5d3SJohn Marino #define RESET_ATN_CMD 0x1B 370*86d7f5d3SJohn Marino #define SEL_W_ATN 0x42 371*86d7f5d3SJohn Marino #define SEL_W_ATN_STOP 0x43 372*86d7f5d3SJohn Marino #define EN_SEL_RESEL 0x44 373*86d7f5d3SJohn Marino #define SEL_W_ATN2 0x46 374*86d7f5d3SJohn Marino #define DATA_XFER_CMD INFO_XFER_CMD 375*86d7f5d3SJohn Marino 376*86d7f5d3SJohn Marino 377*86d7f5d3SJohn Marino /* 378*86d7f5d3SJohn Marino * ------SCSI Register------- 379*86d7f5d3SJohn Marino * SCSI Status Reg.(+10H) 380*86d7f5d3SJohn Marino */ 381*86d7f5d3SJohn Marino #define INTERRUPT BIT(7) 382*86d7f5d3SJohn Marino #define ILLEGAL_OP_ERR BIT(6) 383*86d7f5d3SJohn Marino #define PARITY_ERR BIT(5) 384*86d7f5d3SJohn Marino #define COUNT_2_ZERO BIT(4) 385*86d7f5d3SJohn Marino #define GROUP_CODE_VALID BIT(3) 386*86d7f5d3SJohn Marino #define SCSI_PHASE_MASK (BIT(2)+BIT(1)+BIT(0)) 387*86d7f5d3SJohn Marino 388*86d7f5d3SJohn Marino /* 389*86d7f5d3SJohn Marino * ------SCSI Register------- 390*86d7f5d3SJohn Marino * Interrupt Status Reg.(+14H) 391*86d7f5d3SJohn Marino */ 392*86d7f5d3SJohn Marino #define SCSI_RESET_ BIT(7) 393*86d7f5d3SJohn Marino #define INVALID_CMD BIT(6) 394*86d7f5d3SJohn Marino #define DISCONNECTED BIT(5) 395*86d7f5d3SJohn Marino #define SERVICE_REQUEST BIT(4) 396*86d7f5d3SJohn Marino #define SUCCESSFUL_OP BIT(3) 397*86d7f5d3SJohn Marino #define RESELECTED BIT(2) 398*86d7f5d3SJohn Marino #define SEL_ATTENTION BIT(1) 399*86d7f5d3SJohn Marino #define SELECTED BIT(0) 400*86d7f5d3SJohn Marino 401*86d7f5d3SJohn Marino /* 402*86d7f5d3SJohn Marino * ------SCSI Register------- 403*86d7f5d3SJohn Marino * Internal State Reg.(+18H) 404*86d7f5d3SJohn Marino */ 405*86d7f5d3SJohn Marino #define SYNC_OFFSET_FLAG BIT(3) 406*86d7f5d3SJohn Marino #define INTRN_STATE_MASK (BIT(2)+BIT(1)+BIT(0)) 407*86d7f5d3SJohn Marino 408*86d7f5d3SJohn Marino /* 409*86d7f5d3SJohn Marino * ------SCSI Register------- 410*86d7f5d3SJohn Marino * Clock Factor Reg.(+24H) 411*86d7f5d3SJohn Marino */ 412*86d7f5d3SJohn Marino #define CLK_FREQ_40MHZ 0 413*86d7f5d3SJohn Marino #define CLK_FREQ_35MHZ (BIT(2)+BIT(1)+BIT(0)) 414*86d7f5d3SJohn Marino #define CLK_FREQ_30MHZ (BIT(2)+BIT(1)) 415*86d7f5d3SJohn Marino #define CLK_FREQ_25MHZ (BIT(2)+BIT(0)) 416*86d7f5d3SJohn Marino #define CLK_FREQ_20MHZ BIT(2) 417*86d7f5d3SJohn Marino #define CLK_FREQ_15MHZ (BIT(1)+BIT(0)) 418*86d7f5d3SJohn Marino #define CLK_FREQ_10MHZ BIT(1) 419*86d7f5d3SJohn Marino 420*86d7f5d3SJohn Marino /* 421*86d7f5d3SJohn Marino * ------SCSI Register------- 422*86d7f5d3SJohn Marino * Control Reg. 1(+20H) 423*86d7f5d3SJohn Marino */ 424*86d7f5d3SJohn Marino #define EXTENDED_TIMING BIT(7) 425*86d7f5d3SJohn Marino #define DIS_INT_ON_SCSI_RST BIT(6) 426*86d7f5d3SJohn Marino #define PARITY_ERR_REPO BIT(4) 427*86d7f5d3SJohn Marino #define SCSI_ID_ON_BUS (BIT(2)+BIT(1)+BIT(0)) 428*86d7f5d3SJohn Marino 429*86d7f5d3SJohn Marino /* 430*86d7f5d3SJohn Marino * ------SCSI Register------- 431*86d7f5d3SJohn Marino * Control Reg. 2(+2CH) 432*86d7f5d3SJohn Marino */ 433*86d7f5d3SJohn Marino #define EN_FEATURE BIT(6) 434*86d7f5d3SJohn Marino #define EN_SCSI2_CMD BIT(3) 435*86d7f5d3SJohn Marino 436*86d7f5d3SJohn Marino /* 437*86d7f5d3SJohn Marino * ------SCSI Register------- 438*86d7f5d3SJohn Marino * Control Reg. 3(+30H) 439*86d7f5d3SJohn Marino */ 440*86d7f5d3SJohn Marino #define ID_MSG_CHECK BIT(7) 441*86d7f5d3SJohn Marino #define EN_QTAG_MSG BIT(6) 442*86d7f5d3SJohn Marino #define EN_GRP2_CMD BIT(5) 443*86d7f5d3SJohn Marino #define FAST_SCSI BIT(4) /* ;10MB/SEC */ 444*86d7f5d3SJohn Marino #define FAST_CLK BIT(3) /* ;25 - 40 MHZ */ 445*86d7f5d3SJohn Marino 446*86d7f5d3SJohn Marino /* 447*86d7f5d3SJohn Marino * ------SCSI Register------- 448*86d7f5d3SJohn Marino * Control Reg. 4(+34H) 449*86d7f5d3SJohn Marino */ 450*86d7f5d3SJohn Marino #define EATER_12NS 0 451*86d7f5d3SJohn Marino #define EATER_25NS BIT(7) 452*86d7f5d3SJohn Marino #define EATER_35NS BIT(6) 453*86d7f5d3SJohn Marino #define EATER_0NS (BIT(7)+BIT(6)) 454*86d7f5d3SJohn Marino #define NEGATE_REQACKDATA BIT(2) 455*86d7f5d3SJohn Marino #define NEGATE_REQACK BIT(3) 456*86d7f5d3SJohn Marino 457*86d7f5d3SJohn Marino /* 458*86d7f5d3SJohn Marino *======================================== 459*86d7f5d3SJohn Marino * DMA Register 460*86d7f5d3SJohn Marino *======================================== 461*86d7f5d3SJohn Marino */ 462*86d7f5d3SJohn Marino 463*86d7f5d3SJohn Marino /* 464*86d7f5d3SJohn Marino * -------DMA Register-------- 465*86d7f5d3SJohn Marino * DMA Command Reg.(+40H) 466*86d7f5d3SJohn Marino */ 467*86d7f5d3SJohn Marino #define READ_DIRECTION BIT(7) 468*86d7f5d3SJohn Marino #define WRITE_DIRECTION 0 469*86d7f5d3SJohn Marino #define EN_DMA_INT BIT(6) 470*86d7f5d3SJohn Marino #define MAP_TO_MDL BIT(5) 471*86d7f5d3SJohn Marino #define DMA_DIAGNOSTIC BIT(4) 472*86d7f5d3SJohn Marino #define DMA_IDLE_CMD 0 473*86d7f5d3SJohn Marino #define DMA_BLAST_CMD BIT(0) 474*86d7f5d3SJohn Marino #define DMA_ABORT_CMD BIT(1) 475*86d7f5d3SJohn Marino #define DMA_START_CMD (BIT(1)|BIT(0)) 476*86d7f5d3SJohn Marino 477*86d7f5d3SJohn Marino /* 478*86d7f5d3SJohn Marino * -------DMA Register-------- 479*86d7f5d3SJohn Marino * DMA Status Reg.(+54H) 480*86d7f5d3SJohn Marino */ 481*86d7f5d3SJohn Marino #define PCI_MS_ABORT BIT(6) 482*86d7f5d3SJohn Marino #define BLAST_COMPLETE BIT(5) 483*86d7f5d3SJohn Marino #define SCSI_INTERRUPT BIT(4) 484*86d7f5d3SJohn Marino #define DMA_XFER_DONE BIT(3) 485*86d7f5d3SJohn Marino #define DMA_XFER_ABORT BIT(2) 486*86d7f5d3SJohn Marino #define DMA_XFER_ERROR BIT(1) 487*86d7f5d3SJohn Marino #define POWER_DOWN BIT(0) 488*86d7f5d3SJohn Marino 489*86d7f5d3SJohn Marino /* 490*86d7f5d3SJohn Marino * -------DMA Register-------- 491*86d7f5d3SJohn Marino * DMA SCSI Bus and Ctrl.(+70H) 492*86d7f5d3SJohn Marino * EN_INT_ON_PCI_ABORT 493*86d7f5d3SJohn Marino */ 494*86d7f5d3SJohn Marino 495*86d7f5d3SJohn Marino /* 496*86d7f5d3SJohn Marino *========================================================== 497*86d7f5d3SJohn Marino * SCSI Chip register address offset 498*86d7f5d3SJohn Marino *========================================================== 499*86d7f5d3SJohn Marino */ 500*86d7f5d3SJohn Marino #define CTCREG_LOW 0x00 /* (R) current transfer count register low */ 501*86d7f5d3SJohn Marino #define STCREG_LOW 0x00 /* (W) start transfer count register low */ 502*86d7f5d3SJohn Marino 503*86d7f5d3SJohn Marino #define CTCREG_MID 0x04 /* (R) current transfer count register 504*86d7f5d3SJohn Marino * middle */ 505*86d7f5d3SJohn Marino #define STCREG_MID 0x04 /* (W) start transfer count register middle */ 506*86d7f5d3SJohn Marino 507*86d7f5d3SJohn Marino #define SCSIFIFOREG 0x08 /* (R/W) SCSI FIFO register */ 508*86d7f5d3SJohn Marino 509*86d7f5d3SJohn Marino #define SCSICMDREG 0x0C /* (R/W) SCSI command register */ 510*86d7f5d3SJohn Marino 511*86d7f5d3SJohn Marino #define SCSISTATREG 0x10 /* (R) SCSI status register */ 512*86d7f5d3SJohn Marino #define SCSIDESTIDREG 0x10 /* (W) SCSI destination ID register */ 513*86d7f5d3SJohn Marino 514*86d7f5d3SJohn Marino #define INTSTATREG 0x14 /* (R) interrupt status register */ 515*86d7f5d3SJohn Marino #define SCSITIMEOUTREG 0x14 /* (W) SCSI timeout register */ 516*86d7f5d3SJohn Marino 517*86d7f5d3SJohn Marino 518*86d7f5d3SJohn Marino #define INTERNSTATREG 0x18 /* (R) internal state register */ 519*86d7f5d3SJohn Marino #define SYNCPERIOREG 0x18 /* (W) synchronous transfer period register */ 520*86d7f5d3SJohn Marino 521*86d7f5d3SJohn Marino #define CURRENTFIFOREG 0x1C /* (R) current FIFO/internal state register */ 522*86d7f5d3SJohn Marino #define SYNCOFFREG 0x1C/* (W) synchronous transfer period register */ 523*86d7f5d3SJohn Marino 524*86d7f5d3SJohn Marino #define CNTLREG1 0x20 /* (R/W) control register 1 */ 525*86d7f5d3SJohn Marino #define CLKFACTREG 0x24 /* (W) clock factor register */ 526*86d7f5d3SJohn Marino #define CNTLREG2 0x2C /* (R/W) control register 2 */ 527*86d7f5d3SJohn Marino #define CNTLREG3 0x30 /* (R/W) control register 3 */ 528*86d7f5d3SJohn Marino #define CNTLREG4 0x34 /* (R/W) control register 4 */ 529*86d7f5d3SJohn Marino 530*86d7f5d3SJohn Marino #define CURTXTCNTREG 0x38 /* (R) current transfer count register 531*86d7f5d3SJohn Marino * high/part-unique ID code */ 532*86d7f5d3SJohn Marino #define STCREG_HIGH 0x38 /* (W) Start current transfer count register 533*86d7f5d3SJohn Marino * high */ 534*86d7f5d3SJohn Marino 535*86d7f5d3SJohn Marino /* 536*86d7f5d3SJohn Marino ********************************************************* 537*86d7f5d3SJohn Marino * 538*86d7f5d3SJohn Marino * SCSI DMA register 539*86d7f5d3SJohn Marino * 540*86d7f5d3SJohn Marino ********************************************************* 541*86d7f5d3SJohn Marino */ 542*86d7f5d3SJohn Marino #define DMA_Cmd 0x40 /* (R/W) command register */ 543*86d7f5d3SJohn Marino #define DMA_XferCnt 0x44 /* (R/W) starting transfer count */ 544*86d7f5d3SJohn Marino #define DMA_XferAddr 0x48 /* (R/W) starting Physical address */ 545*86d7f5d3SJohn Marino #define DMA_Wk_ByteCntr 0x4C /* ( R ) working byte counter */ 546*86d7f5d3SJohn Marino #define DMA_Wk_AddrCntr 0x50 /* ( R ) working address counter */ 547*86d7f5d3SJohn Marino #define DMA_Status 0x54 /* ( R ) status register */ 548*86d7f5d3SJohn Marino #define DMA_MDL_Addr 0x58 /* (R/W) starting memory descriptor list (MDL) 549*86d7f5d3SJohn Marino * address */ 550*86d7f5d3SJohn Marino #define DMA_Wk_MDL_Cntr 0x5C /* ( R ) working MDL counter */ 551*86d7f5d3SJohn Marino #define DMA_ScsiBusCtrl 0x70 /* (bits R/W) SCSI BUS and control */ 552*86d7f5d3SJohn Marino 553*86d7f5d3SJohn Marino /* ******************************************************* */ 554*86d7f5d3SJohn Marino #define am_target SCSISTATREG 555*86d7f5d3SJohn Marino #define am_timeout INTSTATREG 556*86d7f5d3SJohn Marino #define am_seq_step SYNCPERIOREG 557*86d7f5d3SJohn Marino #define am_fifo_count SYNCOFFREG 558*86d7f5d3SJohn Marino 559*86d7f5d3SJohn Marino 560*86d7f5d3SJohn Marino #define amd_read8(amd, port) \ 561*86d7f5d3SJohn Marino bus_space_read_1((amd)->tag, (amd)->bsh, port) 562*86d7f5d3SJohn Marino 563*86d7f5d3SJohn Marino #define amd_read16(amd, port) \ 564*86d7f5d3SJohn Marino bus_space_read_2((amd)->tag, (amd)->bsh, port) 565*86d7f5d3SJohn Marino 566*86d7f5d3SJohn Marino #define amd_read32(amd, port) \ 567*86d7f5d3SJohn Marino bus_space_read_4((amd)->tag, (amd)->bsh, port) 568*86d7f5d3SJohn Marino 569*86d7f5d3SJohn Marino #define amd_write8(amd, port, value) \ 570*86d7f5d3SJohn Marino bus_space_write_1((amd)->tag, (amd)->bsh, port, value) 571*86d7f5d3SJohn Marino 572*86d7f5d3SJohn Marino #define amd_write8_multi(amd, port, ptr, len) \ 573*86d7f5d3SJohn Marino bus_space_write_multi_1((amd)->tag, (amd)->bsh, port, ptr, len) 574*86d7f5d3SJohn Marino 575*86d7f5d3SJohn Marino #define amd_write16(amd, port, value) \ 576*86d7f5d3SJohn Marino bus_space_write_2((amd)->tag, (amd)->bsh, port, value) 577*86d7f5d3SJohn Marino 578*86d7f5d3SJohn Marino #define amd_write32(amd, port, value) \ 579*86d7f5d3SJohn Marino bus_space_write_4((amd)->tag, (amd)->bsh, port, value) 580*86d7f5d3SJohn Marino 581*86d7f5d3SJohn Marino #endif /* AMD_H */ 582