* [PATCH v3 0/8] qcom: implement capsule updates
@ 2024-06-03 12:49 Caleb Connolly
2024-06-03 12:49 ` [PATCH v3 1/8] dfu: add scsi backend Caleb Connolly
` (8 more replies)
0 siblings, 9 replies; 18+ messages in thread
From: Caleb Connolly @ 2024-06-03 12:49 UTC (permalink / raw)
To: Tom Rini, Simon Glass, Lukasz Majewski, Mattijs Korpershoek,
Caleb Connolly, Neil Armstrong, Sumit Garg
Cc: Ilias Apalodimas, u-boot, u-boot-qcom
Hook up support for capsule updates loaded from disk on Qualcomm
platforms.
Most Qualcomm devices have an A/B partition layout, with most partitions
duplicated. The metadata on which slot is active is stored in the GPT
headers in the vendor-specific attribute bits of each partition.
Add support for reading this attributes via the disk_partition struct
and using them to determine which boot partition U-Boot is flashed to
and generate the appropriate DFU string.
This logic is gated behind a check to ensure that U-Boot is actually
being chainloaded and not run via some other mechanism.
SCSI support for most Qualcomm platforms is not yet enabled upstream,
but will follow in future patches.
This series enables capsule updates on the RB2, however [1] is required
for it to work properly (as otherwise MMC won't be available).
[1]: https://lore.kernel.org/u-boot/20240527-b4-clk-stub-v2-0-29013855e343@linaro.org/
To: Tom Rini <trini@konsulko.com>
To: Simon Glass <sjg@chromium.org>
To: Lukasz Majewski <lukma@denx.de>
To: Mattijs Korpershoek <mkorpershoek@baylibre.com>
To: Caleb Connolly <caleb.connolly@linaro.org>
To: Neil Armstrong <neil.armstrong@linaro.org>
To: Sumit Garg <sumit.garg@linaro.org>
Cc: Ilias Apalodimas <ilias.apalodimas@linaro.org>
Cc: u-boot@lists.denx.de
Cc: u-boot-qcom@groups.io
Changes in v3:
- Address comments in scsi dfu support
- enable CONFIG_DFU_SCSI for qcom
- Link to v2: https://lore.kernel.org/r/20240527-b4-qcom-capsule-updates-v2-0-47583d7ad428@linaro.org
Changes in v2:
- Add qcom capsule update support patches
- Link to v1: https://lore.kernel.org/r/20240409-b4-dfu-scsi-v1-0-3e1441a60376@linaro.org
---
Caleb Connolly (8):
dfu: add scsi backend
disk: expose partition type flags
mmc: msm_sdhci: work around a bug when writing
mach-snapdragon: implement capsule update support
qcom_defconfig: savedefconfig
mach-snapdragon: use SYSRESET_PSCI
mach-snapdragon: bump up heap size
qcom_defconfig: enable capsule update support
arch/arm/Kconfig | 2 +
arch/arm/mach-snapdragon/Kconfig | 3 +
arch/arm/mach-snapdragon/Makefile | 1 +
arch/arm/mach-snapdragon/board.c | 8 +-
arch/arm/mach-snapdragon/capsule_update.c | 147 ++++++++++
arch/arm/mach-snapdragon/qcom-priv.h | 6 +
configs/qcom_defconfig | 19 +-
disk/part_efi.c | 1 +
doc/usage/dfu.rst | 32 +++
drivers/dfu/Kconfig | 7 +
drivers/dfu/Makefile | 1 +
drivers/dfu/dfu.c | 5 +-
drivers/dfu/dfu_scsi.c | 435 ++++++++++++++++++++++++++++++
drivers/mmc/msm_sdhci.c | 7 +
include/configs/qcom.h | 5 +
include/dfu.h | 26 ++
include/part.h | 1 +
17 files changed, 695 insertions(+), 11 deletions(-)
---
change-id: 20240523-b4-qcom-capsule-updates-ea2e4f8f0ff0
base-commit: 5d8881a0801241d68701e8644d495f1d535506f0
// Caleb (they/them)
^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH v3 1/8] dfu: add scsi backend
2024-06-03 12:49 [PATCH v3 0/8] qcom: implement capsule updates Caleb Connolly
@ 2024-06-03 12:49 ` Caleb Connolly
2024-06-04 7:01 ` Mattijs Korpershoek
2024-06-03 12:49 ` [PATCH v3 2/8] disk: expose partition type flags Caleb Connolly
` (7 subsequent siblings)
8 siblings, 1 reply; 18+ messages in thread
From: Caleb Connolly @ 2024-06-03 12:49 UTC (permalink / raw)
To: Tom Rini, Simon Glass, Lukasz Majewski, Mattijs Korpershoek,
Caleb Connolly, Neil Armstrong, Sumit Garg
Cc: Ilias Apalodimas, u-boot, u-boot-qcom
This is extremely similar to the MMC backend, but there are some notable
differences.
Works with a DFU string like
scsi 4=u-boot-bin part 11
Where "4" is the SCSI dev number (sequential LUN across all SCSI devices)
and "11" is the partition number.
Signed-off-by: Caleb Connolly <caleb.connolly@linaro.org>
---
doc/usage/dfu.rst | 32 ++++
drivers/dfu/Kconfig | 7 +
drivers/dfu/Makefile | 1 +
drivers/dfu/dfu.c | 5 +-
drivers/dfu/dfu_scsi.c | 435 +++++++++++++++++++++++++++++++++++++++++++++++++
include/dfu.h | 26 +++
6 files changed, 505 insertions(+), 1 deletion(-)
diff --git a/doc/usage/dfu.rst b/doc/usage/dfu.rst
index 8cc09c308d82..f497dcf137a4 100644
--- a/doc/usage/dfu.rst
+++ b/doc/usage/dfu.rst
@@ -21,8 +21,9 @@ U-Boot implements this DFU capability (CONFIG_DFU) with the command dfu
Today the supported DFU backends are:
- MMC (RAW or FAT / EXT2 / EXT3 / EXT4 file system / SKIP / SCRIPT)
+- SCSI (UFS, RAW partition, FAT / EXT2 / EXT3 / EXT4 file system / SKIP / SCRIPT)
- NAND
- RAM
- SF (serial flash)
- MTD (all MTD device: NAND, SPI-NOR, SPI-NAND,...)
@@ -166,8 +167,38 @@ mmc
Please note that this means the user will be able to execute any
arbitrary commands just like in the u-boot's shell.
+scsi
+ for UFS storage::
+
+ dfu 0 scsi <dev>
+
+ each element in *dfu_alt_info* being
+
+ * <name> raw <offset> <size> raw access to SCSI LUN
+ * <name> part <part_id> raw access to partition
+ * <name> fat <part_id> file in FAT partition
+ * <name> ext4 <part_id> file in EXT4 partition
+ * <name> skip 0 0 ignore flashed data
+ * <name> script 0 0 execute commands in shell
+
+ with
+
+ size
+ is the size of the access area (hexadecimal without "0x")
+ or 0 which means whole device
+ partid
+ is the GPT or DOS partition index.
+ dev
+ is the SCSI LU (Logical Unit) index (decimal only)
+
+ A value of environment variable *dfu_alt_info* for UFS could be::
+
+ u-boot part 4;bl2 raw 0x1e 0x1d
+
+ See mmc section above for details on the skip and script types.
+
nand
raw slc nand device::
dfu 0 nand <dev>
@@ -277,8 +308,9 @@ alternate list separated by '&' with the same format for each <alt>::
mmc <dev>=<alt1>;....;<altN>
nand <dev>=<alt1>;....;<altN>
ram <dev>=<alt1>;....;<altN>
+ scsi <dev>=<alt1>;....;<altN>
sf <dev>=<alt1>;....;<altN>
mtd <dev>=<alt1>;....;<altN>
virt <dev>=<alt1>;....;<altN>
diff --git a/drivers/dfu/Kconfig b/drivers/dfu/Kconfig
index 0360d9da1427..158c660e6c4e 100644
--- a/drivers/dfu/Kconfig
+++ b/drivers/dfu/Kconfig
@@ -86,8 +86,15 @@ config DFU_VIRT
This option enables using DFU to read and write to VIRTUAL device
used at board level to manage specific behavior
(OTP update for example).
+config DFU_SCSI
+ bool "SCSI flash back end for DFU"
+ help
+ This option enables using DFU to read and write to SCSI devices
+ used at board level to manage specific behavior
+ (OTP update for example).
+
config SET_DFU_ALT_INFO
bool "Dynamic set of DFU alternate information"
help
This option allows to call the function set_dfu_alt_info to
diff --git a/drivers/dfu/Makefile b/drivers/dfu/Makefile
index dfbf64da6677..3b3ba0994b3a 100644
--- a/drivers/dfu/Makefile
+++ b/drivers/dfu/Makefile
@@ -10,4 +10,5 @@ obj-$(CONFIG_$(SPL_)DFU_NAND) += dfu_nand.o
obj-$(CONFIG_$(SPL_)DFU_RAM) += dfu_ram.o
obj-$(CONFIG_$(SPL_)DFU_SF) += dfu_sf.o
obj-$(CONFIG_$(SPL_)DFU_WRITE_ALT) += dfu_alt.o
obj-$(CONFIG_$(SPL_)DFU_VIRT) += dfu_virt.o
+obj-$(CONFIG_$(SPL_)DFU_SCSI) += dfu_scsi.o
diff --git a/drivers/dfu/dfu.c b/drivers/dfu/dfu.c
index 540d48fab77d..c81fa7724268 100644
--- a/drivers/dfu/dfu.c
+++ b/drivers/dfu/dfu.c
@@ -547,8 +547,11 @@ static int dfu_fill_entity(struct dfu_entity *dfu, char *s, int alt,
return -1;
} else if (strcmp(interface, "virt") == 0) {
if (dfu_fill_entity_virt(dfu, devstr, argv, argc))
return -1;
+ } else if (strcmp(interface, "scsi") == 0) {
+ if (dfu_fill_entity_scsi(dfu, devstr, argv, argc))
+ return -1;
} else {
printf("%s: Device %s not (yet) supported!\n",
__func__, interface);
return -1;
@@ -643,9 +646,9 @@ int dfu_config_entities(char *env, char *interface, char *devstr)
const char *dfu_get_dev_type(enum dfu_device_type t)
{
const char *const dev_t[] = {NULL, "eMMC", "OneNAND", "NAND", "RAM",
- "SF", "MTD", "VIRT"};
+ "SF", "MTD", "VIRT", "SCSI"};
return dev_t[t];
}
const char *dfu_get_layout(enum dfu_layout l)
diff --git a/drivers/dfu/dfu_scsi.c b/drivers/dfu/dfu_scsi.c
new file mode 100644
index 000000000000..9f95194784c1
--- /dev/null
+++ b/drivers/dfu/dfu_scsi.c
@@ -0,0 +1,435 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * DFU SCSI backend (based on MMC backend).
+ *
+ * Copyright (C) 2012 Samsung Electronics
+ * author: Lukasz Majewski <l.majewski@samsung.com>
+ * Copyright (C) 2024 Linaro Ltd.
+ */
+
+#include <log.h>
+#include <malloc.h>
+#include <errno.h>
+#include <div64.h>
+#include <dfu.h>
+#include <ext4fs.h>
+#include <fat.h>
+#include <scsi.h>
+#include <part.h>
+#include <command.h>
+#include <linux/printk.h>
+
+static unsigned char *dfu_file_buf;
+static u64 dfu_file_buf_len;
+static u64 dfu_file_buf_offset;
+
+#define scsi_get_blk_desc(dev) ((struct blk_desc *)dev_get_uclass_plat(dev))
+
+#define find_scsi_device(dev_num, scsi) blk_get_device(UCLASS_SCSI, dev_num, scsi)
+
+static int scsi_block_op(enum dfu_op op, struct dfu_entity *dfu, u64 offset, void *buf, long *len)
+{
+ struct udevice *scsi;
+ u32 blk_start, blk_count, n = 0;
+ int ret;
+
+ ret = find_scsi_device(dfu->data.scsi.lun, &scsi);
+ if (ret < 0) {
+ pr_err("Device scsi %d - not found!", dfu->data.scsi.lun);
+ return -ENODEV;
+ }
+
+ /*
+ * We must ensure that we work in lba_blk_size chunks, so ALIGN
+ * this value.
+ */
+ *len = ALIGN(*len, dfu->data.scsi.lba_blk_size);
+
+ blk_start = dfu->data.scsi.lba_start + (u32)lldiv(offset, dfu->data.scsi.lba_blk_size);
+ blk_count = *len / dfu->data.scsi.lba_blk_size;
+ if (blk_start + blk_count > dfu->data.scsi.lba_start + dfu->data.scsi.lba_size) {
+ puts("Request would exceed designated area!\n");
+ return -EINVAL;
+ }
+
+ debug("%s: %s dev: %d start: %d cnt: %d buf: 0x%p\n", __func__,
+ op == DFU_OP_READ ? "scsi READ" : "scsi WRITE", dfu->data.scsi.lun, blk_start,
+ blk_count, buf);
+ switch (op) {
+ case DFU_OP_READ:
+ n = blk_dread(scsi_get_blk_desc(scsi), blk_start, blk_count, buf);
+ break;
+ case DFU_OP_WRITE:
+ n = blk_dwrite(scsi_get_blk_desc(scsi), blk_start, blk_count, buf);
+ break;
+ default:
+ pr_err("Operation not supported\n");
+ }
+
+ if (n != blk_count) {
+ pr_err("scsi block operation failed");
+ return -EIO;
+ }
+
+ return 0;
+}
+
+static int scsi_file_op(enum dfu_op op, struct dfu_entity *dfu, u64 offset, void *buf, u64 *len)
+{
+ char dev_part_str[8];
+ int ret;
+ int fstype;
+ loff_t size = 0;
+
+ switch (dfu->layout) {
+ case DFU_FS_FAT:
+ fstype = FS_TYPE_FAT;
+ break;
+ case DFU_FS_EXT4:
+ fstype = FS_TYPE_EXT;
+ break;
+ case DFU_SKIP:
+ return 0;
+ default:
+ printf("%s: Layout (%s) not (yet) supported!\n", __func__,
+ dfu_get_layout(dfu->layout));
+ return -1;
+ }
+
+ snprintf(dev_part_str, sizeof(dev_part_str), "%d:%d", dfu->data.scsi.dev,
+ dfu->data.scsi.part);
+
+ ret = fs_set_blk_dev("scsi", dev_part_str, fstype);
+ if (ret) {
+ puts("dfu: fs_set_blk_dev error!\n");
+ return ret;
+ }
+
+ switch (op) {
+ case DFU_OP_READ:
+ ret = fs_read(dfu->name, (size_t)buf, offset, *len, &size);
+ if (ret) {
+ puts("dfu: fs_read error!\n");
+ return ret;
+ }
+ *len = size;
+ break;
+ case DFU_OP_WRITE:
+ ret = fs_write(dfu->name, (size_t)buf, offset, *len, &size);
+ if (ret) {
+ puts("dfu: fs_write error!\n");
+ return ret;
+ }
+ break;
+ case DFU_OP_SIZE:
+ ret = fs_size(dfu->name, &size);
+ if (ret) {
+ puts("dfu: fs_size error!\n");
+ return ret;
+ }
+ *len = size;
+ break;
+ default:
+ return -1;
+ }
+
+ return ret;
+}
+
+static int scsi_file_buf_write(struct dfu_entity *dfu, u64 offset, void *buf, long *len)
+{
+ int ret = 0;
+
+ if (offset == 0) {
+ dfu_file_buf_len = 0;
+ dfu_file_buf_offset = 0;
+ }
+
+ /* Add to the current buffer. */
+ if (dfu_file_buf_len + *len > CONFIG_SYS_DFU_MAX_FILE_SIZE)
+ *len = CONFIG_SYS_DFU_MAX_FILE_SIZE - dfu_file_buf_len;
+ memcpy(dfu_file_buf + dfu_file_buf_len, buf, *len);
+ dfu_file_buf_len += *len;
+
+ if (dfu_file_buf_len == CONFIG_SYS_DFU_MAX_FILE_SIZE) {
+ ret = scsi_file_op(DFU_OP_WRITE, dfu, dfu_file_buf_offset, dfu_file_buf,
+ &dfu_file_buf_len);
+ dfu_file_buf_offset += dfu_file_buf_len;
+ dfu_file_buf_len = 0;
+ }
+
+ return ret;
+}
+
+static int scsi_file_buf_write_finish(struct dfu_entity *dfu)
+{
+ int ret = scsi_file_op(DFU_OP_WRITE, dfu, dfu_file_buf_offset, dfu_file_buf,
+ &dfu_file_buf_len);
+
+ /* Now that we're done */
+ dfu_file_buf_len = 0;
+ dfu_file_buf_offset = 0;
+
+ return ret;
+}
+
+int dfu_write_medium_scsi(struct dfu_entity *dfu, u64 offset, void *buf, long *len)
+{
+ int ret = -1;
+
+ switch (dfu->layout) {
+ case DFU_RAW_ADDR:
+ ret = scsi_block_op(DFU_OP_WRITE, dfu, offset, buf, len);
+ break;
+ case DFU_FS_FAT:
+ case DFU_FS_EXT4:
+ ret = scsi_file_buf_write(dfu, offset, buf, len);
+ break;
+ case DFU_SCRIPT:
+ ret = run_command_list(buf, *len, 0);
+ break;
+ case DFU_SKIP:
+ ret = 0;
+ break;
+ default:
+ printf("%s: Layout (%s) not (yet) supported!\n", __func__,
+ dfu_get_layout(dfu->layout));
+ }
+
+ return ret;
+}
+
+int dfu_flush_medium_scsi(struct dfu_entity *dfu)
+{
+ int ret = 0;
+
+ switch (dfu->layout) {
+ case DFU_FS_FAT:
+ case DFU_FS_EXT4:
+ ret = scsi_file_buf_write_finish(dfu);
+ break;
+ case DFU_SCRIPT:
+ /* script may have changed the dfu_alt_info */
+ dfu_reinit_needed = true;
+ break;
+ case DFU_RAW_ADDR:
+ case DFU_SKIP:
+ break;
+ default:
+ printf("%s: Layout (%s) not (yet) supported!\n", __func__,
+ dfu_get_layout(dfu->layout));
+ }
+
+ return ret;
+}
+
+int dfu_get_medium_size_scsi(struct dfu_entity *dfu, u64 *size)
+{
+ int ret;
+
+ switch (dfu->layout) {
+ case DFU_RAW_ADDR:
+ *size = dfu->data.scsi.lba_size * dfu->data.scsi.lba_blk_size;
+ return 0;
+ case DFU_FS_FAT:
+ case DFU_FS_EXT4:
+ ret = scsi_file_op(DFU_OP_SIZE, dfu, 0, NULL, size);
+ if (ret < 0)
+ return ret;
+ return 0;
+ case DFU_SCRIPT:
+ case DFU_SKIP:
+ return 0;
+ default:
+ printf("%s: Layout (%s) not (yet) supported!\n", __func__,
+ dfu_get_layout(dfu->layout));
+ return -1;
+ }
+}
+
+static int scsi_file_buf_read(struct dfu_entity *dfu, u64 offset, void *buf, long *len)
+{
+ int ret;
+
+ if (offset == 0 || offset >= dfu_file_buf_offset + dfu_file_buf_len ||
+ offset + *len < dfu_file_buf_offset) {
+ u64 file_len = CONFIG_SYS_DFU_MAX_FILE_SIZE;
+
+ ret = scsi_file_op(DFU_OP_READ, dfu, offset, dfu_file_buf, &file_len);
+ if (ret < 0)
+ return ret;
+ dfu_file_buf_len = file_len;
+ dfu_file_buf_offset = offset;
+ }
+ if (offset + *len > dfu_file_buf_offset + dfu_file_buf_len)
+ return -EINVAL;
+
+ /* Add to the current buffer. */
+ memcpy(buf, dfu_file_buf + offset - dfu_file_buf_offset, *len);
+
+ return 0;
+}
+
+int dfu_read_medium_scsi(struct dfu_entity *dfu, u64 offset, void *buf, long *len)
+{
+ int ret = -1;
+
+ switch (dfu->layout) {
+ case DFU_RAW_ADDR:
+ ret = scsi_block_op(DFU_OP_READ, dfu, offset, buf, len);
+ break;
+ case DFU_FS_FAT:
+ case DFU_FS_EXT4:
+ ret = scsi_file_buf_read(dfu, offset, buf, len);
+ break;
+ default:
+ printf("%s: Layout (%s) not (yet) supported!\n", __func__,
+ dfu_get_layout(dfu->layout));
+ }
+
+ return ret;
+}
+
+void dfu_free_entity_scsi(struct dfu_entity *dfu)
+{
+ if (dfu_file_buf) {
+ free(dfu_file_buf);
+ dfu_file_buf = NULL;
+ }
+}
+
+/*
+ * @param s Parameter string containing space-separated arguments:
+ * 1st:
+ * raw (raw read/write)
+ * fat (files)
+ * ext4 (^)
+ * part (partition image)
+ * 2nd and 3rd:
+ * lba_start and lba_size, for raw write
+ * scsi_dev and scsi_part, for filesystems and part
+ */
+int dfu_fill_entity_scsi(struct dfu_entity *dfu, char *devstr, char **argv, int argc)
+{
+ const char *entity_type;
+ ssize_t second_arg;
+ ssize_t third_arg = -1;
+ struct udevice *scsi;
+ struct blk_desc *blk_dev;
+ int ret;
+ char *s;
+
+ if (argc < 2) {
+ pr_err("Need at least one argument\n");
+ return -EINVAL;
+ }
+
+ dfu->data.scsi.lun = dectoul(devstr, &s);
+ if (*s)
+ return -EINVAL;
+
+ entity_type = argv[0];
+ /*
+ * Base 0 means we'll accept (prefixed with 0x or 0) base 16, 8,
+ * with default 10.
+ */
+ second_arg = simple_strtol(argv[1], &s, 0);
+ if (*s)
+ return -EINVAL;
+ if (argc >= 3) {
+ third_arg = simple_strtoul(argv[2], &s, 0);
+ if (*s)
+ return -EINVAL;
+ }
+
+ if (scsi_scan(false)) {
+ pr_err("Couldn't init scsi device.\n");
+ return -ENODEV;
+ }
+
+ ret = find_scsi_device(dfu->data.scsi.lun, &scsi);
+ if (ret < 0) {
+ pr_err("Couldn't find scsi device no. %d.\n", dfu->data.scsi.lun);
+ return -ENODEV;
+ }
+
+ blk_dev = scsi_get_blk_desc(scsi);
+ if (!blk_dev) {
+ pr_err("Couldn't get block device for scsi device no. %d.\n", dfu->data.scsi.lun);
+ return -ENODEV;
+ }
+
+ /* if it's NOT a raw write */
+ if (strcmp(entity_type, "raw")) {
+ dfu->data.scsi.dev = (second_arg != -1) ? second_arg : dfu->data.scsi.lun;
+ dfu->data.scsi.part = third_arg;
+ }
+
+ if (!strcmp(entity_type, "raw")) {
+ dfu->layout = DFU_RAW_ADDR;
+ dfu->data.scsi.lba_start = second_arg;
+ if (third_arg < 0) {
+ pr_err("raw requires two arguments\n");
+ return -EINVAL;
+ }
+ dfu->data.scsi.lba_size = third_arg;
+ dfu->data.scsi.lba_blk_size = blk_dev->blksz;
+
+ /*
+ * In case the size is zero (i.e. scsi raw 0x10 0),
+ * assume the user intends to use whole device.
+ */
+ if (third_arg == 0)
+ dfu->data.scsi.lba_size = blk_dev->lba;
+
+ } else if (!strcmp(entity_type, "part")) {
+ struct disk_partition partinfo;
+ int scsipart = second_arg;
+
+ if (third_arg >= 0) {
+ pr_err("part only accepts one argument\n");
+ return -EINVAL;
+ }
+
+ if (part_get_info(blk_dev, scsipart, &partinfo) != 0) {
+ pr_err("Couldn't find part #%d on scsi device #%d\n", scsipart,
+ dfu->data.scsi.lun);
+ return -ENODEV;
+ }
+
+ dfu->layout = DFU_RAW_ADDR;
+ dfu->data.scsi.lba_start = partinfo.start;
+ dfu->data.scsi.lba_size = partinfo.size;
+ dfu->data.scsi.lba_blk_size = partinfo.blksz;
+ } else if (!strcmp(entity_type, "fat")) {
+ dfu->layout = DFU_FS_FAT;
+ } else if (!strcmp(entity_type, "ext4")) {
+ dfu->layout = DFU_FS_EXT4;
+ } else if (!strcmp(entity_type, "skip")) {
+ dfu->layout = DFU_SKIP;
+ } else if (!strcmp(entity_type, "script")) {
+ dfu->layout = DFU_SCRIPT;
+ } else {
+ pr_err("Memory layout (%s) not supported!\n", entity_type);
+ return -ENODEV;
+ }
+
+ dfu->dev_type = DFU_DEV_SCSI;
+ dfu->get_medium_size = dfu_get_medium_size_scsi;
+ dfu->read_medium = dfu_read_medium_scsi;
+ dfu->write_medium = dfu_write_medium_scsi;
+ dfu->flush_medium = dfu_flush_medium_scsi;
+ dfu->inited = 0;
+ dfu->free_entity = dfu_free_entity_scsi;
+
+ /* Check if file buffer is ready */
+ if (!dfu_file_buf) {
+ dfu_file_buf = memalign(CONFIG_SYS_CACHELINE_SIZE, CONFIG_SYS_DFU_MAX_FILE_SIZE);
+ if (!dfu_file_buf) {
+ pr_err("Could not memalign 0x%x bytes\n", CONFIG_SYS_DFU_MAX_FILE_SIZE);
+ return -ENOMEM;
+ }
+ }
+
+ return 0;
+}
diff --git a/include/dfu.h b/include/dfu.h
index fa1918cd6635..d7f365a7f1ce 100644
--- a/include/dfu.h
+++ b/include/dfu.h
@@ -23,8 +23,9 @@ enum dfu_device_type {
DFU_DEV_RAM,
DFU_DEV_SF,
DFU_DEV_MTD,
DFU_DEV_VIRT,
+ DFU_DEV_SCSI,
};
enum dfu_layout {
DFU_RAW_ADDR = 1,
@@ -98,8 +99,20 @@ struct sf_internal_data {
struct virt_internal_data {
int dev_num;
};
+struct scsi_internal_data {
+ int lun;
+
+ /* RAW programming */
+ unsigned int lba_start;
+ unsigned int lba_size;
+ unsigned int lba_blk_size;
+
+ /* FAT/EXT */
+ unsigned int dev; // Always 0???
+ unsigned int part;
+};
#if defined(CONFIG_DFU_NAME_MAX_SIZE)
#define DFU_NAME_SIZE CONFIG_DFU_NAME_MAX_SIZE
#else
@@ -126,8 +139,9 @@ struct dfu_entity {
struct nand_internal_data nand;
struct ram_internal_data ram;
struct sf_internal_data sf;
struct virt_internal_data virt;
+ struct scsi_internal_data scsi;
} data;
int (*get_medium_size)(struct dfu_entity *dfu, u64 *size);
@@ -516,8 +530,20 @@ static inline int dfu_fill_entity_virt(struct dfu_entity *dfu, char *devstr,
return -1;
}
#endif
+#if CONFIG_IS_ENABLED(DFU_SCSI)
+int dfu_fill_entity_scsi(struct dfu_entity *dfu, char *devstr,
+ char **argv, int argc);
+#else
+static inline int dfu_fill_entity_scsi(struct dfu_entity *dfu, char *devstr,
+ char **argv, int argc)
+{
+ puts("SCSI support not available!\n");
+ return -1;
+}
+#endif
+
extern bool dfu_reinit_needed;
#if CONFIG_IS_ENABLED(DFU_WRITE_ALT)
/**
--
2.45.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v3 2/8] disk: expose partition type flags
2024-06-03 12:49 [PATCH v3 0/8] qcom: implement capsule updates Caleb Connolly
2024-06-03 12:49 ` [PATCH v3 1/8] dfu: add scsi backend Caleb Connolly
@ 2024-06-03 12:49 ` Caleb Connolly
2024-06-03 12:49 ` [PATCH v3 3/8] mmc: msm_sdhci: work around a bug when writing Caleb Connolly
` (6 subsequent siblings)
8 siblings, 0 replies; 18+ messages in thread
From: Caleb Connolly @ 2024-06-03 12:49 UTC (permalink / raw)
To: Tom Rini, Simon Glass, Lukasz Majewski, Mattijs Korpershoek,
Caleb Connolly, Neil Armstrong, Sumit Garg
Cc: Ilias Apalodimas, u-boot, u-boot-qcom
GPT partition tables include two bytes worth of vendor defined
attributes, per partition. ChromeOS and Qualcomm both use these (with
different encoding!) to handle A/B slot switching with a retry counter.
Expose these via the disk_partition struct so that they can be parsed by
the relevant board code.
This will be used on Qualcomm boards to determine which slot we're
booting on so that we can flash capsule updates to the correct one.
Reviewed-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
Reviewed-by: Mattijs Korpershoek <mkorpershoek@baylibre.com>
Signed-off-by: Caleb Connolly <caleb.connolly@linaro.org>
---
disk/part_efi.c | 1 +
include/part.h | 1 +
2 files changed, 2 insertions(+)
diff --git a/disk/part_efi.c b/disk/part_efi.c
index b1a03bd165e0..bde4adcfa087 100644
--- a/disk/part_efi.c
+++ b/disk/part_efi.c
@@ -291,8 +291,9 @@ int part_get_info_efi(struct blk_desc *desc, int part,
snprintf((char *)info->name, sizeof(info->name), "%s",
print_efiname(&gpt_pte[part - 1]));
strcpy((char *)info->type, "U-Boot");
info->bootable = get_bootable(&gpt_pte[part - 1]);
+ info->type_flags = gpt_pte[part - 1].attributes.fields.type_guid_specific;
if (CONFIG_IS_ENABLED(PARTITION_UUIDS)) {
uuid_bin_to_str(gpt_pte[part - 1].unique_partition_guid.b,
(char *)disk_partition_uuid(info),
UUID_STR_FORMAT_GUID);
diff --git a/include/part.h b/include/part.h
index 32ee40488563..afae51f1b933 100644
--- a/include/part.h
+++ b/include/part.h
@@ -68,8 +68,9 @@ struct disk_partition {
* PART_BOOTABLE the MBR bootable flag is set
* PART_EFI_SYSTEM_PARTITION the partition is an EFI system partition
*/
int bootable;
+ u16 type_flags; /* top 16 bits of GPT partition attributes */
#if CONFIG_IS_ENABLED(PARTITION_UUIDS)
char uuid[UUID_STR_LEN + 1]; /* filesystem UUID as string, if exists */
#endif
#ifdef CONFIG_PARTITION_TYPE_GUID
--
2.45.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v3 3/8] mmc: msm_sdhci: work around a bug when writing
2024-06-03 12:49 [PATCH v3 0/8] qcom: implement capsule updates Caleb Connolly
2024-06-03 12:49 ` [PATCH v3 1/8] dfu: add scsi backend Caleb Connolly
2024-06-03 12:49 ` [PATCH v3 2/8] disk: expose partition type flags Caleb Connolly
@ 2024-06-03 12:49 ` Caleb Connolly
2024-06-03 12:49 ` [PATCH v3 4/8] mach-snapdragon: implement capsule update support Caleb Connolly
` (5 subsequent siblings)
8 siblings, 0 replies; 18+ messages in thread
From: Caleb Connolly @ 2024-06-03 12:49 UTC (permalink / raw)
To: Tom Rini, Simon Glass, Lukasz Majewski, Mattijs Korpershoek,
Caleb Connolly, Neil Armstrong, Sumit Garg
Cc: Ilias Apalodimas, u-boot, u-boot-qcom
For some unknown reason, writes of larger than 1 block always fail with
a checksum error on Qualcomm v5 controllers.
Until this is resolved, work around the issue by setting b_max to 1 for
these controllers.
Reviewed-by: Neil Armstrong <neil.armstrong@linaro.org>
Signed-off-by: Caleb Connolly <caleb.connolly@linaro.org>
---
drivers/mmc/msm_sdhci.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/drivers/mmc/msm_sdhci.c b/drivers/mmc/msm_sdhci.c
index 4ce0de6c47d8..fc3e8d101b6e 100644
--- a/drivers/mmc/msm_sdhci.c
+++ b/drivers/mmc/msm_sdhci.c
@@ -195,8 +195,15 @@ static int msm_sdc_probe(struct udevice *dev)
return ret;
host->mmc->priv = &prv->host;
upriv->mmc = host->mmc;
+ /*
+ * FIXME: v5 controllers have a bug in U-Boot that causes all writes
+ * greater than 1 block to fail. Work around this by setting b_max to 1.
+ */
+ if (var_info->mci_removed)
+ plat->cfg.b_max = 1;
+
return sdhci_probe(dev);
}
static int msm_sdc_remove(struct udevice *dev)
--
2.45.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v3 4/8] mach-snapdragon: implement capsule update support
2024-06-03 12:49 [PATCH v3 0/8] qcom: implement capsule updates Caleb Connolly
` (2 preceding siblings ...)
2024-06-03 12:49 ` [PATCH v3 3/8] mmc: msm_sdhci: work around a bug when writing Caleb Connolly
@ 2024-06-03 12:49 ` Caleb Connolly
2024-06-03 13:38 ` Ilias Apalodimas
2024-06-05 5:21 ` Sumit Garg
2024-06-03 12:49 ` [PATCH v3 5/8] qcom_defconfig: savedefconfig Caleb Connolly
` (4 subsequent siblings)
8 siblings, 2 replies; 18+ messages in thread
From: Caleb Connolly @ 2024-06-03 12:49 UTC (permalink / raw)
To: Tom Rini, Simon Glass, Lukasz Majewski, Mattijs Korpershoek,
Caleb Connolly, Neil Armstrong, Sumit Garg
Cc: Ilias Apalodimas, u-boot, u-boot-qcom
Qualcomm boards flash U-Boot to the boot partition, implement support
for determining which slot U-Boot is running from and finding the
correct boot partition for that slot and configuring the appropriate DFU
string.
For now this only supports boards with SCSI/UFS storage where U-Boot is
flashed to the boot partition, and only U-Boot itself is updated. In the
future we may also support updating additional firmware components (tz,
hyp, xbl) as well as having U-Boot installed to other partitions (e.g.
as a first-stage bootloader).
Signed-off-by: Caleb Connolly <caleb.connolly@linaro.org>
---
arch/arm/mach-snapdragon/Makefile | 1 +
arch/arm/mach-snapdragon/board.c | 3 +
arch/arm/mach-snapdragon/capsule_update.c | 147 ++++++++++++++++++++++++++++++
arch/arm/mach-snapdragon/qcom-priv.h | 6 ++
include/configs/qcom.h | 5 +
5 files changed, 162 insertions(+)
diff --git a/arch/arm/mach-snapdragon/Makefile b/arch/arm/mach-snapdragon/Makefile
index 7a4495c8108f..343e825c6fdd 100644
--- a/arch/arm/mach-snapdragon/Makefile
+++ b/arch/arm/mach-snapdragon/Makefile
@@ -2,5 +2,6 @@
#
# (C) Copyright 2015 Mateusz Kulikowski <mateusz.kulikowski@gmail.com>
obj-y += board.o
+obj-$(CONFIG_EFI_HAVE_CAPSULE_SUPPORT) += capsule_update.o
obj-$(CONFIG_OF_LIVE) += of_fixup.o
diff --git a/arch/arm/mach-snapdragon/board.c b/arch/arm/mach-snapdragon/board.c
index b439a19ec7eb..c4a3394706e6 100644
--- a/arch/arm/mach-snapdragon/board.c
+++ b/arch/arm/mach-snapdragon/board.c
@@ -299,8 +299,11 @@ int board_late_init(void)
configure_env();
qcom_late_init();
+ /* Configure the dfu_string for capsule updates */
+ qcom_configure_capsule_updates();
+
return 0;
}
static void build_mem_map(void)
diff --git a/arch/arm/mach-snapdragon/capsule_update.c b/arch/arm/mach-snapdragon/capsule_update.c
new file mode 100644
index 000000000000..505f5bf5ae07
--- /dev/null
+++ b/arch/arm/mach-snapdragon/capsule_update.c
@@ -0,0 +1,147 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Common initialisation for Qualcomm Snapdragon boards.
+ *
+ * Copyright (c) 2024 Linaro Ltd.
+ * Author: Caleb Connolly <caleb.connolly@linaro.org>
+ */
+
+#define pr_fmt(fmt) "QCOM-FMP: " fmt
+
+#include <dm/device.h>
+#include <dm/uclass.h>
+#include <efi.h>
+#include <efi_loader.h>
+#include <malloc.h>
+#include <scsi.h>
+#include <part.h>
+#include <linux/err.h>
+
+#include "qcom-priv.h"
+
+struct efi_fw_image fw_images[] = {
+ {
+ .image_type_id = QUALCOMM_UBOOT_BOOT_IMAGE_GUID,
+ .fw_name = u"QUALCOMM-UBOOT",
+ .image_index = 1,
+ },
+};
+
+struct efi_capsule_update_info update_info = {
+ /* Filled in by configure_dfu_string() */
+ .dfu_string = NULL,
+ .num_images = ARRAY_SIZE(fw_images),
+ .images = fw_images,
+};
+
+/* LSB first */
+struct part_slot_status {
+ u16: 2;
+ u16 active : 1;
+ u16: 3;
+ u16 successful : 1;
+ u16 unbootable : 1;
+ u16 tries_remaining : 4;
+};
+
+static int find_boot_partition(const char *partname, struct blk_desc *blk_dev, char *name)
+{
+ int ret;
+ int partnum;
+ struct disk_partition info;
+ struct part_slot_status *slot_status;
+
+ for (partnum = 1;; partnum++) {
+ ret = part_get_info(blk_dev, partnum, &info);
+ if (ret)
+ return ret;
+
+ slot_status = (struct part_slot_status *)&info.type_flags;
+ log_io("%16s: Active: %1d, Successful: %1d, Unbootable: %1d, Tries left: %1d\n",
+ info.name, slot_status->active,
+ slot_status->successful, slot_status->unbootable,
+ slot_status->tries_remaining);
+ if (!strncmp(info.name, partname, strlen(partname)) && slot_status->active) {
+ log_debug("Found active %s partition: '%s'!\n", partname, info.name);
+ strlcpy(name, info.name, sizeof(info.name));
+ return partnum;
+ }
+ }
+
+ return -1;
+}
+
+/**
+ * qcom_configure_capsule_updates() - Configure the DFU string for capsule updates
+ *
+ * U-Boot is flashed to the boot partition on Qualcomm boards. In most cases there
+ * are two boot partitions, boot_a and boot_b. As we don't currently support doing
+ * full A/B updates, we only support updating the currently active boot partition.
+ *
+ * So we need to find the current slot suffix and the associated boot partition.
+ * We do this by looking for the boot partition that has the 'active' flag set
+ * in the GPT partition vendor attribute bits.
+ */
+void qcom_configure_capsule_updates(void)
+{
+ struct blk_desc *desc;
+ int ret = 0, partnum = -1, devnum;
+ static char dfu_string[32] = { 0 };
+ char name[32]; /* GPT partition name */
+ char *partname = "boot";
+ struct udevice *dev = NULL;
+
+ /*
+ * There is currently no good way to check how U-Boot is booting, but we have
+ * a few hueristics, like here checking if our DTB has a kaslr-seed specified
+ * will tell us if we were chainloaded by another bootloader.
+ * FIXME: we should do this check once and use some proper API to expose the data.
+ */
+ if (!ofnode_has_property(ofnode_path("/chosen"), "kaslr-seed")) {
+ log_debug("No initrd address present, skip as we might not be chainloaded\n");
+ return;
+ }
+
+ if (IS_ENABLED(CONFIG_SCSI)) {
+ /* Scan for SCSI devices */
+ ret = scsi_scan(false);
+ if (ret) {
+ debug("Failed to scan SCSI devices: %d\n", ret);
+ return;
+ }
+ }
+
+ uclass_foreach_dev_probe(UCLASS_BLK, dev) {
+ if (device_get_uclass_id(dev) != UCLASS_BLK)
+ continue;
+
+ desc = dev_get_uclass_plat(dev);
+ if (!desc || desc->part_type == PART_TYPE_UNKNOWN)
+ continue;
+ devnum = desc->devnum;
+ partnum = find_boot_partition(partname, desc,
+ name);
+ if (partnum >= 0)
+ break;
+ }
+
+ if (partnum < 0) {
+ log_err("Failed to find boot partition\n");
+ return;
+ }
+
+ switch (desc->uclass_id) {
+ case UCLASS_SCSI:
+ snprintf(dfu_string, 32, "scsi %d=u-boot-bin part %d", devnum, partnum);
+ break;
+ case UCLASS_MMC:
+ snprintf(dfu_string, 32, "mmc 0=u-boot-bin part %d %d", devnum, partnum);
+ break;
+ default:
+ debug("Unsupported storage uclass: %d\n", desc->uclass_id);
+ return;
+ }
+ log_debug("boot partition is %s, DFU string: '%s'\n", name, dfu_string);
+
+ update_info.dfu_string = dfu_string;
+}
diff --git a/arch/arm/mach-snapdragon/qcom-priv.h b/arch/arm/mach-snapdragon/qcom-priv.h
index 0a7ed5eff8b8..74d39197b89f 100644
--- a/arch/arm/mach-snapdragon/qcom-priv.h
+++ b/arch/arm/mach-snapdragon/qcom-priv.h
@@ -2,8 +2,14 @@
#ifndef __QCOM_PRIV_H__
#define __QCOM_PRIV_H__
+#if IS_ENABLED(CONFIG_EFI_HAVE_CAPSULE_SUPPORT)
+void qcom_configure_capsule_updates(void);
+#else
+void qcom_configure_capsule_updates(void) {}
+#endif /* EFI_HAVE_CAPSULE_SUPPORT */
+
#if CONFIG_IS_ENABLED(OF_LIVE)
/**
* qcom_of_fixup_nodes() - Fixup Qualcomm DT nodes
*
diff --git a/include/configs/qcom.h b/include/configs/qcom.h
index e50b3bce5cdd..b6b5acffe5e4 100644
--- a/include/configs/qcom.h
+++ b/include/configs/qcom.h
@@ -10,8 +10,13 @@
#define __CONFIGS_SNAPDRAGON_H
#define CFG_SYS_BAUDRATE_TABLE { 115200, 230400, 460800, 921600 }
+// 2a5aa852-b856-4d97-baa9-5c5f4421551f
+#define QUALCOMM_UBOOT_BOOT_IMAGE_GUID \
+ EFI_GUID(0x2a5aa852, 0xb856, 0x4d97, 0xba, 0xa9, \
+ 0x5c, 0x5f, 0x44, 0x21, 0x55, 0x1f)
+
/* Load addressed are calculated during board_late_init(). See arm/mach-snapdragon/board.c */
#define CFG_EXTRA_ENV_SETTINGS \
"stdin=serial,button-kbd\0" \
"stdout=serial,vidconsole\0" \
--
2.45.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v3 5/8] qcom_defconfig: savedefconfig
2024-06-03 12:49 [PATCH v3 0/8] qcom: implement capsule updates Caleb Connolly
` (3 preceding siblings ...)
2024-06-03 12:49 ` [PATCH v3 4/8] mach-snapdragon: implement capsule update support Caleb Connolly
@ 2024-06-03 12:49 ` Caleb Connolly
2024-06-03 12:49 ` [PATCH v3 6/8] mach-snapdragon: use SYSRESET_PSCI Caleb Connolly
` (3 subsequent siblings)
8 siblings, 0 replies; 18+ messages in thread
From: Caleb Connolly @ 2024-06-03 12:49 UTC (permalink / raw)
To: Tom Rini, Simon Glass, Lukasz Majewski, Mattijs Korpershoek,
Caleb Connolly, Neil Armstrong, Sumit Garg
Cc: Ilias Apalodimas, u-boot, u-boot-qcom
run savedefconfig
Reviewed-by: Neil Armstrong <neil.armstrong@linaro.org>
Signed-off-by: Caleb Connolly <caleb.connolly@linaro.org>
---
configs/qcom_defconfig | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/configs/qcom_defconfig b/configs/qcom_defconfig
index 65f13ae7a089..f2dfced4bc1e 100644
--- a/configs/qcom_defconfig
+++ b/configs/qcom_defconfig
@@ -1,17 +1,18 @@
CONFIG_ARM=y
CONFIG_SKIP_LOWLEVEL_INIT=y
CONFIG_POSITION_INDEPENDENT=y
+CONFIG_SYS_INIT_SP_BSS_OFFSET=1572864
CONFIG_ARCH_SNAPDRAGON=y
CONFIG_DEFAULT_DEVICE_TREE="qcom/sdm845-db845c"
CONFIG_SYS_LOAD_ADDR=0xA0000000
-CONFIG_SYS_INIT_SP_BSS_OFFSET=1572864
CONFIG_BUTTON_CMD=y
CONFIG_FIT=y
CONFIG_FIT_VERBOSE=y
CONFIG_BOOTSTD_FULL=y
# CONFIG_BOOTMETH_VBE is not set
CONFIG_BOOTDELAY=1
+CONFIG_OF_BOARD_SETUP=y
CONFIG_USE_PREBOOT=y
CONFIG_SAVE_PREV_BL_INITRAMFS_START_ADDR=y
CONFIG_SYS_CBSIZE=512
CONFIG_LOG_MAX_LEVEL=9
@@ -33,9 +34,8 @@ CONFIG_CMD_USB=y
CONFIG_CMD_CAT=y
CONFIG_CMD_BMP=y
CONFIG_CMD_LOG=y
CONFIG_OF_LIVE=y
-CONFIG_OF_BOARD_SETUP=y
CONFIG_BUTTON_QCOM_PMIC=y
CONFIG_CLK=y
CONFIG_CLK_QCOM_QCM2290=y
CONFIG_CLK_QCOM_QCS404=y
@@ -106,6 +106,5 @@ CONFIG_VIDEO_FONT_16X32=y
CONFIG_SYS_WHITE_ON_BLACK=y
CONFIG_NO_FB_CLEAR=y
CONFIG_VIDEO_SIMPLE=y
CONFIG_HEXDUMP=y
-CONFIG_GENERATE_SMBIOS_TABLE=y
CONFIG_LMB_MAX_REGIONS=64
--
2.45.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v3 6/8] mach-snapdragon: use SYSRESET_PSCI
2024-06-03 12:49 [PATCH v3 0/8] qcom: implement capsule updates Caleb Connolly
` (4 preceding siblings ...)
2024-06-03 12:49 ` [PATCH v3 5/8] qcom_defconfig: savedefconfig Caleb Connolly
@ 2024-06-03 12:49 ` Caleb Connolly
2024-06-03 12:49 ` [PATCH v3 7/8] mach-snapdragon: bump up heap size Caleb Connolly
` (2 subsequent siblings)
8 siblings, 0 replies; 18+ messages in thread
From: Caleb Connolly @ 2024-06-03 12:49 UTC (permalink / raw)
To: Tom Rini, Simon Glass, Lukasz Majewski, Mattijs Korpershoek,
Caleb Connolly, Neil Armstrong, Sumit Garg
Cc: Ilias Apalodimas, u-boot, u-boot-qcom
Capsule updates depend on SYSRESET, which we currently don't select but
instead use a custom reset_cpu() implementation which just calls
psci_reset().
Clean this up, drop our custom function and require PSCI reset.
There are some Qualcomm platforms that either can or do run without PSCI
support, but we didn't handle these properly before anyway.
Reviewed-by: Neil Armstrong <neil.armstrong@linaro.org>
Reviewed-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
Signed-off-by: Caleb Connolly <caleb.connolly@linaro.org>
---
arch/arm/Kconfig | 2 ++
arch/arm/mach-snapdragon/board.c | 5 -----
2 files changed, 2 insertions(+), 5 deletions(-)
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index 39ad03acd2e4..0d5161358e33 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -1084,8 +1084,10 @@ config ARCH_SNAPDRAGON
select OF_CONTROL
select OF_SEPARATE
select SMEM
select SPMI
+ select SYSRESET
+ select SYSRESET_PSCI
select BOARD_LATE_INIT
select OF_BOARD
select SAVE_PREV_BL_FDT_ADDR
select LINUX_KERNEL_IMAGE_HEADER if !ENABLE_ARM_SOC_BOOT0_HOOK
diff --git a/arch/arm/mach-snapdragon/board.c b/arch/arm/mach-snapdragon/board.c
index c4a3394706e6..b0d9a65bb8f5 100644
--- a/arch/arm/mach-snapdragon/board.c
+++ b/arch/arm/mach-snapdragon/board.c
@@ -106,13 +106,8 @@ void *board_fdt_blob_setup(int *err)
return (void *)fdt;
}
-void reset_cpu(void)
-{
- psci_system_reset();
-}
-
/*
* Some Qualcomm boards require GPIO configuration when switching USB modes.
* Support setting this configuration via pinctrl state.
*/
--
2.45.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v3 7/8] mach-snapdragon: bump up heap size
2024-06-03 12:49 [PATCH v3 0/8] qcom: implement capsule updates Caleb Connolly
` (5 preceding siblings ...)
2024-06-03 12:49 ` [PATCH v3 6/8] mach-snapdragon: use SYSRESET_PSCI Caleb Connolly
@ 2024-06-03 12:49 ` Caleb Connolly
2024-06-03 12:49 ` [PATCH v3 8/8] qcom_defconfig: enable capsule update support Caleb Connolly
2024-06-05 5:31 ` [PATCH v3 0/8] qcom: implement capsule updates Sumit Garg
8 siblings, 0 replies; 18+ messages in thread
From: Caleb Connolly @ 2024-06-03 12:49 UTC (permalink / raw)
To: Tom Rini, Simon Glass, Lukasz Majewski, Mattijs Korpershoek,
Caleb Connolly, Neil Armstrong, Sumit Garg
Cc: Ilias Apalodimas, u-boot, u-boot-qcom
For capsule updates we need more heap space for the DFU buffer. Give
ourselves a whole 8MiB!
Reviewed-by: Neil Armstrong <neil.armstrong@linaro.org>
Reviewed-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
Signed-off-by: Caleb Connolly <caleb.connolly@linaro.org>
---
arch/arm/mach-snapdragon/Kconfig | 3 +++
1 file changed, 3 insertions(+)
diff --git a/arch/arm/mach-snapdragon/Kconfig b/arch/arm/mach-snapdragon/Kconfig
index 536960b83c3b..5023c906bed8 100644
--- a/arch/arm/mach-snapdragon/Kconfig
+++ b/arch/arm/mach-snapdragon/Kconfig
@@ -10,8 +10,11 @@ config SYS_VENDOR
Allows to specify vendor for the Snapdragon SoCs based boards.
Based on this option board/<CONFIG_SYS_VENDOR>/<CONFIG_SYS_BOARD>
will be used as the custom board directory.
+config SYS_MALLOC_LEN
+ default 0x800000
+
config SYS_MALLOC_F_LEN
default 0x2000
config SPL_SYS_MALLOC_F
--
2.45.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v3 8/8] qcom_defconfig: enable capsule update support
2024-06-03 12:49 [PATCH v3 0/8] qcom: implement capsule updates Caleb Connolly
` (6 preceding siblings ...)
2024-06-03 12:49 ` [PATCH v3 7/8] mach-snapdragon: bump up heap size Caleb Connolly
@ 2024-06-03 12:49 ` Caleb Connolly
2024-06-03 13:48 ` Ilias Apalodimas
2024-06-05 5:31 ` [PATCH v3 0/8] qcom: implement capsule updates Sumit Garg
8 siblings, 1 reply; 18+ messages in thread
From: Caleb Connolly @ 2024-06-03 12:49 UTC (permalink / raw)
To: Tom Rini, Simon Glass, Lukasz Majewski, Mattijs Korpershoek,
Caleb Connolly, Neil Armstrong, Sumit Garg
Cc: Ilias Apalodimas, u-boot, u-boot-qcom
Enable all the necessary options for capsule updates to work, as well as
a few additional EFI features.
Signed-off-by: Caleb Connolly <caleb.connolly@linaro.org>
---
configs/qcom_defconfig | 14 ++++++++++++--
1 file changed, 12 insertions(+), 2 deletions(-)
diff --git a/configs/qcom_defconfig b/configs/qcom_defconfig
index f2dfced4bc1e..d1de7158e3f5 100644
--- a/configs/qcom_defconfig
+++ b/configs/qcom_defconfig
@@ -19,33 +19,39 @@ CONFIG_LOG_MAX_LEVEL=9
CONFIG_LOG_DEFAULT_LEVEL=4
# CONFIG_DISPLAY_CPUINFO is not set
CONFIG_DISPLAY_BOARDINFO_LATE=y
CONFIG_CMD_BOOTMENU=y
+CONFIG_CMD_NVEDIT_EFI=y
CONFIG_CMD_EEPROM=y
CONFIG_SYS_I2C_EEPROM_BUS=2
CONFIG_SYS_I2C_EEPROM_ADDR_LEN=2
CONFIG_SYS_EEPROM_PAGE_WRITE_BITS=5
# CONFIG_CMD_BIND is not set
CONFIG_CMD_CLK=y
+CONFIG_CMD_DFU=y
CONFIG_CMD_GPIO=y
CONFIG_CMD_I2C=y
CONFIG_CMD_MMC=y
CONFIG_CMD_UFS=y
CONFIG_CMD_USB=y
CONFIG_CMD_CAT=y
CONFIG_CMD_BMP=y
+CONFIG_CMD_EFIDEBUG=y
CONFIG_CMD_LOG=y
CONFIG_OF_LIVE=y
CONFIG_BUTTON_QCOM_PMIC=y
CONFIG_CLK=y
+CONFIG_CLK_STUB=y
CONFIG_CLK_QCOM_QCM2290=y
CONFIG_CLK_QCOM_QCS404=y
CONFIG_CLK_QCOM_SDM845=y
CONFIG_CLK_QCOM_SM6115=y
CONFIG_CLK_QCOM_SM8250=y
CONFIG_CLK_QCOM_SM8550=y
CONFIG_CLK_QCOM_SM8650=y
-CONFIG_CLK_STUB=y
+CONFIG_DFU_MMC=y
+CONFIG_DFU_SCSI=y
+CONFIG_SYS_DFU_DATA_BUF_SIZE=0x200000
CONFIG_MSM_GPIO=y
CONFIG_QCOM_PMIC_GPIO=y
CONFIG_DM_I2C=y
CONFIG_SYS_I2C_QUP=y
@@ -105,6 +111,10 @@ CONFIG_VIDEO=y
CONFIG_VIDEO_FONT_16X32=y
CONFIG_SYS_WHITE_ON_BLACK=y
CONFIG_NO_FB_CLEAR=y
CONFIG_VIDEO_SIMPLE=y
-CONFIG_HEXDUMP=y
+CONFIG_SYMBOL_LOOKUP=y
+CONFIG_EFI_RUNTIME_UPDATE_CAPSULE=y
+CONFIG_EFI_CAPSULE_ON_DISK=y
+CONFIG_EFI_IGNORE_OSINDICATIONS=y
+CONFIG_EFI_CAPSULE_FIRMWARE_RAW=y
CONFIG_LMB_MAX_REGIONS=64
--
2.45.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [PATCH v3 4/8] mach-snapdragon: implement capsule update support
2024-06-03 12:49 ` [PATCH v3 4/8] mach-snapdragon: implement capsule update support Caleb Connolly
@ 2024-06-03 13:38 ` Ilias Apalodimas
2024-06-05 5:21 ` Sumit Garg
1 sibling, 0 replies; 18+ messages in thread
From: Ilias Apalodimas @ 2024-06-03 13:38 UTC (permalink / raw)
To: Caleb Connolly
Cc: Tom Rini, Simon Glass, Lukasz Majewski, Mattijs Korpershoek,
Neil Armstrong, Sumit Garg, u-boot, u-boot-qcom
Hi Caleb,
On Mon, 3 Jun 2024 at 15:49, Caleb Connolly <caleb.connolly@linaro.org> wrote:
>
> Qualcomm boards flash U-Boot to the boot partition, implement support
> for determining which slot U-Boot is running from and finding the
> correct boot partition for that slot and configuring the appropriate DFU
> string.
>
> For now this only supports boards with SCSI/UFS storage where U-Boot is
> flashed to the boot partition, and only U-Boot itself is updated. In the
> future we may also support updating additional firmware components (tz,
> hyp, xbl) as well as having U-Boot installed to other partitions (e.g.
> as a first-stage bootloader).
>
> Signed-off-by: Caleb Connolly <caleb.connolly@linaro.org>
> ---
> arch/arm/mach-snapdragon/Makefile | 1 +
> arch/arm/mach-snapdragon/board.c | 3 +
> arch/arm/mach-snapdragon/capsule_update.c | 147 ++++++++++++++++++++++++++++++
> arch/arm/mach-snapdragon/qcom-priv.h | 6 ++
> include/configs/qcom.h | 5 +
> 5 files changed, 162 insertions(+)
>
> diff --git a/arch/arm/mach-snapdragon/Makefile b/arch/arm/mach-snapdragon/Makefile
> index 7a4495c8108f..343e825c6fdd 100644
> --- a/arch/arm/mach-snapdragon/Makefile
> +++ b/arch/arm/mach-snapdragon/Makefile
> @@ -2,5 +2,6 @@
> #
> # (C) Copyright 2015 Mateusz Kulikowski <mateusz.kulikowski@gmail.com>
>
> obj-y += board.o
> +obj-$(CONFIG_EFI_HAVE_CAPSULE_SUPPORT) += capsule_update.o
> obj-$(CONFIG_OF_LIVE) += of_fixup.o
> diff --git a/arch/arm/mach-snapdragon/board.c b/arch/arm/mach-snapdragon/board.c
> index b439a19ec7eb..c4a3394706e6 100644
> --- a/arch/arm/mach-snapdragon/board.c
> +++ b/arch/arm/mach-snapdragon/board.c
> @@ -299,8 +299,11 @@ int board_late_init(void)
>
> configure_env();
> qcom_late_init();
>
> + /* Configure the dfu_string for capsule updates */
> + qcom_configure_capsule_updates();
> +
> return 0;
> }
>
> static void build_mem_map(void)
> diff --git a/arch/arm/mach-snapdragon/capsule_update.c b/arch/arm/mach-snapdragon/capsule_update.c
> new file mode 100644
> index 000000000000..505f5bf5ae07
> --- /dev/null
> +++ b/arch/arm/mach-snapdragon/capsule_update.c
> @@ -0,0 +1,147 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * Common initialisation for Qualcomm Snapdragon boards.
initialization
> + *
> + * Copyright (c) 2024 Linaro Ltd.
> + * Author: Caleb Connolly <caleb.connolly@linaro.org>
> + */
> +
> +#define pr_fmt(fmt) "QCOM-FMP: " fmt
> +
> +#include <dm/device.h>
> +#include <dm/uclass.h>
> +#include <efi.h>
> +#include <efi_loader.h>
> +#include <malloc.h>
> +#include <scsi.h>
> +#include <part.h>
> +#include <linux/err.h>
> +
> +#include "qcom-priv.h"
> +
> +struct efi_fw_image fw_images[] = {
> + {
> + .image_type_id = QUALCOMM_UBOOT_BOOT_IMAGE_GUID,
> + .fw_name = u"QUALCOMM-UBOOT",
> + .image_index = 1,
> + },
> +};
> +
> +struct efi_capsule_update_info update_info = {
> + /* Filled in by configure_dfu_string() */
> + .dfu_string = NULL,
> + .num_images = ARRAY_SIZE(fw_images),
> + .images = fw_images,
> +};
> +
> +/* LSB first */
> +struct part_slot_status {
> + u16: 2;
> + u16 active : 1;
> + u16: 3;
> + u16 successful : 1;
> + u16 unbootable : 1;
> + u16 tries_remaining : 4;
> +};
This is part of their first-stage boot loader and can't change right?
[...]
> +/**
> + * qcom_configure_capsule_updates() - Configure the DFU string for capsule updates
> + *
> + * U-Boot is flashed to the boot partition on Qualcomm boards. In most cases there
> + * are two boot partitions, boot_a and boot_b. As we don't currently support doing
> + * full A/B updates, we only support updating the currently active boot partition.
> + *
> + * So we need to find the current slot suffix and the associated boot partition.
> + * We do this by looking for the boot partition that has the 'active' flag set
> + * in the GPT partition vendor attribute bits.
> + */
> +void qcom_configure_capsule_updates(void)
> +{
> + struct blk_desc *desc;
> + int ret = 0, partnum = -1, devnum;
> + static char dfu_string[32] = { 0 };
Use PART_NAME_LEN here, since that's the length struct disk_partition
defines (and the one you end up copying)
> + char name[32]; /* GPT partition name */
> + char *partname = "boot";
> + struct udevice *dev = NULL;
> +
> + /*
> + * There is currently no good way to check how U-Boot is booting, but we have
> + * a few hueristics, like here checking if our DTB has a kaslr-seed specified
heuristics
> + * will tell us if we were chainloaded by another bootloader.
> + * FIXME: we should do this check once and use some proper API to expose the data.
> + */
> + if (!ofnode_has_property(ofnode_path("/chosen"), "kaslr-seed")) {
[...]
Acked-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v3 8/8] qcom_defconfig: enable capsule update support
2024-06-03 12:49 ` [PATCH v3 8/8] qcom_defconfig: enable capsule update support Caleb Connolly
@ 2024-06-03 13:48 ` Ilias Apalodimas
0 siblings, 0 replies; 18+ messages in thread
From: Ilias Apalodimas @ 2024-06-03 13:48 UTC (permalink / raw)
To: Caleb Connolly
Cc: Tom Rini, Simon Glass, Lukasz Majewski, Mattijs Korpershoek,
Neil Armstrong, Sumit Garg, u-boot, u-boot-qcom
On Mon, 3 Jun 2024 at 15:49, Caleb Connolly <caleb.connolly@linaro.org> wrote:
>
> Enable all the necessary options for capsule updates to work, as well as
> a few additional EFI features.
>
> Signed-off-by: Caleb Connolly <caleb.connolly@linaro.org>
> ---
> configs/qcom_defconfig | 14 ++++++++++++--
> 1 file changed, 12 insertions(+), 2 deletions(-)
>
> diff --git a/configs/qcom_defconfig b/configs/qcom_defconfig
> index f2dfced4bc1e..d1de7158e3f5 100644
> --- a/configs/qcom_defconfig
> +++ b/configs/qcom_defconfig
> @@ -19,33 +19,39 @@ CONFIG_LOG_MAX_LEVEL=9
> CONFIG_LOG_DEFAULT_LEVEL=4
> # CONFIG_DISPLAY_CPUINFO is not set
> CONFIG_DISPLAY_BOARDINFO_LATE=y
> CONFIG_CMD_BOOTMENU=y
> +CONFIG_CMD_NVEDIT_EFI=y
> CONFIG_CMD_EEPROM=y
> CONFIG_SYS_I2C_EEPROM_BUS=2
> CONFIG_SYS_I2C_EEPROM_ADDR_LEN=2
> CONFIG_SYS_EEPROM_PAGE_WRITE_BITS=5
> # CONFIG_CMD_BIND is not set
> CONFIG_CMD_CLK=y
> +CONFIG_CMD_DFU=y
> CONFIG_CMD_GPIO=y
> CONFIG_CMD_I2C=y
> CONFIG_CMD_MMC=y
> CONFIG_CMD_UFS=y
> CONFIG_CMD_USB=y
> CONFIG_CMD_CAT=y
> CONFIG_CMD_BMP=y
> +CONFIG_CMD_EFIDEBUG=y
> CONFIG_CMD_LOG=y
> CONFIG_OF_LIVE=y
> CONFIG_BUTTON_QCOM_PMIC=y
> CONFIG_CLK=y
> +CONFIG_CLK_STUB=y
> CONFIG_CLK_QCOM_QCM2290=y
> CONFIG_CLK_QCOM_QCS404=y
> CONFIG_CLK_QCOM_SDM845=y
> CONFIG_CLK_QCOM_SM6115=y
> CONFIG_CLK_QCOM_SM8250=y
> CONFIG_CLK_QCOM_SM8550=y
> CONFIG_CLK_QCOM_SM8650=y
> -CONFIG_CLK_STUB=y
> +CONFIG_DFU_MMC=y
> +CONFIG_DFU_SCSI=y
> +CONFIG_SYS_DFU_DATA_BUF_SIZE=0x200000
> CONFIG_MSM_GPIO=y
> CONFIG_QCOM_PMIC_GPIO=y
> CONFIG_DM_I2C=y
> CONFIG_SYS_I2C_QUP=y
> @@ -105,6 +111,10 @@ CONFIG_VIDEO=y
> CONFIG_VIDEO_FONT_16X32=y
> CONFIG_SYS_WHITE_ON_BLACK=y
> CONFIG_NO_FB_CLEAR=y
> CONFIG_VIDEO_SIMPLE=y
> -CONFIG_HEXDUMP=y
> +CONFIG_SYMBOL_LOOKUP=y
> +CONFIG_EFI_RUNTIME_UPDATE_CAPSULE=y
> +CONFIG_EFI_CAPSULE_ON_DISK=y
> +CONFIG_EFI_IGNORE_OSINDICATIONS=y
> +CONFIG_EFI_CAPSULE_FIRMWARE_RAW=y
> CONFIG_LMB_MAX_REGIONS=64
>
> --
> 2.45.0
>
Reviewed-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v3 1/8] dfu: add scsi backend
2024-06-03 12:49 ` [PATCH v3 1/8] dfu: add scsi backend Caleb Connolly
@ 2024-06-04 7:01 ` Mattijs Korpershoek
0 siblings, 0 replies; 18+ messages in thread
From: Mattijs Korpershoek @ 2024-06-04 7:01 UTC (permalink / raw)
To: Caleb Connolly, Tom Rini, Simon Glass, Lukasz Majewski,
Caleb Connolly, Neil Armstrong, Sumit Garg
Cc: Ilias Apalodimas, u-boot, u-boot-qcom
Hi Caleb,
Thank you for the patch.
On lun., juin 03, 2024 at 14:49, Caleb Connolly <caleb.connolly@linaro.org> wrote:
> This is extremely similar to the MMC backend, but there are some notable
> differences.
>
> Works with a DFU string like
>
> scsi 4=u-boot-bin part 11
>
> Where "4" is the SCSI dev number (sequential LUN across all SCSI devices)
> and "11" is the partition number.
>
> Signed-off-by: Caleb Connolly <caleb.connolly@linaro.org>
> ---
> doc/usage/dfu.rst | 32 ++++
> drivers/dfu/Kconfig | 7 +
> drivers/dfu/Makefile | 1 +
> drivers/dfu/dfu.c | 5 +-
> drivers/dfu/dfu_scsi.c | 435 +++++++++++++++++++++++++++++++++++++++++++++++++
> include/dfu.h | 26 +++
> 6 files changed, 505 insertions(+), 1 deletion(-)
>
> diff --git a/doc/usage/dfu.rst b/doc/usage/dfu.rst
> index 8cc09c308d82..f497dcf137a4 100644
> --- a/doc/usage/dfu.rst
> +++ b/doc/usage/dfu.rst
> @@ -21,8 +21,9 @@ U-Boot implements this DFU capability (CONFIG_DFU) with the command dfu
>
> Today the supported DFU backends are:
>
> - MMC (RAW or FAT / EXT2 / EXT3 / EXT4 file system / SKIP / SCRIPT)
> +- SCSI (UFS, RAW partition, FAT / EXT2 / EXT3 / EXT4 file system / SKIP / SCRIPT)
> - NAND
> - RAM
> - SF (serial flash)
> - MTD (all MTD device: NAND, SPI-NOR, SPI-NAND,...)
> @@ -166,8 +167,38 @@ mmc
>
> Please note that this means the user will be able to execute any
> arbitrary commands just like in the u-boot's shell.
Can we please add CONFIG_DFU_SCSI in "Configuration Options" section at
the beginning of this document?
See:
https://docs.u-boot.org/en/latest/usage/dfu.html#configuration-options
Note: I requested that here:
https://lore.kernel.org/all/87o7a94pe1.fsf@baylibre.com/
With above addressed, feel free to add:
Reviewed-by: Mattijs Korpershoek <mkorpershoek@baylibre.com>
And please take this through your tree:
Acked-by: Mattijs Korpershoek <mkorpershoek@baylibre.com>
>
> +scsi
[...]
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v3 4/8] mach-snapdragon: implement capsule update support
2024-06-03 12:49 ` [PATCH v3 4/8] mach-snapdragon: implement capsule update support Caleb Connolly
2024-06-03 13:38 ` Ilias Apalodimas
@ 2024-06-05 5:21 ` Sumit Garg
2024-06-05 12:33 ` Caleb Connolly
1 sibling, 1 reply; 18+ messages in thread
From: Sumit Garg @ 2024-06-05 5:21 UTC (permalink / raw)
To: Caleb Connolly
Cc: Tom Rini, Simon Glass, Lukasz Majewski, Mattijs Korpershoek,
Neil Armstrong, Ilias Apalodimas, u-boot, u-boot-qcom
Hi Caleb,
On Mon, 3 Jun 2024 at 18:19, Caleb Connolly <caleb.connolly@linaro.org> wrote:
>
> Qualcomm boards flash U-Boot to the boot partition, implement support
> for determining which slot U-Boot is running from and finding the
> correct boot partition for that slot and configuring the appropriate DFU
> string.
>
> For now this only supports boards with SCSI/UFS storage where U-Boot is
> flashed to the boot partition, and only U-Boot itself is updated. In the
> future we may also support updating additional firmware components (tz,
> hyp, xbl) as well as having U-Boot installed to other partitions (e.g.
> as a first-stage bootloader).
>
> Signed-off-by: Caleb Connolly <caleb.connolly@linaro.org>
> ---
> arch/arm/mach-snapdragon/Makefile | 1 +
> arch/arm/mach-snapdragon/board.c | 3 +
> arch/arm/mach-snapdragon/capsule_update.c | 147 ++++++++++++++++++++++++++++++
> arch/arm/mach-snapdragon/qcom-priv.h | 6 ++
> include/configs/qcom.h | 5 +
> 5 files changed, 162 insertions(+)
>
> diff --git a/arch/arm/mach-snapdragon/Makefile b/arch/arm/mach-snapdragon/Makefile
> index 7a4495c8108f..343e825c6fdd 100644
> --- a/arch/arm/mach-snapdragon/Makefile
> +++ b/arch/arm/mach-snapdragon/Makefile
> @@ -2,5 +2,6 @@
> #
> # (C) Copyright 2015 Mateusz Kulikowski <mateusz.kulikowski@gmail.com>
>
> obj-y += board.o
> +obj-$(CONFIG_EFI_HAVE_CAPSULE_SUPPORT) += capsule_update.o
> obj-$(CONFIG_OF_LIVE) += of_fixup.o
> diff --git a/arch/arm/mach-snapdragon/board.c b/arch/arm/mach-snapdragon/board.c
> index b439a19ec7eb..c4a3394706e6 100644
> --- a/arch/arm/mach-snapdragon/board.c
> +++ b/arch/arm/mach-snapdragon/board.c
> @@ -299,8 +299,11 @@ int board_late_init(void)
>
> configure_env();
> qcom_late_init();
>
> + /* Configure the dfu_string for capsule updates */
> + qcom_configure_capsule_updates();
> +
> return 0;
> }
>
> static void build_mem_map(void)
> diff --git a/arch/arm/mach-snapdragon/capsule_update.c b/arch/arm/mach-snapdragon/capsule_update.c
> new file mode 100644
> index 000000000000..505f5bf5ae07
> --- /dev/null
> +++ b/arch/arm/mach-snapdragon/capsule_update.c
> @@ -0,0 +1,147 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * Common initialisation for Qualcomm Snapdragon boards.
> + *
> + * Copyright (c) 2024 Linaro Ltd.
> + * Author: Caleb Connolly <caleb.connolly@linaro.org>
> + */
> +
> +#define pr_fmt(fmt) "QCOM-FMP: " fmt
> +
> +#include <dm/device.h>
> +#include <dm/uclass.h>
> +#include <efi.h>
> +#include <efi_loader.h>
> +#include <malloc.h>
> +#include <scsi.h>
> +#include <part.h>
> +#include <linux/err.h>
> +
> +#include "qcom-priv.h"
> +
> +struct efi_fw_image fw_images[] = {
> + {
> + .image_type_id = QUALCOMM_UBOOT_BOOT_IMAGE_GUID,
> + .fw_name = u"QUALCOMM-UBOOT",
> + .image_index = 1,
> + },
> +};
> +
> +struct efi_capsule_update_info update_info = {
> + /* Filled in by configure_dfu_string() */
> + .dfu_string = NULL,
> + .num_images = ARRAY_SIZE(fw_images),
> + .images = fw_images,
> +};
> +
> +/* LSB first */
> +struct part_slot_status {
> + u16: 2;
> + u16 active : 1;
> + u16: 3;
> + u16 successful : 1;
> + u16 unbootable : 1;
> + u16 tries_remaining : 4;
> +};
> +
> +static int find_boot_partition(const char *partname, struct blk_desc *blk_dev, char *name)
> +{
> + int ret;
> + int partnum;
> + struct disk_partition info;
> + struct part_slot_status *slot_status;
> +
> + for (partnum = 1;; partnum++) {
> + ret = part_get_info(blk_dev, partnum, &info);
> + if (ret)
> + return ret;
> +
> + slot_status = (struct part_slot_status *)&info.type_flags;
> + log_io("%16s: Active: %1d, Successful: %1d, Unbootable: %1d, Tries left: %1d\n",
> + info.name, slot_status->active,
> + slot_status->successful, slot_status->unbootable,
> + slot_status->tries_remaining);
> + if (!strncmp(info.name, partname, strlen(partname)) && slot_status->active) {
> + log_debug("Found active %s partition: '%s'!\n", partname, info.name);
> + strlcpy(name, info.name, sizeof(info.name));
> + return partnum;
> + }
> + }
> +
> + return -1;
> +}
> +
> +/**
> + * qcom_configure_capsule_updates() - Configure the DFU string for capsule updates
> + *
> + * U-Boot is flashed to the boot partition on Qualcomm boards. In most cases there
> + * are two boot partitions, boot_a and boot_b. As we don't currently support doing
> + * full A/B updates, we only support updating the currently active boot partition.
> + *
> + * So we need to find the current slot suffix and the associated boot partition.
> + * We do this by looking for the boot partition that has the 'active' flag set
> + * in the GPT partition vendor attribute bits.
> + */
> +void qcom_configure_capsule_updates(void)
> +{
> + struct blk_desc *desc;
> + int ret = 0, partnum = -1, devnum;
> + static char dfu_string[32] = { 0 };
> + char name[32]; /* GPT partition name */
> + char *partname = "boot";
> + struct udevice *dev = NULL;
> +
> + /*
> + * There is currently no good way to check how U-Boot is booting, but we have
> + * a few hueristics, like here checking if our DTB has a kaslr-seed specified
> + * will tell us if we were chainloaded by another bootloader.
> + * FIXME: we should do this check once and use some proper API to expose the data.
If U-Boot is built with LINUX_KERNEL_IMAGE_HEADER enabled then we
should know that U-Boot is built as a replacement of Linux kernel and
hence chainloaded. Isn't that what you need here?
-Sumit
> + */
> + if (!ofnode_has_property(ofnode_path("/chosen"), "kaslr-seed")) {
> + log_debug("No initrd address present, skip as we might not be chainloaded\n");
> + return;
> + }
> +
> + if (IS_ENABLED(CONFIG_SCSI)) {
> + /* Scan for SCSI devices */
> + ret = scsi_scan(false);
> + if (ret) {
> + debug("Failed to scan SCSI devices: %d\n", ret);
> + return;
> + }
> + }
> +
> + uclass_foreach_dev_probe(UCLASS_BLK, dev) {
> + if (device_get_uclass_id(dev) != UCLASS_BLK)
> + continue;
> +
> + desc = dev_get_uclass_plat(dev);
> + if (!desc || desc->part_type == PART_TYPE_UNKNOWN)
> + continue;
> + devnum = desc->devnum;
> + partnum = find_boot_partition(partname, desc,
> + name);
> + if (partnum >= 0)
> + break;
> + }
> +
> + if (partnum < 0) {
> + log_err("Failed to find boot partition\n");
> + return;
> + }
> +
> + switch (desc->uclass_id) {
> + case UCLASS_SCSI:
> + snprintf(dfu_string, 32, "scsi %d=u-boot-bin part %d", devnum, partnum);
> + break;
> + case UCLASS_MMC:
> + snprintf(dfu_string, 32, "mmc 0=u-boot-bin part %d %d", devnum, partnum);
> + break;
> + default:
> + debug("Unsupported storage uclass: %d\n", desc->uclass_id);
> + return;
> + }
> + log_debug("boot partition is %s, DFU string: '%s'\n", name, dfu_string);
> +
> + update_info.dfu_string = dfu_string;
> +}
> diff --git a/arch/arm/mach-snapdragon/qcom-priv.h b/arch/arm/mach-snapdragon/qcom-priv.h
> index 0a7ed5eff8b8..74d39197b89f 100644
> --- a/arch/arm/mach-snapdragon/qcom-priv.h
> +++ b/arch/arm/mach-snapdragon/qcom-priv.h
> @@ -2,8 +2,14 @@
>
> #ifndef __QCOM_PRIV_H__
> #define __QCOM_PRIV_H__
>
> +#if IS_ENABLED(CONFIG_EFI_HAVE_CAPSULE_SUPPORT)
> +void qcom_configure_capsule_updates(void);
> +#else
> +void qcom_configure_capsule_updates(void) {}
> +#endif /* EFI_HAVE_CAPSULE_SUPPORT */
> +
> #if CONFIG_IS_ENABLED(OF_LIVE)
> /**
> * qcom_of_fixup_nodes() - Fixup Qualcomm DT nodes
> *
> diff --git a/include/configs/qcom.h b/include/configs/qcom.h
> index e50b3bce5cdd..b6b5acffe5e4 100644
> --- a/include/configs/qcom.h
> +++ b/include/configs/qcom.h
> @@ -10,8 +10,13 @@
> #define __CONFIGS_SNAPDRAGON_H
>
> #define CFG_SYS_BAUDRATE_TABLE { 115200, 230400, 460800, 921600 }
>
> +// 2a5aa852-b856-4d97-baa9-5c5f4421551f
> +#define QUALCOMM_UBOOT_BOOT_IMAGE_GUID \
> + EFI_GUID(0x2a5aa852, 0xb856, 0x4d97, 0xba, 0xa9, \
> + 0x5c, 0x5f, 0x44, 0x21, 0x55, 0x1f)
> +
> /* Load addressed are calculated during board_late_init(). See arm/mach-snapdragon/board.c */
> #define CFG_EXTRA_ENV_SETTINGS \
> "stdin=serial,button-kbd\0" \
> "stdout=serial,vidconsole\0" \
>
> --
> 2.45.0
>
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v3 0/8] qcom: implement capsule updates
2024-06-03 12:49 [PATCH v3 0/8] qcom: implement capsule updates Caleb Connolly
` (7 preceding siblings ...)
2024-06-03 12:49 ` [PATCH v3 8/8] qcom_defconfig: enable capsule update support Caleb Connolly
@ 2024-06-05 5:31 ` Sumit Garg
2024-06-05 12:42 ` Caleb Connolly
8 siblings, 1 reply; 18+ messages in thread
From: Sumit Garg @ 2024-06-05 5:31 UTC (permalink / raw)
To: Caleb Connolly
Cc: Tom Rini, Simon Glass, Lukasz Majewski, Mattijs Korpershoek,
Neil Armstrong, Ilias Apalodimas, u-boot, u-boot-qcom
Hi Caleb,
On Mon, 3 Jun 2024 at 18:19, Caleb Connolly <caleb.connolly@linaro.org> wrote:
>
> Hook up support for capsule updates loaded from disk on Qualcomm
> platforms.
>
> Most Qualcomm devices have an A/B partition layout, with most partitions
> duplicated. The metadata on which slot is active is stored in the GPT
> headers in the vendor-specific attribute bits of each partition.
It's good to see capsule updates support coming up for Qualcomm
platforms. AFAICS, with this series we only update U-Boot on the
current active partition. IOW, real A/B support is still not
supported. Do you think it is possible for U-Boot to update metadata
in GPT headers and for proprietary bootloaders to pick up the U-Boot
from the updated partition?
-Sumit
>
> Add support for reading this attributes via the disk_partition struct
> and using them to determine which boot partition U-Boot is flashed to
> and generate the appropriate DFU string.
>
> This logic is gated behind a check to ensure that U-Boot is actually
> being chainloaded and not run via some other mechanism.
>
> SCSI support for most Qualcomm platforms is not yet enabled upstream,
> but will follow in future patches.
>
> This series enables capsule updates on the RB2, however [1] is required
> for it to work properly (as otherwise MMC won't be available).
>
> [1]: https://lore.kernel.org/u-boot/20240527-b4-clk-stub-v2-0-29013855e343@linaro.org/
>
> To: Tom Rini <trini@konsulko.com>
> To: Simon Glass <sjg@chromium.org>
> To: Lukasz Majewski <lukma@denx.de>
> To: Mattijs Korpershoek <mkorpershoek@baylibre.com>
> To: Caleb Connolly <caleb.connolly@linaro.org>
> To: Neil Armstrong <neil.armstrong@linaro.org>
> To: Sumit Garg <sumit.garg@linaro.org>
> Cc: Ilias Apalodimas <ilias.apalodimas@linaro.org>
> Cc: u-boot@lists.denx.de
> Cc: u-boot-qcom@groups.io
>
> Changes in v3:
> - Address comments in scsi dfu support
> - enable CONFIG_DFU_SCSI for qcom
> - Link to v2: https://lore.kernel.org/r/20240527-b4-qcom-capsule-updates-v2-0-47583d7ad428@linaro.org
>
> Changes in v2:
> - Add qcom capsule update support patches
> - Link to v1: https://lore.kernel.org/r/20240409-b4-dfu-scsi-v1-0-3e1441a60376@linaro.org
>
> ---
> Caleb Connolly (8):
> dfu: add scsi backend
> disk: expose partition type flags
> mmc: msm_sdhci: work around a bug when writing
> mach-snapdragon: implement capsule update support
> qcom_defconfig: savedefconfig
> mach-snapdragon: use SYSRESET_PSCI
> mach-snapdragon: bump up heap size
> qcom_defconfig: enable capsule update support
>
> arch/arm/Kconfig | 2 +
> arch/arm/mach-snapdragon/Kconfig | 3 +
> arch/arm/mach-snapdragon/Makefile | 1 +
> arch/arm/mach-snapdragon/board.c | 8 +-
> arch/arm/mach-snapdragon/capsule_update.c | 147 ++++++++++
> arch/arm/mach-snapdragon/qcom-priv.h | 6 +
> configs/qcom_defconfig | 19 +-
> disk/part_efi.c | 1 +
> doc/usage/dfu.rst | 32 +++
> drivers/dfu/Kconfig | 7 +
> drivers/dfu/Makefile | 1 +
> drivers/dfu/dfu.c | 5 +-
> drivers/dfu/dfu_scsi.c | 435 ++++++++++++++++++++++++++++++
> drivers/mmc/msm_sdhci.c | 7 +
> include/configs/qcom.h | 5 +
> include/dfu.h | 26 ++
> include/part.h | 1 +
> 17 files changed, 695 insertions(+), 11 deletions(-)
> ---
> change-id: 20240523-b4-qcom-capsule-updates-ea2e4f8f0ff0
> base-commit: 5d8881a0801241d68701e8644d495f1d535506f0
>
> // Caleb (they/them)
>
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v3 4/8] mach-snapdragon: implement capsule update support
2024-06-05 5:21 ` Sumit Garg
@ 2024-06-05 12:33 ` Caleb Connolly
2024-06-06 7:15 ` Sumit Garg
0 siblings, 1 reply; 18+ messages in thread
From: Caleb Connolly @ 2024-06-05 12:33 UTC (permalink / raw)
To: Sumit Garg
Cc: Tom Rini, Simon Glass, Lukasz Majewski, Mattijs Korpershoek,
Neil Armstrong, Ilias Apalodimas, u-boot, u-boot-qcom
Hi Sumit,
>> +/**
>> + * qcom_configure_capsule_updates() - Configure the DFU string for capsule updates
>> + *
>> + * U-Boot is flashed to the boot partition on Qualcomm boards. In most cases there
>> + * are two boot partitions, boot_a and boot_b. As we don't currently support doing
>> + * full A/B updates, we only support updating the currently active boot partition.
>> + *
>> + * So we need to find the current slot suffix and the associated boot partition.
>> + * We do this by looking for the boot partition that has the 'active' flag set
>> + * in the GPT partition vendor attribute bits.
>> + */
>> +void qcom_configure_capsule_updates(void)
>> +{
>> + struct blk_desc *desc;
>> + int ret = 0, partnum = -1, devnum;
>> + static char dfu_string[32] = { 0 };
>> + char name[32]; /* GPT partition name */
>> + char *partname = "boot";
>> + struct udevice *dev = NULL;
>> +
>> + /*
>> + * There is currently no good way to check how U-Boot is booting, but we have
>> + * a few hueristics, like here checking if our DTB has a kaslr-seed specified
>> + * will tell us if we were chainloaded by another bootloader.
>> + * FIXME: we should do this check once and use some proper API to expose the data.
>
> If U-Boot is built with LINUX_KERNEL_IMAGE_HEADER enabled then we
> should know that U-Boot is built as a replacement of Linux kernel and
> hence chainloaded. Isn't that what you need here?
Not necessarily, you can build with LINUX_KERNEL_IMAGE_HEADER and then
pack U-Boot into XBL or flash it to hyp and it will still run (the
kernel header is specifically written to behave like a nop slide). So we
can't rely on this.
>
> -Sumit
>
Kind regards,
--
// Caleb (they/them)
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v3 0/8] qcom: implement capsule updates
2024-06-05 5:31 ` [PATCH v3 0/8] qcom: implement capsule updates Sumit Garg
@ 2024-06-05 12:42 ` Caleb Connolly
2024-06-06 7:34 ` Sumit Garg
0 siblings, 1 reply; 18+ messages in thread
From: Caleb Connolly @ 2024-06-05 12:42 UTC (permalink / raw)
To: Sumit Garg
Cc: Tom Rini, Simon Glass, Lukasz Majewski, Mattijs Korpershoek,
Neil Armstrong, Ilias Apalodimas, u-boot, u-boot-qcom
Hi Sumit,
On 05/06/2024 07:31, Sumit Garg wrote:
> Hi Caleb,
>
> On Mon, 3 Jun 2024 at 18:19, Caleb Connolly <caleb.connolly@linaro.org> wrote:
>>
>> Hook up support for capsule updates loaded from disk on Qualcomm
>> platforms.
>>
>> Most Qualcomm devices have an A/B partition layout, with most partitions
>> duplicated. The metadata on which slot is active is stored in the GPT
>> headers in the vendor-specific attribute bits of each partition.
>
> It's good to see capsule updates support coming up for Qualcomm
> platforms. AFAICS, with this series we only update U-Boot on the
> current active partition. IOW, real A/B support is still not
> supported. Do you think it is possible for U-Boot to update metadata
> in GPT headers and for proprietary bootloaders to pick up the U-Boot
> from the updated partition?
Yes this would be possible, I have some WIP patches to let us modify the
slot attribute bits and write back the header.
The reason I haven't implement A/B is because we don't support it from
the OS level on any of the boards I work on. We often patch ABL to
disable or skip the slot logic and flash a partition table without
slots. It also unlocks a bunch of additional complexity...
This isn't super high on my todo list but I'd be happy to help if
someone wants to enable this functionality. We'd need:
1. Upstream support for modifying the GPT (see my PoC at [1] and [2]).
2. Logic to configure flashing the active or inactive slot
This logic would have to run after the capsule update, I don't know if
there is currently a way to add a callback after the update.
If we enable updating other images (like XBL, hyp, tz, etc), we would
need to either agree that a capsule update would have to update ALL
partitions, or implement logic to copy over partitions that weren't
flashed to the other slot.
[1]:
https://git.codelinaro.org/linaro/qcomlt/u-boot/-/commit/34d3de6f79550527746303e0bf6337fa37e31fe5
[2]:
https://git.codelinaro.org/linaro/qcomlt/u-boot/-/commit/656d9e816bef85e586460a999cc7874255be9f1d
>
> -Sumit
>
>>
>> Add support for reading this attributes via the disk_partition struct
>> and using them to determine which boot partition U-Boot is flashed to
>> and generate the appropriate DFU string.
>>
>> This logic is gated behind a check to ensure that U-Boot is actually
>> being chainloaded and not run via some other mechanism.
>>
>> SCSI support for most Qualcomm platforms is not yet enabled upstream,
>> but will follow in future patches.
>>
>> This series enables capsule updates on the RB2, however [1] is required
>> for it to work properly (as otherwise MMC won't be available).
>>
>> [1]: https://lore.kernel.org/u-boot/20240527-b4-clk-stub-v2-0-29013855e343@linaro.org/
>>
>> To: Tom Rini <trini@konsulko.com>
>> To: Simon Glass <sjg@chromium.org>
>> To: Lukasz Majewski <lukma@denx.de>
>> To: Mattijs Korpershoek <mkorpershoek@baylibre.com>
>> To: Caleb Connolly <caleb.connolly@linaro.org>
>> To: Neil Armstrong <neil.armstrong@linaro.org>
>> To: Sumit Garg <sumit.garg@linaro.org>
>> Cc: Ilias Apalodimas <ilias.apalodimas@linaro.org>
>> Cc: u-boot@lists.denx.de
>> Cc: u-boot-qcom@groups.io
>>
>> Changes in v3:
>> - Address comments in scsi dfu support
>> - enable CONFIG_DFU_SCSI for qcom
>> - Link to v2: https://lore.kernel.org/r/20240527-b4-qcom-capsule-updates-v2-0-47583d7ad428@linaro.org
>>
>> Changes in v2:
>> - Add qcom capsule update support patches
>> - Link to v1: https://lore.kernel.org/r/20240409-b4-dfu-scsi-v1-0-3e1441a60376@linaro.org
>>
>> ---
>> Caleb Connolly (8):
>> dfu: add scsi backend
>> disk: expose partition type flags
>> mmc: msm_sdhci: work around a bug when writing
>> mach-snapdragon: implement capsule update support
>> qcom_defconfig: savedefconfig
>> mach-snapdragon: use SYSRESET_PSCI
>> mach-snapdragon: bump up heap size
>> qcom_defconfig: enable capsule update support
>>
>> arch/arm/Kconfig | 2 +
>> arch/arm/mach-snapdragon/Kconfig | 3 +
>> arch/arm/mach-snapdragon/Makefile | 1 +
>> arch/arm/mach-snapdragon/board.c | 8 +-
>> arch/arm/mach-snapdragon/capsule_update.c | 147 ++++++++++
>> arch/arm/mach-snapdragon/qcom-priv.h | 6 +
>> configs/qcom_defconfig | 19 +-
>> disk/part_efi.c | 1 +
>> doc/usage/dfu.rst | 32 +++
>> drivers/dfu/Kconfig | 7 +
>> drivers/dfu/Makefile | 1 +
>> drivers/dfu/dfu.c | 5 +-
>> drivers/dfu/dfu_scsi.c | 435 ++++++++++++++++++++++++++++++
>> drivers/mmc/msm_sdhci.c | 7 +
>> include/configs/qcom.h | 5 +
>> include/dfu.h | 26 ++
>> include/part.h | 1 +
>> 17 files changed, 695 insertions(+), 11 deletions(-)
>> ---
>> change-id: 20240523-b4-qcom-capsule-updates-ea2e4f8f0ff0
>> base-commit: 5d8881a0801241d68701e8644d495f1d535506f0
>>
>> // Caleb (they/them)
>>
--
// Caleb (they/them)
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v3 4/8] mach-snapdragon: implement capsule update support
2024-06-05 12:33 ` Caleb Connolly
@ 2024-06-06 7:15 ` Sumit Garg
0 siblings, 0 replies; 18+ messages in thread
From: Sumit Garg @ 2024-06-06 7:15 UTC (permalink / raw)
To: Caleb Connolly
Cc: Tom Rini, Simon Glass, Lukasz Majewski, Mattijs Korpershoek,
Neil Armstrong, Ilias Apalodimas, u-boot, u-boot-qcom
On Wed, 5 Jun 2024 at 18:03, Caleb Connolly <caleb.connolly@linaro.org> wrote:
>
> Hi Sumit,
> >> +/**
> >> + * qcom_configure_capsule_updates() - Configure the DFU string for capsule updates
> >> + *
> >> + * U-Boot is flashed to the boot partition on Qualcomm boards. In most cases there
> >> + * are two boot partitions, boot_a and boot_b. As we don't currently support doing
> >> + * full A/B updates, we only support updating the currently active boot partition.
> >> + *
> >> + * So we need to find the current slot suffix and the associated boot partition.
> >> + * We do this by looking for the boot partition that has the 'active' flag set
> >> + * in the GPT partition vendor attribute bits.
> >> + */
> >> +void qcom_configure_capsule_updates(void)
> >> +{
> >> + struct blk_desc *desc;
> >> + int ret = 0, partnum = -1, devnum;
> >> + static char dfu_string[32] = { 0 };
> >> + char name[32]; /* GPT partition name */
> >> + char *partname = "boot";
> >> + struct udevice *dev = NULL;
> >> +
> >> + /*
> >> + * There is currently no good way to check how U-Boot is booting, but we have
> >> + * a few hueristics, like here checking if our DTB has a kaslr-seed specified
> >> + * will tell us if we were chainloaded by another bootloader.
> >> + * FIXME: we should do this check once and use some proper API to expose the data.
> >
> > If U-Boot is built with LINUX_KERNEL_IMAGE_HEADER enabled then we
> > should know that U-Boot is built as a replacement of Linux kernel and
> > hence chainloaded. Isn't that what you need here?
>
> Not necessarily, you can build with LINUX_KERNEL_IMAGE_HEADER and then
> pack U-Boot into XBL or flash it to hyp and it will still run (the
> kernel header is specifically written to behave like a nop slide). So we
> can't rely on this.
> >
Yeah you can build it in whatever form downstream and run as a NOP too
but I don't think we support any such combination in upstream U-Boot,
right? We should let people know that LINUX_KERNEL_IMAGE_HEADER should
only be enabled if the U-Boot image is flashed into the boot partition
as a replacement for Linux kernel image. BTW, isn't that the real
meaning for that config option? IMHO, the current DT check you have
implemented is implicit and I am unsure if we can reliably depend upon
it.
-Sumit
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v3 0/8] qcom: implement capsule updates
2024-06-05 12:42 ` Caleb Connolly
@ 2024-06-06 7:34 ` Sumit Garg
0 siblings, 0 replies; 18+ messages in thread
From: Sumit Garg @ 2024-06-06 7:34 UTC (permalink / raw)
To: Caleb Connolly
Cc: Tom Rini, Simon Glass, Lukasz Majewski, Mattijs Korpershoek,
Neil Armstrong, Ilias Apalodimas, u-boot, u-boot-qcom
On Wed, 5 Jun 2024 at 18:12, Caleb Connolly <caleb.connolly@linaro.org> wrote:
>
> Hi Sumit,
>
> On 05/06/2024 07:31, Sumit Garg wrote:
> > Hi Caleb,
> >
> > On Mon, 3 Jun 2024 at 18:19, Caleb Connolly <caleb.connolly@linaro.org> wrote:
> >>
> >> Hook up support for capsule updates loaded from disk on Qualcomm
> >> platforms.
> >>
> >> Most Qualcomm devices have an A/B partition layout, with most partitions
> >> duplicated. The metadata on which slot is active is stored in the GPT
> >> headers in the vendor-specific attribute bits of each partition.
> >
> > It's good to see capsule updates support coming up for Qualcomm
> > platforms. AFAICS, with this series we only update U-Boot on the
> > current active partition. IOW, real A/B support is still not
> > supported. Do you think it is possible for U-Boot to update metadata
> > in GPT headers and for proprietary bootloaders to pick up the U-Boot
> > from the updated partition?
>
> Yes this would be possible, I have some WIP patches to let us modify the
> slot attribute bits and write back the header.
Nice to hear that possibility.
>
> The reason I haven't implement A/B is because we don't support it from
> the OS level on any of the boards I work on. We often patch ABL to
> disable or skip the slot logic and flash a partition table without
> slots. It also unlocks a bunch of additional complexity...
Please have a look at an alternative FWU Multi Bank Updates [1].
AFAIK, the UEFI capsules updates feature from the OS point of view
remains transparent. It's more about how those capsules are
interpreted with the logic to update the inactive partition and
metadata such that subsequent boot uses the updated firmware.
[1] https://docs.u-boot.org/en/latest/develop/uefi/fwu_updates.html
>
> This isn't super high on my todo list but I'd be happy to help if
> someone wants to enable this functionality. We'd need:
>
> 1. Upstream support for modifying the GPT (see my PoC at [1] and [2]).
> 2. Logic to configure flashing the active or inactive slot
>
> This logic would have to run after the capsule update, I don't know if
> there is currently a way to add a callback after the update.
>
> If we enable updating other images (like XBL, hyp, tz, etc), we would
> need to either agree that a capsule update would have to update ALL
> partitions, or implement logic to copy over partitions that weren't
> flashed to the other slot.
I would be interested to see how we can plug Qcom specific pieces
underneath in order to have multi bank updates. However, this patchset
is still usable in its current form. We can later add the real A/B
functionality.
Apart from patch #4 where we are still discussing the finer details,
feel free to add:
Acked-by: Sumit Garg <sumit.garg@linaro.org>
-Sumit
>
> [1]:
> https://git.codelinaro.org/linaro/qcomlt/u-boot/-/commit/34d3de6f79550527746303e0bf6337fa37e31fe5
>
> [2]:
> https://git.codelinaro.org/linaro/qcomlt/u-boot/-/commit/656d9e816bef85e586460a999cc7874255be9f1d
^ permalink raw reply [flat|nested] 18+ messages in thread
end of thread, other threads:[~2024-06-06 7:34 UTC | newest]
Thread overview: 18+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-06-03 12:49 [PATCH v3 0/8] qcom: implement capsule updates Caleb Connolly
2024-06-03 12:49 ` [PATCH v3 1/8] dfu: add scsi backend Caleb Connolly
2024-06-04 7:01 ` Mattijs Korpershoek
2024-06-03 12:49 ` [PATCH v3 2/8] disk: expose partition type flags Caleb Connolly
2024-06-03 12:49 ` [PATCH v3 3/8] mmc: msm_sdhci: work around a bug when writing Caleb Connolly
2024-06-03 12:49 ` [PATCH v3 4/8] mach-snapdragon: implement capsule update support Caleb Connolly
2024-06-03 13:38 ` Ilias Apalodimas
2024-06-05 5:21 ` Sumit Garg
2024-06-05 12:33 ` Caleb Connolly
2024-06-06 7:15 ` Sumit Garg
2024-06-03 12:49 ` [PATCH v3 5/8] qcom_defconfig: savedefconfig Caleb Connolly
2024-06-03 12:49 ` [PATCH v3 6/8] mach-snapdragon: use SYSRESET_PSCI Caleb Connolly
2024-06-03 12:49 ` [PATCH v3 7/8] mach-snapdragon: bump up heap size Caleb Connolly
2024-06-03 12:49 ` [PATCH v3 8/8] qcom_defconfig: enable capsule update support Caleb Connolly
2024-06-03 13:48 ` Ilias Apalodimas
2024-06-05 5:31 ` [PATCH v3 0/8] qcom: implement capsule updates Sumit Garg
2024-06-05 12:42 ` Caleb Connolly
2024-06-06 7:34 ` Sumit Garg
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox