summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornjl <njl@FreeBSD.org>2005-02-27 02:43:02 +0000
committernjl <njl@FreeBSD.org>2005-02-27 02:43:02 +0000
commit0dae5d8c1d1ea90f8518e5d25c44ab7bb0d82ace (patch)
treed74a00967ac027e61016fbf7128f8de321bdb358
parentada3533e8b6a7346419b1f7821c9e8e434fe5054 (diff)
downloadFreeBSD-src-0dae5d8c1d1ea90f8518e5d25c44ab7bb0d82ace.zip
FreeBSD-src-0dae5d8c1d1ea90f8518e5d25c44ab7bb0d82ace.tar.gz
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.
-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