summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnup Patel <anup.patel@wdc.com>2020-11-04 12:46:20 +0300
committerAnup Patel <anup@brainfault.org>2020-11-10 07:59:23 +0300
commit48616b3de2dd67c315e3c000b9c1721cf37ad63a (patch)
tree148523e093d7b33ca774a7c22ca7b57ddbcc0826
parent914f81fbee28da409eac680ab3e76f1d5982c6e7 (diff)
downloadopensbi-48616b3de2dd67c315e3c000b9c1721cf37ad63a.tar.xz
lib: sbi: Improve boot prints in cold boot sequence
Currently, we have all boot prints at the end of cold boot sequence which means if there is any failure in cold boot sequence before boot prints then we don't get any print. This patch improves boot prints in cold boot sequence as follows: 1. We divide the boot prints into multiple parts and print it from different locations after sbi_console_init() 2. We throw an error print if there is any failure in cold boot sequence after sbi_console_init() Signed-off-by: Anup Patel <anup.patel@wdc.com> Reviewed-by: Atish Patra <atish.patra@wdc.com>
-rw-r--r--lib/sbi/sbi_init.c90
1 files changed, 69 insertions, 21 deletions
diff --git a/lib/sbi/sbi_init.c b/lib/sbi/sbi_init.c
index 15ae9da..0e82458 100644
--- a/lib/sbi/sbi_init.c
+++ b/lib/sbi/sbi_init.c
@@ -35,12 +35,10 @@
" | |\n" \
" |_|\n\n"
-static void sbi_boot_prints(struct sbi_scratch *scratch, u32 hartid)
+static void sbi_boot_print_banner(struct sbi_scratch *scratch)
{
- int xlen;
- char str[128];
- const struct sbi_domain *dom = sbi_domain_thishart_ptr();
- const struct sbi_platform *plat = sbi_platform_ptr(scratch);
+ if (scratch->options & SBI_SCRATCH_NO_BOOT_PRINTS)
+ return;
#ifdef OPENSBI_VERSION_GIT
sbi_printf("\nOpenSBI %s\n", OPENSBI_VERSION_GIT);
@@ -50,13 +48,15 @@ static void sbi_boot_prints(struct sbi_scratch *scratch, u32 hartid)
#endif
sbi_printf(BANNER);
+}
- /* Determine MISA XLEN and MISA string */
- xlen = misa_xlen();
- if (xlen < 1) {
- sbi_printf("Error %d getting MISA XLEN\n", xlen);
- sbi_hart_hang();
- }
+static void sbi_boot_print_general(struct sbi_scratch *scratch)
+{
+ char str[128];
+ const struct sbi_platform *plat = sbi_platform_ptr(scratch);
+
+ if (scratch->options & SBI_SCRATCH_NO_BOOT_PRINTS)
+ return;
/* Platform details */
sbi_printf("Platform Name : %s\n",
@@ -75,9 +75,32 @@ static void sbi_boot_prints(struct sbi_scratch *scratch, u32 hartid)
sbi_printf("Runtime SBI Version : %d.%d\n",
sbi_ecall_version_major(), sbi_ecall_version_minor());
sbi_printf("\n");
+}
+
+static void sbi_boot_print_domains(struct sbi_scratch *scratch)
+{
+ if (scratch->options & SBI_SCRATCH_NO_BOOT_PRINTS)
+ return;
/* Domain details */
sbi_domain_dump_all(" ");
+}
+
+static void sbi_boot_print_hart(struct sbi_scratch *scratch, u32 hartid)
+{
+ int xlen;
+ char str[128];
+ const struct sbi_domain *dom = sbi_domain_thishart_ptr();
+
+ if (scratch->options & SBI_SCRATCH_NO_BOOT_PRINTS)
+ return;
+
+ /* Determine MISA XLEN and MISA string */
+ xlen = misa_xlen();
+ if (xlen < 1) {
+ sbi_printf("Error %d getting MISA XLEN\n", xlen);
+ sbi_hart_hang();
+ }
/* Boot HART details */
sbi_printf("Boot HART ID : %u\n", hartid);
@@ -208,25 +231,40 @@ static void __noreturn init_coldboot(struct sbi_scratch *scratch, u32 hartid)
if (rc)
sbi_hart_hang();
+ sbi_boot_print_banner(scratch);
+
rc = sbi_platform_irqchip_init(plat, TRUE);
- if (rc)
+ if (rc) {
+ sbi_printf("%s: platform irqchip init failed (error %d)\n",
+ __func__, rc);
sbi_hart_hang();
+ }
rc = sbi_ipi_init(scratch, TRUE);
- if (rc)
+ if (rc) {
+ sbi_printf("%s: ipi init failed (error %d)\n", __func__, rc);
sbi_hart_hang();
+ }
rc = sbi_tlb_init(scratch, TRUE);
- if (rc)
+ if (rc) {
+ sbi_printf("%s: tlb init failed (error %d)\n", __func__, rc);
sbi_hart_hang();
+ }
rc = sbi_timer_init(scratch, TRUE);
- if (rc)
+ if (rc) {
+ sbi_printf("%s: timer init failed (error %d)\n", __func__, rc);
sbi_hart_hang();
+ }
rc = sbi_ecall_init();
- if (rc)
+ if (rc) {
+ sbi_printf("%s: ecall init failed (error %d)\n", __func__, rc);
sbi_hart_hang();
+ }
+
+ sbi_boot_print_general(scratch);
/*
* Note: Finalize domains after HSM initialization so that we
@@ -235,23 +273,33 @@ static void __noreturn init_coldboot(struct sbi_scratch *scratch, u32 hartid)
* that we use correct domain for configuring PMP.
*/
rc = sbi_domain_finalize(scratch, hartid);
- if (rc)
+ if (rc) {
+ sbi_printf("%s: domain finalize failed (error %d)\n",
+ __func__, rc);
sbi_hart_hang();
+ }
+
+ sbi_boot_print_domains(scratch);
rc = sbi_hart_pmp_configure(scratch);
- if (rc)
+ if (rc) {
+ sbi_printf("%s: PMP configure failed (error %d)\n",
+ __func__, rc);
sbi_hart_hang();
+ }
/*
* Note: Platform final initialization should be last so that
* it sees correct domain assignment and PMP configuration.
*/
rc = sbi_platform_final_init(plat, TRUE);
- if (rc)
+ if (rc) {
+ sbi_printf("%s: platform final init failed (error %d)\n",
+ __func__, rc);
sbi_hart_hang();
+ }
- if (!(scratch->options & SBI_SCRATCH_NO_BOOT_PRINTS))
- sbi_boot_prints(scratch, hartid);
+ sbi_boot_print_hart(scratch, hartid);
wake_coldboot_harts(scratch, hartid);