Patch "PCI: iproc: Save host bridge window resource in struct iproc_pcie" has been added to the 4.10-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
PCI: iproc: Save host bridge window resource in struct iproc_pcie
to the 4.10-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-iproc-save-host-bridge-window-resource-in-struct-iproc_pcie.patch
and it can be found in the queue-4.10 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
6e347b5e05ea2ac4ac467a5a1cfaebb2c7f06f80Mon Sep 17 00:00:00 2001
From: Bjorn Helgaas <[email protected]>
Date: Thu, 9 Mar 2017 11:27:07 -0600
Subject: PCI: iproc: Save host bridge window resource in struct iproc_pcie
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
From: Bjorn Helgaas <[email protected]>
commit 6e347b5e05ea2ac4ac467a5a1cfaebb2c7f06f80 upstream.
The host bridge memory window resource is inserted into the iomem_resource tree and cannot be deallocated until the host bridge itself is removed.
Previously, the window was on the stack, which meant the iomem_resource entry pointed into the stack and was corrupted as soon as the probe function returned, which caused memory corruption and errors like this:
pcie_iproc_bcma bcma0:8: resource collision: [mem 0x40000000-0x47ffffff] conflicts with PCIe MEM space [mem 0x40000000-0x47ffffff]
Move the memory window resource from the stack into struct iproc_pcie so its lifetime matches that of the host bridge.
--- drivers/pci/host/pcie-iproc-bcma.c | 24 ++++++++++++------------ drivers/pci/host/pcie-iproc-platform.c | 19 ++++++++++--------- drivers/pci/host/pcie-iproc.h | 1 + 3 files changed, 23 insertions(+), 21 deletions(-)
drivers/pci/host/pcie-iproc-bcma.c +12 -12
@@ -44,8 +44,7 @@ static int iproc_pcie_bcma_probe(struct {struct device *dev = &bdev->dev;struct iproc_pcie *pcie; -LIST_HEAD (res); -struct resource res_mem; +LIST_HEAD (resources);int ret; pcie =devm_kzalloc (dev,sizeof (*pcie),GFP_KERNEL );
@@ -63,22 +62,23 @@ static int iproc_pcie_bcma_probe(struct pcie->base_addr = bdev->addr; - res_mem.start = bdev->addr_s[0 ]; - res_mem.end = bdev->addr_s[0 ] +SZ_128M -1 ; - res_mem.name ="PCIe MEM space" ; - res_mem.flags =IORESOURCE_MEM ; -pci_add_resource (&res, &res_mem); + pcie->mem.start = bdev->addr_s[0 ]; + pcie->mem.end = bdev->addr_s[0 ] +SZ_128M -1 ; + pcie->mem.name ="PCIe MEM space" ; + pcie->mem.flags =IORESOURCE_MEM ; +pci_add_resource (&resources, &pcie->mem); pcie->map_irq = iproc_pcie_bcma_map_irq; - ret =iproc_pcie_setup (pcie, &res); -if (ret) + ret =iproc_pcie_setup (pcie, &resources); +if (ret) {dev_err (dev,"PCIe controller setup failed\n" ); - -pci_free_resource_list (&res); +pci_free_resource_list (&resources); +return ret; + }bcma_set_drvdata (bdev, pcie); -return ret; +return 0 ; }static void iproc_pcie_bcma_remove (struct bcma_device *bdev)
drivers/pci/host/pcie-iproc-platform.c +10 -9
@@ -52,7 +52,7 @@ static int iproc_pcie_pltfm_probe(structstruct device_node *np = dev->of_node;struct resource reg;resource_size_t iobase =0 ; -LIST_HEAD (res); +LIST_HEAD (resources);int ret; of_id =of_match_device (iproc_pcie_of_match_table, dev);
@@ -101,10 +101,10 @@ static int iproc_pcie_pltfm_probe(struct pcie->phy =NULL ; } - ret =of_pci_get_host_bridge_resources (np,0 ,0xff , &res, &iobase); + ret =of_pci_get_host_bridge_resources (np,0 ,0xff , &resources, + &iobase);if (ret) { -dev_err (dev, -"unable to get PCI host bridge resources\n" ); +dev_err (dev,"unable to get PCI host bridge resources\n" );return ret; }
@@ -117,14 +117,15 @@ static int iproc_pcie_pltfm_probe(struct pcie->map_irq = of_irq_parse_and_map_pci; } - ret =iproc_pcie_setup (pcie, &res); -if (ret) + ret =iproc_pcie_setup (pcie, &resources); +if (ret) {dev_err (dev,"PCIe controller setup failed\n" ); - -pci_free_resource_list (&res); +pci_free_resource_list (&resources); +return ret; + }platform_set_drvdata (pdev, pcie); -return ret; +return 0 ; }static int iproc_pcie_pltfm_remove (struct platform_device *pdev)
drivers/pci/host/pcie-iproc.h +1 -0
@@ -90,6 +90,7 @@ struct iproc_pcie {#ifdef CONFIG_ARM struct pci_sys_data sysdata;#endif +struct resource mem;struct pci_bus *root_bus;struct phy *phy;int (*map_irq)(const struct pci_dev *,u8 ,u8 );
Patches currently in stable-queue which might be from [email protected] are
queue-4.10/pci-thunder-pem-add-legacy-firmware-support-for-cavium-thunderx-host-controller.patch queue-4.10/pci-iproc-save-host-bridge-window-resource-in-struct-iproc_pcie.patch queue-4.10/pci-thunder-pem-use-cavium-assigned-hardware-id-for-thunderx-host-controller.patch