[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH RFC] xen/arm : emulation of arm's psci v0.2 standard
Hi Parth, Cced the maintainers here. On 06/19/2014 11:14 AM, Parth Dixit wrote: > From: parthd <parth.dixit@xxxxxxxxxx> This will be use as the commit author. IIRC, we request to have the full name here. > > Arm based virtual machines dom0/guest will request power related functionality > from xen through psci interface. This patch implements version 0.2 of s/psci/PSCI > PSCI standard specified by arm for 64bit and 32 bit arm machines. > > Signed-off-by: Parth Dixit <parth.dixit@xxxxxxxxxx> > --- > xen/arch/arm/domain_build.c | 5 ++- > xen/arch/arm/traps.c | 56 ++++++++++++++++++++++-- > xen/arch/arm/vpsci.c | 75 ++++++++++++++++++++++++++++++++ > xen/include/asm-arm/processor.h | 6 +++ > xen/include/asm-arm/psci.h | 18 ++++++++ > xen/include/public/arch-arm.h | 95 > +++++++++++++++++++++++++++++++++++++++-- > 6 files changed, 246 insertions(+), 9 deletions(-) > > diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c > index c424793..ebd4170 100644 > --- a/xen/arch/arm/domain_build.c > +++ b/xen/arch/arm/domain_build.c > @@ -388,6 +388,9 @@ static int make_hypervisor_node(struct domain *d, > static int make_psci_node(void *fdt, const struct dt_device_node *parent) > { > int res; > + const char compat[] = > + "arm,psci-0.2""\0" > + "arm,psci"; > > DPRINT("Create PSCI node\n"); > > @@ -396,7 +399,7 @@ static int make_psci_node(void *fdt, const struct > dt_device_node *parent) > if ( res ) > return res; > > - res = fdt_property_string(fdt, "compatible", "arm,psci"); > + res = fdt_property(fdt, "compatible", compat, sizeof(compat)); > if ( res ) > return res; > > diff --git a/xen/arch/arm/traps.c b/xen/arch/arm/traps.c > index 03a3da6..dc4ff56 100644 > --- a/xen/arch/arm/traps.c > +++ b/xen/arch/arm/traps.c > @@ -1046,6 +1046,15 @@ typedef struct { > static arm_psci_t arm_psci_table[] = { > PSCI(cpu_off, 1), > PSCI(cpu_on, 2), > + PSCI(0_2_psci_version,1), > + PSCI(0_2_cpu_suspend,2), > + PSCI(0_2_affinity_info,2), > + PSCI(0_2_migrate,1), > + PSCI(0_2_migrate_info_type,0), > + PSCI(0_2_migrate_info_up_cpu,0), > + PSCI(0_2_system_off,0), > + PSCI(0_2_system_reset,0), > + > }; > > #ifndef NDEBUG > @@ -1092,14 +1101,53 @@ static void do_debug_trap(struct cpu_user_regs *regs, > unsigned int code) > static void do_trap_psci(struct cpu_user_regs *regs) > { > arm_psci_fn_t psci_call = NULL; > + int fn_index = -1; > > - if ( PSCI_OP_REG(regs) >= ARRAY_SIZE(arm_psci_table) ) > + switch ( PSCI_OP_REG(regs) ) I don't much like this switch case. Isn't any other solution to get the fn_index? > { > - domain_crash_synchronous(); > - return; > + case PSCI_0_2_FN_PSCI_VERSION: > + fn_index = PSCI_0_2_psci_version; > + break; > + case PSCI_0_2_FN_CPU_SUSPEND: > + case PSCI_0_2_FN64_CPU_SUSPEND: > + fn_index = PSCI_0_2_cpu_suspend; > + break; > + case PSCI_cpu_off: > + case PSCI_0_2_FN_CPU_OFF: > + fn_index = PSCI_cpu_off; > + break; > + case PSCI_cpu_on: > + case PSCI_0_2_FN_CPU_ON: > + case PSCI_0_2_FN64_CPU_ON: > + fn_index = PSCI_cpu_on; You have to modified the behavior of PSCI_cpu_on. On PSCI v0.2, the function should return ALREADY_ON, if the vcpu is online. We don't handle this return value for now. > diff --git a/xen/arch/arm/vpsci.c b/xen/arch/arm/vpsci.c > index 1ceb8cb..c1243d4 100644 > --- a/xen/arch/arm/vpsci.c > +++ b/xen/arch/arm/vpsci.c > @@ -83,6 +83,81 @@ int do_psci_cpu_off(uint32_t power_state) > return PSCI_SUCCESS; > } > > +int do_psci_0_2_psci_version(uint32_t vcpuid) > +{ > + return XEN_PSCI_V_0_2; > +} > + > +int do_psci_0_2_cpu_suspend(uint32_t power_state, register_t entry_point) > +{ > + struct cpu_user_regs *regs = guest_cpu_user_regs(); > + regs->cpsr &= ~PSR_IRQ_MASK; Why do you clear the IRQ flag here? > + vcpu_block(); > + return PSCI_RET_SUCCESS; > +} > +void do_psci_0_2_system_off( void ) > +{ > + struct domain *d = current->domain; > + domain_shutdown(d,0); Please use SHUTDOWN_poweroff rather than hardcoding 0. > +} > + > + > +void do_psci_0_2_system_reset(void) > +{ > + struct domain *d = current->domain; > + domain_shutdown(d,1); SHUTDOWN_reboot > #endif /* __ASM_PSCI_H__ */ > > /* > diff --git a/xen/include/public/arch-arm.h b/xen/include/public/arch-arm.h > index 7496556..1663a3e 100644 > --- a/xen/include/public/arch-arm.h > +++ b/xen/include/public/arch-arm.h Most of the defines you added here some belongs to include/asm-arm/psci.h. The file arch-arm.h, contains define exposed to the guest. Here the define are only used within the hypervisor. Therefore they should not belong to this file. > +/* PSCI return values (inclusive of all PSCI versions) */ > +#define PSCI_RET_SUCCESS 0 > +#define PSCI_RET_NOT_SUPPORTED -1 > +#define PSCI_RET_INVALID_PARAMS -2 > +#define PSCI_RET_DENIED -3 > +#define PSCI_RET_ALREADY_ON -4 > +#define PSCI_RET_ON_PENDING -5 > +#define PSCI_RET_INTERNAL_FAILURE -6 > +#define PSCI_RET_NOT_PRESENT -7 > +#define PSCI_RET_DISABLED -8 > + Please look at include/asm-arm/psci.h, there is already the definition of PSCI_{DENIED,SUCCESS,...}. Regards, -- Julien Grall _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |