[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2] xen/arm : emulation of arm's PSCI v0.2 standard
Hi, On 30 June 2014 15:45, Ian Campbell <Ian.Campbell@xxxxxxxxxx> wrote: > On Mon, 2014-06-30 at 10:36 +0530, Parth Dixit wrote: > > Can you please try and configure your Linaro mail to send plain text > mails and to use the normal ">" quoting style rather than HTML based > indentation, which can get unreadable after a few round trips. > >> Are you also planning to work on host PSCI or is that someone >> else (just >> curious). >> >> >> PSCI host was scoped out because there was no real hardware where we >> can test this functionality > > OK. > >> > + >> > /* >> > * Local variables: >> > * mode: C >> >> > diff --git a/xen/arch/arm/traps.c b/xen/arch/arm/traps.c >> > index 03a3da6..e42fb07 100644 >> > --- a/xen/arch/arm/traps.c >> > +++ b/xen/arch/arm/traps.c >> > @@ -1030,7 +1030,7 @@ static arm_hypercall_t >> arm_hypercall_table[] = { >> > HYPERCALL_ARM(vcpu_op, 3), >> > }; >> > >> > -typedef int (*arm_psci_fn_t)(uint32_t, register_t); >> > +typedef int (*arm_psci_fn_t)(register_t, register_t, >> register_t); >> > >> > typedef struct { >> > arm_psci_fn_t fn; >> > @@ -1046,6 +1046,17 @@ typedef struct { >> > static arm_psci_t arm_psci_table[] = { >> > PSCI(cpu_off, 1), >> > PSCI(cpu_on, 2), >> > + PSCI(0_2_version,0), >> > + PSCI(0_2_cpu_suspend,3), >> > + PSCI(0_2_cpu_off,0), >> > + PSCI(0_2_cpu_on,3), >> > + 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), >> >> >> The v2 ops are 0x84xxxxxx and 0xc4xxxxxx -- doesn't that end >> up making >> this table enormous? >> >> Also AArch32 and Aarch64 have difference function IDs for the >> various >> functions -- I don't see that reflected here. >> >> >> I am not using function id's directly i am using mask to calculate >> array index based on function id's. >> 32bit and 64 bit are using common functions. > > Oh, OK. I'm not mad keen on this (see below). > >> >> > #define MPIDR_HWID_MASK _AC(0xffffff,U) >> > #define MPIDR_INVALID (~MPIDR_HWID_MASK) >> > +#define MPIDR_AFF_BIT_SHIFT (8) >> > +#define AFFINITY_MASK(level) (_AC(0xff,U) << >> ((level)*MPIDR_AFF_BIT_SHIFT)) >> > + >> > >> > /* TTBCR Translation Table Base Control Register */ >> > #define TTBCR_EAE _AC(0x80000000,U) >> > diff --git a/xen/include/asm-arm/psci.h >> b/xen/include/asm-arm/psci.h >> > index 189964b..3487380 100644 >> > --- a/xen/include/asm-arm/psci.h >> > +++ b/xen/include/asm-arm/psci.h >> > @@ -1,11 +1,6 @@ >> > #ifndef __ASM_PSCI_H__ >> > #define __ASM_PSCI_H__ >> > >> > -#define PSCI_SUCCESS 0 >> > -#define PSCI_ENOSYS -1 >> > -#define PSCI_EINVAL -2 >> > -#define PSCI_DENIED -3 >> > - >> > /* availability of PSCI on the host for SMP bringup */ >> > extern bool_t psci_available; >> > >> > @@ -18,6 +13,123 @@ int do_psci_cpu_off(uint32_t >> power_state); >> > int do_psci_cpu_suspend(uint32_t power_state, register_t >> entry_point); >> > int do_psci_migrate(uint32_t vcpuid); >> > >> > +/* PSCI 0.2 functions to handle guest PSCI requests */ >> > +int do_psci_0_2_version(void); >> > +int do_psci_0_2_cpu_suspend(uint32_t power_state, >> register_t entry_point, >> > + register_t context_id); >> > +int do_psci_0_2_cpu_off(void); >> > +int do_psci_0_2_cpu_on(register_t target_cpu, register_t >> entry_point, >> > + register_t context_id); >> > +int do_psci_0_2_affinity_info(register_t target_affinity, >> > + uint32_t >> lowest_affinity_level); >> > +int do_psci_0_2_migrate(uint32_t target_cpu); >> > +int do_psci_0_2_migrate_info_type(void); >> > +register_t do_psci_0_2_migrate_info_up_cpu(void); >> > +void do_psci_0_2_system_off(void); >> > +void do_psci_0_2_system_reset(void); >> > +int do_psci_0_2_fn64_cpu_suspend(uint32_t power_state, >> > + uint32_t entry_point, >> register_t context_id); >> > +int do_psci_0_2_fn64_cpu_on(register_t target_cpu, >> register_t entry_point, >> > + register_t context_id); >> > +int do_psci_0_2_fn64_affinity_info(register_t >> target_affinity, >> > + uint32_t >> lowest_affinity_level); >> > +int do_psci_0_2_fn64_migrate(uint32_t target_cpu); >> > +int do_psci_0_2_fn64_migrate_info_up_cpu(void); >> >> >> This is making me thing that we should move do_psci_trap into >> vpsci.c so >> we can keep all this stuff internal. >> >> Either your functions should take uint32_t/uint64_t as per the >> spec and >> be duplicated for 32- vs 64-bit *or* they should take >> register_t for >> those parameters which are different for 32- vs 64-bit and not >> be >> duplicated. You've used register_t *and* duplicated AFAICT. >> >> Ideally I'd prefer not to duplicate, unless the spec makes >> that hard. >> >> (actually, looking back at the implementation you don't >> actually defined >> any fn64 -- so maybe half of these are just redundant?) >> >> >> They are there for completion,i am using common functions for 32 >> bit/64 bit > > What do you mean by "completion"? > > If those prototypes do not correspond to some real function which is > actually being used then please remove them PSCI v0.1 had two functions implemented and two others were declared but not implemented, i was following the same style. i.e. declaring all the functions in the spec but implementing only the ones that are mandated/used I will remove the the unused functions. > >> > + >> > +/* PSCI version */ >> > +#define XEN_PSCI_V_0_1 1 >> > +#define XEN_PSCI_V_0_2 2 >> > + >> > +/* PSCI v0.2 id's internal to xen */ >> > + >> > +#define PSCI_0_2_version 5 >> > +#define PSCI_0_2_cpu_suspend 6 >> > +#define PSCI_0_2_cpu_off 7 >> > +#define PSCI_0_2_cpu_on 8 >> > +#define PSCI_0_2_affinity_info 9 >> > +#define PSCI_0_2_migrate 10 >> > +#define PSCI_0_2_migrate_info_type 11 >> > +#define PSCI_0_2_migrate_info_up_cpu 12 >> > +#define PSCI_0_2_system_off 13 >> > +#define PSCI_0_2_system_reset 14 >> > + >> > +#define PSCI_0_2_fn64_cpu_suspend 15 >> > +#define PSCI_0_2_fn64_cpu_on 16 >> > +#define PSCI_0_2_fn64_affinity_info 17 >> > +#define PSCI_0_2_fn64_migrate 18 >> > +#define PSCI_0_2_fn64_migrate_info_up_cpu 19 >> > + >> > +/* PSCI v0.2 xen mapping mask */ >> > +#define PSCI_0_2_FN_OFFSET 0x83FFFFFB >> >> >> Err? >> >> I think you should make the defines be the actual PSCI >> function numbers >> and then define three separate function call tables and look >> up the >> appropriate one based on the range of the function parameter. >> >> TBH given the relatively small number of PSCI calls maybe just >> switching >> to a C switch() statement would be best. >> patchset v1 was based on switch case it was moved to if/else after >> review comments, should i change it back to switch case? > > Sorry for not getting to this for v1. > > v1 had a switch statement to lookup fn_index, which it then looked up > again in the op table. I think that approach was the worst of both > worlds. > > What I was suggesting was a switch statement which actually dispatched > the call to the appropriate handler directly, rather than having a > second indirection via a table. > > The main thing I don't like is macro hoops you are jumping through in > order to turn the spec mandated sparse function space into a compact one > suitable for placing in an array. > > Another viable alternative would be to have separate tables for PSCI 0.1 > and PSCSI 0.2 32- and 64-bit and look through each in turn. Sure, let me try the two table approach. > >> > +/* PSCI v0.2 multicore support in Trusted OS returned by >> MIGRATE_INFO_TYPE */ >> > +#define PSCI_0_2_TOS_UP_MIGRATE 0 >> > +#define PSCI_0_2_TOS_UP_NO_MIGRATE 1 >> > +#define PSCI_0_2_TOS_MP 2 >> >> >> The first two names are tolerable, but the last one doesn't >> seem to >> match the spec. >> >> > diff --git a/xen/include/public/arch-arm.h >> b/xen/include/public/arch-arm.h >> > index 7496556..93803e4 100644 >> > --- a/xen/include/public/arch-arm.h >> > +++ b/xen/include/public/arch-arm.h >> > @@ -385,6 +385,7 @@ typedef uint64_t xen_callback_t; >> > #define PSCI_cpu_off 1 >> > #define PSCI_cpu_on 2 >> > #define PSCI_migrate 3 >> > +#define PSCI_0_1_MAX 4 >> >> >> The tools don't need this, so no need to make it public. >> This was taken as it is from previous implementation should i move it >> to psci.h? > > What previous implementation? I don't see anything like that in the tree > right now. > > Ian. > > hmmm, just to be sure you are talking about these constants "PSCI_cpu_off,PSCI_cpu_on ..etc." in xen/include/public/arch-arm.h ? i can see them in xen/master branch...or is it something else? _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |