All of lore.kernel.org
 help / color / mirror / Atom feed
From: Lukas Auer <lukas.auer@aisec.fraunhofer.de>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH 28/30] riscv: align bootm implementation with that of other architectures
Date: Sat, 20 Oct 2018 00:07:41 +0200	[thread overview]
Message-ID: <20181019220743.15020-29-lukas.auer@aisec.fraunhofer.de> (raw)
In-Reply-To: <20181019220743.15020-1-lukas.auer@aisec.fraunhofer.de>

The bootm implementation of RISC-V diverges from that of other
architectures. Update it to match the implementation of other
architectures. The ARM implementation is used as a reference.

This adds the following features and changes to RISC-V.
* Add support for the BOOTM_STATE_OS_FAKE_GO command
* Call the remove function on devices with the removal flag set before
booting Linux
* Force disconnect USB devices from the host before booting Linux
* Print and add bootstage information to the device tree before booting
Linux

Signed-off-by: Lukas Auer <lukas.auer@aisec.fraunhofer.de>
---

 arch/riscv/lib/bootm.c | 94 ++++++++++++++++++++++++++++++++----------
 1 file changed, 72 insertions(+), 22 deletions(-)

diff --git a/arch/riscv/lib/bootm.c b/arch/riscv/lib/bootm.c
index bc1d4b2864..b4e18a768a 100644
--- a/arch/riscv/lib/bootm.c
+++ b/arch/riscv/lib/bootm.c
@@ -8,6 +8,8 @@
 
 #include <common.h>
 #include <command.h>
+#include <dm.h>
+#include <dm/root.h>
 #include <image.h>
 #include <u-boot/zlib.h>
 #include <asm/byteorder.h>
@@ -24,27 +26,41 @@ int arch_fixup_fdt(void *blob)
 	return 0;
 }
 
-int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t *images)
+/**
+ * announce_and_cleanup() - Print message and prepare for kernel boot
+ *
+ * @fake: non-zero to do everything except actually boot
+ */
+static void announce_and_cleanup(int fake)
 {
-	void	(*kernel)(ulong hart, void *dtb);
-
-	/*
-	 * allow the PREP bootm subcommand, it is required for bootm to work
-	 */
-	if (flag & BOOTM_STATE_OS_PREP)
-		return 0;
+	printf("\nStarting kernel ...%s\n\n", fake ?
+		"(fake run for tracing)" : "");
+	bootstage_mark_name(BOOTSTAGE_ID_BOOTM_HANDOFF, "start_kernel");
+#ifdef CONFIG_BOOTSTAGE_FDT
+	bootstage_fdt_add_report();
+#endif
+#ifdef CONFIG_BOOTSTAGE_REPORT
+	bootstage_report();
+#endif
 
-	if ((flag != 0) && (flag != BOOTM_STATE_OS_GO))
-		return 1;
+#ifdef CONFIG_USB_DEVICE
+	udc_disconnect();
+#endif
 
-	kernel = (void (*)(ulong, void *))images->ep;
-	invalidate_icache_all();
+	board_quiesce_devices();
 
-	bootstage_mark(BOOTSTAGE_ID_RUN_OS);
+	/*
+	 * Call remove function of all devices with a removal flag set.
+	 * This may be useful for last-stage operations, like cancelling
+	 * of DMA operation or releasing device internal buffers.
+	 */
+	dm_remove_devices_flags(DM_REMOVE_ACTIVE_ALL);
 
-	debug("## Transferring control to Linux (at address %08lx) ...\n",
-	       (ulong)kernel);
+	cleanup_before_linux();
+}
 
+static void boot_prep_linux(bootm_headers_t *images)
+{
 	if (IMAGE_ENABLE_OF_LIBFDT && images->ft_len) {
 #ifdef CONFIG_OF_LIBFDT
 		debug("using: FDT\n");
@@ -53,17 +69,51 @@ int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t *images)
 			hang();
 		}
 #endif
+	} else {
+		printf("Device tree not found or missing FDT support\n");
+		hang();
 	}
+}
 
-	/* we assume that the kernel is in place */
-	printf("\nStarting kernel ...\n\n");
+static void boot_jump_linux(bootm_headers_t *images, int flag)
+{
+	void (*kernel)(ulong hart, void *dtb);
+	int fake = (flag & BOOTM_STATE_OS_FAKE_GO);
 
-	cleanup_before_linux();
+	kernel = (void (*)(ulong, void *))images->ep;
+	invalidate_icache_all();
+
+	bootstage_mark(BOOTSTAGE_ID_RUN_OS);
+
+	debug("## Transferring control to Linux (at address %08lx) ...\n",
+	      (ulong)kernel);
+
+	announce_and_cleanup(fake);
+
+	if (!fake) {
+		if (IMAGE_ENABLE_OF_LIBFDT && images->ft_len)
+			kernel(csr_read(mhartid), images->ft_addr);
+	}
+}
 
