iir.h revision 120477
189580Smsmith/* $FreeBSD: head/sys/dev/iir/iir.h 120477 2003-09-26 15:36:47Z scottl $ */
289580Smsmith/*
3120477Sscottl *       Copyright (c) 2000-03 ICP vortex GmbH
4120477Sscottl *       Copyright (c) 2002-03 Intel Corporation
5120477Sscottl *       Copyright (c) 2003    Adaptec Inc.
689580Smsmith *       All Rights Reserved
789580Smsmith *
889580Smsmith * Redistribution and use in source and binary forms, with or without
989580Smsmith * modification, are permitted provided that the following conditions
1089580Smsmith * are met:
1189580Smsmith * 1. Redistributions of source code must retain the above copyright
1289580Smsmith *    notice, this list of conditions, and the following disclaimer,
1389580Smsmith *    without modification, immediately at the beginning of the file.
1489580Smsmith * 2. Redistributions in binary form must reproduce the above copyright
1589580Smsmith *    notice, this list of conditions and the following disclaimer in the
1689580Smsmith *    documentation and/or other materials provided with the distribution.
1789580Smsmith * 3. The name of the author may not be used to endorse or promote products
1889580Smsmith *    derived from this software without specific prior written permission.
1989580Smsmith *
2089580Smsmith * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
2189580Smsmith * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2289580Smsmith * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2389580Smsmith * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
2489580Smsmith * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2589580Smsmith * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2689580Smsmith * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2789580Smsmith * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2889580Smsmith * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2989580Smsmith * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3089580Smsmith * SUCH DAMAGE.
3189580Smsmith *
3289580Smsmith */
3389580Smsmith
3489580Smsmith/*
3589580Smsmith *
3689580Smsmith * iir.h:       Definitions/Constants used by the Intel Integrated RAID driver
3789580Smsmith *
38120477Sscottl * Written by: 	Achim Leubner <achim_leubner@adaptec.com>
3989580Smsmith * Fixes/Additions:	Boji Tony Kannanthanam <boji.t.kannanthanam@intel.com>
4089580Smsmith *
4189580Smsmith * credits:     Niklas Hallqvist;       OpenBSD driver for the ICP Controllers.
4289580Smsmith *              FreeBSD.ORG;            Great O/S to work on and for.
43120477Sscottl *
44120477Sscottl * $Id: iir.h 1.5 2003/08/26 12:28:21 achim Exp $"
4589580Smsmith */
4689580Smsmith
4789580Smsmith#ifndef _IIR_H
4889580Smsmith#define _IIR_H
4989580Smsmith
5089580Smsmith#define IIR_DRIVER_VERSION      1
51120477Sscottl#define IIR_DRIVER_SUBVERSION   4
5289580Smsmith
5389580Smsmith#define IIR_CDEV_MAJOR          164
5489580Smsmith
55120477Sscottl/* OEM IDs */
56120477Sscottl#define OEM_ID_ICP              0x941c
57120477Sscottl#define OEM_ID_INTEL            0x8000
58120477Sscottl
5989580Smsmith#define GDT_VENDOR_ID           0x1119
6089580Smsmith#define GDT_DEVICE_ID_MIN       0x100
6189580Smsmith#define GDT_DEVICE_ID_MAX       0x2ff
6289580Smsmith#define GDT_DEVICE_ID_NEWRX     0x300
6389580Smsmith
6489580Smsmith#define INTEL_VENDOR_ID         0x8086
6589580Smsmith#define INTEL_DEVICE_ID_IIR     0x600
6689580Smsmith
6789580Smsmith#define GDT_MAXBUS              6       /* XXX Why not 5? */
6889580Smsmith#define GDT_MAX_HDRIVES         100     /* max 100 host drives */
6989580Smsmith#define GDT_MAXID_FC            127     /* Fibre-channel IDs */
7089580Smsmith#define GDT_MAXID               16      /* SCSI IDs */
7189580Smsmith#define GDT_MAXOFFSETS          128
7289580Smsmith#define GDT_MAXSG               32      /* Max. s/g elements */
7389580Smsmith#define GDT_PROTOCOL_VERSION    1
7489580Smsmith#define GDT_LINUX_OS            8       /* Used for cache optimization */
7589580Smsmith#define GDT_SCATTER_GATHER      1       /* s/g feature */
7689580Smsmith#define GDT_SECS32              0x1f    /* round capacity */
7789580Smsmith#define GDT_LOCALBOARD          0       /* Board node always 0 */
7889580Smsmith#define GDT_MAXCMDS             124
7989580Smsmith#define GDT_SECTOR_SIZE         0x200   /* Always 512 bytes for cache devs */
8089580Smsmith#define GDT_MAX_EVENTS          0x100   /* event buffer */
8189580Smsmith
8289580Smsmith/* DPMEM constants */
8389580Smsmith#define GDT_MPR_MAGIC           0xc0ffee11
8489580Smsmith#define GDT_IC_HEADER_BYTES     48
8589580Smsmith#define GDT_IC_QUEUE_BYTES      4
8689580Smsmith#define GDT_DPMEM_COMMAND_OFFSET \
8789580Smsmith    (GDT_IC_HEADER_BYTES + GDT_IC_QUEUE_BYTES * GDT_MAXOFFSETS)
8889580Smsmith
8989580Smsmith/* geometry constants */
9089580Smsmith#define GDT_MAXCYLS             1024
9189580Smsmith#define GDT_HEADS               64
9289580Smsmith#define GDT_SECS                32      /* mapping 64*32 */
9389580Smsmith#define GDT_MEDHEADS            127
9489580Smsmith#define GDT_MEDSECS             63      /* mapping 127*63 */
9589580Smsmith#define GDT_BIGHEADS            255
9689580Smsmith#define GDT_BIGSECS             63      /* mapping 255*63 */
9789580Smsmith
9889580Smsmith/* data direction raw service */
9989580Smsmith#define GDT_DATA_IN             0x01000000L
10089580Smsmith#define GDT_DATA_OUT            0x00000000L
10189580Smsmith
10289580Smsmith/* Cache/raw service commands */
10389580Smsmith#define GDT_INIT        0               /* service initialization */
10489580Smsmith#define GDT_READ        1               /* read command */
10589580Smsmith#define GDT_WRITE       2               /* write command */
10689580Smsmith#define GDT_INFO        3               /* information about devices */
10789580Smsmith#define GDT_FLUSH       4               /* flush dirty cache buffers */
10889580Smsmith#define GDT_IOCTL       5               /* ioctl command */
10989580Smsmith#define GDT_DEVTYPE     9               /* additional information */
11089580Smsmith#define GDT_MOUNT       10              /* mount cache device */
11189580Smsmith#define GDT_UNMOUNT     11              /* unmount cache device */
11289580Smsmith#define GDT_SET_FEAT    12              /* set features (scatter/gather) */
11389580Smsmith#define GDT_GET_FEAT    13              /* get features */
11489580Smsmith#define GDT_WRITE_THR   16              /* write through */
11589580Smsmith#define GDT_READ_THR    17              /* read through */
11689580Smsmith#define GDT_EXT_INFO    18              /* extended info */
11789580Smsmith#define GDT_RESET       19              /* controller reset */
11889580Smsmith#define GDT_FREEZE_IO   25              /* freeze all IOs */
11989580Smsmith#define GDT_UNFREEZE_IO 26              /* unfreeze all IOs */
12089580Smsmith
12189580Smsmith/* Additional raw service commands */
12289580Smsmith#define GDT_RESERVE     14              /* reserve device to raw service */
12389580Smsmith#define GDT_RELEASE     15              /* release device */
12489580Smsmith#define GDT_RESERVE_ALL 16              /* reserve all devices */
12589580Smsmith#define GDT_RELEASE_ALL 17              /* release all devices */
12689580Smsmith#define GDT_RESET_BUS   18              /* reset bus */
12789580Smsmith#define GDT_SCAN_START  19              /* start device scan */
12889580Smsmith#define GDT_SCAN_END    20              /* stop device scan */
12989580Smsmith
13089580Smsmith/* IOCTL command defines */
13189580Smsmith#define GDT_SCSI_DR_INFO        0x00    /* SCSI drive info */
13289580Smsmith#define GDT_SCSI_CHAN_CNT       0x05    /* SCSI channel count */
13389580Smsmith#define GDT_SCSI_DR_LIST        0x06    /* SCSI drive list */
13489580Smsmith#define GDT_SCSI_DEF_CNT        0x15    /* grown/primary defects */
13589580Smsmith#define GDT_DSK_STATISTICS      0x4b    /* SCSI disk statistics */
13689580Smsmith#define GDT_IOCHAN_DESC         0x5d    /* description of IO channel */
13789580Smsmith#define GDT_IOCHAN_RAW_DESC     0x5e    /* description of raw IO channel */
13889580Smsmith
13989580Smsmith#define GDT_L_CTRL_PATTERN      0x20000000      /* SCSI IOCTL mask */
14089580Smsmith#define GDT_ARRAY_INFO          0x12            /* array drive info */
14189580Smsmith#define GDT_ARRAY_DRV_LIST      0x0f            /* array drive list */
14289580Smsmith#define GDT_LA_CTRL_PATTERN     0x10000000      /* array IOCTL mask */
14389580Smsmith#define GDT_CACHE_DRV_CNT       0x01            /* cache drive count */
14489580Smsmith#define GDT_CACHE_DRV_LIST      0x02            /* cache drive list */
14589580Smsmith#define GDT_CACHE_INFO          0x04            /* cache info */
14689580Smsmith#define GDT_CACHE_CONFIG        0x05            /* cache configuration */
14789580Smsmith#define GDT_CACHE_DRV_INFO      0x07            /* cache drive info */
14889580Smsmith#define GDT_BOARD_FEATURES      0x15            /* controller features */
14989580Smsmith#define GDT_BOARD_INFO          0x28            /* controller info */
150114001Sscottl#define GDT_OEM_STR_RECORD      0x84            /* OEM info */
15189580Smsmith#define GDT_HOST_GET            0x10001         /* get host drive list */
15289580Smsmith#define GDT_IO_CHANNEL          0x20000         /* default IO channel */
15389580Smsmith#define GDT_INVALID_CHANNEL     0xffff          /* invalid channel */
15489580Smsmith
15589580Smsmith/* IOCTLs */
15689580Smsmith#define GDT_IOCTL_GENERAL       _IOWR('J', 0, gdt_ucmd_t) /* general IOCTL */
157120477Sscottl#define GDT_IOCTL_DRVERS        _IOR('J', 1, int)      /* get driver version */
158120477Sscottl#define GDT_IOCTL_CTRTYPE       _IOWR('J', 2, gdt_ctrt_t) /* get ctr. type */
15989580Smsmith#define GDT_IOCTL_OSVERS        _IOR('J', 3, gdt_osv_t) /* get OS version */
16089580Smsmith#define GDT_IOCTL_CTRCNT        _IOR('J', 5, int)       /* get ctr. count */
16189580Smsmith#define GDT_IOCTL_EVENT         _IOWR('J', 8, gdt_event_t) /* get event */
16289580Smsmith#define GDT_IOCTL_STATIST       _IOR('J', 9, gdt_statist_t) /* get statistics */
16389580Smsmith
16489580Smsmith/* Service errors */
16589580Smsmith#define GDT_S_OK                1       /* no error */
16689580Smsmith#define GDT_S_BSY               7       /* controller busy */
16789580Smsmith#define GDT_S_RAW_SCSI          12      /* raw service: target error */
16889580Smsmith#define GDT_S_RAW_ILL           0xff    /* raw service: illegal */
16989580Smsmith#define GDT_S_NO_STATUS         0x1000  /* got no status (driver-generated) */
17089580Smsmith
17189580Smsmith/* Controller services */
17289580Smsmith#define GDT_SCSIRAWSERVICE      3
17389580Smsmith#define GDT_CACHESERVICE        9
17489580Smsmith#define GDT_SCREENSERVICE       11
17589580Smsmith
17689580Smsmith/* Scatter/gather element */
17789580Smsmith#define GDT_SG_PTR              0x00    /* u_int32_t, address */
17889580Smsmith#define GDT_SG_LEN              0x04    /* u_int32_t, length */
17989580Smsmith#define GDT_SG_SZ               0x08
18089580Smsmith
18189580Smsmith/* Cache service command */
18289580Smsmith#define GDT_CACHE_DEVICENO      0x00    /* u_int16_t, number of cache drive */
18389580Smsmith#define GDT_CACHE_BLOCKNO       0x02    /* u_int32_t, block number */
18489580Smsmith#define GDT_CACHE_BLOCKCNT      0x06    /* u_int32_t, block count */
18589580Smsmith#define GDT_CACHE_DESTADDR      0x0a    /* u_int32_t, dest. addr. (-1: s/g) */
18689580Smsmith#define GDT_CACHE_SG_CANZ       0x0e    /* u_int32_t, s/g element count */
18789580Smsmith#define GDT_CACHE_SG_LST        0x12    /* [GDT_MAXSG], s/g list */
18889580Smsmith#define GDT_CACHE_SZ            (0x12 + GDT_MAXSG * GDT_SG_SZ)
18989580Smsmith
19089580Smsmith/* Ioctl command */
19189580Smsmith#define GDT_IOCTL_PARAM_SIZE    0x00    /* u_int16_t, size of buffer */
19289580Smsmith#define GDT_IOCTL_SUBFUNC       0x02    /* u_int32_t, ioctl function */
19389580Smsmith#define GDT_IOCTL_CHANNEL       0x06    /* u_int32_t, device */
19489580Smsmith#define GDT_IOCTL_P_PARAM       0x0a    /* u_int32_t, buffer */
19589580Smsmith#define GDT_IOCTL_SZ            0x0e
19689580Smsmith
19789580Smsmith/* Screen service defines */
19889580Smsmith#define GDT_MSG_INV_HANDLE      -1      /* special message handle */
19989580Smsmith#define GDT_MSGLEN              16      /* size of message text */
20089580Smsmith#define GDT_MSG_SIZE            34      /* size of message structure */
20189580Smsmith#define GDT_MSG_REQUEST         0       /* async. event. message */
20289580Smsmith
20389580Smsmith/* Screen service command */
20489580Smsmith#define GDT_SCREEN_MSG_HANDLE   0x02    /* u_int32_t, message handle */
20589580Smsmith#define GDT_SCREEN_MSG_ADDR     0x06    /* u_int32_t, message buffer address */
20689580Smsmith#define GDT_SCREEN_SZ           0x0a
20789580Smsmith
20889580Smsmith/* Screen service message */
20989580Smsmith#define GDT_SCR_MSG_HANDLE      0x00    /* u_int32_t, message handle */
21089580Smsmith#define GDT_SCR_MSG_LEN         0x04    /* u_int32_t, size of message */
21189580Smsmith#define GDT_SCR_MSG_ALEN        0x08    /* u_int32_t, answer length */
21289580Smsmith#define GDT_SCR_MSG_ANSWER      0x0c    /* u_int8_t, answer flag */
21389580Smsmith#define GDT_SCR_MSG_EXT         0x0d    /* u_int8_t, more messages? */
21489580Smsmith#define GDT_SCR_MSG_RES         0x0e    /* u_int16_t, reserved */
21589580Smsmith#define GDT_SCR_MSG_TEXT        0x10    /* GDT_MSGLEN+2, message text */
21689580Smsmith#define GDT_SCR_MSG_SZ          (0x12 + GDT_MSGLEN)
21789580Smsmith
21889580Smsmith/* Raw service command */
21989580Smsmith#define GDT_RAW_DIRECTION       0x02    /* u_int32_t, data direction */
22089580Smsmith#define GDT_RAW_MDISC_TIME      0x06    /* u_int32_t, disc. time (0: none) */
22189580Smsmith#define GDT_RAW_MCON_TIME       0x0a    /* u_int32_t, conn. time (0: none) */
22289580Smsmith#define GDT_RAW_SDATA           0x0e    /* u_int32_t, dest. addr. (-1: s/g) */
22389580Smsmith#define GDT_RAW_SDLEN           0x12    /* u_int32_t, data length */
22489580Smsmith#define GDT_RAW_CLEN            0x16    /* u_int32_t, SCSI cmd len (6/10/12) */
22589580Smsmith#define GDT_RAW_CMD             0x1a    /* u_int8_t [12], SCSI command */
22689580Smsmith#define GDT_RAW_TARGET          0x26    /* u_int8_t, target ID */
22789580Smsmith#define GDT_RAW_LUN             0x27    /* u_int8_t, LUN */
22889580Smsmith#define GDT_RAW_BUS             0x28    /* u_int8_t, SCSI bus number */
22989580Smsmith#define GDT_RAW_PRIORITY        0x29    /* u_int8_t, only 0 used */
23089580Smsmith#define GDT_RAW_SENSE_LEN       0x2a    /* u_int32_t, sense data length */
23189580Smsmith#define GDT_RAW_SENSE_DATA      0x2e    /* u_int32_t, sense data address */
23289580Smsmith#define GDT_RAW_SG_RANZ         0x36    /* u_int32_t, s/g element count */
23389580Smsmith#define GDT_RAW_SG_LST          0x3a    /* [GDT_MAXSG], s/g list */
23489580Smsmith#define GDT_RAW_SZ              (0x3a + GDT_MAXSG * GDT_SG_SZ)
23589580Smsmith
23689580Smsmith/* Command structure */
23789580Smsmith#define GDT_CMD_BOARDNODE       0x00    /* u_int32_t, board node (always 0) */
23889580Smsmith#define GDT_CMD_COMMANDINDEX    0x04    /* u_int32_t, command number */
23989580Smsmith#define GDT_CMD_OPCODE          0x08    /* u_int16_t, opcode (READ, ...) */
24089580Smsmith#define GDT_CMD_UNION           0x0a    /* cache/screen/raw service command */
24189580Smsmith#define GDT_CMD_UNION_SZ        GDT_RAW_SZ
24289580Smsmith#define GDT_CMD_SZ              (0x0a + GDT_CMD_UNION_SZ)
24389580Smsmith
24489580Smsmith/* Command queue entries */
24589580Smsmith#define GDT_OFFSET      0x00    /* u_int16_t, command offset in the DP RAM */
24689580Smsmith#define GDT_SERV_ID     0x02    /* u_int16_t, service */
24789580Smsmith#define GDT_COMM_Q_SZ   0x04
24889580Smsmith
24989580Smsmith/* Interface area */
25089580Smsmith#define GDT_S_CMD_INDX  0x00    /* u_int8_t, special command */
25189580Smsmith#define GDT_S_STATUS    0x01    /* volatile u_int8_t, status special command */
25289580Smsmith#define GDT_S_INFO      0x04    /* u_int32_t [4], add. info special command */
25389580Smsmith#define GDT_SEMA0       0x14    /* volatile u_int8_t, command semaphore */
25489580Smsmith#define GDT_CMD_INDEX   0x18    /* u_int8_t, command number */
25589580Smsmith#define GDT_STATUS      0x1c    /* volatile u_int16_t, command status */
25689580Smsmith#define GDT_SERVICE     0x1e    /* u_int16_t, service (for asynch. events) */
25789580Smsmith#define GDT_DPR_INFO    0x20    /* u_int32_t [2], additional info */
25889580Smsmith#define GDT_COMM_QUEUE  0x28    /* command queue */
25989580Smsmith#define GDT_DPR_CMD     (0x30 + GDT_MAXOFFSETS * GDT_COMM_Q_SZ)
26089580Smsmith                                /* u_int8_t [], commands */
26189580Smsmith
26289580Smsmith/* I/O channel header */
26389580Smsmith#define GDT_IOC_VERSION         0x00    /* u_int32_t, version (~0: newest) */
26489580Smsmith#define GDT_IOC_LIST_ENTRIES    0x04    /* u_int8_t, list entry count */
26589580Smsmith#define GDT_IOC_FIRST_CHAN      0x05    /* u_int8_t, first channel number */
26689580Smsmith#define GDT_IOC_LAST_CHAN       0x06    /* u_int8_t, last channel number */
26789580Smsmith#define GDT_IOC_CHAN_COUNT      0x07    /* u_int8_t, (R) channel count */
26889580Smsmith#define GDT_IOC_LIST_OFFSET     0x08    /* u_int32_t, offset of list[0] */
26989580Smsmith#define GDT_IOC_HDR_SZ          0x0c
27089580Smsmith
27189580Smsmith#define GDT_IOC_NEWEST          0xffffffff      /* goes into GDT_IOC_VERSION */
27289580Smsmith
27389580Smsmith/* Get I/O channel description */
27489580Smsmith#define GDT_IOC_ADDRESS         0x00    /* u_int32_t, channel address */
27589580Smsmith#define GDT_IOC_TYPE            0x04    /* u_int8_t, type (SCSI/FCSL) */
27689580Smsmith#define GDT_IOC_LOCAL_NO        0x05    /* u_int8_t, local number */
27789580Smsmith#define GDT_IOC_FEATURES        0x06    /* u_int16_t, channel features */
27889580Smsmith#define GDT_IOC_SZ              0x08
27989580Smsmith
28089580Smsmith/* Get raw I/O channel description */
28189580Smsmith#define GDT_RAWIOC_PROC_ID      0x00    /* u_int8_t, processor id */
28289580Smsmith#define GDT_RAWIOC_PROC_DEFECT  0x01    /* u_int8_t, defect? */
28389580Smsmith#define GDT_RAWIOC_SZ           0x04
28489580Smsmith
28589580Smsmith/* Get SCSI channel count */
28689580Smsmith#define GDT_GETCH_CHANNEL_NO    0x00    /* u_int32_t, channel number */
28789580Smsmith#define GDT_GETCH_DRIVE_CNT     0x04    /* u_int32_t, drive count */
28889580Smsmith#define GDT_GETCH_SIOP_ID       0x08    /* u_int8_t, SCSI processor ID */
28989580Smsmith#define GDT_GETCH_SIOP_STATE    0x09    /* u_int8_t, SCSI processor state */
29089580Smsmith#define GDT_GETCH_SZ            0x0a
29189580Smsmith
29289580Smsmith/* Cache info/config IOCTL structures */
29389580Smsmith#define GDT_CPAR_VERSION        0x00    /* u_int32_t, firmware version */
29489580Smsmith#define GDT_CPAR_STATE          0x04    /* u_int16_t, cache state (on/off) */
29589580Smsmith#define GDT_CPAR_STRATEGY       0x06    /* u_int16_t, cache strategy */
29689580Smsmith#define GDT_CPAR_WRITE_BACK     0x08    /* u_int16_t, write back (on/off) */
29789580Smsmith#define GDT_CPAR_BLOCK_SIZE     0x0a    /* u_int16_t, cache block size */
29889580Smsmith#define GDT_CPAR_SZ             0x0c
29989580Smsmith
30089580Smsmith#define GDT_CSTAT_CSIZE         0x00    /* u_int32_t, cache size */
30189580Smsmith#define GDT_CSTAT_READ_CNT      0x04    /* u_int32_t, read counter */
30289580Smsmith#define GDT_CSTAT_WRITE_CNT     0x08    /* u_int32_t, write counter */
30389580Smsmith#define GDT_CSTAT_TR_HITS       0x0c    /* u_int32_t, track hits */
30489580Smsmith#define GDT_CSTAT_SEC_HITS      0x10    /* u_int32_t, sector hits */
30589580Smsmith#define GDT_CSTAT_SEC_MISS      0x14    /* u_int32_t, sector misses */
30689580Smsmith#define GDT_CSTAT_SZ            0x18
30789580Smsmith
30889580Smsmith/* Get cache info */
30989580Smsmith#define GDT_CINFO_CPAR          0x00
31089580Smsmith#define GDT_CINFO_CSTAT         GDT_CPAR_SZ
31189580Smsmith#define GDT_CINFO_SZ            (GDT_CPAR_SZ + GDT_CSTAT_SZ)
31289580Smsmith
31389580Smsmith/* Get board info */
31489580Smsmith#define GDT_BINFO_SER_NO        0x00    /* u_int32_t, serial number */
31589580Smsmith#define GDT_BINFO_OEM_ID        0x04    /* u_int8_t [2], OEM ID */
31689580Smsmith#define GDT_BINFO_EP_FLAGS      0x06    /* u_int16_t, eprom flags */
31789580Smsmith#define GDT_BINFO_PROC_ID       0x08    /* u_int32_t, processor ID */
31889580Smsmith#define GDT_BINFO_MEMSIZE       0x0c    /* u_int32_t, memory size (bytes) */
31989580Smsmith#define GDT_BINFO_MEM_BANKS     0x10    /* u_int8_t, memory banks */
32089580Smsmith#define GDT_BINFO_CHAN_TYPE     0x11    /* u_int8_t, channel type */
32189580Smsmith#define GDT_BINFO_CHAN_COUNT    0x12    /* u_int8_t, channel count */
32289580Smsmith#define GDT_BINFO_RDONGLE_PRES  0x13    /* u_int8_t, dongle present */
32389580Smsmith#define GDT_BINFO_EPR_FW_VER    0x14    /* u_int32_t, (eprom) firmware ver */
32489580Smsmith#define GDT_BINFO_UPD_FW_VER    0x18    /* u_int32_t, (update) firmware ver */
32589580Smsmith#define GDT_BINFO_UPD_REVISION  0x1c    /* u_int32_t, update revision */
32689580Smsmith#define GDT_BINFO_TYPE_STRING   0x20    /* char [16], controller name */
32789580Smsmith#define GDT_BINFO_RAID_STRING   0x30    /* char [16], RAID firmware name */
32889580Smsmith#define GDT_BINFO_UPDATE_PRES   0x40    /* u_int8_t, update present? */
32989580Smsmith#define GDT_BINFO_XOR_PRES      0x41    /* u_int8_t, XOR engine present */
33089580Smsmith#define GDT_BINFO_PROM_TYPE     0x42    /* u_int8_t, ROM type (eprom/flash) */
33189580Smsmith#define GDT_BINFO_PROM_COUNT    0x43    /* u_int8_t, number of ROM devices */
33289580Smsmith#define GDT_BINFO_DUP_PRES      0x44    /* u_int32_t, duplexing module pres? */
33389580Smsmith#define GDT_BINFO_CHAN_PRES     0x48    /* u_int32_t, # of exp. channels */
33489580Smsmith#define GDT_BINFO_MEM_PRES      0x4c    /* u_int32_t, memory expansion inst? */
33589580Smsmith#define GDT_BINFO_FT_BUS_SYSTEM 0x50    /* u_int8_t, fault bus supported? */
33689580Smsmith#define GDT_BINFO_SUBTYPE_VALID 0x51    /* u_int8_t, board_subtype valid */
33789580Smsmith#define GDT_BINFO_BOARD_SUBTYPE 0x52    /* u_int8_t, subtype/hardware level */
33889580Smsmith#define GDT_BINFO_RAMPAR_PRES   0x53    /* u_int8_t, RAM parity check hw? */
33989580Smsmith#define GDT_BINFO_SZ            0x54
34089580Smsmith
34189580Smsmith/* Get board features */
34289580Smsmith#define GDT_BFEAT_CHAINING      0x00    /* u_int8_t, chaining supported */
34389580Smsmith#define GDT_BFEAT_STRIPING      0x01    /* u_int8_t, striping (RAID-0) supp. */
34489580Smsmith#define GDT_BFEAT_MIRRORING     0x02    /* u_int8_t, mirroring (RAID-1) supp */
34589580Smsmith#define GDT_BFEAT_RAID          0x03    /* u_int8_t, RAID-4/5/10 supported */
34689580Smsmith#define GDT_BFEAT_SZ            0x04
34789580Smsmith
34889580Smsmith/* Other defines */
34989580Smsmith#define GDT_ASYNCINDEX  0       /* command index asynchronous event */
35089580Smsmith#define GDT_SPEZINDEX   1       /* command index unknown service */
35189580Smsmith
35289580Smsmith/* Debugging */
35389580Smsmith#ifdef GDT_DEBUG
35489580Smsmith#define GDT_D_INTR      0x01
35589580Smsmith#define GDT_D_MISC      0x02
35689580Smsmith#define GDT_D_CMD       0x04
35789580Smsmith#define GDT_D_QUEUE     0x08
35889580Smsmith#define GDT_D_TIMEOUT   0x10
35989580Smsmith#define GDT_D_INIT      0x20
36089580Smsmith#define GDT_D_INVALID   0x40
36189580Smsmith#define GDT_D_DEBUG     0x80
36289580Smsmithextern int gdt_debug;
36389580Smsmith#ifdef __SERIAL__
36489580Smsmithextern int ser_printf(const char *fmt, ...);
36589580Smsmith#define GDT_DPRINTF(mask, args) if (gdt_debug & (mask)) ser_printf args
36689580Smsmith#else
36789580Smsmith#define GDT_DPRINTF(mask, args) if (gdt_debug & (mask)) printf args
36889580Smsmith#endif
36989580Smsmith#else
37089580Smsmith#define GDT_DPRINTF(mask, args)
37189580Smsmith#endif
37289580Smsmith
37389580Smsmith/* Miscellaneous constants */
37489580Smsmith#define GDT_RETRIES             100000000       /* 100000 * 1us = 100s */
37589580Smsmith#define GDT_TIMEOUT             100000000       /* 100000 * 1us = 100s */
37689580Smsmith#define GDT_POLL_TIMEOUT        10000000        /* 10000 * 1us = 10s */
37789580Smsmith#define GDT_WATCH_TIMEOUT       10000000        /* 10000 * 1us = 10s */
37889580Smsmith#define GDT_SCRATCH_SZ          3072            /* 3KB scratch buffer */
37989580Smsmith
38089580Smsmith/* Map minor numbers to device identity */
38189580Smsmith#define LUN_MASK                0x0007
38289580Smsmith#define TARGET_MASK             0x03f8
38389580Smsmith#define BUS_MASK                0x1c00
38489580Smsmith#define HBA_MASK                0xe000
38589580Smsmith
38689580Smsmith#define minor2lun(minor)        ( minor & LUN_MASK )
38789580Smsmith#define minor2target(minor)     ( (minor & TARGET_MASK) >> 3 )
38889580Smsmith#define minor2bus(minor)        ( (minor & BUS_MASK) >> 10 )
38989580Smsmith#define minor2hba(minor)        ( (minor & HBA_MASK) >> 13 )
39089580Smsmith#define hba2minor(hba)          ( (hba << 13) & HBA_MASK )
39189580Smsmith
39289580Smsmith
39389580Smsmith/* struct for GDT_IOCTL_GENERAL */
39489580Smsmith#pragma pack(1)
39589580Smsmithtypedef struct gdt_ucmd {
39689580Smsmith    u_int16_t   io_node;
39789580Smsmith    u_int16_t   service;
39889580Smsmith    u_int32_t   timeout;
39989580Smsmith    u_int16_t   status;
40089580Smsmith    u_int32_t   info;
40189580Smsmith
40289580Smsmith    u_int32_t   BoardNode;                      /* board node (always 0) */
40389580Smsmith    u_int32_t   CommandIndex;                   /* command number */
40489580Smsmith    u_int16_t   OpCode;                         /* the command (READ,..) */
40589580Smsmith    union {
40689580Smsmith        struct {
40789580Smsmith            u_int16_t   DeviceNo;               /* number of cache drive */
40889580Smsmith            u_int32_t   BlockNo;                /* block number */
40989580Smsmith            u_int32_t   BlockCnt;               /* block count */
41089580Smsmith            void        *DestAddr;              /* data */
41189580Smsmith        } cache;                                /* cache service cmd. str. */
41289580Smsmith        struct {
41389580Smsmith            u_int16_t   param_size;             /* size of p_param buffer */
41489580Smsmith            u_int32_t   subfunc;                /* IOCTL function */
41589580Smsmith            u_int32_t   channel;                /* device */
41689580Smsmith            void        *p_param;               /* data */
41789580Smsmith        } ioctl;                                /* IOCTL command structure */
41889580Smsmith        struct {
41989580Smsmith            u_int16_t   reserved;
42089580Smsmith            u_int32_t   direction;              /* data direction */
42189580Smsmith            u_int32_t   mdisc_time;             /* disc. time (0: no timeout)*/
42289580Smsmith            u_int32_t   mcon_time;              /* connect time(0: no to.) */
42389580Smsmith            void        *sdata;                 /* dest. addr. (if s/g: -1) */
42489580Smsmith            u_int32_t   sdlen;                  /* data length (bytes) */
42589580Smsmith            u_int32_t   clen;                   /* SCSI cmd. length(6,10,12) */
42689580Smsmith            u_int8_t    cmd[12];                /* SCSI command */
42789580Smsmith            u_int8_t    target;                 /* target ID */
42889580Smsmith            u_int8_t    lun;                    /* LUN */
42989580Smsmith            u_int8_t    bus;                    /* SCSI bus number */
43089580Smsmith            u_int8_t    priority;               /* only 0 used */
43189580Smsmith            u_int32_t   sense_len;              /* sense data length */
43289580Smsmith            void        *sense_data;            /* sense data addr. */
43389580Smsmith            u_int32_t   link_p;                 /* linked cmds (not supp.) */
43489580Smsmith        } raw;                                  /* raw service cmd. struct. */
43589580Smsmith    } u;
43689580Smsmith    u_int8_t            data[GDT_SCRATCH_SZ];
43789580Smsmith    int                 complete_flag;
43889580Smsmith    TAILQ_ENTRY(gdt_ucmd) links;
43989580Smsmith} gdt_ucmd_t;
44089580Smsmith
44189580Smsmith/* struct for GDT_IOCTL_CTRTYPE */
44289580Smsmithtypedef struct gdt_ctrt {
44389580Smsmith    u_int16_t io_node;
44489580Smsmith    u_int16_t oem_id;
44589580Smsmith    u_int16_t type;
44689580Smsmith    u_int32_t info;
44789580Smsmith    u_int8_t  access;
44889580Smsmith    u_int8_t  remote;
44989580Smsmith    u_int16_t ext_type;
45089580Smsmith    u_int16_t device_id;
45189580Smsmith    u_int16_t sub_device_id;
45289580Smsmith} gdt_ctrt_t;
45389580Smsmith
45489580Smsmith/* struct for GDT_IOCTL_OSVERS */
45589580Smsmithtypedef struct gdt_osv {
45689580Smsmith    u_int8_t  oscode;
45789580Smsmith    u_int8_t  version;
45889580Smsmith    u_int8_t  subversion;
45989580Smsmith    u_int16_t revision;
46089580Smsmith    char      name[64];
46189580Smsmith} gdt_osv_t;
46289580Smsmith
463114001Sscottl/* OEM */
464114001Sscottl#define GDT_OEM_VERSION     0x00
465114001Sscottl#define GDT_OEM_BUFSIZE     0x0c
466114001Sscottltypedef struct {
467114001Sscottl    u_int32_t ctl_version;
468114001Sscottl    u_int32_t file_major_version;
469114001Sscottl    u_int32_t file_minor_version;
470114001Sscottl    u_int32_t buffer_size;
471114001Sscottl    u_int32_t cpy_count;
472114001Sscottl    u_int32_t ext_error;
473114001Sscottl    u_int32_t oem_id;
474114001Sscottl    u_int32_t board_id;
475114001Sscottl} gdt_oem_param_t;
476114001Sscottl
477114001Sscottltypedef struct {
478114001Sscottl    char      product_0_1_name[16];
479114001Sscottl    char      product_4_5_name[16];
480114001Sscottl    char      product_cluster_name[16];
481114001Sscottl    char      product_reserved[16];
482114001Sscottl    char      scsi_cluster_target_vendor_id[16];
483114001Sscottl    char      cluster_raid_fw_name[16];
484114001Sscottl    char      oem_brand_name[16];
485114001Sscottl    char      oem_raid_type[16];
486114001Sscottl    char      bios_type[13];
487114001Sscottl    char      bios_title[50];
488114001Sscottl    char      oem_company_name[37];
489114001Sscottl    u_int32_t pci_id_1;
490114001Sscottl    u_int32_t pci_id_2;
491114001Sscottl    char      validation_status[80];
492114001Sscottl    char      reserved_1[4];
493114001Sscottl    char      scsi_host_drive_inquiry_vendor_id[16];
494114001Sscottl    char      library_file_template[32];
495114001Sscottl    char      tool_name_1[32];
496114001Sscottl    char      tool_name_2[32];
497114001Sscottl    char      tool_name_3[32];
498114001Sscottl    char      oem_contact_1[84];
499114001Sscottl    char      oem_contact_2[84];
500114001Sscottl    char      oem_contact_3[84];
501114001Sscottl} gdt_oem_record_t;
502114001Sscottl
503114001Sscottltypedef struct {
504114001Sscottl    gdt_oem_param_t  parameters;
505114001Sscottl    gdt_oem_record_t text;
506114001Sscottl} gdt_oem_str_record_t;
507114001Sscottl
508114001Sscottl
50989580Smsmith/* controller event structure */
51089580Smsmith#define GDT_ES_ASYNC    1
51189580Smsmith#define GDT_ES_DRIVER   2
51289580Smsmith#define GDT_ES_TEST     3
51389580Smsmith#define GDT_ES_SYNC     4
51489580Smsmithtypedef struct {
51589580Smsmith    u_int16_t           size;               /* size of structure */
51689580Smsmith    union {
51789580Smsmith        char            stream[16];
51889580Smsmith        struct {
51989580Smsmith            u_int16_t   ionode;
52089580Smsmith            u_int16_t   service;
52189580Smsmith            u_int32_t   index;
52289580Smsmith        } driver;
52389580Smsmith        struct {
52489580Smsmith            u_int16_t   ionode;
52589580Smsmith            u_int16_t   service;
52689580Smsmith            u_int16_t   status;
52789580Smsmith            u_int32_t   info;
52889580Smsmith            u_int8_t    scsi_coord[3];
52989580Smsmith        } async;
53089580Smsmith        struct {
53189580Smsmith            u_int16_t   ionode;
53289580Smsmith            u_int16_t   service;
53389580Smsmith            u_int16_t   status;
53489580Smsmith            u_int32_t   info;
53589580Smsmith            u_int16_t   hostdrive;
53689580Smsmith            u_int8_t    scsi_coord[3];
53789580Smsmith            u_int8_t    sense_key;
53889580Smsmith        } sync;
53989580Smsmith        struct {
54089580Smsmith            u_int32_t   l1, l2, l3, l4;
54189580Smsmith        } test;
54289580Smsmith    } eu;
54389580Smsmith    u_int32_t           severity;
54489580Smsmith    u_int8_t            event_string[256];
54589580Smsmith} gdt_evt_data;
54689580Smsmith
54789580Smsmith/* dvrevt structure */
54889580Smsmithtypedef struct {
54989580Smsmith    u_int32_t           first_stamp;
55089580Smsmith    u_int32_t           last_stamp;
55189580Smsmith    u_int16_t           same_count;
55289580Smsmith    u_int16_t           event_source;
55389580Smsmith    u_int16_t           event_idx;
55489580Smsmith    u_int8_t            application;
55589580Smsmith    u_int8_t            reserved;
55689580Smsmith    gdt_evt_data        event_data;
55789580Smsmith} gdt_evt_str;
55889580Smsmith
55989580Smsmith/* struct for GDT_IOCTL_EVENT */
56089580Smsmithtypedef struct gdt_event {
56189580Smsmith    int erase;
56289580Smsmith    int handle;
56389580Smsmith    gdt_evt_str dvr;
56489580Smsmith} gdt_event_t;
56589580Smsmith
56689580Smsmith/* struct for GDT_IOCTL_STATIST */
56789580Smsmithtypedef struct gdt_statist {
56889580Smsmith    u_int16_t io_count_act;
56989580Smsmith    u_int16_t io_count_max;
57089580Smsmith    u_int16_t req_queue_act;
57189580Smsmith    u_int16_t req_queue_max;
57289580Smsmith    u_int16_t cmd_index_act;
57389580Smsmith    u_int16_t cmd_index_max;
57489580Smsmith    u_int16_t sg_count_act;
57589580Smsmith    u_int16_t sg_count_max;
57689580Smsmith} gdt_statist_t;
57789580Smsmith
57889580Smsmith#pragma pack()
57989580Smsmith
58089580Smsmith/* Context structure for interrupt services */
58189580Smsmithstruct gdt_intr_ctx {
58289580Smsmith    u_int32_t info, info2;
58389580Smsmith    u_int16_t cmd_status, service;
58489580Smsmith    u_int8_t istatus;
58589580Smsmith};
58689580Smsmith
58789580Smsmith/* softc structure */
58889580Smsmithstruct gdt_softc {
58989580Smsmith    int sc_hanum;
59089580Smsmith    int sc_class;               /* Controller class */
59189580Smsmith#define GDT_MPR         0x05
59289580Smsmith#define GDT_CLASS_MASK  0x07
59389580Smsmith#define GDT_FC          0x10
59489580Smsmith#define GDT_CLASS(gdt)  ((gdt)->sc_class & GDT_CLASS_MASK)
59589580Smsmith    int sc_bus, sc_slot;
596114001Sscottl    u_int16_t sc_vendor;
59789580Smsmith    u_int16_t sc_device, sc_subdevice;
59889580Smsmith    u_int16_t sc_fw_vers;
59989580Smsmith    int sc_init_level;
60089580Smsmith    int sc_state;
60189580Smsmith#define GDT_NORMAL      0x00
60289580Smsmith#define GDT_POLLING     0x01
60389580Smsmith#define GDT_SHUTDOWN    0x02
60489580Smsmith#define GDT_POLL_WAIT   0x80
60589580Smsmith    dev_t sc_dev;
60689580Smsmith    bus_space_tag_t sc_dpmemt;
60789580Smsmith    bus_space_handle_t sc_dpmemh;
60889580Smsmith    bus_addr_t sc_dpmembase;
60989580Smsmith    bus_dma_tag_t sc_parent_dmat;
61089580Smsmith    bus_dma_tag_t sc_buffer_dmat;
61189580Smsmith    bus_dma_tag_t sc_gccb_dmat;
61289580Smsmith    bus_dmamap_t sc_gccb_dmamap;
61389580Smsmith    bus_addr_t sc_gccb_busbase;
61489580Smsmith
61589580Smsmith    struct gdt_ccb *sc_gccbs;
61689580Smsmith    SLIST_HEAD(, gdt_ccb) sc_free_gccb, sc_pending_gccb;
61789580Smsmith    TAILQ_HEAD(, ccb_hdr) sc_ccb_queue;
61889580Smsmith    TAILQ_HEAD(, gdt_ucmd) sc_ucmd_queue;
61989580Smsmith
62089580Smsmith    u_int16_t sc_ic_all_size;
62189580Smsmith    u_int16_t sc_cmd_len;
62289580Smsmith    u_int16_t sc_cmd_off;
62389580Smsmith    u_int16_t sc_cmd_cnt;
62489580Smsmith    u_int8_t sc_cmd[GDT_CMD_SZ];
62589580Smsmith
62689580Smsmith    u_int32_t sc_info;
62789580Smsmith    u_int32_t sc_info2;
62889580Smsmith    u_int16_t sc_status;
62989580Smsmith    u_int16_t sc_service;
63089580Smsmith
63189580Smsmith    u_int8_t sc_bus_cnt;
63289580Smsmith    u_int8_t sc_virt_bus;
63389580Smsmith    u_int8_t sc_bus_id[GDT_MAXBUS];
63489580Smsmith    u_int8_t sc_more_proc;
63589580Smsmith
63689580Smsmith    struct {
63789580Smsmith        u_int8_t hd_present;
63889580Smsmith        u_int8_t hd_is_logdrv;
63989580Smsmith        u_int8_t hd_is_arraydrv;
64089580Smsmith        u_int8_t hd_is_master;
64189580Smsmith        u_int8_t hd_is_parity;
64289580Smsmith        u_int8_t hd_is_hotfix;
64389580Smsmith        u_int8_t hd_master_no;
64489580Smsmith        u_int8_t hd_lock;
64589580Smsmith        u_int8_t hd_heads;
64689580Smsmith        u_int8_t hd_secs;
64789580Smsmith        u_int16_t hd_devtype;
64889580Smsmith        u_int32_t hd_size;
64989580Smsmith        u_int8_t hd_ldr_no;
65089580Smsmith        u_int8_t hd_rw_attribs;
65189580Smsmith        u_int32_t hd_start_sec;
65289580Smsmith    } sc_hdr[GDT_MAX_HDRIVES];
65389580Smsmith
65489580Smsmith    u_int16_t sc_raw_feat;
65589580Smsmith    u_int16_t sc_cache_feat;
65689580Smsmith
65789580Smsmith    gdt_evt_data sc_dvr;
658114001Sscottl    char oem_name[8];
65989580Smsmith
66089580Smsmith    struct cam_sim *sims[GDT_MAXBUS];
66189580Smsmith    struct cam_path *paths[GDT_MAXBUS];
66289580Smsmith
66392739Salfred    void (*sc_copy_cmd)(struct gdt_softc *, struct gdt_ccb *);
66492739Salfred    u_int8_t (*sc_get_status)(struct gdt_softc *);
66592739Salfred    void (*sc_intr)(struct gdt_softc *, struct gdt_intr_ctx *);
66692739Salfred    void (*sc_release_event)(struct gdt_softc *);
66792739Salfred    void (*sc_set_sema0)(struct gdt_softc *);
66892739Salfred    int (*sc_test_busy)(struct gdt_softc *);
66989580Smsmith
67089580Smsmith    TAILQ_ENTRY(gdt_softc) links;
67189580Smsmith};
67289580Smsmith
67389580Smsmith/*
67489580Smsmith * A command control block, one for each corresponding command index of the
67589580Smsmith * controller.
67689580Smsmith */
67789580Smsmithstruct gdt_ccb {
67889580Smsmith    u_int8_t    gc_scratch[GDT_SCRATCH_SZ];
67989580Smsmith    union ccb   *gc_ccb;
68089580Smsmith    gdt_ucmd_t  *gc_ucmd;
68189580Smsmith    bus_dmamap_t gc_dmamap;
68289580Smsmith    int         gc_map_flag;
68389580Smsmith    int         gc_timeout;
68489580Smsmith    int         gc_state;
68589580Smsmith    u_int8_t    gc_service;
68689580Smsmith    u_int8_t    gc_cmd_index;
68789580Smsmith    u_int8_t    gc_flags;
68889580Smsmith#define GDT_GCF_UNUSED          0
68989580Smsmith#define GDT_GCF_INTERNAL        1
69089580Smsmith#define GDT_GCF_SCREEN          2
69189580Smsmith#define GDT_GCF_SCSI            3
69289580Smsmith#define GDT_GCF_IOCTL           4
69389580Smsmith    SLIST_ENTRY(gdt_ccb) sle;
69489580Smsmith};
69589580Smsmith
69689580Smsmith
69792739Salfredint     iir_init(struct gdt_softc *);
69892739Salfredvoid    iir_free(struct gdt_softc *);
69992739Salfredvoid    iir_attach(struct gdt_softc *);
70092739Salfredvoid    iir_intr(void *arg);
70189580Smsmith
70289580Smsmith#ifdef __GNUC__
70389580Smsmith/* These all require correctly aligned buffers */
70492739Salfredstatic __inline__ void gdt_enc16(u_int8_t *, u_int16_t);
70592739Salfredstatic __inline__ void gdt_enc32(u_int8_t *, u_int32_t);
70692739Salfredstatic __inline__ u_int16_t gdt_dec16(u_int8_t *);
70792739Salfredstatic __inline__ u_int32_t gdt_dec32(u_int8_t *);
70889580Smsmith
70989580Smsmithstatic __inline__ void
71089580Smsmithgdt_enc16(addr, value)
71189580Smsmith        u_int8_t *addr;
71289580Smsmith        u_int16_t value;
71389580Smsmith{
71489580Smsmith        *(u_int16_t *)addr = htole16(value);
71589580Smsmith}
71689580Smsmith
71789580Smsmithstatic __inline__ void
71889580Smsmithgdt_enc32(addr, value)
71989580Smsmith        u_int8_t *addr;
72089580Smsmith        u_int32_t value;
72189580Smsmith{
72289580Smsmith        *(u_int32_t *)addr = htole32(value);
72389580Smsmith}
72489580Smsmith
72589580Smsmithstatic __inline__ u_int16_t
72689580Smsmithgdt_dec16(addr)
72789580Smsmith        u_int8_t *addr;
72889580Smsmith{
729114001Sscottl        return le16toh(*(u_int16_t *)addr);
73089580Smsmith}
73189580Smsmith
73289580Smsmithstatic __inline__ u_int32_t
73389580Smsmithgdt_dec32(addr)
73489580Smsmith        u_int8_t *addr;
73589580Smsmith{
736114001Sscottl        return le32toh(*(u_int32_t *)addr);
73789580Smsmith}
73889580Smsmith#endif
73989580Smsmith
74089580Smsmith#if defined(__alpha__)
74189580Smsmith/* XXX XXX NEED REAL DMA MAPPING SUPPORT XXX XXX */
74289580Smsmith#undef vtophys
74389580Smsmith#define vtophys(va)     alpha_XXX_dmamap((vm_offset_t)(va))
74489580Smsmith#endif
74589580Smsmith
74689580Smsmithextern TAILQ_HEAD(gdt_softc_list, gdt_softc) gdt_softcs;
74789580Smsmithextern u_int8_t gdt_polling;
74889580Smsmith
74989580Smsmithdev_t   gdt_make_dev(int unit);
75089580Smsmithvoid    gdt_destroy_dev(dev_t dev);
75189580Smsmithvoid    gdt_next(struct gdt_softc *gdt);
75289580Smsmithvoid gdt_free_ccb(struct gdt_softc *gdt, struct gdt_ccb *gccb);
75389580Smsmith
75489580Smsmithgdt_evt_str *gdt_store_event(u_int16_t source, u_int16_t idx,
75589580Smsmith                             gdt_evt_data *evt);
75689580Smsmithint gdt_read_event(int handle, gdt_evt_str *estr);
75789580Smsmithvoid gdt_readapp_event(u_int8_t app, gdt_evt_str *estr);
75889580Smsmithvoid gdt_clear_events(void);
75989580Smsmith
76089580Smsmith#endif
761