1 /* 2 * Copyright (c) 2003,2004,2008 The DragonFly Project. All rights reserved. 3 * 4 * This code is derived from software contributed to The DragonFly Project 5 * by Matthew Dillon <dillon@backplane.com> 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in 15 * the documentation and/or other materials provided with the 16 * distribution. 17 * 3. Neither the name of The DragonFly Project nor the names of its 18 * contributors may be used to endorse or promote products derived 19 * from this software without specific, prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 22 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 24 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 25 * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 26 * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, 27 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 28 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 29 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 30 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 31 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32 * SUCH DAMAGE. 33 * 34 * Copyright (c) 1996, by Peter Wemm and Steve Passe, All rights reserved. 35 * 36 * Redistribution and use in source and binary forms, with or without 37 * modification, are permitted provided that the following conditions 38 * are met: 39 * 1. Redistributions of source code must retain the above copyright 40 * notice, this list of conditions and the following disclaimer. 41 * 2. The name of the developer may NOT be used to endorse or promote products 42 * derived from this software without specific prior written permission. 43 * 44 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 45 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 46 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 47 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 48 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 49 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 50 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 51 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 52 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 53 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 54 * SUCH DAMAGE. 55 * 56 * $FreeBSD: src/sys/i386/include/apic.h,v 1.14.2.2 2003/03/21 21:46:15 jhb Exp $ 57 * $DragonFly: src/sys/platform/pc64/apic/apicreg.h,v 1.1 2008/08/29 17:07:12 dillon Exp $ 58 */ 59 60 #ifndef _MACHINE_APICREG_H_ 61 #define _MACHINE_APICREG_H_ 62 63 /* 64 * Local && I/O APIC definitions for Pentium P54C+ Built-in APIC. 65 * 66 * A per-cpu APIC resides in memory location 0xFEE00000. 67 * 68 * 31 ... 24 23 ... 16 15 ... 8 7 ... 0 69 * +-----------+-----------+-----------+-----------+ 70 * 0000 | | | | | 71 * 0010 | | | | | 72 * +-----------+-----------+-----------+-----------+ 73 * 74 * +-----------+-----------+-----------+-----------+ 75 * 0020 ID | | ID | | | | RW 76 * +-----------+-----------+-----------+-----------+ 77 * 78 * The physical APIC ID is used with physical interrupt 79 * delivery modes. 80 * 81 * +-----------+-----------+-----------+-----------+ 82 * 0030 VER | | | | | 83 * +-----------+-----------+-----------+-----------+ 84 * 0040 | | | | | 85 * 0050 | | | | | 86 * 0060 | | | | | 87 * 0070 | | | | | 88 * +-----------+-----------+-----------+-----------+ 89 * 0080 TPR | | | | PRIO SUBC | 90 * 0090 APR | | | | | 91 * 00A0 PPR | | | | | 92 * +-----------+-----------+-----------+-----------+ 93 * 94 * The Task Priority Register provides a priority threshold 95 * mechanism for interrupting the processor. Only interrupts 96 * with a higher priority then that specified in the TPR will 97 * be served. Other interrupts are recorded and serviced 98 * as soon as the TPR value decreases enough to allow that 99 * (unless EOId by another APIC). 100 * 101 * PRIO (7:4). Main priority. If 15 the APIC will not 102 * accept any interrupts. 103 * SUBC (3:0) Sub priority. See APR/PPR. 104 * 105 * 106 * The Processor Priority Register determines whether a 107 * pending interrupt can be dispensed to the processor. ISRV 108 * Is the vector of the highest priority ISR bit set or 109 * zero if no ISR bit is set. 110 * 111 * IF TPR[7:4] >= ISRV[7:4] 112 * PPR[7:0] = TPR[7:0] 113 * ELSE 114 * PPR[7:0] = ISRV[7:4].000 115 * 116 * The Arbitration Priority Register holds the current 117 * lowest priority of the procsesor, a value used during 118 * lowest-priority arbitration. 119 * 120 * IF (TPR[7:4] >= IRRV[7:4] AND TPR[7:4] > ISRV[7:4]) 121 * APR[7:0] = TPR[7:0] 122 * ELSE 123 * APR[7:4] = max((TPR[7:4]&ISRV[7:4]),IRRV[7:4]).000 124 * 125 * +-----------+-----------+-----------+-----------+ 126 * 00B0 EOI | | | | | 127 * +-----------+-----------+-----------+-----------+ 128 * 00C0 | | | | | 129 * +-----------+-----------+-----------+-----------+ 130 * 00D0 LDR |LOG APICID | | | | 131 * +-----------+-----------+-----------+-----------+ 132 * 00E0 DFR |MODEL| | | | | 133 * +-----------+-----------+-----------+-----------+ 134 * 135 * The logical APIC ID is used with logical interrupt 136 * delivery modes. Interpretation of logical destination 137 * information depends on the MODEL bits in the Destination 138 * Format Regiuster. 139 * 140 * MODEL=1111 FLAT MODEL - The MDA is interpreted as 141 * a decoded address. By setting 142 * one bit in the LDR for each 143 * local apic 8 APICs can coexist. 144 * 145 * MODEL=0000 CLUSTER MODEL - 146 * 147 * 31 ... 24 23 ... 16 15 ... 8 7 ... 0 148 * +-----------+-----------+-----------+-----------+ 149 * 00F0 SVR | | | FE | vvvvvvvv | 150 * +-----------+-----------+-----------+-----------+ 151 * 152 * Spurious interrupt vector register. The 4 low 153 * vector bits must be programmed to 1111, e.g. 154 * vvvv1111. 155 * 156 * E - LAPIC enable (0 = disable, 1 = enable) 157 * 158 * F - Focus processor disable (1 = disable, 0 = enable) 159 * 160 * NOTE: The handler for the spurious interrupt vector 161 * should *NOT* issue an EOI because the spurious 162 * interrupt does not effect the ISR. 163 * 164 * +-----------+-----------+-----------+-----------+ 165 * 0100-0170 ISR| | | | | 166 * 0180-01F0 TMR| | | | | 167 * 0200-0270 IRR| | | | | 168 * +-----------+-----------+-----------+-----------+ 169 * 170 * These registers represent 256 bits, one bit for each 171 * possible interrupt. Interrupts 0-15 are reserved so 172 * bits 0-15 are also reserved. 173 * 174 * TMR - Trigger mode register. Upon acceptance of an int 175 * the corresponding bit is cleared for edge-trig and 176 * set for level-trig. If the TMR bit is set (level), 177 * the local APIC sends an EOI to all I/O APICs as 178 * a result of software issuing an EOI command. 179 * 180 * IRR - Interrupt Request Register. Contains active 181 * interrupt requests that have been accepted but not 182 * yet dispensed by the current local APIC. The bit is 183 * cleared and the corresponding ISR bit is set when 184 * the INTA cycle is issued. 185 * 186 * ISR - Interrupt In-Service register. Interrupt has been 187 * delivered but not yet fully serviced. Cleared when 188 * an EOI is issued from the processor. An EOI will 189 * also send an EOI to all I/O APICs if TMR was set. 190 * 191 * +-----------+-----------+-----------+-----------+ 192 * 0280 ESR | | | | | 193 * 0290-02F0 | | | | | 194 * +--FEDCBA98-+--76543210-+--FEDCBA98-+-----------+ 195 * 0300 ICR_LO | | XX | TL SDMMM | vector | 196 * 0310 ICR_HI | DEST FIELD| | | | 197 * +-----------+-----------+-----------+-----------+ 198 * 199 * The interrupt command register. Generally speaking 200 * writing to ICR_LO initiates a command. All fields 201 * are R/W except the 'S' (delivery status) field, which 202 * is read-only. When 203 * 204 * 205 * XX: Destination Shorthand field: 206 * 207 * 00 Use Destination field 208 * 01 Self only. Dest field ignored. 209 * 10 All including self (uses a 210 * destination field of 0x0F) 211 * 11 All excluding self (uses a 212 * destination field of 0x0F) 213 * 214 * T: 1 = Level 0 = Edge Trigger modde, used for 215 * the INIT level de-assert delivery mode only 216 * to de-assert a request. 217 * 218 * L: 0 = De-Assert, 1 = Assert. Always write as 219 * 1 when initiating a new command. Can only 220 * write as 0 for INIT mode de-assertion of 221 * command. 222 * 223 * S: 1 = Send Pending. Interrupt has been injected 224 * but APIC has not yet accepted it. 225 * 226 * D: 0=physical 1=logical. In physical mode 227 * only 24-27 of DEST FIELD is used from ICR_HI. 228 * 229 * MMM: 000 Fixed. Deliver to all processors according 230 * to the ICR. Always treated as edge trig. 231 * 232 * 001 Lowest Priority. Deliver to just the 233 * processor running at the lowest priority. 234 * 235 * 010 SMI. The vector must be 00B. Only edge 236 * triggered is allowed. The vector field 237 * must be programmed to zero (huh?). 238 * 239 * 011 <reserved> 240 * 241 * 100 NMI. Deliver as an NMI to all processors 242 * listed in the destination field. The 243 * vector is ignored. Alawys treated as 244 * edge triggered. 245 * 246 * 101 INIT. Deliver as an INIT signal to all 247 * processors (like FIXED). Vector is ignored 248 * and it is always edge-triggered. 249 * 250 * 110 Start Up. Sends a special message between 251 * cpus. the vector contains a start-up 252 * address for MP boot protocol. 253 * Always edge triggered. Note: a startup 254 * int is not automatically tried in case of 255 * failure. 256 * 257 * 111 <reserved> 258 * 259 * +-----------+--------10-+--FEDCBA98-+-----------+ 260 * 0320 LTIMER | | TM | ---S---- | vector | 261 * 0330 | | | | | 262 * +-----------+--------10-+--FEDCBA98-+-----------+ 263 * 0340 LVPCINT | | -M | ---S-MMM | vector | 264 * 0350 LVINT0 | | -M | LRPS-MMM | vector | 265 * 0360 LVINT1 | | -M | LRPS-MMM | vector | 266 * 0370 LVERROR | | -M | -------- | vector | 267 * +-----------+-----------+-----------+-----------+ 268 * 269 * T: 1 = periodic, 0 = one-shot 270 * 271 * M: 1 = masked 272 * 273 * L: 1 = level, 0 = edge 274 * 275 * R: For level triggered only, set to 1 when a 276 * level int is accepted, cleared by EOI. 277 * 278 * P: Pin Polarity 0 = Active High, 1 = Active Low 279 * 280 * S: 1 = Send Pending. Interrupt has been injected 281 * but APIC has not yet accepted it. 282 * 283 * MMM 000 = Fixed deliver to cpu according to LVT 284 * 285 * MMM 100 = NMI deliver as an NMI. Always edge 286 * 287 * MMM 111 = ExtInt deliver from 8259, routes INTA 288 * bus cycle to external 289 * controller. Controller is 290 * expected to supply vector. 291 * Always level. 292 * 293 * +-----------+-----------+-----------+-----------+ 294 * 0380 TMR_ICR | | | | | 295 * 0390 TMR_CCR | | | | | 296 * +-----------+-----------+-----------+-----------+ 297 * 298 * The timer initial count register and current count 299 * register (32 bits) 300 * 301 * +-----------+-----------+-----------+-----------+ 302 * 03A0 | | | | | 303 * 03B0 | | | | | 304 * 03C0 | | | | | 305 * 03D0 | | | | | 306 * +-----------+-----------+-----------+-----------+ 307 * 03E0 TMR_DCR | | | | d-dd | 308 * +-----------+-----------+-----------+-----------+ 309 * 310 * The timer divide configuration register. d-dd is: 311 * 312 * 0000 - divide by 2 313 * 0001 - divide by 4 314 * 0010 - divide by 8 315 * 0011 - divide by 16 316 * 1000 - divide by 32 317 * 1001 - divide by 64 318 * 1010 - divide by 128 319 * 1011 - divide by 1 320 * 321 * NOTE ON EOI: Upon receiving an EOI the APIC clears the highest priority 322 * interrupt in the ISR and selects the next highest priority interrupt 323 * for posting to the CPU. If the interrupt being EOId was level 324 * triggered the APIC will send an EOI to all I/O APICs. For the moment 325 * you can write garbage to the EOI register but for future compatibility 326 * 0 should be written. 327 * 328 * 03F0 SELF_IPI 329 * 0400 EXT_FEAT 330 * 0410 EXT_CTRL 331 * 0420 EXT_SEOI 332 * 0430 333 * 0440 334 * 0450 335 * 0460 336 * 0470 337 * 0480 EXT_IER0 338 * 0490 EXT_IER1 339 * 04A0 EXT_IER2 340 * 04B0 EXT_IER3 341 * 04C0 EXT_IER4 342 * 04D0 EXT_IER5 343 * 04E0 EXT_IER6 344 * 04F0 EXT_IER7 345 * 0500 EXT_LVT0 346 * 0510 EXT_LVT1 347 * 0520 EXT_LVT2 348 * 0530 EXT_LVT3 349 */ 350 351 #ifndef LOCORE 352 #include <sys/types.h> 353 354 #define PAD3 int : 32; int : 32; int : 32 355 #define PAD4 int : 32; int : 32; int : 32; int : 32 356 357 struct LAPIC { 358 /* reserved */ PAD4; 359 /* reserved */ PAD4; 360 u_int32_t id; PAD3; /* 0020 R/W */ 361 u_int32_t version; PAD3; /* 0030 RO */ 362 /* reserved */ PAD4; 363 /* reserved */ PAD4; 364 /* reserved */ PAD4; 365 /* reserved */ PAD4; 366 u_int32_t tpr; PAD3; 367 u_int32_t apr; PAD3; 368 u_int32_t ppr; PAD3; 369 u_int32_t eoi; PAD3; 370 /* reserved */ PAD4; 371 u_int32_t ldr; PAD3; 372 u_int32_t dfr; PAD3; 373 u_int32_t svr; PAD3; 374 u_int32_t isr0; PAD3; 375 u_int32_t isr1; PAD3; 376 u_int32_t isr2; PAD3; 377 u_int32_t isr3; PAD3; 378 u_int32_t isr4; PAD3; 379 u_int32_t isr5; PAD3; 380 u_int32_t isr6; PAD3; 381 u_int32_t isr7; PAD3; 382 u_int32_t tmr0; PAD3; 383 u_int32_t tmr1; PAD3; 384 u_int32_t tmr2; PAD3; 385 u_int32_t tmr3; PAD3; 386 u_int32_t tmr4; PAD3; 387 u_int32_t tmr5; PAD3; 388 u_int32_t tmr6; PAD3; 389 u_int32_t tmr7; PAD3; 390 u_int32_t irr0; PAD3; 391 u_int32_t irr1; PAD3; 392 u_int32_t irr2; PAD3; 393 u_int32_t irr3; PAD3; 394 u_int32_t irr4; PAD3; 395 u_int32_t irr5; PAD3; 396 u_int32_t irr6; PAD3; 397 u_int32_t irr7; PAD3; 398 u_int32_t esr; PAD3; 399 /* reserved */ PAD4; 400 /* reserved */ PAD4; 401 /* reserved */ PAD4; 402 /* reserved */ PAD4; 403 /* reserved */ PAD4; 404 /* reserved */ PAD4; 405 /* reserved */ PAD4; 406 u_int32_t icr_lo; PAD3; 407 u_int32_t icr_hi; PAD3; 408 u_int32_t lvt_timer; PAD3; 409 /* reserved */ PAD4; 410 u_int32_t lvt_pcint; PAD3; 411 u_int32_t lvt_lint0; PAD3; 412 u_int32_t lvt_lint1; PAD3; 413 u_int32_t lvt_error; PAD3; 414 u_int32_t icr_timer; PAD3; 415 u_int32_t ccr_timer; PAD3; /* e9 */ 416 /* reserved */ PAD4; 417 /* reserved */ PAD4; 418 /* reserved */ PAD4; 419 /* reserved */ PAD4; 420 u_int32_t dcr_timer; PAD3; /* 3e */ 421 u_int32_t self_ipi; PAD3; /* 3f - Only in x2APIC */ 422 u_int32_t ext_feat; PAD3; 423 u_int32_t ext_ctrl; PAD3; 424 u_int32_t ext_seoi; PAD3; 425 /* reserved */ PAD4; 426 /* reserved */ PAD4; 427 /* reserved */ PAD4; 428 /* reserved */ PAD4; 429 /* reserved */ PAD4; 430 u_int32_t ext_ier0; PAD3; 431 u_int32_t ext_ier1; PAD3; 432 u_int32_t ext_ier2; PAD3; 433 u_int32_t ext_ier3; PAD3; 434 u_int32_t ext_ier4; PAD3; 435 u_int32_t ext_ier5; PAD3; 436 u_int32_t ext_ier6; PAD3; 437 u_int32_t ext_ier7; PAD3; 438 struct { /* 50 */ 439 u_int32_t lvt; PAD3; 440 } ext_lvt[16]; 441 } __packed; 442 443 typedef struct LAPIC lapic_t; 444 445 /****************************************************************************** 446 * I/O APIC structure 447 */ 448 449 struct IOAPIC { 450 u_int32_t ioregsel; PAD3; 451 u_int32_t iowin; PAD3; 452 }; 453 454 typedef struct IOAPIC ioapic_t; 455 456 #undef PAD4 457 #undef PAD3 458 459 /* X2APIC */ 460 #define MSR_X2APIC_BASE 0x00000800 461 #define MSR_X2APIC_ID 0x00000802 462 #define MSR_X2APIC_EOI 0x0000080b 463 #define MSR_X2APIC_DFR_RSVD 0x0000080e 464 #define MSR_X2APIC_ICR 0x00000830 465 #define MSR_X2APIC_ICR_RSVD 0x00000831 466 #define MSR_X2APIC_ICR_TIMER 0x00000838 467 #define MSR_X2APIC_CCR_TIMER 0x00000839 468 #define MSR_X2APIC_SELFIPI 0x0000083f 469 470 #define MSR_X2APIC_MIN MSR_X2APIC_ID 471 #define MSR_X2APIC_MAX MSR_X2APIC_SELFIPI 472 473 #define LAPIC2MSR(field) __extension__ ({ \ 474 uint32_t __msr; \ 475 \ 476 __msr = MSR_X2APIC_BASE + \ 477 (__offsetof(struct LAPIC, field) >> 4); \ 478 KASSERT(__msr >= MSR_X2APIC_MIN && \ 479 __msr <= MSR_X2APIC_MAX && \ 480 __msr != MSR_X2APIC_DFR_RSVD && \ 481 __msr != MSR_X2APIC_ICR && \ 482 __msr != MSR_X2APIC_ICR_RSVD, \ 483 ("invalid MSR 0x%08x", __msr)); \ 484 __msr; \ 485 }) 486 487 #endif /* !LOCORE */ 488 489 490 /****************************************************************************** 491 * various code 'logical' values 492 */ 493 494 /* 495 * TPR loads to prioritize which cpu grabs an interrupt 496 * 497 * (note: some fields of the TPR are reserved) 498 */ 499 #define LOPRIO_LEVEL 0x00000010 /* TPR of CPU accepting INTs */ 500 #define ALLHWI_LEVEL 0x00000000 /* TPR of CPU grabbing INTs */ 501 502 /****************************************************************************** 503 * LOCAL APIC defines 504 */ 505 506 /* 507 * default physical location for the LOCAL (CPU) APIC 508 */ 509 #define DEFAULT_APIC_BASE 0xfee00000 510 511 /* 512 * lapic.id (rw) 513 */ 514 #define APIC_ID_MASK 0xff000000 515 #define APIC_ID_SHIFT 24 516 #define APIC_ID_CLUSTER 0xf0 517 #define APIC_ID_CLUSTER_ID 0x0f 518 #define APIC_MAX_CLUSTER 0xe 519 #define APIC_MAX_INTRACLUSTER_ID 3 520 #define APIC_ID_CLUSTER_SHIFT 4 521 522 #define APIC_ID(id) (((id) & APIC_ID_MASK) >> APIC_ID_SHIFT) 523 524 /* 525 * lapic.ver (ro) 526 */ 527 #define APIC_VER_VERSION 0x000000ff 528 #define APIC_VER_MAXLVT 0x00ff0000 529 #define MAXLVTSHIFT 16 530 #define APIC_VER_EOI_SUPP 0x01000000 531 #define APIC_VER_AMD_EXT_SPACE 0x80000000 532 533 /* 534 * lapic.ldr (rw) 535 */ 536 #define APIC_LDR_RESERVED 0x00ffffff 537 538 /* 539 * lapic.dfr (rw) 540 * 541 * The logical APIC ID is used with logical interrupt 542 * delivery modes. Interpretation of logical destination 543 * information depends on the MODEL bits in the Destination 544 * Format Regiuster. 545 * 546 * MODEL=1111 FLAT MODEL - The MDA is interpreted as 547 * a decoded address. By setting 548 * one bit in the LDR for each 549 * local apic 8 APICs can coexist. 550 * 551 * MODEL=0000 CLUSTER MODEL - 552 */ 553 #define APIC_DFR_RESERVED 0x0fffffff 554 #define APIC_DFR_MODEL_MASK 0xf0000000 555 #define APIC_DFR_MODEL_FLAT 0xf0000000 556 #define APIC_DFR_MODEL_CLUSTER 0x00000000 557 558 /* 559 * lapic.svr 560 * 561 * Contains the spurious interrupt vector and bits to enable/disable 562 * the local apic and focus processor. 563 */ 564 #define APIC_SVR_VECTOR 0x000000ff 565 #define APIC_SVR_ENABLE 0x00000100 566 #define APIC_SVR_FOCUS_DISABLE 0x00000200 567 #define APIC_SVR_EOI_SUPP 0x00001000 568 569 /* 570 * lapic.tpr 571 * 572 * PRIO (7:4). Main priority. If 15 the APIC will not 573 * accept any interrupts. 574 * SUBC (3:0) Sub priority. See APR/PPR. 575 */ 576 #define APIC_TPR_PRIO 0x000000ff 577 #define APIC_TPR_INT 0x000000f0 578 #define APIC_TPR_SUB 0x0000000f 579 580 /* 581 * lapic.icr_lo -------- ----XXRR TL-SDMMM vvvvvvvv 582 * 583 * The interrupt command register. Generally speaking 584 * writing to ICR_LO initiates a command. All fields 585 * are R/W except the 'S' (delivery status) field, which 586 * is read-only. When 587 * 588 * XX: Destination Shorthand field: 589 * 590 * 00 - Use Destination field 591 * 01 - Self only. Dest field ignored. 592 * 10 - All including self (uses a 593 * destination field of 0x0F) 594 * 11 - All excluding self (uses a 595 * destination field of 0x0F) 596 * 597 * RR: RR mode (? needs documentation) 598 * 599 * T: 1 = Level 0 = Edge Trigger modde, used for 600 * the INIT level de-assert delivery mode only 601 * to de-assert a request. 602 * 603 * L: 0 = De-Assert, 1 = Assert. Always write as 604 * 1 when initiating a new command. Can only 605 * write as 0 for INIT mode de-assertion of 606 * command. 607 * 608 * S: 1 = Send Pending. Interrupt has been injected but the APIC 609 * has not yet accepted it. 610 * 611 * D: 0 = physical 1 = logical. In physical mode only bits 24-27 612 * of the DEST field is used from ICR_HI. 613 * 614 * MMM: Delivery mode 615 * 616 * 000 - Fixed. Deliver to all processors according to the 617 * ICR. Always treated as edge triggered. 618 * 619 * 001 - Lowest Priority. Deliver to just the processor 620 * running at the lowest priority. 621 * 622 * 010 - SMI. The vector must be 00B. Only edge triggered 623 * is allowed. The vector field must be programmed to 624 * 0 (huh?) 625 * 626 * 011 - RR Delivery mode (?? needs documentation). 627 * 628 * 100 - NMI. Deliver as an NMI to all processors listed in 629 * the destination field. The vector is ignored. Always 630 * treated as edge triggered. 631 * 632 * 101 - INIT. Deliver as an INIT signal to all processors 633 * (like FIXED) according to the ICR. The vector is 634 * ignored and delivery is always edge-triggered. 635 * 636 * 110 - Startup. Send a special message between cpus. The 637 * vector contains a startup address for the MP boot 638 * protocol. Always edge triggered. Note: a startup 639 * interrupt is not automatically tried in case of failure. 640 * 641 * 111 - <reserved> 642 */ 643 #define APIC_VECTOR_MASK 0x000000ff 644 645 #define APIC_DELMODE_MASK 0x00000700 646 #define APIC_DELMODE_FIXED 0x00000000 647 #define APIC_DELMODE_LOWPRIO 0x00000100 648 #define APIC_DELMODE_SMI 0x00000200 649 #define APIC_DELMODE_RR 0x00000300 650 #define APIC_DELMODE_NMI 0x00000400 651 #define APIC_DELMODE_INIT 0x00000500 652 #define APIC_DELMODE_STARTUP 0x00000600 653 #define APIC_DELMODE_RESV7 0x00000700 654 655 #define APIC_DESTMODE_MASK 0x00000800 656 #define APIC_DESTMODE_PHY 0x00000000 657 #define APIC_DESTMODE_LOG 0x00000800 658 659 #define APIC_DELSTAT_MASK 0x00001000 660 #define APIC_DELSTAT_IDLE 0x00000000 661 #define APIC_DELSTAT_PEND 0x00001000 662 663 #define APIC_LEVEL_MASK 0x00004000 664 #define APIC_LEVEL_DEASSERT 0x00000000 665 #define APIC_LEVEL_ASSERT 0x00004000 666 667 #define APIC_TRIGMOD_MASK 0x00008000 668 #define APIC_TRIGMOD_EDGE 0x00000000 669 #define APIC_TRIGMOD_LEVEL 0x00008000 670 671 #define APIC_RRSTAT_MASK 0x00030000 672 #define APIC_RRSTAT_INVALID 0x00000000 673 #define APIC_RRSTAT_INPROG 0x00010000 674 #define APIC_RRSTAT_VALID 0x00020000 675 #define APIC_RRSTAT_RESV 0x00030000 676 677 #define APIC_DEST_MASK 0x000c0000 678 #define APIC_DEST_DESTFLD 0x00000000 679 #define APIC_DEST_SELF 0x00040000 680 #define APIC_DEST_ALLISELF 0x00080000 681 #define APIC_DEST_ALLESELF 0x000c0000 682 683 #define APIC_ICRLO_RESV_MASK 0xfff02000 684 685 /* 686 * lapic.icr_hi 687 */ 688 #define APIC_ICRH_ID_MASK APIC_ID_MASK 689 690 /* 691 * lapic.lvt_timer 692 * lapic.lvt_pcint 693 * lapic.lvt_lint0 694 * lapic.lvt_lint1 695 * lapic.lvt_error 696 * 697 * +-----------+--------10-+--FEDCBA98-+-----------+ 698 * 0320 LTIMER | | TM | ---S---- | vector | 699 * 0330 | | | | | 700 * +-----------+--------10-+--FEDCBA98-+-----------+ 701 * 0340 LVPCINT | | -M | ---S-MMM | vector | 702 * 0350 LVINT0 | | -M | LRPS-MMM | vector | 703 * 0360 LVINT1 | | -M | LRPS-MMM | vector | 704 * 0370 LVERROR | | -M | -------- | vector | 705 * +-----------+-----------+-----------+-----------+ 706 * 707 * T: 1 = periodic, 0 = one-shot 708 * (LTIMER only) 709 * 710 * M: 1 = masked 711 * 712 * L: 1 = level, 0 = edge 713 * (LVINT0/1 only) 714 * 715 * R: For level triggered only, set to 1 when a 716 * level int is accepted, cleared by EOI. 717 * (LVINT0/1 only) 718 * 719 * P: Pin Polarity 0 = Active High, 1 = Active Low 720 * (LVINT0/1 only) 721 * 722 * S: 1 = Send Pending. Interrupt has been injected 723 * but APIC has not yet accepted it. 724 * 725 * MMM 000 = Fixed deliver to cpu according to LVT 726 * 727 * MMM 100 = NMI deliver as an NMI. Always edge 728 * 729 * MMM 111 = ExtInt deliver from 8259, routes INTA 730 * bus cycle to external 731 * controller. Controller is 732 * expected to supply vector. 733 * Always level. 734 */ 735 #define APIC_LVT_VECTOR 0x000000ff 736 737 #define APIC_LVT_DM_MASK 0x00000700 738 #define APIC_LVT_DM_FIXED 0x00000000 739 #define APIC_LVT_DM_NMI 0x00000400 740 #define APIC_LVT_DM_EXTINT 0x00000700 741 742 #define APIC_LVT_DS 0x00001000 /* (S) Send Pending */ 743 #define APIC_LVT_POLARITY_MASK 0x00002000 744 #define APIC_LVT_POLARITY_LO 0x00002000 /* (P) Pin Polarity */ 745 #define APIC_LVT_POLARITY_HI 0x00000000 746 #define APIC_LVT_LEVELSTATUS 0x00004000 /* (R) level trig status */ 747 #define APIC_LVT_TRIG_MASK 0x00008000 748 #define APIC_LVT_LEVELTRIG 0x00008000 /* (L) 1 = level, 0 = edge */ 749 #define APIC_LVT_MASKED 0x00010000 /* (M) 1 = masked */ 750 751 /* 752 * lapic.lvt_timer 753 */ 754 #define APIC_LVTT_VECTOR APIC_LVT_VECTOR 755 #define APIC_LVTT_DS APIC_LVT_DS 756 #define APIC_LVTT_MASKED APIC_LVT_MASKED 757 #define APIC_LVTT_PERIODIC 0x00020000 758 #define APIC_LVTT_TSCDLT 0x00040000 759 760 #define APIC_TIMER_MAX_COUNT 0xffffffff 761 762 /* 763 * lapic.icr_timer - initial count register (32 bits) 764 * lapic.ccr_timer - current count register (32 bits) 765 */ 766 767 /* 768 * lapic.dcr_timer - timer divider register 769 * 770 * d0dd 771 * 772 * 0000 - divide by 2 773 * 0001 - divide by 4 774 * 0010 - divide by 8 775 * 0011 - divide by 16 776 * 1000 - divide by 32 777 * 1001 - divide by 64 778 * 1010 - divide by 128 779 * 1011 - divide by 1 780 */ 781 #define APIC_TDCR_2 0x00 782 #define APIC_TDCR_4 0x01 783 #define APIC_TDCR_8 0x02 784 #define APIC_TDCR_16 0x03 785 #define APIC_TDCR_32 0x08 786 #define APIC_TDCR_64 0x09 787 #define APIC_TDCR_128 0x0a 788 #define APIC_TDCR_1 0x0b 789 790 /* 791 * lapic.self_ipi (x2APIC only) 792 */ 793 /* 794 * lapic.ext_feat (AMD only) 795 */ 796 #define APIC_EXTFEAT_MASK 0x00ff0000 797 #define APIC_EXTFEAT_SHIFT 16 798 #define APIC_EXTFEAT_EXTID_CAP 0x00000004 799 #define APIC_EXTFEAT_SEIO_CAP 0x00000002 800 #define APIC_EXTFEAT_IER_CAP 0x00000001 801 802 /* 803 * lapic.ext_ctrl 804 * lapic.ext_seoi 805 * lapic.ext_ier{0-7} 806 */ 807 /* 808 * lapic.ext_lvt[N].lvt 809 */ 810 #define APIC_EXTLVT_IBS 0 /* Instruction based sampling */ 811 #define APIC_EXTLVT_MCA 1 /* MCE thresholding */ 812 #define APIC_EXTLVT_DEI 2 /* Deferred error interrupt */ 813 #define APIC_EXTLVT_SBI 3 /* Sideband interface */ 814 815 /****************************************************************************** 816 * I/O APIC defines 817 */ 818 819 /* default physical locations of an IO APIC */ 820 #define DEFAULT_IO_APIC_BASE 0xfec00000 821 822 /* window register offset */ 823 #define IOAPIC_WINDOW 0x10 824 825 /* 826 * indexes into IO APIC (index into array of 32 bit entities) 827 */ 828 #define IOAPIC_ID 0x00 829 #define IOAPIC_VER 0x01 830 #define IOAPIC_ARB 0x02 831 #define IOAPIC_REDTBL 0x10 832 #define IOAPIC_REDTBL0 IOAPIC_REDTBL 833 #define IOAPIC_REDTBL1 (IOAPIC_REDTBL+0x02) 834 #define IOAPIC_REDTBL2 (IOAPIC_REDTBL+0x04) 835 #define IOAPIC_REDTBL3 (IOAPIC_REDTBL+0x06) 836 #define IOAPIC_REDTBL4 (IOAPIC_REDTBL+0x08) 837 #define IOAPIC_REDTBL5 (IOAPIC_REDTBL+0x0a) 838 #define IOAPIC_REDTBL6 (IOAPIC_REDTBL+0x0c) 839 #define IOAPIC_REDTBL7 (IOAPIC_REDTBL+0x0e) 840 #define IOAPIC_REDTBL8 (IOAPIC_REDTBL+0x10) 841 #define IOAPIC_REDTBL9 (IOAPIC_REDTBL+0x12) 842 #define IOAPIC_REDTBL10 (IOAPIC_REDTBL+0x14) 843 #define IOAPIC_REDTBL11 (IOAPIC_REDTBL+0x16) 844 #define IOAPIC_REDTBL12 (IOAPIC_REDTBL+0x18) 845 #define IOAPIC_REDTBL13 (IOAPIC_REDTBL+0x1a) 846 #define IOAPIC_REDTBL14 (IOAPIC_REDTBL+0x1c) 847 #define IOAPIC_REDTBL15 (IOAPIC_REDTBL+0x1e) 848 #define IOAPIC_REDTBL16 (IOAPIC_REDTBL+0x20) 849 #define IOAPIC_REDTBL17 (IOAPIC_REDTBL+0x22) 850 #define IOAPIC_REDTBL18 (IOAPIC_REDTBL+0x24) 851 #define IOAPIC_REDTBL19 (IOAPIC_REDTBL+0x26) 852 #define IOAPIC_REDTBL20 (IOAPIC_REDTBL+0x28) 853 #define IOAPIC_REDTBL21 (IOAPIC_REDTBL+0x2a) 854 #define IOAPIC_REDTBL22 (IOAPIC_REDTBL+0x2c) 855 #define IOAPIC_REDTBL23 (IOAPIC_REDTBL+0x2e) 856 857 /* fields in VER */ 858 #define IOART_VER_VERSION 0x000000ff 859 #define IOART_VER_MAXREDIR 0x00ff0000 860 #define MAXREDIRSHIFT 16 861 862 /* 863 * fields in the IO APIC's redirection table entries 864 */ 865 866 /* 867 * High 32 bit word. The high 8 bits contain the destination field. 868 * 869 * If this entry is set up for Physical Mode, bits 59:56 (the low 4 bits 870 * of the 8 bit destination field) contain an APIC ID. 871 * 872 * If this entry is set up for Logical Mode, the destination field potentially 873 * defines a set of processors. Bits 63:56 (all 8 bits) specify the logical 874 * destination address. 875 * 876 * Current we use IOART_HI_DEST_BROADCAST to broadcast to all LAPICs 877 */ 878 #define IOART_HI_DEST_MASK APIC_ID_MASK 879 #define IOART_HI_DEST_RESV ~APIC_ID_MASK 880 #define IOART_HI_DEST_BROADCAST IOART_HI_DEST_MASK 881 #define IOART_HI_DEST_SHIFT 24 882 883 /* 884 * Low 32 bit word 885 */ 886 #define IOART_RESV 0x00fe0000 /* reserved */ 887 888 /* 889 * Interrupt mask bit. If 1 the interrupt is masked. An edge sensitive 890 * interrupt which is masked will be lost. 891 */ 892 #define IOART_INTMASK 0x00010000 /* R/W: INTerrupt mask */ 893 #define IOART_INTMCLR 0x00000000 /* clear, allow INTs */ 894 #define IOART_INTMSET 0x00010000 /* set, inhibit INTs */ 895 896 /* 897 * Select trigger mode. 898 */ 899 #define IOART_TRGRMOD 0x00008000 /* R/W: trigger mode */ 900 #define IOART_TRGREDG 0x00000000 /* edge */ 901 #define IOART_TRGRLVL 0x00008000 /* level */ 902 903 /* 904 * Remote IRR. Only applies to level triggered interrupts, this bit 905 * is set to 1 when the IOAPIC has delivered a level triggered interrupt 906 * to a local APIC. It is cleared when the LAPIC EOI's the interrupt. 907 * This field is read-only. 908 */ 909 #define IOART_REM_IRR 0x00004000 /* RO: remote IRR */ 910 911 /* 912 * Select interrupt pin polarity 913 */ 914 #define IOART_INTPOL 0x00002000 /* R/W: INT input pin polarity */ 915 #define IOART_INTAHI 0x00000000 /* active high */ 916 #define IOART_INTALO 0x00002000 /* active low */ 917 918 /* 919 * Delivery Status (read only). 0 = no interrupt pending, 1 = interrupt 920 * pending for tranmission to an LAPIC. Note that this bit does not 921 * indicate whether the interrupt has been processed or is undergoing 922 * processing by a cpu. 923 */ 924 #define IOART_DELIVS 0x00001000 /* RO: delivery status */ 925 926 /* 927 * Destination mode. 928 * 929 * In physical mode the destination APIC is identified by its ID. 930 * Bits 56-63 specify the 8 bit APIC ID. 931 * 932 * In logical mode destinations are identified by matching on the logical 933 * destination under the control of the destination format register and 934 * logical destination register in each local APIC. 935 * 936 */ 937 #define IOART_DESTMOD 0x00000800 /* R/W: destination mode */ 938 #define IOART_DESTPHY 0x00000000 /* physical */ 939 #define IOART_DESTLOG 0x00000800 /* logical */ 940 941 /* 942 * Delivery mode. 943 * 944 * 000 Fixed Deliver the signal on the INTR signal for 945 * all processor core's LAPICs listed in the 946 * destination. The trigger mode may be 947 * edge or level. 948 * 949 * 001 Lowest Pri Deliver to the processor core whos LAPIC 950 * is operating at the lowest priority (TPR). 951 * The trigger mode may be edge or level. 952 * 953 * 010 SMI System management interrupt. the vector 954 * information is ignored but must be programmed 955 * to all zero's for future compatibility. 956 * Must be edge triggered. 957 * 958 * 011 Reserved 959 * 960 * 100 NMI Deliver on the NMI signal for all cpu cores 961 * listed in the destination. Vector information 962 * is ignored. NMIs are treated as edge triggered 963 * interrupts even if programmed as level 964 * triggered. For proper operation the pin must 965 * be programmed as an edge trigger. 966 * 967 * 101 INIT Deliver to all processor cores listed in 968 * the destination by asserting their INIT signal. 969 * All addressed LAPICs will assume their INIT 970 * state. Always treated as edge-triggered even 971 * if programmed as level. For proper operation 972 * the pin must be programed as an edge trigger. 973 * 974 * 110 Reserved 975 * 976 * 111 ExINT Deliver as an INTR signal to all processor 977 * cores listed in the destination as an 978 * interrupt originating in an externally 979 * connected interrupt controller. 980 * The INTA cycle corresponding to this ExINT 981 * will be routed to the external controller 982 * that is expected to supply the vector. 983 * Must be edge triggered. 984 * 985 */ 986 #define IOART_DELMOD 0x00000700 /* R/W: delivery mode */ 987 #define IOART_DELFIXED 0x00000000 /* fixed */ 988 #define IOART_DELLOPRI 0x00000100 /* lowest priority */ 989 #define IOART_DELSMI 0x00000200 /* System Management INT */ 990 #define IOART_DELRSV1 0x00000300 /* reserved */ 991 #define IOART_DELNMI 0x00000400 /* NMI signal */ 992 #define IOART_DELINIT 0x00000500 /* INIT signal */ 993 #define IOART_DELRSV2 0x00000600 /* reserved */ 994 #define IOART_DELEXINT 0x00000700 /* External INTerrupt */ 995 996 /* 997 * The interrupt vector. Valid values range from 0x10 to 0xFE. 998 */ 999 #define IOART_INTVEC 0x000000ff /* R/W: INTerrupt vector field */ 1000 1001 #endif /* _MACHINE_APIC_H_ */ 1002