From patchwork Thu Jun 27 11:26:50 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikhail Kshevetskiy X-Patchwork-Id: 1953190 X-Patchwork-Delegate: dario.binacchi@amarulasolutions.com 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=iopsys.eu header.i=@iopsys.eu header.a=rsa-sha256 header.s=selector2 header.b=xBFPzhPx; 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 4W8x9n6SDtz20XB for ; Thu, 27 Jun 2024 21:27:09 +1000 (AEST) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id E816887AD2; Thu, 27 Jun 2024 13:27:06 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=reject dis=none) header.from=iopsys.eu 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=iopsys.eu header.i=@iopsys.eu header.b="xBFPzhPx"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 9CEFB8852C; Thu, 27 Jun 2024 13:27:04 +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=-1.8 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,SPF_HELO_PASS, SPF_PASS autolearn=no autolearn_force=no version=3.4.2 Received: from EUR05-DB8-obe.outbound.protection.outlook.com (mail-db8eur05on20718.outbound.protection.outlook.com [IPv6:2a01:111:f400:7e1a::718]) (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 AC9CD87AD2 for ; Thu, 27 Jun 2024 13:27:02 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=reject dis=none) header.from=iopsys.eu Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=mikhail.kshevetskiy@genexis.eu ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=g7tuqZ592zLEZA2SCR2E3itfXXwkr5flsJ8jm77YHk15qc83S6Zd3z3iAR6p0Ij0/TsLpl1e74BUgEY8Ras3kz6zy/53/irmJuaJUeZARvCpANkkG63neuAyK5IMmCKL2j+FI6MaiqdEtr6VSafVS/cIm2Rxt7gcq2Mg2exp4SrDPkL7IABog9mJ5okYuUhlCvVmnvIF8DOj+wJnOgFVG3Qp2ilKfIeLgmEZmI6jXXdnOgHhoWQ6l2bMtKkQ9+23RZIsldDCbzTFvI87MO0rPCqynXFvM7sjWl04Sfg9Klk69DoS+NiY3X9ZYsGLJzfQWstgHdw2XIkQ4Jb/76Zolw== 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-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=vuxfmHWenjVEUkqI0ZFks2xajb3YU376d+R5XBJAEF0=; b=PnbHkx0h9k5pOGXFoq9dzrspYFDYBSDDWXJju59RVKpyLdutcH1tk7OaYMm0n78/ornqCJpzg8SRIqMPbJxSd3J5mJM4NGeeGdpKrwRY4keNOuwU4LnQPFHEnTkqvQ86wUgFT//OjCKkyQ2CmewURrN13vXHPfyZmvwGt3f+vf5qzyiR2Hi/cECQ6XgHV+EvynV7WFljBbPVbd0gZ3HAkIHroewNiJnFBRSmGsbKZoCRTVOWmu/jLwpVuCbMpEBF00ldcmpVpw7PMGJ4qjJr37ZX3dLu3q4Z5cvpfsRjsKImUtQdB8Dd8DIwGC6ktjOQSVtRQiJLuP+hjDcWi5TMMA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=genexis.eu; dmarc=pass action=none header.from=iopsys.eu; dkim=pass header.d=iopsys.eu; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iopsys.eu; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=vuxfmHWenjVEUkqI0ZFks2xajb3YU376d+R5XBJAEF0=; b=xBFPzhPxBNX0m+SaybJ7sCqC5dLVwUS+A3VyBw8R5k9MiSWGTqBjKVKjgA3u72O6koycLViQodUdH+VCmfLUlHaNYdlOjILQoLe4HYKKzeQ0ZEM9HuwgGQP3BDMqril4C+iCJavFilRi9+FDvgdowlzupnpLQXykf89UEp6tomq2wSqUxcSj/2KgY2FOd/TchAErL7i/waZxHT2yhqK8IY0r2P/OEgJB2m4fQZeoNeWnWykprIIVwbrjwrZJbcZDT7Fe/Tj/r6pjfRSRz04/JnFJqHwU9D4vvfZJ9t7P5hRt8+px2jR5f46PNMD5/Gg23fZ2C6HpEJqQ2qQn/A42pg== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=iopsys.eu; Received: from GV2PR08MB8121.eurprd08.prod.outlook.com (2603:10a6:150:7d::22) by PAXPR08MB6431.eurprd08.prod.outlook.com (2603:10a6:102:157::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7698.32; Thu, 27 Jun 2024 11:27:00 +0000 Received: from GV2PR08MB8121.eurprd08.prod.outlook.com ([fe80::4cd3:da80:2532:daa0]) by GV2PR08MB8121.eurprd08.prod.outlook.com ([fe80::4cd3:da80:2532:daa0%5]) with mapi id 15.20.7698.025; Thu, 27 Jun 2024 11:27:00 +0000 From: Mikhail Kshevetskiy To: Tom Rini , Simon Glass , Mattijs Korpershoek , AKASHI Takahiro , Heinrich Schuchardt , Ilias Apalodimas , Francis Laniel , Abdellatif El Khlifi , Peter Robinson , Dario Binacchi , Arseniy Krasnov , u-boot@lists.denx.de Subject: [PATCH 1/3] cmd: mtd: add markbad command support Date: Thu, 27 Jun 2024 14:26:50 +0300 Message-ID: <20240627112652.99818-1-mikhail.kshevetskiy@iopsys.eu> X-Mailer: git-send-email 2.43.0 X-ClientProxiedBy: FR0P281CA0165.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:b3::13) To GV2PR08MB8121.eurprd08.prod.outlook.com (2603:10a6:150:7d::22) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: GV2PR08MB8121:EE_|PAXPR08MB6431:EE_ X-MS-Office365-Filtering-Correlation-Id: 92d12302-83e0-494e-ae6d-08dc969c0f9e X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|1800799024|52116014|7416014|376014|366016|38350700014|921020; X-Microsoft-Antispam-Message-Info: FgvAJYPVu/8be1dp1GS26W+k77knm86QvgukCMkvdERjqtjeLWVucqAGH6jfMhk2672K7xETJXEiXoh/LpghSjN9Ue9NkZf4NO4TfWRNpUkkg20pdBZxv4EC5IRkcDDH8Q/l3vgX8n7/uU0kML5LF7cYhaH9Pf56KhG3tr3Z85odr1+Ugf9HVR3D8RL0sZFGsKqcpRuGBdRfjLMThM6QEiGpDga0lKTwRSGsp4pXLfRNOZrf3X0MmJIIxy9/zEmIWqxGua0GVtJVXVCqStc77cesq1POy08R6Ng70pcPcAhB1XRMvO7sjtMy/YHEK0sI8VCiUam0FA3mwWsTI3reW4g5QY3vJvo6Ffl7emyXsFDu5E3H7ICEewWptR4dUaM7LmEfJZL4fU2KJbhHrz8SXKjDh6ScJhupbojMW3zAO/UdO68A1zVlAO8zohYxIOtApkce2NL971HDvpHLLOvyRD5n2asJrCpTTTgC6R0g+6CtVk/wBCEiFsNMAlI+i7JTay9X3Ht50Nid3MW7kD3aH58DPhSiZi0g8V6hZlp/n1KkCcmF95fyCXb+1dtz5QkNOLM8ufFNt4mu0cPfUKoNF1wupZWsCIvBy8FXg1GldOjzAGVIQ9f+ISRiogMhpLE4yV5tCqcenRqL7Y5/MuhANqKgiCjeq9XLyMtUizGaRurBef5JJo9+qnkWjduTjCbna8lg/hthO0uFb2IADk5UywzUQGB42r1dSEhV8QHtwbNhcy4SXqBFyYYqxLWfXWZv7tMey/IJSreGoKW56nL2ZZQsmgJ/HekALDGSuJ57xku0XkdDcNZjZmme8GKH/O3/mzgdx1HCGddKx8otgUiUScyqCmI1lqvHbaCIWtrleEUhYzn/9nf5ROvBq1tqqirgfPCrMMATb/enbtqZ1YbfkRXtMoWo2GZbEOD5eN9kOf+4o5wS7sS+9oshov7XL+C1ylb8do4LO2zL9VwjrgQEIHtBgmbNoX1jJIUNo9+S6i96WKDdlyFMKLQG5EkOd2FDIWpB8zBI8OywFH2/1ipYh9+ZMM2zlzJG3joA6eXU+06aGg+CZOaaP92Y7f3HF7XJfCOLUKZIqdcVES2SaZEhbAEcc9IL98EYytOF1Ufh6Z7TfVM395BBW/VHCz/xbK+7lzNOGFavGbic07bVmOCI7ykAFJutMb/1gUlf3rvLrlN+sGusl8kmYbYivx6y4FcUXUpeZbUonNyeoq6oqtwaGixysmRJ0aPEsnGLllGLhBnUnOrI7jSb7r7vnt+yrh9LUGEopIR+LmFmyntAxmZXusXv3x/CNxZ8ra2I7ZYXzqAOSUX0o+bFaGkinufqbFTuORpZfgSgbaNB+M1PAoi3Pmb8m//hsdgH0PNElaf0b9+WjnUTIISE7FhFAzl8lqqM70s1oSfJT8KRXlmsK5G6ODhnroyozssXehl6naA3Z3k= X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:GV2PR08MB8121.eurprd08.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230040)(1800799024)(52116014)(7416014)(376014)(366016)(38350700014)(921020); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 9NlExFtB7trWLSejBucWI0kTe/OEyNnKFRZOnqUBGAZpf3tp+t9ePdub0eSWqrzDgfAktr87AWeEfQMefLdsv7egHFRpc5cSSHIrg0iH7DeuuVb5Kc5hr5Nqi2CHmfB+gKd3pr3PNml/moHvse4KvA0wNaLyPXrcbl5ZMzNBpSydNSf6L+wbVcob9oBh5LdEMqEmN1hprr0XFzI7t/uXutKTZAK/aoMWspAR8oNUZFVBOHDMQEBuUtR04c+8heGG6dM/A9wSxE2JHmGtD6hJq+bK5z+gY3e9GuK4r+WzaqofDzGz9lBvdTl6ROKhvnRsc2dMyNpdfkabya553mRpBJhwCP/FchaRIDQdCHpROEN1DAc82X9itXuZVwPkGcuALHs7TfNeoprIbtRoFEPHB9N3tGkXnCmdlw7pcZvSCXnM23zrlgYiUHq4SVxjYfiP1jJEQ81DRiH+L8Rj5g0ohI4u267S7kieeVsA8/2P+H/Iw62dqEdSL6HFyq25lipKoyoxZclbuqTUpDb7I7ZlIsGE41JJ4cAcehnPwnjibIAW+j2fuqX6ZiV7rX2HrJ+3vRfvk2W4or8CyipKHkJrdZNi9VTMMGrMtYOqFzcB6iI2DsRp6EWSMklhKdUN9BarteikE/JxrhpzjwsJLkpkxnaPpPjV8OfgVcqG21E8Zay1mv+J58YdhAUVWGaUDCZ+rZmXaX5YhJ5izNar6qeqhmiOMYNnfSnaK9Sd1UCKS1OQyhZCXZWvHY1IDvIDNlx9PjAFBD+8hpL04lyFb4rcJs/5IlXLUiRu05LpwZLxHVYUc9X/zzHLwSYsJrE7M5rq0Y/tPHg5IP5q78lhya7cWGlMiRCmriROzgzxMXTxOXJNHQKDlDRNyHZDiR4MdQxbFRGVZ2/PrTwR8sW264VO7JJVf5saNEtR3oiwfEq+XzMFKDmZkcnSSkT6zantwj7p1i6HsZT8kvzkc8qvgVKYtAj8zIdik/SJ7MBkHi4VwlJ+51tlOVPep7UwWqxFplKexa38/Lyy/OoWQJIqvaS1jyYbCvqXtWi1vSXLZ3J4Cajh/vFyJ3N8sycivEAvPjIfVMN24GC6zysUcM7P4M4D8cntiQHSmxW+PGUVG5FMhnyQ0/4pEkSsP5qn7klKc3LRg+JSknfaW04VY4XKNFz8rQ+UKGyUJ1gRbXrn0Om54XyGn23pUBFk8c/xyIUbzBIvmLopWvxaldCIpO/wrPFkvHSRvx0A18Jw6CoPLJ8qY1/Km2BupkDYULunJHmLnrubec1ax+bIYAIUZEFqOpGv1qETxpXzuVt/vN7TXtdXkYW+Bqj0IMUcBJnXskr+HIGoPFFx6XkG1pxhrZ2VDQXEzvR3dgT1o60kCxrmNUijO31pd21Kqb5Uk+KPd7MXL7cUBctafjPV5m0cp/CZfUNMMv9pi1yuMHUQlS2y0xLIn46YhpOWGQACZijj3dRX8LcdVYVGF0ajmIBwIN2Z9io5AL6etMoOKVJRd1y3vfotu3tJtx/5jK7qxxHC8jGUtRzydaVIREIOyShVmPyGTaActZ3tPBDv4/Srb0bP0NFZrtvhiAfbk1ezpVApzyhy6Ynlxx1MJQs0LhqpzP59irhVM1Mg6VWnjEw3WIVQO2ofoYY= X-OriginatorOrg: iopsys.eu X-MS-Exchange-CrossTenant-Network-Message-Id: 92d12302-83e0-494e-ae6d-08dc969c0f9e X-MS-Exchange-CrossTenant-AuthSource: GV2PR08MB8121.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 Jun 2024 11:27:00.2564 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 8d891be1-7bce-4216-9a99-bee9de02ba58 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: P6CoDs+wE+uuuCLRlITQ3zs2gHFHUuZvxw7i5M+MIbZyU7iwERvKSk2hgGYwY4gj/MDqie/LLf9X1Jh+vqmLexZJfakJC9fE3N5x+4RCHo8= X-MS-Exchange-Transport-CrossTenantHeadersStamped: PAXPR08MB6431 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 Some nand flashes (like spi-nand one) are registered with mtd subsystem only, thus nand command can't be used to work with such flashes. As result some functionality is missing. This patch implements 'nand markbad' functionality for mtd command. Signed-off-by: Mikhail Kshevetskiy --- cmd/Kconfig | 6 ++++++ cmd/mtd.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) diff --git a/cmd/Kconfig b/cmd/Kconfig index 6834bbd82f3..70c2d6a2dda 100644 --- a/cmd/Kconfig +++ b/cmd/Kconfig @@ -1418,6 +1418,12 @@ config CMD_MTD_OTP help MTD commands for OTP access. +config CMD_MTD_MARKBAD + bool "mtd markbad" + depends on CMD_MTD + help + MTD markbad command support. + config CMD_MUX bool "mux" depends on MULTIPLEXER diff --git a/cmd/mtd.c b/cmd/mtd.c index 9189f45cabd..18f00493780 100644 --- a/cmd/mtd.c +++ b/cmd/mtd.c @@ -692,6 +692,57 @@ out_put_mtd: return ret; } +#ifdef CONFIG_CMD_MTD_MARKBAD +static int do_mtd_markbad(struct cmd_tbl *cmdtp, int flag, int argc, + char *const argv[]) +{ + struct mtd_info *mtd; + loff_t off; + int ret = 0; + + if (argc < 3) + return CMD_RET_USAGE; + + mtd = get_mtd_by_name(argv[1]); + if (IS_ERR_OR_NULL(mtd)) + return CMD_RET_FAILURE; + + if (!mtd_can_have_bb(mtd)) { + printf("Only NAND-based devices can have bad blocks\n"); + goto out_put_mtd; + } + + argc -= 2; + argv += 2; + while (argc > 0) { + off = hextoul(argv[0], NULL); + if (!mtd_is_aligned_with_block_size(mtd, off)) { + printf("Offset not aligned with a block (0x%x)\n", + mtd->erasesize); + ret = CMD_RET_FAILURE; + goto out_put_mtd; + } + + ret = mtd_block_markbad(mtd, off); + if (ret) { + printf("block 0x%08llx NOT marked as bad! ERROR %d\n", + off, ret); + ret = CMD_RET_FAILURE; + } else { + printf("block 0x%08llx successfully marked as bad\n", + off); + } + --argc; + ++argv; + } + +out_put_mtd: + put_mtd_device(mtd); + + return ret; +} +#endif + static int do_mtd_bad(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) { @@ -774,6 +825,9 @@ U_BOOT_LONGHELP(mtd, "mtd otpwrite \n" "mtd otplock \n" "mtd otpinfo [u|f]\n" +#endif +#ifdef CONFIG_CMD_MTD_MARKBAD + "mtd markbad [ ...]\n" #endif "\n" "With:\n" @@ -808,5 +862,9 @@ U_BOOT_CMD_WITH_SUBCMDS(mtd, "MTD utils", mtd_help_text, mtd_name_complete), U_BOOT_SUBCMD_MKENT_COMPLETE(erase, 4, 0, do_mtd_erase, mtd_name_complete), +#ifdef CONFIG_CMD_MTD_MARKBAD + U_BOOT_SUBCMD_MKENT_COMPLETE(markbad, 20, 0, do_mtd_markbad, + mtd_name_complete), +#endif U_BOOT_SUBCMD_MKENT_COMPLETE(bad, 2, 1, do_mtd_bad, mtd_name_complete)); From patchwork Thu Jun 27 11:26:51 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikhail Kshevetskiy X-Patchwork-Id: 1953191 X-Patchwork-Delegate: dario.binacchi@amarulasolutions.com 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=iopsys.eu header.i=@iopsys.eu header.a=rsa-sha256 header.s=selector2 header.b=CN+yk8nt; 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 4W8x9y0FFXz20XB for ; Thu, 27 Jun 2024 21:27:18 +1000 (AEST) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 5E2B388548; Thu, 27 Jun 2024 13:27:07 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=reject dis=none) header.from=iopsys.eu 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=iopsys.eu header.i=@iopsys.eu header.b="CN+yk8nt"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id E17418852C; Thu, 27 Jun 2024 13:27:04 +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=-1.8 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,SPF_HELO_PASS, SPF_PASS autolearn=no autolearn_force=no version=3.4.2 Received: from EUR05-DB8-obe.outbound.protection.outlook.com (mail-db8eur05on20718.outbound.protection.outlook.com [IPv6:2a01:111:f400:7e1a::718]) (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 DD625880A5 for ; Thu, 27 Jun 2024 13:27:02 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=reject dis=none) header.from=iopsys.eu Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=mikhail.kshevetskiy@genexis.eu ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=CLVGkStzHqwC7/DaHmGXqv9nzrfLfmy3SPWKoOBuTxsAesuVV4tJ5EYSiOBo0zUuHLbITVQZIPXFL41UPkeW9K2ZB9SD8PoZC66ycxObobOEY77iFaVjCYrHK+wFWgnBnxTI5+hZjCGPCXcS208fONbWZ6jgwG4JlS0tZFwAPjxHoBcXemQr7C7oIDS54uNPK0LtNRFurP0F9sDj1EfI5RINBtcUM4XnftyxjavAS50nef5fRwPAfeHyAe5I1mvupINYrjTAj+lT0XbacmqxDP2lxwYI+ejWJeOZM2gKFW4iQ3C1y5vREQ4Th9ezoa+uH/oXfbzHBrhTSEDie5ngrw== 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-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=dbjZg/VvdbUZRNvj3KP6dpYfkFujT3jbDYJ3yYrJcvw=; b=R2u0adVt3nDzGn6B7Ult3DqFY/+QRCHxEbUqpH3E/Sz6443H1Vw6cKXT1OhwGqSz1HhpUIRVh93TgN7M0SbygfvotOHrvgZgTknHXxY88knDlva8sJdEacqf5LIMXqwO2REptfrk1kPvlBNL9ZSXGxZe9SGrU49Xu+VjQ3bBqBRsEr3SRkHYpCP1JlvwZRjOLrxsdHj4mKL437Pj3OakgwKNrwfyug0xA3I4nyNjheRXLxL6cqLuBNThdzvqM+wHJNbsPN6Xtw9hqhabnttaP/GCCduKh8HO6Yn7d4CXmDFGWFcDm3qXlQAWJ5qAy6R/ZZkt/VDBm+WZcXck+nixOw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=genexis.eu; dmarc=pass action=none header.from=iopsys.eu; dkim=pass header.d=iopsys.eu; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iopsys.eu; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=dbjZg/VvdbUZRNvj3KP6dpYfkFujT3jbDYJ3yYrJcvw=; b=CN+yk8nt1GA/3zkPEMJrqbErb9s7qYkuNqfqN+Zwvf6rZ1ysv69JpAV0o+ZxF24tfkVo5PW7Ljr2lvpTh2NGk8cW1l3oR7I9G8p7ndRygo2xHaMz/uUvtS2zN0+lQkwK5N7RS4LsZtt/TGeub9vzBrCdUWg0lfuQ9AkVznXh4mEi/XlCMdzEMRWDPx8PP/yi3E+4LHET3zMwephpOJjCiwhHHtoP55mxnPm/DkaB0bNopLApyTxEw3Un6DfCSFHwR1D07hjpwnAN2MySFTrG4ty1Ab+ndx0V6eYvZMwZ3ZenlJPt1oKunccy11VymGIAgzZZNVQWj06u4SPtazsygg== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=iopsys.eu; Received: from GV2PR08MB8121.eurprd08.prod.outlook.com (2603:10a6:150:7d::22) by PAXPR08MB6431.eurprd08.prod.outlook.com (2603:10a6:102:157::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7698.32; Thu, 27 Jun 2024 11:27:01 +0000 Received: from GV2PR08MB8121.eurprd08.prod.outlook.com ([fe80::4cd3:da80:2532:daa0]) by GV2PR08MB8121.eurprd08.prod.outlook.com ([fe80::4cd3:da80:2532:daa0%5]) with mapi id 15.20.7698.025; Thu, 27 Jun 2024 11:27:01 +0000 From: Mikhail Kshevetskiy To: Tom Rini , Simon Glass , Mattijs Korpershoek , AKASHI Takahiro , Heinrich Schuchardt , Ilias Apalodimas , Francis Laniel , Abdellatif El Khlifi , Peter Robinson , Dario Binacchi , Arseniy Krasnov , u-boot@lists.denx.de Subject: [PATCH 2/3] cmd: mtd: add torture command support Date: Thu, 27 Jun 2024 14:26:51 +0300 Message-ID: <20240627112652.99818-2-mikhail.kshevetskiy@iopsys.eu> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240627112652.99818-1-mikhail.kshevetskiy@iopsys.eu> References: <20240627112652.99818-1-mikhail.kshevetskiy@iopsys.eu> X-ClientProxiedBy: FR0P281CA0165.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:b3::13) To GV2PR08MB8121.eurprd08.prod.outlook.com (2603:10a6:150:7d::22) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: GV2PR08MB8121:EE_|PAXPR08MB6431:EE_ X-MS-Office365-Filtering-Correlation-Id: 94abd3d9-1600-4525-30a6-08dc969c104a X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|1800799024|52116014|7416014|376014|366016|38350700014|921020; X-Microsoft-Antispam-Message-Info: lxxXFAMVHsrdzNYv9lYnfXCvHH49tPBurBw6nvcSyuDktvGl3gxYqhBZg9KtiDmq50k5PMQPHcDdkz5wT/7GyUmADk3J8GTsTa7/Za3b6Y1SgdRNH9cbH0xFHH3CaNyoT6DV+T4tSlf8aurYyVpdOx2woPJsAawH2Chhw0jRFRzScPx5Pnc2JWMpp+0Ytr9lIZLuLmciekQUZIKRe3A+taf1kZwa/aHAc95uqi+BIQW797/8vM8Xa1m5ajxMqlQJFFWP8iZoPv7fM5t5CiGLdAW9KEiwJl3jRJI5CtVmgrMkJC++jBz6YJkWzc6KRxeYlMPRiWGf5b5U5s88IfHOgkdTEIdBPuMj3LsDwWfjmUun5tzyxzeagMGQrpAgnpWByO1fF+b08sdFrU4nrED1CiLEKxggD3YXB6kUoyH9aFfDreknzTbww563zB4wTJnicsOmYspv0oTZ5W7Mvm9PQcqmAi9o2g0PgDfnU1RDUfTjtw/mC8t+lka2zhQqW0zOCqI2Hcc8/vtU7q8EQi4E0f7CZoRbmeUF52t5M8lzIHKBCruYDzEhI4jh9klMphH3fl9lzrBrMasLEbXtcwHd4P4PpNjT09ao2INBM8ceNVq7PupkCyulz7ZtTdqRbCbFTv8iIy18bBBCCrAJNM1hNYXI6Iv8Ej2J+j37zXaRTMSIArFQdEkjt+70AdjJcrLqjO/go4Ea06CHFsa1hp3zrlHH8JB5OdwVZdvXF4hGyOoxTixsvQ7kKCuvB3HXSAG37uJJ86n16QRnxd9BIbLLk9a5DjPtgLsut6N4WFAVm1dfRbq4tTXX9f6DkZflLewSnJtTzrqOhclpPlqFoB/HTOouo+s+6mO2Vg4V87AY2mtyTkulLGEGzezKEYxUchUTVPM48KTMdx+1fBH+9JjU32wxbfr5TB9LQ1ymDKUXepskEz2DETGlDFTqw1SvOndsyB3Marm9PWqI5lMIAlN/gUCXfUi7i0PAOcUmiYwVdT4HXd/VGlXSdx7PZ4VnoGXmk8azxfeV7uknczB19HyiJMjpknxlLBVL2zuTOLuVZKQfu5ZpRfEL8ub6GauxvZ7CenXM4OXx4hnZtLy4aCvVNu+2SfMJcy5lnmE4PpEp0rAYzb++28Lr4VPCUvxIGuoSFq0Pb4eaC8dEGMhNETY7EIChV6nAtE9qyEVhShNaXNUyr7dLjJtPVkhQ9xMDlClEdMgVPkbAAgZ2Gpb3GyKI5GgnLwAHXyBlQJAK50+ugMHkKKO8UNixXHM/370C84rAPzDUiOO2QIzYvlbBKdju+vD19YleZkQMMo/hS4Xbfcx6b2wr+a1YKPftE1iLGPwp2jpqXhN/VQbnVSXN+rxH1IBesNXnfxLOSFESA8b1hneBt0XJbB2L1vLFpV4GC1Jsfd0yA3pdwLHu3oXPbqxmtmCdGkIqTWhK+6MPo1CoxTg= X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:GV2PR08MB8121.eurprd08.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230040)(1800799024)(52116014)(7416014)(376014)(366016)(38350700014)(921020); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: YhubjjVqJ43ZAWQ7pZMQ9uUALm2e+XWhvGl2RO151Q6jGmkUukr6jikzixqV2P/ebrWMr5J8pD9sRH3qRCgGOJm9CWyXqOH+K9Pec7P/BIc0wsdZJp4VJSwUWicnHWqEXIOCLwYatmhh1eHzPmPdJSb1drta/bl/mxDG83YFtjtT76Q+f4fMGmkuR3QnjNj/KVV9HUKtnkdU4yHeENRbwI+SQZdXvhRrND8LaCRK1VoiNvw3OgslQUrVt0saRxCzNysILN+m4/9k+Y00tXGWvt7On0ThWUiCqxSDNUei5IdhWMg7rP/L2VzVdz5LeG/BKM7HlaUGZS3QBbyRqD1zJkYJp6+2Iek09zzAVf5IFGf+Ew51kGPal1p3OnMhYSajgqR//Q8tlHD9Xy9foJaYZOijOXGXyJ61g8/K8SKmpu6f64FHm0NjnoCd7wYaXYRYsBtU0xSlm7miQMUXQjAq65OfVNHVoQrF6/TRVLiHwXulQl1NfrDSXyDB7sB+79MSg9Rwia0pT5IQAywScXo3bVtmIuHlQuUp7Cv8dDwjk9Z4eKnzf8RBgE9xuTNf1VI+QLPkUlBSmvz8CZyULfeAOPl57wJ/Kv6AtA7HcQkNxWdqiQEEgw6GpxoLV/8WwG+VIOGj1wMsYM2lYfvV3oxiZMFrMIvFW2xW/anaNjWZFClOYCpEBHtTufVnYxDRMgyfm8uLU1ap9PtK6W365PiG5D5QT8seGFijjIfmNl/dMx3Eiw1egnpT47wRu+JRQjnKkMoS+Ypd16rSHGyIw5DBExj1OXN6QH6uXkAqTm/9UQ6AVCTameC7PcyqH2kIm7MhYIGKe9wQV4iqfdwZ2pieo3QLII3irIIFfcAsKFixubpOuG8DsJLzbPRKdBN2rZ4e8V4evdNJL3P6m96V5t7NwMzCjQ9BMIXpSu7U1UTPkTkn3lMNSrBrTMaAt7l3nuuWqzxio/FAelQGLsGNcnpBGerkMXgH8Kav4yIchxulvV0Gh9zJiq4Bhff4DLtzeYKPOdwBzLyH31b41b23u+AwBHjCXaDN7FY68Nc4UnUesrPPd12ZPU3XJSFSgCHhszg7h13/o6pN3FAiUqC6PcTJU9bySAKDyRdCZfE1MhS9sG9xwGvrcLX1sfHdV8damp9KOqf7Vsvq5QrEXMj70WV0kXp36SLc4NQef568xbkdYocJ37yDRxG0WjVRnWJhHec8SOTZ7w0VR0uVNPEA1FA5wgOLNf7bowt3qyX9MGMpTNreo9B+/VuayC/lU4HXLKvECb8WkGD9tw5rUmKke1PplecAngT2GFLbd5spB9yMHFYodcmYG+fF9/N4DNgeQf9MFOprsypm2h8OVETPsEDYed1ww4xQf2/uscWa0SxgNxSJFjruMakDk5Zs5+AYkLVijLiFuizEElpxngFa/nn87OrB8BncHf+flAX3GxMsmKzH1GVpCsCs2NSL/6gZeCY/LvaJmPNexC6yzWQ8sHTqxFz/PgvPijgziImtkdvWlMwS+37GvBqhjfoIPw7p2Lxii7Wp9n4l67924Q+rGO4suiil3blgmwdsOQCXTMB3h8sAWw6rV0FaS55As2GhydP9wNTGO3yBnCenJxH32z06kWtfxOWQfuz+hgv0p+7czJU= X-OriginatorOrg: iopsys.eu X-MS-Exchange-CrossTenant-Network-Message-Id: 94abd3d9-1600-4525-30a6-08dc969c104a X-MS-Exchange-CrossTenant-AuthSource: GV2PR08MB8121.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 Jun 2024 11:27:01.3596 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 8d891be1-7bce-4216-9a99-bee9de02ba58 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: yuz2kaY5ZpCc7ilnOm5rbkIu4suuJql8yo9vdQrj3lY9KpOqDtTcZFKugvcIj8XuD1jyGy6ICLmiOV7SF0rJvqRUWcI2m3qsUhilNIjWe3o= X-MS-Exchange-Transport-CrossTenantHeadersStamped: PAXPR08MB6431 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 Some nand flashes (like spi-nand one) are registered with mtd subsystem only, thus nand command can't be used to work with such flashes. As result some functionality is missing. This patch implements 'nand torture' functionality for mtd command. Signed-off-by: Mikhail Kshevetskiy --- cmd/Kconfig | 6 ++ cmd/mtd.c | 196 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 202 insertions(+) diff --git a/cmd/Kconfig b/cmd/Kconfig index 70c2d6a2dda..0685b598679 100644 --- a/cmd/Kconfig +++ b/cmd/Kconfig @@ -1424,6 +1424,12 @@ config CMD_MTD_MARKBAD help MTD markbad command support. +config CMD_MTD_TORTURE + bool "mtd torture" + depends on CMD_MTD + help + MTD torture command support. + config CMD_MUX bool "mux" depends on MULTIPLEXER diff --git a/cmd/mtd.c b/cmd/mtd.c index 18f00493780..df4130b90d1 100644 --- a/cmd/mtd.c +++ b/cmd/mtd.c @@ -19,6 +19,7 @@ #include #include #include +#include #include @@ -743,6 +744,194 @@ out_put_mtd: } #endif +#ifdef CONFIG_CMD_MTD_TORTURE +/** + * nand_check_pattern: + * + * Check if buffer contains only a certain byte pattern. + * + * @param buf buffer to check + * @param patt the pattern to check + * @param size buffer size in bytes + * Return: 1 if there are only patt bytes in buf + * 0 if something else was found + */ +static int nand_check_pattern(const u_char *buf, u_char patt, int size) +{ + int i; + + for (i = 0; i < size; i++) + if (buf[i] != patt) + return 0; + return 1; +} + +/** + * nand_torture: + * + * Torture a block of NAND flash. + * This is useful to determine if a block that caused a write error is still + * good or should be marked as bad. + * + * @param mtd nand mtd instance + * @param offset offset in flash + * Return: 0 if the block is still good + */ +static int nand_torture(struct mtd_info *mtd, loff_t offset) +{ + u_char patterns[] = {0xa5, 0x5a, 0x00}; + struct erase_info instr = { + .mtd = mtd, + .addr = offset, + .len = mtd->erasesize, + }; + size_t retlen; + int err, ret = -1, i, patt_count; + u_char *buf; + + if ((offset & (mtd->erasesize - 1)) != 0) { + puts("Attempt to torture a block at a non block-aligned offset\n"); + return -EINVAL; + } + + if (offset + mtd->erasesize > mtd->size) { + puts("Attempt to torture a block outside the flash area\n"); + return -EINVAL; + } + + patt_count = ARRAY_SIZE(patterns); + + buf = malloc_cache_aligned(mtd->erasesize); + if (buf == NULL) { + puts("Out of memory for erase block buffer\n"); + return -ENOMEM; + } + + for (i = 0; i < patt_count; i++) { + err = mtd_erase(mtd, &instr); + if (err) { + printf("%s: erase() failed for block at 0x%llx: %d\n", + mtd->name, instr.addr, err); + goto out; + } + + /* Make sure the block contains only 0xff bytes */ + err = mtd_read(mtd, offset, mtd->erasesize, &retlen, buf); + if ((err && err != -EUCLEAN) || retlen != mtd->erasesize) { + printf("%s: read() failed for block at 0x%llx: %d\n", + mtd->name, instr.addr, err); + goto out; + } + + err = nand_check_pattern(buf, 0xff, mtd->erasesize); + if (!err) { + printf("Erased block at 0x%llx, but a non-0xff byte was found\n", + offset); + ret = -EIO; + goto out; + } + + /* Write a pattern and check it */ + memset(buf, patterns[i], mtd->erasesize); + err = mtd_write(mtd, offset, mtd->erasesize, &retlen, buf); + if (err || retlen != mtd->erasesize) { + printf("%s: write() failed for block at 0x%llx: %d\n", + mtd->name, instr.addr, err); + goto out; + } + + err = mtd_read(mtd, offset, mtd->erasesize, &retlen, buf); + if ((err && err != -EUCLEAN) || retlen != mtd->erasesize) { + printf("%s: read() failed for block at 0x%llx: %d\n", + mtd->name, instr.addr, err); + goto out; + } + + err = nand_check_pattern(buf, patterns[i], mtd->erasesize); + if (!err) { + printf("Pattern 0x%.2x checking failed for block at " + "0x%llx\n", patterns[i], offset); + ret = -EIO; + goto out; + } + } + + ret = 0; + +out: + free(buf); + return ret; +} + +static int do_mtd_torture(struct cmd_tbl *cmdtp, int flag, int argc, + char *const argv[]) +{ + struct mtd_info *mtd; + loff_t off, len; + int ret = 0; + unsigned int failed = 0, passed = 0; + + if (argc < 2) + return CMD_RET_USAGE; + + mtd = get_mtd_by_name(argv[1]); + if (IS_ERR_OR_NULL(mtd)) + return CMD_RET_FAILURE; + + if (!mtd_can_have_bb(mtd)) { + printf("Only NAND-based devices can be tortured\n"); + goto out_put_mtd; + } + + argc -= 2; + argv += 2; + + off = argc > 0 ? hextoul(argv[0], NULL) : 0; + len = argc > 1 ? hextoul(argv[1], NULL) : mtd->size; + + if (!mtd_is_aligned_with_block_size(mtd, off)) { + printf("Offset not aligned with a block (0x%x)\n", + mtd->erasesize); + ret = CMD_RET_FAILURE; + goto out_put_mtd; + } + + if (!mtd_is_aligned_with_block_size(mtd, len)) { + printf("Size not a multiple of a block (0x%x)\n", + mtd->erasesize); + ret = CMD_RET_FAILURE; + goto out_put_mtd; + } + + printf("\nNAND torture: device '%s' offset 0x%llx size 0x%llx (block size 0x%x)\n", + mtd->name, off, len, mtd->erasesize); + while (len > 0) { + printf("\r block at %llx ", off); + if (mtd_block_isbad(mtd, off)) { + printf("marked bad, skipping\n"); + } else { + ret = nand_torture(mtd, off); + if (ret) { + failed++; + printf("failed\n"); + } else { + passed++; + } + } + off += mtd->erasesize; + len -= mtd->erasesize; + } + printf("\n Passed: %u, failed: %u\n", passed, failed); + if (failed != 0) + ret = CMD_RET_FAILURE; + +out_put_mtd: + put_mtd_device(mtd); + + return ret; +} +#endif + static int do_mtd_bad(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) { @@ -828,6 +1017,9 @@ U_BOOT_LONGHELP(mtd, #endif #ifdef CONFIG_CMD_MTD_MARKBAD "mtd markbad [ ...]\n" +#endif +#ifdef CONFIG_CMD_MTD_TORTURE + "mtd torture [ []]\n" #endif "\n" "With:\n" @@ -865,6 +1057,10 @@ U_BOOT_CMD_WITH_SUBCMDS(mtd, "MTD utils", mtd_help_text, #ifdef CONFIG_CMD_MTD_MARKBAD U_BOOT_SUBCMD_MKENT_COMPLETE(markbad, 20, 0, do_mtd_markbad, mtd_name_complete), +#endif +#ifdef CONFIG_CMD_MTD_TORTURE + U_BOOT_SUBCMD_MKENT_COMPLETE(torture, 4, 0, do_mtd_torture, + mtd_name_complete), #endif U_BOOT_SUBCMD_MKENT_COMPLETE(bad, 2, 1, do_mtd_bad, mtd_name_complete)); From patchwork Thu Jun 27 11:26:52 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikhail Kshevetskiy X-Patchwork-Id: 1953192 X-Patchwork-Delegate: dario.binacchi@amarulasolutions.com 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=iopsys.eu header.i=@iopsys.eu header.a=rsa-sha256 header.s=selector2 header.b=ppp/4JHz; 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 4W8xB741wsz20XB for ; Thu, 27 Jun 2024 21:27:27 +1000 (AEST) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id CAAA788590; Thu, 27 Jun 2024 13:27:10 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=reject dis=none) header.from=iopsys.eu 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=iopsys.eu header.i=@iopsys.eu header.b="ppp/4JHz"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id E55238852C; Thu, 27 Jun 2024 13:27:06 +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=-1.8 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,SPF_HELO_PASS, SPF_PASS autolearn=no autolearn_force=no version=3.4.2 Received: from EUR03-AM7-obe.outbound.protection.outlook.com (mail-am7eur03on20701.outbound.protection.outlook.com [IPv6:2a01:111:f403:260e::701]) (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 B2B7E87AD2 for ; Thu, 27 Jun 2024 13:27:04 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=reject dis=none) header.from=iopsys.eu Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=mikhail.kshevetskiy@genexis.eu ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=X5eYBvZqpQNOhXTlNSTM3kt42Lm/QS/R0tPYeS8SebrkNs20dWYxBCZwRpn2p3GLvNyz2P5GxvPLtN5Fuw5VNtLuPf/Lx4aqNL1UMfNziAMYQ5HDDbnwMS04+9W12Pz5RAhFyPQuOVbIFPCrcxFdcmmYO9XckAyX3rkXl3fh7ZOHvYHhj52r3Hqkt6cpm3nXqONUZSzxNO+w+EpT3PbdZmXGwD2L400EwM3Z+YeiHErTVkMX4jqKVvEO9f92To1ez0fqeK7t8f3j7Ht1XIJW4wwOsHoVKaQc3QuAYed8PjVtSuTsJnG7VvQwh5+q6LgfNCM+6yIwiasWyO/iDJqe7g== 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-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=qCB8eV2EiujCZAfXfqBdcO7j/C2oUz3aLWj5yvDAHbM=; b=Up1ShUXA0z0WGltBX6r/MGbkd6UJQvzMFkowuGhzIu0URJj3vSnEY10RGBM2uD8P0siFQzw2ZFRhIsxylWVt4kQRypWI7Ek0zCPkJP6UbxGTJ/fOsUeeVnNhIt1A/ecGjSzMOKSKRwoQ7FBQUpJv1QJvjH/I6g/EAA3W6pAxlMobkUgRwXHzCo1GbVGTptsnUNYiuB7fkANYKSP8SCmrU4rb9uCzyx6Ueye1iv+2uZLr7mNORf4T2GnvRpOBxeFTFw4nW41A52rzfNMI80uOd/is/LBE7QIO3Xg09k0RkTOYntXWhs2JwUQD1by7t4QAk62pRBtbBH0MKQXLtH8S5A== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=genexis.eu; dmarc=pass action=none header.from=iopsys.eu; dkim=pass header.d=iopsys.eu; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iopsys.eu; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=qCB8eV2EiujCZAfXfqBdcO7j/C2oUz3aLWj5yvDAHbM=; b=ppp/4JHzAO1d9yK9/8HOGCG8PBUCpZxeaCmGBqDLosWsP302DtQLiVAp5YPBikX5CzIlhy6TLPr5fVK6/3AcYnfmW8mxFwKs/0Bsm92mjeOUCxTILDIHMdmCqigxRJtQPwikzO7vBRKgqD3cEAYzb4b+WdiICE403HDqFKoo/N7Uvyp0h9NZGb9H5dEvh5F9J4K2y6R6HpBu4OCGDNThJrSJG1wCMi9Qfn3saz2JcoTHnskIBSHmdYf5EuwCCF5wkJtEe3/jqxrFGa/EO3RziGrRUul+I0P0p1GaWrG3qqG+NTtNU3qRd++6zkNE4ebYNAnUCAx2OEDFZbBN38MkSw== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=iopsys.eu; Received: from GV2PR08MB8121.eurprd08.prod.outlook.com (2603:10a6:150:7d::22) by PAXPR08MB6686.eurprd08.prod.outlook.com (2603:10a6:102:13e::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7698.35; Thu, 27 Jun 2024 11:27:02 +0000 Received: from GV2PR08MB8121.eurprd08.prod.outlook.com ([fe80::4cd3:da80:2532:daa0]) by GV2PR08MB8121.eurprd08.prod.outlook.com ([fe80::4cd3:da80:2532:daa0%5]) with mapi id 15.20.7698.025; Thu, 27 Jun 2024 11:27:02 +0000 From: Mikhail Kshevetskiy To: Tom Rini , Simon Glass , Mattijs Korpershoek , AKASHI Takahiro , Heinrich Schuchardt , Ilias Apalodimas , Francis Laniel , Abdellatif El Khlifi , Peter Robinson , Dario Binacchi , Arseniy Krasnov , u-boot@lists.denx.de Subject: [PATCH 3/3] cmd: mtd: add nandtest command support Date: Thu, 27 Jun 2024 14:26:52 +0300 Message-ID: <20240627112652.99818-3-mikhail.kshevetskiy@iopsys.eu> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240627112652.99818-1-mikhail.kshevetskiy@iopsys.eu> References: <20240627112652.99818-1-mikhail.kshevetskiy@iopsys.eu> X-ClientProxiedBy: FR0P281CA0165.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:b3::13) To GV2PR08MB8121.eurprd08.prod.outlook.com (2603:10a6:150:7d::22) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: GV2PR08MB8121:EE_|PAXPR08MB6686:EE_ X-MS-Office365-Filtering-Correlation-Id: 06c51aea-e9fa-40c0-88a0-08dc969c10f3 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|366016|52116014|7416014|1800799024|376014|38350700014|921020; X-Microsoft-Antispam-Message-Info: BdN1ird/K2/mGg4FVa2oxfKLDcLLiR0G4mb7yBODeIXjJuOqbWFF+bcgnodWmeDjgDzzbtL3znwRrZA/3P1t8NIjemZmaECXTa0UhWpIppK08jLClyhXMbAA02w4ly8XwQ0CiK8tIwBbqftPeAEysO9DH6+ENuUhT1HLEArn05BWcRnrTmvcnYnunBmCYxKnZSy8B3xdUQBKnU83idZgQwvB3wHIyk+71WHuvc7WfWrMBpV2gJFDba0rT5DQ1uPyWphj+sx3eWJnIv8PNhmbJvFhpPTi5sh1ZKrQNSglUKQ7H2cRYU0gatkZkuN2NWhxQkNd4d6nn69LB+wz8Twyrsy5OzDofAFxNvWMttJsLVrlVzyFVORp2YB9gscPfHw5xfReDO7vU65OwZkECV7ysUBwbqJQUMkDmZ3eEm5Kl7nQP9m41LTttboL2R6kf7o5HqujjYzX5LrQim28RmckBEGCIUaJqjEnuL1UC1mnWXxGyAZPw5V61rZrJtRW7Nf0BZeIm7doRnFwTilePPMAoQb+nRc3BM3YDGdtOn7L7ZY9XoPmH4HRgYmKtT2qEV6LQ+ecktPOCI9OLAqBDicFdW++HKr1iRdEsdET+LA6gLVZhE54/0QctMyJbGBD6sjXFaNer/qNyUfdHb2y/kXm6a6Mt88NLEOX1RJmpvnWpsNpFmdVqRjwvewbBqSLyv/dMXOX78rYFdwFGXrchh0W6sV4+lZ0vPdppmBisJcRBuixS+xYH3ZOw1fX5pBPPsDkH6hl/+mn10Mbi5T1EPb/zJ/4y9k+ao1UhANAMa+t4idfYO13K9E2PoNtghdHkDjwOEw5d6UTSIISQSEU3o42ENOwuQ98MZ8CV/pabgdA/zyo0Sw6L/DHVykVdIl0X31HaUq9nhmyDfMAygtsNN6cYJhYt11fUNo0Lbpu0P9MJeHlSh8qob7mZRxNg6+hJ9vnU9UMSeo9DmC+cW79kZb2+o2er66z1CoumAV9BDh60dra5wVVHMFona2+LvSp3MHMg2PWBVbf01ECFwYndaM0lFQZdJBtJ5p/gZTL29knqPd621VSjKoyFKFBvQlDd5mHHFusczqcuP2ELKbXCzMQxaizM6Vx/6uuovyKJd+ZvBlG54i0kerhjvFE0gjRgz0+qW9cgqG4ZKE+T2mKNfXERpiIWe0ZW62P5RYlQmDmuE1MEo/U6w2qwW0cN1P3a28aDuPofVMULTGvktFykfcNB+I3pO1vK0ZUeqAJrS/AxkbYqKVFEglhzV6gS9r1u79Je2Rh7RIIUhHx9i1JcGvDW+l9BVP/GTNfAzPTXiVFAuS6ipLyprO288GzqQizH/bEkC+TRwsHw3uiX/iTrKXSbkg1sdZrWcT+Qo+aZp4Imy6DQoxnY4085EyLZNv7eQlXDPLvFSzPtYnF9cc/ZSxSpHp7bfPrUy0iQx8mys9e0oI= X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:GV2PR08MB8121.eurprd08.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230040)(366016)(52116014)(7416014)(1800799024)(376014)(38350700014)(921020); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: P437nvuVazHDe4dfN9vbTqw9yH4znM33/6qqZvJoGiGzMOfVXvl+Om/hCO3/QeWh2c5P+AKpYeJv7dcdAVfztY9VktIp811R3Plr3BDgoNVS5fIDDQXH+3Fp8q0Q62rXQlFtBgKWnZwsGLnP93R6HujACiMX02SUTn9cP/iFB3EzkCZjlswBL1NGB9StxNjJskBSDAKbPqYH4xL+0F4DL0ewb4VpUCvgQM1Nce+0xFMQuSohu5qqUeGqhGG6WAV4wLXpqvUwIGY1BAsliruO3sX8JYUpBdvKpRbwR+7fyUoxPdnxfOmZb8zB2Q5PwFjcvQmGpOwP5Ky6Cyhs309dZDXgvDM4QJm3mEZ72dltz5vk5QclGoRxRC16TYd8lkGwjt/HTj9y/pPg4dM7+fC4Wd+6vwRv9WNvTvs8WKjR8srrtuvVjGDthjYGoigiyZCm8XbyMnogKcNoqL8jT39Eb/HjRo/945YHDmp+w9SFWEJI4jG2DjG6yGEXn7NNU0+XNhJ4pXVDeiCaFFCMq45FKMzGszxPpWtrXpjAE0eDt7EftZ+QSkfRB7EpfjzCKNRlQ6ei1+oyK5hfBsuNl+FxrakMh97Rg0mVyUI+T3BUz6Ty6/rh49yKr0w0TnTFSQfbMTFOhe4IR0dvBA6L0mSYEwKun9Y/dSU4M7oJjpT+WvUwKyQkacabpbndCiiAvE+KcS4vTraozzzSqRzTfpnQu6h9fWe/xX5V7G+AcpjkqsdsNUOSuxMm4E2EsbnMCerGPNd2N3kogaXanbLT+vrg9rVKDf6ojG+EeAIAj/ca5K6T1MVd2zkORIlzkz89l0F8T2BYVKB5eJZ8kM5PAPdtNoCbVt9Jzg6UKxMwgrBKftRtTm3s8qULOGgPm+KE0cYkj2mZCKUw136T0XuDY4bTxk0PevmVMinjzxGBHReLzDcxiD6FxaC+U+hTjke0wlihbuzxXepwnDGz+vAP7Go/r3ak2vY8fSiFzEDY+Y6gbJ6V1dWSwHNA6QZyHmn6xI7dq6QDCYWI8QyXS8Vs0MB+eY4mUph6gUhlZoayobjBPlzfkLfLMqO9IoGxMDeJRqZZeRN7b9X4tD+CpjWMrDVgCgCD1IJ8eXm70GRxPIf22cxJKqrW2VxssO+SNUvwl1lV6hc6E3luhe8li+YW1UxbtoEMXE42Q/uj0xx37JvXFTPxhc4x+g94LiPrQwQIOI9T8akM/FP0hFtAgHAKL2GSCtUpbjDzF5xixr56+znvUrv1DvO9PNubXh0PtoFT3NhOriRJQ+A/gijh1Lpe1V4rthGealn8V0pIGHrdIZ3DstIJg0psTanEvTTOH4v1+P64k0dlr2HzRmjqXul9pQtAMztcrl0bX5MvnVmfyBExtt5DxejXGzdbfah1CS3AW39l8Hab5XBzstf97/8WOCQXVcPIfPHoBjovYhOhqGvY3GZeCW334PUkpa5qx+N9D/wopW22SdFkPCGkwGbAenQGJBBvdhCv1XTkxvidigcUaDCj+lVJtTns3XkQgM0h47Y62r6iPEVmmWO485QRuXkb+3ruk/8wT7p7FCKOjS9zKfIGdmT66BQElWP0cBFtOn4lGnOCS4r8RlWPWl0eO0oJVb/d9dPwX5rsIMPe7+9z1go= X-OriginatorOrg: iopsys.eu X-MS-Exchange-CrossTenant-Network-Message-Id: 06c51aea-e9fa-40c0-88a0-08dc969c10f3 X-MS-Exchange-CrossTenant-AuthSource: GV2PR08MB8121.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 Jun 2024 11:27:02.4615 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 8d891be1-7bce-4216-9a99-bee9de02ba58 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: Z+7Q/Ij3p3uA8rQH0Sc9Dijk8n2IBy7LlUJqrhlvrrA8oFAaNTht4soIWGRpmeukmrENZJtzdfnSLsYh/LTr3LtaS12FQrKCScVn7AUj7co= X-MS-Exchange-Transport-CrossTenantHeadersStamped: PAXPR08MB6686 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 patch implements readonly test of nand flashes. Signed-off-by: Mikhail Kshevetskiy --- cmd/Kconfig | 6 ++ cmd/mtd.c | 203 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 209 insertions(+) diff --git a/cmd/Kconfig b/cmd/Kconfig index 0685b598679..d5cc6de93cd 100644 --- a/cmd/Kconfig +++ b/cmd/Kconfig @@ -1430,6 +1430,12 @@ config CMD_MTD_TORTURE help MTD torture command support. +config CMD_MTD_NANDTEST + bool "mtd nandtest" + depends on CMD_MTD + help + MTD nandtest command support. + config CMD_MUX bool "mux" depends on MULTIPLEXER diff --git a/cmd/mtd.c b/cmd/mtd.c index df4130b90d1..bb89e783d54 100644 --- a/cmd/mtd.c +++ b/cmd/mtd.c @@ -932,6 +932,202 @@ out_put_mtd: } #endif +#ifdef CONFIG_CMD_MTD_NANDTEST +enum nandtest_status { + NANDTEST_STATUS_UNKNOWN = 0, + NANDTEST_STATUS_NONECC_READ_FAIL, + NANDTEST_STATUS_ECC_READ_FAIL, + NANDTEST_STATUS_BAD_BLOCK, + NANDTEST_STATUS_BITFLIP_ABOVE_MAX, + NANDTEST_STATUS_BITFLIP_MISMATCH, + NANDTEST_STATUS_BITFLIP_MAX, + NANDTEST_STATUS_OK, +}; + +static enum nandtest_status nandtest_block_check(struct mtd_info *mtd, + loff_t off, size_t blocksize) +{ + struct mtd_oob_ops ops = {}; + u_char *buf; + int i, d, ret, len, pos, cnt, max; + + if (blocksize % mtd->writesize != 0) { + printf("\r block at %llx: bad block size\n", off); + return NANDTEST_STATUS_UNKNOWN; + } + + buf = malloc_cache_aligned(2 * blocksize); + if (buf == NULL) { + printf("\r block at %llx: can't allocate memory\n", off); + return NANDTEST_STATUS_UNKNOWN; + } + + ops.mode = MTD_OPS_RAW; + ops.len = blocksize; + ops.datbuf = buf; + ops.ooblen = 0; + ops.oobbuf = NULL; + + if (mtd->_read_oob) + ret = mtd->_read_oob(mtd, off, &ops); + else + ret = mtd->_read(mtd, off, ops.len, &ops.retlen, ops.datbuf); + + if (ret != 0) { + free(buf); + printf("\r block at %llx: non-ecc reading error %d\n", + off, ret); + return NANDTEST_STATUS_NONECC_READ_FAIL; + } + + ops.mode = MTD_OPS_AUTO_OOB; + ops.datbuf = buf + blocksize; + + if (mtd->_read_oob) + ret = mtd->_read_oob(mtd, off, &ops); + else + ret = mtd->_read(mtd, off, ops.len, &ops.retlen, ops.datbuf); + + if (ret == -EBADMSG) { + free(buf); + printf("\r block at %llx: bad block\n", off); + return NANDTEST_STATUS_BAD_BLOCK; + } + + if (ret < 0) { + free(buf); + printf("\r block at %llx: ecc reading error %d\n", off, ret); + return NANDTEST_STATUS_ECC_READ_FAIL; + } + + if (mtd->ecc_strength == 0) { + free(buf); + return NANDTEST_STATUS_OK; + } + + if (ret > mtd->ecc_strength) { + free(buf); + printf("\r block at %llx: returned bit-flips value %d " + "is above maximum value %d\n", + off, ret, mtd->ecc_strength); + return NANDTEST_STATUS_BITFLIP_ABOVE_MAX; + } + + max = 0; + pos = 0; + len = blocksize; + while (len > 0) { + cnt = 0; + for (i = 0; i < mtd->ecc_step_size; i++) { + d = buf[pos + i] ^ buf[blocksize + pos + i]; + if (d == 0) + continue; + + while (d > 0) { + d &= (d - 1); + cnt++; + } + } + if (cnt > max) + max = cnt; + + len -= mtd->ecc_step_size; + pos += mtd->ecc_step_size; + } + + free(buf); + + if (max > ret) { + printf("\r block at %llx: bitflip mismatch, " + "read %d but actual %d\n", off, ret, max); + return NANDTEST_STATUS_BITFLIP_MISMATCH; + } + + if (ret == mtd->ecc_strength) { + printf("\r block at %llx: max bitflip reached, " + "block is unreliable\n", off); + return NANDTEST_STATUS_BITFLIP_MAX; + } + + return NANDTEST_STATUS_OK; +} + +static int do_mtd_nandtest(struct cmd_tbl *cmdtp, int flag, int argc, + char *const argv[]) +{ + struct mtd_info *mtd; + loff_t off, len; + int stat[NANDTEST_STATUS_OK + 1]; + enum nandtest_status ret; + size_t block_size; + + if (argc < 2) + return CMD_RET_USAGE; + + mtd = get_mtd_by_name(argv[1]); + if (IS_ERR_OR_NULL(mtd)) + return CMD_RET_FAILURE; + + if (!mtd_can_have_bb(mtd)) { + printf("Only NAND-based devices can be checked\n"); + goto out_put_mtd; + } + + off = 0; + len = mtd->size; + block_size = mtd->erasesize; + + printf("ECC strength: %d\n", mtd->ecc_strength); + printf("ECC step size: %d\n", mtd->ecc_step_size); + printf("Erase block size: 0x%x\n", mtd->erasesize); + printf("Total blocks: %d\n", (u32)len / mtd->erasesize); + + memset(stat, 0, sizeof(stat)); + while (len > 0) { + if (mtd_is_aligned_with_block_size(mtd, off)) + printf("\r block at %llx ", off); + + ret = nandtest_block_check(mtd, off, block_size); + stat[ret]++; + + switch (ret) { + case NANDTEST_STATUS_BAD_BLOCK: + case NANDTEST_STATUS_BITFLIP_MAX: + if (!mtd_block_isbad(mtd, off)) + printf("\r block at %llx: should be marked " + "as BAD\n", off); + break; + + case NANDTEST_STATUS_OK: + if (mtd_block_isbad(mtd, off)) + printf("\r block at %llx: marked as BAD, but " + "probably is GOOD\n", off); + break; + + default: + break; + } + + off += block_size; + len -= block_size; + } + +out_put_mtd: + put_mtd_device(mtd); + printf("\n"); + printf("results:\n"); + printf(" Good blocks: %d\n", stat[NANDTEST_STATUS_OK]); + printf(" Physically bad blocks: %d\n", stat[NANDTEST_STATUS_BAD_BLOCK]); + printf(" Unreliable blocks: %d\n", stat[NANDTEST_STATUS_BITFLIP_MAX]); + printf(" Non checked blocks: %d\n", stat[NANDTEST_STATUS_UNKNOWN]); + printf(" Failed to check blocks: %d\n", stat[NANDTEST_STATUS_NONECC_READ_FAIL] + + stat[NANDTEST_STATUS_ECC_READ_FAIL]); + printf(" Suspictious blocks: %d\n", stat[NANDTEST_STATUS_BITFLIP_ABOVE_MAX] + + stat[NANDTEST_STATUS_BITFLIP_MISMATCH]); + return CMD_RET_SUCCESS; +} +#endif + static int do_mtd_bad(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) { @@ -1020,6 +1216,9 @@ U_BOOT_LONGHELP(mtd, #endif #ifdef CONFIG_CMD_MTD_TORTURE "mtd torture [ []]\n" +#endif +#ifdef CONFIG_CMD_MTD_NANDTEST + "mtd nandtest \n" #endif "\n" "With:\n" @@ -1061,6 +1260,10 @@ U_BOOT_CMD_WITH_SUBCMDS(mtd, "MTD utils", mtd_help_text, #ifdef CONFIG_CMD_MTD_TORTURE U_BOOT_SUBCMD_MKENT_COMPLETE(torture, 4, 0, do_mtd_torture, mtd_name_complete), +#endif +#ifdef CONFIG_CMD_MTD_NANDTEST + U_BOOT_SUBCMD_MKENT_COMPLETE(nandtest, 2, 0, do_mtd_nandtest, + mtd_name_complete), #endif U_BOOT_SUBCMD_MKENT_COMPLETE(bad, 2, 1, do_mtd_bad, mtd_name_complete));