stm32mp1: add support for virtual partition read
authorPatrick Delaunay <patrick.delaunay@st.com>
Mon, 14 Oct 2019 07:28:12 +0000 (09:28 +0200)
committerPatrick Delaunay <patrick.delaunay@st.com>
Tue, 26 Nov 2019 09:14:35 +0000 (10:14 +0100)
Add read for OTP and PMIC NVM with alternates
on virtual DFU device.

Serie-cc: Boris Brezillon <boris.brezillon@bootlin.com>
Signed-off-by: Patrick Delaunay <patrick.delaunay@st.com>
board/st/stm32mp1/stm32mp1.c
configs/stm32mp15_basic_defconfig
configs/stm32mp15_optee_defconfig
configs/stm32mp15_trusted_defconfig

index 23f36e8f4268fde3f6ca2c34c4c74629d4940a12..4ed2d8884964bfe00ebc75232848ffb6d0f15da2 100644 (file)
@@ -992,9 +992,92 @@ void set_dfu_alt_info(char *interface, char *devstr)
        if (!IS_ERR_OR_NULL(mtd))
                board_get_alt_info("spi-nand0", buf);
 
+#ifdef CONFIG_DFU_VIRT
+       strncat(buf, "&virt 0=OTP", DFU_ALT_BUF_LEN);
+
+       if (IS_ENABLED(CONFIG_PMIC_STPMIC1))
+               strncat(buf, "&virt 1=PMIC", DFU_ALT_BUF_LEN);
+#endif
+
        env_set("dfu_alt_info", buf);
        puts("DFU alt info setting: done\n");
 }
+
+#if CONFIG_IS_ENABLED(DFU_VIRT)
+#include <dfu.h>
+#include <power/stpmic1.h>
+
+int dfu_otp_read(u64 offset, u8 *buffer, long *size)
+{
+       struct udevice *dev;
+       int ret;
+
+       ret = uclass_get_device_by_driver(UCLASS_MISC,
+                                         DM_GET_DRIVER(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;
+}
+
+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_GET_DRIVER(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
+       pr_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);
+       }
+       *len = 0;
+       return 0;
+}
+
+int __weak dfu_get_medium_size_virt(struct dfu_entity *dfu, u64 *size)
+{
+       *size = SZ_1K;
+
+       return 0;
+}
+
+#endif
+
 #endif
 
 static void board_copro_image_process(ulong fw_image, size_t fw_size)
index 235c33aad35118a13d785a8280585702b8fc2bf1..ae3ee5a9b5452efd62889f8c633d3e8ce746ca5e 100644 (file)
@@ -68,6 +68,7 @@ CONFIG_STM32_ADC=y
 CONFIG_DFU_MMC=y
 CONFIG_DFU_RAM=y
 CONFIG_DFU_MTD=y
+CONFIG_DFU_VIRT=y
 CONFIG_USB_FUNCTION_FASTBOOT=y
 CONFIG_FASTBOOT_BUF_ADDR=0xC0000000
 CONFIG_FASTBOOT_BUF_SIZE=0x02000000
index 97171fcb6940fd87be5374f39d0b532e43d482c5..e8620d6bc78f9ad26c1e68e14c09359116db8447 100644 (file)
@@ -55,6 +55,7 @@ CONFIG_STM32_ADC=y
 CONFIG_DFU_MMC=y
 CONFIG_DFU_RAM=y
 CONFIG_DFU_MTD=y
+CONFIG_DFU_VIRT=y
 CONFIG_USB_FUNCTION_FASTBOOT=y
 CONFIG_FASTBOOT_BUF_ADDR=0xC0000000
 CONFIG_FASTBOOT_BUF_SIZE=0x02000000
index e7d8d89d8a3c864446f5b8247086e02a8caecf4f..2d937e65fbf7e8959320c28b613727e101c35d1c 100644 (file)
@@ -54,6 +54,7 @@ CONFIG_STM32_ADC=y
 CONFIG_DFU_MMC=y
 CONFIG_DFU_RAM=y
 CONFIG_DFU_MTD=y
+CONFIG_DFU_VIRT=y
 CONFIG_USB_FUNCTION_FASTBOOT=y
 CONFIG_FASTBOOT_BUF_ADDR=0xC0000000
 CONFIG_FASTBOOT_BUF_SIZE=0x02000000