diff options
| -rw-r--r-- | arch/i386/kernel/cpu/proc.c | 6 | ||||
| -rw-r--r-- | arch/ia64/kernel/setup.c | 8 | ||||
| -rw-r--r-- | arch/x86_64/kernel/setup.c | 6 | ||||
| -rw-r--r-- | drivers/cpufreq/cpufreq.c | 24 | ||||
| -rw-r--r-- | include/linux/cpufreq.h | 10 |
5 files changed, 51 insertions, 3 deletions
diff --git a/arch/i386/kernel/cpu/proc.c b/arch/i386/kernel/cpu/proc.c index e7921315ae9d..6d91b274589c 100644 --- a/arch/i386/kernel/cpu/proc.c +++ b/arch/i386/kernel/cpu/proc.c | |||
| @@ -3,6 +3,7 @@ | |||
| 3 | #include <linux/string.h> | 3 | #include <linux/string.h> |
| 4 | #include <asm/semaphore.h> | 4 | #include <asm/semaphore.h> |
| 5 | #include <linux/seq_file.h> | 5 | #include <linux/seq_file.h> |
| 6 | #include <linux/cpufreq.h> | ||
| 6 | 7 | ||
| 7 | /* | 8 | /* |
| 8 | * Get CPU information for use by the procfs. | 9 | * Get CPU information for use by the procfs. |
| @@ -86,8 +87,11 @@ static int show_cpuinfo(struct seq_file *m, void *v) | |||
| 86 | seq_printf(m, "stepping\t: unknown\n"); | 87 | seq_printf(m, "stepping\t: unknown\n"); |
| 87 | 88 | ||
| 88 | if ( cpu_has(c, X86_FEATURE_TSC) ) { | 89 | if ( cpu_has(c, X86_FEATURE_TSC) ) { |
| 90 | unsigned int freq = cpufreq_quick_get(n); | ||
| 91 | if (!freq) | ||
| 92 | freq = cpu_khz; | ||
| 89 | seq_printf(m, "cpu MHz\t\t: %u.%03u\n", | 93 | seq_printf(m, "cpu MHz\t\t: %u.%03u\n", |
| 90 | cpu_khz / 1000, (cpu_khz % 1000)); | 94 | freq / 1000, (freq % 1000)); |
| 91 | } | 95 | } |
| 92 | 96 | ||
| 93 | /* Cache size */ | 97 | /* Cache size */ |
diff --git a/arch/ia64/kernel/setup.c b/arch/ia64/kernel/setup.c index 5add0bcf87a7..088e5dded8dc 100644 --- a/arch/ia64/kernel/setup.c +++ b/arch/ia64/kernel/setup.c | |||
| @@ -43,6 +43,7 @@ | |||
| 43 | #include <linux/initrd.h> | 43 | #include <linux/initrd.h> |
| 44 | #include <linux/platform.h> | 44 | #include <linux/platform.h> |
| 45 | #include <linux/pm.h> | 45 | #include <linux/pm.h> |
| 46 | #include <linux/cpufreq.h> | ||
| 46 | 47 | ||
| 47 | #include <asm/ia32.h> | 48 | #include <asm/ia32.h> |
| 48 | #include <asm/machvec.h> | 49 | #include <asm/machvec.h> |
| @@ -517,6 +518,7 @@ show_cpuinfo (struct seq_file *m, void *v) | |||
| 517 | char family[32], features[128], *cp, sep; | 518 | char family[32], features[128], *cp, sep; |
| 518 | struct cpuinfo_ia64 *c = v; | 519 | struct cpuinfo_ia64 *c = v; |
| 519 | unsigned long mask; | 520 | unsigned long mask; |
| 521 | unsigned int proc_freq; | ||
| 520 | int i; | 522 | int i; |
| 521 | 523 | ||
| 522 | mask = c->features; | 524 | mask = c->features; |
| @@ -549,6 +551,10 @@ show_cpuinfo (struct seq_file *m, void *v) | |||
| 549 | sprintf(cp, " 0x%lx", mask); | 551 | sprintf(cp, " 0x%lx", mask); |
| 550 | } | 552 | } |
| 551 | 553 | ||
| 554 | proc_freq = cpufreq_quick_get(cpunum); | ||
| 555 | if (!proc_freq) | ||
| 556 | proc_freq = c->proc_freq / 1000; | ||
| 557 | |||
| 552 | seq_printf(m, | 558 | seq_printf(m, |
| 553 | "processor : %d\n" | 559 | "processor : %d\n" |
| 554 | "vendor : %s\n" | 560 | "vendor : %s\n" |
| @@ -565,7 +571,7 @@ show_cpuinfo (struct seq_file *m, void *v) | |||
| 565 | "BogoMIPS : %lu.%02lu\n", | 571 | "BogoMIPS : %lu.%02lu\n", |
| 566 | cpunum, c->vendor, family, c->model, c->revision, c->archrev, | 572 | cpunum, c->vendor, family, c->model, c->revision, c->archrev, |
| 567 | features, c->ppn, c->number, | 573 | features, c->ppn, c->number, |
| 568 | c->proc_freq / 1000000, c->proc_freq % 1000000, | 574 | proc_freq / 1000, proc_freq % 1000, |
| 569 | c->itc_freq / 1000000, c->itc_freq % 1000000, | 575 | c->itc_freq / 1000000, c->itc_freq % 1000000, |
| 570 | lpj*HZ/500000, (lpj*HZ/5000) % 100); | 576 | lpj*HZ/500000, (lpj*HZ/5000) % 100); |
| 571 | #ifdef CONFIG_SMP | 577 | #ifdef CONFIG_SMP |
diff --git a/arch/x86_64/kernel/setup.c b/arch/x86_64/kernel/setup.c index 750e01dcbdf4..64c4534b930c 100644 --- a/arch/x86_64/kernel/setup.c +++ b/arch/x86_64/kernel/setup.c | |||
| @@ -42,6 +42,7 @@ | |||
| 42 | #include <linux/edd.h> | 42 | #include <linux/edd.h> |
| 43 | #include <linux/mmzone.h> | 43 | #include <linux/mmzone.h> |
| 44 | #include <linux/kexec.h> | 44 | #include <linux/kexec.h> |
| 45 | #include <linux/cpufreq.h> | ||
| 45 | 46 | ||
| 46 | #include <asm/mtrr.h> | 47 | #include <asm/mtrr.h> |
| 47 | #include <asm/uaccess.h> | 48 | #include <asm/uaccess.h> |
| @@ -1256,8 +1257,11 @@ static int show_cpuinfo(struct seq_file *m, void *v) | |||
| 1256 | seq_printf(m, "stepping\t: unknown\n"); | 1257 | seq_printf(m, "stepping\t: unknown\n"); |
| 1257 | 1258 | ||
| 1258 | if (cpu_has(c,X86_FEATURE_TSC)) { | 1259 | if (cpu_has(c,X86_FEATURE_TSC)) { |
| 1260 | unsigned int freq = cpufreq_quick_get((unsigned)(c-cpu_data)); | ||
| 1261 | if (!freq) | ||
| 1262 | freq = cpu_khz; | ||
| 1259 | seq_printf(m, "cpu MHz\t\t: %u.%03u\n", | 1263 | seq_printf(m, "cpu MHz\t\t: %u.%03u\n", |
| 1260 | cpu_khz / 1000, (cpu_khz % 1000)); | 1264 | freq / 1000, (freq % 1000)); |
| 1261 | } | 1265 | } |
| 1262 | 1266 | ||
| 1263 | /* Cache size */ | 1267 | /* Cache size */ |
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c index 815902c2c856..a9163d02983a 100644 --- a/drivers/cpufreq/cpufreq.c +++ b/drivers/cpufreq/cpufreq.c | |||
| @@ -823,6 +823,30 @@ static void cpufreq_out_of_sync(unsigned int cpu, unsigned int old_freq, unsigne | |||
| 823 | 823 | ||
| 824 | 824 | ||
| 825 | /** | 825 | /** |
| 826 | * cpufreq_quick_get - get the CPU frequency (in kHz) frpm policy->cur | ||
| 827 | * @cpu: CPU number | ||
| 828 | * | ||
| 829 | * This is the last known freq, without actually getting it from the driver. | ||
| 830 | * Return value will be same as what is shown in scaling_cur_freq in sysfs. | ||
| 831 | */ | ||
| 832 | unsigned int cpufreq_quick_get(unsigned int cpu) | ||
| 833 | { | ||
| 834 | struct cpufreq_policy *policy = cpufreq_cpu_get(cpu); | ||
| 835 | unsigned int ret = 0; | ||
| 836 | |||
| 837 | if (policy) { | ||
| 838 | down(&policy->lock); | ||
| 839 | ret = policy->cur; | ||
| 840 | up(&policy->lock); | ||
| 841 | cpufreq_cpu_put(policy); | ||
| 842 | } | ||
| 843 | |||
| 844 | return (ret); | ||
| 845 | } | ||
| 846 | EXPORT_SYMBOL(cpufreq_quick_get); | ||
| 847 | |||
| 848 | |||
| 849 | /** | ||
| 826 | * cpufreq_get - get the current CPU frequency (in kHz) | 850 | * cpufreq_get - get the current CPU frequency (in kHz) |
| 827 | * @cpu: CPU number | 851 | * @cpu: CPU number |
| 828 | * | 852 | * |
diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h index d068176b7ad7..c31650df9241 100644 --- a/include/linux/cpufreq.h +++ b/include/linux/cpufreq.h | |||
| @@ -256,6 +256,16 @@ int cpufreq_update_policy(unsigned int cpu); | |||
| 256 | /* query the current CPU frequency (in kHz). If zero, cpufreq couldn't detect it */ | 256 | /* query the current CPU frequency (in kHz). If zero, cpufreq couldn't detect it */ |
| 257 | unsigned int cpufreq_get(unsigned int cpu); | 257 | unsigned int cpufreq_get(unsigned int cpu); |
| 258 | 258 | ||
| 259 | /* query the last known CPU freq (in kHz). If zero, cpufreq couldn't detect it */ | ||
| 260 | #ifdef CONFIG_CPU_FREQ | ||
| 261 | unsigned int cpufreq_quick_get(unsigned int cpu); | ||
| 262 | #else | ||
| 263 | static inline unsigned int cpufreq_quick_get(unsigned int cpu) | ||
| 264 | { | ||
| 265 | return 0; | ||
| 266 | } | ||
| 267 | #endif | ||
| 268 | |||
| 259 | 269 | ||
| 260 | /********************************************************************* | 270 | /********************************************************************* |
| 261 | * CPUFREQ DEFAULT GOVERNOR * | 271 | * CPUFREQ DEFAULT GOVERNOR * |
