xref: /dflybsd-src/sys/dev/disk/amd/amd.h (revision 86d7f5d305c6adaa56ff4582ece9859d73106103)
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