13 #ifndef __L4_UTIL_APIC_H 14 #define __L4_UTIL_APIC_H 35 #define APIC_PHYS_BASE 0xFEE00000 36 #define APIC_MAP_BASE 0xA0200000 37 #define APIC_BASE_MSR 0x1b 40 #define GET_APIC_ID(x) (((x)>>24)&0x0F) 42 #define GET_APIC_VERSION(x) ((x)&0xFF) 43 #define APIC_TASKPRI 0x80 44 #define APIC_TPRI_MASK 0xFF 47 #define APIC_LDR_MASK (0xFF<<24) 49 #define SET_APIC_DFR(x) ((x)<<28) 50 #define APIC_SPIV 0xF0 51 #define APIC_LVTT 0x320 52 #define APIC_LVTPC 0x340 53 #define APIC_LVT0 0x350 54 #define SET_APIC_TIMER_BASE(x) (((x)<<18)) 55 #define APIC_TIMER_BASE_DIV 0x2 56 #define APIC_LVT1 0x360 57 #define APIC_LVTERR 0x370 58 #define APIC_TMICT 0x380 59 #define APIC_TMCCT 0x390 60 #define APIC_TDCR 0x3E0 62 #define APIC_LVT_MASKED (1<<16) 63 #define APIC_LVT_TIMER_PERIODIC (1<<17) 64 #define APIC_TDR_DIV_1 0xB 65 #define APIC_TDR_DIV_2 0x0 66 #define APIC_TDR_DIV_4 0x1 67 #define APIC_TDR_DIV_8 0x2 68 #define APIC_TDR_DIV_16 0x3 69 #define APIC_TDR_DIV_32 0x8 70 #define APIC_TDR_DIV_64 0x9 71 #define APIC_TDR_DIV_128 0xA 79 extern unsigned long apic_map_base;
80 extern unsigned long apic_timer_divisor;
82 extern unsigned long l4_scaler_apic_to_ms;
84 L4_CV void apic_show_registers(
void);
85 L4_CV int apic_check_working(
void);
86 L4_CV void apic_activate_by_io(
void);
87 L4_CV void apic_timer_set_divisor(
int divisor);
89 L4_CV unsigned long l4_calibrate_apic(
void);
93 L4_INLINE
void apic_write(
unsigned long reg,
unsigned long v);
94 L4_INLINE
unsigned long apic_read(
unsigned long reg);
95 L4_INLINE
void apic_activate_by_msr(
void);
96 L4_INLINE
void apic_deactivate_by_msr(
void);
97 L4_INLINE
unsigned long apic_read_phys_address(
void);
98 L4_INLINE
int apic_test_present(
void);
99 L4_INLINE
void apic_soft_enable(
void);
100 L4_INLINE
void apic_init(
unsigned long map_addr);
101 L4_INLINE
void apic_done(
void);
102 L4_INLINE
void apic_irq_ack(
void);
104 L4_INLINE
void apic_lvt0_disable_irq(
void);
105 L4_INLINE
void apic_lvt0_enable_irq(
void);
106 L4_INLINE
void apic_lvt1_disable_irq(
void);
107 L4_INLINE
void apic_lvt1_enable_irq(
void);
109 L4_INLINE
void apic_timer_write(
unsigned long value);
110 L4_INLINE
unsigned long apic_timer_read(
void);
111 L4_INLINE
void apic_timer_disable_irq(
void);
112 L4_INLINE
void apic_timer_enable_irq(
void);
113 L4_INLINE
void apic_timer_assign_irq(
unsigned long vector);
114 L4_INLINE
void apic_timer_set_periodic(
void);
115 L4_INLINE
void apic_timer_set_one_shot(
void);
117 L4_INLINE
void apic_perf_disable_irq(
void);
118 L4_INLINE
void apic_perf_enable_irq(
void);
119 L4_INLINE
void apic_perf_assign_irq(
unsigned long vector);
124 apic_write(
unsigned long reg,
unsigned long v)
126 *((
volatile unsigned long *)(apic_map_base+reg))=v;
131 L4_INLINE
unsigned long 132 apic_read(
unsigned long reg)
134 return *((
volatile unsigned long *)(apic_map_base+reg));
140 apic_lvt0_disable_irq(
void)
142 unsigned long tmp_val;
143 tmp_val = apic_read(APIC_LVT0);
144 tmp_val |= APIC_LVT_MASKED;
145 apic_write(APIC_LVT0, tmp_val);
151 apic_lvt0_enable_irq(
void)
153 unsigned long tmp_val;
154 tmp_val = apic_read(APIC_LVT0);
155 tmp_val &= ~(APIC_LVT_MASKED);
156 apic_write(APIC_LVT0, tmp_val);
162 apic_lvt1_disable_irq(
void)
164 unsigned long tmp_val;
165 tmp_val = apic_read(APIC_LVT1);
166 tmp_val |= APIC_LVT_MASKED;
167 apic_write(APIC_LVT1, tmp_val);
173 apic_lvt1_enable_irq(
void)
175 unsigned long tmp_val;
176 tmp_val = apic_read(APIC_LVT1);
177 tmp_val &= ~(APIC_LVT_MASKED);
178 apic_write(APIC_LVT1, tmp_val);
184 apic_timer_write(
unsigned long value)
186 apic_read(APIC_TMICT);
187 apic_write(APIC_TMICT,value);
192 L4_INLINE
unsigned long 193 apic_timer_read(
void)
195 return apic_read(APIC_TMCCT);
201 apic_timer_disable_irq(
void)
203 unsigned long tmp_val;
204 tmp_val = apic_read(APIC_LVTT);
205 tmp_val |= APIC_LVT_MASKED;
206 apic_write(APIC_LVTT, tmp_val);
212 apic_timer_enable_irq(
void)
214 unsigned long tmp_val;
215 tmp_val = apic_read(APIC_LVTT);
216 tmp_val &= ~(APIC_LVT_MASKED);
217 apic_write(APIC_LVTT, tmp_val);
222 apic_timer_set_periodic(
void)
224 unsigned long tmp_val;
225 tmp_val = apic_read(APIC_LVTT);
226 tmp_val |= APIC_LVT_TIMER_PERIODIC;
227 tmp_val |= APIC_LVT_MASKED;
228 apic_write(APIC_LVTT, tmp_val);
233 apic_timer_set_one_shot(
void)
235 unsigned long tmp_val;
236 tmp_val = apic_read(APIC_LVTT);
237 tmp_val &= ~APIC_LVT_TIMER_PERIODIC;
238 tmp_val |= APIC_LVT_MASKED;
239 apic_write(APIC_LVTT, tmp_val);
245 apic_timer_assign_irq(
unsigned long vector)
247 unsigned long tmp_val;
248 tmp_val = apic_read(APIC_LVTT);
249 tmp_val &= 0xffffff00;
251 tmp_val |= APIC_LVT_MASKED;
252 apic_write(APIC_LVTT, tmp_val);
258 apic_perf_disable_irq(
void)
260 unsigned long tmp_val;
261 tmp_val = apic_read(APIC_LVTPC);
262 tmp_val |= APIC_LVT_MASKED;
263 apic_write(APIC_LVTPC, tmp_val);
269 apic_perf_enable_irq(
void)
271 unsigned long tmp_val;
272 tmp_val = apic_read(APIC_LVTPC);
273 tmp_val &= ~(APIC_LVT_MASKED);
274 apic_write(APIC_LVTPC, tmp_val);
280 apic_perf_assign_irq(
unsigned long vector)
282 unsigned long tmp_val;
283 tmp_val = apic_read(APIC_LVTPC);
284 tmp_val &= 0xffffff00;
286 tmp_val |= APIC_LVT_MASKED;
287 apic_write(APIC_LVTPC, tmp_val);
293 apic_activate_by_msr(
void)
299 asm volatile(
".byte 0xf; .byte 0x32\n" 307 low |= (APIC_PHYS_BASE & 0xfffff000);
310 asm volatile(
".byte 0xf; .byte 0x30\n" 312 :
"c" (APIC_BASE_MSR),
321 apic_deactivate_by_msr(
void)
327 asm volatile(
".byte 0xf; .byte 0x32\n" 336 asm volatile(
".byte 0xf; .byte 0x30\n" 338 :
"c" (APIC_BASE_MSR),
346 L4_INLINE
unsigned long 347 apic_read_phys_address(
void)
353 asm volatile(
".byte 0xf; .byte 0x32\n" 359 return (low &= 0xfffff000);
365 apic_test_present(
void)
368 unsigned int capability;
370 asm volatile(
"pushl %%ebx ; cpuid ; popl %%ebx" 377 return ((capability & 1<<9) !=0);
382 apic_soft_enable(
void)
384 unsigned long tmp_val;
385 tmp_val = apic_read(APIC_SPIV);
389 apic_write(APIC_SPIV, tmp_val);
394 apic_init(
unsigned long base_addr)
396 apic_map_base = base_addr;
410 apic_read(APIC_SPIV);
411 apic_write(APIC_EOI, 0);
Common L4 ABI Data Types.
#define EXTERN_C_END
End section with C types and functions.
L4 compiler related defines.
#define EXTERN_C_BEGIN
Start section with C types and functions.
#define L4_CV
Define calling convention.