summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/dev/acpica/acpi_perf.c5
-rw-r--r--sys/dev/cpufreq/ichss.c6
-rw-r--r--sys/i386/cpufreq/est.c4
-rw-r--r--sys/i386/cpufreq/p4tcc.c11
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");
}
OpenPOWER on IntegriCloud