From patchwork Sat Oct 12 13:57:17 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Caleb Connolly X-Patchwork-Id: 1996408 X-Patchwork-Delegate: caleb.connolly@linaro.org Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.a=rsa-sha256 header.s=google header.b=BqGhjQWF; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=85.214.62.61; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=patchwork.ozlabs.org) Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1)) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4XQlSH67ndz1xt1 for ; Sun, 13 Oct 2024 00:57:51 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 8B60588DBA; Sat, 12 Oct 2024 15:57:31 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="BqGhjQWF"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 60C8D889C3; Sat, 12 Oct 2024 15:57:30 +0200 (CEST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_BLOCKED, SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.2 Received: from mail-ej1-x629.google.com (mail-ej1-x629.google.com [IPv6:2a00:1450:4864:20::629]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id CB93288B9E for ; Sat, 12 Oct 2024 15:57:26 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=caleb.connolly@linaro.org Received: by mail-ej1-x629.google.com with SMTP id a640c23a62f3a-a99f646ff1bso34028866b.2 for ; Sat, 12 Oct 2024 06:57:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1728741446; x=1729346246; darn=lists.denx.de; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=BiYqs1PEfHuFWJzNhVKmaBnWkccMIOG0oVh5d57U/wA=; b=BqGhjQWFgRSoKLi7IumbQNRNfzcCiK7FG8LhKpn5oU0/9yPo5wY19xWAkHE7aK4grR HsfE0n4LoXCZGaZzvdbF2ZruQvPwNMJ3ih61h9lAejjEBElHFNAVu1kNQGRJTAFQWXZf Tnf8nTspHSK8KMGccEhCZhsDbfctOIpvhSahJZnNlLSj6WqxmqwSdEM8+8Y0yMOstpFc qUiObbyGxlFuEJLp8OstSmQv8fRFKLivCVqUhTlATzU9xws3YXLOM/wYdCj75mQXFy1b 4sRsvxFkaMWDyStEpQ92XKiDjeWBGtA3tBvAXrh6GlnSg+FJE/J8ooNP2Y6fZx0e96WK gUfA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1728741446; x=1729346246; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=BiYqs1PEfHuFWJzNhVKmaBnWkccMIOG0oVh5d57U/wA=; b=Q9Jvd3Bf4FRiYnXP3sRIlDlP2qgEE8WMyq75dAbDOsWFQOFBdJ1QQvp/thQAJLXwgZ tlLuYn3MEWBhQ5KVN/3qFGMN8NNdQ9vYb5DWTKoI/EL1PT1iP2u12dd6b8rln0oYHBue 8DFu+DXQElfXCDEFka1cQjdnoLNCJOMw/Mv/4FfIGBC5+28QbZGtgTDSdl+o3KmHMs7l whOVnjJ+XfYMOXlh39NKJ02vg/k/ZhMqakLV+4H8VqQdyaeOAboZLt0C/6JpL6S0P9hd C+CLpRhN/si8B/EvZV0YbJxj+h8M3Wdnq+gU4vk/945d199uWAZh7wVI3lGdK7JxwC9w 2V9g== X-Forwarded-Encrypted: i=1; AJvYcCUFjlp5h60NItC+1Dm7ByoosYdEDAoBumCgla1EZcrUTDc2TX2I74UGvz4kMmNscxNkSdW5vjc=@lists.denx.de X-Gm-Message-State: AOJu0YxhEgMABNHD85D3gC0Es7Qi3/8T+2I7Q4uzJ8v+mmjcWdqQR7XX UZR9lATOVBP9VBTUb1XVcXIg9Hht8ut3S5AlwwXPGuHVJG0v18dKYt63zn8gKBM= X-Google-Smtp-Source: AGHT+IFiyespSMkKoRfE+A8guFtPQckwAsl4e4LC6BRin+dmGHxMsb2pmr1Q7E+bowuC+WPZlVE+3g== X-Received: by 2002:a17:907:9611:b0:a99:36ab:d843 with SMTP id a640c23a62f3a-a99b940ff26mr564428666b.38.1728741446160; Sat, 12 Oct 2024 06:57:26 -0700 (PDT) Received: from cymric.local ([2a02:8109:888d:ff00::2]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-a99a7f2c1f4sm324955966b.87.2024.10.12.06.57.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 12 Oct 2024 06:57:25 -0700 (PDT) From: Caleb Connolly Date: Sat, 12 Oct 2024 15:57:17 +0200 Subject: [PATCH v4 1/4] dfu: add scsi backend MIME-Version: 1.0 Message-Id: <20241012-b4-qcom-capsule-updates-v4-1-abd05f15255f@linaro.org> References: <20241012-b4-qcom-capsule-updates-v4-0-abd05f15255f@linaro.org> In-Reply-To: <20241012-b4-qcom-capsule-updates-v4-0-abd05f15255f@linaro.org> To: Tom Rini , Simon Glass , Lukasz Majewski , Mattijs Korpershoek , Caleb Connolly , Neil Armstrong , Sumit Garg Cc: Ilias Apalodimas , u-boot@lists.denx.de, u-boot-qcom@groups.io X-Mailer: b4 0.14-dev X-Developer-Signature: v=1; a=openpgp-sha256; l=17807; i=caleb.connolly@linaro.org; h=from:subject:message-id; bh=Z/0pmjU+qp2YFxdWKXxj576hzCUmnvSAqU2E/NnF564=; b=owEBbQKS/ZANAwAIAQWDMSsZX2S2AcsmYgBnCoBDNtW/H0EVb6mabOpkEDdxzQ1eQjyudhJcT yRToA/TLumJAjMEAAEIAB0WIQS2UaFGPGq+0GkMVc0FgzErGV9ktgUCZwqAQwAKCRAFgzErGV9k thW/EACVIba3TzpBp+C7n5/xnHJH88XIbyOWfBBFpcQX8jp6jX6CdPqKXvu5iJTkgLHgSTCXg3Z xWIymc0e73Tw8HLwIjIjLiAwuiZ5QhONnZ1hvymFDOlDusE/DWy8YxLHolBk7uT7iddCzHUksM2 rHfnj57hdSVGM6OhuZJ3Dx4UeYM6LcNzMMi3Z+nkdwzXP4HdQiE2FblFoSzJjlMyQMdK052jva5 i+lQv/TtbayHEr+0sIPza+mvUftZtLELWTNOBdlJPG2hveYds3z/rY9sg7NnZKYuS+p5PovR5Bu kIwyR1GhoCK/wfkY600ccQRbNmBsOJpsDrWWwpdRCJqcYfCp+0XsoCxdjaTz0KlyxligI52qPZu Fe8dJolYORF2kFEe+TTLQ7UyOd/h194cKK3sDu4XpWt9WwSIeg8gn7Kruow8X0vjVpP9AIn1w0A 6Qt2+IW2o/sXeCR/NOuODOIbBJGaoxOw+DIZA2Kg5xSG9lmeCX85p8QEOC3NEYLfjhdkJKCAlUe ecUn1eqHAVv52LErj1SMOEumc+PgrApkfbnMDV8p0LbEYoU3wrzKP8ICodX1F6jHtkOefFIoQiu /oVKiFlopo1RjarI6AHxLX2LTGqyzXLk68R33LuhCmldWoiAwrzZ6enbQgWR++ZJOM/pgP5mRYc NWXAqB+TDTy7VOw== X-Developer-Key: i=caleb.connolly@linaro.org; a=openpgp; fpr=83B24DA7FE145076BC38BB250CD904EB673A7C47 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.39 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.103.8 at phobos.denx.de X-Virus-Status: Clean 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 Reviewed-by: Mattijs Korpershoek Acked-by: Mattijs Korpershoek --- 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 | 27 +++ 6 files changed, 506 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 + + each element in *dfu_alt_info* being + + * raw raw access to SCSI LUN + * part raw access to partition + * fat file in FAT partition + * ext4 file in EXT4 partition + * skip 0 0 ignore flashed data + * 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 @@ -277,8 +308,9 @@ alternate list separated by '&' with the same format for each :: mmc =;....; nand =;....; ram =;....; + scsi =;....; sf =;....; mtd =;....; virt =;....; diff --git a/drivers/dfu/Kconfig b/drivers/dfu/Kconfig index aadd7e8cf7f0..3f1a8c4617cd 100644 --- a/drivers/dfu/Kconfig +++ b/drivers/dfu/Kconfig @@ -87,8 +87,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 7a4d7ba2a7ff..756569217bbb 100644 --- a/drivers/dfu/dfu.c +++ b/drivers/dfu/dfu.c @@ -563,8 +563,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; @@ -659,9 +662,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 + * Copyright (C) 2024 Linaro Ltd. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +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 e25588c33cb8..12f9dfcdfcdf 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,21 @@ 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 #define DFU_NAME_SIZE 32 @@ -125,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); @@ -515,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; extern bool dfu_alt_info_changed; #if CONFIG_IS_ENABLED(DFU_WRITE_ALT) From patchwork Sat Oct 12 13:57:18 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Caleb Connolly X-Patchwork-Id: 1996407 X-Patchwork-Delegate: caleb.connolly@linaro.org Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.a=rsa-sha256 header.s=google header.b=qWUsvUyb; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=patchwork.ozlabs.org) Received: from phobos.denx.de (phobos.denx.de [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1)) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4XQlS849tkz1xt1 for ; Sun, 13 Oct 2024 00:57:44 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 2C5A188C4D; Sat, 12 Oct 2024 15:57:31 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="qWUsvUyb"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 46C1B889C3; Sat, 12 Oct 2024 15:57:30 +0200 (CEST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_BLOCKED, SPF_HELO_NONE,SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.2 Received: from mail-ej1-x629.google.com (mail-ej1-x629.google.com [IPv6:2a00:1450:4864:20::629]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 2C85D88A3C for ; Sat, 12 Oct 2024 15:57:28 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=caleb.connolly@linaro.org Received: by mail-ej1-x629.google.com with SMTP id a640c23a62f3a-a99543ab209so417221866b.2 for ; Sat, 12 Oct 2024 06:57:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1728741447; x=1729346247; darn=lists.denx.de; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=gBGmf1rprmzYQLqRsryt+Ss4X3Z5KJ+lnCXbL7jk2xs=; b=qWUsvUybHjNybH30+YcThf1ugkyeyhkTgZutEdVTu4bPNxNb5XfBq9E66xFO5J1ege aamily56p5DMKJNm1ddfAUWgoSnjsAp9C0lct0b4+7P8xJDpoI+iza/vdOWIV9j/poCd VMmCAEPqBOEUhiJKWJ5191dG8V3SvFxmLybNhoIFWaYrlzBWqUCGOiw+GrfPXj8S4R6z nX+EasKorvHBuXaYEqahC6eSOcLufrAdkgLlL/2Xw1a28oKB+726Sgaf76gkMKBx8qj9 lb99Y2bbwOOQw3OPC0Ov3TAhNJPJBCyGOO7koRKLgYwexYm+Y2VOQfvbbynVX1WO73VT QC7Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1728741447; x=1729346247; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=gBGmf1rprmzYQLqRsryt+Ss4X3Z5KJ+lnCXbL7jk2xs=; b=FWAUFA63XyV7rUohpmYbUit3yI/ucS70WqTzAM0Vu9vjiU6sSc/2Pu1NrZzBAX4kOr kQLrKiHxorg1VHKfh4YG+rMMi7Tj/np/X3jtotjs9vz3oJ3xqrm0Ik7X0EWdnNGR5u3S CoBuMD0kDHspFSojEmGVuDaJTDwLnOlkN6TPu5MZLfd124KTZ68m/mjWDcy2ZOaQk/+y 4Mk7Wan+zPQ/ZVaUScIdlvm+bV5dCR7pCEhb6Z0h5Bm74JUJaaW1d0VqC9EOeaUnDsHx ye5DCdioxpSBZ2EkBjwRRKwEq28ECnrCg1O5as4+wMuTupX95TCN0pnB08Pr39f0jWKL 0/TQ== X-Forwarded-Encrypted: i=1; AJvYcCXP0aZIVQvAXJLYpKxm0tDmdihwmtW7a/8Dll/kvNxdCrzAV/+rx/bUWZWFDn3ZyFGASVkXpGk=@lists.denx.de X-Gm-Message-State: AOJu0Yx/ql0wTibOdw1LKOYYVXlNxV7zv07qjj17fH6Ypc4FnBuee0su 7C3dxFtx/rIRLwWU1xAQA7mL6gvni9tmtQyqu4z1XrFB8bseivYLvt7iVjIWku4= X-Google-Smtp-Source: AGHT+IEmNQtlAIH4mdMnbyd2az/Xnptjv118W/hipnynZ1fU4ltbjsXtkLU/svd9PFOFLyiOfKwQ0w== X-Received: by 2002:a17:907:7da1:b0:a99:3ac1:2997 with SMTP id a640c23a62f3a-a99b938c316mr503407666b.25.1728741447273; Sat, 12 Oct 2024 06:57:27 -0700 (PDT) Received: from cymric.local ([2a02:8109:888d:ff00::2]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-a99a7f2c1f4sm324955966b.87.2024.10.12.06.57.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 12 Oct 2024 06:57:26 -0700 (PDT) From: Caleb Connolly Date: Sat, 12 Oct 2024 15:57:18 +0200 Subject: [PATCH v4 2/4] disk: expose partition type flags MIME-Version: 1.0 Message-Id: <20241012-b4-qcom-capsule-updates-v4-2-abd05f15255f@linaro.org> References: <20241012-b4-qcom-capsule-updates-v4-0-abd05f15255f@linaro.org> In-Reply-To: <20241012-b4-qcom-capsule-updates-v4-0-abd05f15255f@linaro.org> To: Tom Rini , Simon Glass , Lukasz Majewski , Mattijs Korpershoek , Caleb Connolly , Neil Armstrong , Sumit Garg Cc: Ilias Apalodimas , u-boot@lists.denx.de, u-boot-qcom@groups.io X-Mailer: b4 0.14-dev X-Developer-Signature: v=1; a=openpgp-sha256; l=1946; i=caleb.connolly@linaro.org; h=from:subject:message-id; bh=8HehlziPOEMlWVgeQSjbATHEoHO/WdJXdIHVz23d518=; b=owEBbQKS/ZANAwAIAQWDMSsZX2S2AcsmYgBnCoBDlRSI8mGUjepDpR+Sd8tL9rH54x9YB5T8i vEw6bbUYhCJAjMEAAEIAB0WIQS2UaFGPGq+0GkMVc0FgzErGV9ktgUCZwqAQwAKCRAFgzErGV9k tgtRD/4z7Zjf66999uTGXE59YR7Dr/JFQesnaING2RNCzF0A2jWhyTSCiKmwbB/WHFQ+Z9ghc/x Lkbit5GRjLu9OVGTqDeEmd3fCddF3o38KTN4QOjNIcNyXt5jZF5UKsHFkZ67P0NVz8we2bP80Dw v9AL5WWCRnFJM3a8OSCgIl4GK/m8lnCvJ8iF7tglGZVkwDU2zo9hOrvoKX4PCLb2oioXqw6b56M UD1doQTaSlW7akwAmZPH7/+I3BDvmI73i0a+qcJdT2bCABpsouV8OJj+kue9MJMvI7XinGozeTp 8WRjYqRtDcPcwdcoIJFRc/4o5JEBFESUBwcfSjokhEjtfKXDQSYZzMo1KQcyXIXNQAstdkwrIFD Tl7uMmuZqcwSvM8uLT7Dvz0RaerqOm3XmLy9J6I7bNdpluC8fl6DakZwklsJBWLYEmMdR5Ermn0 aQg78w2WOIpbvmFw9E5ps/Ni0XuydM0UudS8nGtk/WqV/fTYYon9ZXObZhMAjVH8uhQJkkSslLw lU4thlNZPzBK93NMxOSZHVLLVD8YD/hPHG2izAHpEt4GoM8hp1PmfYxU6XDsE2Z8KPJXgaaZnMU zOv0cczM9G8hWbS+tIa3zm1xzFgepXeKkKQGXcAo3GuqSRvV2NfNV8tJaksupPYaew91Mo/olgA LAJSOQPdCHP4T8A== X-Developer-Key: i=caleb.connolly@linaro.org; a=openpgp; fpr=83B24DA7FE145076BC38BB250CD904EB673A7C47 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.39 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.103.8 at phobos.denx.de X-Virus-Status: Clean 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 Reviewed-by: Mattijs Korpershoek Signed-off-by: Caleb Connolly --- 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 580821a6ee9c..f302a2433cb6 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 797b542ef1ff..f68ed3bf3930 100644 --- a/include/part.h +++ b/include/part.h @@ -73,8 +73,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 From patchwork Sat Oct 12 13:57:19 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Caleb Connolly X-Patchwork-Id: 1996409 X-Patchwork-Delegate: caleb.connolly@linaro.org Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.a=rsa-sha256 header.s=google header.b=h905H5Jg; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=patchwork.ozlabs.org) Received: from phobos.denx.de (phobos.denx.de [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1)) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4XQlSV13BVz1xt1 for ; Sun, 13 Oct 2024 00:58:02 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 02CF588C8F; Sat, 12 Oct 2024 15:57:35 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="h905H5Jg"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 345D388D9B; Sat, 12 Oct 2024 15:57:32 +0200 (CEST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_BLOCKED, SPF_HELO_NONE,SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.2 Received: from mail-ej1-x631.google.com (mail-ej1-x631.google.com [IPv6:2a00:1450:4864:20::631]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 4E62888D99 for ; Sat, 12 Oct 2024 15:57:29 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=caleb.connolly@linaro.org Received: by mail-ej1-x631.google.com with SMTP id a640c23a62f3a-a9932aa108cso428148966b.2 for ; Sat, 12 Oct 2024 06:57:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1728741449; x=1729346249; darn=lists.denx.de; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=a0MjAs/rUfWKx52CnsUN494P84tk7qtJGRejbig5imM=; b=h905H5Jg2IZzQ1QycX0Wp/VEOsdlWOgprsvk0ltMnYxuAdwYqqEb6cgivtBTmViR3m 1POGE7lKwynTEAHriQPCAsxUPsJJDPav2aRY+qP9zsUecaB+h+m7NT5xcYVrW+rzTMAe CX8lY6hFBzDPQnjtGyGN+LI1Ab1ZX/5RFw0rq1ubwsEdahMvl2o8rQ1FBCdB2zLYmrNg 8lOnLVDU1AQpMDqGdHLqeyzLZcruwv0YExCXlTrCdhoBCvpatQD6kqNjnyF0d/UmDX1K vw0wvmr875+9LIrvP67GhLKLA4fNNpYSI143hGmxzHtAUKjkXumbn16tkxwc1VScwYVp cl9g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1728741449; x=1729346249; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=a0MjAs/rUfWKx52CnsUN494P84tk7qtJGRejbig5imM=; b=cBhEt5cPzwdtY96lRCC5ASEBxXDj6OxCiPJY1zw3nwV4xsPwcQYOvTvaB5EfczFSxH j9MGazQz4t1/lVUh0qk0SnooA3l1vxSZg/GEHcjp8Wb/rGYcJ7sR5ifvrEcSAJwvDf9Y SeVpa/CF+c7c/LGANfeO0YZuGX11JVsT3WXEplKiTyMwafGWGyOsUKYCCFMQyLa5bPHd qM8t90JwD0q0uadSu1ryu0VGVlmfMNBphuaxTzjqrjqJgaqRZ3a/PsyXZHrFWStsyO24 vFfIpL0MIMFVuXixAdT1ulYs30siZGq5lNHvMNB5/tQ/STdinRbRtgjaXS/R8BN+q0KP eu5w== X-Forwarded-Encrypted: i=1; AJvYcCVoqgUI0IXIZNshQn0+3e4iJOAwp5A0UG2dvA5D7rHiDIhwYmby1jYoj17AvEembDVm2V5mzJQ=@lists.denx.de X-Gm-Message-State: AOJu0Yx9Wx5krtCGaCqILhkJ4GgtNfLxijCq1CHDyXMkKbHGVqL6m7E3 UvJ2Q1nLMi3STCnU55p8lSH5nhBqNxEWA3dMDG2/mGMr5IiYRyLGBtz6CqcLiOM= X-Google-Smtp-Source: AGHT+IHZqrdq8mNYrGsyo+Lm/VwkRN/u6niSSy/H1ybMhvU13ufOZWvVcqn3fKGdhKe/DPvBoNGLlw== X-Received: by 2002:a17:907:d2e8:b0:a8a:4e39:a462 with SMTP id a640c23a62f3a-a99b943bc4bmr478826766b.7.1728741448654; Sat, 12 Oct 2024 06:57:28 -0700 (PDT) Received: from cymric.local ([2a02:8109:888d:ff00::2]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-a99a7f2c1f4sm324955966b.87.2024.10.12.06.57.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 12 Oct 2024 06:57:28 -0700 (PDT) From: Caleb Connolly Date: Sat, 12 Oct 2024 15:57:19 +0200 Subject: [PATCH v4 3/4] mach-snapdragon: implement capsule update support MIME-Version: 1.0 Message-Id: <20241012-b4-qcom-capsule-updates-v4-3-abd05f15255f@linaro.org> References: <20241012-b4-qcom-capsule-updates-v4-0-abd05f15255f@linaro.org> In-Reply-To: <20241012-b4-qcom-capsule-updates-v4-0-abd05f15255f@linaro.org> To: Tom Rini , Simon Glass , Lukasz Majewski , Mattijs Korpershoek , Caleb Connolly , Neil Armstrong , Sumit Garg Cc: Ilias Apalodimas , u-boot@lists.denx.de, u-boot-qcom@groups.io X-Mailer: b4 0.14-dev X-Developer-Signature: v=1; a=openpgp-sha256; l=8093; i=caleb.connolly@linaro.org; h=from:subject:message-id; bh=0/4C2jgVMfFw5GLYIQGV/So+oMFio6R1x6EIR8TTAvY=; b=owEBbQKS/ZANAwAIAQWDMSsZX2S2AcsmYgBnCoBDEz32N8FZS6tELX4p3MzrHmNL1OkKfMoRn cHE0ip2kTOJAjMEAAEIAB0WIQS2UaFGPGq+0GkMVc0FgzErGV9ktgUCZwqAQwAKCRAFgzErGV9k thspD/46sAj4DA3WXajh96ArthjaT9jr/wFt3Vp8fRz99lIHwdCxl/WuC+9vVgcZCaP2r+CU+72 4unczT0B0gH3smGeXKHpqyI0iJqdlRMk83m3dBQVEcLtJkXFK4GA5uWLXWGx7twHoiCmqFFlE3g uYULV9aB49fy+F2wPX6wxJaS4T/h0ZLd4Op5+ex6I+Fhl44YJNiCENi7P6gdVH6Z1b0+TDa/Q+i T7GW1J3gbLvvrNX/Bq3aBkI29LeedW2xygKiJ8sEfiZutqusLRFHaMCRRpplFcLN2x8dzYPqCzZ dNy0Ut7krH3CDct/E7Qv0Em7V97o6Y27O1bc05Mt1uMPS6vr5zGVgIyPJEUEuWpCGhI1N6QAXCi TnYcsSh8u4pAlhML0M42OnKAyyliMsTSLgzKTNyj7Tx8A3aajQxmhhjpzLR03zIKGYZgIuWDvA8 oEmb1ILCFSbeuYoOpv1QSGFqlMzoQnCgjFEbR6FFbt/aa6I1DslDSQHUTKzEXsOVU9Hr7jJuZsg QvzblmHvtQOZOPUhXleBdmhTPdZE4pbwC3BVlDCVawbkMgUgQpa6mBoAaa2VoJuE4u8XyHktDy+ YF5JA6E+bSotWNKfolRtbyMYrRC0Hhu9q2gg6UdUVA6f8CV09BTT7fB8oYlg4N80fV7su7Wxdbm 7QPY0J9Oap36GKg== X-Developer-Key: i=caleb.connolly@linaro.org; a=openpgp; fpr=83B24DA7FE145076BC38BB250CD904EB673A7C47 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.39 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.103.8 at phobos.denx.de X-Virus-Status: Clean Qualcomm boards flash U-Boot a variety of partitions, implement support for determining which slot U-Boot is running from, finding the correct partition for that slot and configuring the appropriate DFU string. Initially, we only support the RB3 Gen 2 where U-Boot is flashed to the UEFI partition, and ignore handling of slots. In the future we will additionally support booting U-Boot from other partitions (e.g. boot) and correct handling for A/B. Signed-off-by: Caleb Connolly Reviewed-by: Neil Armstrong Acked-by: Ilias Apalodimas --- arch/arm/mach-snapdragon/Kconfig | 3 + arch/arm/mach-snapdragon/Makefile | 1 + arch/arm/mach-snapdragon/board.c | 3 + arch/arm/mach-snapdragon/capsule_update.c | 153 ++++++++++++++++++++++++++++++ arch/arm/mach-snapdragon/qcom-priv.h | 6 ++ include/configs/qcom.h | 5 + 6 files changed, 171 insertions(+) diff --git a/arch/arm/mach-snapdragon/Kconfig b/arch/arm/mach-snapdragon/Kconfig index 536960b83c3b..f82cd0d32915 100644 --- a/arch/arm/mach-snapdragon/Kconfig +++ b/arch/arm/mach-snapdragon/Kconfig @@ -19,8 +19,11 @@ config SPL_SYS_MALLOC_F config SPL_SYS_MALLOC_F_LEN default 0x2000 +config SYS_MALLOC_LEN + default 0x800000 + config LNX_KRNL_IMG_TEXT_OFFSET_BASE default 0x80000000 config SYS_BOARD 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 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 2ab2ceb51389..fbb6cf7c6599 100644 --- a/arch/arm/mach-snapdragon/board.c +++ b/arch/arm/mach-snapdragon/board.c @@ -447,8 +447,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..bf75a9a1b24c --- /dev/null +++ b/arch/arm/mach-snapdragon/capsule_update.c @@ -0,0 +1,153 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Capsule update support for Qualcomm boards. + * + * Copyright (c) 2024 Linaro Ltd. + * Author: Caleb Connolly + */ + +#define pr_fmt(fmt) "QCOM-FMP: " fmt + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "qcom-priv.h" + +/* + * NOTE: for now this implementation only supports the rb3gen2. Supporting other + * boards that boot in different ways (e.g. chainloaded from ABL) will require + * additional complexity to properly create the dfu string and fw_images array. + */ + +/* + * To handle different variants like chainloaded U-Boot here we'll need to + * build the fw_images array dynamically at runtime. It looks like + * mach-rockchip is a good example for how to do this. + * Detecting which image types a board uses is TBD, hence for now we only + * support the one new board that runs U-Boot as its primary bootloader. + */ +struct efi_fw_image fw_images[] = { + { + /* U-Boot flashed to the uefi_X partition (e.g. rb3gen2) */ + .fw_name = u"UBOOT_UEFI_PARTITION", + .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); + /* + * FIXME: eventually we'll want to find the active/inactive variant of the partition + * but on the rb3gen2 these values might all be 0 + */ + if (!strncmp(info.name, partname, strlen(partname))) { + 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 = "uefi_a"; + struct udevice *dev = NULL; + + 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 5b5ebbd844df..9b41ab9e982b 100644 --- a/include/configs/qcom.h +++ b/include/configs/qcom.h @@ -10,5 +10,10 @@ #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) + #endif From patchwork Sat Oct 12 13:57:20 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Caleb Connolly X-Patchwork-Id: 1996410 X-Patchwork-Delegate: caleb.connolly@linaro.org Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.a=rsa-sha256 header.s=google header.b=O30HvAFU; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=patchwork.ozlabs.org) Received: from phobos.denx.de (phobos.denx.de [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1)) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4XQlSj47Hwz1xt1 for ; Sun, 13 Oct 2024 00:58:13 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id BB8FF88E42; Sat, 12 Oct 2024 15:57:35 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="O30HvAFU"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 8CF9F889C3; Sat, 12 Oct 2024 15:57:32 +0200 (CEST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_BLOCKED, SPF_HELO_NONE,SPF_PASS,UPPERCASE_50_75 autolearn=no autolearn_force=no version=3.4.2 Received: from mail-ej1-x62b.google.com (mail-ej1-x62b.google.com [IPv6:2a00:1450:4864:20::62b]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id A5DA088B23 for ; Sat, 12 Oct 2024 15:57:30 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=caleb.connolly@linaro.org Received: by mail-ej1-x62b.google.com with SMTP id a640c23a62f3a-a99ea294480so61199566b.2 for ; Sat, 12 Oct 2024 06:57:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1728741450; x=1729346250; darn=lists.denx.de; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=cd5H1QdPdYTurC7eKdOorF59l0kwIdATGVIexsLuxOE=; b=O30HvAFUZv9A1KKWPrvE4N5r/XTw70R4PfmEcwvUb+YPlTsp7TtzuuCAuyJ990SgaJ HKlNxB5e1e1Hyv0Cj7B5Z/0RG2Fu1rpVa9ZyqNbJWQMJubY3v0/pVx2sD0FZeTM+OEy2 UdkpfK826LYl0dtEGHIJ8ikrtGkPvxBBVN4W42damzl03PVkVD2K3lcLW4kFPzlhbW0L 75xVpvvzfvSbR+36/Zrs9ocbqtIiDgePh556dFDbXrpvUXIWfHDKABPzGYQ3bow8Pxe1 G0zhI4/bbrFLbMXCVDxoC8CNUwQs8VR2kIV+OpfKLiJv9duCkopyaCCEriq6BMIG85dr sT8w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1728741450; x=1729346250; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=cd5H1QdPdYTurC7eKdOorF59l0kwIdATGVIexsLuxOE=; b=n7QhHteIX5ig2fWspjcrfZi1LL2nSfXIMAK9yiYyr5XbobyR9KovXKxqy+B85ktPtj OroFc8dj6wsJFumgPaBIUPxjtLX4uwMhq/5GxKBYKVH35hiY9Qhkd5X4ddt8hIWt0512 +7dqGu/y5WEM9nHkN+4p70y94bDR02rGyuBbjVgpCUlJJzpqY3+LuS8nyE3iOqV93QgX gZGCQiEiwDPlHe7sAgFo5ypbQv4gDfUwJ8It6LK001xASJWYntBZNfFN+5fFBlhqbvXY hmBrYTR+Nt/4vAuDNC9+7yhZvVeqTvsLO4RzvyNljlEwdmCyWAzcy7YJSsyHujeUN5H7 yiJQ== X-Forwarded-Encrypted: i=1; AJvYcCVKGo+G2XSUK4YEcYvAJDQ/xbQg1Hb5nInME/f7YjhM6ECVpYMWBX+ZD4YPMU8KDM4j/cs35Es=@lists.denx.de X-Gm-Message-State: AOJu0Yzo8TguuqAFL8+R0Ooi56Thjp/79pvdfvlkTEpgZ5yuUZVEG9Mc HDAGdHTycgBW8Txu6t8EigoMg2efmDmtMnygdLl8FIK7PAAnL+Omw65kypWV2N4= X-Google-Smtp-Source: AGHT+IHaPNYiNfhPkXsptnKH6slI/mEK8Zqagz/lPtxc6q9yxCkUJQbQ80O5aVnRlsdcDnNd7t9QKw== X-Received: by 2002:a05:6402:4401:b0:5c9:446c:88f8 with SMTP id 4fb4d7f45d1cf-5c95ac156b3mr4955103a12.10.1728741450035; Sat, 12 Oct 2024 06:57:30 -0700 (PDT) Received: from cymric.local ([2a02:8109:888d:ff00::2]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-a99a7f2c1f4sm324955966b.87.2024.10.12.06.57.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 12 Oct 2024 06:57:29 -0700 (PDT) From: Caleb Connolly Date: Sat, 12 Oct 2024 15:57:20 +0200 Subject: [PATCH v4 4/4] qcom_defconfig: enable capsule update support MIME-Version: 1.0 Message-Id: <20241012-b4-qcom-capsule-updates-v4-4-abd05f15255f@linaro.org> References: <20241012-b4-qcom-capsule-updates-v4-0-abd05f15255f@linaro.org> In-Reply-To: <20241012-b4-qcom-capsule-updates-v4-0-abd05f15255f@linaro.org> To: Tom Rini , Simon Glass , Lukasz Majewski , Mattijs Korpershoek , Caleb Connolly , Neil Armstrong , Sumit Garg Cc: Ilias Apalodimas , u-boot@lists.denx.de, u-boot-qcom@groups.io X-Mailer: b4 0.14-dev X-Developer-Signature: v=1; a=openpgp-sha256; l=2357; i=caleb.connolly@linaro.org; h=from:subject:message-id; bh=E+5vYobahjp/ayl7KfnhRZ4liQ12bdvr/8bB01S6W1U=; b=kA0DAAgBBYMxKxlfZLYByyZiAGcKgEOhodznmm58rgcW3oUe8EbwHLGctXQy3ApCz2eaH9pFy IkCMwQAAQgAHRYhBLZRoUY8ar7QaQxVzQWDMSsZX2S2BQJnCoBDAAoJEAWDMSsZX2S2uKIP/Rnn D8e2xh/9tyU8lgoBn0KdOJqJ4gFAwrY0dwk7kpGuynV0kgP3PHM6LctOzL0iXMumLPaZOyLm+fD 2bwBTgBxxin75Jp3UJJh2prYvSsgWLNr3lqLOn7hNn2ph9APbYGuIOktsN8REKBaed0n8H+g/Xl Swt9T7yD59priFCT4YYUakTtrRKD0naYp1WBcLRXIxho+hrShVAHAI8c5VGvCKeyboOfMRhhgQU HbPzGCYfAPhGArzkJyAxMm/1TVYHcKSY0Y5m5IodTg0yd0fQtG6KD0VqUD0z6scBBP48Wcon7zL eychlCjDcRXtPbMWlVMQxuiQfmEzX28dY1SqJA00YvqYyMQOWCumBhFJcRtQxHaFna/fksgX06C UYUS91MMCkO3Jr4xVhQ+HzEd1wzE1fJ4pt5hZp8TBfbnqyNjnBKkiiW6meCiNkXd+Jx7OBBLae9 cg/4KUMLaSi2TuC2ZXPlHmAtXW6gOFiBoLMCQsBsbIes1hM7nX9doB6amMAfWci+SzAYl54fKLz 4HKJvSck+EmiYjI0kOh+NySPUVz1x/1nZdXVT1Zu+7D4AFmHQKnSyuPJjt7vSe62DwCrQ9oZzhN lWJMm9jYL87VJ4gr+ouwZHkN5MHwDwx0ayUBRcymXGTZ7cr0pSnG5Pagkyw+PgCPG+LaOu4Xnry Icz5j X-Developer-Key: i=caleb.connolly@linaro.org; a=openpgp; fpr=83B24DA7FE145076BC38BB250CD904EB673A7C47 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.39 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.103.8 at phobos.denx.de X-Virus-Status: Clean Enable all the necessary options for capsule updates to work, as well as a few additional EFI features. Capsule updates themselves are only enabled for the RB3 Gen 2, since the exact details on where to flash U-Boot (or how to handle multiple boot methods) has not been finalised for other boards. Signed-off-by: Caleb Connolly Reviewed-by: Neil Armstrong Reviewed-by: Ilias Apalodimas --- configs/qcm6490_defconfig | 6 ++++++ configs/qcom_defconfig | 8 +++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/configs/qcm6490_defconfig b/configs/qcm6490_defconfig index 5ddc5ab3ef8c..ba26924da161 100644 --- a/configs/qcm6490_defconfig +++ b/configs/qcm6490_defconfig @@ -18,4 +18,10 @@ CONFIG_DEBUG_UART_CLOCK=14745600 CONFIG_TEXT_BASE=0x9fc00000 CONFIG_REMAKE_ELF=y CONFIG_DEFAULT_DEVICE_TREE="qcom/qcs6490-rb3gen2" + +# Enable capsule updates +CONFIG_EFI_RUNTIME_UPDATE_CAPSULE=y +CONFIG_EFI_CAPSULE_ON_DISK=y +CONFIG_EFI_IGNORE_OSINDICATIONS=y +CONFIG_EFI_CAPSULE_FIRMWARE_RAW=y diff --git a/configs/qcom_defconfig b/configs/qcom_defconfig index e7ed03ff0f24..4c8ff0e84372 100644 --- a/configs/qcom_defconfig +++ b/configs/qcom_defconfig @@ -20,21 +20,24 @@ 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_REGULATOR=y CONFIG_CMD_LOG=y CONFIG_OF_LIVE=y CONFIG_USE_DEFAULT_ENV_FILE=y @@ -44,15 +47,18 @@ CONFIG_CLK=y CONFIG_CLK_QCOM_APQ8016=y CONFIG_CLK_QCOM_APQ8096=y CONFIG_CLK_QCOM_QCM2290=y CONFIG_CLK_QCOM_QCS404=y -CONFIG_CLK_QCOM_SC7280=y CONFIG_CLK_QCOM_SDM845=y CONFIG_CLK_QCOM_SM6115=y CONFIG_CLK_QCOM_SM8150=y CONFIG_CLK_QCOM_SM8250=y CONFIG_CLK_QCOM_SM8550=y CONFIG_CLK_QCOM_SM8650=y +CONFIG_CLK_QCOM_SC7280=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