I/O conflict on Versalogic Tiger (VL-EPM-24)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



We're using Versalogic Tiger (VL-EPM-24) SBCs in embedded systems
running linux 3.2.x without any problems. Recently, when testing the
latest mainline kernel I found the system hard locked during boot.

After some investigation I noticed that the kernel print time stamps
were bogus after one of the pcieports was enabled:
[    1.658879] io scheduler cfq registered (default)
[    1.663905] pcieport 0000:00:1c.0: enabling device (0004 -> 0007)
[    6.254134] Serial: 8250/16550 driver, 21 ports, IRQ sharing enabled
[    6.254134] 00:03: ttyS0 at I/O 0x3f8 (irq = 4, base_baud = 115200)
is a 16550A
[    6.254134] 00:04: ttyS1 at I/O 0x2f8 (irq = 0, base_baud = 115200)
is a 16550A
[    6.254134] 00:05: ttyS2 at I/O 0x3e8 (irq = 0, base_baud = 115200)
is a 16550A
[    6.254134] 00:06: ttyS4 at I/O 0x238 (irq = 0, base_baud = 115200)
is a 16550A

I was surprised to find that the problem existed as far back as 3.11.
I checked to make sure we were using the latest BIOS and contacted the
vendor to see if they were aware of anyone else using recent versions
of the linux kernel. They stated that they were unaware of anyone
using recent kernel versions on this board and tired to convince me to
stick with an old version.

I then git bisected to this commit:
ac212b6980d8d5eda705864fc5a8ecddc6d6eacc ACPI / processor: Use common
hotplug infrastructure

After diffing the kernel output before and after this commit I noticed
that the I/O BAR assigned to the pcieport (same one as above) changed
from 0x1000 to 0x2000.

@@ -191,13 +191,13 @@
Switching to clocksource acpi_pm
pci 0000:00:1c.0: BAR 9: assigned [mem 0x80000000-0x801fffff pref]
pci 0000:00:1c.1: BAR 9: assigned [mem 0x80200000-0x803fffff pref]
-pci 0000:00:1c.0: BAR 7: assigned [io  0x1000-0x1fff]
+pci 0000:00:1c.0: BAR 7: assigned [io  0x2000-0x2fff]
pci 0000:02:01.0: PCI bridge to [bus 03]
pci 0000:02:01.0:   bridge window [mem 0xdff00000-0xdfffffff]
pci 0000:01:00.0: PCI bridge to [bus 02-03]
pci 0000:01:00.0:   bridge window [mem 0xdff00000-0xdfffffff]
pci 0000:00:1c.0: PCI bridge to [bus 01-03]
-pci 0000:00:1c.0:   bridge window [io  0x1000-0x1fff]
+pci 0000:00:1c.0:   bridge window [io  0x2000-0x2fff]
pci 0000:00:1c.0:   bridge window [mem 0xdff00000-0xdfffffff]
pci 0000:00:1c.0:   bridge window [mem 0x80000000-0x801fffff pref]
pci 0000:00:1c.1: PCI bridge to [bus 04]

I also noticed the kernel output 'ACPI: PM-Timer IO Port: 0x2008' and
made the connection that since acpi_pm was being used as the
clocksource and since the problems started when the BAR switched from
0x1000 to 0x2000 an I/O conflict must be the source of the problems.

I did some reading into ACPI (since my understanding of it was novice
at the time) and dumped the DSDT. I found no reference to anything in
the 0x2xxx I/O range though I did find the following in the FADT:
PM1a_EVT_BLK at 0x2000-0x2003
PM1a_CNT_BLK at 0x2004-0x2005
PM_TMR at 0x2008-0x200b

I dumped the DSDT on other systems and found that some used PNP0C02 to
reserve I/O ranges used by the ACPI PM registers.

I added the following to the Versalogic Tiger dsdt.dsl under the PCI
bus, compiled it and and compiled into the linux kernel:
            Device (PMIO)
            {
                Name (_HID, EisaId ("PNP0C02") /* PNP Motherboard
Resources */)  // _HID: Hardware ID
                Name (_UID, 0x09)  // _UID: Unique ID
                Method (_CRS, 0, NotSerialized)  // _CRS: Current
Resource Settings
                {
                    Name (BUF0, ResourceTemplate ()
                    {
                        IO (Decode16,
                            0x2000,            // Range Minimum
                            0x2000,            // Range Maximum
                            0x01,              // Alignment
                            0xC,               // Length
                        )
                        IO (Decode16,
                            0x20C0,            // Range Minimum
                            0x20C0,            // Range Maximum
                            0x01,              // Alignment
                            0x8,               // Length
                        )
                    })
                    Return (BUF0)
                }
            }

It booted just fine! (comment welcome on whether or not this looks
like the correct fix)

Unfortunately even if I get the vendor to release a new BIOS with the
DSDT modifications, rolling out BIOS updates to thousands of systems
in the field will be nearly impossible. When we roll out a new kernel
to the production systems we'll need it to work with the existing
BIOS.

I've been searching around the linux kernel for a way to apply a quirk
specific to this board.
I've found I can do something like the following and match the Poulsbo
Host bridge and that it'll fix the problem but I don't see a decent
way of restricting it to this board.

diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
index 85f247e..1f16dbf 100644
--- a/drivers/pci/quirks.c
+++ b/drivers/pci/quirks.c
@@ -413,6 +413,17 @@ static void quirk_ati_exploding_mce(struct pci_dev *dev)
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI,
PCI_DEVICE_ID_ATI_RS100,   quirk_ati_exploding_mce);

/*
+ * Versa Logic Tiger
+ */
+static void quirk_versa_logic_tiger(struct pci_dev *dev)
+{
+       dev_info(&dev->dev, "Versalogic Tiger, reserving I/O ports\n");
+       request_region(0x2000, 0x0C, "Versalogic Tiger");
+       request_region(0x20C0, 0x08, "Versalogic Tiger");
+}
+DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, 0x8100, quirk_versa_logic_tiger);
+
+/*

Any suggestions on what could be done to get a fix for this board
mainlined into the kernel? Should I give up hope and just apply a cute
embedded non-sense hack?

Thanks,
George McCollister
--
To unsubscribe from this list: send the line "unsubscribe linux-pci" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [DMA Engine]     [Linux Coverity]     [Linux USB]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Greybus]

  Powered by Linux