mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Ivan Kokshaysky <ink@jurassic.park.msu.ru>
To: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Gary Hade <garyhade@us.ibm.com>, Ingo Molnar <mingo@elte.hu>,
	Thomas Meyer <thomas@m3y3r.de>,
	Stefan Richter <stefanr@s5r6.in-berlin.de>,
	Thomas Gleixner <tglx@linutronix.de>,
	"Rafael J. Wysocki" <rjw@sisk.pl>,
	LKML <linux-kernel@vger.kernel.org>,
	Adrian Bunk <bunk@kernel.org>,
	Andrew Morton <akpm@linux-foundation.org>,
	Natalie Protasevich <protasnb@gmail.com>,
	Benjamin Herrenschmidt <benh@kernel.crashing.org>,
	pm@debian.org
Subject: Re: [patch] pci: revert "PCI: remove transparent bridge sizing"
Date: Fri, 28 Mar 2008 01:18:51 +0300	[thread overview]
Message-ID: <20080327221851.GA9675@jurassic.park.msu.ru> (raw)
In-Reply-To: <alpine.LFD.1.00.0803271004380.2775@woody.linux-foundation.org>

On Thu, Mar 27, 2008 at 10:12:10AM -0700, Linus Torvalds wrote:
> Actually, before we go any further, there might be a less intrusive 
> alternative: add just a couple of flags to the resource flags field (we 
> still have something like 8 unused bits on 32-bit), and use those to 
> implement a generic "resource_alignment()" routine.
> 
> Two flags would do it:
> 
>  - IORESOURCE_SIZEALIGN: size indicates alignment (regular PCI device 
>    resources)
> 
>  - IORESOURCE_STARTALIGN: start field is alignment (PCI bus resources 
>    during probing)

Sounds good to me. So here we go (completely untested, just for review).

Ivan.

diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index 2db2e4b..152ffa2 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -225,7 +225,7 @@ static void pci_read_bases(struct pci_dev *dev, unsigned int howmany, int rom)
 			res->flags |= l & ~PCI_BASE_ADDRESS_IO_MASK;
 		}
 		res->end = res->start + (unsigned long) sz;
-		res->flags |= pci_calc_resource_flags(l);
+		res->flags |= pci_calc_resource_flags(l) | IORESOURCE_SIZEALIGN;
 		if (is_64bit_memory(l)) {
 			u32 szhi, lhi;
 
@@ -278,7 +278,8 @@ static void pci_read_bases(struct pci_dev *dev, unsigned int howmany, int rom)
 			if (sz) {
 				res->flags = (l & IORESOURCE_ROM_ENABLE) |
 				  IORESOURCE_MEM | IORESOURCE_PREFETCH |
-				  IORESOURCE_READONLY | IORESOURCE_CACHEABLE;
+				  IORESOURCE_READONLY | IORESOURCE_CACHEABLE |
+				  IORESOURCE_SIZEALIGN;
 				res->start = l & PCI_ROM_ADDRESS_MASK;
 				res->end = res->start + (unsigned long) sz;
 			}
diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c
index f7cb8e0..5cf8456 100644
--- a/drivers/pci/setup-bus.c
+++ b/drivers/pci/setup-bus.c
@@ -65,6 +65,7 @@ static void pbus_assign_resources_sorted(struct pci_bus *bus)
 		res = list->res;
 		idx = res - &list->dev->resource[0];
 		if (pci_assign_resource(list->dev, idx)) {
+			/* FIXME: get rid of this */
 			res->start = 0;
 			res->end = 0;
 			res->flags = 0;
@@ -327,6 +328,7 @@ static void pbus_size_io(struct pci_bus *bus)
 	/* Alignment of the IO window is always 4K */
 	b_res->start = 4096;
 	b_res->end = b_res->start + size - 1;
+	b_res->flags |= IORESOURCE_STARTALIGN;
 }
 
 /* Calculate the size of the bus and minimal alignment which
@@ -401,6 +403,7 @@ static int pbus_size_mem(struct pci_bus *bus, unsigned long mask, unsigned long
 	}
 	b_res->start = min_align;
 	b_res->end = size + min_align - 1;
+	b_res->flags |= IORESOURCE_STARTALIGN;
 	return 1;
 }
 
diff --git a/drivers/pci/setup-res.c b/drivers/pci/setup-res.c
index 4be7ccf..0c1fdcd 100644
--- a/drivers/pci/setup-res.c
+++ b/drivers/pci/setup-res.c
@@ -137,10 +137,9 @@ int pci_assign_resource(struct pci_dev *dev, int resno)
 
 	size = res->end - res->start + 1;
 	min = (res->flags & IORESOURCE_IO) ? PCIBIOS_MIN_IO : PCIBIOS_MIN_MEM;
-	/* The bridge resources are special, as their
-	   size != alignment. Sizing routines return
-	   required alignment in the "start" field. */
-	align = (resno < PCI_BRIDGE_RESOURCES) ? size : res->start;
+
+	align = resource_alignment(res);
+	BUG_ON(!align);
 
 	/* First, try exact prefetching match.. */
 	ret = pci_bus_alloc_resource(bus, res, size, align, min,
@@ -164,8 +163,10 @@ int pci_assign_resource(struct pci_dev *dev, int resno)
 			res->flags & IORESOURCE_IO ? "I/O" : "mem",
 			resno, (unsigned long long)size,
 			(unsigned long long)res->start, pci_name(dev));
-	} else if (resno < PCI_BRIDGE_RESOURCES) {
-		pci_update_resource(dev, res, resno);
+	} else {
+		res->flags &= ~IORESOURCE_STARTALIGN;
+		if (resno < PCI_BRIDGE_RESOURCES)
+			pci_update_resource(dev, res, resno);
 	}
 
 	return ret;
