From: Andrew Morton <akpm@linux-foundation.org>
To: Chuck Ebbert <cebbert@redhat.com>
Cc: linux-kernel <linux-kernel@vger.kernel.org>,
Ivan Kokshaysky <ink@jurassic.park.msu.ru>,
Linus Torvalds <torvalds@linux-foundation.org>,
Daniel Ritz <daniel.ritz@gmx.ch>, Greg KH <greg@kroah.com>,
Richard Henderson <rth@twiddle.net>, Ingo Molnar <mingo@elte.hu>
Subject: Re: PCI resource problems caused by improper address rounding
Date: Sat, 22 Dec 2007 01:22:05 -0800 [thread overview]
Message-ID: <20071222012205.231f23d6.akpm@linux-foundation.org> (raw)
In-Reply-To: <47671377.6000405@redhat.com>
On Mon, 17 Dec 2007 19:25:27 -0500 Chuck Ebbert <cebbert@redhat.com> wrote:
> Looks like a commit that I can't find in git due to the arch merge
> has broken PCI address assignment. This patch by Richard Henderson
> against 2.6.23 fixes it for x86_64:
>
> --- linux-2.6.23.x86_64/arch/x86_64/kernel/e820.c 2007-10-09 13:31:38.000000000 -0700
> +++ linux-2.6.23.x86_64-rth/arch/x86_64/kernel/e820.c 2007-12-15 12:37:44.000000000 -0800
> @@ -718,8 +718,8 @@ __init void e820_setup_gap(void)
> while ((gapsize >> 4) > round)
> round += round;
> /* Fun with two's complement */
> - pci_mem_start = (gapstart + round) & -round;
> + pci_mem_start = (gapstart + round - 1) & -round;
>
> printk(KERN_INFO "Allocating PCI resources starting at %lx (gap: %lx:%lx)\n",
> pci_mem_start, gapstart, gapsize);
>
>
> Here is the original changeset, taken from the Mercurial repo. It was
> merged in 2.6.14:
>
> # HG changeset patch
> # User Daniel Ritz <daniel.ritz@gmx.ch>
> # Date 1126304746 -700
> # Node ID 51367d6e0b839be0b425a8f67c29f625b670f126
> # Parent f4852c862b04efc9f8e2c7913191f5f7d140d895
> [PATCH] Update PCI IOMEM allocation start
>
> This fixes the problem with "Averatec 6240 pcmcia_socket0: unable to
> apply power", which was due to the CardBus IOMEM register region being
> allocated at an address that was actually inside the RAM window that had
> been reserved for video frame-buffers in an UMA setup.
>
> The BIOS _should_ have marked that region reserved in the e820 memory
> descriptor tables, but did not.
>
> It is fixed by rounding up the default starting address of PCI memory
> allocations, so that we leave a bigger gap after the final known memory
> location. The amount of rounding depends on how big the unused memory
> gap is that we can allocate IOMEM from.
>
> Based on example code by Linus.
>
> Acked-by: Greg KH <greg@kroah.com>
> Acked-by: Ivan Kokshaysky <ink@jurassic.park.msu.ru>
> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
>
> committer: Linus Torvalds <torvalds@g5.osdl.org> 1126304746 -0700
>
>
> --- a/arch/i386/kernel/setup.c Fri Sep 09 22:28:40 2005 +0011
> +++ b/arch/i386/kernel/setup.c Fri Sep 09 22:37:26 2005 +0011
> @@ -1300,7 +1300,7 @@ legacy_init_iomem_resources(struct resou
> */
> static void __init register_memory(void)
> {
> - unsigned long gapstart, gapsize;
> + unsigned long gapstart, gapsize, round;
> unsigned long long last;
> int i;
>
> @@ -1345,14 +1345,14 @@ static void __init register_memory(void)
> }
>
> /*
> - * Start allocating dynamic PCI memory a bit into the gap,
> - * aligned up to the nearest megabyte.
> - *
> - * Question: should we try to pad it up a bit (do something
> - * like " + (gapsize >> 3)" in there too?). We now have the
> - * technology.
> + * See how much we want to round up: start off with
> + * rounding to the next 1MB area.
> */
> - pci_mem_start = (gapstart + 0xfffff) & ~0xfffff;
> + round = 0x100000;
> + while ((gapsize >> 4) > round)
> + round += round;
> + /* Fun with two's complement */
> + pci_mem_start = (gapstart + round) & -round;
>
> printk("Allocating PCI resources starting at %08lx (gap: %08lx:%08lx)\n",
> pci_mem_start, gapstart, gapsize);
> --- a/arch/x86_64/kernel/e820.c Fri Sep 09 22:28:40 2005 +0011
> +++ b/arch/x86_64/kernel/e820.c Fri Sep 09 22:37:26 2005 +0011
> @@ -567,7 +567,7 @@ unsigned long pci_mem_start = 0xaeedbabe
> */
> __init void e820_setup_gap(void)
> {
> - unsigned long gapstart, gapsize;
> + unsigned long gapstart, gapsize, round;
> unsigned long last;
> int i;
> int found = 0;
> @@ -604,14 +604,14 @@ __init void e820_setup_gap(void)
> }
>
> /*
> - * Start allocating dynamic PCI memory a bit into the gap,
> - * aligned up to the nearest megabyte.
> - *
> - * Question: should we try to pad it up a bit (do something
> - * like " + (gapsize >> 3)" in there too?). We now have the
> - * technology.
> + * See how much we want to round up: start off with
> + * rounding to the next 1MB area.
> */
> - pci_mem_start = (gapstart + 0xfffff) & ~0xfffff;
> + round = 0x100000;
> + while ((gapsize >> 4) > round)
> + round += round;
> + /* Fun with two's complement */
> + pci_mem_start = (gapstart + round) & -round;
>
> printk(KERN_INFO "Allocating PCI resources starting at %lx (gap: %lx:%lx)\n",
> pci_mem_start, gapstart, gapsize);
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/
next prev parent reply other threads:[~2007-12-22 9:24 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-12-18 0:25 PCI resource problems caused by improper address rounding Chuck Ebbert
2007-12-18 0:57 ` Linus Torvalds
2007-12-18 17:34 ` Chuck Ebbert
2007-12-18 18:21 ` Linus Torvalds
2007-12-18 20:22 ` Richard Henderson
2007-12-18 21:09 ` Linus Torvalds
2007-12-18 21:46 ` Chuck Ebbert
2007-12-18 21:56 ` Linus Torvalds
2007-12-18 22:17 ` Richard Henderson
2007-12-18 21:51 ` Richard Henderson
2007-12-18 22:31 ` Linus Torvalds
2007-12-19 1:38 ` Linus Torvalds
2007-12-20 21:52 ` Richard Henderson
2007-12-20 22:24 ` Linus Torvalds
2007-12-21 0:39 ` Richard Henderson
2007-12-21 1:00 ` Linus Torvalds
2007-12-21 2:28 ` Benjamin Herrenschmidt
2007-12-18 22:16 ` Keith Packard
2007-12-19 0:29 ` Bjorn Helgaas
2007-12-18 21:23 ` Ivan Kokshaysky
2007-12-18 21:46 ` Linus Torvalds
2007-12-20 8:46 ` Ivan Kokshaysky
2007-12-20 21:21 ` Benjamin Herrenschmidt
2007-12-22 9:12 ` Andrew Morton
2007-12-22 9:20 ` Andrew Morton
2007-12-20 21:10 ` Benjamin Herrenschmidt
2007-12-22 9:22 ` Andrew Morton [this message]
[not found] <fa.WmGIH8th8MfmciABVSBi6whxeFE@ifi.uio.no>
[not found] ` <fa.Obg5E3fyax+MaF94//uo40q/Zyk@ifi.uio.no>
[not found] ` <fa./6K5nXEIpws4VU8HtJhQjF4AoGg@ifi.uio.no>
[not found] ` <fa.V82IIxMkW3eu+9B44NfoyYYQDP4@ifi.uio.no>
[not found] ` <fa.DM9AyNQQtam66XpKVeXeqS639os@ifi.uio.no>
[not found] ` <fa.f5O3U527Rv8DNk05hDFRjdCaeFE@ifi.uio.no>
2007-12-19 0:11 ` Robert Hancock
2007-12-19 0:55 ` Chuck Ebbert
2007-12-19 1:12 ` Richard Henderson
2007-12-19 3:12 ` Linus Torvalds
[not found] ` <fa.PJGSMm4TIW6lRYng/jDqooIvj8U@ifi.uio.no>
[not found] ` <fa.0UHHdYi5zqyJ2xOPhNk/BhJkxYM@ifi.uio.no>
2007-12-19 0:18 ` Robert Hancock
2007-12-19 0:38 ` Robert Hancock
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=20071222012205.231f23d6.akpm@linux-foundation.org \
--to=akpm@linux-foundation.org \
--cc=cebbert@redhat.com \
--cc=daniel.ritz@gmx.ch \
--cc=greg@kroah.com \
--cc=ink@jurassic.park.msu.ru \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=rth@twiddle.net \
--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.