Rev 576 | Rev 693 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 576 | Rev 672 | ||
---|---|---|---|
Line 41... | Line 41... | ||
41 | #ifdef CONFIG_SMP |
41 | #ifdef CONFIG_SMP |
42 | 42 | ||
43 | /* |
43 | /* |
44 | * Advanced Programmable Interrupt Controller for SMP systems. |
44 | * Advanced Programmable Interrupt Controller for SMP systems. |
45 | * Tested on: |
45 | * Tested on: |
46 | * Bochs 2.0.2 - Bochs 2.2 with 2-8 CPUs |
46 | * Bochs 2.0.2 - Bochs 2.2.5 with 2-8 CPUs |
47 | * Simics 2.0.28 - Simics 2.2.19 2-15 CPUs |
47 | * Simics 2.0.28 - Simics 2.2.19 2-15 CPUs |
48 | * VMware Workstation 5.5 with 2 CPUs |
48 | * VMware Workstation 5.5 with 2 CPUs |
49 | * ASUS P/I-P65UP5 + ASUS C-P55T2D REV. 1.41 with 2x 200Mhz Pentium CPUs |
49 | * ASUS P/I-P65UP5 + ASUS C-P55T2D REV. 1.41 with 2x 200Mhz Pentium CPUs |
50 | * ASUS PCH-DL with 2x 3000Mhz Pentium 4 Xeon (HT) CPUs |
50 | * ASUS PCH-DL with 2x 3000Mhz Pentium 4 Xeon (HT) CPUs |
51 | * MSI K7D Master-L with 2x 2100MHz Athlon MP CPUs |
51 | * MSI K7D Master-L with 2x 2100MHz Athlon MP CPUs |
Line 309... | Line 309... | ||
309 | lvt_lint_t lint; |
309 | lvt_lint_t lint; |
310 | svr_t svr; |
310 | svr_t svr; |
311 | icr_t icr; |
311 | icr_t icr; |
312 | tdcr_t tdcr; |
312 | tdcr_t tdcr; |
313 | lvt_tm_t tm; |
313 | lvt_tm_t tm; |
- | 314 | ldr_t ldr; |
|
- | 315 | dfr_t dfr; |
|
314 | __u32 t1, t2; |
316 | __u32 t1, t2; |
315 | 317 | ||
316 | /* Initialize LVT Error register. */ |
318 | /* Initialize LVT Error register. */ |
317 | error.value = l_apic[LVT_Err]; |
319 | error.value = l_apic[LVT_Err]; |
318 | error.masked = true; |
320 | error.masked = true; |
Line 370... | Line 372... | ||
370 | t1 = l_apic[CCRT]; |
372 | t1 = l_apic[CCRT]; |
371 | delay(1000); |
373 | delay(1000); |
372 | t2 = l_apic[CCRT]; |
374 | t2 = l_apic[CCRT]; |
373 | 375 | ||
374 | l_apic[ICRT] = t1-t2; |
376 | l_apic[ICRT] = t1-t2; |
- | 377 | ||
- | 378 | /* Program Logical Destination Register. */ |
|
- | 379 | ldr.value = l_apic[LDR]; |
|
- | 380 | if (CPU->id < sizeof(CPU->id)*8) /* size in bits */ |
|
- | 381 | ldr.id = (1<<CPU->id); |
|
- | 382 | l_apic[LDR] = ldr.value; |
|
- | 383 | ||
- | 384 | /* Program Destination Format Register for Flat mode. */ |
|
- | 385 | dfr.value = l_apic[DFR]; |
|
- | 386 | dfr.model = MODEL_FLAT; |
|
- | 387 | l_apic[DFR] = dfr.value; |
|
375 | } |
388 | } |
376 | 389 | ||
377 | /** Local APIC End of Interrupt. */ |
390 | /** Local APIC End of Interrupt. */ |
378 | void l_apic_eoi(void) |
391 | void l_apic_eoi(void) |
379 | { |
392 | { |
Line 468... | Line 481... | ||
468 | int dlvr = DELMOD_FIXED; |
481 | int dlvr = DELMOD_FIXED; |
469 | 482 | ||
470 | if (flags & LOPRI) |
483 | if (flags & LOPRI) |
471 | dlvr = DELMOD_LOWPRI; |
484 | dlvr = DELMOD_LOWPRI; |
472 | 485 | ||
473 | - | ||
474 | reg.lo = io_apic_read(IOREDTBL + pin*2); |
486 | reg.lo = io_apic_read(IOREDTBL + pin*2); |
475 | reg.hi = io_apic_read(IOREDTBL + pin*2 + 1); |
487 | reg.hi = io_apic_read(IOREDTBL + pin*2 + 1); |
476 | 488 | ||
477 | reg.dest = dest; |
489 | reg.dest = dest; |
478 | reg.destmod = DESTMOD_LOGIC; |
490 | reg.destmod = DESTMOD_LOGIC; |
479 | reg.trigger_mode = TRIGMOD_EDGE; |
491 | reg.trigger_mode = TRIGMOD_EDGE; |
480 | reg.intpol = POLARITY_HIGH; |
492 | reg.intpol = POLARITY_HIGH; |
481 | reg.delmod = dlvr; |
493 | reg.delmod = dlvr; |
482 | reg.intvec = v; |
494 | reg.intvec = v; |