[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 " 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

> 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.


More information about the SeaBIOS mailing list