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
|
/* IBM_PROLOG_BEGIN_TAG */
/* This is an automatically generated prolog. */
/* */
/* $Source: src/include/occhw_interrupts.h $ */
/* */
/* OpenPOWER OnChipController Project */
/* */
/* Contributors Listed Below - COPYRIGHT 2015,2016 */
/* [+] International Business Machines Corp. */
/* */
/* */
/* Licensed under the Apache License, Version 2.0 (the "License"); */
/* you may not use this file except in compliance with the License. */
/* You may obtain a copy of the License at */
/* */
/* http://www.apache.org/licenses/LICENSE-2.0 */
/* */
/* Unless required by applicable law or agreed to in writing, software */
/* distributed under the License is distributed on an "AS IS" BASIS, */
/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or */
/* implied. See the License for the specific language governing */
/* permissions and limitations under the License. */
/* */
/* IBM_PROLOG_END_TAG */
#ifndef __OCCHW_INTERRUPTS_H__
#define __OCCHW_INTERRUPTS_H__
/// \file occ_interrupts.h
/// \brief Interrupt assignments and macros for the OCC
///
#ifndef __ASSEMBLER__
#include <stdint.h>
#endif
////////////////////////////////////////////////////////////////////////////
// IRQ
////////////////////////////////////////////////////////////////////////////
// The OCB interrupt controller consists of 2 x 32-bit controllers. Unlike
// PPC ASICs, the OCB controllers are _not_ cascaded. The combined
// controllers are presented to the application as if there were a single
// 64-bit interrupt controller, while the code underlying the abstraction
// manipulates the 2 x 32-bit controllers independently.
//
// Note that the bits named *RESERVED* are actually implemented in the
// controller, but the interrupt input is tied low. That means they can also
// be used as IPI targets. Logical bits 32..63 are not implemented.
#define OCCHW_IRQ_DEBUGGER 0 /* 0x00 */
#define OCCHW_IRQ_TRACE_TRIGGER 1 /* 0x01 */
#define OCCHW_IRQ_OCC_ERROR 2 /* 0x02 */
#define OCCHW_IRQ_PBA_ERROR 3 /* 0x03 */
#define OCCHW_IRQ_SRT_ERROR 4 /* 0x04 */
#define OCCHW_IRQ_GPE0_HALT 5 /* 0x05 */
#define OCCHW_IRQ_GPE1_HALT 6 /* 0x06 */
#define OCCHW_IRQ_GPE2_HALT 7 /* 0x07 */
#define OCCHW_IRQ_GPE3_HALT 8 /* 0x08 */
#define OCCHW_IRQ_PPC405_HALT 9 /* 0x09 */
#define OCCHW_IRQ_OCB_ERROR 10 /* 0x0a */
#define OCCHW_IRQ_SPIPSS_ERROR 11 /* 0x0b */
#define OCCHW_IRQ_CHECK_STOP_PPC405 12 /* 0x0c */
#define OCCHW_IRQ_CHECK_STOP_GPE0 13 /* 0x0d */
#define OCCHW_IRQ_CHECK_STOP_GPE1 14 /* 0x0e */
#define OCCHW_IRQ_CHECK_STOP_GPE2 15 /* 0x0f */
#define OCCHW_IRQ_CHECK_STOP_GPE3 16 /* 0x10 */
#define OCCHW_IRQ_OCC_MALF_ALERT 17 /* 0x11 */
#define OCCHW_IRQ_ADU_MALF_ALERT 18 /* 0x12 */
#define OCCHW_IRQ_EXTERNAL_TRAP 19 /* 0x13 */
#define OCCHW_IRQ_IVRM_PVREF_ERROR 20 /* 0x14 */
#define OCCHW_IRQ_OCC_TIMER0 21 /* 0x15 */
#define OCCHW_IRQ_OCC_TIMER1 22 /* 0x16 */
#define OCCHW_IRQ_HALT_PSTATES 23 /* 0x17 */
#define OCCHW_IRQ_IPI_SCOM 24 /* 0x18 */
#define OCCHW_IRQ_IPI0_HI_PRIORITY 25 /* 0x19 */
#define OCCHW_IRQ_IPI1_HI_PRIORITY 26 /* 0x1a */
#define OCCHW_IRQ_IPI2_HI_PRIORITY 27 /* 0x1b */
#define OCCHW_IRQ_IPI3_HI_PRIORITY 28 /* 0x1c */
#define OCCHW_IRQ_IPI4_HI_PRIORITY 29 /* 0x1d */
#define OCCHW_IRQ_ADCFSM_ONGOING 30 /* 0x1e */
#define OCCHW_IRQ_RESERVED_31 31 /* 0x1f */
#define OCCHW_IRQ_PBAX_OCC_SEND 32 /* 0x20 */
#define OCCHW_IRQ_PBAX_OCC_PUSH0 33 /* 0x21 */
#define OCCHW_IRQ_PBAX_OCC_PUSH1 34 /* 0x22 */
#define OCCHW_IRQ_PBA_BCDE_ATTN 35 /* 0x23 */
#define OCCHW_IRQ_PBA_BCUE_ATTN 36 /* 0x24 */
#define OCCHW_IRQ_STRM0_PULL 37 /* 0x25 */
#define OCCHW_IRQ_STRM0_PUSH 38 /* 0x26 */
#define OCCHW_IRQ_STRM1_PULL 39 /* 0x27 */
#define OCCHW_IRQ_STRM1_PUSH 40 /* 0x28 */
#define OCCHW_IRQ_STRM2_PULL 41 /* 0x29 */
#define OCCHW_IRQ_STRM2_PUSH 42 /* 0x2a */
#define OCCHW_IRQ_STRM3_PULL 43 /* 0x2b */
#define OCCHW_IRQ_STRM3_PUSH 44 /* 0x2c */
#define OCCHW_IRQ_PMC_PCB_INTR_TYPE0_PENDING 45 /* 0x2d */
#define OCCHW_IRQ_PMC_PCB_INTR_TYPE1_PENDING 46 /* 0x2e */
#define OCCHW_IRQ_PMC_PCB_INTR_TYPE2_PENDING 47 /* 0x2f */
#define OCCHW_IRQ_PMC_PCB_INTR_TYPE3_PENDING 48 /* 0x30 */
#define OCCHW_IRQ_PMC_PCB_INTR_TYPE4_PENDING 49 /* 0x31 */
#define OCCHW_IRQ_PMC_PCB_INTR_TYPE5_PENDING 50 /* 0x32 */
#define OCCHW_IRQ_PMC_PCB_INTR_TYPE6_PENDING 51 /* 0x33 */
#define OCCHW_IRQ_PMC_PCB_INTR_TYPE7_PENDING 52 /* 0x34 */
#define OCCHW_IRQ_PMC_O2S_0A_ONGOING 53 /* 0x35 */
#define OCCHW_IRQ_PMC_O2S_0B_ONGOING 54 /* 0x36 */
#define OCCHW_IRQ_PMC_O2S_1A_ONGOING 55 /* 0x37 */
#define OCCHW_IRQ_PMC_O2S_1B_ONGOING 56 /* 0x38 */
#define OCCHW_IRQ_PSSBRIDGE_ONGOING 57 /* 0x39 */
#define OCCHW_IRQ_IPI0_LO_PRIORITY 58 /* 0x3a */
#define OCCHW_IRQ_IPI1_LO_PRIORITY 59 /* 0x3b */
#define OCCHW_IRQ_IPI2_LO_PRIORITY 60 /* 0x3c */
#define OCCHW_IRQ_IPI3_LO_PRIORITY 61 /* 0x3d */
#define OCCHW_IRQ_IPI4_LO_PRIORITY 62 /* 0x3e */
#define OCCHW_IRQ_RESERVED_63 63 /* 0x3f */
/// This constant is used to define the size of the table of interrupt handler
/// structures as well as a limit for error checking. The entire 64-bit
/// vector is now in use.
#define OCCHW_IRQS 64
// Please keep the string definitions up-to-date as they are used for
// reporting in the Simics simulation.
#define OCCHW_IRQ_STRINGS(var) \
const char* var[OCCHW_IRQS] = { \
"OCCHW_IRQ_DEBUGGER", \
"OCCHW_IRQ_TRACE_TRIGGER", \
"OCCHW_IRQ_OCC_ERROR", \
"OCCHW_IRQ_PBA_ERROR", \
"OCCHW_IRQ_SRT_ERROR", \
"OCCHW_IRQ_GPE0_HALT", \
"OCCHW_IRQ_GPE1_HALT", \
"OCCHW_IRQ_GPE2_HALT", \
"OCCHW_IRQ_GPE3_HALT", \
"OCCHW_IRQ_PPC405_HALT", \
"OCCHW_IRQ_OCB_ERROR", \
"OCCHW_IRQ_SPIPSS_ERROR", \
"OCCHW_IRQ_CHECK_STOP_PPC405", \
"OCCHW_IRQ_CHECK_STOP_GPE0", \
"OCCHW_IRQ_CHECK_STOP_GPE1", \
"OCCHW_IRQ_CHECK_STOP_GPE2", \
"OCCHW_IRQ_CHECK_STOP_GPE3", \
"OCCHW_IRQ_OCC_MALF_ALERT", \
"OCCHW_IRQ_ADU_MALF_ALERT", \
"OCCHW_IRQ_EXTERNAL_TRAP", \
"OCCHW_IRQ_IVRM_PVREF_ERROR", \
"OCCHW_IRQ_OCC_TIMER0", \
"OCCHW_IRQ_OCC_TIMER1", \
"OCCHW_IRQ_HALT_PSTATES", \
"OCCHW_IRQ_IPI_SCOM", \
"OCCHW_IRQ_IPI0_HI_PRIORITY", \
"OCCHW_IRQ_IPI1_HI_PRIORITY", \
"OCCHW_IRQ_IPI2_HI_PRIORITY", \
"OCCHW_IRQ_IPI3_HI_PRIORITY", \
"OCCHW_IRQ_IPI4_HI_PRIORITY", \
"OCCHW_IRQ_ADCFSM_ONGOING", \
"OCCHW_IRQ_RESERVED_31", \
"OCCHW_IRQ_PBAX_OCC_SEND", \
"OCCHW_IRQ_PBAX_OCC_PUSH0", \
"OCCHW_IRQ_PBAX_OCC_PUSH1", \
"OCCHW_IRQ_PBA_BCDE_ATTN", \
"OCCHW_IRQ_PBA_BCUE_ATTN", \
"OCCHW_IRQ_STRM0_PULL", \
"OCCHW_IRQ_STRM0_PUSH", \
"OCCHW_IRQ_STRM1_PULL", \
"OCCHW_IRQ_STRM1_PUSH", \
"OCCHW_IRQ_STRM2_PULL", \
"OCCHW_IRQ_STRM2_PUSH", \
"OCCHW_IRQ_STRM3_PULL", \
"OCCHW_IRQ_STRM3_PUSH", \
"OCCHW_IRQ_PMC_PCB_INTR_TYPE0_PENDING", \
"OCCHW_IRQ_PMC_PCB_INTR_TYPE1_PENDING", \
"OCCHW_IRQ_PMC_PCB_INTR_TYPE2_PENDING", \
"OCCHW_IRQ_PMC_PCB_INTR_TYPE3_PENDING", \
"OCCHW_IRQ_PMC_PCB_INTR_TYPE4_PENDING", \
"OCCHW_IRQ_PMC_PCB_INTR_TYPE5_PENDING", \
"OCCHW_IRQ_PMC_PCB_INTR_TYPE6_PENDING", \
"OCCHW_IRQ_PMC_PCB_INTR_TYPE7_PENDING", \
"OCCHW_IRQ_PMC_O2S_0A_ONGOING", \
"OCCHW_IRQ_PMC_O2S_0B_ONGOING", \
"OCCHW_IRQ_PMC_O2S_1A_ONGOING", \
"OCCHW_IRQ_PMC_O2S_1B_ONGOING", \
"OCCHW_IRQ_PSSBRIDGE_ONGOING", \
"OCCHW_IRQ_IPI0_LO_PRIORITY", \
"OCCHW_IRQ_IPI1_LO_PRIORITY", \
"OCCHW_IRQ_IPI2_LO_PRIORITY", \
"OCCHW_IRQ_IPI3_LO_PRIORITY", \
"OCCHW_IRQ_IPI4_LO_PRIORITY", \
"OCCHW_IRQ_RESERVED_63" \
};
/// Routing codes for OCB interrupts
#define OCCHW_IRQ_TARGET_ID_405_NONCRIT 0
#define OCCHW_IRQ_TARGET_ID_405_CRIT 1
#define OCCHW_IRQ_TARGET_ID_405_UNCOND 2
#define OCCHW_IRQ_TARGET_ID_405_DEBUG 3
#define OCCHW_IRQ_TARGET_ID_GPE0 4
#define OCCHW_IRQ_TARGET_ID_GPE1 5
#define OCCHW_IRQ_TARGET_ID_GPE2 6
#define OCCHW_IRQ_TARGET_ID_GPE3 7
// OCB interrupt type values (level or edge)
#define OCCHW_IRQ_TYPE_LEVEL 0
#define OCCHW_IRQ_TYPE_EDGE 1
// OCB interrupt polarity values (high or low, rising falling)
#define OCCHW_IRQ_POLARITY_LO 0
#define OCCHW_IRQ_POLARITY_FALLING 0
#define OCCHW_IRQ_POLARITY_HI 1
#define OCCHW_IRQ_POLARITY_RISING 1
// OCB interrupt mask values (masked or enabled)
#define OCCHW_IRQ_MASKED 0
#define OCCHW_IRQ_ENABLED 1
// Note: All standard-product IPI uses are declared here to avoid conflicts
// Validation- and lab-only IPI uses are documented in validation.h
/// The deferred callback queue interrupt
///
/// This IPI is reserved for use of the async deferred callback mechanism.
/// This IPI is used by both critical and noncritical async handlers to
/// activate the deferred callback mechanism.
#define OCCHW_IRQ_ASYNC_IPI OCCHW_IRQ_IPI4_LO_PRIORITY
#ifndef __ASSEMBLER__
/// This expression recognizes only those IRQ numbers that have named
/// (non-reserved) interrupts in the OCB interrupt controller.
// There are so many invalid interrupts now that it's a slight improvement in
// code size to let the compiler optimize the invalid IRQs to a bit mask for
// the comparison.
#define OCCHW_IRQ_VALID(irq) \
({unsigned __irq = (unsigned)(irq); \
((__irq < OCCHW_IRQS) && \
((OCCHW_IRQ_MASK64(__irq) & \
(OCCHW_IRQ_MASK64(OCCHW_IRQ_RESERVED_31) | \
OCCHW_IRQ_MASK64(OCCHW_IRQ_RESERVED_63))) == 0));})
/// This is a 32-bit mask, with big-endian bit (irq % 32) set.
#define OCCHW_IRQ_MASK32(irq) (((uint32_t)0x80000000) >> ((irq) % 32))
/// This is a 64-bit mask, with big-endian bit 'irq' set.
#define OCCHW_IRQ_MASK64(irq) (0x8000000000000000ull >> (irq))
#else
//assembler version of OCCHW_IRQ_MASK32
#define OCCHW_IRQ_MASK32(irq) ((0x80000000) >> ((irq) % 32))
#endif /* __ASSEMBLER__ */
#ifndef __ASSEMBLER__
// These macros select OCB interrupt controller registers based on the IRQ
// number.
#define OCCHW_OIMR_CLR(irq) (((irq) & 0x20) ? OCB_OIMR1_CLR : OCB_OIMR0_CLR)
#define OCCHW_OIMR_OR(irq) (((irq) & 0x20) ? OCB_OIMR1_OR : OCB_OIMR0_OR)
#define OCCHW_OISR(irq) (((irq) & 0x20) ? OCB_OISR1 : OCB_OISR0)
#define OCCHW_OISR_CLR(irq) (((irq) & 0x20) ? OCB_OISR1_CLR : OCB_OISR0_CLR)
#define OCCHW_OISR_OR(irq) (((irq) & 0x20) ? OCB_OISR1_OR : OCB_OISR0_OR)
#define OCCHW_OIEPR(irq) (((irq) & 0x20) ? OCB_OIEPR1 : OCB_OIEPR0)
#define OCCHW_OIEPR_OR(irq) (((irq) & 0x20) ? OCB_OIEPR1_OR : OCB_OIEPR0_OR)
#define OCCHW_OIEPR_CLR(irq) (((irq) & 0x20) ? OCB_OIEPR1_CLR : OCB_OIEPR0_CLR)
#define OCCHW_OITR(irq) (((irq) & 0x20) ? OCB_OITR1 : OCB_OITR0)
#define OCCHW_OITR_OR(irq) (((irq) & 0x20) ? OCB_OITR1_OR : OCB_OITR0_OR)
#define OCCHW_OITR_CLR(irq) (((irq) & 0x20) ? OCB_OITR1_CLR : OCB_OITR0_CLR)
#define OCCHW_OIRRA(irq) (((irq) & 0x20) ? OCB_OIRR1A : OCB_OIRR0A)
#define OCCHW_OIRRA_OR(irq) (((irq) & 0x20) ? OCB_OIRR1A_OR : OCB_OIRR0A_OR)
#define OCCHW_OIRRA_CLR(irq) (((irq) & 0x20) ? OCB_OIRR1A_CLR : OCB_OIRR0A_CLR)
#define OCCHW_OIRRB(irq) (((irq) & 0x20) ? OCB_OIRR1B : OCB_OIRR0B)
#define OCCHW_OIRRB_OR(irq) (((irq) & 0x20) ? OCB_OIRR1B_OR : OCB_OIRR0B_OR)
#define OCCHW_OIRRB_CLR(irq) (((irq) & 0x20) ? OCB_OIRR1B_CLR : OCB_OIRR0B_CLR)
#define OCCHW_OIRRC(irq) (((irq) & 0x20) ? OCB_OIRR1C : OCB_OIRR0C)
#define OCCHW_OIRRC_OR(irq) (((irq) & 0x20) ? OCB_OIRR1C_OR : OCB_OIRR0C_OR)
#define OCCHW_OIRRC_CLR(irq) (((irq) & 0x20) ? OCB_OIRR1C_CLR : OCB_OIRR0C_CLR)
#endif /* __ASSEMBLER__ */
#endif /* __OCCHW_INTERRUPTS_H__ */
|