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:
parent
1a6d9e839f
commit
97d31723e7
@ -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");
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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");
|
||||
}
|
||||
|
@ -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");
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user