7a8c8234bd92ec4a1011a575254728fd199553de
[dragonfly.git] / sys / i386 / include / apic.h
1 /*
2  * Copyright (c) 1996, by Peter Wemm and Steve Passe, All rights reserved.
3  * Copyright (c) 2003, by Matthew Dillon, All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. The name of the developer may NOT be used to endorse or promote products
11  *    derived from this software without specific prior written permission.
12  *
13  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23  * SUCH DAMAGE.
24  *
25  * $FreeBSD: src/sys/i386/include/apic.h,v 1.14.2.2 2003/03/21 21:46:15 jhb Exp $
26  * $DragonFly: src/sys/i386/include/Attic/apic.h,v 1.3 2003/07/06 21:23:49 dillon Exp $
27  */
28
29 #ifndef _MACHINE_APIC_H_
30 #define _MACHINE_APIC_H_
31
32 /*
33  * Local && I/O APIC definitions for Pentium P54C+ Built-in APIC.
34  *
35  * A per-cpu APIC resides in memory location 0xFEE00000.
36  *
37  *                31 ... 24   23 ... 16   15 ... 8     7 ... 0
38  *              +-----------+-----------+-----------+-----------+
39  * 0000         |           |           |           |           |
40  * 0010         |           |           |           |           |
41  *              +-----------+-----------+-----------+-----------+
42  *
43  *              +-----------+-----------+-----------+-----------+
44  * 0020 ID      |     | ID  |           |           |           | RW
45  *              +-----------+-----------+-----------+-----------+
46  *
47  *                  The physical APIC ID is used with physical interrupt
48  *                  delivery modes.
49  *
50  *              +-----------+-----------+-----------+-----------+
51  * 0030 VER     |           |           |           |           |
52  *              +-----------+-----------+-----------+-----------+
53  * 0040         |           |           |           |           |
54  * 0050         |           |           |           |           |
55  * 0060         |           |           |           |           |
56  * 0070         |           |           |           |           |
57  *              +-----------+-----------+-----------+-----------+
58  * 0080 TPR     |           |           |           | PRIO SUBC |
59  * 0090 APR     |           |           |           |           |
60  * 00A0 PPR     |           |           |           |           |
61  *              +-----------+-----------+-----------+-----------+
62  *
63  *                  The Task Priority Register provides a priority threshold
64  *                  mechanism for interrupting the processor.  Only interrupts
65  *                  with a higher priority then that specified in the TPR will
66  *                  be served.   Other interrupts are recorded and serviced
67  *                  as soon as the TPR value decreases enough to allow that
68  *                  (unless EOId by another APIC).
69  *
70  *                  PRIO (7:4).  Main priority.  If 15 the APIC will not
71  *                               accept any interrupts.
72  *                  SUBC (3:0)   Sub priority.  See APR/PPR.
73  *
74  *
75  *                  The Processor Priority Register determines whether a
76  *                  pending interrupt can be dispensed to the processor.  ISRV
77  *                  Is the vector of the highest priority ISR bit set or
78  *                  zero if no ISR bit is set.
79  *
80  *                  IF TPR[7:4] >= ISRV[7:4]
81  *                      PPR[7:0] = TPR[7:0]
82  *                  ELSE
83  *                      PPR[7:0] = ISRV[7:4].000
84  *                      
85  *                  The Arbitration Priority Register holds the current
86  *                  lowest priority of the procsesor, a value used during
87  *                  lowest-priority arbitration.
88  *
89  *                  IF (TPR[7:4] >= IRRV[7:4] AND TPR[7:4] > ISRV[7:4])
90  *                      APR[7:0] = TPR[7:0]
91  *                  ELSE
92  *                      APR[7:4] = max((TPR[7:4]&ISRV[7:4]),IRRV[7:4]).000
93  *                  
94  *              +-----------+-----------+-----------+-----------+
95  * 00B0 EOI     |           |           |           |           |
96  *              +-----------+-----------+-----------+-----------+
97  * 00C0         |           |           |           |           |
98  *              +-----------+-----------+-----------+-----------+
99  * 00D0 LDR     |LOG APICID |           |           |           |
100  *              +-----------+-----------+-----------+-----------+
101  * 00E0 DFR     |MODEL|     |           |           |           |
102  *              +-----------+-----------+-----------+-----------+
103  *
104  *                  The logical APIC ID is used with logical interrupt
105  *                  delivery modes.  Interpretation of logical destination
106  *                  information depends on the MODEL bits in the Destination
107  *                  Format Regiuster.  
108  *
109  *                  MODEL=1111 FLAT MODEL - The MDA is interpreted as
110  *                                          a decoded address.  By setting
111  *                                          one bit in the LDR for each
112  *                                          local apic 8 APICs can coexist.
113  *
114  *                  MODEL=0000 CLUSTER MODEL - 
115  *
116  *                31 ... 24   23 ... 16   15 ... 8     7 ... 0
117  *              +-----------+-----------+-----------+-----------+
118  * 00F0 SVR     |           |           |           |           |
119  *              +-----------+-----------+-----------+-----------+
120  * 0100-0170 ISR|           |           |           |           |
121  * 0180-01F0 TMR|           |           |           |           |
122  * 0200-0270 IRR|           |           |           |           |
123  *              +-----------+-----------+-----------+-----------+
124  *
125  *                  These registers represent 256 bits, one bit for each
126  *                  possible interrupt.  Interrupts 0-15 are reserved so
127  *                  bits 0-15 are also reserved.
128  *
129  *                  TMR - Trigger mode register.  Upon acceptance of an int
130  *                        the corresponding bit is cleared for edge-trig and
131  *                        set for level-trig.  If the TMR bit is set (level),
132  *                        the local APIC sends an EOI to all I/O APICs as
133  *                        a result of software issuing an EOI command.
134  *                        
135  *                  IRR - Interrupt Request Register.  Contains active
136  *                        interrupt requests that have been accepted but not
137  *                        yet dispensed by the current local APIC.  The bit is
138  *                        cleared and the corresponding ISR bit is set when
139  *                        the INTA cycle is issued.
140  *
141  *                  ISR - Interrupt In-Service register.  Interrupt has been
142  *                        delivered but not yet fully serviced.  Cleared when
143  *                        an EOI is issued from the processor.  An EOI will
144  *                        also send an EOI to all I/O APICs if TMR was set.
145  *
146  *              +-----------+-----------+-----------+-----------+
147  * 0280 ESR     |           |           |           |           |
148  * 0290-02F0    |           |           |           |           |
149  *              +--FEDCBA98-+--76543210-+--FEDCBA98-+-----------+
150  * 0300 ICR_LO  |           |      XX   |  TL SDMMM | vector    |
151  * 0310 ICR_HI  | DEST FIELD|           |           |           |
152  *              +-----------+-----------+-----------+-----------+
153  *
154  *                  The interrupt command register 
155  *
156  *                      XX:     Destination Shorthand field:
157  *
158  *                              00      Use Destination field
159  *                              01      Self only.  Dest field ignored.
160  *                              10      All including self (uses a 
161  *                                      destination field of 0x0F)
162  *                              11      All excluding self (uses a
163  *                                      destination field of 0x0F)
164  *
165  *                      T:      1 = Level 0 = Edge Trigger modde, used for
166  *                              the INIT level de-assert delivery mode only.
167  *                              Not sure.
168  *
169  *                      L:      0 = De-Assert, 1 = Assert.  Not sure what this
170  *                              is.  For INIT mode use 0, for all other modes
171  *                              use 1.
172  *
173  *                      S:      1 = Send Pending.  Interrupt has been injected
174  *                              but APIC has not yet accepted it.
175  *
176  *                      D:      0=physical 1=logical.  In physical mode
177  *                              only 24-27 of DEST FIELD is used from ICR_HI.
178  *
179  *                      MMM:    000 Fixed. Deliver to all processors according
180  *                                  to the ICR.  Always treated as edge trig.
181  *
182  *                              001 Lowest Priority.  Deliver to just the
183  *                                  processor running at the lowest priority.
184  *
185  *                              010 SMI.  The vector must be 00B.  Only edge
186  *                                  triggered is allowed.  The vector field
187  *                                  must be programmed to zero (huh?).
188  *
189  *                              011 <reserved>
190  *
191  *                              100 NMI.  Deliver as an NMI to all processors
192  *                                  listed in the destination field.  The
193  *                                  vector is ignored.  Alawys treated as 
194  *                                  edge triggered.
195  *
196  *                              101 INIT.  Deliver as an INIT signal to all
197  *                                  processors (like FIXED).  Vector is ignored
198  *                                  and it is always edge-triggered.
199  *
200  *                              110 Start Up.  Sends a special message between
201  *                                  cpus.  the vector contains a start-up
202  *                                  address for MP boot protocol.
203  *                                  Always edge triggered.  Note: a startup
204  *                                  int is not automatically tried in case of
205  *                                  failure.
206  *
207  *                              111 <reserved>
208  *
209  *              +-----------+--------10-+--FEDCBA98-+-----------+
210  * 0320 LTIMER  |           |        TM |  ---S---- | vector    |
211  * 0330         |           |           |           |           |
212  *              +-----------+--------10-+--FEDCBA98-+-----------+
213  * 0340 LVPCINT |           |        -M |  ---S-MMM | vector    |
214  * 0350 LVINT0  |           |        -M |  LRPS-MMM | vector    |
215  * 0360 LVINT1  |           |        -M |  LRPS-MMM | vector    |
216  * 0370 LVERROR |           |        -M |  -------- | vector    |
217  *              +-----------+-----------+-----------+-----------+
218  *
219  *                      T:      1 = periodic, 0 = one-shot
220  *
221  *                      M:      1 = masked
222  *
223  *                      L:      1 = level, 0 = edge
224  *
225  *                      R:      For level triggered only, set to 1 when a
226  *                              level int is accepted, cleared by EOI.
227  *
228  *                      P:      Pin Polarity 0 = Active High, 1 = Active Low
229  *
230  *                      S:      1 = Send Pending.  Interrupt has been injected
231  *                              but APIC has not yet accepted it.
232  *
233  *                      MMM     000 = Fixed     deliver to cpu according to LVT
234  *
235  *                      MMM     100 = NMI       deliver as an NMI.  Always edge
236  *
237  *                      MMM     111 = ExtInt    deliver from 8259, routes INTA
238  *                                              bus cycle to external
239  *                                              controller.  Controller is 
240  *                                              expected to supply vector.
241  *                                              Always level.
242  *
243  *              +-----------+-----------+-----------+-----------+
244  * 0380 ICR     |           |           |           |           |
245  * 0390 CCR     |           |           |           |           |
246  * 03A0         |           |           |           |           |
247  * 03B0         |           |           |           |           |
248  * 03C0         |           |           |           |           |
249  * 03D0         |           |           |           |           |
250  * 03E0 DCR     |           |           |           |           |
251  *              +-----------+-----------+-----------+-----------+
252  *
253  *
254  *      NOTE ON EOI: Upon receiving an EOI the APIC clears the highest priority
255  *      interrupt in the ISR and selects the next highest priority interrupt
256  *      for posting to the CPU.  If the interrupt being EOId was level
257  *      triggered the APIC will send an EOI to all I/O APICs.  For the moment
258  *      you can write garbage to the EOI register but for future compatibility
259  *      0 should be written.
260  *
261  */
262
263 #ifndef LOCORE
264 #include <sys/types.h>
265
266 #define PAD3    int : 32; int : 32; int : 32
267 #define PAD4    int : 32; int : 32; int : 32; int : 32
268
269 struct LAPIC {
270         /* reserved */          PAD4;
271         /* reserved */          PAD4;
272         u_int32_t id;           PAD3;   /* 0020 R/W */
273         u_int32_t version;      PAD3;   /* 0030 RO */
274         /* reserved */          PAD4;
275         /* reserved */          PAD4;
276         /* reserved */          PAD4;
277         /* reserved */          PAD4;
278         u_int32_t tpr;          PAD3;
279         u_int32_t apr;          PAD3;
280         u_int32_t ppr;          PAD3;
281         u_int32_t eoi;          PAD3;
282         /* reserved */          PAD4;
283         u_int32_t ldr;          PAD3;
284         u_int32_t dfr;          PAD3;
285         u_int32_t svr;          PAD3;
286         u_int32_t isr0;         PAD3;
287         u_int32_t isr1;         PAD3;
288         u_int32_t isr2;         PAD3;
289         u_int32_t isr3;         PAD3;
290         u_int32_t isr4;         PAD3;
291         u_int32_t isr5;         PAD3;
292         u_int32_t isr6;         PAD3;
293         u_int32_t isr7;         PAD3;
294         u_int32_t tmr0;         PAD3;
295         u_int32_t tmr1;         PAD3;
296         u_int32_t tmr2;         PAD3;
297         u_int32_t tmr3;         PAD3;
298         u_int32_t tmr4;         PAD3;
299         u_int32_t tmr5;         PAD3;
300         u_int32_t tmr6;         PAD3;
301         u_int32_t tmr7;         PAD3;
302         u_int32_t irr0;         PAD3;
303         u_int32_t irr1;         PAD3;
304         u_int32_t irr2;         PAD3;
305         u_int32_t irr3;         PAD3;
306         u_int32_t irr4;         PAD3;
307         u_int32_t irr5;         PAD3;
308         u_int32_t irr6;         PAD3;
309         u_int32_t irr7;         PAD3;
310         u_int32_t esr;          PAD3;
311         /* reserved */          PAD4;
312         /* reserved */          PAD4;
313         /* reserved */          PAD4;
314         /* reserved */          PAD4;
315         /* reserved */          PAD4;
316         /* reserved */          PAD4;
317         /* reserved */          PAD4;
318         u_int32_t icr_lo;       PAD3;
319         u_int32_t icr_hi;       PAD3;
320         u_int32_t lvt_timer;    PAD3;
321         /* reserved */          PAD4;
322         u_int32_t lvt_pcint;    PAD3;
323         u_int32_t lvt_lint0;    PAD3;
324         u_int32_t lvt_lint1;    PAD3;
325         u_int32_t lvt_error;    PAD3;
326         u_int32_t icr_timer;    PAD3;
327         u_int32_t ccr_timer;    PAD3;
328         /* reserved */          PAD4;
329         /* reserved */          PAD4;
330         /* reserved */          PAD4;
331         /* reserved */          PAD4;
332         u_int32_t dcr_timer;    PAD3;
333         /* reserved */          PAD4;
334 };
335
336 typedef struct LAPIC lapic_t;
337
338 /******************************************************************************
339  * I/O APIC structure
340  */
341
342 struct IOAPIC {
343         u_int32_t ioregsel;     PAD3;
344         u_int32_t iowin;        PAD3;
345 };
346
347 typedef struct IOAPIC ioapic_t;
348
349 #undef PAD4
350 #undef PAD3
351
352 #endif  /* !LOCORE */
353
354
355 /******************************************************************************
356  * various code 'logical' values
357  */
358
359 #ifdef GRAB_LOPRIO
360 #define LOPRIO_LEVEL            0x00000010      /* TPR of CPU accepting INTs */
361 #define ALLHWI_LEVEL            0x00000000      /* TPR of CPU grabbing INTs */
362 #endif /** GRAB_LOPRIO */
363
364 /*
365  * XXX This code assummes that the reserved field of the
366  *      local APIC TPR can be written with all 0s.
367  *     This saves quite a few memory accesses.
368  *     If the silicon ever changes then things will break!
369  *     It affects mplock.s, swtch.s, and possibly other files.
370  */
371 #define CHEAP_TPR
372
373
374 /******************************************************************************
375  * LOCAL APIC defines
376  */
377
378 /* default physical locations of LOCAL (CPU) APICs */
379 #define DEFAULT_APIC_BASE       0xfee00000
380
381 /* fields in VER */
382 #define APIC_VER_VERSION        0x000000ff
383 #define APIC_VER_MAXLVT         0x00ff0000
384 #define MAXLVTSHIFT             16
385
386 /* fields in SVR */
387 #define APIC_SVR_VECTOR         0x000000ff
388 #define APIC_SVR_VEC_PROG       0x000000f0
389 #define APIC_SVR_VEC_FIX        0x0000000f
390 #define APIC_SVR_ENABLE         0x00000100
391 # define APIC_SVR_SWDIS         0x00000000
392 # define APIC_SVR_SWEN          0x00000100
393 #define APIC_SVR_FOCUS          0x00000200
394 # define APIC_SVR_FEN           0x00000000
395 # define APIC_SVR_FDIS          0x00000200
396
397 /* fields in TPR */
398 #define APIC_TPR_PRIO           0x000000ff
399 # define APIC_TPR_INT           0x000000f0
400 # define APIC_TPR_SUB           0x0000000f
401
402
403 /* fields in ICR_LOW */
404 #define APIC_VECTOR_MASK        0x000000ff
405
406 #define APIC_DELMODE_MASK       0x00000700
407 # define APIC_DELMODE_FIXED     0x00000000
408 # define APIC_DELMODE_LOWPRIO   0x00000100
409 # define APIC_DELMODE_SMI       0x00000200
410 # define APIC_DELMODE_RR        0x00000300
411 # define APIC_DELMODE_NMI       0x00000400
412 # define APIC_DELMODE_INIT      0x00000500
413 # define APIC_DELMODE_STARTUP   0x00000600
414 # define APIC_DELMODE_RESV      0x00000700
415
416 #define APIC_DESTMODE_MASK      0x00000800
417 # define APIC_DESTMODE_PHY      0x00000000
418 # define APIC_DESTMODE_LOG      0x00000800
419
420 #define APIC_DELSTAT_MASK       0x00001000
421 # define APIC_DELSTAT_IDLE      0x00000000
422 # define APIC_DELSTAT_PEND      0x00001000
423
424 #define APIC_RESV1_MASK         0x00002000
425
426 #define APIC_LEVEL_MASK         0x00004000
427 # define APIC_LEVEL_DEASSERT    0x00000000
428 # define APIC_LEVEL_ASSERT      0x00004000
429
430 #define APIC_TRIGMOD_MASK       0x00008000
431 # define APIC_TRIGMOD_EDGE      0x00000000
432 # define APIC_TRIGMOD_LEVEL     0x00008000
433
434 #define APIC_RRSTAT_MASK        0x00030000
435 # define APIC_RRSTAT_INVALID    0x00000000
436 # define APIC_RRSTAT_INPROG     0x00010000
437 # define APIC_RRSTAT_VALID      0x00020000
438 # define APIC_RRSTAT_RESV       0x00030000
439
440 #define APIC_DEST_MASK          0x000c0000
441 # define APIC_DEST_DESTFLD      0x00000000
442 # define APIC_DEST_SELF         0x00040000
443 # define APIC_DEST_ALLISELF     0x00080000
444 # define APIC_DEST_ALLESELF     0x000c0000
445
446 #define APIC_RESV2_MASK         0xfff00000
447
448
449 /* fields in ICR_HIGH */
450 #define APIC_ID_MASK            0xff000000
451
452
453 /* fields in LVT1/2 */
454 #define APIC_LVT_VECTOR         0x000000ff
455 #define APIC_LVT_DM             0x00000700
456 # define APIC_LVT_DM_FIXED      0x00000000
457 # define APIC_LVT_DM_NMI        0x00000400
458 # define APIC_LVT_DM_EXTINT     0x00000700
459 #define APIC_LVT_DS             0x00001000
460 #define APIC_LVT_IIPP           0x00002000
461 #define APIC_LVT_IIPP_INTALO    0x00002000
462 #define APIC_LVT_IIPP_INTAHI    0x00000000
463 #define APIC_LVT_RIRR           0x00004000
464 #define APIC_LVT_TM             0x00008000
465 #define APIC_LVT_M              0x00010000
466
467
468 /* fields in LVT Timer */
469 #define APIC_LVTT_VECTOR        0x000000ff
470 #define APIC_LVTT_DS            0x00001000
471 #define APIC_LVTT_M             0x00010000
472 #define APIC_LVTT_TM            0x00020000
473
474
475 /* fields in TDCR */
476 #define APIC_TDCR_2             0x00
477 #define APIC_TDCR_4             0x01
478 #define APIC_TDCR_8             0x02
479 #define APIC_TDCR_16            0x03
480 #define APIC_TDCR_32            0x08
481 #define APIC_TDCR_64            0x09
482 #define APIC_TDCR_128           0x0a
483 #define APIC_TDCR_1             0x0b
484
485
486 /*
487  * fields in IRR
488  * ISA INTerrupts are in bits 16-31 of the 1st IRR register.
489  * these masks DON'T EQUAL the isa IRQs of the same name.
490  */
491 #define APIC_IRQ0               0x00000001
492 #define APIC_IRQ1               0x00000002
493 #define APIC_IRQ2               0x00000004
494 #define APIC_IRQ3               0x00000008
495 #define APIC_IRQ4               0x00000010
496 #define APIC_IRQ5               0x00000020
497 #define APIC_IRQ6               0x00000040
498 #define APIC_IRQ7               0x00000080
499 #define APIC_IRQ8               0x00000100
500 #define APIC_IRQ9               0x00000200
501 #define APIC_IRQ10              0x00000400
502 #define APIC_IRQ11              0x00000800
503 #define APIC_IRQ12              0x00001000
504 #define APIC_IRQ13              0x00002000
505 #define APIC_IRQ14              0x00004000
506 #define APIC_IRQ15              0x00008000
507 #define APIC_IRQ16              0x00010000
508 #define APIC_IRQ17              0x00020000
509 #define APIC_IRQ18              0x00040000
510 #define APIC_IRQ19              0x00080000
511 #define APIC_IRQ20              0x00100000
512 #define APIC_IRQ21              0x00200000
513 #define APIC_IRQ22              0x00400000
514 #define APIC_IRQ23              0x00800000
515
516
517 /******************************************************************************
518  * I/O APIC defines
519  */
520
521 /* default physical locations of an IO APIC */
522 #define DEFAULT_IO_APIC_BASE    0xfec00000
523
524 /* window register offset */
525 #define IOAPIC_WINDOW           0x10
526
527 /* indexes into IO APIC */
528 #define IOAPIC_ID               0x00
529 #define IOAPIC_VER              0x01
530 #define IOAPIC_ARB              0x02
531 #define IOAPIC_REDTBL           0x10
532 #define IOAPIC_REDTBL0          IOAPIC_REDTBL
533 #define IOAPIC_REDTBL1          (IOAPIC_REDTBL+0x02)
534 #define IOAPIC_REDTBL2          (IOAPIC_REDTBL+0x04)
535 #define IOAPIC_REDTBL3          (IOAPIC_REDTBL+0x06)
536 #define IOAPIC_REDTBL4          (IOAPIC_REDTBL+0x08)
537 #define IOAPIC_REDTBL5          (IOAPIC_REDTBL+0x0a)
538 #define IOAPIC_REDTBL6          (IOAPIC_REDTBL+0x0c)
539 #define IOAPIC_REDTBL7          (IOAPIC_REDTBL+0x0e)
540 #define IOAPIC_REDTBL8          (IOAPIC_REDTBL+0x10)
541 #define IOAPIC_REDTBL9          (IOAPIC_REDTBL+0x12)
542 #define IOAPIC_REDTBL10         (IOAPIC_REDTBL+0x14)
543 #define IOAPIC_REDTBL11         (IOAPIC_REDTBL+0x16)
544 #define IOAPIC_REDTBL12         (IOAPIC_REDTBL+0x18)
545 #define IOAPIC_REDTBL13         (IOAPIC_REDTBL+0x1a)
546 #define IOAPIC_REDTBL14         (IOAPIC_REDTBL+0x1c)
547 #define IOAPIC_REDTBL15         (IOAPIC_REDTBL+0x1e)
548 #define IOAPIC_REDTBL16         (IOAPIC_REDTBL+0x20)
549 #define IOAPIC_REDTBL17         (IOAPIC_REDTBL+0x22)
550 #define IOAPIC_REDTBL18         (IOAPIC_REDTBL+0x24)
551 #define IOAPIC_REDTBL19         (IOAPIC_REDTBL+0x26)
552 #define IOAPIC_REDTBL20         (IOAPIC_REDTBL+0x28)
553 #define IOAPIC_REDTBL21         (IOAPIC_REDTBL+0x2a)
554 #define IOAPIC_REDTBL22         (IOAPIC_REDTBL+0x2c)
555 #define IOAPIC_REDTBL23         (IOAPIC_REDTBL+0x2e)
556
557 /* fields in VER */
558 #define IOART_VER_VERSION       0x000000ff
559 #define IOART_VER_MAXREDIR      0x00ff0000
560 #define MAXREDIRSHIFT           16
561
562 /*
563  * fields in the IO APIC's redirection table entries
564  */
565 #define IOART_DEST      APIC_ID_MASK    /* broadcast addr: all APICs */
566
567 #define IOART_RESV      0x00fe0000      /* reserved */
568
569 #define IOART_INTMASK   0x00010000      /* R/W: INTerrupt mask */
570 # define IOART_INTMCLR  0x00000000      /*       clear, allow INTs */
571 # define IOART_INTMSET  0x00010000      /*       set, inhibit INTs */
572
573 #define IOART_TRGRMOD   0x00008000      /* R/W: trigger mode */
574 # define IOART_TRGREDG  0x00000000      /*       edge */
575 # define IOART_TRGRLVL  0x00008000      /*       level */
576
577 #define IOART_REM_IRR   0x00004000      /* RO: remote IRR */
578
579 #define IOART_INTPOL    0x00002000      /* R/W: INT input pin polarity */
580 # define IOART_INTAHI   0x00000000      /*      active high */
581 # define IOART_INTALO   0x00002000      /*      active low */
582
583 #define IOART_DELIVS    0x00001000      /* RO: delivery status */
584
585 #define IOART_DESTMOD   0x00000800      /* R/W: destination mode */
586 # define IOART_DESTPHY  0x00000000      /*      physical */
587 # define IOART_DESTLOG  0x00000800      /*      logical */
588
589 #define IOART_DELMOD    0x00000700      /* R/W: delivery mode */
590 # define IOART_DELFIXED 0x00000000      /*       fixed */
591 # define IOART_DELLOPRI 0x00000100      /*       lowest priority */
592 # define IOART_DELSMI   0x00000200      /*       System Management INT */
593 # define IOART_DELRSV1  0x00000300      /*       reserved */
594 # define IOART_DELNMI   0x00000400      /*       NMI signal */
595 # define IOART_DELINIT  0x00000500      /*       INIT signal */
596 # define IOART_DELRSV2  0x00000600      /*       reserved */
597 # define IOART_DELEXINT 0x00000700      /*       External INTerrupt */
598
599 #define IOART_INTVEC    0x000000ff      /* R/W: INTerrupt vector field */
600
601 #endif /* _MACHINE_APIC_H_ */