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