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@intel.com> Liu Jinsong <jinsong.liu@intel.com> _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Isaku Yamahata
2008-Sep-29 03:50 UTC
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@intel.com> > Liu Jinsong <jinsong.liu@intel.com>> 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@intel.com> > Liu Jinsong <jinsong.liu@intel.com> > > 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@lists.xensource.com http://lists.xensource.com/xen-ia64-devel
Please see attached patch. Two changes are made: 1. use platform hypercall instead of dom0 ops hyercall 2. fix the tab and space mixed issue. BTW, for the drivers/acpi/Kconfig hunk, although it is common file, the change is purly ia64 spefific. And without this hunk, the dom0 can not pass compilation, so I stil keep it in this patch. Best Regards Ke Isaku Yamahata wrote:> 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@intel.com> >> Liu Jinsong <jinsong.liu@intel.com> > >> 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@intel.com> >> Liu Jinsong <jinsong.liu@intel.com> >> >> 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)_______________________________________________ Xen-ia64-devel mailing list Xen-ia64-devel@lists.xensource.com http://lists.xensource.com/xen-ia64-devel