Skip to contentSkip to conversation

Patch "PCI: versatile: Fix pci_remap_iospace() failure path" has been added to the 4.8-stable tree

PATCH [email protected] 1 participant 1 message Oct 29, 2016

Subsystems (2)
lore
Share & tools
lore

[email protected]

author maintainer Applied
#0 lore raw

This is a note to let you know that I've just added the patch titled

PCI: versatile: Fix pci_remap_iospace() failure path

to the 4.8-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
pci-versatile-fix-pci_remap_iospace-failure-path.patch
and it can be found in the queue-4.8 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.

Quoted 1 line

From 53f4f7ee28076a36e427274d7d5c33b23dfc6221 Mon Sep 17 00:00:00 2001

From: Lorenzo Pieralisi <[email protected]>
Date: Mon, 15 Aug 2016 17:50:43 +0100
Subject: PCI: versatile: Fix pci_remap_iospace() failure path

From: Lorenzo Pieralisi <[email protected]>

commit 53f4f7ee28076a36e427274d7d5c33b23dfc6221 upstream.

On ARM/ARM64 architectures, PCI IO ports are emulated through memory mapped IO, by reserving a chunk of virtual address space starting at PCI_IOBASE and by mapping the PCI host bridges memory address space driving PCI IO cycles to it.

PCI host bridge drivers that enable downstream PCI IO cycles map the host bridge memory address responding to PCI IO cycles to the fixed virtual address space through the pci_remap_iospace() API.

This means that if the pci_remap_iospace() function fails, the corresponding host bridge PCI IO resource must be considered invalid, in that there is no way for the kernel to actually drive PCI IO transactions if the memory addresses responding to PCI IO cycles cannot be mapped into the CPU virtual address space.

The PCI versatile host bridge driver does not remove the PCI IO resource from the host bridge resource windows if the pci_remap_iospace() call fails; this is an actual bug in that the PCI host bridge would consider the PCI IO resource valid (and possibly assign it to downstream devices) even if the kernel was not able to map the PCI host bridge memory address driving IO cycle to the CPU virtual address space (ie pci_remap_iospace() failures).

Fix the PCI host bridge driver pci_remap_iospace() failure path, by destroying the PCI host bridge PCI IO resources retrieved through firmware when the pci_remap_iospace() function call fails, therefore preventing the kernel from adding the respective PCI IO resource to the list of PCI host bridge valid resources, fixing the issue.

Fixes b7e78170efd4 ("PCI: versatile: Add DT-based ARM Versatile PB PCIe host driver")
CC Rob Herring <[email protected]>
---
 drivers/pci/host/pci-versatile.c |    8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)
drivers/pci/host/pci-versatile.c +5 -3
@@ -74,7 +74,7 @@ static int versatile_pci_parse_request_o
 	int err, mem = 1, res_valid = 0;
 	struct device_node *np = dev->of_node;
 	resource_size_t iobase;
-	struct resource_entry *win;
+	struct resource_entry *win, *tmp;
 
 	err = of_pci_get_host_bridge_resources(np, 0, 0xff, res, &iobase);
 	if (err)
@@ -84,15 +84,17 @@ static int versatile_pci_parse_request_o
 	if (err)
 		goto out_release_res;
 
-	resource_list_for_each_entry(win, res) {
+	resource_list_for_each_entry_safe(win, tmp, res) {
 		struct resource *res = win->res;
 
 		switch (resource_type(res)) {
 		case IORESOURCE_IO:
 			err = pci_remap_iospace(res, iobase);
-			if (err)
+			if (err) {
 				dev_warn(dev, "error %d: failed to map resource %pR\n",
 					 err, res);
+				resource_list_destroy_entry(win);
+			}
 			break;
 		case IORESOURCE_MEM:
 			res_valid |= !(res->flags & IORESOURCE_PREFETCH);

Patches currently in stable-queue which might be from [email protected] are

queue-4.8/pci-versatile-fix-pci_remap_iospace-failure-path.patch queue-4.8/pci-aardvark-fix-pci_remap_iospace-failure-path.patch queue-4.8/pci-designware-fix-pci_remap_iospace-failure-path.patch queue-4.8/pci-tegra-fix-pci_remap_iospace-failure-path.patch queue-4.8/pci-generic-fix-pci_remap_iospace-failure-path.patch queue-4.8/pci-rcar-fix-pci_remap_iospace-failure-path.patch