From patchwork Thu Dec 31 22:48:51 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Anderson X-Patchwork-Id: 1421622 X-Patchwork-Delegate: trini@ti.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: 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=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=seco.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=secospa.onmicrosoft.com header.i=@secospa.onmicrosoft.com header.a=rsa-sha256 header.s=selector2-secospa-onmicrosoft-com header.b=x6wPhEOT; dkim-atps=neutral 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 RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4D6Nfx0dGPz9s1l for ; Fri, 1 Jan 2021 09:51:05 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 0901E82675; Thu, 31 Dec 2020 23:49:52 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=fail (p=none dis=none) header.from=seco.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; unprotected) header.d=secospa.onmicrosoft.com header.i=@secospa.onmicrosoft.com header.b="x6wPhEOT"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 14D5E82646; Thu, 31 Dec 2020 23:49:34 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-1.6 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,FORGED_SPF_HELO,MSGID_FROM_MTA_HEADER,RCVD_IN_DNSWL_LOW, SPF_HELO_PASS autolearn=no autolearn_force=no version=3.4.2 Received: from EUR04-VI1-obe.outbound.protection.outlook.com (mail-vi1eur04on0631.outbound.protection.outlook.com [IPv6:2a01:111:f400:fe0e::631]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 6EF9682607 for ; Thu, 31 Dec 2020 23:49:29 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=seco.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=sean.anderson@seco.com ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=liLKBGv8FAWtSdvbzAcOTYhFy+rzYjvuhXwKQAGTSI4w+px6PihKtVyfvzCi43SXnoAgDzTiUUr+ICm1DsP+InenfS/2OiVxmKgatW5HEhU+NG9gswD5RuCECoEWZwPXfY6hv4bKM3bwLdtrN7E+wgWabM8otBqiV5gQVdFm23WQq6gXZuHDP+ZbZhX1+jd7Bi6swa5sQoem07e7979ifbRonY1qnZpfvUAj5IFNVUc4ySSOrCEFhL1ymU7L1VnjNWg869Gv1I86ocYxHDVWDb/kt0lzS9APufwBGQ6HF4HAYfg7O0cwjh0dqh3yucPF/4OTV4RRsDZ4A9kSZHmnMw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=zy1oKs0GhX2CKlHbfZwWCb2RJjBCwkjMxlPRriwLkHo=; b=b52OAGUUNtthnd+rxMyKAxArVuxrDUPW6rZe9awDt7s/lhZq0DNiYiZSVGQR94Ru3uzLppvggJ7ejESfG6XiQbqqVJVEklUPtFIjE9MEZKUsqSic1jQbOi45c23njvByxMN0IcSRVDHLEB9Zku7EbiFdIZexdlxNP80LFs0bYgc+XbsWEDNEmIXq2/9tJ1f/oi4WKi2WZhgTEbaYtTiXQJBlV4CfkJy5SzSGiGsy3tFCqtZ1+e0s9Tbd00gCTnJBJ3ON09naNjmZPJxN8/V5tDB8dlgskocJ1g5ARRpGpEZ4G91/1Br08ZYhv+YR386jyBJukYfxuBF2JHlp4gWwTA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=seco.com; dmarc=pass action=none header.from=seco.com; dkim=pass header.d=seco.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=secospa.onmicrosoft.com; s=selector2-secospa-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=zy1oKs0GhX2CKlHbfZwWCb2RJjBCwkjMxlPRriwLkHo=; b=x6wPhEOTW25trZqgpGJex7YqLiBAqTkU04CILd9mowoMzxpOj4jFXT0D6sDLw6LskBotGMP4UgcG8N05YfKw2XTkgxoH37iCB7dE8NVebtj2VeKHtOeBMhC1jFWhGwcLThEd2An5oD7Cw0OUyp1tKLdLUKP52K71+Os19REDTRg= Authentication-Results: lists.denx.de; dkim=none (message not signed) header.d=none;lists.denx.de; dmarc=none action=none header.from=seco.com; Received: from AM9PR03MB7251.eurprd03.prod.outlook.com (20.182.235.144) by AM0PR03MB5812.eurprd03.prod.outlook.com (10.255.28.81) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3721.20; Thu, 31 Dec 2020 22:49:28 +0000 Received: from AM9PR03MB7251.eurprd03.prod.outlook.com ([fe80::c800:6bd1:64e4:6644]) by AM9PR03MB7251.eurprd03.prod.outlook.com ([fe80::c800:6bd1:64e4:6644%7]) with mapi id 15.20.3700.031; Thu, 31 Dec 2020 22:49:28 +0000 From: Sean Anderson To: u-boot@lists.denx.de Cc: Simon Glass , Sean Anderson , Filip Brozovic , mingming lee Subject: [PATCH 8/9] fastboot: Allow u-boot-style partitions Date: Thu, 31 Dec 2020 17:48:51 -0500 Message-Id: <20201231224853.1431364-9-sean.anderson@seco.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20201231224853.1431364-1-sean.anderson@seco.com> References: <20201231224853.1431364-1-sean.anderson@seco.com> X-Originating-IP: [50.195.82.171] X-ClientProxiedBy: BLAPR03CA0128.namprd03.prod.outlook.com (2603:10b6:208:32e::13) To AM9PR03MB7251.eurprd03.prod.outlook.com (2603:10a6:20b:26e::16) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from plantagenet.inhand.com (50.195.82.171) by BLAPR03CA0128.namprd03.prod.outlook.com (2603:10b6:208:32e::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3721.20 via Frontend Transport; Thu, 31 Dec 2020 22:49:27 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 134bb740-55e7-4074-103d-08d8adde547f X-MS-TrafficTypeDiagnostic: AM0PR03MB5812: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:2657; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: z6q4naqBXPP6OkJyqoEc6X5gAZf62BXOu1mDsMLiEOEimJk4xzxlYmepDlKD8j0X9DfJBpvf5Twt4sCaWX2tYCraOZtyIWJR6yeFTSX7fZQYmP1shVWCIoMeXxZFOIGMO0Lcn56pHI3ZFv5k7JfEnH4gk7sS2FOW8i0Tx1CBVh832I509g8DWlXjnLt2nLtlSPkyqmdd+NeEYEnAzDj1cVzRKQWZErsfhK0hKa/owwV7sAsnsQDmTCWxR0V+7P5ejnE3wu9MtzIMkLH+ZSLh83dDYYbsbdOq/ClUR7VK7J1fBw2BXqgvKRU8e4XBnilzP+OMCrCr+JKcujAgMt8IljZjYEfuCy00S7ztxF/Svc7z3T5GmCssauXDFRL8VHxc2yPCHYP1e8v7ut8o0cHTDQ== X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:AM9PR03MB7251.eurprd03.prod.outlook.com; PTR:; CAT:NONE; SFS:(39840400004)(136003)(396003)(376002)(366004)(346002)(36756003)(66476007)(66556008)(956004)(26005)(52116002)(8936002)(44832011)(316002)(54906003)(478600001)(2616005)(6486002)(16526019)(1076003)(4326008)(186003)(5660300002)(6916009)(6512007)(2906002)(6506007)(66946007)(8676002)(86362001)(83380400001)(30864003)(6666004); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData: KVOJtQoOjyS7E5J+xL5yW/AqZf9vR3DM/h7dzUnvdeH7XSZkDz4ZQ4rjKx5ApgfYdJHtKOjklH7WsDVoLmCPjC//LwlOsAPFIuf1KMDhNFbYaeEvu3n6wHlhQA1x4lsClTLoSs5FDNZyOqgKH08gVr2WdIm7Jr0JCLGMCn4gJg83LqEDoW3LRT2ANcPhvpsv1q6lNz9S8qQ3u48g4QYFsGddRa/nNz1utpDXSrJnNMwibZ3WMODpFc9N4kGl8Ubdh//aLxUhoDjLwK7sn9EgBkfdkLBvowFgU2ZhCTP+v2CivwdO1JXmW/5UIAa8TuXzyiAk8J5yma2N9Mp+n2GBuixhPo1WqtuVTmj98cOBO/d6KFgqsLzEc7TkeWiSXoviroZ7ihZA83taGRb4IBPfW5AAq6l0ddaSBDMroTIXJbX069scEghpUKJDyP515WLKMZQbB4lIvb1Jc2K2AUSnB8YdBz4UnZFI5ZA0GChU+jx3hYDe2YgtmT8Qgm5dDCZDtGiWTA/mZJqctn1HfBpqETBc0H7DXHSEHLAlmMhMp9kz2c58yo0TTtQmBB4jbc4rBxU3o2zY/gfBppTaC60zOXJ/Q46eZ6ruRNnaSSyuRms0ZutMiw6M5/VUByYVzjZN31ZBFgkH11qvtv1oJOsFUuPUrDy3j2ZM1OXXXKvgYCcBQbI6s1Df34ZTq93pvgy/R1k2qNWlpsByk/AkHCnI73WlYn8jTR81bJI/a9okM6orTkc31ZhJD02TxGxKgt7ETIFsWggYm9H+B12CmWWJ4KzeN8wEWykJCzvbuYK8x5GoobePuoSKtfw5iinuvvKrM+HjYZgDvwTPQ03YtycXruqY1BIJXcPkV2eVXYJpjPk17osAuVcPS6iS/AxptN7KjEcfmzTgrnY+B0aXiFgJeOvdyKye7TY8OASDoiQ4KN2fmQvFiYd/C9DoqEtcSJXZi2nwgI8byVOkSy8lwBIodJbUe/R+4xe7GlzCo5gFUrV6AR9S7B0WScON/tNiZQur X-OriginatorOrg: seco.com X-MS-Exchange-CrossTenant-AuthSource: AM9PR03MB7251.eurprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 31 Dec 2020 22:49:28.4445 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: bebe97c3-6438-442e-ade3-ff17aa50e733 X-MS-Exchange-CrossTenant-Network-Message-Id: 134bb740-55e7-4074-103d-08d8adde547f X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: H6wiqUNbRHQLyZ0NabXpMQcPMGBEOBPDgYx5kbL1Cbw+1SP17uU/74nenxRc+SN3+piQAF35dLZMXUicRlHa5Q== X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM0PR03MB5812 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 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.102.3 at phobos.denx.de X-Virus-Status: Clean This adds support for partitions of the form "dev.hwpart:part" and "dev#partname". This allows one to flash to eMMC boot partitions without having to use CONFIG_FASTBOOT_MMC_BOOT1_SUPPORT. It also allows one to flash to an entire device without needing CONFIG_FASTBOOT_MMC_USER_NAME. Lastly, one can also flash MMC devices other than CONFIG_FASTBOOT_FLASH_MMC_DEV. Because devices can be specified explicitly, CONFIG_FASTBOOT_FLASH_MMC_DEV is used only when necessary for existing functionality. For those cases, fastboot_mmc_get_dev has been added as a helper function. This allows There should be no conflicts with the existing system, but just in case, I have ordered detection of these names after all existing names. The fastboot_mmc_part test has been updated for these new names. Signed-off-by: Sean Anderson Reviewed-by: Simon Glass --- drivers/fastboot/fb_mmc.c | 150 +++++++++++++++++++++++--------------- test/dm/fastboot.c | 37 +++++++++- 2 files changed, 127 insertions(+), 60 deletions(-) diff --git a/drivers/fastboot/fb_mmc.c b/drivers/fastboot/fb_mmc.c index b0610d3151..a52b1e3ed6 100644 --- a/drivers/fastboot/fb_mmc.c +++ b/drivers/fastboot/fb_mmc.c @@ -37,6 +37,7 @@ static int raw_part_get_info_by_name(struct blk_desc *dev_desc, char *raw_part_desc; const char *argv[2]; const char **parg = argv; + int ret; /* check for raw partition descriptor */ strcpy(env_desc_name, "fastboot_raw_partition_"); @@ -60,7 +61,7 @@ static int raw_part_get_info_by_name(struct blk_desc *dev_desc, info->start = simple_strtoul(argv[0], NULL, 0); info->size = simple_strtoul(argv[1], NULL, 0); - info->blksz = dev_desc->blksz; + info->blksz = *dev_desc->blksz; strncpy((char *)info->name, name, PART_NAME_LEN); if (raw_part_desc) { @@ -76,12 +77,37 @@ static int raw_part_get_info_by_name(struct blk_desc *dev_desc, return 0; } -static int part_get_info_by_name_or_alias(struct blk_desc *dev_desc, - const char *name, struct disk_partition *info) +static int do_get_part_info(struct blk_desc **dev_desc, const char *name, + struct disk_partition *info) +{ + int ret; + + /* First try partition names on the default device */ + *dev_desc = blk_get_dev("mmc", CONFIG_FASTBOOT_FLASH_MMC_DEV); + if (*dev_desc) { + ret = part_get_info_by_name(*dev_desc, name, info); + if (ret >= 0) + return ret; + + /* Then try raw partitions */ + ret = raw_part_get_info_by_name(*dev_desc, name, info); + if (ret >= 0) + return ret; + } + + /* Then try dev.hwpart:part */ + ret = part_get_info_by_dev_and_name_or_num("mmc", name, dev_desc, + info, true); + return ret; +} + +static int part_get_info_by_name_or_alias(struct blk_desc **dev_desc, + const char *name, + struct disk_partition *info) { int ret; - ret = part_get_info_by_name(dev_desc, name, info); + ret = do_get_part_info(dev_desc, name, info); if (ret < 0) { /* strlen("fastboot_partition_alias_") + PART_NAME_LEN + 1 */ char env_alias_name[25 + PART_NAME_LEN + 1]; @@ -92,8 +118,8 @@ static int part_get_info_by_name_or_alias(struct blk_desc *dev_desc, strncat(env_alias_name, name, PART_NAME_LEN); aliased_part_name = env_get(env_alias_name); if (aliased_part_name != NULL) - ret = part_get_info_by_name(dev_desc, - aliased_part_name, info); + ret = do_get_part_info(dev_desc, aliased_part_name, + info); } return ret; } @@ -424,27 +450,49 @@ int fastboot_mmc_get_part_info(const char *part_name, struct blk_desc **dev_desc, struct disk_partition *part_info, char *response) { - int r = 0; + int ret; - *dev_desc = blk_get_dev("mmc", CONFIG_FASTBOOT_FLASH_MMC_DEV); - if (!*dev_desc) { - fastboot_fail("block device not found", response); - return -ENOENT; - } if (!part_name || !strcmp(part_name, "")) { fastboot_fail("partition not given", response); return -ENOENT; } - if (raw_part_get_info_by_name(*dev_desc, part_name, part_info) < 0) { - r = part_get_info_by_name_or_alias(*dev_desc, part_name, part_info); - if (r < 0) { - fastboot_fail("partition not found", response); - return r; + ret = part_get_info_by_name_or_alias(dev_desc, part_name, part_info); + if (ret < 0) { + switch (ret) { + case -ENOSYS: + case -EINVAL: + fastboot_fail("invalid partition or device", response); + break; + case -ENODEV: + fastboot_fail("no such device", response); + break; + case -ENOENT: + fastboot_fail("no such partition", response); + break; + case -EPROTONOSUPPORT: + fastboot_fail("unknown partition table type", response); + break; + default: + fastboot_fail("unanticipated error", response); + break; } } - return r; + return ret; +} + +static struct blk_desc *fastboot_mmc_get_dev(char *response) +{ + struct blk_desc *ret = blk_get_dev("mmc", + CONFIG_FASTBOOT_FLASH_MMC_DEV); + + if (!ret || ret->type == DEV_TYPE_UNKNOWN) { + pr_err("invalid mmc device\n"); + fastboot_fail("invalid mmc device", response); + return NULL; + } + return ret; } /** @@ -461,17 +509,12 @@ void fastboot_mmc_flash_write(const char *cmd, void *download_buffer, struct blk_desc *dev_desc; struct disk_partition info; - dev_desc = blk_get_dev("mmc", CONFIG_FASTBOOT_FLASH_MMC_DEV); - if (!dev_desc || dev_desc->type == DEV_TYPE_UNKNOWN) { - pr_err("invalid mmc device\n"); - fastboot_fail("invalid mmc device", response); - return; - } - #ifdef CONFIG_FASTBOOT_MMC_BOOT1_SUPPORT if (strcmp(cmd, CONFIG_FASTBOOT_MMC_BOOT1_NAME) == 0) { - fb_mmc_boot1_ops(dev_desc, download_buffer, - download_bytes, response); + dev_desc = fastboot_mmc_get_dev(response); + if (dev_desc) + fb_mmc_boot1_ops(dev_desc, download_buffer, + download_bytes, response); return; } #endif @@ -483,6 +526,10 @@ void fastboot_mmc_flash_write(const char *cmd, void *download_buffer, if (strcmp(cmd, CONFIG_FASTBOOT_GPT_NAME) == 0 || strcmp(cmd, CONFIG_FASTBOOT_MMC_USER_NAME) == 0) { #endif + dev_desc = fastboot_mmc_get_dev(response); + if (!dev_desc) + return; + printf("%s: updating MBR, Primary and Backup GPT(s)\n", __func__); if (is_valid_gpt_buf(dev_desc, download_buffer)) { @@ -505,6 +552,10 @@ void fastboot_mmc_flash_write(const char *cmd, void *download_buffer, #if CONFIG_IS_ENABLED(DOS_PARTITION) if (strcmp(cmd, CONFIG_FASTBOOT_MBR_NAME) == 0) { + dev_desc = fastboot_mmc_get_dev(response); + if (!dev_desc) + return; + printf("%s: updating MBR\n", __func__); if (is_valid_dos_buf(download_buffer)) { printf("%s: invalid MBR - refusing to write to flash\n", @@ -526,19 +577,16 @@ void fastboot_mmc_flash_write(const char *cmd, void *download_buffer, #ifdef CONFIG_ANDROID_BOOT_IMAGE if (strncasecmp(cmd, "zimage", 6) == 0) { - fb_mmc_update_zimage(dev_desc, download_buffer, - download_bytes, response); + dev_desc = fastboot_mmc_get_dev(response); + if (dev_desc) + fb_mmc_update_zimage(dev_desc, download_buffer, + download_bytes, response); return; } #endif - if (raw_part_get_info_by_name(dev_desc, cmd, &info) != 0) { - if (part_get_info_by_name_or_alias(dev_desc, cmd, &info) < 0) { - pr_err("cannot find partition: '%s'\n", cmd); - fastboot_fail("cannot find partition", response); - return; - } - } + if (fastboot_mmc_get_part_info(cmd, &dev_desc, &info, response) < 0) + return; if (is_sparse_image(download_buffer)) { struct fb_mmc_sparse sparse_priv; @@ -581,23 +629,12 @@ void fastboot_mmc_erase(const char *cmd, char *response) lbaint_t blks, blks_start, blks_size, grp_size; struct mmc *mmc = find_mmc_device(CONFIG_FASTBOOT_FLASH_MMC_DEV); - if (mmc == NULL) { - pr_err("invalid mmc device\n"); - fastboot_fail("invalid mmc device", response); - return; - } - - dev_desc = blk_get_dev("mmc", CONFIG_FASTBOOT_FLASH_MMC_DEV); - if (!dev_desc || dev_desc->type == DEV_TYPE_UNKNOWN) { - pr_err("invalid mmc device\n"); - fastboot_fail("invalid mmc device", response); - return; - } - #ifdef CONFIG_FASTBOOT_MMC_BOOT1_SUPPORT if (strcmp(cmd, CONFIG_FASTBOOT_MMC_BOOT1_NAME) == 0) { /* erase EMMC boot1 */ - fb_mmc_boot1_ops(dev_desc, NULL, 0, response); + dev_desc = fastboot_mmc_get_dev(response); + if (dev_desc) + fb_mmc_boot1_ops(dev_desc, NULL, 0, response); return; } #endif @@ -605,6 +642,10 @@ void fastboot_mmc_erase(const char *cmd, char *response) #ifdef CONFIG_FASTBOOT_MMC_USER_NAME if (strcmp(cmd, CONFIG_FASTBOOT_MMC_USER_NAME) == 0) { /* erase EMMC userdata */ + dev_desc = fastboot_mmc_get_dev(response); + if (!dev_desc) + return; + if (fb_mmc_erase_mmc_hwpart(dev_desc)) fastboot_fail("Failed to erase EMMC_USER", response); else @@ -613,13 +654,8 @@ void fastboot_mmc_erase(const char *cmd, char *response) } #endif - if (raw_part_get_info_by_name(dev_desc, cmd, &info) != 0) { - if (part_get_info_by_name_or_alias(dev_desc, cmd, &info) < 0) { - pr_err("cannot find partition: '%s'\n", cmd); - fastboot_fail("cannot find partition", response); - return; - } - } + if (fastboot_mmc_get_part_info(cmd, &dev_desc, &info, response) < 0) + return; /* Align blocks to erase group size to avoid erasing other partitions */ grp_size = mmc->erase_grp_size; diff --git a/test/dm/fastboot.c b/test/dm/fastboot.c index 8f905d8fa8..e7f8c362b8 100644 --- a/test/dm/fastboot.c +++ b/test/dm/fastboot.c @@ -35,9 +35,12 @@ static int dm_test_fastboot_mmc_part(struct unit_test_state *uts) }, }; - ut_assertok(blk_get_device_by_str("mmc", - __stringify(CONFIG_FASTBOOT_FLASH_MMC_DEV), - &mmc_dev_desc)); + /* + * There are a lot of literal 0s I don't want to have to construct from + * MMC_DEV. + */ + ut_asserteq(0, CONFIG_FASTBOOT_FLASH_MMC_DEV); + ut_assertok(blk_get_device_by_str("mmc", "0", &mmc_dev_desc)); if (CONFIG_IS_ENABLED(RANDOM_UUID)) { gen_rand_uuid_str(parts[0].uuid, UUID_STR_FORMAT_STD); gen_rand_uuid_str(parts[1].uuid, UUID_STR_FORMAT_STD); @@ -59,6 +62,34 @@ static int dm_test_fastboot_mmc_part(struct unit_test_state *uts) &part_info, response)); ut_assertok(env_set(FB_ALIAS_PREFIX "test3", NULL)); + /* "New" partition labels */ + ut_asserteq(1, fastboot_mmc_get_part_info("#test1", &fb_dev_desc, + &part_info, response)); + ut_asserteq(1, fastboot_mmc_get_part_info("0#test1", &fb_dev_desc, + &part_info, response)); + ut_asserteq(1, fastboot_mmc_get_part_info("0.0#test1", &fb_dev_desc, + &part_info, response)); + ut_asserteq(1, fastboot_mmc_get_part_info("0:1", &fb_dev_desc, + &part_info, response)); + ut_asserteq(1, fastboot_mmc_get_part_info("0.0:1", &fb_dev_desc, + &part_info, response)); + ut_asserteq(1, fastboot_mmc_get_part_info("0", &fb_dev_desc, + &part_info, response)); + ut_asserteq(1, fastboot_mmc_get_part_info("0.0", &fb_dev_desc, + &part_info, response)); + ut_asserteq(0, fastboot_mmc_get_part_info("0:0", &fb_dev_desc, + &part_info, response)); + ut_asserteq(0, fastboot_mmc_get_part_info("0.0:0", &fb_dev_desc, + &part_info, response)); + ut_asserteq(0, fastboot_mmc_get_part_info("1", &fb_dev_desc, + &part_info, response)); + ut_asserteq(0, fastboot_mmc_get_part_info("1.0", &fb_dev_desc, + &part_info, response)); + ut_asserteq(1, fastboot_mmc_get_part_info(":1", &fb_dev_desc, + &part_info, response)); + ut_asserteq(0, fastboot_mmc_get_part_info(":0", &fb_dev_desc, + &part_info, response)); + return 0; } DM_TEST(dm_test_fastboot_mmc_part, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);