Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
raspberrypi-kernel
提交
4eb5178c
R
raspberrypi-kernel
项目概览
openeuler
/
raspberrypi-kernel
通知
13
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
raspberrypi-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
4eb5178c
编写于
8月 23, 2013
作者:
R
Rafael J. Wysocki
浏览文件
操作
浏览文件
下载
差异文件
Merge back earlier 'pm-cpufreq' material.
上级
b36f4be3
5025d628
变更
59
展开全部
隐藏空白更改
内联
并排
Showing
59 changed file
with
691 addition
and
854 deletion
+691
-854
Documentation/cpu-freq/cpu-drivers.txt
Documentation/cpu-freq/cpu-drivers.txt
+0
-2
arch/x86/include/asm/processor.h
arch/x86/include/asm/processor.h
+0
-29
drivers/cpufreq/Kconfig.arm
drivers/cpufreq/Kconfig.arm
+24
-12
drivers/cpufreq/Makefile
drivers/cpufreq/Makefile
+1
-1
drivers/cpufreq/acpi-cpufreq.c
drivers/cpufreq/acpi-cpufreq.c
+3
-9
drivers/cpufreq/at32ap-cpufreq.c
drivers/cpufreq/at32ap-cpufreq.c
+0
-1
drivers/cpufreq/blackfin-cpufreq.c
drivers/cpufreq/blackfin-cpufreq.c
+0
-1
drivers/cpufreq/cpufreq-cpu0.c
drivers/cpufreq/cpufreq-cpu0.c
+4
-5
drivers/cpufreq/cpufreq-nforce2.c
drivers/cpufreq/cpufreq-nforce2.c
+0
-1
drivers/cpufreq/cpufreq.c
drivers/cpufreq/cpufreq.c
+393
-345
drivers/cpufreq/cpufreq_conservative.c
drivers/cpufreq/cpufreq_conservative.c
+1
-13
drivers/cpufreq/cpufreq_governor.c
drivers/cpufreq/cpufreq_governor.c
+1
-15
drivers/cpufreq/cpufreq_governor.h
drivers/cpufreq/cpufreq_governor.h
+3
-5
drivers/cpufreq/cpufreq_ondemand.c
drivers/cpufreq/cpufreq_ondemand.c
+14
-49
drivers/cpufreq/cpufreq_performance.c
drivers/cpufreq/cpufreq_performance.c
+1
-2
drivers/cpufreq/cpufreq_powersave.c
drivers/cpufreq/cpufreq_powersave.c
+1
-2
drivers/cpufreq/cpufreq_stats.c
drivers/cpufreq/cpufreq_stats.c
+8
-23
drivers/cpufreq/cris-artpec3-cpufreq.c
drivers/cpufreq/cris-artpec3-cpufreq.c
+0
-1
drivers/cpufreq/cris-etraxfs-cpufreq.c
drivers/cpufreq/cris-etraxfs-cpufreq.c
+0
-1
drivers/cpufreq/e_powersaver.c
drivers/cpufreq/e_powersaver.c
+2
-3
drivers/cpufreq/elanfreq.c
drivers/cpufreq/elanfreq.c
+0
-1
drivers/cpufreq/exynos-cpufreq.c
drivers/cpufreq/exynos-cpufreq.c
+1
-2
drivers/cpufreq/exynos-cpufreq.h
drivers/cpufreq/exynos-cpufreq.h
+21
-0
drivers/cpufreq/exynos5440-cpufreq.c
drivers/cpufreq/exynos5440-cpufreq.c
+3
-0
drivers/cpufreq/freq_table.c
drivers/cpufreq/freq_table.c
+1
-3
drivers/cpufreq/gx-suspmod.c
drivers/cpufreq/gx-suspmod.c
+2
-3
drivers/cpufreq/ia64-acpi-cpufreq.c
drivers/cpufreq/ia64-acpi-cpufreq.c
+2
-3
drivers/cpufreq/intel_pstate.c
drivers/cpufreq/intel_pstate.c
+0
-1
drivers/cpufreq/kirkwood-cpufreq.c
drivers/cpufreq/kirkwood-cpufreq.c
+0
-1
drivers/cpufreq/longhaul.c
drivers/cpufreq/longhaul.c
+0
-1
drivers/cpufreq/longrun.c
drivers/cpufreq/longrun.c
+0
-1
drivers/cpufreq/loongson2_cpufreq.c
drivers/cpufreq/loongson2_cpufreq.c
+0
-1
drivers/cpufreq/maple-cpufreq.c
drivers/cpufreq/maple-cpufreq.c
+0
-1
drivers/cpufreq/mperf.c
drivers/cpufreq/mperf.c
+0
-51
drivers/cpufreq/mperf.h
drivers/cpufreq/mperf.h
+0
-9
drivers/cpufreq/p4-clockmod.c
drivers/cpufreq/p4-clockmod.c
+0
-1
drivers/cpufreq/pasemi-cpufreq.c
drivers/cpufreq/pasemi-cpufreq.c
+0
-1
drivers/cpufreq/pcc-cpufreq.c
drivers/cpufreq/pcc-cpufreq.c
+0
-1
drivers/cpufreq/pmac32-cpufreq.c
drivers/cpufreq/pmac32-cpufreq.c
+0
-1
drivers/cpufreq/pmac64-cpufreq.c
drivers/cpufreq/pmac64-cpufreq.c
+2
-4
drivers/cpufreq/powernow-k6.c
drivers/cpufreq/powernow-k6.c
+0
-1
drivers/cpufreq/powernow-k7.c
drivers/cpufreq/powernow-k7.c
+6
-8
drivers/cpufreq/powernow-k8.c
drivers/cpufreq/powernow-k8.c
+3
-4
drivers/cpufreq/ppc-corenet-cpufreq.c
drivers/cpufreq/ppc-corenet-cpufreq.c
+0
-1
drivers/cpufreq/ppc_cbe_cpufreq.c
drivers/cpufreq/ppc_cbe_cpufreq.c
+0
-1
drivers/cpufreq/pxa2xx-cpufreq.c
drivers/cpufreq/pxa2xx-cpufreq.c
+2
-2
drivers/cpufreq/pxa3xx-cpufreq.c
drivers/cpufreq/pxa3xx-cpufreq.c
+4
-2
drivers/cpufreq/s3c2416-cpufreq.c
drivers/cpufreq/s3c2416-cpufreq.c
+0
-1
drivers/cpufreq/s3c24xx-cpufreq.c
drivers/cpufreq/s3c24xx-cpufreq.c
+4
-4
drivers/cpufreq/s3c64xx-cpufreq.c
drivers/cpufreq/s3c64xx-cpufreq.c
+0
-1
drivers/cpufreq/sc520_freq.c
drivers/cpufreq/sc520_freq.c
+0
-1
drivers/cpufreq/sh-cpufreq.c
drivers/cpufreq/sh-cpufreq.c
+0
-1
drivers/cpufreq/sparc-us2e-cpufreq.c
drivers/cpufreq/sparc-us2e-cpufreq.c
+2
-4
drivers/cpufreq/sparc-us3-cpufreq.c
drivers/cpufreq/sparc-us3-cpufreq.c
+2
-4
drivers/cpufreq/speedstep-centrino.c
drivers/cpufreq/speedstep-centrino.c
+0
-1
drivers/cpufreq/speedstep-ich.c
drivers/cpufreq/speedstep-ich.c
+0
-1
drivers/cpufreq/speedstep-smi.c
drivers/cpufreq/speedstep-smi.c
+0
-1
drivers/cpufreq/unicore2-cpufreq.c
drivers/cpufreq/unicore2-cpufreq.c
+1
-1
include/linux/cpufreq.h
include/linux/cpufreq.h
+179
-209
未找到文件。
Documentation/cpu-freq/cpu-drivers.txt
浏览文件 @
4eb5178c
...
...
@@ -50,8 +50,6 @@ What shall this struct cpufreq_driver contain?
cpufreq_driver.name - The name of this driver.
cpufreq_driver.owner - THIS_MODULE;
cpufreq_driver.init - A pointer to the per-CPU initialization
function.
...
...
arch/x86/include/asm/processor.h
浏览文件 @
4eb5178c
...
...
@@ -942,35 +942,6 @@ extern int set_tsc_mode(unsigned int val);
extern
u16
amd_get_nb_id
(
int
cpu
);
struct
aperfmperf
{
u64
aperf
,
mperf
;
};
static
inline
void
get_aperfmperf
(
struct
aperfmperf
*
am
)
{
WARN_ON_ONCE
(
!
boot_cpu_has
(
X86_FEATURE_APERFMPERF
));
rdmsrl
(
MSR_IA32_APERF
,
am
->
aperf
);
rdmsrl
(
MSR_IA32_MPERF
,
am
->
mperf
);
}
#define APERFMPERF_SHIFT 10
static
inline
unsigned
long
calc_aperfmperf_ratio
(
struct
aperfmperf
*
old
,
struct
aperfmperf
*
new
)
{
u64
aperf
=
new
->
aperf
-
old
->
aperf
;
u64
mperf
=
new
->
mperf
-
old
->
mperf
;
unsigned
long
ratio
=
aperf
;
mperf
>>=
APERFMPERF_SHIFT
;
if
(
mperf
)
ratio
=
div64_u64
(
aperf
,
mperf
);
return
ratio
;
}
extern
unsigned
long
arch_align_stack
(
unsigned
long
sp
);
extern
void
free_init_pages
(
char
*
what
,
unsigned
long
begin
,
unsigned
long
end
);
...
...
drivers/cpufreq/Kconfig.arm
浏览文件 @
4eb5178c
...
...
@@ -17,37 +17,47 @@ config ARM_DT_BL_CPUFREQ
big.LITTLE platform. This gets frequency tables from DT.
config ARM_EXYNOS_CPUFREQ
bool "SAMSUNG EXYNOS SoCs"
depends on ARCH_EXYNOS
bool
select CPU_FREQ_TABLE
default y
help
This adds the CPUFreq driver common part for Samsung
EXYNOS SoCs.
If in doubt, say N.
config ARM_EXYNOS4210_CPUFREQ
def_bool CPU_EXYNOS4210
bool "SAMSUNG EXYNOS4210"
depends on CPU_EXYNOS4210
default y
select ARM_EXYNOS_CPUFREQ
help
This adds the CPUFreq driver for Samsung EXYNOS4210
SoC (S5PV310 or S5PC210).
If in doubt, say N.
config ARM_EXYNOS4X12_CPUFREQ
def_bool (SOC_EXYNOS4212 || SOC_EXYNOS4412)
bool "SAMSUNG EXYNOS4x12"
depends on (SOC_EXYNOS4212 || SOC_EXYNOS4412)
default y
select ARM_EXYNOS_CPUFREQ
help
This adds the CPUFreq driver for Samsung EXYNOS4X12
SoC (EXYNOS4212 or EXYNOS4412).
If in doubt, say N.
config ARM_EXYNOS5250_CPUFREQ
def_bool SOC_EXYNOS5250
bool "SAMSUNG EXYNOS5250"
depends on SOC_EXYNOS5250
default y
select ARM_EXYNOS_CPUFREQ
help
This adds the CPUFreq driver for Samsung EXYNOS5250
SoC.
If in doubt, say N.
config ARM_EXYNOS5440_CPUFREQ
def_bool SOC_EXYNOS5440
bool "SAMSUNG EXYNOS5440"
depends on SOC_EXYNOS5440
depends on HAVE_CLK && PM_OPP && OF
default y
select CPU_FREQ_TABLE
help
This adds the CPUFreq driver for Samsung EXYNOS5440
...
...
@@ -55,6 +65,8 @@ config ARM_EXYNOS5440_CPUFREQ
different than previous exynos controllers so not using
the common exynos framework.
If in doubt, say N.
config ARM_HIGHBANK_CPUFREQ
tristate "Calxeda Highbank-based"
depends on ARCH_HIGHBANK
...
...
drivers/cpufreq/Makefile
浏览文件 @
4eb5178c
...
...
@@ -23,7 +23,7 @@ obj-$(CONFIG_GENERIC_CPUFREQ_CPU0) += cpufreq-cpu0.o
# powernow-k8 can load then. ACPI is preferred to all other hardware-specific drivers.
# speedstep-* is preferred over p4-clockmod.
obj-$(CONFIG_X86_ACPI_CPUFREQ)
+=
acpi-cpufreq.o
mperf.o
obj-$(CONFIG_X86_ACPI_CPUFREQ)
+=
acpi-cpufreq.o
obj-$(CONFIG_X86_POWERNOW_K8)
+=
powernow-k8.o
obj-$(CONFIG_X86_PCC_CPUFREQ)
+=
pcc-cpufreq.o
obj-$(CONFIG_X86_POWERNOW_K6)
+=
powernow-k6.o
...
...
drivers/cpufreq/acpi-cpufreq.c
浏览文件 @
4eb5178c
...
...
@@ -45,7 +45,6 @@
#include <asm/msr.h>
#include <asm/processor.h>
#include <asm/cpufeature.h>
#include "mperf.h"
MODULE_AUTHOR
(
"Paul Diefenbaugh, Dominik Brodowski"
);
MODULE_DESCRIPTION
(
"ACPI Processor P-States Driver"
);
...
...
@@ -198,7 +197,7 @@ static ssize_t show_cpb(struct cpufreq_policy *policy, char *buf)
return
sprintf
(
buf
,
"%u
\n
"
,
boost_enabled
);
}
static
struct
freq_attr
cpb
=
__ATTR
(
cpb
,
0644
,
show_cpb
,
store_
cpb
);
cpufreq_freq_attr_rw
(
cpb
);
#endif
static
int
check_est_cpu
(
unsigned
int
cpuid
)
...
...
@@ -710,7 +709,7 @@ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy)
return
blacklisted
;
#endif
data
=
kzalloc
(
sizeof
(
struct
acpi_cpufreq_
data
),
GFP_KERNEL
);
data
=
kzalloc
(
sizeof
(
*
data
),
GFP_KERNEL
);
if
(
!
data
)
return
-
ENOMEM
;
...
...
@@ -800,7 +799,7 @@ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy)
goto
err_unreg
;
}
data
->
freq_table
=
kmalloc
(
sizeof
(
struct
cpufreq_frequency
_table
)
*
data
->
freq_table
=
kmalloc
(
sizeof
(
*
data
->
freq
_table
)
*
(
perf
->
state_count
+
1
),
GFP_KERNEL
);
if
(
!
data
->
freq_table
)
{
result
=
-
ENOMEM
;
...
...
@@ -861,10 +860,6 @@ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy)
/* notify BIOS that we exist */
acpi_processor_notify_smm
(
THIS_MODULE
);
/* Check for APERF/MPERF support in hardware */
if
(
boot_cpu_has
(
X86_FEATURE_APERFMPERF
))
acpi_cpufreq_driver
.
getavg
=
cpufreq_get_measured_perf
;
pr_debug
(
"CPU%u - ACPI performance management activated.
\n
"
,
cpu
);
for
(
i
=
0
;
i
<
perf
->
state_count
;
i
++
)
pr_debug
(
" %cP%d: %d MHz, %d mW, %d uS
\n
"
,
...
...
@@ -941,7 +936,6 @@ static struct cpufreq_driver acpi_cpufreq_driver = {
.
exit
=
acpi_cpufreq_cpu_exit
,
.
resume
=
acpi_cpufreq_resume
,
.
name
=
"acpi-cpufreq"
,
.
owner
=
THIS_MODULE
,
.
attr
=
acpi_cpufreq_attr
,
};
...
...
drivers/cpufreq/at32ap-cpufreq.c
浏览文件 @
4eb5178c
...
...
@@ -108,7 +108,6 @@ static int __init at32_cpufreq_driver_init(struct cpufreq_policy *policy)
static
struct
cpufreq_driver
at32_driver
=
{
.
name
=
"at32ap"
,
.
owner
=
THIS_MODULE
,
.
init
=
at32_cpufreq_driver_init
,
.
verify
=
at32_verify_speed
,
.
target
=
at32_set_target
,
...
...
drivers/cpufreq/blackfin-cpufreq.c
浏览文件 @
4eb5178c
...
...
@@ -225,7 +225,6 @@ static struct cpufreq_driver bfin_driver = {
.
get
=
bfin_getfreq_khz
,
.
init
=
__bfin_cpu_init
,
.
name
=
"bfin cpufreq"
,
.
owner
=
THIS_MODULE
,
.
attr
=
bfin_freq_attr
,
};
...
...
drivers/cpufreq/cpufreq-cpu0.c
浏览文件 @
4eb5178c
...
...
@@ -69,7 +69,7 @@ static int cpu0_set_target(struct cpufreq_policy *policy,
cpufreq_notify_transition
(
policy
,
&
freqs
,
CPUFREQ_PRECHANGE
);
if
(
cpu_reg
)
{
if
(
!
IS_ERR
(
cpu_reg
)
)
{
rcu_read_lock
();
opp
=
opp_find_freq_ceil
(
cpu_dev
,
&
freq_Hz
);
if
(
IS_ERR
(
opp
))
{
...
...
@@ -90,7 +90,7 @@ static int cpu0_set_target(struct cpufreq_policy *policy,
freqs
.
new
/
1000
,
volt
?
volt
/
1000
:
-
1
);
/* scaling up? scale voltage before frequency */
if
(
cpu_reg
&&
freqs
.
new
>
freqs
.
old
)
{
if
(
!
IS_ERR
(
cpu_reg
)
&&
freqs
.
new
>
freqs
.
old
)
{
ret
=
regulator_set_voltage_tol
(
cpu_reg
,
volt
,
tol
);
if
(
ret
)
{
pr_err
(
"failed to scale voltage up: %d
\n
"
,
ret
);
...
...
@@ -102,14 +102,14 @@ static int cpu0_set_target(struct cpufreq_policy *policy,
ret
=
clk_set_rate
(
cpu_clk
,
freq_exact
);
if
(
ret
)
{
pr_err
(
"failed to set clock rate: %d
\n
"
,
ret
);
if
(
cpu_reg
)
if
(
!
IS_ERR
(
cpu_reg
)
)
regulator_set_voltage_tol
(
cpu_reg
,
volt_old
,
tol
);
freqs
.
new
=
freqs
.
old
;
goto
post_notify
;
}
/* scaling down? scale voltage after frequency */
if
(
cpu_reg
&&
freqs
.
new
<
freqs
.
old
)
{
if
(
!
IS_ERR
(
cpu_reg
)
&&
freqs
.
new
<
freqs
.
old
)
{
ret
=
regulator_set_voltage_tol
(
cpu_reg
,
volt
,
tol
);
if
(
ret
)
{
pr_err
(
"failed to scale voltage down: %d
\n
"
,
ret
);
...
...
@@ -210,7 +210,6 @@ static int cpu0_cpufreq_probe(struct platform_device *pdev)
}
pr_warn
(
"failed to get cpu0 regulator: %ld
\n
"
,
PTR_ERR
(
cpu_reg
));
cpu_reg
=
NULL
;
}
cpu_clk
=
devm_clk_get
(
cpu_dev
,
NULL
);
...
...
drivers/cpufreq/cpufreq-nforce2.c
浏览文件 @
4eb5178c
...
...
@@ -379,7 +379,6 @@ static struct cpufreq_driver nforce2_driver = {
.
get
=
nforce2_get
,
.
init
=
nforce2_cpu_init
,
.
exit
=
nforce2_cpu_exit
,
.
owner
=
THIS_MODULE
,
};
#ifdef MODULE
...
...
drivers/cpufreq/cpufreq.c
浏览文件 @
4eb5178c
此差异已折叠。
点击以展开。
drivers/cpufreq/cpufreq_conservative.c
浏览文件 @
4eb5178c
...
...
@@ -11,19 +11,7 @@
* published by the Free Software Foundation.
*/
#include <linux/cpufreq.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/kernel_stat.h>
#include <linux/kobject.h>
#include <linux/module.h>
#include <linux/mutex.h>
#include <linux/notifier.h>
#include <linux/percpu-defs.h>
#include <linux/slab.h>
#include <linux/sysfs.h>
#include <linux/types.h>
#include "cpufreq_governor.h"
/* Conservative governor macros */
...
...
@@ -329,7 +317,7 @@ static int cs_init(struct dbs_data *dbs_data)
{
struct
cs_dbs_tuners
*
tuners
;
tuners
=
kzalloc
(
sizeof
(
struct
cs_dbs_
tuners
),
GFP_KERNEL
);
tuners
=
kzalloc
(
sizeof
(
*
tuners
),
GFP_KERNEL
);
if
(
!
tuners
)
{
pr_err
(
"%s: kzalloc failed
\n
"
,
__func__
);
return
-
ENOMEM
;
...
...
drivers/cpufreq/cpufreq_governor.c
浏览文件 @
4eb5178c
...
...
@@ -16,15 +16,9 @@
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
#include <asm/cputime.h>
#include <linux/cpufreq.h>
#include <linux/cpumask.h>
#include <linux/export.h>
#include <linux/kernel_stat.h>
#include <linux/mutex.h>
#include <linux/slab.h>
#include <linux/types.h>
#include <linux/workqueue.h>
#include "cpufreq_governor.h"
...
...
@@ -53,7 +47,7 @@ void dbs_check_cpu(struct dbs_data *dbs_data, int cpu)
policy
=
cdbs
->
cur_policy
;
/* Get Absolute Load
(in terms of freq for ondemand gov)
*/
/* Get Absolute Load */
for_each_cpu
(
j
,
policy
->
cpus
)
{
struct
cpu_dbs_common_info
*
j_cdbs
;
u64
cur_wall_time
,
cur_idle_time
;
...
...
@@ -104,14 +98,6 @@ void dbs_check_cpu(struct dbs_data *dbs_data, int cpu)
load
=
100
*
(
wall_time
-
idle_time
)
/
wall_time
;
if
(
dbs_data
->
cdata
->
governor
==
GOV_ONDEMAND
)
{
int
freq_avg
=
__cpufreq_driver_getavg
(
policy
,
j
);
if
(
freq_avg
<=
0
)
freq_avg
=
policy
->
cur
;
load
*=
freq_avg
;
}
if
(
load
>
max_load
)
max_load
=
load
;
}
...
...
drivers/cpufreq/cpufreq_governor.h
浏览文件 @
4eb5178c
...
...
@@ -18,10 +18,9 @@
#define _CPUFREQ_GOVERNOR_H
#include <linux/cpufreq.h>
#include <linux/kobject.h>
#include <linux/kernel_stat.h>
#include <linux/module.h>
#include <linux/mutex.h>
#include <linux/workqueue.h>
#include <linux/sysfs.h>
/*
* The polling frequency depends on the capability of the processor. Default
...
...
@@ -169,7 +168,6 @@ struct od_dbs_tuners {
unsigned
int
sampling_rate
;
unsigned
int
sampling_down_factor
;
unsigned
int
up_threshold
;
unsigned
int
adj_up_threshold
;
unsigned
int
powersave_bias
;
unsigned
int
io_is_busy
;
};
...
...
@@ -223,7 +221,7 @@ struct od_ops {
void
(
*
powersave_bias_init_cpu
)(
int
cpu
);
unsigned
int
(
*
powersave_bias_target
)(
struct
cpufreq_policy
*
policy
,
unsigned
int
freq_next
,
unsigned
int
relation
);
void
(
*
freq_increase
)(
struct
cpufreq_policy
*
p
,
unsigned
int
freq
);
void
(
*
freq_increase
)(
struct
cpufreq_policy
*
p
olicy
,
unsigned
int
freq
);
};
struct
cs_ops
{
...
...
drivers/cpufreq/cpufreq_ondemand.c
浏览文件 @
4eb5178c
...
...
@@ -12,28 +12,16 @@
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
#include <linux/cpufreq.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/kernel_stat.h>
#include <linux/kobject.h>
#include <linux/module.h>
#include <linux/mutex.h>
#include <linux/cpu.h>
#include <linux/percpu-defs.h>
#include <linux/slab.h>
#include <linux/sysfs.h>
#include <linux/tick.h>
#include <linux/types.h>
#include <linux/cpu.h>
#include "cpufreq_governor.h"
/* On-demand governor macros */
#define DEF_FREQUENCY_DOWN_DIFFERENTIAL (10)
#define DEF_FREQUENCY_UP_THRESHOLD (80)
#define DEF_SAMPLING_DOWN_FACTOR (1)
#define MAX_SAMPLING_DOWN_FACTOR (100000)
#define MICRO_FREQUENCY_DOWN_DIFFERENTIAL (3)
#define MICRO_FREQUENCY_UP_THRESHOLD (95)
#define MICRO_FREQUENCY_MIN_SAMPLE_RATE (10000)
#define MIN_FREQUENCY_UP_THRESHOLD (11)
...
...
@@ -144,31 +132,27 @@ static void ondemand_powersave_bias_init(void)
}
}
static
void
dbs_freq_increase
(
struct
cpufreq_policy
*
p
,
unsigned
int
freq
)
static
void
dbs_freq_increase
(
struct
cpufreq_policy
*
p
olicy
,
unsigned
int
freq
)
{
struct
dbs_data
*
dbs_data
=
p
->
governor_data
;
struct
dbs_data
*
dbs_data
=
p
olicy
->
governor_data
;
struct
od_dbs_tuners
*
od_tuners
=
dbs_data
->
tuners
;
if
(
od_tuners
->
powersave_bias
)
freq
=
od_ops
.
powersave_bias_target
(
p
,
freq
,
freq
=
od_ops
.
powersave_bias_target
(
p
olicy
,
freq
,
CPUFREQ_RELATION_H
);
else
if
(
p
->
cur
==
p
->
max
)
else
if
(
p
olicy
->
cur
==
policy
->
max
)
return
;
__cpufreq_driver_target
(
p
,
freq
,
od_tuners
->
powersave_bias
?
__cpufreq_driver_target
(
p
olicy
,
freq
,
od_tuners
->
powersave_bias
?
CPUFREQ_RELATION_L
:
CPUFREQ_RELATION_H
);
}
/*
* Every sampling_rate, we check, if current idle time is less than 20%
* (default), then we try to increase frequency. Every sampling_rate, we look
* for the lowest frequency which can sustain the load while keeping idle time
* over 30%. If such a frequency exist, we try to decrease to this frequency.
*
* Any frequency increase takes it to the maximum frequency. Frequency reduction
* happens at minimum steps of 5% (default) of current frequency
* (default), then we try to increase frequency. Else, we adjust the frequency
* proportional to load.
*/
static
void
od_check_cpu
(
int
cpu
,
unsigned
int
load
_freq
)
static
void
od_check_cpu
(
int
cpu
,
unsigned
int
load
)
{
struct
od_cpu_dbs_info_s
*
dbs_info
=
&
per_cpu
(
od_cpu_dbs_info
,
cpu
);
struct
cpufreq_policy
*
policy
=
dbs_info
->
cdbs
.
cur_policy
;
...
...
@@ -178,29 +162,17 @@ static void od_check_cpu(int cpu, unsigned int load_freq)
dbs_info
->
freq_lo
=
0
;
/* Check for frequency increase */
if
(
load
_freq
>
od_tuners
->
up_threshold
*
policy
->
cur
)
{
if
(
load
>
od_tuners
->
up_threshold
)
{
/* If switching to max speed, apply sampling_down_factor */
if
(
policy
->
cur
<
policy
->
max
)
dbs_info
->
rate_mult
=
od_tuners
->
sampling_down_factor
;
dbs_freq_increase
(
policy
,
policy
->
max
);
return
;
}
/* Check for frequency decrease */
/* if we cannot reduce the frequency anymore, break out early */
if
(
policy
->
cur
==
policy
->
min
)
return
;
/*
* The optimal frequency is the frequency that is the lowest that can
* support the current CPU usage without triggering the up policy. To be
* safe, we focus 10 points under the threshold.
*/
if
(
load_freq
<
od_tuners
->
adj_up_threshold
*
policy
->
cur
)
{
}
else
{
/* Calculate the next frequency proportional to load */
unsigned
int
freq_next
;
freq_next
=
load
_freq
/
od_tuners
->
adj_up_threshold
;
freq_next
=
load
*
policy
->
cpuinfo
.
max_freq
/
100
;
/* No longer fully busy, reset rate_mult */
dbs_info
->
rate_mult
=
1
;
...
...
@@ -374,9 +346,6 @@ static ssize_t store_up_threshold(struct dbs_data *dbs_data, const char *buf,
input
<
MIN_FREQUENCY_UP_THRESHOLD
)
{
return
-
EINVAL
;
}
/* Calculate the new adj_up_threshold */
od_tuners
->
adj_up_threshold
+=
input
;
od_tuners
->
adj_up_threshold
-=
od_tuners
->
up_threshold
;
od_tuners
->
up_threshold
=
input
;
return
count
;
...
...
@@ -513,7 +482,7 @@ static int od_init(struct dbs_data *dbs_data)
u64
idle_time
;
int
cpu
;
tuners
=
kzalloc
(
sizeof
(
struct
od_dbs_
tuners
),
GFP_KERNEL
);
tuners
=
kzalloc
(
sizeof
(
*
tuners
),
GFP_KERNEL
);
if
(
!
tuners
)
{
pr_err
(
"%s: kzalloc failed
\n
"
,
__func__
);
return
-
ENOMEM
;
...
...
@@ -525,8 +494,6 @@ static int od_init(struct dbs_data *dbs_data)
if
(
idle_time
!=
-
1ULL
)
{
/* Idle micro accounting is supported. Use finer thresholds */
tuners
->
up_threshold
=
MICRO_FREQUENCY_UP_THRESHOLD
;
tuners
->
adj_up_threshold
=
MICRO_FREQUENCY_UP_THRESHOLD
-
MICRO_FREQUENCY_DOWN_DIFFERENTIAL
;
/*
* In nohz/micro accounting case we set the minimum frequency
* not depending on HZ, but fixed (very low). The deferred
...
...
@@ -535,8 +502,6 @@ static int od_init(struct dbs_data *dbs_data)
dbs_data
->
min_sampling_rate
=
MICRO_FREQUENCY_MIN_SAMPLE_RATE
;
}
else
{
tuners
->
up_threshold
=
DEF_FREQUENCY_UP_THRESHOLD
;
tuners
->
adj_up_threshold
=
DEF_FREQUENCY_UP_THRESHOLD
-
DEF_FREQUENCY_DOWN_DIFFERENTIAL
;
/* For correct statistics, we need 10 ticks for each measure */
dbs_data
->
min_sampling_rate
=
MIN_SAMPLING_RATE_RATIO
*
...
...
drivers/cpufreq/cpufreq_performance.c
浏览文件 @
4eb5178c
...
...
@@ -12,10 +12,9 @@
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/cpufreq.h>
#include <linux/init.h>
#include <linux/module.h>
static
int
cpufreq_governor_performance
(
struct
cpufreq_policy
*
policy
,
unsigned
int
event
)
...
...
drivers/cpufreq/cpufreq_powersave.c
浏览文件 @
4eb5178c
...
...
@@ -12,10 +12,9 @@
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/cpufreq.h>
#include <linux/init.h>
#include <linux/module.h>
static
int
cpufreq_governor_powersave
(
struct
cpufreq_policy
*
policy
,
unsigned
int
event
)
...
...
drivers/cpufreq/cpufreq_stats.c
浏览文件 @
4eb5178c
...
...
@@ -9,17 +9,10 @@
* published by the Free Software Foundation.
*/
#include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/cpu.h>
#include <linux/sysfs.h>
#include <linux/cpufreq.h>
#include <linux/module.h>
#include <linux/jiffies.h>
#include <linux/percpu.h>
#include <linux/kobject.h>
#include <linux/spinlock.h>
#include <linux/notifier.h>
#include <linux/slab.h>
#include <asm/cputime.h>
static
spinlock_t
cpufreq_stats_lock
;
...
...
@@ -200,22 +193,22 @@ static int cpufreq_stats_create_table(struct cpufreq_policy *policy,
{
unsigned
int
i
,
j
,
count
=
0
,
ret
=
0
;
struct
cpufreq_stats
*
stat
;
struct
cpufreq_policy
*
data
;
struct
cpufreq_policy
*
current_policy
;
unsigned
int
alloc_size
;
unsigned
int
cpu
=
policy
->
cpu
;
if
(
per_cpu
(
cpufreq_stats_table
,
cpu
))
return
-
EBUSY
;
stat
=
kzalloc
(
sizeof
(
struct
cpufreq_stats
),
GFP_KERNEL
);
stat
=
kzalloc
(
sizeof
(
*
stat
),
GFP_KERNEL
);
if
((
stat
)
==
NULL
)
return
-
ENOMEM
;
data
=
cpufreq_cpu_get
(
cpu
);
if
(
data
==
NULL
)
{
current_policy
=
cpufreq_cpu_get
(
cpu
);
if
(
current_policy
==
NULL
)
{
ret
=
-
EINVAL
;
goto
error_get_fail
;
}
ret
=
sysfs_create_group
(
&
data
->
kobj
,
&
stats_attr_group
);
ret
=
sysfs_create_group
(
&
current_policy
->
kobj
,
&
stats_attr_group
);
if
(
ret
)
goto
error_out
;
...
...
@@ -258,10 +251,10 @@ static int cpufreq_stats_create_table(struct cpufreq_policy *policy,
stat
->
last_time
=
get_jiffies_64
();
stat
->
last_index
=
freq_table_get_index
(
stat
,
policy
->
cur
);
spin_unlock
(
&
cpufreq_stats_lock
);
cpufreq_cpu_put
(
data
);
cpufreq_cpu_put
(
current_policy
);
return
0
;
error_out:
cpufreq_cpu_put
(
data
);
cpufreq_cpu_put
(
current_policy
);
error_get_fail:
kfree
(
stat
);
per_cpu
(
cpufreq_stats_table
,
cpu
)
=
NULL
;
...
...
@@ -348,16 +341,10 @@ static int cpufreq_stat_cpu_callback(struct notifier_block *nfb,
unsigned
int
cpu
=
(
unsigned
long
)
hcpu
;
switch
(
action
)
{
case
CPU_ONLINE
:
case
CPU_ONLINE_FROZEN
:
cpufreq_update_policy
(
cpu
);
break
;
case
CPU_DOWN_PREPARE
:
case
CPU_DOWN_PREPARE_FROZEN
:
cpufreq_stats_free_sysfs
(
cpu
);
break
;
case
CPU_DEAD
:
case
CPU_DEAD_FROZEN
:
cpufreq_stats_free_table
(
cpu
);
break
;
}
...
...
@@ -390,8 +377,6 @@ static int __init cpufreq_stats_init(void)
return
ret
;
register_hotcpu_notifier
(
&
cpufreq_stat_cpu_notifier
);
for_each_online_cpu
(
cpu
)
cpufreq_update_policy
(
cpu
);
ret
=
cpufreq_register_notifier
(
&
notifier_trans_block
,
CPUFREQ_TRANSITION_NOTIFIER
);
...
...
drivers/cpufreq/cris-artpec3-cpufreq.c
浏览文件 @
4eb5178c
...
...
@@ -111,7 +111,6 @@ static struct cpufreq_driver cris_freq_driver = {
.
init
=
cris_freq_cpu_init
,
.
exit
=
cris_freq_cpu_exit
,
.
name
=
"cris_freq"
,
.
owner
=
THIS_MODULE
,
.
attr
=
cris_freq_attr
,
};
...
...
drivers/cpufreq/cris-etraxfs-cpufreq.c
浏览文件 @
4eb5178c
...
...
@@ -108,7 +108,6 @@ static struct cpufreq_driver cris_freq_driver = {
.
init
=
cris_freq_cpu_init
,
.
exit
=
cris_freq_cpu_exit
,
.
name
=
"cris_freq"
,
.
owner
=
THIS_MODULE
,
.
attr
=
cris_freq_attr
,
};
...
...
drivers/cpufreq/e_powersaver.c
浏览文件 @
4eb5178c
...
...
@@ -54,7 +54,7 @@ static struct acpi_processor_performance *eps_acpi_cpu_perf;
/* Minimum necessary to get acpi_processor_get_bios_limit() working */
static
int
eps_acpi_init
(
void
)
{
eps_acpi_cpu_perf
=
kzalloc
(
sizeof
(
struct
acpi_processor_performance
),
eps_acpi_cpu_perf
=
kzalloc
(
sizeof
(
*
eps_acpi_cpu_perf
),
GFP_KERNEL
);
if
(
!
eps_acpi_cpu_perf
)
return
-
ENOMEM
;
...
...
@@ -366,7 +366,7 @@ static int eps_cpu_init(struct cpufreq_policy *policy)
states
=
2
;
/* Allocate private data and frequency table for current cpu */
centaur
=
kzalloc
(
sizeof
(
struct
eps_cpu_data
)
centaur
=
kzalloc
(
sizeof
(
*
centaur
)
+
(
states
+
1
)
*
sizeof
(
struct
cpufreq_frequency_table
),
GFP_KERNEL
);
if
(
!
centaur
)
...
...
@@ -436,7 +436,6 @@ static struct cpufreq_driver eps_driver = {
.
exit
=
eps_cpu_exit
,
.
get
=
eps_get
,
.
name
=
"e_powersaver"
,
.
owner
=
THIS_MODULE
,
.
attr
=
eps_attr
,
};
...
...
drivers/cpufreq/elanfreq.c
浏览文件 @
4eb5178c
...
...
@@ -274,7 +274,6 @@ static struct cpufreq_driver elanfreq_driver = {
.
init
=
elanfreq_cpu_init
,
.
exit
=
elanfreq_cpu_exit
,
.
name
=
"elanfreq"
,
.
owner
=
THIS_MODULE
,
.
attr
=
elanfreq_attr
,
};
...
...
drivers/cpufreq/exynos-cpufreq.c
浏览文件 @
4eb5178c
...
...
@@ -289,7 +289,7 @@ static int __init exynos_cpufreq_init(void)
{
int
ret
=
-
EINVAL
;
exynos_info
=
kzalloc
(
sizeof
(
struct
exynos_dvf
s_info
),
GFP_KERNEL
);
exynos_info
=
kzalloc
(
sizeof
(
*
exyno
s_info
),
GFP_KERNEL
);
if
(
!
exynos_info
)
return
-
ENOMEM
;
...
...
@@ -332,7 +332,6 @@ static int __init exynos_cpufreq_init(void)
regulator_put
(
arm_regulator
);
err_vdd_arm:
kfree
(
exynos_info
);
pr_debug
(
"%s: failed initialization
\n
"
,
__func__
);
return
-
EINVAL
;
}
late_initcall
(
exynos_cpufreq_init
);
drivers/cpufreq/exynos-cpufreq.h
浏览文件 @
4eb5178c
...
...
@@ -43,6 +43,27 @@ struct exynos_dvfs_info {
bool
(
*
need_apll_change
)(
unsigned
int
,
unsigned
int
);
};
#ifdef CONFIG_ARM_EXYNOS4210_CPUFREQ
extern
int
exynos4210_cpufreq_init
(
struct
exynos_dvfs_info
*
);
#else
static
inline
int
exynos4210_cpufreq_init
(
struct
exynos_dvfs_info
*
info
)
{
return
-
EOPNOTSUPP
;
}
#endif
#ifdef CONFIG_ARM_EXYNOS4X12_CPUFREQ
extern
int
exynos4x12_cpufreq_init
(
struct
exynos_dvfs_info
*
);
#else
static
inline
int
exynos4x12_cpufreq_init
(
struct
exynos_dvfs_info
*
info
)
{
return
-
EOPNOTSUPP
;
}
#endif
#ifdef CONFIG_ARM_EXYNOS5250_CPUFREQ
extern
int
exynos5250_cpufreq_init
(
struct
exynos_dvfs_info
*
);
#else
static
inline
int
exynos5250_cpufreq_init
(
struct
exynos_dvfs_info
*
info
)
{
return
-
EOPNOTSUPP
;
}
#endif
drivers/cpufreq/exynos5440-cpufreq.c
浏览文件 @
4eb5178c
...
...
@@ -238,6 +238,9 @@ static int exynos_target(struct cpufreq_policy *policy,
freqs
.
old
=
dvfs_info
->
cur_frequency
;
freqs
.
new
=
freq_table
[
index
].
frequency
;
if
(
freqs
.
old
==
freqs
.
new
)
goto
out
;
cpufreq_notify_transition
(
policy
,
&
freqs
,
CPUFREQ_PRECHANGE
);
/* Set the target frequency in all C0_3_PSTATE register */
...
...
drivers/cpufreq/freq_table.c
浏览文件 @
4eb5178c
...
...
@@ -11,10 +11,8 @@
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/cpufreq.h>
#include <linux/module.h>
/*********************************************************************
* FREQUENCY TABLE HELPERS *
...
...
drivers/cpufreq/gx-suspmod.c
浏览文件 @
4eb5178c
...
...
@@ -183,7 +183,7 @@ static void gx_write_byte(int reg, int value)
* gx_detect_chipset:
*
**/
static
__init
struct
pci_dev
*
gx_detect_chipset
(
void
)
static
struct
pci_dev
*
__init
gx_detect_chipset
(
void
)
{
struct
pci_dev
*
gx_pci
=
NULL
;
...
...
@@ -446,7 +446,6 @@ static struct cpufreq_driver gx_suspmod_driver = {
.
target
=
cpufreq_gx_target
,
.
init
=
cpufreq_gx_cpu_init
,
.
name
=
"gx-suspmod"
,
.
owner
=
THIS_MODULE
,
};
static
int
__init
cpufreq_gx_init
(
void
)
...
...
@@ -466,7 +465,7 @@ static int __init cpufreq_gx_init(void)
pr_debug
(
"geode suspend modulation available.
\n
"
);
params
=
kzalloc
(
sizeof
(
struct
gxfreq_
params
),
GFP_KERNEL
);
params
=
kzalloc
(
sizeof
(
*
params
),
GFP_KERNEL
);
if
(
params
==
NULL
)
return
-
ENOMEM
;
...
...
drivers/cpufreq/ia64-acpi-cpufreq.c
浏览文件 @
4eb5178c
...
...
@@ -274,7 +274,7 @@ acpi_cpufreq_cpu_init (
pr_debug
(
"acpi_cpufreq_cpu_init
\n
"
);
data
=
kzalloc
(
sizeof
(
struct
cpufreq_acpi_io
),
GFP_KERNEL
);
data
=
kzalloc
(
sizeof
(
*
data
),
GFP_KERNEL
);
if
(
!
data
)
return
(
-
ENOMEM
);
...
...
@@ -304,7 +304,7 @@ acpi_cpufreq_cpu_init (
}
/* alloc freq_table */
data
->
freq_table
=
kmalloc
(
sizeof
(
struct
cpufreq_frequency
_table
)
*
data
->
freq_table
=
kmalloc
(
sizeof
(
*
data
->
freq
_table
)
*
(
data
->
acpi_data
.
state_count
+
1
),
GFP_KERNEL
);
if
(
!
data
->
freq_table
)
{
...
...
@@ -409,7 +409,6 @@ static struct cpufreq_driver acpi_cpufreq_driver = {
.
init
=
acpi_cpufreq_cpu_init
,
.
exit
=
acpi_cpufreq_cpu_exit
,
.
name
=
"acpi-cpufreq"
,
.
owner
=
THIS_MODULE
,
.
attr
=
acpi_cpufreq_attr
,
};
...
...
drivers/cpufreq/intel_pstate.c
浏览文件 @
4eb5178c
...
...
@@ -665,7 +665,6 @@ static struct cpufreq_driver intel_pstate_driver = {
.
init
=
intel_pstate_cpu_init
,
.
exit
=
intel_pstate_cpu_exit
,
.
name
=
"intel_pstate"
,
.
owner
=
THIS_MODULE
,
};
static
int
__initdata
no_load
;
...
...
drivers/cpufreq/kirkwood-cpufreq.c
浏览文件 @
4eb5178c
...
...
@@ -158,7 +158,6 @@ static struct cpufreq_driver kirkwood_cpufreq_driver = {
.
init
=
kirkwood_cpufreq_cpu_init
,
.
exit
=
kirkwood_cpufreq_cpu_exit
,
.
name
=
"kirkwood-cpufreq"
,
.
owner
=
THIS_MODULE
,
.
attr
=
kirkwood_cpufreq_attr
,
};
...
...
drivers/cpufreq/longhaul.c
浏览文件 @
4eb5178c
...
...
@@ -948,7 +948,6 @@ static struct cpufreq_driver longhaul_driver = {
.
init
=
longhaul_cpu_init
,
.
exit
=
longhaul_cpu_exit
,
.
name
=
"longhaul"
,
.
owner
=
THIS_MODULE
,
.
attr
=
longhaul_attr
,
};
...
...
drivers/cpufreq/longrun.c
浏览文件 @
4eb5178c
...
...
@@ -286,7 +286,6 @@ static struct cpufreq_driver longrun_driver = {
.
get
=
longrun_get
,
.
init
=
longrun_cpu_init
,
.
name
=
"longrun"
,
.
owner
=
THIS_MODULE
,
};
static
const
struct
x86_cpu_id
longrun_ids
[]
=
{
...
...
drivers/cpufreq/loongson2_cpufreq.c
浏览文件 @
4eb5178c
...
...
@@ -158,7 +158,6 @@ static struct freq_attr *loongson2_table_attr[] = {
};
static
struct
cpufreq_driver
loongson2_cpufreq_driver
=
{
.
owner
=
THIS_MODULE
,
.
name
=
"loongson2"
,
.
init
=
loongson2_cpufreq_cpu_init
,
.
verify
=
loongson2_cpufreq_verify
,
...
...
drivers/cpufreq/maple-cpufreq.c
浏览文件 @
4eb5178c
...
...
@@ -190,7 +190,6 @@ static int maple_cpufreq_cpu_init(struct cpufreq_policy *policy)
static
struct
cpufreq_driver
maple_cpufreq_driver
=
{
.
name
=
"maple"
,
.
owner
=
THIS_MODULE
,
.
flags
=
CPUFREQ_CONST_LOOPS
,
.
init
=
maple_cpufreq_cpu_init
,
.
verify
=
maple_cpufreq_verify
,
...
...
drivers/cpufreq/mperf.c
已删除
100644 → 0
浏览文件 @
b36f4be3
#include <linux/kernel.h>
#include <linux/smp.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/cpufreq.h>
#include <linux/slab.h>
#include "mperf.h"
static
DEFINE_PER_CPU
(
struct
aperfmperf
,
acfreq_old_perf
);
/* Called via smp_call_function_single(), on the target CPU */
static
void
read_measured_perf_ctrs
(
void
*
_cur
)
{
struct
aperfmperf
*
am
=
_cur
;
get_aperfmperf
(
am
);
}
/*
* Return the measured active (C0) frequency on this CPU since last call
* to this function.
* Input: cpu number
* Return: Average CPU frequency in terms of max frequency (zero on error)
*
* We use IA32_MPERF and IA32_APERF MSRs to get the measured performance
* over a period of time, while CPU is in C0 state.
* IA32_MPERF counts at the rate of max advertised frequency
* IA32_APERF counts at the rate of actual CPU frequency
* Only IA32_APERF/IA32_MPERF ratio is architecturally defined and
* no meaning should be associated with absolute values of these MSRs.
*/
unsigned
int
cpufreq_get_measured_perf
(
struct
cpufreq_policy
*
policy
,
unsigned
int
cpu
)
{
struct
aperfmperf
perf
;
unsigned
long
ratio
;
unsigned
int
retval
;
if
(
smp_call_function_single
(
cpu
,
read_measured_perf_ctrs
,
&
perf
,
1
))
return
0
;
ratio
=
calc_aperfmperf_ratio
(
&
per_cpu
(
acfreq_old_perf
,
cpu
),
&
perf
);
per_cpu
(
acfreq_old_perf
,
cpu
)
=
perf
;
retval
=
(
policy
->
cpuinfo
.
max_freq
*
ratio
)
>>
APERFMPERF_SHIFT
;
return
retval
;
}
EXPORT_SYMBOL_GPL
(
cpufreq_get_measured_perf
);
MODULE_LICENSE
(
"GPL"
);
drivers/cpufreq/mperf.h
已删除
100644 → 0
浏览文件 @
b36f4be3
/*
* (c) 2010 Advanced Micro Devices, Inc.
* Your use of this code is subject to the terms and conditions of the
* GNU general public license version 2. See "COPYING" or
* http://www.gnu.org/licenses/gpl.html
*/
unsigned
int
cpufreq_get_measured_perf
(
struct
cpufreq_policy
*
policy
,
unsigned
int
cpu
);
drivers/cpufreq/p4-clockmod.c
浏览文件 @
4eb5178c
...
...
@@ -279,7 +279,6 @@ static struct cpufreq_driver p4clockmod_driver = {
.
exit
=
cpufreq_p4_cpu_exit
,
.
get
=
cpufreq_p4_get
,
.
name
=
"p4-clockmod"
,
.
owner
=
THIS_MODULE
,
.
attr
=
p4clockmod_attr
,
};
...
...
drivers/cpufreq/pasemi-cpufreq.c
浏览文件 @
4eb5178c
...
...
@@ -297,7 +297,6 @@ static int pas_cpufreq_target(struct cpufreq_policy *policy,
static
struct
cpufreq_driver
pas_cpufreq_driver
=
{
.
name
=
"pas-cpufreq"
,
.
owner
=
THIS_MODULE
,
.
flags
=
CPUFREQ_CONST_LOOPS
,
.
init
=
pas_cpufreq_cpu_init
,
.
exit
=
pas_cpufreq_cpu_exit
,
...
...
drivers/cpufreq/pcc-cpufreq.c
浏览文件 @
4eb5178c
...
...
@@ -587,7 +587,6 @@ static struct cpufreq_driver pcc_cpufreq_driver = {
.
init
=
pcc_cpufreq_cpu_init
,
.
exit
=
pcc_cpufreq_cpu_exit
,
.
name
=
"pcc-cpufreq"
,
.
owner
=
THIS_MODULE
,
};
static
int
__init
pcc_cpufreq_init
(
void
)
...
...
drivers/cpufreq/pmac32-cpufreq.c
浏览文件 @
4eb5178c
...
...
@@ -477,7 +477,6 @@ static struct cpufreq_driver pmac_cpufreq_driver = {
.
flags
=
CPUFREQ_PM_NO_WARN
,
.
attr
=
pmac_cpu_freqs_attr
,
.
name
=
"powermac"
,
.
owner
=
THIS_MODULE
,
};
...
...
drivers/cpufreq/pmac64-cpufreq.c
浏览文件 @
4eb5178c
...
...
@@ -371,7 +371,6 @@ static int g5_cpufreq_cpu_init(struct cpufreq_policy *policy)
static
struct
cpufreq_driver
g5_cpufreq_driver
=
{
.
name
=
"powermac"
,
.
owner
=
THIS_MODULE
,
.
flags
=
CPUFREQ_CONST_LOOPS
,
.
init
=
g5_cpufreq_cpu_init
,
.
verify
=
g5_cpufreq_verify
,
...
...
@@ -447,9 +446,8 @@ static int __init g5_neo2_cpufreq_init(struct device_node *cpus)
if
(
!
shdr
)
goto
bail_noprops
;
g5_fvt_table
=
(
struct
smu_sdbp_fvt
*
)
&
shdr
[
1
];
ssize
=
(
shdr
->
len
*
sizeof
(
u32
))
-
sizeof
(
struct
smu_sdbp_header
);
g5_fvt_count
=
ssize
/
sizeof
(
struct
smu_sdbp_fvt
);
ssize
=
(
shdr
->
len
*
sizeof
(
u32
))
-
sizeof
(
*
shdr
);
g5_fvt_count
=
ssize
/
sizeof
(
*
g5_fvt_table
);
g5_fvt_cur
=
0
;
/* Sanity checking */
...
...
drivers/cpufreq/powernow-k6.c
浏览文件 @
4eb5178c
...
...
@@ -207,7 +207,6 @@ static struct cpufreq_driver powernow_k6_driver = {
.
exit
=
powernow_k6_cpu_exit
,
.
get
=
powernow_k6_get
,
.
name
=
"powernow-k6"
,
.
owner
=
THIS_MODULE
,
.
attr
=
powernow_k6_attr
,
};
...
...
drivers/cpufreq/powernow-k7.c
浏览文件 @
4eb5178c
...
...
@@ -177,7 +177,7 @@ static int get_ranges(unsigned char *pst)
unsigned
int
speed
;
u8
fid
,
vid
;
powernow_table
=
kzalloc
((
sizeof
(
struct
cpufreq_frequency
_table
)
*
powernow_table
=
kzalloc
((
sizeof
(
*
powernow
_table
)
*
(
number_scales
+
1
)),
GFP_KERNEL
);
if
(
!
powernow_table
)
return
-
ENOMEM
;
...
...
@@ -309,8 +309,7 @@ static int powernow_acpi_init(void)
goto
err0
;
}
acpi_processor_perf
=
kzalloc
(
sizeof
(
struct
acpi_processor_performance
),
GFP_KERNEL
);
acpi_processor_perf
=
kzalloc
(
sizeof
(
*
acpi_processor_perf
),
GFP_KERNEL
);
if
(
!
acpi_processor_perf
)
{
retval
=
-
ENOMEM
;
goto
err0
;
...
...
@@ -346,7 +345,7 @@ static int powernow_acpi_init(void)
goto
err2
;
}
powernow_table
=
kzalloc
((
sizeof
(
struct
cpufreq_frequency
_table
)
*
powernow_table
=
kzalloc
((
sizeof
(
*
powernow
_table
)
*
(
number_scales
+
1
)),
GFP_KERNEL
);
if
(
!
powernow_table
)
{
retval
=
-
ENOMEM
;
...
...
@@ -497,7 +496,7 @@ static int powernow_decode_bios(int maxfid, int startvid)
"relevant to this CPU).
\n
"
,
psb
->
numpst
);
p
+=
sizeof
(
struct
psb_s
);
p
+=
sizeof
(
*
psb
);
pst
=
(
struct
pst_s
*
)
p
;
...
...
@@ -510,12 +509,12 @@ static int powernow_decode_bios(int maxfid, int startvid)
(
maxfid
==
pst
->
maxfid
)
&&
(
startvid
==
pst
->
startvid
))
{
print_pst_entry
(
pst
,
j
);
p
=
(
char
*
)
pst
+
sizeof
(
struct
pst_s
);
p
=
(
char
*
)
pst
+
sizeof
(
*
pst
);
ret
=
get_ranges
(
p
);
return
ret
;
}
else
{
unsigned
int
k
;
p
=
(
char
*
)
pst
+
sizeof
(
struct
pst_s
);
p
=
(
char
*
)
pst
+
sizeof
(
*
pst
);
for
(
k
=
0
;
k
<
number_scales
;
k
++
)
p
+=
2
;
}
...
...
@@ -717,7 +716,6 @@ static struct cpufreq_driver powernow_driver = {
.
init
=
powernow_cpu_init
,
.
exit
=
powernow_cpu_exit
,
.
name
=
"powernow-k7"
,
.
owner
=
THIS_MODULE
,
.
attr
=
powernow_table_attr
,
};
...
...
drivers/cpufreq/powernow-k8.c
浏览文件 @
4eb5178c
...
...
@@ -623,7 +623,7 @@ static int fill_powernow_table(struct powernow_k8_data *data,
if
(
check_pst_table
(
data
,
pst
,
maxvid
))
return
-
EINVAL
;
powernow_table
=
kmalloc
((
sizeof
(
struct
cpufreq_frequency
_table
)
powernow_table
=
kmalloc
((
sizeof
(
*
powernow
_table
)
*
(
data
->
numps
+
1
)),
GFP_KERNEL
);
if
(
!
powernow_table
)
{
printk
(
KERN_ERR
PFX
"powernow_table memory alloc failure
\n
"
);
...
...
@@ -793,7 +793,7 @@ static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data)
}
/* fill in data->powernow_table */
powernow_table
=
kmalloc
((
sizeof
(
struct
cpufreq_frequency
_table
)
powernow_table
=
kmalloc
((
sizeof
(
*
powernow
_table
)
*
(
data
->
acpi_data
.
state_count
+
1
)),
GFP_KERNEL
);
if
(
!
powernow_table
)
{
pr_debug
(
"powernow_table memory alloc failure
\n
"
);
...
...
@@ -1106,7 +1106,7 @@ static int powernowk8_cpu_init(struct cpufreq_policy *pol)
if
(
rc
)
return
-
ENODEV
;
data
=
kzalloc
(
sizeof
(
struct
powernow_k8_
data
),
GFP_KERNEL
);
data
=
kzalloc
(
sizeof
(
*
data
),
GFP_KERNEL
);
if
(
!
data
)
{
printk
(
KERN_ERR
PFX
"unable to alloc powernow_k8_data"
);
return
-
ENOMEM
;
...
...
@@ -1240,7 +1240,6 @@ static struct cpufreq_driver cpufreq_amd64_driver = {
.
exit
=
powernowk8_cpu_exit
,
.
get
=
powernowk8_get
,
.
name
=
"powernow-k8"
,
.
owner
=
THIS_MODULE
,
.
attr
=
powernow_k8_attr
,
};
...
...
drivers/cpufreq/ppc-corenet-cpufreq.c
浏览文件 @
4eb5178c
...
...
@@ -300,7 +300,6 @@ static struct freq_attr *corenet_cpufreq_attr[] = {
static
struct
cpufreq_driver
ppc_corenet_cpufreq_driver
=
{
.
name
=
"ppc_cpufreq"
,
.
owner
=
THIS_MODULE
,
.
flags
=
CPUFREQ_CONST_LOOPS
,
.
init
=
corenet_cpufreq_cpu_init
,
.
exit
=
__exit_p
(
corenet_cpufreq_cpu_exit
),
...
...
drivers/cpufreq/ppc_cbe_cpufreq.c
浏览文件 @
4eb5178c
...
...
@@ -181,7 +181,6 @@ static struct cpufreq_driver cbe_cpufreq_driver = {
.
init
=
cbe_cpufreq_cpu_init
,
.
exit
=
cbe_cpufreq_cpu_exit
,
.
name
=
"cbe-cpufreq"
,
.
owner
=
THIS_MODULE
,
.
flags
=
CPUFREQ_CONST_LOOPS
,
};
...
...
drivers/cpufreq/pxa2xx-cpufreq.c
浏览文件 @
4eb5178c
...
...
@@ -191,7 +191,7 @@ static int pxa_cpufreq_change_voltage(pxa_freqs_t *pxa_freq)
return
ret
;
}
static
__init
void
pxa_cpufreq_init_voltages
(
void
)
static
void
__init
pxa_cpufreq_init_voltages
(
void
)
{
vcc_core
=
regulator_get
(
NULL
,
"vcc_core"
);
if
(
IS_ERR
(
vcc_core
))
{
...
...
@@ -207,7 +207,7 @@ static int pxa_cpufreq_change_voltage(pxa_freqs_t *pxa_freq)
return
0
;
}
static
__init
void
pxa_cpufreq_init_voltages
(
void
)
{
}
static
void
__init
pxa_cpufreq_init_voltages
(
void
)
{
}
#endif
static
void
find_freq_tables
(
struct
cpufreq_frequency_table
**
freq_table
,
...
...
drivers/cpufreq/pxa3xx-cpufreq.c
浏览文件 @
4eb5178c
...
...
@@ -213,10 +213,12 @@ static int pxa3xx_cpufreq_init(struct cpufreq_policy *policy)
policy
->
cur
=
policy
->
min
=
policy
->
max
;
if
(
cpu_is_pxa300
()
||
cpu_is_pxa310
())
ret
=
setup_freqs_table
(
policy
,
ARRAY_AND_SIZE
(
pxa300_freqs
));
ret
=
setup_freqs_table
(
policy
,
pxa300_freqs
,
ARRAY_SIZE
(
pxa300_freqs
));
if
(
cpu_is_pxa320
())
ret
=
setup_freqs_table
(
policy
,
ARRAY_AND_SIZE
(
pxa320_freqs
));
ret
=
setup_freqs_table
(
policy
,
pxa320_freqs
,
ARRAY_SIZE
(
pxa320_freqs
));
if
(
ret
)
{
pr_err
(
"failed to setup frequency table
\n
"
);
...
...
drivers/cpufreq/s3c2416-cpufreq.c
浏览文件 @
4eb5178c
...
...
@@ -524,7 +524,6 @@ static struct freq_attr *s3c2416_cpufreq_attr[] = {
};
static
struct
cpufreq_driver
s3c2416_cpufreq_driver
=
{
.
owner
=
THIS_MODULE
,
.
flags
=
0
,
.
verify
=
s3c2416_cpufreq_verify_speed
,
.
target
=
s3c2416_cpufreq_set_target
,
...
...
drivers/cpufreq/s3c24xx-cpufreq.c
浏览文件 @
4eb5178c
...
...
@@ -392,7 +392,7 @@ static int s3c_cpufreq_init(struct cpufreq_policy *policy)
return
0
;
}
static
__init
in
t
s3c_cpufreq_initclks
(
void
)
static
int
__ini
t
s3c_cpufreq_initclks
(
void
)
{
_clk_mpll
=
s3c_cpufreq_clk_get
(
NULL
,
"mpll"
);
_clk_xtal
=
s3c_cpufreq_clk_get
(
NULL
,
"xtal"
);
...
...
@@ -522,7 +522,7 @@ int __init s3c_cpufreq_setboard(struct s3c_cpufreq_board *board)
/* Copy the board information so that each board can make this
* initdata. */
ours
=
kzalloc
(
sizeof
(
struct
s3c_cpufreq_board
),
GFP_KERNEL
);
ours
=
kzalloc
(
sizeof
(
*
ours
),
GFP_KERNEL
);
if
(
ours
==
NULL
)
{
printk
(
KERN_ERR
"%s: no memory
\n
"
,
__func__
);
return
-
ENOMEM
;
...
...
@@ -615,7 +615,7 @@ static int s3c_cpufreq_build_freq(void)
size
=
cpu_cur
.
info
->
calc_freqtable
(
&
cpu_cur
,
NULL
,
0
);
size
++
;
ftab
=
kmalloc
(
sizeof
(
struct
cpufreq_frequency_table
)
*
size
,
GFP_KERNEL
);
ftab
=
kmalloc
(
sizeof
(
*
ftab
)
*
size
,
GFP_KERNEL
);
if
(
!
ftab
)
{
printk
(
KERN_ERR
"%s: no memory for tables
\n
"
,
__func__
);
return
-
ENOMEM
;
...
...
@@ -691,7 +691,7 @@ int __init s3c_plltab_register(struct cpufreq_frequency_table *plls,
struct
cpufreq_frequency_table
*
vals
;
unsigned
int
size
;
size
=
sizeof
(
struct
cpufreq_frequency_table
)
*
(
plls_no
+
1
);
size
=
sizeof
(
*
vals
)
*
(
plls_no
+
1
);
vals
=
kmalloc
(
size
,
GFP_KERNEL
);
if
(
vals
)
{
...
...
drivers/cpufreq/s3c64xx-cpufreq.c
浏览文件 @
4eb5178c
...
...
@@ -263,7 +263,6 @@ static int s3c64xx_cpufreq_driver_init(struct cpufreq_policy *policy)
}
static
struct
cpufreq_driver
s3c64xx_cpufreq_driver
=
{
.
owner
=
THIS_MODULE
,
.
flags
=
0
,
.
verify
=
s3c64xx_cpufreq_verify_speed
,
.
target
=
s3c64xx_cpufreq_set_target
,
...
...
drivers/cpufreq/sc520_freq.c
浏览文件 @
4eb5178c
...
...
@@ -147,7 +147,6 @@ static struct cpufreq_driver sc520_freq_driver = {
.
init
=
sc520_freq_cpu_init
,
.
exit
=
sc520_freq_cpu_exit
,
.
name
=
"sc520_freq"
,
.
owner
=
THIS_MODULE
,
.
attr
=
sc520_freq_attr
,
};
...
...
drivers/cpufreq/sh-cpufreq.c
浏览文件 @
4eb5178c
...
...
@@ -160,7 +160,6 @@ static struct freq_attr *sh_freq_attr[] = {
};
static
struct
cpufreq_driver
sh_cpufreq_driver
=
{
.
owner
=
THIS_MODULE
,
.
name
=
"sh"
,
.
get
=
sh_cpufreq_get
,
.
target
=
sh_cpufreq_target
,
...
...
drivers/cpufreq/sparc-us2e-cpufreq.c
浏览文件 @
4eb5178c
...
...
@@ -351,12 +351,11 @@ static int __init us2e_freq_init(void)
struct
cpufreq_driver
*
driver
;
ret
=
-
ENOMEM
;
driver
=
kzalloc
(
sizeof
(
struct
cpufreq_
driver
),
GFP_KERNEL
);
driver
=
kzalloc
(
sizeof
(
*
driver
),
GFP_KERNEL
);
if
(
!
driver
)
goto
err_out
;
us2e_freq_table
=
kzalloc
(
(
NR_CPUS
*
sizeof
(
struct
us2e_freq_percpu_info
)),
us2e_freq_table
=
kzalloc
((
NR_CPUS
*
sizeof
(
*
us2e_freq_table
)),
GFP_KERNEL
);
if
(
!
us2e_freq_table
)
goto
err_out
;
...
...
@@ -366,7 +365,6 @@ static int __init us2e_freq_init(void)
driver
->
target
=
us2e_freq_target
;
driver
->
get
=
us2e_freq_get
;
driver
->
exit
=
us2e_freq_cpu_exit
;
driver
->
owner
=
THIS_MODULE
,
strcpy
(
driver
->
name
,
"UltraSPARC-IIe"
);
cpufreq_us2e_driver
=
driver
;
...
...
drivers/cpufreq/sparc-us3-cpufreq.c
浏览文件 @
4eb5178c
...
...
@@ -212,12 +212,11 @@ static int __init us3_freq_init(void)
struct
cpufreq_driver
*
driver
;
ret
=
-
ENOMEM
;
driver
=
kzalloc
(
sizeof
(
struct
cpufreq_
driver
),
GFP_KERNEL
);
driver
=
kzalloc
(
sizeof
(
*
driver
),
GFP_KERNEL
);
if
(
!
driver
)
goto
err_out
;
us3_freq_table
=
kzalloc
(
(
NR_CPUS
*
sizeof
(
struct
us3_freq_percpu_info
)),
us3_freq_table
=
kzalloc
((
NR_CPUS
*
sizeof
(
*
us3_freq_table
)),
GFP_KERNEL
);
if
(
!
us3_freq_table
)
goto
err_out
;
...
...
@@ -227,7 +226,6 @@ static int __init us3_freq_init(void)
driver
->
target
=
us3_freq_target
;
driver
->
get
=
us3_freq_get
;
driver
->
exit
=
us3_freq_cpu_exit
;
driver
->
owner
=
THIS_MODULE
,
strcpy
(
driver
->
name
,
"UltraSPARC-III"
);
cpufreq_us3_driver
=
driver
;
...
...
drivers/cpufreq/speedstep-centrino.c
浏览文件 @
4eb5178c
...
...
@@ -575,7 +575,6 @@ static struct cpufreq_driver centrino_driver = {
.
target
=
centrino_target
,
.
get
=
get_cur_freq
,
.
attr
=
centrino_attr
,
.
owner
=
THIS_MODULE
,
};
/*
...
...
drivers/cpufreq/speedstep-ich.c
浏览文件 @
4eb5178c
...
...
@@ -378,7 +378,6 @@ static struct cpufreq_driver speedstep_driver = {
.
init
=
speedstep_cpu_init
,
.
exit
=
speedstep_cpu_exit
,
.
get
=
speedstep_get
,
.
owner
=
THIS_MODULE
,
.
attr
=
speedstep_attr
,
};
...
...
drivers/cpufreq/speedstep-smi.c
浏览文件 @
4eb5178c
...
...
@@ -375,7 +375,6 @@ static struct cpufreq_driver speedstep_driver = {
.
exit
=
speedstep_cpu_exit
,
.
get
=
speedstep_get
,
.
resume
=
speedstep_resume
,
.
owner
=
THIS_MODULE
,
.
attr
=
speedstep_attr
,
};
...
...
drivers/cpufreq/unicore2-cpufreq.c
浏览文件 @
4eb5178c
...
...
@@ -24,7 +24,7 @@ static struct cpufreq_driver ucv2_driver;
/* make sure that only the "userspace" governor is run
* -- anything else wouldn't make sense on this platform, anyway.
*/
int
ucv2_verify_speed
(
struct
cpufreq_policy
*
policy
)
static
int
ucv2_verify_speed
(
struct
cpufreq_policy
*
policy
)
{
if
(
policy
->
cpu
)
return
-
EINVAL
;
...
...
include/linux/cpufreq.h
浏览文件 @
4eb5178c
...
...
@@ -11,71 +11,36 @@
#ifndef _LINUX_CPUFREQ_H
#define _LINUX_CPUFREQ_H
#include <asm/cputime.h>
#include <linux/mutex.h>
#include <linux/notifier.h>
#include <linux/threads.h>
#include <linux/cpumask.h>
#include <linux/completion.h>
#include <linux/kobject.h>
#include <linux/notifier.h>
#include <linux/sysfs.h>
#include <linux/completion.h>
#include <linux/workqueue.h>
#include <linux/cpumask.h>
#include <asm/div64.h>
#define CPUFREQ_NAME_LEN 16
/* Print length for names. Extra 1 space for accomodating '\n' in prints */
#define CPUFREQ_NAME_PLEN (CPUFREQ_NAME_LEN + 1)
/*********************************************************************
*
CPUFREQ NOTIFIER INTERFACE
*
*
CPUFREQ INTERFACE
*
*********************************************************************/
#define CPUFREQ_TRANSITION_NOTIFIER (0)
#define CPUFREQ_POLICY_NOTIFIER (1)
#ifdef CONFIG_CPU_FREQ
int
cpufreq_register_notifier
(
struct
notifier_block
*
nb
,
unsigned
int
list
);
int
cpufreq_unregister_notifier
(
struct
notifier_block
*
nb
,
unsigned
int
list
);
extern
void
disable_cpufreq
(
void
);
#else
/* CONFIG_CPU_FREQ */
static
inline
int
cpufreq_register_notifier
(
struct
notifier_block
*
nb
,
unsigned
int
list
)
{
return
0
;
}
static
inline
int
cpufreq_unregister_notifier
(
struct
notifier_block
*
nb
,
unsigned
int
list
)
{
return
0
;
}
static
inline
void
disable_cpufreq
(
void
)
{
}
#endif
/* CONFIG_CPU_FREQ */
/* if (cpufreq_driver->target) exists, the ->governor decides what frequency
* within the limits is used. If (cpufreq_driver->setpolicy> exists, these
* two generic policies are available:
*/
#define CPUFREQ_POLICY_POWERSAVE (1)
#define CPUFREQ_POLICY_PERFORMANCE (2)
/* Frequency values here are CPU kHz so that hardware which doesn't run
* with some frequencies can complain without having to guess what per
* cent / per mille means.
/*
* Frequency values here are CPU kHz
*
* Maximum transition latency is in nanoseconds - if it's unknown,
* CPUFREQ_ETERNAL shall be used.
*/
#define CPUFREQ_ETERNAL (-1)
#define CPUFREQ_NAME_LEN 16
/* Print length for names. Extra 1 space for accomodating '\n' in prints */
#define CPUFREQ_NAME_PLEN (CPUFREQ_NAME_LEN + 1)
struct
cpufreq_governor
;
/* /sys/devices/system/cpu/cpufreq: entry point for global variables */
extern
struct
kobject
*
cpufreq_global_kobject
;
int
cpufreq_get_global_kobject
(
void
)
;
void
cpufreq_put_global_kobject
(
void
)
;
int
cpufreq_sysfs_create_file
(
const
struct
attribute
*
attr
);
void
cpufreq_sysfs_remove_file
(
const
struct
attribute
*
attr
)
;
struct
cpufreq_freqs
{
unsigned
int
cpu
;
/* cpu nr */
unsigned
int
old
;
unsigned
int
new
;
u8
flags
;
/* flags of cpufreq_driver, see below. */
}
;
#define CPUFREQ_ETERNAL (-1)
struct
cpufreq_cpuinfo
{
unsigned
int
max_freq
;
unsigned
int
min_freq
;
...
...
@@ -117,123 +82,103 @@ struct cpufreq_policy {
struct
cpufreq_real_policy
user_policy
;
struct
list_head
policy_list
;
struct
kobject
kobj
;
struct
completion
kobj_unregister
;
int
transition_ongoing
;
/* Tracks transition status */
};
#define CPUFREQ_ADJUST (0)
#define CPUFREQ_INCOMPATIBLE (1)
#define CPUFREQ_NOTIFY (2)
#define CPUFREQ_START (3)
#define CPUFREQ_UPDATE_POLICY_CPU (4)
/* Only for ACPI */
#define CPUFREQ_SHARED_TYPE_NONE (0)
/* None */
#define CPUFREQ_SHARED_TYPE_HW (1)
/* HW does needed coordination */
#define CPUFREQ_SHARED_TYPE_ALL (2)
/* All dependent CPUs should set freq */
#define CPUFREQ_SHARED_TYPE_ANY (3)
/* Freq can be set from any dependent CPU*/
struct
cpufreq_policy
*
cpufreq_cpu_get
(
unsigned
int
cpu
);
void
cpufreq_cpu_put
(
struct
cpufreq_policy
*
policy
);
static
inline
bool
policy_is_shared
(
struct
cpufreq_policy
*
policy
)
{
return
cpumask_weight
(
policy
->
cpus
)
>
1
;
}
/*
******************* cpufreq transition notifiers ******************
*/
#define CPUFREQ_PRECHANGE (0)
#define CPUFREQ_POSTCHANGE (1)
#define CPUFREQ_RESUMECHANGE (8)
#define CPUFREQ_SUSPENDCHANGE (9)
/*
/sys/devices/system/cpu/cpufreq: entry point for global variables
*/
extern
struct
kobject
*
cpufreq_global_kobject
;
int
cpufreq_get_global_kobject
(
void
);
void
cpufreq_put_global_kobject
(
void
);
int
cpufreq_sysfs_create_file
(
const
struct
attribute
*
attr
);
void
cpufreq_sysfs_remove_file
(
const
struct
attribute
*
attr
);
struct
cpufreq_freqs
{
unsigned
int
cpu
;
/* cpu nr */
unsigned
int
old
;
unsigned
int
new
;
u8
flags
;
/* flags of cpufreq_driver, see below. */
};
#ifdef CONFIG_CPU_FREQ
unsigned
int
cpufreq_get
(
unsigned
int
cpu
);
unsigned
int
cpufreq_quick_get
(
unsigned
int
cpu
);
unsigned
int
cpufreq_quick_get_max
(
unsigned
int
cpu
);
void
disable_cpufreq
(
void
);
/**
* cpufreq_scale - "old * mult / div" calculation for large values (32-bit-arch
* safe)
* @old: old value
* @div: divisor
* @mult: multiplier
*
*
* new = old * mult / div
*/
static
inline
unsigned
long
cpufreq_scale
(
unsigned
long
old
,
u_int
div
,
u_int
mult
)
u64
get_cpu_idle_time
(
unsigned
int
cpu
,
u64
*
wall
,
int
io_busy
);
int
cpufreq_get_policy
(
struct
cpufreq_policy
*
policy
,
unsigned
int
cpu
);
int
cpufreq_update_policy
(
unsigned
int
cpu
);
bool
have_governor_per_policy
(
void
);
struct
kobject
*
get_governor_parent_kobj
(
struct
cpufreq_policy
*
policy
);
#else
static
inline
unsigned
int
cpufreq_get
(
unsigned
int
cpu
)
{
#if BITS_PER_LONG == 32
u64
result
=
((
u64
)
old
)
*
((
u64
)
mult
);
do_div
(
result
,
div
);
return
(
unsigned
long
)
result
;
#elif BITS_PER_LONG == 64
unsigned
long
result
=
old
*
((
u64
)
mult
);
result
/=
div
;
return
result
;
return
0
;
}
static
inline
unsigned
int
cpufreq_quick_get
(
unsigned
int
cpu
)
{
return
0
;
}
static
inline
unsigned
int
cpufreq_quick_get_max
(
unsigned
int
cpu
)
{
return
0
;
}
static
inline
void
disable_cpufreq
(
void
)
{
}
#endif
};
/*********************************************************************
*
CPUFREQ GOVERNORS
*
*
CPUFREQ DRIVER INTERFACE
*
*********************************************************************/
#define CPUFREQ_GOV_START 1
#define CPUFREQ_GOV_STOP 2
#define CPUFREQ_GOV_LIMITS 3
#define CPUFREQ_GOV_POLICY_INIT 4
#define CPUFREQ_GOV_POLICY_EXIT 5
#define CPUFREQ_RELATION_L 0
/* lowest frequency at or above target */
#define CPUFREQ_RELATION_H 1
/* highest frequency below or at target */
struct
cpufreq_governor
{
char
name
[
CPUFREQ_NAME_LEN
];
int
initialized
;
int
(
*
governor
)
(
struct
cpufreq_policy
*
policy
,
unsigned
int
event
);
ssize_t
(
*
show_setspeed
)
(
struct
cpufreq_policy
*
policy
,
char
*
buf
);
int
(
*
store_setspeed
)
(
struct
cpufreq_policy
*
policy
,
unsigned
int
freq
);
unsigned
int
max_transition_latency
;
/* HW must be able to switch to
next freq faster than this value in nano secs or we
will fallback to performance governor */
struct
list_head
governor_list
;
struct
module
*
owner
;
struct
freq_attr
{
struct
attribute
attr
;
ssize_t
(
*
show
)(
struct
cpufreq_policy
*
,
char
*
);
ssize_t
(
*
store
)(
struct
cpufreq_policy
*
,
const
char
*
,
size_t
count
);
};
/*
* Pass a target to the cpufreq driver.
*/
extern
int
cpufreq_driver_target
(
struct
cpufreq_policy
*
policy
,
unsigned
int
target_freq
,
unsigned
int
relation
);
extern
int
__cpufreq_driver_target
(
struct
cpufreq_policy
*
policy
,
unsigned
int
target_freq
,
unsigned
int
relation
);
#define cpufreq_freq_attr_ro(_name) \
static struct freq_attr _name = \
__ATTR(_name, 0444, show_##_name, NULL)
extern
int
__cpufreq_driver_getavg
(
struct
cpufreq_policy
*
policy
,
unsigned
int
cpu
);
#define cpufreq_freq_attr_ro_perm(_name, _perm) \
static struct freq_attr _name = \
__ATTR(_name, _perm, show_##_name, NULL)
int
cpufreq_register_governor
(
struct
cpufreq_governor
*
governor
);
void
cpufreq_unregister_governor
(
struct
cpufreq_governor
*
governor
);
#define cpufreq_freq_attr_rw(_name) \
static struct freq_attr _name = \
__ATTR(_name, 0644, show_##_name, store_##_name)
/*********************************************************************
* CPUFREQ DRIVER INTERFACE *
*********************************************************************/
struct
global_attr
{
struct
attribute
attr
;
ssize_t
(
*
show
)(
struct
kobject
*
kobj
,
struct
attribute
*
attr
,
char
*
buf
);
ssize_t
(
*
store
)(
struct
kobject
*
a
,
struct
attribute
*
b
,
const
char
*
c
,
size_t
count
);
};
#define CPUFREQ_RELATION_L 0
/* lowest frequency at or above target */
#define CPUFREQ_RELATION_H 1
/* highest frequency below or at target */
#define define_one_global_ro(_name) \
static struct global_attr _name = \
__ATTR(_name, 0444, show_##_name, NULL)
#define define_one_global_rw(_name) \
static struct global_attr _name = \
__ATTR(_name, 0644, show_##_name, store_##_name)
struct
freq_attr
;
struct
cpufreq_driver
{
struct
module
*
owner
;
char
name
[
CPUFREQ_NAME_LEN
];
u8
flags
;
/*
...
...
@@ -258,8 +203,6 @@ struct cpufreq_driver {
unsigned
int
(
*
get
)
(
unsigned
int
cpu
);
/* optional */
unsigned
int
(
*
getavg
)
(
struct
cpufreq_policy
*
policy
,
unsigned
int
cpu
);
int
(
*
bios_limit
)
(
int
cpu
,
unsigned
int
*
limit
);
int
(
*
exit
)
(
struct
cpufreq_policy
*
policy
);
...
...
@@ -269,7 +212,6 @@ struct cpufreq_driver {
};
/* flags */
#define CPUFREQ_STICKY 0x01
/* the driver isn't removed even if
* all ->init() calls failed */
#define CPUFREQ_CONST_LOOPS 0x02
/* loops_per_jiffy or other kernel
...
...
@@ -281,8 +223,7 @@ struct cpufreq_driver {
int
cpufreq_register_driver
(
struct
cpufreq_driver
*
driver_data
);
int
cpufreq_unregister_driver
(
struct
cpufreq_driver
*
driver_data
);
void
cpufreq_notify_transition
(
struct
cpufreq_policy
*
policy
,
struct
cpufreq_freqs
*
freqs
,
unsigned
int
state
);
const
char
*
cpufreq_get_current_driver
(
void
);
static
inline
void
cpufreq_verify_within_limits
(
struct
cpufreq_policy
*
policy
,
unsigned
int
min
,
unsigned
int
max
)
...
...
@@ -300,86 +241,117 @@ static inline void cpufreq_verify_within_limits(struct cpufreq_policy *policy,
return
;
}
struct
freq_attr
{
struct
attribute
attr
;
ssize_t
(
*
show
)(
struct
cpufreq_policy
*
,
char
*
);
ssize_t
(
*
store
)(
struct
cpufreq_policy
*
,
const
char
*
,
size_t
count
);
};
#define cpufreq_freq_attr_ro(_name) \
static struct freq_attr _name = \
__ATTR(_name, 0444, show_##_name, NULL)
#define cpufreq_freq_attr_ro_perm(_name, _perm) \
static struct freq_attr _name = \
__ATTR(_name, _perm, show_##_name, NULL)
#define cpufreq_freq_attr_rw(_name) \
static struct freq_attr _name = \
__ATTR(_name, 0644, show_##_name, store_##_name)
/*********************************************************************
* CPUFREQ NOTIFIER INTERFACE *
*********************************************************************/
struct
global_attr
{
struct
attribute
attr
;
ssize_t
(
*
show
)(
struct
kobject
*
kobj
,
struct
attribute
*
attr
,
char
*
buf
);
ssize_t
(
*
store
)(
struct
kobject
*
a
,
struct
attribute
*
b
,
const
char
*
c
,
size_t
count
);
};
#define CPUFREQ_TRANSITION_NOTIFIER (0)
#define CPUFREQ_POLICY_NOTIFIER (1)
#define define_one_global_ro(_name) \
static struct global_attr _name = \
__ATTR(_name, 0444, show_##_name, NULL)
/* Transition notifiers */
#define CPUFREQ_PRECHANGE (0)
#define CPUFREQ_POSTCHANGE (1)
#define CPUFREQ_RESUMECHANGE (8)
#define CPUFREQ_SUSPENDCHANGE (9)
#define define_one_global_rw(_name) \
static struct global_attr _name = \
__ATTR(_name, 0644, show_##_name, store_##_name)
/* Policy Notifiers */
#define CPUFREQ_ADJUST (0)
#define CPUFREQ_INCOMPATIBLE (1)
#define CPUFREQ_NOTIFY (2)
#define CPUFREQ_START (3)
#define CPUFREQ_UPDATE_POLICY_CPU (4)
struct
cpufreq_policy
*
cpufreq_cpu_get
(
unsigned
int
cpu
);
void
cpufreq_cpu_put
(
struct
cpufreq_policy
*
data
);
const
char
*
cpufreq_get_current_driver
(
void
);
#ifdef CONFIG_CPU_FREQ
int
cpufreq_register_notifier
(
struct
notifier_block
*
nb
,
unsigned
int
list
);
int
cpufreq_unregister_notifier
(
struct
notifier_block
*
nb
,
unsigned
int
list
);
/*********************************************************************
* CPUFREQ 2.6. INTERFACE *
*********************************************************************/
u64
get_cpu_idle_time
(
unsigned
int
cpu
,
u64
*
wall
,
int
io_busy
);
int
cpufreq_get_policy
(
struct
cpufreq_policy
*
policy
,
unsigned
int
cpu
);
int
cpufreq_update_policy
(
unsigned
int
cpu
);
bool
have_governor_per_policy
(
void
);
struct
kobject
*
get_governor_parent_kobj
(
struct
cpufreq_policy
*
policy
);
void
cpufreq_notify_transition
(
struct
cpufreq_policy
*
policy
,
struct
cpufreq_freqs
*
freqs
,
unsigned
int
state
);
#ifdef CONFIG_CPU_FREQ
/*
* query the current CPU frequency (in kHz). If zero, cpufreq couldn't detect it
*/
unsigned
int
cpufreq_get
(
unsigned
int
cpu
);
#else
static
inline
unsigned
int
cpufreq_get
(
unsigned
int
cpu
)
#else
/* CONFIG_CPU_FREQ */
static
inline
int
cpufreq_register_notifier
(
struct
notifier_block
*
nb
,
unsigned
int
list
)
{
return
0
;
}
#endif
/*
* query the last known CPU freq (in kHz). If zero, cpufreq couldn't detect it
*/
#ifdef CONFIG_CPU_FREQ
unsigned
int
cpufreq_quick_get
(
unsigned
int
cpu
);
unsigned
int
cpufreq_quick_get_max
(
unsigned
int
cpu
);
#else
static
inline
unsigned
int
cpufreq_quick_get
(
unsigned
int
cpu
)
static
inline
int
cpufreq_unregister_notifier
(
struct
notifier_block
*
nb
,
unsigned
int
list
)
{
return
0
;
}
static
inline
unsigned
int
cpufreq_quick_get_max
(
unsigned
int
cpu
)
#endif
/* !CONFIG_CPU_FREQ */
/**
* cpufreq_scale - "old * mult / div" calculation for large values (32-bit-arch
* safe)
* @old: old value
* @div: divisor
* @mult: multiplier
*
*
* new = old * mult / div
*/
static
inline
unsigned
long
cpufreq_scale
(
unsigned
long
old
,
u_int
div
,
u_int
mult
)
{
return
0
;
}
#if BITS_PER_LONG == 32
u64
result
=
((
u64
)
old
)
*
((
u64
)
mult
);
do_div
(
result
,
div
);
return
(
unsigned
long
)
result
;
#elif BITS_PER_LONG == 64
unsigned
long
result
=
old
*
((
u64
)
mult
);
result
/=
div
;
return
result
;
#endif
}
/*********************************************************************
*
CPUFREQ DEFAULT GOVERNOR
*
*
CPUFREQ GOVERNORS
*
*********************************************************************/
/*
* If (cpufreq_driver->target) exists, the ->governor decides what frequency
* within the limits is used. If (cpufreq_driver->setpolicy> exists, these
* two generic policies are available:
*/
#define CPUFREQ_POLICY_POWERSAVE (1)
#define CPUFREQ_POLICY_PERFORMANCE (2)
/* Governor Events */
#define CPUFREQ_GOV_START 1
#define CPUFREQ_GOV_STOP 2
#define CPUFREQ_GOV_LIMITS 3
#define CPUFREQ_GOV_POLICY_INIT 4
#define CPUFREQ_GOV_POLICY_EXIT 5
struct
cpufreq_governor
{
char
name
[
CPUFREQ_NAME_LEN
];
int
initialized
;
int
(
*
governor
)
(
struct
cpufreq_policy
*
policy
,
unsigned
int
event
);
ssize_t
(
*
show_setspeed
)
(
struct
cpufreq_policy
*
policy
,
char
*
buf
);
int
(
*
store_setspeed
)
(
struct
cpufreq_policy
*
policy
,
unsigned
int
freq
);
unsigned
int
max_transition_latency
;
/* HW must be able to switch to
next freq faster than this value in nano secs or we
will fallback to performance governor */
struct
list_head
governor_list
;
struct
module
*
owner
;
};
/* Pass a target to the cpufreq driver */
int
cpufreq_driver_target
(
struct
cpufreq_policy
*
policy
,
unsigned
int
target_freq
,
unsigned
int
relation
);
int
__cpufreq_driver_target
(
struct
cpufreq_policy
*
policy
,
unsigned
int
target_freq
,
unsigned
int
relation
);
int
cpufreq_register_governor
(
struct
cpufreq_governor
*
governor
);
void
cpufreq_unregister_governor
(
struct
cpufreq_governor
*
governor
);
/* CPUFREQ DEFAULT GOVERNOR */
/*
* Performance governor is fallback governor if any other gov failed to auto
* load due latency restrictions
...
...
@@ -428,18 +400,16 @@ int cpufreq_frequency_table_target(struct cpufreq_policy *policy,
unsigned
int
relation
,
unsigned
int
*
index
);
/* the following 3 funtions are for cpufreq core use only */
void
cpufreq_frequency_table_update_policy_cpu
(
struct
cpufreq_policy
*
policy
);
ssize_t
cpufreq_show_cpus
(
const
struct
cpumask
*
mask
,
char
*
buf
);
/* the following funtion is for cpufreq core use only */
struct
cpufreq_frequency_table
*
cpufreq_frequency_get_table
(
unsigned
int
cpu
);
/* the following are really really optional */
extern
struct
freq_attr
cpufreq_freq_attr_scaling_available_freqs
;
void
cpufreq_frequency_table_get_attr
(
struct
cpufreq_frequency_table
*
table
,
unsigned
int
cpu
);
void
cpufreq_frequency_table_update_policy_cpu
(
struct
cpufreq_policy
*
policy
);
void
cpufreq_frequency_table_put_attr
(
unsigned
int
cpu
);
ssize_t
cpufreq_show_cpus
(
const
struct
cpumask
*
mask
,
char
*
buf
);
#endif
/* _LINUX_CPUFREQ_H */
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录