1 /*        $NetBSD: pcctworeg.h,v 1.3 2008/04/28 20:23:54 martin Exp $ */
2 
3 /*-
4  * Copyright (c) 1999, 2002 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to The NetBSD Foundation
8  * by Steve C. Woodford
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  * POSSIBILITY OF SUCH DAMAGE.
30  */
31 
32 /*
33  * Register definitions for the PCCchip2 device, and offset to the
34  * various subordinate devices which hang off it.
35  */
36 #ifndef   _MVME_PCCTWOREG_H
37 #define   _MVME_PCCTWOREG_H
38 
39 /*
40  * Offsets to the various devices which hang off the PCCChip2.
41  * Note that these are offsets from the base of the PCCChip2's
42  * own registers.
43  */
44 #define PCCTWO_REG_OFF            0x00000         /* Offset of PCCChip2's own registers */
45 #define PCCTWO_LPT_OFF            0x00000         /* Offset of parallel port registers */
46 #define PCCTWO_SCC_OFF      0x03000     /* Offset of CD2401 Serial Comms chip */
47 #define PCCTWO_IE_OFF             0x04000         /* Offset of 82596 LAN controller */
48 #define PCCTWO_NCRSC_OFF    0x05000     /* Offset of NCR53C710 SCSI chip */
49 
50 /*
51  * The two devices on mvme1[67]2's MCchip
52  */
53 #define MCCHIP_ZS0_OFF      0x03000
54 #define MCCHIP_ZS1_OFF      0x03800
55 
56 /*
57  * This is needed to figure out the boot device.
58  * (The physical address of the boot device's registers are passed in
59  * from the Boot ROM)
60  */
61 #define PCCTWO_PADDR(off)     ((void *)(0xfff42000u + (off)))
62 
63 
64 /*
65  * The layout of the PCCchip2's Registers.
66  * Each one is 8-bits wide, unless otherwise indicated.
67  */
68 #define   PCC2REG_CHIP_ID               0x00      /* Chip ID */
69 #define   PCC2REG_CHIP_REVISION         0x01      /* Chip Revision */
70 #define   PCC2REG_GENERAL_CONTROL       0x02      /* General Control */
71 #define   PCC2REG_VECTOR_BASE 0x03      /* Vector Base */
72 #define   PCC2REG_TIMER1_COMPARE        0x04      /* Tick Timer 1 Compare (32-bit) */
73 #define   PCC2REG_TIMER1_COUNTER        0x08      /* Tick Timer 1 Counter (32-bit) */
74 #define   PCC2REG_TIMER2_COMPARE        0x0c      /* Tick Timer 2 Compare (32-bit) */
75 #define   PCC2REG_TIMER2_COUNTER        0x10      /* Tick Timer 2 Counter (32-bit) */
76 #define   PCC2REG_PRESCALE_COUNT        0x14      /* Prescaler Count */
77 #define   PCC2REG_PRESCALE_ADJUST       0x15      /* Prescaler Clock Adjust */
78 #define   PCC2REG_TIMER2_CONTROL        0x16      /* Tick Timer 2 Control */
79 #define   PCC2REG_TIMER1_CONTROL        0x17      /* Tick Timer 1 Control */
80 #define   PCC2REG_GPIO_ICSR   0x18      /* GP Input Interrupt Control */
81 #define   PCC2REG_GPIO_CONTROL          0x19      /* GP Input/Output Control */
82 #define   PCC2REG_TIMER2_ICSR 0x1a      /* Tick Timer 2 Interrupt Control */
83 #define   PCC2REG_TIMER1_ICSR 0x1b      /* Tick Timer 1 Interrupt Control */
84 #define   PCC2REG_SCC_ERR_STATUS        0x1c      /* SCC Error Status */
85 #define   PCC2REG_SCC_MODEM_ICSR        0x1d      /* SCC Modem Interrupt Control */
86 #define   PCC2REG_SCC_TX_ICSR 0x1e      /* SCC Transmit Interrupt Control */
87 #define   PCC2REG_SCC_RX_ICSR 0x1f      /* SCC Receive Interrupt Control */
88 #define   PCC2REG_SCC_MODEM_PIACK       0x23      /* SCC Modem PIACK */
89 #define   PCC2REG_SCC_TX_PIACK          0x25      /* SCC Transmit PIACK */
90 #define   PCC2REG_SCC_RX_PIACK          0x27      /* SCC Receive PIACK */
91 #define   PCC2REG_ETH_ERR_STATUS        0x28      /* LANC Error Status */
92 #define   PCC2REG_ETH_ICSR    0x2a      /* LANC Interrupt Control */
93 #define   PCC2REG_ETH_BERR_STATUS       0x2b      /* LANC Bus Error Interrupt Ctrl */
94 #define   PCC2REG_SCSI_ERR_STATUS       0x2c      /* SCSI Error Status */
95 #define   PCC2REG_SCSI_ICSR   0x2f      /* SCSI Interrupt Control */
96 #define   PCC2REG_PRT_ACK_ICSR          0x30      /* Printer ACK Interrupt Control */
97 #define   PCC2REG_PRT_FAULT_ICSR        0x31      /* Printer FAULT Interrupt Ctrl */
98 #define   PCC2REG_PRT_SEL_ICSR          0x32      /* Printer SEL Interrupt Control */
99 #define   PCC2REG_PRT_PE_ICSR 0x33      /* Printer PE Interrupt Control */
100 #define   PCC2REG_PRT_BUSY_ICSR         0x34      /* Printer BUSY Interrupt Control */
101 #define   PCC2REG_PRT_INPUT_STATUS 0x36 /* Printer Input Status */
102 #define   PCC2REG_PRT_CONTROL 0x37      /* Printer Port Control */
103 #define   PCC2REG_CHIP_SPEED  0x38      /* Chip Speed (16-bit) */
104 #define   PCC2REG_PRT_DATA    0x3a      /* Printer Data (16-bit) */
105 #define   PCC2REG_IRQ_LEVEL   0x3e      /* Interrupt Priority Level */
106 #define   PCC2REG_IRQ_MASK    0x3f      /* Interrupt Mask */
107 
108 /*
109  * Additions to the registers for the MCChip. Some of these overlap with
110  * the PCCchip2's registers, but only where hardware is not present, eg.
111  * the printer registers.
112  */
113 #define   MCCHIPREG_TIMER4_ICSR         0x18      /* Tick timer 4 interrupt control */
114 #define   MCCHIPREG_TIMER3_ICSR         0x19      /* Tick timer 4 interrupt control */
115 #define   MCCHIPREG_PARERR_ICSR         0x1c      /* Parity error interrupt control */
116 #define   MCCHIPREG_SCC_ICSR  0x1d      /* ZS-85230 interrupt control */
117 #define   MCCHIPREG_TIMER4_CTRL         0x1e      /* Tick timer 4 control */
118 #define   MCCHIPREG_TIMER3_CTRL         0x1f      /* Tick timer 3 control */
119 #define   MCCHIPREG_DRAM_BAR  0x20      /* DRAM Base Address (16-bits) */
120 #define   MCCHIPREG_SRAM_BAR  0x22      /* SRAM Base Address (16-bits) */
121 #define   MCCHIPREG_DRAM_SIZE 0x24      /* DRAM Size */
122 #define   MCCHIPREG_RAM_OPTIONS         0x25      /* DRAM/SRAM Options */
123 #define   MCCHIPREG_SRAM_SIZE 0x26      /* SRAM Size */
124 #define   MCCHIPREG_GP_INPUTS 0x2d      /* General Purpose Inputs */
125 #define   MCCHIPREG_162_VERSION         0x2e      /* MVME162-LX Series Version */
126 #define   MCCHIPREG_TIMER3_COMP         0x30      /* Tick Timer 3 Compare (32-bit) */
127 #define   MCCHIPREG_TIMER3_CNTR         0x34      /* Tick Timer 3 Counter (32-bit) */
128 #define   MCCHIPREG_TIMER4_COMP         0x38      /* Tick Timer 4 Compare (32-bit) */
129 #define   MCCHIPREG_TIMER4_CNTR         0x3c      /* Tick Timer 4 Counter (32-bit) */
130 #define   MCCHIPREG_BUS_CLOCK 0x40      /* Bus Clock */
131 #define   MCCHIPREG_EPROM_TIMING        0x41      /* EPROM Access Time Control */
132 #define   MCCHIPREG_FLASH_TIMING        0x42      /* FLASH Access Time Control */
133 #define   MCCHIPREG_ABORT_ICSR          0x43      /* ABORT Switch Interrupt Control */
134 #define   MCCHIPREG_RESET_CONTROL       0x44      /* Reset Switch Control */
135 #define   MCCHIPREG_WDOG_CONTROL        0x45      /* Watchdog Timer Control */
136 #define   MCCHIPREG_TIMEBASE_SEL        0x46      /* Access & Watchdog Timebase Select */
137 #define   MCCHIPREG_DRAM_CONTROL        0x48      /* Parity DRAM Control */
138 #define   MCCHIPREG_MPU_STATUS          0x4a      /* MPU Status */
139 #define   MCCHIPREG_PRESCALER 0x4c      /* Prescaler Count Register (32-bits) */
140 
141 /*
142  * PCCchip2's register size is 0x40. MCchip's is 0x50. Plump for the latter.
143  */
144 #define PCC2REG_SIZE                    0x50
145 
146 /*
147  * Convenience macroes for accessing the PCCChip2's registers
148  * through bus_space.
149  */
150 #define   pcc2_reg_read(sc,r) \
151                     bus_space_read_1((sc)->sc_bust, (sc)->sc_bush, (r))
152 #define   pcc2_reg_read16(sc,r)         \
153                     bus_space_read_2((sc)->sc_bust, (sc)->sc_bush, (r))
154 #define   pcc2_reg_read32(sc,r)         \
155                     bus_space_read_4((sc)->sc_bust, (sc)->sc_bush, (r))
156 #define   pcc2_reg_write(sc,r,v)        \
157                     bus_space_write_1((sc)->sc_bust, (sc)->sc_bush, (r), (v))
158 #define   pcc2_reg_write16(sc,r,v)      \
159                     bus_space_write_2((sc)->sc_bust, (sc)->sc_bush, (r), (v))
160 #define   pcc2_reg_write32(sc,r,v)      \
161                     bus_space_write_4((sc)->sc_bust, (sc)->sc_bush, (r), (v))
162 
163 /*
164  * We use the interrupt vector bases suggested in the Motorola Docs...
165  * The first is written to the PCCChip2 for interrupt sources under
166  * its control. The second is written to the CD2401's Local Interrupt
167  * Vector Register. Thus, we don't use the Auto-Vector facilities
168  * for the CD2401, as recommended in the PCCChip2 Programmer's Guide.
169  * The third is used as a base for the ZS85230 serial chips on mvme162.
170  */
171 #define PCCTWO_VECBASE                  0x50
172 #define PCCTWO_SCC_VECBASE    0x5c
173 #define MCCHIP_ZS_VECBASE     0x5c
174 
175 /*
176  * PCCchip2 Vector Encoding (Offsets from PCCTWO_VECBASE)
177  * The order 0x0 -> 0xf also indicates priority, with 0x0 lowest.
178  */
179 #define PCCTWOV_PRT_BUSY      0x0       /* Printer Port 'BSY' */
180 #define PCCTWOV_PRT_PE                  0x1       /* Printer Port 'PE' (Paper Empty) */
181 #define PCCTWOV_PRT_SELECT    0x2       /* Printer Port 'SELECT' */
182 #define PCCTWOV_PRT_FAULT     0x3       /* Printer Port 'FAULT' */
183 #define PCCTWOV_PRT_ACK                 0x4       /* Printer Port 'ACK' */
184 #define PCCTWOV_SCSI                    0x5       /* SCSI Interrupt */
185 #define PCCTWOV_LANC_ERR      0x6       /* LAN Controller Error */
186 #define PCCTWOV_LANC_IRQ      0x7       /* LAN Controller Interrupt */
187 #define PCCTWOV_TIMER2                  0x8       /* Tick Timer 2 Interrupt */
188 #define PCCTWOV_TIMER1                  0x9       /* Tick Timer 1 Interrupt */
189 #define PCCTWOV_GPIO                    0xa       /* General Purpose Input Interrupt */
190 #define PCCTWOV_SCC_RX_EXCEP  0xc       /* SCC Receive Exception */
191 #define PCCTWOV_SCC_MODEM     0xd       /* SCC Modem (Non-Auto-vector mode) */
192 #define PCCTWOV_SCC_TX                  0xe       /* SCC Tx (Non-Auto-vector mode) */
193 #define PCCTWOV_SCC_RX                  0xf       /* SCC Rx (Non-Auto-vector mode) */
194 #define PCCTWOV_MAX           16
195 
196 /*
197  * MCchip-specific Vector Encoding (Offsets from PCCTWO_VECBASE)
198  */
199 #define MCCHIPV_TIMER4                  0x3       /* Tick Timer 4 Interrupt */
200 #define MCCHIPV_TIMER3                  0x4       /* Tick Timer 3 Interrupt */
201 #define MCCHIPV_PARITY_ERR    0xb       /* Parity DRAM Error Exception */
202 #define MCCHIPV_ZS0           0xc       /* First ZS85230 Interrupt Vector */
203 #define MCCHIPV_ZS1           0xc       /* Second ZS85230 Interrupt Vector */
204 #define MCCHIPV_ABORT                   0xe       /* Abort Switch */
205 
206 /*
207  * How to identify the PCCchip2 from an MCchip
208  */
209 #define PCCTWO_CHIP_ID_PCC2   0x20
210 #define PCCTWO_CHIP_ID_MCCHIP 0x84
211 
212 
213 /*
214  * Bit Values for the General Control Register (PCC2REG_GENERAL_CONTROL)
215  */
216 #define   PCCTWO_GEN_CTRL_FAST          (1u<<0)   /* BBRAM Speed Control */
217 #define   PCCTWO_GEN_CTRL_MIEN          (1u<<1)   /* Master Interrupt Enable */
218 #define PCCTWO_GEN_CTRL_C040  (1u<<2)   /* Set when CPU is mc68k family */
219 #define PCCTWO_GEN_CTRL_DR0   (1u<<3)   /* Download ROM at 0 (mvme166 only) */
220 
221 
222 /*
223  * Calculate the Prescaler Adjust value for a given
224  * value of BCLK in MHz. (PCC2REG_PRESCALE_ADJUST)
225  */
226 #define PCCTWO_PRES_ADJ(mhz)  (256 - (mhz))
227 
228 
229 /*
230  * Calculate the Tick Timer Compare register value for
231  * a given number of micro-seconds. With the PCCChip2,
232  * this is simple since the Tick Counters already have
233  * a 1uS period. (PCC2REG_TIMER[12]_COMPARE)
234  */
235 #define PCCTWO_TIMERFREQ      1000000
236 #define PCCTWO_US2LIM(us)     (us)
237 #define PCCTWO_LIM2US(lim)    (lim)
238 
239 /*
240  * The Tick Timer Control Registers (PCC2REG_TIMER[12]_CONTROL)
241  */
242 #define PCCTWO_TT_CTRL_CEN    (1u<<0)   /* Counter Enable */
243 #define PCCTWO_TT_CTRL_COC    (1u<<1)   /* Clear On Compare */
244 #define PCCTWO_TT_CTRL_COVF   (1u<<2)   /* Clear Overflow Counter */
245 #define PCCTWO_TT_CTRL_OVF(r) ((r)>>4)/* Value of the Overflow Counter */
246 
247 
248 /*
249  * All the Interrupt Control Registers (PCC2REG_*_ICSR) on the PCCChip2
250  * mostly share the same basic layout. These are defined as follows:
251  */
252 #define PCCTWO_ICR_LEVEL_MASK 0x7       /* Mask for the interrupt level */
253 #define PCCTWO_ICR_ICLR                 (1u<<3)   /* Clear Int. (edge-sensitive mode) */
254 #define PCCTWO_ICR_AVEC                 (1u<<3)   /* Enable Auto-Vector Mode */
255 #define PCCTWO_ICR_IEN                  (1u<<4)   /* Interrupt Enable */
256 #define PCCTWO_ICR_INT                  (1u<<5)   /* Interrupt Active */
257 #define PCCTWO_ICR_LEVEL      (0u<<6)   /* Level Triggered */
258 #define PCCTWO_ICR_EDGE                 (1u<<6)   /* Edge Triggered */
259 #define PCCTWO_ICR_RISE_HIGH  (0u<<7)   /* Polarity: Rising Edge or Hi Level */
260 #define PCCTWO_ICR_FALL_LOW   (1u<<7)   /* Polarity: Falling Edge or Lo Level */
261 #define PCCTWO_ICR_SC_RD(r)   ((r)>>6)/* Get Snoop Control Bits */
262 #define PCCTWO_ICR_SC_WR(r)   ((r)<<6)/* Write Snoop Control Bits */
263 
264 
265 
266 /*
267  * Most of the Error Status Registers (PCC2REG_*_ERR_STATUS) mostly
268  * follow the same layout. These error registers are used when a
269  * device (eg. SCC, LANC) is mastering the PCCChip2's local bus (for
270  * example, performing a DMA) and some error occurs. The bits are
271  * defined as follows:
272  */
273 #define PCCTWO_ERR_SR_SCLR    (1u<<0)   /* Clear Error Status */
274 #define PCCTWO_ERR_SR_LTO     (1u<<1)   /* Local Bus Timeout */
275 #define PCCTWO_ERR_SR_EXT     (1u<<2)   /* External (VMEbus) Error */
276 #define PCCTWO_ERR_SR_PRTY    (1u<<3)   /* DRAM Parity Error */
277 #define PCCTWO_ERR_SR_RTRY    (1u<<4)   /* Retry Required */
278 #define PCCTWO_ERR_SR_MASK    0x0Eu
279 
280 
281 /*
282  * General Purpose Input/Output Pin Control Register
283  * (PCC2REG_GPIO_CONTROL)
284  */
285 #define PCCTWO_GPIO_CTRL_GPO  (1u<<0)   /* Controls the GP Output Pin */
286 #define PCCTWO_GPIO_CTRL_GPOE (1u<<1)   /* General Purpose Output Enable */
287 #define PCCTWO_GPIO_CTRL_GPI  (1u<<3)   /* The current state of the GP Input */
288 
289 
290 /*
291  * Printer Input Status Register (PCC2REG_PRT_INPUT_STATUS)
292  */
293 #define PCCTWO_PRT_IN_SR_BSY  (1u<<0)   /* State of printer's BSY Input */
294 #define PCCTWO_PRT_IN_SR_PE   (1u<<1)   /* State of printer's PE Input */
295 #define PCCTWO_PRT_IN_SR_SEL  (1u<<2)   /* State of printer's SELECT Input */
296 #define PCCTWO_PRT_IN_SR_FLT  (1u<<3)   /* State of printer's FAULT Input */
297 #define PCCTWO_PRT_IN_SR_ACK  (1u<<4)   /* State of printer's ACK Input */
298 #define PCCTWO_PRT_IN_SR_PINT (1u<<7)   /* Printer Interrupt Status */
299 
300 
301 /*
302  * Printer Port Control Register (PCC2REG_PRT_CONTROL)
303  */
304 #define PCCTWO_PRT_CTRL_MAN   (1u<<0)   /* Manual Strobe Control */
305 #define PCCTWO_PRT_CTRL_FAST  (1u<<1)   /* Fast Auto Strobe */
306 #define PCCTWO_PRT_CTRL_STB   (1u<<2)   /* Strobe Pin, in manual control mode */
307 #define PCCTWO_PRT_CTRL_INP   (1u<<3)   /* Printer Input Prime */
308 #define   PCCTWO_PRT_CTRL_DOEN          (1u<<4)   /* Printer Data Output Enable */
309 
310 #endif    /* _MVME_PCCTWOREG_H */
311