-	if (IMAGE_ENABLE_OF_LIBFDT && images->ft_len)
-		kernel(csr_read(mhartid), images->ft_addr);
+int do_bootm_linux(int flag, int argc, char * const argv[],
+		   bootm_headers_t *images)
+{
+	/* No need for those on RISC-V */
+	if (flag & BOOTM_STATE_OS_BD_T || flag & BOOTM_STATE_OS_CMDLINE)
+		return -1;
 
-	/* does not return */
+	if (flag & BOOTM_STATE_OS_PREP) {
+		boot_prep_linux(images);
+		return 0;
+	}
 
-	return 1;
+	if (flag & (BOOTM_STATE_OS_GO | BOOTM_STATE_OS_FAKE_GO)) {
+		boot_jump_linux(images, flag);
+		return 0;
+	}
+
+	boot_prep_linux(images);
+	boot_jump_linux(images, flag);
+	return 0;
 }
-- 
2.17.2

  parent reply	other threads:[~2018-10-19 22:07 UTC|newest]

Thread overview: 119+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-10-19 22:07 [U-Boot] [PATCH 00/30] General fixes / cleanup for RISC-V and improvements to qemu-riscv Lukas Auer
2018-10-19 22:07 ` [U-Boot] [PATCH 01/30] tools: .gitignore: add prelink-riscv Lukas Auer
2018-10-22  6:22   ` Bin Meng
     [not found]   ` <752D002CFF5D0F4FA35C0100F1D73F3FA3A37BF6@ATCPCS16.andestech.com>
2018-10-23  1:21     ` [U-Boot] FW: " Rick Chen
2018-10-19 22:07 ` [U-Boot] [PATCH 02/30] riscv: ignore device tree binaries Lukas Auer
2018-10-22  6:16   ` Bin Meng
     [not found]     ` <752D002CFF5D0F4FA35C0100F1D73F3FA3A37942@ATCPCS16.andestech.com>
2018-10-23  1:30       ` [U-Boot] FW: " Rick Chen
2018-10-24 14:17         ` Auer, Lukas
2018-10-19 22:07 ` [U-Boot] [PATCH 03/30] dts: riscv: update makefile to also clean the RISC-V dts directory Lukas Auer
2018-10-22  6:23   ` Bin Meng
     [not found]   ` <752D002CFF5D0F4FA35C0100F1D73F3FA3A37C3F@ATCPCS16.andestech.com>
2018-10-23  1:28     ` [U-Boot] FW: " Rick Chen
2018-10-19 22:07 ` [U-Boot] [PATCH 04/30] riscv: rename CPU_RISCV_32/64 to match architecture names ARCH_RV32I/64I Lukas Auer
2018-10-22  6:23   ` Bin Meng
     [not found]     ` <752D002CFF5D0F4FA35C0100F1D73F3FA3A37C6E@ATCPCS16.andestech.com>
     [not found]       ` <CAN5B=eJZp5afSyKRn0=uKz8bkm5cNBq41-JnLLkpn8kwDaf=9A@mail.gmail.com>
2018-10-23  1:46         ` Rick Chen
2018-10-24 14:19     ` Auer, Lukas
2018-10-19 22:07 ` [U-Boot] [PATCH 05/30] riscv: select CONFIG_PHYS_64BIT on RV64I systems Lukas Auer
2018-10-22  6:23   ` Bin Meng
     [not found]     ` <752D002CFF5D0F4FA35C0100F1D73F3FA3A37C8D@ATCPCS16.andestech.com>
2018-10-23  1:50       ` Rick Chen
2018-10-19 22:07 ` [U-Boot] [PATCH 06/30] riscv: add Kconfig entries for the C and A ISA extensions Lukas Auer
2018-10-22  7:21   ` Bin Meng
2018-10-24 15:21     ` Auer, Lukas
2018-10-24 15:32       ` Bin Meng
2018-10-24 15:41         ` Auer, Lukas
2018-10-25  2:12           ` Bin Meng
2018-10-19 22:07 ` [U-Boot] [PATCH 07/30] riscv: set -march and -mabi based on the Kconfig configuration Lukas Auer
2018-10-22  7:21   ` Bin Meng
2018-10-24 15:57     ` Auer, Lukas
2018-10-25  1:56       ` Bin Meng
2018-10-19 22:07 ` [U-Boot] [PATCH 08/30] riscv: add Kconfig entries for the code model Lukas Auer
2018-10-22  7:21   ` Bin Meng
2018-10-19 22:07 ` [U-Boot] [PATCH 09/30] riscv: move target selection into separate file Lukas Auer
2018-10-22  7:22   ` Bin Meng
     [not found]     ` <752D002CFF5D0F4FA35C0100F1D73F3FA3A37D41@ATCPCS16.andestech.com>
