summaryrefslogtreecommitdiff
path: root/sys/dev/mvme/pcctworeg.h
blob: 7841a5700fb03783f82aa3455fd6c0bc869c0931 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
/*	$NetBSD: pcctworeg.h,v 1.3 2008/04/28 20:23:54 martin Exp $	*/

/*-
 * Copyright (c) 1999, 2002 The NetBSD Foundation, Inc.
 * All rights reserved.
 *
 * This code is derived from software contributed to The NetBSD Foundation
 * by Steve C. Woodford
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

/*
 * Register definitions for the PCCchip2 device, and offset to the
 * various subordinate devices which hang off it.
 */
#ifndef	_MVME_PCCTWOREG_H
#define	_MVME_PCCTWOREG_H

/*
 * Offsets to the various devices which hang off the PCCChip2.
 * Note that these are offsets from the base of the PCCChip2's
 * own registers.
 */
#define PCCTWO_REG_OFF	    0x00000	/* Offset of PCCChip2's own registers */
#define PCCTWO_LPT_OFF	    0x00000	/* Offset of parallel port registers */
#define PCCTWO_SCC_OFF      0x03000	/* Offset of CD2401 Serial Comms chip */
#define PCCTWO_IE_OFF	    0x04000	/* Offset of 82596 LAN controller */
#define PCCTWO_NCRSC_OFF    0x05000	/* Offset of NCR53C710 SCSI chip */

/*
 * The two devices on mvme1[67]2's MCchip
 */
#define MCCHIP_ZS0_OFF      0x03000
#define MCCHIP_ZS1_OFF      0x03800

/*
 * This is needed to figure out the boot device.
 * (The physical address of the boot device's registers are passed in
 * from the Boot ROM)
 */
#define PCCTWO_PADDR(off)	((void *)(0xfff42000u + (off)))


/*
 * The layout of the PCCchip2's Registers.
 * Each one is 8-bits wide, unless otherwise indicated.
 */
#define	PCC2REG_CHIP_ID		0x00	/* Chip ID */
#define	PCC2REG_CHIP_REVISION	0x01	/* Chip Revision */
#define	PCC2REG_GENERAL_CONTROL	0x02	/* General Control */
#define	PCC2REG_VECTOR_BASE	0x03	/* Vector Base */
#define	PCC2REG_TIMER1_COMPARE	0x04	/* Tick Timer 1 Compare (32-bit) */
#define	PCC2REG_TIMER1_COUNTER	0x08	/* Tick Timer 1 Counter (32-bit) */
#define	PCC2REG_TIMER2_COMPARE	0x0c	/* Tick Timer 2 Compare (32-bit) */
#define	PCC2REG_TIMER2_COUNTER	0x10	/* Tick Timer 2 Counter (32-bit) */
#define	PCC2REG_PRESCALE_COUNT	0x14	/* Prescaler Count */
#define	PCC2REG_PRESCALE_ADJUST	0x15	/* Prescaler Clock Adjust */
#define	PCC2REG_TIMER2_CONTROL	0x16	/* Tick Timer 2 Control */
#define	PCC2REG_TIMER1_CONTROL	0x17	/* Tick Timer 1 Control */
#define	PCC2REG_GPIO_ICSR	0x18	/* GP Input Interrupt Control */
#define	PCC2REG_GPIO_CONTROL	0x19	/* GP Input/Output Control */
#define	PCC2REG_TIMER2_ICSR	0x1a	/* Tick Timer 2 Interrupt Control */
#define	PCC2REG_TIMER1_ICSR	0x1b	/* Tick Timer 1 Interrupt Control */
#define	PCC2REG_SCC_ERR_STATUS	0x1c	/* SCC Error Status */
#define	PCC2REG_SCC_MODEM_ICSR	0x1d	/* SCC Modem Interrupt Control */
#define	PCC2REG_SCC_TX_ICSR	0x1e	/* SCC Transmit Interrupt Control */
#define	PCC2REG_SCC_RX_ICSR	0x1f	/* SCC Receive Interrupt Control */
#define	PCC2REG_SCC_MODEM_PIACK	0x23	/* SCC Modem PIACK */
#define	PCC2REG_SCC_TX_PIACK	0x25	/* SCC Transmit PIACK */
#define	PCC2REG_SCC_RX_PIACK	0x27	/* SCC Receive PIACK */
#define	PCC2REG_ETH_ERR_STATUS	0x28	/* LANC Error Status */
#define	PCC2REG_ETH_ICSR	0x2a	/* LANC Interrupt Control */
#define	PCC2REG_ETH_BERR_STATUS	0x2b	/* LANC Bus Error Interrupt Ctrl */
#define	PCC2REG_SCSI_ERR_STATUS	0x2c	/* SCSI Error Status */
#define	PCC2REG_SCSI_ICSR	0x2f	/* SCSI Interrupt Control */
#define	PCC2REG_PRT_ACK_ICSR	0x30	/* Printer ACK Interrupt Control */
#define	PCC2REG_PRT_FAULT_ICSR	0x31	/* Printer FAULT Interrupt Ctrl */
#define	PCC2REG_PRT_SEL_ICSR	0x32	/* Printer SEL Interrupt Control */
#define	PCC2REG_PRT_PE_ICSR	0x33	/* Printer PE Interrupt Control */
#define	PCC2REG_PRT_BUSY_ICSR	0x34	/* Printer BUSY Interrupt Control */
#define	PCC2REG_PRT_INPUT_STATUS 0x36	/* Printer Input Status */
#define	PCC2REG_PRT_CONTROL	0x37	/* Printer Port Control */
#define	PCC2REG_CHIP_SPEED	0x38	/* Chip Speed (16-bit) */
#define	PCC2REG_PRT_DATA	0x3a	/* Printer Data (16-bit) */
#define	PCC2REG_IRQ_LEVEL	0x3e	/* Interrupt Priority Level */
#define	PCC2REG_IRQ_MASK	0x3f	/* Interrupt Mask */

