linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 2.5.53] cpufreq: longhaul cleanup
@ 2002-12-28 23:12 Dominik Brodowski
  2002-12-30 11:31 ` Dave Jones
  0 siblings, 1 reply; 2+ messages in thread
From: Dominik Brodowski @ 2002-12-28 23:12 UTC (permalink / raw)
  To: torvalds, davej; +Cc: linux-kernel, cpufreq

Clean up searching code for best frequency and add some safety checks.

diff -ru linux-original/arch/i386/kernel/cpu/cpufreq/longhaul.c linux/arch/i386/kernel/cpu/cpufreq/longhaul.c
--- linux-original/arch/i386/kernel/cpu/cpufreq/longhaul.c	2002-12-25 17:45:52.000000000 +0100
+++ linux/arch/i386/kernel/cpu/cpufreq/longhaul.c	2002-12-27 10:49:52.000000000 +0100
@@ -313,6 +313,10 @@
 	if ((!can_scale_fsb) && (newfsb != current_fsb))
 		return;
 
+	if (((clock_ratio[clock_ratio_index] * newfsb * 100) > highest_speed) ||
+	    ((clock_ratio[clock_ratio_index] * newfsb * 100) < lowest_speed))
+		return;
+
 	freqs.old = longhaul_get_cpu_mult() * longhaul_get_cpu_fsb() * 100;
 	freqs.new = clock_ratio[clock_ratio_index] * newfsb * 100;
 	freqs.cpu = 0; /* longhaul.c is UP only driver */
@@ -582,18 +586,68 @@
 
 	policy->max = newmax;
 
+	cpufreq_verify_within_limits(policy, lowest_speed, highest_speed);
+
+	return 0;
+}
+
+
+static int longhaul_get_best_freq_for_fsb(struct cpufreq_policy *policy, 
+					  unsigned int min_mult, 
+					  unsigned int max_mult, 
+					  unsigned int fsb, 
+					  unsigned int *new_mult)
+{
+	unsigned int optimal = 0;
+	unsigned int found_optimal = 0;
+	unsigned int i;
+
+	switch(policy->policy) {
+	case CPUFREQ_POLICY_POWERSAVE:
+		optimal = max_mult;
+		break;
+	case CPUFREQ_POLICY_PERFORMANCE:
+		optimal = min_mult;
+	}
+
+	for(i=0; i<numscales; i++) {
+		unsigned int freq = fsb * clock_ratio[i] * 100;
+		if ((freq > policy->max) ||
+		    (freq < policy->min))
+			continue;
+		switch(policy->policy) {
+		case CPUFREQ_POLICY_POWERSAVE:
+			if (clock_ratio[i] < clock_ratio[optimal]) {
+				found_optimal = 1;
+				optimal = i;
+			}
+			break;
+		case CPUFREQ_POLICY_PERFORMANCE:
+			if (clock_ratio[i] > clock_ratio[optimal]) {
+				found_optimal = 1;
+				optimal = i;
+			}
+			break;
+		}
+	}
+		
+	if (found_optimal) {
+		*new_mult = optimal;
+		return 1;
+	}
 	return 0;
 }
 
 
 static int longhaul_setpolicy (struct cpufreq_policy *policy)
 {
-	unsigned int    number_states = 0;
 	unsigned int    i;
 	unsigned int    fsb_index = 0;
 	unsigned int    new_fsb = 0;
 	unsigned int    new_clock_ratio = 0;
-	unsigned int    best_freq = -1;
+	unsigned int    min_mult = 0;
+	unsigned int    max_mult = 0;
+
 
 	if (!longhaul_driver)
 		return -EINVAL;
@@ -603,103 +657,36 @@
 	else
 		fsb_search_table = power_fsb_table;
 
+	for(i=0;i<numscales;i++) {
+		if (clock_ratio[max_mult] < clock_ratio[i])
+				max_mult = i;
+		else if (clock_ratio[min_mult] > clock_ratio[i])
+				min_mult = i;
+	}
+
 	if (can_scale_fsb==1) {
-		for (fsb_index=0; fsb_search_table[fsb_index]!=-1; fsb_index++) 
+		unsigned int found = 0;
+		for (fsb_index=0; fsb_search_table[fsb_index]!=-1; fsb_index++)
 		{
-			unsigned int tmpcount = longhaul_statecount_fsb(policy, fsb_search_table[fsb_index]);
-			if (tmpcount == 1)
+			if (longhaul_get_best_freq_for_fsb(policy, 
+			              min_mult, max_mult, 
+				      fsb_search_table[fsb_index], 
+				      &new_clock_ratio)) {
 				new_fsb = fsb_search_table[fsb_index];
-			number_states += tmpcount;
+				break;
+			}
 		}
+		if (!found)
+			return -EINVAL;
 	} else {
-		number_states = longhaul_statecount_fsb(policy, current_fsb);
 		new_fsb = current_fsb;
-	}
-
-	if (!number_states)
-		return -EINVAL;
-	else if (number_states == 1) {
-		for(i=0; i<numscales; i++) {
-			if ((clock_ratio[i] != -1) &&
-			    ((clock_ratio[i] * new_fsb * 100) <= policy->max) &&
-			    ((clock_ratio[i] * new_fsb * 100) >= policy->min))
-				new_clock_ratio = i;
-		}
-		longhaul_setstate(new_clock_ratio, new_fsb);
-	}
-
-	switch (policy->policy) {
-	case CPUFREQ_POLICY_POWERSAVE:
-		best_freq = -1;
-		if (can_scale_fsb==1) {
-			for (fsb_index=0; fsb_search_table[fsb_index]!=-1; fsb_index++) 
-			{
-				for(i=0; i<numscales; i++) {
-					unsigned int tmpfreq = fsb_search_table[fsb_index] * clock_ratio[i] * 100;
-					if (clock_ratio[i] == -1)
-						continue;
-
-					if ((tmpfreq >= policy->min) &&
-					    (tmpfreq <= policy->max) &&
-					    (tmpfreq < best_freq)) {
-						new_clock_ratio = i;
-						new_fsb = fsb_search_table[fsb_index];
-					}
-				}
-			}
-		} else {
-			for(i=0; i<numscales; i++) {
-				unsigned int tmpfreq = current_fsb * clock_ratio[i] * 100;
-					if (clock_ratio[i] == -1)
-						continue;
-
-					if ((tmpfreq >= policy->min) &&
-					    (tmpfreq <= policy->max) &&
-					    (tmpfreq < best_freq)) {
-						new_clock_ratio = i;
-						new_fsb = current_fsb;
-					}
-				}
-		}
-		break;
-	case CPUFREQ_POLICY_PERFORMANCE:
-		best_freq = 0;
-		if (can_scale_fsb==1) {
-			for (fsb_index=0; fsb_search_table[fsb_index]!=-1; fsb_index++) 
-			{
-				for(i=0; i<numscales; i++) {
-					unsigned int tmpfreq = fsb_search_table[fsb_index] * clock_ratio[i] * 100;
-					if (clock_ratio[i] == -1)
-						continue;
-
-					if ((tmpfreq >= policy->min) &&
-					    (tmpfreq <= policy->max) &&
-					    (tmpfreq > best_freq)) {
-						new_clock_ratio = i;
-						new_fsb = fsb_search_table[fsb_index];
-					}
-				}
-			}
-		} else {
-			for(i=0; i<numscales; i++) {
-				unsigned int tmpfreq = current_fsb * clock_ratio[i] * 100;
-					if (clock_ratio[i] == -1)
-						continue;
-
-					if ((tmpfreq >= policy->min) &&
-					    (tmpfreq <= policy->max) &&
-					    (tmpfreq > best_freq)) {
-						new_clock_ratio = i;
-						new_fsb = current_fsb;
-					}
-				}
-		}
-		break;
-	default:
-		return -EINVAL;
+		if (!longhaul_get_best_freq_for_fsb(policy, min_mult, 
+			     max_mult, new_fsb, &new_clock_ratio))
+			return -EINVAL;
 	}
 
 	longhaul_setstate(new_clock_ratio, new_fsb);
+
 	return 0;
 }
 

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PATCH 2.5.53] cpufreq: longhaul cleanup
  2002-12-28 23:12 [PATCH 2.5.53] cpufreq: longhaul cleanup Dominik Brodowski
@ 2002-12-30 11:31 ` Dave Jones
  0 siblings, 0 replies; 2+ messages in thread
From: Dave Jones @ 2002-12-30 11:31 UTC (permalink / raw)
  To: Dominik Brodowski; +Cc: torvalds, linux-kernel, cpufreq

On Sun, Dec 29, 2002 at 12:12:33AM +0100, Dominik Brodowski wrote:
 > Clean up searching code for best frequency and add some safety checks.

Looks ok from a cursory glance, but one thing I'm wondering is
if some of this code can be factored out a little. There seems to
be some duplication between the various CPU drivers.

		Dave

-- 
| Dave Jones.        http://www.codemonkey.org.uk
| SuSE Labs

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2002-12-30 11:24 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2002-12-28 23:12 [PATCH 2.5.53] cpufreq: longhaul cleanup Dominik Brodowski
2002-12-30 11:31 ` Dave Jones

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).