SMP boot errors

Hans van Leest hvleest at signet.nl
Tue Aug 16 12:50:01 GMT 2005


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?
 


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:
>
>
>  
>



More information about the freebsd-smp mailing list