From 6d91f0a3a14dd13a04946e672a4640fc65e4d275 Mon Sep 17 00:00:00 2001 From: Patrick Delaunay Date: Tue, 26 Sep 2023 17:09:23 +0200 Subject: [PATCH] board: st: common: cleanup dfu support split the file stm32mp_dfu.c in two files to simplify the Makefile - stm32mp_dfu.c: required by CONFIG_SET_DFU_ALT_INFO - stm32mp_dfu_virt.c: required by CONFIG_DFU_VIRT for stm32prog command or VIRT device for PMIC for CONFIG_SET_DFU_ALT_INFO. This patch also remove some remaining #ifdef CONFIG and avoid compilation error when CONFIG_SET_DFU_ALT_INFO is not activated. Signed-off-by: Patrick Delaunay Signed-off-by: Patrice Chotard Reviewed-by: Patrick Delaunay --- board/st/common/Makefile | 1 + board/st/common/stm32mp_dfu.c | 103 ++--------------------------- board/st/common/stm32mp_dfu_virt.c | 99 +++++++++++++++++++++++++++ 3 files changed, 104 insertions(+), 99 deletions(-) create mode 100644 board/st/common/stm32mp_dfu_virt.c diff --git a/board/st/common/Makefile b/board/st/common/Makefile index c960829726..b01245e4b4 100644 --- a/board/st/common/Makefile +++ b/board/st/common/Makefile @@ -8,6 +8,7 @@ obj-$(CONFIG_PMIC_STPMIC1) += stpmic1.o ifeq ($(CONFIG_ARCH_STM32MP),y) obj-$(CONFIG_SET_DFU_ALT_INFO) += stm32mp_dfu.o +obj-$(CONFIG_$(SPL_)DFU_VIRT) += stm32mp_dfu_virt.o endif obj-$(CONFIG_TYPEC_STUSB160X) += stusb160x.o diff --git a/board/st/common/stm32mp_dfu.c b/board/st/common/stm32mp_dfu.c index 1cf4a3d5fa..1ab27a9154 100644 --- a/board/st/common/stm32mp_dfu.c +++ b/board/st/common/stm32mp_dfu.c @@ -13,7 +13,6 @@ #include #include #include -#include #define DFU_ALT_BUF_LEN SZ_1K @@ -147,108 +146,14 @@ void set_dfu_alt_info(char *interface, char *devstr) board_get_alt_info_mtd(mtd, buf); } - if (IS_ENABLED(CONFIG_DFU_VIRT) && - IS_ENABLED(CMD_STM32PROG_USB)) { - strncat(buf, "&virt 0=OTP", DFU_ALT_BUF_LEN); + if (IS_ENABLED(CONFIG_DFU_VIRT)) { + /* virtual device id 0 is aligned with stm32mp_dfu_virt.c */ + strlcat(buf, "&virt 0=OTP", DFU_ALT_BUF_LEN); if (IS_ENABLED(CONFIG_PMIC_STPMIC1)) - strncat(buf, "&virt 1=PMIC", DFU_ALT_BUF_LEN); + strlcat(buf, "&virt 1=PMIC", DFU_ALT_BUF_LEN); } env_set("dfu_alt_info", buf); puts("DFU alt info setting: done\n"); } - -#if CONFIG_IS_ENABLED(DFU_VIRT) -#include -#include - -static int dfu_otp_read(u64 offset, u8 *buffer, long *size) -{ - struct udevice *dev; - int ret; - - ret = uclass_get_device_by_driver(UCLASS_MISC, - DM_DRIVER_GET(stm32mp_bsec), - &dev); - if (ret) - return ret; - - ret = misc_read(dev, offset + STM32_BSEC_OTP_OFFSET, buffer, *size); - if (ret >= 0) { - *size = ret; - ret = 0; - } - - return 0; -} - -static int dfu_pmic_read(u64 offset, u8 *buffer, long *size) -{ - int ret; -#ifdef CONFIG_PMIC_STPMIC1 - struct udevice *dev; - - ret = uclass_get_device_by_driver(UCLASS_MISC, - DM_DRIVER_GET(stpmic1_nvm), - &dev); - if (ret) - return ret; - - ret = misc_read(dev, 0xF8 + offset, buffer, *size); - if (ret >= 0) { - *size = ret; - ret = 0; - } - if (ret == -EACCES) { - *size = 0; - ret = 0; - } -#else - log_err("PMIC update not supported"); - ret = -EOPNOTSUPP; -#endif - - return ret; -} - -int dfu_read_medium_virt(struct dfu_entity *dfu, u64 offset, - void *buf, long *len) -{ - switch (dfu->data.virt.dev_num) { - case 0x0: - return dfu_otp_read(offset, buf, len); - case 0x1: - return dfu_pmic_read(offset, buf, len); - } - - if (IS_ENABLED(CONFIG_CMD_STM32PROG_USB) && - dfu->data.virt.dev_num >= STM32PROG_VIRT_FIRST_DEV_NUM) - return stm32prog_read_medium_virt(dfu, offset, buf, len); - - *len = 0; - return 0; -} - -int dfu_write_medium_virt(struct dfu_entity *dfu, u64 offset, - void *buf, long *len) -{ - if (IS_ENABLED(CONFIG_CMD_STM32PROG_USB) && - dfu->data.virt.dev_num >= STM32PROG_VIRT_FIRST_DEV_NUM) - return stm32prog_write_medium_virt(dfu, offset, buf, len); - - return -EOPNOTSUPP; -} - -int __weak dfu_get_medium_size_virt(struct dfu_entity *dfu, u64 *size) -{ - if (IS_ENABLED(CONFIG_CMD_STM32PROG_USB) && - dfu->data.virt.dev_num >= STM32PROG_VIRT_FIRST_DEV_NUM) - return stm32prog_get_medium_size_virt(dfu, size); - - *size = SZ_1K; - - return 0; -} - -#endif diff --git a/board/st/common/stm32mp_dfu_virt.c b/board/st/common/stm32mp_dfu_virt.c new file mode 100644 index 0000000000..f0f9960579 --- /dev/null +++ b/board/st/common/stm32mp_dfu_virt.c @@ -0,0 +1,99 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR BSD-3-Clause +/* + * Copyright (C) 2023, STMicroelectronics - All Rights Reserved + */ + +#include +#include +#include +#include +#include +#include + +static int dfu_otp_read(u64 offset, u8 *buffer, long *size) +{ + struct udevice *dev; + int ret; + + ret = uclass_get_device_by_driver(UCLASS_MISC, + DM_DRIVER_GET(stm32mp_bsec), + &dev); + if (ret) + return ret; + + ret = misc_read(dev, offset + STM32_BSEC_OTP_OFFSET, buffer, *size); + if (ret >= 0) { + *size = ret; + ret = 0; + } + + return 0; +} + +static int dfu_pmic_read(u64 offset, u8 *buffer, long *size) +{ + int ret; + struct udevice *dev; + + if (!IS_ENABLED(CONFIG_PMIC_STPMIC1)) { + log_err("PMIC update not supported"); + return -EOPNOTSUPP; + } + + ret = uclass_get_device_by_driver(UCLASS_MISC, + DM_DRIVER_GET(stpmic1_nvm), + &dev); + if (ret) + return ret; + + ret = misc_read(dev, 0xF8 + offset, buffer, *size); + if (ret >= 0) { + *size = ret; + ret = 0; + } + if (ret == -EACCES) { + *size = 0; + ret = 0; + } + + return ret; +} + +int dfu_read_medium_virt(struct dfu_entity *dfu, u64 offset, + void *buf, long *len) +{ + switch (dfu->data.virt.dev_num) { + case 0x0: + return dfu_otp_read(offset, buf, len); + case 0x1: + return dfu_pmic_read(offset, buf, len); + } + + if (IS_ENABLED(CONFIG_CMD_STM32PROG_USB) && + dfu->data.virt.dev_num >= STM32PROG_VIRT_FIRST_DEV_NUM) + return stm32prog_read_medium_virt(dfu, offset, buf, len); + + *len = 0; + return 0; +} + +int dfu_write_medium_virt(struct dfu_entity *dfu, u64 offset, + void *buf, long *len) +{ + if (IS_ENABLED(CONFIG_CMD_STM32PROG_USB) && + dfu->data.virt.dev_num >= STM32PROG_VIRT_FIRST_DEV_NUM) + return stm32prog_write_medium_virt(dfu, offset, buf, len); + + return -EOPNOTSUPP; +} + +int dfu_get_medium_size_virt(struct dfu_entity *dfu, u64 *size) +{ + if (IS_ENABLED(CONFIG_CMD_STM32PROG_USB) && + dfu->data.virt.dev_num >= STM32PROG_VIRT_FIRST_DEV_NUM) + return stm32prog_get_medium_size_virt(dfu, size); + + *size = SZ_1K; + + return 0; +} -- 2.39.5