summaryrefslogtreecommitdiff
path: root/xen/arch/x86/acpi/cpufreq
diff options
context:
space:
mode:
authorJuergen Gross <juergen.gross@ts.fujitsu.com>2011-06-16 16:12:20 +0100
committerJuergen Gross <juergen.gross@ts.fujitsu.com>2011-06-16 16:12:20 +0100
commitce907519ddecd9e4a1b1a86bef0c758ef20e3ed6 (patch)
treefd2ced6e6f9fd67d8c3adb0bc910e559bf49bb0c /xen/arch/x86/acpi/cpufreq
parentef54fbe92339de5a3c928c190d1af72bede176b8 (diff)
Use same data array for INTEL and AMD cpufreq handling
The AMD and INTEL specific parts of cpufreq handling used different per-cpu data structures with nearly identical semantics. Fold the two structures into one by adding a generic architecture data item. Signed-off-by: Juergen Gross <juergen.gross@ts.fujitsu.com>
Diffstat (limited to 'xen/arch/x86/acpi/cpufreq')
-rw-r--r--xen/arch/x86/acpi/cpufreq/cpufreq.c30
-rw-r--r--xen/arch/x86/acpi/cpufreq/powernow.c37
2 files changed, 29 insertions, 38 deletions
diff --git a/xen/arch/x86/acpi/cpufreq/cpufreq.c b/xen/arch/x86/acpi/cpufreq/cpufreq.c
index 3db676fc45..41466d871c 100644
--- a/xen/arch/x86/acpi/cpufreq/cpufreq.c
+++ b/xen/arch/x86/acpi/cpufreq/cpufreq.c
@@ -54,7 +54,7 @@ enum {
#define INTEL_MSR_RANGE (0xffffull)
#define CPUID_6_ECX_APERFMPERF_CAPABILITY (0x1)
-static struct acpi_cpufreq_data *drv_data[NR_CPUS];
+struct acpi_cpufreq_data *cpufreq_drv_data[NR_CPUS];
static struct cpufreq_driver acpi_cpufreq_driver;
@@ -103,7 +103,7 @@ static unsigned extract_msr(u32 msr, struct acpi_cpufreq_data *data)
static unsigned extract_freq(u32 val, struct acpi_cpufreq_data *data)
{
- switch (data->cpu_feature) {
+ switch (data->arch_cpu_flags) {
case SYSTEM_INTEL_MSR_CAPABLE:
return extract_msr(val, data);
case SYSTEM_IO_CAPABLE:
@@ -213,17 +213,17 @@ static u32 get_cur_val(const cpumask_t *mask)
return 0;
policy = per_cpu(cpufreq_cpu_policy, cpu);
- if (!policy || !drv_data[policy->cpu])
+ if (!policy || !cpufreq_drv_data[policy->cpu])
return 0;
- switch (drv_data[policy->cpu]->cpu_feature) {
+ switch (cpufreq_drv_data[policy->cpu]->arch_cpu_flags) {
case SYSTEM_INTEL_MSR_CAPABLE:
cmd.type = SYSTEM_INTEL_MSR_CAPABLE;
cmd.addr.msr.reg = MSR_IA32_PERF_STATUS;
break;
case SYSTEM_IO_CAPABLE:
cmd.type = SYSTEM_IO_CAPABLE;
- perf = drv_data[policy->cpu]->acpi_data;
+ perf = cpufreq_drv_data[policy->cpu]->acpi_data;
cmd.addr.io.port = perf->control_register.address;
cmd.addr.io.bit_width = perf->control_register.bit_width;
break;
@@ -372,7 +372,7 @@ static unsigned int get_cur_freq_on_cpu(unsigned int cpu)
if (!policy)
return 0;
- data = drv_data[policy->cpu];
+ data = cpufreq_drv_data[policy->cpu];
if (unlikely(data == NULL ||
data->acpi_data == NULL || data->freq_table == NULL))
return 0;
@@ -419,7 +419,7 @@ static unsigned int check_freqs(const cpumask_t *mask, unsigned int freq,
static int acpi_cpufreq_target(struct cpufreq_policy *policy,
unsigned int target_freq, unsigned int relation)
{
- struct acpi_cpufreq_data *data = drv_data[policy->cpu];
+ struct acpi_cpufreq_data *data = cpufreq_drv_data[policy->cpu];
struct processor_performance *perf;
struct cpufreq_freqs freqs;
cpumask_t online_policy_cpus;
@@ -456,7 +456,7 @@ static int acpi_cpufreq_target(struct cpufreq_policy *policy,
return 0;
}
- switch (data->cpu_feature) {
+ switch (data->arch_cpu_flags) {
case SYSTEM_INTEL_MSR_CAPABLE:
cmd.type = SYSTEM_INTEL_MSR_CAPABLE;
cmd.addr.msr.reg = MSR_IA32_PERF_CTL;
@@ -501,7 +501,7 @@ static int acpi_cpufreq_verify(struct cpufreq_policy *policy)
struct acpi_cpufreq_data *data;
struct processor_performance *perf;
- if (!policy || !(data = drv_data[policy->cpu]) ||
+ if (!policy || !(data = cpufreq_drv_data[policy->cpu]) ||
!processor_pminfo[policy->cpu])
return -EINVAL;
@@ -557,7 +557,7 @@ acpi_cpufreq_cpu_init(struct cpufreq_policy *policy)
return -ENOMEM;
memset(data, 0, sizeof(struct acpi_cpufreq_data));
- drv_data[cpu] = data;
+ cpufreq_drv_data[cpu] = data;
data->acpi_data = &processor_pminfo[cpu]->perf;
@@ -569,7 +569,7 @@ acpi_cpufreq_cpu_init(struct cpufreq_policy *policy)
if (cpufreq_verbose)
printk("xen_pminfo: @acpi_cpufreq_cpu_init,"
"SYSTEM IO addr space\n");
- data->cpu_feature = SYSTEM_IO_CAPABLE;
+ data->arch_cpu_flags = SYSTEM_IO_CAPABLE;
break;
case ACPI_ADR_SPACE_FIXED_HARDWARE:
if (cpufreq_verbose)
@@ -579,7 +579,7 @@ acpi_cpufreq_cpu_init(struct cpufreq_policy *policy)
result = -ENODEV;
goto err_unreg;
}
- data->cpu_feature = SYSTEM_INTEL_MSR_CAPABLE;
+ data->arch_cpu_flags = SYSTEM_INTEL_MSR_CAPABLE;
break;
default:
result = -ENODEV;
@@ -652,17 +652,17 @@ err_freqfree:
xfree(data->freq_table);
err_unreg:
xfree(data);
- drv_data[cpu] = NULL;
+ cpufreq_drv_data[cpu] = NULL;
return result;
}
static int acpi_cpufreq_cpu_exit(struct cpufreq_policy *policy)
{
- struct acpi_cpufreq_data *data = drv_data[policy->cpu];
+ struct acpi_cpufreq_data *data = cpufreq_drv_data[policy->cpu];
if (data) {
- drv_data[policy->cpu] = NULL;
+ cpufreq_drv_data[policy->cpu] = NULL;
xfree(data->freq_table);
xfree(data);
}
diff --git a/xen/arch/x86/acpi/cpufreq/powernow.c b/xen/arch/x86/acpi/cpufreq/powernow.c
index a4312c12a6..ad5d83eb5b 100644
--- a/xen/arch/x86/acpi/cpufreq/powernow.c
+++ b/xen/arch/x86/acpi/cpufreq/powernow.c
@@ -53,15 +53,7 @@
#define MSR_PSTATE_CUR_LIMIT 0xc0010061 /* pstate current limit MSR */
#define MSR_HWCR_CPBDIS_MASK 0x02000000ULL
-struct powernow_cpufreq_data {
- struct processor_performance *acpi_data;
- struct cpufreq_frequency_table *freq_table;
- unsigned int max_freq;
- unsigned int resume;
- unsigned int cpu_feature;
-};
-
-static struct powernow_cpufreq_data *drv_data[NR_CPUS];
+#define ARCH_CPU_FLAG_RESUME 1
static struct cpufreq_driver powernow_cpufreq_driver;
@@ -92,7 +84,7 @@ static void transition_pstate(void *drvcmd)
static int powernow_cpufreq_target(struct cpufreq_policy *policy,
unsigned int target_freq, unsigned int relation)
{
- struct powernow_cpufreq_data *data = drv_data[policy->cpu];
+ struct acpi_cpufreq_data *data = cpufreq_drv_data[policy->cpu];
struct processor_performance *perf;
struct cpufreq_freqs freqs;
cpumask_t online_policy_cpus;
@@ -119,8 +111,8 @@ static int powernow_cpufreq_target(struct cpufreq_policy *policy,
next_perf_state = data->freq_table[next_state].index;
if (perf->state == next_perf_state) {
- if (unlikely(data->resume))
- data->resume = 0;
+ if (unlikely(data->arch_cpu_flags & ARCH_CPU_FLAG_RESUME))
+ data->arch_cpu_flags &= ~ARCH_CPU_FLAG_RESUME;
else
return 0;
}
@@ -149,10 +141,10 @@ static int powernow_cpufreq_target(struct cpufreq_policy *policy,
static int powernow_cpufreq_verify(struct cpufreq_policy *policy)
{
- struct powernow_cpufreq_data *data;
+ struct acpi_cpufreq_data *data;
struct processor_performance *perf;
- if (!policy || !(data = drv_data[policy->cpu]) ||
+ if (!policy || !(data = cpufreq_drv_data[policy->cpu]) ||
!processor_pminfo[policy->cpu])
return -EINVAL;
@@ -190,19 +182,19 @@ static int powernow_cpufreq_cpu_init(struct cpufreq_policy *policy)
unsigned int i;
unsigned int valid_states = 0;
unsigned int cpu = policy->cpu;
- struct powernow_cpufreq_data *data;
+ struct acpi_cpufreq_data *data;
unsigned int result = 0;
struct processor_performance *perf;
u32 max_hw_pstate;
uint64_t msr_content;
struct cpuinfo_x86 *c = &cpu_data[policy->cpu];
- data = xmalloc(struct powernow_cpufreq_data);
+ data = xmalloc(struct acpi_cpufreq_data);
if (!data)
return -ENOMEM;
- memset(data, 0, sizeof(struct powernow_cpufreq_data));
+ memset(data, 0, sizeof(struct acpi_cpufreq_data));
- drv_data[cpu] = data;
+ cpufreq_drv_data[cpu] = data;
data->acpi_data = &processor_pminfo[cpu]->perf;
@@ -252,7 +244,6 @@ static int powernow_cpufreq_cpu_init(struct cpufreq_policy *policy)
policy->governor = cpufreq_opt_governor ? : CPUFREQ_DEFAULT_GOVERNOR;
- data->max_freq = perf->states[0].core_frequency * 1000;
/* table init */
for (i = 0; i < perf->state_count && i <= max_hw_pstate; i++) {
if (i > 0 && perf->states[i].core_frequency >=
@@ -278,7 +269,7 @@ static int powernow_cpufreq_cpu_init(struct cpufreq_policy *policy)
* the first call to ->target() should result in us actually
* writing something to the appropriate registers.
*/
- data->resume = 1;
+ data->arch_cpu_flags |= ARCH_CPU_FLAG_RESUME;
policy->cur = data->freq_table[i].frequency;
return result;
@@ -287,17 +278,17 @@ err_freqfree:
xfree(data->freq_table);
err_unreg:
xfree(data);
- drv_data[cpu] = NULL;
+ cpufreq_drv_data[cpu] = NULL;
return result;
}
static int powernow_cpufreq_cpu_exit(struct cpufreq_policy *policy)
{
- struct powernow_cpufreq_data *data = drv_data[policy->cpu];
+ struct acpi_cpufreq_data *data = cpufreq_drv_data[policy->cpu];
if (data) {
- drv_data[policy->cpu] = NULL;
+ cpufreq_drv_data[policy->cpu] = NULL;
xfree(data->freq_table);
xfree(data);
}