Date: Tue, 13 Oct 2020 18:13:08 -0700 From: Mark Millard <marklmi@yahoo.com> To: freebsd-arm <freebsd-arm@freebsd.org> Subject: 64-bit RPi4B u-boot hangup with modern rpi firmware: some information (but investigative-toolbox limited) Message-ID: <290E51C0-0AF5-4C75-AA7B-BA56DF1AFDFB@yahoo.com> References: <290E51C0-0AF5-4C75-AA7B-BA56DF1AFDFB.ref@yahoo.com>
next in thread | previous in thread | raw e-mail | index | archive | help
I tried building u-boot with: CONFIG_LOG=3Dy CONFIG_LOG_CONSOLE=3Dy CONFIG_LOG_MAX_LEVEL=3D7 and the first console output with the somewhat older firmware (for which the combination boots) was: initcall: 00000000000ec7b4 U-Boot 2020.10 (Oct 13 2020 - 20:26:59 +0000) That is display_options, just after serial_init and console_init_f are executed. No such output occurs with more modern firmware (same u-boot). That means, in the 4 GIByte RPi4B context that I have access to, that the hang up happens at some point during the sequence of initialization steps, on or before display_options: static const init_fnc_t init_sequence_f[] =3D { setup_mon_len, #ifdef CONFIG_OF_CONTROL fdtdec_setup, #endif #ifdef CONFIG_TRACE_EARLY trace_early_init, #endif initf_malloc, log_init, initf_bootstage, /* uses its own timer, so does not need = DM */ #ifdef CONFIG_BLOBLIST bloblist_init, #endif setup_spl_handoff, initf_console_record, #if defined(CONFIG_HAVE_FSP) arch_fsp_init, #endif arch_cpu_init, /* basic arch cpu dependent setup */ mach_cpu_init, /* SoC/machine dependent CPU setup */ initf_dm, arch_cpu_init_dm, #if defined(CONFIG_BOARD_EARLY_INIT_F) board_early_init_f, #endif #if defined(CONFIG_PPC) || defined(CONFIG_SYS_FSL_CLK) || = defined(CONFIG_M68K) /* get CPU and bus clocks according to the environment variable = */ get_clocks, /* get CPU and bus clocks (etc.) */ #endif #if !defined(CONFIG_M68K) timer_init, /* initialize timer */ #endif #if defined(CONFIG_BOARD_POSTCLK_INIT) board_postclk_init, #endif env_init, /* initialize environment */ init_baud_rate, /* initialze baudrate settings */ serial_init, /* serial communications setup */ console_init_f, /* stage 1 init of console */ display_options, /* say that we are here */ . . . I'll note that the use of the list is via: void board_init_f(ulong boot_flags) { gd->flags =3D boot_flags; gd->have_console =3D 0; =20 if (initcall_run_list(init_sequence_f)) hang(); . . . where: /** * hang - stop processing by staying in an endless loop * * The purpose of this function is to stop further execution of code = cause * something went completely wrong. To catch this and give some = feedback to * the user one needs to catch the bootstage_error (see = show_boot_progress()) * in the board code. */ void hang(void) { #if !defined(CONFIG_SPL_BUILD) || \ (CONFIG_IS_ENABLED(LIBCOMMON_SUPPORT) && \ CONFIG_IS_ENABLED(SERIAL_SUPPORT)) puts("### ERROR ### Please RESET the board ###\n"); #endif bootstage_error(BOOTSTAGE_ID_NEED_RESET); if (IS_ENABLED(CONFIG_SANDBOX)) os_exit(1); for (;;) ; } With the tools I have around, I do not see a way to find out what was the last element of init_sequence_f to (at least start to) be called (or if it stopped even before initcall_run_list would start). Note: CONFIG_LOG_MAX_LEVEL=3D7 (without something like CONFIG_LOG_DEFAULT_LEVEL being a smaller figure) is not reasonable for general use: Its output is massive. =3D=3D=3D Mark Millard marklmi at yahoo.com ( dsl-only.net went away in early 2018-Mar)
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?290E51C0-0AF5-4C75-AA7B-BA56DF1AFDFB>