public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
To: Ivan Kokshaysky <ink@jurassic.park.msu.ru>
Cc: Johannes Weiner <hannes@saeurebad.de>,
	linux-pci@atrey.karlin.mff.cuni.cz, Alan Cox <alan@redhat.com>,
	Greg Kroah-Hartman <greg@kroah.com>,
	jgarzik@pobox.com, wingel@nano-system.com,
	Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>,
	james.smart@emulex.com, linux-driver@qlogic.com,
	linux-kernel@vger.kernel.org
Subject: [RFC/PATCH]] x86: pci: Disable IO/Mem on a device when resources can't be allocated
Date: Wed, 19 Dec 2007 16:10:19 +1100	[thread overview]
Message-ID: <1198041019.18908.32.camel@pasglop> (raw)
In-Reply-To: <20071218123715.A7874@jurassic.park.msu.ru>


This patch changes the x86 PCI code to disable IO and/or Memory
decoding on a PCI device when a resource of that type failed to
be allocated.

This is done to avoid having unallocated dangling BARs enabled
that might try to decode on top of other devices.

If a proper resource is assigned later on, then
pci_enable_device{,_io,_mem} will take care of re-enabling
decoding.

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
---

On top of my previous 4 patches to replace pci_enable_device_bars()

I don't have any x86 at hand to test it... this will probably want to
simmer a little bit in -mm, though it shouldn't have any problem of
user setups that don't already have dodgy resource setup. In fact, it
might turn weird latent bugs into right away visible ones.

I'll wait for more comments today and post the whole 5 again tomorrow
as official candidates for inclusion :-) (BTW. What is people general
feeling about inline vs. non inline for the functions in pci.c ?)

Index: linux-merge/arch/x86/pci/i386.c
===================================================================
--- linux-merge.orig/arch/x86/pci/i386.c	2007-12-19 16:00:31.000000000 +1100
+++ linux-merge/arch/x86/pci/i386.c	2007-12-19 16:02:20.000000000 +1100
@@ -143,12 +143,32 @@ static void __init pcibios_allocate_bus_
 	}
 }
 
+static inline int __init pcibios_alloc_resource(struct pci_dev *dev, int idx)
+{
+	struct resource *pr, *r = &dev->resource[idx];
+
+	DBG("PCI: Resource %08lx-%08lx (f=%lx, d=%d, p=%d)\n",
+	    r->start, r->end, r->flags, disabled, pass);
+
+	pr = pci_find_parent_resource(dev, r);
+	if (!pr || request_resource(pr, r) < 0) {
+		printk(KERN_ERR "PCI: Cannot allocate "
+		       "resource region %d of device %s\n",
+		       idx, pci_name(dev));
+		/* We'll assign a new address later */
+		r->end -= r->start;
+		r->start = 0;
+		return -EBUSY;
+	}
+	return 0;
+}
+
 static void __init pcibios_allocate_resources(int pass)
 {
 	struct pci_dev *dev = NULL;
 	int idx, disabled;
 	u16 command;
-	struct resource *r, *pr;
+	struct resource *r;
 
 	for_each_pci_dev(dev) {
 		pci_read_config_word(dev, PCI_COMMAND, &command);
@@ -162,20 +182,11 @@ static void __init pcibios_allocate_reso
 				disabled = !(command & PCI_COMMAND_IO);
 			else
 				disabled = !(command & PCI_COMMAND_MEMORY);
-			if (pass == disabled) {
-				DBG("PCI: Resource %08lx-%08lx "
-				    "(f=%lx, d=%d, p=%d)\n",
-				    r->start, r->end, r->flags, disabled, pass);
-				pr = pci_find_parent_resource(dev, r);
-				if (!pr || request_resource(pr, r) < 0) {
-					printk(KERN_ERR "PCI: Cannot allocate "
-						"resource region %d "
-						"of device %s\n",
-						idx, pci_name(dev));
-					/* We'll assign a new address later */
-					r->end -= r->start;
-					r->start = 0;
-				}
+			if (pass == disabled && pcibios_alloc_resource(dev, idx)) {
+				command &= ~(r->flags & (IORESOURCE_IO |
+							 IORESOURCE_MEM));
+				pci_write_config_word(dev,
+						      PCI_COMMAND, command);
 			}
 		}
 		if (!pass) {



  parent reply	other threads:[~2007-12-19  5:12 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-12-17 23:01 [RFC/PATCH 1/4] pci: Add pci_enable_device_{io,mem} intefaces Benjamin Herrenschmidt
2007-12-17 23:01 ` [RFC/PATCH 3/4] pci: Remove pci_enable_device_bars() Benjamin Herrenschmidt
2007-12-24  7:08   ` Grant Grundler
2007-12-25 21:16     ` Benjamin Herrenschmidt
2007-12-17 23:01 ` [RFC/PATCH 2/4] pci: Remove users of pci_enable_device_bars() Benjamin Herrenschmidt
2007-12-18  0:07   ` Alan Cox
2007-12-18  0:26     ` Benjamin Herrenschmidt
2007-12-24  7:13   ` Grant Grundler
2007-12-17 23:01 ` [RFC/PATCH 4/4] [POWERPC] pci: Disable IO/Mem on a device when resources can't be allocated Benjamin Herrenschmidt
2007-12-18  9:56   ` Ivan Kokshaysky
2007-12-18 11:36     ` Benjamin Herrenschmidt
2007-12-24  7:23   ` Grant Grundler
2007-12-25 21:20     ` Benjamin Herrenschmidt
2007-12-25 21:26       ` Benjamin Herrenschmidt
2007-12-27 21:03         ` Grant Grundler
2007-12-17 23:49 ` [RFC/PATCH 1/4] pci: Add pci_enable_device_{io,mem} intefaces Johannes Weiner
2007-12-17 23:55   ` Benjamin Herrenschmidt
2007-12-18  0:02   ` Benjamin Herrenschmidt
2007-12-18  9:37     ` Ivan Kokshaysky
2007-12-18  9:43       ` Benjamin Herrenschmidt
2007-12-19  5:10       ` Benjamin Herrenschmidt [this message]
2007-12-19 13:43         ` [RFC/PATCH]] x86: pci: Disable IO/Mem on a device when resources can't be allocated Ivan Kokshaysky
2007-12-19 20:29           ` Benjamin Herrenschmidt

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=1198041019.18908.32.camel@pasglop \
    --to=benh@kernel.crashing.org \
    --cc=alan@redhat.com \
    --cc=bzolnier@gmail.com \
    --cc=greg@kroah.com \
    --cc=hannes@saeurebad.de \
    --cc=ink@jurassic.park.msu.ru \
    --cc=james.smart@emulex.com \
    --cc=jgarzik@pobox.com \
    --cc=linux-driver@qlogic.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pci@atrey.karlin.mff.cuni.cz \
    --cc=wingel@nano-system.com \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox