Index: acpi_cpu.c =================================================================== RCS file: /home/source/dragonfly/cvs/src/sys/dev/acpica5/acpi_cpu.c,v retrieving revision 1.19 diff -u -p -r1.19 acpi_cpu.c --- acpi_cpu.c 22 Feb 2007 04:02:50 -0000 1.19 +++ acpi_cpu.c 28 Feb 2007 11:40:57 -0000 @@ -182,10 +182,15 @@ static devclass_t acpi_cpu_devclass; DRIVER_MODULE(cpu, acpi, acpi_cpu_driver, acpi_cpu_devclass, 0, 0); MODULE_DEPEND(cpu, acpi, 1, 1, 1); +static int acpi_cpu_probe_debug_knob = 0; +TUNABLE_INT("debug.acpi.cpu.knob", &acpi_cpu_probe_debug_knob); +#define DEBUG_KNOB(n) \ + if (acpi_cpu_probe_debug_knob == (n)) return(ENXIO) + static int acpi_cpu_probe(device_t dev) { - int acpi_id, cpu_id, cx_count; + int acpi_id, cpu_id, proc_id, cx_count; ACPI_BUFFER buf; ACPI_HANDLE handle; char msg[32]; @@ -196,14 +201,16 @@ acpi_cpu_probe(device_t dev) return (ENXIO); handle = acpi_get_handle(dev); +DEBUG_KNOB(1); if (cpu_softc == NULL) cpu_softc = kmalloc(sizeof(struct acpi_cpu_softc *) * SMP_MAXCPU, M_TEMP /* XXX */, M_INTWAIT | M_ZERO); - +DEBUG_KNOB(2); /* Get our Processor object. */ buf.Pointer = NULL; buf.Length = ACPI_ALLOCATE_BUFFER; status = AcpiEvaluateObject(handle, NULL, NULL, &buf); +DEBUG_KNOB(3); if (ACPI_FAILURE(status)) { device_printf(dev, "probe failed to get Processor obj - %s\n", AcpiFormatException(status)); @@ -221,23 +228,31 @@ acpi_cpu_probe(device_t dev) * ProcId as a key, however, some boxes do not have the same values * in their Processor object as the ProcId values in the MADT. */ - acpi_id = obj->Processor.ProcId; + acpi_id = proc_id = obj->Processor.ProcId; AcpiOsFree(obj); - if (acpi_pcpu_get_id(device_get_unit(dev), &acpi_id, &cpu_id) != 0) +DEBUG_KNOB(4); + if (acpi_pcpu_get_id(device_get_unit(dev), &acpi_id, &cpu_id) != 0) { + if (bootverbose) + device_printf(dev, "ProcId %d: can't find cpu_id\n", proc_id); return (ENXIO); - + } + if (bootverbose) { + device_printf(dev, "ProcId %d: acpi_id=%d, cpu_id=%d\n", proc_id, + acpi_id, cpu_id); + } /* * Check if we already probed this processor. We scan the bus twice * so it's possible we've already seen this one. */ if (cpu_softc[cpu_id] != NULL) return (ENXIO); - +DEBUG_KNOB(5); /* Get a count of Cx states for our device string. */ cx_count = 0; buf.Pointer = NULL; buf.Length = ACPI_ALLOCATE_BUFFER; status = AcpiEvaluateObject(handle, "_CST", NULL, &buf); +DEBUG_KNOB(6); if (ACPI_SUCCESS(status)) { obj = (ACPI_OBJECT *)buf.Pointer; if (ACPI_PKG_VALID(obj, 2)) @@ -251,15 +266,19 @@ acpi_cpu_probe(device_t dev) if (cx_count > 0) cx_count++; } +DEBUG_KNOB(7); if (cx_count > 0) ksnprintf(msg, sizeof(msg), "ACPI CPU (%d Cx states)", cx_count); else strlcpy(msg, "ACPI CPU", sizeof(msg)); +DEBUG_KNOB(8); device_set_desc_copy(dev, msg); +DEBUG_KNOB(9); /* Mark this processor as in-use and save our derived id for attach. */ cpu_softc[cpu_id] = (void *)1; acpi_set_magic(dev, cpu_id); +DEBUG_KNOB(10); return (0); } @@ -278,6 +297,7 @@ acpi_cpu_attach(device_t dev) ACPI_ASSERTLOCK; +DEBUG_KNOB(11); sc = device_get_softc(dev); sc->cpu_dev = dev; sc->cpu_handle = acpi_get_handle(dev); @@ -326,6 +346,7 @@ acpi_cpu_attach(device_t dev) return_VALUE (0); } +#undef DEBUG_KNOB /* * Find the nth present CPU and return its pc_cpuid as well as set the