ACPI hang on 6.0-RELEASE on Compaq Proliant ML530 (866MHz Xeon)

John Baldwin jhb at freebsd.org
Thu Dec 22 08:17:03 PST 2005


On Wednesday 21 December 2005 06:34 pm, Pawel Worach wrote:
> John Baldwin wrote:
> > On Monday 28 November 2005 09:38 am, Kevin Day wrote:
> >> On Nov 28, 2005, at 7:10 AM, John Baldwin wrote:
> >>> On Saturday 26 November 2005 11:18 am, Kevin Day wrote:
> >>>> Hangs on boot after displaying kernel copyright notice with ACPI
> >>>> enabled. Works fine with ACPI disabled.
> >>>>
> >>>> Server has two CPUs, but hang occurs with or without SMP kernel.
> >>>>
> >>>>
> >>>>
> >>>> acpidump at http://www.dragondata.com/~toasty/toasty-ml530.asl
> >>>>
> >>>>
> >>>> dmesg from working config:
> >>>
> >>> Any chance you could use a serial console to capture the dmesg from
> >>> a booth
> >>> with ACPI enabled?
> >>
> >> I get as far as:
> >>> Copyright (c) 1992-2005 The FreeBSD Project.
> >>> Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993,
> >>> 1994
> >>>          The Regents of the University of California. All rights
> >>> reserved.
> >>> FreeBSD 6.0-RELEASE #0: Thu Nov  3 09:36:13 UTC 2005
> >>>      root at x64.samsco.home:/usr/obj/usr/src/sys/GENERIC
> >>
> >> before it hangs. I realize that's not much to go on. :)
> >>
> >>
> >> Since the next thing it should be displaying is the mptable string,
> >> just in case this is relevant, here's the output of mptable:
> >
> > Actually, in the ACPI case it won't use the mptable, but use the MADT
> > table from ACPI instead.  It is odd that your MADT is missing a Local NMI
> > entry for CPU 0.  Could you capture the dmesg from a boot -v over a
> > serial console with ACPI enabled?
>
> Hi,
>
> I have the same problem with ML530 hardware, both RELENG_6_0 and
> RELENG_6 fail in the same way. ASL and boot -v output can be found here:
> http://62.119.221.30/ml530-acpi/
>
> It just hangs there after the "pci_link1: <ACPI PCI Link INA0> on acpi0"
> message, break to debugger doesn't work.
>
> Regards

Unfortunately what I need is for someone with the hardware to add some more 
printf's to find where it is hanging.  Here's a patch.  Please get a verbose 
dmesg with this, thanks.

Index: acpi_pci_link.c
===================================================================
RCS file: /usr/cvs/src/sys/dev/acpica/acpi_pci_link.c,v
retrieving revision 1.51
diff -u -r1.51 acpi_pci_link.c
--- acpi_pci_link.c	5 Dec 2005 19:50:00 -0000	1.51
+++ acpi_pci_link.c	22 Dec 2005 16:15:51 -0000
@@ -421,6 +421,7 @@
 	ACPI_STATUS status;
 	int i;
 
+	device_printf("attach started\n");
 	sc = device_get_softc(dev);
 	sc->pl_dev = dev;
 	ACPI_SERIAL_BEGIN(pci_link);
@@ -432,14 +433,19 @@
 	 */
 	creq.in_dpf = DPF_OUTSIDE;
 	creq.count = 0;
+	device_printf("calling _CRS\n");
 	status = AcpiWalkResources(acpi_get_handle(dev), "_CRS",
 	    acpi_count_irq_resources, &creq);
+	device_printf("_CRS returned %s\n", AcpiFormatException(status));
 	sc->pl_crs_bad = ACPI_FAILURE(status);
 	if (sc->pl_crs_bad) {
 		creq.in_dpf = DPF_OUTSIDE;
 		creq.count = 0;
+		device_printf("calling _PRS\n");
 		status = AcpiWalkResources(acpi_get_handle(dev), "_PRS",
 		    acpi_count_irq_resources, &creq);
+		device_printf("_PRS returned %s\n",
+		    AcpiFormatException(status));
 		if (ACPI_FAILURE(status)) {
 			device_printf(dev,
 			    "Unable to parse _CRS or _PRS: %s\n",
@@ -449,6 +455,7 @@
 		}
 	}
 	sc->pl_num_links = creq.count;
+	device_printf("num_links = %d\n", sc->pl_num_links);
 	if (creq.count == 0)
 		return (0);
 	sc->pl_links = malloc(sizeof(struct link) * sc->pl_num_links,
@@ -462,6 +469,7 @@
 		sc->pl_links[i].l_isa_irq = FALSE;
 		sc->pl_links[i].l_res_index = -1;
 	}
+	device_printf("links initialized\n", sc->pl_num_links);
 
 	/* Try to read the current settings from _CRS if it is valid. */
 	if (!sc->pl_crs_bad) {
@@ -469,8 +477,11 @@
 		rreq.link_index = 0;
 		rreq.res_index = 0;
 		rreq.sc = sc;
+		device_printf("calling _CRS again\n");
 		status = AcpiWalkResources(acpi_get_handle(dev), "_CRS",
 		    link_add_crs, &rreq);
+		device_printf("_CRS returned %s\n",
+		    AcpiFormatException(status));
 		if (ACPI_FAILURE(status)) {
 			device_printf(dev, "Unable to parse _CRS: %s\n",
 			    AcpiFormatException(status));
@@ -487,8 +498,10 @@
 	rreq.link_index = 0;
 	rreq.res_index = 0;
 	rreq.sc = sc;
+	device_printf("calling _PRS again\n");
 	status = AcpiWalkResources(acpi_get_handle(dev), "_PRS",
 	    link_add_prs, &rreq);
+	device_printf("_PRS returned %s\n", AcpiFormatException(status));
 	if (ACPI_FAILURE(status) &&
 	    (status != AE_NOT_FOUND || sc->pl_crs_bad)) {
 		device_printf(dev, "Unable to parse _PRS: %s\n",

-- 
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-acpi mailing list