Re: pcib allocation failure

From: John Baldwin <jhb_at_freebsd.org>
Date: Thu, 9 Jun 2011 09:22:45 -0400
On Wednesday, June 08, 2011 4:20:00 pm deeptech71_at_gmail.com wrote:
> On Wed, Jun 8, 2011 at 7:56 PM, John Baldwin <jhb_at_freebsd.org> wrote:
> > On Wednesday, June 08, 2011 11:20:17 am deeptech71_at_gmail.com wrote:
> >> On Tue, Jun 7, 2011 at 4:35 PM, John Baldwin <jhb_at_freebsd.org> wrote:
> >> found->       vendor=0x1002, dev=0x4170, revid=0x00
> >>       domain=0, bus=1, slot=0, func=1
> >>       class=03-80-00, hdrtype=0x00, mfdev=0
> >>       cmdreg=0x0007, statreg=0x02b0, cachelnsz=4 (dwords)
> >>       lattimer=0x40 (1920 ns), mingnt=0x08 (2000 ns), maxlat=0x00 (0 ns)
> >>       powerspec 2  supports D0 D1 D2 D3  current D0
> >>       map[10]: type Prefetchable Memory, range 32, base 0xe0000000, size 28, enabled
> >> pcib1: attempting to grow prefetch window for (0xe0000000-0xefffffff,0x10000000)
> >> pcib1: attempting to grow memory window for (0xe0000000-0xefffffff,0x10000000)
> >
> > Odd, I'm not sure why this failed.  Hmm, it seems this was always failing for
> > you though in the older dmesg's though.
> >
> > Hmmm, can you revert all your changes to pci_pci.c and try just this change:
> >
> > Index: pci_pci.c
> > ===================================================================
> > --- pci_pci.c   (revision 222863)
> > +++ pci_pci.c   (working copy)
> > _at__at_ -953,7 +975,7 _at__at_ pcib_grow_window(struct pcib_softc *sc, struct pci
> >                 * ok, ensure it is properly aligned for this window.
> >                 * Also check for overflow.
> >                 */
> > -               if (back <= end && start_free <= back) {
> > +               if (back <= end + 1 && start_free <= back) {
> >                        if (bootverbose)
> >                                printf("\tback candidate range: %#lx-%#lx\n",
> >                                    start_free, back);
> 
> failure.

Hmm, I would say 'progress' actually as it's getting better:


> 	map[10]: type Prefetchable Memory, range 32, base 0xe0000000, size 28, enabled
> pcib1: attempting to grow prefetch window for (0xe0000000-0xefffffff,0x10000000)
> 	back candidate range: 0xe0000000-0xf0000000

It at least attempts to grow it now.

This patch is a slightly more correct fix for the same bug as above but also
adds extra debugging so I can see why bus_adjust_resource() is failing to
grow the window.  It won't fix it yet, but should output more debug info
when it fails to grow the window:

Index: pci_pci.c
===================================================================
--- pci_pci.c	(revision 222863)
+++ pci_pci.c	(working copy)
_at__at_ -916,7 +934,8 _at__at_ pcib_grow_window(struct pcib_softc *sc, struct pci
 
 		/* Move end_free down until it is properly aligned. */
 		end_free &= ~(align - 1);
-		front = end_free - count;
+		end_free--;
+		front = end_free - (count - 1);
 
 		/*
 		 * The resource would now be allocated at (front,
_at__at_ -944,7 +963,7 _at__at_ pcib_grow_window(struct pcib_softc *sc, struct pci
 
 		/* Move start_free up until it is properly aligned. */
 		start_free = roundup2(start_free, align);
-		back = start_free + count;
+		back = start_free + count - 1;
 
 		/*
 		 * The resource would now be allocated at (start_free,
_at__at_ -957,7 +976,7 _at__at_ pcib_grow_window(struct pcib_softc *sc, struct pci
 			if (bootverbose)
 				printf("\tback candidate range: %#lx-%#lx\n",
 				    start_free, back);
-			back = roundup2(back, w->step) - 1;
+			back = roundup2(back + 1, w->step) - 1;
 			back -= rman_get_end(w->res);
 		} else
 			back = 0;
_at__at_ -976,6 +995,11 _at__at_ pcib_grow_window(struct pcib_softc *sc, struct pci
 			    rman_get_end(w->res));
 			if (error == 0)
 				break;
+			if (bootverbose)
+				device_printf(sc->dev,
+			    "failed to grow %s window to %#lx-%#lx: %d\n",
+				    w->name, rman_get_start(w->res) - front,
+				    rman_get_end(w->res), error);
 			front = 0;
 		} else {
 			error = bus_adjust_resource(sc->dev, type, w->res,
_at__at_ -983,6 +1007,11 _at__at_ pcib_grow_window(struct pcib_softc *sc, struct pci
 			    rman_get_end(w->res) + back);
 			if (error == 0)
 				break;
+			if (bootverbose)
+				device_printf(sc->dev,
+			    "failed to grow %s window to %#lx-%#lx: %d\n",
+				    w->name, rman_get_start(w->res),
+				    rman_get_end(w->res) + back, error);
 			back = 0;
 		}
 	}


-- 
John Baldwin
Received on Thu Jun 09 2011 - 11:22:47 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:40:14 UTC