hc
2023-05-31 43fd8d44e8182b691c8ee61d487cec02ca11afd2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
/*
 * (C) Copyright 2021 Rockchip Electronics Co., Ltd
 *
 * SPDX-License-Identifier:     GPL-2.0+
 */
 
#include <common.h>
#include <boot_rkimg.h>
#include <malloc.h>
#include <asm/io.h>
#include <asm/arch/boot_mode.h>
 
static int misc_require_recovery(struct blk_desc *dev_desc, u32 bcb_offset)
{
   struct bootloader_message *bmsg;
   disk_partition_t part;
   int cnt, recovery;
 
   if (!dev_desc)
       return 0;
 
   if (part_get_info_by_name(dev_desc, PART_MISC, &part) < 0) {
       printf("No misc partition\n");
       return 0;
   }
 
   cnt = DIV_ROUND_UP(sizeof(struct bootloader_message), dev_desc->blksz);
   bmsg = memalign(ARCH_DMA_MINALIGN, cnt * dev_desc->blksz);
   if (!bmsg)
       return 0;
 
   if (blk_dread(dev_desc, part.start + bcb_offset, cnt, bmsg) != cnt)
       return 0;
 
   recovery = !strcmp(bmsg->command, "boot-recovery");
   free(bmsg);
 
   return recovery;
}
 
int rockchip_get_boot_mode(struct blk_desc *dev_desc, u32 bcb_sector_offset)
{
   uint32_t reg_boot_mode;
   int boot_mode;
 
   /*
    * Boot mode priority
    *
    * Anyway, we should set download boot mode as the highest priority, so:
    * reboot loader/bootloader/fastboot > misc partition "recovery" > reboot xxx.
    */
   reg_boot_mode = readl((void *)CONFIG_ROCKCHIP_BOOT_MODE_REG);
   if (reg_boot_mode == BOOT_LOADER) {
       printf("boot mode: loader\n");
       boot_mode = BOOT_MODE_LOADER;
   } else if (reg_boot_mode == BOOT_DFU) {
       printf("boot mode: dfu\n");
       boot_mode = BOOT_MODE_DFU;
   } else if (reg_boot_mode == BOOT_FASTBOOT) {
       printf("boot mode: bootloader\n");
       boot_mode = BOOT_MODE_BOOTLOADER;
   } else if (misc_require_recovery(dev_desc, bcb_sector_offset)) {
       printf("boot mode: recovery (misc)\n");
       boot_mode = BOOT_MODE_RECOVERY;
   } else {
       switch (reg_boot_mode) {
       case BOOT_NORMAL:
           printf("boot mode: normal\n");
           boot_mode = BOOT_MODE_NORMAL;
           break;
       case BOOT_RECOVERY:
           printf("boot mode: recovery (cmd)\n");
           boot_mode = BOOT_MODE_RECOVERY;
           break;
       case BOOT_UMS:
           printf("boot mode: ums\n");
           boot_mode = BOOT_MODE_UMS;
           break;
       case BOOT_CHARGING:
           printf("boot mode: charging\n");
           boot_mode = BOOT_MODE_CHARGING;
           break;
       case BOOT_PANIC:
           printf("boot mode: panic\n");
           boot_mode = BOOT_MODE_PANIC;
           break;
       case BOOT_WATCHDOG:
           printf("boot mode: watchdog\n");
           boot_mode = BOOT_MODE_WATCHDOG;
           break;
       default:
           printf("boot mode: None\n");
           boot_mode = BOOT_MODE_UNDEFINE;
       }
   }
 
   return boot_mode;
}