Update some copyright notices to become more legal compliant.
[dragonfly.git] / sys / platform / pc32 / apic / apicreg.h
CommitLineData
984263bc 1/*
8a8d5d85 2 * Copyright (c) 1996, by Peter Wemm and Steve Passe, All rights reserved.
033a4603 3 * Copyright (c) 2003 by Matthew Dillon, All rights reserved.
984263bc
MD
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 $
033a4603 26 * $DragonFly: src/sys/platform/pc32/apic/apicreg.h,v 1.2 2004/06/28 02:57:11 drhodus Exp $
984263bc
MD
27 */
28
e126caf1
MD
29#ifndef _MACHINE_APICREG_H_
30#define _MACHINE_APICREG_H_
984263bc
MD
31
32/*
8a8d5d85
MD
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 *
96728c05
MD
154 * The interrupt command register. Generally speaking
155 * writing to ICR_LO initiates a command. All fields
156 * are R/W except the 'S' (delivery status) field, which
157 * is read-only. When
158 *
8a8d5d85
MD
159 *
160 * XX: Destination Shorthand field:
161 *
162 * 00 Use Destination field
163 * 01 Self only. Dest field ignored.
164 * 10 All including self (uses a
165 * destination field of 0x0F)
166 * 11 All excluding self (uses a
167 * destination field of 0x0F)
168 *
169 * T: 1 = Level 0 = Edge Trigger modde, used for
96728c05
MD
170 * the INIT level de-assert delivery mode only
171 * to de-assert a request.
8a8d5d85 172 *
96728c05
MD
173 * L: 0 = De-Assert, 1 = Assert. Always write as
174 * 1 when initiating a new command. Can only
175 * write as 0 for INIT mode de-assertion of
176 * command.
8a8d5d85
MD
177 *
178 * S: 1 = Send Pending. Interrupt has been injected
179 * but APIC has not yet accepted it.
180 *
181 * D: 0=physical 1=logical. In physical mode
182 * only 24-27 of DEST FIELD is used from ICR_HI.
183 *
184 * MMM: 000 Fixed. Deliver to all processors according
185 * to the ICR. Always treated as edge trig.
186 *
187 * 001 Lowest Priority. Deliver to just the
188 * processor running at the lowest priority.
189 *
190 * 010 SMI. The vector must be 00B. Only edge
191 * triggered is allowed. The vector field
192 * must be programmed to zero (huh?).
193 *
194 * 011 <reserved>
195 *
196 * 100 NMI. Deliver as an NMI to all processors
197 * listed in the destination field. The
198 * vector is ignored. Alawys treated as
199 * edge triggered.
200 *
201 * 101 INIT. Deliver as an INIT signal to all
202 * processors (like FIXED). Vector is ignored
203 * and it is always edge-triggered.
204 *
205 * 110 Start Up. Sends a special message between
206 * cpus. the vector contains a start-up
207 * address for MP boot protocol.
208 * Always edge triggered. Note: a startup
209 * int is not automatically tried in case of
210 * failure.
211 *
212 * 111 <reserved>
213 *
214 * +-----------+--------10-+--FEDCBA98-+-----------+
215 * 0320 LTIMER | | TM | ---S---- | vector |
216 * 0330 | | | | |
217 * +-----------+--------10-+--FEDCBA98-+-----------+
218 * 0340 LVPCINT | | -M | ---S-MMM | vector |
219 * 0350 LVINT0 | | -M | LRPS-MMM | vector |
220 * 0360 LVINT1 | | -M | LRPS-MMM | vector |
221 * 0370 LVERROR | | -M | -------- | vector |
222 * +-----------+-----------+-----------+-----------+
223 *
224 * T: 1 = periodic, 0 = one-shot
225 *
226 * M: 1 = masked
227 *
228 * L: 1 = level, 0 = edge
229 *
230 * R: For level triggered only, set to 1 when a
231 * level int is accepted, cleared by EOI.
232 *
233 * P: Pin Polarity 0 = Active High, 1 = Active Low
234 *
235 * S: 1 = Send Pending. Interrupt has been injected
236 * but APIC has not yet accepted it.
237 *
238 * MMM 000 = Fixed deliver to cpu according to LVT
239 *
240 * MMM 100 = NMI deliver as an NMI. Always edge
241 *
242 * MMM 111 = ExtInt deliver from 8259, routes INTA
243 * bus cycle to external
244 * controller. Controller is
245 * expected to supply vector.
246 * Always level.
247 *
248 * +-----------+-----------+-----------+-----------+
96728c05
MD
249 * 0380 TMR_ICR | | | | |
250 * 0390 TMR_CCR | | | | |
8a8d5d85
MD
251 * 03A0 | | | | |
252 * 03B0 | | | | |
253 * 03C0 | | | | |
254 * 03D0 | | | | |
96728c05 255 * 03E0 TMR_DCR | | | | |
8a8d5d85
MD
256 * +-----------+-----------+-----------+-----------+
257 *
96728c05
MD
258 * Timer control and access registers.
259 *
8a8d5d85
MD
260 *
261 * NOTE ON EOI: Upon receiving an EOI the APIC clears the highest priority
262 * interrupt in the ISR and selects the next highest priority interrupt
263 * for posting to the CPU. If the interrupt being EOId was level
264 * triggered the APIC will send an EOI to all I/O APICs. For the moment
265 * you can write garbage to the EOI register but for future compatibility
266 * 0 should be written.
984263bc
MD
267 */
268
269#ifndef LOCORE
270#include <sys/types.h>
271
272#define PAD3 int : 32; int : 32; int : 32
273#define PAD4 int : 32; int : 32; int : 32; int : 32
274
275struct LAPIC {
276 /* reserved */ PAD4;
277 /* reserved */ PAD4;
8a8d5d85
MD
278 u_int32_t id; PAD3; /* 0020 R/W */
279 u_int32_t version; PAD3; /* 0030 RO */
984263bc
MD
280 /* reserved */ PAD4;
281 /* reserved */ PAD4;
282 /* reserved */ PAD4;
283 /* reserved */ PAD4;
284 u_int32_t tpr; PAD3;
285 u_int32_t apr; PAD3;
286 u_int32_t ppr; PAD3;
287 u_int32_t eoi; PAD3;
288 /* reserved */ PAD4;
289 u_int32_t ldr; PAD3;
290 u_int32_t dfr; PAD3;
291 u_int32_t svr; PAD3;
292 u_int32_t isr0; PAD3;
293 u_int32_t isr1; PAD3;
294 u_int32_t isr2; PAD3;
295 u_int32_t isr3; PAD3;
296 u_int32_t isr4; PAD3;
297 u_int32_t isr5; PAD3;
298 u_int32_t isr6; PAD3;
299 u_int32_t isr7; PAD3;
300 u_int32_t tmr0; PAD3;
301 u_int32_t tmr1; PAD3;
302 u_int32_t tmr2; PAD3;
303 u_int32_t tmr3; PAD3;
304 u_int32_t tmr4; PAD3;
305 u_int32_t tmr5; PAD3;
306 u_int32_t tmr6; PAD3;
307 u_int32_t tmr7; PAD3;
308 u_int32_t irr0; PAD3;
309 u_int32_t irr1; PAD3;
310 u_int32_t irr2; PAD3;
311 u_int32_t irr3; PAD3;
312 u_int32_t irr4; PAD3;
313 u_int32_t irr5; PAD3;
314 u_int32_t irr6; PAD3;
315 u_int32_t irr7; PAD3;
316 u_int32_t esr; PAD3;
317 /* reserved */ PAD4;
318 /* reserved */ PAD4;
319 /* reserved */ PAD4;
320 /* reserved */ PAD4;
321 /* reserved */ PAD4;
322 /* reserved */ PAD4;
323 /* reserved */ PAD4;
324 u_int32_t icr_lo; PAD3;
325 u_int32_t icr_hi; PAD3;
326 u_int32_t lvt_timer; PAD3;
327 /* reserved */ PAD4;
328 u_int32_t lvt_pcint; PAD3;
329 u_int32_t lvt_lint0; PAD3;
330 u_int32_t lvt_lint1; PAD3;
331 u_int32_t lvt_error; PAD3;
332 u_int32_t icr_timer; PAD3;
333 u_int32_t ccr_timer; PAD3;
334 /* reserved */ PAD4;
335 /* reserved */ PAD4;
336 /* reserved */ PAD4;
337 /* reserved */ PAD4;
338 u_int32_t dcr_timer; PAD3;
339 /* reserved */ PAD4;
340};
341
342typedef struct LAPIC lapic_t;
343
344/******************************************************************************
345 * I/O APIC structure
346 */
347
348struct IOAPIC {
349 u_int32_t ioregsel; PAD3;
350 u_int32_t iowin; PAD3;
351};
352
353typedef struct IOAPIC ioapic_t;
354
355#undef PAD4
356#undef PAD3
357
358#endif /* !LOCORE */
359
360
361/******************************************************************************
362 * various code 'logical' values
363 */
364
365#ifdef GRAB_LOPRIO
366#define LOPRIO_LEVEL 0x00000010 /* TPR of CPU accepting INTs */
367#define ALLHWI_LEVEL 0x00000000 /* TPR of CPU grabbing INTs */
368#endif /** GRAB_LOPRIO */
369
984263bc
MD
370/*
371 * XXX This code assummes that the reserved field of the
372 * local APIC TPR can be written with all 0s.
373 * This saves quite a few memory accesses.
374 * If the silicon ever changes then things will break!
375 * It affects mplock.s, swtch.s, and possibly other files.
376 */
377#define CHEAP_TPR
378
379
380/******************************************************************************
381 * LOCAL APIC defines
382 */
383
384/* default physical locations of LOCAL (CPU) APICs */
385#define DEFAULT_APIC_BASE 0xfee00000
386
387/* fields in VER */
388#define APIC_VER_VERSION 0x000000ff
389#define APIC_VER_MAXLVT 0x00ff0000
390#define MAXLVTSHIFT 16
391
392/* fields in SVR */
393#define APIC_SVR_VECTOR 0x000000ff
394#define APIC_SVR_VEC_PROG 0x000000f0
395#define APIC_SVR_VEC_FIX 0x0000000f
396#define APIC_SVR_ENABLE 0x00000100
397# define APIC_SVR_SWDIS 0x00000000
398# define APIC_SVR_SWEN 0x00000100
399#define APIC_SVR_FOCUS 0x00000200
400# define APIC_SVR_FEN 0x00000000
401# define APIC_SVR_FDIS 0x00000200
402
403/* fields in TPR */
404#define APIC_TPR_PRIO 0x000000ff
405# define APIC_TPR_INT 0x000000f0
406# define APIC_TPR_SUB 0x0000000f
407
408
409/* fields in ICR_LOW */
410#define APIC_VECTOR_MASK 0x000000ff
411
412#define APIC_DELMODE_MASK 0x00000700
413# define APIC_DELMODE_FIXED 0x00000000
414# define APIC_DELMODE_LOWPRIO 0x00000100
415# define APIC_DELMODE_SMI 0x00000200
416# define APIC_DELMODE_RR 0x00000300
417# define APIC_DELMODE_NMI 0x00000400
418# define APIC_DELMODE_INIT 0x00000500
419# define APIC_DELMODE_STARTUP 0x00000600
420# define APIC_DELMODE_RESV 0x00000700
421
422#define APIC_DESTMODE_MASK 0x00000800
423# define APIC_DESTMODE_PHY 0x00000000
424# define APIC_DESTMODE_LOG 0x00000800
425
426#define APIC_DELSTAT_MASK 0x00001000
427# define APIC_DELSTAT_IDLE 0x00000000
428# define APIC_DELSTAT_PEND 0x00001000
429
430#define APIC_RESV1_MASK 0x00002000
431
432#define APIC_LEVEL_MASK 0x00004000
433# define APIC_LEVEL_DEASSERT 0x00000000
434# define APIC_LEVEL_ASSERT 0x00004000
435
436#define APIC_TRIGMOD_MASK 0x00008000
437# define APIC_TRIGMOD_EDGE 0x00000000
438# define APIC_TRIGMOD_LEVEL 0x00008000
439
440#define APIC_RRSTAT_MASK 0x00030000
441# define APIC_RRSTAT_INVALID 0x00000000
442# define APIC_RRSTAT_INPROG 0x00010000
443# define APIC_RRSTAT_VALID 0x00020000
444# define APIC_RRSTAT_RESV 0x00030000
445
446#define APIC_DEST_MASK 0x000c0000
447# define APIC_DEST_DESTFLD 0x00000000
448# define APIC_DEST_SELF 0x00040000
449# define APIC_DEST_ALLISELF 0x00080000
450# define APIC_DEST_ALLESELF 0x000c0000
451
452#define APIC_RESV2_MASK 0xfff00000
453
454
455/* fields in ICR_HIGH */
456#define APIC_ID_MASK 0xff000000
457
458
459/* fields in LVT1/2 */
460#define APIC_LVT_VECTOR 0x000000ff
461#define APIC_LVT_DM 0x00000700
462# define APIC_LVT_DM_FIXED 0x00000000
463# define APIC_LVT_DM_NMI 0x00000400
464# define APIC_LVT_DM_EXTINT 0x00000700
465#define APIC_LVT_DS 0x00001000
466#define APIC_LVT_IIPP 0x00002000
467#define APIC_LVT_IIPP_INTALO 0x00002000
468#define APIC_LVT_IIPP_INTAHI 0x00000000
469#define APIC_LVT_RIRR 0x00004000
470#define APIC_LVT_TM 0x00008000
471#define APIC_LVT_M 0x00010000
472
473
474/* fields in LVT Timer */
475#define APIC_LVTT_VECTOR 0x000000ff
476#define APIC_LVTT_DS 0x00001000
477#define APIC_LVTT_M 0x00010000
478#define APIC_LVTT_TM 0x00020000
479
480
481/* fields in TDCR */
482#define APIC_TDCR_2 0x00
483#define APIC_TDCR_4 0x01
484#define APIC_TDCR_8 0x02
485#define APIC_TDCR_16 0x03
486#define APIC_TDCR_32 0x08
487#define APIC_TDCR_64 0x09
488#define APIC_TDCR_128 0x0a
489#define APIC_TDCR_1 0x0b
490
491
492/*
493 * fields in IRR
494 * ISA INTerrupts are in bits 16-31 of the 1st IRR register.
495 * these masks DON'T EQUAL the isa IRQs of the same name.
496 */
497#define APIC_IRQ0 0x00000001
498#define APIC_IRQ1 0x00000002
499#define APIC_IRQ2 0x00000004
500#define APIC_IRQ3 0x00000008
501#define APIC_IRQ4 0x00000010
502#define APIC_IRQ5 0x00000020
503#define APIC_IRQ6 0x00000040
504#define APIC_IRQ7 0x00000080
505#define APIC_IRQ8 0x00000100
506#define APIC_IRQ9 0x00000200
507#define APIC_IRQ10 0x00000400
508#define APIC_IRQ11 0x00000800
509#define APIC_IRQ12 0x00001000
510#define APIC_IRQ13 0x00002000
511#define APIC_IRQ14 0x00004000
512#define APIC_IRQ15 0x00008000
513#define APIC_IRQ16 0x00010000
514#define APIC_IRQ17 0x00020000
515#define APIC_IRQ18 0x00040000
516#define APIC_IRQ19 0x00080000
517#define APIC_IRQ20 0x00100000
518#define APIC_IRQ21 0x00200000
519#define APIC_IRQ22 0x00400000
520#define APIC_IRQ23 0x00800000
521
522
523/******************************************************************************
524 * I/O APIC defines
525 */
526
527/* default physical locations of an IO APIC */
528#define DEFAULT_IO_APIC_BASE 0xfec00000
529
530/* window register offset */
531#define IOAPIC_WINDOW 0x10
532
533/* indexes into IO APIC */
534#define IOAPIC_ID 0x00
535#define IOAPIC_VER 0x01
536#define IOAPIC_ARB 0x02
537#define IOAPIC_REDTBL 0x10
538#define IOAPIC_REDTBL0 IOAPIC_REDTBL
539#define IOAPIC_REDTBL1 (IOAPIC_REDTBL+0x02)
540#define IOAPIC_REDTBL2 (IOAPIC_REDTBL+0x04)
541#define IOAPIC_REDTBL3 (IOAPIC_REDTBL+0x06)
542#define IOAPIC_REDTBL4 (IOAPIC_REDTBL+0x08)
543#define IOAPIC_REDTBL5 (IOAPIC_REDTBL+0x0a)
544#define IOAPIC_REDTBL6 (IOAPIC_REDTBL+0x0c)
545#define IOAPIC_REDTBL7 (IOAPIC_REDTBL+0x0e)
546#define IOAPIC_REDTBL8 (IOAPIC_REDTBL+0x10)
547#define IOAPIC_REDTBL9 (IOAPIC_REDTBL+0x12)
548#define IOAPIC_REDTBL10 (IOAPIC_REDTBL+0x14)
549#define IOAPIC_REDTBL11 (IOAPIC_REDTBL+0x16)
550#define IOAPIC_REDTBL12 (IOAPIC_REDTBL+0x18)
551#define IOAPIC_REDTBL13 (IOAPIC_REDTBL+0x1a)
552#define IOAPIC_REDTBL14 (IOAPIC_REDTBL+0x1c)
553#define IOAPIC_REDTBL15 (IOAPIC_REDTBL+0x1e)
554#define IOAPIC_REDTBL16 (IOAPIC_REDTBL+0x20)
555#define IOAPIC_REDTBL17 (IOAPIC_REDTBL+0x22)
556#define IOAPIC_REDTBL18 (IOAPIC_REDTBL+0x24)
557#define IOAPIC_REDTBL19 (IOAPIC_REDTBL+0x26)
558#define IOAPIC_REDTBL20 (IOAPIC_REDTBL+0x28)
559#define IOAPIC_REDTBL21 (IOAPIC_REDTBL+0x2a)
560#define IOAPIC_REDTBL22 (IOAPIC_REDTBL+0x2c)
561#define IOAPIC_REDTBL23 (IOAPIC_REDTBL+0x2e)
562
563/* fields in VER */
564#define IOART_VER_VERSION 0x000000ff
565#define IOART_VER_MAXREDIR 0x00ff0000
566#define MAXREDIRSHIFT 16
567
568/*
569 * fields in the IO APIC's redirection table entries
570 */
571#define IOART_DEST APIC_ID_MASK /* broadcast addr: all APICs */
572
573#define IOART_RESV 0x00fe0000 /* reserved */
574
575#define IOART_INTMASK 0x00010000 /* R/W: INTerrupt mask */
576# define IOART_INTMCLR 0x00000000 /* clear, allow INTs */
577# define IOART_INTMSET 0x00010000 /* set, inhibit INTs */
578
579#define IOART_TRGRMOD 0x00008000 /* R/W: trigger mode */
580# define IOART_TRGREDG 0x00000000 /* edge */
581# define IOART_TRGRLVL 0x00008000 /* level */
582
583#define IOART_REM_IRR 0x00004000 /* RO: remote IRR */
584
585#define IOART_INTPOL 0x00002000 /* R/W: INT input pin polarity */
586# define IOART_INTAHI 0x00000000 /* active high */
587# define IOART_INTALO 0x00002000 /* active low */
588
589#define IOART_DELIVS 0x00001000 /* RO: delivery status */
590
591#define IOART_DESTMOD 0x00000800 /* R/W: destination mode */
592# define IOART_DESTPHY 0x00000000 /* physical */
593# define IOART_DESTLOG 0x00000800 /* logical */
594
595#define IOART_DELMOD 0x00000700 /* R/W: delivery mode */
596# define IOART_DELFIXED 0x00000000 /* fixed */
597# define IOART_DELLOPRI 0x00000100 /* lowest priority */
598# define IOART_DELSMI 0x00000200 /* System Management INT */
599# define IOART_DELRSV1 0x00000300 /* reserved */
600# define IOART_DELNMI 0x00000400 /* NMI signal */
601# define IOART_DELINIT 0x00000500 /* INIT signal */
602# define IOART_DELRSV2 0x00000600 /* reserved */
603# define IOART_DELEXINT 0x00000700 /* External INTerrupt */
604
605#define IOART_INTVEC 0x000000ff /* R/W: INTerrupt vector field */
606
607#endif /* _MACHINE_APIC_H_ */