Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 6 Jan 2005 17:41:30 -0500
From:      John Baldwin <jhb@FreeBSD.org>
To:        Nate Lawson <nate@root.org>
Cc:        freebsd-current@FreeBSD.org
Subject:   Re: page fault panic in device_get_softc/acpi_pcib_route_interrupt
Message-ID:  <200501061741.30367.jhb@FreeBSD.org>
In-Reply-To: <41DDAD7B.2020602@root.org>
References:  <20587818.1102626838092.JavaMail.tomcat@pne-ps4-sn1> <41DD9806.6060301@telia.com> <41DDAD7B.2020602@root.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Thursday 06 January 2005 04:28 pm, Nate Lawson wrote:
> Pawel Worach wrote:
> > pci_add_children(c1f16a00,0,80,c0820b54,c052188f) at
> > pci_add_children+0x123
> > acpi_pci_attach(c1f16a00,c1f4484c,c06c14ec,c06aa680,0) at
> > acpi_pci_attach+0x86
> > device_attach(c1f16a00,c1ed5d80,c0820bdc,c07c538c,c1f16d00) at
> > device_attach+0x2c9
> > bus_generic_attach(c1f16d00,c07d92a7,0,c0820bcc,0) at
> > bus_generic_attach+0x18
> > acpi_pcib_attach(c1f16d00,c1f7e1f4,0,c0820c04,c07bff97) at
> > acpi_pcib_attach+0xec
> > acpi_pcib_acpi_attach(c1f16d00,c1f4384c,c06c14ec,c06aa680,0) at
> > acpi_pcib_acpi_attach+0xf9
> > device_attach(c1f16d00,2f,c0820cbc,c07c27c4,c1ed5d80) at
> > device_attach+0x2c9
> > bus_generic_attach(c1ed5d80,2e,2f,c1f7dc28,2e) at bus_generic_attach+0x18
> > acpi_attach(c1ed5d80,c1f4604c,c06c14ec,c06aa680,0) at acpi_attach+0x7b4
> > device_attach(c1ed5d80,c1f15000,c0820d18,c0679ffa,c1f15000) at
> > device_attach+0x2c9
> > bus_generic_attach(c1f15000,c1f1504c,c0820d54,c0520839,c1f15000) at
> > bus_generic_attach+0x18
>
> John, perhaps this is the problem.  pci_add_child is attempting to route
> interrupts.  However, if the link device is under the PCI bus device, it
> may not have a handle/device association yet.

I thought you said we did all the handle/device associations earlier before we 
probed any ACPI devices?  (Which would include pcib0 - the Host-PCI bridge).

> acpi_pci_attach():
> 	/* Add pci children and route interrupts */
> 	pci_add_children(dev, busno, sizeof(struct acpi_pci_devinfo));
>
> 	/* Whoops, haven't assigned handles for link devices
> 	 * under "dev" yet! */
> 	AcpiWalkNamespace(ACPI_TYPE_DEVICE, acpi_get_handle(dev), 1,
> 	    acpi_pci_save_handle, dev, NULL);

Note that this function is called when pci0 is attached.  pci0 is attached 
when pcib0 calls bus_generic_attach() in its attach routine:

    /*
     * Now go scan the bus.
     */
    prt_walk_table(prt, prt_attach_devices, dev);

    return_VALUE (bus_generic_attach(dev));

Note that we force-attach all the referenced link devices via 
prt_attach_devices before pci0 gets its probe and attach routines called, and 
thus before pci_add_children() is called.

> Pawel, can you send a link to your asl?  acpidump -t -d > pawel.asl
> I expect we'll see something like this:
>
> 	Device (PCI0)
> 		Method (_PRT)
> 			[reference to LNK0]
> 		Device (LNK0)
> 		Device (USB0)
>
> My question is why is pci_add_child() routing interrupts?  That should
> be done in the attach method for the PCI bus, before probing/attaching
> children, not when the child devices are being added.  I think we'll
> have to split this into two separate steps:  pci_add_children(), set up
> device/handle associations, pci_init_children().  The last function
> would do the irq routing.

PCi allocates any resources already enabled in a PCI device via the bus when 
the device is added, and doing an alloc_resource() of an IRQ causes it to be 
routed.

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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200501061741.30367.jhb>