Bug 62511
Summary: | [PATCH]Incorrect coalescing of overlapping ACPI resources may fail to resolve some overlaps | ||
---|---|---|---|
Product: | Drivers | Reporter: | Alexey Neyman (stilor) |
Component: | PCI | Assignee: | drivers_pci (drivers_pci) |
Status: | RESOLVED CODE_FIX | ||
Severity: | normal | CC: | alan, bjorn |
Priority: | P1 | ||
Hardware: | x86-64 | ||
OS: | Linux | ||
Kernel Version: | 3.12.0-rc3+ | Subsystem: | |
Regression: | No | Bisected commit-id: | |
Attachments: | Patch to fix the issue |
See Documentation/SubmittingPatches Patches neeed to be emailed with a Signed-off-by: so we have an authorship/audit trail. It has been emailed with signed-off-by header, see here: https://lkml.org/lkml/2013/10/9/564 It was in that thread that I was directed to create a bug - which I did. Resolved by http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=3ad674d6c6c5724c83f10f422d826420c83536cd which appeared in v3.13-rc1. |
Created attachment 110211 [details] Patch to fix the issue I have a board with a BIOS bug that reports the following I/O port regions in _CRS on one of the host bridges: 0x0000-0x03af // #0 0x03e0-0x0cf7 // #1 0x03b0-0x03bb // #2 0x03c0-0x03df // #3 0x0000-0xdfff // #4 0xf000-0xffff // #5 Obviously, region number #4 is erroneous as it overlaps with regions #0..3. The code in coalesce_windows() in arch/x86/pci/acpi.c attempts to recover from such kind of BIOS bugs by merging the overlapping regions. Current code expands region #0 to 0x0000-0xdffff and makes region #4 ignored. As a result, overlap of the expanded region #0 with regions #1..3 remains undetected (as the inner loop already compared them with region #0). As a result, regions #1..3 are inserted into the resource tree even though they overlap with adjusted region #0 - which later results in resource conflicts for PCI devices with IO ports in one of those regions (e.g., for an PCI IDE controller in legacy mode - which has port 0x3f6). The kernel then refuses to initialize these devices. The fix: instead of expanding res1 and ignoring res2, do the opposite. The res2 window is yet to be compared against all windows between res1 and res2 (regions #1..3 in the above example), so the resulting resource map will include just the expanded region - and will ignore any overlapping ones. I am not at liberty to disclose full hardware configuration of the board at this time; I could quote the relevant messages from dmesg output. Without the fix: root@localhost:~# dmesg ... [ 0.500318] ACPI: PCI Root Bridge [PCI0] (domain 0000 [bus 00-7f]) [ 0.500619] acpi PNP0A08:00: Requesting ACPI _OSC control (0x1d) [ 0.500992] acpi PNP0A08:00: ACPI _OSC control (0x1c) granted [ 0.501342] acpi PNP0A08:00: host bridge window expanded to [io 0x0000-0xdfff]; [io 0x0000-0xdfff] ignored [ 0.501522] acpi PNP0A08:00: fail to add MMCONFIG information, can't access extended PCI configuration space under this bridge. [ 0.501731] PCI host bridge to bus 0000:00 [ 0.501836] pci_bus 0000:00: root bus resource [bus 00-7f] [ 0.501941] pci_bus 0000:00: root bus resource [io 0x0000-0xdfff] [ 0.502047] pci_bus 0000:00: root bus resource [io 0x03e0-0x0cf7] [ 0.502156] pci_bus 0000:00: root bus resource [io 0x03b0-0x03bb] [ 0.502263] pci_bus 0000:00: root bus resource [io 0x03c0-0x03df] [ 0.502370] pci_bus 0000:00: root bus resource [io 0xf000-0xffff] [ 0.502478] pci_bus 0000:00: root bus resource [mem 0x000a0000-0x000bffff] [ 0.502588] pci_bus 0000:00: root bus resource [mem 0x000d0000-0x000dffff] [ 0.502696] pci_bus 0000:00: root bus resource [mem 0xf9000000-0xfbffffff] [ 0.502805] pci_bus 0000:00: root bus resource [mem 0xfed40000-0xfed44fff] ... [ 0.541605] pci 0000:00:1f.2: address space collision: [io 0x03f6] conflicts with PCI Bus 0000:00 [io 0x03e0-0x0cf7] [ 0.541780] pci 0000:00:1f.3: address space collision: [io 0x0400-0x041f] conflicts with PCI Bus 0000:00 [io 0x03e0-0x0cf7] ... root@localhost:~# cat /proc/ioports | grep 'PCI Bus 0000:00' 0000-dfff : PCI Bus 0000:00 03b0-03bb : PCI Bus 0000:00 03c0-03df : PCI Bus 0000:00 03e0-0cf7 : PCI Bus 0000:00 f000-ffff : PCI Bus 0000:00 With the fix: root@localhost:~# dmesg ... [ 0.502521] ACPI: PCI Root Bridge [PCI0] (domain 0000 [bus 00-7f]) [ 0.502822] acpi PNP0A08:00: Requesting ACPI _OSC control (0x1d) [ 0.503215] acpi PNP0A08:00: ACPI _OSC control (0x1c) granted [ 0.503580] acpi PNP0A08:00: host bridge window expanded to [io 0x0000-0xdfff]; [io 0x0000-0x03af] ignored [ 0.503746] acpi PNP0A08:00: host bridge window expanded to [io 0x0000-0xdfff]; [io 0x03e0-0x0cf7] ignored [ 0.503912] acpi PNP0A08:00: host bridge window expanded to [io 0x0000-0xdfff]; [io 0x03b0-0x03bb] ignored [ 0.504077] acpi PNP0A08:00: host bridge window expanded to [io 0x0000-0xdfff]; [io 0x03c0-0x03df] ignored [ 0.504245] acpi PNP0A08:00: fail to add MMCONFIG information, can't access extended PCI configuration space under this bridge. [ 0.504453] PCI host bridge to bus 0000:00 [ 0.504562] pci_bus 0000:00: root bus resource [bus 00-7f] [ 0.504669] pci_bus 0000:00: root bus resource [io 0x0000-0xdfff] [ 0.504776] pci_bus 0000:00: root bus resource [io 0xf000-0xffff] [ 0.504883] pci_bus 0000:00: root bus resource [mem 0x000a0000-0x000bffff] [ 0.504991] pci_bus 0000:00: root bus resource [mem 0x000d0000-0x000dffff] [ 0.505100] pci_bus 0000:00: root bus resource [mem 0xf9000000-0xfbffffff] [ 0.505212] pci_bus 0000:00: root bus resource [mem 0xfed40000-0xfed44fff] ... [ 0.512343] pci 0000:00:1f.2: [8086:3a20] type 00 class 0x01018a [ 0.512359] pci 0000:00:1f.2: reg 0x10: [io 0x0000-0x0007] [ 0.512366] pci 0000:00:1f.2: reg 0x14: [io 0x0000-0x0003] [ 0.512374] pci 0000:00:1f.2: reg 0x18: [io 0x0000-0x0007] [ 0.512382] pci 0000:00:1f.2: reg 0x1c: [io 0x0000-0x0003] [ 0.512389] pci 0000:00:1f.2: reg 0x20: [io 0xff90-0xff9f] [ 0.512397] pci 0000:00:1f.2: reg 0x24: [io 0xffa0-0xffaf] [ 0.512521] pci 0000:00:1f.3: [8086:3a30] type 00 class 0x0c0500 [ 0.512536] pci 0000:00:1f.3: reg 0x10: [mem 0xfbed2000-0xfbed20ff 64bit] [ 0.512559] pci 0000:00:1f.3: reg 0x20: [io 0x0400-0x041f] ... [ 3.077156] ata_piix 0000:00:1f.2: version 2.13 [ 3.077285] ata_piix 0000:00:1f.2: MAP [ [ 3.077388] P0 P2 P1 P3 ] [ 3.077693] ata_piix 0000:00:1f.2: setting latency timer to 64 ... [ 3.468528] i801_smbus 0000:00:1f.3: SMBus using PCI Interrupt ... root@localhost:~# cat /proc/ioports | grep 'PCI Bus 0000:00' 0000-dfff : PCI Bus 0000:00 f000-ffff : PCI Bus 0000:00