And a proper patch.
I can't attach it, so I'm copy/pasting.
Code: Select all
commit 725d95ba950a93edfcc85a3e2ca9eb25e1e164ee
Author: Isaac Dunham <idunham@lavabit.com>
Date: Wed Jul 31 22:10:41 2013 -0700
Proper fix for 3.11
diff --git a/phc-k8.c b/phc-k8.c
index e42ae7a..d186103 100644
--- a/phc-k8.c
+++ b/phc-k8.c
@@ -886,16 +886,32 @@ static void print_basics(struct powernow_k8_data *data)
printk(KERN_INFO PFX
" %d : pstate %d (%d MHz), vid 0x%x\n",
j,
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0)
+ data->powernow_table[j].driver_data & HW_PSTATE_MASK,
+#else
data->powernow_table[j].index & HW_PSTATE_MASK,
+#endif
data->powernow_table[j].frequency/1000,
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0)
+ cpufreqtable_index_to_vid(data->powernow_table[j].driver_data));
+#else
cpufreqtable_index_to_vid(data->powernow_table[j].index));
+#endif
} else {
printk(KERN_INFO PFX
" %d : fid 0x%x (%d MHz), vid 0x%x\n",
j,
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0)
+ data->powernow_table[j].driver_data & 0xff,
+#else
data->powernow_table[j].index & 0xff,
+#endif
data->powernow_table[j].frequency/1000,
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0)
+ data->powernow_table[j].driver_data >> 8);
+#else
data->powernow_table[j].index >> 8);
+#endif
}
}
}
@@ -942,13 +958,25 @@ static int fill_powernow_table(struct powernow_k8_data *data,
for (j = 0; j < data->numps; j++) {
int freq;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0)
+ powernow_table[j].driver_data = pst[j].fid; /* lower 8 bits */
+#else
powernow_table[j].index = pst[j].fid; /* lower 8 bits */
+#endif
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0)
+ powernow_table[j].driver_data |= (pst[j].vid << 8); /* upper 8 bits */
+#else
powernow_table[j].index |= (pst[j].vid << 8); /* upper 8 bits */
+#endif
freq = find_khz_freq_from_fid(pst[j].fid);
powernow_table[j].frequency = freq;
}
powernow_table[data->numps].frequency = CPUFREQ_TABLE_END;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0)
+ powernow_table[data->numps].driver_data = 0;
+#else
powernow_table[data->numps].index = 0;
+#endif
if (query_current_values_with_pending_wait(data)) {
kfree(powernow_table);
@@ -1166,7 +1194,11 @@ static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data)
goto err_out_mem;
powernow_table[numps].frequency = CPUFREQ_TABLE_END;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0)
+ powernow_table[numps].driver_data = 0;
+#else
powernow_table[numps].index = 0;
+#endif
data->powernow_table = powernow_table;
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,29)
@@ -1260,7 +1292,11 @@ static int fill_powernow_table_pstate(struct powernow_k8_data *data,
powernow_table[i].frequency =
data->acpi_data.states[i].core_frequency * 1000;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0)
+ powernow_table[i].driver_data = index | (lo << 16);
+#else
powernow_table[i].index = index | (lo << 16);
+#endif
}
return 0;
}
@@ -1289,7 +1325,11 @@ static int fill_powernow_table_fidvid(struct powernow_k8_data *data,
pr_debug(" %d : fid 0x%x, vid 0x%x\n", i, fid, vid);
index = fid | (vid<<8);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0)
+ powernow_table[i].driver_data = index;
+#else
powernow_table[i].index = index;
+#endif
freq = find_khz_freq_from_fid(fid);
powernow_table[i].frequency = freq;
@@ -1355,7 +1395,11 @@ static int fill_powernow_table_fidvid_dt(struct powernow_k8_data *data,
pr_debug(" %d : fid 0x%x, vid 0x%x\n", i, fid, vid);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0)
+ powernow_table[i].driver_data = (fid & 0xFF)
+#else
powernow_table[i].index = (fid & 0xFF)
+#endif
|((vid & 0xFF) << 8);
/* For now, mark all entries not in the acpi_data.states as invalid */
@@ -1449,8 +1493,16 @@ static int transition_frequency_fidvid(struct powernow_k8_data *data,
* the cpufreq frequency table in find_psb_table, vid
* are the upper 8 bits.
*/
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0)
+ fid = data->powernow_table[index].driver_data & 0xFF;
+#else
fid = data->powernow_table[index].index & 0xFF;
+#endif
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0)
+ vid = (data->powernow_table[index].driver_data & 0xFF00) >> 8;
+#else
vid = (data->powernow_table[index].index & 0xFF00) >> 8;
+#endif
pr_debug("table matched fid 0x%x, giving vid 0x%x\n", fid, vid);
@@ -1836,8 +1888,13 @@ static int powernowk8_apply_settings(struct cpufreq_policy *pol) {
u32 hi, lo;
rdmsr(hwpstate_base + i, lo, hi);
lo &= ~(HW_PSTATE_VID_MASK);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0)
+ lo |= ((data->powernow_table[i].driver_data >> 16) \
+ & HW_PSTATE_VID_MASK);
+#else
lo |= ((data->powernow_table[i].index >> 16) \
& HW_PSTATE_VID_MASK);
+#endif
//printk(KERN_INFO PFX "writing %.8x:%.8x\n", hi, lo);
wrmsr(hwpstate_base + i, lo, hi);
}
@@ -1907,8 +1964,16 @@ show_controls(struct cpufreq_frequency_table *table, int entries, char *buf)
for (j = first_valid_entry(table, 0); j < entries;
j = first_valid_entry(table, j + 1)) {
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0)
+ unsigned int fid = table[j].driver_data & 0xff;
+#else
unsigned int fid = table[j].index & 0xff;
+#endif
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0)
+ unsigned int vid = (table[j].driver_data >> 8) & 0xff;
+#else
unsigned int vid = (table[j].index >> 8) & 0xff;
+#endif
count += snprintf(&buf[count], PAGE_SIZE - count, "%u:%u ", fid, vid);
}
if (count > 0) {
@@ -1970,7 +2035,11 @@ store_phc_controls(struct cpufreq_policy *pol, const char *buf, size_t count)
/* lookup matching fid in the existing powernow table and
mark prepending entries as invalid */
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0)
+ while (fid < (data->powernow_table[entry].driver_data & 0xFF)
+#else
while (fid < (data->powernow_table[entry].index & 0xFF)
+#endif
&& entry < data->numps) {
data->powernow_table[entry].frequency = CPUFREQ_ENTRY_INVALID;
entry++;
@@ -1981,12 +2050,20 @@ store_phc_controls(struct cpufreq_policy *pol, const char *buf, size_t count)
break;
/* If the supplied frequency cannot be found in the frequencies
table, the printk an error, but still continue */
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0)
+ else if (fid != (data->powernow_table[entry].driver_data & 0xFF)) {
+#else
else if (fid != (data->powernow_table[entry].index & 0xFF)) {
+#endif
printk(KERN_ERR PFX "invalid fid value %lu\n", fid);
continue;
}
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0)
+ data->powernow_table[entry].driver_data = (fid & 0xFF)|((vid & 0xFF) << 8);
+#else
data->powernow_table[entry].index = (fid & 0xFF)|((vid & 0xFF) << 8);
+#endif
data->powernow_table[entry].frequency = (vid <= LEAST_VID)
? find_khz_freq_from_fid(fid)
: CPUFREQ_ENTRY_INVALID;
@@ -2028,7 +2105,11 @@ show_fids(struct cpufreq_frequency_table *table, int entries, char *buf)
for (j = first_valid_entry(table, 0); j < entries;
j = first_valid_entry(table, j + 1)) {
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0)
+ unsigned int fid = table[j].driver_data & 0xff;
+#else
unsigned int fid = table[j].index & 0xff;
+#endif
count += snprintf(&buf[count], PAGE_SIZE - count, "%u ", fid);
}
if (count > 0) {
@@ -2045,7 +2126,11 @@ static ssize_t show_phc_available_fids(struct cpufreq_policy *pol, char *buf)
int j;
for (j = 0; j < data->numps; j++) {
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0)
+ unsigned int fid = data->powernow_table[j].driver_data & 0xff;
+#else
unsigned int fid = data->powernow_table[j].index & 0xff;
+#endif
count += snprintf(&buf[count], PAGE_SIZE - count, "%u ", fid);
}
if (count > 0) {
@@ -2091,7 +2176,11 @@ store_phc_fids(struct cpufreq_policy *pol, const char *buf, size_t count)
/* lookup matching fid in the existing powernow table and
mark prepending entries as invalid */
while (entry < data->numps
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0)
+ && fid < (data->powernow_table[entry].driver_data & 0xFF)) {
+#else
&& fid < (data->powernow_table[entry].index & 0xFF)) {
+#endif
data->powernow_table[entry].frequency = CPUFREQ_ENTRY_INVALID;
entry++;
}
@@ -2101,13 +2190,25 @@ store_phc_fids(struct cpufreq_policy *pol, const char *buf, size_t count)
break;
/* If the supplied frequency cannot be found in the frequencies
table, the printk an error, but still continue */
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0)
+ else if (fid != (data->powernow_table[entry].driver_data & 0xFF)) {
+#else
else if (fid != (data->powernow_table[entry].index & 0xFF)) {
+#endif
printk(KERN_ERR PFX "invalid fid value %lu\n", fid);
continue;
}
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0)
+ vid = (data->powernow_table[entry].driver_data >> 8) & 0xFF;
+#else
vid = (data->powernow_table[entry].index >> 8) & 0xFF;
+#endif
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0)
+ data->powernow_table[entry].driver_data = (fid & 0xFF)|((vid & 0xFF) << 8);
+#else
data->powernow_table[entry].index = (fid & 0xFF)|((vid & 0xFF) << 8);
+#endif
data->powernow_table[entry].frequency = (vid <= LEAST_VID)
? find_khz_freq_from_fid(fid)
: CPUFREQ_ENTRY_INVALID;
@@ -2150,11 +2251,19 @@ static ssize_t show_vids(struct cpufreq_frequency_table *table, int entries,
unsigned int vid;
if (cpu_family != CPU_HW_PSTATE) {
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0)
+ vid = (table[j].driver_data >> 8) & 0xff;
+#else
vid = (table[j].index >> 8) & 0xff;
+#endif
if (table[j].frequency != CPUFREQ_ENTRY_INVALID && vid <= LEAST_VID)
count += snprintf(&buf[count], PAGE_SIZE - count, "%u ", vid);
} else {
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0)
+ vid = cpufreqtable_index_to_vid(table[j].driver_data);
+#else
vid = cpufreqtable_index_to_vid(table[j].index);
+#endif
if (table[j].frequency != CPUFREQ_ENTRY_INVALID
&& (vid == (vid & 0x7f)))
count += snprintf(&buf[count], PAGE_SIZE - count, "%u ", vid);
@@ -2234,8 +2343,16 @@ store_phc_vids(struct cpufreq_policy *pol, const char *buf, size_t count)
if (cpu_family != CPU_HW_PSTATE) {
/* Least vid is actually the highest value allowed */
if (vid <= LEAST_VID || vid == VID_OFF) {
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0)
+ u32 fid = data->powernow_table[i].driver_data & 0xFF;
+#else
u32 fid = data->powernow_table[i].index & 0xFF;
+#endif
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0)
+ data->powernow_table[i].driver_data = fid | ((vid & 0xFF) << 8);
+#else
data->powernow_table[i].index = fid | ((vid & 0xFF) << 8);
+#endif
data->powernow_table[i].frequency = (vid <= LEAST_VID)
? find_khz_freq_from_fid(fid)
: CPUFREQ_ENTRY_INVALID;
@@ -2246,9 +2363,18 @@ store_phc_vids(struct cpufreq_policy *pol, const char *buf, size_t count)
}
} else {
if (vid == (vid & 0x7f)) {
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0)
+ u32 mask = (data->powernow_table[i].driver_data & ~(HW_PSTATE_VID_MASK << 16));
+#else
u32 mask = (data->powernow_table[i].index & ~(HW_PSTATE_VID_MASK << 16));
+#endif
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0)
+ data->powernow_table[i].driver_data = mask | \
+ ((vid << HW_PSTATE_VID_SHIFT) & HW_PSTATE_VID_MASK) << 16;
+#else
data->powernow_table[i].index = mask | \
((vid << HW_PSTATE_VID_SHIFT) & HW_PSTATE_VID_MASK) << 16;
+#endif
} else {
printk(KERN_ERR PFX
"vid value %i is out of bounds: %lu\n", i, vid);