/*
 * Additions to the registers for the MCChip. Some of these overlap with
 * the PCCchip2's registers, but only where hardware is not present, eg.
 * the printer registers.
 */
#define	MCCHIPREG_TIMER4_ICSR	0x18	/* Tick timer 4 interrupt control */
#define	MCCHIPREG_TIMER3_ICSR	0x19	/* Tick timer 4 interrupt control */
#define	MCCHIPREG_PARERR_ICSR	0x1c	/* Parity error interrupt control */
#define	MCCHIPREG_SCC_ICSR	0x1d	/* ZS-85230 interrupt control */
#define	MCCHIPREG_TIMER4_CTRL	0x1e	/* Tick timer 4 control */
#define	MCCHIPREG_TIMER3_CTRL	0x1f	/* Tick timer 3 control */
#define	MCCHIPREG_DRAM_BAR	0x20	/* DRAM Base Address (16-bits) */
#define	MCCHIPREG_SRAM_BAR	0x22	/* SRAM Base Address (16-bits) */
#define	MCCHIPREG_DRAM_SIZE	0x24	/* DRAM Size */
#define	MCCHIPREG_RAM_OPTIONS	0x25	/* DRAM/SRAM Options */
#define	MCCHIPREG_SRAM_SIZE	0x26	/* SRAM Size */
#define	MCCHIPREG_GP_INPUTS	0x2d	/* General Purpose Inputs */
#define	MCCHIPREG_162_VERSION	0x2e	/* MVME162-LX Series Version */
#define	MCCHIPREG_TIMER3_COMP	0x30	/* Tick Timer 3 Compare (32-bit) */
#define	MCCHIPREG_TIMER3_CNTR	0x34	/* Tick Timer 3 Counter (32-bit) */
#define	MCCHIPREG_TIMER4_COMP	0x38	/* Tick Timer 4 Compare (32-bit) */
#define	MCCHIPREG_TIMER4_CNTR	0x3c	/* Tick Timer 4 Counter (32-bit) */
#define	MCCHIPREG_BUS_CLOCK	0x40	/* Bus Clock */
#define	MCCHIPREG_EPROM_TIMING	0x41	/* EPROM Access Time Control */
#define	MCCHIPREG_FLASH_TIMING	0x42	/* FLASH Access Time Control */
#define	MCCHIPREG_ABORT_ICSR	0x43	/* ABORT Switch Interrupt Control */
#define	MCCHIPREG_RESET_CONTROL	0x44	/* Reset Switch Control */
#define	MCCHIPREG_WDOG_CONTROL	0x45	/* Watchdog Timer Control */
#define	MCCHIPREG_TIMEBASE_SEL	0x46	/* Access & Watchdog Timebase Select */
#define	MCCHIPREG_DRAM_CONTROL	0x48	/* Parity DRAM Control */
#define	MCCHIPREG_MPU_STATUS	0x4a	/* MPU Status */
#define	MCCHIPREG_PRESCALER	0x4c	/* Prescaler Count Register (32-bits) */

/*
 * PCCchip2's register size is 0x40. MCchip's is 0x50. Plump for the latter.
 */
#define PCC2REG_SIZE		0x50

/*
 * Convenience macroes for accessing the PCCChip2's registers
 * through bus_space.
 */
#define	pcc2_reg_read(sc,r)	\
		bus_space_read_1((sc)->sc_bust, (sc)->sc_bush, (r))
#define	pcc2_reg_read16(sc,r)	\
		bus_space_read_2((sc)->sc_bust, (sc)->sc_bush, (r))
#define	pcc2_reg_read32(sc,r)	\
		bus_space_read_4((sc)->sc_bust, (sc)->sc_bush, (r))
