+ pci-align-bar-settings-for-legacy-mode-ide.patch added to -mm tree

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

 



The patch titled
     pci: align BAR settings for legacy mode IDE
has been added to the -mm tree.  Its filename is
     pci-align-bar-settings-for-legacy-mode-ide.patch

*** Remember to use Documentation/SubmitChecklist when testing your code ***

See http://www.zip.com.au/~akpm/linux/patches/stuff/added-to-mm.txt to find
out what to do about this

------------------------------------------------------
Subject: pci: align BAR settings for legacy mode IDE
From: Jan Beulich <jbeulich@xxxxxxxxxx>

Fix http://bugzilla.kernel.org/show_bug.cgi?id=8187

The change to force legacy mode IDE channels' resources to fixed non-zero
values confuses (at least some versions of) X, because the values reported by
the kernel and those readable from PCI config space aren't consistent anymore.
 Therefore, this patch arranges for the respective BARs to also get updated if
possible.

Signed-off-by: Jan Beulich <jbeulich@xxxxxxxxxx>
Cc: Kristofer T. Karas" <ktk@xxxxxxxxxxxxxxxxxxxxxxxxxxxx>
Acked-by: Bartlomiej Zolnierkiewicz <bzolnier@xxxxxxxxx>
Cc: Alan Cox <alan@xxxxxxxxxxxxxxxxxxx>
Cc: Natalie Protasevich <protasnb@xxxxxxxxx>
Cc: Greg KH <greg@xxxxxxxxx>
Cc: Gabriel C <nix.or.die@xxxxxxxxxxxxxx>
Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx>
---

 drivers/pci/probe.c |   45 +++++++++++++++++++++++++++++-------------
 1 files changed, 32 insertions(+), 13 deletions(-)

diff -puN drivers/pci/probe.c~pci-align-bar-settings-for-legacy-mode-ide drivers/pci/probe.c
--- a/drivers/pci/probe.c~pci-align-bar-settings-for-legacy-mode-ide
+++ a/drivers/pci/probe.c
@@ -741,7 +741,34 @@ static void pci_read_irq(struct pci_dev 
 	dev->irq = irq;
 }
 
-#define LEGACY_IO_RESOURCE	(IORESOURCE_IO | IORESOURCE_PCI_FIXED)
+static void change_legacy_io_resource(struct pci_dev * dev, unsigned index,
+				resource_size_t start, resource_size_t end)
+{
+	resource_size_t base = start & PCI_BASE_ADDRESS_IO_MASK;
+	resource_size_t len = (end | ~PCI_BASE_ADDRESS_IO_MASK) - base + 1;
+
+	if (!(pci_resource_flags(dev, index) & IORESOURCE_IO)) {
+		printk(KERN_WARNING "%s: cannot adjust BAR%u (not I/O)\n",
+		       pci_name(dev), index);
+		return;
+	}
+	if (pci_resource_len(dev, index) != len) {
+		printk(KERN_WARNING "%s: cannot adjust BAR%u (size %Lx)\n",
+			pci_name(dev), index,
+			(unsigned long long)pci_resource_len(dev, index));
+	} else {
+		printk(KERN_INFO "%s: trying to change BAR%u from %Lx to %Lx\n",
+			pci_name(dev), index,
+			(unsigned long long)pci_resource_start(dev, index),
+			(unsigned long long)base);
+		pci_write_config_dword(dev, PCI_BASE_ADDRESS_0 + index * 4,
+					base);
+	}
+	pci_resource_start(dev, index) = start;
+	pci_resource_end(dev, index) = end;
+	pci_resource_flags(dev, index) = IORESOURCE_IO|IORESOURCE_PCI_FIXED|
+					PCI_BASE_ADDRESS_SPACE_IO;
+}
 
 /**
  * pci_setup_device - fill in class and map information of a device
@@ -795,20 +822,12 @@ static int pci_setup_device(struct pci_d
 			u8 progif;
 			pci_read_config_byte(dev, PCI_CLASS_PROG, &progif);
 			if ((progif & 1) == 0) {
-				dev->resource[0].start = 0x1F0;
-				dev->resource[0].end = 0x1F7;
-				dev->resource[0].flags = LEGACY_IO_RESOURCE;
-				dev->resource[1].start = 0x3F6;
-				dev->resource[1].end = 0x3F6;
-				dev->resource[1].flags = LEGACY_IO_RESOURCE;
+				change_legacy_io_resource(dev, 0, 0x1F0, 0x1F7);
+				change_legacy_io_resource(dev, 1, 0x3F6, 0x3F6);
 			}
 			if ((progif & 4) == 0) {
-				dev->resource[2].start = 0x170;
-				dev->resource[2].end = 0x177;
-				dev->resource[2].flags = LEGACY_IO_RESOURCE;
-				dev->resource[3].start = 0x376;
-				dev->resource[3].end = 0x376;
-				dev->resource[3].flags = LEGACY_IO_RESOURCE;
+				change_legacy_io_resource(dev, 2, 0x170, 0x177);
+				change_legacy_io_resource(dev, 3, 0x376, 0x376);
 			}
 		}
 		break;
_

Patches currently in -mm which might be from jbeulich@xxxxxxxxxx are

pci-align-bar-settings-for-legacy-mode-ide.patch

-
To unsubscribe from this list: send the line "unsubscribe mm-commits" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Kernel Newbies FAQ]     [Kernel Archive]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [Bugtraq]     [Photo]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]

  Powered by Linux