SMP boot errors

John Baldwin jhb at FreeBSD.org
Tue Aug 16 17:50:15 GMT 2005


On Tuesday 16 August 2005 08:49 am, Hans van Leest wrote:
> Still problems unfortunaly
> I did the following.
> Started with a new CURRENT source.
> applied the patch, and build / installed the kernel
> 
> At boot, with ACPI enabled in the BIOS,
> In the bootloader I typed:
> #set hw.pci0.31.INTA.irq=16
> #boot
> I get the following error:
> Instruc. pointer: 0x20:0xc0800a87
> Same error with ..irq=18
> 
> With ACPI disabled in the BIOS:
> #set hw.pci0.31.INTA.irq=16 (or 18)
> #boot
> Instruc. pointer: 0x20:0xc0530f4d
> 
> A noticed the following line in dmesg after booting the previous kernel:
> atapci0: <Intel 6300ESB SATA150 controller> port 
> 0xf000-0xf00f,0x376,0x170-0x177,0x3f6,0x1f0-0x1f7 irq 18 at device 31.2 
> on pci0
> 
> I looks like the Intel RAID controller uses irq 18
> 
> Any suggestions?

I need the full error message when it dies.  It seems to be a kernel panic.  
At the very least can you build a debug kernel and then get the panic 
messages including the faulting virtual address and instruction pointer 
lines?  Even better can be if you compile ddb and kdb into your kernel and 
get a stack trace from ddb.  I'm pretty sure this patch can only help in the 
non-ACPI case as well where it panics with the multiple IRQs problem.

> John Baldwin wrote:
> 
> >On Sunday 14 August 2005 06:31 am, Hans van Leest wrote:
> >  
> >
> >>Hello,
> >>
> >>I've started with a new 6.0 source. Patched the source and did a make 
> >>buildworld, with no problems.
> >>When I do a make buildkernel I get an error:
> >>    
> >>
> >
> >Yes, the patch had some bugs which I've since fixed (it actually completely 
busted interrupts on my alpha at first).  Here is the updated patch:
> >
> >--- //depot/vendor/freebsd/src/sys/dev/pci/pci.c	2005/06/03 19:45:18
> >+++ //depot/user/jhb/acpipci/dev/pci/pci.c	2005/08/03 19:57:34
> >@@ -76,6 +76,8 @@
> > 
> > static int		pci_porten(device_t pcib, int b, int s, int f);
> > static int		pci_memen(device_t pcib, int b, int s, int f);
> >+static void		pci_assign_interrupt(device_t bus, device_t dev,
> >+			    int force_route);
> > static int		pci_add_map(device_t pcib, device_t bus, device_t dev,
> > 			    int b, int s, int f, int reg,
> > 			    struct resource_list *rl);
> >@@ -922,13 +924,60 @@
> > }
> > 
> > static void
> >+pci_assign_interrupt(device_t bus, device_t dev, int force_route)
> >+{
> >+	struct pci_devinfo *dinfo = device_get_ivars(dev);
> >+	pcicfgregs *cfg = &dinfo->cfg;
> >+	char tunable_name[64];
> >+	int irq;
> >+
> >+	/* Has to have an intpin to have an interrupt. */
> >+	if (cfg->intpin == 0)
> >+		return;
> >+
> >+	/* Let the user override the IRQ with a tunable. */
> >+	irq = PCI_INVALID_IRQ;
> >+	snprintf(tunable_name, sizeof(tunable_name), "hw.pci%d.%d.INT%c.irq",
> >+	    cfg->bus, cfg->slot, cfg->intpin + 'A' - 1);
> >+	if (TUNABLE_INT_FETCH(tunable_name, &irq) && (irq >= 255 || irq <= 0))
> >+		irq = PCI_INVALID_IRQ;
> >+
> >+	/*
> >+	 * If we didn't get an IRQ via the tunable, then we either use the
> >+	 * IRQ value in the intline register or we ask the bus to route an
> >+	 * interrupt for us.  If force_route is true, then we only use the
> >+	 * value in the intline register if the bus was unable to assign an
> >+	 * IRQ.
> >+	 */
> >+	if (!PCI_INTERRUPT_VALID(irq)) {
> >+		if (!PCI_INTERRUPT_VALID(cfg->intline) || force_route)
> >+			irq = PCI_ASSIGN_INTERRUPT(bus, dev);
> >+		if (!PCI_INTERRUPT_VALID(irq))
> >+			irq = cfg->intline;
> >+	}
> >+
> >+	/* If after all that we don't have an IRQ, just bail. */
> >+	if (!PCI_INTERRUPT_VALID(irq))
> >+		return;
> >+
> >+	/* Update the config register if it changed. */
> >+	if (irq != cfg->intline) {
> >+		cfg->intline = irq;
> >+		pci_write_config(dev, PCIR_INTLINE, irq, 1);
> >+	}
> >+
> >+	/* Add this IRQ as rid 0 interrupt resource. */
> >+	resource_list_add(&dinfo->resources, SYS_RES_IRQ, 0, irq, irq, 1);
> >+}
> >+
> >+static void
> > pci_add_resources(device_t pcib, device_t bus, device_t dev)
> > {
> > 	struct pci_devinfo *dinfo = device_get_ivars(dev);
> > 	pcicfgregs *cfg = &dinfo->cfg;
> > 	struct resource_list *rl = &dinfo->resources;
> > 	struct pci_quirk *q;
> >-	int b, i, irq, f, s;
> >+	int b, i, f, s;
> > 
> > 	b = cfg->bus;
> > 	s = cfg->slot;
> >@@ -959,14 +1008,10 @@
> > 		 * If the re-route fails, then just stick with what we
> > 		 * have.
> > 		 */
> >-		irq = PCI_ASSIGN_INTERRUPT(bus, dev);
> >-		if (PCI_INTERRUPT_VALID(irq)) {
> >-			pci_write_config(dev, PCIR_INTLINE, irq, 1);
> >-			cfg->intline = irq;
> >-		} else
> >+		pci_assign_interrupt(bus, dev, 1);
> >+#else
> >+		pci_assign_interrupt(bus, dev, 0);
> > #endif
> >-			irq = cfg->intline;
> >-		resource_list_add(rl, SYS_RES_IRQ, 0, irq, irq, 1);
> > 	}
> > }
> > 
> >@@ -1705,15 +1750,8 @@
> > 			 * interrupt, try to assign it one.
> > 			 */
> > 			if (!PCI_INTERRUPT_VALID(cfg->intline) &&
> >-			    (cfg->intpin != 0)) {
> >-				cfg->intline = PCI_ASSIGN_INTERRUPT(dev, child);
> >-				if (PCI_INTERRUPT_VALID(cfg->intline)) {
> >-					pci_write_config(child, PCIR_INTLINE,
> >-					    cfg->intline, 1);
> >-					resource_list_add(rl, SYS_RES_IRQ, 0,
> >-					    cfg->intline, cfg->intline, 1);
> >-				}
> >-			}
> >+			    (cfg->intpin != 0))
> >+				pci_assign_interrupt(dev, child, 0);
> > 			break;
> > 		case SYS_RES_IOPORT:
> > 		case SYS_RES_MEMORY:
> >
> >
> >  
> >
> 
> _______________________________________________
> freebsd-smp at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-smp
> To unsubscribe, send any mail to "freebsd-smp-unsubscribe at freebsd.org"
> 

-- 
John Baldwin <jhb at FreeBSD.org>  <><  http://www.FreeBSD.org/~jhb/
"Power Users Use the Power to Serve"  =  http://www.FreeBSD.org


More information about the freebsd-smp mailing list