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