[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-ia64-devel] [PATCH 3/3] IA64: add cpufreq support
Hi. Two comments. - It seems that tabs and spaces are mixed. Please follow Linux style. You also want to modify to use XENPF hypercall. - Since drivers/acpi/Kconfig is common file, the hunk should go to xen-devel after the ia64 part is merged to xen-unstable.hg thanks, On Sat, Sep 27, 2008 at 10:13:14AM +0800, Yu, Ke wrote: > IA64: add ia64 cpufreq notify hypercall > > This patch adds ia64 notify hypercall to pass cpufreq ACPI information to > hypervisor, > and get cpufreq statistic data from hypervisor. > > Signed-off-by: Yu Ke <ke.yu@xxxxxxxxx> > Liu Jinsong <jinsong.liu@xxxxxxxxx> > IA64: add ia64 cpufreq notify hypercall > > This patch adds ia64 notify hypercall to pass cpufreq ACPI information to > hypervisor, > and get cpufreq statistic data from hypervisor. > > Signed-off-by: Yu Ke <ke.yu@xxxxxxxxx> > Liu Jinsong <jinsong.liu@xxxxxxxxx> > > diff -r 2f32c16d5370 arch/ia64/kernel/Makefile > --- a/arch/ia64/kernel/Makefile Fri Sep 26 19:36:24 2008 +0800 > +++ b/arch/ia64/kernel/Makefile Fri Sep 26 19:38:21 2008 +0800 > @@ -16,6 +16,9 @@ > > ifneq ($(CONFIG_ACPI_PROCESSOR),) > obj-y += acpi-processor.o > +ifneq ($(CONFIG_PROCESSOR_EXTERNAL_CONTROL),) > +obj-$(CONFIG_XEN) += processor_extcntl_xen.o > +endif > endif > > obj-$(CONFIG_IA64_PALINFO) += palinfo.o > diff -r 2f32c16d5370 arch/ia64/kernel/processor_extcntl_xen.c > --- /dev/null Thu Jan 01 00:00:00 1970 +0000 > +++ b/arch/ia64/kernel/processor_extcntl_xen.c Fri Sep 26 19:38:21 > 2008 +0800 > @@ -0,0 +1,154 @@ > +/* > + * processor_extcntl_xen.c - interface to notify Xen > + * > + * Copyright (C) 2008, Intel corporation > + * > + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > + * > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU General Public License as published by > + * the Free Software Foundation; either version 2 of the License, or (at > + * your option) any later version. > + * > + * This program is distributed in the hope that it will be useful, but > + * WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + * General Public License for more details. > + * > + * You should have received a copy of the GNU General Public License along > + * with this program; if not, write to the Free Software Foundation, Inc., > + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. > + * > + */ > + > +#include <linux/kernel.h> > +#include <linux/init.h> > +#include <linux/types.h> > +#include <linux/acpi.h> > +#include <linux/pm.h> > +#include <linux/cpu.h> > +#include <linux/cpufreq.h> > +#include <acpi/processor.h> > +#include <asm/hypercall.h> > +#include <asm/xen/xencomm.h> > + > +static int xen_cx_notifier(struct acpi_processor *pr, int action) > +{ > + printk(KERN_WARNING "Cx is not supported yet\n"); > + > + return -EINVAL; > +} > + > +static int xen_px_notifier(struct acpi_processor *pr, int action) > +{ > + int ret = -EINVAL; > + struct xenpf_set_processor_pminfo pminfo = { > + .id = pr->acpi_id, > + .type = XEN_PM_PX, > + }; > + struct xen_processor_performance *perf; > + struct xen_processor_px *states = NULL; > + struct acpi_processor_performance *px; > + struct acpi_psd_package *pdomain; > + struct xencomm_handle *desc,*states_desc; > + > + if (!pr || !pr->performance) > + return -EINVAL; > + > + perf = &pminfo.perf; > + px = pr->performance; > + desc = xencomm_map_no_alloc(&pminfo, sizeof(pminfo)); > + > + switch(action) { > + > + case PROCESSOR_PM_CHANGE: > + /* ppc dynamic handle */ > + pminfo.perf.flags = XEN_PX_PPC; > + pminfo.perf.platform_limit = pr->performance_platform_limit; > + ret = HYPERVISOR_set_pm_info(desc); > + break; > + > + case PROCESSOR_PM_INIT: > + > + /* px normal init */ > + perf->flags = XEN_PX_PPC | > + XEN_PX_PCT | > + XEN_PX_PSS | > + XEN_PX_PSD; > + > + /* ppc */ > + perf->platform_limit = pr->performance_platform_limit; > + > + /* pct */ > + xen_convert_pct_reg(&perf->control_register, > &px->control_register); > + xen_convert_pct_reg(&perf->status_register, > &px->status_register); > + > + /* pss */ > + perf->state_count = px->state_count; > + states = > kzalloc(px->state_count*sizeof(xen_processor_px_t),GFP_KERNEL); > + if (!states){ > + ret = -ENOMEM; > + break; > + } > + xen_convert_pss_states(states, px->states, px->state_count); > + set_xen_guest_handle(perf->states, states); > + states_desc = > xencomm_map_no_alloc(xen_guest_handle(perf->states), > + sizeof(*xen_guest_handle(perf->states))); > + set_xen_guest_handle(perf->states, > (xen_processor_px_t*)states_desc); > + > + /* psd */ > + pdomain = &px->domain_info; > + xen_convert_psd_pack(&perf->domain_info, pdomain); > + if (pdomain->coord_type == DOMAIN_COORD_TYPE_SW_ALL) > + perf->shared_type = CPUFREQ_SHARED_TYPE_ALL; > + else if (pdomain->coord_type == DOMAIN_COORD_TYPE_SW_ANY) > + perf->shared_type = CPUFREQ_SHARED_TYPE_ANY; > + else if (pdomain->coord_type == DOMAIN_COORD_TYPE_HW_ALL) > + perf->shared_type = CPUFREQ_SHARED_TYPE_HW; > + else { > + ret = -ENODEV; > + kfree(states); > + break; > + } > + > + ret = HYPERVISOR_set_pm_info(desc); > + kfree(states); > + break; > + > + default: > + ret = -EINVAL; > + } > + > + return ret; > +} > + > +static int xen_tx_notifier(struct acpi_processor *pr, int action) > +{ > + return -EINVAL; > +} > +static int xen_hotplug_notifier(struct acpi_processor *pr, int event) > +{ > + return -EINVAL; > +} > + > +static struct processor_extcntl_ops xen_extcntl_ops = { > + .hotplug = xen_hotplug_notifier, > +}; > + > +void arch_acpi_processor_init_extcntl(const struct processor_extcntl_ops > **ops) > +{ > + unsigned int pmbits = (xen_start_info->flags & SIF_PM_MASK) >> 8; > + > + if (!pmbits) > + return; > + > + if (pmbits & XEN_PROCESSOR_PM_CX) > + xen_extcntl_ops.pm_ops[PM_TYPE_IDLE] = xen_cx_notifier; > + if (pmbits & XEN_PROCESSOR_PM_PX) > + xen_extcntl_ops.pm_ops[PM_TYPE_PERF] = xen_px_notifier; > + if (pmbits & XEN_PROCESSOR_PM_TX) > + xen_extcntl_ops.pm_ops[PM_TYPE_THR] = xen_tx_notifier; > + > + *ops = &xen_extcntl_ops; > +} > +EXPORT_SYMBOL(arch_acpi_processor_init_extcntl); > diff -r 2f32c16d5370 arch/ia64/xen/xcom_privcmd.c > --- a/arch/ia64/xen/xcom_privcmd.c Fri Sep 26 19:36:24 2008 +0800 > +++ b/arch/ia64/xen/xcom_privcmd.c Fri Sep 26 19:38:21 2008 +0800 > @@ -193,6 +193,33 @@ > set_xen_guest_handle(kern_op.u.physinfo.cpu_to_node, > (void *)desc); > break; > + > + case XEN_SYSCTL_get_pmstat: > + if (kern_op.u.get_pmstat.type == PMSTAT_get_pxstat) { > + desc = xencomm_map( > + > xen_guest_handle(kern_op.u.get_pmstat.u.getpx.trans_pt), > + kern_op.u.get_pmstat.u.getpx.total * > + kern_op.u.get_pmstat.u.getpx.total * > + sizeof(uint64_t)); > + if > (xen_guest_handle(kern_op.u.get_pmstat.u.getpx.trans_pt) != NULL > + && kern_op.u.get_pmstat.u.getpx.total > 0 && desc == NULL) > + return -ENOMEM; > + > + > set_xen_guest_handle(kern_op.u.get_pmstat.u.getpx.trans_pt, > + (void *)desc); > + > + desc1 = xencomm_map( > + > xen_guest_handle(kern_op.u.get_pmstat.u.getpx.pt), > + kern_op.u.get_pmstat.u.getpx.total * > sizeof(pm_px_val_t)); > + if (xen_guest_handle(kern_op.u.get_pmstat.u.getpx.pt) > != NULL && > + kern_op.u.get_pmstat.u.getpx.total > 0 && desc1 == > NULL) > + return -ENOMEM; > + > + set_xen_guest_handle(kern_op.u.get_pmstat.u.getpx.pt, > + (void *)desc1); > + } > + break; > + > default: > printk("%s: unknown sysctl cmd %d\n", __func__, kern_op.cmd); > return -ENOSYS; > diff -r 2f32c16d5370 drivers/acpi/Kconfig > --- a/drivers/acpi/Kconfig Fri Sep 26 19:36:24 2008 +0800 > +++ b/drivers/acpi/Kconfig Fri Sep 26 19:38:21 2008 +0800 > @@ -370,7 +370,7 @@ > > config PROCESSOR_EXTERNAL_CONTROL > bool > - depends on X86 && XEN > + depends on (X86 || IA64) && XEN > default y > endif # ACPI > > diff -r 2f32c16d5370 include/asm-ia64/hypercall.h > --- a/include/asm-ia64/hypercall.h Fri Sep 26 19:36:24 2008 +0800 > +++ b/include/asm-ia64/hypercall.h Fri Sep 26 19:38:21 2008 +0800 > @@ -427,6 +427,13 @@ > } > > static inline int > +HYPERVISOR_set_pm_info(struct xencomm_handle *pminfo) > +{ > + return _hypercall2(int, ia64_dom0vp_op, IA64_DOM0VP_set_pm_info, > + pminfo); > +} > + > +static inline int > xencomm_arch_hypercall_kexec_op(int cmd, struct xencomm_handle *arg) > { > return _hypercall2(int, kexec_op, cmd, arg); > diff -r 2f32c16d5370 include/xen/interface/arch-ia64.h > --- a/include/xen/interface/arch-ia64.h Fri Sep 26 19:36:24 2008 +0800 > +++ b/include/xen/interface/arch-ia64.h Fri Sep 26 19:38:21 2008 +0800 > @@ -453,6 +453,9 @@ > /* unexpose the foreign domain's p2m table into privileged domain */ > #define IA64_DOM0VP_unexpose_foreign_p2m 13 > > +/* pass power management info to hypervisor */ > +#define IA64_DOM0VP_set_pm_info 14 > + > // flags for page assignement to pseudo physical address space > #define _ASSIGN_readonly 0 > #define ASSIGN_readonly (1UL << _ASSIGN_readonly) > -- yamahata _______________________________________________ Xen-ia64-devel mailing list Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-ia64-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |