Skip to contentSkip to conversation

cpufreq: clean up CPU information

PATCH New Dominik Brodowski 1 participant 1 message Dec 13, 2002

Subsystems (4)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 cpufreq: clean up CPU information

This patch moves some basic per-CPU static information (minimum frequency, maximum frequency and maximum transition latency) into a struct cpufreq_cpuinfo. This offers a much cleaner struct cpufreq_driver and struct cpufreq_policy.

Dominik

arch/arm/mach-integrator/cpu.c +8 -6
diff -ruN linux-original/arch/arm/mach-integrator/cpu.c linux/arch/arm/mach-integrator/cpu.c
@@ -77,8 +77,8 @@
 {
 	struct vco vco;
 
-	if (policy->max > policy->max_cpu_freq)
-		policy->max = policy->max_cpu_freq;
+	if (policy->max > policy->cpuinfo.max_freq)
+		policy->max = policy->cpuinfo.max_freq;
 
 	if (policy->max < 12000)
 		policy->max = 12000;
@@ -148,7 +148,9 @@
 static struct cpufreq_policy integrator_policy = {
 	.cpu		= 0,
 	.policy		= CPUFREQ_POLICY_POWERSAVE,
-	.max_cpu_freq	= 160000,
+	.cpuinfo.max_cpu_freq	= 160000,
+	.cpuinfo.min_cpu_freq   = 12000,
+	.cpuinfo.transition_latency  = CPUFREQ_ETERNAL,
 };
 
 static struct cpufreq_driver integrator_driver = {
@@ -197,7 +199,9 @@
 
 		policies[cpu].cpu = cpu;
 		policies[cpu].policy = CPUFREQ_POLICY_POWERSAVE,
-		policies[cpu].max_cpu_freq = 160000;
+		policies[cpu].cpuinfo.max_freq = 160000;
+		policies[cpu].cpuinfo.min_freq = 12000;
+		policies[cpu].cpuinfo.transition_latency = CPUFREQ_ETERNAL;
 		policies[cpu].min =
 		policies[cpu].max = vco_to_freq(vco, 1);
 	}
@@ -205,8 +209,6 @@
 	set_cpus_allowed(current, cpus_allowed);
 
 #ifdef CONFIG_CPU_FREQ
-	for (cpu=0; cpu<NR_CPUS; cpu++)
-		integrator_driver.cpu_min_freq[cpu] = 12000;
 	integrator_driver.policy = policies;
 	cpufreq_register(&integrator_driver);
 #else
arch/arm/mach-sa1100/cpu-sa1100.c +3 -2
diff -ruN linux-original/arch/arm/mach-sa1100/cpu-sa1100.c linux/arch/arm/mach-sa1100/cpu-sa1100.c
@@ -203,14 +203,15 @@
 static struct cpufreq_policy sa1100_policy = {
 	.cpu		= 0,
 	.policy		= CPUFREQ_POLICY_POWERSAVE,
-	.max_cpu_freq	= 287000,
+	.cpuinfo.max_freq	= 287000,
+	.cpuinfo.min_freq	= 59000,
+	.cpuinfo.transition_latency	= CPUFREQ_ETERNAL,
 };
 
 static struct cpufreq_driver sa1100_driver = {
 	.verify		= sa11x0_verify_speed,
 	.setpolicy	= sa1100_setspeed,
 	.policy		= &sa1100_policy,
-	.cpu_min_freq[0]= 59000,
 };
 
 static int __init sa1100_dram_init(void)
arch/arm/mach-sa1100/cpu-sa1110.c +3 -2
diff -ruN linux-original/arch/arm/mach-sa1100/cpu-sa1110.c linux/arch/arm/mach-sa1100/cpu-sa1110.c
@@ -298,14 +298,15 @@
 static struct cpufreq_policy sa1110_policy = {
 	.cpu		= 0,
 	.policy		= CPUFREQ_POLICY_POWERSAVE,
-	.max_cpu_freq	= 287000,
+	.cpuinfo.max_freq	= 287000,
+	.cpuinfo.min_freq	= 59000,
+	.cpuinfo.transition_latency	= CPUFREQ_ETERNAL,
 };
 
 static struct cpufreq_driver sa1110_driver = {
 	.verify		 = sa11x0_verify_speed,
 	.setpolicy	 = sa1110_setspeed,
 	.policy		 = &sa1110_policy,
-	.cpu_min_freq	 = { 59000, },
 };
 
 static int __init sa1110_clk_init(void)
arch/arm/mach-sa1100/generic.c +2 -2
diff -ruN linux-original/arch/arm/mach-sa1100/generic.c linux/arch/arm/mach-sa1100/generic.c
@@ -69,8 +69,8 @@
  */
 int sa11x0_verify_speed(struct cpufreq_policy *policy)
 {
-	if (policy->max > policy->max_cpu_freq)
-		policy->max = policy->max_cpu_freq;
+	if (policy->max > policy->cpuinfo.max_freq)
+		policy->max = policy->cpuinfo.max_freq;
 
 	policy->max = cclk_frequency_100khz[sa11x0_freq_to_ppcr(policy->max)] * 100;
 	policy->min = policy->max;
arch/i386/kernel/cpu/cpufreq/elanfreq.c +3 -2
diff -ruN linux-original/arch/i386/kernel/cpu/cpufreq/elanfreq.c linux/arch/i386/kernel/cpu/cpufreq/elanfreq.c
@@ -296,7 +296,6 @@
 		max_freq = elanfreq_get_cpu_frequency();
 
 #ifdef CONFIG_CPU_FREQ_24_API
-	driver->cpu_min_freq[0] = 1000;
 	driver->cpu_cur_freq[0] = elanfreq_get_cpu_frequency();
 #endif
 
@@ -307,7 +306,9 @@
 	driver->policy[0].min    = 1000;
 	driver->policy[0].max    = max_freq;
 	driver->policy[0].policy = CPUFREQ_POLICY_PERFORMANCE;
-	driver->policy[0].max_cpu_freq  = max_freq;
+	driver->policy[0].cpuinfo.max_freq = max_freq;
+	driver->policy[0].cpuinfo.min_freq = min_freq;
+	driver->policy[0].cpuinfo.transition_latency = CPUFREQ_ETERNAL;
 
 	elanfreq_driver = driver;
 
arch/i386/kernel/cpu/cpufreq/longhaul.c +3 -2
diff -ruN linux-original/arch/i386/kernel/cpu/cpufreq/longhaul.c linux/arch/i386/kernel/cpu/cpufreq/longhaul.c
@@ -779,7 +779,6 @@
 	driver->policy = (struct cpufreq_policy *) (driver + 1);
 
 #ifdef CONFIG_CPU_FREQ_24_API
-	driver->cpu_min_freq[0] = (unsigned int) lowest_speed;
 	driver->cpu_cur_freq[0] = currentspeed;
 #endif
 
@@ -790,7 +789,9 @@
 	driver->policy[0].min = (unsigned int) lowest_speed;
 	driver->policy[0].max = (unsigned int) highest_speed;
 	driver->policy[0].policy = CPUFREQ_POLICY_PERFORMANCE;
-	driver->policy[0].max_cpu_freq = (unsigned int) highest_speed;
+	driver->policy[0].cpuinfo.min_freq = (unsigned int) lowest_speed;
+	driver->policy[0].cpuinfo.max_freq = (unsigned int) highest_speed;
+	driver->policy[0].cpuinfo.transition_latency = CPUFREQ_ETERNAL;
 
 	longhaul_driver = driver;
 
arch/i386/kernel/cpu/cpufreq/longrun.c +6 -4
diff -ruN linux-original/arch/i386/kernel/cpu/cpufreq/longrun.c linux/arch/i386/kernel/cpu/cpufreq/longrun.c
@@ -121,8 +121,9 @@
 		return -EINVAL;
 
 	policy->cpu = 0;
-	cpufreq_verify_within_limits(policy, 0, 
-		longrun_driver->policy[0].max_cpu_freq);
+	cpufreq_verify_within_limits(policy, 
+		longrun_driver->policy[0].cpuinfo.min_freq, 
+		longrun_driver->policy[0].cpuinfo.max_freq);
 
 	return 0;
 }
@@ -247,12 +248,13 @@
 		kfree(driver);
 		return -EIO;
 	}
-	driver->policy[0].max_cpu_freq  = longrun_high_freq;
+	driver->policy[0].cpuinfo.min_freq = longrun_low_freq;
+	driver->policy[0].cpuinfo.max_freq = longrun_high_freq;
+	driver->policy[0].cpuinfo.transition_latency = CPUFREQ_ETERNAL;
 
 	longrun_get_policy(&driver->policy[0]);
 
 #ifdef CONFIG_CPU_FREQ_24_API
-	driver->cpu_min_freq[0] = longrun_low_freq;
 	driver->cpu_cur_freq[0] = longrun_high_freq; /* dummy value */
 #endif
 
arch/i386/kernel/cpu/cpufreq/p4-clockmod.c +4 -2
diff -ruN linux-original/arch/i386/kernel/cpu/cpufreq/p4-clockmod.c linux/arch/i386/kernel/cpu/cpufreq/p4-clockmod.c
@@ -257,7 +257,6 @@
 
 #ifdef CONFIG_CPU_FREQ_24_API
 	for (i=0;i<NR_CPUS;i++) {
-		driver->cpu_min_freq[i] = stock_freq / 8;
 		driver->cpu_cur_freq[i] = stock_freq;
 	}
 #endif
@@ -272,7 +271,10 @@
 			driver->policy[i].min    = stock_freq / 8;
 		driver->policy[i].max    = stock_freq;
 		driver->policy[i].policy = CPUFREQ_POLICY_PERFORMANCE;
-		driver->policy[i].max_cpu_freq  = stock_freq;
+		driver->policy[i].cpuinfo.min_freq  = driver->policy[i].min;
+		driver->policy[i].cpuinfo.max_freq  = stock_freq;
+		driver->policy[i].cpuinfo.transition_latency = CPUFREQ_ETERNAL;
+
 		driver->policy[i].cpu    = i;
 	}
 
arch/i386/kernel/cpu/cpufreq/powernow-k6.c +3 -2
diff -ruN linux-original/arch/i386/kernel/cpu/cpufreq/powernow-k6.c linux/arch/i386/kernel/cpu/cpufreq/powernow-k6.c
@@ -242,7 +242,6 @@
 	driver->policy = (struct cpufreq_policy *) (driver + 1);
 
 #ifdef CONFIG_CPU_FREQ_24_API
-	driver->cpu_min_freq[0]  = busfreq * 20;
 	driver->cpu_cur_freq[0]  = busfreq * max_multiplier;
 #endif
 
@@ -253,7 +252,9 @@
 	driver->policy[0].min    = busfreq * 20;
 	driver->policy[0].max    = busfreq * max_multiplier;
 	driver->policy[0].policy = CPUFREQ_POLICY_PERFORMANCE;
-	driver->policy[0].max_cpu_freq  = busfreq * max_multiplier;
+	driver->policy[0].cpuinfo.max_freq = busfreq * max_multiplier;
+	driver->policy[0].cpuinfo.min_freq = busfreq * 20;
+	driver->policy[0].cpuinfo.transition_latency = CPUFREQ_ETERNAL;
 
 	powernow_driver = driver;
 
arch/i386/kernel/cpu/cpufreq/speedstep.c +4 -2
diff -ruN linux-original/arch/i386/kernel/cpu/cpufreq/speedstep.c linux/arch/i386/kernel/cpu/cpufreq/speedstep.c
@@ -693,7 +693,6 @@
 	driver->policy = (struct cpufreq_policy *) (driver + 1);
 
 #ifdef CONFIG_CPU_FREQ_24_API
-	driver->cpu_min_freq[0] = speedstep_low_freq;
 	driver->cpu_cur_freq[0] = speed;
 #endif
 
@@ -703,7 +702,10 @@
 	driver->policy[0].cpu    = 0;
 	driver->policy[0].min    = speedstep_low_freq;
 	driver->policy[0].max    = speedstep_high_freq;
