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
|
/* $OpenBSD: mbusreg.h,v 1.1 2008/08/18 23:19:25 miod Exp $ */
/*
* Copyright (c) 2008 Miodrag Vallat.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/*
* M-bus
*
* The M-bus connects up to 8 slots, of 32MB memory space each.
*
* All these modules contain a ``Firefox Bus Interface Chip'' (FBIC),
* which provides common registers at the end of each slot address space,
* allowing modules to recognize and configure each other.
*/
#define MBUS_SLOT_MAX 8
/*
* Addressing
*
* The M-bus provides a 32-bit address space.
*
* The low half (bit 31 clear) is the physical memory space (and being on
* vax, really stops at 512MB).
* The high half is the I/O space, where each slot has a 32MB window.
* In addition to its window, there are two 128MB areas, allowing a given
* module to provide functionnality regardless of its actual position on
* the bus.
*
* From the host CPU, the M-bus I/O space is remapped in the vax I/O space.
*
* The address map is thus:
* M-bus address CPU address Length
* 0000.0000 0000.0000 2000.0000 memory space
* 8000.0000 2000.0000 0800.0000 global I/O
* 8800.0000 2800.0000 0800.0000 local I/O
* 9000.0000 3000.0000 0200.0000 slot 0 I/O
* 9200.0000 3200.0000 0200.0000 slot 1 I/O
* 9400.0000 3400.0000 0200.0000 slot 2 I/O
* 9600.0000 3600.0000 0200.0000 slot 3 I/O
* 9800.0000 3800.0000 0200.0000 slot 4 I/O
* 9a00.0000 3a00.0000 0200.0000 slot 5 I/O
* 9c00.0000 3c00.0000 0200.0000 slot 6 I/O
* 9e00.0000 3e00.0000 0200.0000 slot 7 I/O
*/
/* base address of a slot, as seen from the cpu */
#define MBUS_SLOT_BASE(s) (0x30000000 + ((s) << 25))
/* convert I/O space addresses (assumed to be in their correct range) */
#define HOST_TO_MBUS(pa) ((pa) ^ 0xa0000000)
#define MBUS_TO_HOST(pa) ((pa) ^ 0xa0000000)
/*
* Common FBIC slot registers
*/
/* FBIC or compatible registers occupy the last page (running down)... */
#define FBIC_BASE 0x1fffe00
/* ...but dual-CPU modules have two of them. */
#define FBIC_CPUA_BASE 0x0fffe00
#define FBIC_CPUB_BASE 0x1fffe00
/* module identification */
#define FBIC_MODTYPE 0x1fc
/* M-bus error status */
#define FBIC_BUSCSR 0x1f8
/* M-bus error control signal log */
#define FBIC_BUSCTL 0x1f4
/* M-bus error address signal log */
#define FBIC_BUSADR 0x1f0
/* M-bus error data signal log */
#define FBIC_BUSDAT 0x1ec
/* FBIC control and status */
#define FBIC_CSR 0x1e8
/* I/O space range decode */
#define FBIC_RANGE 0x1e4
/* Interprocessor and device interrupt */
#define FBIC_IPDVINT 0x1e0
/* Unique software ID */
#define FBIC_WHAMI 0x1dc
/* Unique hardware ID */
#define FBIC_CPUID 0x1d8
/* Interlock 1 address */
#define FBIC_IADR1 0x1d4
/* Interlock 2 address */
#define FBIC_IADR2 0x1d0
/* Console scratch register */
#define FBIC_SAVGPR 0x1c4
/*
* Module identification
*/
#define MODTYPE_CLASS_MASK 0x000000ff
#define MODTYPE_CLASS_SHIFT 0
#define CLASS_BA 0x01
#define CLASS_GRAPHICS 0x02
#define CLASS_IO 0x04
#define CLASS_CPU 0x08
#define CLASS_MEMORY 0x10
#define MODTYPE_SUBCLASS_MASK 0x0000ff00
#define MODTYPE_SUBCLASS_SHIFT 8
#define MODTYPE_INTERFACE_MASK 0x00ff0000
#define MODTYPE_INTERFACE_SHIFT 16
#define INTERFACE_FBIC 0x01
#define INTERFACE_FMDC 0x02 /* ECC memory */
#define INTERFACE_FMCM 0xfe /* 8MB board */
#define MODTYPE_REVISION_MASK 0xff000000
#define MODTYPE_REVISION_SHIFT 24
/*
* M-bus error status and error logging
* Conditions are active low
*/
#define BUSCSR_FRZN 0x80000000 /* logging frozen */
#define BUSCSR_ARB 0x40000000 /* arbitration error */
#define BUSCSR_ICMD 0x20000000 /* invalid MCMD encoding */
#define BUSCSR_IDAT 0x10000000 /* invalid data supplied */
#define BUSCSR_MTPE 0x08000000 /* tag parity error */
#define BUSCSR_MDPE 0x04000000 /* MDAL parity error */
#define BUSCSR_MSPE 0x02000000 /* MSTATUS parity error */
#define BUSCSR_MCPE 0x01000000 /* MCMD parity error */
#define BUSCSR_ILCK 0x00800000 /* interlock violation */
#define BUSCSR_MTO 0x00400000 /* slave timeout */
#define BUSCSR_NOS 0x00200000 /* no slave response */
#define BUSCSR_CTO 0x00100000 /* CDAL data cycle timeout */
#define BUSCSR_CDPE 0x00080000 /* CDAL parity error */
#define BUSCSR_CTPE 0x00040000 /* CDAL tag parity error */
#define BUSCSR_SERR 0x00020000 /* error on MSTATUS */
#define BUSCSR_DBLE 0x00010000 /* double M-bus error */
#define BUSCSR_RESET 0xffff0000 /* reset all conditions */
/*
* FBIC control and status
*/
#define FBICSR_MFMD_MASK 0xc0000000 /* manufacturing mode */
#define FBICSR_CMISS 0x08000000 /* CVAX cache miss */
#define FBICSR_EXCAEN 0x04000000 /* external cache enable */
#define FBICSR_HALTCPU 0x02000000 /* CVAX halt */
#define FBICSR_RESET 0x01000000 /* CVAX reset */
#define FBICSR_IRQEN_MASK 0x00f00000 /* interrupt enables */
#define FBICSR_IRQEN_SHIFT 20
#define FBIC_DEVIRQ0 0
#define FBIC_DEVIRQ1 1
#define FBIC_DEVIRQ2 2
#define FBIC_DEVIRQ3 3
#define FBIC_DEVIRQMAX 4
#define FBICSR_IRQC2M_MASK 0x000f0000 /* interrupt direction */
#define FBICSR_IRQC2M_SHIFT 16
#define FBICSR_LEDS_MASK 0x00003f00 /* module leds, active low */
#define FBICSR_LEDS_SHIFT 8
#define FBICSR_HALTEN 0x00000080 /* halt enable */
#define FBICSR_TSTFNC_MASK 0x0000007e /* test function */
#define FBICSR_TSTFNC_SHIFT 1
#define TSTFNC_NORMAL_MODE 0x1f /* normal operation */
#define FBICSR_CDPE 0x00000001 /* CVAX parity enable */
/*
* I/O Range
*
* This programs an M-bus address range which in the global I/O space, which
* is answered by this module. Note that the upper bit in the match field
* must be set, for the address to be in the I/O space; this is why the
* upper bit of the mask field acts as an enable.
*/
#define RANGE_MATCH 0xffff0000 /* address bits 31:16 */
#define RANGE_ENABLE 0x00008000 /* mask address bit 31 */
#define RANGE_MASK 0x00007fff /* address bits 30:16 */
/*
* Interprocessor and device interrupts
*/
#define IPDVINT_IPL17 0x08000000 /* trigger IRQ3 */
#define IPDVINT_IPL16 0x04000000 /* trigger IRQ2 */
#define IPDVINT_IPL15 0x02000000 /* trigger IRQ1 */
#define IPDVINT_IPL14 0x01000000 /* trigger IRQ0 */
#define IPDVINT_IPUNIT 0x00020000 /* interrupts CPU */
#define IPDVINT_DEVICE 0x00010000 /* interrupts M-bus */
#define IPDVINT_VECTOR_MASK 0x0000fff0 /* interrupt vector */
#define IPDVINT_VECTOR_SHIFT 4
#define IPDVINT_IPL_MASK 0x0000000c /* interrupt ipl */
#define IPDVINT_IPL_SHIFT 2
/*
* CPUID (also EPR 14)
*/
#define CPUID_MID_MASK 0x0000001c /* slot mid */
#define CPUID_MID_SHIFT 2
#define CPUID_PROC_MASK 0x00000003 /* slot processor id */
#define CPUID_PROC_SHIFT 0
#define CPUID_PROC_0 0x00
#define CPUID_PROC_1 0x03
/*
* FMCM registers (not FBIC compatible except for MODTYPE and BUSCSR)
*/
/* module identification */
#define FMCM_MODTYPE 0x1fc
/* M-bus error status */
/* NOTE: only implements FRZN, ICMD, MDPE, MSPE and MCPE */
#define FMCM_BUSCSR 0x1f8
/* FMCM control and status register */
#define FMCM_FMDCSR 0x1f4
/* Memory space base address register */
#define FMCM_BASEADDR 0x1f0
#define FMDCSR_ISOLATE 0x00008000 /* no MABORT on error */
#define FMDCSR_DIAGNOSTIC_REFRESH_START 0x00004000
#define FMDCSR_REFRESH_PERIOD_SELECT 0x00002000 /* set: slow (80ns) */
#define FMDCSR_DISABLE_REFRESH 0x00001000
#define BASEADDR_STARTADDR_MASK 0x7ff00000
#define BASEADDR_MEMORY_SPACE_ENABLE 0x80000000
/*
* Interrupt vector assignments
*
* Since each FBIC controls four interrupts, and passes the IPI in bits
* 3:2 of the vector number, we have to reserve them on 0x10 boundaries.
*
* Note that this is different from the usual scheme of using bits 5:4
* for this purpose.
*
* CPU boards also use the IPDVINT to have an extra 0x10 range for IPIs.
*
* To make things simpler, we use a static assignment where the number is
* computed from the mid and fbic number (for cpu boards).
*
* This means the 0x100..0x1fc range is used for M-bus interrupts only.
* Q-bus interrupts will use the usual 0x200..0x3fc range.
*/
#define MBUS_VECTOR_BASE(mid,fbic) (0x100 + (mid) * 0x20 + (fbic) * 0x10)
#define MBUS_VECTOR_TO_MID(vec) (((vec) - 0x100) >> 5)
#define MBUS_VECTOR_TO_FBIC(vec) (((vec) & 0x10) >> 4)
#define MBUS_VECTOR_TO_IRQ(vec) (((vec) & 0xc) >> 2)
|