xref: /rk3399_rockchip-uboot/arch/arm/mach-rockchip/dfu_alt_info.c (revision 43e5adf6feb7e3c3ed594b8725adcc25524747e7)
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