]>
git.ipfire.org Git - thirdparty/u-boot.git/blob - board/st/common/stm32mp_dfu.c
1 // SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause
3 * Copyright (C) 2020, STMicroelectronics - All Rights Reserved
16 #include <asm/arch/stm32prog.h>
17 #include <linux/printk.h>
19 #define DFU_ALT_BUF_LEN SZ_1K
21 static void board_get_alt_info_mmc(struct udevice
*dev
, char *buf
)
23 struct disk_partition info
;
28 struct blk_desc
*desc
;
30 mmc
= mmc_get_mmc_dev(dev
);
37 desc
= mmc_get_blk_desc(mmc
);
41 name
= blk_get_uclass_name(desc
->uclass_id
);
42 devnum
= desc
->devnum
;
46 len
+= snprintf(buf
+ len
,
47 DFU_ALT_BUF_LEN
- len
, "&");
48 len
+= snprintf(buf
+ len
, DFU_ALT_BUF_LEN
- len
,
49 "%s %d=", name
, devnum
);
51 if (IS_MMC(mmc
) && mmc
->capacity_boot
) {
52 len
+= snprintf(buf
+ len
, DFU_ALT_BUF_LEN
- len
,
53 "%s%d_boot1 raw 0x0 0x%llx mmcpart 1;",
54 name
, devnum
, mmc
->capacity_boot
);
55 len
+= snprintf(buf
+ len
, DFU_ALT_BUF_LEN
- len
,
56 "%s%d_boot2 raw 0x0 0x%llx mmcpart 2",
57 name
, devnum
, mmc
->capacity_boot
);
61 for (p
= 1; p
<= MAX_SEARCH_PARTITIONS
; p
++) {
62 if (part_get_info(desc
, p
, &info
))
65 len
+= snprintf(buf
+ len
, DFU_ALT_BUF_LEN
- len
, ";");
67 len
+= snprintf(buf
+ len
, DFU_ALT_BUF_LEN
- len
,
69 name
, devnum
, info
.name
, devnum
, p
);
73 static void board_get_alt_info_mtd(struct mtd_info
*mtd
, char *buf
)
75 struct mtd_info
*part
;
84 len
+= snprintf(buf
+ len
, DFU_ALT_BUF_LEN
- len
, "&");
85 len
+= snprintf(buf
+ len
, DFU_ALT_BUF_LEN
- len
,
88 len
+= snprintf(buf
+ len
, DFU_ALT_BUF_LEN
- len
,
92 list_for_each_entry(part
, &mtd
->partitions
, node
) {
95 len
+= snprintf(buf
+ len
, DFU_ALT_BUF_LEN
- len
, ";");
98 len
+= snprintf(buf
+ len
, DFU_ALT_BUF_LEN
- len
,
100 name
, part
->name
, partnum
);
104 void set_dfu_alt_info(char *interface
, char *devstr
)
107 struct mtd_info
*mtd
;
109 ALLOC_CACHE_ALIGN_BUFFER(char, buf
, DFU_ALT_BUF_LEN
);
111 if (env_get("dfu_alt_info"))
114 memset(buf
, 0, sizeof(buf
));
116 snprintf(buf
, DFU_ALT_BUF_LEN
,
117 "ram 0=%s", CONFIG_DFU_ALT_RAM0
);
119 if (CONFIG_IS_ENABLED(MMC
)) {
120 if (!uclass_get_device(UCLASS_MMC
, 0, &dev
))
121 board_get_alt_info_mmc(dev
, buf
);
123 if (!uclass_get_device(UCLASS_MMC
, 1, &dev
))
124 board_get_alt_info_mmc(dev
, buf
);
127 if (IS_ENABLED(CONFIG_MTD
)) {
128 /* probe all MTD devices */
131 /* probe SPI flash device on a bus */
132 if (!uclass_get_device(UCLASS_SPI_FLASH
, 0, &dev
)) {
133 mtd
= get_mtd_device_nm("nor0");
134 if (!IS_ERR_OR_NULL(mtd
))
135 board_get_alt_info_mtd(mtd
, buf
);
137 mtd
= get_mtd_device_nm("nor1");
138 if (!IS_ERR_OR_NULL(mtd
))
139 board_get_alt_info_mtd(mtd
, buf
);
142 mtd
= get_mtd_device_nm("nand0");
143 if (!IS_ERR_OR_NULL(mtd
))
144 board_get_alt_info_mtd(mtd
, buf
);
146 mtd
= get_mtd_device_nm("spi-nand0");
147 if (!IS_ERR_OR_NULL(mtd
))
148 board_get_alt_info_mtd(mtd
, buf
);
151 if (IS_ENABLED(CONFIG_DFU_VIRT
)) {
152 /* virtual device id 0 is aligned with stm32mp_dfu_virt.c */
153 strlcat(buf
, "&virt 0=OTP", DFU_ALT_BUF_LEN
);
155 if (IS_ENABLED(CONFIG_PMIC_STPMIC1
))
156 strlcat(buf
, "&virt 1=PMIC", DFU_ALT_BUF_LEN
);
159 env_set("dfu_alt_info", buf
);
160 puts("DFU alt info setting: done\n");