public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
  • * Re: PCI resource problems caused by improper address rounding
           [not found] ` <fa.Obg5E3fyax+MaF94//uo40q/Zyk@ifi.uio.no>
           [not found]   ` <fa./6K5nXEIpws4VU8HtJhQjF4AoGg@ifi.uio.no>
    @ 2007-12-19  0:38   ` Robert Hancock
      1 sibling, 0 replies; 33+ messages in thread
    From: Robert Hancock @ 2007-12-19  0:38 UTC (permalink / raw)
      To: Linus Torvalds
      Cc: Chuck Ebbert, linux-kernel, Ivan Kokshaysky, Daniel Ritz, Greg KH
    
    Linus Torvalds wrote:
    > 
    > On Mon, 17 Dec 2007, Chuck Ebbert 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;
    > 
    > No, it's very much meant to be that way.
    > 
    > We do *not* want to have the PCI memory abutthe end of memory exactly. So 
    > it leaves a gap in between "gapstart" and the actual start of PCI memory 
    > addressing very much on purpose.
    > 
    > In fact, the very commit (it's f0eca9626c6becb6fc56106b2e4287c6c784af3d in 
    > the kernel tree) you mention actually explicitly *explains* that, although 
    > maybe it's a bit indirect: if you start allocating PCI resources directly 
    > after the end-of-RAM thing, you can easily end up using addresses that are 
    > actually inside the magic stolen system RAM that is being used for UMA 
    > video etc.
    > 
    > So you very much want to have a buffer in between the end-of-RAM and the 
    > actual start of the region we try to allocate in. 
    > 
    > So why do you want them to be close, anyway? 
    > 
    > 		Linus
    > 
    > PS. On a different topic: if you do
    > 
    > 	git log --follow arch/x86/kernel/e820_64.c
    > 
    > you'd see the history past the renames in git. Or just do a "git blame -C" 
    > which will also follow renames (and copies).
    
    That patch is from the 2.6.14 era - I don't think we even did PnP ACPI 
    resource reservation handling then? It could be that the BIOS was trying 
    to tell us that UMA memory region is reserved using PnP ACPI 
    reservations, but we just ignored it.
    
    It seems rather arbitrary in how much it leaves unused - and in this 
    case, likely prevents us from using the nice big open gap that the BIOS 
    presumably expected the graphics card to be mapped into.
    
    I suspect this buffer space insertion is really not needed at this 
    point. The patch description is likely technically correct in that the 
    BIOS should have reserved it in E820, but (according to MS comments in a 
    presentation I read) Windows doesn't use E820 for anything other than 
    figuring out where RAM is, it uses PnP ACPI for figuring out areas it 
    needs to avoid. Since BIOS writers test against that behavior, there are 
    surely lots of systems where ignoring PnP ACPI reservations and relying 
    only on E820 would result in things really going blammo (like mappings 
    things over MMCONFIG tables for instance). So disabling it on modern 
    machines is really not an option. And if it's enabled, you likely 
    wouldn't hit the problem it tries to fix.
    
    -- 
    Robert Hancock      Saskatoon, SK, Canada
    To email, remove "nospam" from hancockr@nospamshaw.ca
    Home Page: http://www.roberthancock.com/
    
    
    ^ permalink raw reply	[flat|nested] 33+ messages in thread
  • * PCI resource problems caused by improper address rounding
    @ 2007-12-18  0:25 Chuck Ebbert
      2007-12-18  0:57 ` Linus Torvalds
      2007-12-22  9:22 ` Andrew Morton
      0 siblings, 2 replies; 33+ messages in thread
    From: Chuck Ebbert @ 2007-12-18  0:25 UTC (permalink / raw)
      To: linux-kernel; +Cc: Ivan Kokshaysky, Linus Torvalds, Daniel Ritz, Greg KH
    
    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);
    
    ^ permalink raw reply	[flat|nested] 33+ messages in thread

    end of thread, other threads:[~2007-12-22  9:24 UTC | newest]
    
    Thread overview: 33+ messages (download: mbox.gz follow: Atom feed
    -- links below jump to the message on this page --
         [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           ` PCI resource problems caused by improper address rounding 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
    2007-12-18  0:25 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 is a public inbox, see mirroring instructions
    for how to clone and mirror all data and code used for this inbox