Bug #557 » acpi-test-3.diff
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
|