[SeaBIOS] [PATCH] acpi: reintroduce LNKS

Paolo Bonzini pbonzini at redhat.com
Thu Dec 13 14:38:45 CET 2012


Il 13/12/2012 14:33, Laszlo Ersek ha scritto:
>> > Unfortunately, the code after the patch is also against the spec, and it
>> > breaks FreeBSD because it treats IRQ 9 polarity as active low without
>> > the Interrupt() entry.  Actually, numeric _PRT entries are handled the
>> > same in Linux and FreeBSD (as active-low).  However, under Linux it just
>> > happens to trigger another special casing of SCI which sets SCI up from
>> > its override entry in the MADT, ignoring the DSDT completely.
> I won't pretend I understand what I'm talking about, but the ACPI spec
> 5.0 says in "5.2.12.5 Interrupt Source Override Structure",
> 
>     Interrupt Source Overrides are also necessary when an identity
>     mapped interrupt input has a non-standard polarity.
> 
> Hence "necessary but not sufficient", is that it?

The MADT is about 8259 pins, while the _PRT entry identifies a GSI.  So
we have the same GSI (9) specified twice.  Linux ignores the settings of
the second entry and reuses those that came from the GSI.  The important
bit here is this:

        /* Don't set up the ACPI SCI because it's already set up */
        if (acpi_gbl_FADT.sci_interrupt == gsi)
                return gsi;

(And as you can see it's wrong, sci_interrupt is an 8259 interrupt not a
GSI).

> SCI_INT in the FADT is explained as
> 
>     [...] OSPM is required to treat the ACPI SCI interrupt as a
>     sharable, level, active low interrupt.
> 
> which is then overridden in the MADT, stating active-high polarity.

Yes, but this doesn't affect the definition of this GSI in the _PRT.  It
is always level/active-low for a numeric entry.  Among the two
conflicting choices, Linux happens to favor the MADT.  FreeBSD doesn't.

Paolo



More information about the SeaBIOS mailing list