* [PATCH v10 16/59] PCI: Don't release fixed resource for realloc
[not found] <1456366370-28995-1-git-send-email-yinghai@kernel.org>
@ 2016-02-25 2:12 ` Yinghai Lu
2016-02-25 2:12 ` [PATCH v10 18/59] PCI: Set resource to FIXED for LSI devices Yinghai Lu
1 sibling, 0 replies; 2+ messages in thread
From: Yinghai Lu @ 2016-02-25 2:12 UTC (permalink / raw)
To: Bjorn Helgaas, David Miller, Benjamin Herrenschmidt, Wei Yang, TJ,
Yijing Wang, Khalid Aziz
Cc: linux-pci, linux-kernel, Yinghai Lu, stable
We should not release bridge resource if there is fixed resources
under it, otherwise the children firmware would stop working.
Reported-by: Paul Johnson <pjay@nwtrail.com>
Suggested-by: Bjorn Helgaas <bhelgaas@google.com>
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=92351
Signed-off-by: Yinghai Lu <yinghai@kernel.org>
Cc: stable@vger.kernel.org
---
drivers/pci/setup-bus.c | 6 ++++--
include/linux/ioport.h | 2 +-
kernel/resource.c | 28 ++++++++++++++++++++++++++--
3 files changed, 31 insertions(+), 5 deletions(-)
diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c
index 7a758e8..05769c4 100644
--- a/drivers/pci/setup-bus.c
+++ b/drivers/pci/setup-bus.c
@@ -1541,14 +1541,16 @@ static void pci_bridge_release_resources(struct pci_bus *bus,
r = &b_res[idx];
- if (!r->parent)
+ if (!r->parent || r->flags & IORESOURCE_PCI_FIXED)
return;
/*
* if there are children under that, we should release them
* all
*/
- release_child_resources(r);
+ if (!release_child_resources(r))
+ return;
+
if (!release_resource(r)) {
type = old_flags = r->flags & type_mask;
dev_printk(KERN_DEBUG, &dev->dev, "resource %d %pR released\n",
diff --git a/include/linux/ioport.h b/include/linux/ioport.h
index 24bea08..26b0a08 100644
--- a/include/linux/ioport.h
+++ b/include/linux/ioport.h
@@ -142,7 +142,7 @@ extern struct resource iomem_resource;
extern struct resource *request_resource_conflict(struct resource *root, struct resource *new);
extern int request_resource(struct resource *root, struct resource *new);
extern int release_resource(struct resource *new);
-void release_child_resources(struct resource *new);
+bool release_child_resources(struct resource *new);
extern void reserve_region_with_split(struct resource *root,
resource_size_t start, resource_size_t end,
const char *name);
diff --git a/kernel/resource.c b/kernel/resource.c
index 3669d1b..3d7cf0b 100644
--- a/kernel/resource.c
+++ b/kernel/resource.c
@@ -275,11 +275,35 @@ static void __release_child_resources(struct resource *r)
}
}
-void release_child_resources(struct resource *r)
+static bool __has_fixed_child_resources(struct resource *r)
{
+ struct resource *p;
+
+ p = r->child;
+ while (p) {
+ if (p->flags & IORESOURCE_PCI_FIXED)
+ return true;
+
+ if (__has_fixed_child_resources(p))
+ return true;
+
+ p = p->sibling;
+ }
+
+ return false;
+}
+
+bool release_child_resources(struct resource *r)
+{
+ bool fixed;
+
write_lock(&resource_lock);
- __release_child_resources(r);
+ fixed = __has_fixed_child_resources(r);
+ if (!fixed)
+ __release_child_resources(r);
write_unlock(&resource_lock);
+
+ return !fixed;
}
/**
--
1.8.4.5
^ permalink raw reply related [flat|nested] 2+ messages in thread
* [PATCH v10 18/59] PCI: Set resource to FIXED for LSI devices
[not found] <1456366370-28995-1-git-send-email-yinghai@kernel.org>
2016-02-25 2:12 ` [PATCH v10 16/59] PCI: Don't release fixed resource for realloc Yinghai Lu
@ 2016-02-25 2:12 ` Yinghai Lu
1 sibling, 0 replies; 2+ messages in thread
From: Yinghai Lu @ 2016-02-25 2:12 UTC (permalink / raw)
To: Bjorn Helgaas, David Miller, Benjamin Herrenschmidt, Wei Yang, TJ,
Yijing Wang, Khalid Aziz
Cc: linux-pci, linux-kernel, Yinghai Lu, stable
LSI HBA firmware stop responding pci read from host if pci core ever change
pci device BAR values.
Set their resources to FIXED, so let realloc to skip them.
Reported-by: Paul Johnson <pjay@nwtrail.com>
Suggested-by: Bjorn Helgaas <bhelgaas@google.com>
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=92351
Signed-off-by: Yinghai Lu <yinghai@kernel.org>
Cc: stable@vger.kernel.org
---
drivers/pci/pci.h | 1 +
drivers/pci/quirks.c | 20 ++++++++++++++++++++
drivers/pci/setup-bus.c | 4 ++++
3 files changed, 25 insertions(+)
diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
index 220bd0e..60d1c87 100644
--- a/drivers/pci/pci.h
+++ b/drivers/pci/pci.h
@@ -170,6 +170,7 @@ static inline void pci_msix_clear_and_set_ctrl(struct pci_dev *dev, u16 clear, u
}
void pci_realloc_get_opt(char *);
+bool pci_realloc_user_enabled(void);
static inline int pci_no_d1d2(struct pci_dev *dev)
{
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
index 47921a1..8d1f75f 100644
--- a/drivers/pci/quirks.c
+++ b/drivers/pci/quirks.c
@@ -335,6 +335,26 @@ static void quirk_s3_64M(struct pci_dev *dev)
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_S3, PCI_DEVICE_ID_S3_868, quirk_s3_64M);
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_S3, PCI_DEVICE_ID_S3_968, quirk_s3_64M);
+/*
+ * LSI devices firmware does not like BAR get changed
+ */
+static void quirk_bar_fixed(struct pci_dev *dev)
+{
+ int i;
+
+ if (pci_realloc_user_enabled())
+ return;
+
+ for (i = 0; i < PCI_STD_RESOURCE_END; i++) {
+ struct resource *r = &dev->resource[i];
+
+ if (!r->start || !r->flags)
+ continue;
+ r->flags |= IORESOURCE_PCI_FIXED;
+ }
+}
+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_LSI_LOGIC, PCI_ANY_ID, quirk_bar_fixed);
+
/* for pci remove and rescan */
static void quirk_allocate_fixed(struct pci_dev *dev)
{
diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c
index 05769c4..f9cd04a 100644
--- a/drivers/pci/setup-bus.c
+++ b/drivers/pci/setup-bus.c
@@ -1678,6 +1678,10 @@ void __init pci_realloc_get_opt(char *str)
else if (!strncmp(str, "on", 2))
pci_realloc_enable = user_enabled;
}
+bool pci_realloc_user_enabled(void)
+{
+ return pci_realloc_enable == user_enabled;
+}
static bool pci_realloc_enabled(enum enable_type enable)
{
return enable >= user_enabled;
--
1.8.4.5
^ permalink raw reply related [flat|nested] 2+ messages in thread
end of thread, other threads:[~2016-02-25 2:30 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <1456366370-28995-1-git-send-email-yinghai@kernel.org>
2016-02-25 2:12 ` [PATCH v10 16/59] PCI: Don't release fixed resource for realloc Yinghai Lu
2016-02-25 2:12 ` [PATCH v10 18/59] PCI: Set resource to FIXED for LSI devices Yinghai Lu
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).