1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #ifndef _ASM_X86_APICDEF_H 3*4882a593Smuzhiyun #define _ASM_X86_APICDEF_H 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun /* 6*4882a593Smuzhiyun * Constants for various Intel APICs. (local APIC, IOAPIC, etc.) 7*4882a593Smuzhiyun * 8*4882a593Smuzhiyun * Alan Cox <Alan.Cox@linux.org>, 1995. 9*4882a593Smuzhiyun * Ingo Molnar <mingo@redhat.com>, 1999, 2000 10*4882a593Smuzhiyun */ 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #define IO_APIC_DEFAULT_PHYS_BASE 0xfec00000 13*4882a593Smuzhiyun #define APIC_DEFAULT_PHYS_BASE 0xfee00000 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun /* 16*4882a593Smuzhiyun * This is the IO-APIC register space as specified 17*4882a593Smuzhiyun * by Intel docs: 18*4882a593Smuzhiyun */ 19*4882a593Smuzhiyun #define IO_APIC_SLOT_SIZE 1024 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun #define APIC_ID 0x20 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun #define APIC_LVR 0x30 24*4882a593Smuzhiyun #define APIC_LVR_MASK 0xFF00FF 25*4882a593Smuzhiyun #define APIC_LVR_DIRECTED_EOI (1 << 24) 26*4882a593Smuzhiyun #define GET_APIC_VERSION(x) ((x) & 0xFFu) 27*4882a593Smuzhiyun #define GET_APIC_MAXLVT(x) (((x) >> 16) & 0xFFu) 28*4882a593Smuzhiyun #ifdef CONFIG_X86_32 29*4882a593Smuzhiyun # define APIC_INTEGRATED(x) ((x) & 0xF0u) 30*4882a593Smuzhiyun #else 31*4882a593Smuzhiyun # define APIC_INTEGRATED(x) (1) 32*4882a593Smuzhiyun #endif 33*4882a593Smuzhiyun #define APIC_XAPIC(x) ((x) >= 0x14) 34*4882a593Smuzhiyun #define APIC_EXT_SPACE(x) ((x) & 0x80000000) 35*4882a593Smuzhiyun #define APIC_TASKPRI 0x80 36*4882a593Smuzhiyun #define APIC_TPRI_MASK 0xFFu 37*4882a593Smuzhiyun #define APIC_ARBPRI 0x90 38*4882a593Smuzhiyun #define APIC_ARBPRI_MASK 0xFFu 39*4882a593Smuzhiyun #define APIC_PROCPRI 0xA0 40*4882a593Smuzhiyun #define APIC_EOI 0xB0 41*4882a593Smuzhiyun #define APIC_EOI_ACK 0x0 /* Docs say 0 for future compat. */ 42*4882a593Smuzhiyun #define APIC_RRR 0xC0 43*4882a593Smuzhiyun #define APIC_LDR 0xD0 44*4882a593Smuzhiyun #define APIC_LDR_MASK (0xFFu << 24) 45*4882a593Smuzhiyun #define GET_APIC_LOGICAL_ID(x) (((x) >> 24) & 0xFFu) 46*4882a593Smuzhiyun #define SET_APIC_LOGICAL_ID(x) (((x) << 24)) 47*4882a593Smuzhiyun #define APIC_ALL_CPUS 0xFFu 48*4882a593Smuzhiyun #define APIC_DFR 0xE0 49*4882a593Smuzhiyun #define APIC_DFR_CLUSTER 0x0FFFFFFFul 50*4882a593Smuzhiyun #define APIC_DFR_FLAT 0xFFFFFFFFul 51*4882a593Smuzhiyun #define APIC_SPIV 0xF0 52*4882a593Smuzhiyun #define APIC_SPIV_DIRECTED_EOI (1 << 12) 53*4882a593Smuzhiyun #define APIC_SPIV_FOCUS_DISABLED (1 << 9) 54*4882a593Smuzhiyun #define APIC_SPIV_APIC_ENABLED (1 << 8) 55*4882a593Smuzhiyun #define APIC_ISR 0x100 56*4882a593Smuzhiyun #define APIC_ISR_NR 0x8 /* Number of 32 bit ISR registers. */ 57*4882a593Smuzhiyun #define APIC_TMR 0x180 58*4882a593Smuzhiyun #define APIC_IRR 0x200 59*4882a593Smuzhiyun #define APIC_ESR 0x280 60*4882a593Smuzhiyun #define APIC_ESR_SEND_CS 0x00001 61*4882a593Smuzhiyun #define APIC_ESR_RECV_CS 0x00002 62*4882a593Smuzhiyun #define APIC_ESR_SEND_ACC 0x00004 63*4882a593Smuzhiyun #define APIC_ESR_RECV_ACC 0x00008 64*4882a593Smuzhiyun #define APIC_ESR_SENDILL 0x00020 65*4882a593Smuzhiyun #define APIC_ESR_RECVILL 0x00040 66*4882a593Smuzhiyun #define APIC_ESR_ILLREGA 0x00080 67*4882a593Smuzhiyun #define APIC_LVTCMCI 0x2f0 68*4882a593Smuzhiyun #define APIC_ICR 0x300 69*4882a593Smuzhiyun #define APIC_DEST_SELF 0x40000 70*4882a593Smuzhiyun #define APIC_DEST_ALLINC 0x80000 71*4882a593Smuzhiyun #define APIC_DEST_ALLBUT 0xC0000 72*4882a593Smuzhiyun #define APIC_ICR_RR_MASK 0x30000 73*4882a593Smuzhiyun #define APIC_ICR_RR_INVALID 0x00000 74*4882a593Smuzhiyun #define APIC_ICR_RR_INPROG 0x10000 75*4882a593Smuzhiyun #define APIC_ICR_RR_VALID 0x20000 76*4882a593Smuzhiyun #define APIC_INT_LEVELTRIG 0x08000 77*4882a593Smuzhiyun #define APIC_INT_ASSERT 0x04000 78*4882a593Smuzhiyun #define APIC_ICR_BUSY 0x01000 79*4882a593Smuzhiyun #define APIC_DEST_LOGICAL 0x00800 80*4882a593Smuzhiyun #define APIC_DEST_PHYSICAL 0x00000 81*4882a593Smuzhiyun #define APIC_DM_FIXED 0x00000 82*4882a593Smuzhiyun #define APIC_DM_FIXED_MASK 0x00700 83*4882a593Smuzhiyun #define APIC_DM_LOWEST 0x00100 84*4882a593Smuzhiyun #define APIC_DM_SMI 0x00200 85*4882a593Smuzhiyun #define APIC_DM_REMRD 0x00300 86*4882a593Smuzhiyun #define APIC_DM_NMI 0x00400 87*4882a593Smuzhiyun #define APIC_DM_INIT 0x00500 88*4882a593Smuzhiyun #define APIC_DM_STARTUP 0x00600 89*4882a593Smuzhiyun #define APIC_DM_EXTINT 0x00700 90*4882a593Smuzhiyun #define APIC_VECTOR_MASK 0x000FF 91*4882a593Smuzhiyun #define APIC_ICR2 0x310 92*4882a593Smuzhiyun #define GET_APIC_DEST_FIELD(x) (((x) >> 24) & 0xFF) 93*4882a593Smuzhiyun #define SET_APIC_DEST_FIELD(x) ((x) << 24) 94*4882a593Smuzhiyun #define APIC_LVTT 0x320 95*4882a593Smuzhiyun #define APIC_LVTTHMR 0x330 96*4882a593Smuzhiyun #define APIC_LVTPC 0x340 97*4882a593Smuzhiyun #define APIC_LVT0 0x350 98*4882a593Smuzhiyun #define APIC_LVT_TIMER_BASE_MASK (0x3 << 18) 99*4882a593Smuzhiyun #define GET_APIC_TIMER_BASE(x) (((x) >> 18) & 0x3) 100*4882a593Smuzhiyun #define SET_APIC_TIMER_BASE(x) (((x) << 18)) 101*4882a593Smuzhiyun #define APIC_TIMER_BASE_CLKIN 0x0 102*4882a593Smuzhiyun #define APIC_TIMER_BASE_TMBASE 0x1 103*4882a593Smuzhiyun #define APIC_TIMER_BASE_DIV 0x2 104*4882a593Smuzhiyun #define APIC_LVT_TIMER_ONESHOT (0 << 17) 105*4882a593Smuzhiyun #define APIC_LVT_TIMER_PERIODIC (1 << 17) 106*4882a593Smuzhiyun #define APIC_LVT_TIMER_TSCDEADLINE (2 << 17) 107*4882a593Smuzhiyun #define APIC_LVT_MASKED (1 << 16) 108*4882a593Smuzhiyun #define APIC_LVT_LEVEL_TRIGGER (1 << 15) 109*4882a593Smuzhiyun #define APIC_LVT_REMOTE_IRR (1 << 14) 110*4882a593Smuzhiyun #define APIC_INPUT_POLARITY (1 << 13) 111*4882a593Smuzhiyun #define APIC_SEND_PENDING (1 << 12) 112*4882a593Smuzhiyun #define APIC_MODE_MASK 0x700 113*4882a593Smuzhiyun #define GET_APIC_DELIVERY_MODE(x) (((x) >> 8) & 0x7) 114*4882a593Smuzhiyun #define SET_APIC_DELIVERY_MODE(x, y) (((x) & ~0x700) | ((y) << 8)) 115*4882a593Smuzhiyun #define APIC_MODE_FIXED 0x0 116*4882a593Smuzhiyun #define APIC_MODE_NMI 0x4 117*4882a593Smuzhiyun #define APIC_MODE_EXTINT 0x7 118*4882a593Smuzhiyun #define APIC_LVT1 0x360 119*4882a593Smuzhiyun #define APIC_LVTERR 0x370 120*4882a593Smuzhiyun #define APIC_TMICT 0x380 121*4882a593Smuzhiyun #define APIC_TMCCT 0x390 122*4882a593Smuzhiyun #define APIC_TDCR 0x3E0 123*4882a593Smuzhiyun #define APIC_SELF_IPI 0x3F0 124*4882a593Smuzhiyun #define APIC_TDR_DIV_TMBASE (1 << 2) 125*4882a593Smuzhiyun #define APIC_TDR_DIV_1 0xB 126*4882a593Smuzhiyun #define APIC_TDR_DIV_2 0x0 127*4882a593Smuzhiyun #define APIC_TDR_DIV_4 0x1 128*4882a593Smuzhiyun #define APIC_TDR_DIV_8 0x2 129*4882a593Smuzhiyun #define APIC_TDR_DIV_16 0x3 130*4882a593Smuzhiyun #define APIC_TDR_DIV_32 0x8 131*4882a593Smuzhiyun #define APIC_TDR_DIV_64 0x9 132*4882a593Smuzhiyun #define APIC_TDR_DIV_128 0xA 133*4882a593Smuzhiyun #define APIC_EFEAT 0x400 134*4882a593Smuzhiyun #define APIC_ECTRL 0x410 135*4882a593Smuzhiyun #define APIC_EILVTn(n) (0x500 + 0x10 * n) 136*4882a593Smuzhiyun #define APIC_EILVT_NR_AMD_K8 1 /* # of extended interrupts */ 137*4882a593Smuzhiyun #define APIC_EILVT_NR_AMD_10H 4 138*4882a593Smuzhiyun #define APIC_EILVT_NR_MAX APIC_EILVT_NR_AMD_10H 139*4882a593Smuzhiyun #define APIC_EILVT_LVTOFF(x) (((x) >> 4) & 0xF) 140*4882a593Smuzhiyun #define APIC_EILVT_MSG_FIX 0x0 141*4882a593Smuzhiyun #define APIC_EILVT_MSG_SMI 0x2 142*4882a593Smuzhiyun #define APIC_EILVT_MSG_NMI 0x4 143*4882a593Smuzhiyun #define APIC_EILVT_MSG_EXT 0x7 144*4882a593Smuzhiyun #define APIC_EILVT_MASKED (1 << 16) 145*4882a593Smuzhiyun 146*4882a593Smuzhiyun #define APIC_BASE (fix_to_virt(FIX_APIC_BASE)) 147*4882a593Smuzhiyun #define APIC_BASE_MSR 0x800 148*4882a593Smuzhiyun #define XAPIC_ENABLE (1UL << 11) 149*4882a593Smuzhiyun #define X2APIC_ENABLE (1UL << 10) 150*4882a593Smuzhiyun 151*4882a593Smuzhiyun #ifdef CONFIG_X86_32 152*4882a593Smuzhiyun # define MAX_IO_APICS 64 153*4882a593Smuzhiyun # define MAX_LOCAL_APIC 256 154*4882a593Smuzhiyun #else 155*4882a593Smuzhiyun # define MAX_IO_APICS 128 156*4882a593Smuzhiyun # define MAX_LOCAL_APIC 32768 157*4882a593Smuzhiyun #endif 158*4882a593Smuzhiyun 159*4882a593Smuzhiyun /* 160*4882a593Smuzhiyun * All x86-64 systems are xAPIC compatible. 161*4882a593Smuzhiyun * In the following, "apicid" is a physical APIC ID. 162*4882a593Smuzhiyun */ 163*4882a593Smuzhiyun #define XAPIC_DEST_CPUS_SHIFT 4 164*4882a593Smuzhiyun #define XAPIC_DEST_CPUS_MASK ((1u << XAPIC_DEST_CPUS_SHIFT) - 1) 165*4882a593Smuzhiyun #define XAPIC_DEST_CLUSTER_MASK (XAPIC_DEST_CPUS_MASK << XAPIC_DEST_CPUS_SHIFT) 166*4882a593Smuzhiyun #define APIC_CLUSTER(apicid) ((apicid) & XAPIC_DEST_CLUSTER_MASK) 167*4882a593Smuzhiyun #define APIC_CLUSTERID(apicid) (APIC_CLUSTER(apicid) >> XAPIC_DEST_CPUS_SHIFT) 168*4882a593Smuzhiyun #define APIC_CPUID(apicid) ((apicid) & XAPIC_DEST_CPUS_MASK) 169*4882a593Smuzhiyun #define NUM_APIC_CLUSTERS ((BAD_APICID + 1) >> XAPIC_DEST_CPUS_SHIFT) 170*4882a593Smuzhiyun 171*4882a593Smuzhiyun /* 172*4882a593Smuzhiyun * the local APIC register structure, memory mapped. Not terribly well 173*4882a593Smuzhiyun * tested, but we might eventually use this one in the future - the 174*4882a593Smuzhiyun * problem why we cannot use it right now is the P5 APIC, it has an 175*4882a593Smuzhiyun * errata which cannot take 8-bit reads and writes, only 32-bit ones ... 176*4882a593Smuzhiyun */ 177*4882a593Smuzhiyun #define u32 unsigned int 178*4882a593Smuzhiyun 179*4882a593Smuzhiyun struct local_apic { 180*4882a593Smuzhiyun 181*4882a593Smuzhiyun /*000*/ struct { u32 __reserved[4]; } __reserved_01; 182*4882a593Smuzhiyun 183*4882a593Smuzhiyun /*010*/ struct { u32 __reserved[4]; } __reserved_02; 184*4882a593Smuzhiyun 185*4882a593Smuzhiyun /*020*/ struct { /* APIC ID Register */ 186*4882a593Smuzhiyun u32 __reserved_1 : 24, 187*4882a593Smuzhiyun phys_apic_id : 4, 188*4882a593Smuzhiyun __reserved_2 : 4; 189*4882a593Smuzhiyun u32 __reserved[3]; 190*4882a593Smuzhiyun } id; 191*4882a593Smuzhiyun 192*4882a593Smuzhiyun /*030*/ const 193*4882a593Smuzhiyun struct { /* APIC Version Register */ 194*4882a593Smuzhiyun u32 version : 8, 195*4882a593Smuzhiyun __reserved_1 : 8, 196*4882a593Smuzhiyun max_lvt : 8, 197*4882a593Smuzhiyun __reserved_2 : 8; 198*4882a593Smuzhiyun u32 __reserved[3]; 199*4882a593Smuzhiyun } version; 200*4882a593Smuzhiyun 201*4882a593Smuzhiyun /*040*/ struct { u32 __reserved[4]; } __reserved_03; 202*4882a593Smuzhiyun 203*4882a593Smuzhiyun /*050*/ struct { u32 __reserved[4]; } __reserved_04; 204*4882a593Smuzhiyun 205*4882a593Smuzhiyun /*060*/ struct { u32 __reserved[4]; } __reserved_05; 206*4882a593Smuzhiyun 207*4882a593Smuzhiyun /*070*/ struct { u32 __reserved[4]; } __reserved_06; 208*4882a593Smuzhiyun 209*4882a593Smuzhiyun /*080*/ struct { /* Task Priority Register */ 210*4882a593Smuzhiyun u32 priority : 8, 211*4882a593Smuzhiyun __reserved_1 : 24; 212*4882a593Smuzhiyun u32 __reserved_2[3]; 213*4882a593Smuzhiyun } tpr; 214*4882a593Smuzhiyun 215*4882a593Smuzhiyun /*090*/ const 216*4882a593Smuzhiyun struct { /* Arbitration Priority Register */ 217*4882a593Smuzhiyun u32 priority : 8, 218*4882a593Smuzhiyun __reserved_1 : 24; 219*4882a593Smuzhiyun u32 __reserved_2[3]; 220*4882a593Smuzhiyun } apr; 221*4882a593Smuzhiyun 222*4882a593Smuzhiyun /*0A0*/ const 223*4882a593Smuzhiyun struct { /* Processor Priority Register */ 224*4882a593Smuzhiyun u32 priority : 8, 225*4882a593Smuzhiyun __reserved_1 : 24; 226*4882a593Smuzhiyun u32 __reserved_2[3]; 227*4882a593Smuzhiyun } ppr; 228*4882a593Smuzhiyun 229*4882a593Smuzhiyun /*0B0*/ struct { /* End Of Interrupt Register */ 230*4882a593Smuzhiyun u32 eoi; 231*4882a593Smuzhiyun u32 __reserved[3]; 232*4882a593Smuzhiyun } eoi; 233*4882a593Smuzhiyun 234*4882a593Smuzhiyun /*0C0*/ struct { u32 __reserved[4]; } __reserved_07; 235*4882a593Smuzhiyun 236*4882a593Smuzhiyun /*0D0*/ struct { /* Logical Destination Register */ 237*4882a593Smuzhiyun u32 __reserved_1 : 24, 238*4882a593Smuzhiyun logical_dest : 8; 239*4882a593Smuzhiyun u32 __reserved_2[3]; 240*4882a593Smuzhiyun } ldr; 241*4882a593Smuzhiyun 242*4882a593Smuzhiyun /*0E0*/ struct { /* Destination Format Register */ 243*4882a593Smuzhiyun u32 __reserved_1 : 28, 244*4882a593Smuzhiyun model : 4; 245*4882a593Smuzhiyun u32 __reserved_2[3]; 246*4882a593Smuzhiyun } dfr; 247*4882a593Smuzhiyun 248*4882a593Smuzhiyun /*0F0*/ struct { /* Spurious Interrupt Vector Register */ 249*4882a593Smuzhiyun u32 spurious_vector : 8, 250*4882a593Smuzhiyun apic_enabled : 1, 251*4882a593Smuzhiyun focus_cpu : 1, 252*4882a593Smuzhiyun __reserved_2 : 22; 253*4882a593Smuzhiyun u32 __reserved_3[3]; 254*4882a593Smuzhiyun } svr; 255*4882a593Smuzhiyun 256*4882a593Smuzhiyun /*100*/ struct { /* In Service Register */ 257*4882a593Smuzhiyun /*170*/ u32 bitfield; 258*4882a593Smuzhiyun u32 __reserved[3]; 259*4882a593Smuzhiyun } isr [8]; 260*4882a593Smuzhiyun 261*4882a593Smuzhiyun /*180*/ struct { /* Trigger Mode Register */ 262*4882a593Smuzhiyun /*1F0*/ u32 bitfield; 263*4882a593Smuzhiyun u32 __reserved[3]; 264*4882a593Smuzhiyun } tmr [8]; 265*4882a593Smuzhiyun 266*4882a593Smuzhiyun /*200*/ struct { /* Interrupt Request Register */ 267*4882a593Smuzhiyun /*270*/ u32 bitfield; 268*4882a593Smuzhiyun u32 __reserved[3]; 269*4882a593Smuzhiyun } irr [8]; 270*4882a593Smuzhiyun 271*4882a593Smuzhiyun /*280*/ union { /* Error Status Register */ 272*4882a593Smuzhiyun struct { 273*4882a593Smuzhiyun u32 send_cs_error : 1, 274*4882a593Smuzhiyun receive_cs_error : 1, 275*4882a593Smuzhiyun send_accept_error : 1, 276*4882a593Smuzhiyun receive_accept_error : 1, 277*4882a593Smuzhiyun __reserved_1 : 1, 278*4882a593Smuzhiyun send_illegal_vector : 1, 279*4882a593Smuzhiyun receive_illegal_vector : 1, 280*4882a593Smuzhiyun illegal_register_address : 1, 281*4882a593Smuzhiyun __reserved_2 : 24; 282*4882a593Smuzhiyun u32 __reserved_3[3]; 283*4882a593Smuzhiyun } error_bits; 284*4882a593Smuzhiyun struct { 285*4882a593Smuzhiyun u32 errors; 286*4882a593Smuzhiyun u32 __reserved_3[3]; 287*4882a593Smuzhiyun } all_errors; 288*4882a593Smuzhiyun } esr; 289*4882a593Smuzhiyun 290*4882a593Smuzhiyun /*290*/ struct { u32 __reserved[4]; } __reserved_08; 291*4882a593Smuzhiyun 292*4882a593Smuzhiyun /*2A0*/ struct { u32 __reserved[4]; } __reserved_09; 293*4882a593Smuzhiyun 294*4882a593Smuzhiyun /*2B0*/ struct { u32 __reserved[4]; } __reserved_10; 295*4882a593Smuzhiyun 296*4882a593Smuzhiyun /*2C0*/ struct { u32 __reserved[4]; } __reserved_11; 297*4882a593Smuzhiyun 298*4882a593Smuzhiyun /*2D0*/ struct { u32 __reserved[4]; } __reserved_12; 299*4882a593Smuzhiyun 300*4882a593Smuzhiyun /*2E0*/ struct { u32 __reserved[4]; } __reserved_13; 301*4882a593Smuzhiyun 302*4882a593Smuzhiyun /*2F0*/ struct { u32 __reserved[4]; } __reserved_14; 303*4882a593Smuzhiyun 304*4882a593Smuzhiyun /*300*/ struct { /* Interrupt Command Register 1 */ 305*4882a593Smuzhiyun u32 vector : 8, 306*4882a593Smuzhiyun delivery_mode : 3, 307*4882a593Smuzhiyun destination_mode : 1, 308*4882a593Smuzhiyun delivery_status : 1, 309*4882a593Smuzhiyun __reserved_1 : 1, 310*4882a593Smuzhiyun level : 1, 311*4882a593Smuzhiyun trigger : 1, 312*4882a593Smuzhiyun __reserved_2 : 2, 313*4882a593Smuzhiyun shorthand : 2, 314*4882a593Smuzhiyun __reserved_3 : 12; 315*4882a593Smuzhiyun u32 __reserved_4[3]; 316*4882a593Smuzhiyun } icr1; 317*4882a593Smuzhiyun 318*4882a593Smuzhiyun /*310*/ struct { /* Interrupt Command Register 2 */ 319*4882a593Smuzhiyun union { 320*4882a593Smuzhiyun u32 __reserved_1 : 24, 321*4882a593Smuzhiyun phys_dest : 4, 322*4882a593Smuzhiyun __reserved_2 : 4; 323*4882a593Smuzhiyun u32 __reserved_3 : 24, 324*4882a593Smuzhiyun logical_dest : 8; 325*4882a593Smuzhiyun } dest; 326*4882a593Smuzhiyun u32 __reserved_4[3]; 327*4882a593Smuzhiyun } icr2; 328*4882a593Smuzhiyun 329*4882a593Smuzhiyun /*320*/ struct { /* LVT - Timer */ 330*4882a593Smuzhiyun u32 vector : 8, 331*4882a593Smuzhiyun __reserved_1 : 4, 332*4882a593Smuzhiyun delivery_status : 1, 333*4882a593Smuzhiyun __reserved_2 : 3, 334*4882a593Smuzhiyun mask : 1, 335*4882a593Smuzhiyun timer_mode : 1, 336*4882a593Smuzhiyun __reserved_3 : 14; 337*4882a593Smuzhiyun u32 __reserved_4[3]; 338*4882a593Smuzhiyun } lvt_timer; 339*4882a593Smuzhiyun 340*4882a593Smuzhiyun /*330*/ struct { /* LVT - Thermal Sensor */ 341*4882a593Smuzhiyun u32 vector : 8, 342*4882a593Smuzhiyun delivery_mode : 3, 343*4882a593Smuzhiyun __reserved_1 : 1, 344*4882a593Smuzhiyun delivery_status : 1, 345*4882a593Smuzhiyun __reserved_2 : 3, 346*4882a593Smuzhiyun mask : 1, 347*4882a593Smuzhiyun __reserved_3 : 15; 348*4882a593Smuzhiyun u32 __reserved_4[3]; 349*4882a593Smuzhiyun } lvt_thermal; 350*4882a593Smuzhiyun 351*4882a593Smuzhiyun /*340*/ struct { /* LVT - Performance Counter */ 352*4882a593Smuzhiyun u32 vector : 8, 353*4882a593Smuzhiyun delivery_mode : 3, 354*4882a593Smuzhiyun __reserved_1 : 1, 355*4882a593Smuzhiyun delivery_status : 1, 356*4882a593Smuzhiyun __reserved_2 : 3, 357*4882a593Smuzhiyun mask : 1, 358*4882a593Smuzhiyun __reserved_3 : 15; 359*4882a593Smuzhiyun u32 __reserved_4[3]; 360*4882a593Smuzhiyun } lvt_pc; 361*4882a593Smuzhiyun 362*4882a593Smuzhiyun /*350*/ struct { /* LVT - LINT0 */ 363*4882a593Smuzhiyun u32 vector : 8, 364*4882a593Smuzhiyun delivery_mode : 3, 365*4882a593Smuzhiyun __reserved_1 : 1, 366*4882a593Smuzhiyun delivery_status : 1, 367*4882a593Smuzhiyun polarity : 1, 368*4882a593Smuzhiyun remote_irr : 1, 369*4882a593Smuzhiyun trigger : 1, 370*4882a593Smuzhiyun mask : 1, 371*4882a593Smuzhiyun __reserved_2 : 15; 372*4882a593Smuzhiyun u32 __reserved_3[3]; 373*4882a593Smuzhiyun } lvt_lint0; 374*4882a593Smuzhiyun 375*4882a593Smuzhiyun /*360*/ struct { /* LVT - LINT1 */ 376*4882a593Smuzhiyun u32 vector : 8, 377*4882a593Smuzhiyun delivery_mode : 3, 378*4882a593Smuzhiyun __reserved_1 : 1, 379*4882a593Smuzhiyun delivery_status : 1, 380*4882a593Smuzhiyun polarity : 1, 381*4882a593Smuzhiyun remote_irr : 1, 382*4882a593Smuzhiyun trigger : 1, 383*4882a593Smuzhiyun mask : 1, 384*4882a593Smuzhiyun __reserved_2 : 15; 385*4882a593Smuzhiyun u32 __reserved_3[3]; 386*4882a593Smuzhiyun } lvt_lint1; 387*4882a593Smuzhiyun 388*4882a593Smuzhiyun /*370*/ struct { /* LVT - Error */ 389*4882a593Smuzhiyun u32 vector : 8, 390*4882a593Smuzhiyun __reserved_1 : 4, 391*4882a593Smuzhiyun delivery_status : 1, 392*4882a593Smuzhiyun __reserved_2 : 3, 393*4882a593Smuzhiyun mask : 1, 394*4882a593Smuzhiyun __reserved_3 : 15; 395*4882a593Smuzhiyun u32 __reserved_4[3]; 396*4882a593Smuzhiyun } lvt_error; 397*4882a593Smuzhiyun 398*4882a593Smuzhiyun /*380*/ struct { /* Timer Initial Count Register */ 399*4882a593Smuzhiyun u32 initial_count; 400*4882a593Smuzhiyun u32 __reserved_2[3]; 401*4882a593Smuzhiyun } timer_icr; 402*4882a593Smuzhiyun 403*4882a593Smuzhiyun /*390*/ const 404*4882a593Smuzhiyun struct { /* Timer Current Count Register */ 405*4882a593Smuzhiyun u32 curr_count; 406*4882a593Smuzhiyun u32 __reserved_2[3]; 407*4882a593Smuzhiyun } timer_ccr; 408*4882a593Smuzhiyun 409*4882a593Smuzhiyun /*3A0*/ struct { u32 __reserved[4]; } __reserved_16; 410*4882a593Smuzhiyun 411*4882a593Smuzhiyun /*3B0*/ struct { u32 __reserved[4]; } __reserved_17; 412*4882a593Smuzhiyun 413*4882a593Smuzhiyun /*3C0*/ struct { u32 __reserved[4]; } __reserved_18; 414*4882a593Smuzhiyun 415*4882a593Smuzhiyun /*3D0*/ struct { u32 __reserved[4]; } __reserved_19; 416*4882a593Smuzhiyun 417*4882a593Smuzhiyun /*3E0*/ struct { /* Timer Divide Configuration Register */ 418*4882a593Smuzhiyun u32 divisor : 4, 419*4882a593Smuzhiyun __reserved_1 : 28; 420*4882a593Smuzhiyun u32 __reserved_2[3]; 421*4882a593Smuzhiyun } timer_dcr; 422*4882a593Smuzhiyun 423*4882a593Smuzhiyun /*3F0*/ struct { u32 __reserved[4]; } __reserved_20; 424*4882a593Smuzhiyun 425*4882a593Smuzhiyun } __attribute__ ((packed)); 426*4882a593Smuzhiyun 427*4882a593Smuzhiyun #undef u32 428*4882a593Smuzhiyun 429*4882a593Smuzhiyun #ifdef CONFIG_X86_32 430*4882a593Smuzhiyun #define BAD_APICID 0xFFu 431*4882a593Smuzhiyun #else 432*4882a593Smuzhiyun #define BAD_APICID 0xFFFFu 433*4882a593Smuzhiyun #endif 434*4882a593Smuzhiyun 435*4882a593Smuzhiyun enum ioapic_irq_destination_types { 436*4882a593Smuzhiyun dest_Fixed = 0, 437*4882a593Smuzhiyun dest_LowestPrio = 1, 438*4882a593Smuzhiyun dest_SMI = 2, 439*4882a593Smuzhiyun dest__reserved_1 = 3, 440*4882a593Smuzhiyun dest_NMI = 4, 441*4882a593Smuzhiyun dest_INIT = 5, 442*4882a593Smuzhiyun dest__reserved_2 = 6, 443*4882a593Smuzhiyun dest_ExtINT = 7 444*4882a593Smuzhiyun }; 445*4882a593Smuzhiyun 446*4882a593Smuzhiyun #endif /* _ASM_X86_APICDEF_H */ 447