Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6
* 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6: x86 ACPI: Add support for Always Running APIC timer ACPI x86: Make aperf/mperf MSR access in acpi_cpufreq read_only ACPI x86: Cleanup acpi_cpufreq structures related to aperf/mperf ACPICA: delete check for AML access to port 0x81-83 ACPI: WMI: use .notify method instead of installing handler directly sony-laptop: use .notify method instead of installing handler directly panasonic-laptop: use .notify method instead of installing handler directly fujitsu-laptop: use .notify method instead of installing hotkey handler directly fujitsu-laptop: use .notify method instead of installing handler directly ACPI: video: use .notify method instead of installing handler directly ACPI: thermal: use .notify method instead of installing handler directly ACPI battery: fix async boot oops ACPI: delete acpi_device.g_list NULL noise: drivers/platform/x86/panasonic-laptop.c ACPI: cpufreq: remove dupilcated #include ACPI: Adjust Kelvin offset to match local implementation ACPI: convert acpi_device_lock spinlock to mutex
This commit is contained in:
@@ -154,6 +154,7 @@
|
||||
* CPUID levels like 0x6, 0xA etc
|
||||
*/
|
||||
#define X86_FEATURE_IDA (7*32+ 0) /* Intel Dynamic Acceleration */
|
||||
#define X86_FEATURE_ARAT (7*32+ 1) /* Always Running APIC Timer */
|
||||
|
||||
/* Virtualization flags: Linux defined */
|
||||
#define X86_FEATURE_TPR_SHADOW (8*32+ 0) /* Intel TPR Shadow */
|
||||
|
@@ -431,6 +431,12 @@ static void __cpuinit setup_APIC_timer(void)
|
||||
{
|
||||
struct clock_event_device *levt = &__get_cpu_var(lapic_events);
|
||||
|
||||
if (cpu_has(¤t_cpu_data, X86_FEATURE_ARAT)) {
|
||||
lapic_clockevent.features &= ~CLOCK_EVT_FEAT_C3STOP;
|
||||
/* Make LAPIC timer preferrable over percpu HPET */
|
||||
lapic_clockevent.rating = 150;
|
||||
}
|
||||
|
||||
memcpy(levt, &lapic_clockevent, sizeof(*levt));
|
||||
levt->cpumask = cpumask_of(smp_processor_id());
|
||||
|
||||
|
@@ -31,6 +31,7 @@ void __cpuinit init_scattered_cpuid_features(struct cpuinfo_x86 *c)
|
||||
|
||||
static const struct cpuid_bit __cpuinitconst cpuid_bits[] = {
|
||||
{ X86_FEATURE_IDA, CR_EAX, 1, 0x00000006 },
|
||||
{ X86_FEATURE_ARAT, CR_EAX, 2, 0x00000006 },
|
||||
{ 0, 0, 0, 0 }
|
||||
};
|
||||
|
||||
|
@@ -68,6 +68,7 @@ struct acpi_cpufreq_data {
|
||||
unsigned int max_freq;
|
||||
unsigned int resume;
|
||||
unsigned int cpu_feature;
|
||||
u64 saved_aperf, saved_mperf;
|
||||
};
|
||||
|
||||
static DEFINE_PER_CPU(struct acpi_cpufreq_data *, drv_data);
|
||||
@@ -241,26 +242,23 @@ static u32 get_cur_val(const struct cpumask *mask)
|
||||
return cmd.val;
|
||||
}
|
||||
|
||||
struct perf_cur {
|
||||
struct perf_pair {
|
||||
union {
|
||||
struct {
|
||||
u32 lo;
|
||||
u32 hi;
|
||||
} split;
|
||||
u64 whole;
|
||||
} aperf_cur, mperf_cur;
|
||||
} aperf, mperf;
|
||||
};
|
||||
|
||||
|
||||
static long read_measured_perf_ctrs(void *_cur)
|
||||
{
|
||||
struct perf_cur *cur = _cur;
|
||||
struct perf_pair *cur = _cur;
|
||||
|
||||
rdmsr(MSR_IA32_APERF, cur->aperf_cur.split.lo, cur->aperf_cur.split.hi);
|
||||
rdmsr(MSR_IA32_MPERF, cur->mperf_cur.split.lo, cur->mperf_cur.split.hi);
|
||||
|
||||
wrmsr(MSR_IA32_APERF, 0, 0);
|
||||
wrmsr(MSR_IA32_MPERF, 0, 0);
|
||||
rdmsr(MSR_IA32_APERF, cur->aperf.split.lo, cur->aperf.split.hi);
|
||||
rdmsr(MSR_IA32_MPERF, cur->mperf.split.lo, cur->mperf.split.hi);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -281,52 +279,57 @@ static long read_measured_perf_ctrs(void *_cur)
|
||||
static unsigned int get_measured_perf(struct cpufreq_policy *policy,
|
||||
unsigned int cpu)
|
||||
{
|
||||
struct perf_cur cur;
|
||||
struct perf_pair readin, cur;
|
||||
unsigned int perf_percent;
|
||||
unsigned int retval;
|
||||
|
||||
if (!work_on_cpu(cpu, read_measured_perf_ctrs, &cur))
|
||||
if (!work_on_cpu(cpu, read_measured_perf_ctrs, &readin))
|
||||
return 0;
|
||||
|
||||
cur.aperf.whole = readin.aperf.whole -
|
||||
per_cpu(drv_data, cpu)->saved_aperf;
|
||||
cur.mperf.whole = readin.mperf.whole -
|
||||
per_cpu(drv_data, cpu)->saved_mperf;
|
||||
per_cpu(drv_data, cpu)->saved_aperf = readin.aperf.whole;
|
||||
per_cpu(drv_data, cpu)->saved_mperf = readin.mperf.whole;
|
||||
|
||||
#ifdef __i386__
|
||||
/*
|
||||
* We dont want to do 64 bit divide with 32 bit kernel
|
||||
* Get an approximate value. Return failure in case we cannot get
|
||||
* an approximate value.
|
||||
*/
|
||||
if (unlikely(cur.aperf_cur.split.hi || cur.mperf_cur.split.hi)) {
|
||||
if (unlikely(cur.aperf.split.hi || cur.mperf.split.hi)) {
|
||||
int shift_count;
|
||||
u32 h;
|
||||
|
||||
h = max_t(u32, cur.aperf_cur.split.hi, cur.mperf_cur.split.hi);
|
||||
h = max_t(u32, cur.aperf.split.hi, cur.mperf.split.hi);
|
||||
shift_count = fls(h);
|
||||
|
||||
cur.aperf_cur.whole >>= shift_count;
|
||||
cur.mperf_cur.whole >>= shift_count;
|
||||
cur.aperf.whole >>= shift_count;
|
||||
cur.mperf.whole >>= shift_count;
|
||||
}
|
||||
|
||||
if (((unsigned long)(-1) / 100) < cur.aperf_cur.split.lo) {
|
||||
if (((unsigned long)(-1) / 100) < cur.aperf.split.lo) {
|
||||
int shift_count = 7;
|
||||
cur.aperf_cur.split.lo >>= shift_count;
|
||||
cur.mperf_cur.split.lo >>= shift_count;
|
||||
cur.aperf.split.lo >>= shift_count;
|
||||
cur.mperf.split.lo >>= shift_count;
|
||||
}
|
||||
|
||||
if (cur.aperf_cur.split.lo && cur.mperf_cur.split.lo)
|
||||
perf_percent = (cur.aperf_cur.split.lo * 100) /
|
||||
cur.mperf_cur.split.lo;
|
||||
if (cur.aperf.split.lo && cur.mperf.split.lo)
|
||||
perf_percent = (cur.aperf.split.lo * 100) / cur.mperf.split.lo;
|
||||
else
|
||||
perf_percent = 0;
|
||||
|
||||
#else
|
||||
if (unlikely(((unsigned long)(-1) / 100) < cur.aperf_cur.whole)) {
|
||||
if (unlikely(((unsigned long)(-1) / 100) < cur.aperf.whole)) {
|
||||
int shift_count = 7;
|
||||
cur.aperf_cur.whole >>= shift_count;
|
||||
cur.mperf_cur.whole >>= shift_count;
|
||||
cur.aperf.whole >>= shift_count;
|
||||
cur.mperf.whole >>= shift_count;
|
||||
}
|
||||
|
||||
if (cur.aperf_cur.whole && cur.mperf_cur.whole)
|
||||
perf_percent = (cur.aperf_cur.whole * 100) /
|
||||
cur.mperf_cur.whole;
|
||||
if (cur.aperf.whole && cur.mperf.whole)
|
||||
perf_percent = (cur.aperf.whole * 100) / cur.mperf.whole;
|
||||
else
|
||||
perf_percent = 0;
|
||||
|
||||
|
@@ -33,7 +33,6 @@
|
||||
#include <linux/timex.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/kernel.h>
|
||||
|
||||
#include <asm/msr.h>
|
||||
#include <acpi/processor.h>
|
||||
|
Reference in New Issue
Block a user