Merge master.kernel.org:/pub/scm/linux/kernel/git/davej/agpgart
[pandora-kernel.git] / arch / i386 / kernel / cpu / cpufreq / acpi-cpufreq.c
index f8a8e46..10baa35 100644 (file)
@@ -32,7 +32,6 @@
 #include <linux/sched.h>
 #include <linux/cpufreq.h>
 #include <linux/compiler.h>
-#include <linux/sched.h>       /* current */
 #include <linux/dmi.h>
 
 #include <linux/acpi.h>
@@ -93,7 +92,7 @@ static unsigned extract_io(u32 value, struct acpi_cpufreq_data *data)
 
        perf = data->acpi_data;
 
-       for (i = 0; i < perf->state_count; i++) {
+       for (i=0; i<perf->state_count; i++) {
                if (value == perf->states[i].status)
                        return data->freq_table[i].frequency;
        }
@@ -108,7 +107,7 @@ static unsigned extract_msr(u32 msr, struct acpi_cpufreq_data *data)
        msr &= INTEL_MSR_RANGE;
        perf = data->acpi_data;
 
-       for (i = 0; data->freq_table[i].frequency != CPUFREQ_TABLE_END; i++) {
+       for (i=0; data->freq_table[i].frequency != CPUFREQ_TABLE_END; i++) {
                if (msr == perf->states[data->freq_table[i].index].status)
                        return data->freq_table[i].frequency;
        }
@@ -127,29 +126,6 @@ static unsigned extract_freq(u32 val, struct acpi_cpufreq_data *data)
        }
 }
 
-static void wrport(u16 port, u8 bit_width, u32 value)
-{
-       if (bit_width <= 8) {
-               outb(value, port);
-       } else if (bit_width <= 16) {
-               outw(value, port);
-       } else if (bit_width <= 32) {
-               outl(value, port);
-       }
-}
-
-static void rdport(u16 port, u8 bit_width, u32 * ret)
-{
-       *ret = 0;
-       if (bit_width <= 8) {
-               *ret = inb(port);
-       } else if (bit_width <= 16) {
-               *ret = inw(port);
-       } else if (bit_width <= 32) {
-               *ret = inl(port);
-       }
-}
-
 struct msr_addr {
        u32 reg;
 };
@@ -180,7 +156,9 @@ static void do_drv_read(struct drv_cmd *cmd)
                rdmsr(cmd->addr.msr.reg, cmd->val, h);
                break;
        case SYSTEM_IO_CAPABLE:
-               rdport(cmd->addr.io.port, cmd->addr.io.bit_width, &cmd->val);
+               acpi_os_read_port((acpi_io_address)cmd->addr.io.port,
+                               &cmd->val,
+                               (u32)cmd->addr.io.bit_width);
                break;
        default:
                break;
@@ -196,14 +174,16 @@ static void do_drv_write(struct drv_cmd *cmd)
                wrmsr(cmd->addr.msr.reg, cmd->val, h);
                break;
        case SYSTEM_IO_CAPABLE:
-               wrport(cmd->addr.io.port, cmd->addr.io.bit_width, cmd->val);
+               acpi_os_write_port((acpi_io_address)cmd->addr.io.port,
+                               cmd->val,
+                               (u32)cmd->addr.io.bit_width);
                break;
        default:
                break;
        }
 }
 
-static inline void drv_read(struct drv_cmd *cmd)
+static void drv_read(struct drv_cmd *cmd)
 {
        cpumask_t saved_mask = current->cpus_allowed;
        cmd->val = 0;
@@ -211,7 +191,6 @@ static inline void drv_read(struct drv_cmd *cmd)
        set_cpus_allowed(current, cmd->mask);
        do_drv_read(cmd);
        set_cpus_allowed(current, saved_mask);
-
 }
 
 static void drv_write(struct drv_cmd *cmd)
@@ -324,11 +303,10 @@ static unsigned int get_measured_perf(unsigned int cpu)
                mperf_cur.split.lo >>= shift_count;
        }
 
-       if (aperf_cur.split.lo && mperf_cur.split.lo) {
+       if (aperf_cur.split.lo && mperf_cur.split.lo)
                perf_percent = (aperf_cur.split.lo * 100) / mperf_cur.split.lo;
-       } else {
+       else
                perf_percent = 0;
-       }
 
 #else
        if (unlikely(((unsigned long)(-1) / 100) < aperf_cur.whole)) {
@@ -337,11 +315,10 @@ static unsigned int get_measured_perf(unsigned int cpu)
                mperf_cur.whole >>= shift_count;
        }
 
