]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
bootstage: Do not sort records
authorJonas Karlman <jonas@kwiboo.se>
Sat, 3 Aug 2024 12:41:45 +0000 (12:41 +0000)
committerTom Rini <trini@konsulko.com>
Mon, 4 Nov 2024 03:27:12 +0000 (21:27 -0600)
The timer counter on Rockchip SoCs may be reset in TF-A, this may cause
the bootstage records to be printed out of order and with an incorrect
elapsed time.

Fix this by not sorting the bootstage records.

Before on a Radxa ZERO 3W (RK3566) board:

  => bootstage report
  Timer summary in microseconds (12 records):
         Mark    Elapsed  Stage
            0          0  reset
        7,436      7,436  board_init_f
      164,826    157,390  SPL
      375,392    210,566  end phase
      423,909     48,517  board_init_r
      472,973     49,064  eth_common_init
      476,848      3,875  main_loop
      477,003        155  cli_loop

  Accumulated time:
                   7,181  of_live
                  14,739  dm_spl
                  15,029  dm_r
                 315,150  dm_f

With this the records can be printed in chronological order when the
counter is reset and SPL and board_init_r records show correct elapsed
time.

  => bootstage report
  Timer summary in microseconds (12 records):
         Mark    Elapsed  Stage
            0          0  reset
      164,437    164,437  SPL
      375,023    210,586  end phase
        7,437      7,437  board_init_f
      424,390    416,953  board_init_r
      473,515     49,125  eth_common_init
      477,402      3,887  main_loop
      477,571        169  cli_loop

  Accumulated time:
                  14,734  dm_spl
                 315,646  dm_f
                   7,339  of_live
                  14,977  dm_r

For the tested board external TPL and BROM take ~164 ms to initialize
DRAM and load SPL, SPL take ~210ms to load images from FIT and U-Boot
proper take ~477ms to reach cli prompt.

Signed-off-by: Jonas Karlman <jonas@kwiboo.se>
common/bootstage.c

index c7bb204501a91fd6823313af075cc10ae1d4bf75..4532100acead13b3c56ec4f1995320f611d671d8 100644 (file)
@@ -249,6 +249,8 @@ static uint32_t print_time_record(struct bootstage_record *rec, uint32_t prev)
                printf("%11s", "");
                print_grouped_ull(rec->time_us, BOOTSTAGE_DIGITS);
        } else {
+               if (prev > rec->time_us)
+                       prev = 0;
                print_grouped_ull(rec->time_us, BOOTSTAGE_DIGITS);
                print_grouped_ull(rec->time_us - prev, BOOTSTAGE_DIGITS);
        }
@@ -257,13 +259,6 @@ static uint32_t print_time_record(struct bootstage_record *rec, uint32_t prev)
        return rec->time_us;
 }
 
-static int h_compare_record(const void *r1, const void *r2)
-{
-       const struct bootstage_record *rec1 = r1, *rec2 = r2;
-
-       return rec1->time_us > rec2->time_us ? 1 : -1;
-}
-
 #ifdef CONFIG_OF_LIBFDT
 /**
  * Add all bootstage timings to a device tree.
@@ -342,9 +337,6 @@ void bootstage_report(void)
 
        prev = print_time_record(rec, 0);
 
-       /* Sort records by increasing time */
-       qsort(data->record, data->rec_count, sizeof(*rec), h_compare_record);
-
        for (i = 1, rec++; i < data->rec_count; i++, rec++) {
                if (rec->id && !rec->start_us)
                        prev = print_time_record(rec, prev);