diff options
| author | Ingo Molnar <mingo@elte.hu> | 2009-02-13 03:34:07 -0500 |
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2009-02-13 03:34:07 -0500 |
| commit | e9c4ffb11f0b19005b5b9dc8481687a3637e5887 (patch) | |
| tree | 7007f2ff846b9b057c5cd7c25e8b82e49f9b4b63 /arch/x86/kernel/cpu | |
| parent | 4bcf349a0f90d1e69eb35c6df0fa285c886c1cd6 (diff) | |
| parent | 071a0bc2ceace31266836801510879407a3701fa (diff) | |
Merge branch 'linus' into perfcounters/core
Conflicts:
arch/x86/kernel/acpi/boot.c
Diffstat (limited to 'arch/x86/kernel/cpu')
| -rw-r--r-- | arch/x86/kernel/cpu/cpufreq/powernow-k8.c | 28 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/intel.c | 3 |
2 files changed, 25 insertions, 6 deletions
diff --git a/arch/x86/kernel/cpu/cpufreq/powernow-k8.c b/arch/x86/kernel/cpu/cpufreq/powernow-k8.c index 5c28b37dea11..fb039cd345d8 100644 --- a/arch/x86/kernel/cpu/cpufreq/powernow-k8.c +++ b/arch/x86/kernel/cpu/cpufreq/powernow-k8.c | |||
| @@ -939,10 +939,25 @@ static void powernow_k8_cpu_exit_acpi(struct powernow_k8_data *data) | |||
| 939 | free_cpumask_var(data->acpi_data.shared_cpu_map); | 939 | free_cpumask_var(data->acpi_data.shared_cpu_map); |
| 940 | } | 940 | } |
| 941 | 941 | ||
| 942 | static int get_transition_latency(struct powernow_k8_data *data) | ||
| 943 | { | ||
| 944 | int max_latency = 0; | ||
| 945 | int i; | ||
| 946 | for (i = 0; i < data->acpi_data.state_count; i++) { | ||
| 947 | int cur_latency = data->acpi_data.states[i].transition_latency | ||
| 948 | + data->acpi_data.states[i].bus_master_latency; | ||
| 949 | if (cur_latency > max_latency) | ||
| 950 | max_latency = cur_latency; | ||
| 951 | } | ||
| 952 | /* value in usecs, needs to be in nanoseconds */ | ||
| 953 | return 1000 * max_latency; | ||
| 954 | } | ||
| 955 | |||
| 942 | #else | 956 | #else |
| 943 | static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data) { return -ENODEV; } | 957 | static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data) { return -ENODEV; } |
| 944 | static void powernow_k8_cpu_exit_acpi(struct powernow_k8_data *data) { return; } | 958 | static void powernow_k8_cpu_exit_acpi(struct powernow_k8_data *data) { return; } |
| 945 | static void powernow_k8_acpi_pst_values(struct powernow_k8_data *data, unsigned int index) { return; } | 959 | static void powernow_k8_acpi_pst_values(struct powernow_k8_data *data, unsigned int index) { return; } |
| 960 | static int get_transition_latency(struct powernow_k8_data *data) { return 0; } | ||
| 946 | #endif /* CONFIG_X86_POWERNOW_K8_ACPI */ | 961 | #endif /* CONFIG_X86_POWERNOW_K8_ACPI */ |
| 947 | 962 | ||
| 948 | /* Take a frequency, and issue the fid/vid transition command */ | 963 | /* Take a frequency, and issue the fid/vid transition command */ |
| @@ -1173,7 +1188,13 @@ static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol) | |||
| 1173 | if (rc) { | 1188 | if (rc) { |
| 1174 | goto err_out; | 1189 | goto err_out; |
| 1175 | } | 1190 | } |
| 1176 | } | 1191 | /* Take a crude guess here. |
| 1192 | * That guess was in microseconds, so multiply with 1000 */ | ||
| 1193 | pol->cpuinfo.transition_latency = ( | ||
| 1194 | ((data->rvo + 8) * data->vstable * VST_UNITS_20US) + | ||
| 1195 | ((1 << data->irt) * 30)) * 1000; | ||
| 1196 | } else /* ACPI _PSS objects available */ | ||
| 1197 | pol->cpuinfo.transition_latency = get_transition_latency(data); | ||
| 1177 | 1198 | ||
| 1178 | /* only run on specific CPU from here on */ | 1199 | /* only run on specific CPU from here on */ |
| 1179 | oldmask = current->cpus_allowed; | 1200 | oldmask = current->cpus_allowed; |
| @@ -1204,11 +1225,6 @@ static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol) | |||
| 1204 | cpumask_copy(pol->cpus, &per_cpu(cpu_core_map, pol->cpu)); | 1225 | cpumask_copy(pol->cpus, &per_cpu(cpu_core_map, pol->cpu)); |
| 1205 | data->available_cores = pol->cpus; | 1226 | data->available_cores = pol->cpus; |
| 1206 | 1227 | ||
| 1207 | /* Take a crude guess here. | ||
| 1208 | * That guess was in microseconds, so multiply with 1000 */ | ||
| 1209 | pol->cpuinfo.transition_latency = (((data->rvo + 8) * data->vstable * VST_UNITS_20US) | ||
| 1210 | + (3 * (1 << data->irt) * 10)) * 1000; | ||
| 1211 | |||
| 1212 | if (cpu_family == CPU_HW_PSTATE) | 1228 | if (cpu_family == CPU_HW_PSTATE) |
| 1213 | pol->cur = find_khz_freq_from_pstate(data->powernow_table, data->currpstate); | 1229 | pol->cur = find_khz_freq_from_pstate(data->powernow_table, data->currpstate); |
| 1214 | else | 1230 | else |
diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c index 430e5c38a544..24ff26a38ade 100644 --- a/arch/x86/kernel/cpu/intel.c +++ b/arch/x86/kernel/cpu/intel.c | |||
| @@ -291,6 +291,9 @@ static void __cpuinit init_intel(struct cpuinfo_x86 *c) | |||
| 291 | ds_init_intel(c); | 291 | ds_init_intel(c); |
| 292 | } | 292 | } |
| 293 | 293 | ||
| 294 | if (c->x86 == 6 && c->x86_model == 29 && cpu_has_clflush) | ||
| 295 | set_cpu_cap(c, X86_FEATURE_CLFLUSH_MONITOR); | ||
| 296 | |||
| 294 | #ifdef CONFIG_X86_64 | 297 | #ifdef CONFIG_X86_64 |
| 295 | if (c->x86 == 15) | 298 | if (c->x86 == 15) |
| 296 | c->x86_cache_alignment = c->x86_clflush_size * 2; | 299 | c->x86_cache_alignment = c->x86_clflush_size * 2; |
