|
|
/* tcic2.h Mon Jul 25 1994 18:30:04 zema */
/*
Module: tcic2.h
Function: Definitions for DB86082 (TCIC-2/N) PCMCIA V2 interface controller chip.
Version: V6.62f Mon Jul 25 1994 18:30:04 zema Edit level 34
Copyright Notice: This file is in the public domain. It was created by:
Databook Inc. Building E, Suite 6 3495 Winton Place Rochester, NY 14623
Telephone: +1-716-292-5720 Fax: +1-716-292-5737 BBS: +1-716-292-5741 Email: support@databook.com Compuserve: go databook
This code is provided as-is. Databook makes no warrantees of any kind as to its correctness or suitability for any purpose, and disclaims all liability for any loss or damage resulting from the use of this file, including without limitation contingent, special, or other liability.
Author: Terry Moore, Databook Inc. April 1991
Revision history: 1.00a Mon Apr 15 1991 19:16:41 tmm Module created.
6.62f Mon Jul 25 1994 18:30:04 zema Incorporated define of a Chip's Silicon ID into ILOCKTEST define. ex.- #define SILID_DBxxxx (n)
#define ILOCKTEST_DBxxxx ((SILID_DBxxxx) << ILOCKTEST_ID_SHFT)
*/
/*****************************************************************************\
This file contains a set of common definitions for the Databook/Fujitsu family of memory and I/O card controller chips, known by Databook as the TCIC family.
When this file is included it will define symbols for one or more chips, depending on whether the following symbols are defined:
MB86301 gets definitions for the Fujitsu 86301 DB86081 gets definitions for the Databook TCIC-2/P DB86082 gets definitions for the Databook TCIC-2/N. DB86082A gets definitions for 86082a, and for the 86082.
For backwards compatibility, the file "mcic.h" will define MB86301, then call this file.
\*****************************************************************************/
#ifndef _TCIC2_H_ /* prevent multiple includes */
#define _TCIC2_H_
//
// Memory window sizes that will be allocated
// for this controller - to map card memory
//
#define TCIC_WINDOW_SIZE 0x8000 //(32K)
#define TCIC_WINDOW_ALIGNMENT 0x8000 //(32K)
#define NUMSOCKETS 2
#define CHIPBASE 0x240
/* register definitions */ #define R_DATA 0 /* data register */
#define R_ADDR 2 /* address register */
#define R_ADDR2 (R_ADDR+2) /* high order word of address register */
#define R_SCTRL 6 /* socket ctrl register */
#define R_SSTAT 7 /* socket status register */
#define R_MODE 8 /* controller mode register */
#define R_PWR 9 /* controller power register */
#define R_EDC 10 /* EDC register */
#define R_ICSR 12 /* interrupt control/status register */
#define R_IENA 13 /* interrupt enable register */
#define R_AUX 14 /* auxiliary control registers */
/*
The TCIC-2 family defines architectural extensions for handling multiple sockets with a single chip. Much of this is handled via a "socket select" field in the address register.
We define the fields first as bit fields within the high order word of the address register, as this will be the most convenient way for software to access them; for completeness, and for the benefit of C code, we define the fields as part of the ULONG that represents the entire address register.
*/
/**** first, some simple definitions ****/ #define TCIC_SS_SHFT 12 /* default location for the
socket select bits */ #define TCIC_SS_MASK (7 << TCIC_SS_SHFT) /* default mask for the
socket select bits */
/* bits in ADDR2 */ #define ADR2_REG (1 << 15) /* select REG space */
#define ADR2_SS_SHFT TCIC_SS_SHFT /* select sockets the usual
way */ #define ADR2_SS_MASK TCIC_SS_MASK /* ditto */
#define ADR2_INDREG (1 << 11) /* access indirect registers
|| (not card data) */ #define ADR2_IO (1 << 10) /* select I/O cycles, readback
|| card /IORD, /IOWR in diag- || nostic mode. */
/* Bits in address register */ #define ADDR_REG ((unsigned long) ADR2_REG << 16) /* OR with this for REG space */
#define ADDR_SS_SHFT ((unsigned long) ADR2_SS_SHFT + 16)
/* shift count, cast so that
|| you'll get the right type || if you use it but forget || to cast the left arg. */ #define ADDR_SS_MASK ((unsigned long) ADR2_SS_MASK << 16)
#define ADDR_INDREG ((unsigned long) ADR2_INDREG << 16)
#define ADDR_IO ((unsigned long) ADR2_IO << 16)
#define ADDR_SPACE_SIZE ((unsigned long) 1 << 26)
#define ADDR_MASK (ADDR_SPACE_SIZE - 1)
/* following bits are defined in diagnostic mode */ #define ADDR_DIAG_NREG ((unsigned long) 1 << 31) /* inverted! */
#define ADDR_DIAG_NCEH ((unsigned long) 1 << 30)
#define ADDR_DIAG_NCEL ((unsigned long) 1 << 29)
#define ADDR_DIAG_NCWR ((unsigned long) 1 << 28)
#define ADDR_DIAG_NCRD ((unsigned long) 1 << 27)
#define ADDR_DIAG_CRESET ((unsigned long) 1 << 26)
/* Bits in socket control register */ #define SCTRL_ENA (1 << 0) /* enable access to card */
#define SCTRL_INCMODE (3 << 3) /* mask for increment mode: */
#define SCTRL_INCMODE_AUTO (3 << 3) /* auto-increment mode */
#define SCTRL_INCMODE_HOLD (0 << 3) /* byte hold mode */
#define SCTRL_INCMODE_WORD (1 << 3) /* word hold mode */
#define SCTRL_INCMODE_REG (2 << 3) /* reg-space increment mode */
#define SCTRL_EDCSUM (1 << 5) /* if set, use checksum (not CRC) */
#define SCTRL_RESET (1 << 7) /* internal software reset */
/**** the status register (read-only): R_SSTAT ****/ #define SSTAT_6US (1 << 0) /* 6 microseconds have elapsed */
#define SSTAT_10US (1 << 1) /* 10 microseconds have elapsed */
#define SSTAT_PROGTIME (1 << 2) /* programming pulse timeout */
#define SSTAT_LBAT1 (1 << 3) /* low battery 1 */
#define SSTAT_LBAT2 (1 << 4) /* low battery 2 */
#define SSTAT_BATOK (0 << 3) /* battery is OK */
#define SSTAT_BATBAD1 (1 << 3) /* battery is low */
#define SSTAT_BATLO (2 << 3) /* battery is getting low */
#define SSTAT_BATBAD2 (3 << 3) /* battery is low */
#define SSTAT_RDY (1 << 5) /* card is ready (not busy) */
#define SSTAT_WP (1 << 6) /* card is write-protected */
#define SSTAT_CD (1 << 7) /* card present */
/**** mode register contents (R_MODE) ****/ #define MODE_PGMMASK (0x1F) /* the programming mode bits */
#define MODE_NORMAL (0) /* normal mode */
#define MODE_PGMWR (1 << 0) /* assert /WR */
#define MODE_PGMRD (1 << 1) /* assert /RD */
#define MODE_PGMCE (1 << 2) /* assert /CEx */
#define MODE_PGMDBW (1 << 3) /* databus in write mode */
#define MODE_PGMWORD (1 << 4) /* word programming mode */
#define MODE_AUXSEL_SHFT (5) /* shift count for aux regs */
#define MODE_AUXSEL_MASK (7 << 5) /* the aux-reg select bits */
#define MODE_AR_TCTL (0 << MODE_AUXSEL_SHFT) /* timing control */
#define MODE_AR_PCTL (1 << MODE_AUXSEL_SHFT) /* pulse control */
#define MODE_AR_WCTL (2 << MODE_AUXSEL_SHFT) /* wait-state control */
#define MODE_AR_EXTERN (3 << MODE_AUXSEL_SHFT) /* external reg select */
#define MODE_AR_PDATA (4 << MODE_AUXSEL_SHFT) /* programming data reg */
#define MODE_AR_SYSCFG (5 << MODE_AUXSEL_SHFT) /* system config reg */
#define MODE_AR_ILOCK (6 << MODE_AUXSEL_SHFT) /* interlock control reg */
#define MODE_AR_TEST (7 << MODE_AUXSEL_SHFT) /* test control reg */
#define PWR_VCC_SHFT (0) /* the VCC ctl shift */
#define PWR_VCC_MASK (3 << PWR_VCC_SHFT)
#define PWR_VPP_SHFT (3) /* the VPP ctl shift */
#define PWR_VPP_MASK (3 << PWR_VPP_SHFT)
#define PWR_ENA (1 << 5) /* on 084, successors, this
|| must be set to turn on || power. */ #define PWR_VCC5V (1 << 2) /* enable +5 (not +3) */
#define PWR_VOFF_POFF (0) /* turn off VCC, VPP */
#define PWR_VON_PVCC (1) /* turn on VCC, VPP=VCC */
#define PWR_VON_PVPP (2) /* turn on VCC, VPP=12V */
#define PWR_VON_POFF (3) /* turn on VCC, VPP=0V */
#define PWR_CLIMENA (1 << 6) /* the current-limit enable */
#define PWR_CLIMSTAT (1 << 7) /* current limit sense (r/o) */
/**** int CSR ****/ #define ICSR_IOCHK (1 << 7) /* I/O check */
#define ICSR_CDCHG (1 << 6) /* card status change: top 5
|| bits of SSTAT register. */ #define ICSR_ERR (1 << 5) /* error condition */
#define ICSR_PROGTIME (1 << 4) /* program timer ding */
#define ICSR_ILOCK (1 << 3) /* interlock change */
#define ICSR_STOPCPU (1 << 2) /* Stop CPU was asserted */
#define ICSR_SET (1 << 1) /* (w/o: enable writes that set bits */
#define ICSR_CLEAR (1 << 0) /* (w/o: enable writes that clear */
#define ICSR_JAM (ICSR_SET|ICSR_CLEAR) /* jam value into ICSR */
/**** interrupt enable bits ****/ #define IENA_CDCHG (1 << 6) /* enable INT when ICSR_CDCHG is set */
#define IENA_ERR (1 << 5) /* enable INT when ICSR_ERR is set */
#define IENA_PROGTIME (1 << 4) /* enable INT when ICSR_PROGTIME " */
#define IENA_ILOCK (1 << 3) /* enable INT when ICSR_ILOCK is set */
#define IENA_CFG_MASK (3 << 0) /* select the bits for IRQ config: */
#define IENA_CFG_OFF (0 << 0) /* IRQ is high-impedance */
#define IENA_CFG_OD (1 << 0) /* IRQ is active low, open drain. */
#define IENA_CFG_LOW (2 << 0) /* IRQ is active low, totem pole */
#define IENA_CFG_HIGH (3 << 0) /* IRQ is active high, totem pole */
/**** aux registers ****/ #define WAIT_COUNT_MASK (0x1F) /* the count of 1/2 wait states */
#define WAIT_COUNT_SHFT (0) /* the wait-count shift */
#define WAIT_ASYNC (1 << 5) /* set for asynch, clear for synch cycles */
#define WAIT_SENSE (1 << 6) /* select rising (1) or falling (0)
|| edge of wait clock as reference || edge. */ #define WAIT_SRC (1 << 7) /* select constant clock (0) or bus
|| clock (1) as the timing source */
/**** some derived constants ****/ #define WAIT_BCLK (1 * WAIT_SRC)
#define WAIT_CCLK (0 * WAIT_SRC)
#define WAIT_RISING (1 * WAIT_SENSE)
#define WAIT_FALLING (0 * WAIT_SENSE)
/**** high byte ****/ #define WCTL_WR (1 << 8) /* control: pulse write */
#define WCTL_RD (1 << 9) /* control: pulse read */
#define WCTL_CE (1 << 10) /* control: pulse chip ena */
#define WCTL_LLBAT1 (1 << 11) /* status: latched LBAT1 */
#define WCTL_LLBAT2 (1 << 12) /* status: latched LBAT2 */
#define WCTL_LRDY (1 << 13) /* status: latched RDY */
#define WCTL_LWP (1 << 14) /* status: latched WP */
#define WCTL_LCD (1 << 15) /* status: latched CD */
/**** the same thing, from a byte perspective ****/ #define AR_WCTL_WAIT (R_AUX + 0) /* the wait state control byte */
#define AR_WCTL_XCSR (R_AUX + 1) /* extended control/status */
#define XCSR_WR (1 << 0) /* control: pulse write */
#define XCSR_RD (1 << 1) /* control: pulse read */
#define XCSR_CE (1 << 2) /* control: pulse chip ena */
#define XCSR_LLBAT1 (1 << 3) /* status: latched LBAT1 */
#define XCSR_LLBAT2 (1 << 4) /* status: latched LBAT2 */
#define XCSR_LRDY (1 << 5) /* status: latched RDY */
#define XCSR_LWP (1 << 6) /* status: latched WP */
#define XCSR_LCD (1 << 7) /* status: latched CD */
/**** prog timers ****/ #define TCTL_6US_SHFT (0) /* the shift count for the 6 us ctr */
#define TCTL_10US_SHFT (8) /* the shift count for the 10 us ctr */
#define TCTL_6US_MASK (0xFF << TCTL_6US_SHFT)
#define TCTL_10US_MASK (0xFF << TCTL_10US_SHFT)
#define AR_TCTL_6US (R_AUX + 0) /* the byte access handle */
#define AR_TCTL_10US (R_AUX + 1) /* the byte access handle */
/**** The programming pulse register ****/ #define AR_PULSE_LO (R_AUX + 0)
#define AR_PULSE_HI (R_AUX + 1)
/**** The programming data register ****/ #define AR_PDATA_LO (R_AUX + 0)
#define AR_PDATA_HI (R_AUX + 1)
/**** the system configuration register ****/ /*
|| The bottom four bits specify the steering of the socket IRQ. On || the 2N, the socket IRQ is (by default) pointed at the dedicated || pin. */ #define SYSCFG_IRQ_MASK (0xF) /* mask for this bit field. */
#define SYSCFG_SSIRQDFLT (0) /* default: use SKTIRQ (2/N)
|| disable (2/P) */ #define SYSCFG_SSIRQ (0x1) /* use SKTIRQ (explicit) (2/N)
|| do not use (2/P) */ #define SYSCFG_SIRQ3 (0x3) /* use IRQ3 */
#define SYSCFG_SIRQ4 (0x4) /* use IRQ4 */
#define SYSCFG_SIRQ5 (0x5) /* use IRQ5 (2/N) */
#define SYSCFG_SIRQ6 (0x6) /* use IRQ6 (2/N) */
#define SYSCFG_SIRQ7 (0x7) /* use IRQ7 (2/N) */
#define SYSCFG_SIRQ10 (0xA) /* use IRQ10 */
#define SYSCFG_SIRQ14 (0xE) /* use IRQ14 */
#define SYSCFG_MCSFULL (1 << 4) /*
If set, use full address (a[12:23]) for MCS16 generation. If clear, run in ISA-compatible mode (only using a[17:23]). With many chip sets, the TCIC-2/N's timing will will allow full address decoding to be used rather than limiting us to LA[17:23]; thus we can get around the ISA spec which limits the granularity of bus sizing to 128K blocks. */ #define SYSCFG_IO1723 (1 << 5) /*
Flag indicating that LA[17:23] can be trusted to be zero during a true I/O cycle. Setting this bit will allow us to reduce power consumption further by eliminating I/O address broadcasts for memory cycles.
Unfortunately, you cannot trust LA[17:23] to be zero on all systems, because the ISA specs do not require that LA[17:23] be zero when an alternate bus master runs an I/O cycle. However, on a palmtop or notebook, it is a good guess. */
#define SYSCFG_MCSXB (1 << 6) /*
If set, assume presence of an external buffer for MCS16: operate the driver as a totem-pole output. If clear, run in psuedo-ISA mode; output is open drain. But note that on the 082 the output buffers cannot drive a 300-ohm load. */ #define SYSCFG_ICSXB (1 << 7) /*
If set, assume presence of an external buffer for IOCS16*; operate the buffer as a totem-pole output.
If clear, run in psuedo-ISA mode; output is open drain. But note that on the 082 the output buffers cannot drive a 300-ohm load. */ #define SYSCFG_NOPDN (1 << 8) /*
If set, disable the auto power-down sequencing. The chip will run card cycles somewhat more quickly (though perhaps not significantly so); but it will dissipate significantly more power.
If clear, the low-power operating modes are enabled. This causes the part to go into low-power mode automatically at system reset.
*/ #define SYSCFG_MPSEL_SHFT (9)
#define SYSCFG_MPSEL_MASK (7 << 9) /*
This field controls the operation of the multipurpose pin on the 86082. It has the following codes: */ #define SYSCFGMPSEL_OFF (0 << SYSCFG_MPSEL_SHFT) /*
This is the reset state; it indicates that the Multi-purpose pin is not used. The pin will be held in a high-impedance state. It can be read by monitoring SYSCFG_MPSENSE. */ #define SYSCFGMPSEL_NEEDCLK (1 << SYSCFG_MPSEL_SHFT) /*
NMULTI is an output. External indication that CCLK or BCLK are needed in order to complete an internal operation. External logic can use this to control the clocks coming to the chip. */ #define SYSCFGMPSEL_MIO (2 << SYSCFG_MPSEL_SHFT) /*
NMULTI is an input; it is an unambiguous M/IO signal, issued with timing similar to the LA[] lines. */ #define SYSCFGMPSEL_EXTSEL (3 << SYSCFG_MPSEL_SHFT) /*
NMULTI is an output; it is the external register select pulse, generated whenever software attempts to access aux register AR_EXTRN. Of course, the 86082 will ignore writes to AR_EXTRN, and will float the data bus if the CPU reads from AR_EXTRN. */ /* (4 << SCFG_MPSEL_SHFT) is reserved */
#define SYSCFGMPSEL_RI (5 << SYSCFG_MPSEL_SHFT) /*
NMULTI is an output; it indicates a RI (active-going) transition has occurred lately on a an appropriately- configured socket. The output is active low. */ /*
Codes 4, 6 and 7 are reserved, and must NOT be output. It is indeed possibly hazardous to your system to encode values in this field that do not match your hardware! */
/* 1 << 12 reserved */
#define SYSCFG_MPSENSE (1 << 13) /*
This bit, when read, returns the sense of the multi-purpose pin. */
#define SYSCFG_AUTOBUSY (1 << 14) /*
This bit, when set, causes the busy led to be gated with the SYSCFG_ACC bit. When clear, the busy led reflects whether the socket is actually enabled. If AUTOBUSY is set and ACC is clear, then the busy light will be off, even if a socket is enabled. If AUTOBUSY is clear, then the busy light will be on if either socket is enabled.
Note, that when in a programming mode, you should either clear this bit (causing the busy light to be on whenever the socket is enabled) or set both this bit and the ACC bit (causing the light to be on all the time).
On the '084 and '184, this bit is per-socket.
*/
#define SYSCFG_ACC (1<<15) /*
This bit will be set automatically by the hardware whenever the CPU accesses data on a card. It can be cleared under software control.
In AUTOBUSY mode, it has the additional effect of turning on the busy light.
Since we'll tristate the command lines as the card is going out of the socket, and since the shared lines idle low, there's no real danger if the busy light is off even though the socket is enabled.
On the '084 and '184, this bit is per-socket.
*/
/*
C0: The interlock control register. */ #define AR_ILOCK (R_AUX+0) /* symbolic handle for low byte */
#define ILOCK_OUT (1 << 0) /* interlock output
|| per-socket on x84 */ #define ILOCK_SENSE (1 << 1) /* (r/o) interlock sense
|| 0 -> /cilock not asserted; || 1 -> /cilock is asserted. || per-socket on x84. */ #define ILOCK_CRESET (1 << 2) /* card reset output level (S) */
#define ILOCK_CRESENA (1 << 3) /* enable card reset output (S) */
#define ILOCK_CWAIT (1 << 4) /* enable card wait (S) */
#define ILOCK_CWAITSNS (1 << 5) /* (r/o) sense current state of wait
|| 0 -> /cwait not asserted; || 1 -> /cwait is asserted || (S) */ /* the shift count & mask for the hold-time control */ #define ILOCK_HOLD_SHIFT 6 /* shift count for the hold-time ctl (G) */
#define ILOCK_HOLD_MASK (3 << ILOCK_HOLD_SHIFT)
/*
|| quick hold mode waits until we observe that the strobe is high, || guaranteeing 10ns or so of hold time. */ #define ILOCK_HOLD_QUICK (0 << ILOCK_HOLD_SHIFT)
/*
|| CCLK hold mode waits (asynchronously) for an edge on CCLK. Minimum is 1 || CCLK + epsilon; maximum is 2 CCLKs + epsilon. || || for the 86081 & '82, this mode enables the multi-step || sequencer that generates setup and hold times based on CCLK. This || is the recommended mode of operation for the '81 and '82. */ #define ILOCK_HOLD_CCLK (3 << ILOCK_HOLD_SHIFT)
/**** The following bits are only present on the x84 and later parts ****/ #define ILOCK_INPACK (1 << 11) /* (r/o, S) this bit is a diagnostic
|| read-back for card input || acknowledge. || The sense is inverted from the || level at the pin. */ #define ILOCK_CP0 (1 << 12) /* (r/o, S) this bit is a diagnostic
|| monitor for card present pin 0. || The sense is inverted from the || level at the pin. */ #define ILOCK_CP1 (1 << 13) /* (r/o, S) this bit is a diagnostic
|| monitor for card present pin 1. || The sense is inverted from the || level at the pin. */ #define ILOCK_VS1 (1 << 14) /* (r/o, S) this bit is the primary
|| monitor for Card Voltage Sense || pin 1. || The sense is inverted from the || level at the pin. */ #define ILOCK_VS2 (1 << 15) /* (r/o, S) this bit is the primary
|| monitor for Card Voltage Sense || pin 2. || The sense is inverted from the || level at the pin. */ /*
Silicon Version Register
In diagnostic mode, the high byte of the interlock register is defined as the silicon identity byte.
In order to read this byte, the chip must be placed in diagnostic mode by setting bit 15 of the TESTDIAG register. (This may or may not be enforced by the silicon.)
The layout is:
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 m <-------ID-------> <----ILOCK---->
The fields are:
m Always reset.
ID This field is one of the following:
0x02 the db86082
0x03 the db86082a
0x04 the db86084
0x05 the DB86072ES, (Engineering Sample)
0x07 the db86082bES, (Engineering Sample)
0x08 the db86084a
0x14 the DB86184
0x15 the DB86072, (Production)
0x17 the db86082b, (Production)
*/
/*
|| Defines for Silicon IDs described above. || || Use the following convention for defining SILID_DBxxxxxY: || || SILID_DBxxxxx_1 The First step of chip. || SILID_DBxxxxxA The Second step of chip. || SILID_DBxxxxxB The Third step of chip. || SILID_DBxxxxx... The ... step of chip. || || SILID_DBxxxxx"step of chip"_ES An Engineering Sample of chip. || */ #define SILID_DB86082_1 (0x02)
#define SILID_DB86082A (0x03)
#define SILID_DB86082B_ES (0x07)
#define SILID_DB86082B (0x17)
#define SILID_DB86084_1 (0x04)
#define SILID_DB86084A (0x08)
#define SILID_DB86184_1 (0x14)
#define SILID_DB86072_1_ES (0x05)
#define SILID_DB86072_1 (0x15)
/**** the high order bits (in diag mode) give the chip version ****/ #define AR_ILOCK_ID (R_AUX + 1)
#define ILOCKTEST_ID_SHFT 8 /* the shift count */
#define ILOCKTEST_ID_MASK (0x7F << ILOCKTEST_ID_SHFT)
/* the mask for the field */
/*
|| Use the following convention for defining ILOCKTEST_DBxxxxxY: || || ILOCKTEST_DBxxxxx_1 The First step of chip. || ILOCKTEST_DBxxxxxA The Second step of chip. || ILOCKTEST_DBxxxxxB The Third step of chip. || ILOCKTEST_DBxxxxx... The ... step of chip. || || ILOCKTEST_DBxxxxx"step of chip"_ES An Engineering Sample of chip. || */ #define ILOCKTEST_TCIC2N_1 ((SILID_DB86082_1) << ILOCKTEST_ID_SHFT)
#define ILOCKTEST_DB86082_1 ILOCKTEST_TCIC2N_1
#define ILOCKTEST_TCIC2N_2 ((SILID_DB86082A) << ILOCKTEST_ID_SHFT)
#define ILOCKTEST_DB86082A ILOCKTEST_TCIC2N_2
#define ILOCKTEST_TCIC2N_3 ((SILID_DB86082B_ES) << ILOCKTEST_ID_SHFT)
#define ILOCKTEST_DB86082B_ES ILOCKTEST_TCIC2N_3
#define ILOCKTEST_DB86082B ((SILID_DB86082B) << ILOCKTEST_ID_SHFT)
#define ILOCKTEST_DB86084_1 ((SILID_DB86084_1) << ILOCKTEST_ID_SHFT)
#define ILOCKTEST_DB86084A ((SILID_DB86084A) << ILOCKTEST_ID_SHFT)
#define ILOCKTEST_DB86184_1 ((SILID_DB86184_1) << ILOCKTEST_ID_SHFT)
#define ILOCKTEST_DB86072_1 ((SILID_DB86072_1) << ILOCKTEST_ID_SHFT)
#define ILOCKTEST_DB86072_1_ES ((SILID_DB86072_1_ES) << ILOCKTEST_ID_SHFT)
/**** the test control register ****/ #define AR_TEST (R_AUX + 0)
#define TEST_AEN (1 << 0) /* force card AEN */
#define TEST_CEN (1 << 1) /* force card CEN */
#define TEST_CTR (1 << 2) /* test programming pulse, address ctrs */
#define TEST_ENA (1 << 3) /* force card-present (for test), and
|| special VPP test mode */ #define TEST_IO (1 << 4) /* feed back some I/O signals
|| internally. */ #define TEST_OUT1 (1 << 5) /* force special address output mode */
#define TEST_ZPB (1 << 6) /* enter ZPB test mode */
#define TEST_WAIT (1 << 7) /* force-enable WAIT pin */
#define TEST_PCTR (1 << 8) /* program counter in read-test mode */
#define TEST_VCTL (1 << 9) /* force-enable power-supply controls */
#define TEST_EXTA (1 << 10) /* external access doesn't override
|| internal decoding. */ #define TEST_DRIVECDB (1 << 11) /* drive the card data bus all the time */
#define TEST_ISTP (1 << 12) /* turn off CCLK to the interrupt CSR */
#define TEST_BSTP (1 << 13) /* turn off BCLK internal to the chip */
#define TEST_CSTP (1 << 14) /* turn off CCLK except to int CSR */
#define TEST_DIAG (1 << 15) /* enable diagnostic read-back mode */
/*
Indirectly Addressed Registers
Indirect address Function ---------------- --------
[$000:$003] Socket configuration registers for socket 0. [$008:$00A] Socket configuration registers for socket 1. (we allow for up to 8 sockets per adapter)
[$00B:$0FF] reserved
[$100:$107] Memory window 0 translation registers: $100: reserved; $102: base window address $104: map to card address $106: control register. [$108:$10F] Memory window 1 translation registers [$110:$117] Memory window 2 translation registers ... [$138:$13F] Memory window 7 translation registers [$140:$147] Memory window 8 translation registers [$148:$14F] Memory window 9 translation registers
(the architecture reserves room for up to 32 windows.)
[$200:$203] I/O window 0 translation registers [$204:$207] I/O window 1 translation registers [$208:$20B] I/O window 2 translation registers [$20C:$20F] I/O window 3 translation registers
[$210:$2FF]
[$300:$301] Adapter configuration register 0 ('x84 and later)
[$320:$321] Configuration ROM CSR.
[$380:$381] Plug and Play ISA read port and address port reister [$382:$383] Plug and Play ISA configuration sequence number and logical device number register. [$384:$385] Plug and Play chip ID/test register. [$386:$387] Plug and Play config selection register. [$386:$3FFFFFF] Reserved -- do not read or write.
*/
/*
Bit definitions:
1) The Indirect Socket Configuration Registers:
*/
#define IR_SCFG_S(skt) (0 + (skt) * 8) /* base indices of socket config */
#define IR_SCFG_S0 IR_SCFG_S(0) /* base indices of socket config */
#define IR_SCFG_S1 IR_SCFG_S(1) /* regs for socket 0, 1 */
#define IR_MWIN_BASE 0x100 /* where they start */
#define IR_MWIN_NUM_082 8 /* number of memory windows */
#define IR_MWIN_NUM_082A 10 /* number of memory windows in 082a */
#define IR_MWIN_NUM_082B 10 /* number of memory windows in 082b */
#define IR_MWIN_NUM_084 10 /* number of memory windows in 084 */
#define IR_MWIN_NUM_184 10 /* number of memory windows in 184 */
#define IR_MWIN_NUM_072 10 /* number of memory windows in 072 */
#define IR_MWIN_NUM_MAX 32 /* make arrays of windows this big */
#define IR_MWIN_SIZE 8 /* 8 bytes per window descriptor */
#define IR_MBASE_X 2 /* index to the memory base controlreg */
#define IR_MMAP_X 4 /* index to the memory map control reg */
#define IR_MCTL_X 6 /* index to the memory window control reg */
#define IR_MBASE_W(w) (IR_MWIN_BASE + (w) * IR_MWIN_SIZE + IR_MBASE_X)
#define IR_MMAP_W(w) (IR_MWIN_BASE + (w) * IR_MWIN_SIZE + IR_MMAP_X)
#define IR_MCTL_W(w) (IR_MWIN_BASE + (w) * IR_MWIN_SIZE + IR_MCTL_X)
#define IR_IOWIN_BASE 0x200 /* where they start */
#define IR_IOWIN_SIZE 4 /* bytes per window descriptor */
#define IR_IOWIN_NUM 4 /* we have 4 of them on the 082 */
/* should be defined as 0 on the
86301 */ #define IR_IOBASE_X 0 /* index to the I/O base register */
#define IR_IOCTL_X 2 /* index to the I/O window control register */
#define IR_IOBASE_W(w) (IR_IOWIN_BASE + (w) * IR_IOWIN_SIZE + IR_IOBASE_X)
#define IR_IOCTL_W(w) (IR_IOWIN_BASE + (w) * IR_IOWIN_SIZE + IR_IOCTL_X)
/**** patterns in the indirect registers ****/ #define IRSCFG_IRQ_MASK (0xF) /* mask for this bit field */
#define IRSCFG_IRQOFF (0) /* disable */
#define IRSCFG_SIRQ (0x1) /* use SKTIRQ (2/N) */
#define IRSCFG_IRQ3 (0x3) /* use IRQ3 */
#define IRSCFG_IRQ4 (0x4) /* use IRQ4 */
#define IRSCFG_IRQ5 (0x5) /* use IRQ5 */
#define IRSCFG_IRQ6 (0x6) /* use IRQ6 */
#define IRSCFG_IRQ7 (0x7) /* use IRQ7 */
#define IRSCFG_IRQ9 (0x9) /* use IRQ9 */
#define IRSCFG_IRQ10 (0xA) /* use IRQ10 */
#define IRSCFG_IRQ11 (0xB) /* use IRQ11 */
#define IRSCFG_IRQ12 (0xC) /* use IRQ12 */
#define IRSCFG_IRQ14 (0xE) /* use IRQ14 */
#define IRSCFG_IRQ15 (0xF) /* use IRQ15 */
#define IRSCFG_IRQOC (1 << 4) /* selected IRQ is
|| open-collector, and active || low; otherwise it's totem- || pole and active hi. */ #define IRSCFG_PCVT (1 << 5) /* convert level-mode IRQ
|| to pulse mode, or stretch || pulses from card. */ #define IRSCFG_IRDY (1 << 6) /* interrupt from RDY (not
|| from /IREQ). Used with || ATA drives. */ #define IRSCFG_ATA (1 << 7) /* Special ATA drive mode.
|| CEL/H become CE1/2 in || the IDE sense; CEL is || activated for even window || matches, and CEH for || odd window matches. */ #define IRSCFG_DMA_SHIFT 8 /* offset to DMA selects; */
#define IRSCFG_DMA_MASK (0x7 << IRSCFG_DMA_SHIFT)
#define IRSCFG_DMAOFF (0 << IRSCFG_DMA_SHIFT) /* disable DMA */
#define IRSCFG_DREQ2 (2 << IRSCFG_DMA_SHIFT) /* enable DMA on DRQ2 */
#define IRSCFG_IOSTS (1 << 11) /* enable I/O status mode;
|| allows CIORD/CIOWR to || become low-Z. */ #define IRSCFG_SPKR (1 << 12) /* enable SPKR output from
|| this card */ #define IRSCFG_FINPACK (1 << 13) /* force card input
|| acknowledge during I/O || cycles. Has no effect || if no windows map to card */ #define IRSCFG_DELWR (1 << 14) /* force -all- data to
|| meet 60ns setup time || ("DELay WRite") */ #define IRSCFG_HD7IDE (1 << 15) /* Enable special IDE
|| data register mode: odd || byte addresses in odd || I/O windows will not || drive HD7. */
/***** bits in the second config register *****/ #define IR_SCF2_S(skt) (IR_SCFG_S(skt) + 2) /* index to second config reg */
#define IR_SCF2_S0 IR_SCF2_S(0) /* second config for socket 0 */
#define IR_SCF2_S1 IR_SCF2_S(1) /* second config for socket 0 */
#define IRSCF2_RI (1 << 0) /* enable RI pin from STSCHG
|| (2/N) */ #define IRSCF2_IDBR (1 << 1) /* force I/O data bus routing
|| for this socket, regardless || of cycle type. (2/N) */ #define IRSCF2_MDBR (1 << 2) /* force memory window data
|| bus routing for this || socket, regardless of cycle || type. (2/N) */ #define IRSCF2_MLBAT1 (1 << 3) /* disable status change
|| ints from LBAT1 (or || "STSCHG" */ #define IRSCF2_MLBAT2 (1 << 4) /* disable status change
|| ints from LBAT2 (or || "SPKR" */ #define IRSCF2_MRDY (1 << 5) /* disable status change ints
|| from RDY/BSY (or /IREQ). || note that you get ints on || both high- and low-going || edges if this is enabled. */ #define IRSCF2_MWP (1 << 6) /* disable status-change ints
|| from WP (or /IOIS16). || If you're using status || change ints, you better set || this once an I/O window is || enabled, before accessing || it. */ #define IRSCF2_MCD (1 << 7) /* disable status-change ints
|| from Card Detect. */
/*
|| note that these bits match the top 5 bits of the socket status register || in order and sense. */
#define IRSCF2_DMASRC_MASK (0x3 << 8) /* mask for this bit field */
/*-- DMA Source --*/ #define IRSCF2_DRQ_BVD2 (0x0 << 8) /* BVD2 */
#define IRSCF2_DRQ_IOIS16 (0x1 << 8) /* IOIS16 */
#define IRSCF2_DRQ_INPACK (0x2 << 8) /* INPACK */
#define IRSCF2_DRQ_FORCE (0x3 << 8) /* Force it */
/* reserved (0xFC00) */ /* top 6 bits are RFU */
/****************************************************************************\
| | The memory window control registers. | \****************************************************************************/
/*
|| The BASE ADDRESS register establishes a correspondence between || a host bus address and a particular memory window. || || The MAP ADDRESS register establishes a correspondence between a || window and a particular card address. The contents of this register || are ADDED to the address from the host, and (therefore) are not || independent of the value in the BASE ADDRESS register. That is, || the value to put into the MAP ADDRESS register to map to page || 0 of common space is NOT (in general) 0; it is, rather, (-window || base address), in twos complement. || || Of course, you must use the twos complement of the actual window || base, NOT of the value that's actually in the BASE ADDRESS register; || that value also has the window size encoded in it. || || The window enable bit for a given window is automatically cleared whenever || you write to the BASE ADDRESS register. */ /**** the base register ****/ #define MBASE_ILV (1 << 15) /* rfu */
#define MBASE_4K (1 << MBASE_4K_BIT) /* if set, addresses are 4K */
#define MBASE_4K_BIT 14 /* (bit shift count) */
#define MBASE_HA_SHFT (12) /* shift host addresses
|| right this much */ #define MBASE_HA_MASK (0xFFF) /* mask for host address
|| bits in this register */ #define MBASE_HA2BASE(ha) \
( \ ((USHORT) ((ha) >> MBASE_HA_SHFT) & MBASE_HA_MASK) \ | \ (((USHORT) (ha) & (1 << 11)) << (MBASE_4K_BIT - 11)) \ )
#define MBASE_BASE2HA(base) \
( \ ((ULONG) ((base) & MBASE_HA_MASK) << MBASE_HA_SHFT) \ | \ (((base) & MBASE_4K) >> (MBASE_4K_BIT - 11)) \ )
/**** the card mapping register ****/ #define MMAP_CA_SHFT 12 /* shift card address right this much */
#define MMAP_CA_MASK (0x3FFF) /* then mask with this */
#define MMAP_REG (1 << 15) /* the REG bit */
/**** the mem window control register ****/ #define MCTL_WSCNT_MASK 0x1F /* the wait-state mask register */
#define MCTL_WSCNT_SHFT 0 /* how to align it */
/* reserved (1<<5) -- this bit is reserved */
#define MCTL_QUIET (1<<6) /* the window is quiet */
#define MCTL_WP (1<<7) /* prohibit writes via this window */
#define MCTL_ACC (1<<8) /* if set, we've used this window */
#define MCTL_KE (1<<9) /* enable caching on this window */
#define MCTL_EDC (1<<10) /* enable EDC on this window */
#define MCTL_B8 (1<<11) /* force window to be 8 bits */
#define MCTL_SS_SHFT (TCIC_SS_SHFT) /* socket select in standard place (bits 12-14) */
#define MCTL_SS_MASK (TCIC_SS_MASK) /* ditto for mask */
#define MCTL_ENA (1<<15) /* enable the window */
/**** the I/O base register ****/ /*
|| the base and length are encoded here, pretty much as they are for the || memory base register; however, a 17th bit is needed, and can be found || in the I/O window control register (IOCTL_TINY). */
/**** the I/O control register ****/ #define ICTL_WSCNT_MASK MCTL_WSCNT_MASK /* these are the same */
#define ICTL_WSCNT_SFHT MCTL_WSCNT_SHFT /* and are shown this way to ensure
|| that you can use the same code to ||generate them, if you like */ #define ICTL_PASS16 (1 << 5) /* If this bit is set, then all 16
|| bits of an I/O address will be || passed through to the card, even || if the window is only a 10-bit || window. If reset, then only 10 || bits will be passed if this is a || 1K window, even if HA[15:10] were || non-zero. Regardless of the || value of this bit, the 082 always || acts as if this bit were clear. */ #define ICTL_QUIET MCTL_QUIET /* more commonality */
#define ICTL_1K (1 << 7) /* ignore ha[15:10] in comparisons;
|| this makes us 100% PC compatible. */ #define ICTL_ACC MCTL_ACC /* more commonality */
#define ICTL_TINY (1 << 9) /* window is exactly 1 byte long */
#define ICTL_B16 (1 << 10) /* I/O mode stuff; force 16 bit, but
|| also encodes stuff; see below. */ #define ICTL_B8 (MCTL_B8)
/* B8 and B16, taken together, define the bus width for this window: */ #define ICTL_BW_MASK (ICTL_B8 | ICTL_B16) /* the field itself. */
#define ICTL_BW_DYN (0) /* use CIOIS16 */
#define ICTL_BW_8 (ICTL_B8) /* force 8-bit (no /HIOCS16) */
#define ICTL_BW_16 (ICTL_B16) /* force 16-bit (force HIOCS16) */
#define ICTL_BW_ATA (ICTL_B8|ICTL_B16) /* ATA mode IOCS16 */
/*
"ATA mode IOCS16" means that this window is to be used with an ATA/IDE-like drive. /HIOCS16 is asserted for references to addresses 0, 8, ... within the window; it is deasserted for all other addresses.
*/
/* socket is selected in the usual way, using the usual fields */ #define ICTL_SS_SHFT (TCIC_SS_SHFT) /* the shift count for the socket
|| for this window (12) */ #define ICTL_SS_MASK (TCIC_SS_MASK) /* the mask for the field (0x7000) */
#define ICTL_ENA (MCTL_ENA) /* enable the window (same fn/same bit) */
/****************************************************************************\
| | The TCIC architecture V2.0 registers | \****************************************************************************/
#define IR_ADPTCFG0 0x300 /* The primary adapter config register */
#define IRADPCF0_PNPCS (1 << 0) /* if set, using PnP to set base addr */
#define IRADPCF0_MULTI (1 << 1) /* if set, NMULTI# functions are available */
#define IRADPCF0_EE1K (1 << 2) /* if set, if EEPROM is present, it's 1K (max) */
#define IRADPCF0_EE (1 << 3) /* if set, EE control is present */
#define IRADPCF0_DRQ2 (1 << 4) /* if set, DMA is possible */
#define IRADPCF0_IRQ6 (1 << 5) /* if set, IRQ6 is available */
#define IRADPCF0_IRQ9 (1 << 6) /* if set, IRQ9 is available */
#define IRADPCF0_IRQ12 (1 << 7) /* if set, IRQ12 is available */
#define IRADPCF0_IRQ15 (1 << 8) /* if set, IRQ15 is available */
#define IRADPCF0_3V (1 << 9) /* if set, CVS & 3V/5V are enabled */
#define IRADPCF0_BUSYLED (1 << 10) /* if set, we have busy light(s) */
#define IRADPCF0_BUSYSKT (1 << 11) /* if set, busy lights are per skt */
#define IRADPCF0_ILOCK (1 << 12) /* if set, we have interlocks */
#define IRADPCF0_ILOCKSKT (1 << 13) /* if set, ilocks are per-skt */
#define IRADPCF0_NONSTD (1 << 14) /* if set, a hardware-specific driver
|| is required. */ #define IRADPCF0_READY (1 << 15) /* if set, TCIC has finished power-up
|| self configuration. */
#define IR_ROMCSR 0x320 /* the config ROM csr */
#define IR_ROMCSR_ADDR_MASK 0xFF /* the WORD address bits */
#define IR_ROMCSR_CMD_SHFT 12 /* the ROM command bit offset */
#define IR_ROMCSR_CMD_MASK (3 << 12)
#define IR_ROMCSR_GO (1 << 14) /* set this bit to process a command */
#define IR_ROMCSR_BUSY (1 << 15) /* r/o: set while working */
/**** the READ command -- data shows up in PDATA ****/ #define IR_ROMCSR_READCMD(a) \
((2 << IR_ROMCSR_CMD_SHFT) | \ ((a) & IR_ROMCSR_ADDR_MASK))
/**** the WRITE command ****/ #define IR_ROMCSR_WRITECMD(a) \
((1 << IR_ROMCSR_CMD_SHFT) | \ ((a) & IR_ROMCSR_ADDR_MASK))
/**** the ERASE WORD command ****/ #define IR_ROMCSR_ERASEWDCMD(a) \
((3 << IR_ROMCSR_CMD_SHFT) | \ ((a) & IR_ROMCSR_ADDR_MASK))
/**** the WRITE-ENABLE command ****/ #define IR_ROMCSR_WRITEENA \
((0 << IR_ROMCSR_CMD_SHFT) | \ ((0x03) & IR_ROMCSR_ADDR_MASK))
/**** the WRITE-DISABLE command ****/ #define IR_ROMCSR_WRITEDSA \
((0 << IR_ROMCSR_CMD_SHFT) | \ ((0x00) & IR_ROMCSR_ADDR_MASK))
/****************************************************************************\
| | The plug and play test registers | \****************************************************************************/
#define IR_PNPADDRP 0x380 /* PnP ISA: read port, address port */
#define IRPNPADDR_ADDR_MASK 0x00FF /* the last value written to the
|| PnP address register. */ #define IRPNPADDR_ADDR_SHFT 0
#define IRPNPADDR_RDP_MASK 0xFF00 /* the last value written to the read-
|| data port-address PnP register. */ #define IRPNPADDR_RDP_SHFT 8
/**** handy place to figure out CSN, LDN ****/ #define IR_PNPCSNLDN 0x382 /* PnP ISA: card seq no, log dev no */
#define IRPNPCSN_LDN_MASK 0xFF00 /* the last value written to this
|| chip's PnP logical dev # reg. */ #define IRPNPCSN_LDN_SHFT 8
#define IRPNPCSN_CSN_MASK 0x00FF /* the last value written to this
|| chip's PnP CSN register. */ #define IRPNPCSN_CSN_SHFT 0
/**** handy place to figure out chip ID ****/ #define IR_PNPTEST 0x384 /* PnP ISA: chip id */
#define IRPNPTEST_CHIPID_MASK 0x00FF /* the Chip ID captured during the last
|| PnP wake-up seqeunce. */ #define IRPNPTEST_CHIPID_SHFT 0
#define IRPNPTEST_LSTCFGCTL_SHFT 8 /* the last value written to cfgctl */
#define IRPNPTEST_LSTCFGCTL_MASK (7 << IRPNPTEST_LSTCFGCTL_SHFT)
#define IRPNPTEST_ISO2ND (1 << 11)
#define IRPNPTEST_MTCH1ST (1 << 12)
#define IRPNPTEST_STATE_SHFT 13
#define IRPNPTEST_STATE_MASK (3 << IRPNPTEST_STATE_SHFT)
#define IRPNPTEST_STATE_WFK (0 << IRPNPTEST_STATE_SHFT)
#define IRPNPTEST_STATE_SLP (1 << IRPNPTEST_STATE_SHFT)
#define IRPNPTEST_STATE_ISO (2 << IRPNPTEST_STATE_SHFT)
#define IRPNPTEST_STATE_CFG (3 << IRPNPTEST_STATE_SHFT)
/**** the following register lets us see what PNP software has done ****/ #define IR_PNPCFG 0x386 /* PnP ISA: configuration info */
#define IRPNPCFG_IRQ_SHFT 0
#define IRPNPCFG_IRQ_MASK (0xF << IRPNPCFG_IRQ_SHFT)
#define IRPNPCFG_IRQLVL (1 << 4) /* Level IRQ selected */
#define IRPNPCFG_IRQHIGH (1 << 5) /* active high IRQ select */
#define IRPNPCFG_DMA_SHFT 8
#define IRPNPCFG_DMA_MASK (7 << IRPNPCFG_DMA_SHFT)
/**** end of tcic2.h ****/ #endif /* _TCIC2_H_ */
|