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