summaryrefslogtreecommitdiffstats
path: root/cpufreq-intel-pstate-validate-msrs.patch
blob: 0a790a0b67641e735cb4d7a260ea2d997c5d3918 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
commit 866111646f2c5d4c6c25e2bb97f5c61c3992defb
Author: Dirk Brandewie <dirk.brandewie@gmail.com>
Date:   Mon Mar 18 16:55:02 2013 -0700

    cpufreq/intel_pstate: Add function to check that all MSR's are valid
    
    Some VMs seem to try to implement some MSRs but not all the registers
    the driver needs.  Check to make sure all the MSR that we need are
    available. If any of the required MSRs are not available refuse to
    load.
    
    Signed-off-by: Dirk Brandewie <dirk.brandewie@gmail.com>

--- linux-3.9.0-0.rc3.git0.2.fc19.x86_64/drivers/cpufreq/intel_pstate.c~	2013-03-19 14:54:33.489581718 -0400
+++ linux-3.9.0-0.rc3.git0.2.fc19.x86_64/drivers/cpufreq/intel_pstate.c	2013-03-19 14:55:09.667523730 -0400
@@ -752,6 +752,30 @@ static struct cpufreq_driver intel_pstat
 
 static int __initdata no_load;
 
+static int intel_pstate_msrs_not_valid(void)
+{
+	/* Check that all the msr's we are using are valid. */
+	u64 aperf, mperf, tmp;
+
+	rdmsrl(MSR_IA32_APERF, aperf);
+	rdmsrl(MSR_IA32_MPERF, mperf);
+
+	if (!intel_pstate_min_pstate() ||
+		!intel_pstate_max_pstate() ||
+		!intel_pstate_turbo_pstate())
+		return -ENODEV;
+
+	rdmsrl(MSR_IA32_APERF, tmp);
+	if (!(tmp - aperf))
+		return -ENODEV;
+
+	rdmsrl(MSR_IA32_MPERF, tmp);
+	if (!(tmp - mperf))
+		return -ENODEV;
+
+	return 0;
+}
+
 static int __init intel_pstate_init(void)
 {
 	int cpu, rc = 0;
@@ -764,6 +788,9 @@ static int __init intel_pstate_init(void
 	if (!id)
 		return -ENODEV;
 
+	if (intel_pstate_msrs_not_valid())
+		return -ENODEV;
+
 	pr_info("Intel P-state driver initializing.\n");
 
 	all_cpu_data = vmalloc(sizeof(void *) * num_possible_cpus());