NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: kern/43570: Avoid multiple interrupt routing lists for a bus
The following reply was made to PR kern/43570; it has been noted by GNATS.
From: Jukka Ruohonen <jruohonen%iki.fi@localhost>
To: gnats-bugs%NetBSD.org@localhost
Cc:
Subject: Re: kern/43570: Avoid multiple interrupt routing lists for a bus
Date: Sat, 10 Jul 2010 10:25:23 +0300
On Sun, Jul 04, 2010 at 02:15:00PM +0000, paul%whooppee.com@localhost wrote:
> Some BIOS have "spurious" routing tables, for PCI busses that
> are not actually enabled. One such motherboard is the SuperMicro
> H8QGi-F, which reports a host bridge at PC40 with two child busses
> 2 and 3, in addition to the real host bridge at PC0 (which has
> child busses 2 and 3 as well as 1). The routing tables for the
> spurious busses 2 and 3 _override_ the real routing tables for
> the valid bus2 and bus 3 entries.
I'll note here the conclusion we reached with Paul and Gregoire after a long
discussion. The right solution is likely to skip all devices downstream of
an absent, non-working, or inactive (according to _STA in the ACPI jargon)
PCI bridges.
The following patch from Gregoire Sutre addresses the problem in a way that
is likely to be closer to the correct solution. The earlier patch from Paul
should probably go in as well, at least to print a warning if the code tries
to overwrite something.
Index: sys/arch/x86/x86/mpacpi.c
===================================================================
RCS file: /cvsroot/src/sys/arch/x86/x86/mpacpi.c,v
retrieving revision 1.87
diff -u -r1.87 mpacpi.c
--- sys/arch/x86/x86/mpacpi.c 27 Apr 2010 05:34:14 -0000 1.87
+++ sys/arch/x86/x86/mpacpi.c 5 Jul 2010 13:28:42 -0000
@@ -622,7 +622,9 @@
if (ACPI_FAILURE(rv))
goto out;
- if (acpi_match_hid(devinfo, pciroot_hid)) {
+ if (acpi_match_hid(devinfo, pciroot_hid) &&
+ ((devinfo->Valid & ACPI_VALID_STA) == 0 ||
+ (devinfo->CurrentStatus & ACPI_STA_OK) == ACPI_STA_OK)) {
rv = mpacpi_get_bbn(acpi, parent, &bus);
if (ACPI_FAILURE(rv))
bus = 0;
Home |
Main Index |
Thread Index |
Old Index