-       if (aperf_cur.whole && mperf_cur.whole) {
+       if (aperf_cur.whole && mperf_cur.whole)
                perf_percent = (aperf_cur.whole * 100) / mperf_cur.whole;
-       } else {
+       else
                perf_percent = 0;
-       }
 
 #endif
 
@@ -378,7 +355,7 @@ static unsigned int check_freqs(cpumask_t mask, unsigned int freq,
        unsigned int cur_freq;
        unsigned int i;
 
-       for (i = 0; i < 100; i++) {
+       for (i=0; i<100; i++) {
                cur_freq = extract_freq(get_cur_val(mask), data);
                if (cur_freq == freq)
                        return 1;
@@ -396,15 +373,15 @@ static int acpi_cpufreq_target(struct cpufreq_policy *policy,
        cpumask_t online_policy_cpus;
        struct drv_cmd cmd;
        unsigned int msr;
-       unsigned int next_state = 0;
-       unsigned int next_perf_state = 0;
+       unsigned int next_state = 0; /* Index into freq_table */
+       unsigned int next_perf_state = 0; /* Index into perf table */
        unsigned int i;
        int result = 0;
 
        dprintk("acpi_cpufreq_target %d (%d)\n", target_freq, policy->cpu);
 
        if (unlikely(data == NULL ||
-                    data->acpi_data == NULL || data->freq_table == NULL)) {
+            data->acpi_data == NULL || data->freq_table == NULL)) {
                return -ENODEV;
        }
 
@@ -443,6 +420,7 @@ static int acpi_cpufreq_target(struct cpufreq_policy *policy,
                msr =
                    (u32) perf->states[next_perf_state].
                    control & INTEL_MSR_RANGE;
+               cmd.val = get_cur_val(online_policy_cpus);
                cmd.val = (cmd.val & ~INTEL_MSR_RANGE) | msr;
                break;
        case SYSTEM_IO_CAPABLE:
@@ -462,8 +440,8 @@ static int acpi_cpufreq_target(struct cpufreq_policy *policy,
        else
                cpu_set(policy->cpu, cmd.mask);
 
-       freqs.old = data->freq_table[perf->state].frequency;
-       freqs.new = data->freq_table[next_perf_state].frequency;
+       freqs.old = perf->states[perf->state].core_frequency * 1000;
+       freqs.new = data->freq_table[next_state].frequency;
        for_each_cpu_mask(i, cmd.mask) {
                freqs.cpu = i;
                cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
@@ -508,15 +486,15 @@ acpi_cpufreq_guess_freq(struct acpi_cpufreq_data *data, unsigned int cpu)
                unsigned long freq;
                unsigned long freqn = perf->states[0].core_frequency * 1000;
 
-               for (i = 0; i < (perf->state_count - 1); i++) {
+               for (i=0; i<(perf->state_count-1); i++) {
                        freq = freqn;
-                       freqn = perf->states[i + 1].core_frequency * 1000;
+                       freqn = perf->states[i+1].core_frequency * 1000;
                        if ((2 * cpu_khz) > (freqn + freq)) {
                                perf->state = i;
                                return freq;
                        }
                }
-               perf->state = perf->state_count - 1;
+               perf->state = perf->state_count-1;
                return freqn;
        } else {
                /* assume CPU is at P0... */
@@ -560,6 +538,7 @@ static int acpi_cpufreq_early_init(void)
        return 0;
 }
 
+#ifdef CONFIG_SMP
 /*
  * Some BIOSes do SW_ANY coordination internally, either set it up in hw
  * or do it in BIOS firmware and won't inform about it to OS. If not
@@ -586,6 +565,7 @@ static struct dmi_system_id sw_any_bug_dmi_table[] = {
        },
        { }
 };
+#endif
 
 static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy)
 {
@@ -609,9 +589,8 @@ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy)
        data->acpi_data = acpi_perf_data[cpu];
        drv_data[cpu] = data;
 
-       if (cpu_has(c, X86_FEATURE_CONSTANT_TSC)) {
+       if (cpu_has(c, X86_FEATURE_CONSTANT_TSC))
                acpi_cpufreq_driver.flags |= CPUFREQ_CONST_LOOPS;
-       }
 
        result = acpi_processor_register_performance(data->acpi_data, cpu);
        if (result)
@@ -619,8 +598,9 @@ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy)
 
        perf = data->acpi_data;
        policy->shared_type = perf->shared_type;
+
        /*
-        * Will let policy->cpus know about dependency only when software 
+        * Will let policy->cpus know about dependency only when software
         * coordination is required.
         */
        if (policy->shared_type == CPUFREQ_SHARED_TYPE_ALL ||
@@ -668,9 +648,8 @@ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy)
                goto err_unreg;
        }
 
-       data->freq_table =
-           kmalloc(sizeof(struct cpufreq_frequency_table) *
-                   (perf->state_count + 1), GFP_KERNEL);
+       data->freq_table = kmalloc(sizeof(struct cpufreq_frequency_table) *
+                   (perf->state_count+1), GFP_KERNEL);
        if (!data->freq_table) {
                result = -ENOMEM;
                goto err_unreg;
@@ -678,7 +657,7 @@ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy)
 
        /* detect transition latency */
        policy->cpuinfo.transition_latency = 0;
-       for (i = 0; i < perf->state_count; i++) {
+       for (i=0; i<perf->state_count; i++) {
                if ((perf->states[i].transition_latency * 1000) >
                    policy->cpuinfo.transition_latency)
                        policy->cpuinfo.transition_latency =
@@ -688,9 +667,9 @@ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy)
 
        data->max_freq = perf->states[0].core_frequency * 1000;
        /* table init */
-       for (i = 0; i < perf->state_count; i++) {
-               if (i > 0 && perf->states[i].core_frequency ==
-                   perf->states[i - 1].core_frequency)
+       for (i=0; i<perf->state_count; i++) {
+               if (i>0 && perf->states[i].core_frequency ==
+                   perf->states[i-1].core_frequency)
                        continue;
 
                data->freq_table[valid_states].index = i;
@@ -698,21 +677,21 @@ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy)
                    perf->states[i].core_frequency * 1000;
                valid_states++;
        }
-       data->freq_table[perf->state_count].frequency = CPUFREQ_TABLE_END;
+       data->freq_table[valid_states].frequency = CPUFREQ_TABLE_END;
+       perf->state = 0;
 
        result = cpufreq_frequency_table_cpuinfo(policy, data->freq_table);
-       if (result) {
+       if (result)
                goto err_freqfree;
-       }
 
-       switch (data->cpu_feature) {
+       switch (perf->control_register.space_id) {
        case ACPI_ADR_SPACE_SYSTEM_IO:
                /* Current speed is unknown and not detectable by IO port */
                policy->cur = acpi_cpufreq_guess_freq(data, policy->cpu);
                break;
        case ACPI_ADR_SPACE_FIXED_HARDWARE:
                acpi_cpufreq_driver.get = get_cur_freq_on_cpu;
-               get_cur_freq_on_cpu(cpu);
+               policy->cur = get_cur_freq_on_cpu(cpu);
                break;
        default:
                break;
@@ -725,9 +704,8 @@ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy)
        if (c->x86_vendor == X86_VENDOR_INTEL && c->cpuid_level >= 6) {
                unsigned int ecx;
                ecx = cpuid_ecx(6);
-               if (ecx & CPUID_6_ECX_APERFMPERF_CAPABILITY) {
+               if (ecx & CPUID_6_ECX_APERFMPERF_CAPABILITY)
                        acpi_cpufreq_driver.getavg = get_measured_perf;
-               }
        }
 
        dprintk("CPU%u - ACPI performance management activated.\n", cpu);
@@ -748,11 +726,11 @@ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy)
 
        return result;
 
-      err_freqfree:
+err_freqfree:
        kfree(data->freq_table);
-      err_unreg:
+err_unreg:
        acpi_processor_unregister_performance(perf, cpu);
-      err_free:
+err_free:
        kfree(data);
        drv_data[cpu] = NULL;
 
@@ -828,7 +806,8 @@ static void __exit acpi_cpufreq_exit(void)
 
 module_param(acpi_pstate_strict, uint, 0644);
 MODULE_PARM_DESC(acpi_pstate_strict,
-                "value 0 or non-zero. non-zero -> strict ACPI checks are performed during frequency changes.");
+       "value 0 or non-zero. non-zero -> strict ACPI checks are "
+       "performed during frequency changes.");
 
 late_initcall(acpi_cpufreq_init);
 module_exit(acpi_cpufreq_exit);