1da041cbaSYifeng Zhao /*
2da041cbaSYifeng Zhao * (C) Copyright 2021 Rockchip Electronics Co., Ltd
3da041cbaSYifeng Zhao *
4da041cbaSYifeng Zhao * SPDX-License-Identifier: GPL-2.0+
5da041cbaSYifeng Zhao */
6da041cbaSYifeng Zhao
7da041cbaSYifeng Zhao #include <common.h>
8da041cbaSYifeng Zhao #include <boot_rkimg.h>
9da041cbaSYifeng Zhao #include <memalign.h>
10b4094279SNico Cheng #include <android_avb/rk_avb_ops_user.h>
11da041cbaSYifeng Zhao
12da041cbaSYifeng Zhao #define CONFIG_SET_DFU_ALT_BUF_LEN (SZ_1K)
get_dfu_alt(char * interface,char * devstr)13da041cbaSYifeng Zhao static char *get_dfu_alt(char *interface, char *devstr)
14da041cbaSYifeng Zhao {
15da041cbaSYifeng Zhao struct blk_desc *dev_desc;
16da041cbaSYifeng Zhao char *alt_boot;
17b4094279SNico Cheng #ifdef CONFIG_ANDROID_AB
18b4094279SNico Cheng char current_slot[3] = {0};
19b4094279SNico Cheng #endif
20da041cbaSYifeng Zhao
21da041cbaSYifeng Zhao dev_desc = rockchip_get_bootdev();
22da041cbaSYifeng Zhao if (!dev_desc) {
23da041cbaSYifeng Zhao printf("%s: dev_desc is NULL!\n", __func__);
24da041cbaSYifeng Zhao return NULL;
25da041cbaSYifeng Zhao }
26da041cbaSYifeng Zhao
27da041cbaSYifeng Zhao switch (dev_desc->if_type) {
28*43e5adf6SJoseph Chen #ifdef CONFIG_DFU_MMC
29da041cbaSYifeng Zhao case IF_TYPE_MMC:
30da041cbaSYifeng Zhao alt_boot = DFU_ALT_BOOT_EMMC;
31da041cbaSYifeng Zhao break;
32da041cbaSYifeng Zhao #endif
33*43e5adf6SJoseph Chen #ifdef CONFIG_DFU_MTD
34da041cbaSYifeng Zhao case IF_TYPE_MTD:
35b4094279SNico Cheng #ifdef CONFIG_ANDROID_AB
36b4094279SNico Cheng rk_avb_get_current_slot(current_slot);
37b4094279SNico Cheng
38b4094279SNico Cheng if (!strcmp(current_slot, "_a")) {
39b4094279SNico Cheng alt_boot = DFU_ALT_BOOT_MTD_B;
40b4094279SNico Cheng printf("\ncurrent boot from slot A!\n");
41b4094279SNico Cheng } else if (!strcmp(current_slot, "_b")) {
42b4094279SNico Cheng alt_boot = DFU_ALT_BOOT_MTD_A;
43b4094279SNico Cheng printf("\ncurrent boot from slot B!\n");
44b4094279SNico Cheng } else {
45b4094279SNico Cheng return NULL;
46b4094279SNico Cheng }
47b4094279SNico Cheng #else
48da041cbaSYifeng Zhao alt_boot = DFU_ALT_BOOT_MTD;
49da041cbaSYifeng Zhao #endif
50b4094279SNico Cheng break;
51*43e5adf6SJoseph Chen #endif /* CONFIG_DFU_MTD */
52da041cbaSYifeng Zhao default:
53da041cbaSYifeng Zhao printf("[dfu ERROR]:Boot device type is invalid!\n");
54da041cbaSYifeng Zhao return NULL;
55da041cbaSYifeng Zhao }
56da041cbaSYifeng Zhao
57da041cbaSYifeng Zhao return alt_boot;
58da041cbaSYifeng Zhao }
59da041cbaSYifeng Zhao
set_dfu_alt_info(char * interface,char * devstr)60da041cbaSYifeng Zhao void set_dfu_alt_info(char *interface, char *devstr)
61da041cbaSYifeng Zhao {
62da041cbaSYifeng Zhao size_t buf_size = CONFIG_SET_DFU_ALT_BUF_LEN;
63da041cbaSYifeng Zhao ALLOC_CACHE_ALIGN_BUFFER(char, buf, buf_size);
64da041cbaSYifeng Zhao char *alt_info = "Settings not found!";
65da041cbaSYifeng Zhao char *status = "error!\n";
66da041cbaSYifeng Zhao char *alt_setting;
67da041cbaSYifeng Zhao int offset = 0;
68da041cbaSYifeng Zhao
69da041cbaSYifeng Zhao puts("DFU alt info setting: ");
70da041cbaSYifeng Zhao
71da041cbaSYifeng Zhao alt_setting = get_dfu_alt(interface, devstr);
72da041cbaSYifeng Zhao if (alt_setting) {
73da041cbaSYifeng Zhao env_set("dfu_alt_boot", alt_setting);
74da041cbaSYifeng Zhao offset = snprintf(buf, buf_size, "%s", alt_setting);
75da041cbaSYifeng Zhao }
76da041cbaSYifeng Zhao
77da041cbaSYifeng Zhao if (offset) {
78da041cbaSYifeng Zhao alt_info = buf;
79da041cbaSYifeng Zhao status = "done\n";
80da041cbaSYifeng Zhao }
81da041cbaSYifeng Zhao
82da041cbaSYifeng Zhao env_set("dfu_alt_info", alt_info);
83da041cbaSYifeng Zhao puts(status);
84da041cbaSYifeng Zhao }
85