From: Bjorn Helgaas <bjorn.helgaas@hp.com>
To: Jesse Barnes <jbarnes@virtuousgeek.org>, Len Brown <lenb@kernel.org>
Cc: Jiri Slaby <jirislaby@gmail.com>, Dan Williams <dcbw@redhat.com>,
linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-acpi@vger.kernel.org, "H. Peter Anvin" <hpa@zytor.com>,
Thomas Gleixner <tglx@linutronix.de>,
Linus Torvalds <torvalds@linux-foundation.org>,
Ingo Molnar <mingo@elte.hu>, Adam Belay <abelay@mit.edu>,
Matthew Garrett <mjg@redhat.com>
Subject: [PATCH 3/5] x86: avoid PNP resources when allocating address space
Date: Wed, 08 Dec 2010 14:36:16 -0700 [thread overview]
Message-ID: <20101208213616.13026.77390.stgit@bob.kio> (raw)
In-Reply-To: <20101208213606.13026.47657.stgit@bob.kio>
Remove PNP resources from "available space" used by allocate_resource().
This would be better done by putting the PNP resources directly in the
resource maps (iomem_resource, etc), but there are some issues that
keep us from doing that yet.
This patch keeps us from handing out PNP device address space to other
callers of allocate_resource().
Reference: https://bugzilla.kernel.org/show_bug.cgi?id=23332
Reference: https://bugzilla.kernel.org/show_bug.cgi?id=23542
Reference: https://bugzilla.kernel.org/show_bug.cgi?id=23802
Reported-by: Matthew Garrett <mjg@redhat.com>
Reported-by: Dan Williams <dcbw@redhat.com>
Reported-by: Jiri Slaby <jirislaby@gmail.com>
Signed-off-by: Bjorn Helgaas <bjorn.helgaas@hp.com>
---
arch/x86/kernel/resource.c | 78 ++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 78 insertions(+), 0 deletions(-)
diff --git a/arch/x86/kernel/resource.c b/arch/x86/kernel/resource.c
index 5dd6473..1daee92 100644
--- a/arch/x86/kernel/resource.c
+++ b/arch/x86/kernel/resource.c
@@ -1,6 +1,80 @@
#include <linux/ioport.h>
+#include <linux/pnp.h>
#include <asm/e820.h>
+#ifdef CONFIG_PNP
+static bool resource_conflict(struct resource *res, resource_size_t start,
+ resource_size_t end)
+{
+ /*
+ * Return true if and only if "res" conflicts with the [start-end]
+ * range.
+ */
+ return res->start <= end && res->end >= start;
+}
+
+static void resource_split(struct resource *res, resource_size_t start,
+ resource_size_t end, struct resource *low,
+ struct resource *high)
+{
+ /*
+ * If "res" conflicts with [start-end], split "res" into the
+ * part below "start" (low) and the part above "end" (high),
+ * either (or both) of which may be empty.
+ *
+ * If there's no conflict, return the entire "res" as "low".
+ */
+ *low = *res;
+ low->start = res->start;
+ low->end = res->start - 1; /* default to empty (size 0) */
+
+ *high = *res;
+ high->end = res->end;
+ high->start = res->end + 1; /* default to empty (size 0) */
+
+ if (!resource_conflict(res, start, end)) {
+ low->end = res->end;
+ return;
+ }
+
+ if (res->start < start)
+ low->end = start - 1;
+
+ if (res->end > end)
+ high->start = end + 1;
+}
+
+static void pnp_remove_reservations(struct resource *avail)
+{
+ unsigned long type = resource_type(avail);
+ struct pnp_dev *dev;
+ int i;
+ struct resource *res, low, high;
+
+ /*
+ * Clip the available region to avoid PNP devices. The PNP
+ * resources really should be in the resource map to begin with,
+ * but there are still some issues preventing that.
+ */
+ pnp_for_each_dev(dev) {
+ i = 0;
+ res = pnp_get_resource(dev, type, i++);
+ while (res) {
+ if (!(res->flags & IORESOURCE_WINDOW)) {
+ resource_split(avail, res->start, res->end,
+ &low, &high);
+ if (resource_size(&low) > resource_size(&high))
+ *avail = low;
+ else
+ *avail = high;
+ }
+
+ res = pnp_get_resource(dev, type, i++);
+ }
+ }
+}
+#endif
+
void arch_remove_reservations(struct resource *avail)
{
/*
@@ -11,4 +85,8 @@ void arch_remove_reservations(struct resource *avail)
if (avail->start < BIOS_END)
avail->start = BIOS_END;
}
+
+#ifdef CONFIG_PNP
+ pnp_remove_reservations(avail);
+#endif
}
next prev parent reply other threads:[~2010-12-08 21:36 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-12-08 21:36 [PATCH 1/5] resources: add arch hook for preventing allocation in reserved areas Bjorn Helgaas
2010-12-08 21:36 ` [PATCH 2/5] x86: avoid BIOS area when allocating address space Bjorn Helgaas
2010-12-08 21:36 ` Bjorn Helgaas [this message]
2010-12-08 21:36 ` [PATCH 4/5] PNP: add framework for platform PNP quirks Bjorn Helgaas
2010-12-08 21:36 ` [PATCH 5/5] PNP: HP nx6325 fixup: reserve unreported resources Bjorn Helgaas
2010-12-12 3:30 ` Linus Torvalds
2010-12-12 5:23 ` Dave Airlie
2010-12-12 6:17 ` Bjorn Helgaas
2010-12-14 20:34 ` Linus Torvalds
2010-12-14 20:44 ` Linus Torvalds
2010-12-14 23:57 ` Bjorn Helgaas
2010-12-15 6:02 ` Bjorn Helgaas
2010-12-15 6:26 ` Bjorn Helgaas
2010-12-15 7:03 ` Linus Torvalds
2010-12-15 7:03 ` Linus Torvalds
2010-12-15 18:18 ` Bjorn Helgaas
2010-12-15 18:27 ` H. Peter Anvin
2010-12-15 19:21 ` Linus Torvalds
2010-12-08 21:37 ` [PATCH 0/5] resources: add arch hook for preventing allocation in reserved areas Bjorn Helgaas
2010-12-10 20:30 ` [PATCH 1/5] " Jesse Barnes
2010-12-10 20:36 ` Jesse Barnes
2010-12-10 20:36 ` Jesse Barnes
2010-12-10 21:07 ` Bjorn Helgaas
2010-12-11 1:37 ` Jesse Barnes
2010-12-12 3:34 ` Linus Torvalds
2010-12-12 3:34 ` Linus Torvalds
2010-12-12 4:16 ` Jesse Barnes
2010-12-12 13:20 ` Rafael J. Wysocki
2010-12-13 5:43 ` Bjorn Helgaas
2010-12-13 13:47 ` Ingo Molnar
2010-12-15 0:09 ` Bjorn Helgaas
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20101208213616.13026.77390.stgit@bob.kio \
--to=bjorn.helgaas@hp.com \
--cc=abelay@mit.edu \
--cc=dcbw@redhat.com \
--cc=hpa@zytor.com \
--cc=jbarnes@virtuousgeek.org \
--cc=jirislaby@gmail.com \
--cc=lenb@kernel.org \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=mjg@redhat.com \
--cc=tglx@linutronix.de \
--cc=torvalds@linux-foundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.