2018-10-23  2:48       ` Rick Chen
2018-10-25  2:50         ` Bin Meng
2018-10-25 11:37           ` Auer, Lukas
2018-10-25 11:39     ` Auer, Lukas
2018-10-25 13:32       ` Bin Meng
2018-10-19 22:07 ` [U-Boot] [PATCH 10/30] riscv: enable -fdata-sections Lukas Auer
2018-10-22  7:22   ` Bin Meng
     [not found]     ` <752D002CFF5D0F4FA35C0100F1D73F3FA3A37CD1@ATCPCS16.andestech.com>
2018-10-23  2:20       ` Rick Chen
2018-10-19 22:07 ` [U-Boot] [PATCH 11/30] riscv: fix use of incorrectly sized variables Lukas Auer
2018-10-22  7:36   ` Bin Meng
     [not found]     ` <752D002CFF5D0F4FA35C0100F1D73F3FA3A37E20@ATCPCS16.andestech.com>
2018-10-23  5:52       ` Rick Chen
2018-10-25 11:47         ` Auer, Lukas
2018-10-19 22:07 ` [U-Boot] [PATCH 12/30] riscv: make use of the barrier functions from Linux Lukas Auer
2018-10-22  7:36   ` Bin Meng
     [not found]     ` <752D002CFF5D0F4FA35C0100F1D73F3FA3A37E79@ATCPCS16.andestech.com>
2018-10-23  6:12       ` Rick Chen
2018-10-25 12:39     ` Auer, Lukas
2018-10-19 22:07 ` [U-Boot] [PATCH 13/30] riscv: do not reimplement generic io functions Lukas Auer
2018-10-22  7:36   ` Bin Meng
     [not found]     ` <752D002CFF5D0F4FA35C0100F1D73F3FA3A37E95@ATCPCS16.andestech.com>
2018-10-23  6:18       ` Rick Chen
2018-10-25 12:42     ` Auer, Lukas
2018-10-19 22:07 ` [U-Boot] [PATCH 14/30] riscv: complete the list of exception codes Lukas Auer
2018-10-22  7:36   ` Bin Meng
     [not found]     ` <752D002CFF5D0F4FA35C0100F1D73F3FA3A37EAD@ATCPCS16.andestech.com>
2018-10-23  6:22       ` Rick Chen
2018-10-19 22:07 ` [U-Boot] [PATCH 15/30] riscv: treat undefined exception codes as reserved Lukas Auer
2018-10-22  7:36   ` Bin Meng
     [not found]     ` <752D002CFF5D0F4FA35C0100F1D73F3FA3A37EC2@ATCPCS16.andestech.com>
2018-10-23  6:26       ` Rick Chen
2018-10-19 22:07 ` [U-Boot] [PATCH 16/30] riscv: hang on unhandled exceptions Lukas Auer
2018-10-22  7:46   ` Bin Meng
     [not found]     ` <752D002CFF5D0F4FA35C0100F1D73F3FA3A37ED4@ATCPCS16.andestech.com>
2018-10-23  6:28       ` Rick Chen
2018-10-19 22:07 ` [U-Boot] [PATCH 17/30] riscv: implement the invalidate_icache_* functions Lukas Auer
2018-10-22  7:47   ` Bin Meng
     [not found]     ` <752D002CFF5D0F4FA35C0100F1D73F3FA3A37EEE@ATCPCS16.andestech.com>
2018-10-23  6:34       ` Rick Chen
2018-10-19 22:07 ` [U-Boot] [PATCH 18/30] riscv: invalidate the instruction cache before jumping to Linux Lukas Auer
     [not found]   ` <752D002CFF5D0F4FA35C0100F1D73F3FA3A3568B@ATCPCS16.andestech.com>
