|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Minios-devel] [UNIKRAFT PATCHv5 38/46] plat/kvm: Get PSCI conduit method from DTB for Arm64
Hi Simon,
> -----Original Message-----
> From: Simon Kuenzer <simon.kuenzer@xxxxxxxxx>
> Sent: 2018年9月12日 4:18
> To: Wei Chen (Arm Technology China) <Wei.Chen@xxxxxxx>; minios-
> devel@xxxxxxxxxxxxxxxxxxxx
> Cc: Kaly Xin (Arm Technology China) <Kaly.Xin@xxxxxxx>; nd <nd@xxxxxxx>
> Subject: Re: [Minios-devel] [UNIKRAFT PATCHv5 38/46] plat/kvm: Get PSCI
> conduit method from DTB for Arm64
>
>
>
> On 10.08.2018 09:08, Wei Chen wrote:
> > From: Wei Chen <Wei.Chen@xxxxxxx>
> >
> > PSCI supports two conduit method: HVC and SMC. The method
> > would be set value in device tree's PSCI node. This value
> > would decide which instruction we should use to call PSCI
> > functions. We only support PSCI-1.0 and PSCI-0.2 in this
> > stage.
> >
> > Signed-off-by: Wei Chen <Wei.Chen@xxxxxxx>
> > ---
> > plat/kvm/arm/setup.c | 44 ++++++++++++++++++++++++++++++++++++++++++++
> > 1 file changed, 44 insertions(+)
> >
> > diff --git a/plat/kvm/arm/setup.c b/plat/kvm/arm/setup.c
> > index a74c85f..a0b1f50 100644
> > --- a/plat/kvm/arm/setup.c
> > +++ b/plat/kvm/arm/setup.c
> > @@ -22,6 +22,7 @@
> > #include <kvm/console.h>
> > #include <uk/assert.h>
> > #include <mm.h>
> > +#include <arm/cpu.h>
> > #include <uk/arch/limits.h>
> >
> > void *_libkvmplat_pagetable;
> > @@ -33,6 +34,8 @@ void *_libkvmplat_dtb;
> > #define MAX_CMDLINE_SIZE 1024
> > static char cmdline[MAX_CMDLINE_SIZE];
> >
> > +smcc_psci_callfn_t smcc_psci_call;
> > +
> > static void _init_dtb(void *dtb_pointer)
> > {
> > int ret;
> > @@ -44,6 +47,44 @@ static void _init_dtb(void *dtb_pointer)
> > uk_printd(DLVL_INFO, "Found device tree on: %p\n", dtb_pointer);
> > }
> >
> > +static void _dtb_get_psci_method(void)
> > +{
> > + int fdtpsci, len;
> > + const char *fdtmethod;
> > +
> > + /*
> > + * We just support PSCI-0.2 and PSCI-1.0, the PSCI-0.1 would not
> > + * be supported.
> > + */
> > + fdtpsci = fdt_node_offset_by_compatible(_libkvmplat_dtb,
> > + -1, "arm,psci-1.0");
> > + if (fdtpsci < 0)
> > + fdtpsci = fdt_node_offset_by_compatible(_libkvmplat_dtb,
> > + -1, "arm,psci-0.2");
> > + if (fdtpsci < 0) {
> > + uk_printd(DLVL_INFO, "No PSCI conduit found in DTB\n");
> > + goto enomethod;
> > + }
> > +
> > + fdtmethod = fdt_getprop(_libkvmplat_dtb, fdtpsci, "method", &len);
> > + if (!fdtmethod || (len <= 0)) {
> > + uk_printd(DLVL_INFO, "No PSCI method found\n");
> > + goto enomethod;
> > + }
> > +
> > + if (!strcmp(fdtmethod, "hvc"))
> > + smcc_psci_call = smcc_psci_hvc_call;
> > + else if (!strcmp(fdtmethod, "smc"))
> > + smcc_psci_call = smcc_psci_smc_call;
>
> What if you find something else than hvc or smc on the device tree?
>
Yeah, that's a good question. Generally speaking we could not get any other
value in method property. But we can't exclude the possibility of mistakes
like typo of DTS provider.
So I prefer to print a warning message about invalid method, and treat this
case as NOMETHOD.
> > +
> > + uk_printd(DLVL_INFO, "PSCI method: %s\n", fdtmethod);
> > + return;
> > +
> > +enomethod:
> > + uk_printd(DLVL_INFO, "Support PSCI from PSCI-0.2\n");
> > + smcc_psci_call = NULL;
> > +}
> > +
> > static void _init_dtb_mem(void)
> > {
> > extern char _text[];
> > @@ -143,6 +184,9 @@ void _libkvmplat_start(void *dtb_pointer)
> >
> > _dtb_get_cmdline(cmdline, sizeof(cmdline));
> >
> > + /* Get PSCI method from DTB */
> > + _dtb_get_psci_method();
> > +
> > /* Initialize memory from DTB */
> > _init_dtb_mem();
> >
> >
_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |