From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 9BF66C352A1 for ; Wed, 7 Dec 2022 06:24:06 +0000 (UTC) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id C150685169; Wed, 7 Dec 2022 07:24:03 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=andestech.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Received: by phobos.denx.de (Postfix, from userid 109) id 91CF0850D6; Wed, 7 Dec 2022 07:24:01 +0100 (CET) Received: from Atcsqr.andestech.com (60-248-80-70.hinet-ip.hinet.net [60.248.80.70]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 16082850D6 for ; Wed, 7 Dec 2022 07:23:57 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=andestech.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=rick@andestech.com Received: from mail.andestech.com (ATCPCS16.andestech.com [10.0.1.222]) by Atcsqr.andestech.com with ESMTP id 2B76Nk1A096066; Wed, 7 Dec 2022 14:23:46 +0800 (+08) (envelope-from rick@andestech.com) Received: from atcfdc88.andestech.com (10.0.15.158) by ATCPCS16.andestech.com (10.0.1.222) with Microsoft SMTP Server id 14.3.498.0; Wed, 7 Dec 2022 14:23:42 +0800 From: Rick Chen To: , , CC: , , , Subject: [PATCH 1/4] riscv: spl: Introduce SPL_OPENSBI_OS_BOOT Date: Wed, 7 Dec 2022 14:23:31 +0800 Message-ID: <20221207062334.21292-1-rick@andestech.com> X-Mailer: git-send-email 2.17.1 MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.0.15.158] X-DNSRBL: X-MAIL: Atcsqr.andestech.com 2B76Nk1A096066 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.39 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.103.6 at phobos.denx.de X-Virus-Status: Clean In RISC-V, it only provide normal mode booting currently. To speed up the booting process, here provide SPL_OPENSBI_OS_BOOT to achieve this feature which will be call Fast-Boot mode. By enabling SPL_OPENSBI_OS_BOOT, it will generate linux.itb instead of default u-boot.itb after compiling. It initializes memory with the U-Boot SPL at the first stage, just like what a regular booting process (i.e. Normal Boot) does in the beginning. Instead of jumping to the U-Boot proper from OpenSBI before booting Linux Kernel, the Fast Boot process jumps directly to Linux Kernel to gain shorter booting time. Signed-off-by: Rick Chen --- common/spl/Kconfig | 14 ++++++++++++++ common/spl/spl_fit.c | 3 ++- common/spl/spl_opensbi.c | 25 ++++++++++++------------- 3 files changed, 28 insertions(+), 14 deletions(-) diff --git a/common/spl/Kconfig b/common/spl/Kconfig index 05181bdba3..8805aba1b7 100644 --- a/common/spl/Kconfig +++ b/common/spl/Kconfig @@ -1509,6 +1509,20 @@ config SPL_OPENSBI_SCRATCH_OPTIONS Options passed to fw_dynamic, for example SBI_SCRATCH_NO_BOOT_PRINTS or SBI_SCRATCH_DEBUG_PRINTS. +config SPL_OPENSBI_OS_BOOT + bool "openSBI Fast Boot" + depends on SPL_OPENSBI + help + Enable this openSBI can jump to Linux Kernel directly. + +config SPL_OPENSBI_FIT_NAME + string "SPL openSBI fit image name" + depends on SPL_OPENSBI + default "linux.itb" if SPL_OPENSBI_OS_BOOT + default "u-boot.itb" + help + This will help to generate different fit name accordingly. + config SPL_TARGET string "Addtional build targets for 'make'" default "spl/u-boot-spl.srec" if RCAR_GEN2 diff --git a/common/spl/spl_fit.c b/common/spl/spl_fit.c index c1ed31e367..c5b1dfb3ba 100644 --- a/common/spl/spl_fit.c +++ b/common/spl/spl_fit.c @@ -363,7 +363,8 @@ static bool os_takes_devicetree(uint8_t os) case IH_OS_U_BOOT: return true; case IH_OS_LINUX: - return IS_ENABLED(CONFIG_SPL_OS_BOOT); + return IS_ENABLED(CONFIG_SPL_OS_BOOT) || + IS_ENABLED(CONFIG_SPL_OPENSBI_OS_BOOT); default: return false; } diff --git a/common/spl/spl_opensbi.c b/common/spl/spl_opensbi.c index b0f40076c3..83869c6b18 100644 --- a/common/spl/spl_opensbi.c +++ b/common/spl/spl_opensbi.c @@ -20,7 +20,7 @@ DECLARE_GLOBAL_DATA_PTR; struct fw_dynamic_info opensbi_info; -static int spl_opensbi_find_uboot_node(void *blob, int *uboot_node) +static int spl_opensbi_find_os_node(void *blob, int *os_node) { int fit_images_node, node; const char *fit_os; @@ -34,10 +34,9 @@ static int spl_opensbi_find_uboot_node(void *blob, int *uboot_node) if (!fit_os) continue; - if (genimg_get_os_id(fit_os) == IH_OS_U_BOOT) { - *uboot_node = node; - return 0; - } + *os_node = node; + + return 0; } return -ENODEV; @@ -45,8 +44,8 @@ static int spl_opensbi_find_uboot_node(void *blob, int *uboot_node) void spl_invoke_opensbi(struct spl_image_info *spl_image) { - int ret, uboot_node; - ulong uboot_entry; + int ret, os_node; + ulong os_entry; void (*opensbi_entry)(ulong hartid, ulong dtb, ulong info); if (!spl_image->fdt_addr) { @@ -54,22 +53,22 @@ void spl_invoke_opensbi(struct spl_image_info *spl_image) hang(); } - /* Find U-Boot image in /fit-images */ - ret = spl_opensbi_find_uboot_node(spl_image->fdt_addr, &uboot_node); + /* Find U-Boot or Linux image in /fit-images */ + ret = spl_opensbi_find_os_node(spl_image->fdt_addr, &os_node); if (ret) { pr_err("Can't find U-Boot node, %d\n", ret); hang(); } - /* Get U-Boot entry point */ - ret = fit_image_get_entry(spl_image->fdt_addr, uboot_node, &uboot_entry); + /* Get os entry point */ + ret = fit_image_get_entry(spl_image->fdt_addr, os_node, &os_entry); if (ret) - ret = fit_image_get_load(spl_image->fdt_addr, uboot_node, &uboot_entry); + ret = fit_image_get_load(spl_image->fdt_addr, os_node, &os_entry); /* Prepare opensbi_info object */ opensbi_info.magic = FW_DYNAMIC_INFO_MAGIC_VALUE; opensbi_info.version = FW_DYNAMIC_INFO_VERSION; - opensbi_info.next_addr = uboot_entry; + opensbi_info.next_addr = os_entry; opensbi_info.next_mode = FW_DYNAMIC_INFO_NEXT_MODE_S; opensbi_info.options = CONFIG_SPL_OPENSBI_SCRATCH_OPTIONS; opensbi_info.boot_hart = gd->arch.boot_hart; -- 2.17.1