#define	pcc2_reg_write(sc,r,v)	\
		bus_space_write_1((sc)->sc_bust, (sc)->sc_bush, (r), (v))
#define	pcc2_reg_write16(sc,r,v)	\
		bus_space_write_2((sc)->sc_bust, (sc)->sc_bush, (r), (v))
#define	pcc2_reg_write32(sc,r,v)	\
		bus_space_write_4((sc)->sc_bust, (sc)->sc_bush, (r), (v))

/*
 * We use the interrupt vector bases suggested in the Motorola Docs...
 * The first is written to the PCCChip2 for interrupt sources under
 * its control. The second is written to the CD2401's Local Interrupt
 * Vector Register. Thus, we don't use the Auto-Vector facilities
 * for the CD2401, as recommended in the PCCChip2 Programmer's Guide.
 * The third is used as a base for the ZS85230 serial chips on mvme162.
 */
#define PCCTWO_VECBASE		0x50
#define PCCTWO_SCC_VECBASE	0x5c
#define MCCHIP_ZS_VECBASE	0x5c

/*
 * PCCchip2 Vector Encoding (Offsets from PCCTWO_VECBASE)
 * The order 0x0 -> 0xf also indicates priority, with 0x0 lowest.
 */
#define PCCTWOV_PRT_BUSY	0x0	/* Printer Port 'BSY' */
#define PCCTWOV_PRT_PE		0x1	/* Printer Port 'PE' (Paper Empty) */
#define PCCTWOV_PRT_SELECT	0x2	/* Printer Port 'SELECT' */
#define PCCTWOV_PRT_FAULT	0x3	/* Printer Port 'FAULT' */
#define PCCTWOV_PRT_ACK		0x4	/* Printer Port 'ACK' */
#define PCCTWOV_SCSI		0x5	/* SCSI Interrupt */
#define PCCTWOV_LANC_ERR	0x6	/* LAN Controller Error */
#define PCCTWOV_LANC_IRQ	0x7	/* LAN Controller Interrupt */
#define PCCTWOV_TIMER2		0x8	/* Tick Timer 2 Interrupt */
#define PCCTWOV_TIMER1		0x9	/* Tick Timer 1 Interrupt */
#define PCCTWOV_GPIO		0xa	/* General Purpose Input Interrupt */
#define PCCTWOV_SCC_RX_EXCEP	0xc	/* SCC Receive Exception */
#define PCCTWOV_SCC_MODEM	0xd	/* SCC Modem (Non-Auto-vector mode) */
#define PCCTWOV_SCC_TX		0xe	/* SCC Tx (Non-Auto-vector mode) */
#define PCCTWOV_SCC_RX		0xf	/* SCC Rx (Non-Auto-vector mode) */
#define PCCTWOV_MAX		16

/*
 * MCchip-specific Vector Encoding (Offsets from PCCTWO_VECBASE)
 */
#define MCCHIPV_TIMER4		0x3	/* Tick Timer 4 Interrupt */
#define MCCHIPV_TIMER3		0x4	/* Tick Timer 3 Interrupt */
#define MCCHIPV_PARITY_ERR	0xb	/* Parity DRAM Error Exception */
#define MCCHIPV_ZS0		0xc	/* First ZS85230 Interrupt Vector */
#define MCCHIPV_ZS1		0xc	/* Second ZS85230 Interrupt Vector */
#define MCCHIPV_ABORT		0xe	/* Abort Switch */

/*
 * How to identify the PCCchip2 from an MCchip
 */
#define PCCTWO_CHIP_ID_PCC2	0x20
#define PCCTWO_CHIP_ID_MCCHIP	0x84


/*
 * Bit Values for the General Control Register (PCC2REG_GENERAL_CONTROL)
 */
#define	PCCTWO_GEN_CTRL_FAST	(1u<<0)	/* BBRAM Speed Control */
#define	PCCTWO_GEN_CTRL_MIEN	(1u<<1)	/* Master Interrupt Enable */
#define PCCTWO_GEN_CTRL_C040	(1u<<2)	/* Set when CPU is mc68k family */
#define PCCTWO_GEN_CTRL_DR0	(1u<<3)	/* Download ROM at 0 (mvme166 only) */


/*
 * Calculate the Prescaler Adjust value for a given
 * value of BCLK in MHz. (PCC2REG_PRESCALE_ADJUST)
 */
#define PCCTWO_PRES_ADJ(mhz)	(256 - (mhz))


/*
 * Calculate the Tick Timer Compare register value for
 * a given number of micro-seconds. With the PCCChip2,
 * this is simple since the Tick Counters already have
 * a 1uS period. (PCC2REG_TIMER[12]_COMPARE)
 */
