Project

General

Profile

Bug #557 » acpi-test-3.diff

qhwt+dfly, 02/28/2007 11:58 AM

View differences:

acpi_cpu.c 28 Feb 2007 11:40:57 -0000
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];
......
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));
......
* 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))
......
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);
}
......
ACPI_ASSERTLOCK;
DEBUG_KNOB(11);
sc = device_get_softc(dev);
sc->cpu_dev = dev;
sc->cpu_handle = acpi_get_handle(dev);
......
return_VALUE (0);
}
#undef DEBUG_KNOB
/*
* Find the nth present CPU and return its pc_cpuid as well as set the
(7-7/8)