Weird PCI interrupt delivery problem (resolution, sort of)

Scott Long scottl at samsco.org
Thu Jan 19 21:17:45 PST 2006


Craig Boston wrote:

> After trying everything I could think of to do to the I/O APIC code and
> coming up empty, tonight I went back to the local APIC.  I had
> previously ruled it out since the lapic timer interrupt continued to
> work fine even when the others stopped.  However, adding some DELAY(1)
> calls at key points caused it to work, much like adding WITNESS does.
> I managed to get it down to a single change that makes APIC mode work on
> this laptop:
> 
> --- local_apic.c.orig   Thu Jan 19 18:32:37 2006
> +++ local_apic.c        Thu Jan 19 18:32:28 2006
> @@ -599,4 +599,5 @@
>  lapic_eoi(void)
>  {
> 	lapic->eoi = 0;
> +	lapic->eoi = 0;
>  }
> 
> ...and welcome to bizarro world.  There's absolutely no reason I can
> think of why that would change anything, other than buggy hardware.
> 
> I looked at what Linux was doing, and they're also using a single write
> to EOI interrupts, so long as the X86_GOOD_APIC config option is enabled
> (and it is for P5/MMX or newer).  Otherwise it does an extra read before
> writing to any APIC register.  I don't know if linux works on this
> hardware or not -- the live CD I tried wasn't compiled for APIC support.
> 
> At this point, since AFAIK nobody else has reported the same problem,
> I'm content with a local workaround.  It's just... wierd.
> 
> Craig

This points to a bus coherency problem.  I wonder if your BIOS is
incorrectly setting the memory region of the apics as cachable.  You'll
want to bug Baldwin about this.

Scott



More information about the freebsd-hackers mailing list