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