cpufreq: clean up CPU information
Subsystems (4)
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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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