From patchwork Wed Feb 28 16:53:55 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefano Babic X-Patchwork-Id: 1905921 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=Ea9Crak4; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=googlegroups.com (client-ip=2a00:1450:4864:20::140; helo=mail-lf1-x140.google.com; envelope-from=swupdate+bncbaabbk6k7wxamgqevznhpei@googlegroups.com; receiver=patchwork.ozlabs.org) Received: from mail-lf1-x140.google.com (mail-lf1-x140.google.com [IPv6:2a00:1450:4864:20::140]) (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 4TlL6T3ss1z23qX for ; Thu, 29 Feb 2024 03:54:07 +1100 (AEDT) Received: by mail-lf1-x140.google.com with SMTP id 2adb3069b0e04-512e9690876sf5574586e87.2 for ; Wed, 28 Feb 2024 08:54:07 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1709139245; cv=pass; d=google.com; s=arc-20160816; b=cHDb+DG3UZNnwcIRGKXxOuZpm+1F+U/Vf4HYimriWNymq5aInfGbs9jE5T6XWAELN7 o1hIOmwbEGK61n3AH2HqYcJk5ZN1EjHy1IlTHCVtVy/pyQAqzmXZTqGsXCxo2Zgt1tzE v9AwSCzCNNdiSfJNNSB59gjNk0ZKKhfsFOJmkthLP8BpO7tooQIjV00mc8fKzNl1NaFM mgzmVG4QwCjL/PJiYDnxXJ9m6pqlUADtds4Jt9DEMhRJwtCdzHkCtYjR1jgB8/FJCZwT xvzdwougF7Jk7MKDxSMdzZ3I8nK1LOiDuPZjyJ0HDzjTRKhNk/XZvvCX5vn/g9HdOKTc 0Wzw== 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:ui-outboundreport:mime-version :message-id:date:subject:cc:to:from:sender:dkim-signature; bh=RkLRnuk78msbwiS3awj0a3CXFPC8mNRDjlPJM7VgTec=; fh=efjkUH6MmvUn4Z7gRfSfMOGjmmsG4BCfLvBImB+YSKY=; b=mZTEHIiuvD+Z389wjlqjhpO1kGn3HtzMis+OGNsA1mYlvYJSkgax/aj2TlNvYIsqp7 wjc0R+k87nTzUekng699dkww9yJBuSYTaDcyCSu4CMNbmDgmscLaZWxrhOSZv7jKd4Rm +rc8pKtbcXRwoy4nn4J00vCiInmeuM/zMrrlvQl38MiepO3ZL6iomtWEFHCEZeoODeg0 o8dQTSKTMuBgdECoLglpuwjgNaZPHuoTD0gU7eH+pVmDKTOtzHUqTO/YcuHoy4wyn7Zt 22OJsmmtP0eFf/4SHsWmYyEmqaJafmTzUCzN1IEuXEfuvPF4hyNhqSy4F+Sto7NktsXV ar5Q==; darn=patchwork.ozlabs.org ARC-Authentication-Results: i=2; gmr-mx.google.com; dkim=pass header.i=@swupdate.org header.s=s1-ionos header.b=mhWLTbvf; spf=pass (google.com: domain of stefano.babic@swupdate.org designates 212.227.126.130 as permitted sender) smtp.mailfrom=stefano.babic@swupdate.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlegroups.com; s=20230601; t=1709139245; x=1709744045; 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:ui-outboundreport:mime-version:message-id:date :subject:cc:to:from:sender:from:to:cc:subject:date:message-id :reply-to; bh=RkLRnuk78msbwiS3awj0a3CXFPC8mNRDjlPJM7VgTec=; b=Ea9Crak4txZfFh6oUw4qqmEMhIuBKNGNOCfqVK77047XWuhsD28TJYfAU4lBaUa8V/ nn69IHI5kpAz9uLdMS+JPIyVvvKG2jqbqp+LT1BEjjGA33XvzhyPBaVFUCmNeXvHovxW gGIyV+OJRRolfcLbPF3YgG2Su8EOKKEs69tOJx/DA0/FDnrosgJdkPWkJ4yqyy8h6tc3 cQXzOWCx8yxCeBRWZpPweWLTuRiPyuofOZ+LZfHD+ZE6TNCBAid+c5hP2GAf3CwMGhgo aOzE4KOtXSpKBGkYa+rb7DQVvi1eIpyVRCwSV9vzmvQFb8VrOY4G8fF0SvCCRljVoxYE 8jSA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1709139245; x=1709744045; 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 :ui-outboundreport: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=RkLRnuk78msbwiS3awj0a3CXFPC8mNRDjlPJM7VgTec=; b=XP/6MMJHg4gvUD9mlxAqaKE3XLJ0axu0HAEgF4Y0Yi+oA5Rrbn6i89P1dQN4FeHiQl N6nBY2aMqL6uj3aiB8JtPJKA3pK2GMjODmDP5yA6U02mSzY503aO0awtATayKnuOZZYf raTBr5d5F2RfiO5w/cLLhDwtCscRaShOUsn/N/lZEoDZIGSvO//HEcuIFkb4rmzd5p+0 E5NTXARO1rlU/tmOpZkNUt7wHcA/ir9TTT7S2U0CZ5YNzWIUvTTHSI0lmxpY9ON4qiuW fErEAC8YNBrTsDCNEJzaHxSo/uAHOIm0BGdUKy7EOhWQXc1Y7YUrgzzbx1f2EeQ18ro8 +ATg== Sender: swupdate@googlegroups.com X-Forwarded-Encrypted: i=2; AJvYcCWKal3OmNaBeOZly/jJZKfxvZkwsGOq/5evkWoLSoTizzKE2fYHkdYM5O9KN1kS2F70VihNhIo6w+ToyW9GVYuH1OeZU18SXcDBpmwO1w== X-Gm-Message-State: AOJu0YyCsj3Wf9DpM0jqtczSYMO6GCdf3psGpPcR0KjIDDygHMmhfzr5 5C6AXIFBwStDPRRnGmyqd/sGKhWuWcQbI8vlKaAFZWoDCjr2E+nB X-Google-Smtp-Source: AGHT+IE46DX4vyIUHiIiagf6VSQgRRtjmLpBRNaA0nx85EVQCn3XpXnbXWbev6ZYQmABnaHfcSNGSA== X-Received: by 2002:a05:6512:b90:b0:512:f17f:2b2e with SMTP id b16-20020a0565120b9000b00512f17f2b2emr225018lfv.54.1709139243602; Wed, 28 Feb 2024 08:54:03 -0800 (PST) X-BeenThere: swupdate@googlegroups.com Received: by 2002:a05:6512:124d:b0:512:fce8:30da with SMTP id fb13-20020a056512124d00b00512fce830dals49464lfb.1.-pod-prod-02-eu; Wed, 28 Feb 2024 08:54:01 -0800 (PST) X-Received: by 2002:a2e:a274:0:b0:2d2:39e6:fa3f with SMTP id k20-20020a2ea274000000b002d239e6fa3fmr7290533ljm.31.1709139241519; Wed, 28 Feb 2024 08:54:01 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1709139241; cv=none; d=google.com; s=arc-20160816; b=pMPED0/lcJG0wEgD6VoicHGMCgFwjZ8scWS6F6Nkhg2ZsXYc64gG7iR6H+MFX+VhKL t8lobpuJ7MqwwhESLKBqMNJh1nUq9fjBSU5sPIH7CC4PR++zgBDRluC4A8/BH6euAiuS ZKT+6fcRywv9HwtrW7VR2O7x42Sz+HL6BSHB6fli1sXcwESo1H+7BJSZDg5N3XQth0nZ uh/RFqeQHKzQsUAHGW6E2eomV5T5CnTlV2gDFowBVLjA8Ijzc6E1cSbLNMrJALp/6lGk dALi9bDb88tlhwXZopHVpMtz6ET+Ok4W9/C2J9ZmjqF9nkzDNJTW8EAiD7NnKomE6p3b F7kw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=ui-outboundreport:content-transfer-encoding:mime-version:message-id :date:subject:cc:to:from:dkim-signature; bh=Wir4Rjv73jOrGjmR6yQlMq3lJttIpcmo5yWca6Vg7bQ=; fh=TiEWcqMcKpHk5s7uErzpntoONrNfOXwKpI5P8bIlggk=; b=vTLuqOdyghi8VTmULRRHcAOzpYfKid2ZRHusih/VqiFos3Lji2lswU4i7/OnmupEZV /OVb/gYpQ9pzOK8g4uPXFqsOCKxjw0boqWHZFrBxk8Xp9k7DDhL8Qntc76mUqMOt/DHw 1q9CS2/S3V3kNxxVJ/yt73bLQ0Ipc2PVHJmpqCOw0HLdNWtzZqIyrVoFK253hweYIXpb E5+VG9MDyvDdZDFYDBykqR+m3Bv2ebQ+EHn7VK3bsQc7M9P8wzSBK+UODdEFl35vzb13 PdRkh5rcAHQ6SRSz9cddZt8HaDPoTeFFExDgIXuZEQ1b7Akt8jO10hZWhFxkEn1LLW2g oVKg==; dara=google.com ARC-Authentication-Results: i=1; gmr-mx.google.com; dkim=pass header.i=@swupdate.org header.s=s1-ionos header.b=mhWLTbvf; spf=pass (google.com: domain of stefano.babic@swupdate.org designates 212.227.126.130 as permitted sender) smtp.mailfrom=stefano.babic@swupdate.org Received: from mout.kundenserver.de (mout.kundenserver.de. [212.227.126.130]) by gmr-mx.google.com with ESMTPS id c9-20020a2ea1c9000000b002d26782e8f1si665088ljm.7.2024.02.28.08.54.01 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 28 Feb 2024 08:54:01 -0800 (PST) Received-SPF: pass (google.com: domain of stefano.babic@swupdate.org designates 212.227.126.130 as permitted sender) client-ip=212.227.126.130; X-UI-Sender-Class: 55c96926-9e95-11ee-ae09-1f7a4046a0f6 Received: from paperino.fritz.box ([88.217.136.221]) by mrelayeu.kundenserver.de (mreue011 [213.165.67.97]) with ESMTPSA (Nemesis) id 1Md6dH-1r5UPT24Qt-00aAHu; Wed, 28 Feb 2024 17:54:00 +0100 From: Stefano Babic To: swupdate@googlegroups.com Cc: Stefano Babic Subject: [swupdate] [PATCH V2 1/2] handler: eMMC internal register Date: Wed, 28 Feb 2024 17:53:55 +0100 Message-Id: <20240228165356.3993592-1-stefano.babic@swupdate.org> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 X-Provags-ID: V03:K1:RyZ3sPxKLiG7NfN6Y7/ZZAFi73FwKyLwv5PEI34S0bBGNuDDnsE yTvuPmdxY/sswVcMg8wsOnH4FQmnGlythmSoe2YP6HkYRoeHH0V7eRG3Fqf3YmdZnh+G2lM sFj7RtqBON7fxocsqOe+/8+4ygoN3CMWhS0WGcpf5XnznhqehTxYrkyJ9bS23DJ7st9R/CA 4e2FsbFwZ8eIQKWCtNQVA== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:HP+udMh/BL4=;VhwoZkI33K0hn5lnyH65Rstg/DV SDhQLoUQePq+L+IKgcXR2t8SD8XpYlfimwznRv5BGuYVLSUcga3LCdQXyByyaMdTwaJhyq/qq h9rcNBvGlS7Jlu3eZ74HgdUrvoklTKPs8/rEn+pyMUngCdSCbLw0gHR3kR4QCT1rDFHxeLVVc +9EJDiGO8J88HVoAwqxc0NLbA9Hs+ogZLkThm+unN8s/EM/eR1EwPUAuJGSau/x3KaEOInTMJ 1EVMlStSpVyLbb69J8R3OrZ6z6pu9lAykVaAGW2NBR+ZYbP5UfUc0RyAthxD855q70XE7z2Pl HEHiTBZIIVZPEgwTAkbZfMGQTkMNIRUAJJXh2w/GKu9y43jWwudRFkFTmbC8kooRxbbmpvvSG 4S7Ln1yzb3+pKQX8fco0sAvCf5i8OCHV9HBrgdSfeKTUfqJK2e//Ila0qvwSllclww8M0/Ztr W77fU7lUcz0mxHHHgCKcyEDNumu6CZc1EF3qYvE2kmGgNd5tVWNCRfLvSlLzzUTXY1uuNqdQl DlR2MDH43JMhiwdDoE6RjXY6FkQYZrxXgJ894nu4O9FUU5ymZ5gLEqtIB4b27tzhIVntY2bQF VKWsNBJ/YdaH/UZfpSfwGrBD3yZgJEtAky/XouhZl+vtz7jqWz6pp+Kd1YR/fHfJSmxeEExDS Y4Lx0Yv3EyCzHaDoGrbVK40GWnXCME2w1AwRSrHchuLOsFjYDrT38XI/nofgJDVVrjNSX7hrJ cWmghkpBKGcgAot2trDTGemVyGX7osPh9yHxCVtzaQ4ZWvXnonJoUQ= X-Original-Sender: stefano.babic@swupdate.org X-Original-Authentication-Results: gmr-mx.google.com; dkim=pass header.i=@swupdate.org header.s=s1-ionos header.b=mhWLTbvf; spf=pass (google.com: domain of stefano.babic@swupdate.org designates 212.227.126.130 as permitted sender) smtp.mailfrom=stefano.babic@swupdate.org 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: , This adds support for managing hardware functions in eMMC device. First version of the handler supports toggeling of the hardware boot partitions. Signed-off-by: Stefano Babic --- Changes since V1: - check for returned active partition to exclude user Boot Area - Add trace to log which becomes the next boot device corelib/Makefile | 3 +- corelib/emmc.h | 140 ++++++++++++++++++++++++++++++++++++ corelib/emmc_utils.c | 110 ++++++++++++++++++++++++++++ handlers/Config.in | 11 +++ handlers/Makefile | 1 + handlers/emmc_csd_handler.c | 75 +++++++++++++++++++ include/util.h | 4 ++ 7 files changed, 343 insertions(+), 1 deletion(-) create mode 100644 corelib/emmc.h create mode 100644 corelib/emmc_utils.c create mode 100644 handlers/emmc_csd_handler.c -- 2.34.1 diff --git a/corelib/Makefile b/corelib/Makefile index 7e706d87..5917e379 100644 --- a/corelib/Makefile +++ b/corelib/Makefile @@ -2,7 +2,8 @@ # # SPDX-License-Identifier: GPL-2.0-only -lib-y += multipart_parser.o \ +lib-y += emmc_utils.o \ + multipart_parser.o \ parsing_library_libjson.o \ server_utils.o lib-$(CONFIG_DOWNLOAD) += downloader.o diff --git a/corelib/emmc.h b/corelib/emmc.h new file mode 100644 index 00000000..35f8a304 --- /dev/null +++ b/corelib/emmc.h @@ -0,0 +1,140 @@ +/* + * (C) Copyright 2024 + * Stefano Babic, stefano.babic@swupdate.org + * + * SPDX-License-Identifier: GPL-2.0-only + */ + +#pragma once + +/* From kernel linux/mmc/mmc.h */ +#define MMC_SEND_EXT_CSD 8 /* adtc R1 */ +#define MMC_SWITCH 6 /* ac [31:0] See below R1b */ +#define MMC_SEND_EXT_CSD 8 /* adtc R1 */ +#define MMC_SEND_STATUS 13 /* ac [31:16] RCA R1 */ +#define MMC_SWITCH_MODE_WRITE_BYTE 0x03 /* Set target to value */ + +/* From kernel linux/mmc/core.h */ +#define MMC_RSP_NONE 0 /* no response */ +#define MMC_RSP_PRESENT (1 << 0) +#define MMC_RSP_136 (1 << 1) /* 136 bit response */ +#define MMC_RSP_CRC (1 << 2) /* expect valid crc */ +#define MMC_RSP_BUSY (1 << 3) /* card may send busy */ +#define MMC_RSP_OPCODE (1 << 4) /* response contains opcode */ + +#define MMC_CMD_AC (0 << 5) +#define MMC_CMD_ADTC (1 << 5) +#define MMC_CMD_BC (2 << 5) + +#define MMC_RSP_SPI_S1 (1 << 7) /* one status byte */ +#define MMC_RSP_SPI_BUSY (1 << 10) /* card may send busy */ + +#define MMC_RSP_SPI_R1 (MMC_RSP_SPI_S1) +#define MMC_RSP_SPI_R1B (MMC_RSP_SPI_S1|MMC_RSP_SPI_BUSY) + +#define MMC_RSP_R1 (MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE) +#define MMC_RSP_R1B (MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE|MMC_RSP_BUSY) + +/* + * EXT_CSD fields + */ +#define EXT_CSD_S_CMD_SET 504 +#define EXT_CSD_HPI_FEATURE 503 +#define EXT_CSD_BKOPS_SUPPORT 502 /* RO */ +#define EXT_CSD_SUPPORTED_MODES 493 /* RO */ +#define EXT_CSD_FFU_FEATURES 492 /* RO */ +#define EXT_CSD_FFU_ARG_3 490 /* RO */ +#define EXT_CSD_FFU_ARG_2 489 /* RO */ +#define EXT_CSD_FFU_ARG_1 488 /* RO */ +#define EXT_CSD_FFU_ARG_0 487 /* RO */ +#define EXT_CSD_CMDQ_DEPTH 307 /* RO */ +#define EXT_CSD_CMDQ_SUPPORT 308 /* RO */ +#define EXT_CSD_NUM_OF_FW_SEC_PROG_3 305 /* RO */ +#define EXT_CSD_NUM_OF_FW_SEC_PROG_2 304 /* RO */ +#define EXT_CSD_NUM_OF_FW_SEC_PROG_1 303 /* RO */ +#define EXT_CSD_NUM_OF_FW_SEC_PROG_0 302 /* RO */ +#define EXT_CSD_DEVICE_LIFE_TIME_EST_TYP_B 269 /* RO */ +#define EXT_CSD_DEVICE_LIFE_TIME_EST_TYP_A 268 /* RO */ +#define EXT_CSD_PRE_EOL_INFO 267 /* RO */ +#define EXT_CSD_FIRMWARE_VERSION 254 /* RO */ +#define EXT_CSD_CACHE_SIZE_3 252 +#define EXT_CSD_CACHE_SIZE_2 251 +#define EXT_CSD_CACHE_SIZE_1 250 +#define EXT_CSD_CACHE_SIZE_0 249 +#define EXT_CSD_SEC_FEATURE_SUPPORT 231 +#define EXT_CSD_BOOT_INFO 228 /* R/W */ +#define EXT_CSD_BOOT_MULT 226 /* RO */ +#define EXT_CSD_HC_ERASE_GRP_SIZE 224 +#define EXT_CSD_HC_WP_GRP_SIZE 221 +#define EXT_CSD_SEC_COUNT_3 215 +#define EXT_CSD_SEC_COUNT_2 214 +#define EXT_CSD_SEC_COUNT_1 213 +#define EXT_CSD_SEC_COUNT_0 212 +#define EXT_CSD_PART_SWITCH_TIME 199 +#define EXT_CSD_REV 192 +#define EXT_CSD_BOOT_CFG 179 +#define EXT_CSD_PART_CONFIG 179 +#define EXT_CSD_BOOT_BUS_CONDITIONS 177 +#define EXT_CSD_ERASE_GROUP_DEF 175 +#define EXT_CSD_BOOT_WP_STATUS 174 +#define EXT_CSD_BOOT_WP 173 +#define EXT_CSD_USER_WP 171 +#define EXT_CSD_FW_CONFIG 169 /* R/W */ +#define EXT_CSD_WR_REL_SET 167 +#define EXT_CSD_WR_REL_PARAM 166 +#define EXT_CSD_SANITIZE_START 165 +#define EXT_CSD_BKOPS_EN 163 /* R/W */ +#define EXT_CSD_RST_N_FUNCTION 162 /* R/W */ +#define EXT_CSD_PARTITIONING_SUPPORT 160 /* RO */ +#define EXT_CSD_MAX_ENH_SIZE_MULT_2 159 +#define EXT_CSD_MAX_ENH_SIZE_MULT_1 158 +#define EXT_CSD_MAX_ENH_SIZE_MULT_0 157 +#define EXT_CSD_PARTITIONS_ATTRIBUTE 156 /* R/W */ +#define EXT_CSD_PARTITION_SETTING_COMPLETED 155 /* R/W */ +#define EXT_CSD_GP_SIZE_MULT_4_2 154 +#define EXT_CSD_GP_SIZE_MULT_4_1 153 +#define EXT_CSD_GP_SIZE_MULT_4_0 152 +#define EXT_CSD_GP_SIZE_MULT_3_2 151 +#define EXT_CSD_GP_SIZE_MULT_3_1 150 +#define EXT_CSD_GP_SIZE_MULT_3_0 149 +#define EXT_CSD_GP_SIZE_MULT_2_2 148 +#define EXT_CSD_GP_SIZE_MULT_2_1 147 +#define EXT_CSD_GP_SIZE_MULT_2_0 146 +#define EXT_CSD_GP_SIZE_MULT_1_2 145 +#define EXT_CSD_GP_SIZE_MULT_1_1 144 +#define EXT_CSD_GP_SIZE_MULT_1_0 143 +#define EXT_CSD_ENH_SIZE_MULT_2 142 +#define EXT_CSD_ENH_SIZE_MULT_1 141 +#define EXT_CSD_ENH_SIZE_MULT_0 140 +#define EXT_CSD_ENH_START_ADDR_3 139 +#define EXT_CSD_ENH_START_ADDR_2 138 +#define EXT_CSD_ENH_START_ADDR_1 137 +#define EXT_CSD_ENH_START_ADDR_0 136 +#define EXT_CSD_NATIVE_SECTOR_SIZE 63 /* R */ +#define EXT_CSD_USE_NATIVE_SECTOR 62 /* R/W */ +#define EXT_CSD_DATA_SECTOR_SIZE 61 /* R */ +#define EXT_CSD_EXT_PARTITIONS_ATTRIBUTE_1 53 +#define EXT_CSD_EXT_PARTITIONS_ATTRIBUTE_0 52 +#define EXT_CSD_CACHE_CTRL 33 +#define EXT_CSD_MODE_CONFIG 30 +#define EXT_CSD_MODE_OPERATION_CODES 29 /* W */ +#define EXT_CSD_FFU_STATUS 26 /* R */ +#define EXT_CSD_SECURE_REMOVAL_TYPE 16 /* R/W */ +#define EXT_CSD_CMDQ_MODE_EN 15 /* R/W */ + + +/* + * EXT_CSD field definitions + */ +#define EXT_CSD_CONFIG_SECRM_TYPE (0x30) +#define EXT_CSD_SUPPORTED_SECRM_TYPE (0x0f) +#define EXT_CSD_FFU_INSTALL (0x01) +#define EXT_CSD_FFU_MODE (0x01) +#define EXT_CSD_NORMAL_MODE (0x00) +#define EXT_CSD_FFU (1<<0) +#define EXT_CSD_UPDATE_DISABLE (1<<0) +#define EXT_CSD_HPI_SUPP (1<<0) +#define EXT_CSD_HPI_IMPL (1<<1) +#define EXT_CSD_CMD_SET_NORMAL (1<<0) + + diff --git a/corelib/emmc_utils.c b/corelib/emmc_utils.c new file mode 100644 index 00000000..f12c7867 --- /dev/null +++ b/corelib/emmc_utils.c @@ -0,0 +1,110 @@ +/* + * (C) Copyright 2024 + * Stefano Babic, stefano.babic@swupdate.org + * + * SPDX-License-Identifier: GPL-2.0-only + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "emmc.h" +#include "util.h" + +/* + * Code taken from mmc-utils, mmc_cmds.c + */ +static int emmc_read_extcsd(int fd, __u8 *ext_csd) +{ + int ret = 0; + struct mmc_ioc_cmd idata; + memset(&idata, 0, sizeof(idata)); + memset(ext_csd, 0, sizeof(__u8) * 512); + idata.write_flag = 0; + idata.opcode = MMC_SEND_EXT_CSD; + idata.arg = 0; + idata.flags = MMC_RSP_SPI_R1 | MMC_RSP_R1 | MMC_CMD_ADTC; + idata.blksz = 512; + idata.blocks = 1; + mmc_ioc_cmd_set_data(idata, ext_csd); + + ret = ioctl(fd, MMC_IOC_CMD, &idata); + if (ret) + ERROR("eMMC ioctl return error %d", ret); + + return ret; +} + +static void fill_switch_cmd(struct mmc_ioc_cmd *cmd, __u8 index, __u8 value) +{ + cmd->opcode = MMC_SWITCH; + cmd->write_flag = 1; + cmd->arg = (MMC_SWITCH_MODE_WRITE_BYTE << 24) | (index << 16) | + (value << 8) | EXT_CSD_CMD_SET_NORMAL; + cmd->flags = MMC_RSP_SPI_R1B | MMC_RSP_R1B | MMC_CMD_AC; +} + +static int emmc_write_extcsd_value(int fd, __u8 index, __u8 value, unsigned int timeout_ms) +{ + int ret = 0; + struct mmc_ioc_cmd idata = {}; + + fill_switch_cmd(&idata, index, value); + + /* Kernel will set cmd_timeout_ms if 0 is set */ + idata.cmd_timeout_ms = timeout_ms; + + ret = ioctl(fd, MMC_IOC_CMD, &idata); + if (ret) + ERROR("eMMC ioctl return error %d", ret); + + return ret; +} /* end of imported code */ + +int emmc_get_active_bootpart(int fd) +{ + int ret; + uint8_t extcsd[512]; + int active; + + ret = emmc_read_extcsd(fd, extcsd); + + if (ret) + return -1; + + /* + * Return partition number starting from 0 + * This corresponds to mmcblkXboot0 and mmcblkXboot1 + */ + active = ((extcsd[EXT_CSD_PART_CONFIG] & 0x38) >> 3) - 1; + + return active; +} + +int emmc_write_bootpart(int fd, int bootpart) +{ + uint8_t value; + int ret; + uint8_t extcsd[512]; + + /* + * Do not clear BOOT_ACK + */ + ret = emmc_read_extcsd(fd, extcsd); + value = extcsd[EXT_CSD_PART_CONFIG] & (1 << 6); + + bootpart = ((bootpart + 1) & 0x3) << 3; + value |= bootpart; + + ret = emmc_write_extcsd_value(fd, EXT_CSD_PART_CONFIG, value, 0); + + return ret; +} diff --git a/handlers/Config.in b/handlers/Config.in index b01d033d..ca473646 100644 --- a/handlers/Config.in +++ b/handlers/Config.in @@ -140,6 +140,17 @@ config EMBEDDED_LUA_HANDLER_SOURCE Path to the Lua handler source code file to be embedded into the SWUpdate binary. + +config EMMC_HANDLER + bool "eMMC handler" + default n + help + This handler allows to switch the boot partitions via + the eMMC internal CSD register. One common use case is to + upgrade the bootloader, using the two hardware partitions + with a dual-copy concept. This guarantees that the upgrade + is power-cut safe. + config RAW bool "raw" default n diff --git a/handlers/Makefile b/handlers/Makefile index 24fd487c..12d4aeb8 100644 --- a/handlers/Makefile +++ b/handlers/Makefile @@ -14,6 +14,7 @@ obj-$(CONFIG_BTRFS_FILESYSTEM) += btrfs_handler.o obj-$(CONFIG_COPY) += copy_handler.o obj-$(CONFIG_CFI) += flash_handler.o obj-$(CONFIG_DELTA) += delta_handler.o delta_downloader.o zchunk_range.o +obj-$(CONFIG_EMMC_HANDLER) += emmc_csd_handler.o obj-$(CONFIG_DISKFORMAT_HANDLER) += diskformat_handler.o obj-$(CONFIG_DISKPART) += diskpart_handler.o obj-$(CONFIG_UNIQUEUUID) += uniqueuuid_handler.o diff --git a/handlers/emmc_csd_handler.c b/handlers/emmc_csd_handler.c new file mode 100644 index 00000000..27bd0257 --- /dev/null +++ b/handlers/emmc_csd_handler.c @@ -0,0 +1,75 @@ +/* + * (C) Copyright 2024 + * Stefano Babic, stefano.babic@swupdate.org + * + * SPDX-License-Identifier: GPL-2.0-only + */ +/* + * This handler manages the CSD register accoriding to eMMC + * specifications. Base for this handler are the mmcutils, + * see: + * https://git.kernel.org/pub/scm/utils/mmc/mmc-utils.git + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "swupdate_image.h" +#include "handler.h" +#include "util.h" + +void emmc_csd_handler(void); + +static int emmc_boot_toggle(struct img_type *img, void *data) +{ + int active, ret; + struct script_handler_data *script_data = data; + if (script_data->scriptfn == PREINSTALL) + return 0; + + /* Open the device (partition) */ + int fdin = open(img->device, O_RDONLY); + if (fdin < 0) { + ERROR("Failed to open %s: %s", img->device, strerror(errno)); + return -ENODEV; + } + + active = emmc_get_active_bootpart(fdin); + if (active < 0) { + ERROR("Current HW boot partition cannot be retrieved"); + close(fdin); + return -1; + } + + /* + * If User Partition is activated, does nothing + * and report this to the user. + */ + if (active > 1) { + WARN("Boot device set to User area, no changes !"); + ret = 0; + } else { + active = (active == 0) ? 1 : 0; + TRACE("Setting Boot to HW Partition %d", active); + ret = emmc_write_bootpart(fdin, active); + if (ret) + ERROR("Failure writing CSD register"); + } + + close(fdin); + return ret; +} + +__attribute__((constructor)) +void emmc_csd_handler(void) +{ + register_handler("emmc_boot_toggle", emmc_boot_toggle, + SCRIPT_HANDLER | NO_DATA_HANDLER, NULL); +} diff --git a/include/util.h b/include/util.h index 490014e7..e1350633 100644 --- a/include/util.h +++ b/include/util.h @@ -272,3 +272,7 @@ int swupdate_umount(const char *dir); /* Date / Time utilities */ char *swupdate_time_iso8601(struct timeval *tv); + +/* eMMC functions */ +int emmc_write_bootpart(int fd, int bootpart); +int emmc_get_active_bootpart(int fd); From patchwork Wed Feb 28 16:53:56 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefano Babic X-Patchwork-Id: 1905922 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=KZKPDwSY; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=googlegroups.com (client-ip=2a00:1450:4864:20::23a; helo=mail-lj1-x23a.google.com; envelope-from=swupdate+bncbaabbkwk7wxamgqeb23ajbi@googlegroups.com; receiver=patchwork.ozlabs.org) Received: from mail-lj1-x23a.google.com (mail-lj1-x23a.google.com [IPv6:2a00:1450:4864:20::23a]) (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 4TlL6W3Chjz23qY for ; Thu, 29 Feb 2024 03:54:11 +1100 (AEDT) Received: by mail-lj1-x23a.google.com with SMTP id 38308e7fff4ca-2d29a89434csf17940201fa.0 for ; Wed, 28 Feb 2024 08:54:11 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1709139244; cv=pass; d=google.com; s=arc-20160816; b=ZhyTkBwEJog5ey1u2exGpooL+kZup99LCjVlWwtV3S47mTSU9ApWsUKTd9ak3M0EJe y05k9WzmGp4KVnOuFNCt5YXbkRfQc9M++FPeh+ZjYysbA35+1xX2tu1isP3XFyRuhbpu nlv/ocq3pWpEpnRmyAMYOmHU/LpP29hEXFTo7Drohd06aGg6mr021jkWlMDJep8QcyQL 5nlm8Yc1O8eem6xcrOY9F2+LY1AXQfZn6C8t8AbpXivMj+plJrwhx4XSwjXxAH1lK2Y2 n0y82Tn746CDZamVBIcvC2icv7nQNXyCiAttQoIiajoRxcim5YRSQiSxsaXLMJHBD3EA 53Mw== 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:ui-outboundreport:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from:sender :dkim-signature; bh=ivADBFFhWYwFqkPW2o88Aqookye7iE+NVHS2uPEGVao=; fh=nFlegjUere2HcfyauHJXVCWfuNJlZ/2TekafumCRgOg=; b=kBQ2REjhn3zNlmLWGhejOFhy6IKV4ua67t7TggpFvarnf/QTwD/S2QkXGQkLPsrrDw mv4IwMEznFbUVB8fGRYAeSbjTDa4vaHUVF2Ww5hGMPLoL3qiktUHqfBqJXDbSZNM+X57 2ETkbodqDZaCIg8s7a+09TZk3XbI3IMDwzfc4G1cRzxImvq/miASNCtWO/XAy+YTOFzf 2TL3sN1ZFALx5vhXnpuTGArmpu8HGZFiAGP6NzXZDT9JwFb5Lo7E+FHyvbRS/ow+l1eE 1rB8k73CV2ioYjIFx4IOt5VSLs7TChkY8gXxi3CclXSleny6N/Gh5Doq5yTyPpGMRvB5 s7kQ==; darn=patchwork.ozlabs.org ARC-Authentication-Results: i=2; gmr-mx.google.com; dkim=pass header.i=@swupdate.org header.s=s1-ionos header.b=EdI9sSGW; spf=pass (google.com: domain of stefano.babic@swupdate.org designates 212.227.126.135 as permitted sender) smtp.mailfrom=stefano.babic@swupdate.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlegroups.com; s=20230601; t=1709139244; x=1709744044; 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:ui-outboundreport:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:sender:from:to:cc :subject:date:message-id:reply-to; bh=ivADBFFhWYwFqkPW2o88Aqookye7iE+NVHS2uPEGVao=; b=KZKPDwSYms33+G4dRKHjrilQMCFGsGwAoZh3ore/El0gTMksM1vUBCeE3sPvta6gcc vJZs1sQj9t8eU/YyAPmtMepRME+quxbwrgB8fWQV/Ara55wc8dEnVocHVtefkazjg/uK gvAXD5S6+KrM2pg2ob4m8KiLxOo9vXvSM1nFlTY1/wjXtLq8MjltBmD3lB/T9JkX6R5m zx7Ei8YQT03HifNJpism/SWOjvEu2OY8E+Rj8E+lI67xepCOOfIaMrlWUmwOGphU65hK kF99F03Xfn/i0zAD2tWulPR7tam7ds3xivzNIeJgZ6Jmnp7IrZz+IfiHw7bBszu1/I0k bMgg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1709139244; x=1709744044; 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 :ui-outboundreport:mime-version:references:in-reply-to:message-id :date:subject:cc:to:from:x-beenthere:x-gm-message-state:sender:from :to:cc:subject:date:message-id:reply-to; bh=ivADBFFhWYwFqkPW2o88Aqookye7iE+NVHS2uPEGVao=; b=KFNxzt5P0dpj2mP5VJp45+08Si3pxY2cTXJQBuO5Pv1PidEjV+XPa0D1FV3tQWVrOT DHq89LZEUV71/NSOlFxwg2V5WnXFa3lEZYpY5u5JiBAcx1BNzn9yzjzrzm7OjSIl+Lx3 73+uJ5NzBKzFFrYKNYrUZ2+ImlvFc4fMdGB8u+TULjywa8r0/wJsdNzHfkj4mbEBg1m1 iMyPb1ccKt+32Fzkf1wHy1BGVlpE04xKhtXl4rl9PwefYhN1cyL/12SJjIDQtyT2zq5G EyaZfPEuLeDxQnG85lVA7/NbBGcp5Dd9WWYA4zPu8EidCKXg6AogYzdJtkHIXzr7dnW5 9aDQ== Sender: swupdate@googlegroups.com X-Forwarded-Encrypted: i=2; AJvYcCXeejT/ArwamF75raWAUgxOzbasn7zLWlN13SJi/Tu5UTinIM9AdR7eiPRDl2IAxZohrXx40DbX9ifSonrmtehkKJ9HN6kPf7yIDnDm0A== X-Gm-Message-State: AOJu0YwJPFfHYmvJJQCKZDeFColjRF6yx8E9tBmqSVVqIwuZ8k7QZKss 8MB63ya/J8oceCOVGRLfuOe+1Bt3zYeokq9X3CT4sOKK3plSQ2jK X-Google-Smtp-Source: AGHT+IEhzYpLNCnGBaGb1YyIw0+6AYObqipufxaxzpzVG8c/gAtSIhXn3/wv4RX8UIN0HkdNAR7hVw== X-Received: by 2002:a2e:9415:0:b0:2d2:ed53:6544 with SMTP id i21-20020a2e9415000000b002d2ed536544mr18423ljh.32.1709139243348; Wed, 28 Feb 2024 08:54:03 -0800 (PST) X-BeenThere: swupdate@googlegroups.com Received: by 2002:a2e:a4d5:0:b0:2d2:99e8:bbb8 with SMTP id p21-20020a2ea4d5000000b002d299e8bbb8ls267509ljm.1.-pod-prod-01-eu; Wed, 28 Feb 2024 08:54:01 -0800 (PST) X-Received: by 2002:a05:651c:1246:b0:2d2:b17a:1724 with SMTP id h6-20020a05651c124600b002d2b17a1724mr2617634ljh.19.1709139241268; Wed, 28 Feb 2024 08:54:01 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1709139241; cv=none; d=google.com; s=arc-20160816; b=HJsGZniDqh+4r8ZS40iDc7BEa/JQK5APL5L+7cm3pVONwKeQeSPdNChD7U3eumQPP6 EV+9rsURjDa6US68443ljCoa4xdQaVR/MaxAkjhIxrgjLAu5g5POzidFatUHhmcpoV8I UqgPZqjV6AkqLZlCD7igFagHtbVULp6ZbVtnLLPOIldO/E8LjlWyvPikc5jaB+y8mXdg aJ7imEJWvF/SGSESi2rEK82PMvHPJDa5nmkbPwLBJcpmuQipn80t07salceK4TG9XwFP 1DhIDKJaoQJ9XeKXMCVmCVkvEyDpS931wBCw9RdEPO9GEwAaYLFjuBsRg0Cj0hQl5p9u Au7Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=ui-outboundreport:content-transfer-encoding:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:dkim-signature; bh=vXLsQGS1MenIVfWWuROqEFmHG01iEP4dHMkl+SaAvnM=; fh=TiEWcqMcKpHk5s7uErzpntoONrNfOXwKpI5P8bIlggk=; b=DcuA4+zqR7gbSLpRzqslw4Vh3RWmxEnxJJUUp447JSx5uLEwfzTA5J6ew2OSDYgS42 /3WgyJ/FvH9GM358YzdMdLJ56S63SfIbJEezEsgK/zDydfPdUXfsSbQGqUoaIAlPngVY q1wAmz0jPjAEVNhVpFhe4NbeGUhFn8vvmF0grvXajVGSqvBF0O9SaV+q1siYt1NLiakh kY6T62DAvcHIyypJu9ERfvK18UL6krR/riiZQKRyJfYudftfyVJ8ryb5Tn7YuoLOX/A8 0vZhHb8SJKks8xKjCF0Dnf3XrfltHIkw36A0XRivpGpTDQcTSoYZgP6hujrkbPDnurhU dmMA==; dara=google.com ARC-Authentication-Results: i=1; gmr-mx.google.com; dkim=pass header.i=@swupdate.org header.s=s1-ionos header.b=EdI9sSGW; spf=pass (google.com: domain of stefano.babic@swupdate.org designates 212.227.126.135 as permitted sender) smtp.mailfrom=stefano.babic@swupdate.org Received: from mout.kundenserver.de (mout.kundenserver.de. [212.227.126.135]) by gmr-mx.google.com with ESMTPS id h5-20020a05600c350500b00412ae42bfa1si168594wmq.1.2024.02.28.08.54.01 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 28 Feb 2024 08:54:01 -0800 (PST) Received-SPF: pass (google.com: domain of stefano.babic@swupdate.org designates 212.227.126.135 as permitted sender) client-ip=212.227.126.135; X-UI-Sender-Class: 55c96926-9e95-11ee-ae09-1f7a4046a0f6 Received: from paperino.fritz.box ([88.217.136.221]) by mrelayeu.kundenserver.de (mreue011 [213.165.67.97]) with ESMTPSA (Nemesis) id 1MUGuZ-1rVeA72bn1-00RKcI; Wed, 28 Feb 2024 17:54:00 +0100 From: Stefano Babic To: swupdate@googlegroups.com Cc: Stefano Babic Subject: [swupdate] [PATCH 2/2] Lua: add function emmcbootpart Date: Wed, 28 Feb 2024 17:53:56 +0100 Message-Id: <20240228165356.3993592-2-stefano.babic@swupdate.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240228165356.3993592-1-stefano.babic@swupdate.org> References: <20240228165356.3993592-1-stefano.babic@swupdate.org> MIME-Version: 1.0 X-Provags-ID: V03:K1:IJYlOUUQSX2aOvVQ0hlD58aiUdHUq4ocajWGx/JHSfMKvd14/XX ZqEaEo5BXGrN86N99d5w6CWwtMi5aVnv1n2FJNXtGMOe/C7nc2kutI+a+Yd1GYDpa1SUgW1 qw3EwD07hwfzqLrJcpFcAYgmSdd2nxGN515BA4dcWBMTWvwXBrAagM4Vf/STVLoNb/qCaKJ Wds5iUP8dxdCFEvATogjw== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:e9R1S6b809U=;vydi4sMiN/7io3Rgppqpuyel3Oq xYy+yhb09jg/YTmaCBkxYc90wcCaaiMUr8WTBNCiE23+VUiKBigMTap92VkYbOL560XFaYGrb jXX5HVTCRUZy/wXuf/Xl8FjNtvxSTP3fRI9xmMbk0I1+3jb+DFJ9ptSfYX96QHeJz7Ua3Ixs1 JsyUOhnvoiGAf4sl7JqjRZ8oemRHZjjY+tFtrUxwc+bOAh1cD02KwzZP24EiWa/CGx2iZOnVv kBuqAdWq0rTwz7RiX7sgAg4lC7AsTzjz+dD8vcFiXU/Byowt4/cAiKtE23fD1KjKCvlYlzua7 YfVDoepMUctTUOuERJda8ivNPbqGzVRLzNu/CWa+XhVpAQOwflT1RurL4reAUEotMDjRWexIh FZeugCU8KHnnazLT1bIUJU9GcnAvek8LrXu2mH/aCy5djpL/R0PG5rwLx0fHVv6TJyb3sRIiV zaulzt5valah3SkLIRxYky4nfLvKq+md8mDUjoI9NcChshGfh+aRKQVk5yWbdpVJIVs4TyWAW 4HJVhJiC7msO7C4dOho5zvRQWMJfkD2SES3gjDRow94/ePGWhzMZB1RCFgjr3n0qNIwz2PuFe 6HOY7Uun9HvlM3/zKmSWfUbIRa9ibROK1LskuN5XAUacfVAdY0FhLu+Bo8rlma3hNEfAqU9A4 95WCAyqi4nu3UGYmEFbgKmswl0oQ6twMNsw8f69KXRi7mfZHlgNyIYUl6/evPPV/Ld2EUy5yM aePohkPbRzbvL1+dmChEzn49+0R7C3gCpFuNmwEzfKbMFsNtR+34WQ= X-Original-Sender: stefano.babic@swupdate.org X-Original-Authentication-Results: gmr-mx.google.com; dkim=pass header.i=@swupdate.org header.s=s1-ionos header.b=EdI9sSGW; spf=pass (google.com: domain of stefano.babic@swupdate.org designates 212.227.126.135 as permitted sender) smtp.mailfrom=stefano.babic@swupdate.org 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: , Function returns the HW boot device of an eMMC. Signed-off-by: Stefano Babic --- Changes since V1: - no changes corelib/lua_interface.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) -- 2.34.1 diff --git a/corelib/lua_interface.c b/corelib/lua_interface.c index de3b8702..a9e30b33 100644 --- a/corelib/lua_interface.c +++ b/corelib/lua_interface.c @@ -967,6 +967,22 @@ l_get_hw_exit: return 1; } +static int l_get_emmc_bootpart(lua_State *L) +{ + const char *device = luaL_checkstring(L, 1); + int active = -1, fd; + + if (device) { + fd = open(device, O_RDONLY); + if (fd) { + active = emmc_get_active_bootpart(fd); + close(fd); + } + } + lua_pushinteger(L, active); + return 1; +} + static void lua_push_enum(lua_State *L, const char *name, int value) { lua_pushstring(L, name); @@ -1188,6 +1204,7 @@ static const luaL_Reg l_swupdate[] = { { "get_hw", l_get_hw }, { "getversion", lua_get_swupdate_version }, { "progress", lua_notify_progress }, + { "emmcbootpart", l_get_emmc_bootpart }, { NULL, NULL } };