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
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
|
// #pragma comment(exestr, "@(#) r94adma.h 1.1 95/09/28 15:48:23 nec")
/*++ BUILD Version: 0001 // Increment this if a change has global effects
Copyright (c) 1994 NEC Corporation
Module Name:
r94adma.h
Abstract:
This module is the header file that describes the DMA control register
structure for the R94A system.
Author:
David N. Cutler (davec) 13-Nov-1990
Revision History:
M001 1994.8.24 A. Kuriyama
- Modify for R94A MIPS R4400 (original duodma.h)
H000 Sat Sep 24 21:36:20 JST 1994 kbnes!kishimoto
- Add PCIInterruptStatus register structure definition
M002 Mon Oct 03 19:52:16 JST 1994 kbnes!kuriyama(A)
- Add PCI(HURRICANE) register
- Change InvalidAddress register to DMA_LARGE_REGISTER
- Change RTC_REGISTER structure define.
- add Optional... registers
H001 Fri Dec 9 18:29:10 1994 kbnes!kishimoto
- Modify LEDControl definition (SHORT -> CHAR)
H002 Tue Jan 24 18:24:48 1995 kbnes!kishimoto
- Add PCI interrupt enable bits definitions.
H003 Tue Apr 25 16:38:06 1995 kbnes!kishimoto
- Add MRC registers
H004 Sat Aug 12 16:18:53 1995 kbnes!kishimoto
- rearrange comments.
--*/
#ifndef _R94ADMA_
#define _R94ADMA_
//
// M001
// Define DMA register structures.
//
typedef struct _DMA_REGISTER {
ULONG Long;
ULONG Fill;
} DMA_REGISTER, *PDMA_REGISTER;
typedef struct _DMA_CHAR_REGISTER {
UCHAR Char;
UCHAR Fill;
USHORT Fill2;
} DMA_CHAR_REGISTER, *PDMA_CHAR_REGISTER;
typedef struct _DMA_SHORT_REGISTER {
USHORT Short;
USHORT Fill;
} DMA_SHORT_REGISTER, *PDMA_SHORT_REGISTER;
typedef struct _DMA_LARGE_REGISTER {
union {
LARGE_INTEGER LargeInteger;
double Double;
} u;
} DMA_LARGE_REGISTER, *PDMA_LARGE_REGISTER;
//
// Define DMA channel register structure.
//
typedef struct _DMA_CHANNEL {
DMA_REGISTER Mode;
DMA_REGISTER Enable;
DMA_REGISTER ByteCount;
DMA_REGISTER Address;
} DMA_CHANNEL, *PDMA_CHANNEL;
//
// M002
// Define PCI Address/Mask register structure
//
typedef struct _PCI_ADDRESS_MASK {
ULONG Address;
ULONG Mask;
} PCI_ADDRESS_MASK, *PPCI_ADDRESS_MASK;
//
// Define DMA control register structure.
//
typedef volatile struct _DMA_REGISTERS {
DMA_REGISTER Configuration; // offset 000
DMA_REGISTER RevisionLevel; // offset 008
DMA_REGISTER RemoteFailedAddress; // offset 010
DMA_REGISTER MemoryFailedAddress; // offset 018
DMA_LARGE_REGISTER InvalidAddress; // offset 020 // M002
DMA_REGISTER TranslationBase; // offset 028
DMA_REGISTER TranslationLimit; // offset 030
DMA_REGISTER TranslationInvalidate; // offset 038
DMA_REGISTER ChannelInterruptAcknowledge; // offset 040
DMA_REGISTER LocalInterruptAcknowledge; // offset 048
DMA_REGISTER EisaInterruptAcknowledge; // offset 050
DMA_REGISTER TimerInterruptAcknowledge; // offset 058
DMA_REGISTER IpInterruptAcknowledge; // offset 060
DMA_REGISTER Reserved1; // offset 068
DMA_REGISTER WhoAmI; // offset 070
DMA_REGISTER NmiSource; // offset 078
DMA_REGISTER RemoteSpeed[15]; // offset 080
DMA_REGISTER InterruptEnable; // offset 0f8
DMA_CHANNEL Channel[4]; // offset 100
DMA_REGISTER ArbitrationControl; // offset 180
DMA_REGISTER Errortype; // offset 188
DMA_REGISTER RefreshRate; // offset 190
DMA_REGISTER RefreshCounter; // offset 198
DMA_REGISTER SystemSecurity; // offset 1a0
DMA_REGISTER InterruptInterval; // offset 1a8
DMA_REGISTER IntervalTimer; // offset 1b0
DMA_REGISTER IpInterruptRequest; // offset 1b8
DMA_REGISTER InterruptDiagnostic; // offset 1c0
DMA_LARGE_REGISTER EccDiagnostic; // offset 1c8
DMA_REGISTER MemoryConfig[4]; // offset 1d0
DMA_REGISTER Reserved2;
DMA_REGISTER Reserved3;
DMA_LARGE_REGISTER IoCacheBuffer[64]; // offset 200
DMA_REGISTER IoCachePhysicalTag[8]; // offset 400
DMA_REGISTER IoCacheLogicalTag[8]; // offset 440
DMA_REGISTER IoCacheLowByteMask[8]; // offset 480
DMA_REGISTER IoCacheHighByteMask[8]; // offset ??? wrong?
//
// M001,M002,H001
// new registers of STORM-chipset
//
DMA_REGISTER ProcessorBootModeControl; // offset 500
DMA_REGISTER ClockCounter; // offset 508
DMA_REGISTER MemoryTimingControl; // offset 510
DMA_REGISTER PCIConfigurationAddress; // offset 518
DMA_REGISTER PCIConfigurationData; // offset 520
DMA_REGISTER PCISpecialCycle; // offset 528
DMA_REGISTER PCIInterruptEnable; // offset 530
DMA_REGISTER PCIInterruptStatus; // offset 538
DMA_REGISTER CopyTagConfiguration; // offset 540
DMA_REGISTER CopyTagAddress; // offset 548
DMA_REGISTER CopyTagData; // offset 550
DMA_REGISTER ASIC2Revision; // offset 558
DMA_REGISTER ASIC3Revision; // offset 560
DMA_REGISTER Reserved4; // offset 568
ULONG OptionalRemoteSpeed1; // offset 570
ULONG OptionalRemoteSpeed2; // offset 574
ULONG OptionalRemoteSpeed3; // offset 578
ULONG OptionalRemoteSpeed4; // offset 57c
DMA_REGISTER LocalInterruptAcknowledge2; // offset 580
DMA_REGISTER OptionalIoConfiguration1; // offset 588
DMA_REGISTER OptionalIoConfiguration2; // offset 590
DMA_REGISTER OptionalIoConfiguration3; // offset 598
DMA_REGISTER OptionalIoConfiguration4; // offset 5a0
DMA_SHORT_REGISTER BuzzerCount; // offset 5a8
DMA_CHAR_REGISTER BuzzerControl; // offset 5ac
DMA_SHORT_REGISTER LEDCount; // offset 5b0
DMA_CHAR_REGISTER LEDControl; // offset 5b4
DMA_SHORT_REGISTER NECIoPort; // offset 5b8
ULONG TyphoonErrorStatus; // offset 5bc
DMA_REGISTER AddressConversionRegion; // offset 5c0
DMA_REGISTER AddressConversionMask; // offset 5c8
DMA_REGISTER Reserved12; // offset 5d0
DMA_REGISTER Reserved13; // offset 5d8
DMA_REGISTER Reserved14; // offset 5e0
DMA_REGISTER Reserved15; // offset 5e8
DMA_REGISTER Reserved16; // offset 5f0
DMA_REGISTER Reserved17; // offset 5f8
USHORT PCIVenderID; // offset 600
USHORT PCIDeviceID; // offset 602
USHORT PCICommand; // offset 604
USHORT PCIStatus; // offset 606
UCHAR PCIRevisionID; // offset 608
UCHAR PCIProgIf; // offset 609
UCHAR PCISubClass; // offset 60a
UCHAR PCIBaseClass; // offset 60b
UCHAR PCICacheLineSize; // offset 60c
UCHAR PCILatencyTimer; // offset 60d
UCHAR PCIHeaderType; // offset 60e
UCHAR PCIBIST; // offset 60f
DMA_REGISTER Reserved18; // offset 610
DMA_REGISTER Reserved19; // offset 618
DMA_REGISTER Reserved20; // offset 620
DMA_REGISTER Reserved21; // offset 628
ULONG PCIROMBaseAddress; // offset 630
ULONG Reserved22[2]; // offset 634
UCHAR PCIInterruptLine; // offset 63c
UCHAR PCIInterruptPin; // offset 63d
UCHAR PCIMinimumGrant; // offset 63e
UCHAR PCIMaximumLatency; // offset 63f
PCI_ADDRESS_MASK PCIFastBackToBack[2]; // offset 640
PCI_ADDRESS_MASK PCIBurst[2]; // offset 650
PCI_ADDRESS_MASK PCIMemory; // offset 660
ULONG PCIMasterRetryTimer; // offset 668
} DMA_REGISTERS, *PDMA_REGISTERS;
//
// Configuration Register values.
//
#define LOAD_CLEAN_EXCLUSIVE 0x20
#define DISABLE_EISA_MEMORY 0x10
#define ENABLE_PROCESSOR_B 0x08
#define MAP_PROM 0x04
//
// Interrupt Enable bits.
//
#define ENABLE_CHANNEL_INTERRUPTS (1 << 0)
#define ENABLE_DEVICE_INTERRUPTS (1 << 1)
#define ENABLE_EISA_INTERRUPTS (1 << 2)
#define ENABLE_TIMER_INTERRUPTS (1 << 3)
#define ENABLE_IP_INTERRUPTS (1 << 4)
//
// Eisa Interupt Acknowledge Register values.
//
#define EISA_NMI_VECTOR 0x8000
//
// DMA_NMI_SRC register bit definitions.
//
#define NMI_SRC_MEMORY_ERROR 1
#define NMI_SRC_R4000_ADDRESS_ERROR 2
#define NMI_SRC_IO_CACHE_ERROR 4
#define NMI_SRC_ADR_NMI 8
//
// Define DMA channel mode register structure.
//
typedef struct _DMA_CHANNEL_MODE {
ULONG AccessTime : 3;
ULONG TransferWidth : 2;
ULONG InterruptEnable : 1;
ULONG BurstMode : 1;
ULONG Reserved1 : 25;
} DMA_CHANNEL_MODE, *PDMA_CHANNEL_MODE;
//
// Define access time values.
//
#define ACCESS_40NS 0x0 // 40ns access time
#define ACCESS_80NS 0x1 // 80ns access time
#define ACCESS_120NS 0x2 // 120ns access time
#define ACCESS_160NS 0x3 // 160ns access time
#define ACCESS_200NS 0x4 // 200ns access time
#define ACCESS_240NS 0x5 // 240ns access time
#define ACCESS_280NS 0x6 // 280ns access time
#define ACCESS_320NS 0x7 // 320ns access time
//
// Define transfer width values.
//
#define WIDTH_8BITS 0x1 // 8-bit transfer width
#define WIDTH_16BITS 0x2 // 16-bit transfer width
#define WIDTH_32BITS 0x3 // 32-bit transfer width
//
// M001
// Define DMA channel enable register structure.
//
typedef struct _DMA_CHANNEL_ENABLE {
ULONG ChannelEnable : 1;
ULONG TransferDirection : 1;
ULONG Reserved1 : 6;
ULONG TerminalCount : 1;
ULONG MemoryError : 1;
// ULONG TranslationError : 1;
// ULONG Reserved2 : 21;
ULONG ParityError : 1;
ULONG MasterAbort : 1;
ULONG Reserved2 : 20;
} DMA_CHANNEL_ENABLE, *PDMA_CHANNEL_ENABLE;
//
// M001,M002
// define RTC structure.
//
typedef struct _RTC_REGISTERS {
UCHAR Data;
UCHAR Index;
} RTC_REGISTERS, *PRTC_REGISTERS;
//
// Define transfer direction values.
//
#define DMA_READ_OP 0x0 // read from device
#define DMA_WRITE_OP 0x1 // write to device
//
// Define translation table entry structure.
//
typedef volatile struct _TRANSLATION_ENTRY {
ULONG PageFrame;
ULONG Fill;
} TRANSLATION_ENTRY, *PTRANSLATION_ENTRY;
//
// Error Type Register values
//
#define SONIC_ADDRESS_ERROR 4
#define SONIC_MEMORY_ERROR 0x40
#define EISA_ADDRESS_ERROR 1
#define EISA_MEMORY_ERROR 2
//
// Address Mask definitions.
//
#define LFAR_ADDRESS_MASK 0xfffff000
#define RFAR_ADDRESS_MASK 0x00ffffc0
#define MFAR_ADDRESS_MASK 0x1ffffff0
//
// ECC Register Definitions.
//
#define ECC_SINGLE_BIT_DP0 0x02000000
#define ECC_SINGLE_BIT_DP1 0x20000000
#define ECC_SINGLE_BIT ( ECC_SINGLE_BIT_DP0 | ECC_SINGLE_BIT_DP1 )
#define ECC_DOUBLE_BIT_DP0 0x04000000
#define ECC_DOUBLE_BIT_DP1 0x40000000
#define ECC_DOUBLE_BIT ( ECC_DOUBLE_BIT_DP0 | ECC_DOUBLE_BIT_DP1 )
#define ECC_MULTIPLE_BIT_DP0 0x08000000
#define ECC_MULTIPLE_BIT_DP1 0x80000000
#define ECC_FORCE_DP0 0x010000
#define ECC_FORCE_DP1 0x100000
#define ECC_DISABLE_SINGLE_DP0 0x020000
#define ECC_DISABLE_SINGLE_DP1 0x200000
#define ECC_ENABLE_DP0 0x040000
#define ECC_ENABLE_DP1 0x400000
//
// LED/DIAG Register Definitions.
//
#define DIAG_NMI_SWITCH 2
//
// Common error bit definitions
//
#define SINGLE_ERROR 1
#define MULTIPLE_ERROR 2
#define RFAR_CACHE_FLUSH 4
//
// M001
// Define NMI Status/Control register structure.
//
typedef struct _BUZZER_CONTROL {
UCHAR SpeakerGate : 1;
UCHAR SpeakerData : 1;
UCHAR Reserved1 : 3;
UCHAR SpeakerTimer : 1;
UCHAR Reserved2 : 2;
}BUZZER_CONTROL, *PBUZZER_CONTROL;
//
// H000
// Define PCI Interrupt Status register structure.
//
typedef struct _STORM_PCI_INTRRUPT_STATUS{
ULONG IntD: 1;
ULONG IntC: 1;
ULONG IntB: 1;
ULONG IntA: 1;
ULONG Perr: 1;
ULONG Serr: 1;
ULONG RetryOverflow: 1;
ULONG MasterAbort: 1;
ULONG TargetAbort: 1;
ULONG Reserved: 23;
} STORM_PCI_INTRRUPT_STATUS, *PSTORM_PCI_INTRRUPT_STATUS;
//
// H002
// PCI Interrupt Enable bits.
//
#define ENABLE_TARGET_ABORT_INTERRUPTS (1 << 8)
#define ENABLE_MASTER_ABORT_INTERRUPTS (1 << 7)
#define ENABLE_RETRY_OVERFLOW_EISA_INTERRUPTS (1 << 6)
#define ENABLE_SERR_INTERRUPTS (1 << 5)
#define ENABLE_PERR_INTERRUPTS (1 << 4)
//
// H003
// Define MRC control register structure.
//
typedef volatile struct _MRC_REGISTERS {
UCHAR Reserved1[256]; // offset 000
UCHAR Interrupt; // offset 100
UCHAR Reserved2[7]; // offset 107
UCHAR Mode; // offset 108
UCHAR Reserved3[39]; // offset 109
UCHAR SoftwarePowerOff; // offset 130
UCHAR Reserved4[15]; // offset 131
UCHAR LEDBitControl; // offset 140
UCHAR Reserved5[3]; // offset 141
UCHAR SegmentLEDControl[4]; // offset 144
UCHAR Reserved6[155]; // offset 145
UCHAR TempEnable; // offset 1e0
UCHAR Reserved7[31]; // offset 145
UCHAR TempSensor; // offset 200
UCHAR Reserved8[3583]; // offset 201
} MRC_REGISTERS, *PMRC_REGISTERS;
#endif // _R94ADMA_
|