sym_defs.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:31k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * Device driver for the SYMBIOS/LSILOGIC 53C8XX and 53C1010 family 
  3.  * of PCI-SCSI IO processors.
  4.  *
  5.  * Copyright (C) 1999-2001  Gerard Roudier <groudier@free.fr>
  6.  *
  7.  * This driver is derived from the Linux sym53c8xx driver.
  8.  * Copyright (C) 1998-2000  Gerard Roudier
  9.  *
  10.  * The sym53c8xx driver is derived from the ncr53c8xx driver that had been 
  11.  * a port of the FreeBSD ncr driver to Linux-1.2.13.
  12.  *
  13.  * The original ncr driver has been written for 386bsd and FreeBSD by
  14.  *         Wolfgang Stanglmeier        <wolf@cologne.de>
  15.  *         Stefan Esser                <se@mi.Uni-Koeln.de>
  16.  * Copyright (C) 1994  Wolfgang Stanglmeier
  17.  *
  18.  * Other major contributions:
  19.  *
  20.  * NVRAM detection and reading.
  21.  * Copyright (C) 1997 Richard Waltham <dormouse@farsrobt.demon.co.uk>
  22.  *
  23.  *-----------------------------------------------------------------------------
  24.  *
  25.  * Redistribution and use in source and binary forms, with or without
  26.  * modification, are permitted provided that the following conditions
  27.  * are met:
  28.  * 1. Redistributions of source code must retain the above copyright
  29.  *    notice, this list of conditions and the following disclaimer.
  30.  * 2. The name of the author may not be used to endorse or promote products
  31.  *    derived from this software without specific prior written permission.
  32.  *
  33.  * Where this Software is combined with software released under the terms of 
  34.  * the GNU Public License ("GPL") and the terms of the GPL would require the 
  35.  * combined work to also be released under the terms of the GPL, the terms
  36.  * and conditions of this License will apply in addition to those of the
  37.  * GPL with the exception of any terms or conditions of this License that
  38.  * conflict with, or are expressly prohibited by, the GPL.
  39.  *
  40.  * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
  41.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  42.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  43.  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
  44.  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  45.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  46.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  47.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  48.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  49.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  50.  * SUCH DAMAGE.
  51.  */
  52. #ifndef SYM_DEFS_H
  53. #define SYM_DEFS_H
  54. /*
  55.  *  Vendor.
  56.  */
  57. #define PCI_VENDOR_NCR 0x1000
  58. /*
  59.  *  PCI device identifier of SYMBIOS chips.
  60.  */
  61. #define PCI_ID_SYM53C810 1
  62. #define PCI_ID_SYM53C810AP 5
  63. #define PCI_ID_SYM53C815 4
  64. #define PCI_ID_SYM53C820 2
  65. #define PCI_ID_SYM53C825 3
  66. #define PCI_ID_SYM53C860 6
  67. #define PCI_ID_SYM53C875 0xf
  68. #define PCI_ID_SYM53C875_2 0x8f
  69. #define PCI_ID_SYM53C885 0xd
  70. #define PCI_ID_SYM53C895 0xc
  71. #define PCI_ID_SYM53C896 0xb
  72. #define PCI_ID_SYM53C895A 0x12
  73. #define PCI_ID_SYM53C875A 0x13
  74. #define PCI_ID_LSI53C1010 0x20
  75. #define PCI_ID_LSI53C1010_2 0x21
  76. #define PCI_ID_LSI53C1510D 0xa
  77. /*
  78.  * SYM53C8XX device features descriptor.
  79.  */
  80. struct sym_pci_chip {
  81. u_short device_id;
  82. u_short revision_id;
  83. char *name;
  84. u_char burst_max; /* log-base-2 of max burst */
  85. u_char offset_max;
  86. u_char nr_divisor;
  87. u_char lp_probe_bit;
  88. u_int features;
  89. #define FE_LED0 (1<<0)
  90. #define FE_WIDE (1<<1)    /* Wide data transfers */
  91. #define FE_ULTRA (1<<2)   /* Ultra speed 20Mtrans/sec */
  92. #define FE_ULTRA2 (1<<3)   /* Ultra 2 - 40 Mtrans/sec */
  93. #define FE_DBLR (1<<4)   /* Clock doubler present */
  94. #define FE_QUAD (1<<5)   /* Clock quadrupler present */
  95. #define FE_ERL (1<<6)    /* Enable read line */
  96. #define FE_CLSE (1<<7)    /* Cache line size enable */
  97. #define FE_WRIE (1<<8)    /* Write & Invalidate enable */
  98. #define FE_ERMP (1<<9)    /* Enable read multiple */
  99. #define FE_BOF (1<<10)   /* Burst opcode fetch */
  100. #define FE_DFS (1<<11)   /* DMA fifo size */
  101. #define FE_PFEN (1<<12)   /* Prefetch enable */
  102. #define FE_LDSTR (1<<13)   /* Load/Store supported */
  103. #define FE_RAM (1<<14)   /* On chip RAM present */
  104. #define FE_VARCLK (1<<15)   /* Clock frequency may vary */
  105. #define FE_RAM8K (1<<16)   /* On chip RAM sized 8Kb */
  106. #define FE_64BIT (1<<17)   /* 64-bit PCI BUS interface */
  107. #define FE_IO256 (1<<18)   /* Requires full 256 bytes in PCI space */
  108. #define FE_NOPM (1<<19)   /* Scripts handles phase mismatch */
  109. #define FE_LEDC (1<<20)   /* Hardware control of LED */
  110. #define FE_ULTRA3 (1<<21)   /* Ultra 3 - 80 Mtrans/sec DT */
  111. #define FE_66MHZ (1<<22)   /* 66MHz PCI support */
  112. #define FE_CRC (1<<23)   /* CRC support */
  113. #define FE_DIFF (1<<24)   /* SCSI HVD support */
  114. #define FE_DFBC (1<<25)   /* Have DFBC register */
  115. #define FE_LCKFRQ (1<<26)   /* Have LCKFRQ */
  116. #define FE_C10 (1<<27)   /* Various C10 core (mis)features */
  117. #define FE_U3EN (1<<28)   /* U3EN bit usable */
  118. #define FE_DAC (1<<29)   /* Support PCI DAC (64 bit addressing) */
  119. #define FE_ISTAT1  (1<<30)   /* Have ISTAT1, MBOX0, MBOX1 registers */
  120. #define FE_CACHE_SET (FE_ERL|FE_CLSE|FE_WRIE|FE_ERMP)
  121. #define FE_CACHE0_SET (FE_CACHE_SET & ~FE_ERL)
  122. };
  123. /*
  124.  * Symbios NVRAM data format
  125.  */
  126. #define SYMBIOS_NVRAM_SIZE 368
  127. #define SYMBIOS_NVRAM_ADDRESS 0x100
  128. struct Symbios_nvram {
  129. /* Header 6 bytes */
  130. u_short type; /* 0x0000 */
  131. u_short byte_count; /* excluding header/trailer */
  132. u_short checksum;
  133. /* Controller set up 20 bytes */
  134. u_char v_major; /* 0x00 */
  135. u_char v_minor; /* 0x30 */
  136. u32 boot_crc;
  137. u_short flags;
  138. #define SYMBIOS_SCAM_ENABLE (1)
  139. #define SYMBIOS_PARITY_ENABLE (1<<1)
  140. #define SYMBIOS_VERBOSE_MSGS (1<<2)
  141. #define SYMBIOS_CHS_MAPPING (1<<3)
  142. #define SYMBIOS_NO_NVRAM (1<<3) /* ??? */
  143. u_short flags1;
  144. #define SYMBIOS_SCAN_HI_LO (1)
  145. u_short term_state;
  146. #define SYMBIOS_TERM_CANT_PROGRAM (0)
  147. #define SYMBIOS_TERM_ENABLED (1)
  148. #define SYMBIOS_TERM_DISABLED (2)
  149. u_short rmvbl_flags;
  150. #define SYMBIOS_RMVBL_NO_SUPPORT (0)
  151. #define SYMBIOS_RMVBL_BOOT_DEVICE (1)
  152. #define SYMBIOS_RMVBL_MEDIA_INSTALLED (2)
  153. u_char host_id;
  154. u_char num_hba; /* 0x04 */
  155. u_char num_devices; /* 0x10 */
  156. u_char max_scam_devices; /* 0x04 */
  157. u_char num_valid_scam_devices; /* 0x00 */
  158. u_char flags2;
  159. #define SYMBIOS_AVOID_BUS_RESET (1<<2)
  160. /* Boot order 14 bytes * 4 */
  161. struct Symbios_host{
  162. u_short type; /* 4:8xx / 0:nok */
  163. u_short device_id; /* PCI device id */
  164. u_short vendor_id; /* PCI vendor id */
  165. u_char bus_nr; /* PCI bus number */
  166. u_char device_fn; /* PCI device/function number << 3*/
  167. u_short word8;
  168. u_short flags;
  169. #define SYMBIOS_INIT_SCAN_AT_BOOT (1)
  170. u_short io_port; /* PCI io_port address */
  171. } host[4];
  172. /* Targets 8 bytes * 16 */
  173. struct Symbios_target {
  174. u_char flags;
  175. #define SYMBIOS_DISCONNECT_ENABLE (1)
  176. #define SYMBIOS_SCAN_AT_BOOT_TIME (1<<1)
  177. #define SYMBIOS_SCAN_LUNS (1<<2)
  178. #define SYMBIOS_QUEUE_TAGS_ENABLED (1<<3)
  179. u_char rsvd;
  180. u_char bus_width; /* 0x08/0x10 */
  181. u_char sync_offset;
  182. u_short sync_period; /* 4*period factor */
  183. u_short timeout;
  184. } target[16];
  185. /* Scam table 8 bytes * 4 */
  186. struct Symbios_scam {
  187. u_short id;
  188. u_short method;
  189. #define SYMBIOS_SCAM_DEFAULT_METHOD (0)
  190. #define SYMBIOS_SCAM_DONT_ASSIGN (1)
  191. #define SYMBIOS_SCAM_SET_SPECIFIC_ID (2)
  192. #define SYMBIOS_SCAM_USE_ORDER_GIVEN (3)
  193. u_short status;
  194. #define SYMBIOS_SCAM_UNKNOWN (0)
  195. #define SYMBIOS_SCAM_DEVICE_NOT_FOUND (1)
  196. #define SYMBIOS_SCAM_ID_NOT_SET (2)
  197. #define SYMBIOS_SCAM_ID_VALID (3)
  198. u_char target_id;
  199. u_char rsvd;
  200. } scam[4];
  201. u_char spare_devices[15*8];
  202. u_char trailer[6]; /* 0xfe 0xfe 0x00 0x00 0x00 0x00 */
  203. };
  204. typedef struct Symbios_nvram Symbios_nvram;
  205. typedef struct Symbios_host Symbios_host;
  206. typedef struct Symbios_target Symbios_target;
  207. typedef struct Symbios_scam Symbios_scam;
  208. /*
  209.  * Tekram NvRAM data format.
  210.  */
  211. #define TEKRAM_NVRAM_SIZE 64
  212. #define TEKRAM_93C46_NVRAM_ADDRESS 0
  213. #define TEKRAM_24C16_NVRAM_ADDRESS 0x40
  214. struct Tekram_nvram {
  215. struct Tekram_target {
  216. u_char flags;
  217. #define TEKRAM_PARITY_CHECK (1)
  218. #define TEKRAM_SYNC_NEGO (1<<1)
  219. #define TEKRAM_DISCONNECT_ENABLE (1<<2)
  220. #define TEKRAM_START_CMD (1<<3)
  221. #define TEKRAM_TAGGED_COMMANDS (1<<4)
  222. #define TEKRAM_WIDE_NEGO (1<<5)
  223. u_char sync_index;
  224. u_short word2;
  225. } target[16];
  226. u_char host_id;
  227. u_char flags;
  228. #define TEKRAM_MORE_THAN_2_DRIVES (1)
  229. #define TEKRAM_DRIVES_SUP_1GB (1<<1)
  230. #define TEKRAM_RESET_ON_POWER_ON (1<<2)
  231. #define TEKRAM_ACTIVE_NEGATION (1<<3)
  232. #define TEKRAM_IMMEDIATE_SEEK (1<<4)
  233. #define TEKRAM_SCAN_LUNS (1<<5)
  234. #define TEKRAM_REMOVABLE_FLAGS (3<<6) /* 0: disable; */
  235. /* 1: boot device; 2:all */
  236. u_char boot_delay_index;
  237. u_char max_tags_index;
  238. u_short flags1;
  239. #define TEKRAM_F2_F6_ENABLED (1)
  240. u_short spare[29];
  241. };
  242. typedef struct Tekram_nvram Tekram_nvram;
  243. typedef struct Tekram_target Tekram_target;
  244. /*
  245.  * SYM53C8XX IO register data structure.
  246.  */
  247. struct sym_reg {
  248. /*00*/  u8 nc_scntl0; /* full arb., ena parity, par->ATN  */
  249. /*01*/  u8 nc_scntl1; /* no reset                         */
  250.         #define   ISCON   0x10  /* connected to scsi     */
  251.         #define   CRST    0x08  /* force reset                      */
  252.         #define   IARB    0x02  /* immediate arbitration            */
  253. /*02*/  u8 nc_scntl2; /* no disconnect expected           */
  254. #define   SDU     0x80  /* cmd: disconnect will raise error */
  255. #define   CHM     0x40  /* sta: chained mode                */
  256. #define   WSS     0x08  /* sta: wide scsi send           [W]*/
  257. #define   WSR     0x01  /* sta: wide scsi received       [W]*/
  258. /*03*/  u8 nc_scntl3; /* cnf system clock dependent       */
  259. #define   EWS     0x08  /* cmd: enable wide scsi         [W]*/
  260. #define   ULTRA   0x80  /* cmd: ULTRA enable                */
  261. /* bits 0-2, 7 rsvd for C1010       */
  262. /*04*/  u8 nc_scid; /* cnf host adapter scsi address    */
  263. #define   RRE     0x40  /* r/w:e enable response to resel.  */
  264. #define   SRE     0x20  /* r/w:e enable response to select  */
  265. /*05*/  u8 nc_sxfer; /* ### Sync speed and count         */
  266. /* bits 6-7 rsvd for C1010          */
  267. /*06*/  u8 nc_sdid; /* ### Destination-ID               */
  268. /*07*/  u8 nc_gpreg; /* ??? IO-Pins                      */
  269. /*08*/  u8 nc_sfbr; /* ### First byte received          */
  270. /*09*/  u8 nc_socl;
  271. #define   CREQ   0x80 /* r/w: SCSI-REQ                    */
  272. #define   CACK   0x40 /* r/w: SCSI-ACK                    */
  273. #define   CBSY   0x20 /* r/w: SCSI-BSY                    */
  274. #define   CSEL   0x10 /* r/w: SCSI-SEL                    */
  275. #define   CATN   0x08 /* r/w: SCSI-ATN                    */
  276. #define   CMSG   0x04 /* r/w: SCSI-MSG                    */
  277. #define   CC_D   0x02 /* r/w: SCSI-C_D                    */
  278. #define   CI_O   0x01 /* r/w: SCSI-I_O                    */
  279. /*0a*/  u8 nc_ssid;
  280. /*0b*/  u8 nc_sbcl;
  281. /*0c*/  u8 nc_dstat;
  282.         #define   DFE     0x80  /* sta: dma fifo empty              */
  283.         #define   MDPE    0x40  /* int: master data parity error    */
  284.         #define   BF      0x20  /* int: script: bus fault           */
  285.         #define   ABRT    0x10  /* int: script: command aborted     */
  286.         #define   SSI     0x08  /* int: script: single step         */
  287.         #define   SIR     0x04  /* int: script: interrupt instruct. */
  288.         #define   IID     0x01  /* int: script: illegal instruct.   */
  289. /*0d*/  u8 nc_sstat0;
  290.         #define   ILF     0x80  /* sta: data in SIDL register lsb   */
  291.         #define   ORF     0x40  /* sta: data in SODR register lsb   */
  292.         #define   OLF     0x20  /* sta: data in SODL register lsb   */
  293.         #define   AIP     0x10  /* sta: arbitration in progress     */
  294.         #define   LOA     0x08  /* sta: arbitration lost            */
  295.         #define   WOA     0x04  /* sta: arbitration won             */
  296.         #define   IRST    0x02  /* sta: scsi reset signal           */
  297.         #define   SDP     0x01  /* sta: scsi parity signal          */
  298. /*0e*/  u8 nc_sstat1;
  299. #define   FF3210  0xf0 /* sta: bytes in the scsi fifo      */
  300. /*0f*/  u8 nc_sstat2;
  301.         #define   ILF1    0x80  /* sta: data in SIDL register msb[W]*/
  302.         #define   ORF1    0x40  /* sta: data in SODR register msb[W]*/
  303.         #define   OLF1    0x20  /* sta: data in SODL register msb[W]*/
  304.         #define   DM      0x04  /* sta: DIFFSENS mismatch (895/6 only) */
  305.         #define   LDSC    0x02  /* sta: disconnect & reconnect      */
  306. /*10*/  u8 nc_dsa; /* --> Base page                    */
  307. /*11*/  u8 nc_dsa1;
  308. /*12*/  u8 nc_dsa2;
  309. /*13*/  u8 nc_dsa3;
  310. /*14*/  u8 nc_istat; /* --> Main Command and status      */
  311.         #define   CABRT   0x80  /* cmd: abort current operation     */
  312.         #define   SRST    0x40  /* mod: reset chip                  */
  313.         #define   SIGP    0x20  /* r/w: message from host to script */
  314.         #define   SEM     0x10  /* r/w: message between host + script  */
  315.         #define   CON     0x08  /* sta: connected to scsi           */
  316.         #define   INTF    0x04  /* sta: int on the fly (reset by wr)*/
  317.         #define   SIP     0x02  /* sta: scsi-interrupt              */
  318.         #define   DIP     0x01  /* sta: host/script interrupt       */
  319. /*15*/  u8 nc_istat1; /* 896 only */
  320.         #define   FLSH    0x04  /* sta: chip is flushing            */
  321.         #define   SCRUN   0x02  /* sta: scripts are running         */
  322.         #define   SIRQD   0x01  /* r/w: disable INT pin             */
  323. /*16*/  u8 nc_mbox0; /* 896 only */
  324. /*17*/  u8 nc_mbox1; /* 896 only */
  325. /*18*/ u8 nc_ctest0;
  326. /*19*/  u8 nc_ctest1;
  327. /*1a*/  u8 nc_ctest2;
  328. #define   CSIGP   0x40
  329. /* bits 0-2,7 rsvd for C1010        */
  330. /*1b*/  u8 nc_ctest3;
  331. #define   FLF     0x08  /* cmd: flush dma fifo              */
  332. #define   CLF   0x04 /* cmd: clear dma fifo     */
  333. #define   FM      0x02  /* mod: fetch pin mode              */
  334. #define   WRIE    0x01  /* mod: write and invalidate enable */
  335. /* bits 4-7 rsvd for C1010          */
  336. /*1c*/  u32 nc_temp; /* ### Temporary stack              */
  337. /*20*/ u8 nc_dfifo;
  338. /*21*/  u8 nc_ctest4;
  339. #define   BDIS    0x80  /* mod: burst disable               */
  340. #define   MPEE    0x08  /* mod: master parity error enable  */
  341. /*22*/  u8 nc_ctest5;
  342. #define   DFS     0x20  /* mod: dma fifo size               */
  343. /* bits 0-1, 3-7 rsvd for C1010     */
  344. /*23*/  u8 nc_ctest6;
  345. /*24*/  u32 nc_dbc; /* ### Byte count and command       */
  346. /*28*/  u32 nc_dnad; /* ### Next command register        */
  347. /*2c*/  u32 nc_dsp; /* --> Script Pointer               */
  348. /*30*/  u32 nc_dsps; /* --> Script pointer save/opcode#2 */
  349. /*34*/  u8 nc_scratcha; /* Temporary register a            */
  350. /*35*/  u8 nc_scratcha1;
  351. /*36*/  u8 nc_scratcha2;
  352. /*37*/  u8 nc_scratcha3;
  353. /*38*/  u8 nc_dmode;
  354. #define   BL_2    0x80  /* mod: burst length shift value +2 */
  355. #define   BL_1    0x40  /* mod: burst length shift value +1 */
  356. #define   ERL     0x08  /* mod: enable read line            */
  357. #define   ERMP    0x04  /* mod: enable read multiple        */
  358. #define   BOF     0x02  /* mod: burst op code fetch         */
  359. /*39*/  u8 nc_dien;
  360. /*3a*/  u8 nc_sbr;
  361. /*3b*/  u8 nc_dcntl; /* --> Script execution control     */
  362. #define   CLSE    0x80  /* mod: cache line size enable      */
  363. #define   PFF     0x40  /* cmd: pre-fetch flush             */
  364. #define   PFEN    0x20  /* mod: pre-fetch enable            */
  365. #define   SSM     0x10  /* mod: single step mode            */
  366. #define   IRQM    0x08  /* mod: irq mode (1 = totem pole !) */
  367. #define   STD     0x04  /* cmd: start dma mode              */
  368. #define   IRQD    0x02  /* mod: irq disable                 */
  369.   #define   NOCOM   0x01 /* cmd: protect sfbr while reselect */
  370. /* bits 0-1 rsvd for C1010          */
  371. /*3c*/  u32 nc_adder;
  372. /*40*/  u16 nc_sien; /* -->: interrupt enable            */
  373. /*42*/  u16 nc_sist; /* <--: interrupt status            */
  374.         #define   SBMC    0x1000/* sta: SCSI Bus Mode Change (895/6 only) */
  375.         #define   STO     0x0400/* sta: timeout (select)            */
  376.         #define   GEN     0x0200/* sta: timeout (general)           */
  377.         #define   HTH     0x0100/* sta: timeout (handshake)         */
  378.         #define   MA      0x80  /* sta: phase mismatch              */
  379.         #define   CMP     0x40  /* sta: arbitration complete        */
  380.         #define   SEL     0x20  /* sta: selected by another device  */
  381.         #define   RSL     0x10  /* sta: reselected by another device*/
  382.         #define   SGE     0x08  /* sta: gross error (over/underflow)*/
  383.         #define   UDC     0x04  /* sta: unexpected disconnect       */
  384.         #define   RST     0x02  /* sta: scsi bus reset detected     */
  385.         #define   PAR     0x01  /* sta: scsi parity error           */
  386. /*44*/  u8 nc_slpar;
  387. /*45*/  u8 nc_swide;
  388. /*46*/  u8 nc_macntl;
  389. /*47*/  u8 nc_gpcntl;
  390. /*48*/  u8 nc_stime0; /* cmd: timeout for select&handshake*/
  391. /*49*/  u8 nc_stime1; /* cmd: timeout user defined        */
  392. /*4a*/  u16 nc_respid; /* sta: Reselect-IDs                */
  393. /*4c*/  u8 nc_stest0;
  394. /*4d*/  u8 nc_stest1;
  395. #define   SCLK    0x80 /* Use the PCI clock as SCSI clock */
  396. #define   DBLEN   0x08 /* clock doubler running */
  397. #define   DBLSEL  0x04 /* clock doubler selected */
  398.   
  399. /*4e*/  u8 nc_stest2;
  400. #define   ROF     0x40 /* reset scsi offset (after gross error!) */
  401. #define   EXT     0x02  /* extended filtering                     */
  402. /*4f*/  u8 nc_stest3;
  403. #define   TE     0x80 /* c: tolerAnt enable */
  404. #define   HSC    0x20 /* c: Halt SCSI Clock */
  405. #define   CSF    0x02 /* c: clear scsi fifo */
  406. /*50*/  u16 nc_sidl; /* Lowlevel: latched from scsi data */
  407. /*52*/  u8 nc_stest4;
  408. #define   SMODE  0xc0 /* SCSI bus mode      (895/6 only) */
  409. #define    SMODE_HVD 0x40 /* High Voltage Differential       */
  410. #define    SMODE_SE  0x80 /* Single Ended                    */
  411. #define    SMODE_LVD 0xc0 /* Low Voltage Differential        */
  412. #define   LCKFRQ 0x20 /* Frequency Lock (895/6 only)     */
  413. /* bits 0-5 rsvd for C1010         */
  414. /*53*/  u8 nc_53_;
  415. /*54*/  u16 nc_sodl; /* Lowlevel: data out to scsi data  */
  416. /*56*/ u8 nc_ccntl0; /* Chip Control 0 (896)             */
  417. #define   ENPMJ  0x80 /* Enable Phase Mismatch Jump       */
  418. #define   PMJCTL 0x40 /* Phase Mismatch Jump Control      */
  419. #define   ENNDJ  0x20 /* Enable Non Data PM Jump          */
  420. #define   DISFC  0x10 /* Disable Auto FIFO Clear          */
  421. #define   DILS   0x02 /* Disable Internal Load/Store      */
  422. #define   DPR    0x01 /* Disable Pipe Req                 */
  423. /*57*/ u8 nc_ccntl1; /* Chip Control 1 (896)             */
  424. #define   ZMOD   0x80 /* High Impedance Mode              */
  425. #define   DDAC   0x08 /* Disable Dual Address Cycle       */
  426. #define   XTIMOD 0x04 /* 64-bit Table Ind. Indexing Mode  */
  427. #define   EXTIBMV 0x02 /* Enable 64-bit Table Ind. BMOV    */
  428. #define   EXDBMV 0x01 /* Enable 64-bit Direct BMOV        */
  429. /*58*/  u16 nc_sbdl; /* Lowlevel: data from scsi data    */
  430. /*5a*/  u16 nc_5a_;
  431. /*5c*/  u8 nc_scr0; /* Working register B               */
  432. /*5d*/  u8 nc_scr1;
  433. /*5e*/  u8 nc_scr2;
  434. /*5f*/  u8 nc_scr3;
  435. /*60*/  u8 nc_scrx[64]; /* Working register C-R             */
  436. /*a0*/ u32 nc_mmrs; /* Memory Move Read Selector        */
  437. /*a4*/ u32 nc_mmws; /* Memory Move Write Selector       */
  438. /*a8*/ u32 nc_sfs; /* Script Fetch Selector            */
  439. /*ac*/ u32 nc_drs; /* DSA Relative Selector            */
  440. /*b0*/ u32 nc_sbms; /* Static Block Move Selector       */
  441. /*b4*/ u32 nc_dbms; /* Dynamic Block Move Selector      */
  442. /*b8*/ u32 nc_dnad64; /* DMA Next Address 64              */
  443. /*bc*/ u16 nc_scntl4; /* C1010 only                       */
  444. #define   U3EN    0x80 /* Enable Ultra 3                   */
  445. #define   AIPCKEN 0x40  /* AIP checking enable              */
  446. /* Also enable AIP generation on C10-33*/
  447. #define   XCLKH_DT 0x08 /* Extra clock of data hold on DT edge */
  448. #define   XCLKH_ST 0x04 /* Extra clock of data hold on ST edge */
  449. #define   XCLKS_DT 0x02 /* Extra clock of data set  on DT edge */
  450. #define   XCLKS_ST 0x01 /* Extra clock of data set  on ST edge */
  451. /*be*/ u8 nc_aipcntl0; /* AIP Control 0 C1010 only         */
  452. /*bf*/ u8 nc_aipcntl1; /* AIP Control 1 C1010 only         */
  453. #define DISAIP  0x08 /* Disable AIP generation C10-66 only  */
  454. /*c0*/ u32 nc_pmjad1; /* Phase Mismatch Jump Address 1    */
  455. /*c4*/ u32 nc_pmjad2; /* Phase Mismatch Jump Address 2    */
  456. /*c8*/ u8 nc_rbc; /* Remaining Byte Count             */
  457. /*c9*/ u8 nc_rbc1;
  458. /*ca*/ u8 nc_rbc2;
  459. /*cb*/ u8 nc_rbc3;
  460. /*cc*/ u8 nc_ua; /* Updated Address                  */
  461. /*cd*/ u8 nc_ua1;
  462. /*ce*/ u8 nc_ua2;
  463. /*cf*/ u8 nc_ua3;
  464. /*d0*/ u32 nc_esa; /* Entry Storage Address            */
  465. /*d4*/ u8 nc_ia; /* Instruction Address              */
  466. /*d5*/ u8 nc_ia1;
  467. /*d6*/ u8 nc_ia2;
  468. /*d7*/ u8 nc_ia3;
  469. /*d8*/ u32 nc_sbc; /* SCSI Byte Count (3 bytes only)   */
  470. /*dc*/ u32 nc_csbc; /* Cumulative SCSI Byte Count       */
  471.                                 /* Following for C1010 only         */
  472. /*e0*/ u16    nc_crcpad; /* CRC Value                        */
  473. /*e2*/ u8     nc_crccntl0; /* CRC control register             */
  474. #define   SNDCRC  0x10 /* Send CRC Request                 */
  475. /*e3*/ u8     nc_crccntl1; /* CRC control register             */
  476. /*e4*/ u32    nc_crcdata; /* CRC data register                */
  477. /*e8*/ u32    nc_e8_;
  478. /*ec*/ u32    nc_ec_;
  479. /*f0*/ u16    nc_dfbc; /* DMA FIFO byte count              */ 
  480. };
  481. /*-----------------------------------------------------------
  482.  *
  483.  * Utility macros for the script.
  484.  *
  485.  *-----------------------------------------------------------
  486.  */
  487. #define REGJ(p,r) (offsetof(struct sym_reg, p ## r))
  488. #define REG(r) REGJ (nc_, r)
  489. /*-----------------------------------------------------------
  490.  *
  491.  * SCSI phases
  492.  *
  493.  *-----------------------------------------------------------
  494.  */
  495. #define SCR_DATA_OUT 0x00000000
  496. #define SCR_DATA_IN 0x01000000
  497. #define SCR_COMMAND 0x02000000
  498. #define SCR_STATUS 0x03000000
  499. #define SCR_DT_DATA_OUT 0x04000000
  500. #define SCR_DT_DATA_IN 0x05000000
  501. #define SCR_MSG_OUT 0x06000000
  502. #define SCR_MSG_IN      0x07000000
  503. /* DT phases are illegal for non Ultra3 mode */
  504. #define SCR_ILG_OUT 0x04000000
  505. #define SCR_ILG_IN 0x05000000
  506. /*-----------------------------------------------------------
  507.  *
  508.  * Data transfer via SCSI.
  509.  *
  510.  *-----------------------------------------------------------
  511.  *
  512.  * MOVE_ABS (LEN)
  513.  * <<start address>>
  514.  *
  515.  * MOVE_IND (LEN)
  516.  * <<dnad_offset>>
  517.  *
  518.  * MOVE_TBL
  519.  * <<dnad_offset>>
  520.  *
  521.  *-----------------------------------------------------------
  522.  */
  523. #define OPC_MOVE          0x08000000
  524. #define SCR_MOVE_ABS(l) ((0x00000000 | OPC_MOVE) | (l))
  525. /* #define SCR_MOVE_IND(l) ((0x20000000 | OPC_MOVE) | (l)) */
  526. #define SCR_MOVE_TBL     (0x10000000 | OPC_MOVE)
  527. #define SCR_CHMOV_ABS(l) ((0x00000000) | (l))
  528. /* #define SCR_CHMOV_IND(l) ((0x20000000) | (l)) */
  529. #define SCR_CHMOV_TBL     (0x10000000)
  530. #ifdef SYM_CONF_TARGET_ROLE_SUPPORT
  531. /* We steal the `indirect addressing' flag for target mode MOVE in scripts */
  532. #define OPC_TCHMOVE        0x08000000
  533. #define SCR_TCHMOVE_ABS(l) ((0x20000000 | OPC_TCHMOVE) | (l))
  534. #define SCR_TCHMOVE_TBL     (0x30000000 | OPC_TCHMOVE)
  535. #define SCR_TMOV_ABS(l)    ((0x20000000) | (l))
  536. #define SCR_TMOV_TBL        (0x30000000)
  537. #endif
  538. struct sym_tblmove {
  539.         u32  size;
  540.         u32  addr;
  541. };
  542. /*-----------------------------------------------------------
  543.  *
  544.  * Selection
  545.  *
  546.  *-----------------------------------------------------------
  547.  *
  548.  * SEL_ABS | SCR_ID (0..15)    [ | REL_JMP]
  549.  * <<alternate_address>>
  550.  *
  551.  * SEL_TBL | << dnad_offset>>  [ | REL_JMP]
  552.  * <<alternate_address>>
  553.  *
  554.  *-----------------------------------------------------------
  555.  */
  556. #define SCR_SEL_ABS 0x40000000
  557. #define SCR_SEL_ABS_ATN 0x41000000
  558. #define SCR_SEL_TBL 0x42000000
  559. #define SCR_SEL_TBL_ATN 0x43000000
  560. #ifdef SYM_CONF_TARGET_ROLE_SUPPORT
  561. #define SCR_RESEL_ABS     0x40000000
  562. #define SCR_RESEL_ABS_ATN 0x41000000
  563. #define SCR_RESEL_TBL     0x42000000
  564. #define SCR_RESEL_TBL_ATN 0x43000000
  565. #endif
  566. struct sym_tblsel {
  567.         u_char  sel_scntl4; /* C1010 only */
  568.         u_char  sel_sxfer;
  569.         u_char  sel_id;
  570.         u_char  sel_scntl3;
  571. };
  572. #define SCR_JMP_REL     0x04000000
  573. #define SCR_ID(id) (((u32)(id)) << 16)
  574. /*-----------------------------------------------------------
  575.  *
  576.  * Waiting for Disconnect or Reselect
  577.  *
  578.  *-----------------------------------------------------------
  579.  *
  580.  * WAIT_DISC
  581.  * dummy: <<alternate_address>>
  582.  *
  583.  * WAIT_RESEL
  584.  * <<alternate_address>>
  585.  *
  586.  *-----------------------------------------------------------
  587.  */
  588. #define SCR_WAIT_DISC 0x48000000
  589. #define SCR_WAIT_RESEL  0x50000000
  590. #ifdef SYM_CONF_TARGET_ROLE_SUPPORT
  591. #define SCR_DISCONNECT 0x48000000
  592. #endif
  593. /*-----------------------------------------------------------
  594.  *
  595.  * Bit Set / Reset
  596.  *
  597.  *-----------------------------------------------------------
  598.  *
  599.  * SET (flags {|.. })
  600.  *
  601.  * CLR (flags {|.. })
  602.  *
  603.  *-----------------------------------------------------------
  604.  */
  605. #define SCR_SET(f)     (0x58000000 | (f))
  606. #define SCR_CLR(f)     (0x60000000 | (f))
  607. #define SCR_CARRY 0x00000400
  608. #define SCR_TRG 0x00000200
  609. #define SCR_ACK 0x00000040
  610. #define SCR_ATN 0x00000008
  611. /*-----------------------------------------------------------
  612.  *
  613.  * Memory to memory move
  614.  *
  615.  *-----------------------------------------------------------
  616.  *
  617.  * COPY (bytecount)
  618.  * << source_address >>
  619.  * << destination_address >>
  620.  *
  621.  * SCR_COPY   sets the NO FLUSH option by default.
  622.  * SCR_COPY_F does not set this option.
  623.  *
  624.  * For chips which do not support this option,
  625.  * sym_fw_bind_script() will remove this bit.
  626.  *
  627.  *-----------------------------------------------------------
  628.  */
  629. #define SCR_NO_FLUSH 0x01000000
  630. #define SCR_COPY(n) (0xc0000000 | SCR_NO_FLUSH | (n))
  631. #define SCR_COPY_F(n) (0xc0000000 | (n))
  632. /*-----------------------------------------------------------
  633.  *
  634.  * Register move and binary operations
  635.  *
  636.  *-----------------------------------------------------------
  637.  *
  638.  * SFBR_REG (reg, op, data)        reg  = SFBR op data
  639.  * << 0 >>
  640.  *
  641.  * REG_SFBR (reg, op, data)        SFBR = reg op data
  642.  * << 0 >>
  643.  *
  644.  * REG_REG  (reg, op, data)        reg  = reg op data
  645.  * << 0 >>
  646.  *
  647.  *-----------------------------------------------------------
  648.  *
  649.  * On 825A, 875, 895 and 896 chips the content 
  650.  * of SFBR register can be used as data (SCR_SFBR_DATA).
  651.  * The 896 has additionnal IO registers starting at 
  652.  * offset 0x80. Bit 7 of register offset is stored in 
  653.  * bit 7 of the SCRIPTS instruction first DWORD.
  654.  *
  655.  *-----------------------------------------------------------
  656.  */
  657. #define SCR_REG_OFS(ofs) ((((ofs) & 0x7f) << 16ul) + ((ofs) & 0x80)) 
  658. #define SCR_SFBR_REG(reg,op,data) 
  659.         (0x68000000 | (SCR_REG_OFS(REG(reg))) | (op) | (((data)&0xff)<<8ul))
  660. #define SCR_REG_SFBR(reg,op,data) 
  661.         (0x70000000 | (SCR_REG_OFS(REG(reg))) | (op) | (((data)&0xff)<<8ul))
  662. #define SCR_REG_REG(reg,op,data) 
  663.         (0x78000000 | (SCR_REG_OFS(REG(reg))) | (op) | (((data)&0xff)<<8ul))
  664. #define      SCR_LOAD   0x00000000
  665. #define      SCR_SHL    0x01000000
  666. #define      SCR_OR     0x02000000
  667. #define      SCR_XOR    0x03000000
  668. #define      SCR_AND    0x04000000
  669. #define      SCR_SHR    0x05000000
  670. #define      SCR_ADD    0x06000000
  671. #define      SCR_ADDC   0x07000000
  672. #define      SCR_SFBR_DATA   (0x00800000>>8ul) /* Use SFBR as data */
  673. /*-----------------------------------------------------------
  674.  *
  675.  * FROM_REG (reg)   SFBR = reg
  676.  * << 0 >>
  677.  *
  678.  * TO_REG  (reg)   reg  = SFBR
  679.  * << 0 >>
  680.  *
  681.  * LOAD_REG (reg, data)   reg  = <data>
  682.  * << 0 >>
  683.  *
  684.  * LOAD_SFBR(data)    SFBR = <data>
  685.  * << 0 >>
  686.  *
  687.  *-----------------------------------------------------------
  688.  */
  689. #define SCR_FROM_REG(reg) 
  690. SCR_REG_SFBR(reg,SCR_OR,0)
  691. #define SCR_TO_REG(reg) 
  692. SCR_SFBR_REG(reg,SCR_OR,0)
  693. #define SCR_LOAD_REG(reg,data) 
  694. SCR_REG_REG(reg,SCR_LOAD,data)
  695. #define SCR_LOAD_SFBR(data) 
  696.         (SCR_REG_SFBR (gpreg, SCR_LOAD, data))
  697. /*-----------------------------------------------------------
  698.  *
  699.  * LOAD  from memory   to register.
  700.  * STORE from register to memory.
  701.  *
  702.  * Only supported by 810A, 860, 825A, 875, 895 and 896.
  703.  *
  704.  *-----------------------------------------------------------
  705.  *
  706.  * LOAD_ABS (LEN)
  707.  * <<start address>>
  708.  *
  709.  * LOAD_REL (LEN)        (DSA relative)
  710.  * <<dsa_offset>>
  711.  *
  712.  *-----------------------------------------------------------
  713.  */
  714. #define SCR_REG_OFS2(ofs) (((ofs) & 0xff) << 16ul)
  715. #define SCR_NO_FLUSH2 0x02000000
  716. #define SCR_DSA_REL2 0x10000000
  717. #define SCR_LOAD_R(reg, how, n) 
  718.         (0xe1000000 | how | (SCR_REG_OFS2(REG(reg))) | (n))
  719. #define SCR_STORE_R(reg, how, n) 
  720.         (0xe0000000 | how | (SCR_REG_OFS2(REG(reg))) | (n))
  721. #define SCR_LOAD_ABS(reg, n) SCR_LOAD_R(reg, SCR_NO_FLUSH2, n)
  722. #define SCR_LOAD_REL(reg, n) SCR_LOAD_R(reg, SCR_NO_FLUSH2|SCR_DSA_REL2, n)
  723. #define SCR_LOAD_ABS_F(reg, n) SCR_LOAD_R(reg, 0, n)
  724. #define SCR_LOAD_REL_F(reg, n) SCR_LOAD_R(reg, SCR_DSA_REL2, n)
  725. #define SCR_STORE_ABS(reg, n) SCR_STORE_R(reg, SCR_NO_FLUSH2, n)
  726. #define SCR_STORE_REL(reg, n) SCR_STORE_R(reg, SCR_NO_FLUSH2|SCR_DSA_REL2,n)
  727. #define SCR_STORE_ABS_F(reg, n) SCR_STORE_R(reg, 0, n)
  728. #define SCR_STORE_REL_F(reg, n) SCR_STORE_R(reg, SCR_DSA_REL2, n)
  729. /*-----------------------------------------------------------
  730.  *
  731.  * Waiting for Disconnect or Reselect
  732.  *
  733.  *-----------------------------------------------------------
  734.  *
  735.  * JUMP            [ | IFTRUE/IFFALSE ( ... ) ]
  736.  * <<address>>
  737.  *
  738.  * JUMPR           [ | IFTRUE/IFFALSE ( ... ) ]
  739.  * <<distance>>
  740.  *
  741.  * CALL            [ | IFTRUE/IFFALSE ( ... ) ]
  742.  * <<address>>
  743.  *
  744.  * CALLR           [ | IFTRUE/IFFALSE ( ... ) ]
  745.  * <<distance>>
  746.  *
  747.  * RETURN          [ | IFTRUE/IFFALSE ( ... ) ]
  748.  * <<dummy>>
  749.  *
  750.  * INT             [ | IFTRUE/IFFALSE ( ... ) ]
  751.  * <<ident>>
  752.  *
  753.  * INT_FLY         [ | IFTRUE/IFFALSE ( ... ) ]
  754.  * <<ident>>
  755.  *
  756.  * Conditions:
  757.  *      WHEN (phase)
  758.  *      IF   (phase)
  759.  *      CARRYSET
  760.  *      DATA (data, mask)
  761.  *
  762.  *-----------------------------------------------------------
  763.  */
  764. #define SCR_NO_OP       0x80000000
  765. #define SCR_JUMP        0x80080000
  766. #define SCR_JUMP64      0x80480000
  767. #define SCR_JUMPR       0x80880000
  768. #define SCR_CALL        0x88080000
  769. #define SCR_CALLR       0x88880000
  770. #define SCR_RETURN      0x90080000
  771. #define SCR_INT         0x98080000
  772. #define SCR_INT_FLY     0x98180000
  773. #define IFFALSE(arg)   (0x00080000 | (arg))
  774. #define IFTRUE(arg)    (0x00000000 | (arg))
  775. #define WHEN(phase)    (0x00030000 | (phase))
  776. #define IF(phase)      (0x00020000 | (phase))
  777. #define DATA(D)        (0x00040000 | ((D) & 0xff))
  778. #define MASK(D,M)      (0x00040000 | (((M ^ 0xff) & 0xff) << 8ul)|((D) & 0xff))
  779. #define CARRYSET       (0x00200000)
  780. /*-----------------------------------------------------------
  781.  *
  782.  * SCSI  constants.
  783.  *
  784.  *-----------------------------------------------------------
  785.  */
  786. /*
  787.  * Messages
  788.  */
  789. #define M_COMPLETE (0x00)
  790. #define M_EXTENDED (0x01)
  791. #define M_SAVE_DP (0x02)
  792. #define M_RESTORE_DP (0x03)
  793. #define M_DISCONNECT (0x04)
  794. #define M_ID_ERROR (0x05)
  795. #define M_ABORT (0x06)
  796. #define M_REJECT (0x07)
  797. #define M_NOOP (0x08)
  798. #define M_PARITY (0x09)
  799. #define M_LCOMPLETE (0x0a)
  800. #define M_FCOMPLETE (0x0b)
  801. #define M_RESET (0x0c)
  802. #define M_ABORT_TAG (0x0d)
  803. #define M_CLEAR_QUEUE (0x0e)
  804. #define M_INIT_REC (0x0f)
  805. #define M_REL_REC (0x10)
  806. #define M_TERMINATE (0x11)
  807. #define M_SIMPLE_TAG (0x20)
  808. #define M_HEAD_TAG (0x21)
  809. #define M_ORDERED_TAG (0x22)
  810. #define M_IGN_RESIDUE (0x23)
  811. #define M_IDENTIFY    (0x80)
  812. #define M_X_MODIFY_DP (0x00)
  813. #define M_X_SYNC_REQ (0x01)
  814. #define M_X_WIDE_REQ (0x03)
  815. #define M_X_PPR_REQ (0x04)
  816. /*
  817.  * PPR protocol options
  818.  */
  819. #define PPR_OPT_IU (0x01)
  820. #define PPR_OPT_DT (0x02)
  821. #define PPR_OPT_QAS (0x04)
  822. #define PPR_OPT_MASK (0x07)
  823. /*
  824.  * Status
  825.  */
  826. #define S_GOOD (0x00)
  827. #define S_CHECK_COND (0x02)
  828. #define S_COND_MET (0x04)
  829. #define S_BUSY (0x08)
  830. #define S_INT (0x10)
  831. #define S_INT_COND_MET (0x14)
  832. #define S_CONFLICT (0x18)
  833. #define S_TERMINATED (0x20)
  834. #define S_QUEUE_FULL (0x28)
  835. #define S_ILLEGAL (0xff)
  836. #endif /* defined SYM_DEFS_H */