-	driver->policy[0].max_cpu_freq = speedstep_high_freq;
+	driver->policy[0].cpuinfo.min_freq = speedstep_low_freq;
+	driver->policy[0].cpuinfo.max_freq = speedstep_high_freq;
+	driver->policy[0].cpuinfo.transition_latency = CPUFREQ_ETERNAL;
+
 	driver->policy[0].policy = (speed == speedstep_low_freq) ? 
 	    CPUFREQ_POLICY_POWERSAVE : CPUFREQ_POLICY_PERFORMANCE;
 
drivers/acpi/processor.c +9 -2
diff -ruN linux-original/drivers/acpi/processor.c linux/drivers/acpi/processor.c
@@ -1849,10 +1849,15 @@
 #ifdef CONFIG_CPU_FREQ_24_API
 	for (i=0;i<NR_CPUS;i++) {
 		driver->cpu_cur_freq[0] = pr->performance.states[current_state].core_frequency * 1000;
-		driver->cpu_min_freq[0] = pr->performance.states[pr->performance.state_count - 1].core_frequency * 1000;
 	}
 #endif
 
+	/* detect highest transition latency */
+	for (i=0;i<pr->performance.state_count;i++) {
+		if (pr->performance.states[i].transition_latency > driver->policy[0].cpuinfo.transition_latency)
+			driver->policy[0].cpuinfo.transition_latency = pr->performance.states[i].transition_latency;
+	}
+
 	driver->verify      = &acpi_cpufreq_verify;
 	driver->setpolicy   = &acpi_cpufreq_setpolicy;
 
@@ -1860,7 +1865,9 @@
 		driver->policy[i].cpu    = pr->id;
 		driver->policy[i].min    = pr->performance.states[pr->performance.state_count - 1].core_frequency * 1000;
 		driver->policy[i].max    = pr->performance.states[pr->limit.state.px].core_frequency * 1000;
-		driver->policy[i].max_cpu_freq = pr->performance.states[0].core_frequency * 1000;
+		driver->policy[i].cpuinfo.max_freq = pr->performance.states[0].core_frequency * 1000;
+		driver->policy[i].cpuinfo.min_freq = pr->performance.states[pr->performance.state_count - 1].core_frequency * 1000;
+		driver->policy[i].cpuinfo.transition_latency = driver->policy[0].cpuinfo.transition_latency;
 		driver->policy[i].policy = ( pr->performance.states[current_state].core_frequency * 1000 == driver->policy[i].max) ? 
 			CPUFREQ_POLICY_PERFORMANCE : CPUFREQ_POLICY_POWERSAVE;
 	}
include/linux/cpufreq.h +15 -5
diff -ruN linux-original/include/linux/cpufreq.h linux/include/linux/cpufreq.h
@@ -37,15 +37,26 @@
 #define CPUFREQ_POLICY_POWERSAVE        (1)
 #define CPUFREQ_POLICY_PERFORMANCE      (2)
 
-/* values here are CPU kHz so that hardware which doesn't run with some
- * frequencies can complain without having to guess what per cent / per
- * mille means. */
+/* Frequency values here are CPU kHz so that hardware which doesn't run 
+ * with some frequencies can complain without having to guess what per 
+ * cent / per mille means. 
+ * Maximum transition latency is in nanoseconds - if it's unknown,
+ * CPUFREQ_ETERNAL shall be used.
+ */
+
+#define CPUFREQ_ETERNAL (-1)
+struct cpufreq_cpuinfo {
+	unsigned int            max_freq;
+	unsigned int            min_freq;
+	unsigned int            transition_latency;
+};
+
 struct cpufreq_policy {
 	unsigned int            cpu;    /* cpu nr or CPUFREQ_ALL_CPUS */
 	unsigned int            min;    /* in kHz */
 	unsigned int            max;    /* in kHz */
         unsigned int            policy; /* see above */
-	unsigned int            max_cpu_freq; /* for information */
+	struct cpufreq_cpuinfo  cpuinfo;     /* see above */
 };
 
 #define CPUFREQ_ADJUST          (0)
@@ -116,7 +127,6 @@
 #endif
 	/* 2.4. compatible API */
 #ifdef CONFIG_CPU_FREQ_24_API
-	unsigned int            cpu_min_freq[NR_CPUS];
 	unsigned int            cpu_cur_freq[NR_CPUS];
 #endif
 };
kernel/cpufreq.c +28 -17

99 lines not on this page · raw message