[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 |