[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Minios-devel] [UNIKRAFT PATCHv6 25/37] plat/kvm: Get PSCI conduit method from DTB for Arm64
Reviewed-by: Simon Kuenzer <simon.kuenzer@xxxxxxxxx> On 14.09.2018 09:56, 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 | 49 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/plat/kvm/arm/setup.c b/plat/kvm/arm/setup.c index 4fb6515..3927507 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 <kvm-arm/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,49 @@ 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; + else { + uk_printd(DLVL_INFO, + "Invalid PSCI conduit method: %s\n", fdtmethod); + goto enomethod; + } + + 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 +189,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 |