1 //
2 // Copyright (c) 2010-2022 Antmicro
3 //
4 // This file is licensed under the MIT License.
5 // Full license text is available in 'licenses/MIT.txt'.
6 //
7 
8 using System;
9 using System.Collections.Generic;
10 using Antmicro.Renode.Core;
11 using Antmicro.Renode.Core.Structure.Registers;
12 using Antmicro.Renode.Logging;
13 
14 namespace Antmicro.Renode.Peripherals.Miscellaneous
15 {
16     public class OpenTitan_AlertHandler: BasicDoubleWordPeripheral, IKnownSize, IGPIOReceiver
17     {
OpenTitan_AlertHandler(IMachine machine)18         public OpenTitan_AlertHandler(IMachine machine) : base(machine)
19         {
20             alertCause = new IFlagRegisterField[AlertsCount];
21             alertEnabled = new IFlagRegisterField[AlertsCount];
22             alertClasses = new IEnumRegisterField<AlertClass>[AlertsCount];
23 
24             localAlertCause = new IFlagRegisterField[LocalAlertsCount];
25             localAlertEnabled = new IFlagRegisterField[LocalAlertsCount];
26             localAlertClasses = new IEnumRegisterField<AlertClass>[LocalAlertsCount];
27 
28             ClassAInterrupt = new GPIO();
29             ClassBInterrupt = new GPIO();
30             ClassCInterrupt = new GPIO();
31             ClassDInterrupt = new GPIO();
32 
33             DefineRegisters();
34         }
35 
OnGPIO(int number, bool value)36         public void OnGPIO(int number, bool value)
37         {
38             if(number >= AlertsCount)
39             {
40                 this.Log(LogLevel.Error, "This peripheral can only handle {0}, the alert {1} is not valid", AlertsCount, number);
41             }
42             if(value)
43             {
44                 this.DebugLog("Alert {0} triggered", number);
45                 alertCause[number].Value = value;
46                 var alertClass = alertClasses[number].Value;
47                 var enabled = alertEnabled[number].Value;
48                 if(value & enabled)
49                 {
50                     HandleAlertOfClass(alertClass);
51                 }
52             }
53         }
54 
55         public GPIO ClassAInterrupt { get; }
56         public GPIO ClassBInterrupt { get; }
57         public GPIO ClassCInterrupt { get; }
58         public GPIO ClassDInterrupt { get; }
59 
60         public long Size => 0x1000;
61 
DefineRegisters()62         private void DefineRegisters()
63         {
64             Registers.InterruptState.Define(this)
65                 .WithFlag(0, out classAInterruptTriggered, FieldMode.Read | FieldMode.WriteOneToClear, name: "classa")
66                 .WithFlag(1, out classBInterruptTriggered, FieldMode.Read | FieldMode.WriteOneToClear, name: "classb")
67                 .WithFlag(2, out classCInterruptTriggered, FieldMode.Read | FieldMode.WriteOneToClear, name: "classc")
68                 .WithFlag(3, out classDInterruptTriggered, FieldMode.Read | FieldMode.WriteOneToClear, name: "classd")
69                 .WithWriteCallback((_, val) => { if(val != 0) UpdateInterrupts(); })
70                 .WithReservedBits(4, 32 - 4);
71 
72             Registers.InterruptEnable.Define(this)
73                 .WithFlag(0, out classAInterruptEnable, name: "classa")
74                 .WithFlag(1, out classBInterruptEnable, name: "classb")
75                 .WithFlag(2, out classCInterruptEnable, name: "classc")
76                 .WithFlag(3, out classDInterruptEnable, name: "classd")
77                 .WithWriteCallback((_, __) => UpdateInterrupts())
78                 .WithReservedBits(4, 32 - 4);
79 
80             Registers.InterruptTest.Define(this)
81                 .WithFlag(0, FieldMode.Write, writeCallback: (_, val) => { if(val) classAInterruptTriggered.Value = true; }, name: "classa")
82                 .WithFlag(1, FieldMode.Write, writeCallback: (_, val) => { if(val) classBInterruptTriggered.Value = true; }, name: "classb")
83                 .WithFlag(2, FieldMode.Write, writeCallback: (_, val) => { if(val) classCInterruptTriggered.Value = true; }, name: "classc")
84                 .WithFlag(3, FieldMode.Write, writeCallback: (_, val) => { if(val) classDInterruptTriggered.Value = true; }, name: "classd")
85                 .WithWriteCallback((_, val) => { if(val != 0) UpdateInterrupts(); })
86                 .WithReservedBits(4, 32 - 4);
87 
88             Registers.PingTimerRegisterWriteEnable.Define(this, 0x1)
89                 .WithTaggedFlag("PING_TIMER_REGWEN", 0)
90                 .WithReservedBits(1, 31)
91                 // Locking registers means that the configuration is complete and the feature may be enabled.
92                 // This very moment we should start `pinging` connected peripherals
93                 .WithWriteCallback((_, val) => { if(val == 0) PingTimeout(); });
94 
95             Registers.PingTimeoutCycle.Define(this, 0x100)
96                 .WithValueField(0, 16, out pingTimeout, name: "PING_TIMEOUT_CYC_SHADOWED")
97                 .WithReservedBits(16, 16);
98 
99             Registers.PingTimerEnable.Define(this)
100                 // The `Read | Set` mode means that it cannot be disabled - this is intentional
101                 .WithFlag(0, out pingTimeoutEnable, FieldMode.Read | FieldMode.Set, name: "PING_TIMER_EN_SHADOWED")
102                 .WithReservedBits(1, 31);
103 
104             Registers.AlertRegisterWriteEnable0.DefineMany(this, AlertsCount, resetValue: 0x1, setup: (register, idx) =>
105                 register
106                     // The value of this register does not matter. We just need it to retain value
107                     .WithFlag(0, FieldMode.Read | FieldMode.WriteZeroToClear, name: $"EN_{idx}")
108                     .WithReservedBits(1, 31));
109 
110             Registers.AlertEnable0.DefineMany(this, AlertsCount, (register, idx) =>
111                 register
112                     .WithFlag(0, out alertEnabled[idx], name: $"EN_A_{idx}")
113                     .WithReservedBits(1, 31));
114 
115             Registers.AlertClass0.DefineMany(this, AlertsCount, (register, idx) =>
116                 register
117                     .WithEnumField<DoubleWordRegister, AlertClass>(0, 2, out alertClasses[idx], name: $"CLASS_A_{idx}")
118                     .WithReservedBits(2, 30));
119 
120             Registers.AlertCause0.DefineMany(this, AlertsCount, (register, idx) =>
121                 register
122                     .WithFlag(0, out alertCause[idx], FieldMode.Read | FieldMode.WriteOneToClear, name: $"A_{idx}")
123                     .WithReservedBits(1, 31));
124 
125             Registers.LocalAlertRegisterWriteEnable0.DefineMany(this, LocalAlertsCount, resetValue: 0x1, setup: (register, idx) =>
126                 register
127                     // The value of this register does not matter. We just need it to retain value
128                     .WithFlag(0, FieldMode.Read | FieldMode.WriteZeroToClear, name: $"EN_{idx}")
129                     .WithReservedBits(1, 31));
130 
131             Registers.LocalAlertEnable0.DefineMany(this, LocalAlertsCount, (register, idx) =>
132                 register
133                     .WithFlag(0, out localAlertEnabled[idx], name: $"EN_LA_{idx}")
134                     .WithReservedBits(1, 31));
135 
136             Registers.LocalAlertClass0.DefineMany(this, LocalAlertsCount, (register, idx) =>
137                 register
138                     .WithEnumField<DoubleWordRegister, AlertClass>(0, 2, out localAlertClasses[idx], name: $"CLASS_LA_{idx}")
139                     .WithReservedBits(2, 30));
140 
141             Registers.LocalAlertCause0.DefineMany(this, LocalAlertsCount, (register, idx) =>
142                 register
143                     .WithFlag(0, out localAlertCause[idx], FieldMode.Read | FieldMode.WriteOneToClear, name: $"LA_{idx}")
144                     .WithReservedBits(1, 31));
145 
146             var controlRegisterOffset = Registers.ClassAControl - Registers.ClassARegisterWriteEnable;
147             var clearWenRegisterOffset = Registers.ClassAClearRegisterWriteEnable - Registers.ClassARegisterWriteEnable;
148             var clearRegisterOffset = Registers.ClassAClear - Registers.ClassARegisterWriteEnable;
149             var accumulationRegisterOffset = Registers.ClassAAccumulationCount - Registers.ClassARegisterWriteEnable;
150             var accumulationThresholdRegisterOffset = Registers.ClassAAccumulationThreshold - Registers.ClassARegisterWriteEnable;
151             var timeoutCycleRegisterOffset = Registers.ClassATimeoutCycle - Registers.ClassARegisterWriteEnable;
152             var crashdumpTriggerRegisterOffset = Registers.ClassACrashdumpTrigger - Registers.ClassARegisterWriteEnable;
153             var phase0CycleRegisterOffset = Registers.ClassAPhase0Cycle - Registers.ClassARegisterWriteEnable;
154             var phase1CycleRegisterOffset = Registers.ClassAPhase1Cycle - Registers.ClassARegisterWriteEnable;
155             var phase2CycleRegisterOffset = Registers.ClassAPhase2Cycle - Registers.ClassARegisterWriteEnable;
156             var phase3RegisterOffset = Registers.ClassAPhase3Cycle - Registers.ClassARegisterWriteEnable;
157             var escalationCountRegisterOffset = Registers.ClassAEscalationCount - Registers.ClassARegisterWriteEnable;
158             var stateRegisterOffset = Registers.ClassAState - Registers.ClassARegisterWriteEnable;
159 
160             foreach(var entry in new Dictionary<string, Registers> {{"A", Registers.ClassARegisterWriteEnable},
161                                                                     {"B", Registers.ClassBRegisterWriteEnable},
162                                                                     {"C", Registers.ClassCRegisterWriteEnable},
163                                                                     {"D", Registers.ClassDRegisterWriteEnable}})
164             {
165                 var className = entry.Key;
166                 var firstRegister = entry.Value;
167                 ((Registers)firstRegister).Define(this, 0x1)
168                     .WithTaggedFlag($"CLASS${className}_REGWEN", 0)
169                     .WithReservedBits(1, 31);
170 
171                 ((Registers)(firstRegister + controlRegisterOffset)).Define(this, 0x393c)
172                     .WithTaggedFlag("EN", 0)
173                     .WithTaggedFlag("LOCK", 1)
174                     .WithTaggedFlag("EN_E0", 2)
175                     .WithTaggedFlag("EN_E1", 3)
176                     .WithTaggedFlag("EN_E2", 4)
177                     .WithTaggedFlag("EN_E3", 5)
178                     .WithTag("MAP_E0", 6, 2)
179                     .WithTag("MAP_E1", 8, 2)
180                     .WithTag("MAP_E2", 10, 2)
181                     .WithTag("MAP_E3", 12, 2)
182                     .WithReservedBits(14, 32 - 14);
183 
184                 ((Registers)(firstRegister + clearWenRegisterOffset)).Define(this, 0x1)
185                     .WithTaggedFlag($"CLASS${className}_CLR_REGWEN", 0)
186                     .WithReservedBits(1, 31);
187 
188                 ((Registers)(firstRegister + clearRegisterOffset)).Define(this, 0x1)
189                     .WithTaggedFlag($"CLASS${className}_CLR_SHADOWED", 0)
190                     .WithIgnoredBits(1, 31);
191 
192                 ((Registers)(firstRegister + accumulationRegisterOffset)).Define(this)
193                     .WithTag($"CLASS${className}_ACCUM_CNT", 0, 16)
194                     .WithReservedBits(16, 16);
195 
196                 ((Registers)(firstRegister + accumulationThresholdRegisterOffset)).Define(this)
197                     .WithTag($"CLASS${className}_ACCUM_THRESH_SHADOWED", 0, 16)
198                     .WithReservedBits(16, 16);
199 
200                 ((Registers)(firstRegister + timeoutCycleRegisterOffset)).Define(this)
201                     .WithTag($"CLASS${className}_TIMEOUT_CYC_SHADOWED", 0, 32);
202 
203                 ((Registers)(firstRegister + crashdumpTriggerRegisterOffset)).Define(this)
204                     .WithTag($"CLASS${className}_CRASHDUMP_TRIGGER_SHADOWED", 0, 2)
205                     .WithReservedBits(2, 30);
206 
207                 ((Registers)(firstRegister + phase0CycleRegisterOffset)).Define(this)
208                     .WithTag($"CLASS${className}_PHASE0_CYC_SHADOWED", 0, 32);
209 
210                 ((Registers)(firstRegister + phase1CycleRegisterOffset)).Define(this)
211                     .WithTag($"CLASS${className}_PHASE1_CYC_SHADOWED", 0, 32);
212 
213                 ((Registers)(firstRegister + phase2CycleRegisterOffset)).Define(this, 0x1)
214                     .WithTag($"CLASS${className}_PHASE2_CYC_SHADOWED", 0, 32);
215 
216                 ((Registers)(firstRegister + phase3RegisterOffset)).Define(this, 0xa)
217                     .WithTag($"CLASS${className}_PHASE3_CYC_SHADOWED", 0, 32);
218 
219                 ((Registers)(firstRegister + escalationCountRegisterOffset)).Define(this, 0x64)
220                     .WithTag($"CLASS${className}_ESC_CNT", 0, 32);
221 
222                 ((Registers)(firstRegister + stateRegisterOffset)).Define(this, 0x0)
223                     .WithTag($"CLASS${className}_STATE", 0, 2)
224                     .WithIgnoredBits(2, 30);
225             }
226         }
227 
PingTimeout()228         private void PingTimeout()
229         {
230             // We don't implement the ping timeout fully, the only case we handle is the known alert condition - when the timeout is lower or equal to the ping response `pause cycles` defined in the hardware.
231             // In that case we prepare to throw a local alert during the next execution sync. The reason it is postponed is that the software might execute wfi in the few next instructions.
232             if(!pingTimeoutEnable.Value || pingTimeout.Value > PingPauseCycles)
233             {
234                 return;
235             }
236             this.machine.LocalTimeSource.ExecuteInNearestSyncedState(_ => OnLocalAlert(LocalCauses.AlertPingFail));
237         }
238 
OnLocalAlert(LocalCauses alert)239         private void OnLocalAlert(LocalCauses alert)
240         {
241             var index = (int) alert;
242             localAlertCause[index].Value = true;
243             var enabled = localAlertEnabled[index].Value;
244 
245             if(enabled)
246             {
247                 var alertClass = localAlertClasses[index].Value;
248                 HandleAlertOfClass(alertClass);
249             }
250         }
251 
HandleAlertOfClass(AlertClass alertClass)252         private void HandleAlertOfClass(AlertClass alertClass)
253         {
254             switch(alertClass)
255             {
256                 case AlertClass.A:
257                     classAInterruptTriggered.Value = true;
258                     break;
259                 case AlertClass.B:
260                     classBInterruptTriggered.Value = true;
261                     break;
262                 case AlertClass.C:
263                     classCInterruptTriggered.Value = true;
264                     break;
265                 case AlertClass.D:
266                     classDInterruptTriggered.Value = true;
267                     break;
268                 default:
269                     throw new ArgumentException("Unknown alert class");
270             }
271             UpdateInterrupts();
272         }
273 
UpdateInterrupts()274         private void UpdateInterrupts()
275         {
276             ClassAInterrupt.Set(classAInterruptTriggered.Value && classAInterruptEnable.Value);
277             ClassBInterrupt.Set(classBInterruptTriggered.Value && classBInterruptEnable.Value);
278             ClassCInterrupt.Set(classCInterruptTriggered.Value && classCInterruptEnable.Value);
279             ClassDInterrupt.Set(classDInterruptTriggered.Value && classDInterruptEnable.Value);
280         }
281 
282         private IFlagRegisterField classAInterruptTriggered;
283         private IFlagRegisterField classBInterruptTriggered;
284         private IFlagRegisterField classCInterruptTriggered;
285         private IFlagRegisterField classDInterruptTriggered;
286         private IFlagRegisterField classAInterruptEnable;
287         private IFlagRegisterField classBInterruptEnable;
288         private IFlagRegisterField classCInterruptEnable;
289         private IFlagRegisterField classDInterruptEnable;
290         private IFlagRegisterField pingTimeoutEnable;
291 
292         private IValueRegisterField pingTimeout;
293 
294         private readonly IEnumRegisterField<AlertClass>[] alertClasses;
295         private readonly IEnumRegisterField<AlertClass>[] localAlertClasses;
296         private readonly IFlagRegisterField[] alertEnabled;
297         private readonly IFlagRegisterField[] alertCause;
298         private readonly IFlagRegisterField[] localAlertEnabled;
299         private readonly IFlagRegisterField[] localAlertCause;
300 
301         private const uint AlertsCount = 65;
302         private const uint LocalAlertsCount = 7;
303         private const uint PingPauseCycles = 2;
304 
305         #pragma warning disable format
306         private enum AlertClass
307         {
308             A = 0,
309             B = 1,
310             C = 2,
311             D = 3,
312         }
313 
314         private enum LocalCauses
315         {
316             AlertPingFail = 0,
317             EscalationPingFail = 1,
318             AlertIntegrityFail = 2,
319             EscalationIntegrityFail = 3,
320             BusIntegrityFail = 4,
321             ShadowRegisterUpdateError = 5,
322             ShadowRegisterStorageError = 6,
323         }
324 
325         public enum Registers
326         {
327             InterruptState                 = 0x0,
328             InterruptEnable                = 0x4,
329             InterruptTest                  = 0x8,
330             PingTimerRegisterWriteEnable   = 0xc,
331             PingTimeoutCycle               = 0x10,
332             PingTimerEnable                = 0x14,
333             AlertRegisterWriteEnable0      = 0x18,
334             AlertRegisterWriteEnable1      = 0x1c,
335             AlertRegisterWriteEnable2      = 0x20,
336             AlertRegisterWriteEnable3      = 0x24,
337             AlertRegisterWriteEnable4      = 0x28,
338             AlertRegisterWriteEnable5      = 0x2c,
339             AlertRegisterWriteEnable6      = 0x30,
340             AlertRegisterWriteEnable7      = 0x34,
341             AlertRegisterWriteEnable8      = 0x38,
342             AlertRegisterWriteEnable9      = 0x3c,
343             AlertRegisterWriteEnable10     = 0x40,
344             AlertRegisterWriteEnable11     = 0x44,
345             AlertRegisterWriteEnable12     = 0x48,
346             AlertRegisterWriteEnable13     = 0x4c,
347             AlertRegisterWriteEnable14     = 0x50,
348             AlertRegisterWriteEnable15     = 0x54,
349             AlertRegisterWriteEnable16     = 0x58,
350             AlertRegisterWriteEnable17     = 0x5c,
351             AlertRegisterWriteEnable18     = 0x60,
352             AlertRegisterWriteEnable19     = 0x64,
353             AlertRegisterWriteEnable20     = 0x68,
354             AlertRegisterWriteEnable21     = 0x6c,
355             AlertRegisterWriteEnable22     = 0x70,
356             AlertRegisterWriteEnable23     = 0x74,
357             AlertRegisterWriteEnable24     = 0x78,
358             AlertRegisterWriteEnable25     = 0x7c,
359             AlertRegisterWriteEnable26     = 0x80,
360             AlertRegisterWriteEnable27     = 0x84,
361             AlertRegisterWriteEnable28     = 0x88,
362             AlertRegisterWriteEnable29     = 0x8c,
363             AlertRegisterWriteEnable30     = 0x90,
364             AlertRegisterWriteEnable31     = 0x94,
365             AlertRegisterWriteEnable32     = 0x98,
366             AlertRegisterWriteEnable33     = 0x9c,
367             AlertRegisterWriteEnable34     = 0xa0,
368             AlertRegisterWriteEnable35     = 0xa4,
369             AlertRegisterWriteEnable36     = 0xa8,
370             AlertRegisterWriteEnable37     = 0xac,
371             AlertRegisterWriteEnable38     = 0xb0,
372             AlertRegisterWriteEnable39     = 0xb4,
373             AlertRegisterWriteEnable40     = 0xb8,
374             AlertRegisterWriteEnable41     = 0xbc,
375             AlertRegisterWriteEnable42     = 0xc0,
376             AlertRegisterWriteEnable43     = 0xc4,
377             AlertRegisterWriteEnable44     = 0xc8,
378             AlertRegisterWriteEnable45     = 0xcc,
379             AlertRegisterWriteEnable46     = 0xd0,
380             AlertRegisterWriteEnable47     = 0xd4,
381             AlertRegisterWriteEnable48     = 0xd8,
382             AlertRegisterWriteEnable49     = 0xdc,
383             AlertRegisterWriteEnable50     = 0xe0,
384             AlertRegisterWriteEnable51     = 0xe4,
385             AlertRegisterWriteEnable52     = 0xe8,
386             AlertRegisterWriteEnable53     = 0xec,
387             AlertRegisterWriteEnable54     = 0xf0,
388             AlertRegisterWriteEnable55     = 0xf4,
389             AlertRegisterWriteEnable56     = 0xf8,
390             AlertRegisterWriteEnable57     = 0xfc,
391             AlertRegisterWriteEnable58     = 0x100,
392             AlertRegisterWriteEnable59     = 0x104,
393             AlertRegisterWriteEnable60     = 0x108,
394             AlertRegisterWriteEnable61     = 0x10c,
395             AlertRegisterWriteEnable62     = 0x110,
396             AlertRegisterWriteEnable63     = 0x114,
397             AlertRegisterWriteEnable64     = 0x118,
398             AlertEnable0                   = 0x10c+0x10,
399             AlertEnable1                   = 0x110+0x10,
400             AlertEnable2                   = 0x114+0x10,
401             AlertEnable3                   = 0x118+0x10,
402             AlertEnable4                   = 0x11c+0x10,
403             AlertEnable5                   = 0x120+0x10,
404             AlertEnable6                   = 0x124+0x10,
405             AlertEnable7                   = 0x128+0x10,
406             AlertEnable8                   = 0x12c+0x10,
407             AlertEnable9                   = 0x130+0x10,
408             AlertEnable10                  = 0x134+0x10,
409             AlertEnable11                  = 0x138+0x10,
410             AlertEnable12                  = 0x13c+0x10,
411             AlertEnable13                  = 0x140+0x10,
412             AlertEnable14                  = 0x144+0x10,
413             AlertEnable15                  = 0x148+0x10,
414             AlertEnable16                  = 0x14c+0x10,
415             AlertEnable17                  = 0x150+0x10,
416             AlertEnable18                  = 0x154+0x10,
417             AlertEnable19                  = 0x158+0x10,
418             AlertEnable20                  = 0x15c+0x10,
419             AlertEnable21                  = 0x160+0x10,
420             AlertEnable22                  = 0x164+0x10,
421             AlertEnable23                  = 0x168+0x10,
422             AlertEnable24                  = 0x16c+0x10,
423             AlertEnable25                  = 0x170+0x10,
424             AlertEnable26                  = 0x174+0x10,
425             AlertEnable27                  = 0x178+0x10,
426             AlertEnable28                  = 0x17c+0x10,
427             AlertEnable29                  = 0x180+0x10,
428             AlertEnable30                  = 0x184+0x10,
429             AlertEnable31                  = 0x188+0x10,
430             AlertEnable32                  = 0x18c+0x10,
431             AlertEnable33                  = 0x190+0x10,
432             AlertEnable34                  = 0x194+0x10,
433             AlertEnable35                  = 0x198+0x10,
434             AlertEnable36                  = 0x19c+0x10,
435             AlertEnable37                  = 0x1a0+0x10,
436             AlertEnable38                  = 0x1a4+0x10,
437             AlertEnable39                  = 0x1a8+0x10,
438             AlertEnable40                  = 0x1ac+0x10,
439             AlertEnable41                  = 0x1b0+0x10,
440             AlertEnable42                  = 0x1b4+0x10,
441             AlertEnable43                  = 0x1b8+0x10,
442             AlertEnable44                  = 0x1bc+0x10,
443             AlertEnable45                  = 0x1c0+0x10,
444             AlertEnable46                  = 0x1c4+0x10,
445             AlertEnable47                  = 0x1c8+0x10,
446             AlertEnable48                  = 0x1cc+0x10,
447             AlertEnable49                  = 0x1d0+0x10,
448             AlertEnable50                  = 0x1d4+0x10,
449             AlertEnable51                  = 0x1d8+0x10,
450             AlertEnable52                  = 0x1dc+0x10,
451             AlertEnable53                  = 0x1e0+0x10,
452             AlertEnable54                  = 0x1e4+0x10,
453             AlertEnable55                  = 0x1e8+0x10,
454             AlertEnable56                  = 0x1ec+0x10,
455             AlertEnable57                  = 0x1f0+0x10,
456             AlertEnable58                  = 0x1f4+0x10,
457             AlertEnable59                  = 0x1f8+0x10,
458             AlertEnable60                  = 0x1fc+0x10,
459             AlertEnable61                  = 0x200+0x10,
460             AlertEnable62                  = 0x204+0x10,
461             AlertEnable63                  = 0x208+0x10,
462             AlertEnable64                  = 0x20c+0x10,
463             AlertClass0                    = 0x200+0x20,
464             AlertClass1                    = 0x204+0x20,
465             AlertClass2                    = 0x208+0x20,
466             AlertClass3                    = 0x20c+0x20,
467             AlertClass4                    = 0x210+0x20,
468             AlertClass5                    = 0x214+0x20,
469             AlertClass6                    = 0x218+0x20,
470             AlertClass7                    = 0x21c+0x20,
471             AlertClass8                    = 0x220+0x20,
472             AlertClass9                    = 0x224+0x20,
473             AlertClass10                   = 0x228+0x20,
474             AlertClass11                   = 0x22c+0x20,
475             AlertClass12                   = 0x230+0x20,
476             AlertClass13                   = 0x234+0x20,
477             AlertClass14                   = 0x238+0x20,
478             AlertClass15                   = 0x23c+0x20,
479             AlertClass16                   = 0x240+0x20,
480             AlertClass17                   = 0x244+0x20,
481             AlertClass18                   = 0x248+0x20,
482             AlertClass19                   = 0x24c+0x20,
483             AlertClass20                   = 0x250+0x20,
484             AlertClass21                   = 0x254+0x20,
485             AlertClass22                   = 0x258+0x20,
486             AlertClass23                   = 0x25c+0x20,
487             AlertClass24                   = 0x260+0x20,
488             AlertClass25                   = 0x264+0x20,
489             AlertClass26                   = 0x268+0x20,
490             AlertClass27                   = 0x26c+0x20,
491             AlertClass28                   = 0x270+0x20,
492             AlertClass29                   = 0x274+0x20,
493             AlertClass30                   = 0x278+0x20,
494             AlertClass31                   = 0x27c+0x20,
495             AlertClass32                   = 0x280+0x20,
496             AlertClass33                   = 0x284+0x20,
497             AlertClass34                   = 0x288+0x20,
498             AlertClass35                   = 0x28c+0x20,
499             AlertClass36                   = 0x290+0x20,
500             AlertClass37                   = 0x294+0x20,
501             AlertClass38                   = 0x298+0x20,
502             AlertClass39                   = 0x29c+0x20,
503             AlertClass40                   = 0x2a0+0x20,
504             AlertClass41                   = 0x2a4+0x20,
505             AlertClass42                   = 0x2a8+0x20,
506             AlertClass43                   = 0x2ac+0x20,
507             AlertClass44                   = 0x2b0+0x20,
508             AlertClass45                   = 0x2b4+0x20,
509             AlertClass46                   = 0x2b8+0x20,
510             AlertClass47                   = 0x2bc+0x20,
511             AlertClass48                   = 0x2c0+0x20,
512             AlertClass49                   = 0x2c4+0x20,
513             AlertClass50                   = 0x2c8+0x20,
514             AlertClass51                   = 0x2cc+0x20,
515             AlertClass52                   = 0x2d0+0x20,
516             AlertClass53                   = 0x2d4+0x20,
517             AlertClass54                   = 0x2d8+0x20,
518             AlertClass55                   = 0x2dc+0x20,
519             AlertClass56                   = 0x2e0+0x20,
520             AlertClass57                   = 0x2e4+0x20,
521             AlertClass58                   = 0x2e8+0x20,
522             AlertClass59                   = 0x2ec+0x20,
523             AlertClass60                   = 0x2f0+0x20,
524             AlertClass61                   = 0x2f4+0x20,
525             AlertClass62                   = 0x2f8+0x20,
526             AlertClass63                   = 0x2fc+0x20,
527             AlertClass64                   = 0x300+0x20,
528             AlertCause0                    = 0x2f4+0x30,
529             AlertCause1                    = 0x2f8+0x30,
530             AlertCause2                    = 0x2fc+0x30,
531             AlertCause3                    = 0x300+0x30,
532             AlertCause4                    = 0x304+0x30,
533             AlertCause5                    = 0x308+0x30,
534             AlertCause6                    = 0x30c+0x30,
535             AlertCause7                    = 0x310+0x30,
536             AlertCause8                    = 0x314+0x30,
537             AlertCause9                    = 0x318+0x30,
538             AlertCause10                   = 0x31c+0x30,
539             AlertCause11                   = 0x320+0x30,
540             AlertCause12                   = 0x324+0x30,
541             AlertCause13                   = 0x328+0x30,
542             AlertCause14                   = 0x32c+0x30,
543             AlertCause15                   = 0x330+0x30,
544             AlertCause16                   = 0x334+0x30,
545             AlertCause17                   = 0x338+0x30,
546             AlertCause18                   = 0x33c+0x30,
547             AlertCause19                   = 0x340+0x30,
548             AlertCause20                   = 0x344+0x30,
549             AlertCause21                   = 0x348+0x30,
550             AlertCause22                   = 0x34c+0x30,
551             AlertCause23                   = 0x350+0x30,
552             AlertCause24                   = 0x354+0x30,
553             AlertCause25                   = 0x358+0x30,
554             AlertCause26                   = 0x35c+0x30,
555             AlertCause27                   = 0x360+0x30,
556             AlertCause28                   = 0x364+0x30,
557             AlertCause29                   = 0x368+0x30,
558             AlertCause30                   = 0x36c+0x30,
559             AlertCause31                   = 0x370+0x30,
560             AlertCause32                   = 0x374+0x30,
561             AlertCause33                   = 0x378+0x30,
562             AlertCause34                   = 0x37c+0x30,
563             AlertCause35                   = 0x380+0x30,
564             AlertCause36                   = 0x384+0x30,
565             AlertCause37                   = 0x388+0x30,
566             AlertCause38                   = 0x38c+0x30,
567             AlertCause39                   = 0x390+0x30,
568             AlertCause40                   = 0x394+0x30,
569             AlertCause41                   = 0x398+0x30,
570             AlertCause42                   = 0x39c+0x30,
571             AlertCause43                   = 0x3a0+0x30,
572             AlertCause44                   = 0x3a4+0x30,
573             AlertCause45                   = 0x3a8+0x30,
574             AlertCause46                   = 0x3ac+0x30,
575             AlertCause47                   = 0x3b0+0x30,
576             AlertCause48                   = 0x3b4+0x30,
577             AlertCause49                   = 0x3b8+0x30,
578             AlertCause50                   = 0x3bc+0x30,
579             AlertCause51                   = 0x3c0+0x30,
580             AlertCause52                   = 0x3c4+0x30,
581             AlertCause53                   = 0x3c8+0x30,
582             AlertCause54                   = 0x3cc+0x30,
583             AlertCause55                   = 0x3d0+0x30,
584             AlertCause56                   = 0x3d4+0x30,
585             AlertCause57                   = 0x3d8+0x30,
586             AlertCause58                   = 0x3dc+0x30,
587             AlertCause59                   = 0x3e0+0x30,
588             AlertCause60                   = 0x3e4+0x30,
589             AlertCause61                   = 0x3e8+0x30,
590             AlertCause62                   = 0x3ec+0x30,
591             AlertCause63                   = 0x3f0+0x30,
592             AlertCause64                   = 0x3f4+0x30,
593             LocalAlertRegisterWriteEnable0 = 0x3e8+0x40,
594             LocalAlertRegisterWriteEnable1 = 0x3ec+0x40,
595             LocalAlertRegisterWriteEnable2 = 0x3f0+0x40,
596             LocalAlertRegisterWriteEnable3 = 0x3f4+0x40,
597             LocalAlertRegisterWriteEnable4 = 0x3f8+0x40,
598             LocalAlertRegisterWriteEnable5 = 0x3fc+0x40,
599             LocalAlertRegisterWriteEnable6 = 0x400+0x40,
600             LocalAlertEnable0              = 0x404+0x40,
601             LocalAlertEnable1              = 0x408+0x40,
602             LocalAlertEnable2              = 0x40c+0x40,
603             LocalAlertEnable3              = 0x410+0x40,
604             LocalAlertEnable4              = 0x414+0x40,
605             LocalAlertEnable5              = 0x418+0x40,
606             LocalAlertEnable6              = 0x41c+0x40,
607             LocalAlertClass0               = 0x420+0x40,
608             LocalAlertClass1               = 0x424+0x40,
609             LocalAlertClass2               = 0x428+0x40,
610             LocalAlertClass3               = 0x42c+0x40,
611             LocalAlertClass4               = 0x430+0x40,
612             LocalAlertClass5               = 0x434+0x40,
613             LocalAlertClass6               = 0x438+0x40,
614             LocalAlertCause0               = 0x43c+0x40,
615             LocalAlertCause1               = 0x440+0x40,
616             LocalAlertCause2               = 0x444+0x40,
617             LocalAlertCause3               = 0x448+0x40,
618             LocalAlertCause4               = 0x44c+0x40,
619             LocalAlertCause5               = 0x450+0x40,
620             LocalAlertCause6               = 0x454+0x40,
621             ClassARegisterWriteEnable      = 0x458+0x40,
622             ClassAControl                  = 0x45c+0x40,
623             ClassAClearRegisterWriteEnable = 0x460+0x40,
624             ClassAClear                    = 0x464+0x40,
625             ClassAAccumulationCount        = 0x468+0x40,
626             ClassAAccumulationThreshold    = 0x46C+0x40,
627             ClassATimeoutCycle             = 0x470+0x40,
628             ClassACrashdumpTrigger         = 0x474+0x40,
629             ClassAPhase0Cycle              = 0x478+0x40,
630             ClassAPhase1Cycle              = 0x47C+0x40,
631             ClassAPhase2Cycle              = 0x480+0x40,
632             ClassAPhase3Cycle              = 0x484+0x40,
633             ClassAEscalationCount          = 0x488+0x40,
634             ClassAState                    = 0x48C+0x40,
635             ClassBRegisterWriteEnable      = 0x490+0x40,
636             ClassBControl                  = 0x494+0x40,
637             ClassBClearRegisterWriteEnable = 0x498+0x40,
638             ClassBClear                    = 0x49C+0x40,
639             ClassBAccumulationCount        = 0x4A0+0x40,
640             ClassBAccumulationThreshold    = 0x4A4+0x40,
641             ClassBTimeoutCycle             = 0x4A8+0x40,
642             ClassBCrashdumpTrigger         = 0x4AC+0x40,
643             ClassBPhase0Cycle              = 0x4B0+0x40,
644             ClassBPhase1Cycle              = 0x4B4+0x40,
645             ClassBPhase2Cycle              = 0x4B8+0x40,
646             ClassBPhase3Cycle              = 0x4BC+0x40,
647             ClassBEscalationCount          = 0x4C0+0x40,
648             ClassBState                    = 0x4C4+0x40,
649             ClassCRegisterWriteEnable      = 0x4C8+0x40,
650             ClassCControl                  = 0x4CC+0x40,
651             ClassCClearRegisterWriteEnable = 0x4D0+0x40,
652             ClassCClear                    = 0x4D4+0x40,
653             ClassCAccumulationCount        = 0x4D8+0x40,
654             ClassCAccumulationThreshold    = 0x4DC+0x40,
655             ClassCTimeoutCycle             = 0x4E0+0x40,
656             ClassCCrashdumpTrigger         = 0x4E4+0x40,
657             ClassCPhase0Cycle              = 0x4E8+0x40,
658             ClassCPhase1Cycle              = 0x4EC+0x40,
659             ClassCPhase2Cycle              = 0x4F0+0x40,
660             ClassCPhase3Cycle              = 0x4F4+0x40,
661             ClassCEscalationCount          = 0x4F8+0x40,
662             ClassCState                    = 0x4FC+0x40,
663             ClassDRegisterWriteEnable      = 0x500+0x40,
664             ClassDControl                  = 0x504+0x40,
665             ClassDClearRegisterWriteEnable = 0x508+0x40,
666             ClassDClear                    = 0x50C+0x40,
667             ClassDAccumulationCount        = 0x510+0x40,
668             ClassDAccumulationThreshold    = 0x514+0x40,
669             ClassDTimeoutCycle             = 0x518+0x40,
670             ClassDCrashdumpTrigger         = 0x51C+0x40,
671             ClassDPhase0Cycle              = 0x520+0x40,
672             ClassDPhase1Cycle              = 0x524+0x40,
673             ClassDPhase2Cycle              = 0x528+0x40,
674             ClassDPhase3Cycle              = 0x52C+0x40,
675             ClassDEscalationCount          = 0x530+0x40,
676             ClassDState                    = 0x534+0x40,
677         }
678        #pragma warning restore format
679     }
680 }
681