@@ -226,29 +227,25 @@ void pdev_sort_resources(struct pci_dev *dev, struct resource_list *head)
 		if (r->flags & IORESOURCE_PCI_FIXED)
 			continue;
 
-		r_align = r->end - r->start;
-		
 		if (!(r->flags) || r->parent)
 			continue;
+
+		r_align = resource_alignment(r);
 		if (!r_align) {
-			printk(KERN_WARNING "PCI: Ignore bogus resource %d "
-				"[%llx:%llx] of %s\n",
+			printk(KERN_WARNING "PCI: bogus alignment of resource "
+				"%d [%llx:%llx] (flags %lx) of %s\n",
 				i, (unsigned long long)r->start,
-				(unsigned long long)r->end, pci_name(dev));
+				(unsigned long long)r->end, r->flags,
+				pci_name(dev));
 			continue;
 		}
-		r_align = (i < PCI_BRIDGE_RESOURCES) ? r_align + 1 : r->start;
 		for (list = head; ; list = list->next) {
 			resource_size_t align = 0;
 			struct resource_list *ln = list->next;
-			int idx;
 
-			if (ln) {
-				idx = ln->res - &ln->dev->resource[0];
-				align = (idx < PCI_BRIDGE_RESOURCES) ?
-					ln->res->end - ln->res->start + 1 :
-					ln->res->start;
-			}
+			if (ln)
+				align = resource_alignment(ln->res);
+
 			if (r_align > align) {
 				tmp = kmalloc(sizeof(*tmp), GFP_KERNEL);
 				if (!tmp)
diff --git a/include/linux/ioport.h b/include/linux/ioport.h
index 605d237..096346b 100644
--- a/include/linux/ioport.h
+++ b/include/linux/ioport.h
@@ -44,7 +44,9 @@ struct resource_list {
 #define IORESOURCE_CACHEABLE	0x00004000
 #define IORESOURCE_RANGELENGTH	0x00008000
 #define IORESOURCE_SHADOWABLE	0x00010000
-#define IORESOURCE_BUS_HAS_VGA	0x00080000
+
+#define IORESOURCE_SIZEALIGN	0x00020000	/* size indicates alignment */
+#define IORESOURCE_STARTALIGN	0x00040000	/* start field is alignment */
 
 #define IORESOURCE_DISABLED	0x10000000
 #define IORESOURCE_UNSET	0x20000000
diff --git a/kernel/resource.c b/kernel/resource.c
index 82aea81..cee12cc 100644
--- a/kernel/resource.c
+++ b/kernel/resource.c
@@ -486,6 +486,24 @@ int adjust_resource(struct resource *res, resource_size_t start, resource_size_t
 
 EXPORT_SYMBOL(adjust_resource);
 
+/**
+ * resource_alignment - calculate resource's alignment
+ * @res: resource pointer
+ *
+ * Returns alignment on success, 0 (invalid alignment) on failure.
+ */
+resource_size_t resource_alignment(struct resource *res)
+{
+	switch (res->flags & (IORESOURCE_SIZEALIGN | IORESOURCE_STARTALIGN)) {
+	case IORESOURCE_SIZEALIGN:
+		return res->end - res->start + 1;
+	case IORESOURCE_STARTALIGN:
+		return res->start;
+	default:
+		return 0;
+	}
+}
+
 /*
  * This is compatibility stuff for IO resources.
  *

  reply	other threads:[~2008-03-27 22:19 UTC|newest]

Thread overview: 97+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-03-22  1:59 2.6.25-rc6-git6: Reported regressions from 2.6.24 Rafael J. Wysocki
2008-03-22  2:52 ` Jeff Garzik
2008-03-22 11:11   ` Ingo Molnar
2008-03-22  5:33 ` Andrew Morton
2008-03-22 11:15   ` Ingo Molnar
2008-03-22 17:53     ` Rafael J. Wysocki
2008-03-22 16:32 ` Heiko Carstens
2008-03-22 17:56   ` Rafael J. Wysocki
2008-03-22 16:34 ` ohci1394 problem (MMIO broken) (was 2.6.25-rc6-git6: Reported regressions from 2.6.24) Stefan Richter
2008-03-22 17:24   ` Thomas Meyer
2008-03-22 17:58     ` Rafael J. Wysocki
2008-03-22 18:27     ` Stefan Richter
2008-03-22 19:02       ` Stefan Richter
2008-03-22 21:33         ` Linus Torvalds
2008-03-22 21:58           ` Thomas Gleixner
2008-03-22 21:59           ` H. Peter Anvin
2008-03-22 22:27             ` ohci1394 problem (MMIO broken) (was 2.6.25-rc6-git6: Reported regressions from 2.6.24) [Bug 10080] Stefan Richter
2008-03-22 23:28             ` ohci1394 problem (MMIO broken) (was 2.6.25-rc6-git6: Reported regressions from 2.6.24) Yinghai Lu
2008-03-22 23:31               ` H. Peter Anvin
2008-03-23  2:00                 ` Yinghai Lu
2008-03-23  2:39                   ` H. Peter Anvin
2008-03-23  3:30                     ` Yinghai Lu
2008-03-22 23:01           ` Linus Torvalds
2008-03-22 23:50             ` Stefan Richter
2008-03-23  6:35               ` Ingo Molnar
2008-03-24 19:34                 ` Thomas Meyer
2008-03-24 19:47                   ` Ingo Molnar
2008-03-24 20:17                     ` Thomas Meyer
2008-03-24 20:47                       ` Linus Torvalds
2008-03-26  3:39                         ` Benjamin Herrenschmidt
2008-03-26 23:25                           ` Benjamin Herrenschmidt
2008-03-24 19:58             ` Thomas Meyer
2008-03-24 20:50               ` Linus Torvalds
2008-03-24 21:24                 ` Stefan Richter
2008-03-24 21:47               ` Stefan Richter
2008-03-25  7:31                 ` Ingo Molnar
2008-03-25 16:50                   ` Ingo Molnar
2008-03-25 17:06                     ` Stefan Richter
2008-03-25 18:32                     ` Thomas Meyer
2008-03-25 20:11                       ` Ingo Molnar
2008-03-25 20:29                         ` Ingo Molnar
2008-03-25 21:08                           ` Thomas Meyer
2008-03-25 21:47                             ` Linus Torvalds
2008-03-25 22:02                               ` Thomas Meyer
2008-03-26 10:14                               ` Ivan Kokshaysky
2008-03-26 12:17                                 ` Benjamin Herrenschmidt
2008-03-26 13:54                                 ` [patch] pci: revert "PCI: remove transparent bridge sizing" Ingo Molnar
2008-03-26 17:45                                   ` Thomas Meyer
2008-03-26 18:07                                   ` Gary Hade
2008-03-26 18:33                                     ` Linus Torvalds
2008-03-26 20:30                                       ` Gary Hade
2008-03-26 20:46                                         ` Linus Torvalds
2008-03-26 20:58                                           ` Ivan Kokshaysky
2008-03-26 21:41                                             ` Linus Torvalds
2008-03-26 21:57                                               ` Benjamin Herrenschmidt
2008-03-26 22:07                                                 ` Alan Cox
2008-03-26 22:27                                                   ` Benjamin Herrenschmidt
2008-03-26 22:10                                                 ` Ingo Molnar
2008-03-26 22:29                                                   ` Benjamin Herrenschmidt
2008-03-26 22:47                                                     ` Linus Torvalds
2008-03-26 22:54                                                       ` Benjamin Herrenschmidt
2008-03-26 23:18                                                         ` Benjamin Herrenschmidt
2008-03-26 22:30                                                   ` Ingo Molnar
2008-03-26 22:31                                                 ` Linus Torvalds
2008-03-26 22:47                                                   ` Alan Cox
2008-03-26 23:17                                                     ` Benjamin Herrenschmidt
2008-03-26 23:29                                               ` Ivan Kokshaysky
2008-03-26 23:43                                                 ` Linus Torvalds
2008-03-27 17:12                                                   ` Linus Torvalds
2008-03-27 22:18                                                     ` Ivan Kokshaysky [this message]
2008-03-27 22:34                                                       ` Linus Torvalds
2008-03-28 19:24                                                       ` Gary Hade
2008-03-28 20:46                                                         ` Gary Hade
2008-03-30 15:44                                                           ` Ivan Kokshaysky
2008-03-26 23:45                                                 ` Benjamin Herrenschmidt
2008-03-26 21:29                                     ` Ingo Molnar
2008-03-26 11:12                           ` ohci1394 problem (MMIO broken) (was 2.6.25-rc6-git6: Reported regressions from 2.6.24) Ivan Kokshaysky
2008-03-25 21:02                         ` Thomas Meyer
2008-03-25 23:33           ` Benjamin Herrenschmidt
2008-03-26  0:03             ` Yinghai Lu
2008-03-26  0:12               ` Benjamin Herrenschmidt
2008-03-23 12:57 ` 2.6.25-rc6-git6: Reported regressions from 2.6.24 Alan Cox
2008-03-26 16:30 ` Ray Lee
2008-03-26 17:02   ` Adrian Bunk
2008-03-26 22:11   ` Rafael J. Wysocki
2008-03-27 10:18   ` Romano Giannetti
2008-03-27 14:43     ` Ray Lee
2008-03-31 18:21 ` Linus Torvalds
2008-03-31 19:29   ` Mark Lord
2008-03-31 21:04     ` Tino Keitel
2008-03-31 21:26       ` Tino Keitel
2008-04-03 19:06     ` 2.6.25-rc7/8: Another resume regression Mark Lord
2008-04-05  2:27       ` Mark Lord
2008-04-07 10:51         ` Rafael J. Wysocki
2008-04-07 15:51           ` Mark Lord
2008-04-07 17:40             ` Rafael J. Wysocki
2008-04-08 15:35               ` Mark Lord

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=20080327221851.GA9675@jurassic.park.msu.ru \
    --to=ink@jurassic.park.msu.ru \
    --cc=akpm@linux-foundation.org \
    --cc=benh@kernel.crashing.org \
    --cc=bunk@kernel.org \
    --cc=garyhade@us.ibm.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@elte.hu \
    --cc=pm@debian.org \
    --cc=protasnb@gmail.com \
    --cc=rjw@sisk.pl \
    --cc=stefanr@s5r6.in-berlin.de \
    --cc=tglx@linutronix.de \
    --cc=thomas@m3y3r.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®