svn commit: r358555 - head/sys/dev/cpufreq

Emmanuel Vadot manu at FreeBSD.org
Mon Mar 2 21:19:52 UTC 2020


Author: manu
Date: Mon Mar  2 21:19:51 2020
New Revision: 358555
URL: https://svnweb.freebsd.org/changeset/base/358555

Log:
  cpufreq_dt: Improve multiple opp support
  
  When looking for cpu with the same OPP starts from the root /cpus node
  so each instance of cpufreq_dt will now each cpu with the same operating
  point.
  Also test that the node we are testing have the property "device_type" set
  to be equal to "cpu".
  While here add more debug printfs (off by defaults).
  
  MFC after:	2 weeks

Modified:
  head/sys/dev/cpufreq/cpufreq_dt.c

Modified: head/sys/dev/cpufreq/cpufreq_dt.c
==============================================================================
--- head/sys/dev/cpufreq/cpufreq_dt.c	Mon Mar  2 20:14:27 2020	(r358554)
+++ head/sys/dev/cpufreq/cpufreq_dt.c	Mon Mar  2 21:19:51 2020	(r358555)
@@ -81,6 +81,7 @@ struct cpufreq_dt_softc {
 	struct cpufreq_dt_opp *opp;
 	ssize_t nopp;
 
+	int cpu;
 	cpuset_t cpus;
 };
 
@@ -169,6 +170,13 @@ cpufreq_dt_set(device_t dev, const struct cf_setting *
 
 	sc = device_get_softc(dev);
 
+	DEBUG(dev, "Working on cpu %d\n", sc->cpu);
+	DEBUG(dev, "We have %d cpu on this dev\n", CPU_COUNT(&sc->cpus));
+	if (!CPU_ISSET(sc->cpu, &sc->cpus)) {
+		DEBUG(dev, "Not for this CPU\n");
+		return (0);
+	}
+
 	if (clk_get_freq(sc->clk, &freq) != 0) {
 		device_printf(dev, "Can't get current clk freq\n");
 		return (ENXIO);
@@ -190,7 +198,6 @@ cpufreq_dt_set(device_t dev, const struct cf_setting *
 			return (ENOENT);
 		}
 		uvolt = copp->uvolt_target;
-
 	}
 
 	opp = cpufreq_dt_find_opp(sc->dev, set->freq * 1000000);
@@ -449,14 +456,16 @@ cpufreq_dt_attach(device_t dev)
 	int cpu;
 	uint64_t freq;
 	int rv = 0;
+	char device_type[16];
 	enum opp_version version;
 
 	sc = device_get_softc(dev);
 	sc->dev = dev;
 	node = ofw_bus_get_node(device_get_parent(dev));
-	cpu = device_get_unit(device_get_parent(dev));
+	sc->cpu = device_get_unit(device_get_parent(dev));
 
-	if (cpu >= mp_ncpus) {
+	DEBUG(dev, "cpu=%d\n", sc->cpu);
+	if (sc->cpu >= mp_ncpus) {
 		device_printf(dev, "Not attaching as cpu is not present\n");
 		return (ENXIO);
 	}
@@ -502,7 +511,18 @@ cpufreq_dt_attach(device_t dev)
 	 * Find all CPUs that share the same opp table
 	 */
 	CPU_ZERO(&sc->cpus);
-	for (cnode = node; cnode > 0; cnode = OF_peer(cnode), cpu++) {
+	cnode = OF_parent(node);
+	for (cpu = 0, cnode = OF_child(cnode); cnode > 0; cnode = OF_peer(cnode)) {
+		if (OF_getprop(cnode, "device_type", device_type, sizeof(device_type)) <= 0)
+			continue;
+		if (strcmp(device_type, "cpu") != 0)
+			continue;
+		if (cpu == sc->cpu) {
+			DEBUG(dev, "Skipping our cpu\n");
+			cpu++;
+			continue;
+		}
+		DEBUG(dev, "Testing CPU %d\n", cpu);
 		copp = -1;
 		if (version == OPP_V1)
 			OF_getencprop(cnode, "operating-points", &copp,
@@ -510,8 +530,11 @@ cpufreq_dt_attach(device_t dev)
 		else if (version == OPP_V2)
 			OF_getencprop(cnode, "operating-points-v2",
 			    &copp, sizeof(copp));
-		if (opp == copp)
+		if (opp == copp) {
+			DEBUG(dev, "CPU %d is using the same opp as this one (%d)\n", cpu, sc->cpu);
 			CPU_SET(cpu, &sc->cpus);
+		}
+		cpu++;
 	}
 
 	if (clk_get_freq(sc->clk, &freq) == 0)


More information about the svn-src-all mailing list