[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: [Xen-ia64-devel] [PATCH 3/3] IA64: add cpufreq support



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@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)

Attachment: dom0_add_ia64_processor_extcntl.patch
Description: dom0_add_ia64_processor_extcntl.patch

_______________________________________________
Xen-ia64-devel mailing list
Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ia64-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.