Subversion Repositories shark

Rev

Rev 303 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
299 giacomo 1
#ifndef __APIC_H__
2
#define __APIC_H__
3
 
4
#define         APIC_DEFAULT_PHYS_BASE  0xfee00000
5
 
6
#define         APIC_ID         0x20
7
#define                 APIC_ID_MASK            (0x0F<<24)
8
#define                 GET_APIC_ID(x)          (((x)>>24)&0x0F)
9
#define         APIC_LVR        0x30
10
#define                 APIC_LVR_MASK           0xFF00FF
11
#define                 GET_APIC_VERSION(x)     ((x)&0xFF)
12
#define                 GET_APIC_MAXLVT(x)      (((x)>>16)&0xFF)
13
#define                 APIC_INTEGRATED(x)      ((x)&0xF0)
14
#define         APIC_TASKPRI    0x80
15
#define                 APIC_TPRI_MASK          0xFF
16
#define         APIC_ARBPRI     0x90
17
#define                 APIC_ARBPRI_MASK        0xFF
18
#define         APIC_PROCPRI    0xA0
19
#define         APIC_EOI        0xB0
20
#define                 APIC_EIO_ACK            0x0             /* Write this to the EOI register */
21
#define         APIC_RRR        0xC0
22
#define         APIC_LDR        0xD0
23
#define                 APIC_LDR_MASK           (0xFF<<24)
24
#define                 GET_APIC_LOGICAL_ID(x)  (((x)>>24)&0xFF)
25
#define                 SET_APIC_LOGICAL_ID(x)  (((x)<<24))
26
#define                 APIC_ALL_CPUS           0xFF
27
#define         APIC_DFR        0xE0
28
#define                 APIC_DFR_CLUSTER        0x0FFFFFFFul    /* Clustered */
29
#define                 APIC_DFR_FLAT           0xFFFFFFFFul    /* Flat mode */
30
#define         APIC_SPIV       0xF0
31
#define                 APIC_SPIV_FOCUS_DISABLED        (1<<9)
32
#define                 APIC_SPIV_APIC_ENABLED          (1<<8)
33
#define         APIC_ISR        0x100
34
#define         APIC_TMR        0x180
35
#define         APIC_IRR        0x200
36
#define         APIC_ESR        0x280
37
#define                 APIC_ESR_SEND_CS        0x00001
38
#define                 APIC_ESR_RECV_CS        0x00002
39
#define                 APIC_ESR_SEND_ACC       0x00004
40
#define                 APIC_ESR_RECV_ACC       0x00008
41
#define                 APIC_ESR_SENDILL        0x00020
42
#define                 APIC_ESR_RECVILL        0x00040
43
#define                 APIC_ESR_ILLREGA        0x00080
44
#define         APIC_ICR        0x300
45
#define                 APIC_DEST_SELF          0x40000
46
#define                 APIC_DEST_ALLINC        0x80000
47
#define                 APIC_DEST_ALLBUT        0xC0000
48
#define                 APIC_ICR_RR_MASK        0x30000
49
#define                 APIC_ICR_RR_INVALID     0x00000
50
#define                 APIC_ICR_RR_INPROG      0x10000
51
#define                 APIC_ICR_RR_VALID       0x20000
52
#define                 APIC_INT_LEVELTRIG      0x08000
53
#define                 APIC_INT_ASSERT         0x04000
54
#define                 APIC_ICR_BUSY           0x01000
55
#define                 APIC_DEST_PHYSICAL      0x00000
56
#define                 APIC_DEST_LOGICAL       0x00800
57
#define                 APIC_DM_FIXED           0x00000
58
#define                 APIC_DM_LOWEST          0x00100
59
#define                 APIC_DM_SMI             0x00200
60
#define                 APIC_DM_REMRD           0x00300
61
#define                 APIC_DM_NMI             0x00400
62
#define                 APIC_DM_INIT            0x00500
63
#define                 APIC_DM_STARTUP         0x00600
64
#define                 APIC_DM_EXTINT          0x00700
65
#define                 APIC_VECTOR_MASK        0x000FF
66
#define         APIC_ICR2       0x310
67
#define                 GET_APIC_DEST_FIELD(x)  (((x)>>24)&0xFF)
68
#define                 SET_APIC_DEST_FIELD(x)  ((x)<<24)
69
#define         APIC_LVTT       0x320
70
#define         APIC_LVTPC      0x340
71
#define         APIC_LVT0       0x350
72
#define                 APIC_LVT_TIMER_BASE_MASK        (0x3<<18)
73
#define                 GET_APIC_TIMER_BASE(x)          (((x)>>18)&0x3)
74
#define                 SET_APIC_TIMER_BASE(x)          (((x)<<18))
75
#define                 APIC_TIMER_BASE_CLKIN           0x0
76
#define                 APIC_TIMER_BASE_TMBASE          0x1
77
#define                 APIC_TIMER_BASE_DIV             0x2
78
#define                 APIC_LVT_TIMER_PERIODIC         (1<<17)
79
#define                 APIC_LVT_MASKED                 (1<<16)
80
#define                 APIC_LVT_LEVEL_TRIGGER          (1<<15)
81
#define                 APIC_LVT_REMOTE_IRR             (1<<14)
82
#define                 APIC_INPUT_POLARITY             (1<<13)
83
#define                 APIC_SEND_PENDING               (1<<12)
84
#define                 GET_APIC_DELIVERY_MODE(x)       (((x)>>8)&0x7)
85
#define                 SET_APIC_DELIVERY_MODE(x,y)     (((x)&~0x700)|((y)<<8))
86
#define                         APIC_MODE_FIXED         0x0
87
#define                         APIC_MODE_NMI           0x4
88
#define                         APIC_MODE_EXINT         0x7
89
#define         APIC_LVT1       0x360
90
#define         APIC_LVTERR     0x370
91
#define         APIC_TMICT      0x380
92
#define         APIC_TMCCT      0x390
93
#define         APIC_TDCR       0x3E0
94
#define                 APIC_TDR_DIV_TMBASE     (1<<2)
95
#define                 APIC_TDR_DIV_1          0xB
96
#define                 APIC_TDR_DIV_2          0x0
97
#define                 APIC_TDR_DIV_4          0x1
98
#define                 APIC_TDR_DIV_8          0x2
99
#define                 APIC_TDR_DIV_16         0x3
100
#define                 APIC_TDR_DIV_32         0x8
101
#define                 APIC_TDR_DIV_64         0x9
102
#define                 APIC_TDR_DIV_128        0xA
103
 
104
#define APIC_BASE APIC_DEFAULT_PHYS_BASE
105
 
106
#define APIC_BASE_MSR           0x1B
107
 
108
/*
109
 * Basic functions accessing APICs.
110
 */
111
 
112
static __inline__ void apic_write(unsigned long reg, unsigned long v)
113
{
114
        *((volatile unsigned long *)(APIC_BASE+reg)) = v;
115
}
116
 
117
static __inline__ unsigned long apic_read(unsigned long reg)
118
{
119
        return *((volatile unsigned long *)(APIC_BASE+reg));
120
}
121
 
122
static __inline__ void apic_wait_icr_idle(void)
123
{
124
        do { } while ( apic_read( APIC_ICR ) & APIC_ICR_BUSY );
125
}
126
 
127
#define apic_read_around(x)
128
#define apic_write_around(x,y) apic_write((x),(y))
129
 
303 giacomo 130
static __inline__ void set_APIC_timer(unsigned int clocks)
131
{
132
        extern unsigned int apic_set_limit;
133
 
134
        if (clocks < apic_set_limit) clocks = apic_set_limit;
135
 
136
        apic_write_around(APIC_TMICT, clocks);
137
}
138
 
299 giacomo 139
static __inline__ void ack_APIC_irq(void)
140
{
141
        /*
142
         * ack_APIC_irq() actually gets compiled as a single instruction:
143
         * - a single rmw on Pentium/82489DX
144
         * - a single write on P6+ cores (CONFIG_X86_GOOD_APIC)
145
         * ... yummie.
146
         */
147
 
148
        /* Docs say use 0 for future compatibility */
149
        apic_write_around(APIC_EOI, 0);
150
}
151
 
303 giacomo 152
extern void enable_APIC_timer(void);
153
extern void disable_APIC_timer (void);
299 giacomo 154
 
155
#endif