Messages in this thread |  | | Date | Wed, 8 Nov 2000 10:19:48 +0000 | From | Sean Hunter <> | Subject | Re: PCI-PCI bridges mess in 2.4.x |
| |
Hi Richard.
I'm _very_ keen to try this (my Alpha won't boot 2.4 at the mo), however I think the attachments faery has been playing tricks again.
Do you have a patch relative to 2.4.0-test10?
Sean
On Wed, Nov 08, 2000 at 01:39:31AM -0800, Richard Henderson wrote: > [ For l-k, the issue is that pci-pci bridges and the devices behind > them are not initialized properly. There are a number of Alphas > whose built-in scsi controlers are behind such a bridge preventing > these machines from booting at all. Ivan provided an initial > patch to solve this issue. ] > > I've not gotten a chance to try this on the rawhide yet, > but I did give it a whirl on my up1000, which does have > an agp bridge that acts like a pci bridge. > > Notable changes from your patch: > > * Use kmalloc, not vmalloc. (ouch!) > * Replace cropped found_vga detection code. > * Handle bridges with empty I/O (or MEM) ranges. > * Collect the proper width of the bus range. > > > r~
Content-Description: diff vs bridges-2.4.0t10 > diff -rup linux/drivers/pci/setup-bus.c 2.4.0-11-1/drivers/pci/setup-bus.c > --- linux/drivers/pci/setup-bus.c Wed Nov 8 01:24:16 2000 > +++ 2.4.0-11-1/drivers/pci/setup-bus.c Wed Nov 8 01:04:17 2000 > @@ -20,7 +20,7 @@ > #include <linux/errno.h> > #include <linux/ioport.h> > #include <linux/cache.h> > -#include <linux/vmalloc.h> > +#include <linux/slab.h> > > > #define DEBUG_CONFIG 1 > @@ -56,31 +56,50 @@ pbus_assign_resources_sorted(struct pci_ > mem_reserved += 32*1024*1024; > continue; > } > + > + if (dev->class >> 8 == PCI_CLASS_DISPLAY_VGA) > + found_vga = 1; > + > pdev_sort_resources(dev, &head_io, IORESOURCE_IO); > pdev_sort_resources(dev, &head_mem, IORESOURCE_MEM); > } > + > for (list = head_io.next; list;) { > res = list->res; > idx = res - &list->dev->resource[0]; > - if (pci_assign_resource(list->dev, idx) == 0) > + if (pci_assign_resource(list->dev, idx) == 0 > + && ranges->io_end < res->end) > ranges->io_end = res->end; > tmp = list; > list = list->next; > - vfree(tmp); > + kfree(tmp); > } > for (list = head_mem.next; list;) { > res = list->res; > idx = res - &list->dev->resource[0]; > - if (pci_assign_resource(list->dev, idx) == 0) > + if (pci_assign_resource(list->dev, idx) == 0 > + && ranges->mem_end < res->end) > ranges->mem_end = res->end; > tmp = list; > list = list->next; > - vfree(tmp); > + kfree(tmp); > } > + > ranges->io_end += io_reserved; > ranges->mem_end += mem_reserved; > + > + /* ??? How to turn off a bus from responding to, say, I/O at > + all if there are no I/O ports behind the bus? Turning off > + PCI_COMMAND_IO doesn't seem to do the job. So we must > + allow for at least one unit. */ > + if (ranges->io_end == ranges->io_start) > + ranges->io_end += 1; > + if (ranges->mem_end == ranges->mem_start) > + ranges->mem_end += 1; > + > ranges->io_end = ROUND_UP(ranges->io_end, 4*1024); > ranges->mem_end = ROUND_UP(ranges->mem_end, 1024*1024); > + > return found_vga; > } > > diff -rup linux/drivers/pci/setup-res.c 2.4.0-11-1/drivers/pci/setup-res.c > --- linux/drivers/pci/setup-res.c Wed Nov 8 01:24:16 2000 > +++ 2.4.0-11-1/drivers/pci/setup-res.c Wed Nov 8 00:21:13 2000 > @@ -22,10 +22,10 @@ > #include <linux/errno.h> > #include <linux/ioport.h> > #include <linux/cache.h> > -#include <linux/vmalloc.h> > +#include <linux/slab.h> > > > -#define DEBUG_CONFIG 0 > +#define DEBUG_CONFIG 1 > #if DEBUG_CONFIG > # define DBGC(args) printk args > #else > @@ -146,7 +146,7 @@ pdev_sort_resources(struct pci_dev *dev, > if (ln) > size = ln->res->end - ln->res->start; > if (r->end - r->start > size) { > - tmp = vmalloc(sizeof(*tmp)); > + tmp = kmalloc(sizeof(*tmp), GFP_KERNEL); > tmp->next = ln; > tmp->res = r; > tmp->dev = dev;
- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org Please read the FAQ at http://www.tux.org/lkml/
|  |