PCI: Add comments about ROM BAR updating
authorSumit Semwal <sumit.semwal@linaro.org>
Sat, 25 Mar 2017 16:18:07 +0000 (21:48 +0530)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 30 Mar 2017 07:35:19 +0000 (09:35 +0200)
From: Bjorn Helgaas <bhelgaas@google.com>

[ Upstream commit 0b457dde3cf8b7c76a60f8e960f21bbd4abdc416 ]

pci_update_resource() updates a hardware BAR so its address matches the
kernel's struct resource UNLESS it's a disabled ROM BAR.  We only update
those when we enable the ROM.

It's not obvious from the code why ROM BARs should be handled specially.
Apparently there are Matrox devices with defective ROM BARs that read as
zero when disabled.  That means that if pci_enable_rom() reads the disabled
BAR, sets PCI_ROM_ADDRESS_ENABLE (without re-inserting the address), and
writes it back, it would enable the ROM at address zero.

Add comments and references to explain why we can't make the code look more
rational.

The code changes are from 755528c860b0 ("Ignore disabled ROM resources at
setup") and 8085ce084c0f ("[PATCH] Fix PCI ROM mapping").

Link: https://lkml.org/lkml/2005/8/30/138
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Gavin Shan <gwshan@linux.vnet.ibm.com>
Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
 [sumits: minor fixup in rom.c for 4.4.y]
Signed-off-by: Sumit Semwal <sumit.semwal@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/pci/rom.c
drivers/pci/setup-res.c

index eb0ad530dc430268ea699891fff5a64d6a38545a..3eea7fc5e1a2354e71bac38c48215535d1de35ed 100644 (file)
@@ -31,6 +31,11 @@ int pci_enable_rom(struct pci_dev *pdev)
        if (!res->flags)
                return -1;
 
+       /*
+        * Ideally pci_update_resource() would update the ROM BAR address,
+        * and we would only set the enable bit here.  But apparently some
+        * devices have buggy ROM BARs that read as zero when disabled.
+        */
        pcibios_resource_to_bus(pdev->bus, &region, res);
        pci_read_config_dword(pdev, pdev->rom_base_reg, &rom_addr);
        rom_addr &= ~PCI_ROM_ADDRESS_MASK;
index 674e76c9334ef979ac7dccce0f3801ab40b7c6d5..d1ba5e0067c5fc7f0b40092c86c0a982da8e8ee0 100644 (file)
@@ -68,6 +68,12 @@ static void pci_std_update_resource(struct pci_dev *dev, int resno)
        if (resno < PCI_ROM_RESOURCE) {
                reg = PCI_BASE_ADDRESS_0 + 4 * resno;
        } else if (resno == PCI_ROM_RESOURCE) {
+
+               /*
+                * Apparently some Matrox devices have ROM BARs that read
+                * as zero when disabled, so don't update ROM BARs unless
+                * they're enabled.  See https://lkml.org/lkml/2005/8/30/138.
+                */
                if (!(res->flags & IORESOURCE_ROM_ENABLE))
                        return;