[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