[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [RFC PATCH v5 06/12] 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 | 80 +++++++++++++++++++++++++++++++++++++--- xen/include/public/platform.h | 1 + xen/include/xen/processor_perf.h | 7 ++++ 4 files changed, 83 insertions(+), 6 deletions(-) diff --git a/xen/Rules.mk b/xen/Rules.mk index 5953152..3b0b89b 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_CPU_TURBO) += -DHAS_CPU_TURBO CFLAGS-$(HAS_GDBSX) += -DHAS_GDBSX diff --git a/xen/drivers/cpufreq/cpufreq.c b/xen/drivers/cpufreq/cpufreq.c index f5f4d75..1644096 100644 --- a/xen/drivers/cpufreq/cpufreq.c +++ b/xen/drivers/cpufreq/cpufreq.c @@ -43,7 +43,6 @@ #include <asm/io.h> #include <asm/processor.h> #include <asm/percpu.h> -#include <acpi/acpi.h> #include <xen/cpufreq.h> static unsigned int __read_mostly usr_min_freq; @@ -192,6 +191,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 +207,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 num processors (%"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 +375,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 +383,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 +400,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) @@ -401,13 +427,53 @@ static void print_PPC(unsigned int platform_limit) printk("\t_PPC: %d\n", platform_limit); } +static inline uint32_t is_pss_data(struct xen_processor_performance *px) +{ +#ifdef CONFIG_ACPI + return px->flags & XEN_PX_PSS; +#else + return px->flags == XEN_PX_DATA; +#endif +} + +static inline uint32_t is_psd_data(struct xen_processor_performance *px) +{ +#ifdef CONFIG_ACPI + return px->flags & XEN_PX_PSD; +#else + return px->flags == XEN_PX_DATA; +#endif +} + +static inline uint32_t is_ppc_data(struct xen_processor_performance *px) +{ +#ifdef CONFIG_ACPI + return px->flags & XEN_PX_PPC; +#else + return px->flags == XEN_PX_DATA; +#endif +} + +static inline uint32_t is_all_data(struct xen_processor_performance *px) +{ +#ifdef CONFIG_ACPI + return px->flags == ( XEN_PX_PCT | XEN_PX_PSS | XEN_PX_PSD | XEN_PX_PPC ); +#else + return px->flags == XEN_PX_DATA; +#endif +} + int set_px_pminfo(uint32_t acpi_id, struct xen_processor_performance *dom0_px_info) { int ret=0, cpuid; 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 +495,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,8 +523,9 @@ 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 ) + if ( is_pss_data(dom0_px_info) ) { /* capability check */ if (dom0_px_info->state_count <= 1) @@ -483,7 +552,7 @@ int set_px_pminfo(uint32_t acpi_id, struct xen_processor_performance *dom0_px_in print_PSS(pxpt->states,pxpt->state_count); } - if ( dom0_px_info->flags & XEN_PX_PSD ) + if ( is_psd_data(dom0_px_info) ) { /* check domain coordination */ if (dom0_px_info->shared_type != CPUFREQ_SHARED_TYPE_ALL && @@ -503,7 +572,7 @@ int set_px_pminfo(uint32_t acpi_id, struct xen_processor_performance *dom0_px_in print_PSD(&pxpt->domain_info); } - if ( dom0_px_info->flags & XEN_PX_PPC ) + if ( is_ppc_data(dom0_px_info) ) { pxpt->platform_limit = dom0_px_info->platform_limit; @@ -517,8 +586,7 @@ 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 ( is_all_data(dom0_px_info) ) { pxpt->init = XEN_PX_INIT; diff --git a/xen/include/public/platform.h b/xen/include/public/platform.h index 4341f54..ccb7969 100644 --- a/xen/include/public/platform.h +++ b/xen/include/public/platform.h @@ -358,6 +358,7 @@ DEFINE_XEN_GUEST_HANDLE(xenpf_getidletime_t); #define XEN_PX_PSS 2 #define XEN_PX_PPC 4 #define XEN_PX_PSD 8 +#define XEN_PX_DATA 16 struct xen_power_register { uint32_t space_id; diff --git a/xen/include/xen/processor_perf.h b/xen/include/xen/processor_perf.h index d8a1ba6..6c1279d 100644 --- a/xen/include/xen/processor_perf.h +++ b/xen/include/xen/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 |