[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
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 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. > > +/* 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. _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |