diff options
-rw-r--r-- | sys/dev/acpica/acpi_perf.c | 5 | ||||
-rw-r--r-- | sys/dev/cpufreq/ichss.c | 6 | ||||
-rw-r--r-- | sys/i386/cpufreq/est.c | 4 | ||||
-rw-r--r-- | sys/i386/cpufreq/p4tcc.c | 11 |
4 files changed, 25 insertions, 1 deletions
diff --git a/sys/dev/acpica/acpi_perf.c b/sys/dev/acpica/acpi_perf.c index 2307000..ab17a56 100644 --- a/sys/dev/acpica/acpi_perf.c +++ b/sys/dev/acpica/acpi_perf.c @@ -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"); } diff --git a/sys/dev/cpufreq/ichss.c b/sys/dev/cpufreq/ichss.c index b8d3542..d38ed52 100644 --- a/sys/dev/cpufreq/ichss.c +++ b/sys/dev/cpufreq/ichss.c @@ -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); diff --git a/sys/i386/cpufreq/est.c b/sys/i386/cpufreq/est.c index 53b1cd7..6239332 100644 --- a/sys/i386/cpufreq/est.c +++ b/sys/i386/cpufreq/est.c @@ -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"); } diff --git a/sys/i386/cpufreq/p4tcc.c b/sys/i386/cpufreq/p4tcc.c index cff04fe..b8cf66e 100644 --- a/sys/i386/cpufreq/p4tcc.c +++ b/sys/i386/cpufreq/p4tcc.c @@ -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"); } |