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.
*
next prev parent 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®