2018-10-22  1:39     ` [U-Boot] FW: " Rick Chen
2018-10-26 16:27       ` Auer, Lukas
2018-10-29  2:25         ` Rick Chen
2018-10-31  3:48           ` Greentime Hu
2018-10-31  4:22             ` Rick Chen
2018-11-03 17:19               ` Auer, Lukas
2018-10-19 22:07 ` [U-Boot] [PATCH 19/30] riscv: fix inconsistent use of spaces and tabs in start.S Lukas Auer
2018-10-22  7:47   ` Bin Meng
     [not found]     ` <752D002CFF5D0F4FA35C0100F1D73F3FA3A37F52@ATCPCS16.andestech.com>
2018-10-23  6:58       ` Rick Chen
2018-10-19 22:07 ` [U-Boot] [PATCH 20/30] riscv: align mtvec on a 4-byte boundary Lukas Auer
2018-10-22  7:47   ` Bin Meng
     [not found]     ` <752D002CFF5D0F4FA35C0100F1D73F3FA3A380C6@ATCPCS16.andestech.com>
2018-10-23  9:17       ` Rick Chen
2018-10-23  9:25         ` Bin Meng
2018-10-19 22:07 ` [U-Boot] [PATCH 21/30] riscv: remove CONFIG_INIT_CRITICAL Lukas Auer
2018-10-22  9:19   ` Bin Meng
2018-10-25  2:57     ` Bin Meng
2018-10-25 15:48       ` Auer, Lukas
2018-10-19 22:07 ` [U-Boot] [PATCH 22/30] riscv: remove unused labels in start.S Lukas Auer
2018-10-22  9:19   ` Bin Meng
     [not found]     ` <752D002CFF5D0F4FA35C0100F1D73F3FA3A38CF1@ATCPCS16.andestech.com>
2018-10-24  2:38       ` Rick Chen
2018-10-24  3:34         ` Bin Meng
2018-10-24  5:20           ` Rick Chen
2018-10-24  5:47             ` Rick Chen
2018-10-24 14:13               ` Auer, Lukas
2018-10-25  1:16                 ` Rick Chen
2018-10-25 15:56                   ` Auer, Lukas
2018-10-29 16:43                     ` Auer, Lukas
2018-10-30  1:49                       ` Rick Chen
2018-10-30 12:51                         ` Auer, Lukas
2018-10-19 22:07 ` [U-Boot] [PATCH 23/30] riscv: do not blindly modify the mstatus CSR Lukas Auer
2018-10-22  9:19   ` Bin Meng
     [not found]     ` <752D002CFF5D0F4FA35C0100F1D73F3FA3A38DCB@ATCPCS16.andestech.com>
2018-10-24  5:51       ` Rick Chen
2018-10-19 22:07 ` [U-Boot] [PATCH 24/30] riscv: save hart ID and device tree passed by prior boot stage Lukas Auer
2018-10-22  9:19   ` Bin Meng
     [not found]     ` <752D002CFF5D0F4FA35C0100F1D73F3FA3A38DE5@ATCPCS16.andestech.com>
2018-10-24  5:56       ` Rick Chen
2018-10-19 22:07 ` [U-Boot] [PATCH 25/30] riscv: qemu: use " Lukas Auer
2018-10-22  9:19   ` Bin Meng
     [not found]     ` <752D002CFF5D0F4FA35C0100F1D73F3FA3A38E02@ATCPCS16.andestech.com>
2018-10-24  6:05       ` Rick Chen
2018-10-19 22:07 ` [U-Boot] [PATCH 26/30] bdinfo: riscv: print fdt_blob address Lukas Auer
2018-10-22  9:35   ` Bin Meng
     [not found]     ` <752D002CFF5D0F4FA35C0100F1D73F3FA3A38E43@ATCPCS16.andestech.com>
2018-10-24  6:54       ` Rick Chen
2018-10-26 13:36         ` Auer, Lukas
2018-10-19 22:07 ` [U-Boot] [PATCH 27/30] riscv: qemu: support booting Linux Lukas Auer
2018-10-22  9:35   ` Bin Meng
2018-10-19 22:07 ` Lukas Auer [this message]
2018-10-22  9:35   ` [U-Boot] [PATCH 28/30] riscv: align bootm implementation with that of other architectures Bin Meng
2018-10-19 22:07 ` [U-Boot] [PATCH 29/30] dm: core: add missing prototype for ofnode_read_u64 Lukas Auer
2018-10-22  9:35   ` Bin Meng
2018-10-25 16:09     ` Auer, Lukas
2018-10-19 22:07 ` [U-Boot] [PATCH 30/30] riscv: qemu: detect and boot the kernel passed by QEMU Lukas Auer
2018-10-22  9:35   ` Bin Meng
2018-10-22  9:37 ` [U-Boot] [PATCH 00/30] General fixes / cleanup for RISC-V and improvements to qemu-riscv Bin Meng
2018-10-26 13:20   ` Bin Meng
2018-10-26 13:40     ` Auer, Lukas

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20181019220743.15020-29-lukas.auer@aisec.fraunhofer.de \
    --to=lukas.auer@aisec.fraunhofer.de \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.