#define PCCTWO_TIMERFREQ	1000000
#define PCCTWO_US2LIM(us)	(us)
#define PCCTWO_LIM2US(lim)	(lim)

/*
 * The Tick Timer Control Registers (PCC2REG_TIMER[12]_CONTROL)
 */
#define PCCTWO_TT_CTRL_CEN	(1u<<0)	/* Counter Enable */
#define PCCTWO_TT_CTRL_COC	(1u<<1)	/* Clear On Compare */
#define PCCTWO_TT_CTRL_COVF	(1u<<2)	/* Clear Overflow Counter */
#define PCCTWO_TT_CTRL_OVF(r)	((r)>>4)/* Value of the Overflow Counter */


/*
 * All the Interrupt Control Registers (PCC2REG_*_ICSR) on the PCCChip2
 * mostly share the same basic layout. These are defined as follows:
 */
#define PCCTWO_ICR_LEVEL_MASK	0x7	/* Mask for the interrupt level */
#define PCCTWO_ICR_ICLR		(1u<<3)	/* Clear Int. (edge-sensitive mode) */
#define PCCTWO_ICR_AVEC		(1u<<3)	/* Enable Auto-Vector Mode */
#define PCCTWO_ICR_IEN		(1u<<4)	/* Interrupt Enable */
#define PCCTWO_ICR_INT		(1u<<5)	/* Interrupt Active */
#define PCCTWO_ICR_LEVEL	(0u<<6)	/* Level Triggered */
#define PCCTWO_ICR_EDGE		(1u<<6)	/* Edge Triggered */
#define PCCTWO_ICR_RISE_HIGH	(0u<<7)	/* Polarity: Rising Edge or Hi Level */
#define PCCTWO_ICR_FALL_LOW	(1u<<7)	/* Polarity: Falling Edge or Lo Level */
#define PCCTWO_ICR_SC_RD(r)	((r)>>6)/* Get Snoop Control Bits */
#define PCCTWO_ICR_SC_WR(r)	((r)<<6)/* Write Snoop Control Bits */



/*
 * Most of the Error Status Registers (PCC2REG_*_ERR_STATUS) mostly
 * follow the same layout. These error registers are used when a
 * device (eg. SCC, LANC) is mastering the PCCChip2's local bus (for
 * example, performing a DMA) and some error occurs. The bits are
 * defined as follows:
 */
#define PCCTWO_ERR_SR_SCLR	(1u<<0)	/* Clear Error Status */
#define PCCTWO_ERR_SR_LTO	(1u<<1)	/* Local Bus Timeout */
#define PCCTWO_ERR_SR_EXT	(1u<<2)	/* External (VMEbus) Error */
#define PCCTWO_ERR_SR_PRTY	(1u<<3)	/* DRAM Parity Error */
#define PCCTWO_ERR_SR_RTRY	(1u<<4)	/* Retry Required */
#define PCCTWO_ERR_SR_MASK	0x0Eu


/*
 * General Purpose Input/Output Pin Control Register
 * (PCC2REG_GPIO_CONTROL)
 */
#define PCCTWO_GPIO_CTRL_GPO	(1u<<0)	/* Controls the GP Output Pin */
#define PCCTWO_GPIO_CTRL_GPOE	(1u<<1)	/* General Purpose Output Enable */
#define PCCTWO_GPIO_CTRL_GPI	(1u<<3)	/* The current state of the GP Input */


/*
 * Printer Input Status Register (PCC2REG_PRT_INPUT_STATUS)
 */
#define PCCTWO_PRT_IN_SR_BSY	(1u<<0)	/* State of printer's BSY Input */
#define PCCTWO_PRT_IN_SR_PE	(1u<<1)	/* State of printer's PE Input */
#define PCCTWO_PRT_IN_SR_SEL	(1u<<2)	/* State of printer's SELECT Input */
#define PCCTWO_PRT_IN_SR_FLT	(1u<<3)	/* State of printer's FAULT Input */
#define PCCTWO_PRT_IN_SR_ACK	(1u<<4)	/* State of printer's ACK Input */
#define PCCTWO_PRT_IN_SR_PINT	(1u<<7)	/* Printer Interrupt Status */


/*
 * Printer Port Control Register (PCC2REG_PRT_CONTROL)
 */
#define PCCTWO_PRT_CTRL_MAN	(1u<<0)	/* Manual Strobe Control */
#define PCCTWO_PRT_CTRL_FAST	(1u<<1)	/* Fast Auto Strobe */
#define PCCTWO_PRT_CTRL_STB	(1u<<2)	/* Strobe Pin, in manual control mode */
#define PCCTWO_PRT_CTRL_INP	(1u<<3)	/* Printer Input Prime */
#define	PCCTWO_PRT_CTRL_DOEN	(1u<<4)	/* Printer Data Output Enable */

#endif	/* _MVME_PCCTWOREG_H */