mirror of
https://github.com/torvalds/linux
synced 2024-09-21 19:47:35 +00:00
[PATCH] Support 100 MHz frequency transitions
Future versions of the Opteron processor may support frequency transitions of 100 MHz, instead of the=20 current 200 MHz. This patch enables the powernow-k8 driver to transition to an odd FID code, indicating a multiple of 100 MHz frequency. Signed-off-by: Jacob Shin <jacob.shin@amd.com> Signed-off-by: Mark Langsdorf <mark.langsdorf@amd.com> Signed-off-by: Dave Jones <davej@redhat.com>
This commit is contained in:
parent
8aae8284fe
commit
019a61b993
|
@ -45,7 +45,7 @@
|
||||||
|
|
||||||
#define PFX "powernow-k8: "
|
#define PFX "powernow-k8: "
|
||||||
#define BFX PFX "BIOS error: "
|
#define BFX PFX "BIOS error: "
|
||||||
#define VERSION "version 1.50.5"
|
#define VERSION "version 1.60.0"
|
||||||
#include "powernow-k8.h"
|
#include "powernow-k8.h"
|
||||||
|
|
||||||
/* serialize freq changes */
|
/* serialize freq changes */
|
||||||
|
@ -336,7 +336,7 @@ static int core_voltage_pre_transition(struct powernow_k8_data *data, u32 reqvid
|
||||||
/* Phase 2 - core frequency transition */
|
/* Phase 2 - core frequency transition */
|
||||||
static int core_frequency_transition(struct powernow_k8_data *data, u32 reqfid)
|
static int core_frequency_transition(struct powernow_k8_data *data, u32 reqfid)
|
||||||
{
|
{
|
||||||
u32 vcoreqfid, vcocurrfid, vcofiddiff, savevid = data->currvid;
|
u32 vcoreqfid, vcocurrfid, vcofiddiff, fid_interval, savevid = data->currvid;
|
||||||
|
|
||||||
if ((reqfid < HI_FID_TABLE_BOTTOM) && (data->currfid < HI_FID_TABLE_BOTTOM)) {
|
if ((reqfid < HI_FID_TABLE_BOTTOM) && (data->currfid < HI_FID_TABLE_BOTTOM)) {
|
||||||
printk(KERN_ERR PFX "ph2: illegal lo-lo transition 0x%x 0x%x\n",
|
printk(KERN_ERR PFX "ph2: illegal lo-lo transition 0x%x 0x%x\n",
|
||||||
|
@ -359,9 +359,11 @@ static int core_frequency_transition(struct powernow_k8_data *data, u32 reqfid)
|
||||||
: vcoreqfid - vcocurrfid;
|
: vcoreqfid - vcocurrfid;
|
||||||
|
|
||||||
while (vcofiddiff > 2) {
|
while (vcofiddiff > 2) {
|
||||||
|
(data->currfid & 1) ? (fid_interval = 1) : (fid_interval = 2);
|
||||||
|
|
||||||
if (reqfid > data->currfid) {
|
if (reqfid > data->currfid) {
|
||||||
if (data->currfid > LO_FID_TABLE_TOP) {
|
if (data->currfid > LO_FID_TABLE_TOP) {
|
||||||
if (write_new_fid(data, data->currfid + 2)) {
|
if (write_new_fid(data, data->currfid + fid_interval)) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -371,7 +373,7 @@ static int core_frequency_transition(struct powernow_k8_data *data, u32 reqfid)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (write_new_fid(data, data->currfid - 2))
|
if (write_new_fid(data, data->currfid - fid_interval))
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -474,7 +476,7 @@ static int check_supported_cpu(unsigned int cpu)
|
||||||
eax = cpuid_eax(CPUID_PROCESSOR_SIGNATURE);
|
eax = cpuid_eax(CPUID_PROCESSOR_SIGNATURE);
|
||||||
if (((eax & CPUID_USE_XFAM_XMOD) != CPUID_USE_XFAM_XMOD) ||
|
if (((eax & CPUID_USE_XFAM_XMOD) != CPUID_USE_XFAM_XMOD) ||
|
||||||
((eax & CPUID_XFAM) != CPUID_XFAM_K8) ||
|
((eax & CPUID_XFAM) != CPUID_XFAM_K8) ||
|
||||||
((eax & CPUID_XMOD) > CPUID_XMOD_REV_F)) {
|
((eax & CPUID_XMOD) > CPUID_XMOD_REV_G)) {
|
||||||
printk(KERN_INFO PFX "Processor cpuid %x not supported\n", eax);
|
printk(KERN_INFO PFX "Processor cpuid %x not supported\n", eax);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
@ -521,10 +523,6 @@ static int check_pst_table(struct powernow_k8_data *data, struct pst_s *pst, u8
|
||||||
printk(KERN_ERR BFX "maxfid exceeded with pstate %d\n", j);
|
printk(KERN_ERR BFX "maxfid exceeded with pstate %d\n", j);
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
if (pst[j].fid & 1) {
|
|
||||||
printk(KERN_ERR BFX "fid invalid - %d : 0x%x\n", j, pst[j].fid);
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
if (j && (pst[j].fid < HI_FID_TABLE_BOTTOM)) {
|
if (j && (pst[j].fid < HI_FID_TABLE_BOTTOM)) {
|
||||||
/* Only first fid is allowed to be in "low" range */
|
/* Only first fid is allowed to be in "low" range */
|
||||||
printk(KERN_ERR BFX "two low fids - %d : 0x%x\n", j, pst[j].fid);
|
printk(KERN_ERR BFX "two low fids - %d : 0x%x\n", j, pst[j].fid);
|
||||||
|
@ -1177,4 +1175,3 @@ MODULE_LICENSE("GPL");
|
||||||
|
|
||||||
late_initcall(powernowk8_init);
|
late_initcall(powernowk8_init);
|
||||||
module_exit(powernowk8_exit);
|
module_exit(powernowk8_exit);
|
||||||
|
|
||||||
|
|
|
@ -42,7 +42,7 @@ struct powernow_k8_data {
|
||||||
#define CPUID_XFAM 0x0ff00000 /* extended family */
|
#define CPUID_XFAM 0x0ff00000 /* extended family */
|
||||||
#define CPUID_XFAM_K8 0
|
#define CPUID_XFAM_K8 0
|
||||||
#define CPUID_XMOD 0x000f0000 /* extended model */
|
#define CPUID_XMOD 0x000f0000 /* extended model */
|
||||||
#define CPUID_XMOD_REV_F 0x00040000
|
#define CPUID_XMOD_REV_G 0x00060000
|
||||||
#define CPUID_USE_XFAM_XMOD 0x00000f00
|
#define CPUID_USE_XFAM_XMOD 0x00000f00
|
||||||
#define CPUID_GET_MAX_CAPABILITIES 0x80000000
|
#define CPUID_GET_MAX_CAPABILITIES 0x80000000
|
||||||
#define CPUID_FREQ_VOLT_CAPABILITIES 0x80000007
|
#define CPUID_FREQ_VOLT_CAPABILITIES 0x80000007
|
||||||
|
@ -86,13 +86,14 @@ struct powernow_k8_data {
|
||||||
* low fid table
|
* low fid table
|
||||||
* - lowest entry in the high fid table must be a <= 200MHz + 2 * the entry
|
* - lowest entry in the high fid table must be a <= 200MHz + 2 * the entry
|
||||||
* in the low fid table
|
* in the low fid table
|
||||||
* - the parts can only step at 200 MHz intervals, so 1.9 GHz is never valid
|
* - the parts can only step at <= 200 MHz intervals, odd fid values are
|
||||||
|
* supported in revision G and later revisions.
|
||||||
* - lowest frequency must be >= interprocessor hypertransport link speed
|
* - lowest frequency must be >= interprocessor hypertransport link speed
|
||||||
* (only applies to MP systems obviously)
|
* (only applies to MP systems obviously)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* fids (frequency identifiers) are arranged in 2 tables - lo and hi */
|
/* fids (frequency identifiers) are arranged in 2 tables - lo and hi */
|
||||||
#define LO_FID_TABLE_TOP 6 /* fid values marking the boundary */
|
#define LO_FID_TABLE_TOP 7 /* fid values marking the boundary */
|
||||||
#define HI_FID_TABLE_BOTTOM 8 /* between the low and high tables */
|
#define HI_FID_TABLE_BOTTOM 8 /* between the low and high tables */
|
||||||
|
|
||||||
#define LO_VCOFREQ_TABLE_TOP 1400 /* corresponding vco frequency values */
|
#define LO_VCOFREQ_TABLE_TOP 1400 /* corresponding vco frequency values */
|
||||||
|
@ -106,7 +107,7 @@ struct powernow_k8_data {
|
||||||
#define MIN_FREQ 800 /* Min and max freqs, per spec */
|
#define MIN_FREQ 800 /* Min and max freqs, per spec */
|
||||||
#define MAX_FREQ 5000
|
#define MAX_FREQ 5000
|
||||||
|
|
||||||
#define INVALID_FID_MASK 0xffffffc1 /* not a valid fid if these bits are set */
|
#define INVALID_FID_MASK 0xffffffc0 /* not a valid fid if these bits are set */
|
||||||
#define INVALID_VID_MASK 0xffffffc0 /* not a valid vid if these bits are set */
|
#define INVALID_VID_MASK 0xffffffc0 /* not a valid vid if these bits are set */
|
||||||
|
|
||||||
#define VID_OFF 0x3f
|
#define VID_OFF 0x3f
|
||||||
|
|
Loading…
Reference in a new issue