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