Date: Thu, 9 Jun 2011 09:22:45 -0400 From: John Baldwin <jhb@freebsd.org> To: freebsd-current@freebsd.org Cc: "deeptech71@gmail.com" <deeptech71@gmail.com> Subject: Re: pcib allocation failure Message-ID: <201106090922.45150.jhb@freebsd.org> In-Reply-To: <BANLkTimqyE8AW2A7efiomXy-iAnq5mQO6Q@mail.gmail.com> References: <BANLkTikTHFTHff5iuPDMxR6zhezEcTaZSA@mail.gmail.com> <201106081356.39221.jhb@freebsd.org> <BANLkTimqyE8AW2A7efiomXy-iAnq5mQO6Q@mail.gmail.com>
next in thread | previous in thread | raw e-mail | index | archive | help
On Wednesday, June 08, 2011 4:20:00 pm deeptech71@gmail.com wrote:
> On Wed, Jun 8, 2011 at 7:56 PM, John Baldwin <jhb@freebsd.org> wrote:
> > On Wednesday, June 08, 2011 11:20:17 am deeptech71@gmail.com wrote:
> >> On Tue, Jun 7, 2011 at 4:35 PM, John Baldwin <jhb@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)
> > @@ -953,7 +975,7 @@ 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)
@@ -916,7 +934,8 @@ 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,
@@ -944,7 +963,7 @@ 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,
@@ -957,7 +976,7 @@ 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;
@@ -976,6 +995,11 @@ 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,
@@ -983,6 +1007,11 @@ 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
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201106090922.45150.jhb>
