From 44229c2d55656c745cbeb191c7bcd4ff201773dc Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Wed, 7 May 2025 07:40:41 +0000 Subject: [PATCH] Revert "PCI: Check BAR index for validity" This reverts commit 73d2b962503151f7a69cfe28f24185fb96c14915 which is commit b1a7f99967fc0c052db8e65b449c7b32b1e9177f upstream. It breaks the Android kernel abi and can be brought back in the future in an abi-safe way if it is really needed. Bug: 161946584 Change-Id: I878d979957a378e05f39b1ea4694740c061aaa1d Signed-off-by: Greg Kroah-Hartman --- drivers/pci/devres.c | 16 ++-------------- drivers/pci/iomap.c | 29 ++++++++--------------------- drivers/pci/pci.c | 6 ------ drivers/pci/pci.h | 16 ---------------- 4 files changed, 10 insertions(+), 57 deletions(-) diff --git a/drivers/pci/devres.c b/drivers/pci/devres.c index cd39479de7c7..643f85849ef6 100644 --- a/drivers/pci/devres.c +++ b/drivers/pci/devres.c @@ -577,7 +577,7 @@ static int pcim_add_mapping_to_legacy_table(struct pci_dev *pdev, { void __iomem **legacy_iomap_table; - if (!pci_bar_index_is_valid(bar)) + if (bar >= PCI_STD_NUM_BARS) return -EINVAL; legacy_iomap_table = (void __iomem **)pcim_iomap_table(pdev); @@ -622,7 +622,7 @@ static void pcim_remove_bar_from_legacy_table(struct pci_dev *pdev, int bar) { void __iomem **legacy_iomap_table; - if (!pci_bar_index_is_valid(bar)) + if (bar >= PCI_STD_NUM_BARS) return; legacy_iomap_table = (void __iomem **)pcim_iomap_table(pdev); @@ -655,9 +655,6 @@ void __iomem *pcim_iomap(struct pci_dev *pdev, int bar, unsigned long maxlen) void __iomem *mapping; struct pcim_addr_devres *res; - if (!pci_bar_index_is_valid(bar)) - return NULL; - res = pcim_addr_devres_alloc(pdev); if (!res) return NULL; @@ -725,9 +722,6 @@ void __iomem *pcim_iomap_region(struct pci_dev *pdev, int bar, int ret; struct pcim_addr_devres *res; - if (!pci_bar_index_is_valid(bar)) - return IOMEM_ERR_PTR(-EINVAL); - res = pcim_addr_devres_alloc(pdev); if (!res) return IOMEM_ERR_PTR(-ENOMEM); @@ -828,9 +822,6 @@ static int _pcim_request_region(struct pci_dev *pdev, int bar, const char *name, int ret; struct pcim_addr_devres *res; - if (!pci_bar_index_is_valid(bar)) - return -EINVAL; - res = pcim_addr_devres_alloc(pdev); if (!res) return -ENOMEM; @@ -1052,9 +1043,6 @@ void __iomem *pcim_iomap_range(struct pci_dev *pdev, int bar, void __iomem *mapping; struct pcim_addr_devres *res; - if (!pci_bar_index_is_valid(bar)) - return IOMEM_ERR_PTR(-EINVAL); - res = pcim_addr_devres_alloc(pdev); if (!res) return IOMEM_ERR_PTR(-ENOMEM); diff --git a/drivers/pci/iomap.c b/drivers/pci/iomap.c index fe706ed946df..9fb7cacc15cd 100644 --- a/drivers/pci/iomap.c +++ b/drivers/pci/iomap.c @@ -9,8 +9,6 @@ #include -#include "pci.h" /* for pci_bar_index_is_valid() */ - /** * pci_iomap_range - create a virtual mapping cookie for a PCI BAR * @dev: PCI device that owns the BAR @@ -35,19 +33,12 @@ void __iomem *pci_iomap_range(struct pci_dev *dev, unsigned long offset, unsigned long maxlen) { - resource_size_t start, len; - unsigned long flags; - - if (!pci_bar_index_is_valid(bar)) - return NULL; - - start = pci_resource_start(dev, bar); - len = pci_resource_len(dev, bar); - flags = pci_resource_flags(dev, bar); + resource_size_t start = pci_resource_start(dev, bar); + resource_size_t len = pci_resource_len(dev, bar); + unsigned long flags = pci_resource_flags(dev, bar); if (len <= offset || !start) return NULL; - len -= offset; start += offset; if (maxlen && len > maxlen) @@ -86,20 +77,16 @@ void __iomem *pci_iomap_wc_range(struct pci_dev *dev, unsigned long offset, unsigned long maxlen) { - resource_size_t start, len; - unsigned long flags; + resource_size_t start = pci_resource_start(dev, bar); + resource_size_t len = pci_resource_len(dev, bar); + unsigned long flags = pci_resource_flags(dev, bar); - if (!pci_bar_index_is_valid(bar)) + + if (flags & IORESOURCE_IO) return NULL; - start = pci_resource_start(dev, bar); - len = pci_resource_len(dev, bar); - flags = pci_resource_flags(dev, bar); - if (len <= offset || !start) return NULL; - if (flags & IORESOURCE_IO) - return NULL; len -= offset; start += offset; diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index d1684bb5cabd..5bd6f1e05281 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c @@ -3922,9 +3922,6 @@ EXPORT_SYMBOL(pci_enable_atomic_ops_to_root); */ void pci_release_region(struct pci_dev *pdev, int bar) { - if (!pci_bar_index_is_valid(bar)) - return; - /* * This is done for backwards compatibility, because the old PCI devres * API had a mode in which the function became managed if it had been @@ -3970,9 +3967,6 @@ EXPORT_SYMBOL(pci_release_region); static int __pci_request_region(struct pci_dev *pdev, int bar, const char *res_name, int exclusive) { - if (!pci_bar_index_is_valid(bar)) - return -EINVAL; - if (pci_is_managed(pdev)) { if (exclusive == IORESOURCE_EXCLUSIVE) return pcim_request_region_exclusive(pdev, bar, res_name); diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h index f28d5ae7c15f..b888fcb818ed 100644 --- a/drivers/pci/pci.h +++ b/drivers/pci/pci.h @@ -165,22 +165,6 @@ static inline void pci_wakeup_event(struct pci_dev *dev) pm_wakeup_event(&dev->dev, 100); } -/** - * pci_bar_index_is_valid - Check whether a BAR index is within valid range - * @bar: BAR index - * - * Protects against overflowing &struct pci_dev.resource array. - * - * Return: true for valid index, false otherwise. - */ -static inline bool pci_bar_index_is_valid(int bar) -{ - if (bar >= 0 && bar < PCI_NUM_RESOURCES) - return true; - - return false; -} - static inline bool pci_has_subordinate(struct pci_dev *pci_dev) { return !!(pci_dev->subordinate);