mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-11-18 23:54:26 +08: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
@ -136,6 +136,24 @@ Description: Discover cpuidle policy and mechanism
|
|||||||
See files in Documentation/cpuidle/ for more information.
|
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
|
What: /sys/devices/system/cpu/cpu*/cache/index*/cache_disable_X
|
||||||
Date: August 2008
|
Date: August 2008
|
||||||
KernelVersion: 2.6.27
|
KernelVersion: 2.6.27
|
||||||
|
@ -92,9 +92,9 @@ policy->cpuinfo.max_freq - the minimum and maximum frequency
|
|||||||
(in kHz) which is supported by
|
(in kHz) which is supported by
|
||||||
this CPU
|
this CPU
|
||||||
policy->cpuinfo.transition_latency the time it takes on this CPU to
|
policy->cpuinfo.transition_latency the time it takes on this CPU to
|
||||||
switch between two frequencies (if
|
switch between two frequencies in
|
||||||
appropriate, else specify
|
nanoseconds (if appropriate, else
|
||||||
CPUFREQ_ETERNAL)
|
specify CPUFREQ_ETERNAL)
|
||||||
|
|
||||||
policy->cur The current operating frequency of
|
policy->cur The current operating frequency of
|
||||||
this CPU (if appropriate)
|
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
|
the frequency the kernel thinks the CPU runs
|
||||||
at.
|
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
|
If you have selected the "userspace" governor which allows you to
|
||||||
set the CPU operating frequency to a specific value, you can read out
|
set the CPU operating frequency to a specific value, you can read out
|
||||||
the current frequency in
|
the current frequency in
|
||||||
|
@ -764,14 +764,15 @@ static struct freq_attr *acpi_cpufreq_attr[] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static struct cpufreq_driver acpi_cpufreq_driver = {
|
static struct cpufreq_driver acpi_cpufreq_driver = {
|
||||||
.verify = acpi_cpufreq_verify,
|
.verify = acpi_cpufreq_verify,
|
||||||
.target = acpi_cpufreq_target,
|
.target = acpi_cpufreq_target,
|
||||||
.init = acpi_cpufreq_cpu_init,
|
.bios_limit = acpi_processor_get_bios_limit,
|
||||||
.exit = acpi_cpufreq_cpu_exit,
|
.init = acpi_cpufreq_cpu_init,
|
||||||
.resume = acpi_cpufreq_resume,
|
.exit = acpi_cpufreq_cpu_exit,
|
||||||
.name = "acpi-cpufreq",
|
.resume = acpi_cpufreq_resume,
|
||||||
.owner = THIS_MODULE,
|
.name = "acpi-cpufreq",
|
||||||
.attr = acpi_cpufreq_attr,
|
.owner = THIS_MODULE,
|
||||||
|
.attr = acpi_cpufreq_attr,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __init acpi_cpufreq_init(void)
|
static int __init acpi_cpufreq_init(void)
|
||||||
|
@ -164,7 +164,7 @@ static int powernow_k6_cpu_init(struct cpufreq_policy *policy)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* cpuinfo and default policy values */
|
/* cpuinfo and default policy values */
|
||||||
policy->cpuinfo.transition_latency = CPUFREQ_ETERNAL;
|
policy->cpuinfo.transition_latency = 200000;
|
||||||
policy->cur = busfreq * max_multiplier;
|
policy->cur = busfreq * max_multiplier;
|
||||||
|
|
||||||
result = cpufreq_frequency_table_cpuinfo(policy, clock_ratio);
|
result = cpufreq_frequency_table_cpuinfo(policy, clock_ratio);
|
||||||
|
@ -714,14 +714,17 @@ static struct freq_attr *powernow_table_attr[] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static struct cpufreq_driver powernow_driver = {
|
static struct cpufreq_driver powernow_driver = {
|
||||||
.verify = powernow_verify,
|
.verify = powernow_verify,
|
||||||
.target = powernow_target,
|
.target = powernow_target,
|
||||||
.get = powernow_get,
|
.get = powernow_get,
|
||||||
.init = powernow_cpu_init,
|
#ifdef CONFIG_X86_POWERNOW_K7_ACPI
|
||||||
.exit = powernow_cpu_exit,
|
.bios_limit = acpi_processor_get_bios_limit,
|
||||||
.name = "powernow-k7",
|
#endif
|
||||||
.owner = THIS_MODULE,
|
.init = powernow_cpu_init,
|
||||||
.attr = powernow_table_attr,
|
.exit = powernow_cpu_exit,
|
||||||
|
.name = "powernow-k7",
|
||||||
|
.owner = THIS_MODULE,
|
||||||
|
.attr = powernow_table_attr,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __init powernow_init(void)
|
static int __init powernow_init(void)
|
||||||
|
@ -1118,7 +1118,7 @@ static int transition_frequency_pstate(struct powernow_k8_data *data,
|
|||||||
static int powernowk8_target(struct cpufreq_policy *pol,
|
static int powernowk8_target(struct cpufreq_policy *pol,
|
||||||
unsigned targfreq, unsigned relation)
|
unsigned targfreq, unsigned relation)
|
||||||
{
|
{
|
||||||
cpumask_t oldmask;
|
cpumask_var_t oldmask;
|
||||||
struct powernow_k8_data *data = per_cpu(powernow_data, pol->cpu);
|
struct powernow_k8_data *data = per_cpu(powernow_data, pol->cpu);
|
||||||
u32 checkfid;
|
u32 checkfid;
|
||||||
u32 checkvid;
|
u32 checkvid;
|
||||||
@ -1131,9 +1131,13 @@ static int powernowk8_target(struct cpufreq_policy *pol,
|
|||||||
checkfid = data->currfid;
|
checkfid = data->currfid;
|
||||||
checkvid = data->currvid;
|
checkvid = data->currvid;
|
||||||
|
|
||||||
/* only run on specific CPU from here on */
|
/* only run on specific CPU from here on. */
|
||||||
oldmask = current->cpus_allowed;
|
/* This is poor form: use a workqueue or smp_call_function_single */
|
||||||
set_cpus_allowed_ptr(current, &cpumask_of_cpu(pol->cpu));
|
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) {
|
if (smp_processor_id() != pol->cpu) {
|
||||||
printk(KERN_ERR PFX "limiting to cpu %u failed\n", 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;
|
ret = 0;
|
||||||
|
|
||||||
err_out:
|
err_out:
|
||||||
set_cpus_allowed_ptr(current, &oldmask);
|
set_cpus_allowed_ptr(current, oldmask);
|
||||||
|
free_cpumask_var(oldmask);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1393,14 +1398,15 @@ static struct freq_attr *powernow_k8_attr[] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static struct cpufreq_driver cpufreq_amd64_driver = {
|
static struct cpufreq_driver cpufreq_amd64_driver = {
|
||||||
.verify = powernowk8_verify,
|
.verify = powernowk8_verify,
|
||||||
.target = powernowk8_target,
|
.target = powernowk8_target,
|
||||||
.init = powernowk8_cpu_init,
|
.bios_limit = acpi_processor_get_bios_limit,
|
||||||
.exit = __devexit_p(powernowk8_cpu_exit),
|
.init = powernowk8_cpu_init,
|
||||||
.get = powernowk8_get,
|
.exit = __devexit_p(powernowk8_cpu_exit),
|
||||||
.name = "powernow-k8",
|
.get = powernowk8_get,
|
||||||
.owner = THIS_MODULE,
|
.name = "powernow-k8",
|
||||||
.attr = powernow_k8_attr,
|
.owner = THIS_MODULE,
|
||||||
|
.attr = powernow_k8_attr,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* driver entry point for init */
|
/* driver entry point for init */
|
||||||
|
@ -39,7 +39,7 @@ static struct pci_dev *speedstep_chipset_dev;
|
|||||||
|
|
||||||
/* speedstep_processor
|
/* speedstep_processor
|
||||||
*/
|
*/
|
||||||
static unsigned int speedstep_processor;
|
static enum speedstep_processor speedstep_processor;
|
||||||
|
|
||||||
static u32 pmbase;
|
static u32 pmbase;
|
||||||
|
|
||||||
|
@ -34,7 +34,7 @@ static int relaxed_check;
|
|||||||
* GET PROCESSOR CORE SPEED IN KHZ *
|
* 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 */
|
/* See table 14 of p3_ds.pdf and table 22 of 29834003.pdf */
|
||||||
struct {
|
struct {
|
||||||
@ -227,7 +227,7 @@ static unsigned int pentium4_get_frequency(void)
|
|||||||
|
|
||||||
|
|
||||||
/* Warning: may get called from smp_call_function_single. */
|
/* 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) {
|
switch (processor) {
|
||||||
case SPEEDSTEP_CPU_PCORE:
|
case SPEEDSTEP_CPU_PCORE:
|
||||||
@ -380,7 +380,7 @@ EXPORT_SYMBOL_GPL(speedstep_detect_processor);
|
|||||||
* DETECT SPEEDSTEP SPEEDS *
|
* 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 *low_speed,
|
||||||
unsigned int *high_speed,
|
unsigned int *high_speed,
|
||||||
unsigned int *transition_latency,
|
unsigned int *transition_latency,
|
||||||
|
@ -11,18 +11,18 @@
|
|||||||
|
|
||||||
|
|
||||||
/* processors */
|
/* processors */
|
||||||
|
enum speedstep_processor {
|
||||||
#define SPEEDSTEP_CPU_PIII_C_EARLY 0x00000001 /* Coppermine core */
|
SPEEDSTEP_CPU_PIII_C_EARLY = 0x00000001, /* Coppermine core */
|
||||||
#define SPEEDSTEP_CPU_PIII_C 0x00000002 /* Coppermine core */
|
SPEEDSTEP_CPU_PIII_C = 0x00000002, /* Coppermine core */
|
||||||
#define SPEEDSTEP_CPU_PIII_T 0x00000003 /* Tualatin core */
|
SPEEDSTEP_CPU_PIII_T = 0x00000003, /* Tualatin core */
|
||||||
#define SPEEDSTEP_CPU_P4M 0x00000004 /* P4-M */
|
SPEEDSTEP_CPU_P4M = 0x00000004, /* P4-M */
|
||||||
|
|
||||||
/* the following processors are not speedstep-capable and are not auto-detected
|
/* the following processors are not speedstep-capable and are not auto-detected
|
||||||
* in speedstep_detect_processor(). However, their speed can be detected using
|
* in speedstep_detect_processor(). However, their speed can be detected using
|
||||||
* the speedstep_get_frequency() call. */
|
* the speedstep_get_frequency() call. */
|
||||||
#define SPEEDSTEP_CPU_PM 0xFFFFFF03 /* Pentium M */
|
SPEEDSTEP_CPU_PM = 0xFFFFFF03, /* Pentium M */
|
||||||
#define SPEEDSTEP_CPU_P4D 0xFFFFFF04 /* desktop P4 */
|
SPEEDSTEP_CPU_P4D = 0xFFFFFF04, /* desktop P4 */
|
||||||
#define SPEEDSTEP_CPU_PCORE 0xFFFFFF05 /* Core */
|
SPEEDSTEP_CPU_PCORE = 0xFFFFFF05, /* Core */
|
||||||
|
};
|
||||||
|
|
||||||
/* speedstep states -- only two of them */
|
/* speedstep states -- only two of them */
|
||||||
|
|
||||||
@ -31,10 +31,10 @@
|
|||||||
|
|
||||||
|
|
||||||
/* detect a speedstep-capable processor */
|
/* 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 */
|
/* 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
|
/* 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
|
* SPEEDSTEP_LOW; the second argument is zero so that no
|
||||||
* cpufreq_notify_transition calls are initiated.
|
* 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 *low_speed,
|
||||||
unsigned int *high_speed,
|
unsigned int *high_speed,
|
||||||
unsigned int *transition_latency,
|
unsigned int *transition_latency,
|
||||||
|
@ -35,7 +35,7 @@ static int smi_cmd;
|
|||||||
static unsigned int smi_sig;
|
static unsigned int smi_sig;
|
||||||
|
|
||||||
/* info about the processor */
|
/* 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
|
* 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);
|
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)
|
void acpi_processor_ppc_init(void)
|
||||||
{
|
{
|
||||||
if (!cpufreq_register_notifier
|
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);
|
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) \
|
#define define_one_ro(_name) \
|
||||||
static struct freq_attr _name = \
|
static struct freq_attr _name = \
|
||||||
__ATTR(_name, 0444, show_##_name, NULL)
|
__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_available_governors);
|
||||||
define_one_ro(scaling_driver);
|
define_one_ro(scaling_driver);
|
||||||
define_one_ro(scaling_cur_freq);
|
define_one_ro(scaling_cur_freq);
|
||||||
|
define_one_ro(bios_limit);
|
||||||
define_one_ro(related_cpus);
|
define_one_ro(related_cpus);
|
||||||
define_one_ro(affected_cpus);
|
define_one_ro(affected_cpus);
|
||||||
define_one_rw(scaling_min_freq);
|
define_one_rw(scaling_min_freq);
|
||||||
@ -767,8 +783,9 @@ static struct kobj_type ktype_cpufreq = {
|
|||||||
* 0: Success
|
* 0: Success
|
||||||
* Positive: When we have a managed CPU and the sysfs got symlinked
|
* 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 sys_device *sys_dev)
|
struct cpufreq_policy *policy,
|
||||||
|
struct sys_device *sys_dev)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
@ -842,7 +859,8 @@ int cpufreq_add_dev_policy(unsigned int cpu, struct cpufreq_policy *policy,
|
|||||||
|
|
||||||
|
|
||||||
/* symlink affected CPUs */
|
/* 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;
|
unsigned int j;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
@ -869,8 +887,9 @@ int cpufreq_add_dev_symlink(unsigned int cpu, struct cpufreq_policy *policy)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int cpufreq_add_dev_interface(unsigned int cpu, struct cpufreq_policy *policy,
|
static int cpufreq_add_dev_interface(unsigned int cpu,
|
||||||
struct sys_device *sys_dev)
|
struct cpufreq_policy *policy,
|
||||||
|
struct sys_device *sys_dev)
|
||||||
{
|
{
|
||||||
struct cpufreq_policy new_policy;
|
struct cpufreq_policy new_policy;
|
||||||
struct freq_attr **drv_attr;
|
struct freq_attr **drv_attr;
|
||||||
@ -902,6 +921,11 @@ int cpufreq_add_dev_interface(unsigned int cpu, struct cpufreq_policy *policy,
|
|||||||
if (ret)
|
if (ret)
|
||||||
goto err_out_kobj_put;
|
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);
|
spin_lock_irqsave(&cpufreq_driver_lock, flags);
|
||||||
for_each_cpu(j, policy->cpus) {
|
for_each_cpu(j, policy->cpus) {
|
||||||
|
@ -164,20 +164,22 @@ static struct notifier_block dbs_cpufreq_notifier_block = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/************************** sysfs interface ************************/
|
/************************** 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 "
|
printk_once(KERN_INFO "CPUFREQ: conservative sampling_rate_max "
|
||||||
"sysfs file is deprecated - used by: %s\n", current->comm);
|
"sysfs file is deprecated - used by: %s\n", current->comm);
|
||||||
return sprintf(buf, "%u\n", -1U);
|
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);
|
return sprintf(buf, "%u\n", min_sampling_rate);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define define_one_ro(_name) \
|
#define define_one_ro(_name) \
|
||||||
static struct freq_attr _name = \
|
static struct global_attr _name = \
|
||||||
__ATTR(_name, 0444, show_##_name, NULL)
|
__ATTR(_name, 0444, show_##_name, NULL)
|
||||||
|
|
||||||
define_one_ro(sampling_rate_max);
|
define_one_ro(sampling_rate_max);
|
||||||
@ -186,7 +188,7 @@ define_one_ro(sampling_rate_min);
|
|||||||
/* cpufreq_conservative Governor Tunables */
|
/* cpufreq_conservative Governor Tunables */
|
||||||
#define show_one(file_name, object) \
|
#define show_one(file_name, object) \
|
||||||
static ssize_t show_##file_name \
|
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); \
|
return sprintf(buf, "%u\n", dbs_tuners_ins.object); \
|
||||||
}
|
}
|
||||||
@ -197,8 +199,40 @@ show_one(down_threshold, down_threshold);
|
|||||||
show_one(ignore_nice_load, ignore_nice);
|
show_one(ignore_nice_load, ignore_nice);
|
||||||
show_one(freq_step, freq_step);
|
show_one(freq_step, freq_step);
|
||||||
|
|
||||||
static ssize_t store_sampling_down_factor(struct cpufreq_policy *unused,
|
/*** delete after deprecation time ***/
|
||||||
const char *buf, size_t count)
|
#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;
|
unsigned int input;
|
||||||
int ret;
|
int ret;
|
||||||
@ -214,8 +248,8 @@ static ssize_t store_sampling_down_factor(struct cpufreq_policy *unused,
|
|||||||
return count;
|
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)
|
const char *buf, size_t count)
|
||||||
{
|
{
|
||||||
unsigned int input;
|
unsigned int input;
|
||||||
int ret;
|
int ret;
|
||||||
@ -231,8 +265,8 @@ static ssize_t store_sampling_rate(struct cpufreq_policy *unused,
|
|||||||
return count;
|
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)
|
const char *buf, size_t count)
|
||||||
{
|
{
|
||||||
unsigned int input;
|
unsigned int input;
|
||||||
int ret;
|
int ret;
|
||||||
@ -251,8 +285,8 @@ static ssize_t store_up_threshold(struct cpufreq_policy *unused,
|
|||||||
return count;
|
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)
|
const char *buf, size_t count)
|
||||||
{
|
{
|
||||||
unsigned int input;
|
unsigned int input;
|
||||||
int ret;
|
int ret;
|
||||||
@ -272,8 +306,8 @@ static ssize_t store_down_threshold(struct cpufreq_policy *unused,
|
|||||||
return count;
|
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)
|
const char *buf, size_t count)
|
||||||
{
|
{
|
||||||
unsigned int input;
|
unsigned int input;
|
||||||
int ret;
|
int ret;
|
||||||
@ -308,8 +342,8 @@ static ssize_t store_ignore_nice_load(struct cpufreq_policy *policy,
|
|||||||
return count;
|
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)
|
const char *buf, size_t count)
|
||||||
{
|
{
|
||||||
unsigned int input;
|
unsigned int input;
|
||||||
int ret;
|
int ret;
|
||||||
@ -331,7 +365,7 @@ static ssize_t store_freq_step(struct cpufreq_policy *policy,
|
|||||||
}
|
}
|
||||||
|
|
||||||
#define define_one_rw(_name) \
|
#define define_one_rw(_name) \
|
||||||
static struct freq_attr _name = \
|
static struct global_attr _name = \
|
||||||
__ATTR(_name, 0644, show_##_name, store_##_name)
|
__ATTR(_name, 0644, show_##_name, store_##_name)
|
||||||
|
|
||||||
define_one_rw(sampling_rate);
|
define_one_rw(sampling_rate);
|
||||||
@ -358,6 +392,53 @@ static struct attribute_group dbs_attr_group = {
|
|||||||
.name = "conservative",
|
.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 ************************/
|
/************************** sysfs end ************************/
|
||||||
|
|
||||||
static void dbs_check_cpu(struct cpu_dbs_info_s *this_dbs_info)
|
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);
|
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) {
|
if (rc) {
|
||||||
mutex_unlock(&dbs_mutex);
|
mutex_unlock(&dbs_mutex);
|
||||||
return rc;
|
return rc;
|
||||||
@ -564,6 +645,13 @@ static int cpufreq_governor_dbs(struct cpufreq_policy *policy,
|
|||||||
if (latency == 0)
|
if (latency == 0)
|
||||||
latency = 1;
|
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
|
* conservative does not implement micro like ondemand
|
||||||
* governor, thus we are bound to jiffes/HZ
|
* 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);
|
dbs_timer_exit(this_dbs_info);
|
||||||
|
|
||||||
mutex_lock(&dbs_mutex);
|
mutex_lock(&dbs_mutex);
|
||||||
sysfs_remove_group(&policy->kobj, &dbs_attr_group);
|
sysfs_remove_group(&policy->kobj, &dbs_attr_group_old);
|
||||||
dbs_enable--;
|
dbs_enable--;
|
||||||
mutex_destroy(&this_dbs_info->timer_mutex);
|
mutex_destroy(&this_dbs_info->timer_mutex);
|
||||||
|
|
||||||
@ -605,6 +693,9 @@ static int cpufreq_governor_dbs(struct cpufreq_policy *policy,
|
|||||||
CPUFREQ_TRANSITION_NOTIFIER);
|
CPUFREQ_TRANSITION_NOTIFIER);
|
||||||
|
|
||||||
mutex_unlock(&dbs_mutex);
|
mutex_unlock(&dbs_mutex);
|
||||||
|
if (!dbs_enable)
|
||||||
|
sysfs_remove_group(cpufreq_global_kobject,
|
||||||
|
&dbs_attr_group);
|
||||||
|
|
||||||
break;
|
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_init(void);
|
||||||
void acpi_processor_ppc_exit(void);
|
void acpi_processor_ppc_exit(void);
|
||||||
int acpi_processor_ppc_has_changed(struct acpi_processor *pr);
|
int acpi_processor_ppc_has_changed(struct acpi_processor *pr);
|
||||||
|
extern int acpi_processor_get_bios_limit(int cpu, unsigned int *limit);
|
||||||
#else
|
#else
|
||||||
static inline void acpi_processor_ppc_init(void)
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
static inline int acpi_processor_get_bios_limit(int cpu, unsigned int *limit)
|
||||||
|
{
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* CONFIG_CPU_FREQ */
|
#endif /* CONFIG_CPU_FREQ */
|
||||||
|
|
||||||
/* in processor_throttling.c */
|
/* in processor_throttling.c */
|
||||||
|
@ -232,6 +232,7 @@ struct cpufreq_driver {
|
|||||||
/* optional */
|
/* optional */
|
||||||
unsigned int (*getavg) (struct cpufreq_policy *policy,
|
unsigned int (*getavg) (struct cpufreq_policy *policy,
|
||||||
unsigned int cpu);
|
unsigned int cpu);
|
||||||
|
int (*bios_limit) (int cpu, unsigned int *limit);
|
||||||
|
|
||||||
int (*exit) (struct cpufreq_policy *policy);
|
int (*exit) (struct cpufreq_policy *policy);
|
||||||
int (*suspend) (struct cpufreq_policy *policy, pm_message_t pmsg);
|
int (*suspend) (struct cpufreq_policy *policy, pm_message_t pmsg);
|
||||||
|
Loading…
Reference in New Issue
Block a user