From patchwork Fri Oct 6 14:28:29 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Hilliard X-Patchwork-Id: 1844523 X-Patchwork-Delegate: sbabic@denx.de 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=googlegroups.com header.i=@googlegroups.com header.a=rsa-sha256 header.s=20230601 header.b=nlGIVUxz; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20230601 header.b=FaGVyWRk; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=googlegroups.com (client-ip=2607:f8b0:4864:20::53f; helo=mail-pg1-x53f.google.com; envelope-from=swupdate+bncbcl4hcw73qcbbfftqcuqmgqepiswpqa@googlegroups.com; receiver=patchwork.ozlabs.org) Received: from mail-pg1-x53f.google.com (mail-pg1-x53f.google.com [IPv6:2607:f8b0:4864:20::53f]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4S29lb3hlDz1yqF for ; Sat, 7 Oct 2023 01:28:41 +1100 (AEDT) Received: by mail-pg1-x53f.google.com with SMTP id 41be03b00d2f7-5789f2f13fcsf1823376a12.3 for ; Fri, 06 Oct 2023 07:28:41 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1696602517; cv=pass; d=google.com; s=arc-20160816; b=PBUBD25AQuv1nKiVB7pj68y4Wpc1iQJI1KSCPsCtJ/XVTFkpXkgUihiG2fiIRIhdBf 9VJ5vFGMzd8Dm8bnl1vHt8mW02dFSYh8mMblN5t8HSZ0/ZvEVRfNqKC7v4E/AlS1a6js LBx6a0Tpf8GBRW4s1LyqeonSbzC61vTjbEEeuE+O+w2qDeHKhyBqpvIMAX1Fy1Sr6jWj YGAfvU6gbt9fratFx+8IryscohNLb0ZFiEucqFCrJ65Oesr5lqRXRRSVZcctanK5wh7u JM6i0EWeI/6w5JdJ3Hn1Q7nns3NbCauzz/X04XQy0I4xTNTsw9FI6KHAi98RVYGclVjD mivA== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-unsubscribe:list-subscribe:list-archive:list-help:list-post :list-id:mailing-list:precedence:mime-version:message-id:date :subject:cc:to:from:sender:dkim-signature:dkim-signature; bh=Ux6h7ATMx4fC+6g9/1g6imhOw0A1PykMY6Iim07lqPM=; fh=KPrAw848PoyEggiIX82ubXk7sJG2UD396EeWf1FQVUo=; b=IIQG5Sqo701NVH6hOsN8ibKi5yX4wYHO/jt9qVVO8cK+YN1uqVKyta0HChXvA32Hq9 8uzTvtRfAe77w5F0xwY3HssU4NOlRxnyOmJkDPSRrIl0NGj5+m29X20aDvJuh/TpKQOa dtwkDlOegQW6h7GKzXAitTnWO2SwhZ25q7EZPFtCom21WlJec9mKBFRFAs+9LOtwH3Ev dUmX7K/YHZj4XuPfr4Po2kzOj5zzJvztyefLzAxSfCI44+CYqbVSwXv/+vobbQdun5Ul Wwu8fe9rRM93hVqmVU8/sXX3U7rsGEQQkwmflBAL6o4sKvXBqOoJvXeV2lDrIFmteKx6 f/mg== ARC-Authentication-Results: i=2; gmr-mx.google.com; dkim=pass header.i=@gmail.com header.s=20230601 header.b=OlsWs5VV; spf=pass (google.com: domain of james.hilliard1@gmail.com designates 2607:f8b0:4864:20::d2b as permitted sender) smtp.mailfrom=james.hilliard1@gmail.com; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlegroups.com; s=20230601; t=1696602517; x=1697207317; darn=patchwork.ozlabs.org; h=list-unsubscribe:list-subscribe:list-archive:list-help:list-post :list-id:mailing-list:precedence:x-original-authentication-results :x-original-sender:mime-version:message-id:date:subject:cc:to:from :sender:from:to:cc:subject:date:message-id:reply-to; bh=Ux6h7ATMx4fC+6g9/1g6imhOw0A1PykMY6Iim07lqPM=; b=nlGIVUxzYhgls6khndhKKMMt0A0I+Tzb9iuwLRXrRRAgCb9iZT6+G1E8qU2hs/ir2J hTiUtm6SYfe9mwRUpoEqtnb9XoMOn3nwoEMWd1Q4t8TvI6zLkibz6qGzsVnoCFpxguqY +iCRGokqHIb0Ba8H1J4LJsrxJ1nCARnIHuyp2725V5OVUPWOspNf11UysNSEHZFTgO7j se23ayZrOx4S6p0TXL1WquRQTEPs1xqmJx81ltzGSZ2Vjjx7PwL/2BjULlGinpglb0iI 8tKOhqT0oQ3pnOE7K0BfH7nF3H3QKyljojBHH9H4OIM8hTosZUQjZppM9uvwIVaKf4PG Vbhg== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1696602517; x=1697207317; darn=patchwork.ozlabs.org; h=list-unsubscribe:list-subscribe:list-archive:list-help:list-post :list-id:mailing-list:precedence:x-original-authentication-results :x-original-sender:mime-version:message-id:date:subject:cc:to:from :from:to:cc:subject:date:message-id:reply-to; bh=Ux6h7ATMx4fC+6g9/1g6imhOw0A1PykMY6Iim07lqPM=; b=FaGVyWRktUs1oauOATECm03r7EgXkhpuShfrt6sIsgTtbiuqcg9VO3oGOEpIFtZ8/8 sORLw7J6tOdZACQy/yXJYJ9gStV2sQ9fMVKQuFJxZHyd7ytULV5YZCmDWetAZbEMIqsS ZSCZXo3Y7ao2elGMu9G196yg9T0Rax70fRyCBoIvj2D0EmWYeaJEsJeXuwz93uEAA8Dr OUxROBWYHX05il6OvKdBIATNlC7tYkXXUDoNyClffAkl2JoP3tUDeROABS30Ak+wp5wT E97WRa5Bo+tk6kjnI3kn6zbWPd/SvQ3UKptr0Y3bIJFwfxN+H1a+dyEd5jI+YyE5RtJ5 cAgw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1696602517; x=1697207317; h=list-unsubscribe:list-subscribe:list-archive:list-help:list-post :x-spam-checked-in-group:list-id:mailing-list:precedence :x-original-authentication-results:x-original-sender:mime-version :message-id:date:subject:cc:to:from:x-beenthere:x-gm-message-state :sender:from:to:cc:subject:date:message-id:reply-to; bh=Ux6h7ATMx4fC+6g9/1g6imhOw0A1PykMY6Iim07lqPM=; b=vIFv8m4t2aRSYi0ZEB4y/jAogKNpJyOhjIHfRTTAgR2iCdmDshBVGRMxD5+UzHYMef pL0bF82Zyv1f72I2LRXdkxRndZChwqOkPUBNMSjytG+E/3LD1wUIC7ZQUthldWcDMr+z 9v+1dzLV33gxvoJrenOod9E54GDT8M90AF89o0OAY1nNAcMpw30wrEHeXXgqxacvg7Og oZRbKNGmoSKKlcYJCn7LIrvdSwJv01KNcohRM8ZCfRkJD2XE38ZWL5BNlbTD3cvgoSOZ 78sg5r6n1ViBUv+X4Q8P9izfbeMuhiwXb++IYEZj4oEwVBi8WtKnP5rVWjXDpA9RBUYB WZJw== Sender: swupdate@googlegroups.com X-Gm-Message-State: AOJu0Yy1YW1gJQQe2hIt7wKlNTFAc/aei1p9H2SolnSMwDNxL7h8tl5K i1Ag3B717SlHx5AiRKcEq+o= X-Google-Smtp-Source: AGHT+IFtBCAjxNstGpxcEhZIezIEawAmDg7OZi5pI6iWSrFdauZHKwzAIiIIl15cJXm2BbkG/O2pmQ== X-Received: by 2002:a05:6a20:3242:b0:14c:6cd9:bf9d with SMTP id hm2-20020a056a20324200b0014c6cd9bf9dmr7415903pzc.35.1696602517254; Fri, 06 Oct 2023 07:28:37 -0700 (PDT) X-BeenThere: swupdate@googlegroups.com Received: by 2002:aa7:8ec1:0:b0:68f:e93f:9bfa with SMTP id b1-20020aa78ec1000000b0068fe93f9bfals1843986pfr.0.-pod-prod-01-us; Fri, 06 Oct 2023 07:28:35 -0700 (PDT) X-Received: by 2002:a05:6a21:1f2f:b0:16b:9285:69e3 with SMTP id ry47-20020a056a211f2f00b0016b928569e3mr1685302pzb.18.1696602515775; Fri, 06 Oct 2023 07:28:35 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1696602515; cv=none; d=google.com; s=arc-20160816; b=XNkUOXnh0a2ovrzmJ2gI6oWloYAi0jUqsfs3pMM0ddw0cCg+6tFXYwhEDT0F9XO4SW wsea8RhbO6nq6TAUj5BnXkncuU3UH3n1nwNqNtfVFtSipa7t1NgjWEaKZooOEbVm4Wp1 MRl1v8WE7fWNnROfMTWwq2ToU0A4ywR5iZ4E0HCYTsR+KEr7KZAT0lSFzqOHM3y9EL5w A5ri44NX/y+GXxwABwBJdoJufjv0CDiMcWaBVOR1xDbpIF7txv3wsz0lo0iVIqFmi7yO DZWRrlZiP5r6ESEdplCWsqbYC5dPH+GZr4+iYhVKTZVeGpzi4LjOtrDKzslI6+BRNOYy gQMQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:dkim-signature; bh=i1IsvUADy3hXTmJozybpsxqQgEZCxhLoPZYFAHDSWIs=; fh=KPrAw848PoyEggiIX82ubXk7sJG2UD396EeWf1FQVUo=; b=UAhDhVkfErzjFKyf3R7nmUo72PyzuUuyHB7VR+WpAoMZR1lpbdcAsZjlLeVjW0af6E YCNxmvnBAIGZMbp3OgX/Ti8R0D4tLW+IyXXB0qWqecC0zFaEW0VFAKcN7G3PcXMiRFUO sIgwPOH/nQmXTn0jK+3yvap59TtTP0IEe550gKHgh8HMpE0h5lHglcVI72sXJItSKXVw wJ1Dncb0poW5J+O6lFo6Td8SvTOPglVxBbLmsfunTHWd/JmnFAnqGq1ySong/gZ6LXBm 9jqYyP+PqS9ZxWcAnZ9TA7ptH+GtsA/mz7POR4Skz7ybnTXwlQE6nQzpwFUPOl9N1NCF ZEvg== ARC-Authentication-Results: i=1; gmr-mx.google.com; dkim=pass header.i=@gmail.com header.s=20230601 header.b=OlsWs5VV; spf=pass (google.com: domain of james.hilliard1@gmail.com designates 2607:f8b0:4864:20::d2b as permitted sender) smtp.mailfrom=james.hilliard1@gmail.com; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from mail-io1-xd2b.google.com (mail-io1-xd2b.google.com. [2607:f8b0:4864:20::d2b]) by gmr-mx.google.com with ESMTPS id ay8-20020a056a00300800b0068e34c6b99csi188708pfb.3.2023.10.06.07.28.35 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 06 Oct 2023 07:28:35 -0700 (PDT) Received-SPF: pass (google.com: domain of james.hilliard1@gmail.com designates 2607:f8b0:4864:20::d2b as permitted sender) client-ip=2607:f8b0:4864:20::d2b; Received: by mail-io1-xd2b.google.com with SMTP id ca18e2360f4ac-79fa387fb96so93703039f.1 for ; Fri, 06 Oct 2023 07:28:35 -0700 (PDT) X-Received: by 2002:a5e:8809:0:b0:79a:b53c:d758 with SMTP id l9-20020a5e8809000000b0079ab53cd758mr8919863ioj.1.1696602514556; Fri, 06 Oct 2023 07:28:34 -0700 (PDT) Received: from james-x399.localdomain (71-33-152-19.hlrn.qwest.net. [71.33.152.19]) by smtp.gmail.com with ESMTPSA id g6-20020a0566380c4600b0043988c9fe2dsm431150jal.179.2023.10.06.07.28.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 06 Oct 2023 07:28:33 -0700 (PDT) From: James Hilliard To: swupdate@googlegroups.com Cc: James Hilliard Subject: [swupdate] [PATCH v2 1/1] Allow specifying UBI Volumes by MTD path Date: Fri, 6 Oct 2023 08:28:29 -0600 Message-Id: <20231006142829.1259091-1-james.hilliard1@gmail.com> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 X-Original-Sender: james.hilliard1@gmail.com X-Original-Authentication-Results: gmr-mx.google.com; dkim=pass header.i=@gmail.com header.s=20230601 header.b=OlsWs5VV; spf=pass (google.com: domain of james.hilliard1@gmail.com designates 2607:f8b0:4864:20::d2b as permitted sender) smtp.mailfrom=james.hilliard1@gmail.com; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Precedence: list Mailing-list: list swupdate@googlegroups.com; contact swupdate+owners@googlegroups.com List-ID: X-Spam-Checked-In-Group: swupdate@googlegroups.com X-Google-Group-Id: 605343134186 List-Post: , List-Help: , List-Archive: , List-Unsubscribe: , In cases where the env is in an unattached UBI volume we may need to specify the volume name via the MTD path to attach. For this to work correctly we should first scan for any already attached UBI devices to see if they correspond to the mtd partition number in our configuration, if no corresponding attached mtd devices are found we should attempt to ubiattach to the configured MTD path. Signed-off-by: James Hilliard --- Changes v1 -> v2: - add missing closedir(sysfs_ubi) --- docs/fw_env_config.md | 8 +++ src/uboot_env.c | 121 +++++++++++++++++++++++++++++++++++++++++- 2 files changed, 127 insertions(+), 2 deletions(-) diff --git a/docs/fw_env_config.md b/docs/fw_env_config.md index 17b17fb..1cdc196 100644 --- a/docs/fw_env_config.md +++ b/docs/fw_env_config.md @@ -98,6 +98,14 @@ UBI Volume by Name Example | /dev/ubi0:env | 0x0 | 0x1f000 | 0x1f000 | | | | /dev/ubi0:redund | 0x0 | 0x1f000 | 0x1f000 | | | +UBI Volume by Name from MTD Path Example +-------------------------- + +| Device Name | Device Offset | Environment Size | Flash Sector Size | Number of Sectors | Disable Lock Mechanism | +|------------------|---------------|------------------|-------------------|-------------------|------------------------| +| /dev/mtd0:env | 0x0 | 0x1f000 | 0x1f000 | | | +| /dev/mtd0:redund | 0x0 | 0x1f000 | 0x1f000 | | | + Configuration File in YAML ========================== diff --git a/src/uboot_env.c b/src/uboot_env.c index 4a4ee35..ae85c7e 100644 --- a/src/uboot_env.c +++ b/src/uboot_env.c @@ -43,6 +43,9 @@ #define DEVICE_MTD_NAME "/dev/mtd" #define DEVICE_UBI_NAME "/dev/ubi" +#define DEVICE_UBI_CTRL "/dev/ubi_ctrl" +#define SYS_UBI "/sys/class/ubi" +#define SYS_UBI_MTD_NUM "/sys/class/ubi/ubi%d/mtd_num" #define SYS_UBI_VOLUME_COUNT "/sys/class/ubi/ubi%d/volumes_count" #define SYS_UBI_VOLUME_NAME "/sys/class/ubi/ubi%d/ubi%d_%d/name" @@ -196,7 +199,11 @@ static enum device_type get_device_type(char *device) enum device_type type = DEVICE_NONE; if (!strncmp(device, DEVICE_MTD_NAME, strlen(DEVICE_MTD_NAME))) - type = DEVICE_MTD; + if (strchr(device, DEVNAME_SEPARATOR)) { + type = DEVICE_UBI; + } else { + type = DEVICE_MTD; + } else if (!strncmp(device, DEVICE_UBI_NAME, strlen(DEVICE_UBI_NAME))) type = DEVICE_UBI; else if (strlen(device) > 0) @@ -217,6 +224,77 @@ static int ubi_get_dev_id(char *device) return dev_id; } +static int mtd_get_dev_id(char *device) +{ + int dev_id = -1; + char *sep; + + sep = strrchr(device, 'd'); + if (sep) + sscanf(sep + 1, "%d", &dev_id); + + return dev_id; +} + +static int ubi_get_dev_id_from_mtd(char *device) +{ + DIR *sysfs_ubi; + struct dirent *dirent; + int mtd_id; + + mtd_id = mtd_get_dev_id(device); + if (mtd_id < 0) + return -1; + + sysfs_ubi = opendir(SYS_UBI); + if (!sysfs_ubi) + return -1; + + while (1) { + int ubi_num, ret; + + dirent = readdir(sysfs_ubi); + if (!dirent) + break; + + if (strlen(dirent->d_name) >= 255) { + closedir(sysfs_ubi); + return -1; + } + + ret = sscanf(dirent->d_name, "ubi%d", &ubi_num); + if (ret == 1) { + char filename[DEVNAME_MAX_LENGTH]; + char data[DEVNAME_MAX_LENGTH]; + int fd, n, num_mtd = -1; + + snprintf(filename, sizeof(filename), SYS_UBI_MTD_NUM, ubi_num); + fd = open(filename, O_RDONLY); + if (fd < 0) + continue; + + n = read(fd, data, sizeof(data)); + close(fd); + if (n < 0) + continue; + + if (sscanf(data, "%d", &num_mtd) != 1) + num_mtd = -1; + + if (num_mtd < 0) + continue; + + if (num_mtd == mtd_id) { + closedir(sysfs_ubi); + return ubi_num; + } + } + } + + closedir(sysfs_ubi); + return -1; +} + static int ubi_get_num_volume(char *device) { char filename[DEVNAME_MAX_LENGTH]; @@ -308,9 +386,48 @@ static int ubi_update_name(struct uboot_flash_env *dev) { char device[DEVNAME_MAX_LENGTH]; char volume[DEVNAME_MAX_LENGTH]; - int dev_id, vol_id, ret = -EBADF; + int dev_id, vol_id, fd, ret = -EBADF; + struct stat st; char *sep; + if (!strncmp(dev->devname, DEVICE_MTD_NAME, strlen(DEVICE_MTD_NAME))) + { + sep = strchr(dev->devname, DEVNAME_SEPARATOR); + if (sep) + { + memset(device, 0, DEVNAME_MAX_LENGTH); + memcpy(device, dev->devname, sep - dev->devname); + + memset(volume, 0, DEVNAME_MAX_LENGTH); + sscanf(sep + 1, "%s", &volume[0]); + + ret = ubi_get_dev_id_from_mtd(device); + if (ret < 0) { + struct ubi_attach_req req; + + memset(&req, 0, sizeof(struct ubi_attach_req)); + req.ubi_num = UBI_DEV_NUM_AUTO; + req.mtd_num = mtd_get_dev_id(device); + req.vid_hdr_offset = 0; + + fd = open(DEVICE_UBI_CTRL, O_RDONLY); + if (fd == -1) + return -EBADF; + + ret = ioctl(fd, UBI_IOCATT, &req); + close(fd); + if (ret == -1) + return -EBADF; + + sprintf(dev->devname, DEVICE_UBI_NAME"%d:%s", req.ubi_num, volume); + } else { + sprintf(dev->devname, DEVICE_UBI_NAME"%d:%s", ret, volume); + } + } else { + return -EBADF; + } + } + sep = strchr(dev->devname, DEVNAME_SEPARATOR); if (sep) {