mirror of
https://github.com/adulau/aha.git
synced 2024-12-27 19:26:25 +00:00
Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/davej/cpufreq
* 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/davej/cpufreq: [ACPI/CPUFREQ] Introduce bios_limit per cpu cpufreq sysfs interface [CPUFREQ] make internal cpufreq_add_dev_* static [CPUFREQ] use an enum for speedstep processor identification [CPUFREQ] Document units for transition latency [CPUFREQ] Use global sysfs cpufreq structure for conservative governor tunings [CPUFREQ] Documentation: ABI: /sys/devices/system/cpu/cpu#/cpufreq/ [CPUFREQ] powernow-k6: set transition latency value so ondemand governor can be used [CPUFREQ] cpumask: don't put a cpumask on the stack in x86...cpufreq/powernow-k8.c
This commit is contained in:
commit
2fe77b81c7
16 changed files with 248 additions and 74 deletions
|
@ -136,6 +136,24 @@ Description: Discover cpuidle policy and mechanism
|
|||
See files in Documentation/cpuidle/ for more information.
|
||||
|
||||
|
||||
What: /sys/devices/system/cpu/cpu#/cpufreq/*
|
||||
Date: pre-git history
|
||||
Contact: cpufreq@vger.kernel.org
|
||||
Description: Discover and change clock speed of CPUs
|
||||
|
||||
Clock scaling allows you to change the clock speed of the
|
||||
CPUs on the fly. This is a nice method to save battery
|
||||
power, because the lower the clock speed, the less power
|
||||
the CPU consumes.
|
||||
|
||||
There are many knobs to tweak in this directory.
|
||||
|
||||
See files in Documentation/cpu-freq/ for more information.
|
||||
|
||||
In particular, read Documentation/cpu-freq/user-guide.txt
|
||||
to learn how to control the knobs.
|
||||
|
||||
|
||||
What: /sys/devices/system/cpu/cpu*/cache/index*/cache_disable_X
|
||||
Date: August 2008
|
||||
KernelVersion: 2.6.27
|
||||
|
|
|
@ -92,9 +92,9 @@ policy->cpuinfo.max_freq - the minimum and maximum frequency
|
|||
(in kHz) which is supported by
|
||||
this CPU
|
||||
policy->cpuinfo.transition_latency the time it takes on this CPU to
|
||||
switch between two frequencies (if
|
||||
appropriate, else specify
|
||||
CPUFREQ_ETERNAL)
|
||||
switch between two frequencies in
|
||||
nanoseconds (if appropriate, else
|
||||
specify CPUFREQ_ETERNAL)
|
||||
|
||||
policy->cur The current operating frequency of
|
||||
this CPU (if appropriate)
|
||||
|
|
|
@ -203,6 +203,17 @@ scaling_cur_freq : Current frequency of the CPU as determined by
|
|||
the frequency the kernel thinks the CPU runs
|
||||
at.
|
||||
|
||||
bios_limit : If the BIOS tells the OS to limit a CPU to
|
||||
lower frequencies, the user can read out the
|
||||
maximum available frequency from this file.
|
||||
This typically can happen through (often not
|
||||
intended) BIOS settings, restrictions
|
||||
triggered through a service processor or other
|
||||
BIOS/HW based implementations.
|
||||
This does not cover thermal ACPI limitations
|
||||
which can be detected through the generic
|
||||
thermal driver.
|
||||
|
||||
If you have selected the "userspace" governor which allows you to
|
||||
set the CPU operating frequency to a specific value, you can read out
|
||||
the current frequency in
|
||||
|
|
|
@ -766,6 +766,7 @@ static struct freq_attr *acpi_cpufreq_attr[] = {
|
|||
static struct cpufreq_driver acpi_cpufreq_driver = {
|
||||
.verify = acpi_cpufreq_verify,
|
||||
.target = acpi_cpufreq_target,
|
||||
.bios_limit = acpi_processor_get_bios_limit,
|
||||
.init = acpi_cpufreq_cpu_init,
|
||||
.exit = acpi_cpufreq_cpu_exit,
|
||||
.resume = acpi_cpufreq_resume,
|
||||
|
|
|
@ -164,7 +164,7 @@ static int powernow_k6_cpu_init(struct cpufreq_policy *policy)
|
|||
}
|
||||
|
||||
/* cpuinfo and default policy values */
|
||||
policy->cpuinfo.transition_latency = CPUFREQ_ETERNAL;
|
||||
policy->cpuinfo.transition_latency = 200000;
|
||||
policy->cur = busfreq * max_multiplier;
|
||||
|
||||
result = cpufreq_frequency_table_cpuinfo(policy, clock_ratio);
|
||||
|
|
|
@ -717,6 +717,9 @@ static struct cpufreq_driver powernow_driver = {
|
|||
.verify = powernow_verify,
|
||||
.target = powernow_target,
|
||||
.get = powernow_get,
|
||||
#ifdef CONFIG_X86_POWERNOW_K7_ACPI
|
||||
.bios_limit = acpi_processor_get_bios_limit,
|
||||
#endif
|
||||
.init = powernow_cpu_init,
|
||||
.exit = powernow_cpu_exit,
|
||||
.name = "powernow-k7",
|
||||
|
|
|
@ -1118,7 +1118,7 @@ static int transition_frequency_pstate(struct powernow_k8_data *data,
|
|||
static int powernowk8_target(struct cpufreq_policy *pol,
|
||||
unsigned targfreq, unsigned relation)
|
||||
{
|
||||
cpumask_t oldmask;
|
||||
cpumask_var_t oldmask;
|
||||
struct powernow_k8_data *data = per_cpu(powernow_data, pol->cpu);
|
||||
u32 checkfid;
|
||||
u32 checkvid;
|
||||
|
@ -1131,9 +1131,13 @@ static int powernowk8_target(struct cpufreq_policy *pol,
|
|||
checkfid = data->currfid;
|
||||
checkvid = data->currvid;
|
||||
|
||||
/* only run on specific CPU from here on */
|
||||
oldmask = current->cpus_allowed;
|
||||
set_cpus_allowed_ptr(current, &cpumask_of_cpu(pol->cpu));
|
||||
/* only run on specific CPU from here on. */
|
||||
/* This is poor form: use a workqueue or smp_call_function_single */
|
||||
if (!alloc_cpumask_var(&oldmask, GFP_KERNEL))
|
||||
return -ENOMEM;
|
||||
|
||||
cpumask_copy(oldmask, tsk_cpumask(current));
|
||||
set_cpus_allowed_ptr(current, cpumask_of(pol->cpu));
|
||||
|
||||
if (smp_processor_id() != pol->cpu) {
|
||||
printk(KERN_ERR PFX "limiting to cpu %u failed\n", pol->cpu);
|
||||
|
@ -1193,7 +1197,8 @@ static int powernowk8_target(struct cpufreq_policy *pol,
|
|||
ret = 0;
|
||||
|
||||
err_out:
|
||||
set_cpus_allowed_ptr(current, &oldmask);
|
||||
set_cpus_allowed_ptr(current, oldmask);
|
||||
free_cpumask_var(oldmask);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -1395,6 +1400,7 @@ static struct freq_attr *powernow_k8_attr[] = {
|
|||
static struct cpufreq_driver cpufreq_amd64_driver = {
|
||||
.verify = powernowk8_verify,
|
||||
.target = powernowk8_target,
|
||||
.bios_limit = acpi_processor_get_bios_limit,
|
||||
.init = powernowk8_cpu_init,
|
||||
.exit = __devexit_p(powernowk8_cpu_exit),
|
||||
.get = powernowk8_get,
|
||||
|
|
|
@ -39,7 +39,7 @@ static struct pci_dev *speedstep_chipset_dev;
|
|||
|
||||
/* speedstep_processor
|
||||
*/
|
||||
static unsigned int speedstep_processor;
|
||||
static enum speedstep_processor speedstep_processor;
|
||||
|
||||
static u32 pmbase;
|
||||
|
||||
|
|
|
@ -34,7 +34,7 @@ static int relaxed_check;
|
|||
* GET PROCESSOR CORE SPEED IN KHZ *
|
||||
*********************************************************************/
|
||||
|
||||
static unsigned int pentium3_get_frequency(unsigned int processor)
|
||||
static unsigned int pentium3_get_frequency(enum speedstep_processor processor)
|
||||
{
|
||||
/* See table 14 of p3_ds.pdf and table 22 of 29834003.pdf */
|
||||
struct {
|
||||
|
@ -227,7 +227,7 @@ static unsigned int pentium4_get_frequency(void)
|
|||
|
||||
|
||||
/* Warning: may get called from smp_call_function_single. */
|
||||
unsigned int speedstep_get_frequency(unsigned int processor)
|
||||
unsigned int speedstep_get_frequency(enum speedstep_processor processor)
|
||||
{
|
||||
switch (processor) {
|
||||
case SPEEDSTEP_CPU_PCORE:
|
||||
|
@ -380,7 +380,7 @@ EXPORT_SYMBOL_GPL(speedstep_detect_processor);
|
|||
* DETECT SPEEDSTEP SPEEDS *
|
||||
*********************************************************************/
|
||||
|
||||
unsigned int speedstep_get_freqs(unsigned int processor,
|
||||
unsigned int speedstep_get_freqs(enum speedstep_processor processor,
|
||||
unsigned int *low_speed,
|
||||
unsigned int *high_speed,
|
||||
unsigned int *transition_latency,
|
||||
|
|
|
@ -11,18 +11,18 @@
|
|||
|
||||
|
||||
/* processors */
|
||||
|
||||
#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 */
|
||||
|
||||
enum speedstep_processor {
|
||||
SPEEDSTEP_CPU_PIII_C_EARLY = 0x00000001, /* Coppermine core */
|
||||
SPEEDSTEP_CPU_PIII_C = 0x00000002, /* Coppermine core */
|
||||
SPEEDSTEP_CPU_PIII_T = 0x00000003, /* Tualatin core */
|
||||
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_frequency() call. */
|
||||
#define SPEEDSTEP_CPU_PM 0xFFFFFF03 /* Pentium M */
|
||||
#define SPEEDSTEP_CPU_P4D 0xFFFFFF04 /* desktop P4 */
|
||||
#define SPEEDSTEP_CPU_PCORE 0xFFFFFF05 /* Core */
|
||||
SPEEDSTEP_CPU_PM = 0xFFFFFF03, /* Pentium M */
|
||||
SPEEDSTEP_CPU_P4D = 0xFFFFFF04, /* desktop P4 */
|
||||
SPEEDSTEP_CPU_PCORE = 0xFFFFFF05, /* Core */
|
||||
};
|
||||
|
||||
/* speedstep states -- only two of them */
|
||||
|
||||
|
@ -31,10 +31,10 @@
|
|||
|
||||
|
||||
/* detect a speedstep-capable processor */
|
||||
extern unsigned int speedstep_detect_processor (void);
|
||||
extern enum speedstep_processor speedstep_detect_processor(void);
|
||||
|
||||
/* detect the current speed (in khz) of the processor */
|
||||
extern unsigned int speedstep_get_frequency(unsigned int processor);
|
||||
extern unsigned int speedstep_get_frequency(enum speedstep_processor processor);
|
||||
|
||||
|
||||
/* detect the low and high speeds of the processor. The callback
|
||||
|
@ -42,7 +42,7 @@ extern unsigned int speedstep_get_frequency(unsigned int processor);
|
|||
* SPEEDSTEP_LOW; the second argument is zero so that no
|
||||
* cpufreq_notify_transition calls are initiated.
|
||||
*/
|
||||
extern unsigned int speedstep_get_freqs(unsigned int processor,
|
||||
extern unsigned int speedstep_get_freqs(enum speedstep_processor processor,
|
||||
unsigned int *low_speed,
|
||||
unsigned int *high_speed,
|
||||
unsigned int *transition_latency,
|
||||
|
|
|
@ -35,7 +35,7 @@ static int smi_cmd;
|
|||
static unsigned int smi_sig;
|
||||
|
||||
/* info about the processor */
|
||||
static unsigned int speedstep_processor;
|
||||
static enum speedstep_processor speedstep_processor;
|
||||
|
||||
/*
|
||||
* There are only two frequency states for each processor. Values
|
||||
|
|
|
@ -167,6 +167,19 @@ int acpi_processor_ppc_has_changed(struct acpi_processor *pr)
|
|||
return cpufreq_update_policy(pr->id);
|
||||
}
|
||||
|
||||
int acpi_processor_get_bios_limit(int cpu, unsigned int *limit)
|
||||
{
|
||||
struct acpi_processor *pr;
|
||||
|
||||
pr = per_cpu(processors, cpu);
|
||||
if (!pr || !pr->performance || !pr->performance->state_count)
|
||||
return -ENODEV;
|
||||
*limit = pr->performance->states[pr->performance_platform_limit].
|
||||
core_frequency * 1000;
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(acpi_processor_get_bios_limit);
|
||||
|
||||
void acpi_processor_ppc_init(void)
|
||||
{
|
||||
if (!cpufreq_register_notifier
|
||||
|
|
|
@ -647,6 +647,21 @@ static ssize_t show_scaling_setspeed(struct cpufreq_policy *policy, char *buf)
|
|||
return policy->governor->show_setspeed(policy, buf);
|
||||
}
|
||||
|
||||
/**
|
||||
* show_scaling_driver - show the current cpufreq HW/BIOS limitation
|
||||
*/
|
||||
static ssize_t show_bios_limit(struct cpufreq_policy *policy, char *buf)
|
||||
{
|
||||
unsigned int limit;
|
||||
int ret;
|
||||
if (cpufreq_driver->bios_limit) {
|
||||
ret = cpufreq_driver->bios_limit(policy->cpu, &limit);
|
||||
if (!ret)
|
||||
return sprintf(buf, "%u\n", limit);
|
||||
}
|
||||
return sprintf(buf, "%u\n", policy->cpuinfo.max_freq);
|
||||
}
|
||||
|
||||
#define define_one_ro(_name) \
|
||||
static struct freq_attr _name = \
|
||||
__ATTR(_name, 0444, show_##_name, NULL)
|
||||
|
@ -666,6 +681,7 @@ define_one_ro(cpuinfo_transition_latency);
|
|||
define_one_ro(scaling_available_governors);
|
||||
define_one_ro(scaling_driver);
|
||||
define_one_ro(scaling_cur_freq);
|
||||
define_one_ro(bios_limit);
|
||||
define_one_ro(related_cpus);
|
||||
define_one_ro(affected_cpus);
|
||||
define_one_rw(scaling_min_freq);
|
||||
|
@ -767,7 +783,8 @@ static struct kobj_type ktype_cpufreq = {
|
|||
* 0: Success
|
||||
* Positive: When we have a managed CPU and the sysfs got symlinked
|
||||
*/
|
||||
int cpufreq_add_dev_policy(unsigned int cpu, struct cpufreq_policy *policy,
|
||||
static int cpufreq_add_dev_policy(unsigned int cpu,
|
||||
struct cpufreq_policy *policy,
|
||||
struct sys_device *sys_dev)
|
||||
{
|
||||
int ret = 0;
|
||||
|
@ -842,7 +859,8 @@ int cpufreq_add_dev_policy(unsigned int cpu, struct cpufreq_policy *policy,
|
|||
|
||||
|
||||
/* symlink affected CPUs */
|
||||
int cpufreq_add_dev_symlink(unsigned int cpu, struct cpufreq_policy *policy)
|
||||
static int cpufreq_add_dev_symlink(unsigned int cpu,
|
||||
struct cpufreq_policy *policy)
|
||||
{
|
||||
unsigned int j;
|
||||
int ret = 0;
|
||||
|
@ -869,7 +887,8 @@ int cpufreq_add_dev_symlink(unsigned int cpu, struct cpufreq_policy *policy)
|
|||
return ret;
|
||||
}
|
||||
|
||||
int cpufreq_add_dev_interface(unsigned int cpu, struct cpufreq_policy *policy,
|
||||
static int cpufreq_add_dev_interface(unsigned int cpu,
|
||||
struct cpufreq_policy *policy,
|
||||
struct sys_device *sys_dev)
|
||||
{
|
||||
struct cpufreq_policy new_policy;
|
||||
|
@ -902,6 +921,11 @@ int cpufreq_add_dev_interface(unsigned int cpu, struct cpufreq_policy *policy,
|
|||
if (ret)
|
||||
goto err_out_kobj_put;
|
||||
}
|
||||
if (cpufreq_driver->bios_limit) {
|
||||
ret = sysfs_create_file(&policy->kobj, &bios_limit.attr);
|
||||
if (ret)
|
||||
goto err_out_kobj_put;
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&cpufreq_driver_lock, flags);
|
||||
for_each_cpu(j, policy->cpus) {
|
||||
|
|
|
@ -164,20 +164,22 @@ static struct notifier_block dbs_cpufreq_notifier_block = {
|
|||
};
|
||||
|
||||
/************************** sysfs interface ************************/
|
||||
static ssize_t show_sampling_rate_max(struct cpufreq_policy *policy, char *buf)
|
||||
static ssize_t show_sampling_rate_max(struct kobject *kobj,
|
||||
struct attribute *attr, char *buf)
|
||||
{
|
||||
printk_once(KERN_INFO "CPUFREQ: conservative sampling_rate_max "
|
||||
"sysfs file is deprecated - used by: %s\n", current->comm);
|
||||
return sprintf(buf, "%u\n", -1U);
|
||||
}
|
||||
|
||||
static ssize_t show_sampling_rate_min(struct cpufreq_policy *policy, char *buf)
|
||||
static ssize_t show_sampling_rate_min(struct kobject *kobj,
|
||||
struct attribute *attr, char *buf)
|
||||
{
|
||||
return sprintf(buf, "%u\n", min_sampling_rate);
|
||||
}
|
||||
|
||||
#define define_one_ro(_name) \
|
||||
static struct freq_attr _name = \
|
||||
static struct global_attr _name = \
|
||||
__ATTR(_name, 0444, show_##_name, NULL)
|
||||
|
||||
define_one_ro(sampling_rate_max);
|
||||
|
@ -186,7 +188,7 @@ define_one_ro(sampling_rate_min);
|
|||
/* cpufreq_conservative Governor Tunables */
|
||||
#define show_one(file_name, object) \
|
||||
static ssize_t show_##file_name \
|
||||
(struct cpufreq_policy *unused, char *buf) \
|
||||
(struct kobject *kobj, struct attribute *attr, char *buf) \
|
||||
{ \
|
||||
return sprintf(buf, "%u\n", dbs_tuners_ins.object); \
|
||||
}
|
||||
|
@ -197,7 +199,39 @@ show_one(down_threshold, down_threshold);
|
|||
show_one(ignore_nice_load, ignore_nice);
|
||||
show_one(freq_step, freq_step);
|
||||
|
||||
static ssize_t store_sampling_down_factor(struct cpufreq_policy *unused,
|
||||
/*** delete after deprecation time ***/
|
||||
#define DEPRECATION_MSG(file_name) \
|
||||
printk_once(KERN_INFO "CPUFREQ: Per core conservative sysfs " \
|
||||
"interface is deprecated - " #file_name "\n");
|
||||
|
||||
#define show_one_old(file_name) \
|
||||
static ssize_t show_##file_name##_old \
|
||||
(struct cpufreq_policy *unused, char *buf) \
|
||||
{ \
|
||||
printk_once(KERN_INFO "CPUFREQ: Per core conservative sysfs " \
|
||||
"interface is deprecated - " #file_name "\n"); \
|
||||
return show_##file_name(NULL, NULL, buf); \
|
||||
}
|
||||
show_one_old(sampling_rate);
|
||||
show_one_old(sampling_down_factor);
|
||||
show_one_old(up_threshold);
|
||||
show_one_old(down_threshold);
|
||||
show_one_old(ignore_nice_load);
|
||||
show_one_old(freq_step);
|
||||
show_one_old(sampling_rate_min);
|
||||
show_one_old(sampling_rate_max);
|
||||
|
||||
#define define_one_ro_old(object, _name) \
|
||||
static struct freq_attr object = \
|
||||
__ATTR(_name, 0444, show_##_name##_old, NULL)
|
||||
|
||||
define_one_ro_old(sampling_rate_min_old, sampling_rate_min);
|
||||
define_one_ro_old(sampling_rate_max_old, sampling_rate_max);
|
||||
|
||||
/*** delete after deprecation time ***/
|
||||
|
||||
static ssize_t store_sampling_down_factor(struct kobject *a,
|
||||
struct attribute *b,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
unsigned int input;
|
||||
|
@ -214,7 +248,7 @@ static ssize_t store_sampling_down_factor(struct cpufreq_policy *unused,
|
|||
return count;
|
||||
}
|
||||
|
||||
static ssize_t store_sampling_rate(struct cpufreq_policy *unused,
|
||||
static ssize_t store_sampling_rate(struct kobject *a, struct attribute *b,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
unsigned int input;
|
||||
|
@ -231,7 +265,7 @@ static ssize_t store_sampling_rate(struct cpufreq_policy *unused,
|
|||
return count;
|
||||
}
|
||||
|
||||
static ssize_t store_up_threshold(struct cpufreq_policy *unused,
|
||||
static ssize_t store_up_threshold(struct kobject *a, struct attribute *b,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
unsigned int input;
|
||||
|
@ -251,7 +285,7 @@ static ssize_t store_up_threshold(struct cpufreq_policy *unused,
|
|||
return count;
|
||||
}
|
||||
|
||||
static ssize_t store_down_threshold(struct cpufreq_policy *unused,
|
||||
static ssize_t store_down_threshold(struct kobject *a, struct attribute *b,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
unsigned int input;
|
||||
|
@ -272,7 +306,7 @@ static ssize_t store_down_threshold(struct cpufreq_policy *unused,
|
|||
return count;
|
||||
}
|
||||
|
||||
static ssize_t store_ignore_nice_load(struct cpufreq_policy *policy,
|
||||
static ssize_t store_ignore_nice_load(struct kobject *a, struct attribute *b,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
unsigned int input;
|
||||
|
@ -308,7 +342,7 @@ static ssize_t store_ignore_nice_load(struct cpufreq_policy *policy,
|
|||
return count;
|
||||
}
|
||||
|
||||
static ssize_t store_freq_step(struct cpufreq_policy *policy,
|
||||
static ssize_t store_freq_step(struct kobject *a, struct attribute *b,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
unsigned int input;
|
||||
|
@ -331,7 +365,7 @@ static ssize_t store_freq_step(struct cpufreq_policy *policy,
|
|||
}
|
||||
|
||||
#define define_one_rw(_name) \
|
||||
static struct freq_attr _name = \
|
||||
static struct global_attr _name = \
|
||||
__ATTR(_name, 0644, show_##_name, store_##_name)
|
||||
|
||||
define_one_rw(sampling_rate);
|
||||
|
@ -358,6 +392,53 @@ static struct attribute_group dbs_attr_group = {
|
|||
.name = "conservative",
|
||||
};
|
||||
|
||||
/*** delete after deprecation time ***/
|
||||
|
||||
#define write_one_old(file_name) \
|
||||
static ssize_t store_##file_name##_old \
|
||||
(struct cpufreq_policy *unused, const char *buf, size_t count) \
|
||||
{ \
|
||||
printk_once(KERN_INFO "CPUFREQ: Per core conservative sysfs " \
|
||||
"interface is deprecated - " #file_name "\n"); \
|
||||
return store_##file_name(NULL, NULL, buf, count); \
|
||||
}
|
||||
write_one_old(sampling_rate);
|
||||
write_one_old(sampling_down_factor);
|
||||
write_one_old(up_threshold);
|
||||
write_one_old(down_threshold);
|
||||
write_one_old(ignore_nice_load);
|
||||
write_one_old(freq_step);
|
||||
|
||||
#define define_one_rw_old(object, _name) \
|
||||
static struct freq_attr object = \
|
||||
__ATTR(_name, 0644, show_##_name##_old, store_##_name##_old)
|
||||
|
||||
define_one_rw_old(sampling_rate_old, sampling_rate);
|
||||
define_one_rw_old(sampling_down_factor_old, sampling_down_factor);
|
||||
define_one_rw_old(up_threshold_old, up_threshold);
|
||||
define_one_rw_old(down_threshold_old, down_threshold);
|
||||
define_one_rw_old(ignore_nice_load_old, ignore_nice_load);
|
||||
define_one_rw_old(freq_step_old, freq_step);
|
||||
|
||||
static struct attribute *dbs_attributes_old[] = {
|
||||
&sampling_rate_max_old.attr,
|
||||
&sampling_rate_min_old.attr,
|
||||
&sampling_rate_old.attr,
|
||||
&sampling_down_factor_old.attr,
|
||||
&up_threshold_old.attr,
|
||||
&down_threshold_old.attr,
|
||||
&ignore_nice_load_old.attr,
|
||||
&freq_step_old.attr,
|
||||
NULL
|
||||
};
|
||||
|
||||
static struct attribute_group dbs_attr_group_old = {
|
||||
.attrs = dbs_attributes_old,
|
||||
.name = "conservative",
|
||||
};
|
||||
|
||||
/*** delete after deprecation time ***/
|
||||
|
||||
/************************** sysfs end ************************/
|
||||
|
||||
static void dbs_check_cpu(struct cpu_dbs_info_s *this_dbs_info)
|
||||
|
@ -530,7 +611,7 @@ static int cpufreq_governor_dbs(struct cpufreq_policy *policy,
|
|||
|
||||
mutex_lock(&dbs_mutex);
|
||||
|
||||
rc = sysfs_create_group(&policy->kobj, &dbs_attr_group);
|
||||
rc = sysfs_create_group(&policy->kobj, &dbs_attr_group_old);
|
||||
if (rc) {
|
||||
mutex_unlock(&dbs_mutex);
|
||||
return rc;
|
||||
|
@ -564,6 +645,13 @@ static int cpufreq_governor_dbs(struct cpufreq_policy *policy,
|
|||
if (latency == 0)
|
||||
latency = 1;
|
||||
|
||||
rc = sysfs_create_group(cpufreq_global_kobject,
|
||||
&dbs_attr_group);
|
||||
if (rc) {
|
||||
mutex_unlock(&dbs_mutex);
|
||||
return rc;
|
||||
}
|
||||
|
||||
/*
|
||||
* conservative does not implement micro like ondemand
|
||||
* governor, thus we are bound to jiffes/HZ
|
||||
|
@ -591,7 +679,7 @@ static int cpufreq_governor_dbs(struct cpufreq_policy *policy,
|
|||
dbs_timer_exit(this_dbs_info);
|
||||
|
||||
mutex_lock(&dbs_mutex);
|
||||
sysfs_remove_group(&policy->kobj, &dbs_attr_group);
|
||||
sysfs_remove_group(&policy->kobj, &dbs_attr_group_old);
|
||||
dbs_enable--;
|
||||
mutex_destroy(&this_dbs_info->timer_mutex);
|
||||
|
||||
|
@ -605,6 +693,9 @@ static int cpufreq_governor_dbs(struct cpufreq_policy *policy,
|
|||
CPUFREQ_TRANSITION_NOTIFIER);
|
||||
|
||||
mutex_unlock(&dbs_mutex);
|
||||
if (!dbs_enable)
|
||||
sysfs_remove_group(cpufreq_global_kobject,
|
||||
&dbs_attr_group);
|
||||
|
||||
break;
|
||||
|
||||
|
|
|
@ -295,6 +295,7 @@ static inline void acpi_processor_ffh_cstate_enter(struct acpi_processor_cx
|
|||
void acpi_processor_ppc_init(void);
|
||||
void acpi_processor_ppc_exit(void);
|
||||
int acpi_processor_ppc_has_changed(struct acpi_processor *pr);
|
||||
extern int acpi_processor_get_bios_limit(int cpu, unsigned int *limit);
|
||||
#else
|
||||
static inline void acpi_processor_ppc_init(void)
|
||||
{
|
||||
|
@ -316,6 +317,11 @@ static inline int acpi_processor_ppc_has_changed(struct acpi_processor *pr)
|
|||
}
|
||||
return 0;
|
||||
}
|
||||
static inline int acpi_processor_get_bios_limit(int cpu, unsigned int *limit)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_CPU_FREQ */
|
||||
|
||||
/* in processor_throttling.c */
|
||||
|
|
|
@ -232,6 +232,7 @@ struct cpufreq_driver {
|
|||
/* 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);
|
||||
int (*suspend) (struct cpufreq_policy *policy, pm_message_t pmsg);
|
||||
|
|
Loading…
Reference in a new issue