Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
bbfebd66
Commit
bbfebd66
authored
Jan 17, 2009
by
Dave Jones
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[CPUFREQ] checkpatch cleanups for speedstep related drivers.
Signed-off-by:
Dave Jones
<
davej@redhat.com
>
parent
97acec55
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
258 additions
and
185 deletions
+258
-185
arch/x86/kernel/cpu/cpufreq/p4-clockmod.c
arch/x86/kernel/cpu/cpufreq/p4-clockmod.c
+34
-26
arch/x86/kernel/cpu/cpufreq/speedstep-ich.c
arch/x86/kernel/cpu/cpufreq/speedstep-ich.c
+37
-33
arch/x86/kernel/cpu/cpufreq/speedstep-lib.c
arch/x86/kernel/cpu/cpufreq/speedstep-lib.c
+77
-52
arch/x86/kernel/cpu/cpufreq/speedstep-lib.h
arch/x86/kernel/cpu/cpufreq/speedstep-lib.h
+9
-9
arch/x86/kernel/cpu/cpufreq/speedstep-smi.c
arch/x86/kernel/cpu/cpufreq/speedstep-smi.c
+101
-65
No files found.
arch/x86/kernel/cpu/cpufreq/p4-clockmod.c
View file @
bbfebd66
...
...
@@ -27,15 +27,16 @@
#include <linux/cpufreq.h>
#include <linux/slab.h>
#include <linux/cpumask.h>
#include <linux/timex.h>
#include <asm/processor.h>
#include <asm/msr.h>
#include <asm/timex.h>
#include "speedstep-lib.h"
#define PFX "p4-clockmod: "
#define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, "p4-clockmod", msg)
#define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, \
"p4-clockmod", msg)
/*
* Duty Cycle (3bits), note DC_DISABLE is not specified in
...
...
@@ -58,7 +59,8 @@ static int cpufreq_p4_setdc(unsigned int cpu, unsigned int newstate)
{
u32
l
,
h
;
if
(
!
cpu_online
(
cpu
)
||
(
newstate
>
DC_DISABLE
)
||
(
newstate
==
DC_RESV
))
if
(
!
cpu_online
(
cpu
)
||
(
newstate
>
DC_DISABLE
)
||
(
newstate
==
DC_RESV
))
return
-
EINVAL
;
rdmsr_on_cpu
(
cpu
,
MSR_IA32_THERM_STATUS
,
&
l
,
&
h
);
...
...
@@ -66,7 +68,8 @@ static int cpufreq_p4_setdc(unsigned int cpu, unsigned int newstate)
if
(
l
&
0x01
)
dprintk
(
"CPU#%d currently thermal throttled
\n
"
,
cpu
);
if
(
has_N44_O17_errata
[
cpu
]
&&
(
newstate
==
DC_25PT
||
newstate
==
DC_DFLT
))
if
(
has_N44_O17_errata
[
cpu
]
&&
(
newstate
==
DC_25PT
||
newstate
==
DC_DFLT
))
newstate
=
DC_38PT
;
rdmsr_on_cpu
(
cpu
,
MSR_IA32_THERM_CONTROL
,
&
l
,
&
h
);
...
...
@@ -112,7 +115,8 @@ static int cpufreq_p4_target(struct cpufreq_policy *policy,
struct
cpufreq_freqs
freqs
;
int
i
;
if
(
cpufreq_frequency_table_target
(
policy
,
&
p4clockmod_table
[
0
],
target_freq
,
relation
,
&
newstate
))
if
(
cpufreq_frequency_table_target
(
policy
,
&
p4clockmod_table
[
0
],
target_freq
,
relation
,
&
newstate
))
return
-
EINVAL
;
freqs
.
old
=
cpufreq_p4_get
(
policy
->
cpu
);
...
...
@@ -127,7 +131,8 @@ static int cpufreq_p4_target(struct cpufreq_policy *policy,
cpufreq_notify_transition
(
&
freqs
,
CPUFREQ_PRECHANGE
);
}
/* run on each logical CPU, see section 13.15.3 of IA32 Intel Architecture Software
/* run on each logical CPU,
* see section 13.15.3 of IA32 Intel Architecture Software
* Developer's Manual, Volume 3
*/
for_each_cpu
(
i
,
policy
->
cpus
)
...
...
@@ -153,28 +158,30 @@ static unsigned int cpufreq_p4_get_frequency(struct cpuinfo_x86 *c)
{
if
(
c
->
x86
==
0x06
)
{
if
(
cpu_has
(
c
,
X86_FEATURE_EST
))
printk
(
KERN_WARNING
PFX
"Warning: EST-capable CPU detected. "
"The acpi-cpufreq module offers voltage scaling"
" in addition of frequency scaling. You should use "
"that instead of p4-clockmod, if possible.
\n
"
);
printk
(
KERN_WARNING
PFX
"Warning: EST-capable CPU "
"detected. The acpi-cpufreq module offers "
"voltage scaling in addition of frequency "
"scaling. You should use that instead of "
"p4-clockmod, if possible.
\n
"
);
switch
(
c
->
x86_model
)
{
case
0x0E
:
/* Core */
case
0x0F
:
/* Core Duo */
case
0x16
:
/* Celeron Core */
p4clockmod_driver
.
flags
|=
CPUFREQ_CONST_LOOPS
;
return
speedstep_get_
processor_frequency
(
SPEEDSTEP_PROCESSOR
_PCORE
);
return
speedstep_get_
frequency
(
SPEEDSTEP_CPU
_PCORE
);
case
0x0D
:
/* Pentium M (Dothan) */
p4clockmod_driver
.
flags
|=
CPUFREQ_CONST_LOOPS
;
/* fall through */
case
0x09
:
/* Pentium M (Banias) */
return
speedstep_get_
processor_frequency
(
SPEEDSTEP_PROCESSOR
_PM
);
return
speedstep_get_
frequency
(
SPEEDSTEP_CPU
_PM
);
}
}
if
(
c
->
x86
!=
0xF
)
{
if
(
!
cpu_has
(
c
,
X86_FEATURE_EST
))
printk
(
KERN_WARNING
PFX
"Unknown p4-clockmod-capable CPU. "
"Please send an e-mail to <cpufreq@vger.kernel.org>
\n
"
);
printk
(
KERN_WARNING
PFX
"Unknown CPU. "
"Please send an e-mail to "
"<cpufreq@vger.kernel.org>
\n
"
);
return
0
;
}
...
...
@@ -182,16 +189,16 @@ static unsigned int cpufreq_p4_get_frequency(struct cpuinfo_x86 *c)
* throttling is active or not. */
p4clockmod_driver
.
flags
|=
CPUFREQ_CONST_LOOPS
;
if
(
speedstep_detect_processor
()
==
SPEEDSTEP_
PROCESSOR
_P4M
)
{
if
(
speedstep_detect_processor
()
==
SPEEDSTEP_
CPU
_P4M
)
{
printk
(
KERN_WARNING
PFX
"Warning: Pentium 4-M detected. "
"The speedstep-ich or acpi cpufreq modules offer "
"voltage scaling in addition of frequency scaling. "
"You should use either one instead of p4-clockmod, "
"if possible.
\n
"
);
return
speedstep_get_
processor_frequency
(
SPEEDSTEP_PROCESSOR
_P4M
);
return
speedstep_get_
frequency
(
SPEEDSTEP_CPU
_P4M
);
}
return
speedstep_get_
processor_frequency
(
SPEEDSTEP_PROCESSOR
_P4D
);
return
speedstep_get_
frequency
(
SPEEDSTEP_CPU
_P4D
);
}
...
...
@@ -223,8 +230,8 @@ static int cpufreq_p4_cpu_init(struct cpufreq_policy *policy)
return
-
EINVAL
;
/* table init */
for
(
i
=
1
;
(
p4clockmod_table
[
i
].
frequency
!=
CPUFREQ_TABLE_END
);
i
++
)
{
if
((
i
<
2
)
&&
(
has_N44_O17_errata
[
policy
->
cpu
]))
for
(
i
=
1
;
(
p4clockmod_table
[
i
].
frequency
!=
CPUFREQ_TABLE_END
);
i
++
)
{
if
((
i
<
2
)
&&
(
has_N44_O17_errata
[
policy
->
cpu
]))
p4clockmod_table
[
i
].
frequency
=
CPUFREQ_ENTRY_INVALID
;
else
p4clockmod_table
[
i
].
frequency
=
(
stock_freq
*
i
)
/
8
;
...
...
@@ -258,12 +265,12 @@ static unsigned int cpufreq_p4_get(unsigned int cpu)
l
=
DC_DISABLE
;
if
(
l
!=
DC_DISABLE
)
return
(
stock_freq
*
l
/
8
)
;
return
stock_freq
*
l
/
8
;
return
stock_freq
;
}
static
struct
freq_attr
*
p4clockmod_attr
[]
=
{
static
struct
freq_attr
*
p4clockmod_attr
[]
=
{
&
cpufreq_freq_attr_scaling_available_freqs
,
NULL
,
};
...
...
@@ -299,9 +306,10 @@ static int __init cpufreq_p4_init(void)
ret
=
cpufreq_register_driver
(
&
p4clockmod_driver
);
if
(
!
ret
)
printk
(
KERN_INFO
PFX
"P4/Xeon(TM) CPU On-Demand Clock Modulation available
\n
"
);
printk
(
KERN_INFO
PFX
"P4/Xeon(TM) CPU On-Demand Clock "
"Modulation available
\n
"
);
return
(
ret
)
;
return
ret
;
}
...
...
@@ -311,9 +319,9 @@ static void __exit cpufreq_p4_exit(void)
}
MODULE_AUTHOR
(
"Zwane Mwaikambo <zwane@commfireservices.com>"
);
MODULE_DESCRIPTION
(
"cpufreq driver for Pentium(TM) 4/Xeon(TM)"
);
MODULE_LICENSE
(
"GPL"
);
MODULE_AUTHOR
(
"Zwane Mwaikambo <zwane@commfireservices.com>"
);
MODULE_DESCRIPTION
(
"cpufreq driver for Pentium(TM) 4/Xeon(TM)"
);
MODULE_LICENSE
(
"GPL"
);
late_initcall
(
cpufreq_p4_init
);
module_exit
(
cpufreq_p4_exit
);
arch/x86/kernel/cpu/cpufreq/speedstep-ich.c
View file @
bbfebd66
...
...
@@ -39,7 +39,7 @@ static struct pci_dev *speedstep_chipset_dev;
/* speedstep_processor
*/
static
unsigned
int
speedstep_processor
=
0
;
static
unsigned
int
speedstep_processor
;
static
u32
pmbase
;
...
...
@@ -54,7 +54,8 @@ static struct cpufreq_frequency_table speedstep_freqs[] = {
};
#define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, "speedstep-ich", msg)
#define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, \
"speedstep-ich", msg)
/**
...
...
@@ -62,7 +63,7 @@ static struct cpufreq_frequency_table speedstep_freqs[] = {
*
* Returns: -ENODEV if no register could be found
*/
static
int
speedstep_find_register
(
void
)
static
int
speedstep_find_register
(
void
)
{
if
(
!
speedstep_chipset_dev
)
return
-
ENODEV
;
...
...
@@ -90,7 +91,7 @@ static int speedstep_find_register (void)
*
* Tries to change the SpeedStep state.
*/
static
void
speedstep_set_state
(
unsigned
int
state
)
static
void
speedstep_set_state
(
unsigned
int
state
)
{
u8
pm2_blk
;
u8
value
;
...
...
@@ -133,11 +134,11 @@ static void speedstep_set_state (unsigned int state)
dprintk
(
"read at pmbase 0x%x + 0x50 returned 0x%x
\n
"
,
pmbase
,
value
);
if
(
state
==
(
value
&
0x1
))
{
dprintk
(
"change to %u MHz succeeded
\n
"
,
(
speedstep_get_processor_frequency
(
speedstep_processor
)
/
1000
));
}
else
{
printk
(
KERN_ERR
"cpufreq: change failed - I/O error
\n
"
);
}
if
(
state
==
(
value
&
0x1
))
dprintk
(
"change to %u MHz succeeded
\n
"
,
speedstep_get_frequency
(
speedstep_processor
)
/
1000
);
else
printk
(
KERN_ERR
"cpufreq: change failed - I/O error
\n
"
);
return
;
}
...
...
@@ -149,7 +150,7 @@ static void speedstep_set_state (unsigned int state)
* Tries to activate the SpeedStep status and control registers.
* Returns -EINVAL on an unsupported chipset, and zero on success.
*/
static
int
speedstep_activate
(
void
)
static
int
speedstep_activate
(
void
)
{
u16
value
=
0
;
...
...
@@ -175,20 +176,18 @@ static int speedstep_activate (void)
* functions. Returns the SPEEDSTEP_CHIPSET_-number for the detected
* chipset, or zero on failure.
*/
static
unsigned
int
speedstep_detect_chipset
(
void
)
static
unsigned
int
speedstep_detect_chipset
(
void
)
{
speedstep_chipset_dev
=
pci_get_subsys
(
PCI_VENDOR_ID_INTEL
,
PCI_DEVICE_ID_INTEL_82801DB_12
,
PCI_ANY_ID
,
PCI_ANY_ID
,
PCI_ANY_ID
,
PCI_ANY_ID
,
NULL
);
if
(
speedstep_chipset_dev
)
return
4
;
/* 4-M */
speedstep_chipset_dev
=
pci_get_subsys
(
PCI_VENDOR_ID_INTEL
,
PCI_DEVICE_ID_INTEL_82801CA_12
,
PCI_ANY_ID
,
PCI_ANY_ID
,
PCI_ANY_ID
,
PCI_ANY_ID
,
NULL
);
if
(
speedstep_chipset_dev
)
return
3
;
/* 3-M */
...
...
@@ -196,8 +195,7 @@ static unsigned int speedstep_detect_chipset (void)
speedstep_chipset_dev
=
pci_get_subsys
(
PCI_VENDOR_ID_INTEL
,
PCI_DEVICE_ID_INTEL_82801BA_10
,
PCI_ANY_ID
,
PCI_ANY_ID
,
PCI_ANY_ID
,
PCI_ANY_ID
,
NULL
);
if
(
speedstep_chipset_dev
)
{
/* speedstep.c causes lockups on Dell Inspirons 8000 and
...
...
@@ -208,8 +206,7 @@ static unsigned int speedstep_detect_chipset (void)
hostbridge
=
pci_get_subsys
(
PCI_VENDOR_ID_INTEL
,
PCI_DEVICE_ID_INTEL_82815_MC
,
PCI_ANY_ID
,
PCI_ANY_ID
,
PCI_ANY_ID
,
PCI_ANY_ID
,
NULL
);
if
(
!
hostbridge
)
...
...
@@ -236,7 +233,7 @@ static unsigned int _speedstep_get(const struct cpumask *cpus)
cpus_allowed
=
current
->
cpus_allowed
;
set_cpus_allowed_ptr
(
current
,
cpus
);
speed
=
speedstep_get_
processor_
frequency
(
speedstep_processor
);
speed
=
speedstep_get_frequency
(
speedstep_processor
);
set_cpus_allowed_ptr
(
current
,
&
cpus_allowed
);
dprintk
(
"detected %u kHz as current frequency
\n
"
,
speed
);
return
speed
;
...
...
@@ -251,11 +248,12 @@ static unsigned int speedstep_get(unsigned int cpu)
* speedstep_target - set a new CPUFreq policy
* @policy: new policy
* @target_freq: the target frequency
* @relation: how that frequency relates to achieved frequency (CPUFREQ_RELATION_L or CPUFREQ_RELATION_H)
* @relation: how that frequency relates to achieved frequency
* (CPUFREQ_RELATION_L or CPUFREQ_RELATION_H)
*
* Sets a new CPUFreq policy.
*/
static
int
speedstep_target
(
struct
cpufreq_policy
*
policy
,
static
int
speedstep_target
(
struct
cpufreq_policy
*
policy
,
unsigned
int
target_freq
,
unsigned
int
relation
)
{
...
...
@@ -264,7 +262,8 @@ static int speedstep_target (struct cpufreq_policy *policy,
cpumask_t
cpus_allowed
;
int
i
;
if
(
cpufreq_frequency_table_target
(
policy
,
&
speedstep_freqs
[
0
],
target_freq
,
relation
,
&
newstate
))
if
(
cpufreq_frequency_table_target
(
policy
,
&
speedstep_freqs
[
0
],
target_freq
,
relation
,
&
newstate
))
return
-
EINVAL
;
freqs
.
old
=
_speedstep_get
(
policy
->
cpus
);
...
...
@@ -308,7 +307,7 @@ static int speedstep_target (struct cpufreq_policy *policy,
* Limit must be within speedstep_low_freq and speedstep_high_freq, with
* at least one border included.
*/
static
int
speedstep_verify
(
struct
cpufreq_policy
*
policy
)
static
int
speedstep_verify
(
struct
cpufreq_policy
*
policy
)
{
return
cpufreq_frequency_table_verify
(
policy
,
&
speedstep_freqs
[
0
]);
}
...
...
@@ -344,7 +343,8 @@ static int speedstep_cpu_init(struct cpufreq_policy *policy)
return
-
EIO
;
dprintk
(
"currently at %s speed setting - %i MHz
\n
"
,
(
speed
==
speedstep_freqs
[
SPEEDSTEP_LOW
].
frequency
)
?
"low"
:
"high"
,
(
speed
==
speedstep_freqs
[
SPEEDSTEP_LOW
].
frequency
)
?
"low"
:
"high"
,
(
speed
/
1000
));
/* cpuinfo and default policy values */
...
...
@@ -352,9 +352,9 @@ static int speedstep_cpu_init(struct cpufreq_policy *policy)
result
=
cpufreq_frequency_table_cpuinfo
(
policy
,
speedstep_freqs
);
if
(
result
)
return
(
result
)
;
return
result
;
cpufreq_frequency_table_get_attr
(
speedstep_freqs
,
policy
->
cpu
);
cpufreq_frequency_table_get_attr
(
speedstep_freqs
,
policy
->
cpu
);
return
0
;
}
...
...
@@ -366,7 +366,7 @@ static int speedstep_cpu_exit(struct cpufreq_policy *policy)
return
0
;
}
static
struct
freq_attr
*
speedstep_attr
[]
=
{
static
struct
freq_attr
*
speedstep_attr
[]
=
{
&
cpufreq_freq_attr_scaling_available_freqs
,
NULL
,
};
...
...
@@ -396,13 +396,15 @@ static int __init speedstep_init(void)
/* detect processor */
speedstep_processor
=
speedstep_detect_processor
();
if
(
!
speedstep_processor
)
{
dprintk
(
"Intel(R) SpeedStep(TM) capable processor not found
\n
"
);
dprintk
(
"Intel(R) SpeedStep(TM) capable processor "
"not found
\n
"
);
return
-
ENODEV
;
}
/* detect chipset */
if
(
!
speedstep_detect_chipset
())
{
dprintk
(
"Intel(R) SpeedStep(TM) for this chipset not (yet) available.
\n
"
);
dprintk
(
"Intel(R) SpeedStep(TM) for this chipset not "
"(yet) available.
\n
"
);
return
-
ENODEV
;
}
...
...
@@ -431,9 +433,11 @@ static void __exit speedstep_exit(void)
}
MODULE_AUTHOR
(
"Dave Jones <davej@redhat.com>, Dominik Brodowski <linux@brodo.de>"
);
MODULE_DESCRIPTION
(
"Speedstep driver for Intel mobile processors on chipsets with ICH-M southbridges."
);
MODULE_LICENSE
(
"GPL"
);
MODULE_AUTHOR
(
"Dave Jones <davej@redhat.com>, "
"Dominik Brodowski <linux@brodo.de>"
);
MODULE_DESCRIPTION
(
"Speedstep driver for Intel mobile processors on chipsets "
"with ICH-M southbridges."
);
MODULE_LICENSE
(
"GPL"
);
module_init
(
speedstep_init
);
module_exit
(
speedstep_exit
);
arch/x86/kernel/cpu/cpufreq/speedstep-lib.c
View file @
bbfebd66
...
...
@@ -18,10 +18,13 @@
#include <asm/msr.h>
#include "speedstep-lib.h"
#define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, "speedstep-lib", msg)
#define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, \
"speedstep-lib", msg)
#define PFX "speedstep-lib: "
#ifdef CONFIG_X86_SPEEDSTEP_RELAXED_CAP_CHECK
static
int
relaxed_check
=
0
;
static
int
relaxed_check
;
#else
#define relaxed_check 0
#endif
...
...
@@ -30,14 +33,14 @@ static int relaxed_check = 0;
* GET PROCESSOR CORE SPEED IN KHZ *
*********************************************************************/
static
unsigned
int
pentium3_get_frequency
(
unsigned
int
processor
)
static
unsigned
int
pentium3_get_frequency
(
unsigned
int
processor
)
{
/* See table 14 of p3_ds.pdf and table 22 of 29834003.pdf */
/* See table 14 of p3_ds.pdf and table 22 of 29834003.pdf */
struct
{
unsigned
int
ratio
;
/* Frequency Multiplier (x10) */
u8
bitmap
;
/* power on configuration bits
[27, 25:22] (in MSR 0x2a) */
}
msr_decode_mult
[]
=
{
}
msr_decode_mult
[]
=
{
{
30
,
0x01
},
{
35
,
0x05
},
{
40
,
0x02
},
...
...
@@ -52,7 +55,7 @@ static unsigned int pentium3_get_frequency (unsigned int processor)
{
85
,
0x26
},
{
90
,
0x20
},
{
100
,
0x2b
},
{
0
,
0xff
}
/* error or unknown value */
{
0
,
0xff
}
/* error or unknown value */
};
/* PIII(-M) FSB settings: see table b1-b of 24547206.pdf */
...
...
@@ -60,7 +63,7 @@ static unsigned int pentium3_get_frequency (unsigned int processor)
unsigned
int
value
;
/* Front Side Bus speed in MHz */
u8
bitmap
;
/* power on configuration bits [18: 19]
(in MSR 0x2a) */
}
msr_decode_fsb
[]
=
{
}
msr_decode_fsb
[]
=
{
{
66
,
0x0
},
{
100
,
0x2
},
{
133
,
0x1
},
...
...
@@ -85,7 +88,7 @@ static unsigned int pentium3_get_frequency (unsigned int processor)
}
/* decode the multiplier */
if
(
processor
==
SPEEDSTEP_
PROCESSOR
_PIII_C_EARLY
)
{
if
(
processor
==
SPEEDSTEP_
CPU
_PIII_C_EARLY
)
{
dprintk
(
"workaround for early PIIIs
\n
"
);
msr_lo
&=
0x03c00000
;
}
else
...
...
@@ -97,9 +100,10 @@ static unsigned int pentium3_get_frequency (unsigned int processor)
j
++
;
}
dprintk
(
"speed is %u
\n
"
,
(
msr_decode_mult
[
j
].
ratio
*
msr_decode_fsb
[
i
].
value
*
100
));
dprintk
(
"speed is %u
\n
"
,
(
msr_decode_mult
[
j
].
ratio
*
msr_decode_fsb
[
i
].
value
*
100
));
return
(
msr_decode_mult
[
j
].
ratio
*
msr_decode_fsb
[
i
].
value
*
100
)
;
return
msr_decode_mult
[
j
].
ratio
*
msr_decode_fsb
[
i
].
value
*
100
;
}
...
...
@@ -112,20 +116,23 @@ static unsigned int pentiumM_get_frequency(void)
/* see table B-2 of 24547212.pdf */
if
(
msr_lo
&
0x00040000
)
{
printk
(
KERN_DEBUG
"speedstep-lib: PM - invalid FSB: 0x%x 0x%x
\n
"
,
msr_lo
,
msr_tmp
);
printk
(
KERN_DEBUG
PFX
"PM - invalid FSB: 0x%x 0x%x
\n
"
,
msr_lo
,
msr_tmp
);
return
0
;
}
msr_tmp
=
(
msr_lo
>>
22
)
&
0x1f
;
dprintk
(
"bits 22-26 are 0x%x, speed is %u
\n
"
,
msr_tmp
,
(
msr_tmp
*
100
*
1000
));
dprintk
(
"bits 22-26 are 0x%x, speed is %u
\n
"
,
msr_tmp
,
(
msr_tmp
*
100
*
1000
));
return
(
msr_tmp
*
100
*
1000
)
;
return
msr_tmp
*
100
*
1000
;
}
static
unsigned
int
pentium_core_get_frequency
(
void
)
{
u32
fsb
=
0
;
u32
msr_lo
,
msr_tmp
;
int
ret
;
rdmsr
(
MSR_FSB_FREQ
,
msr_lo
,
msr_tmp
);
/* see table B-2 of 25366920.pdf */
...
...
@@ -153,12 +160,15 @@ static unsigned int pentium_core_get_frequency(void)
}
rdmsr
(
MSR_IA32_EBL_CR_POWERON
,
msr_lo
,
msr_tmp
);
dprintk
(
"PCORE - MSR_IA32_EBL_CR_POWERON: 0x%x 0x%x
\n
"
,
msr_lo
,
msr_tmp
);
dprintk
(
"PCORE - MSR_IA32_EBL_CR_POWERON: 0x%x 0x%x
\n
"
,
msr_lo
,
msr_tmp
);
msr_tmp
=
(
msr_lo
>>
22
)
&
0x1f
;
dprintk
(
"bits 22-26 are 0x%x, speed is %u
\n
"
,
msr_tmp
,
(
msr_tmp
*
fsb
));
dprintk
(
"bits 22-26 are 0x%x, speed is %u
\n
"
,
msr_tmp
,
(
msr_tmp
*
fsb
));
return
(
msr_tmp
*
fsb
);
ret
=
(
msr_tmp
*
fsb
);
return
ret
;
}
...
...
@@ -167,6 +177,7 @@ static unsigned int pentium4_get_frequency(void)
struct
cpuinfo_x86
*
c
=
&
boot_cpu_data
;
u32
msr_lo
,
msr_hi
,
mult
;
unsigned
int
fsb
=
0
;
unsigned
int
ret
;
rdmsr
(
0x2c
,
msr_lo
,
msr_hi
);
...
...
@@ -195,44 +206,47 @@ static unsigned int pentium4_get_frequency(void)
}
if
(
!
fsb
)
printk
(
KERN_DEBUG
"speedstep-lib: couldn't detect FSB speed. Please send an e-mail to <linux@brodo.de>
\n
"
);
printk
(
KERN_DEBUG
PFX
"couldn't detect FSB speed. "
"Please send an e-mail to <linux@brodo.de>
\n
"
);
/* Multiplier. */
mult
=
msr_lo
>>
24
;
dprintk
(
"P4 - FSB %u kHz; Multiplier %u; Speed %u kHz
\n
"
,
fsb
,
mult
,
(
fsb
*
mult
));
dprintk
(
"P4 - FSB %u kHz; Multiplier %u; Speed %u kHz
\n
"
,
fsb
,
mult
,
(
fsb
*
mult
));
return
(
fsb
*
mult
);
ret
=
(
fsb
*
mult
);
return
ret
;
}
unsigned
int
speedstep_get_
processor_
frequency
(
unsigned
int
processor
)
unsigned
int
speedstep_get_frequency
(
unsigned
int
processor
)
{
switch
(
processor
)
{
case
SPEEDSTEP_
PROCESSOR
_PCORE
:
case
SPEEDSTEP_
CPU
_PCORE
:
return
pentium_core_get_frequency
();
case
SPEEDSTEP_
PROCESSOR
_PM
:
case
SPEEDSTEP_
CPU
_PM
:
return
pentiumM_get_frequency
();
case
SPEEDSTEP_
PROCESSOR
_P4D
:
case
SPEEDSTEP_
PROCESSOR
_P4M
:
case
SPEEDSTEP_
CPU
_P4D
:
case
SPEEDSTEP_
CPU
_P4M
:
return
pentium4_get_frequency
();
case
SPEEDSTEP_
PROCESSOR
_PIII_T
:
case
SPEEDSTEP_
PROCESSOR
_PIII_C
:
case
SPEEDSTEP_
PROCESSOR
_PIII_C_EARLY
:
case
SPEEDSTEP_
CPU
_PIII_T
:
case
SPEEDSTEP_
CPU
_PIII_C
:
case
SPEEDSTEP_
CPU
_PIII_C_EARLY
:
return
pentium3_get_frequency
(
processor
);
default:
return
0
;
};
return
0
;
}
EXPORT_SYMBOL_GPL
(
speedstep_get_
processor_
frequency
);
EXPORT_SYMBOL_GPL
(
speedstep_get_frequency
);
/*********************************************************************
* DETECT SPEEDSTEP-CAPABLE PROCESSOR *
*********************************************************************/
unsigned
int
speedstep_detect_processor
(
void
)
unsigned
int
speedstep_detect_processor
(
void
)
{
struct
cpuinfo_x86
*
c
=
&
cpu_data
(
0
);
u32
ebx
,
msr_lo
,
msr_hi
;
...
...
@@ -261,7 +275,7 @@ unsigned int speedstep_detect_processor (void)
* sample has ebx = 0x0f, production has 0x0e.
*/
if
((
ebx
==
0x0e
)
||
(
ebx
==
0x0f
))
return
SPEEDSTEP_
PROCESSOR
_P4M
;
return
SPEEDSTEP_
CPU
_P4M
;
break
;
case
7
:
/*
...
...
@@ -272,7 +286,7 @@ unsigned int speedstep_detect_processor (void)
* samples are only of B-stepping...
*/
if
(
ebx
==
0x0e
)
return
SPEEDSTEP_
PROCESSOR
_P4M
;
return
SPEEDSTEP_
CPU
_P4M
;
break
;
case
9
:
/*
...
...
@@ -288,10 +302,13 @@ unsigned int speedstep_detect_processor (void)
* M-P4-Ms may have either ebx=0xe or 0xf [see above]
* M-P4/533 have either ebx=0xe or 0xf. [25317607.pdf]
* also, M-P4M HTs have ebx=0x8, too
* For now, they are distinguished by the model_id string
* For now, they are distinguished by the model_id
* string
*/
if
((
ebx
==
0x0e
)
||
(
strstr
(
c
->
x86_model_id
,
"Mobile Intel(R) Pentium(R) 4"
)
!=
NULL
))
return
SPEEDSTEP_PROCESSOR_P4M
;
if
((
ebx
==
0x0e
)
||
(
strstr
(
c
->
x86_model_id
,
"Mobile Intel(R) Pentium(R) 4"
)
!=
NULL
))
return
SPEEDSTEP_CPU_P4M
;
break
;
default:
break
;
...
...
@@ -301,7 +318,8 @@ unsigned int speedstep_detect_processor (void)
switch
(
c
->
x86_model
)
{
case
0x0B
:
/* Intel PIII [Tualatin] */
/* cpuid_ebx(1) is 0x04 for desktop PIII, 0x06 for mobile PIII-M */
/* cpuid_ebx(1) is 0x04 for desktop PIII,
* 0x06 for mobile PIII-M */
ebx
=
cpuid_ebx
(
0x00000001
);
dprintk
(
"ebx is %x
\n
"
,
ebx
);
...
...
@@ -313,14 +331,15 @@ unsigned int speedstep_detect_processor (void)
/* So far all PIII-M processors support SpeedStep. See
* Intel's 24540640.pdf of June 2003
*/
return
SPEEDSTEP_
PROCESSOR
_PIII_T
;
return
SPEEDSTEP_
CPU
_PIII_T
;
case
0x08
:
/* Intel PIII [Coppermine] */
/* all mobile PIII Coppermines have FSB 100 MHz
* ==> sort out a few desktop PIIIs. */
rdmsr
(
MSR_IA32_EBL_CR_POWERON
,
msr_lo
,
msr_hi
);
dprintk
(
"Coppermine: MSR_IA32_EBL_CR_POWERON is 0x%x, 0x%x
\n
"
,
msr_lo
,
msr_hi
);
dprintk
(
"Coppermine: MSR_IA32_EBL_CR_POWERON is 0x%x, 0x%x
\n
"
,
msr_lo
,
msr_hi
);
msr_lo
&=
0x00c0000
;
if
(
msr_lo
!=
0x0080000
)
return
0
;
...
...
@@ -332,13 +351,15 @@ unsigned int speedstep_detect_processor (void)
* bit 56 or 57 is set
*/
rdmsr
(
MSR_IA32_PLATFORM_ID
,
msr_lo
,
msr_hi
);
dprintk
(
"Coppermine: MSR_IA32_PLATFORM ID is 0x%x, 0x%x
\n
"
,
msr_lo
,
msr_hi
);
if
((
msr_hi
&
(
1
<<
18
))
&&
(
relaxed_check
?
1
:
(
msr_hi
&
(
3
<<
24
))))
{
dprintk
(
"Coppermine: MSR_IA32_PLATFORM ID is 0x%x, 0x%x
\n
"
,
msr_lo
,
msr_hi
);
if
((
msr_hi
&
(
1
<<
18
))
&&
(
relaxed_check
?
1
:
(
msr_hi
&
(
3
<<
24
))))
{
if
(
c
->
x86_mask
==
0x01
)
{
dprintk
(
"early PIII version
\n
"
);
return
SPEEDSTEP_
PROCESSOR
_PIII_C_EARLY
;
return
SPEEDSTEP_
CPU
_PIII_C_EARLY
;
}
else
return
SPEEDSTEP_
PROCESSOR
_PIII_C
;
return
SPEEDSTEP_
CPU
_PIII_C
;
}
default:
...
...
@@ -369,7 +390,7 @@ unsigned int speedstep_get_freqs(unsigned int processor,
dprintk
(
"trying to determine both speeds
\n
"
);
/* get current speed */
prev_speed
=
speedstep_get_
processor_
frequency
(
processor
);
prev_speed
=
speedstep_get_frequency
(
processor
);
if
(
!
prev_speed
)
return
-
EIO
;
...
...
@@ -379,7 +400,7 @@ unsigned int speedstep_get_freqs(unsigned int processor,
/* switch to low state */
set_state
(
SPEEDSTEP_LOW
);
*
low_speed
=
speedstep_get_
processor_
frequency
(
processor
);
*
low_speed
=
speedstep_get_frequency
(
processor
);
if
(
!*
low_speed
)
{
ret
=
-
EIO
;
goto
out
;
...
...
@@ -398,7 +419,7 @@ unsigned int speedstep_get_freqs(unsigned int processor,
if
(
transition_latency
)
do_gettimeofday
(
&
tv2
);
*
high_speed
=
speedstep_get_
processor_
frequency
(
processor
);
*
high_speed
=
speedstep_get_frequency
(
processor
);
if
(
!*
high_speed
)
{
ret
=
-
EIO
;
goto
out
;
...
...
@@ -426,9 +447,12 @@ unsigned int speedstep_get_freqs(unsigned int processor,
/* check if the latency measurement is too high or too low
* and set it to a safe value (500uSec) in that case
*/
if
(
*
transition_latency
>
10000000
||
*
transition_latency
<
50000
)
{
printk
(
KERN_WARNING
"speedstep: frequency transition measured seems out of "
"range (%u nSec), falling back to a safe one of %u nSec.
\n
"
,
if
(
*
transition_latency
>
10000000
||
*
transition_latency
<
50000
)
{
printk
(
KERN_WARNING
PFX
"frequency transition "
"measured seems out of range (%u "
"nSec), falling back to a safe one of"
"%u nSec.
\n
"
,
*
transition_latency
,
500000
);
*
transition_latency
=
500000
;
}
...
...
@@ -436,15 +460,16 @@ unsigned int speedstep_get_freqs(unsigned int processor,
out:
local_irq_restore
(
flags
);
return
(
ret
)
;
return
ret
;
}
EXPORT_SYMBOL_GPL
(
speedstep_get_freqs
);
#ifdef CONFIG_X86_SPEEDSTEP_RELAXED_CAP_CHECK
module_param
(
relaxed_check
,
int
,
0444
);
MODULE_PARM_DESC
(
relaxed_check
,
"Don't do all checks for speedstep capability."
);
MODULE_PARM_DESC
(
relaxed_check
,
"Don't do all checks for speedstep capability."
);
#endif
MODULE_AUTHOR
(
"Dominik Brodowski <linux@brodo.de>"
);
MODULE_DESCRIPTION
(
"Library for Intel SpeedStep 1 or 2 cpufreq drivers."
);
MODULE_LICENSE
(
"GPL"
);
MODULE_AUTHOR
(
"Dominik Brodowski <linux@brodo.de>"
);
MODULE_DESCRIPTION
(
"Library for Intel SpeedStep 1 or 2 cpufreq drivers."
);
MODULE_LICENSE
(
"GPL"
);
arch/x86/kernel/cpu/cpufreq/speedstep-lib.h
View file @
bbfebd66
...
...
@@ -12,17 +12,17 @@
/* processors */
#define SPEEDSTEP_
PROCESSOR
_PIII_C_EARLY 0x00000001
/* Coppermine core */
#define SPEEDSTEP_
PROCESSOR
_PIII_C 0x00000002
/* Coppermine core */
#define SPEEDSTEP_
PROCESSOR
_PIII_T 0x00000003
/* Tualatin core */
#define SPEEDSTEP_
PROCESSOR_P4M
0x00000004
/* P4-M */
#define SPEEDSTEP_
CPU
_PIII_C_EARLY 0x00000001
/* Coppermine core */
#define SPEEDSTEP_
CPU
_PIII_C 0x00000002
/* Coppermine core */
#define SPEEDSTEP_
CPU
_PIII_T 0x00000003
/* Tualatin core */
#define SPEEDSTEP_
CPU_P4M
0x00000004
/* P4-M */
/* the following processors are not speedstep-capable and are not auto-detected
* in speedstep_detect_processor(). However, their speed can be detected using
* the speedstep_get_
processor_
frequency() call. */
#define SPEEDSTEP_
PROCESSOR_PM
0xFFFFFF03
/* Pentium M */
#define SPEEDSTEP_
PROCESSOR_P4D
0xFFFFFF04
/* desktop P4 */
#define SPEEDSTEP_
PROCESSOR
_PCORE 0xFFFFFF05
/* Core */
* the speedstep_get_frequency() call. */
#define SPEEDSTEP_
CPU_PM
0xFFFFFF03
/* Pentium M */
#define SPEEDSTEP_
CPU_P4D
0xFFFFFF04
/* desktop P4 */
#define SPEEDSTEP_
CPU
_PCORE 0xFFFFFF05
/* Core */
/* speedstep states -- only two of them */
...
...
@@ -34,7 +34,7 @@
extern
unsigned
int
speedstep_detect_processor
(
void
);
/* detect the current speed (in khz) of the processor */
extern
unsigned
int
speedstep_get_
processor_
frequency
(
unsigned
int
processor
);
extern
unsigned
int
speedstep_get_frequency
(
unsigned
int
processor
);
/* detect the low and high speeds of the processor. The callback
...
...
arch/x86/kernel/cpu/cpufreq/speedstep-smi.c
View file @
bbfebd66
...
...
@@ -19,8 +19,8 @@
#include <linux/cpufreq.h>
#include <linux/slab.h>
#include <linux/delay.h>
#include <linux/io.h>
#include <asm/ist.h>
#include <asm/io.h>
#include "speedstep-lib.h"
...
...
@@ -30,12 +30,12 @@
* If user gives it, these are used.
*
*/
static
int
smi_port
=
0
;
static
int
smi_cmd
=
0
;
static
unsigned
int
smi_sig
=
0
;
static
int
smi_port
;
static
int
smi_cmd
;
static
unsigned
int
smi_sig
;
/* info about the processor */
static
unsigned
int
speedstep_processor
=
0
;
static
unsigned
int
speedstep_processor
;
/*
* There are only two frequency states for each processor. Values
...
...
@@ -56,12 +56,13 @@ static struct cpufreq_frequency_table speedstep_freqs[] = {
* of DMA activity going on? */
#define SMI_TRIES 5
#define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, "speedstep-smi", msg)
#define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, \
"speedstep-smi", msg)
/**
* speedstep_smi_ownership
*/
static
int
speedstep_smi_ownership
(
void
)
static
int
speedstep_smi_ownership
(
void
)
{
u32
command
,
result
,
magic
,
dummy
;
u32
function
=
GET_SPEEDSTEP_OWNER
;
...
...
@@ -70,16 +71,18 @@ static int speedstep_smi_ownership (void)
command
=
(
smi_sig
&
0xffffff00
)
|
(
smi_cmd
&
0xff
);
magic
=
virt_to_phys
(
magic_data
);
dprintk
(
"trying to obtain ownership with command %x at port %x
\n
"
,
command
,
smi_port
);
dprintk
(
"trying to obtain ownership with command %x at port %x
\n
"
,
command
,
smi_port
);
__asm__
__volatile__
(
"push %%ebp
\n
"
"out %%al, (%%dx)
\n
"
"pop %%ebp
\n
"
:
"=D"
(
result
),
"=a"
(
dummy
),
"=b"
(
dummy
),
"=c"
(
dummy
),
"=d"
(
dummy
),
"=S"
(
dummy
)
:
"=D"
(
result
),
"=a"
(
dummy
),
"=b"
(
dummy
),
"=c"
(
dummy
),
"=d"
(
dummy
),
"=S"
(
dummy
)
:
"a"
(
command
),
"b"
(
function
),
"c"
(
0
),
"d"
(
smi_port
),
"D"
(
0
),
"S"
(
magic
)
"D"
(
0
),
"S"
(
magic
)
:
"memory"
);
...
...
@@ -97,10 +100,10 @@ static int speedstep_smi_ownership (void)
* even hangs [cf. bugme.osdl.org # 1422] on earlier systems. Empirical testing
* shows that the latter occurs if !(ist_info.event & 0xFFFF).
*/
static
int
speedstep_smi_get_freqs
(
unsigned
int
*
low
,
unsigned
int
*
high
)
static
int
speedstep_smi_get_freqs
(
unsigned
int
*
low
,
unsigned
int
*
high
)
{
u32
command
,
result
=
0
,
edi
,
high_mhz
,
low_mhz
,
dummy
;
u32
state
=
0
;
u32
state
=
0
;
u32
function
=
GET_SPEEDSTEP_FREQS
;
if
(
!
(
ist_info
.
event
&
0xFFFF
))
{
...
...
@@ -110,17 +113,25 @@ static int speedstep_smi_get_freqs (unsigned int *low, unsigned int *high)
command
=
(
smi_sig
&
0xffffff00
)
|
(
smi_cmd
&
0xff
);
dprintk
(
"trying to determine frequencies with command %x at port %x
\n
"
,
command
,
smi_port
);
dprintk
(
"trying to determine frequencies with command %x at port %x
\n
"
,
command
,
smi_port
);
__asm__
__volatile__
(
"push %%ebp
\n
"
"out %%al, (%%dx)
\n
"
"pop %%ebp"
:
"=a"
(
result
),
"=b"
(
high_mhz
),
"=c"
(
low_mhz
),
"=d"
(
state
),
"=D"
(
edi
),
"=S"
(
dummy
)
:
"a"
(
command
),
"b"
(
function
),
"c"
(
state
),
"d"
(
smi_port
),
"S"
(
0
),
"D"
(
0
)
:
"=a"
(
result
),
"=b"
(
high_mhz
),
"=c"
(
low_mhz
),
"=d"
(
state
),
"=D"
(
edi
),
"=S"
(
dummy
)
:
"a"
(
command
),
"b"
(
function
),
"c"
(
state
),
"d"
(
smi_port
),
"S"
(
0
),
"D"
(
0
)
);
dprintk
(
"result %x, low_freq %u, high_freq %u
\n
"
,
result
,
low_mhz
,
high_mhz
);
dprintk
(
"result %x, low_freq %u, high_freq %u
\n
"
,
result
,
low_mhz
,
high_mhz
);
/* abort if results are obviously incorrect... */
if
((
high_mhz
+
low_mhz
)
<
600
)
...
...
@@ -137,26 +148,30 @@ static int speedstep_smi_get_freqs (unsigned int *low, unsigned int *high)
* @state: processor frequency state (SPEEDSTEP_LOW or SPEEDSTEP_HIGH)
*
*/
static
int
speedstep_get_state
(
void
)
static
int
speedstep_get_state
(
void
)
{
u32
function
=
GET_SPEEDSTEP_STATE
;
u32
function
=
GET_SPEEDSTEP_STATE
;
u32
result
,
state
,
edi
,
command
,
dummy
;
command
=
(
smi_sig
&
0xffffff00
)
|
(
smi_cmd
&
0xff
);
dprintk
(
"trying to determine current setting with command %x at port %x
\n
"
,
command
,
smi_port
);
dprintk
(
"trying to determine current setting with command %x "
"at port %x
\n
"
,
command
,
smi_port
);
__asm__
__volatile__
(
"push %%ebp
\n
"
"out %%al, (%%dx)
\n
"
"pop %%ebp
\n
"
:
"=a"
(
result
),
"=b"
(
state
),
"=D"
(
edi
),
"=c"
(
dummy
),
"=d"
(
dummy
),
"=S"
(
dummy
)
:
"a"
(
command
),
"b"
(
function
),
"c"
(
0
),
"d"
(
smi_port
),
"S"
(
0
),
"D"
(
0
)
:
"=a"
(
result
),
"=b"
(
state
),
"=D"
(
edi
),
"=c"
(
dummy
),
"=d"
(
dummy
),
"=S"
(
dummy
)
:
"a"
(
command
),
"b"
(
function
),
"c"
(
0
),
"d"
(
smi_port
),
"S"
(
0
),
"D"
(
0
)
);
dprintk
(
"state is %x, result is %x
\n
"
,
state
,
result
);
return
(
state
&
1
)
;
return
state
&
1
;
}
...
...
@@ -165,11 +180,11 @@ static int speedstep_get_state (void)
* @state: new processor frequency state (SPEEDSTEP_LOW or SPEEDSTEP_HIGH)
*
*/
static
void
speedstep_set_state
(
unsigned
int
state
)
static
void
speedstep_set_state
(
unsigned
int
state
)
{
unsigned
int
result
=
0
,
command
,
new_state
,
dummy
;
unsigned
long
flags
;
unsigned
int
function
=
SET_SPEEDSTEP_STATE
;
unsigned
int
function
=
SET_SPEEDSTEP_STATE
;
unsigned
int
retry
=
0
;
if
(
state
>
0x1
)
...
...
@@ -180,11 +195,14 @@ static void speedstep_set_state (unsigned int state)
command
=
(
smi_sig
&
0xffffff00
)
|
(
smi_cmd
&
0xff
);
dprintk
(
"trying to set frequency to state %u with command %x at port %x
\n
"
,
state
,
command
,
smi_port
);
dprintk
(
"trying to set frequency to state %u "
"with command %x at port %x
\n
"
,
state
,
command
,
smi_port
);
do
{
if
(
retry
)
{
dprintk
(
"retry %u, previous result %u, waiting...
\n
"
,
retry
,
result
);
dprintk
(
"retry %u, previous result %u, waiting...
\n
"
,
retry
,
result
);
mdelay
(
retry
*
50
);
}
retry
++
;
...
...
@@ -192,20 +210,26 @@ static void speedstep_set_state (unsigned int state)
"push %%ebp
\n
"
"out %%al, (%%dx)
\n
"
"pop %%ebp"
:
"=b"
(
new_state
),
"=D"
(
result
),
"=c"
(
dummy
),
"=a"
(
dummy
),
"=d"
(
dummy
),
"=S"
(
dummy
)
:
"a"
(
command
),
"b"
(
function
),
"c"
(
state
),
"d"
(
smi_port
),
"S"
(
0
),
"D"
(
0
)
:
"=b"
(
new_state
),
"=D"
(
result
),
"=c"
(
dummy
),
"=a"
(
dummy
),
"=d"
(
dummy
),
"=S"
(
dummy
)
:
"a"
(
command
),
"b"
(
function
),
"c"
(
state
),
"d"
(
smi_port
),
"S"
(
0
),
"D"
(
0
)
);
}
while
((
new_state
!=
state
)
&&
(
retry
<=
SMI_TRIES
));
/* enable IRQs */
local_irq_restore
(
flags
);
if
(
new_state
==
state
)
{
dprintk
(
"change to %u MHz succeeded after %u tries with result %u
\n
"
,
(
speedstep_freqs
[
new_state
].
frequency
/
1000
),
retry
,
result
);
}
else
{
printk
(
KERN_ERR
"cpufreq: change to state %u failed with new_state %u and result %u
\n
"
,
state
,
new_state
,
result
);
}
if
(
new_state
==
state
)
dprintk
(
"change to %u MHz succeeded after %u tries "
"with result %u
\n
"
,
(
speedstep_freqs
[
new_state
].
frequency
/
1000
),
retry
,
result
);
else
printk
(
KERN_ERR
"cpufreq: change to state %u "
"failed with new_state %u and result %u
\n
"
,
state
,
new_state
,
result
);
return
;
}
...
...
@@ -219,13 +243,14 @@ static void speedstep_set_state (unsigned int state)
*
* Sets a new CPUFreq policy/freq.
*/
static
int
speedstep_target
(
struct
cpufreq_policy
*
policy
,
static
int
speedstep_target
(
struct
cpufreq_policy
*
policy
,
unsigned
int
target_freq
,
unsigned
int
relation
)
{
unsigned
int
newstate
=
0
;
struct
cpufreq_freqs
freqs
;
if
(
cpufreq_frequency_table_target
(
policy
,
&
speedstep_freqs
[
0
],
target_freq
,
relation
,
&
newstate
))
if
(
cpufreq_frequency_table_target
(
policy
,
&
speedstep_freqs
[
0
],
target_freq
,
relation
,
&
newstate
))
return
-
EINVAL
;
freqs
.
old
=
speedstep_freqs
[
speedstep_get_state
()].
frequency
;
...
...
@@ -250,7 +275,7 @@ static int speedstep_target (struct cpufreq_policy *policy,
* Limit must be within speedstep_low_freq and speedstep_high_freq, with
* at least one border included.
*/
static
int
speedstep_verify
(
struct
cpufreq_policy
*
policy
)
static
int
speedstep_verify
(
struct
cpufreq_policy
*
policy
)
{
return
cpufreq_frequency_table_verify
(
policy
,
&
speedstep_freqs
[
0
]);
}
...
...
@@ -259,7 +284,8 @@ static int speedstep_verify (struct cpufreq_policy *policy)
static
int
speedstep_cpu_init
(
struct
cpufreq_policy
*
policy
)
{
int
result
;
unsigned
int
speed
,
state
;
unsigned
int
speed
,
state
;
unsigned
int
*
low
,
*
high
;
/* capability check */
if
(
policy
->
cpu
!=
0
)
...
...
@@ -272,19 +298,23 @@ static int speedstep_cpu_init(struct cpufreq_policy *policy)
}
/* detect low and high frequency */
result
=
speedstep_smi_get_freqs
(
&
speedstep_freqs
[
SPEEDSTEP_LOW
].
frequency
,
&
speedstep_freqs
[
SPEEDSTEP_HIGH
].
frequency
);
low
=
&
speedstep_freqs
[
SPEEDSTEP_LOW
].
frequency
;
high
=
&
speedstep_freqs
[
SPEEDSTEP_HIGH
].
frequency
;
result
=
speedstep_smi_get_freqs
(
low
,
high
);
if
(
result
)
{
/* fall back to speedstep_lib.c dection mechanism: try both states out */
dprintk
(
"could not detect low and high frequencies by SMI call.
\n
"
);
/* fall back to speedstep_lib.c dection mechanism:
* try both states out */
dprintk
(
"could not detect low and high frequencies "
"by SMI call.
\n
"
);
result
=
speedstep_get_freqs
(
speedstep_processor
,
&
speedstep_freqs
[
SPEEDSTEP_LOW
].
frequency
,
&
speedstep_freqs
[
SPEEDSTEP_HIGH
].
frequency
,
low
,
high
,
NULL
,
&
speedstep_set_state
);
if
(
result
)
{
dprintk
(
"could not detect two different speeds -- aborting.
\n
"
);
dprintk
(
"could not detect two different speeds"
" -- aborting.
\n
"
);
return
result
;
}
else
dprintk
(
"workaround worked.
\n
"
);
...
...
@@ -295,7 +325,8 @@ static int speedstep_cpu_init(struct cpufreq_policy *policy)
speed
=
speedstep_freqs
[
state
].
frequency
;
dprintk
(
"currently at %s speed setting - %i MHz
\n
"
,
(
speed
==
speedstep_freqs
[
SPEEDSTEP_LOW
].
frequency
)
?
"low"
:
"high"
,
(
speed
==
speedstep_freqs
[
SPEEDSTEP_LOW
].
frequency
)
?
"low"
:
"high"
,
(
speed
/
1000
));
/* cpuinfo and default policy values */
...
...
@@ -304,7 +335,7 @@ static int speedstep_cpu_init(struct cpufreq_policy *policy)
result
=
cpufreq_frequency_table_cpuinfo
(
policy
,
speedstep_freqs
);
if
(
result
)
return
(
result
)
;
return
result
;
cpufreq_frequency_table_get_attr
(
speedstep_freqs
,
policy
->
cpu
);
...
...
@@ -321,7 +352,7 @@ static unsigned int speedstep_get(unsigned int cpu)
{
if
(
cpu
)
return
-
ENODEV
;
return
speedstep_get_
processor_
frequency
(
speedstep_processor
);
return
speedstep_get_frequency
(
speedstep_processor
);
}
...
...
@@ -335,7 +366,7 @@ static int speedstep_resume(struct cpufreq_policy *policy)
return
result
;
}
static
struct
freq_attr
*
speedstep_attr
[]
=
{
static
struct
freq_attr
*
speedstep_attr
[]
=
{
&
cpufreq_freq_attr_scaling_available_freqs
,
NULL
,
};
...
...
@@ -364,21 +395,23 @@ static int __init speedstep_init(void)
speedstep_processor
=
speedstep_detect_processor
();
switch
(
speedstep_processor
)
{
case
SPEEDSTEP_
PROCESSOR
_PIII_T
:
case
SPEEDSTEP_
PROCESSOR
_PIII_C
:
case
SPEEDSTEP_
PROCESSOR
_PIII_C_EARLY
:
case
SPEEDSTEP_
CPU
_PIII_T
:
case
SPEEDSTEP_
CPU
_PIII_C
:
case
SPEEDSTEP_
CPU
_PIII_C_EARLY
:
break
;
default:
speedstep_processor
=
0
;
}
if
(
!
speedstep_processor
)
{
dprintk
(
"No supported Intel CPU detected.
\n
"
);
dprintk
(
"No supported Intel CPU detected.
\n
"
);
return
-
ENODEV
;
}
dprintk
(
"signature:0x%.8lx, command:0x%.8lx, event:0x%.8lx, perf_level:0x%.8lx.
\n
"
,
ist_info
.
signature
,
ist_info
.
command
,
ist_info
.
event
,
ist_info
.
perf_level
);
dprintk
(
"signature:0x%.8lx, command:0x%.8lx, "
"event:0x%.8lx, perf_level:0x%.8lx.
\n
"
,
ist_info
.
signature
,
ist_info
.
command
,
ist_info
.
event
,
ist_info
.
perf_level
);
/* Error if no IST-SMI BIOS or no PARM
sig= 'ISGE' aka 'Intel Speedstep Gate E' */
...
...
@@ -416,17 +449,20 @@ static void __exit speedstep_exit(void)
cpufreq_unregister_driver
(
&
speedstep_driver
);
}
module_param
(
smi_port
,
int
,
0444
);
module_param
(
smi_cmd
,
int
,
0444
);
module_param
(
smi_sig
,
uint
,
0444
);
module_param
(
smi_port
,
int
,
0444
);
module_param
(
smi_cmd
,
int
,
0444
);
module_param
(
smi_sig
,
uint
,
0444
);
MODULE_PARM_DESC
(
smi_port
,
"Override the BIOS-given IST port with this value -- Intel's default setting is 0xb2"
);
MODULE_PARM_DESC
(
smi_cmd
,
"Override the BIOS-given IST command with this value -- Intel's default setting is 0x82"
);
MODULE_PARM_DESC
(
smi_sig
,
"Set to 1 to fake the IST signature when using the SMI interface."
);
MODULE_PARM_DESC
(
smi_port
,
"Override the BIOS-given IST port with this value "
"-- Intel's default setting is 0xb2"
);
MODULE_PARM_DESC
(
smi_cmd
,
"Override the BIOS-given IST command with this value "
"-- Intel's default setting is 0x82"
);
MODULE_PARM_DESC
(
smi_sig
,
"Set to 1 to fake the IST signature when using the "
"SMI interface."
);
MODULE_AUTHOR
(
"Hiroshi Miura"
);
MODULE_DESCRIPTION
(
"Speedstep driver for IST applet SMI interface."
);
MODULE_LICENSE
(
"GPL"
);
MODULE_AUTHOR
(
"Hiroshi Miura"
);
MODULE_DESCRIPTION
(
"Speedstep driver for IST applet SMI interface."
);
MODULE_LICENSE
(
"GPL"
);
module_init
(
speedstep_init
);
module_exit
(
speedstep_exit
);
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment