|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [RFC PATCH 06/13] cpufreq: make cpufreq driver more generalizable
First implementation of the cpufreq driver has been
written with x86 in mind. This patch makes possible
the cpufreq driver be working on both x86 and arm
architectures.
Signed-off-by: Oleksandr Dmytryshyn <oleksandr.dmytryshyn@xxxxxxxxxxxxxxx>
---
xen/Rules.mk | 1 +
xen/drivers/cpufreq/cpufreq.c | 46 ++++++++++++++++++++++++++++++++----
xen/include/cpufreq/processor_perf.h | 7 ++++++
3 files changed, 49 insertions(+), 5 deletions(-)
diff --git a/xen/Rules.mk b/xen/Rules.mk
index b7caab6..23045bb 100644
--- a/xen/Rules.mk
+++ b/xen/Rules.mk
@@ -55,6 +55,7 @@ CFLAGS-$(perfc) += -DPERF_COUNTERS
CFLAGS-$(perfc_arrays) += -DPERF_ARRAYS
CFLAGS-$(lock_profile) += -DLOCK_PROFILE
CFLAGS-$(HAS_ACPI) += -DHAS_ACPI
+CFLAGS-$(HAS_CPUFREQ) += -DHAS_CPUFREQ
CFLAGS-$(HAS_PM) += -DHAS_PM
CFLAGS-$(HAS_GDBSX) += -DHAS_GDBSX
CFLAGS-$(HAS_PASSTHROUGH) += -DHAS_PASSTHROUGH
diff --git a/xen/drivers/cpufreq/cpufreq.c b/xen/drivers/cpufreq/cpufreq.c
index 884d2bb..30ff5b8 100644
--- a/xen/drivers/cpufreq/cpufreq.c
+++ b/xen/drivers/cpufreq/cpufreq.c
@@ -43,9 +43,14 @@
#include <asm/io.h>
#include <asm/processor.h>
#include <asm/percpu.h>
-#include <acpi/acpi.h>
#include <cpufreq/cpufreq.h>
+#ifdef CONFIG_ACPI
+ #define XEN_PX_FULL_INIT (XEN_PX_PCT | XEN_PX_PSS | XEN_PX_PSD |
XEN_PX_PPC)
+#else
+ #define XEN_PX_FULL_INIT (XEN_PX_PSS | XEN_PX_PSD | XEN_PX_PPC)
+#endif
+
static unsigned int __read_mostly usr_min_freq;
static unsigned int __read_mostly usr_max_freq;
static void cpufreq_cmdline_common_para(struct cpufreq_policy *new_policy);
@@ -192,6 +197,7 @@ int cpufreq_add_cpu(unsigned int cpu)
} else {
/* domain sanity check under whatever coordination type */
firstcpu = cpumask_first(cpufreq_dom->map);
+#ifdef CONFIG_ACPI
if ((perf->domain_info.coord_type !=
processor_pminfo[firstcpu]->perf.domain_info.coord_type) ||
(perf->domain_info.num_processors !=
@@ -207,6 +213,18 @@ int cpufreq_add_cpu(unsigned int cpu)
);
return -EINVAL;
}
+#else /* CONFIG_ACPI */
+ if ((perf->domain_info.num_processors !=
+ processor_pminfo[firstcpu]->perf.domain_info.num_processors)) {
+
+ printk(KERN_WARNING "cpufreq fail to add CPU%d:"
+ "incorrect _PSD(%"PRIu64"), expect(%"PRIu64")\n",
+ cpu, perf->domain_info.num_processors,
+ processor_pminfo[firstcpu]->perf.domain_info.num_processors
+ );
+ return -EINVAL;
+ }
+#endif /* CONFIG_ACPI */
}
if (!domexist || hw_all) {
@@ -363,6 +381,7 @@ int cpufreq_del_cpu(unsigned int cpu)
return 0;
}
+#ifdef CONFIG_ACPI
static void print_PCT(struct xen_pct_register *ptr)
{
printk("\t_PCT: descriptor=%d, length=%d, space_id=%d, "
@@ -370,12 +389,14 @@ static void print_PCT(struct xen_pct_register *ptr)
ptr->descriptor, ptr->length, ptr->space_id, ptr->bit_width,
ptr->bit_offset, ptr->reserved, ptr->address);
}
+#endif
static void print_PSS(struct xen_processor_px *ptr, int count)
{
int i;
printk("\t_PSS: state_count=%d\n", count);
for (i=0; i<count; i++){
+#ifdef CONFIG_ACPI
printk("\tState%d: %"PRId64"MHz %"PRId64"mW %"PRId64"us "
"%"PRId64"us %#"PRIx64" %#"PRIx64"\n",
i,
@@ -385,15 +406,26 @@ static void print_PSS(struct xen_processor_px *ptr, int
count)
ptr[i].bus_master_latency,
ptr[i].control,
ptr[i].status);
+#else /* CONFIG_ACPI */
+ printk("\tState%d: %"PRId64"MHz %"PRId64"us\n",
+ i,
+ ptr[i].core_frequency,
+ ptr[i].transition_latency);
+#endif /* CONFIG_ACPI */
}
}
static void print_PSD( struct xen_psd_package *ptr)
{
+#ifdef CONFIG_ACPI
printk("\t_PSD: num_entries=%"PRId64" rev=%"PRId64
" domain=%"PRId64" coord_type=%"PRId64" num_processors=%"PRId64"\n",
ptr->num_entries, ptr->revision, ptr->domain, ptr->coord_type,
ptr->num_processors);
+#else /* CONFIG_ACPI */
+ printk("\t_PSD: domain=%"PRId64" num_processors=%"PRId64"\n",
+ ptr->domain, ptr->num_processors);
+#endif /* CONFIG_ACPI */
}
static void print_PPC(unsigned int platform_limit)
@@ -407,7 +439,11 @@ int set_px_pminfo(uint32_t acpi_id, struct
xen_processor_performance *dom0_px_in
struct processor_pminfo *pmpt;
struct processor_performance *pxpt;
+#ifdef CONFIG_ACPI
cpuid = get_cpu_id(acpi_id);
+#else
+ cpuid = acpi_id;
+#endif
if ( cpuid < 0 || !dom0_px_info)
{
ret = -EINVAL;
@@ -429,6 +465,8 @@ int set_px_pminfo(uint32_t acpi_id, struct
xen_processor_performance *dom0_px_in
processor_pminfo[cpuid] = pmpt;
}
pxpt = &pmpt->perf;
+
+#ifdef CONFIG_ACPI
pmpt->acpi_id = acpi_id;
pmpt->id = cpuid;
@@ -455,7 +493,7 @@ int set_px_pminfo(uint32_t acpi_id, struct
xen_processor_performance *dom0_px_in
print_PCT(&pxpt->status_register);
}
}
-
+#endif /* CONFIG_ACPI */
if ( dom0_px_info->flags & XEN_PX_PSS )
{
/* capability check */
@@ -517,11 +555,9 @@ int set_px_pminfo(uint32_t acpi_id, struct
xen_processor_performance *dom0_px_in
}
}
- if ( dom0_px_info->flags == ( XEN_PX_PCT | XEN_PX_PSS |
- XEN_PX_PSD | XEN_PX_PPC ) )
+ if ( dom0_px_info->flags == XEN_PX_FULL_INIT )
{
pxpt->init = XEN_PX_INIT;
-
ret = cpufreq_cpu_init(cpuid);
goto out;
}
diff --git a/xen/include/cpufreq/processor_perf.h
b/xen/include/cpufreq/processor_perf.h
index d8a1ba6..6c1279d 100644
--- a/xen/include/cpufreq/processor_perf.h
+++ b/xen/include/cpufreq/processor_perf.h
@@ -3,7 +3,10 @@
#include <public/platform.h>
#include <public/sysctl.h>
+
+#ifdef CONFIG_ACPI
#include <xen/acpi.h>
+#endif
#define XEN_PX_INIT 0x80000000
@@ -24,8 +27,10 @@ int cpufreq_del_cpu(unsigned int);
struct processor_performance {
uint32_t state;
uint32_t platform_limit;
+#ifdef CONFIG_ACPI
struct xen_pct_register control_register;
struct xen_pct_register status_register;
+#endif
uint32_t state_count;
struct xen_processor_px *states;
struct xen_psd_package domain_info;
@@ -35,8 +40,10 @@ struct processor_performance {
};
struct processor_pminfo {
+#ifdef CONFIG_ACPI
uint32_t acpi_id;
uint32_t id;
+#endif
struct processor_performance perf;
};
--
1.9.1
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |