1 |
/* $MidnightBSD$ */ |
2 |
/*- |
3 |
* Copyright (c) 1996, by Peter Wemm and Steve Passe |
4 |
* All rights reserved. |
5 |
* |
6 |
* Redistribution and use in source and binary forms, with or without |
7 |
* modification, are permitted provided that the following conditions |
8 |
* are met: |
9 |
* 1. Redistributions of source code must retain the above copyright |
10 |
* notice, this list of conditions and the following disclaimer. |
11 |
* 2. The name of the developer may NOT be used to endorse or promote products |
12 |
* derived from this software without specific prior written permission. |
13 |
* |
14 |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND |
15 |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
16 |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
17 |
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE |
18 |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
19 |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
20 |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
21 |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
22 |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
23 |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
24 |
* SUCH DAMAGE. |
25 |
* |
26 |
* $FreeBSD: src/sys/i386/include/apicreg.h,v 1.28 2005/01/06 22:18:15 imp Exp $ |
27 |
*/ |
28 |
|
29 |
#ifndef _MACHINE_APICREG_H_ |
30 |
#define _MACHINE_APICREG_H_ |
31 |
|
32 |
/* |
33 |
* Local && I/O APIC definitions. |
34 |
*/ |
35 |
|
36 |
/* |
37 |
* Pentium P54C+ Built-in APIC |
38 |
* (Advanced programmable Interrupt Controller) |
39 |
* |
40 |
* Base Address of Built-in APIC in memory location |
41 |
* is 0xfee00000. |
42 |
* |
43 |
* Map of APIC Registers: |
44 |
* |
45 |
* Offset (hex) Description Read/Write state |
46 |
* 000 Reserved |
47 |
* 010 Reserved |
48 |
* 020 ID Local APIC ID R/W |
49 |
* 030 VER Local APIC Version R |
50 |
* 040 Reserved |
51 |
* 050 Reserved |
52 |
* 060 Reserved |
53 |
* 070 Reserved |
54 |
* 080 Task Priority Register R/W |
55 |
* 090 Arbitration Priority Register R |
56 |
* 0A0 Processor Priority Register R |
57 |
* 0B0 EOI Register W |
58 |
* 0C0 RRR Remote read R |
59 |
* 0D0 Logical Destination R/W |
60 |
* 0E0 Destination Format Register 0..27 R; 28..31 R/W |
61 |
* 0F0 SVR Spurious Interrupt Vector Reg. 0..3 R; 4..9 R/W |
62 |
* 100 ISR 000-031 R |
63 |
* 110 ISR 032-063 R |
64 |
* 120 ISR 064-095 R |
65 |
* 130 ISR 095-128 R |
66 |
* 140 ISR 128-159 R |
67 |
* 150 ISR 160-191 R |
68 |
* 160 ISR 192-223 R |
69 |
* 170 ISR 224-255 R |
70 |
* 180 TMR 000-031 R |
71 |
* 190 TMR 032-063 R |
72 |
* 1A0 TMR 064-095 R |
73 |
* 1B0 TMR 095-128 R |
74 |
* 1C0 TMR 128-159 R |
75 |
* 1D0 TMR 160-191 R |
76 |
* 1E0 TMR 192-223 R |
77 |
* 1F0 TMR 224-255 R |
78 |
* 200 IRR 000-031 R |
79 |
* 210 IRR 032-063 R |
80 |
* 220 IRR 064-095 R |
81 |
* 230 IRR 095-128 R |
82 |
* 240 IRR 128-159 R |
83 |
* 250 IRR 160-191 R |
84 |
* 260 IRR 192-223 R |
85 |
* 270 IRR 224-255 R |
86 |
* 280 Error Status Register R |
87 |
* 290 Reserved |
88 |
* 2A0 Reserved |
89 |
* 2B0 Reserved |
90 |
* 2C0 Reserved |
91 |
* 2D0 Reserved |
92 |
* 2E0 Reserved |
93 |
* 2F0 Reserved |
94 |
* 300 ICR_LOW Interrupt Command Reg. (0-31) R/W |
95 |
* 310 ICR_HI Interrupt Command Reg. (32-63) R/W |
96 |
* 320 Local Vector Table (Timer) R/W |
97 |
* 330 Local Vector Table (Thermal) R/W (PIV+) |
98 |
* 340 Local Vector Table (Performance) R/W (P6+) |
99 |
* 350 LVT1 Local Vector Table (LINT0) R/W |
100 |
* 360 LVT2 Local Vector Table (LINT1) R/W |
101 |
* 370 LVT3 Local Vector Table (ERROR) R/W |
102 |
* 380 Initial Count Reg. for Timer R/W |
103 |
* 390 Current Count of Timer R |
104 |
* 3A0 Reserved |
105 |
* 3B0 Reserved |
106 |
* 3C0 Reserved |
107 |
* 3D0 Reserved |
108 |
* 3E0 Timer Divide Configuration Reg. R/W |
109 |
* 3F0 Reserved |
110 |
*/ |
111 |
|
112 |
|
113 |
/****************************************************************************** |
114 |
* global defines, etc. |
115 |
*/ |
116 |
|
117 |
|
118 |
/****************************************************************************** |
119 |
* LOCAL APIC structure |
120 |
*/ |
121 |
|
122 |
#ifndef LOCORE |
123 |
#include <sys/types.h> |
124 |
|
125 |
#define PAD3 int : 32; int : 32; int : 32 |
126 |
#define PAD4 int : 32; int : 32; int : 32; int : 32 |
127 |
|
128 |
struct LAPIC { |
129 |
/* reserved */ PAD4; |
130 |
/* reserved */ PAD4; |
131 |
u_int32_t id; PAD3; |
132 |
u_int32_t version; PAD3; |
133 |
/* reserved */ PAD4; |
134 |
/* reserved */ PAD4; |
135 |
/* reserved */ PAD4; |
136 |
/* reserved */ PAD4; |
137 |
u_int32_t tpr; PAD3; |
138 |
u_int32_t apr; PAD3; |
139 |
u_int32_t ppr; PAD3; |
140 |
u_int32_t eoi; PAD3; |
141 |
/* reserved */ PAD4; |
142 |
u_int32_t ldr; PAD3; |
143 |
u_int32_t dfr; PAD3; |
144 |
u_int32_t svr; PAD3; |
145 |
u_int32_t isr0; PAD3; |
146 |
u_int32_t isr1; PAD3; |
147 |
u_int32_t isr2; PAD3; |
148 |
u_int32_t isr3; PAD3; |
149 |
u_int32_t isr4; PAD3; |
150 |
u_int32_t isr5; PAD3; |
151 |
u_int32_t isr6; PAD3; |
152 |
u_int32_t isr7; PAD3; |
153 |
u_int32_t tmr0; PAD3; |
154 |
u_int32_t tmr1; PAD3; |
155 |
u_int32_t tmr2; PAD3; |
156 |
u_int32_t tmr3; PAD3; |
157 |
u_int32_t tmr4; PAD3; |
158 |
u_int32_t tmr5; PAD3; |
159 |
u_int32_t tmr6; PAD3; |
160 |
u_int32_t tmr7; PAD3; |
161 |
u_int32_t irr0; PAD3; |
162 |
u_int32_t irr1; PAD3; |
163 |
u_int32_t irr2; PAD3; |
164 |
u_int32_t irr3; PAD3; |
165 |
u_int32_t irr4; PAD3; |
166 |
u_int32_t irr5; PAD3; |
167 |
u_int32_t irr6; PAD3; |
168 |
u_int32_t irr7; PAD3; |
169 |
u_int32_t esr; PAD3; |
170 |
/* reserved */ PAD4; |
171 |
/* reserved */ PAD4; |
172 |
/* reserved */ PAD4; |
173 |
/* reserved */ PAD4; |
174 |
/* reserved */ PAD4; |
175 |
/* reserved */ PAD4; |
176 |
/* reserved */ PAD4; |
177 |
u_int32_t icr_lo; PAD3; |
178 |
u_int32_t icr_hi; PAD3; |
179 |
u_int32_t lvt_timer; PAD3; |
180 |
u_int32_t lvt_thermal; PAD3; |
181 |
u_int32_t lvt_pcint; PAD3; |
182 |
u_int32_t lvt_lint0; PAD3; |
183 |
u_int32_t lvt_lint1; PAD3; |
184 |
u_int32_t lvt_error; PAD3; |
185 |
u_int32_t icr_timer; PAD3; |
186 |
u_int32_t ccr_timer; PAD3; |
187 |
/* reserved */ PAD4; |
188 |
/* reserved */ PAD4; |
189 |
/* reserved */ PAD4; |
190 |
/* reserved */ PAD4; |
191 |
u_int32_t dcr_timer; PAD3; |
192 |
/* reserved */ PAD4; |
193 |
}; |
194 |
|
195 |
typedef struct LAPIC lapic_t; |
196 |
|
197 |
/****************************************************************************** |
198 |
* I/O APIC structure |
199 |
*/ |
200 |
|
201 |
struct IOAPIC { |
202 |
u_int32_t ioregsel; PAD3; |
203 |
u_int32_t iowin; PAD3; |
204 |
}; |
205 |
|
206 |
typedef struct IOAPIC ioapic_t; |
207 |
|
208 |
#undef PAD4 |
209 |
#undef PAD3 |
210 |
|
211 |
#endif /* !LOCORE */ |
212 |
|
213 |
|
214 |
/****************************************************************************** |
215 |
* various code 'logical' values |
216 |
*/ |
217 |
|
218 |
/****************************************************************************** |
219 |
* LOCAL APIC defines |
220 |
*/ |
221 |
|
222 |
/* default physical locations of LOCAL (CPU) APICs */ |
223 |
#define DEFAULT_APIC_BASE 0xfee00000 |
224 |
|
225 |
/* constants relating to APIC ID registers */ |
226 |
#define APIC_ID_MASK 0xff000000 |
227 |
#define APIC_ID_SHIFT 24 |
228 |
#define APIC_ID_CLUSTER 0xf0 |
229 |
#define APIC_ID_CLUSTER_ID 0x0f |
230 |
#define APIC_MAX_CLUSTER 0xe |
231 |
#define APIC_MAX_INTRACLUSTER_ID 3 |
232 |
#define APIC_ID_CLUSTER_SHIFT 4 |
233 |
|
234 |
/* fields in VER */ |
235 |
#define APIC_VER_VERSION 0x000000ff |
236 |
#define APIC_VER_MAXLVT 0x00ff0000 |
237 |
#define MAXLVTSHIFT 16 |
238 |
|
239 |
/* fields in LDR */ |
240 |
#define APIC_LDR_RESERVED 0x00ffffff |
241 |
|
242 |
/* fields in DFR */ |
243 |
#define APIC_DFR_RESERVED 0x0fffffff |
244 |
#define APIC_DFR_MODEL_MASK 0xf0000000 |
245 |
#define APIC_DFR_MODEL_FLAT 0xf0000000 |
246 |
#define APIC_DFR_MODEL_CLUSTER 0x00000000 |
247 |
|
248 |
/* fields in SVR */ |
249 |
#define APIC_SVR_VECTOR 0x000000ff |
250 |
#define APIC_SVR_VEC_PROG 0x000000f0 |
251 |
#define APIC_SVR_VEC_FIX 0x0000000f |
252 |
#define APIC_SVR_ENABLE 0x00000100 |
253 |
# define APIC_SVR_SWDIS 0x00000000 |
254 |
# define APIC_SVR_SWEN 0x00000100 |
255 |
#define APIC_SVR_FOCUS 0x00000200 |
256 |
# define APIC_SVR_FEN 0x00000000 |
257 |
# define APIC_SVR_FDIS 0x00000200 |
258 |
|
259 |
/* fields in TPR */ |
260 |
#define APIC_TPR_PRIO 0x000000ff |
261 |
# define APIC_TPR_INT 0x000000f0 |
262 |
# define APIC_TPR_SUB 0x0000000f |
263 |
|
264 |
|
265 |
/* fields in ICR_LOW */ |
266 |
#define APIC_VECTOR_MASK 0x000000ff |
267 |
|
268 |
#define APIC_DELMODE_MASK 0x00000700 |
269 |
# define APIC_DELMODE_FIXED 0x00000000 |
270 |
# define APIC_DELMODE_LOWPRIO 0x00000100 |
271 |
# define APIC_DELMODE_SMI 0x00000200 |
272 |
# define APIC_DELMODE_RR 0x00000300 |
273 |
# define APIC_DELMODE_NMI 0x00000400 |
274 |
# define APIC_DELMODE_INIT 0x00000500 |
275 |
# define APIC_DELMODE_STARTUP 0x00000600 |
276 |
# define APIC_DELMODE_RESV 0x00000700 |
277 |
|
278 |
#define APIC_DESTMODE_MASK 0x00000800 |
279 |
# define APIC_DESTMODE_PHY 0x00000000 |
280 |
# define APIC_DESTMODE_LOG 0x00000800 |
281 |
|
282 |
#define APIC_DELSTAT_MASK 0x00001000 |
283 |
# define APIC_DELSTAT_IDLE 0x00000000 |
284 |
# define APIC_DELSTAT_PEND 0x00001000 |
285 |
|
286 |
#define APIC_RESV1_MASK 0x00002000 |
287 |
|
288 |
#define APIC_LEVEL_MASK 0x00004000 |
289 |
# define APIC_LEVEL_DEASSERT 0x00000000 |
290 |
# define APIC_LEVEL_ASSERT 0x00004000 |
291 |
|
292 |
#define APIC_TRIGMOD_MASK 0x00008000 |
293 |
# define APIC_TRIGMOD_EDGE 0x00000000 |
294 |
# define APIC_TRIGMOD_LEVEL 0x00008000 |
295 |
|
296 |
#define APIC_RRSTAT_MASK 0x00030000 |
297 |
# define APIC_RRSTAT_INVALID 0x00000000 |
298 |
# define APIC_RRSTAT_INPROG 0x00010000 |
299 |
# define APIC_RRSTAT_VALID 0x00020000 |
300 |
# define APIC_RRSTAT_RESV 0x00030000 |
301 |
|
302 |
#define APIC_DEST_MASK 0x000c0000 |
303 |
# define APIC_DEST_DESTFLD 0x00000000 |
304 |
# define APIC_DEST_SELF 0x00040000 |
305 |
# define APIC_DEST_ALLISELF 0x00080000 |
306 |
# define APIC_DEST_ALLESELF 0x000c0000 |
307 |
|
308 |
#define APIC_RESV2_MASK 0xfff00000 |
309 |
|
310 |
#define APIC_ICRLO_RESV_MASK (APIC_RESV1_MASK | APIC_RESV2_MASK) |
311 |
|
312 |
/* fields in LVT1/2 */ |
313 |
#define APIC_LVT_VECTOR 0x000000ff |
314 |
#define APIC_LVT_DM 0x00000700 |
315 |
# define APIC_LVT_DM_FIXED 0x00000000 |
316 |
# define APIC_LVT_DM_SMI 0x00000200 |
317 |
# define APIC_LVT_DM_NMI 0x00000400 |
318 |
# define APIC_LVT_DM_INIT 0x00000500 |
319 |
# define APIC_LVT_DM_EXTINT 0x00000700 |
320 |
#define APIC_LVT_DS 0x00001000 |
321 |
#define APIC_LVT_IIPP 0x00002000 |
322 |
#define APIC_LVT_IIPP_INTALO 0x00002000 |
323 |
#define APIC_LVT_IIPP_INTAHI 0x00000000 |
324 |
#define APIC_LVT_RIRR 0x00004000 |
325 |
#define APIC_LVT_TM 0x00008000 |
326 |
#define APIC_LVT_M 0x00010000 |
327 |
|
328 |
|
329 |
/* fields in LVT Timer */ |
330 |
#define APIC_LVTT_VECTOR 0x000000ff |
331 |
#define APIC_LVTT_DS 0x00001000 |
332 |
#define APIC_LVTT_M 0x00010000 |
333 |
#define APIC_LVTT_TM 0x00020000 |
334 |
# define APIC_LVTT_TM_ONE_SHOT 0x00000000 |
335 |
# define APIC_LVTT_TM_PERIODIC 0x00020000 |
336 |
|
337 |
|
338 |
/* APIC timer current count */ |
339 |
#define APIC_TIMER_MAX_COUNT 0xffffffff |
340 |
|
341 |
/* fields in TDCR */ |
342 |
#define APIC_TDCR_2 0x00 |
343 |
#define APIC_TDCR_4 0x01 |
344 |
#define APIC_TDCR_8 0x02 |
345 |
#define APIC_TDCR_16 0x03 |
346 |
#define APIC_TDCR_32 0x08 |
347 |
#define APIC_TDCR_64 0x09 |
348 |
#define APIC_TDCR_128 0x0a |
349 |
#define APIC_TDCR_1 0x0b |
350 |
|
351 |
/****************************************************************************** |
352 |
* I/O APIC defines |
353 |
*/ |
354 |
|
355 |
/* default physical locations of an IO APIC */ |
356 |
#define DEFAULT_IO_APIC_BASE 0xfec00000 |
357 |
|
358 |
/* window register offset */ |
359 |
#define IOAPIC_WINDOW 0x10 |
360 |
|
361 |
/* indexes into IO APIC */ |
362 |
#define IOAPIC_ID 0x00 |
363 |
#define IOAPIC_VER 0x01 |
364 |
#define IOAPIC_ARB 0x02 |
365 |
#define IOAPIC_REDTBL 0x10 |
366 |
#define IOAPIC_REDTBL0 IOAPIC_REDTBL |
367 |
#define IOAPIC_REDTBL1 (IOAPIC_REDTBL+0x02) |
368 |
#define IOAPIC_REDTBL2 (IOAPIC_REDTBL+0x04) |
369 |
#define IOAPIC_REDTBL3 (IOAPIC_REDTBL+0x06) |
370 |
#define IOAPIC_REDTBL4 (IOAPIC_REDTBL+0x08) |
371 |
#define IOAPIC_REDTBL5 (IOAPIC_REDTBL+0x0a) |
372 |
#define IOAPIC_REDTBL6 (IOAPIC_REDTBL+0x0c) |
373 |
#define IOAPIC_REDTBL7 (IOAPIC_REDTBL+0x0e) |
374 |
#define IOAPIC_REDTBL8 (IOAPIC_REDTBL+0x10) |
375 |
#define IOAPIC_REDTBL9 (IOAPIC_REDTBL+0x12) |
376 |
#define IOAPIC_REDTBL10 (IOAPIC_REDTBL+0x14) |
377 |
#define IOAPIC_REDTBL11 (IOAPIC_REDTBL+0x16) |
378 |
#define IOAPIC_REDTBL12 (IOAPIC_REDTBL+0x18) |
379 |
#define IOAPIC_REDTBL13 (IOAPIC_REDTBL+0x1a) |
380 |
#define IOAPIC_REDTBL14 (IOAPIC_REDTBL+0x1c) |
381 |
#define IOAPIC_REDTBL15 (IOAPIC_REDTBL+0x1e) |
382 |
#define IOAPIC_REDTBL16 (IOAPIC_REDTBL+0x20) |
383 |
#define IOAPIC_REDTBL17 (IOAPIC_REDTBL+0x22) |
384 |
#define IOAPIC_REDTBL18 (IOAPIC_REDTBL+0x24) |
385 |
#define IOAPIC_REDTBL19 (IOAPIC_REDTBL+0x26) |
386 |
#define IOAPIC_REDTBL20 (IOAPIC_REDTBL+0x28) |
387 |
#define IOAPIC_REDTBL21 (IOAPIC_REDTBL+0x2a) |
388 |
#define IOAPIC_REDTBL22 (IOAPIC_REDTBL+0x2c) |
389 |
#define IOAPIC_REDTBL23 (IOAPIC_REDTBL+0x2e) |
390 |
|
391 |
/* fields in VER */ |
392 |
#define IOART_VER_VERSION 0x000000ff |
393 |
#define IOART_VER_MAXREDIR 0x00ff0000 |
394 |
#define MAXREDIRSHIFT 16 |
395 |
|
396 |
/* |
397 |
* fields in the IO APIC's redirection table entries |
398 |
*/ |
399 |
#define IOART_DEST APIC_ID_MASK /* broadcast addr: all APICs */ |
400 |
|
401 |
#define IOART_RESV 0x00fe0000 /* reserved */ |
402 |
|
403 |
#define IOART_INTMASK 0x00010000 /* R/W: INTerrupt mask */ |
404 |
# define IOART_INTMCLR 0x00000000 /* clear, allow INTs */ |
405 |
# define IOART_INTMSET 0x00010000 /* set, inhibit INTs */ |
406 |
|
407 |
#define IOART_TRGRMOD 0x00008000 /* R/W: trigger mode */ |
408 |
# define IOART_TRGREDG 0x00000000 /* edge */ |
409 |
# define IOART_TRGRLVL 0x00008000 /* level */ |
410 |
|
411 |
#define IOART_REM_IRR 0x00004000 /* RO: remote IRR */ |
412 |
|
413 |
#define IOART_INTPOL 0x00002000 /* R/W: INT input pin polarity */ |
414 |
# define IOART_INTAHI 0x00000000 /* active high */ |
415 |
# define IOART_INTALO 0x00002000 /* active low */ |
416 |
|
417 |
#define IOART_DELIVS 0x00001000 /* RO: delivery status */ |
418 |
|
419 |
#define IOART_DESTMOD 0x00000800 /* R/W: destination mode */ |
420 |
# define IOART_DESTPHY 0x00000000 /* physical */ |
421 |
# define IOART_DESTLOG 0x00000800 /* logical */ |
422 |
|
423 |
#define IOART_DELMOD 0x00000700 /* R/W: delivery mode */ |
424 |
# define IOART_DELFIXED 0x00000000 /* fixed */ |
425 |
# define IOART_DELLOPRI 0x00000100 /* lowest priority */ |
426 |
# define IOART_DELSMI 0x00000200 /* System Management INT */ |
427 |
# define IOART_DELRSV1 0x00000300 /* reserved */ |
428 |
# define IOART_DELNMI 0x00000400 /* NMI signal */ |
429 |
# define IOART_DELINIT 0x00000500 /* INIT signal */ |
430 |
# define IOART_DELRSV2 0x00000600 /* reserved */ |
431 |
# define IOART_DELEXINT 0x00000700 /* External INTerrupt */ |
432 |
|
433 |
#define IOART_INTVEC 0x000000ff /* R/W: INTerrupt vector field */ |
434 |
|
435 |
#endif /* _MACHINE_APICREG_H_ */ |