|
@@ -68,6 +68,7 @@ struct acpi_cpufreq_data {
|
|
|
unsigned int max_freq;
|
|
|
unsigned int resume;
|
|
|
unsigned int cpu_feature;
|
|
|
+ u64 saved_aperf, saved_mperf;
|
|
|
};
|
|
|
|
|
|
static DEFINE_PER_CPU(struct acpi_cpufreq_data *, drv_data);
|
|
@@ -259,9 +260,6 @@ static long read_measured_perf_ctrs(void *_cur)
|
|
|
rdmsr(MSR_IA32_APERF, cur->aperf.split.lo, cur->aperf.split.hi);
|
|
|
rdmsr(MSR_IA32_MPERF, cur->mperf.split.lo, cur->mperf.split.hi);
|
|
|
|
|
|
- wrmsr(MSR_IA32_APERF, 0, 0);
|
|
|
- wrmsr(MSR_IA32_MPERF, 0, 0);
|
|
|
-
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -281,13 +279,20 @@ static long read_measured_perf_ctrs(void *_cur)
|
|
|
static unsigned int get_measured_perf(struct cpufreq_policy *policy,
|
|
|
unsigned int cpu)
|
|
|
{
|
|
|
- struct perf_pair cur;
|
|
|
+ struct perf_pair readin, cur;
|
|
|
unsigned int perf_percent;
|
|
|
unsigned int retval;
|
|
|
|
|
|
- if (!work_on_cpu(cpu, read_measured_perf_ctrs, &cur))
|
|
|
+ if (!work_on_cpu(cpu, read_measured_perf_ctrs, &readin))
|
|
|
return 0;
|
|
|
|
|
|
+ cur.aperf.whole = readin.aperf.whole -
|
|
|
+ per_cpu(drv_data, cpu)->saved_aperf;
|
|
|
+ cur.mperf.whole = readin.mperf.whole -
|
|
|
+ per_cpu(drv_data, cpu)->saved_mperf;
|
|
|
+ per_cpu(drv_data, cpu)->saved_aperf = readin.aperf.whole;
|
|
|
+ per_cpu(drv_data, cpu)->saved_mperf = readin.mperf.whole;
|
|
|
+
|
|
|
#ifdef __i386__
|
|
|
/*
|
|
|
* We dont want to do 64 bit divide with 32 bit kernel
|