From patchwork Tue Dec 3 23:05:49 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikhail Kshevetskiy X-Patchwork-Id: 2017962 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=1xTVnTz0; 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 4Y2x922clxz1yCt for ; Wed, 4 Dec 2024 10:06:14 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 4D7788967D; Wed, 4 Dec 2024 00:06:05 +0100 (CET) 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="1xTVnTz0"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id E08FE8931C; Wed, 4 Dec 2024 00:06:03 +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=-2.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, RCVD_IN_DNSWL_BLOCKED,SPF_HELO_PASS,SPF_PASS autolearn=ham autolearn_force=no version=3.4.2 Received: from EUR05-VI1-obe.outbound.protection.outlook.com (mail-vi1eur05on20729.outbound.protection.outlook.com [IPv6:2a01:111:f403:2613::729]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id AAB498964A for ; Wed, 4 Dec 2024 00:06:01 +0100 (CET) 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=arcselector10001; d=microsoft.com; cv=none; b=AfWXVo9jUaZs/TRdWJAAk12qZmTmKdfbDRdquu6uR27beuuhdEwPsPPkHaVce8Wrsc/Rmyu2R3q4YbjpIZsJ1C61AtCN6ZyGkRsRqEC4Ybg9K8qIGwnrVTXTLIgE3GB2BATyYkCNgOC3eJaQe7E7l7L9lOyaBrLa2asK2pfIX/h6iF6XAlMZ9A3KSmKj1GcJZYFQAtgjKGAZbRdbstUAbC6fuYtfOZgUMBGHH3rnqcj4++Ya1yw6SuqXo60AqLO4AHVLg2KjvIUKWWiV/1mJq3+Irz8D634tmyHHsddp1WB9n4oCdT83s6HM+kZuHbgcZMrupivWkM2gEpJyH9eTBg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; 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=TishTVxCGC+21RIvuNdd0Ay6cgr3Qt8qnLTquBFkN5w=; b=uLAaUzDppzogunt7Gc9FozCkt5f0ebr6r77DH7sIKrX8V9N616icC0jHW9VGO21r/RhfPYskqikd52BfnB1vFt97pDWJugvxVLzOiBixGCVnSRxHTumL6SC5HKKl1uYmwhLx4sfCzy6LAJlgLqho95cZuXXEGAEfTv8eznhOxIJFCyuqkXrkKxRiZ9m6LG70uhUnKWYIHy0JLQqBWrjahyUUAkPaQLP38sE97Z6zefosAXRIU6UqSWftGVeOdSiBU1FaebHtnGM0IxWXf9w498brAdL6L/QqjpTx/I9qIgCVrES3nflT2ZUM0sDk17OHPYH5GjIGDgSOKebt/NK9/A== 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=TishTVxCGC+21RIvuNdd0Ay6cgr3Qt8qnLTquBFkN5w=; b=1xTVnTz0cRRWNi5w6H0qYJy65K7kLzWW+8U+8ESU8nCodaTy+5+wpq0vTxQTj7UoTyLFyj5sEaoY4p9aLY1WgiFPAtzfh1E8VZLkvhvJYIs8OrfFxKzJJoxQkR7U3uuZooUThlSpgOHSGYwo1h6Jca1sVsirQs2PZHahXVisw2UuXhrZkxx+LnwftkBu6gXhPFmF8DQXzX7A1tk8WU+yXYkLuApdAjO7eKfOsJd9ok9IV/m35F8psKDhnKUOFZvzIZMdjerd1makF70j5MbS/9bfsJweCfR6wHabzb7efsvvZbKDY/XjvAsaiK/k41Av15VjymbHluPGJu+LFrAbJA== 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 AM9PR08MB6066.eurprd08.prod.outlook.com (2603:10a6:20b:2d8::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8207.19; Tue, 3 Dec 2024 23:06: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%3]) with mapi id 15.20.8207.017; Tue, 3 Dec 2024 23:06:00 +0000 From: Mikhail Kshevetskiy To: Tom Rini , Simon Glass , Ilias Apalodimas , Heinrich Schuchardt , Jerome Forissier , Mattijs Korpershoek , AKASHI Takahiro , Dmitry Rokosov , Dario Binacchi , Miquel Raynal , Arseniy Krasnov , Christian Marangi , u-boot@lists.denx.de Cc: Mikhail Kshevetskiy Subject: [RESEND v4 1/3] cmd: mtd: add markbad command support Date: Wed, 4 Dec 2024 02:05:49 +0300 Message-ID: <20241203230551.2677602-2-mikhail.kshevetskiy@iopsys.eu> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20241203230551.2677602-1-mikhail.kshevetskiy@iopsys.eu> References: <20241203230551.2677602-1-mikhail.kshevetskiy@iopsys.eu> X-ClientProxiedBy: GVX0EPF00014AEF.SWEP280.PROD.OUTLOOK.COM (2603:10a6:158:401::31d) To GV2PR08MB8121.eurprd08.prod.outlook.com (2603:10a6:150:7d::22) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: GV2PR08MB8121:EE_|AM9PR08MB6066:EE_ X-MS-Office365-Filtering-Correlation-Id: 809bd1d0-b0d9-4595-9fd2-08dd13ef0d97 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|366016|1800799024|52116014|7416014|376014|921020|38350700014; X-Microsoft-Antispam-Message-Info: hy5j83HT5BeYX4sfhFiXQ7lt3Gg7t7q5zDWW5qcK+hyrcF0yVhztuMMEHmkZwwtYi7X76XBKTGkOB9x3yedERmDetl8a4LQRYp3MFWEzecBu8/GSrK8XnlpBQD4SAPYWAfAo3hZqTCKOTsazAQ8MBKXG+APWi6E4nCohNXdMy/E4h105pzIyducuFDE/pFsLc/04sUgtBfgTGEP3f740I8tfdaOY/ZJI+/OxqYSmb4uUkO/y/fDi6g7p47A9Gkvp2O91UBzbfw1NwUD/diIX9g+etk5prYSIQ/m/3kxImuBYUoqMjM0b9lW6udL4Vc5DZ9LoDLTENXoo8VO9elKk+MEtXNn0xbwZPzutCSCTGn+SZY8PGV86zsrC0CGr1x7BLhxxM4Cb+cg7kDY93OHiZ3PnlHHjtfGwLYvYbYXkyqruwZMsGjwt7tKLmecIPlFDIV/GIYaAwknpbEqZaBRDrOsNKq8W+m77ABq4mDymqR209oYV5491ACUS5puIFMXg0DMx2ZlLBNMdNFF99ACLI6e+xji5cVhTW74O8uNNtkDxyvxBX0VVQtMuBMirbp7HJNPCUIrawckU+zn8ICZA7zkjC8hHj/5zWev+CQwnBNT/EWmOoDjFZYajn8K7FRBGUXJVUNMoBsEPArSjo1VskKk/uszjmk+z9Ota59FMLf8ZQG7USV41cnI1aJDBmis/icKpR9JqkrkMlCyQjI3TisAyujrvqv6OR+hGLGD1dZo8m2OgBmCTLZH/KDL4qN2wBzDNbx1tfnQT8EVdzMofFkSYkYEU+31DymYndd39ruFLaOvLStDpqLSGM++qkBCz4x74EUXsrJu2S1jAtQhJE2h86uXRUnB0eYAyv6z2sGufcNupzl9id3wt/3vDI0YHOA7DxmMRT0R5QnmgWEpIKyxMGrcm4EiO+zv9Hfw4sYQC3B/A881XC62nVpRYTnsqwlPssPf131BKA90F7HQYX6uY8xrfENqlZRxHiR1cuXpVg39s3I/KEMGmPNAvjzqXQ0mR7u2qF6tEjaJNEnKzjN5ut6unFq2byIkhZEcPCMkLjxPnhyrpkGhgsyaXMmh/JZN4FPHLhRokKEcwd7fFCZfu8XuxTGxXAnNrhWx0+n3LGCHrgHagcsim0NPd7NZ3wgWYCrCLOZp4PsYuvOfUuXaPAmNErFf+W8vNFpTES6DJ9MeflIvhiGiNeKqdN8ZBr2r1tpywzlsEpmPQjZSphIepjALL+smH62naJGBt40NchVl7AQdMJPdxqjKS4LN6YUgSLQw9zVJ0e5kN84NQSzYkjQqVE4a4utOrpxqCBXrn0HPW6iyy2uXovho+F3VmlqewWL5QmCHaKJCIubB6ZhASCVOJbXagxjp9rz69MxkTPtes2OMuStaR0wz/A2F8IPYooGU43anru9QdxAgeiFT2oa2phkLjXN0Ztm2ouR0= 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)(1800799024)(52116014)(7416014)(376014)(921020)(38350700014); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: r0ZzFzk5QiimKFztIGhaqwzDfbuabO9MzSgXzjg+HozEstX3QMUZ6GgS1Iryu+7T2C2jlB0LES77zDloL5uXk8ZxHIpDfeaqAGNZF2ZhtCusoonKXLYH2yZjMM6bXG+d+1e5QjtttbaeGJ/41dzhufRc1UzaI59ADbmQA3smVnd0EjR9WFCnkP+itd3RBr5m+NCCci6H38OkrvNHHy8SrgChZtxDvtuzh9+QgsHVGi0AQngDxsDX3hhRtS4SHCTYB0LCWi/9folRftXi2vpxkeBurIDekRGvccOTOuwYqHyUaGKEZB2xts9ibvkfSKTCpB8avxFLxyntO9ZA/tYJhKNUgvZAeMKvdOr6ycuP4S9+iQIAhI58m/bJLRt+qHRGYl2SgahUCPqndXoEhVMuOTGzAzfktPQeqsLGKl8jP49SAz1FtVXpp8J5LJzyV7hPXZKByid4PRxZHXlX6NwcM1nyfwvAhSQCv3M/znK5UtVC39Og7aNaHxue23ubRBOwzU0Iio0QMe51HeLkA8P6Hcnen3EgMF8S4UYGhWUis9LMHPQBMMjVYNP/JKo3BrVF5pwQrVJvKJYWTwe3Nox/4J6eng1PZmEjZHZltRbxJbSwPIHcVad214RPB2FwqCp7stRiG0JXEmaGh0NkovUkR6J4n/gBeSX9/Vby0qFQJ6yendH8WMKOcT/n+n7u+MbuTgKvQAqfurLS5zMGwwuwM6ltAM98kZcwN0kRw2ONIN7mqC7kHqnOC25GFTETHMYN8LhbSOg6hG+ZEzMkDcifBrRF/zYth9t1VAGiaAL2nmjg14QHxd9Pdx+7YlWrfrKnzauJdF9yku58JTmK4XAOJREKgP2hJdzrgT3yePHBpmF4ZO0PALqyG9juoGobAgetfBRE37Axr40t0v5l4fVNt1vNL/cnnkeRaDhW1lRMkfD2stbtWknVT0Cg+aO9pKUy9VbEaW8/fq0lM4WLccSEin2ZCfYkr8FPJmgSCOGiGC2Qhwrfh9BJ+QCqfEyLNL5haPeJ5N1Cr2YSaGYslUGc4Nq8LhWRD0MepniiIUFH6koXuRu8toE/VRwBnPQ5vatvJVwTomJ1Cg3rEQe/n82rRWfWb8ZbA/9b78d79qj88Rcz5swhw/soSEfnra2QUA81+cPcNyUQ01ql9VLCAWarr5cWp+W8jwB2QGtSFFN9dUEUqQMEQzGfIxcBCbb1GnZxP6WBDpR7YD0qnsWz6Vsdw8aYLXOqrH5ZpGPbgtJ9i1xVce8oiXe5LhwK1THB2TWajTQ501Tu0qREJog4SyyK9c9lXjZhELYLIi3jrRAgepcwm5gCWxKB61OE6n3SDEjW+PFbmOQ96U8zFM2Tdby/pvvWmuhq5uimCKLLbJgDxOUCNjkcDJrDQThEBxItKK1aug5KSMnaaHFvR5uqeW6oC0EeZ4iehO8ESkfj3cClUuBEGocmAVt8Ho7aI30TYHq1Cr9Cw8z9IGn7GNInSYEatuX83JBskV4+RBA6Yi2LbpA7AvTE+FjyyGQBWBj/XzR3sRGiCHHKsyHfAbqg+rODmoiBJv2/Oc8KgVFbdqsTBnDAV7XtfxBGZdEC2EuJoKsxKoM+33i9ct/Qk5dgVEFB8FR4UITfIDgjUffN5nZpRFc= X-OriginatorOrg: iopsys.eu X-MS-Exchange-CrossTenant-Network-Message-Id: 809bd1d0-b0d9-4595-9fd2-08dd13ef0d97 X-MS-Exchange-CrossTenant-AuthSource: GV2PR08MB8121.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Dec 2024 23:06:00.4352 (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: +S0SvGv9BNZBiUTBJ97MizgHJr0lNYl/GpE8j03cj5A4INKebRjldevfWhjPwe8h7LInbGzJ4iRHR7D6Los6VFK7Pwt/mNH+y4zwDLqIPTU= X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM9PR08MB6066 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 | 8 ++++++++ cmd/mtd.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+) diff --git a/cmd/Kconfig b/cmd/Kconfig index 1d7ddb4ed36..6909ed476ba 100644 --- a/cmd/Kconfig +++ b/cmd/Kconfig @@ -1460,6 +1460,14 @@ 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. + + This is a clone of "nand markbad" command, but for 'mtd' subsystem. + config CMD_MUX bool "mux" depends on MULTIPLEXER diff --git a/cmd/mtd.c b/cmd/mtd.c index f178d7bea61..bf08f483c14 100644 --- a/cmd/mtd.c +++ b/cmd/mtd.c @@ -700,6 +700,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[]) { @@ -782,6 +833,9 @@ U_BOOT_LONGHELP(mtd, "mtd otpwrite \n" "mtd otplock \n" "mtd otpinfo [u|f]\n" +#endif +#if CONFIG_IS_ENABLED(CMD_MTD_MARKBAD) + "mtd markbad [ ...]\n" #endif "\n" "With:\n" @@ -816,5 +870,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), +#if CONFIG_IS_ENABLED(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 Tue Dec 3 23:05: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: 2017963 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=xkbylwFT; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=85.214.62.61; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=patchwork.ozlabs.org) Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1)) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4Y2x9B3qzMz1yCt for ; Wed, 4 Dec 2024 10:06:22 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id B4FC28968B; Wed, 4 Dec 2024 00:06:06 +0100 (CET) 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="xkbylwFT"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id C1FEF89689; Wed, 4 Dec 2024 00:06:05 +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=-2.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, RCVD_IN_DNSWL_BLOCKED,SPF_HELO_PASS,SPF_PASS autolearn=ham autolearn_force=no version=3.4.2 Received: from EUR05-AM6-obe.outbound.protection.outlook.com (mail-am6eur05on20724.outbound.protection.outlook.com [IPv6:2a01:111:f403:2612::724]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 7446F89667 for ; Wed, 4 Dec 2024 00:06:03 +0100 (CET) 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=arcselector10001; d=microsoft.com; cv=none; b=y122Rq5jY1Fc5yVgEKwHcTHjXGdY7en0xZYW8EYXLSP8/4t7vmkbXwiXQvl0iNhBGqFbgaizwxrpk0HTDuGWBOBcXNYYVok6ARSzYpNkQI1GV5AKRRVgZ3Vk/vtXbz/q41tgvPUyExQF+n8WpDc0Exk3iC9QLtrfup5YLeGLHgbo2yNlUGlnEROUkUOAvBcfHsdSd7EzEnGyIVoQBTYsoVDLYZzFqFOaEluiP5qqGTGAYW3IXF2/rxiEsVeB0aoQaFj+rM8jkdqZueRmAnwimL6Xt+1L4e3A5aTgZFWjq6J9MLqAQZJReIsSlcdTHvs7ShDUM3vIY2w24rHkQlEm0w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; 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=YG1NhDbWnbvMYuNIfL8zNJCrI8MG+IXwC78XuZ+cWS4=; b=JKezMSfAy08lxl7T8/IWyhpDiKyiOU6UkaitlGtWR6I/Zg9R7QDqnURXcLfpjl39i5o+PFqyGD0JNgANlD34/cGC61IWy8XOK1l0avKGOal2XL7lBgbLZqaBi9AiJNkzrpVhlGVMU1w0w3ipjT59gjMColePT+1RAoQiLv17xqnUuhFF/Nsb0RPTdMl+vdchyXvuaDWQaAMcGsB4vIsyol+1SnnOHK69oZ2dZ9vH8GpbT5Q2HLo3W/1H6X30Pj23QswdKulKjVl0wl9EQyPt1XX2N1OzFLquSnL+bxnk/1xe5TvG41fUtlUNr2x1J1YO+QPmg/xulbz2LjQegx6/xg== 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=YG1NhDbWnbvMYuNIfL8zNJCrI8MG+IXwC78XuZ+cWS4=; b=xkbylwFT9OXc4wAjYBaEn0JadAw0KMUyMk4y9pfBdqEl3zOihUqFp91V3iONj7LG59B3ZWfByssi3x686FREvQkR/SUM0t/I4+fPATVujxxBnh8a9XuGsRAzYaeLnACkY/DpoPlNHhhtRyOgku0Rm5sZyOYUZu8mLVcMcnT2WcptVi8q9rj6FHBOOrGePRHtiGcC604l+YuRxYccJARj1VkUlwum3e76TZIaaG06W0me9jNlyJC0UUn+ceDzuentRAb3643jvI5JB/usZga+txvmIN5EuQV17ggp4AbF6AGwzgWn0hF4GVNM4yfQfoOmmRi2czzqi/iyCcIgvayT0w== 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 AM9PR08MB6066.eurprd08.prod.outlook.com (2603:10a6:20b:2d8::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8207.19; Tue, 3 Dec 2024 23:06: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%3]) with mapi id 15.20.8207.017; Tue, 3 Dec 2024 23:06:02 +0000 From: Mikhail Kshevetskiy To: Tom Rini , Simon Glass , Ilias Apalodimas , Heinrich Schuchardt , Jerome Forissier , Mattijs Korpershoek , AKASHI Takahiro , Dmitry Rokosov , Dario Binacchi , Miquel Raynal , Arseniy Krasnov , Christian Marangi , u-boot@lists.denx.de Cc: Mikhail Kshevetskiy Subject: [RESEND v4 2/3] cmd: mtd: add nand_write_test command support Date: Wed, 4 Dec 2024 02:05:50 +0300 Message-ID: <20241203230551.2677602-3-mikhail.kshevetskiy@iopsys.eu> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20241203230551.2677602-1-mikhail.kshevetskiy@iopsys.eu> References: <20241203230551.2677602-1-mikhail.kshevetskiy@iopsys.eu> X-ClientProxiedBy: GVX0EPF00014AEF.SWEP280.PROD.OUTLOOK.COM (2603:10a6:158:401::31d) To GV2PR08MB8121.eurprd08.prod.outlook.com (2603:10a6:150:7d::22) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: GV2PR08MB8121:EE_|AM9PR08MB6066:EE_ X-MS-Office365-Filtering-Correlation-Id: 7b34ad9c-71bb-472e-94c0-08dd13ef0e51 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|366016|1800799024|52116014|7416014|376014|921020|38350700014; X-Microsoft-Antispam-Message-Info: f7HfqbxsxiamZXkGvMFbv1iuqg46VmZdfR3Ibaiw4C9HGvbxfBVGVs1AY1WFWsDb4aopGdH5J4OxpfMn32Z52uorxNBTLQM2rg2JBz2vp8TFwPEBKJlNIurFxekh69JSWOeLVhkBII14kKRzckV9wCYoPNU+5KiUhfk25fYFKesjGBNOI0vcuNw1AQNGgWex4KTWTu74lEnGL2EowM5bvIFwrB0TEl9t72BZVr2b8RhIEM0owDH9IE1HBhmepGYRSlVJsCLJwja3goxTMPQkGCRwXXZQGchf4nqILG3K00MHua2tZB2LBpkWMES91gl+Q3HIRMomAXxYN9tJNWo9tMtVfyLVyhjbv6gxQql2WJRRMb2BWsT/h4Sq5cmYpXMZezSH3906fAVWVdN4DBatnFPGUXDIQ06zmydQaatdYiXul6bTq90PSCyboLGsAMeM0JxgA4Ly4utkB2+jxTniICyX8l68FJlSQvtDJH0hajUjuSTJpXMiS8e1muzw3WK3+GMendkdWo4eylmECC8g/U08mC+0M+g8YPWflsF9yF1ZYF2UR8D+BraAyNv1qnuzFuiIAh6/rReMXAsjUX5JSv/vcbEv8/zhxYYaJimvMDFI1aCh/8zHOX7nv4iDJAHakiT/TPxypLXI9KbJpI8ZWKCJ0uSlROXw00R6vZ/MF4C8DSXbTwia4SSffG1TtvPeoIsWy/qpkZFaylZ/uzCjaKYhdD51zKRe+GzDJnina+gvybjpLBPzd4SVguoDHOHHpRVb+wnyvPOSHYojUg8iBZBs4UF6BPS3x7Jwadc2GFqj7YEARSYb5TraHo+iL50kaDe1mV5S2ln5pVIJJWBkK0rlHVWVGs8H/Nj+KHR4ZRPYHs/S1HlmwHvigJU1boghnJn18mzzwQosE46Qn7lg1wgP4UBtzBYj82PPz1O7QW62upc3C3lD1C0PbbG/wHuoA14yKX9nEhWsG8ysBV2zNfUyV1OWgjmjsVWfWLKgvBWkwUyqz/XvqT2X5LqwD9kxVedxmNdkFZ17EsfWiXjI/YRK9mjrqlNy6DEhcqyW2GD14SRr49RpvHIiGwZAUZz2Y4nzQ9YH87aM3KY+ZCuLp/w9rGfkr2jiqOfnIEfu/Xko1P9ZMwB24T8Q+dru/NQ6+p53SuV5uh3MZazK+uB27+eY8QCI80aQ0oVc5bP5SEJg3UKvgylv4bYJts36hGQF4c2aMiXi6mfAWxTwSnEcEBQBVZ5vQyCplnJXqlEOKaD9+359F+rHYw66xvh2XlOQHX+ay7QRNe+XjheP2MC7oZO4yQ3na37UivZrVWXZfxnGLp9JY/uLFdRtkQRdkdcgg1c8Icg+VE+0d+cHT+nBXtGA7QFLBHqJ4wseSRgM2OgiBZhIEzdrcPzcomcWZ8KL64S4T2XHa4NqpQBf4ci0aL9KrqCfY9fb5UCTbBmA0Us= 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)(1800799024)(52116014)(7416014)(376014)(921020)(38350700014); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: sRJfRJxzbAo1OzVJ4iBQrzNC/a9lgMifkFv9gFNilHZ73St9disrKATbdSbPMax90W5XYBn5WB41Pah/u3FCo3W0w4Ch87ZGaUd+De2vB65Y0U9JUuW2hyunYNYUfiC+ns8uynnaPldpTqJcP5/1VAmK1GASVuSV4m9zuzx7ZuNdBQttw72gJxd+iWPU4ctpQ14ayaWMZkQo8Jj9+0nUu+5abxQPY+qnT0/XGrFtXMZpkyXvY/TtzeCov79imWnhMAHWpIr67s114sES4Cj8Sc5ewmE2fpKMWikI4rMZLfelfcyJjMis7ZeSFlFtF1n3KRtUjXYBNckCInWQb06WhfZQ0n9UJCPQYCah3HZUnnJhZRWybNZIknA61eeAFuj2q+N/EkKdAIMCjX8wvKKjKP1lq3z60+vHJIV0B7M4jNnpWrxUoM3R8BczwiN+tQ0fpT0XsdWAxVpFHbSxt1CDkgEyYrlliG2/FC2uMA6AtPJERTrJ/u8tEap68CCaYlkMaGKiObN0BSl3HHwGoeQjZ/SljVsV5YR7cc4WZ5NdYVmkafeALs416R6lqVsXK7CXl0IONQSAprpH6tZCTNZilDoewLiSLCuBOm7gjLC+Ll062utJ0AGYeRvi3f+LKJNRMjpxymch4Pa9MjD8ItD5wqb3tz3byqQso4B7juW9t1L5sLno2OLI+YMDUrlCV/lgSdf5GdOOZ6XHZvbGFstj6rbYQK/eUUzIvYy29Go+Q9lS0Tu4pIoUGQHhhF+5fIbj2yOdnlscqQIHfMb9dNzWqBZqt4z8SvNt0crpG5al2UVHc/LljmWXGwuHJmekjn/RKeiE2LSgbvCJ1m6VOitZJV/6eGZSJdYB6PGIxDXQBBzwqI+VYDn1/w0Rb4ItDFPgMJ2JYabE9YSutfZ/yHzqsR9J5GOpYXdfVSyk04lN4qNkpj/br3Dvs2EJykZjhVikUos3go5cVje2Pu20NwiBu8Rh1NMFU+1b98m2vC4HhLLPp41G5WTRBu9RnNvvVOGPchiPGVoiKmbXJhQkuYk+uZgpURYtEggx+3vf+uo6FKPX/97++AZp7U3Rl6V0as0OhkF3Xp8YnlAj4gGlWcQHPFvl+AjeJseWeRnEhaSTD4Mzl0J9CxVBPCthVRw4D6X4nbUAAjKswpbJ5WIvZhPuaCDebOkjWwfbMVoW0L07aFkgz1oxC3qIPH+RfnI2WnAU1AHY81XSu9bbCA0OaEDem5yIxhPgd08jLHEz2tG9zHLbICb4CCwr3pz7rjQ5D0VfpMs00qM3G2pCa8Wtvje3Nvz+yNpcgrbpxjKMdRW/BiX4cNfPgIYopFFoIVXPW4guyrAEE+aH7zDhAgwV6uNgQdqYJSTZu5atyomXI107P4zTNjtcOaloJk55Z2SjtldEl9hF7aL7obY/kYerenMc5pf27WpVFqKmiaGjmhMRDJLodmAmBSiIcEMyqzGf43965B1IvIK5ibSWGpdIpQ0mNEru6E9lH/VPTA4BV6cmt74OAz6X/WlzQkQEjq+wc78xeFI2JPa4HVg3qG/I2m3T76ec38ei47B0VPpEfZ0fv9NNzvzuuPpBL38TWhMualVMX82YN2nUnD/t6d++tXPZt1axQx78hVkEFHYh96t7xvM= X-OriginatorOrg: iopsys.eu X-MS-Exchange-CrossTenant-Network-Message-Id: 7b34ad9c-71bb-472e-94c0-08dd13ef0e51 X-MS-Exchange-CrossTenant-AuthSource: GV2PR08MB8121.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Dec 2024 23:06:02.1721 (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: ZjX1h6lK2fmenj6xZxZ7dNrpDf46dOeU4NeKGVor2uDeyYSBNtCIfBAK45N//T/dug38vvAiUUr7HAK+EojB/Fh5GFddgMh6YWvbN+UDiYQ= X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM9PR08MB6066 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 | 14 ++++ cmd/mtd.c | 197 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 211 insertions(+) diff --git a/cmd/Kconfig b/cmd/Kconfig index 6909ed476ba..778b6dca055 100644 --- a/cmd/Kconfig +++ b/cmd/Kconfig @@ -1468,6 +1468,20 @@ config CMD_MTD_MARKBAD This is a clone of "nand markbad" command, but for 'mtd' subsystem. +config CMD_MTD_NAND_WRITE_TEST + bool "mtd nand_write_test (destructive)" + depends on CMD_MTD + help + MTD nand_write_test command support. + + Writes blocks of NAND flash with different patterns. + This is useful to determine if a block that caused a write error + is still good or should be marked as bad. + + This is a clone of "nand torture" command, but for 'mtd' subsystem. + + WARNING: This test will destroy any data on blocks being tested. + config CMD_MUX bool "mux" depends on MULTIPLEXER diff --git a/cmd/mtd.c b/cmd/mtd.c index bf08f483c14..bcff020bfd3 100644 --- a/cmd/mtd.c +++ b/cmd/mtd.c @@ -19,6 +19,7 @@ #include #include #include +#include #include @@ -751,6 +752,194 @@ out_put_mtd: } #endif +#ifdef CONFIG_CMD_MTD_NAND_WRITE_TEST +/** + * 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_write_test: + * + * Writes a block of NAND flash with different patterns. + * 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_write_test(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_nand_write_test(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 write test: 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_write_test(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[]) { @@ -836,6 +1025,9 @@ U_BOOT_LONGHELP(mtd, #endif #if CONFIG_IS_ENABLED(CMD_MTD_MARKBAD) "mtd markbad [ ...]\n" +#endif +#if CONFIG_IS_ENABLED(CMD_MTD_NAND_WRITE_TEST) + "mtd nand_write_test [ []]\n" #endif "\n" "With:\n" @@ -873,6 +1065,11 @@ U_BOOT_CMD_WITH_SUBCMDS(mtd, "MTD utils", mtd_help_text, #if CONFIG_IS_ENABLED(CMD_MTD_MARKBAD) U_BOOT_SUBCMD_MKENT_COMPLETE(markbad, 20, 0, do_mtd_markbad, mtd_name_complete), +#endif +#if CONFIG_IS_ENABLED(CMD_MTD_NAND_WRITE_TEST) + U_BOOT_SUBCMD_MKENT_COMPLETE(nand_write_test, 4, 0, + do_nand_write_test, + mtd_name_complete), #endif U_BOOT_SUBCMD_MKENT_COMPLETE(bad, 2, 1, do_mtd_bad, mtd_name_complete)); From patchwork Tue Dec 3 23:05: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: 2017964 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=Rkvu+xnb; 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 4Y2x9L3mnDz1yCt for ; Wed, 4 Dec 2024 10:06:30 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 217BE89696; Wed, 4 Dec 2024 00:06:07 +0100 (CET) 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="Rkvu+xnb"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id B95C089689; Wed, 4 Dec 2024 00:06:06 +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=-2.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, RCVD_IN_DNSWL_BLOCKED,SPF_HELO_PASS,SPF_PASS autolearn=ham autolearn_force=no version=3.4.2 Received: from EUR05-AM6-obe.outbound.protection.outlook.com (mail-am6eur05on20728.outbound.protection.outlook.com [IPv6:2a01:111:f403:2612::728]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 94F3D8931C for ; Wed, 4 Dec 2024 00:06:04 +0100 (CET) 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=arcselector10001; d=microsoft.com; cv=none; b=Lko6owg9slt279nLl4mMvbigkAl9K4s3c+uy4RMm7OOc8Q2Sydd0mnbYOQUW2mY94iVt/IOX36uc6JvhG610svLIsc2K2PJ+49bBmM5Do6pDimxUuq9CCUwZ9wKZFREdnQ4j80pQUBZRxGdWYOMw7xOOak8Wn3synKL79EfJtl7GeRmLl8o035DXUQJrnmGFGpVQnmljg/J3WaagoUxfwq+VPQdyw1Vy+fPsb1+GPuUb/8MBWw3pl7tWp5Pkoi4RqY8SX0KS6Pr7h2Jg1KrZTJJ3cH+pQdXdthUKgjjVptWIy4i1ggGirSRqLW0kq8gAFbPmDmfwWUzHKbVEvqrKlw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; 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=0LZEUbGM1RT6wzMASDIKeCdWBcltU46/hMqIVkx95/s=; b=f5Cl5TDJGVyoiBzDc6qX3NZo7/qnJM0E+0ySYeS9IgswQLACfmq1e2U7jYEPewX89A2cxgtXNS+73RQ+QPt1FvgUXcbRLHf2FcQ9Atj8GB5H4jAUIKjZ9N2iarwqVFuVpII4VgZ7/epIR5JrprHwNsqvrnA0PlcvMRwaaFKtGow4iswKC7FQ3HGzn5JdwX8jg9E39ogqUtibjYrNKo+s8ySb8Tc1Rt0MW1bvEAQdJD9iQd12Geq+ZSAvvTANsjlD5/NISw4oGswvnXlImt6S9yYEiEeLg9whj8urd2pFMCIFyTaEAWSc48IE+ppCoxS2Oo/nwBTBQQ+8aeL2XO+uog== 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=0LZEUbGM1RT6wzMASDIKeCdWBcltU46/hMqIVkx95/s=; b=Rkvu+xnbARRIPVEEMqOAzcrS1Nv82P5RwUjcSzPpCKTxX2qe7ilcxD7/PY8n7phUrEKVJtP4cnI8VP2q91JIiGW8kb22DEwfMdKRtkSAyBHYZw0sz6xtYO0Tv5eGJhWxg5VJCVPccpP7Vw/nMSuZKXiu932bh9QJOJuxiIGY+dGN3NWiR0lAlyIWdOuuQqFNqCDbVgGVOD9cpJSpoWTg1/6ZxbxnWfdd3tea1CSRoJmMH/nAMmGGi98VoQSjNVE3ySQeaz1ML1Yfry3XAvpy+elgDphw8odMYW1EW7+twvI/bD3AlELSGAv+3tlNwxkO3Gcd9jdBZwzT8kIfw94VTQ== 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 AM9PR08MB6066.eurprd08.prod.outlook.com (2603:10a6:20b:2d8::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8207.19; Tue, 3 Dec 2024 23:06:03 +0000 Received: from GV2PR08MB8121.eurprd08.prod.outlook.com ([fe80::4cd3:da80:2532:daa0]) by GV2PR08MB8121.eurprd08.prod.outlook.com ([fe80::4cd3:da80:2532:daa0%3]) with mapi id 15.20.8207.017; Tue, 3 Dec 2024 23:06:03 +0000 From: Mikhail Kshevetskiy To: Tom Rini , Simon Glass , Ilias Apalodimas , Heinrich Schuchardt , Jerome Forissier , Mattijs Korpershoek , AKASHI Takahiro , Dmitry Rokosov , Dario Binacchi , Miquel Raynal , Arseniy Krasnov , Christian Marangi , u-boot@lists.denx.de Cc: Mikhail Kshevetskiy Subject: [RESEND v4 3/3] cmd: mtd: add nand_read_test command support Date: Wed, 4 Dec 2024 02:05:51 +0300 Message-ID: <20241203230551.2677602-4-mikhail.kshevetskiy@iopsys.eu> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20241203230551.2677602-1-mikhail.kshevetskiy@iopsys.eu> References: <20241203230551.2677602-1-mikhail.kshevetskiy@iopsys.eu> X-ClientProxiedBy: GVX0EPF00014AEF.SWEP280.PROD.OUTLOOK.COM (2603:10a6:158:401::31d) To GV2PR08MB8121.eurprd08.prod.outlook.com (2603:10a6:150:7d::22) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: GV2PR08MB8121:EE_|AM9PR08MB6066:EE_ X-MS-Office365-Filtering-Correlation-Id: 628f4e55-89d8-4b04-aca3-08dd13ef0f57 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|366016|1800799024|52116014|7416014|376014|921020|38350700014; X-Microsoft-Antispam-Message-Info: kjm/aqrXOU6e+s0N0GdtNt245GZwKwHh7tKjOYYVCVdyLCrx6PiODC4L5XDth6GJOqR2ACGZZ2XHehWC1pdN91gOyRnD/ACLkSLvLfy2vClqNJRuOSl6wG/wGR/ftkHY+/5oWVTcbsW+fSh5diVcPg1reZmjrbPoo+YAFMcLZbXhp4C+rrZ3WmLOB3Izt720enKdL0gMFV6pm8IjmOUxsUvMwk0ccNNW4EtWHJqtshfYlVpKwP1g6HVIHA8XPs4v6iITszCxT2IXyzIcP0RB+9PQKvzf1an5dHDZdFa9y5LBA1qCDF5DGtwhO2jbHzsUVMXhBWtC4xZ/Do8au3vxowqNR8IiqmOfMfWhcaUtHul0i1YK0k5S+qJFGKQDkyxdZfDW4jb4L9d4jUWg2T3ipm1FsiE2MrB7aMfLTFOFvHbrfI5UEUfg4vhJs5S881eI5kYL3duw7CwbwzB/B+eAZJYvAb+Z1Zz8IU/L7+x/j6Xyd5n3miqOTrRjFN9tLIrHOePPXyaEMEjMqOdfEJ4y/peT0AUI83PYNLpsjyYjTdB5FW80wNceiEfdUvmTm+sMVWG4KJSOO4SD54pdCw8iSjZ2nj9mrKM8kNBMBcdp8hvq5kMI8GNkqBvooc/xph950UfGf3RgfPuTRgfSpQQkso8LQZZq+uyLPVwfWFbMU+6nLmXeRoCPMkgKAB9NHYcxMkXOEHFnpnRarY1cbRWhOo3knhqiq6VDSgVVlTm91TvyGtU5qCo2IfGdfZjrk6tIzze/GmYa7t0wT11rp0fHv6T6n08afO7frgFXxuDAMVOl1qr1+fW0caeCV2qrNzeI/YdS8K4yDFyhaWCfWCjx0IDLaoPuDqHSG1v5hHybL2iPmNK/OmVzMikvl9EB4HnKnrM3bLDZ2oxNB9/kELUy8h5Gi3vRHMGDirRfdjWWl60eVwY2IA33fBLQQF5/dT1CTlgcb1B1janu/PmsItPAvbJnrox062cn4U5KNpKxiwoUnWtvSIGMtBRtHQ2tDcoItquc095ZIM2QiZbQ5z6PDHqar/c5d3PmBrNQH/05P/9MgAP4ud8jrASBK24teEY7Di4U+I5xMNF9C3mlFE+8Wcm8M/q3XdkQru2NSEq/FlhAHoxviQ18Y82ziClbKASZlxGBKccF0iQq8N8L7Z/b5vzC7y+q4wivH2QxK+qTk6LxNEVuifQWzO+3Hx5L9C7T8jQcGXCThM3jzjmvmiOaVma6sQMe/Chroge72d9xWmXiB/P1WwHmd4F7/ufVrkFoplQX1XBZ+IsguIGH8baxmI3HUL0g6GCDiluzRY7mNI0SgRqy9ikbOuXrwQzf3EScvneDJF9W4LEWVNoQqP3ScncWXfucJLMViS8SObmE2FI8dKHVl5nDThYLSA5LvYV6Mzy2YiwXWkT450YIXKfC7+Y/z1n5n3+PYWW0Y26bDHI= 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)(1800799024)(52116014)(7416014)(376014)(921020)(38350700014); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: T3O/7q1SJFPgQxCjRBji4c0m054VC7WdsR8QUBCh3lFKmaeGK85cl4/a55veEvJ0kLabhIgpoiLpA11VZgNpkweuzoCFDlBVgoRFmPgPaq8tZKvhYohcaHdtRtXwyOcbA2SFnVxNW+W5F8XhTH/Rz/92UL/bid91UyROpf7Ac0FeVdcfmW9ZlkdVr004s37teYDfR7YiQvyiw6rM88/5xZsiVK24CITpZZH67NBJChBmSSNK6ExVqLgBYPgxYiPgvmQCtUy8lBlHdGgjmlLgxQcxJ8evfAcicKPHZYqpT8Ha3zSMuth4dPoiJD6AfVhN8+Ckz53Z/Nk6m/iVEG2UHz0mMK4nVbYybHD0W9RTxAUBneMr23ptdQ/8TcAWKfhXwGB44iCDRd7dcjF0QftQSx9tF7rzAYJNfVfcZQqkB0Yl6DnViTw7fRupqn0v8ACr0SKu2y8pZpHuXVxpLqEsZGhPZW+xpRWF57J6fBG8+d0/tw9od2ukMpZJhXNt4rVuaDs3030fQ+khHfqtNYDYdRxlUr1NSW8jw0gDjfJYlk3VWWiYBl1OExCHO4ARVgHIP/2upZ22DXULrTbLrG9nv09WJKQY1j656iiy/D3itg8El6FDHNXP1ysziU5RoWYSQOhu+10fHlJkTmcfSO8OyCL1U/iTIqfPHmdFEAVo9pGq5ONj0l53ba7hgoiyZH3e6KKBLOnDOBvTQazDYc1q9YSinTuaJb/TfyEs8mp2Neny/FIX6iRRcm60aTe/FZ2SxXaO0ja/n4Xfeq5rimAd3e0XRN7Smooc/XHX22WhxDSKohxWSFSpbFHNpwRzql7AXyUufbMXlXSNi67b6GQr09XES4RAa/enpchXWM/czzOHpQiclatZbE8zDahHXAwGUsqjNdrliKntgkU2sV/xzyq+UI+TgyxC70AIK0t1uQJrA6VlxdzGee7WBJL6zFfmjyBpvt6sNGFZSdIgX2DFsbzazY/LvMV0AqAF3LUOjOGihze0p7lsOluMm6FEyyY9OIT/lZa6GMQEVUTq/Db95FminxvGgt18sJ9ZcZu5T+2zuNPsLSgHs635GU3LPHZxq6SHQ0d5xoCHc3Mz2iCAVV8fo94o8iYumhi1BOqgjELMNVgfd+SaLjALvOOHvn0VDvriGSlMUFF/5Z07KrWjd7aYQhAQF+ux2OdobJ0If8ZnGe7U9Vt8OrWtF+HO03V3WULhfpRC9WNmnH9XOEVnE6aqtXsndRt+wDfp02E6BQMvqghIEy1Sv6Ekew+2BhvOxXl9GgYf3bufc1AA3pMU4kPVJhS0Sytq7eqC975QGUtTNZpzM0Sl34a3W2b1RLwF5sTnZPkO0TwdypXwmYcPbRZF59dFXwP9ong6NUPVwgegL2chmE+EjCk5VGwXp4Ww1uK3B1nXoD8C8sJ04ZKmAJYpYiGL9pqfiMSnPc7F7Ig2YaObipt9ihmjZT9xJHQ8Rvbw7G5W5WPsyBeonGFo7giHlX64q0jVU3aoynGVl1hCLZxOZZxccDpi1bMDe31GiIaaug6AGI1nHIkJb43kYyNlnVNn6mZXGQBPDANKsHYdOlzOb6MPz8T9ZPr1oaXmzdYXZJXb7FwKDQRZqiYgpWXIkQ9G3BzbpKkVaqDsqis= X-OriginatorOrg: iopsys.eu X-MS-Exchange-CrossTenant-Network-Message-Id: 628f4e55-89d8-4b04-aca3-08dd13ef0f57 X-MS-Exchange-CrossTenant-AuthSource: GV2PR08MB8121.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Dec 2024 23:06:03.3755 (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: rZwv61x3QXQcCViTVNY+yiZo+EqlgQ9YCf0ePtiakLV/BOdkifki1GnTBxqrfKTQzIMHg6ynyBSZgO5udIiwdfMijNk627IwiLvaLNclcVE= X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM9PR08MB6066 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 read-only test of nand flash devices. Test reads blocks of NAND flash in normal and raw modes and compares results. The following statuses can be returned for a block: * non-ecc reading failed, * ecc reading failed, * block is bad, * bitflips is above maximum, * actual number of biflips above reported one, * bitflips reached it maximum value, * block is ok. Signed-off-by: Mikhail Kshevetskiy --- cmd/Kconfig | 16 +++++ cmd/mtd.c | 197 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 213 insertions(+) diff --git a/cmd/Kconfig b/cmd/Kconfig index 778b6dca055..3c40be58d3e 100644 --- a/cmd/Kconfig +++ b/cmd/Kconfig @@ -1482,6 +1482,22 @@ config CMD_MTD_NAND_WRITE_TEST WARNING: This test will destroy any data on blocks being tested. +config CMD_MTD_NAND_READ_TEST + bool "mtd nand_read_test" + depends on CMD_MTD + help + MTD nand_read_test command support. + + Reads blocks of NAND flash in normal and raw modes and compares results. + The following statuses can be returned for a block: + * non-ecc reading failed, + * ecc reading failed, + * block is bad, + * bitflips is above maximum, + * actual number of biflips above reported one, + * bitflips reached it maximum value, + * block is ok. + config CMD_MUX bool "mux" depends on MULTIPLEXER diff --git a/cmd/mtd.c b/cmd/mtd.c index bcff020bfd3..857da088843 100644 --- a/cmd/mtd.c +++ b/cmd/mtd.c @@ -940,6 +940,195 @@ out_put_mtd: } #endif +#ifdef CONFIG_CMD_MTD_NAND_READ_TEST +enum nand_read_status { + NAND_READ_STATUS_UNKNOWN = 0, + NAND_READ_STATUS_NONECC_READ_FAIL, + NAND_READ_STATUS_ECC_READ_FAIL, + NAND_READ_STATUS_BAD_BLOCK, + NAND_READ_STATUS_BITFLIP_ABOVE_MAX, + NAND_READ_STATUS_BITFLIP_MISMATCH, + NAND_READ_STATUS_BITFLIP_MAX, + NAND_READ_STATUS_OK, +}; + +static enum nand_read_status nand_read_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 0x%llx: bad block size\n", off); + return NAND_READ_STATUS_UNKNOWN; + } + + buf = malloc_cache_aligned(2 * blocksize); + if (buf == NULL) { + printf("\r block at 0x%llx: can't allocate memory\n", off); + return NAND_READ_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 0x%llx: non-ecc reading error %d\n", + off, ret); + return NAND_READ_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 0x%llx: bad block\n", off); + return NAND_READ_STATUS_BAD_BLOCK; + } + + if (ret < 0) { + free(buf); + printf("\r block at 0x%llx: ecc reading error %d\n", off, ret); + return NAND_READ_STATUS_ECC_READ_FAIL; + } + + if (mtd->ecc_strength == 0) { + free(buf); + return NAND_READ_STATUS_OK; + } + + if (ret > mtd->ecc_strength) { + free(buf); + printf("\r block at 0x%llx: returned bit-flips value %d " + "is above maximum value %d\n", + off, ret, mtd->ecc_strength); + return NAND_READ_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 0x%llx: bitflip mismatch, " + "read %d but actual %d\n", off, ret, max); + return NAND_READ_STATUS_BITFLIP_MISMATCH; + } + + if (ret == mtd->ecc_strength) { + printf("\r block at 0x%llx: max bitflip reached, " + "block is unreliable\n", off); + return NAND_READ_STATUS_BITFLIP_MAX; + } + + return NAND_READ_STATUS_OK; +} + +static int do_mtd_nand_read_test(struct cmd_tbl *cmdtp, int flag, int argc, + char *const argv[]) +{ + struct mtd_info *mtd; + u64 off, blocks; + int stat[NAND_READ_STATUS_OK + 1]; + enum nand_read_status ret; + + 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; + } + + blocks = mtd->size; + do_div(blocks, 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: %lld\n", blocks); + + printf("\nworking...\n"); + memset(stat, 0, sizeof(stat)); + for (off = 0; off < mtd->size; off += mtd->erasesize) { + ret = nand_read_block_check(mtd, off, mtd->erasesize); + stat[ret]++; + + switch (ret) { + case NAND_READ_STATUS_BAD_BLOCK: + case NAND_READ_STATUS_BITFLIP_MAX: + if (!mtd_block_isbad(mtd, off)) + printf("\r block at 0x%llx: should be marked " + "as BAD\n", off); + break; + + case NAND_READ_STATUS_OK: + if (mtd_block_isbad(mtd, off)) + printf("\r block at 0x%llx: marked as BAD, but " + "probably is GOOD\n", off); + break; + + default: + break; + } + } + +out_put_mtd: + put_mtd_device(mtd); + printf("\n"); + printf("results:\n"); + printf(" Good blocks: %d\n", stat[NAND_READ_STATUS_OK]); + printf(" Physically bad blocks: %d\n", stat[NAND_READ_STATUS_BAD_BLOCK]); + printf(" Unreliable blocks: %d\n", stat[NAND_READ_STATUS_BITFLIP_MAX]); + printf(" Non checked blocks: %d\n", stat[NAND_READ_STATUS_UNKNOWN]); + printf(" Failed to check blocks: %d\n", stat[NAND_READ_STATUS_NONECC_READ_FAIL] + + stat[NAND_READ_STATUS_ECC_READ_FAIL]); + printf(" Suspictious blocks: %d\n", stat[NAND_READ_STATUS_BITFLIP_ABOVE_MAX] + + stat[NAND_READ_STATUS_BITFLIP_MISMATCH]); + return CMD_RET_SUCCESS; +} +#endif + static int do_mtd_bad(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) { @@ -1028,6 +1217,9 @@ U_BOOT_LONGHELP(mtd, #endif #if CONFIG_IS_ENABLED(CMD_MTD_NAND_WRITE_TEST) "mtd nand_write_test [ []]\n" +#endif +#if CONFIG_IS_ENABLED(CMD_MTD_NAND_READ_TEST) + "mtd nand_read_test \n" #endif "\n" "With:\n" @@ -1070,6 +1262,11 @@ U_BOOT_CMD_WITH_SUBCMDS(mtd, "MTD utils", mtd_help_text, U_BOOT_SUBCMD_MKENT_COMPLETE(nand_write_test, 4, 0, do_nand_write_test, mtd_name_complete), +#endif +#if CONFIG_IS_ENABLED(CMD_MTD_NAND_READ_TEST) + U_BOOT_SUBCMD_MKENT_COMPLETE(nand_read_test, 2, 0, + do_mtd_nand_read_test, + mtd_name_complete), #endif U_BOOT_SUBCMD_MKENT_COMPLETE(bad, 2, 1, do_mtd_bad, mtd_name_complete));