On Wednesday, June 08, 2011 4:20:00 pm deeptec...@gmail.com wrote:
> On Wed, Jun 8, 2011 at 7:56 PM, John Baldwin <j...@freebsd.org> wrote:
> > On Wednesday, June 08, 2011 11:20:17 am deeptec...@gmail.com wrote:
> >> On Tue, Jun 7, 2011 at 4:35 PM, John Baldwin <j...@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
_______________________________________________
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to "freebsd-current-unsubscr...@freebsd.org"

Reply via email to