Make a pass through all drivers checking specs for desired behavior on

SMP systems.  It appears all drivers except ichss should attach to each
CPU and that settings should be performed on each CPU.  Add comments about
this.  Also, add a guard for p4tcc's identify method being called more than
once.
This commit is contained in:
Nate Lawson 2005-02-27 02:43:02 +00:00
parent 1a6d9e839f
commit 97d31723e7
4 changed files with 25 additions and 1 deletions

View File

@ -152,6 +152,11 @@ acpi_perf_identify(driver_t *driver, device_t parent)
return;
if (ACPI_FAILURE(AcpiEvaluateObject(handle, "_PSS", NULL, NULL)))
return;
/*
* Add a child to every CPU that has the right methods. In future
* versions of the ACPI spec, CPUs can have different settings.
*/
if (BUS_ADD_CHILD(parent, 0, "acpi_perf", -1) == NULL)
device_printf(parent, "add acpi_perf child failed\n");
}

View File

@ -166,7 +166,11 @@ ichss_pci_probe(device_t dev)
if (devclass_get_device(ichss_devclass, 0))
return (ENXIO);
/* Add a child under the CPU parent. */
/*
* Add a child under the CPU parent. It appears that ICH SpeedStep
* only requires a single CPU to set the value (since the chipset
* is shared by all CPUs.) Thus, we only add a child to cpu 0.
*/
parent = devclass_get_device(devclass_find("cpu"), 0);
KASSERT(parent != NULL, ("cpu parent is NULL"));
child = BUS_ADD_CHILD(parent, 0, "ichss", 0);

View File

@ -582,6 +582,10 @@ est_identify(driver_t *driver, device_t parent)
if ((p[2] & 0x80) == 0)
return;
/*
* We add a child for each CPU since settings must be performed
* on each CPU in the SMP case.
*/
if (BUS_ADD_CHILD(parent, 0, "est", -1) == NULL)
device_printf(parent, "add est child failed\n");
}

View File

@ -102,6 +102,17 @@ p4tcc_identify(driver_t *driver, device_t parent)
if ((cpu_feature & (CPUID_ACPI | CPUID_TM)) != (CPUID_ACPI | CPUID_TM))
return;
/* Make sure we're not being doubly invoked. */
if (device_find_child(parent, "p4tcc", -1) != NULL)
return;
/*
* We attach a p4tcc child for every CPU since settings need to
* be performed on every CPU in the SMP case. See section 13.15.3
* of the IA32 Intel Architecture Software Developer's Manual,
* Volume 3, for more info.
*/
if (BUS_ADD_CHILD(parent, 0, "p4tcc", -1) == NULL)
device_printf(parent, "add p4tcc child failed\n");
}