2008-10-22 22:26:29 -07:00
# ifndef _ASM_X86_APICDEF_H
# define _ASM_X86_APICDEF_H
2008-01-30 13:30:14 +01:00
/*
* Constants for various Intel APICs . ( local APIC , IOAPIC , etc . )
*
* Alan Cox < Alan . Cox @ linux . org > , 1995.
* Ingo Molnar < mingo @ redhat . com > , 1999 , 2000
*/
2009-08-24 21:53:36 +04:00
# define IO_APIC_DEFAULT_PHYS_BASE 0xfec00000
# define APIC_DEFAULT_PHYS_BASE 0xfee00000
2008-01-30 13:30:14 +01:00
x86: io-apic: IO-APIC MMIO should not fail on resource insertion
If IO-APIC base address is 1K aligned we should not fail
on resourse insertion procedure. For this sake we define
IO_APIC_SLOT_SIZE constant which should cover all IO-APIC
direct accessible registers.
An example of a such configuration is there
http://marc.info/?l=linux-kernel&m=118114792006520
|
| Quoting the message
|
| IOAPIC[0]: apic_id 2, version 32, address 0xfec00000, GSI 0-23
| IOAPIC[1]: apic_id 3, version 32, address 0xfec80000, GSI 24-47
| IOAPIC[2]: apic_id 4, version 32, address 0xfec80400, GSI 48-71
| IOAPIC[3]: apic_id 5, version 32, address 0xfec84000, GSI 72-95
| IOAPIC[4]: apic_id 8, version 32, address 0xfec84400, GSI 96-119
|
Reported-by: "Maciej W. Rozycki" <macro@linux-mips.org>
Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org>
Acked-by: Yinghai Lu <yinghai@kernel.org>
LKML-Reference: <20091116151426.GC5653@lenovo>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
2009-11-16 18:14:26 +03:00
/*
* This is the IO - APIC register space as specified
* by Intel docs :
*/
# define IO_APIC_SLOT_SIZE 1024
2008-01-30 13:30:14 +01:00
# define APIC_ID 0x20
# define APIC_LVR 0x30
# define APIC_LVR_MASK 0xFF00FF
2009-07-05 17:39:35 +03:00
# define APIC_LVR_DIRECTED_EOI (1 << 24)
2008-03-23 01:01:39 -07:00
# define GET_APIC_VERSION(x) ((x) & 0xFFu)
# define GET_APIC_MAXLVT(x) (((x) >> 16) & 0xFFu)
2008-03-19 14:25:10 -03:00
# ifdef CONFIG_X86_32
2008-03-23 01:01:39 -07:00
# define APIC_INTEGRATED(x) ((x) & 0xF0u)
2008-03-19 14:25:10 -03:00
# else
# define APIC_INTEGRATED(x) (1)
# endif
2008-01-30 13:30:14 +01:00
# define APIC_XAPIC(x) ((x) >= 0x14)
2009-05-08 18:23:50 +02:00
# define APIC_EXT_SPACE(x) ((x) & 0x80000000)
2008-01-30 13:30:14 +01:00
# 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_EIO_ACK 0x0
# define APIC_RRR 0xC0
# define APIC_LDR 0xD0
2008-03-23 01:01:39 -07:00
# define APIC_LDR_MASK (0xFFu << 24)
# define GET_APIC_LOGICAL_ID(x) (((x) >> 24) & 0xFFu)
# define SET_APIC_LOGICAL_ID(x) (((x) << 24))
2008-01-30 13:30:14 +01:00
# define APIC_ALL_CPUS 0xFFu
# define APIC_DFR 0xE0
# define APIC_DFR_CLUSTER 0x0FFFFFFFul
# define APIC_DFR_FLAT 0xFFFFFFFFul
# define APIC_SPIV 0xF0
2009-07-05 17:39:35 +03:00
# define APIC_SPIV_DIRECTED_EOI (1 << 12)
2008-03-23 01:01:39 -07:00
# define APIC_SPIV_FOCUS_DISABLED (1 << 9)
# define APIC_SPIV_APIC_ENABLED (1 << 8)
2008-01-30 13:30:14 +01:00
# 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
2009-02-12 13:49:35 +01:00
# define APIC_LVTCMCI 0x2f0
2008-01-30 13:30:14 +01:00
# 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_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
2008-03-23 01:01:39 -07:00
# define GET_APIC_DEST_FIELD(x) (((x) >> 24) & 0xFF)
# define SET_APIC_DEST_FIELD(x) ((x) << 24)
2008-01-30 13:30:14 +01:00
# define APIC_LVTT 0x320
# define APIC_LVTTHMR 0x330
# define APIC_LVTPC 0x340
# define APIC_LVT0 0x350
2008-03-23 01:01:39 -07:00
# 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))
2008-01-30 13:30:14 +01:00
# define APIC_TIMER_BASE_CLKIN 0x0
# define APIC_TIMER_BASE_TMBASE 0x1
# define APIC_TIMER_BASE_DIV 0x2
2008-03-23 01:01:39 -07:00
# define APIC_LVT_TIMER_PERIODIC (1 << 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)
2008-01-30 13:30:14 +01:00
# define APIC_MODE_MASK 0x700
2008-03-23 01:01:39 -07:00
# define GET_APIC_DELIVERY_MODE(x) (((x) >> 8) & 0x7)
# define SET_APIC_DELIVERY_MODE(x, y) (((x) & ~0x700) | ((y) << 8))
2008-01-30 13:30:14 +01:00
# 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
2008-07-10 11:16:52 -07:00
# define APIC_SELF_IPI 0x3F0
2008-03-23 01:01:39 -07:00
# define APIC_TDR_DIV_TMBASE (1 << 2)
2008-01-30 13:30:14 +01:00
# 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
2009-05-08 18:23:50 +02:00
# define APIC_EFEAT 0x400
# define APIC_ECTRL 0x410
# define APIC_EILVTn(n) (0x500 + 0x10 * n)
2008-03-23 01:01:39 -07:00
# define APIC_EILVT_NR_AMD_K8 1 /* # of extended interrupts */
2008-01-30 13:30:40 +01:00
# define APIC_EILVT_NR_AMD_10H 4
2008-03-23 01:01:39 -07:00
# define APIC_EILVT_LVTOFF(x) (((x) >> 4) & 0xF)
2008-01-30 13:30:40 +01:00
# define APIC_EILVT_MSG_FIX 0x0
# define APIC_EILVT_MSG_SMI 0x2
# define APIC_EILVT_MSG_NMI 0x4
# define APIC_EILVT_MSG_EXT 0x7
2008-03-23 01:01:39 -07:00
# define APIC_EILVT_MASKED (1 << 16)
2008-01-30 13:30:14 +01:00
2008-01-30 13:30:14 +01:00
# define APIC_BASE (fix_to_virt(FIX_APIC_BASE))
2008-07-10 11:16:52 -07:00
# define APIC_BASE_MSR 0x800
# define X2APIC_ENABLE (1UL << 10)
2008-01-30 13:30:14 +01:00
2007-10-11 11:20:03 +02:00
# ifdef CONFIG_X86_32
2008-01-30 13:30:14 +01:00
# define MAX_IO_APICS 64
2007-10-11 11:20:03 +02:00
# else
2008-01-30 13:30:14 +01:00
# define MAX_IO_APICS 128
2008-03-28 14:12:08 -05:00
# define MAX_LOCAL_APIC 32768
2008-01-30 13:30:14 +01:00
# 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
2008-03-28 14:12:08 -05:00
# ifdef CONFIG_X86_32
# define BAD_APICID 0xFFu
# else
# define BAD_APICID 0xFFFFu
# endif
2008-10-22 22:26:29 -07:00
# endif /* _ASM_X86_APICDEF_H */