| Viewing file:  apicdef.h (11.23 KB)      -rw-r--r-- Select action/file-type:
 
  (+) |  (+) |  (+) | Code (+) | Session (+) |  (+) | SDB (+) |  (+) |  (+) |  (+) |  (+) |  (+) | 
 
#ifndef _ASM_X86_APICDEF_H#define _ASM_X86_APICDEF_H
 
 /*
 * Constants for various Intel APICs. (local APIC, IOAPIC, etc.)
 *
 * Alan Cox <Alan.Cox@linux.org>, 1995.
 * Ingo Molnar <mingo@redhat.com>, 1999, 2000
 */
 
 #define IO_APIC_DEFAULT_PHYS_BASE    0xfec00000
 #define    APIC_DEFAULT_PHYS_BASE        0xfee00000
 
 /*
 * This is the IO-APIC register space as specified
 * by Intel docs:
 */
 #define IO_APIC_SLOT_SIZE        1024
 
 #define    APIC_ID        0x20
 
 #define    APIC_LVR    0x30
 #define        APIC_LVR_MASK        0xFF00FF
 #define        APIC_LVR_DIRECTED_EOI    (1 << 24)
 #define        GET_APIC_VERSION(x)    ((x) & 0xFFu)
 #define        GET_APIC_MAXLVT(x)    (((x) >> 16) & 0xFFu)
 #ifdef CONFIG_X86_32
 #  define    APIC_INTEGRATED(x)    ((x) & 0xF0u)
 #else
 #  define    APIC_INTEGRATED(x)    (1)
 #endif
 #define        APIC_XAPIC(x)        ((x) >= 0x14)
 #define        APIC_EXT_SPACE(x)    ((x) & 0x80000000)
 #define    APIC_TASKPRI    0x80
 #define        APIC_TPRI_MASK        0xFFu
 #define    APIC_ARBPRI    0x90
 #define        APIC_ARBPRI_MASK    0xFFu
 #define    APIC_PROCPRI    0xA0
 #define    APIC_EOI    0xB0
 #define        APIC_EOI_ACK        0x0 /* Docs say 0 for future compat. */
 #define    APIC_RRR    0xC0
 #define    APIC_LDR    0xD0
 #define        APIC_LDR_MASK        (0xFFu << 24)
 #define        GET_APIC_LOGICAL_ID(x)    (((x) >> 24) & 0xFFu)
 #define        SET_APIC_LOGICAL_ID(x)    (((x) << 24))
 #define        APIC_ALL_CPUS        0xFFu
 #define    APIC_DFR    0xE0
 #define        APIC_DFR_CLUSTER        0x0FFFFFFFul
 #define        APIC_DFR_FLAT            0xFFFFFFFFul
 #define    APIC_SPIV    0xF0
 #define        APIC_SPIV_DIRECTED_EOI        (1 << 12)
 #define        APIC_SPIV_FOCUS_DISABLED    (1 << 9)
 #define        APIC_SPIV_APIC_ENABLED        (1 << 8)
 #define    APIC_ISR    0x100
 #define    APIC_ISR_NR     0x8     /* Number of 32 bit ISR registers. */
 #define    APIC_TMR    0x180
 #define    APIC_IRR    0x200
 #define    APIC_ESR    0x280
 #define        APIC_ESR_SEND_CS    0x00001
 #define        APIC_ESR_RECV_CS    0x00002
 #define        APIC_ESR_SEND_ACC    0x00004
 #define        APIC_ESR_RECV_ACC    0x00008
 #define        APIC_ESR_SENDILL    0x00020
 #define        APIC_ESR_RECVILL    0x00040
 #define        APIC_ESR_ILLREGA    0x00080
 #define     APIC_LVTCMCI    0x2f0
 #define    APIC_ICR    0x300
 #define        APIC_DEST_SELF        0x40000
 #define        APIC_DEST_ALLINC    0x80000
 #define        APIC_DEST_ALLBUT    0xC0000
 #define        APIC_ICR_RR_MASK    0x30000
 #define        APIC_ICR_RR_INVALID    0x00000
 #define        APIC_ICR_RR_INPROG    0x10000
 #define        APIC_ICR_RR_VALID    0x20000
 #define        APIC_INT_LEVELTRIG    0x08000
 #define        APIC_INT_ASSERT        0x04000
 #define        APIC_ICR_BUSY        0x01000
 #define        APIC_DEST_LOGICAL    0x00800
 #define        APIC_DEST_PHYSICAL    0x00000
 #define        APIC_DM_FIXED        0x00000
 #define        APIC_DM_FIXED_MASK    0x00700
 #define        APIC_DM_LOWEST        0x00100
 #define        APIC_DM_SMI        0x00200
 #define        APIC_DM_REMRD        0x00300
 #define        APIC_DM_NMI        0x00400
 #define        APIC_DM_INIT        0x00500
 #define        APIC_DM_STARTUP        0x00600
 #define        APIC_DM_EXTINT        0x00700
 #define        APIC_VECTOR_MASK    0x000FF
 #define    APIC_ICR2    0x310
 #define        GET_APIC_DEST_FIELD(x)    (((x) >> 24) & 0xFF)
 #define        SET_APIC_DEST_FIELD(x)    ((x) << 24)
 #define    APIC_LVTT    0x320
 #define    APIC_LVTTHMR    0x330
 #define    APIC_LVTPC    0x340
 #define    APIC_LVT0    0x350
 #define        APIC_LVT_TIMER_BASE_MASK    (0x3 << 18)
 #define        GET_APIC_TIMER_BASE(x)        (((x) >> 18) & 0x3)
 #define        SET_APIC_TIMER_BASE(x)        (((x) << 18))
 #define        APIC_TIMER_BASE_CLKIN        0x0
 #define        APIC_TIMER_BASE_TMBASE        0x1
 #define        APIC_TIMER_BASE_DIV        0x2
 #define        APIC_LVT_TIMER_ONESHOT        (0 << 17)
 #define        APIC_LVT_TIMER_PERIODIC        (1 << 17)
 #define        APIC_LVT_TIMER_TSCDEADLINE    (2 << 17)
 #define        APIC_LVT_MASKED            (1 << 16)
 #define        APIC_LVT_LEVEL_TRIGGER        (1 << 15)
 #define        APIC_LVT_REMOTE_IRR        (1 << 14)
 #define        APIC_INPUT_POLARITY        (1 << 13)
 #define        APIC_SEND_PENDING        (1 << 12)
 #define        APIC_MODE_MASK            0x700
 #define        GET_APIC_DELIVERY_MODE(x)    (((x) >> 8) & 0x7)
 #define        SET_APIC_DELIVERY_MODE(x, y)    (((x) & ~0x700) | ((y) << 8))
 #define            APIC_MODE_FIXED        0x0
 #define            APIC_MODE_NMI        0x4
 #define            APIC_MODE_EXTINT    0x7
 #define    APIC_LVT1    0x360
 #define    APIC_LVTERR    0x370
 #define    APIC_TMICT    0x380
 #define    APIC_TMCCT    0x390
 #define    APIC_TDCR    0x3E0
 #define APIC_SELF_IPI    0x3F0
 #define        APIC_TDR_DIV_TMBASE    (1 << 2)
 #define        APIC_TDR_DIV_1        0xB
 #define        APIC_TDR_DIV_2        0x0
 #define        APIC_TDR_DIV_4        0x1
 #define        APIC_TDR_DIV_8        0x2
 #define        APIC_TDR_DIV_16        0x3
 #define        APIC_TDR_DIV_32        0x8
 #define        APIC_TDR_DIV_64        0x9
 #define        APIC_TDR_DIV_128    0xA
 #define    APIC_EFEAT    0x400
 #define    APIC_ECTRL    0x410
 #define APIC_EILVTn(n)    (0x500 + 0x10 * n)
 #define        APIC_EILVT_NR_AMD_K8    1    /* # of extended interrupts */
 #define        APIC_EILVT_NR_AMD_10H    4
 #define        APIC_EILVT_NR_MAX    APIC_EILVT_NR_AMD_10H
 #define        APIC_EILVT_LVTOFF(x)    (((x) >> 4) & 0xF)
 #define        APIC_EILVT_MSG_FIX    0x0
 #define        APIC_EILVT_MSG_SMI    0x2
 #define        APIC_EILVT_MSG_NMI    0x4
 #define        APIC_EILVT_MSG_EXT    0x7
 #define        APIC_EILVT_MASKED    (1 << 16)
 
 #define APIC_BASE (fix_to_virt(FIX_APIC_BASE))
 #define APIC_BASE_MSR    0x800
 #define XAPIC_ENABLE    (1UL << 11)
 #define X2APIC_ENABLE    (1UL << 10)
 
 #ifdef CONFIG_X86_32
 # define MAX_IO_APICS 64
 # define MAX_LOCAL_APIC 256
 #else
 # define MAX_IO_APICS 128
 # define MAX_LOCAL_APIC 32768
 #endif
 
 /*
 * All x86-64 systems are xAPIC compatible.
 * In the following, "apicid" is a physical APIC ID.
 */
 #define XAPIC_DEST_CPUS_SHIFT    4
 #define XAPIC_DEST_CPUS_MASK    ((1u << XAPIC_DEST_CPUS_SHIFT) - 1)
 #define XAPIC_DEST_CLUSTER_MASK    (XAPIC_DEST_CPUS_MASK << XAPIC_DEST_CPUS_SHIFT)
 #define APIC_CLUSTER(apicid)    ((apicid) & XAPIC_DEST_CLUSTER_MASK)
 #define APIC_CLUSTERID(apicid)    (APIC_CLUSTER(apicid) >> XAPIC_DEST_CPUS_SHIFT)
 #define APIC_CPUID(apicid)    ((apicid) & XAPIC_DEST_CPUS_MASK)
 #define NUM_APIC_CLUSTERS    ((BAD_APICID + 1) >> XAPIC_DEST_CPUS_SHIFT)
 
 /*
 * the local APIC register structure, memory mapped. Not terribly well
 * tested, but we might eventually use this one in the future - the
 * problem why we cannot use it right now is the P5 APIC, it has an
 * errata which cannot take 8-bit reads and writes, only 32-bit ones ...
 */
 #define u32 unsigned int
 
 struct local_apic {
 
 /*000*/    struct { u32 __reserved[4]; } __reserved_01;
 
 /*010*/    struct { u32 __reserved[4]; } __reserved_02;
 
 /*020*/    struct { /* APIC ID Register */
 u32   __reserved_1    : 24,
 phys_apic_id    :  4,
 __reserved_2    :  4;
 u32 __reserved[3];
 } id;
 
 /*030*/    const
 struct { /* APIC Version Register */
 u32   version        :  8,
 __reserved_1    :  8,
 max_lvt        :  8,
 __reserved_2    :  8;
 u32 __reserved[3];
 } version;
 
 /*040*/    struct { u32 __reserved[4]; } __reserved_03;
 
 /*050*/    struct { u32 __reserved[4]; } __reserved_04;
 
 /*060*/    struct { u32 __reserved[4]; } __reserved_05;
 
 /*070*/    struct { u32 __reserved[4]; } __reserved_06;
 
 /*080*/    struct { /* Task Priority Register */
 u32   priority    :  8,
 __reserved_1    : 24;
 u32 __reserved_2[3];
 } tpr;
 
 /*090*/    const
 struct { /* Arbitration Priority Register */
 u32   priority    :  8,
 __reserved_1    : 24;
 u32 __reserved_2[3];
 } apr;
 
 /*0A0*/    const
 struct { /* Processor Priority Register */
 u32   priority    :  8,
 __reserved_1    : 24;
 u32 __reserved_2[3];
 } ppr;
 
 /*0B0*/    struct { /* End Of Interrupt Register */
 u32   eoi;
 u32 __reserved[3];
 } eoi;
 
 /*0C0*/    struct { u32 __reserved[4]; } __reserved_07;
 
 /*0D0*/    struct { /* Logical Destination Register */
 u32   __reserved_1    : 24,
 logical_dest    :  8;
 u32 __reserved_2[3];
 } ldr;
 
 /*0E0*/    struct { /* Destination Format Register */
 u32   __reserved_1    : 28,
 model        :  4;
 u32 __reserved_2[3];
 } dfr;
 
 /*0F0*/    struct { /* Spurious Interrupt Vector Register */
 u32    spurious_vector    :  8,
 apic_enabled    :  1,
 focus_cpu    :  1,
 __reserved_2    : 22;
 u32 __reserved_3[3];
 } svr;
 
 /*100*/    struct { /* In Service Register */
 /*170*/        u32 bitfield;
 u32 __reserved[3];
 } isr [8];
 
 /*180*/    struct { /* Trigger Mode Register */
 /*1F0*/        u32 bitfield;
 u32 __reserved[3];
 } tmr [8];
 
 /*200*/    struct { /* Interrupt Request Register */
 /*270*/        u32 bitfield;
 u32 __reserved[3];
 } irr [8];
 
 /*280*/    union { /* Error Status Register */
 struct {
 u32   send_cs_error            :  1,
 receive_cs_error        :  1,
 send_accept_error        :  1,
 receive_accept_error        :  1,
 __reserved_1            :  1,
 send_illegal_vector        :  1,
 receive_illegal_vector        :  1,
 illegal_register_address    :  1,
 __reserved_2            : 24;
 u32 __reserved_3[3];
 } error_bits;
 struct {
 u32 errors;
 u32 __reserved_3[3];
 } all_errors;
 } esr;
 
 /*290*/    struct { u32 __reserved[4]; } __reserved_08;
 
 /*2A0*/    struct { u32 __reserved[4]; } __reserved_09;
 
 /*2B0*/    struct { u32 __reserved[4]; } __reserved_10;
 
 /*2C0*/    struct { u32 __reserved[4]; } __reserved_11;
 
 /*2D0*/    struct { u32 __reserved[4]; } __reserved_12;
 
 /*2E0*/    struct { u32 __reserved[4]; } __reserved_13;
 
 /*2F0*/    struct { u32 __reserved[4]; } __reserved_14;
 
 /*300*/    struct { /* Interrupt Command Register 1 */
 u32   vector            :  8,
 delivery_mode        :  3,
 destination_mode    :  1,
 delivery_status        :  1,
 __reserved_1        :  1,
 level            :  1,
 trigger            :  1,
 __reserved_2        :  2,
 shorthand        :  2,
 __reserved_3        :  12;
 u32 __reserved_4[3];
 } icr1;
 
 /*310*/    struct { /* Interrupt Command Register 2 */
 union {
 u32   __reserved_1    : 24,
 phys_dest    :  4,
 __reserved_2    :  4;
 u32   __reserved_3    : 24,
 logical_dest    :  8;
 } dest;
 u32 __reserved_4[3];
 } icr2;
 
 /*320*/    struct { /* LVT - Timer */
 u32   vector        :  8,
 __reserved_1    :  4,
 delivery_status    :  1,
 __reserved_2    :  3,
 mask        :  1,
 timer_mode    :  1,
 __reserved_3    : 14;
 u32 __reserved_4[3];
 } lvt_timer;
 
 /*330*/    struct { /* LVT - Thermal Sensor */
 u32  vector        :  8,
 delivery_mode    :  3,
 __reserved_1    :  1,
 delivery_status    :  1,
 __reserved_2    :  3,
 mask        :  1,
 __reserved_3    : 15;
 u32 __reserved_4[3];
 } lvt_thermal;
 
 /*340*/    struct { /* LVT - Performance Counter */
 u32   vector        :  8,
 delivery_mode    :  3,
 __reserved_1    :  1,
 delivery_status    :  1,
 __reserved_2    :  3,
 mask        :  1,
 __reserved_3    : 15;
 u32 __reserved_4[3];
 } lvt_pc;
 
 /*350*/    struct { /* LVT - LINT0 */
 u32   vector        :  8,
 delivery_mode    :  3,
 __reserved_1    :  1,
 delivery_status    :  1,
 polarity    :  1,
 remote_irr    :  1,
 trigger        :  1,
 mask        :  1,
 __reserved_2    : 15;
 u32 __reserved_3[3];
 } lvt_lint0;
 
 /*360*/    struct { /* LVT - LINT1 */
 u32   vector        :  8,
 delivery_mode    :  3,
 __reserved_1    :  1,
 delivery_status    :  1,
 polarity    :  1,
 remote_irr    :  1,
 trigger        :  1,
 mask        :  1,
 __reserved_2    : 15;
 u32 __reserved_3[3];
 } lvt_lint1;
 
 /*370*/    struct { /* LVT - Error */
 u32   vector        :  8,
 __reserved_1    :  4,
 delivery_status    :  1,
 __reserved_2    :  3,
 mask        :  1,
 __reserved_3    : 15;
 u32 __reserved_4[3];
 } lvt_error;
 
 /*380*/    struct { /* Timer Initial Count Register */
 u32   initial_count;
 u32 __reserved_2[3];
 } timer_icr;
 
 /*390*/    const
 struct { /* Timer Current Count Register */
 u32   curr_count;
 u32 __reserved_2[3];
 } timer_ccr;
 
 /*3A0*/    struct { u32 __reserved[4]; } __reserved_16;
 
 /*3B0*/    struct { u32 __reserved[4]; } __reserved_17;
 
 /*3C0*/    struct { u32 __reserved[4]; } __reserved_18;
 
 /*3D0*/    struct { u32 __reserved[4]; } __reserved_19;
 
 /*3E0*/    struct { /* Timer Divide Configuration Register */
 u32   divisor        :  4,
 __reserved_1    : 28;
 u32 __reserved_2[3];
 } timer_dcr;
 
 /*3F0*/    struct { u32 __reserved[4]; } __reserved_20;
 
 } __attribute__ ((packed));
 
 #undef u32
 
 #ifdef CONFIG_X86_32
 #define BAD_APICID 0xFFu
 #else
 #define BAD_APICID 0xFFFFu
 #endif
 
 enum ioapic_irq_destination_types {
 dest_Fixed        = 0,
 dest_LowestPrio        = 1,
 dest_SMI        = 2,
 dest__reserved_1    = 3,
 dest_NMI        = 4,
 dest_INIT        = 5,
 dest__reserved_2    = 6,
 dest_ExtINT        = 7
 };
 
 #endif /* _ASM_X86_APICDEF_H */
 
 |