From patchwork Mon Sep 9 22:23: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: 1982826 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=bH+2TmiH; 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 4X2hG364qRz1y1s for ; Tue, 10 Sep 2024 08:24:27 +1000 (AEST) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id BBB5688E1E; Tue, 10 Sep 2024 00:24:19 +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="bH+2TmiH"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 6ADFB88E3E; Tue, 10 Sep 2024 00:24:18 +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-AM6-obe.outbound.protection.outlook.com (mail-am6eur05on2070f.outbound.protection.outlook.com [IPv6:2a01:111:f403:2612::70f]) (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 55EA7889E9 for ; Tue, 10 Sep 2024 00:24:16 +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=arcselector10001; d=microsoft.com; cv=none; b=KtuGIJ0d2omVDvPPs8tC3zTHdc+x3/y6THSi+QNnltgjmdajC30IV88AiXOMgc/PCwK+c7yNoMtt+jn/HUv/OYKDZ7Ycp+4dJ6P+D+99P3y9aNlEptGQdLNT2ksFU9ELU6xS5AX6PbUBrDsL54UFmXGtIBN4hQv4/K/rtk960o4TD7+gVE6wX/pabIlHdLioSvNKRIjurejz/oAIRbCF5pMM6HNXX1FXOzvANoCVyq+PbzbTBBVnGrZpNCeDMOpyHfopbNUlOebypFfCOJc1iJ/Rs5QFgAkRtzW0cyWap/tRalI4NoOnT8WSk3CT9Infk+ZRIqdbuyNbEfa20f6wpA== 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=gc3PGIU49z6TqucUdkvmYhM0WGxnEKiaTwANKLpDjP4=; b=ran4OP+lJ3aoKKC26amTW+6jf6PS/9OmygMT+lyeew5USzte1lfiZ9QcFZ5AMdkBPGEDE8sX3nnOOeT1Y0JfqH3llgbVbpnGeZQQyjvppfNwJolyBXraSthbCb7w2LEhNTnm8USZWdkByK+nDmzCAwfkhY7C8j+BtcHZbfryx8kf7RaVpPDhvyYh+1mwGSbADssFTNiG2aPSykVH8i+jCVTPqovguGP30286h0OJY5zndEH6wnOQ8tjMpSOOoyI9Y12MfcjZQu7wQaptpwfErby6A2S6RXOn4J5eNKO0veb362kBc2PFnYVYCTLwotias84cvPfKGpSmDfSZ/KC80w== 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=gc3PGIU49z6TqucUdkvmYhM0WGxnEKiaTwANKLpDjP4=; b=bH+2TmiHpsdxcJOqUj6m4KwqHipZdi+yYSqHxdZO1ZxHOmc+6y9NlkHmA/HG1almj6XlCRkAeXmtpNXVWgiXwbYopS6pKZdc+e08OSP04rL0rdrtqLiHdvGJfE2rVuu/73OivMym0K6tmIbCU222O3FDUXREF537Z2a38faJQdBA2un/UVQh9ZFVpJ/PsHtjJhtYlsntOFPMK9D3ouzryhmle74fso8EOMyF9eIZYY7QjmOCqXBnYehUSLDZl/j4g1J1+IU1eCnfTp6tltdKvO9Px1i39AkOR9g2rAi/o7sy8qccBZ6iFplXRjhstZ8Zo9xMh+om+4WVRKfuaIwFMw== 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 DU0PR08MB9935.eurprd08.prod.outlook.com (2603:10a6:10:401::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7962.15; Mon, 9 Sep 2024 22:24:10 +0000 Received: from GV2PR08MB8121.eurprd08.prod.outlook.com ([fe80::4cd3:da80:2532:daa0]) by GV2PR08MB8121.eurprd08.prod.outlook.com ([fe80::4cd3:da80:2532:daa0%2]) with mapi id 15.20.7962.014; Mon, 9 Sep 2024 22:24:10 +0000 From: Mikhail Kshevetskiy To: Tom Rini , Dario Binacchi , Michael Trimarchi , Frieder Schrempf , Jagan Teki , Simon Glass , William Zhang , Mikhail Kshevetskiy , Igor Prusov , Dmitry Rokosov , Bruce Suen , Alexey Romanov , Martin Kurbanov , Chuanhong Guo , Miquel Raynal , Max Krummenacher , Francesco Dolcini , u-boot@lists.denx.de Subject: [RESEND PATCH v4 01/10] mtd: spinand: Use the spi-mem dirmap API Date: Tue, 10 Sep 2024 01:23:49 +0300 Message-ID: <20240909222401.2562898-2-mikhail.kshevetskiy@iopsys.eu> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240909222401.2562898-1-mikhail.kshevetskiy@iopsys.eu> References: <20240909222401.2562898-1-mikhail.kshevetskiy@iopsys.eu> X-ClientProxiedBy: FR3P281CA0096.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:a1::8) To GV2PR08MB8121.eurprd08.prod.outlook.com (2603:10a6:150:7d::22) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: GV2PR08MB8121:EE_|DU0PR08MB9935:EE_ X-MS-Office365-Filtering-Correlation-Id: 4785735f-2017-4538-09ab-08dcd11e207f X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|366016|52116014|7416014|376014|1800799024|921020|38350700014; X-Microsoft-Antispam-Message-Info: hs5hq+8wzdvHLyZKai8JQ5gJ1pLDRElKxW/qqn3p8AyN5qwtWNKM7tSuWZWWkPE4EVo4lABrK9ddhlTyC1RQVjNzI2u5EMgGN7n24LL3xdR7DPljF/zQBOlUFzaTRUrtaY3zjtvmBd+D0g2uFslmFLXShFcTYdog1YN1MDAM7v5Q222Ppme+WD+1g30fQUQbPJw9MGtWlQjbWoIJSn8St4itx3NkXzr+uR6aAM044qE2QauDxyM2gxTVDoXb+wwpaCpC34forPU9Ni1kco8lKoRdcrOXdiHISuHBhKQIONWZ8LnNRyEiMBKzADC0DYEFZiQse4w72rO1VKn5qFOZ1RESqjgWIBw1dhHxm5yHmZrq7UxfBagwCiLEt4ix+c3r9I4LORpj3yfdl9o4E8MfUMpCXVigxnobiOR4C/GqI1WEI78LPa9F28cDs0NfwBjzIpM5MEUb+g94SwQAJnIX82HEZ3WUcHcw1tKvxZtZzlKHUQOn1SuFbo93/C0GlRE9dsKVf77BoLHRE2oQTZ2XIQK9ry7AjCuP1qB/pHartmKzPd1FN//1dUVJ1CmYxF0qTfzLjaQmljyXdj+x2ugwi+LoMT38aXBegIN/2v3RbV8yviiN1lMDiiC6fMZ7vTxBPjt6xwEBEphH9jugugO4u2u9BqI61Ba0HFPIW6AkmhkObnKBKKXI/51466EJH0D85p/j5KuGLxgjgm+dl0xFdXglVxTbTxQD57ODXLHmVBUtCGBlInx/kztx8BUSaGn0BHly1spLcfemTBT9PPWysmNsPV/K1qbU2rBnRWZgPoVmEAuiWnJFt1BWuiU2BPjnsF1sGnJKHzKdIVTtg6Dog/c5NkCy0It0YdPMhzyf5Pru1VyxaQ6IBTqdBz0cfWBEuUAoz0goNR+ImA8ShIZY4FmhX6GG6nsJYqMiExo8aDtiA8fiWnhoowrt9eTUOO7WDAwl/+4OypdYMpRPCNjefmYhuYT8zIR2k8PvETZAAShXquo/KteCzuF20cL/O0nCpLLith/3IDfgTlHq+iwdFb1mtsk2RugEALjQbYQrYFSUqcvaOXh3WTtW/6zDIQw5oAosrrTYg2DzkvTB1kWvUVJLzFLYP7ZyGuf/MZQWRaQjSmpEdd5UYKpqjjyJTAwTQYhdNqQSVAmuRP3ipRH6UvRrzj2kaT0rA0ELFoC2jgMntwUMIwG5xVWfKx1I34QP5wdYm7xPFX/fi3dJG66egfKwzxSQhqaM5Ezw1AqpBuqATv0DTgjesXXFlDs2PT2Iy+ljEvbAs3d+Rk111yLvYGBC1RvZWAvgQ5f+DxBqelmWGoImXwUsBkbl8DXLn1uXN3opAbFPb+FIwZekqKNJBzTm02z8VVCmlFxanVqmqKMvzGVBXDKMsPwEC5bGrdCJUNZo2vAZvUH54vZsxr393KZr94YqTPh+JlcxPxf2pLQ= 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)(376014)(1800799024)(921020)(38350700014); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: KQf6IdveSqklAzRmhcAZfJX5+QHBlQIpKZnb6z/XnJYjblkUWcyFbrl/4ac5dm9je2ImeagU9NG+Bq4wZFk3LF9QYpyNkoT7znYm45LfrmfLyvlWMHoI+wS4DHLV9r9TV/f3OT77eNneKwWY4h8Pr9xGC5H5FqFpjveZ66Ca2rdNH5utB92S8PyNGEbw0ytFuALl85aPFSAXivefkfkLIwHdPR2j3b2x/5FbYpUjurV9WU/ww811syH7W/ar/Cbio+MVqUlgFHH3oOvB7FesoE6PWiIBIyaovImQpRy2tGbM5dzXCtWqk2D2sVzYouPzf6Rff/62v9yZllNKxBVEBA+0xdf5TEZG+/APC++Z7EhoN3kuTC44nRTeH8eliOQLm/5CbWvm2evCvgh+0KM7mUlh8Ala9F2tBBKIkwohjDOd++X3FHF5fM9AtZ+yU4U44twVENGyEPCgtHj9SSU94R+ZyEc67U5Z2wIfXB2almYyLq59ADG2q4GbAablUDy6ChIAoiqvX36J3pKjp80UbJux7kGuq8XFF1Jghi68RPKr6N5xOvnBVOeb+nn232cOaRD+rsmNKdN5YGG4q+bcGYYtdCV2yLhTl5LvHM+1uRV6dRtNqgsiGX7M670jnYQa/wLh6pDb2/PL0OnaWF2Bs4ypLKJjEhHNIQpgNgrnX/XVFB7GNMq2VBx+eSqenUPik4ZYH3I5St72Wd5wDG2+lfFDP3dXQNTWzzdXlAWiVBaY6hox3+KpkF7XN/P13IzKZWixKtp++oPwK4VDUMjBV3a9uJ50Sh2+b+2OvgFhWejMZQtAJMLJGzcwNJ8WftWA4ULhivXlYekkhn6sCKR4pQV1cJFcGtIXY4Eb2qeoEF4DVluB2ZiofB9/2TcsyxJjYfSoh4vMV3GrQq3OnUL0brtQU4bNRwOx7r1KfoYXE8qujALSvOW2TlKSYrIl5/lmRnQeoiUiNU5AVPX0kbg117q72IAKR4DAyweWd9KfKqYNEPmRBQ/IGf5Vu9Sp88JGbGyv7p9ZFg5/qyl1zp7g7YLc92iEzXe5HVESDt2Nuw8sTMfiT/DqvHBQmna0dhxubZ7HIMRYJUdsj/h498ub+AIjyJ0zKb4bKkeg9POrw93r9Uud4oltT5Ir+AUoFaNycTMs6gRYT2jAHZCKx/1K9EBDHUuYUiyDeCNzJwsSQPulfSjWYIzDLMaDGojh8b0GFsHCdLDxVjRNVDrnq4uruOAlwWaxypW7MCmGf0+2Td2HG0+lYZkx1XxCwm3qR6R9rZ9ja+A08UVIa41PHbHM37X6shwSCyTxqfwKl9Di6Kj0N928pwm1KPQm5LijQhQbGEE+CvRPhLd4k1XOdexB58fcef+t5vc8DkQDjTcCzgYQ4m00PMtcZmTOldBUeBadWLGtJ31SxEcpb1mOqN0NNs8b0J3ZiTwYh8dsCT41ABqqADnpyCDG0IiXrTbpmocyHbEOlzrsBK/I+KbOmQeXQwwmkc7W1STxXMYCLotwDfyIIkOnr8RqZ7ddyjiRlVDVBI2u7EIpKuJ/49yHhoQJR2JoMlrZUjStZLa5RgJHMOp/cXjvnU7u7R99BJ46Hrggiwftj02eMxMD2hgKcOijTA== X-OriginatorOrg: iopsys.eu X-MS-Exchange-CrossTenant-Network-Message-Id: 4785735f-2017-4538-09ab-08dcd11e207f X-MS-Exchange-CrossTenant-AuthSource: GV2PR08MB8121.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 09 Sep 2024 22:24:10.5538 (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: pkJzx68Hjt0yws4f8itSOuJ51qj3Q7fMzJGE6C8kFAD2lzvuRnW3iBSKS9uZoXtIaDfEgJHzepiqK2M6Fl0CIOQXyRl3ru8DBZeb9Cw1qMM= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DU0PR08MB9935 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 Make use of the spi-mem direct mapping API to let advanced controllers optimize read/write operations when they support direct mapping. This is a port of linux patch 981d1aa0697ce1393e00933f154d181e965703d0 created by Boris Brezillon . Signed-off-by: Mikhail Kshevetskiy --- drivers/mtd/nand/spi/core.c | 185 +++++++++++++++++------------------- include/linux/mtd/spinand.h | 7 ++ 2 files changed, 95 insertions(+), 97 deletions(-) diff --git a/drivers/mtd/nand/spi/core.c b/drivers/mtd/nand/spi/core.c index f5ddfbf4b83..ea00cd7dcf0 100644 --- a/drivers/mtd/nand/spi/core.c +++ b/drivers/mtd/nand/spi/core.c @@ -41,21 +41,6 @@ struct spinand_plat { /* SPI NAND index visible in MTD names */ static int spi_nand_idx; -static void spinand_cache_op_adjust_colum(struct spinand_device *spinand, - const struct nand_page_io_req *req, - u16 *column) -{ - struct nand_device *nand = spinand_to_nand(spinand); - unsigned int shift; - - if (nand->memorg.planes_per_lun < 2) - return; - - /* The plane number is passed in MSB just above the column address */ - shift = fls(nand->memorg.pagesize); - *column |= req->pos.plane << shift; -} - static int spinand_read_reg_op(struct spinand_device *spinand, u8 reg, u8 *val) { struct spi_mem_op op = SPINAND_GET_FEATURE_OP(reg, @@ -249,27 +234,21 @@ static int spinand_load_page_op(struct spinand_device *spinand, static int spinand_read_from_cache_op(struct spinand_device *spinand, const struct nand_page_io_req *req) { - struct spi_mem_op op = *spinand->op_templates.read_cache; struct nand_device *nand = spinand_to_nand(spinand); struct mtd_info *mtd = nanddev_to_mtd(nand); - struct nand_page_io_req adjreq = *req; + struct spi_mem_dirmap_desc *rdesc; unsigned int nbytes = 0; void *buf = NULL; u16 column = 0; - int ret; + ssize_t ret; if (req->datalen) { - adjreq.datalen = nanddev_page_size(nand); - adjreq.dataoffs = 0; - adjreq.databuf.in = spinand->databuf; buf = spinand->databuf; - nbytes = adjreq.datalen; + nbytes = nanddev_page_size(nand); + column = 0; } if (req->ooblen) { - adjreq.ooblen = nanddev_per_page_oobsize(nand); - adjreq.ooboffs = 0; - adjreq.oobbuf.in = spinand->oobbuf; nbytes += nanddev_per_page_oobsize(nand); if (!buf) { buf = spinand->oobbuf; @@ -277,28 +256,19 @@ static int spinand_read_from_cache_op(struct spinand_device *spinand, } } - spinand_cache_op_adjust_colum(spinand, &adjreq, &column); - op.addr.val = column; + rdesc = spinand->dirmaps[req->pos.plane].rdesc; - /* - * Some controllers are limited in term of max RX data size. In this - * case, just repeat the READ_CACHE operation after updating the - * column. - */ while (nbytes) { - op.data.buf.in = buf; - op.data.nbytes = nbytes; - ret = spi_mem_adjust_op_size(spinand->slave, &op); - if (ret) + ret = spi_mem_dirmap_read(rdesc, column, nbytes, buf); + if (ret < 0) return ret; - ret = spi_mem_exec_op(spinand->slave, &op); - if (ret) - return ret; + if (!ret || ret > nbytes) + return -EIO; - buf += op.data.nbytes; - nbytes -= op.data.nbytes; - op.addr.val += op.data.nbytes; + nbytes -= ret; + column += ret; + buf += ret; } if (req->datalen) @@ -322,14 +292,12 @@ static int spinand_read_from_cache_op(struct spinand_device *spinand, static int spinand_write_to_cache_op(struct spinand_device *spinand, const struct nand_page_io_req *req) { - struct spi_mem_op op = *spinand->op_templates.write_cache; struct nand_device *nand = spinand_to_nand(spinand); struct mtd_info *mtd = nanddev_to_mtd(nand); - struct nand_page_io_req adjreq = *req; - unsigned int nbytes = 0; - void *buf = NULL; - u16 column = 0; - int ret; + struct spi_mem_dirmap_desc *wdesc; + unsigned int nbytes, column = 0; + void *buf = spinand->databuf; + ssize_t ret; /* * Looks like PROGRAM LOAD (AKA write cache) does not necessarily reset @@ -338,19 +306,12 @@ static int spinand_write_to_cache_op(struct spinand_device *spinand, * the data portion of the page, otherwise we might corrupt the BBM or * user data previously programmed in OOB area. */ - memset(spinand->databuf, 0xff, - nanddev_page_size(nand) + - nanddev_per_page_oobsize(nand)); + nbytes = nanddev_page_size(nand) + nanddev_per_page_oobsize(nand); + memset(spinand->databuf, 0xff, nbytes); - if (req->datalen) { + if (req->datalen) memcpy(spinand->databuf + req->dataoffs, req->databuf.out, req->datalen); - adjreq.dataoffs = 0; - adjreq.datalen = nanddev_page_size(nand); - adjreq.databuf.out = spinand->databuf; - nbytes = adjreq.datalen; - buf = spinand->databuf; - } if (req->ooblen) { if (req->mode == MTD_OPS_AUTO_OOB) @@ -361,52 +322,21 @@ static int spinand_write_to_cache_op(struct spinand_device *spinand, else memcpy(spinand->oobbuf + req->ooboffs, req->oobbuf.out, req->ooblen); - - adjreq.ooblen = nanddev_per_page_oobsize(nand); - adjreq.ooboffs = 0; - nbytes += nanddev_per_page_oobsize(nand); - if (!buf) { - buf = spinand->oobbuf; - column = nanddev_page_size(nand); - } } - spinand_cache_op_adjust_colum(spinand, &adjreq, &column); - - op = *spinand->op_templates.write_cache; - op.addr.val = column; + wdesc = spinand->dirmaps[req->pos.plane].wdesc; - /* - * Some controllers are limited in term of max TX data size. In this - * case, split the operation into one LOAD CACHE and one or more - * LOAD RANDOM CACHE. - */ while (nbytes) { - op.data.buf.out = buf; - op.data.nbytes = nbytes; - - ret = spi_mem_adjust_op_size(spinand->slave, &op); - if (ret) - return ret; - - ret = spi_mem_exec_op(spinand->slave, &op); - if (ret) + ret = spi_mem_dirmap_write(wdesc, column, nbytes, buf); + if (ret < 0) return ret; - buf += op.data.nbytes; - nbytes -= op.data.nbytes; - op.addr.val += op.data.nbytes; + if (!ret || ret > nbytes) + return -EIO; - /* - * We need to use the RANDOM LOAD CACHE operation if there's - * more than one iteration, because the LOAD operation resets - * the cache to 0xff. - */ - if (nbytes) { - column = op.addr.val; - op = *spinand->op_templates.update_cache; - op.addr.val = column; - } + nbytes -= ret; + column += ret; + buf += ret; } return 0; @@ -819,6 +749,59 @@ static int spinand_mtd_block_isreserved(struct mtd_info *mtd, loff_t offs) return ret; } +static int spinand_create_dirmap(struct spinand_device *spinand, + unsigned int plane) +{ + struct nand_device *nand = spinand_to_nand(spinand); + struct spi_mem_dirmap_info info = { + .length = nanddev_page_size(nand) + + nanddev_per_page_oobsize(nand), + }; + struct spi_mem_dirmap_desc *desc; + + /* The plane number is passed in MSB just above the column address */ + info.offset = plane << fls(nand->memorg.pagesize); + + info.op_tmpl = *spinand->op_templates.update_cache; + desc = spi_mem_dirmap_create(spinand->slave, &info); + if (IS_ERR(desc)) + return PTR_ERR(desc); + + spinand->dirmaps[plane].wdesc = desc; + + info.op_tmpl = *spinand->op_templates.read_cache; + desc = spi_mem_dirmap_create(spinand->slave, &info); + if (IS_ERR(desc)) { + spi_mem_dirmap_destroy(spinand->dirmaps[plane].wdesc); + return PTR_ERR(desc); + } + + spinand->dirmaps[plane].rdesc = desc; + + return 0; +} + +static int spinand_create_dirmaps(struct spinand_device *spinand) +{ + struct nand_device *nand = spinand_to_nand(spinand); + int i, ret; + + spinand->dirmaps = devm_kzalloc(spinand->slave->dev, + sizeof(*spinand->dirmaps) * + nand->memorg.planes_per_lun, + GFP_KERNEL); + if (!spinand->dirmaps) + return -ENOMEM; + + for (i = 0; i < nand->memorg.planes_per_lun; i++) { + ret = spinand_create_dirmap(spinand, i); + if (ret) + return ret; + } + + return 0; +} + static const struct nand_ops spinand_ops = { .erase = spinand_erase, .markbad = spinand_markbad, @@ -1116,6 +1099,14 @@ static int spinand_init(struct spinand_device *spinand) goto err_free_bufs; } + ret = spinand_create_dirmaps(spinand); + if (ret) { + dev_err(spinand->slave->dev, + "Failed to create direct mappings for read/write operations (err = %d)\n", + ret); + goto err_manuf_cleanup; + } + /* After power up, all blocks are locked, so unlock them here. */ for (i = 0; i < nand->memorg.ntargets; i++) { ret = spinand_select_target(spinand, i); diff --git a/include/linux/mtd/spinand.h b/include/linux/mtd/spinand.h index 13b5a52f8b9..5934b7604cc 100644 --- a/include/linux/mtd/spinand.h +++ b/include/linux/mtd/spinand.h @@ -363,6 +363,11 @@ struct spinand_info { __VA_ARGS__ \ } +struct spinand_dirmap { + struct spi_mem_dirmap_desc *wdesc; + struct spi_mem_dirmap_desc *rdesc; +}; + /** * struct spinand_device - SPI NAND device instance * @base: NAND device instance @@ -406,6 +411,8 @@ struct spinand_device { const struct spi_mem_op *update_cache; } op_templates; + struct spinand_dirmap *dirmaps; + int (*select_target)(struct spinand_device *spinand, unsigned int target); unsigned int cur_target; From patchwork Mon Sep 9 22:23: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: 1982827 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=AoV9jnMG; 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 4X2hGF4ftyz1y1s for ; Tue, 10 Sep 2024 08:24:37 +1000 (AEST) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 24E6D88E3E; Tue, 10 Sep 2024 00:24:21 +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="AoV9jnMG"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 3AAF588E44; Tue, 10 Sep 2024 00:24:19 +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-db8eur05on20710.outbound.protection.outlook.com [IPv6:2a01:111:f400:7e1a::710]) (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 40C8B88861 for ; Tue, 10 Sep 2024 00:24:17 +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=arcselector10001; d=microsoft.com; cv=none; b=VzqbPaEaejROctr4u1En/ODKLOlgkltkCwOVSyaKEc1NIu+A5LXFETzgfG+ORYPkM1meoCERfNY9lUZfzIgAQWvihj8l2mCW+Gg0b+ywNDE9iHD1eS8z9sxTHCxHpYBr71vaqwm/VGCexOgbDlzbSkU4oc0U6SB2W1yAlMEADdF+YCh32a7THe8P96HBZeK40blYc+ZDQ3gTUzG2hGXkN0HzR2pRl5P2VCH+fjgkVgtz+YIVfDWCUATfK42cNS29iksiqXKMNqxXrFsAZXFjIaybRO7bnC8noeLLhfaAcIrPw9RrtoOsQhejnpqlG178DCmdtdyBXWnCNgnGqzgP2A== 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=RhnO1yTnFxziEMejN/Hd504ElHxiEG6WbNOmy1FbNTI=; b=ik+ukERdkjJpNyFcM0VXPlmhk6xjtOSiLIqjHA9oBsTuGC+IARHHeuZlplNX0pYzT6s24S5UtJnvsbd1fuP1ffUSy5F99yypDHAGy4tnR8J9V5SYWgcI7j3FZC3+gxYMRYE6VBRlEH3k1nXrw0lCw5051UduK28oxlZs7AmzZeFuj4dTknLS2snft7uadD7fD46XRp+8M0lCuVMzsZrMtfWXCUBiTkfVpCAOrT0h6w/jGjVugZ4vlTCk5s/fMPk9rLxF5VYeB4fU5x4QbjbNrzpJ/+yd0MSYrpd1ZmxgC/C3awP98+msYx5Zsqu2czKPj9p/eM2A8YV4cTUn0ygygQ== 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=RhnO1yTnFxziEMejN/Hd504ElHxiEG6WbNOmy1FbNTI=; b=AoV9jnMG8ARuSJHNFbGSQzYuyJLm4C91polx1Najdf2LJGI8cbUxcFTl6QHY5Jko62peHDFELhrDWf+29eS3b82OZlqbsQjFeBBjYjL7OObJd8ZesLwGBtDtyNk0n7ozuUevBJlX4uIuiMADzdsnq2pWQ7/4jM60QjKQRdxgss+Zb16CYymOB9wzneK4Gf+b1pRAAnUK18FFGNr6qWNwModqc0fW84eLNON+vfYBr9W6qz8C7rfMc6WwJWK+wEw+4f3NX5yq8fGzlYLjBBPH3+/oaSIPU9xGULu++pZbJpH5X735q77VRSVK4IT6TPUlz631wOBG6ftmGSpDmx4ISg== 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 DU0PR08MB9935.eurprd08.prod.outlook.com (2603:10a6:10:401::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7962.15; Mon, 9 Sep 2024 22:24:12 +0000 Received: from GV2PR08MB8121.eurprd08.prod.outlook.com ([fe80::4cd3:da80:2532:daa0]) by GV2PR08MB8121.eurprd08.prod.outlook.com ([fe80::4cd3:da80:2532:daa0%2]) with mapi id 15.20.7962.014; Mon, 9 Sep 2024 22:24:12 +0000 From: Mikhail Kshevetskiy To: Tom Rini , Dario Binacchi , Michael Trimarchi , Frieder Schrempf , Jagan Teki , Simon Glass , William Zhang , Mikhail Kshevetskiy , Igor Prusov , Dmitry Rokosov , Bruce Suen , Alexey Romanov , Martin Kurbanov , Chuanhong Guo , Miquel Raynal , Max Krummenacher , Francesco Dolcini , u-boot@lists.denx.de Subject: [RESEND PATCH v4 02/10] mtd: spinand: Add a NAND page I/O request type Date: Tue, 10 Sep 2024 01:23:50 +0300 Message-ID: <20240909222401.2562898-3-mikhail.kshevetskiy@iopsys.eu> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240909222401.2562898-1-mikhail.kshevetskiy@iopsys.eu> References: <20240909222401.2562898-1-mikhail.kshevetskiy@iopsys.eu> X-ClientProxiedBy: FR3P281CA0096.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:a1::8) To GV2PR08MB8121.eurprd08.prod.outlook.com (2603:10a6:150:7d::22) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: GV2PR08MB8121:EE_|DU0PR08MB9935:EE_ X-MS-Office365-Filtering-Correlation-Id: 58427669-f5a4-4671-bd9f-08dcd11e2158 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|366016|52116014|7416014|376014|1800799024|921020|38350700014; X-Microsoft-Antispam-Message-Info: nOuY8V6ukhs6criOE9riAaUkhMjyFgc7Kubu7QkpnPh0NT9gFLR2YHv/zz1xAp5iHkOjMZzOjLl+XqZeI1OHBHFSE+lu9PX6PzR/DhEIdvjPXTKQQ6QJK04jSMoXC+3N1CtW609JLsEaCJypdhgE6ndO2wKrdv82/H+WSldHYZJpIniEb3aMvz/zjb3DIQDPOHCjFV22UFoTztrQxa7bIIkG+0MkWSnBmnDeR/ej7b3cvfGXbR490y09qnJeTk7Tzb1zDzmF9BMD9s5pOuNk+qSFNdiBlFkDxqICuoIEMMQH2Mbe9bBb7tgyOZFNeTVNdXarBhrdcllkZP7w1p5thacjbSm6CCMMr/LP826y8UERQ9kz7KR7herHGZypAOOL9ei4C8NIiMBAd7nFVWF/hR9MKbukT+Qyh0mXIbp8l4fhOU8qGOlf06feHJJDn1/N8GjotVLcL/nPuc2LYNbgNCzWa3SWj6xqvkOEng1xOi18WxQdt0/qOEguUkmij+CHvj/6L31ENDkc79vBKjrjCAFZKws/hdch8dg/9aWJVbAg2vX1mfdhOIVCq5OQaPDZJjNYpgFxMVAU1FnuHCTDpzRqpHiumJ/11c9ykpT2acFjttYdZUkfCXZUx63iRFxZR0WFOF1rRRPeX+zt68YAlbttZgUtXnCFbTh2qkS2PYIK6v9uE9+SI6Ld2DjhDry8vfQ078koCAr6/IvPU8QjnZ06TBM3Hu8VqmbLKmnvKsWTkk4B5oFUJGHoBbaqmJvf1f7vGkcLTJasYkZf28pRb3wezSRs9j9kWTywTRfrF9cOF/0ggnHIurvTqJ9U8grqFjbw8r8qN7zH3gbw89iKxFCaywFqgJao+JVIWnCU6SYiFEj+K+wmtTRjRSLqs38SoczIUK7rpC6M7ETzNUmHCThVEStWqUobwPz4qXDZ8T4V5P8ewZ/SldyhPbwYLspmyD4eO1T/h1lTeGK5nkKnoOSXS8G0y20H+NaCbWtYrm1lrqlDz1MKYzeQ920emC+rPljrCxH70GCSqTCDXChxJa2YDuEDhHkPGi6Wyw5RyhLqwfbcU5CDIgOICc7Z2no5Y1hAnR5TwHq87Zk3Cb7aHD2yEwRsUOwpnpze2WPzll5GzCwxVPl6L2WVh2WFC7Pmb+ZuuYITyydmKd71FjLE7YXZWLJpVIE1Wuu48OoDkN9w1ABe1zKKiwlB1X17xhX2FBEZCbuhpDwdy0OjrF7io/kI1lYfClBk81FTnqGXyo+ipw6vXEjvudC5dJXIVvgpuRzEqJ4HK9bna1KBThXylJ0CdO8MyGhIyDB/fxDu6OYgA3ujL50Sxu1aedxuplZ+yM9rq0IPx4Jy0K5MfSMi4TUDdEE+6lAtUheTgA0wAT60JX1nBkHtDl58D1rQkJ4s39iMSsTXfs7MIO5oB5r/clxdhQ8M0hjxuV9Eg8t/IX8= 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)(376014)(1800799024)(921020)(38350700014); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: AVGOgAAJlBBd0WKMK305du4pkZBCVRwnHuCEWgfXN90dzNhjcFvK+KQJS7H2D1xo0VXANcfJ6Dh6QeUCszQcegy/XvDVdIa7gQanvjYJmoTJZMRjol2Jvr8CN69xONAOu/VRUlRXVuY0f6W/HADplv9FsU9cQ3XTGqRgw/JdSlwwkf7/Uwh5RSe+yS4Dn/lruBST4jc5ujst5SVLt+wHQ0LTBymaiAxyJKHpX1M9vFbIBNiqa6ByiRdW6bM+1xfK8OeWn3LvvpDcNYsOGrgMkAymMz8AxMG9EXwXNyqK3s1Fbbo6GxbldTBjIMVK5hpOiZVs1Fc/hBj4eLgUXZCFkeTegPY6m+DpngYPv+O3PrYtfv1ooFxd/JiPrXQNJlFPmR0Rxs2gXcqmsCa00N2tamRL0/I2sR2uIi7agwJCSrSj8njIn7hoV3nTjYDxaWlnO63NRxx5fiQZXB7x2GUnFBXT/MlFtzG+d6JjhvLuDCg1qYWMUvtnQJbSA76JQg08Tf5scZ6Tm7Hitd+Ra0owVGkcpwEmlxpDoKVZW2TiagnRY5sACQ0dVSpbNABGIoR9LzePYbswINkM5e/JoCsdzeM6nLFdwhrM5btIm6utK5ZprLqKgG0gM6KAXxV/uqgW37Yw/ojPBbvFm5O2ekvkKYw4fNbB7Mf4ugaq17UJgqyT8ukm2514JFIu5w1WfDrZD/WgcgiNvfGjODyhXdlF3fknYZli+6OBiCtBwkcsmmYMFHCAog75W3A2R8a6/KSrQ4K4UkgIo/pUz6odDnzZMEGb3NQ69JgclMHihPSvbgZd7sXON9BCW/Z1RMsaK/IXWyeNoJbc1wrYd7Yp/TN9wAtK+8EYZPMSX3ye1h3WqXEcWJVcd64TYuR7MMjg3dp+zdiC7SqxWUaWReLXxWRccEN/SS89Ah1YTh3ngxI8PXwFWVLEy/qv6spx6bTf808JpH2l9ynnrFnwzyjwS0rzon+6q0MYzIYfe37mi0tw9lqKjLYjAa1DIvmhAQ0l9B2a2BJ+OysKktjN0eyJM4h8Z90r37zICC1+Kb8yx2GJYcrJERvfAJFO5wVNaMoUdl8YhyMy81qlFNfpig7l7TRrg5pP88lE9dJ+KyyXoYJpLO0O+36BY5RSFu+HHWrIbdXzNVZ+0ixFn+ucMxgH9am0JaE917hMS5CHcr2yKu0oeIbqEgmXFW9OCL8Ba48dWzqArtzxQXYu8ip6z6N5JZa+8H8fPZBAicjvL4JPVaslYdhf9lXwRF8g0JkB2mEV2oSsibRdBr/Q0Z0/VZ7CpudmtOFPZZmPHB9oLIQjrRXF2RlvkmBlkypEaE+SJkH1Jiim68kp9GjkdrlwKwV4YjkQ2+8WJmHK5ccv8zBgulyohlJ2NPLf89SCjgPOsjOQftYPUqu6Nh/kAb8gGBLm9AI/AS2eDHxp9YWJC0CuuMc1AIgpnoDRtSHoPiA1zVPznpbzuJqXPgzYE6jDSZUPvD0PyFsMShCDLp8rIjnZDRm9pANsALYEiao0IW2f4JFolJShbUB9QfvLRlNjzWeoh2cA9UQ67ADl4mUUH5MooQBVgzTACME0qwId8ysrkPR4fooQob0JTm7bHvRbi2g826+oSw== X-OriginatorOrg: iopsys.eu X-MS-Exchange-CrossTenant-Network-Message-Id: 58427669-f5a4-4671-bd9f-08dcd11e2158 X-MS-Exchange-CrossTenant-AuthSource: GV2PR08MB8121.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 09 Sep 2024 22:24:11.9952 (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: R6mXvlH5nwuAx0QQqLEZbIDoRV3sg9aZU0c5Zv5fDE12PeYAHk/Oi+YQaU6b0mZfTRls3nBJqX/f8wvHgKPJAxIJRxG9RhGgftVYEVE2Coo= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DU0PR08MB9935 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 Use an enum to differentiate the type of I/O (reading or writing a page). Also update the request iterator. This is a port of linux patch 701981cab01696584a12e5f0e7c2ad931a326059 created by Miquel Raynal Signed-off-by: Mikhail Kshevetskiy --- drivers/mtd/nand/spi/core.c | 4 ++-- include/linux/mtd/nand.h | 18 ++++++++++++++++-- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/drivers/mtd/nand/spi/core.c b/drivers/mtd/nand/spi/core.c index ea00cd7dcf0..8f227ce81fa 100644 --- a/drivers/mtd/nand/spi/core.c +++ b/drivers/mtd/nand/spi/core.c @@ -523,7 +523,7 @@ static int spinand_mtd_read(struct mtd_info *mtd, loff_t from, mutex_lock(&spinand->lock); #endif - nanddev_io_for_each_page(nand, from, ops, &iter) { + nanddev_io_for_each_page(nand, NAND_PAGE_READ, from, ops, &iter) { schedule(); ret = spinand_select_target(spinand, iter.req.pos.target); if (ret) @@ -575,7 +575,7 @@ static int spinand_mtd_write(struct mtd_info *mtd, loff_t to, mutex_lock(&spinand->lock); #endif - nanddev_io_for_each_page(nand, to, ops, &iter) { + nanddev_io_for_each_page(nand, NAND_PAGE_WRITE, to, ops, &iter) { schedule(); ret = spinand_select_target(spinand, iter.req.pos.target); if (ret) diff --git a/include/linux/mtd/nand.h b/include/linux/mtd/nand.h index 651f8706df5..0afdaed5715 100644 --- a/include/linux/mtd/nand.h +++ b/include/linux/mtd/nand.h @@ -80,8 +80,19 @@ struct nand_pos { unsigned int page; }; +/** + * enum nand_page_io_req_type - Direction of an I/O request + * @NAND_PAGE_READ: from the chip, to the controller + * @NAND_PAGE_WRITE: from the controller, to the chip + */ +enum nand_page_io_req_type { + NAND_PAGE_READ = 0, + NAND_PAGE_WRITE, +}; + /** * struct nand_page_io_req - NAND I/O request object + * @type: the type of page I/O: read or write * @pos: the position this I/O request is targeting * @dataoffs: the offset within the page * @datalen: number of data bytes to read from/write to this page @@ -97,6 +108,7 @@ struct nand_pos { * specific commands/operations. */ struct nand_page_io_req { + enum nand_page_io_req_type type; struct nand_pos pos; unsigned int dataoffs; unsigned int datalen; @@ -613,11 +625,13 @@ static inline void nanddev_pos_next_page(struct nand_device *nand, * layer. */ static inline void nanddev_io_iter_init(struct nand_device *nand, + enum nand_page_io_req_type reqtype, loff_t offs, struct mtd_oob_ops *req, struct nand_io_iter *iter) { struct mtd_info *mtd = nanddev_to_mtd(nand); + iter->req.type = reqtype; iter->req.mode = req->mode; iter->req.dataoffs = nanddev_offs_to_pos(nand, offs, &iter->req.pos); iter->req.ooboffs = req->ooboffs; @@ -687,8 +701,8 @@ static inline bool nanddev_io_iter_end(struct nand_device *nand, * * Should be used for iterate over pages that are contained in an MTD request. */ -#define nanddev_io_for_each_page(nand, start, req, iter) \ - for (nanddev_io_iter_init(nand, start, req, iter); \ +#define nanddev_io_for_each_page(nand, type, start, req, iter) \ + for (nanddev_io_iter_init(nand, type, start, req, iter); \ !nanddev_io_iter_end(nand, iter); \ nanddev_io_iter_next_page(nand, iter)) From patchwork Mon Sep 9 22:23: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: 1982828 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=r88f7EJi; 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 4X2hGT3mwJz1y1s for ; Tue, 10 Sep 2024 08:24:49 +1000 (AEST) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 7DF3388E56; Tue, 10 Sep 2024 00:24:21 +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="r88f7EJi"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id BE7E688E4C; Tue, 10 Sep 2024 00:24:20 +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-db8eur05on20710.outbound.protection.outlook.com [IPv6:2a01:111:f400:7e1a::710]) (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 E854F889F8 for ; Tue, 10 Sep 2024 00:24:18 +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=arcselector10001; d=microsoft.com; cv=none; b=AxTZYu9+Ln0IU9cNtkRQr6uDiYxNDmBTWdhKa6he575gKoNpiGKkquNV9oME3njCz3YOkCXAKlMUcD8z1rmXszPQdZUAt7IrfFJYqmomYSDM0hBiLnFW4QzM+hJDJrst7hpX6/Yo40vJ9R37D4nEJ4bdKqYYq8L3MkT2KOOPDVg0fxKCo9DBqhScXJXO1JfNh0+SM9I410dhHebp1Vp19uOqPvC1gWZODeReBUQz6QywQk7+2FjLCV+eCI/3zyIhxmKEpiovfVZX0KpqBuxcooyAUlqkNGtRdPOAN3HtLTN87FNEMzxxOUeeytKpUQT1NmNvRbvroBfXQkmbKskYMQ== 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=TzsgTtBBhFwFichKnMzvvJMvJjAegPEkOJ1Xx+b0T80=; b=Ory/xcDwVkvF6aYOspjsHsoZj++G9WfTLM3D0KWiARH6ERjXeTSmn3pzCNAs3YNH4AnGDBjH2gxHGjRl1pfCRoDfh52TVdBoR0FN/k7STRuxZUJgKKwLl3neoU3Xb+yx//A4d5sVypJqOXa15yEB+KtA0ID0TvFk7zBzsOkV4sWZ3hfXvNK5NJiKFqH2WyJssX/KJZbqCok3IRDtKKf92RMvGx3HtfQ5g5EDIvmywvNu0s7C6Piw4q25tqraNDkwI87hOYgM1+VrXh+gaEP1mGXCUOz04SzE4sLliWR+3Ta4wJWvgF6oDx0i+yyUP27udw0i/9m9aX+JQ6n5fTw0XQ== 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=TzsgTtBBhFwFichKnMzvvJMvJjAegPEkOJ1Xx+b0T80=; b=r88f7EJigykXQEOAcItKNMje0q+A/Z/lTK6VHeR4/D9kq94PIOLMvvyKlwYFDsNcCIbOnVedmDeUT6l/V9Dfj8YB6YOgUyE4L74+AfK8sYdLQKl4fhLrPWq5echNi6XtDqTaMzVK6rqnOrzAYX9cj64j9m8O3X3qyKEDFf59fwRM1Soo+VSgkt4xSzOzyyOJPQjEexbFci4hoXB1AU5w1nCBaACUqiGYqkwgzp+cr8FFgoU7uDdDFVAGDRGKuXBJmqwem7nMjrKyIMMxHBkEiUpSJ8id6Utk9RK9+8LU8+GxXIybLEv9i2hEnCB8J7xANMnzD2m122LXHU1JydjuLQ== 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 DU0PR08MB9935.eurprd08.prod.outlook.com (2603:10a6:10:401::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7962.15; Mon, 9 Sep 2024 22:24:13 +0000 Received: from GV2PR08MB8121.eurprd08.prod.outlook.com ([fe80::4cd3:da80:2532:daa0]) by GV2PR08MB8121.eurprd08.prod.outlook.com ([fe80::4cd3:da80:2532:daa0%2]) with mapi id 15.20.7962.014; Mon, 9 Sep 2024 22:24:13 +0000 From: Mikhail Kshevetskiy To: Tom Rini , Dario Binacchi , Michael Trimarchi , Frieder Schrempf , Jagan Teki , Simon Glass , William Zhang , Mikhail Kshevetskiy , Igor Prusov , Dmitry Rokosov , Bruce Suen , Alexey Romanov , Martin Kurbanov , Chuanhong Guo , Miquel Raynal , Max Krummenacher , Francesco Dolcini , u-boot@lists.denx.de Subject: [RESEND PATCH v4 03/10] mtd: spinand: add missed add missed MODULE_DEVICE_TABLE() Date: Tue, 10 Sep 2024 01:23:51 +0300 Message-ID: <20240909222401.2562898-4-mikhail.kshevetskiy@iopsys.eu> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240909222401.2562898-1-mikhail.kshevetskiy@iopsys.eu> References: <20240909222401.2562898-1-mikhail.kshevetskiy@iopsys.eu> X-ClientProxiedBy: FR3P281CA0096.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:a1::8) To GV2PR08MB8121.eurprd08.prod.outlook.com (2603:10a6:150:7d::22) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: GV2PR08MB8121:EE_|DU0PR08MB9935:EE_ X-MS-Office365-Filtering-Correlation-Id: edeb880a-f9e4-44c5-6d7e-08dcd11e2244 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|366016|52116014|7416014|376014|1800799024|921020|38350700014; X-Microsoft-Antispam-Message-Info: ovQaULqJn0OFYuE7A+hWmaHW9Pt2YQL8T8SomF1YhkRW997W+Xp8ra7IyJclUmWSH8QtkSoMWJZ4CvdhGlF/Dm9Ao0VB55+vNILBVmm/2Kh0ruViaa0kX6EFQau9CLfP4m/+1kl8tQeRzzkgztS3CNIRsYgcOVi8BNsIz/x8xRjdJQbEaFOkooY/Rd+gub1TgcDdzbjSdDfdtvaUstYF3nMjj4KxkrjdVApIagdUVYw9rsFb12ob/BH+6NuvVvn4Rqn25m+vvIaa8cph4UQ9Ufxca5jL8FzVGPXP4zzrZSev00etSE/F2H4Hcj11AKD+9OeyRzjQB1E5UzEQXOj9Uoh2yg122VkVje4A3DiIS0Q/MdtM38VhreuoTdF0pf/BEPcswyU00vDlJX/v+KRM6km29k1Tm3iH9F2A6Atu5SwlvctmkdiYaGyb8sYzD//5uKILcG+5y9laeG7COxmnMg4dnHqb98hinCQUx9zU8W53vhoeJG7eOL+9rL0f0lG9hITZqXzHSaO+g8gT/ATz828faR1tqplAooFNqz8iEEy+vnCKMProMfDe0hlxuzVhS+ElMwkQHSIF2qv37iQrduXRVIjNQyO8GWLZk54SJ9dFdPPxKqn1z3Q3KsqQG+nan8mbeQDBHW8u1fhcrmbjuPCI7SvJpyeU+0QyIwAezYBmkUaEbPPqma036rCYUG/SNBfeFajd2eUwMctVP7ln+12TRt0cKPZG/PpJYK2MbhD1yvMDDo6WsKehGJfVpf5XZ7z1aThnfn6DBNPVrHSKTULlox+qwb8uhzPR6DtCZgtuVFGr1gQV4dK1CYylO0XKJdAWFuiwJOH3bmKmufwq2aDX52HnOKuWhnSi8qJhxVNqL+bJx5GEFKej7CGvs6X+WrLnxZS2H45C3pqbOUGP18EuC+KNhLaiaKKXetvqS100WmBz4I4x6kxHE7h1nnYPEfBBl1o+Kl3r8C9AzlrwdnGzN7XjVzYPAGLL+ZQnBi3BO9Ha6JWGVa4j2Oe3dkvVHlQnz8AYku+66p366+EteGSLGVI1UBEIyAR1ltE/m1cbrY/AehhLdjLWVCCe6ci2oSwtquNiwkbHIE2zrZcvAeONvp7e/5eA6kuvxumcqYmC0wDsFjmbh6w0LZPvfrPOvKS72LBL+aiHLg5HsIoYoIjrSjo+yHDyXp/bk6VO7mcrzcfpDMVBT5FzrTsWlvLn+o1ODk2vQlECDn9RO37FoaSesP6QxRMh+ktRXbMSCCnbAVtGeQ55yC2P1Scf3YkV6K4QqUazsIMtIoe1LDGQAtmH+3p4cgUtoDOWbdB4w8B0Hpn9d5g9DaRbTYIVvWhZmRcEHL531WcDi0ZikeYzsllsxx5d9k0ItnVzCPHPsxV2TgHT0iiUcqjY4LBo3TJAjq7a2gSH2ZoOVl/aQtq2niBn+OOmr3wG9flFi6L+QRU= 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)(376014)(1800799024)(921020)(38350700014); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: joE/WIzM1BesR0sd4Rub+mqw3yh9nySlJRRSa1R2xv9mWNOFLdb6kEH/nD+ig0Irfuk1Yu5gg0gVeDIdlAKR8cU19jaXqk44XBRQKUXeB7DJy81nHF8t/eW1FyK8ExYvoCDlIz6ISmmNKLzFod7A814PBtLK01nGQzND1eVm810E+9yUnw5KildLiADFA77E76XfVufpLUT3ZSJ034T28w1z8ZBoTBpcRctvFo///82L+toE/P4IQrcmRQK/yXHoMzxZ6crB80Cfk+qaLUDbkoUB8wySyHh9gmoPJkFHEjxup+8A71ZnUrwd+BG8JnoL8I7ExGcwwKQVYsz+KNaYg80aye/nOCoaRIKpZ/6xxOFKf+Pp2uRVeR//9VET+lU90C5MpKztk81LxuCxMOvr03uw5XaIqcENIY6cDYcGA7siZc8FQPG4R7qdFgjgM8CJ89olCTTUhZno3b/zpuvQbCbqRBTmdnr7A/6b84D8jMt29Itl21UVZrPS/QP4NXzbqwWhPNNOt3vHhbz11njW33NFG6uRze+QrotoRNCQtwNRMAIHum98vP+GAoO+5U4gcRm+eenVvRMinLsOB/33AivrsV1/lKqBHBTqQeAqcvHrWEadrdQDPh8MGJs4C3jN1Fvxiwx2CmVVBB8coGqpnqoOSaXR3a3247WmKO+0mYAABKjuwvVnKXYoTu7hfUvLUOEBMBgdJtFOdas0qPtguAolDTWydXv6315Fe8iJ2i1m2XCfPY5ZX1JT3GuLcIXa5K3wM0WWeQcdzEqG3G2x5kHirAJ08Li7tygDs7zaD4nPm+wCQwLgt2OwdyDVwyKUzab6Y6c7hxY+pMrsWtwZOV2NqT5JVNTD15eUxb/XP/rOQ8kGfSa2pGq8Y85jvIx33+0G3gbaBnxpkMZ/BILOatLNr+vUQhTx8/+aDPhelw7eBaCb3HJwcNN8LEB4Fttw2S2CujeNvtXlSgWBbkmnbIOy8mjJUZ44YxOLaNJyOJaqm/rr/Dxl8AFPSCIb2jtEbMo2c7eFf8xQuEUlScqOnbdy2AolcHLkKBB7VYChDr9AWYYXuR74wSuEyicrxtHtaUPo6y2XMsjUur5i6YmBtbFO3RPYe4Iz2xc1/PlApq6+nzEuVD5ammUVmLlsNY+ipJbCoj864Aa+l9rV9+Ok/I8ATo/1xrtSEBP7nIQqdIDcvjk9+dgc16mCWfZJEbA/gzOPUvSevT8HQQLC3yVgc+1wZh6bS90qSBUYvhzs95VT2KELrcnjGexpFr6YNKu7syHTuvk5a9YyTEqzKNC16PVhn7A54SlSAPxWynNboWkPBB777Cip6rwx7eH8uV1frmgaN10e1CuJNwY4VHXKysK2TIMbR6rNtdgV5fLflV1zqwsmzgKMt5IZlk44g2zFrMFQP3adc21Lrxfrg46o6R7jFtIu695ZYR8HDrbmU2kQWUERwiYjKHIMMcWiiV5GJoI0u6iYe/N6gxdRpPrbM0FUMEMj9dFLe3LAuF6qXhQbCats1vnLtHMkXMbQ6cNDSGDyyf1DPNme12tWqtrY0u52Tpq5BfDP+pN/HYRUL59JAAgy20gwQhd6zz7phbFFbGKTsDu5fFLx/QXH6Dejmw== X-OriginatorOrg: iopsys.eu X-MS-Exchange-CrossTenant-Network-Message-Id: edeb880a-f9e4-44c5-6d7e-08dcd11e2244 X-MS-Exchange-CrossTenant-AuthSource: GV2PR08MB8121.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 09 Sep 2024 22:24:13.6600 (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: X8Sb76vyuEJYVeBdl0akvGUa6mtvW209woeYyODsea+LfhwUv20TC4Jq089/r9Zh4PpQufVNLZFqjxkbwza4Alkoypr9j0vFTc4ivcmsTIU= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DU0PR08MB9935 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 Signed-off-by: Mikhail Kshevetskiy --- drivers/mtd/nand/spi/core.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/mtd/nand/spi/core.c b/drivers/mtd/nand/spi/core.c index 8f227ce81fa..62779dd3e51 100644 --- a/drivers/mtd/nand/spi/core.c +++ b/drivers/mtd/nand/spi/core.c @@ -1267,12 +1267,14 @@ static const struct spi_device_id spinand_ids[] = { { .name = "spi-nand" }, { /* sentinel */ }, }; +MODULE_DEVICE_TABLE(spi, spinand_ids); #ifdef CONFIG_OF static const struct of_device_id spinand_of_ids[] = { { .compatible = "spi-nand" }, { /* sentinel */ }, }; +MODULE_DEVICE_TABLE(of, spinand_of_ids); #endif static struct spi_mem_driver spinand_drv = { From patchwork Mon Sep 9 22:23: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: 1982830 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=KgOENHSE; 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 4X2hGr708bz1y1C for ; Tue, 10 Sep 2024 08:25:08 +1000 (AEST) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 450DD88E5E; Tue, 10 Sep 2024 00:24:28 +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="KgOENHSE"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 9525F88E66; Tue, 10 Sep 2024 00:24:26 +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-AM6-obe.outbound.protection.outlook.com (mail-am6eur05on20711.outbound.protection.outlook.com [IPv6:2a01:111:f403:2612::711]) (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 9EEB788E5D for ; Tue, 10 Sep 2024 00:24:22 +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=arcselector10001; d=microsoft.com; cv=none; b=bzUpRK/0RDgUSaP/x/Xn42jE9jo9vLJuYga7N9/ZLemkxNrWxfiGTA5i790ujI1s0Q8KgrVocawpZvAMXxJKfHPFdiZ8mFQPcU7UfLzttHdS4jCZkkZHJYuDc+LPWoQzq30rp0lW51HPhNGM0O9ZEq2J79DLsbN6qury7K3019JZ5J4cnqE/3Pdn1kjfdgCJaBm2tWn9xXwT4ocnDPE2Pa0rSKOlloFN2dafBRhPWmboW5PDmGVzSKqoevoix0/sBlKqfjJY2I9kq6MSOW+cWEWVkk11DwxaqzufXnUwBihXx3iORUxu/uTGnpOLtDDpp0rCuBBOXD4Mab+sBJf+Og== 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=mIpKMrgieRd0uiFaGsLMiQL9c4w2nS6s4iimFPcCk4U=; b=NXN2kWb+3T5ukl5zu5/5jzlDIuWQh5wItifJZK/PUIT6spYVTXReQdJuWHI3z7eEO55G1PC2XTpfunQxTlkosoo1BfpMeEjL8vWsmKY1w/Z3b5LkWhMqCzGfQqRky46Gc3EKd9lHX4P1Nz1/VHHf8P8qr1/TnDX2XsPXurodc9M2iYeBQx53YVlZYVPY/GcXeswtuB+RcBi42mZUJwqSM5xiJfJwd927ZAm/eG/uz96pGsDCh4eRfBDU/JqiNWCC6XGBjdP64jkC8VX43lt7wOpHLcXkmcW/PNhs+/hYOOqmTHrxMepuMQYjV9r+NpAbnrCaZYpuDFA+qCr/ShevMw== 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=mIpKMrgieRd0uiFaGsLMiQL9c4w2nS6s4iimFPcCk4U=; b=KgOENHSEOmP4ZV0TKC32gIysp2zNQ0+51XRyC61rSfG0461FMUXlhu1fq8552wKZTRR++zyBoFTG+hc7fvNerWuPvXCfyTarkCyLuHIpirnBi/6y/iQjUPDvzkNYoJGr4xAvEY7LM431qXAezld7bPJVX6BgWQJgq9IHuzZXyh0W9uwnEmh3pD6cW7FG4nqBoF9IGqCwLrsxlBUS0aTPO2+Exg1wz53wqsNoPPNeyyphjni2wP2qZTqqLFbQ7I6AoT6J1DJsBRT9VfZtRjE2jOcsstlvYaeUV4zKYxgm/y71pSwlcA4OVrnmgmKji9Ki+RlR3v70+NThsrsBihh9AA== 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 DU0PR08MB9935.eurprd08.prod.outlook.com (2603:10a6:10:401::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7962.15; Mon, 9 Sep 2024 22:24:15 +0000 Received: from GV2PR08MB8121.eurprd08.prod.outlook.com ([fe80::4cd3:da80:2532:daa0]) by GV2PR08MB8121.eurprd08.prod.outlook.com ([fe80::4cd3:da80:2532:daa0%2]) with mapi id 15.20.7962.014; Mon, 9 Sep 2024 22:24:15 +0000 From: Mikhail Kshevetskiy To: Tom Rini , Dario Binacchi , Michael Trimarchi , Frieder Schrempf , Jagan Teki , Simon Glass , William Zhang , Mikhail Kshevetskiy , Igor Prusov , Dmitry Rokosov , Bruce Suen , Alexey Romanov , Martin Kurbanov , Chuanhong Guo , Miquel Raynal , Max Krummenacher , Francesco Dolcini , u-boot@lists.denx.de Subject: [RESEND PATCH v4 04/10] mtd: spinand: simulate behavior of linux's function spinand_wait() Date: Tue, 10 Sep 2024 01:23:52 +0300 Message-ID: <20240909222401.2562898-5-mikhail.kshevetskiy@iopsys.eu> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240909222401.2562898-1-mikhail.kshevetskiy@iopsys.eu> References: <20240909222401.2562898-1-mikhail.kshevetskiy@iopsys.eu> X-ClientProxiedBy: FR3P281CA0096.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:a1::8) To GV2PR08MB8121.eurprd08.prod.outlook.com (2603:10a6:150:7d::22) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: GV2PR08MB8121:EE_|DU0PR08MB9935:EE_ X-MS-Office365-Filtering-Correlation-Id: c20ac356-241c-47cd-c182-08dcd11e2332 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|366016|52116014|7416014|376014|1800799024|921020|38350700014; X-Microsoft-Antispam-Message-Info: MWCOBhcT4yMMtQhj4cYHflkWJVTmg7oSGHghYmiHIOKNjRuDA83jDnKULIdAssuTRfBREB+tsWE2KGhhYmFHf6Ge71JmVELRp8+6r8PuobjoJZAwEtn+pwrNsHDZoafnDauCRWjZErZY5WTW2LU6i1v6WQFc4M5H9g5vkbGU89ZLk9vDMq2gcASeg8HEaZW469pzlio2vs0KliJ7KS5UTHGQNeslcJvgl0yq2KJC8p3VJRdx2VsYpwGiMtuH7bgVGisSoIiMSgFLeMqh2pGmjz1h/+29XMx5crA1sYb238hanilH+5zKaAeGT62TV6TbOIl4cBn/c0AoPo3UR7vDCvkRK7cD+BcTlxMfh/dhMz9xw7A4SdqHzq+EyNwZSyV6p3k8IHSVGuPqyPV3LeD3QI4jWD0IH1staiGI0Zs1xEjEw0EYE5qjiPy4yP6s59Giobmh2vGR52uLEROXmCFsnnbJ0GhYNA0NqTiYce/T4jW+EONk57dsSDpobJ8bU8cY/tPl/7aaDsInPE6zJZaWD7zMFluLPEEs5jzwtrKw73Jy0rNiS9JfeofDyvMdQcf9NL/AouqhqEVqo8TTQrF0PlDt3qGqkpCnD4jVFBcOtRcsU2J2MkykD7LKGVagrJewlAxt1+zJKuWQPVEsDcQXIyIdXEk813hK4wNEUf/dcjlhAEtTn00jUzUQCcsEcZOAslxKuvHqfGwz6ZkEmCZx+ZC/Z6L1oW/NrVMQDJMTzRi8JL7W2JWoYRtufxhWjVbwYtii0Opch+kSOuA7QbOGSSd3WCEk0Mr6OzIbq9NzyRIAkJpuFVW30bvlGVg2diDOn6VXdgSS64bDuLaPHPTwHGFAPkrymzfn3fgjC+CP++SMdkgoaAt6lxoJP4SwgXahgVCCzMYd8jV1t+94McIi4IC5sg/W2V55Q8NUEHE6WsxueAaUW93O+nBjQvg+VI/rn4BagqJMj/DZOfKOQW0SAS3jGHj+XMNpx/Z+3mhkSdJf4NVyZQhVdEM68pg0a8jkEP7WyRteyOZuq52hXilxM/f7XUjbKWyAgzBhiTotmuszNKZy3n4AIoKm1s/aYz3pPgnoCOln0OZr9xqJDhHGCMVb9JdC0yx2TYDTuO5SniHaWfK+Q2fbyRGlEuq9UUUKfbs1eIBXQnLzX1BWD/vfNuY6Jz550wJPmhbJ/MOG9vS3gd0TDX9tPeREZmgQRiSISB6Aw6BGIXSTMroNqopjmL9QQ4BAGsbcl6+UfazKxdlQoI9TqXd9B3ZXLimvGNKak/PzVyH0qAxZ+wghIrdDzmyeSarL1VlnuSYu0QCrRT9OHpeSY3/Z69cJqjkdq+mGPPF71CrKVIIOm/a/298b4CN7spsui5MQe1meCRoUasDZgbPGg4uEE5t9goOLm6D9/OaXb/Ov0W47wuPNDwOlBtK2Fmo9pwQEgRG4M8aqqjw= 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)(376014)(1800799024)(921020)(38350700014); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: /WzZA6H7D6obxpdQ/lI4stnkqHN2iErNFS6QO0dGkFw4/nA9XFjCGC2uvI4DXjW9ooIx/RSBni7xJ3OKkRnyUoLaxVGjfIoZGtKS6svrzBzuCxlrVApBB4RXWLBmX1n35KK3XvQzlnkDTZgeMJFk36LLzFJ0a2GX216SxtU+ldUCAHMpgNJLc6SqGEB4qKNeOR6xzhrBox0F/EsL85eeTWfcDXVdbh4wSBv1dp2q+xjCZ3EgwyygRblB4jpEacRUGbdknFrPazAVLaAtfLKJRU8CLPIZEzsQAKYR3RvKGcp1qiyfTcftsTkzgSzKsZ0YIxlYh8PcJW10THE7CuWphKN5U4y5gBAktAiho+2JG9/TgzXUhloAFCeKq+Gq97Z75iUiuV1G6H3xlPjvoPu/WYaqacqtR2eDn00QBHTwYw8/UKTv1h3pX98oyk7uHLdMIW0HYA9OrBszMIuDhObWSsZOGRi2mG5Ceg2kRD6bqtsTtG9X/yXyQvhi8Gum22S+gVXVw+jga19qlFsGLElXoFcjAntkAKlW2nG6drA79hd/8LZUkHF3rRxyBTfpn/QtSArZhdPc5tfKCTHZ5Q+9lsWgNmBYnfWMnD2V+CDEdFWAMJyw/2Gy8CF/SeN2jE3Xux1RSoF50m37vpBD0uWgBAbMwjoLZZfmMhmG1dzS0j5wRCIu8yHc5pRebHxk3Lw8aWprwZxNtyBC3rbF07U6KYuLNCo3i7gYT7PvIV1tkqWdpsFfYOecboW0KpVWDFgAHfhDhvgp0C7+tUmaPPy7gf+n+wCNcWHVCZ2zi0RfvDc/Fs1NQT0qYnszx8N7NvzKvDhpsiwu7M6ERWKY01bEKEY8ZHzHAEHAwIR0b5JPSKU0UhbaVqPgt+dYLdNjtgbdtySqYuCthlQIukjPtdtKqOESkSdH3hSb9hgBbR1k5YK/yJJdGIeDn0YWDHp3UgQTjiHZd7JwnoBJj5DAzwn+uw6feZRni7X1A+uPKgQGx0hWkf9yensXCMnsMQbFBWBx0v79Aq6yQ1cH++wUlh/Lx9iEaapgBr2KiS+e6+SGy6QeF0Maqv5ONXU+ekmRMKBjgOMWBjsrMm1N8zG9c9TAcvaJvppOCDsFmEnlYMSEPvDgN+l6mbZodDtsST6vFwpmbGjYCcklkcfI/LFY3jCe+jwelAS0JUb8/WIfzQCKtJFtpejP9s37rmdS6p/S0Guqs4ixs4hyLLXqe3p0fcsKrvr0BBqkO/2LTGPOrwGqg+UH07QtncM6vz8SHikG4ASTaWq2UrW+u4Bo3vGzIElLqm+KJpil808d/MNcqjJ88Qj2EgNQakI0HJBXpH7Gt2i5BVDyUzgS6prnApinGjfA51vEnpdU0/ifHsv2ArmBjYPkv079jHmq/7tGOrigB3pgHj42UFAE+O5aTsqyu67WqiMfaCaw444MdZDDs/rSSCU2z3qUMU0eJyXkYRsBRH4mgnfzQfwWlqdLKC3BFRN8LZR3Yo2zp3FuZaSaPFcMspRKYsWTCEgCJqRLPf6lLaLSSAmttBXjE+RXCCmyseg4Me25UyU5meG4Jg26ybbEU+5QLHtuIJGo8iK9M4A5XWsK9aZK0sM+qDb5GBCKBbIwxQ== X-OriginatorOrg: iopsys.eu X-MS-Exchange-CrossTenant-Network-Message-Id: c20ac356-241c-47cd-c182-08dcd11e2332 X-MS-Exchange-CrossTenant-AuthSource: GV2PR08MB8121.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 09 Sep 2024 22:24:15.0866 (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: DYTe2HxutIf9zrQdXcHZDMEv8coBB78iR6FDd33SSOaswG2WZaCGpjcwp/IbXY7NvBBOer382Jjutx3wVJXrqwj7sxzBdPwMyWI1h1rKBu8= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DU0PR08MB9935 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 also call schedule() to allow periodic actions Signed-off-by: Mikhail Kshevetskiy --- drivers/mtd/nand/spi/core.c | 35 ++++++++++++++++++++++++++++------- include/linux/mtd/spinand.h | 22 ++++++++++++++++++++++ 2 files changed, 50 insertions(+), 7 deletions(-) diff --git a/drivers/mtd/nand/spi/core.c b/drivers/mtd/nand/spi/core.c index 62779dd3e51..a10605487f3 100644 --- a/drivers/mtd/nand/spi/core.c +++ b/drivers/mtd/nand/spi/core.c @@ -32,6 +32,7 @@ #include #include #include +#include #endif struct spinand_plat { @@ -362,21 +363,29 @@ static int spinand_erase_op(struct spinand_device *spinand, return spi_mem_exec_op(spinand->slave, &op); } -static int spinand_wait(struct spinand_device *spinand, u8 *s) +static int spinand_wait(struct spinand_device *spinand, + unsigned long initial_delay_us, + unsigned long poll_delay_us, + u8 *s) { unsigned long start, stop; u8 status; int ret; + udelay(initial_delay_us); start = get_timer(0); - stop = 400; + stop = SPINAND_WAITRDY_TIMEOUT_MS; do { + schedule(); + ret = spinand_read_status(spinand, &status); if (ret) return ret; if (!(status & STATUS_BUSY)) goto out; + + udelay(poll_delay_us); } while (get_timer(start) < stop); /* @@ -418,7 +427,10 @@ static int spinand_reset_op(struct spinand_device *spinand) if (ret) return ret; - return spinand_wait(spinand, NULL); + return spinand_wait(spinand, + SPINAND_RESET_INITIAL_DELAY_US, + SPINAND_RESET_POLL_DELAY_US, + NULL); } static int spinand_lock_block(struct spinand_device *spinand, u8 lock) @@ -466,7 +478,10 @@ static int spinand_read_page(struct spinand_device *spinand, if (ret) return ret; - ret = spinand_wait(spinand, &status); + ret = spinand_wait(spinand, + SPINAND_READ_INITIAL_DELAY_US, + SPINAND_READ_POLL_DELAY_US, + &status); if (ret < 0) return ret; @@ -498,9 +513,12 @@ static int spinand_write_page(struct spinand_device *spinand, if (ret) return ret; - ret = spinand_wait(spinand, &status); + ret = spinand_wait(spinand, + SPINAND_WRITE_INITIAL_DELAY_US, + SPINAND_WRITE_POLL_DELAY_US, + &status); if (!ret && (status & STATUS_PROG_FAILED)) - ret = -EIO; + return -EIO; return ret; } @@ -702,7 +720,10 @@ static int spinand_erase(struct nand_device *nand, const struct nand_pos *pos) if (ret) return ret; - ret = spinand_wait(spinand, &status); + ret = spinand_wait(spinand, + SPINAND_ERASE_INITIAL_DELAY_US, + SPINAND_ERASE_POLL_DELAY_US, + &status); if (!ret && (status & STATUS_ERASE_FAILED)) ret = -EIO; diff --git a/include/linux/mtd/spinand.h b/include/linux/mtd/spinand.h index 5934b7604cc..b701d25f73d 100644 --- a/include/linux/mtd/spinand.h +++ b/include/linux/mtd/spinand.h @@ -176,6 +176,28 @@ struct spinand_op; struct spinand_device; #define SPINAND_MAX_ID_LEN 4 +/* + * For erase, write and read operation, we got the following timings : + * tBERS (erase) 1ms to 4ms + * tPROG 300us to 400us + * tREAD 25us to 100us + * In order to minimize latency, the min value is divided by 4 for the + * initial delay, and dividing by 20 for the poll delay. + * For reset, 5us/10us/500us if the device is respectively + * reading/programming/erasing when the RESET occurs. Since we always + * issue a RESET when the device is IDLE, 5us is selected for both initial + * and poll delay. + */ +#define SPINAND_READ_INITIAL_DELAY_US 6 +#define SPINAND_READ_POLL_DELAY_US 5 +#define SPINAND_RESET_INITIAL_DELAY_US 5 +#define SPINAND_RESET_POLL_DELAY_US 5 +#define SPINAND_WRITE_INITIAL_DELAY_US 75 +#define SPINAND_WRITE_POLL_DELAY_US 15 +#define SPINAND_ERASE_INITIAL_DELAY_US 250 +#define SPINAND_ERASE_POLL_DELAY_US 50 + +#define SPINAND_WAITRDY_TIMEOUT_MS 400 /** * struct spinand_id - SPI NAND id structure From patchwork Mon Sep 9 22:23:53 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikhail Kshevetskiy X-Patchwork-Id: 1982829 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=u4JW+Lly; 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 4X2hGg5zTSz1y1s for ; Tue, 10 Sep 2024 08:24:59 +1000 (AEST) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id DC60A889F8; Tue, 10 Sep 2024 00:24:27 +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="u4JW+Lly"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 8629A88E59; Tue, 10 Sep 2024 00:24:26 +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-AM6-obe.outbound.protection.outlook.com (mail-am6eur05on20711.outbound.protection.outlook.com [IPv6:2a01:111:f403:2612::711]) (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 BF15488E64 for ; Tue, 10 Sep 2024 00:24:22 +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=arcselector10001; d=microsoft.com; cv=none; b=cuudetquP7PW3ALmHaPHpeuhByhBchg623o5ybSsDKJ24XBEGXf+Lybta0Ox3/n7ziaItpwc54EPE/IoERXDxSnwrd9KtJTTu6En2OP3FN3K1qdKDuuWBIVesKBln6rVWQ2hrDfAqaoZvqXvXYE4AtlzT2hdhcpgVgGWbYiNc9nHFG19fIqg4QvZN9FstsYOwey/t5py+MHu6TY0PMvZXTmTxqUQ6L6RRYE5acX40g3BfvtSxQmHV4A2sl5iTK385qelthXHVJofqA72xLbanOxNgsAb5qhUBB5yez9pyLbI6rFv0ETuEfGqUwoMg8u++g4uu4JDUPPKCwGXXKLiOg== 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=Whm5sgNFRFvN7odaDp55Iwpw2RT4l+3JBeJgI/Ct/8w=; b=VrhPdJhkTWUcEZAm44qRakyZxiuyPPdWF0Ibn40g8UujFOD3WXvIaABcL78gZ2pCpDwd+RbpVpwbuEUkXc0KqQkwjsPbT3MaZGQI6XosY0Fhf0IqSqTVPMZeiYNyxxenpSjrwTv9UPao7YBNy+xnkrWAnCUrDwNAvRntTC6emrf/N2solKgWC/9vY3JMEqRCfZkqgP4zjJME16WHfz1cRj9QFzZSCuipk27hX35wa2kEbf+UfpjOs8uUm0fdMe2duAuVi3hWuJbotbe8p0PQtuugrehM5vON6khiJqmBD87DqZa1Nuu52VD2dVcDkLsTK+mjyDL8ZRBBI728JLtolw== 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=Whm5sgNFRFvN7odaDp55Iwpw2RT4l+3JBeJgI/Ct/8w=; b=u4JW+Llyj2imDXTU025LIyV77mCss+PWX/rGMcF1nSDgi4twvKiE1wxvUWYXcEUybSVbx49jaTeYisqk2KxhzDbb/tLjkUqOlXoFQrliruw+PvLk27FnJKGeM9KxvNHA1BWWyf8zikXRC4g185g1lz3y9ZXRwaO4xu5sbpinQLkulAS2lYgzZ9tr0WLRuuqbykIl7tvKL/MO9y+gA5PPTpie/5JafhQlnxWJMD8OGyMipsAKcUNcBstYLD3g+kz9RgkPTXpP4l0Co2o+MXkIy7biOeVu1r7FcG2tQQF5aucl6J3WrJ79GRNau8ScwKGX2/2qg6CoxKFgf0H2WADgLg== 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 DU0PR08MB9935.eurprd08.prod.outlook.com (2603:10a6:10:401::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7962.15; Mon, 9 Sep 2024 22:24:16 +0000 Received: from GV2PR08MB8121.eurprd08.prod.outlook.com ([fe80::4cd3:da80:2532:daa0]) by GV2PR08MB8121.eurprd08.prod.outlook.com ([fe80::4cd3:da80:2532:daa0%2]) with mapi id 15.20.7962.014; Mon, 9 Sep 2024 22:24:16 +0000 From: Mikhail Kshevetskiy To: Tom Rini , Dario Binacchi , Michael Trimarchi , Frieder Schrempf , Jagan Teki , Simon Glass , William Zhang , Mikhail Kshevetskiy , Igor Prusov , Dmitry Rokosov , Bruce Suen , Alexey Romanov , Martin Kurbanov , Chuanhong Guo , Miquel Raynal , Max Krummenacher , Francesco Dolcini , u-boot@lists.denx.de Subject: [RESEND PATCH v4 05/10] mtd: spinand: more use of spinand_to_{something} helpers Date: Tue, 10 Sep 2024 01:23:53 +0300 Message-ID: <20240909222401.2562898-6-mikhail.kshevetskiy@iopsys.eu> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240909222401.2562898-1-mikhail.kshevetskiy@iopsys.eu> References: <20240909222401.2562898-1-mikhail.kshevetskiy@iopsys.eu> X-ClientProxiedBy: FR3P281CA0096.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:a1::8) To GV2PR08MB8121.eurprd08.prod.outlook.com (2603:10a6:150:7d::22) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: GV2PR08MB8121:EE_|DU0PR08MB9935:EE_ X-MS-Office365-Filtering-Correlation-Id: 7609a545-8d8e-4f60-8274-08dcd11e2417 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|366016|52116014|7416014|376014|1800799024|921020|38350700014; X-Microsoft-Antispam-Message-Info: z9Rn1lRzEEbOchqG3eKIjfOwwhZyPinFyVFvQFS+2e6zoV2Hr/l8bcDUZPNXlbTawBzI0S1txEJuyJXb87aBdKtc8Ql71BkV6ra3A5SnyCBfg6q/3DHCOpU6pQxfzRKsFUJ1gEQFNfm2PRrn8azgoeDxycxJvzreLVP9X7p4lF++hI2ZN32sbwN7FSqEVTB2DPzdrbVMY++m8oaK4MRW3KciqsW0NQi+mkYnoqdn5sgnmMTIZsZdXAjWVKBmuG0eEDBRJ2RwH3SjaTW0Esz1w0vJGk2FAyJ2MDk5LoIGUe3eYENgZ4kllmFKnScpQQ7LzNS41hlLW0XhQgKYAC3PX9xMv1CKauvhydGOYakyzSz3fQiYL4+sGHBXKlWvlSBsDqpUt7wHhzTsGfc3QjAKS7GGNpRdHIaIfDvk6IyMoU7LevfOcN02oZUYkkTFkrmMtBxkgFwpDkSO2k6o6gFjLjlWUgQWJ/sIyUyJkc1bxvupYzVHvyWmksUgB1UmrISvnNctkuk68SRE/DWP697ERG4ATG9JZALNg8Hu4dAtUDnb45m4RVCC38AFssesimYuoHdW1LI+OD/QREvfQVGAbV3wRLd90uoHY76IFrcVVMOr9bTpFnhyCDOPddS2MK/WwsnuRuqqmjbdn6WwMFs0rtRyLgQv+hOe6qeWH018nNRkulYwUr84EK+u2p4R090uLDNFHQhzNEKhOYbc9nDKKkaVZfiwbcemkN8c9ZD9uNos+EiWsFWITKm1FrRrNubBb2hYWYOFmASi4D3uqNEIbTQ5ORyxnjWtPdbdWhIBUCL/WkBbpGDHri+3VNATZwLf+CNQTLA2a8hQHBT1Ve8nrnHS1mHcIJJ+QiHV4x5VUt/j7WDYL4Dk+PKaN5B2iQRZeNpbknDy435YiFD68BFlGCCKW3WzXD+50wSwGmSBgcmFoqP/WKoQBlskcnWYFWsQYJ9+Q0L7HwOD2RLMmy2vc0GQPJU4/a97GHdJ02iXdeBWVnfUzFBfsyOEmdQwpHrOvXqvn+7mLl6Wz2CZzULp1W2WnH4mBJ7xYQLdMjID1qWX3ixygJo3e25FYTyAqoT8BviXj+dhj2pJc27M9nljD4G/LScW+b0Q6IqGn0LoG26a55t9JHge9dyWhubxhmK7CQySNYNbEYD0OHOI9nZhH9j89jzhAM7QcoMhh7PmzPksgNElBzseoJz8BJ5ePguo49u1QF7w6wix8Ugyzyd37/Suwm2rbw6zzWtVsWirXA2kRcK0W9XgApiHGwA2EqDURB3l2U40dnPC3fVGi5KB8YH1QS/vmx/xFqbZotKnI1SN4MK7JmvQikpzCBhp6ssl18y3cPXgx+A7oZ/T9Dz9/JGpV7sYraxWSWtoOWSwzKm8c/UpSapLlbXLDpGIVg9ccXM016RC808DM7/QTG9ce3kC/7S0KyuOi1wn3pJ8+a0= 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)(376014)(1800799024)(921020)(38350700014); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: Iwnb1KOGH46B/IpJqP1xWIreKt9NF5QEuRVfZmbAw9PL5+SMEIo9vR0lftO3S0WLcq3FmhgmCSNSEuMIpkkaa+/H7++UxOn7opQ3b5tEKR2X1NUvSjmeuEKE9rxGJKqU2cbSPk7GHelGxbOaT6XJwI7nN3CuhVbtqoUgBYJffbRYphCO7BJkA7n/9VknZbSKG+48uzqzSNEbj63LRIFGJxMoUx9GAxzJXus+jpxp9PQbsOJ8Tq7PDdTf6MuzJQ/QloJl7W8Z8sz3QJO4qrTXlBDPT9tqfRQWzU+DAPW44n7HFqC3KLebaKIkYYMomCsTwgyWgIxcSqpivL+3NrUTb9eX3noZbU9y/LgfIi0onX9C9P9C5fi01szFW9soJRaqDU3qsELGuv4m3aBARHyX+t5+nfzTmxMtV9bd66Q6CFMsFYoVo7axvBp7uObNpDABM9HmEJQIkLGAhxGncUxmzPWotq90TQRrhWJga6fXtB2SPMvwOsSxmC8PmQs66wk+RlB/pwoIN8RNN2os+4liI/5iXjYHzz5Ws+QRHUprC1dcfCB4njScnfEZnxY9dgkCJZVkRwMBfUmmgcy5UohY2cEUDC68Ld68xGOBPuyqURdvIF65adQ+8BYN4vIG+ck10m9AI/zZi7IAVLsHCSA3TkBKfCPZx2BRWdVtXbna9cwGvpnEqmQqtSK8l6a6y8dvyllxUieGCyC6vO7ij/AIyt3L221q9lCVPE3rrwTvOpRIsSOsgxBhLKyw9ae5tsy3aOfRpUF34Q3ldKTNfUmWFiKBoywlyUbAwR4eNnjYZvB1tp7wQobzJKNPEjp+ai7Y5119g8HkLbRHVIQiguq8zdzm0QlMHCHI3Kk+EBt+JrmQjDsgUcjocWFW+5qkwSeJKaUxelrU4v1vICv61Mwb7IW+VBZ62wWdR4mjnmT62+8CkWgZh0obX1kRepBwUS7ZrSFChOoyVbKxCHOJVFGhpLmRdpLYIqFfH7GO4w7vS0L6Bq0GK8anXzJVAcGpjZhgdNVRIyJO3sVgymOINjg3BdcyJ64Z0DEEw1H4EiBkfVQui+EuSNBd2GuA8wM8PpfOIzs6RChWSL/4FUny/xwl20rfNF6AwoUtr5LPQtkI9AN4Pv0WDdYtOJwfiuZO+FdO5FNFTcdpwOtZk32OVc55XB1b/TQqFKcMZK9nmohLVyTHaLPxlourcY4W+/Sqzcl8B3Z451KJMAZbWugCvqWpgM74p3aV0lYIdW/ia57c01XRtK8wUeGv+UoRjADkzjQiuml4iFhdRbsyIkL07RiHvcZlvC8+DnXKL7oE/nb9S3F/5ylowZXbugU5SgdYl31yIDNQaZRjmfxaGPZ2GISSwUppCQNPZVWNSlHh3PRSkr3Ib8fUwUTG2Sk1g/DOk30d+riWvvNwooWyQbbKm1Cv0VJOMQggoZ9zFn2E/zK6WabbB8oTbTotMo62Usq2n9n2kTm2R144AOsE8QRfS5RH7xP/IwINN/nXWuTKAg/vTcxGlSX3tIn1fv6tnm/EUXCoz9E2f8mBINiBxU/W6euZ43R+tes0GvogNGtsZast8UKZp7MruWiEuRbIEV0cgE5t2DwwA3PB1eVqyx4nlKE2Pg== X-OriginatorOrg: iopsys.eu X-MS-Exchange-CrossTenant-Network-Message-Id: 7609a545-8d8e-4f60-8274-08dcd11e2417 X-MS-Exchange-CrossTenant-AuthSource: GV2PR08MB8121.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 09 Sep 2024 22:24:16.5736 (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: 8s7qRoFDXFbNvQSCZk6uQ5k4zXL3r9RUR8zR7f0TE/Fl//SsfWwdhmBFBXSrlHOCa0dWG0FgRgzLqxPxXf0lWBn+m0/BjIgQcnV0xBGj9i8= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DU0PR08MB9935 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 Use spinand_to_nand() and spinand_to_mtd() helpers instead of nanddev_to_mtd() and direct access to spinand structure fields. Signed-off-by: Mikhail Kshevetskiy --- drivers/mtd/nand/spi/core.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/mtd/nand/spi/core.c b/drivers/mtd/nand/spi/core.c index a10605487f3..b58d9e00907 100644 --- a/drivers/mtd/nand/spi/core.c +++ b/drivers/mtd/nand/spi/core.c @@ -236,7 +236,7 @@ static int spinand_read_from_cache_op(struct spinand_device *spinand, const struct nand_page_io_req *req) { struct nand_device *nand = spinand_to_nand(spinand); - struct mtd_info *mtd = nanddev_to_mtd(nand); + struct mtd_info *mtd = spinand_to_mtd(spinand); struct spi_mem_dirmap_desc *rdesc; unsigned int nbytes = 0; void *buf = NULL; @@ -294,7 +294,7 @@ static int spinand_write_to_cache_op(struct spinand_device *spinand, const struct nand_page_io_req *req) { struct nand_device *nand = spinand_to_nand(spinand); - struct mtd_info *mtd = nanddev_to_mtd(nand); + struct mtd_info *mtd = spinand_to_mtd(spinand); struct spi_mem_dirmap_desc *wdesc; unsigned int nbytes, column = 0; void *buf = spinand->databuf; @@ -356,7 +356,7 @@ static int spinand_program_op(struct spinand_device *spinand, static int spinand_erase_op(struct spinand_device *spinand, const struct nand_pos *pos) { - struct nand_device *nand = &spinand->base; + struct nand_device *nand = spinand_to_nand(spinand); unsigned int row = nanddev_pos_to_row(nand, pos); struct spi_mem_op op = SPINAND_BLK_ERASE_OP(row); From patchwork Mon Sep 9 22:23:54 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikhail Kshevetskiy X-Patchwork-Id: 1982831 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=CPqQlUFR; 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 4X2hH327NPz1y1C for ; Tue, 10 Sep 2024 08:25:19 +1000 (AEST) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id A41BC88E68; Tue, 10 Sep 2024 00:24:28 +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="CPqQlUFR"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id AED5188E59; Tue, 10 Sep 2024 00:24:26 +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-AM6-obe.outbound.protection.outlook.com (mail-am6eur05on20707.outbound.protection.outlook.com [IPv6:2a01:111:f403:2612::707]) (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 925AE889F8 for ; Tue, 10 Sep 2024 00:24:24 +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=arcselector10001; d=microsoft.com; cv=none; b=QprFKjZrmaYfeF1/i+Bsr55Wy80wt0VKGlCyrFUXfm2zagrSBfyJzbSlp34rj2z7yJBPqg/mW3w52qI5wsBvo/eSU2RRv69eNwxJLEzGg/YS+gIZksV0O94sGw8v5cfq4/TCNeF1TaD1KXQHryVJc6j9UD515ydjN7vL1QHy0oFqdRbwZEXh/mq4htpKTIMVJ5El574UfPZouAPN6QoYoN0EcJdyRcJWz+BAnXpNfRdozQDoOWdhQSezbfSVfW3VT1C7Pa5tItkuRTzcbL9fu9sK9gF8Xm+fGrlKt23QAB4ZCS7tL9+uUiBRw2epe09Sf5sn6BSe2TxBFSGVVtiokg== 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=oBVMf1HtML+wrbFAbRZ5Dsb3MxqYGNYI5rU8KrmMS70=; b=u4EGL1e3zHpj5H+nnbRcjk8mrRl/0ofjCNcGVmgA07iR0/xyOw/TU4ixBRXpcGMXl/vUxHQOOeI/a/9YcuAh5FMF227vNv+ohs4rtFWNkKjZvA9ByyQkprgksDbjaKlSFm6tyy/B0S3kpwgknmHq2+wbBBBjr6GFnbp4scDHhQKaDnh4TYY3EDOOAtXocOpIw/ZZEazsdPuSIF+Ih4+mxJvLdQklhx8Xw91cKaMtgzvf3EplgUwd6K3C4RrfjNJRDIi8+/n+amdf2wbXSXOExGNh550lTQxABcIw873NWu7iNXcDv/7qY10gCS3Q8Zn9kWtqHGcOdja+JmoxYYCSbg== 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=oBVMf1HtML+wrbFAbRZ5Dsb3MxqYGNYI5rU8KrmMS70=; b=CPqQlUFR7/U7QOXZ3Mk56qEgh3EEjfRaDGeqdP+BBLg2BX2awdbIwXSvqGTcgTG3+Ygc2aXsoiTPHTydYghaKyBOtEC6R4p1/QPhoxuB2ZhO8aHT/sEgWndQQuxpQLrO5Ypr9qanvBIVkkSkveMGNKrXLV6l/gxFAKJiAZ2ooqxDinMxatvNIUwdEVFhvnHxRN9aOOaVeD1EEwQxIJTNJX+sWMZk4QPgEgLGsBUUiSXLc+d7lW452xp9pCrbSVl3ZaenFwqi+hr1ICh8gA/nrMSmZsp/RHT76154OIUvdCWVjHaCi1C3iKn7JmYWp0VM9Y8nDJLsiUsAMzcJB5J1DA== 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 DU0PR08MB9935.eurprd08.prod.outlook.com (2603:10a6:10:401::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7962.15; Mon, 9 Sep 2024 22:24:18 +0000 Received: from GV2PR08MB8121.eurprd08.prod.outlook.com ([fe80::4cd3:da80:2532:daa0]) by GV2PR08MB8121.eurprd08.prod.outlook.com ([fe80::4cd3:da80:2532:daa0%2]) with mapi id 15.20.7962.014; Mon, 9 Sep 2024 22:24:18 +0000 From: Mikhail Kshevetskiy To: Tom Rini , Dario Binacchi , Michael Trimarchi , Frieder Schrempf , Jagan Teki , Simon Glass , William Zhang , Mikhail Kshevetskiy , Igor Prusov , Dmitry Rokosov , Bruce Suen , Alexey Romanov , Martin Kurbanov , Chuanhong Guo , Miquel Raynal , Max Krummenacher , Francesco Dolcini , u-boot@lists.denx.de Subject: [RESEND PATCH v4 06/10] mtd: spinand: replace enable_ecc variable with disable_ecc and update corresponding logic Date: Tue, 10 Sep 2024 01:23:54 +0300 Message-ID: <20240909222401.2562898-7-mikhail.kshevetskiy@iopsys.eu> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240909222401.2562898-1-mikhail.kshevetskiy@iopsys.eu> References: <20240909222401.2562898-1-mikhail.kshevetskiy@iopsys.eu> X-ClientProxiedBy: FR3P281CA0096.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:a1::8) To GV2PR08MB8121.eurprd08.prod.outlook.com (2603:10a6:150:7d::22) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: GV2PR08MB8121:EE_|DU0PR08MB9935:EE_ X-MS-Office365-Filtering-Correlation-Id: 95d2c7f1-5e2a-469e-b447-08dcd11e24f1 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|366016|52116014|7416014|376014|1800799024|921020|38350700014; X-Microsoft-Antispam-Message-Info: AbyPd0ClKg/RKu+19nW/xQWw7rXFxyVeHjxC5NPzCv4OQfRd8JCQ+T+4rDlbF+TU/oAr2ZHlLdkTTL/BJFvdpD2u37nw2fFWentUWe7LGgJZlQm4R2eKwSnRF60EcUwue8IlzOTJb3P1GEFNyJLnSdYaDusDesZWw0cTWft2XOUQ09UBKWeXIIyC7XyalzJdB+u4F2MTP0an5NZ0udQWE71Y0vQ7BQnMqf1vqEBQFQIEDbmJLa56X9w4Mh8OIiSo6t5wJNhZ2zWTEUvWx5JES3SinemVpL9nbKJ8ugu9Ba5UBPHoPnMUAsoY5Ne5GIl3qmhxq+kCKO3BbPdhGzj4Wt45UM053DPEu1j+5bKE2L443TTZGvdeBZkhVtmBcNeWLCnehA68SuzBxmbShGlSeyyNThEqfF6XxaOAIr3Dr4BXOVW3oF9xNVZMD91lCZjKoJdQkyGDTaycFWaQYhQW5w4Pz+aiQMIO9MUctLFcllvFmzWl6amfjMWmX+Awe7RJxzzzlcpowYcPfVWCS6UQO/33lrfTge7p1eiJ0lHBmJbeVFXPK2MFRMUVrPuHF/CxCRBS5cRYZjEulxMDfvJN31qty61ldF6gIhSubGaGkF7WSbxhlzy7NwXpsB9VcGvhdGyd9DzlwSoUOclCQk7ohiMmcJDLJmSSuwfbf/w1RbiBWfUljQAOqPBVzB9iSsj7Q9VEoKZ0qYDLI+SboA546kdurlcTywyjSk2HcNeINlTbOUhtHOSybekqWLIuH8okstDcTSmep8FlOxYhf2ZmquSthOnJuyYDnlKPQjYw40DPv9b/lVcTZV2/A6v6XjYAQegW7hjTU+7G2N+aTppRL4HcjKA5L4zRgTM/TMoHgS4UxbydIT8HW/OdmYnYxWlYkY0ZieGsZ6upKRO7PLUI9zYa67azIYdHHTITeRcR2irBxuBywSlti3vRNwh7rjnfcTuiSMcDslk7lKRg6JtoGUT3+ZKttPFqg2O2YAb+Dy4rVa1mH1BC3iR7yy3ud2n5N+DKEXrNWVRzZQxCZWmMD5CBEDuwqGLRSCL4g/QdCNQoS4TwRTN90crkly1RCdS8mEufPP7RpEPEomyhxXM4zV3pI7CsyogqDguu097jo5jVhpfsTz0QkNyM052Xtz6mw/N86dmkc/JlluZ3ceZjeZJORw1clq/KjSGVIYQjP4QJnwqalPZ4bjOOklsJ0AHCj9V4O8gPXNL8/1hAxdrm+z21iGWkimzmQXYctL3tXZJm888VNf045/T/+v0n0LQs5OzNTXKJsW0/LCRq0E/Uobo82JlQjcZrd4n8Sk3gXEEXKoOyr7RagTVK4EPXXmHmUvKKJzYNCfayMbg/EG7/xC86Al1ClgvlA2u6uQ/ctWhvQkHdJjoheHLCEZF3TFP1YsBz12eLrePYE2+XlSQENfbzUxUZNFu4INgDM20u26c= 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)(376014)(1800799024)(921020)(38350700014); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: v9BaBA7JPSt3UpD4mNbBXYZ0qdSI+eP307JoV8iTtYtQSGLqkSU2E4MsUwPE7qe4/XsY0e/Zv9VDcVg3eYENHEMAGUbbiSQtpmlGpT59zUNKeQ8IP2w0f8QhQNJ7eJ6k7RdpXSohTjnf/gJCvur+6JxV8ElMRgERep+hiDJogw8VeAvtlfRTGOUunFMH3FIGjGhagS5r9ctj/FAPh2A1WiNrFtLD371bTafiU+TXSPoa7u0PYh8iI76H33kIh1yvUfps0g5Q9VMO6QGMQ4owtIKfofImbBkkpd0nKvCNa/7cTBCgTcobTVJM0JvNDwR+t0NAOJwgTHj5wFz3MtuHbTRP5TvTc2omqd97Wn9WDfs0z0GnDYYWLwCYu+n61liRAA5HPg0voIyr16MNYbgKaXCOTXiPWOgI3qNnAx5A3NpgECW0H7hN6iwWipKQbVDYJzUdyEaMyGYKqDIP/SY7YSYOGlNTe7xyMirEtXtTjCpDnSrL9JnhHPiE/S8GPMX0uJ3Ef8Mse+Y2cZ6mYandmRJz1gatY5BOMLtBU4TiHzC5VmQ4a+uomOaHuoA1OKAMKkWNlX3xPfE2z4bT/RtqtV6dRimvCEfKv3XZnChPz46dmMTahfTzetSIh0+2G+mz1l/GZ81XjYQlZlU9RkuQ2ctO5FbQ5llP/u13Z3p1CcsjTopjNF0e5H85ja02ZeeQ7hfSzJdvA5RtLpsHw3O3iLIcqP+qIlXBPI1lfN+H6Le4Bybbu40yoOKFg2SRV3Kb5f5dQMNAeZ21/tOF4nCZb1o2OOtmYu4MTpLXjAwgI9Wxiqm6HQTZqWCMT+M6uLSSX8sRlxdpYC0Y7baSS49oNlMSxPxzheWb3dzqR0tK28eykvT/J/yaQnamIYH86AVyfqm9osW6kKwfxUn70aYIFRrQEiIKRfEDXwfTMlLYAcjn5E8YSUHtg/wuAsTbASFGV3RgrmdSPKVRs66TtFkYBjszSfavB02geFyjFLlyg/rIeKbcHdahzSQRA4IcYh1HlijeD9Z3wuUYvT2N7yLVPJhOOTyc8n1O3ANt29qOcZk9TsIJP/UDtGX3VVcdsQfTISLEiWpjcxC5AM3ev0tltim9UG0oCfNqcCbXRGnahEwQHhG8gqRP6Dhq0iaWndInR8Har7R6BYviyg/uxdVRGE5To2Lfwbe/wscyllfsChcNr8r3X6fBrjj8D6C8QIm+r1e97K0MosZREJq7CycztkqY50timavyvLaHKZEKLmmGB9h3oPuLtlSgEuHYgggjR1Rx36s+GCnqkTyB/74UGBEFASynpoxf9Ii3dmZRV16NRxxvjD5G3YISg8LiYrFMkht68LKn9esefm+A2mZatq360YeyEgSpb0md3e+4/KALbggeZH5g8FKoJ6+O/LNfHpK0eLY8hJhhg3U9or9qVZ3lkOzEtspAHPzRDelrcHmMXCIK/18XoUhrc8mio947TU+NIc2Ge05pUQQ5XcSwdYBYUdaUyuc00anC7JDeiQzTHNUjZ5a9ziWV0mXXU5M5H1mq72OHgNmLsTOASFhanfGpSu7ELsiVmwVG/RYhBCmuGb+7iegYFr2hoAPqtoMzWIfAfeaZRWHXiIGJgkSJAg== X-OriginatorOrg: iopsys.eu X-MS-Exchange-CrossTenant-Network-Message-Id: 95d2c7f1-5e2a-469e-b447-08dcd11e24f1 X-MS-Exchange-CrossTenant-AuthSource: GV2PR08MB8121.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 09 Sep 2024 22:24:18.0160 (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: S+S6fgrgfnMbNMpoMQFun8QW9j9LfKDCOzl92Wxc2CrROGU3X3tJjc3q8GJdkUNu57OUotNTv7bwPj7AxlFW0eWnnzAYLucIH9OVYTzRVBI= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DU0PR08MB9935 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 Signed-off-by: Mikhail Kshevetskiy --- drivers/mtd/nand/spi/core.c | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/drivers/mtd/nand/spi/core.c b/drivers/mtd/nand/spi/core.c index b58d9e00907..9629fac3388 100644 --- a/drivers/mtd/nand/spi/core.c +++ b/drivers/mtd/nand/spi/core.c @@ -530,12 +530,12 @@ static int spinand_mtd_read(struct mtd_info *mtd, loff_t from, struct nand_device *nand = mtd_to_nanddev(mtd); unsigned int max_bitflips = 0; struct nand_io_iter iter; - bool enable_ecc = false; + bool disable_ecc = false; bool ecc_failed = false; int ret = 0; - if (ops->mode != MTD_OPS_RAW && spinand->eccinfo.ooblayout) - enable_ecc = true; + if (ops->mode == MTD_OPS_RAW || !spinand->eccinfo.ooblayout) + disable_ecc = true; #ifndef __UBOOT__ mutex_lock(&spinand->lock); @@ -543,15 +543,18 @@ static int spinand_mtd_read(struct mtd_info *mtd, loff_t from, nanddev_io_for_each_page(nand, NAND_PAGE_READ, from, ops, &iter) { schedule(); + if (disable_ecc) + iter.req.mode = MTD_OPS_RAW; + ret = spinand_select_target(spinand, iter.req.pos.target); if (ret) break; - ret = spinand_ecc_enable(spinand, enable_ecc); + ret = spinand_ecc_enable(spinand, !disable_ecc); if (ret) break; - ret = spinand_read_page(spinand, &iter.req, enable_ecc); + ret = spinand_read_page(spinand, &iter.req, !disable_ecc); if (ret < 0 && ret != -EBADMSG) break; @@ -583,11 +586,11 @@ static int spinand_mtd_write(struct mtd_info *mtd, loff_t to, struct spinand_device *spinand = mtd_to_spinand(mtd); struct nand_device *nand = mtd_to_nanddev(mtd); struct nand_io_iter iter; - bool enable_ecc = false; + bool disable_ecc = false; int ret = 0; - if (ops->mode != MTD_OPS_RAW && mtd->ooblayout) - enable_ecc = true; + if (ops->mode == MTD_OPS_RAW || !mtd->ooblayout) + disable_ecc = true; #ifndef __UBOOT__ mutex_lock(&spinand->lock); @@ -595,11 +598,14 @@ static int spinand_mtd_write(struct mtd_info *mtd, loff_t to, nanddev_io_for_each_page(nand, NAND_PAGE_WRITE, to, ops, &iter) { schedule(); + if (disable_ecc) + iter.req.mode = MTD_OPS_RAW; + ret = spinand_select_target(spinand, iter.req.pos.target); if (ret) break; - ret = spinand_ecc_enable(spinand, enable_ecc); + ret = spinand_ecc_enable(spinand, !disable_ecc); if (ret) break; From patchwork Mon Sep 9 22:23:55 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikhail Kshevetskiy X-Patchwork-Id: 1982832 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=W0wiKzma; 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 4X2hHG1xJMz1y1C for ; Tue, 10 Sep 2024 08:25:30 +1000 (AEST) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 1A1D988E73; Tue, 10 Sep 2024 00:24:32 +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="W0wiKzma"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 9852A88E60; Tue, 10 Sep 2024 00:24:30 +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-VI1-obe.outbound.protection.outlook.com (mail-vi1eur05on20715.outbound.protection.outlook.com [IPv6:2a01:111:f403:2613::715]) (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 9C15088E65 for ; Tue, 10 Sep 2024 00:24:28 +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=arcselector10001; d=microsoft.com; cv=none; b=Xhz37nO3Xhur6An1zobvWGf9LSMjy/kVuesImuIyPk88xeuiTGizUn3+bDnbEUA+rbsXzvMrDCBVRU5Jt/pfFkkDDywBZIgr7BI/eUB3/YoztDTw2ksdn3KS9FEzPWSsM8OFQquj30Z/tRI+39DbJZkZWGokx3YT/bKzaIVSo+5Y4AYl91u/vNXfIlfAD54vlHQ2elOjRWl/K2oOHKcxCCY4hWbNGkxY2pQ5Pkz6G7RKnSqe38Yb2y0zgppKiO45Jd2PeGL7y6E89BHYvjlq+UR2ptbZKaRN2gFzzOCwhBU0qaLoisYF6EoxHDp+UBPA4Fe+1pGFkLihyoHpDS83Jg== 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=bHIpUbd1tqYqQ+cvO4iqyoaIM/DkUZef+50hZighZbo=; b=TzrLcDwVvCasNKhKcQ36v7FfrrcZAq+9BmAYr/bie/JrEthNxNEir5PP92Iv+7jMOYzabVS6As5+pFEzdlihQMJIQlPtwLiWMXdCX2WQwxoHePajxYp5B37u+vDq/fS+3fcYpmq3a9JCx/lUn90wNevo3rYB7JACNgJnLxWO3srNPHXA8wpo3wKVXFxpqdKOVSo5TifT3K1e3I4VLNois5NNCGJO/2sJpmf/zzBB/6xHqk6fKIRe/C7OvjbLvxwp37bNvB/WIADJ6pctQlpnlO/pGwtRkN5XvwopWf7yeibbUgl2OPW9aPLnhwrxD22up+h66yB1t+/gVJ/APNjXvw== 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=bHIpUbd1tqYqQ+cvO4iqyoaIM/DkUZef+50hZighZbo=; b=W0wiKzmakv+Glv7cC6wsFCHR+LSZgbHBMGhhgrciBcl4lxsbyGLVQcGhzOhQrs8cbs/AakR8C8x5y/ygZMf1dfxp/I75ztd4I8HHtDmkTVGmfyFHIZmn4lMeYiUCt+ax3iZZqtL4HLOJF0UIeyL/P47/QCsLmOxAVHAYwpKIW1+PjzoPD0szF12crgORoWJavQtVR9RlkzPGqmy8ZgZMKNTVwi3Q3gsnl/uhoXHfSEdxwGi5PPvpwC8n7cEqPBWyLCRGMHGdj1+mXbpgHyFxtX5xRaA9ihxZkGR6wNH8bemwrWp/MRupWPLLTZxd0zu06Fce1HiMDuq4Y8umpr1ElQ== 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 DU0PR08MB9935.eurprd08.prod.outlook.com (2603:10a6:10:401::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7962.15; Mon, 9 Sep 2024 22:24:19 +0000 Received: from GV2PR08MB8121.eurprd08.prod.outlook.com ([fe80::4cd3:da80:2532:daa0]) by GV2PR08MB8121.eurprd08.prod.outlook.com ([fe80::4cd3:da80:2532:daa0%2]) with mapi id 15.20.7962.014; Mon, 9 Sep 2024 22:24:19 +0000 From: Mikhail Kshevetskiy To: Tom Rini , Dario Binacchi , Michael Trimarchi , Frieder Schrempf , Jagan Teki , Simon Glass , William Zhang , Mikhail Kshevetskiy , Igor Prusov , Dmitry Rokosov , Bruce Suen , Alexey Romanov , Martin Kurbanov , Chuanhong Guo , Miquel Raynal , Max Krummenacher , Francesco Dolcini , u-boot@lists.denx.de Subject: [RESEND PATCH v4 07/10] mtd: spinand: minor refactoring Date: Tue, 10 Sep 2024 01:23:55 +0300 Message-ID: <20240909222401.2562898-8-mikhail.kshevetskiy@iopsys.eu> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240909222401.2562898-1-mikhail.kshevetskiy@iopsys.eu> References: <20240909222401.2562898-1-mikhail.kshevetskiy@iopsys.eu> X-ClientProxiedBy: FR3P281CA0096.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:a1::8) To GV2PR08MB8121.eurprd08.prod.outlook.com (2603:10a6:150:7d::22) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: GV2PR08MB8121:EE_|DU0PR08MB9935:EE_ X-MS-Office365-Filtering-Correlation-Id: a0b9f937-421e-44b2-d2a2-08dcd11e25de X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|366016|52116014|7416014|376014|1800799024|921020|38350700014; X-Microsoft-Antispam-Message-Info: ifeHRrVvWSaosked/8IKsFz8HI/68DGW/IeYlRovFwxMUHhkAiHiFytIaYOU4MzMjgOZGwoXSmJR0FTgcNTC3abSC6UbwbesUeweOapG3qJydRyyqcCJB/klWIZsdjzAQelVxb+QGB82HFcB5VsTssQVDDynBToZHqMWrwqPKY+CmhEk2YyfTWYG9vJWSRW+TvxvfOUFfnjExzaJZQ7Z46+0ooQhdfkVj8EuNB0fW4HNN1TUkuTPNO1pXt0giieWciTQjxI6dZeLkkN29GqcSkJs8SDkk7UulxaGPLexWhy/fPf86ad24yN9+NqpXcBfNV+NOo7DxDl0rcuwVi9R8qzFofW5A/wlzF40FSAAUybMgj+5DZxRf4H57z2VcYTg3DFLPlhY/R5sBcO2A4WswpWJ6lEfjlvae8ynEtD5i8f/sfc5HIf712jjG7fC2h//8ew+wqI8LbaTjwpfY98V2RRRkZWbqOSkbYuQytcViePQO5YLzn3FODrf99GKMSCU+enzNtcYb05AEypibri9g+g+dAlkO1ziSYp1pIgCSG8XpCpCVaMkYA1pKaVeEgLhyWyHAl8WTVcZkg3IOwsHrE5LCmFU+vFjbWCY0m/I7WYa+j8XUnLt9Htj8QZxuLeP7N7ocBeo5v+oeyH2R7AONDn7nh4PpIUiHWRLPbD2aOVd+J+PqsbtwjyqcJrQjnt0UnnQgALcu1Z7oXTi/pURody94p0wbx0hpaxthFl32JGxY05bGy9FlPTzZNByu+/cNKB+fdWJ71q4Sfdd189LqTrBpLsVVwcyZ/KcJgiFgVtLsra3PdacuG7e94iGe5DWZzQQ1pCNkytAm9xgAJzOKt5d1czwEj8/EpSAIVnLFHGVkT7DOjWpqXG+kGVU7hNrKpAnRiTeq3S5PetekXEGiY1hF/8CdwgZ5viaP2aBTO/xQ3kiZX4nRIa44YxR5RHqTQNwzYX/91HSpRCWuRMK2Bt0skd5FtyGQa05OG6/kJEXAATanUOKZ4ChJ3VgyKL8faII3dlb5MAPrkEAxHwnfTEdaTY/XcX2xMcUYrJLqGvayCx2/+QhvSsMDuVrySnJkdN9xuukVgEHBIPV6KVo9xp+0xYmUcwYX2ojduyil3lBjOs5KQJ3ezyDsDcw3zULNWfDfjOpxZJxXg1wMEj+ZfTnytAo8Ji8ekyW9jDAs3fHcbkxZ4ha+LVTlfwILnHdTjoC6sk8Ty7S4VSOFFeh7AT31Q3ndYWZWTMkltZPt8Urth4QGr5zShkL+b1K+jDmG8n5d+hmFs+7MZ6C/rge442PWgd8QEgbkNf0fFg/PBHuJw8CMHUB0W5bf1Loof2DvGu3hvEMiJdDdM/q2D8HrZWS5rpNB2gZfx50+atV8W+azwWVrVB4lUOblHMCbypnv+9gVvOpJvBG0jEhlCfeNcVbiV+9yXhfwt1sHbNpLpY= 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)(376014)(1800799024)(921020)(38350700014); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: L3hDUekKzkt9xk+jYkD8Adl1iuAa820F96dx97dSmjuyKGCIJPU/G+1sLN8foOAuIZiPzQ1TJbL17Iv27uNnUa7CGwL1xHaRaIRW5gY8IINFReh//c4zB8h2t5PKgUYtsgXxkAG9iZc9wkDjhkiSHEbjMc5W+CsrwGbRbtPidLT0UrG4bYpQmFqnU31tuDoIwTUR9AVvfQjv/oF7ZPBlHXn0pRvwzMLuePI3Okyryk/Pj8f/AWQwHaJfqvm/Uu9/2TKdE0RuPLMUIPK06FpXj5O/SKAM9T1CDkhylrm71rqnGDRp1xiVFBqVXPfpGjb65kakwSEIstP1qCcvZL30QoF8H5jFVrTW/ZnSsyaD+Yhy+d0P3FU9a7dd7bfg26untikutAQTVsjsiofuh6TY+/CKBvX5lNtitwvi/tS04Q6JsmupRZXouT1Bf73kYAchD9FAM6zMN9L0eSMNYG5AULUYMzzTO3FUb9kkw55BVoNZgrg0iuO4rwTNXtU832lXU9DEZeFVvov5Laq8T83XLu8Kr/sNhILR+VY07s+2nFWE7rT056oVVOajS9RECzWuX/0zYeE+BbIbbODjNsRShZ7EajrkaPYW6kWIqlFWyJW5OipoQ5YrGv6CANmZOSPSjhAKhSZA5CHOJg7atnQcnZH4p8fsctM6qWlh+xshTXomacz6WQrjJMBwyI1tVIq19IsGMKpOVTARkwS+IMNeP9KayDxUG/yX48KxZ/5iM4NxhbMRPCZ+ULzWmIZWkXglaeO4bV5kQrSvzKy3v97V3gQiqznge/u9YlHSG1mHf7EScViRmEjL7INBCRQMnr+AKi9zcsz9QtBBjqKdbwgdB9YIQgYipxr6cBNLdiXyqMkgMXvBJ4UMHEZa+jqGXIAPR5fK4Bycq54Ke/AjQ6BgcO0lR3Z2J5KAykegA/KZ8KpTNlo3kNY7k51h3qhp25zvxlwTo8DyqHrjH5t4fzt2Bx9vK05sjPjDj1rJDDgsrR8os94e3XXdo373ML6FTMq+cmcetJB+SC+67TEZ0//HVFingghYcgb6+H2hDUg5eTG/KHo+CO5o+glVwMOc6VycGJu6JIF54bLwAEJCzZKSag0oVxs6K/mqcNgS08IHWeZ/RsM7f3Cv2R4XE9NTTkLQqLC44RkKHmfyRZDA6yCafVigN9IocFgfsyd4azho5lVF3ymSBCQlLrenf0/2uqhC9xtLOT81nwSsH+y1wdproQrrx6IP/MnnXevAH4BBBHjPu7qHf6u2BvedadlsV+BwH8vpbMQTckAROLHa127pYqwHckM+PkR0O8nYGQxzl90gvFPwsVzqrGltHCXUitiMglkY7nlDt3XwBrQO8VohqS+DsEnYKFrEGXJUwRqAIFkFDDL6wN0o0UeOmEZQtFeQ8WKJXZRNddeYvrMrBmogPZeYdGvLbxs9YqwqWacXFAENG0TvsGk/LNFPFAYM12ngOtXq1wJciE2OpKgUs9wPD/QCiaWyCF6svT8icCUftPT6VKSZ2YuNUYSxGe9aftt4GgTFUycXkS8Mg6ijlsuWuuEC6toO/HiCHaM6JH2Zx2Dyj8wvMu3PNKr83fzW4qP9/xXUol1p6irT9twcVNCPzA== X-OriginatorOrg: iopsys.eu X-MS-Exchange-CrossTenant-Network-Message-Id: a0b9f937-421e-44b2-d2a2-08dcd11e25de X-MS-Exchange-CrossTenant-AuthSource: GV2PR08MB8121.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 09 Sep 2024 22:24:19.5905 (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: 6G5MkkMPs9fiP9J3Ly7upp37SS6/91YyLMRVMX91oYI1MIuUn5rfOLCjtuEOE0bZB6wLfbh6T4aPot8YvD4XeKxinS7I/q+Ht5y19OTS9rQ= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DU0PR08MB9935 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 No functional changes, just some refactoring to match better linux kernel driver. changes: * move spinand configuration reading out from spinand_init_cfg_cache() to separate function spinand_read_cfg() * move spinand flash initialization to separate function spinand_init_flash() * move direct mapping initialization to the end of spinand_init() Signed-off-by: Mikhail Kshevetskiy --- drivers/mtd/nand/spi/core.c | 112 ++++++++++++++++++++++-------------- 1 file changed, 70 insertions(+), 42 deletions(-) diff --git a/drivers/mtd/nand/spi/core.c b/drivers/mtd/nand/spi/core.c index 9629fac3388..6ca8b7c80cc 100644 --- a/drivers/mtd/nand/spi/core.c +++ b/drivers/mtd/nand/spi/core.c @@ -160,20 +160,12 @@ int spinand_select_target(struct spinand_device *spinand, unsigned int target) return 0; } -static int spinand_init_cfg_cache(struct spinand_device *spinand) +static int spinand_read_cfg(struct spinand_device *spinand) { struct nand_device *nand = spinand_to_nand(spinand); - struct udevice *dev = spinand->slave->dev; unsigned int target; int ret; - spinand->cfg_cache = devm_kzalloc(dev, - sizeof(*spinand->cfg_cache) * - nand->memorg.ntargets, - GFP_KERNEL); - if (!spinand->cfg_cache) - return -ENOMEM; - for (target = 0; target < nand->memorg.ntargets; target++) { ret = spinand_select_target(spinand, target); if (ret) @@ -192,6 +184,21 @@ static int spinand_init_cfg_cache(struct spinand_device *spinand) return 0; } +static int spinand_init_cfg_cache(struct spinand_device *spinand) +{ + struct nand_device *nand = spinand_to_nand(spinand); + struct udevice *dev = spinand->slave->dev; + + spinand->cfg_cache = devm_kcalloc(dev, + nand->memorg.ntargets, + sizeof(*spinand->cfg_cache), + GFP_KERNEL); + if (!spinand->cfg_cache) + return -ENOMEM; + + return 0; +} + static int spinand_init_quad_enable(struct spinand_device *spinand) { bool enable = false; @@ -1073,11 +1080,55 @@ static const struct mtd_ooblayout_ops spinand_noecc_ooblayout = { .rfree = spinand_noecc_ooblayout_free, }; +static int spinand_init_flash(struct spinand_device *spinand) +{ + struct udevice *dev = spinand->slave->dev; + struct nand_device *nand = spinand_to_nand(spinand); + int ret, i; + + ret = spinand_read_cfg(spinand); + if (ret) + return ret; + + ret = spinand_init_quad_enable(spinand); + if (ret) + return ret; + + ret = spinand_upd_cfg(spinand, CFG_OTP_ENABLE, 0); + if (ret) + return ret; + + ret = spinand_manufacturer_init(spinand); + if (ret) { + dev_err(dev, + "Failed to initialize the SPI NAND chip (err = %d)\n", + ret); + return ret; + } + + /* After power up, all blocks are locked, so unlock them here. */ + for (i = 0; i < nand->memorg.ntargets; i++) { + ret = spinand_select_target(spinand, i); + if (ret) + break; + + ret = spinand_lock_block(spinand, BL_ALL_UNLOCKED); + if (ret) + break; + } + + if (ret) + spinand_manufacturer_cleanup(spinand); + + return ret; +} + static int spinand_init(struct spinand_device *spinand) { + struct udevice *dev = spinand->slave->dev; struct mtd_info *mtd = spinand_to_mtd(spinand); struct nand_device *nand = mtd_to_nanddev(mtd); - int ret, i; + int ret; /* * We need a scratch buffer because the spi_mem interface requires that @@ -1110,41 +1161,10 @@ static int spinand_init(struct spinand_device *spinand) if (ret) goto err_free_bufs; - ret = spinand_init_quad_enable(spinand); + ret = spinand_init_flash(spinand); if (ret) goto err_free_bufs; - ret = spinand_upd_cfg(spinand, CFG_OTP_ENABLE, 0); - if (ret) - goto err_free_bufs; - - ret = spinand_manufacturer_init(spinand); - if (ret) { - dev_err(spinand->slave->dev, - "Failed to initialize the SPI NAND chip (err = %d)\n", - ret); - goto err_free_bufs; - } - - ret = spinand_create_dirmaps(spinand); - if (ret) { - dev_err(spinand->slave->dev, - "Failed to create direct mappings for read/write operations (err = %d)\n", - ret); - goto err_manuf_cleanup; - } - - /* After power up, all blocks are locked, so unlock them here. */ - for (i = 0; i < nand->memorg.ntargets; i++) { - ret = spinand_select_target(spinand, i); - if (ret) - goto err_manuf_cleanup; - - ret = spinand_lock_block(spinand, BL_ALL_UNLOCKED); - if (ret) - goto err_manuf_cleanup; - } - ret = nanddev_init(nand, &spinand_ops, THIS_MODULE); if (ret) goto err_manuf_cleanup; @@ -1171,6 +1191,14 @@ static int spinand_init(struct spinand_device *spinand) mtd->oobavail = ret; + ret = spinand_create_dirmaps(spinand); + if (ret) { + dev_err(dev, + "Failed to create direct mappings for read/write operations (err = %d)\n", + ret); + goto err_cleanup_nanddev; + } + return 0; err_cleanup_nanddev: From patchwork Mon Sep 9 22:23:56 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikhail Kshevetskiy X-Patchwork-Id: 1982833 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=okL1zqQg; 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 4X2hHS1L1sz1y1C for ; Tue, 10 Sep 2024 08:25:40 +1000 (AEST) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 7B27188E79; Tue, 10 Sep 2024 00:24:32 +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="okL1zqQg"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id BA42A88E72; Tue, 10 Sep 2024 00:24:30 +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-VI1-obe.outbound.protection.outlook.com (mail-vi1eur05on20715.outbound.protection.outlook.com [IPv6:2a01:111:f403:2613::715]) (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 C141288E6B for ; Tue, 10 Sep 2024 00:24:28 +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=arcselector10001; d=microsoft.com; cv=none; b=R3wrttQaGk20cEg+nXPcGzwpj6c4gRPUAm7WbNSBwDwk0lXjjisyC9lWkg/AwG7xqJjNwp6tR2GfLkiETC3sNdZDeIBKsQX/yX+6mg2ICOvPDJ5tt7yH/XWVlOjVnfkpJKPledSXGK2q6qZLKvLmiS9p6+pAR69Y3W6YJaXg1z5ObKWwhx3yb8izsjp/MYQ5tdsKmeae9ibFvyvTku7wpqIY4iF3SAlt5wmVjCOx6RU+zuXFjNYu1YYcgDK60ULxbM550mtgZ6eB0D5NrNKwRwgak/fVD/pnaPVRDTozP94jz2HAPtmlSObmJNDd0XXRgF7MyHXezwHGOuDHn09Djw== 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=l/6p9hFb4G9HBd9BBmwi2nVPzvtan2Glp8fZHCixB3k=; b=FfrtVmgxMf2UAzLDXsfuF2tRSauCYfhOwLmnv3by+vZ/FA7lhOW2KTgssy1wRJ05dpqJLQA/e6y47+Ix6UupDhJLxJi6bh2RKZKHiFVk0k6E+fNj2qjmEHasyOBfCzRXGRcGvt4hbE4oTa1bb2uHgRzE/5EoW1TRfXsF4J7owYTtUca2A/lv7QAUe2PHZUDIzW5nr+l3F87JIjYONF/9FxswYyr5RygNmhazrHdFcZg38UKR3VAQk3mxflrbEElkateUyCeur0T63/EOFawGfCCkaeDJoubnsUtC5wB6xTDmVv6WIRWDxnLtq3p5+apd/FHYA/sQWvkThCHDY8lu7A== 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=l/6p9hFb4G9HBd9BBmwi2nVPzvtan2Glp8fZHCixB3k=; b=okL1zqQgQimD1Uaps8StaKLLUox7reWC37BFWyES3mTRbZdlv6VBPJs8pb2HkqSBvLPzoBxwrzepTooS//ivBnGHTZPjE2mTuBGhDNArYp35n3ndVg7gbov3i3JD+YSYNE7kxRjM8bbhY1fWvscPC1B+1gYiShZExlp30nsdskiaUtJZGmWhUVgUH0/sTycL0KD3D8/G+Q0W03RlE5esOtXNfsnmRwYhdQLCeBRCMl3v82GsFzCeIQy+geubCEJxM4wHE2VVb3rDM7YpjszKc+JbilCoNxny574we0E6skTUGnSp23Wqz09jwB0WysIArxeVNKoPA0fMlD5uPWBkQA== 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 DU0PR08MB9935.eurprd08.prod.outlook.com (2603:10a6:10:401::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7962.15; Mon, 9 Sep 2024 22:24:21 +0000 Received: from GV2PR08MB8121.eurprd08.prod.outlook.com ([fe80::4cd3:da80:2532:daa0]) by GV2PR08MB8121.eurprd08.prod.outlook.com ([fe80::4cd3:da80:2532:daa0%2]) with mapi id 15.20.7962.014; Mon, 9 Sep 2024 22:24:21 +0000 From: Mikhail Kshevetskiy To: Tom Rini , Dario Binacchi , Michael Trimarchi , Frieder Schrempf , Jagan Teki , Simon Glass , William Zhang , Mikhail Kshevetskiy , Igor Prusov , Dmitry Rokosov , Bruce Suen , Alexey Romanov , Martin Kurbanov , Chuanhong Guo , Miquel Raynal , Max Krummenacher , Francesco Dolcini , u-boot@lists.denx.de Subject: [RESEND PATCH v4 08/10] mtd: spinand: more refactoring Date: Tue, 10 Sep 2024 01:23:56 +0300 Message-ID: <20240909222401.2562898-9-mikhail.kshevetskiy@iopsys.eu> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240909222401.2562898-1-mikhail.kshevetskiy@iopsys.eu> References: <20240909222401.2562898-1-mikhail.kshevetskiy@iopsys.eu> X-ClientProxiedBy: FR3P281CA0096.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:a1::8) To GV2PR08MB8121.eurprd08.prod.outlook.com (2603:10a6:150:7d::22) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: GV2PR08MB8121:EE_|DU0PR08MB9935:EE_ X-MS-Office365-Filtering-Correlation-Id: 671ec612-bd22-4d33-7950-08dcd11e26c1 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|366016|52116014|7416014|376014|1800799024|921020|38350700014; X-Microsoft-Antispam-Message-Info: qBRH1Vg2BnRqzneXwmIuIhNOm1YEHoJgnQ7QdWxz9g0ivaKMVy7WXhbrn+vcjSS8ZOkpVgHW6pJfVMwuK9XIqNe0InG3VigTlMZU7EqIjLbIARWTCrbvshXAT+lbcL+Iydc1SWz1R+FKMHxnyWt3Z2s4LCsJtiiAqzIBfm4fE5FMTpKFWMc45GXe09g81c6iqJ8cqUpWI0P1E1uapupnFD/eTCV7KyAIC1psuLHxCpemnssm9Ka0P+BaexbinCe2JLmZXAiBfewZfPs2flu/e7aaHSh8gw4ENoRtAAWnY4OsIvPrSi1dvMxI8w8JTaVCoSXLuaSdHB2+bSoufqLHFCdYwa+ciErOrFKw9Ajd2NhFvmpbwNwVUsCwm3p59adnh5EPKFOgWup4X7MB4NzQpen+8Vwa/1+FRe/eeFIUS9Kohufo0QdIt3FYbL0qmvZToWK9wGGmNQxK2rv0ZNmrnyyhJShsBa9PYcLSgnMh5brXVQ8fqay/DH9+j/sSd+1dynIrXigvvAHlg++gDOTIzF37P/44hiH2aVHoHw3F4q9TlKjs7gVJlrpk5AH08BBiHN3OUS49CbKW9ddZ74a+mFswgpkxAGLRNlyXS/swZ10CkXpbDIyP8NYepdGm4Ckx2/UbWo7dN5t+tGQ9aBszeW7LnZJFNI9HcvAmMPpg6q9DVPB0RAJr6sWA84iVwkQiB219d/f7NpnbL+UtVaQPcQRzwZNug8a7iD0vhnYW3n4g5bUHMQu1+mHmiw6a6XoW7/1VLUKo4jSCe+ApTvtoAOMYW/fFX3okc0c3w/VdpJeboFLt44vLtHmwCZ5GrJDjTRFq1ty++EjrRfursjB8AE26inxyM+3oJzPJjHtKJ36caSt1z0BCQnU4DPFbvizTDhspweAuoL1q4iKejNBFCJ0SdqIuA6fK6HhJW+sMs3TZS32u/Sn+ecN/XCj4Tu6jPlXmpRKojyt+xjai2Ive11OvDVZAZuRnzcffR0bYGOV2o30aWFPQJGRjQJRbELtRlUTL+tKSJfluAlJFNm39KgYq7t8KKQnzRCGiXXz3vGR3vtzVR6fqs0RDADpepx15W/Mv6NSiaOBGm6mdSS0B3WJ4LK+jlDWsMS7K7P2fiUZBJBqkrkxJzJsvCwdis++gO7YYtJrZqllDigsptKUC2H4TOVcxT6JNnScTzV3ckUzTZ84psHl98NhztVADG2/PopYU6wXfkKA+eWl1vdbXotYiO6agzWbTY6ruKa8qtyR+zHtfXe+kxyA4dqB6x5JcU5Hlp/+ZfsIxBSsxp0ZpKzuGKPFEo8Wb5wSlL758pYNIR+OTWHl7mj4wxH0le7DSPkRG9xuxd7Vc7WbaG4DXH1F7Assu2bTV9BNwQCmsv3XVawoOg0xExkEZnw9O3H3m0JTj7/qU02Oaujw8PrkcWYHC47yGA4PBsJL0EEyFK+c= 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)(376014)(1800799024)(921020)(38350700014); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: LYP5ezJwdj4lZRi6AEwX4OUkg/LPPLJF4bCFt9rXZxHQkPzYGoapDmLxcq4RovzWVKWjLmkXg7g8RMpH8saibQClIXji1/pS+R9fpDPOEeKsJJoGEiIKBJiJ2irlHPB0Dp51tEN1fL6MBAZq6RMS8EX1mwBDdARUQJJDNxvnizfCzBRdgr3/rj6uTldErWqxJ4uchRcjdSLxrVi15wJ9wm+dK7/w6mQCZehet9Z5+AkF3dK9YdLYEhXCQWTZE9z9i++LcMEg5v7cByINhDoADMMd0iuUfzYEZl/qwgEu9x5GGBKalfggpKcvqBMn9MvxpCnwQe/pKa1Q/gq0Vpgk60DnTBDOTp647DI77Rylw8XaCyP/IWHc7yovfmmZPasLmJtGSOf8QL8mFljOolP+bgwDF1avoz/AcKB18IafQ4qhkx+Vy/+Mph6qP5hKkenFd3no7LCzj1LhEszpqTDgo1CszwX2VaZWubbK0fi9usRZfkXVYBGpeM4ZF3dj1yjTVA5jLRby0f2cofjjMD0WHfFgFiaFNoF5pbwv+zL/E9/nw87eHflaIk8n6NeAZf+ii7s6XsRyFdGKOMWbMcoegwadvOiDDvF3nHmFlgmMME1uNiIhhRZcFAPlCxQE6/SMcOCxMau4CNMMYRKoholLnMz498qbvJBeG/8xZBNMsOsoxdQhjyO9pjztFeyWepw1AUSD44eYKdCigRy8gJapFs+5mN6VJRoEt662ZG2oSHoWrAvX5+T1J0ndwwXNHGsGPCMqLrKw4iSV1uoJDOiWrIuXS7IB6QwotNXso3QRmh3FzAjcdzhVUG/Lpud3L5+93uMKh6WFnXXon4I4s87WtzOspXarNoJHJoNX2P74OnnY/AMbYg+C8lXqqavPE7v4M8UpiWSI5Ndnqx2DKsxq8Vb3zFamx/goUgXoziRhtv5EBnKAxAq1wJSb+wKKcEdh/3ifEdfy2DAssHJ5itx2LuOpb3Qda1aiKzzZKpL0zd1V0lv4amDqF54T4gpRhus6UD5Ln77biMwEsPwKB8pEWW2FxwnELvQjO1tWlIw2OqMbmxEobkDPWIfXEKue6hEUeiXG3vERVqt+alJmI9jDr1Jdmmc15kIPF5larwwAM1Mf7Tx/LNOa8muSUz3/tbZJw6pr3N4a7bIAsSgNR74MYlhR5JsiapGiY9TWOMyIknFwKcytjp2xLHrFnskKrhx1VnmhwoWOVn0itWdN4W5gWq/XzGiCBWIzbk5mN4osHvwr1aARd4ZH9jpBcPmVmVtY/2aRsP9j9B0eRSVRcWFimlLnihOJvTUQRueLW/GTXdxzaamF8bftZ9aj7ddghnCke29onTLwgJ/PzT9NgnxRWfPiJqjpWlw0lFXiEckrSvtvJHCmoeKbyy1sl8aaVlNzrsz+BWiESnFl1rK0OMSHv75/oQZESXx1tENc4U6mo2lsI4UihAbkzqbjNaYxSvy6JZYzqLTgKc0z1Ez7hP7Uz5OQrEjkaLOaMVIwB7umPrYDjdotQ96sH0+BXWBYRODW2LkSaLUsexmMoTPawFym75l5i098wvlQws3VizPM5b0/+QUOQ1ZJ3ZbiTr0M58qb3nbxO/4qAcZ6t0n+9YS5Pg== X-OriginatorOrg: iopsys.eu X-MS-Exchange-CrossTenant-Network-Message-Id: 671ec612-bd22-4d33-7950-08dcd11e26c1 X-MS-Exchange-CrossTenant-AuthSource: GV2PR08MB8121.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 09 Sep 2024 22:24:21.0527 (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: 8befdStkEWTFPbxF7lCjqS1Ya5fryqs7fwFsEovMcOhiZeJ1ClnzsbQjyllZOfTXuqkLQ8N2jKO8QevwRSS0G/sTbh6Qc9ByrBls9uqyod8= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DU0PR08MB9935 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 changes: * Move spinand_check_ecc_status(), spinand_noecc_ooblayout_ecc(), spinand_noecc_ooblayout_free() and spinand_noecc_ooblayout close to each other. * some code formatting * remove comments not present in linux driver This make code more close to linux-6.10 kernel driver Signed-off-by: Mikhail Kshevetskiy --- drivers/mtd/nand/spi/core.c | 115 +++++++++++++++++------------------- 1 file changed, 55 insertions(+), 60 deletions(-) diff --git a/drivers/mtd/nand/spi/core.c b/drivers/mtd/nand/spi/core.c index 6ca8b7c80cc..548a7144ee3 100644 --- a/drivers/mtd/nand/spi/core.c +++ b/drivers/mtd/nand/spi/core.c @@ -222,6 +222,59 @@ static int spinand_ecc_enable(struct spinand_device *spinand, enable ? CFG_ECC_ENABLE : 0); } +static int spinand_check_ecc_status(struct spinand_device *spinand, u8 status) +{ + struct nand_device *nand = spinand_to_nand(spinand); + + if (spinand->eccinfo.get_status) + return spinand->eccinfo.get_status(spinand, status); + + switch (status & STATUS_ECC_MASK) { + case STATUS_ECC_NO_BITFLIPS: + return 0; + + case STATUS_ECC_HAS_BITFLIPS: + /* + * We have no way to know exactly how many bitflips have been + * fixed, so let's return the maximum possible value so that + * wear-leveling layers move the data immediately. + */ + return nand->eccreq.strength; + + case STATUS_ECC_UNCOR_ERROR: + return -EBADMSG; + + default: + break; + } + + return -EINVAL; +} + +static int spinand_noecc_ooblayout_ecc(struct mtd_info *mtd, int section, + struct mtd_oob_region *region) +{ + return -ERANGE; +} + +static int spinand_noecc_ooblayout_free(struct mtd_info *mtd, int section, + struct mtd_oob_region *region) +{ + if (section) + return -ERANGE; + + /* Reserve 2 bytes for the BBM. */ + region->offset = 2; + region->length = 62; + + return 0; +} + +static const struct mtd_ooblayout_ops spinand_noecc_ooblayout = { + .ecc = spinand_noecc_ooblayout_ecc, + .rfree = spinand_noecc_ooblayout_free, +}; + static int spinand_write_enable_op(struct spinand_device *spinand) { struct spi_mem_op op = SPINAND_WR_EN_DIS_OP(true); @@ -413,9 +466,8 @@ out: static int spinand_read_id_op(struct spinand_device *spinand, u8 naddr, u8 ndummy, u8 *buf) { - struct spi_mem_op op = SPINAND_READID_OP(naddr, ndummy, - spinand->scratchbuf, - SPINAND_MAX_ID_LEN); + struct spi_mem_op op = SPINAND_READID_OP( + naddr, ndummy, spinand->scratchbuf, SPINAND_MAX_ID_LEN); int ret; ret = spi_mem_exec_op(spinand->slave, &op); @@ -445,35 +497,6 @@ static int spinand_lock_block(struct spinand_device *spinand, u8 lock) return spinand_write_reg_op(spinand, REG_BLOCK_LOCK, lock); } -static int spinand_check_ecc_status(struct spinand_device *spinand, u8 status) -{ - struct nand_device *nand = spinand_to_nand(spinand); - - if (spinand->eccinfo.get_status) - return spinand->eccinfo.get_status(spinand, status); - - switch (status & STATUS_ECC_MASK) { - case STATUS_ECC_NO_BITFLIPS: - return 0; - - case STATUS_ECC_HAS_BITFLIPS: - /* - * We have no way to know exactly how many bitflips have been - * fixed, so let's return the maximum possible value so that - * wear-leveling layers move the data immediately. - */ - return nand->eccreq.strength; - - case STATUS_ECC_UNCOR_ERROR: - return -EBADMSG; - - default: - break; - } - - return -EINVAL; -} - static int spinand_read_page(struct spinand_device *spinand, const struct nand_page_io_req *req, bool ecc_enabled) @@ -1056,30 +1079,6 @@ static int spinand_detect(struct spinand_device *spinand) return 0; } -static int spinand_noecc_ooblayout_ecc(struct mtd_info *mtd, int section, - struct mtd_oob_region *region) -{ - return -ERANGE; -} - -static int spinand_noecc_ooblayout_free(struct mtd_info *mtd, int section, - struct mtd_oob_region *region) -{ - if (section) - return -ERANGE; - - /* Reserve 2 bytes for the BBM. */ - region->offset = 2; - region->length = 62; - - return 0; -} - -static const struct mtd_ooblayout_ops spinand_noecc_ooblayout = { - .ecc = spinand_noecc_ooblayout_ecc, - .rfree = spinand_noecc_ooblayout_free, -}; - static int spinand_init_flash(struct spinand_device *spinand) { struct udevice *dev = spinand->slave->dev; @@ -1169,10 +1168,6 @@ static int spinand_init(struct spinand_device *spinand) if (ret) goto err_manuf_cleanup; - /* - * Right now, we don't support ECC, so let the whole oob - * area is available for user. - */ mtd->_read_oob = spinand_mtd_read; mtd->_write_oob = spinand_mtd_write; mtd->_block_isbad = spinand_mtd_block_isbad; From patchwork Mon Sep 9 22:23:57 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikhail Kshevetskiy X-Patchwork-Id: 1982834 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=OvsQD0z2; 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 4X2hHf2JKGz1y1C for ; Tue, 10 Sep 2024 08:25:50 +1000 (AEST) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 2BA5088E5D; Tue, 10 Sep 2024 00:24:35 +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="OvsQD0z2"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 7AE1888E73; Tue, 10 Sep 2024 00:24:31 +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-VI1-obe.outbound.protection.outlook.com (mail-vi1eur05on20715.outbound.protection.outlook.com [IPv6:2a01:111:f403:2613::715]) (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 E5BE288E6A for ; Tue, 10 Sep 2024 00:24:28 +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=arcselector10001; d=microsoft.com; cv=none; b=T/Cv0wCY4dp/hZaz8ayD+2S2ys7B38yqZNM5/0RyVlxquGq6aNmUH7Ch1ejjfOUtfYiG/oZ7K/B64/eN5rRbeg6DkfHxLR0ku9RWfbYzy1u3GFiY7NyhaFTMlSF8s6A30s56/2e8pLhUJqBZogtvfw/5X7g9OjYh/Bzq08MGveYW6UHigdY5kacbqP6MYpk3QuYM56kV3e6lgtiwvDSa538jAXeHHfasVl4jdIwaS5qdVIDSnM+sjiYQIcY0+t0bd9PX4Foh6mAWGUOlCTX0QQUBelVvUA1l8Yz0Xx4C31+XnpUOWNuYhtkKgpJFIBjEjYINykyMitGSx8kxe841Vw== 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=9FVKMCs7g8msQQCy2l/Ny47c+XR4Rl1ZvMK36YZTPu8=; b=HMwdrU/bStcWbOUMA0dlMiQHLQcLBo4NLaw2VDBx0zjBkPLXqVRTQIYiMCZQzFWNofPGnL9UqzecJ0C5tTYvWie9kjJGhP0VpgeNqE56PU9Kh02Bx5vwbTAw1NXckwrQG2ohfeuYl5wISGt9/jqtSuOBkmi0uNl8ErwHxXps7d1EJXWTCOwTr2M474WMLS4A1cySCfhX4t4yjqguley+LkAMXE48AECVNWyI3ziYxH1BdiONa+iaPEtoK+TPr2WQnns4+dJkDL9jGRYdDDiFXmMZW8XGSc5W9D2Lt5WujTlHLlmYOEdsJ46iU0XHNaPxvzNH4JtjPj8XPZxeQR+X5g== 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=9FVKMCs7g8msQQCy2l/Ny47c+XR4Rl1ZvMK36YZTPu8=; b=OvsQD0z2/tHZnkKe7OtSqd5H5dHX1fJg8OGmJebSjoOF8IIZMjGrdXeNzn3G5IbLpUx6AFVOC3qCNlwqyqlzBuHN1Uw+JvRUHqcQK4qlu3VTTfFFIsETXRiR7SGmBTWK0t1PSDjMXec8nK5Kx0MDs+A5lFQbCkxE0xvMJX5tAEAT0xuWOYdIPKmlJg/N5odsN8AIExABImhy1aRBiKjvK1hPGTCKsBrMtPf8gxfn9gc/CySfkBAV1/aWF25ktFdEjJhW8chObPOYejoZGDo3nBBg1/KgoCUWCSmjwe2/s8rwA1fGUty7uJrhcAIyw+AzWRQiTmo1jdB9UEohPoPlmA== 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 DU0PR08MB9935.eurprd08.prod.outlook.com (2603:10a6:10:401::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7962.15; Mon, 9 Sep 2024 22:24:22 +0000 Received: from GV2PR08MB8121.eurprd08.prod.outlook.com ([fe80::4cd3:da80:2532:daa0]) by GV2PR08MB8121.eurprd08.prod.outlook.com ([fe80::4cd3:da80:2532:daa0%2]) with mapi id 15.20.7962.014; Mon, 9 Sep 2024 22:24:22 +0000 From: Mikhail Kshevetskiy To: Tom Rini , Dario Binacchi , Michael Trimarchi , Frieder Schrempf , Jagan Teki , Simon Glass , William Zhang , Mikhail Kshevetskiy , Igor Prusov , Dmitry Rokosov , Bruce Suen , Alexey Romanov , Martin Kurbanov , Chuanhong Guo , Miquel Raynal , Max Krummenacher , Francesco Dolcini , u-boot@lists.denx.de Subject: [RESEND PATCH v4 09/10] mtd: spinand: sync supported flashes with linux-6.10 Date: Tue, 10 Sep 2024 01:23:57 +0300 Message-ID: <20240909222401.2562898-10-mikhail.kshevetskiy@iopsys.eu> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240909222401.2562898-1-mikhail.kshevetskiy@iopsys.eu> References: <20240909222401.2562898-1-mikhail.kshevetskiy@iopsys.eu> X-ClientProxiedBy: FR3P281CA0096.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:a1::8) To GV2PR08MB8121.eurprd08.prod.outlook.com (2603:10a6:150:7d::22) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: GV2PR08MB8121:EE_|DU0PR08MB9935:EE_ X-MS-Office365-Filtering-Correlation-Id: 4269f97c-32f8-4230-3b4a-08dcd11e27a4 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|366016|52116014|7416014|376014|1800799024|921020|38350700014; X-Microsoft-Antispam-Message-Info: L5+rIOAw23qWmrYYnuWf8kpJZt+I60VR/JyXQ3NcPs9uWnpS5LYR4+bnYdf9G6tbz7YlnwLBWwP73PjSDKj/VD/Y+qdqz9TU/Krc8XNC/PzGHKq23PJfOS640/qixkjZLdDV/NM8wyPislneTe+g4iYLULc/gucVzZQHIX0eA6olKnUHqr1YqwLAhN40aI8h1sh4ho9f/msHYyJKyCXTPPUZJ9QLoip1BTIa1S+TVwl3zWZ/y7GWBe8rQnbcN9ULyF8pkbFcIN59a1o2WvWyg+JD1nzIQUil/hngP/SSN2p9k90yFNnzZxtIabW+W2NI6eLBPm9bSp/KgD50jzXmXY/MFsNgsDIiUTsyOMBX7ERbvqU2FWdlJ9lOIQJCL0FPtVz/RRf84TQ7A9f1zbrwfHC/njs7gMvkjVQTKSkYmDlkI/PTEXc+R+FYxC6QiJD3cyGcFChblKToORHaq3pKfNuY+26JwmWWfIRKkbGdJl6Ngtz8AZ4GnoqHYqlTw9YjgdLhl7lBgi2IMvkQw2Zn4HqsqABDryN7Ddevyet1Y1/RbBp8iuic4Zurf7BlrpwBgME+HVM25i7HbAkymPqTQyYrl6WTOSszF1z4f62RC9rJknq6RkIny8PLjgv8D1tLjCDE3rq+kq3Y1LDw/qNTO790h37QPzAJvbrNjdLmZgyFbRazmhTrk0tGTaRrJD6sUWxGYPoZ2X7z298keTdeAEr8dFSSz4LowIetXwqB7jGmyQp8kSgocm2cLdr0rf0DDEJMu0uyuJPGh4wYf25zgSpWQwqOPoqmlNVU88lyTuMg8Xze78UqrK7SA5pdv8ZL1TswHumhUzpdHCBqQ1IpozOefzqWaOwWZMxqoM4OJX/uqaCkik1emdoyRBk/jeE2jW6A2EfkTP+FGi51dP7gjYI168cqFK4sh0gEbC66na7+R8hfEyC+32P1hTsjbPwUdmE9ZwoW3IBRizm53qb9wOt/2qo0NRc008krHqiqTF3+NRgXNbSeBPrqjqF8pm8HmruAphc0q7X2o3/1RV5pWVCwB9kc7e0jZs7LSjVoPi9ceGSfDwDTdf1FELOl9X02eA6ymvpWMyHjLYnPy/vLOcLCwRTIF1IH1SN0lVYPjqThuYaZiMDAJDjgRlZ6fNFYid/yu/7V7O18+b2OQ/DZXoC8XIWr+/tlREsRhZPRQt8tFkREoWPhu3jGgp6ZSMyZve9co1q3En2wazhY+EfegscV9Xuzk3t3RM+seZGPJzdYD0EX1bdHnb+lX+JUQrOAouhvln49iDOgTooWhLz9BsIkqQGJuhmf/geEvR9PQCgFRjPKTx78ck1lIYvIXQtM5MykhTn+Rm2+t0/CCQ/V9/2sku9Aw/60RiLbbouX7rljhR2KT9tIli5dQUWQgyMeTvwZLrkDgn5NF0BADnX6QxD6vFW+JY17oII1YK/45FQ= 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)(376014)(1800799024)(921020)(38350700014); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: f29otQ8ioA5/TeVXByeOjEkZG1u2LzxB28YizgziBvTIg4OkOnpbUcbenQl4OAfboNwe2MWOA9SRZzrJzPHu56NZfPqqk1sGe966CCM4YlOfKOD9OohyKRTwMevdlbXrEVLS4T+lfJK28qTP12bCtc7V4DY7EaU9xTx59ro/iccXgTht+y/8DPaCB7VoDW+u5cobyeQPK+z0ls6oBs1PrfMtyp/6/Ti1mda7PvRTDWEzum7PWe9Hpy+0aogt8tRicT9swblwuIMZPBnMnIhdnsjQuow0wvUVknFtcBSOEas74PQZk+6OHxj6N9quwZLJTYQFLsCeqS7Ce6ScArxKVBtmqbAztD+3e0JGu1Hdc7ouVXBIofZObhdPYdcVQTtp+Z8oa0UrbLSgAzeDWdxjI7VYht9p6QUkJ4A/4eeVxgq1CpvXzOSrVbRaT27I7CZq2Rq5/wrm8zvFpmfxh2wNu++ga/F3FY0rorbfad8WUpTE4KHh2b5e+hBasOdIH2OCapnD9jZUnudEoA1rSNaWHmwAgwladtQcPyLfijm8qZ8XYG1zek7xdw0PGaln1/jTVcBpo5hgzdVp7BVCz3CH5NESMWTOqlH1BMKkXcP0N4OFPgOrRvnOoYU2AyE29cshl/OE4IlD+nE/0LUIhNoF5xr3e3SJiXAJ99rury0dfWuiCpCfkomeU1hPi8r3EDEJAiAdT8z+Nn0TibTFduONOJlHMLmwMEm3VS0I0iV9+S/CJm7s/SogTSaamiuEj0a9Xkgr+xgB98kP2gKKZLoPibQ4fw3Gj796BDDseYS0b6LXI+D1ZUSB9DBJUTxk+OPQAotOqk34xE/T9viOsYDNvb+Rxoglj/2UMWxyTt4HRBVTr9g9ywh4EdZP2ohFz8WbKkx+OjPrHcErxBhiExBqV4dp4AouCyqJn1BG8w1QO6mWgPUhfVECxN8peGfhoyuNdeaIfGTCrkohoGPW+dlqRoe39Uwf2PeYANyGvKpGdmfGB8ky7wRCmnii8hhxi1j6MwElK2GKf43EyShuFjq37mfS5bIGKh+QJNU2JeO4c22Pg8pCnuAR2Luf9PbmNSGIiRFbplFxFC/KOCd89WGJZpLRt/P1o/VPpPFk3/WaZpK7sCM122wo8JS303JMtaoHFTVk0OzOIdMc/MsV5qEWW4rYurigh95wqcKMQKuIu3UxSggBWnHCYhqLhw0v8PxXyRyZaZh3ghH/A7Ag/u/MtqqGMhNV2qqUPJDadlCD0rqKfK2sQ8lzhvANPIPer2uGMXxvwt+gA0KWIpltKphfried3WzueZVXnOF1REAsh/y42Bp+PSLylHV1vgF/Mpk1Bpd81MeNDC7r9PGwZ3wrVNPftQppOR1GWvbJLp+PFhhwZQCIZ+4yuq4R9+caodvDbSoN2nk1S2Y6DL6qc+MNH4J4BYfu33nyxCVUaqyUH6fJLbH7dtI1NphRlRNIglg3eSQjeufwHncypkri9aKHjZbFw07IkxlMgSwnfc1qI3txphJpbIkeykjg3NBMEK+fo4TuWUm85F9koaMJZUK9a3nhcOAMJ0XBWLlVk9F7PhbkJPw4Oh2zzIphDix2G1K+8Gwon1LG1u86IeOgtg4vbw== X-OriginatorOrg: iopsys.eu X-MS-Exchange-CrossTenant-Network-Message-Id: 4269f97c-32f8-4230-3b4a-08dcd11e27a4 X-MS-Exchange-CrossTenant-AuthSource: GV2PR08MB8121.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 09 Sep 2024 22:24:22.6037 (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: vNDc14OJk9Tv9TEewNIaoULl7kb14aK05nVcuqP0y3pjoac8Qyo2F0s2fkm4Di0CjQzawMprtvzutBMqZm/HBFtvss2UZWqcOf+wmCMX7jc= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DU0PR08MB9935 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 Signed-off-by: Mikhail Kshevetskiy --- drivers/mtd/nand/spi/Makefile | 4 +- drivers/mtd/nand/spi/alliancememory.c | 155 ++++++++++++++++++++ drivers/mtd/nand/spi/ato.c | 84 +++++++++++ drivers/mtd/nand/spi/core.c | 5 +- drivers/mtd/nand/spi/esmt.c | 16 ++- drivers/mtd/nand/spi/foresee.c | 97 +++++++++++++ drivers/mtd/nand/spi/gigadevice.c | 194 +++++++++++++++++++++++++- drivers/mtd/nand/spi/macronix.c | 25 +++- drivers/mtd/nand/spi/toshiba.c | 33 +++++ drivers/mtd/nand/spi/winbond.c | 57 ++++++++ include/linux/mtd/spinand.h | 5 +- 11 files changed, 664 insertions(+), 11 deletions(-) create mode 100644 drivers/mtd/nand/spi/alliancememory.c create mode 100644 drivers/mtd/nand/spi/ato.c create mode 100644 drivers/mtd/nand/spi/foresee.c diff --git a/drivers/mtd/nand/spi/Makefile b/drivers/mtd/nand/spi/Makefile index 65b836b34ca..d438747cf37 100644 --- a/drivers/mtd/nand/spi/Makefile +++ b/drivers/mtd/nand/spi/Makefile @@ -1,5 +1,5 @@ # SPDX-License-Identifier: GPL-2.0 -spinand-objs := core.o esmt.o gigadevice.o macronix.o micron.o paragon.o -spinand-objs += toshiba.o winbond.o xtx.o +spinand-objs := core.o alliancememory.o ato.o esmt.o foresee.o gigadevice.o macronix.o +spinand-objs += micron.o paragon.o toshiba.o winbond.o xtx.o obj-$(CONFIG_MTD_SPI_NAND) += spinand.o diff --git a/drivers/mtd/nand/spi/alliancememory.c b/drivers/mtd/nand/spi/alliancememory.c new file mode 100644 index 00000000000..e29e4cc77ec --- /dev/null +++ b/drivers/mtd/nand/spi/alliancememory.c @@ -0,0 +1,155 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Author: Mario Kicherer + */ + +#ifndef __UBOOT__ +#include +#include +#endif +#include + +#define SPINAND_MFR_ALLIANCEMEMORY 0x52 + +#define AM_STATUS_ECC_BITMASK (3 << 4) + +#define AM_STATUS_ECC_NONE_DETECTED (0 << 4) +#define AM_STATUS_ECC_CORRECTED (1 << 4) +#define AM_STATUS_ECC_ERRORED (2 << 4) +#define AM_STATUS_ECC_MAX_CORRECTED (3 << 4) + +static SPINAND_OP_VARIANTS(read_cache_variants, + SPINAND_PAGE_READ_FROM_CACHE_QUADIO_OP(0, 1, NULL, 0), + SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0), + SPINAND_PAGE_READ_FROM_CACHE_DUALIO_OP(0, 1, NULL, 0), + SPINAND_PAGE_READ_FROM_CACHE_X2_OP(0, 1, NULL, 0), + SPINAND_PAGE_READ_FROM_CACHE_OP(true, 0, 1, NULL, 0), + SPINAND_PAGE_READ_FROM_CACHE_OP(false, 0, 1, NULL, 0)); + +static SPINAND_OP_VARIANTS(write_cache_variants, + SPINAND_PROG_LOAD_X4(true, 0, NULL, 0), + SPINAND_PROG_LOAD(true, 0, NULL, 0)); + +static SPINAND_OP_VARIANTS(update_cache_variants, + SPINAND_PROG_LOAD_X4(false, 0, NULL, 0), + SPINAND_PROG_LOAD(false, 0, NULL, 0)); + +static int am_get_eccsize(struct mtd_info *mtd) +{ + if (mtd->oobsize == 64) + return 0x20; + else if (mtd->oobsize == 128) + return 0x38; + else if (mtd->oobsize == 256) + return 0x70; + else + return -EINVAL; +} + +static int am_ooblayout_ecc(struct mtd_info *mtd, int section, + struct mtd_oob_region *region) +{ + int ecc_bytes; + + ecc_bytes = am_get_eccsize(mtd); + if (ecc_bytes < 0) + return ecc_bytes; + + region->offset = mtd->oobsize - ecc_bytes; + region->length = ecc_bytes; + + return 0; +} + +static int am_ooblayout_free(struct mtd_info *mtd, int section, + struct mtd_oob_region *region) +{ + int ecc_bytes; + + if (section) + return -ERANGE; + + ecc_bytes = am_get_eccsize(mtd); + if (ecc_bytes < 0) + return ecc_bytes; + + /* + * It is unclear how many bytes are used for the bad block marker. We + * reserve the common two bytes here. + * + * The free area in this kind of flash is divided into chunks where the + * first 4 bytes of each chunk are unprotected. The number of chunks + * depends on the specific model. The models with 4096+256 bytes pages + * have 8 chunks, the others 4 chunks. + */ + + region->offset = 2; + region->length = mtd->oobsize - 2 - ecc_bytes; + + return 0; +} + +static const struct mtd_ooblayout_ops am_ooblayout = { + .ecc = am_ooblayout_ecc, + .rfree = am_ooblayout_free, +}; + +static int am_ecc_get_status(struct spinand_device *spinand, u8 status) +{ + switch (status & AM_STATUS_ECC_BITMASK) { + case AM_STATUS_ECC_NONE_DETECTED: + return 0; + + case AM_STATUS_ECC_CORRECTED: + /* + * use oobsize to determine the flash model and the maximum of + * correctable errors and return maximum - 1 by convention + */ + if (spinand->base.mtd->oobsize == 64) + return 3; + else + return 7; + + case AM_STATUS_ECC_ERRORED: + return -EBADMSG; + + case AM_STATUS_ECC_MAX_CORRECTED: + /* + * use oobsize to determine the flash model and the maximum of + * correctable errors + */ + if (spinand->base.mtd->oobsize == 64) + return 4; + else + return 8; + + default: + break; + } + + return -EINVAL; +} + +static const struct spinand_info alliancememory_spinand_table[] = { + SPINAND_INFO("AS5F34G04SND", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x2f), + NAND_MEMORG(1, 2048, 128, 64, 4096, 80, 1, 1, 1), + NAND_ECCREQ(4, 512), + SPINAND_INFO_OP_VARIANTS(&read_cache_variants, + &write_cache_variants, + &update_cache_variants), + SPINAND_HAS_QE_BIT, + SPINAND_ECCINFO(&am_ooblayout, + am_ecc_get_status)), +}; + +static const struct spinand_manufacturer_ops alliancememory_spinand_manuf_ops = { +}; + +const struct spinand_manufacturer alliancememory_spinand_manufacturer = { + .id = SPINAND_MFR_ALLIANCEMEMORY, + .name = "AllianceMemory", + .chips = alliancememory_spinand_table, + .nchips = ARRAY_SIZE(alliancememory_spinand_table), + .ops = &alliancememory_spinand_manuf_ops, +}; diff --git a/drivers/mtd/nand/spi/ato.c b/drivers/mtd/nand/spi/ato.c new file mode 100644 index 00000000000..f0d4436cf45 --- /dev/null +++ b/drivers/mtd/nand/spi/ato.c @@ -0,0 +1,84 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2022 Aidan MacDonald + * + * Author: Aidan MacDonald + */ + +#ifndef __UBOOT__ +#include +#include +#endif +#include + +#define SPINAND_MFR_ATO 0x9b + +static SPINAND_OP_VARIANTS(read_cache_variants, + SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0), + SPINAND_PAGE_READ_FROM_CACHE_OP(true, 0, 1, NULL, 0), + SPINAND_PAGE_READ_FROM_CACHE_OP(false, 0, 1, NULL, 0)); + +static SPINAND_OP_VARIANTS(write_cache_variants, + SPINAND_PROG_LOAD_X4(true, 0, NULL, 0), + SPINAND_PROG_LOAD(true, 0, NULL, 0)); + +static SPINAND_OP_VARIANTS(update_cache_variants, + SPINAND_PROG_LOAD_X4(false, 0, NULL, 0), + SPINAND_PROG_LOAD(false, 0, NULL, 0)); + +static int ato25d1ga_ooblayout_ecc(struct mtd_info *mtd, int section, + struct mtd_oob_region *region) +{ + if (section > 3) + return -ERANGE; + + region->offset = (16 * section) + 8; + region->length = 8; + return 0; +} + +static int ato25d1ga_ooblayout_free(struct mtd_info *mtd, int section, + struct mtd_oob_region *region) +{ + if (section > 3) + return -ERANGE; + + if (section) { + region->offset = (16 * section); + region->length = 8; + } else { + /* first byte of section 0 is reserved for the BBM */ + region->offset = 1; + region->length = 7; + } + + return 0; +} + +static const struct mtd_ooblayout_ops ato25d1ga_ooblayout = { + .ecc = ato25d1ga_ooblayout_ecc, + .rfree = ato25d1ga_ooblayout_free, +}; + +static const struct spinand_info ato_spinand_table[] = { + SPINAND_INFO("ATO25D1GA", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x12), + NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1), + NAND_ECCREQ(1, 512), + SPINAND_INFO_OP_VARIANTS(&read_cache_variants, + &write_cache_variants, + &update_cache_variants), + SPINAND_HAS_QE_BIT, + SPINAND_ECCINFO(&ato25d1ga_ooblayout, NULL)), +}; + +static const struct spinand_manufacturer_ops ato_spinand_manuf_ops = { +}; + +const struct spinand_manufacturer ato_spinand_manufacturer = { + .id = SPINAND_MFR_ATO, + .name = "ATO", + .chips = ato_spinand_table, + .nchips = ARRAY_SIZE(ato_spinand_table), + .ops = &ato_spinand_manuf_ops, +}; diff --git a/drivers/mtd/nand/spi/core.c b/drivers/mtd/nand/spi/core.c index 548a7144ee3..d5cb9026246 100644 --- a/drivers/mtd/nand/spi/core.c +++ b/drivers/mtd/nand/spi/core.c @@ -866,13 +866,16 @@ static const struct nand_ops spinand_ops = { }; static const struct spinand_manufacturer *spinand_manufacturers[] = { + &alliancememory_spinand_manufacturer, + &ato_spinand_manufacturer, + &esmt_c8_spinand_manufacturer, + &foresee_spinand_manufacturer, &gigadevice_spinand_manufacturer, ¯onix_spinand_manufacturer, µn_spinand_manufacturer, ¶gon_spinand_manufacturer, &toshiba_spinand_manufacturer, &winbond_spinand_manufacturer, - &esmt_c8_spinand_manufacturer, &xtx_spinand_manufacturer, }; diff --git a/drivers/mtd/nand/spi/esmt.c b/drivers/mtd/nand/spi/esmt.c index 7e07b26827a..23be098b885 100644 --- a/drivers/mtd/nand/spi/esmt.c +++ b/drivers/mtd/nand/spi/esmt.c @@ -106,7 +106,8 @@ static const struct mtd_ooblayout_ops f50l1g41lb_ooblayout = { static const struct spinand_info esmt_c8_spinand_table[] = { SPINAND_INFO("F50L1G41LB", - SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x01), + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x01, 0x7f, + 0x7f, 0x7f), NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1), NAND_ECCREQ(1, 512), SPINAND_INFO_OP_VARIANTS(&read_cache_variants, @@ -115,7 +116,8 @@ static const struct spinand_info esmt_c8_spinand_table[] = { 0, SPINAND_ECCINFO(&f50l1g41lb_ooblayout, NULL)), SPINAND_INFO("F50D1G41LB", - SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x11), + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x11, 0x7f, + 0x7f, 0x7f), NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1), NAND_ECCREQ(1, 512), SPINAND_INFO_OP_VARIANTS(&read_cache_variants, @@ -123,6 +125,16 @@ static const struct spinand_info esmt_c8_spinand_table[] = { &update_cache_variants), 0, SPINAND_ECCINFO(&f50l1g41lb_ooblayout, NULL)), + SPINAND_INFO("F50D2G41KA", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x51, 0x7f, + 0x7f, 0x7f), + NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1), + NAND_ECCREQ(8, 512), + SPINAND_INFO_OP_VARIANTS(&read_cache_variants, + &write_cache_variants, + &update_cache_variants), + 0, + SPINAND_ECCINFO(&f50l1g41lb_ooblayout, NULL)), }; static const struct spinand_manufacturer_ops esmt_spinand_manuf_ops = { diff --git a/drivers/mtd/nand/spi/foresee.c b/drivers/mtd/nand/spi/foresee.c new file mode 100644 index 00000000000..7d141cdd658 --- /dev/null +++ b/drivers/mtd/nand/spi/foresee.c @@ -0,0 +1,97 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2023, SberDevices. All Rights Reserved. + * + * Author: Martin Kurbanov + */ + +#ifndef __UBOOT__ +#include +#include +#endif +#include + +#define SPINAND_MFR_FORESEE 0xCD + +static SPINAND_OP_VARIANTS(read_cache_variants, + SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0), + SPINAND_PAGE_READ_FROM_CACHE_X2_OP(0, 1, NULL, 0), + SPINAND_PAGE_READ_FROM_CACHE_OP(true, 0, 1, NULL, 0), + SPINAND_PAGE_READ_FROM_CACHE_OP(false, 0, 1, NULL, 0)); + +static SPINAND_OP_VARIANTS(write_cache_variants, + SPINAND_PROG_LOAD_X4(true, 0, NULL, 0), + SPINAND_PROG_LOAD(true, 0, NULL, 0)); + +static SPINAND_OP_VARIANTS(update_cache_variants, + SPINAND_PROG_LOAD_X4(false, 0, NULL, 0), + SPINAND_PROG_LOAD(false, 0, NULL, 0)); + +static int f35sqa002g_ooblayout_ecc(struct mtd_info *mtd, int section, + struct mtd_oob_region *region) +{ + return -ERANGE; +} + +static int f35sqa002g_ooblayout_free(struct mtd_info *mtd, int section, + struct mtd_oob_region *region) +{ + if (section) + return -ERANGE; + + /* Reserve 2 bytes for the BBM. */ + region->offset = 2; + region->length = 62; + + return 0; +} + +static const struct mtd_ooblayout_ops f35sqa002g_ooblayout = { + .ecc = f35sqa002g_ooblayout_ecc, + .rfree = f35sqa002g_ooblayout_free, +}; + +static int f35sqa002g_ecc_get_status(struct spinand_device *spinand, u8 status) +{ + struct nand_device *nand = spinand_to_nand(spinand); + + switch (status & STATUS_ECC_MASK) { + case STATUS_ECC_NO_BITFLIPS: + return 0; + + case STATUS_ECC_HAS_BITFLIPS: + return nand->eccreq.strength; + + default: + break; + } + + /* More than 1-bit error was detected in one or more sectors and + * cannot be corrected. + */ + return -EBADMSG; +} + +static const struct spinand_info foresee_spinand_table[] = { + SPINAND_INFO("F35SQA002G", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x72, 0x72), + NAND_MEMORG(1, 2048, 64, 64, 2048, 40, 1, 1, 1), + NAND_ECCREQ(1, 512), + SPINAND_INFO_OP_VARIANTS(&read_cache_variants, + &write_cache_variants, + &update_cache_variants), + SPINAND_HAS_QE_BIT, + SPINAND_ECCINFO(&f35sqa002g_ooblayout, + f35sqa002g_ecc_get_status)), +}; + +static const struct spinand_manufacturer_ops foresee_spinand_manuf_ops = { +}; + +const struct spinand_manufacturer foresee_spinand_manufacturer = { + .id = SPINAND_MFR_FORESEE, + .name = "FORESEE", + .chips = foresee_spinand_table, + .nchips = ARRAY_SIZE(foresee_spinand_table), + .ops = &foresee_spinand_manuf_ops, +}; diff --git a/drivers/mtd/nand/spi/gigadevice.c b/drivers/mtd/nand/spi/gigadevice.c index f2ecf47f8d4..f3608a13d8e 100644 --- a/drivers/mtd/nand/spi/gigadevice.c +++ b/drivers/mtd/nand/spi/gigadevice.c @@ -43,6 +43,22 @@ static SPINAND_OP_VARIANTS(read_cache_variants_f, SPINAND_PAGE_READ_FROM_CACHE_OP_3A(true, 0, 1, NULL, 0), SPINAND_PAGE_READ_FROM_CACHE_OP_3A(false, 0, 0, NULL, 0)); +static SPINAND_OP_VARIANTS(read_cache_variants_1gq5, + SPINAND_PAGE_READ_FROM_CACHE_QUADIO_OP(0, 2, NULL, 0), + SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0), + SPINAND_PAGE_READ_FROM_CACHE_DUALIO_OP(0, 1, NULL, 0), + SPINAND_PAGE_READ_FROM_CACHE_X2_OP(0, 1, NULL, 0), + SPINAND_PAGE_READ_FROM_CACHE_OP(true, 0, 1, NULL, 0), + SPINAND_PAGE_READ_FROM_CACHE_OP(false, 0, 1, NULL, 0)); + +static SPINAND_OP_VARIANTS(read_cache_variants_2gq5, + SPINAND_PAGE_READ_FROM_CACHE_QUADIO_OP(0, 4, NULL, 0), + SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0), + SPINAND_PAGE_READ_FROM_CACHE_DUALIO_OP(0, 2, NULL, 0), + SPINAND_PAGE_READ_FROM_CACHE_X2_OP(0, 1, NULL, 0), + SPINAND_PAGE_READ_FROM_CACHE_OP(true, 0, 1, NULL, 0), + SPINAND_PAGE_READ_FROM_CACHE_OP(false, 0, 1, NULL, 0)); + static SPINAND_OP_VARIANTS(write_cache_variants, SPINAND_PROG_LOAD_X4(true, 0, NULL, 0), SPINAND_PROG_LOAD(true, 0, NULL, 0)); @@ -174,7 +190,7 @@ static int gd5fxgq4uexxg_ecc_get_status(struct spinand_device *spinand, { u8 status2; struct spi_mem_op op = SPINAND_GET_FEATURE_OP(GD5FXGQXXEXXG_REG_STATUS2, - &status2); + spinand->scratchbuf); int ret; switch (status & STATUS_ECC_MASK) { @@ -195,6 +211,7 @@ static int gd5fxgq4uexxg_ecc_get_status(struct spinand_device *spinand, * report the maximum of 4 in this case */ /* bits sorted this way (3...0): ECCS1,ECCS0,ECCSE1,ECCSE0 */ + status2 = *(spinand->scratchbuf); return ((status & STATUS_ECC_MASK) >> 2) | ((status2 & STATUS_ECC_MASK) >> 4); @@ -216,7 +233,7 @@ static int gd5fxgq5xexxg_ecc_get_status(struct spinand_device *spinand, { u8 status2; struct spi_mem_op op = SPINAND_GET_FEATURE_OP(GD5FXGQXXEXXG_REG_STATUS2, - &status2); + spinand->scratchbuf); int ret; switch (status & STATUS_ECC_MASK) { @@ -236,6 +253,7 @@ static int gd5fxgq5xexxg_ecc_get_status(struct spinand_device *spinand, * 1 ... 4 bits are flipped (and corrected) */ /* bits sorted this way (1...0): ECCSE1, ECCSE0 */ + status2 = *(spinand->scratchbuf); return ((status2 & STATUS_ECC_MASK) >> 4) + 1; case STATUS_ECC_UNCOR_ERROR: @@ -329,6 +347,36 @@ static const struct spinand_info gigadevice_spinand_table[] = { SPINAND_HAS_QE_BIT, SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, gd5fxgq4uexxg_ecc_get_status)), + SPINAND_INFO("GD5F1GQ4RExxG", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0xc1), + NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1), + NAND_ECCREQ(8, 512), + SPINAND_INFO_OP_VARIANTS(&read_cache_variants, + &write_cache_variants, + &update_cache_variants), + SPINAND_HAS_QE_BIT, + SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, + gd5fxgq4uexxg_ecc_get_status)), + SPINAND_INFO("GD5F2GQ4UExxG", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0xd2), + NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1), + NAND_ECCREQ(8, 512), + SPINAND_INFO_OP_VARIANTS(&read_cache_variants, + &write_cache_variants, + &update_cache_variants), + SPINAND_HAS_QE_BIT, + SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, + gd5fxgq4uexxg_ecc_get_status)), + SPINAND_INFO("GD5F2GQ4RExxG", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0xc2), + NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1), + NAND_ECCREQ(8, 512), + SPINAND_INFO_OP_VARIANTS(&read_cache_variants, + &write_cache_variants, + &update_cache_variants), + SPINAND_HAS_QE_BIT, + SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, + gd5fxgq4uexxg_ecc_get_status)), SPINAND_INFO("GD5F1GQ4UFxxG", SPINAND_ID(SPINAND_READID_METHOD_OPCODE, 0xb1, 0x48), NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1), @@ -343,12 +391,152 @@ static const struct spinand_info gigadevice_spinand_table[] = { SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x51), NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1), NAND_ECCREQ(4, 512), - SPINAND_INFO_OP_VARIANTS(&read_cache_variants, + SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5, + &write_cache_variants, + &update_cache_variants), + SPINAND_HAS_QE_BIT, + SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, + gd5fxgq5xexxg_ecc_get_status)), + SPINAND_INFO("GD5F1GQ5RExxG", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x41), + NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1), + NAND_ECCREQ(4, 512), + SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5, + &write_cache_variants, + &update_cache_variants), + SPINAND_HAS_QE_BIT, + SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, + gd5fxgq5xexxg_ecc_get_status)), + SPINAND_INFO("GD5F2GQ5UExxG", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x52), + NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1), + NAND_ECCREQ(4, 512), + SPINAND_INFO_OP_VARIANTS(&read_cache_variants_2gq5, + &write_cache_variants, + &update_cache_variants), + SPINAND_HAS_QE_BIT, + SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, + gd5fxgq5xexxg_ecc_get_status)), + SPINAND_INFO("GD5F2GQ5RExxG", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x42), + NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1), + NAND_ECCREQ(4, 512), + SPINAND_INFO_OP_VARIANTS(&read_cache_variants_2gq5, + &write_cache_variants, + &update_cache_variants), + SPINAND_HAS_QE_BIT, + SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, + gd5fxgq5xexxg_ecc_get_status)), + SPINAND_INFO("GD5F4GQ6UExxG", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x55), + NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 2, 1), + NAND_ECCREQ(4, 512), + SPINAND_INFO_OP_VARIANTS(&read_cache_variants_2gq5, + &write_cache_variants, + &update_cache_variants), + SPINAND_HAS_QE_BIT, + SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, + gd5fxgq5xexxg_ecc_get_status)), + SPINAND_INFO("GD5F4GQ6RExxG", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x45), + NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 2, 1), + NAND_ECCREQ(4, 512), + SPINAND_INFO_OP_VARIANTS(&read_cache_variants_2gq5, &write_cache_variants, &update_cache_variants), SPINAND_HAS_QE_BIT, SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, gd5fxgq5xexxg_ecc_get_status)), + SPINAND_INFO("GD5F1GM7UExxG", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x91), + NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1), + NAND_ECCREQ(8, 512), + SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5, + &write_cache_variants, + &update_cache_variants), + SPINAND_HAS_QE_BIT, + SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, + gd5fxgq4uexxg_ecc_get_status)), + SPINAND_INFO("GD5F1GM7RExxG", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x81), + NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1), + NAND_ECCREQ(8, 512), + SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5, + &write_cache_variants, + &update_cache_variants), + SPINAND_HAS_QE_BIT, + SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, + gd5fxgq4uexxg_ecc_get_status)), + SPINAND_INFO("GD5F2GM7UExxG", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x92), + NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1), + NAND_ECCREQ(8, 512), + SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5, + &write_cache_variants, + &update_cache_variants), + SPINAND_HAS_QE_BIT, + SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, + gd5fxgq4uexxg_ecc_get_status)), + SPINAND_INFO("GD5F2GM7RExxG", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x82), + NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1), + NAND_ECCREQ(8, 512), + SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5, + &write_cache_variants, + &update_cache_variants), + SPINAND_HAS_QE_BIT, + SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, + gd5fxgq4uexxg_ecc_get_status)), + SPINAND_INFO("GD5F4GM8UExxG", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x95), + NAND_MEMORG(1, 2048, 128, 64, 4096, 80, 1, 1, 1), + NAND_ECCREQ(8, 512), + SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5, + &write_cache_variants, + &update_cache_variants), + SPINAND_HAS_QE_BIT, + SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, + gd5fxgq4uexxg_ecc_get_status)), + SPINAND_INFO("GD5F4GM8RExxG", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x85), + NAND_MEMORG(1, 2048, 128, 64, 4096, 80, 1, 1, 1), + NAND_ECCREQ(8, 512), + SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5, + &write_cache_variants, + &update_cache_variants), + SPINAND_HAS_QE_BIT, + SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, + gd5fxgq4uexxg_ecc_get_status)), + SPINAND_INFO("GD5F2GQ5xExxH", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x22), + NAND_MEMORG(1, 2048, 64, 64, 2048, 40, 1, 1, 1), + NAND_ECCREQ(4, 512), + SPINAND_INFO_OP_VARIANTS(&read_cache_variants_2gq5, + &write_cache_variants, + &update_cache_variants), + SPINAND_HAS_QE_BIT, + SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, + gd5fxgq4uexxg_ecc_get_status)), + SPINAND_INFO("GD5F1GQ5RExxH", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x21), + NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1), + NAND_ECCREQ(4, 512), + SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5, + &write_cache_variants, + &update_cache_variants), + SPINAND_HAS_QE_BIT, + SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, + gd5fxgq4uexxg_ecc_get_status)), + SPINAND_INFO("GD5F1GQ4RExxH", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xc9), + NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1), + NAND_ECCREQ(4, 512), + SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5, + &write_cache_variants, + &update_cache_variants), + SPINAND_HAS_QE_BIT, + SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, + gd5fxgq4uexxg_ecc_get_status)), }; static const struct spinand_manufacturer_ops gigadevice_spinand_manuf_ops = { diff --git a/drivers/mtd/nand/spi/macronix.c b/drivers/mtd/nand/spi/macronix.c index 86bffc2800b..3d4a7f0c3cb 100644 --- a/drivers/mtd/nand/spi/macronix.c +++ b/drivers/mtd/nand/spi/macronix.c @@ -23,7 +23,7 @@ static SPINAND_OP_VARIANTS(read_cache_variants, static SPINAND_OP_VARIANTS(write_cache_variants, SPINAND_PROG_LOAD_X4(true, 0, NULL, 0), - SPINAND_PROG_LOAD(true, 0, NULL, 0)); + SPINAND_PROG_LOAD(false, 0, NULL, 0)); static SPINAND_OP_VARIANTS(update_cache_variants, SPINAND_PROG_LOAD_X4(false, 0, NULL, 0), @@ -86,9 +86,10 @@ static int mx35lf1ge4ab_ecc_get_status(struct spinand_device *spinand, * in order to avoid forcing the wear-leveling layer to move * data around if it's not necessary. */ - if (mx35lf1ge4ab_get_eccsr(spinand, &eccsr)) + if (mx35lf1ge4ab_get_eccsr(spinand, spinand->scratchbuf)) return nand->eccreq.strength; + eccsr = *spinand->scratchbuf; if (WARN_ON(eccsr > nand->eccreq.strength || !eccsr)) return nand->eccreq.strength; @@ -300,6 +301,26 @@ static const struct spinand_info macronix_spinand_table[] = { SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout, mx35lf1ge4ab_ecc_get_status)), + SPINAND_INFO("MX31LF2GE4BC", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x2e), + NAND_MEMORG(1, 2048, 64, 64, 2048, 40, 1, 1, 1), + NAND_ECCREQ(8, 512), + SPINAND_INFO_OP_VARIANTS(&read_cache_variants, + &write_cache_variants, + &update_cache_variants), + SPINAND_HAS_QE_BIT, + SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout, + mx35lf1ge4ab_ecc_get_status)), + SPINAND_INFO("MX3UF2GE4BC", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xae), + NAND_MEMORG(1, 2048, 64, 64, 2048, 40, 1, 1, 1), + NAND_ECCREQ(8, 512), + SPINAND_INFO_OP_VARIANTS(&read_cache_variants, + &write_cache_variants, + &update_cache_variants), + SPINAND_HAS_QE_BIT, + SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout, + mx35lf1ge4ab_ecc_get_status)), }; static const struct spinand_manufacturer_ops macronix_spinand_manuf_ops = { diff --git a/drivers/mtd/nand/spi/toshiba.c b/drivers/mtd/nand/spi/toshiba.c index b9908e79271..ad48b1c7c8a 100644 --- a/drivers/mtd/nand/spi/toshiba.c +++ b/drivers/mtd/nand/spi/toshiba.c @@ -269,6 +269,39 @@ static const struct spinand_info toshiba_spinand_table[] = { SPINAND_HAS_QE_BIT, SPINAND_ECCINFO(&tx58cxgxsxraix_ooblayout, tx58cxgxsxraix_ecc_get_status)), + /* 1.8V 1Gb (1st generation) */ + SPINAND_INFO("TC58NYG0S3HBAI4", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xA1), + NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1), + NAND_ECCREQ(8, 512), + SPINAND_INFO_OP_VARIANTS(&read_cache_variants, + &write_cache_variants, + &update_cache_variants), + 0, + SPINAND_ECCINFO(&tx58cxgxsxraix_ooblayout, + tx58cxgxsxraix_ecc_get_status)), + /* 1.8V 4Gb (1st generation) */ + SPINAND_INFO("TH58NYG2S3HBAI4", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xAC), + NAND_MEMORG(1, 2048, 128, 64, 4096, 80, 1, 2, 1), + NAND_ECCREQ(8, 512), + SPINAND_INFO_OP_VARIANTS(&read_cache_variants, + &write_cache_x4_variants, + &update_cache_x4_variants), + SPINAND_HAS_QE_BIT, + SPINAND_ECCINFO(&tx58cxgxsxraix_ooblayout, + tx58cxgxsxraix_ecc_get_status)), + /* 1.8V 8Gb (1st generation) */ + SPINAND_INFO("TH58NYG3S0HBAI6", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xA3), + NAND_MEMORG(1, 4096, 256, 64, 4096, 80, 1, 1, 1), + NAND_ECCREQ(8, 512), + SPINAND_INFO_OP_VARIANTS(&read_cache_variants, + &write_cache_x4_variants, + &update_cache_x4_variants), + SPINAND_HAS_QE_BIT, + SPINAND_ECCINFO(&tx58cxgxsxraix_ooblayout, + tx58cxgxsxraix_ecc_get_status)), }; static const struct spinand_manufacturer_ops toshiba_spinand_manuf_ops = { diff --git a/drivers/mtd/nand/spi/winbond.c b/drivers/mtd/nand/spi/winbond.c index dd4ed257a83..c62096dc2e6 100644 --- a/drivers/mtd/nand/spi/winbond.c +++ b/drivers/mtd/nand/spi/winbond.c @@ -18,6 +18,8 @@ #define WINBOND_CFG_BUF_READ BIT(3) +#define W25N04KV_STATUS_ECC_5_8_BITFLIPS (3 << 4) + static SPINAND_OP_VARIANTS(read_cache_variants, SPINAND_PAGE_READ_FROM_CACHE_QUADIO_OP(0, 2, NULL, 0), SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0), @@ -121,6 +123,7 @@ static int w25n02kv_ecc_get_status(struct spinand_device *spinand, return -EBADMSG; case STATUS_ECC_HAS_BITFLIPS: + case W25N04KV_STATUS_ECC_5_8_BITFLIPS: /* * Let's try to retrieve the real maximum number of bitflips * in order to avoid forcing the wear-leveling layer to move @@ -172,6 +175,60 @@ static const struct spinand_info winbond_spinand_table[] = { &update_cache_variants), 0, SPINAND_ECCINFO(&w25n02kv_ooblayout, w25n02kv_ecc_get_status)), + SPINAND_INFO("W25N01JW", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xbc, 0x21), + NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1), + NAND_ECCREQ(4, 512), + SPINAND_INFO_OP_VARIANTS(&read_cache_variants, + &write_cache_variants, + &update_cache_variants), + 0, + SPINAND_ECCINFO(&w25m02gv_ooblayout, w25n02kv_ecc_get_status)), + SPINAND_INFO("W25N02JWZEIF", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xbf, 0x22), + NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 2, 1), + NAND_ECCREQ(4, 512), + SPINAND_INFO_OP_VARIANTS(&read_cache_variants, + &write_cache_variants, + &update_cache_variants), + 0, + SPINAND_ECCINFO(&w25n02kv_ooblayout, w25n02kv_ecc_get_status)), + SPINAND_INFO("W25N512GW", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xba, 0x20), + NAND_MEMORG(1, 2048, 64, 64, 512, 10, 1, 1, 1), + NAND_ECCREQ(4, 512), + SPINAND_INFO_OP_VARIANTS(&read_cache_variants, + &write_cache_variants, + &update_cache_variants), + 0, + SPINAND_ECCINFO(&w25n02kv_ooblayout, w25n02kv_ecc_get_status)), + SPINAND_INFO("W25N02KWZEIR", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xba, 0x22), + NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1), + NAND_ECCREQ(8, 512), + SPINAND_INFO_OP_VARIANTS(&read_cache_variants, + &write_cache_variants, + &update_cache_variants), + 0, + SPINAND_ECCINFO(&w25n02kv_ooblayout, w25n02kv_ecc_get_status)), + SPINAND_INFO("W25N01GWZEIG", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xba, 0x21), + NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1), + NAND_ECCREQ(4, 512), + SPINAND_INFO_OP_VARIANTS(&read_cache_variants, + &write_cache_variants, + &update_cache_variants), + 0, + SPINAND_ECCINFO(&w25m02gv_ooblayout, w25n02kv_ecc_get_status)), + SPINAND_INFO("W25N04KV", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xaa, 0x23), + NAND_MEMORG(1, 2048, 128, 64, 4096, 40, 2, 1, 1), + NAND_ECCREQ(8, 512), + SPINAND_INFO_OP_VARIANTS(&read_cache_variants, + &write_cache_variants, + &update_cache_variants), + 0, + SPINAND_ECCINFO(&w25n02kv_ooblayout, w25n02kv_ecc_get_status)), }; static int winbond_spinand_init(struct spinand_device *spinand) diff --git a/include/linux/mtd/spinand.h b/include/linux/mtd/spinand.h index b701d25f73d..81a7b0dbbb2 100644 --- a/include/linux/mtd/spinand.h +++ b/include/linux/mtd/spinand.h @@ -266,13 +266,16 @@ struct spinand_manufacturer { }; /* SPI NAND manufacturers */ +extern const struct spinand_manufacturer alliancememory_spinand_manufacturer; +extern const struct spinand_manufacturer ato_spinand_manufacturer; +extern const struct spinand_manufacturer esmt_c8_spinand_manufacturer; +extern const struct spinand_manufacturer foresee_spinand_manufacturer; extern const struct spinand_manufacturer gigadevice_spinand_manufacturer; extern const struct spinand_manufacturer macronix_spinand_manufacturer; extern const struct spinand_manufacturer micron_spinand_manufacturer; extern const struct spinand_manufacturer paragon_spinand_manufacturer; extern const struct spinand_manufacturer toshiba_spinand_manufacturer; extern const struct spinand_manufacturer winbond_spinand_manufacturer; -extern const struct spinand_manufacturer esmt_c8_spinand_manufacturer; extern const struct spinand_manufacturer xtx_spinand_manufacturer; /** From patchwork Mon Sep 9 22:23:58 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Mikhail Kshevetskiy X-Patchwork-Id: 1982835 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=OiFHbYrm; 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 4X2hHs5NGJz1y1C for ; Tue, 10 Sep 2024 08:26:01 +1000 (AEST) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 8B7A688E6F; Tue, 10 Sep 2024 00:24:35 +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="OiFHbYrm"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id A37DA88E5B; Tue, 10 Sep 2024 00:24:33 +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-db8eur05on20700.outbound.protection.outlook.com [IPv6:2a01:111:f400:7e1a::700]) (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 A5BD988E6F for ; Tue, 10 Sep 2024 00:24:30 +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=arcselector10001; d=microsoft.com; cv=none; b=wQ+x1Y8UBm56Nwi33u60fMftNFmWTAoZ3fllZWryhUlzn9CV5IWEFeUtcvRM0wWNDUN5uteyMuWQ7BMgy4f7KyWWgq4UiXec27g6cjjpXvh8agqRvHgKrQ5SawExbRLF9SIjCt5d5NL7KtbdIWMKaW0Cd1mKFm2ohXvo2jAJ3RkZcjRYFsfPFvozLxdj8siKFus2fG4Febi7lJ7/L5/6pwTnnvScfaPQb5jpr31jFL7OQm91CgHOGfYsvOkGHnxbKvngP2gztK5/Pb63cPOvaTnSlJ3aCkT1Sjn3S74B9DHDB/mT0mR35lWc2du6qnvhsbpdiIkD+/JwkPaRhqeCuQ== 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=J2TuJ167zXF+4597y/mltm7CeNOCfUl7PLEvbi78QY4=; b=qJrG5EFq7DJ8IOtJub5n86eOTaVZUlWXNdlChaVjwTwWX8AJSUPfLAhsK414Pyn2R33c/MMg+OXyMCZIwxaZvUzMZ6JcqOSm2Y4wzz7TsclYP16cRi2qgpgb8UIC8MtrEBUec7a6vQC5Ca0KduheGFJKWo4/GnFXsm24m1pP1s+Ro/l7rQiO8/8F6p2LosiDb3gGtXuBsFwFT+K9hONYg/Jm78mwnTvigZ5F5vcBDdIWpLygen0DQoOE/aEoqKbAktf8PwPBSXtpqgeYqHEuoBnBI9o9BHPFp7nr/AedGvVhY1lnbmqBw/sLh2RfLAcQ70rRzXktvaqFPY7vQwSfUw== 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=J2TuJ167zXF+4597y/mltm7CeNOCfUl7PLEvbi78QY4=; b=OiFHbYrmIH6naTaqnC6VrR8ibkftTaQrv8z5dVAlpOKVHehIgJi0kHR8oR0ObYHedjF5LgBcsRVuOysW2qs369eRu0WjE2L8H/o0dFvjeh4JFaNLuAaNFWUUw5QuUFgsaow8/W3JSUDLZZ1JVZhBXspZUe/2tnzD9CCWQ5tz9tfTNsb1c6hm6y8qrZ8f/RNRQFHSsQdiaZNuaATloA5ai9T+NwoFVGXTTuOi4LAKrxnhIQWdPK38FxKasmXJLu2C0wSNX/SBTrpJoSzghUoBehRSfvi2sCfUBT+1z84xcVrt3m510ejfC4U6/3dE4E0GkW43xH8pHsU37E3rz8a6jg== 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 DU0PR08MB9935.eurprd08.prod.outlook.com (2603:10a6:10:401::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7962.15; Mon, 9 Sep 2024 22:24:24 +0000 Received: from GV2PR08MB8121.eurprd08.prod.outlook.com ([fe80::4cd3:da80:2532:daa0]) by GV2PR08MB8121.eurprd08.prod.outlook.com ([fe80::4cd3:da80:2532:daa0%2]) with mapi id 15.20.7962.014; Mon, 9 Sep 2024 22:24:24 +0000 From: Mikhail Kshevetskiy To: Tom Rini , Dario Binacchi , Michael Trimarchi , Frieder Schrempf , Jagan Teki , Simon Glass , William Zhang , Mikhail Kshevetskiy , Igor Prusov , Dmitry Rokosov , Bruce Suen , Alexey Romanov , Martin Kurbanov , Chuanhong Guo , Miquel Raynal , Max Krummenacher , Francesco Dolcini , u-boot@lists.denx.de Subject: [RESEND PATCH v4 10/10] mtd: nand: add initial ecc engine support Date: Tue, 10 Sep 2024 01:23:58 +0300 Message-ID: <20240909222401.2562898-11-mikhail.kshevetskiy@iopsys.eu> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240909222401.2562898-1-mikhail.kshevetskiy@iopsys.eu> References: <20240909222401.2562898-1-mikhail.kshevetskiy@iopsys.eu> X-ClientProxiedBy: FR3P281CA0096.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:a1::8) To GV2PR08MB8121.eurprd08.prod.outlook.com (2603:10a6:150:7d::22) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: GV2PR08MB8121:EE_|DU0PR08MB9935:EE_ X-MS-Office365-Filtering-Correlation-Id: 0dde652e-003b-437f-f17d-08dcd11e2888 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|366016|52116014|7416014|376014|1800799024|921020|38350700014; X-Microsoft-Antispam-Message-Info: =?utf-8?q?JrjfA6qQ8H6ou5qdx7lahgjq+tPxkKB?= =?utf-8?q?purL/hpu+knH4T3av92pjvSjYA6DN47EiF+fdnL1QIvVm2HZ+IPWX+6rbYFY8p3qg?= =?utf-8?q?oygLqpe4VM6xXjKMF3yeUxJifSLolgvAbgFJ8xZ3ISLXgBUCl9zq+t7w7MWo6g7nQ?= =?utf-8?q?4KC8s+H/fNz8yhmG+kSXI7FtUWdPtFSyKMvXYtCwlkOioPu5TpDVMI4WxM+LH1Fnc?= =?utf-8?q?8200Nz9+Bbfgh+kGP0mG35iO1yMEtA/5+8HcQmqlG270UW82d0IjtsVmUJKj+d2X5?= =?utf-8?q?sUKgalhJipV0t/OeAN7rLSwLBlKj7kySbIzH9VWqIqY0eO4i69TtbAGV8hDtgQSFo?= =?utf-8?q?8wu3MCwv0aFW9NGSz7EGQNXBdCU0qIn5tB0XpAYz6cPUd+ywQiJD3gR1UY04UcfAU?= =?utf-8?q?JXF8G4U1EP/yqqs9ax4qBW7MnGBrm8qI3Z0QDEn9Dq0ktvrmErKsAHHs2GezQdSGo?= =?utf-8?q?Mz22wlcJN0fPu09IJkfqXZQo7UeSphpKzjvjQAShzs8MYn3bCCDrBVM1bVT+G9758?= =?utf-8?q?rldWZEqnvmvRDXRlqSHYC1hcXFdSFi0pvRsWHLoI61L/cLqXvge50HefmU2BNOaUo?= =?utf-8?q?jNtP48tj1ftSeI1pkeKMpGHleALSnLW3g3b6smoUuZsi0GEcqODHP6K/NwLS7gGME?= =?utf-8?q?1r9K58FJw/uId3K6CbcfX9c3OAxBhFDma02h5aSmupD8H/vYk+wyHhH8DtkElvMqt?= =?utf-8?q?W02qYQRiqeuCJEGWEMsPjn65nwTCxQsJiVVbdYt1dLlNOeyR/onLhXJuutH+bDvTx?= =?utf-8?q?fgM2QvOrgykakK9dr3AWiJcgie/DSwIEZVUKKDhY8W2I4/aDj3vtVSM9AC0mHiM+P?= =?utf-8?q?kbZHcxYHt6SNSD3MyChxDkRnXLqxdC6FYpksB9XxhytP/rxrniOXCWBDP36oq0c6Z?= =?utf-8?q?7yMbBHHsfC82zF1hbIypGdLomwaEgMaRp7rhWuunpGP2rLe7X/Uvlcyyo+KAC3i6J?= =?utf-8?q?Yxqkv6hVT0ugfXKDjNkHCBjiOR+Ba7VOHMb/Ek4jBUwOhnyt46TKTw37SjW0KfBWc?= =?utf-8?q?9IBJ2+S5IyLq8q8a28KpWAbgpeRRihuAMT+LbR76gtIbdYtDZbiHFyL/NQ8yDBecy?= =?utf-8?q?rQohnohYFATZGpGBu2czkVXgJLAWk5S2sUwyevpsYL/+7BzNRndd1bvdR5TIXv8hX?= =?utf-8?q?ifc7/x7nxp+vuYlJfvwMQ+rlhdo5vGsG0an0DH/8ae68kwF0W0wDSkxfCShhp4hWI?= =?utf-8?q?1kbzjr3/G9pxcZpA0hfrrCCMe7lTtJDkl6D1CA70yh4ukg6F6/tx5siyZywwfBHAV?= =?utf-8?q?j/i4YTcfTDq2PQuR2NXjstnkxU/5czhAOkabeIYfw0Ts4ULFZpldvt9sT9WkPu+FJ?= =?utf-8?q?s5UtuPuqh5c/JkW/qVqdGSErojhZqxzo/EHOhRd+tB1QMlMjwNIMNms=3D?= 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)(376014)(1800799024)(921020)(38350700014); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?q?zeudhtiqrQg6mpGJoTM7tQE981aa?= =?utf-8?q?QOf58Ok77BruuKjrqY2fVJ3oaWWCl9fHUIx4D7jczDuNfbhdrTefpi3qr4tpCUkxt?= =?utf-8?q?ERlrw79DkYx+1smXpcKlwcYcIdxLH8bmzXwPt0913pc1n6PSFraY53u9fAA2nEXnb?= =?utf-8?q?fGKpMg/qI0R3WHAJ2+NPvfwHBAToH4gHjHoIV0uPN5XtqN+XOTfwaZxWo7rSuDzkm?= =?utf-8?q?EvGsYwnVwc7g5Ce5PVTIBZpVwDVJa1Rit149Dh2aYVk3oJPSyYWMM0ir59Qi8uZA3?= =?utf-8?q?WtvoDVg5LIp627KRB0QRK7ll2C30raG5qiXh/apPx6IgGlXiExS/Ccd280hI/lCjw?= =?utf-8?q?LXDS3I7/g5F6s/Fhm8R29XxONCtCFi02gYismCEAvweWLJEaDZclcI/rncdhxvJmf?= =?utf-8?q?eIfCRVTo4nXHB9aN2T1lsJgr1LPTmGKDuL9mNPy9AjwjhireEVYlbulYmC56Z/7qT?= =?utf-8?q?SJYLTbkZ7m8IqpCh4nnoD8PBnF7ohuFoiQpD058uYGcryhRkSBA+VQOPUseyXnrZS?= =?utf-8?q?mF2TZVDqoPxnidjJp56vmD2X2fA91KeXKsvq3YAQXElzZ1yNjLH6B+AZlb9/C8AYp?= =?utf-8?q?j+BrQyb8asoB1RfDo2aPP0b8lUQArrv5dMbYiWEPTnkL9+DSL8JpNj8b2hqDxzZkn?= =?utf-8?q?Ef5G5eV6iiHDCOHd7TSQ8g1PqVu11fcn26wh6XmQgkZuedg65Ud3iMagMyx1WA+6B?= =?utf-8?q?eq//4F21tfuWYpiISB0Lb9R2cWJieW1Tog0yBxOTmEerYYnCCie8xruMkyeDGE9O5?= =?utf-8?q?u3hXx17PcO6DIggeA9oQ3czY2T6KM/sE+WnTanc30+dj4biQ+BvtDg5vNodfR6Cwk?= =?utf-8?q?hGd/yhN2ucyWsMLziF+ak/TkGDWvz3v0K7MV7Zl7evaGQ2RY/SGYByHF0OtXCRYwe?= =?utf-8?q?xlHpv9PL7QD7SxV5jpIY6dbqajJBwRfsKSVzj4TbKDzZ/6YckEzThIbbmuH3wGpVF?= =?utf-8?q?FN6ONvLgvNzZIsjJjJkvzhFy+LjNNZPJUEdUIABRPfOgmgmgG4TY6D2GiE897apQu?= =?utf-8?q?pH3QNy1BO47lbNuJM1B3tv6TGZvMdwcF0Kt/HgVeaMsaLm/8B9m6tFq53tfHkHoaQ?= =?utf-8?q?pa1Gj1ujoJA18nKufBJdAQ5unkWeYQFLCXj9ujs0udvrowKdmgQoqUAO9EV4FX+Yr?= =?utf-8?q?6a4PgiZErSzmUgzzxhtDbvpv2OWyZMMvrPW0VTf4k+vint0IAO9ERTc1QxFcGRuHG?= =?utf-8?q?Grr3AdK4blJ1URqkJ2b24lrxRViGAPQawJpTJ0EcMAd8wMkXotaF8Ulo8tSvoLX/1?= =?utf-8?q?JIG7gQXXint9wsiM9efH7qbdgrKVaLMijBMFdO2nEtbCjHXHeGNk3eeMqj9IWgRfG?= =?utf-8?q?m+MXHiiNjJGOOq2DcgrlnNhd5ITZVrLx2+TqIlsh7xdrPsjFxr9v6XslF7hHVe5zG?= =?utf-8?q?dG0KYojg+9KD6ZKLpfyST2090q2CJyw17rlM0mJBkc08W4ECcj/i+wUvzFM+JakY1?= =?utf-8?q?P6nsdvduhjarsAHE4ue0Cqb0HT9HtCcyQXf+uo1v7w0Nh7UI+MwGfRPjZ6Y/tctyz?= =?utf-8?q?Ph/WyNQJP+iMWQmtSDszCOgv6bRWCBE9JA=3D=3D?= X-OriginatorOrg: iopsys.eu X-MS-Exchange-CrossTenant-Network-Message-Id: 0dde652e-003b-437f-f17d-08dcd11e2888 X-MS-Exchange-CrossTenant-AuthSource: GV2PR08MB8121.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 09 Sep 2024 22:24:24.0793 (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: Yk45tyKK2hOMW7oQDs2k989QpVTf7Qn/m1HeayG2gpcu4Z90ydWFx/9KktyTCjkiG5s+uDf/7RuPWTeWBhsAMzrlvfPe2vEI1BpTTpPLJtQ= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DU0PR08MB9935 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 only spinand on_die ecc is supported for a moment Signed-off-by: Mikhail Kshevetskiy --- drivers/mtd/nand/Makefile | 2 +- drivers/mtd/nand/core.c | 130 +++++++++++++++- drivers/mtd/nand/ecc.c | 249 ++++++++++++++++++++++++++++++ drivers/mtd/nand/spi/core.c | 207 ++++++++++++++++++++----- drivers/mtd/nand/spi/foresee.c | 2 +- drivers/mtd/nand/spi/macronix.c | 7 +- drivers/mtd/nand/spi/micron.c | 2 +- drivers/mtd/nand/spi/toshiba.c | 10 +- drivers/mtd/nand/spi/winbond.c | 10 +- include/linux/mtd/nand.h | 261 ++++++++++++++++++++++++++++++-- include/linux/mtd/spinand.h | 13 +- include/spi-mem.h | 2 + 12 files changed, 830 insertions(+), 65 deletions(-) create mode 100644 drivers/mtd/nand/ecc.c diff --git a/drivers/mtd/nand/Makefile b/drivers/mtd/nand/Makefile index 96e186600a1..56179188e92 100644 --- a/drivers/mtd/nand/Makefile +++ b/drivers/mtd/nand/Makefile @@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0+ ifeq ($(CONFIG_SPL_BUILD)$(CONFIG_TPL_BUILD),) -nandcore-objs := core.o bbt.o +nandcore-objs := core.o bbt.o ecc.o obj-$(CONFIG_MTD_NAND_CORE) += nandcore.o obj-$(CONFIG_MTD_RAW_NAND) += raw/ obj-$(CONFIG_MTD_SPI_NAND) += spi/ diff --git a/drivers/mtd/nand/core.c b/drivers/mtd/nand/core.c index 472ad0bdefb..6c90d576de3 100644 --- a/drivers/mtd/nand/core.c +++ b/drivers/mtd/nand/core.c @@ -129,7 +129,7 @@ EXPORT_SYMBOL_GPL(nanddev_isreserved); * * Return: 0 in case of success, a negative error code otherwise. */ -static int nanddev_erase(struct nand_device *nand, const struct nand_pos *pos) +int nanddev_erase(struct nand_device *nand, const struct nand_pos *pos) { unsigned int entry; @@ -187,6 +187,134 @@ int nanddev_mtd_erase(struct mtd_info *mtd, struct erase_info *einfo) } EXPORT_SYMBOL_GPL(nanddev_mtd_erase); +/** + * nanddev_get_ecc_engine() - Find and get a suitable ECC engine + * @nand: NAND device + */ +static int nanddev_get_ecc_engine(struct nand_device *nand) +{ + int engine_type; + + /* Read the user desires in terms of ECC engine/configuration */ + of_get_nand_ecc_user_config(nand); + + engine_type = nand->ecc.user_conf.engine_type; + if (engine_type == NAND_ECC_ENGINE_TYPE_INVALID) + engine_type = nand->ecc.defaults.engine_type; + + switch (engine_type) { + case NAND_ECC_ENGINE_TYPE_NONE: + return 0; + case NAND_ECC_ENGINE_TYPE_SOFT: + nand->ecc.engine = nand_ecc_get_sw_engine(nand); + break; + case NAND_ECC_ENGINE_TYPE_ON_DIE: + nand->ecc.engine = nand_ecc_get_on_die_hw_engine(nand); + break; + case NAND_ECC_ENGINE_TYPE_ON_HOST: + nand->ecc.engine = nand_ecc_get_on_host_hw_engine(nand); + if (PTR_ERR(nand->ecc.engine) == -EPROBE_DEFER) + return -EPROBE_DEFER; + break; + default: + pr_err("Missing ECC engine type\n"); + } + + if (!nand->ecc.engine) + return -EINVAL; + + return 0; +} + +/** + * nanddev_put_ecc_engine() - Dettach and put the in-use ECC engine + * @nand: NAND device + */ +static int nanddev_put_ecc_engine(struct nand_device *nand) +{ + switch (nand->ecc.ctx.conf.engine_type) { + case NAND_ECC_ENGINE_TYPE_ON_HOST: + nand_ecc_put_on_host_hw_engine(nand); + break; + case NAND_ECC_ENGINE_TYPE_NONE: + case NAND_ECC_ENGINE_TYPE_SOFT: + case NAND_ECC_ENGINE_TYPE_ON_DIE: + default: + break; + } + + return 0; +} + +/** + * nanddev_find_ecc_configuration() - Find a suitable ECC configuration + * @nand: NAND device + */ +static int nanddev_find_ecc_configuration(struct nand_device *nand) +{ + int ret; + + if (!nand->ecc.engine) + return -ENOTSUPP; + + ret = nand_ecc_init_ctx(nand); + if (ret) + return ret; + + if (!nand_ecc_is_strong_enough(nand)) + pr_warn("WARNING: %s: the ECC used on your system is too weak compared to the one required by the NAND chip\n", + nand->mtd->name); + + return 0; +} + +/** + * nanddev_ecc_engine_init() - Initialize an ECC engine for the chip + * @nand: NAND device + */ +int nanddev_ecc_engine_init(struct nand_device *nand) +{ + int ret; + + /* Look for the ECC engine to use */ + ret = nanddev_get_ecc_engine(nand); + if (ret) { + if (ret != -EPROBE_DEFER) + pr_err("No ECC engine found\n"); + + return ret; + } + + /* No ECC engine requested */ + if (!nand->ecc.engine) + return 0; + + /* Configure the engine: balance user input and chip requirements */ + ret = nanddev_find_ecc_configuration(nand); + if (ret) { + pr_err("No suitable ECC configuration\n"); + nanddev_put_ecc_engine(nand); + + return ret; + } + + return 0; +} +EXPORT_SYMBOL_GPL(nanddev_ecc_engine_init); + +/** + * nanddev_ecc_engine_cleanup() - Cleanup ECC engine initializations + * @nand: NAND device + */ +void nanddev_ecc_engine_cleanup(struct nand_device *nand) +{ + if (nand->ecc.engine) + nand_ecc_cleanup_ctx(nand); + + nanddev_put_ecc_engine(nand); +} +EXPORT_SYMBOL_GPL(nanddev_ecc_engine_cleanup); + /** * nanddev_init() - Initialize a NAND device * @nand: NAND device diff --git a/drivers/mtd/nand/ecc.c b/drivers/mtd/nand/ecc.c new file mode 100644 index 00000000000..58cbe7deaac --- /dev/null +++ b/drivers/mtd/nand/ecc.c @@ -0,0 +1,249 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Generic Error-Correcting Code (ECC) engine + * + * Copyright (C) 2019 Macronix + * Author: + * Miquèl RAYNAL + * + * + * This file describes the abstraction of any NAND ECC engine. It has been + * designed to fit most cases, including parallel NANDs and SPI-NANDs. + * + * There are three main situations where instantiating this ECC engine makes + * sense: + * - external: The ECC engine is outside the NAND pipeline, typically this + * is a software ECC engine, or an hardware engine that is + * outside the NAND controller pipeline. + * - pipelined: The ECC engine is inside the NAND pipeline, ie. on the + * controller's side. This is the case of most of the raw NAND + * controllers. In the pipeline case, the ECC bytes are + * generated/data corrected on the fly when a page is + * written/read. + * - ondie: The ECC engine is inside the NAND pipeline, on the chip's side. + * Some NAND chips can correct themselves the data. + * + * Besides the initial setup and final cleanups, the interfaces are rather + * simple: + * - prepare: Prepare an I/O request. Enable/disable the ECC engine based on + * the I/O request type. In case of software correction or external + * engine, this step may involve to derive the ECC bytes and place + * them in the OOB area before a write. + * - finish: Finish an I/O request. Correct the data in case of a read + * request and report the number of corrected bits/uncorrectable + * errors. Most likely empty for write operations, unless you have + * hardware specific stuff to do, like shutting down the engine to + * save power. + * + * The I/O request should be enclosed in a prepare()/finish() pair of calls + * and will behave differently depending on the requested I/O type: + * - raw: Correction disabled + * - ecc: Correction enabled + * + * The request direction is impacting the logic as well: + * - read: Load data from the NAND chip + * - write: Store data in the NAND chip + * + * Mixing all this combinations together gives the following behavior. + * Those are just examples, drivers are free to add custom steps in their + * prepare/finish hook. + * + * [external ECC engine] + * - external + prepare + raw + read: do nothing + * - external + finish + raw + read: do nothing + * - external + prepare + raw + write: do nothing + * - external + finish + raw + write: do nothing + * - external + prepare + ecc + read: do nothing + * - external + finish + ecc + read: calculate expected ECC bytes, extract + * ECC bytes from OOB buffer, correct + * and report any bitflip/error + * - external + prepare + ecc + write: calculate ECC bytes and store them at + * the right place in the OOB buffer based + * on the OOB layout + * - external + finish + ecc + write: do nothing + * + * [pipelined ECC engine] + * - pipelined + prepare + raw + read: disable the controller's ECC engine if + * activated + * - pipelined + finish + raw + read: do nothing + * - pipelined + prepare + raw + write: disable the controller's ECC engine if + * activated + * - pipelined + finish + raw + write: do nothing + * - pipelined + prepare + ecc + read: enable the controller's ECC engine if + * deactivated + * - pipelined + finish + ecc + read: check the status, report any + * error/bitflip + * - pipelined + prepare + ecc + write: enable the controller's ECC engine if + * deactivated + * - pipelined + finish + ecc + write: do nothing + * + * [ondie ECC engine] + * - ondie + prepare + raw + read: send commands to disable the on-chip ECC + * engine if activated + * - ondie + finish + raw + read: do nothing + * - ondie + prepare + raw + write: send commands to disable the on-chip ECC + * engine if activated + * - ondie + finish + raw + write: do nothing + * - ondie + prepare + ecc + read: send commands to enable the on-chip ECC + * engine if deactivated + * - ondie + finish + ecc + read: send commands to check the status, report + * any error/bitflip + * - ondie + prepare + ecc + write: send commands to enable the on-chip ECC + * engine if deactivated + * - ondie + finish + ecc + write: do nothing + */ + +#ifndef __UBOOT__ +#include +#include +#include +#include +#include +#endif +#include + +/** + * nand_ecc_init_ctx - Init the ECC engine context + * @nand: the NAND device + * + * On success, the caller is responsible of calling @nand_ecc_cleanup_ctx(). + */ +int nand_ecc_init_ctx(struct nand_device *nand) +{ + if (!nand->ecc.engine || !nand->ecc.engine->ops->init_ctx) + return 0; + + return nand->ecc.engine->ops->init_ctx(nand); +} +EXPORT_SYMBOL(nand_ecc_init_ctx); + +/** + * nand_ecc_cleanup_ctx - Cleanup the ECC engine context + * @nand: the NAND device + */ +void nand_ecc_cleanup_ctx(struct nand_device *nand) +{ + if (nand->ecc.engine && nand->ecc.engine->ops->cleanup_ctx) + nand->ecc.engine->ops->cleanup_ctx(nand); +} +EXPORT_SYMBOL(nand_ecc_cleanup_ctx); + +/** + * nand_ecc_prepare_io_req - Prepare an I/O request + * @nand: the NAND device + * @req: the I/O request + */ +int nand_ecc_prepare_io_req(struct nand_device *nand, + struct nand_page_io_req *req) +{ + if (!nand->ecc.engine || !nand->ecc.engine->ops->prepare_io_req) + return 0; + + return nand->ecc.engine->ops->prepare_io_req(nand, req); +} +EXPORT_SYMBOL(nand_ecc_prepare_io_req); + +/** + * nand_ecc_finish_io_req - Finish an I/O request + * @nand: the NAND device + * @req: the I/O request + */ +int nand_ecc_finish_io_req(struct nand_device *nand, + struct nand_page_io_req *req) +{ + if (!nand->ecc.engine || !nand->ecc.engine->ops->finish_io_req) + return 0; + + return nand->ecc.engine->ops->finish_io_req(nand, req); +} +EXPORT_SYMBOL(nand_ecc_finish_io_req); + +void of_get_nand_ecc_user_config(struct nand_device *nand) +{ + nand->ecc.user_conf.engine_type = NAND_ECC_ENGINE_TYPE_ON_DIE; + nand->ecc.user_conf.algo = NAND_ECC_ALGO_UNKNOWN; + nand->ecc.user_conf.placement = NAND_ECC_PLACEMENT_UNKNOWN; +} +EXPORT_SYMBOL(of_get_nand_ecc_user_config); + +/** + * nand_ecc_is_strong_enough - Check if the chip configuration meets the + * datasheet requirements. + * + * @nand: Device to check + * + * If our configuration corrects A bits per B bytes and the minimum + * required correction level is X bits per Y bytes, then we must ensure + * both of the following are true: + * + * (1) A / B >= X / Y + * (2) A >= X + * + * Requirement (1) ensures we can correct for the required bitflip density. + * Requirement (2) ensures we can correct even when all bitflips are clumped + * in the same sector. + */ +bool nand_ecc_is_strong_enough(struct nand_device *nand) +{ + const struct nand_ecc_props *reqs = nanddev_get_ecc_requirements(nand); + const struct nand_ecc_props *conf = nanddev_get_ecc_conf(nand); + struct mtd_info *mtd = nanddev_to_mtd(nand); + int corr, ds_corr; + + if (conf->step_size == 0 || reqs->step_size == 0) + /* Not enough information */ + return true; + + /* + * We get the number of corrected bits per page to compare + * the correction density. + */ + corr = (mtd->writesize * conf->strength) / conf->step_size; + ds_corr = (mtd->writesize * reqs->strength) / reqs->step_size; + + return corr >= ds_corr && conf->strength >= reqs->strength; +} +EXPORT_SYMBOL(nand_ecc_is_strong_enough); + +struct nand_ecc_engine *nand_ecc_get_sw_engine(struct nand_device *nand) +{ + unsigned int algo = nand->ecc.user_conf.algo; + + if (algo == NAND_ECC_ALGO_UNKNOWN) + algo = nand->ecc.defaults.algo; + + switch (algo) { + case NAND_ECC_ALGO_HAMMING: + return nand_ecc_sw_hamming_get_engine(); + case NAND_ECC_ALGO_BCH: + return nand_ecc_sw_bch_get_engine(); + default: + break; + } + + return NULL; +} +EXPORT_SYMBOL(nand_ecc_get_sw_engine); + +struct nand_ecc_engine *nand_ecc_get_on_die_hw_engine(struct nand_device *nand) +{ + return nand->ecc.ondie_engine; +} +EXPORT_SYMBOL(nand_ecc_get_on_die_hw_engine); + +struct nand_ecc_engine *nand_ecc_get_on_host_hw_engine(struct nand_device *nand) +{ + return NULL; +} +EXPORT_SYMBOL(nand_ecc_get_on_host_hw_engine); + +void nand_ecc_put_on_host_hw_engine(struct nand_device *nand) +{ +} +EXPORT_SYMBOL(nand_ecc_put_on_host_hw_engine); + +#ifndef __UBOOT__ +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Miquel Raynal "); +MODULE_DESCRIPTION("Generic ECC engine"); +#endif /* __UBOOT__ */ diff --git a/drivers/mtd/nand/spi/core.c b/drivers/mtd/nand/spi/core.c index d5cb9026246..70f07be06b0 100644 --- a/drivers/mtd/nand/spi/core.c +++ b/drivers/mtd/nand/spi/core.c @@ -239,7 +239,7 @@ static int spinand_check_ecc_status(struct spinand_device *spinand, u8 status) * fixed, so let's return the maximum possible value so that * wear-leveling layers move the data immediately. */ - return nand->eccreq.strength; + return nanddev_get_ecc_conf(nand)->strength; case STATUS_ECC_UNCOR_ERROR: return -EBADMSG; @@ -275,6 +275,92 @@ static const struct mtd_ooblayout_ops spinand_noecc_ooblayout = { .rfree = spinand_noecc_ooblayout_free, }; +static int spinand_ondie_ecc_init_ctx(struct nand_device *nand) +{ + struct spinand_device *spinand = nand_to_spinand(nand); + struct mtd_info *mtd = nanddev_to_mtd(nand); + struct spinand_ondie_ecc_conf *engine_conf; + + nand->ecc.ctx.conf.engine_type = NAND_ECC_ENGINE_TYPE_ON_DIE; + nand->ecc.ctx.conf.step_size = nand->ecc.requirements.step_size; + nand->ecc.ctx.conf.strength = nand->ecc.requirements.strength; + + engine_conf = kzalloc(sizeof(*engine_conf), GFP_KERNEL); + if (!engine_conf) + return -ENOMEM; + + nand->ecc.ctx.priv = engine_conf; + + if (spinand->eccinfo.ooblayout) + mtd_set_ooblayout(mtd, spinand->eccinfo.ooblayout); + else + mtd_set_ooblayout(mtd, &spinand_noecc_ooblayout); + + return 0; +} + +static void spinand_ondie_ecc_cleanup_ctx(struct nand_device *nand) +{ + kfree(nand->ecc.ctx.priv); +} + +static int spinand_ondie_ecc_prepare_io_req(struct nand_device *nand, + struct nand_page_io_req *req) +{ + struct spinand_device *spinand = nand_to_spinand(nand); + bool enable = (req->mode != MTD_OPS_RAW); + + memset(spinand->oobbuf, 0xff, nanddev_per_page_oobsize(nand)); + + /* Only enable or disable the engine */ + return spinand_ecc_enable(spinand, enable); +} + +static int spinand_ondie_ecc_finish_io_req(struct nand_device *nand, + struct nand_page_io_req *req) +{ + struct spinand_ondie_ecc_conf *engine_conf = nand->ecc.ctx.priv; + struct spinand_device *spinand = nand_to_spinand(nand); + struct mtd_info *mtd = spinand_to_mtd(spinand); + int ret; + + if (req->mode == MTD_OPS_RAW) + return 0; + + /* Nothing to do when finishing a page write */ + if (req->type == NAND_PAGE_WRITE) + return 0; + + /* Finish a page read: check the status, report errors/bitflips */ + ret = spinand_check_ecc_status(spinand, engine_conf->status); + if (ret == -EBADMSG) + mtd->ecc_stats.failed++; + else if (ret > 0) + mtd->ecc_stats.corrected += ret; + + return ret; +} + +static struct nand_ecc_engine_ops spinand_ondie_ecc_engine_ops = { + .init_ctx = spinand_ondie_ecc_init_ctx, + .cleanup_ctx = spinand_ondie_ecc_cleanup_ctx, + .prepare_io_req = spinand_ondie_ecc_prepare_io_req, + .finish_io_req = spinand_ondie_ecc_finish_io_req, +}; + +static struct nand_ecc_engine spinand_ondie_ecc_engine = { + .ops = &spinand_ondie_ecc_engine_ops, +}; + +static void spinand_ondie_ecc_save_status(struct nand_device *nand, u8 status) +{ + struct spinand_ondie_ecc_conf *engine_conf = nand->ecc.ctx.priv; + + if (nand->ecc.ctx.conf.engine_type == NAND_ECC_ENGINE_TYPE_ON_DIE && + engine_conf) + engine_conf->status = status; +} + static int spinand_write_enable_op(struct spinand_device *spinand) { struct spi_mem_op op = SPINAND_WR_EN_DIS_OP(true); @@ -317,7 +403,10 @@ static int spinand_read_from_cache_op(struct spinand_device *spinand, } } - rdesc = spinand->dirmaps[req->pos.plane].rdesc; + if (req->mode == MTD_OPS_RAW) + rdesc = spinand->dirmaps[req->pos.plane].rdesc; + else + rdesc = spinand->dirmaps[req->pos.plane].rdesc_ecc; while (nbytes) { ret = spi_mem_dirmap_read(rdesc, column, nbytes, buf); @@ -366,9 +455,12 @@ static int spinand_write_to_cache_op(struct spinand_device *spinand, * must fill the page cache entirely even if we only want to program * the data portion of the page, otherwise we might corrupt the BBM or * user data previously programmed in OOB area. + * + * Only reset the data buffer manually, the OOB buffer is prepared by + * ECC engines ->prepare_io_req() callback. */ nbytes = nanddev_page_size(nand) + nanddev_per_page_oobsize(nand); - memset(spinand->databuf, 0xff, nbytes); + memset(spinand->databuf, 0xff, nanddev_page_size(nand)); if (req->datalen) memcpy(spinand->databuf + req->dataoffs, req->databuf.out, @@ -385,7 +477,10 @@ static int spinand_write_to_cache_op(struct spinand_device *spinand, req->ooblen); } - wdesc = spinand->dirmaps[req->pos.plane].wdesc; + if (req->mode == MTD_OPS_RAW) + wdesc = spinand->dirmaps[req->pos.plane].wdesc; + else + wdesc = spinand->dirmaps[req->pos.plane].wdesc_ecc; while (nbytes) { ret = spi_mem_dirmap_write(wdesc, column, nbytes, buf); @@ -498,12 +593,16 @@ static int spinand_lock_block(struct spinand_device *spinand, u8 lock) } static int spinand_read_page(struct spinand_device *spinand, - const struct nand_page_io_req *req, - bool ecc_enabled) + const struct nand_page_io_req *req) { + struct nand_device *nand = spinand_to_nand(spinand); u8 status; int ret; + ret = nand_ecc_prepare_io_req(nand, (struct nand_page_io_req *)req); + if (ret) + return ret; + ret = spinand_load_page_op(spinand, req); if (ret) return ret; @@ -515,22 +614,26 @@ static int spinand_read_page(struct spinand_device *spinand, if (ret < 0) return ret; + spinand_ondie_ecc_save_status(nand, status); + ret = spinand_read_from_cache_op(spinand, req); if (ret) return ret; - if (!ecc_enabled) - return 0; - - return spinand_check_ecc_status(spinand, status); + return nand_ecc_finish_io_req(nand, (struct nand_page_io_req *)req); } static int spinand_write_page(struct spinand_device *spinand, const struct nand_page_io_req *req) { + struct nand_device *nand = spinand_to_nand(spinand); u8 status; int ret; + ret = nand_ecc_prepare_io_req(nand, (struct nand_page_io_req *)req); + if (ret) + return ret; + ret = spinand_write_enable_op(spinand); if (ret) return ret; @@ -550,7 +653,7 @@ static int spinand_write_page(struct spinand_device *spinand, if (!ret && (status & STATUS_PROG_FAILED)) return -EIO; - return ret; + return nand_ecc_finish_io_req(nand, (struct nand_page_io_req *)req); } static int spinand_mtd_read(struct mtd_info *mtd, loff_t from, @@ -580,21 +683,14 @@ static int spinand_mtd_read(struct mtd_info *mtd, loff_t from, if (ret) break; - ret = spinand_ecc_enable(spinand, !disable_ecc); - if (ret) - break; - - ret = spinand_read_page(spinand, &iter.req, !disable_ecc); + ret = spinand_read_page(spinand, &iter.req); if (ret < 0 && ret != -EBADMSG) break; - if (ret == -EBADMSG) { + if (ret == -EBADMSG) ecc_failed = true; - mtd->ecc_stats.failed++; - } else { - mtd->ecc_stats.corrected += ret; + else max_bitflips = max_t(unsigned int, max_bitflips, ret); - } ret = 0; ops->retlen += iter.req.datalen; @@ -635,10 +731,6 @@ static int spinand_mtd_write(struct mtd_info *mtd, loff_t to, if (ret) break; - ret = spinand_ecc_enable(spinand, !disable_ecc); - if (ret) - break; - ret = spinand_write_page(spinand, &iter.req); if (ret) break; @@ -667,7 +759,7 @@ static bool spinand_isbad(struct nand_device *nand, const struct nand_pos *pos) }; spinand_select_target(spinand, pos->target); - spinand_read_page(spinand, &req, false); + spinand_read_page(spinand, &req); if (marker[0] != 0xff || marker[1] != 0xff) return true; @@ -835,6 +927,36 @@ static int spinand_create_dirmap(struct spinand_device *spinand, spinand->dirmaps[plane].rdesc = desc; + if (nand->ecc.engine->integration != NAND_ECC_ENGINE_INTEGRATION_PIPELINED) { + spinand->dirmaps[plane].wdesc_ecc = spinand->dirmaps[plane].wdesc; + spinand->dirmaps[plane].rdesc_ecc = spinand->dirmaps[plane].rdesc; + + return 0; + } + + info.op_tmpl = *spinand->op_templates.update_cache; + info.op_tmpl.data.ecc = true; + desc = spi_mem_dirmap_create(spinand->slave, &info); + if (IS_ERR(desc)) { + spi_mem_dirmap_destroy(spinand->dirmaps[plane].wdesc); + spi_mem_dirmap_destroy(spinand->dirmaps[plane].rdesc); + return PTR_ERR(desc); + } + + spinand->dirmaps[plane].wdesc_ecc = desc; + + info.op_tmpl = *spinand->op_templates.read_cache; + info.op_tmpl.data.ecc = true; + desc = spi_mem_dirmap_create(spinand->slave, &info); + if (IS_ERR(desc)) { + spi_mem_dirmap_destroy(spinand->dirmaps[plane].wdesc); + spi_mem_dirmap_destroy(spinand->dirmaps[plane].rdesc); + spi_mem_dirmap_destroy(spinand->dirmaps[plane].wdesc_ecc); + return PTR_ERR(desc); + } + + spinand->dirmaps[plane].rdesc_ecc = desc; + return 0; } @@ -1019,7 +1141,7 @@ int spinand_match_and_init(struct spinand_device *spinand, continue; nand->memorg = table[i].memorg; - nand->eccreq = table[i].eccreq; + nanddev_set_ecc_requirements(nand, &table[i].eccreq); spinand->eccinfo = table[i].eccinfo; spinand->flags = table[i].flags; spinand->id.len = 1 + table[i].devid.len; @@ -1171,6 +1293,15 @@ static int spinand_init(struct spinand_device *spinand) if (ret) goto err_manuf_cleanup; + /* SPI-NAND default ECC engine is on-die */ + nand->ecc.defaults.engine_type = NAND_ECC_ENGINE_TYPE_ON_DIE; + nand->ecc.ondie_engine = &spinand_ondie_ecc_engine; + + spinand_ecc_enable(spinand, false); + ret = nanddev_ecc_engine_init(nand); + if (ret) + goto err_cleanup_nanddev; + mtd->_read_oob = spinand_mtd_read; mtd->_write_oob = spinand_mtd_write; mtd->_block_isbad = spinand_mtd_block_isbad; @@ -1178,27 +1309,31 @@ static int spinand_init(struct spinand_device *spinand) mtd->_block_isreserved = spinand_mtd_block_isreserved; mtd->_erase = spinand_mtd_erase; - if (spinand->eccinfo.ooblayout) - mtd_set_ooblayout(mtd, spinand->eccinfo.ooblayout); - else - mtd_set_ooblayout(mtd, &spinand_noecc_ooblayout); - - ret = mtd_ooblayout_count_freebytes(mtd); - if (ret < 0) - goto err_cleanup_nanddev; + if (nand->ecc.engine) { + ret = mtd_ooblayout_count_freebytes(mtd); + if (ret < 0) + goto err_cleanup_ecc_engine; + } mtd->oobavail = ret; + /* Propagate ECC information to mtd_info */ + mtd->ecc_strength = nanddev_get_ecc_conf(nand)->strength; + mtd->ecc_step_size = nanddev_get_ecc_conf(nand)->step_size; + ret = spinand_create_dirmaps(spinand); if (ret) { dev_err(dev, "Failed to create direct mappings for read/write operations (err = %d)\n", ret); - goto err_cleanup_nanddev; + goto err_cleanup_ecc_engine; } return 0; +err_cleanup_ecc_engine: + nanddev_ecc_engine_cleanup(nand); + err_cleanup_nanddev: nanddev_cleanup(nand); diff --git a/drivers/mtd/nand/spi/foresee.c b/drivers/mtd/nand/spi/foresee.c index 7d141cdd658..6229c959b2c 100644 --- a/drivers/mtd/nand/spi/foresee.c +++ b/drivers/mtd/nand/spi/foresee.c @@ -60,7 +60,7 @@ static int f35sqa002g_ecc_get_status(struct spinand_device *spinand, u8 status) return 0; case STATUS_ECC_HAS_BITFLIPS: - return nand->eccreq.strength; + return nanddev_get_ecc_conf(nand)->strength; default: break; diff --git a/drivers/mtd/nand/spi/macronix.c b/drivers/mtd/nand/spi/macronix.c index 3d4a7f0c3cb..c2a7aa2da96 100644 --- a/drivers/mtd/nand/spi/macronix.c +++ b/drivers/mtd/nand/spi/macronix.c @@ -87,11 +87,12 @@ static int mx35lf1ge4ab_ecc_get_status(struct spinand_device *spinand, * data around if it's not necessary. */ if (mx35lf1ge4ab_get_eccsr(spinand, spinand->scratchbuf)) - return nand->eccreq.strength; + return nanddev_get_ecc_conf(nand)->strength; eccsr = *spinand->scratchbuf; - if (WARN_ON(eccsr > nand->eccreq.strength || !eccsr)) - return nand->eccreq.strength; + if (WARN_ON(eccsr > nanddev_get_ecc_conf(nand)->strength || + !eccsr)) + return nanddev_get_ecc_conf(nand)->strength; return eccsr; diff --git a/drivers/mtd/nand/spi/micron.c b/drivers/mtd/nand/spi/micron.c index b538213ed8e..01c177facfb 100644 --- a/drivers/mtd/nand/spi/micron.c +++ b/drivers/mtd/nand/spi/micron.c @@ -14,7 +14,7 @@ #define SPINAND_MFR_MICRON 0x2c -#define MICRON_STATUS_ECC_MASK GENMASK(7, 4) +#define MICRON_STATUS_ECC_MASK GENMASK(6, 4) #define MICRON_STATUS_ECC_NO_BITFLIPS (0 << 4) #define MICRON_STATUS_ECC_1TO3_BITFLIPS (1 << 4) #define MICRON_STATUS_ECC_4TO6_BITFLIPS (3 << 4) diff --git a/drivers/mtd/nand/spi/toshiba.c b/drivers/mtd/nand/spi/toshiba.c index ad48b1c7c8a..bf7da57de13 100644 --- a/drivers/mtd/nand/spi/toshiba.c +++ b/drivers/mtd/nand/spi/toshiba.c @@ -76,7 +76,7 @@ static int tx58cxgxsxraix_ecc_get_status(struct spinand_device *spinand, { struct nand_device *nand = spinand_to_nand(spinand); u8 mbf = 0; - struct spi_mem_op op = SPINAND_GET_FEATURE_OP(0x30, &mbf); + struct spi_mem_op op = SPINAND_GET_FEATURE_OP(0x30, spinand->scratchbuf); switch (status & STATUS_ECC_MASK) { case STATUS_ECC_NO_BITFLIPS: @@ -93,12 +93,12 @@ static int tx58cxgxsxraix_ecc_get_status(struct spinand_device *spinand, * data around if it's not necessary. */ if (spi_mem_exec_op(spinand->slave, &op)) - return nand->eccreq.strength; + return nanddev_get_ecc_conf(nand)->strength; - mbf >>= 4; + mbf = *(spinand->scratchbuf) >> 4; - if (WARN_ON(mbf > nand->eccreq.strength || !mbf)) - return nand->eccreq.strength; + if (WARN_ON(mbf > nanddev_get_ecc_conf(nand)->strength || !mbf)) + return nanddev_get_ecc_conf(nand)->strength; return mbf; diff --git a/drivers/mtd/nand/spi/winbond.c b/drivers/mtd/nand/spi/winbond.c index c62096dc2e6..d7dc1c86494 100644 --- a/drivers/mtd/nand/spi/winbond.c +++ b/drivers/mtd/nand/spi/winbond.c @@ -113,7 +113,7 @@ static int w25n02kv_ecc_get_status(struct spinand_device *spinand, { struct nand_device *nand = spinand_to_nand(spinand); u8 mbf = 0; - struct spi_mem_op op = SPINAND_GET_FEATURE_OP(0x30, &mbf); + struct spi_mem_op op = SPINAND_GET_FEATURE_OP(0x30, spinand->scratchbuf); switch (status & STATUS_ECC_MASK) { case STATUS_ECC_NO_BITFLIPS: @@ -130,12 +130,12 @@ static int w25n02kv_ecc_get_status(struct spinand_device *spinand, * data around if it's not necessary. */ if (spi_mem_exec_op(spinand->slave, &op)) - return nand->eccreq.strength; + return nanddev_get_ecc_conf(nand)->strength; - mbf >>= 4; + mbf = *(spinand->scratchbuf) >> 4; - if (WARN_ON(mbf > nand->eccreq.strength || !mbf)) - return nand->eccreq.strength; + if (WARN_ON(mbf > nanddev_get_ecc_conf(nand)->strength || !mbf)) + return nanddev_get_ecc_conf(nand)->strength; return mbf; diff --git a/include/linux/mtd/nand.h b/include/linux/mtd/nand.h index 0afdaed5715..18b9cf276ac 100644 --- a/include/linux/mtd/nand.h +++ b/include/linux/mtd/nand.h @@ -12,6 +12,8 @@ #include +struct nand_device; + /** * struct nand_memory_organization - Memory organization structure * @bits_per_cell: number of bits per NAND cell @@ -126,17 +128,72 @@ struct nand_page_io_req { }; /** - * struct nand_ecc_req - NAND ECC requirements + * enum nand_ecc_engine_type - NAND ECC engine type + * @NAND_ECC_ENGINE_TYPE_INVALID: Invalid value + * @NAND_ECC_ENGINE_TYPE_NONE: No ECC correction + * @NAND_ECC_ENGINE_TYPE_SOFT: Software ECC correction + * @NAND_ECC_ENGINE_TYPE_ON_HOST: On host hardware ECC correction + * @NAND_ECC_ENGINE_TYPE_ON_DIE: On chip hardware ECC correction + */ +enum nand_ecc_engine_type { + NAND_ECC_ENGINE_TYPE_INVALID, + NAND_ECC_ENGINE_TYPE_NONE, + NAND_ECC_ENGINE_TYPE_SOFT, + NAND_ECC_ENGINE_TYPE_ON_HOST, + NAND_ECC_ENGINE_TYPE_ON_DIE, +}; + +/** + * enum nand_ecc_placement - NAND ECC bytes placement + * @NAND_ECC_PLACEMENT_UNKNOWN: The actual position of the ECC bytes is unknown + * @NAND_ECC_PLACEMENT_OOB: The ECC bytes are located in the OOB area + * @NAND_ECC_PLACEMENT_INTERLEAVED: Syndrome layout, there are ECC bytes + * interleaved with regular data in the main + * area + */ +enum nand_ecc_placement { + NAND_ECC_PLACEMENT_UNKNOWN, + NAND_ECC_PLACEMENT_OOB, + NAND_ECC_PLACEMENT_INTERLEAVED, +}; + +/** + * enum nand_ecc_algo - NAND ECC algorithm + * @NAND_ECC_ALGO_UNKNOWN: Unknown algorithm + * @NAND_ECC_ALGO_HAMMING: Hamming algorithm + * @NAND_ECC_ALGO_BCH: Bose-Chaudhuri-Hocquenghem algorithm + * @NAND_ECC_ALGO_RS: Reed-Solomon algorithm + */ +enum nand_ecc_algo { + NAND_ECC_ALGO_UNKNOWN, + NAND_ECC_ALGO_HAMMING, + NAND_ECC_ALGO_BCH, + NAND_ECC_ALGO_RS, +}; + +/** + * struct nand_ecc_props - NAND ECC properties + * @engine_type: ECC engine type + * @placement: OOB placement (if relevant) + * @algo: ECC algorithm (if relevant) * @strength: ECC strength - * @step_size: ECC step/block size + * @step_size: Number of bytes per step + * @flags: Misc properties */ -struct nand_ecc_req { +struct nand_ecc_props { + enum nand_ecc_engine_type engine_type; + enum nand_ecc_placement placement; + enum nand_ecc_algo algo; unsigned int strength; unsigned int step_size; + unsigned int flags; }; #define NAND_ECCREQ(str, stp) { .strength = (str), .step_size = (stp) } +/* NAND ECC misc flags */ +#define NAND_ECC_MAXIMIZE_STRENGTH BIT(0) + /** * struct nand_bbt - bad block table object * @cache: in memory BBT cache @@ -145,8 +202,6 @@ struct nand_bbt { unsigned long *cache; }; -struct nand_device; - /** * struct nand_ops - NAND operations * @erase: erase a specific block. No need to check if the block is bad before @@ -169,11 +224,130 @@ struct nand_ops { bool (*isbad)(struct nand_device *nand, const struct nand_pos *pos); }; +/** + * struct nand_ecc_context - Context for the ECC engine + * @conf: basic ECC engine parameters + * @nsteps: number of ECC steps + * @total: total number of bytes used for storing ECC codes, this is used by + * generic OOB layouts + * @priv: ECC engine driver private data + */ +struct nand_ecc_context { + struct nand_ecc_props conf; + unsigned int nsteps; + unsigned int total; + void *priv; +}; + +/** + * struct nand_ecc_engine_ops - ECC engine operations + * @init_ctx: given a desired user configuration for the pointed NAND device, + * requests the ECC engine driver to setup a configuration with + * values it supports. + * @cleanup_ctx: clean the context initialized by @init_ctx. + * @prepare_io_req: is called before reading/writing a page to prepare the I/O + * request to be performed with ECC correction. + * @finish_io_req: is called after reading/writing a page to terminate the I/O + * request and ensure proper ECC correction. + */ +struct nand_ecc_engine_ops { + int (*init_ctx)(struct nand_device *nand); + void (*cleanup_ctx)(struct nand_device *nand); + int (*prepare_io_req)(struct nand_device *nand, + struct nand_page_io_req *req); + int (*finish_io_req)(struct nand_device *nand, + struct nand_page_io_req *req); +}; + +/** + * enum nand_ecc_engine_integration - How the NAND ECC engine is integrated + * @NAND_ECC_ENGINE_INTEGRATION_INVALID: Invalid value + * @NAND_ECC_ENGINE_INTEGRATION_PIPELINED: Pipelined engine, performs on-the-fly + * correction, does not need to copy + * data around + * @NAND_ECC_ENGINE_INTEGRATION_EXTERNAL: External engine, needs to bring the + * data into its own area before use + */ +enum nand_ecc_engine_integration { + NAND_ECC_ENGINE_INTEGRATION_INVALID, + NAND_ECC_ENGINE_INTEGRATION_PIPELINED, + NAND_ECC_ENGINE_INTEGRATION_EXTERNAL, +}; + +/** + * struct nand_ecc_engine - ECC engine abstraction for NAND devices + * @dev: Host device + * @node: Private field for registration time + * @ops: ECC engine operations + * @integration: How the engine is integrated with the host + * (only relevant on %NAND_ECC_ENGINE_TYPE_ON_HOST engines) + * @priv: Private data + */ +struct nand_ecc_engine { + struct device *dev; + struct list_head node; + struct nand_ecc_engine_ops *ops; + enum nand_ecc_engine_integration integration; + void *priv; +}; + +void of_get_nand_ecc_user_config(struct nand_device *nand); +int nand_ecc_init_ctx(struct nand_device *nand); +void nand_ecc_cleanup_ctx(struct nand_device *nand); +int nand_ecc_prepare_io_req(struct nand_device *nand, + struct nand_page_io_req *req); +int nand_ecc_finish_io_req(struct nand_device *nand, + struct nand_page_io_req *req); +bool nand_ecc_is_strong_enough(struct nand_device *nand); + +struct nand_ecc_engine *nand_ecc_get_sw_engine(struct nand_device *nand); +struct nand_ecc_engine *nand_ecc_get_on_die_hw_engine(struct nand_device *nand); +struct nand_ecc_engine *nand_ecc_get_on_host_hw_engine(struct nand_device *nand); +void nand_ecc_put_on_host_hw_engine(struct nand_device *nand); +struct device *nand_ecc_get_engine_dev(struct device *host); + +#if defined(CONFIG_MTD_NAND_ECC_SW_HAMMING) +struct nand_ecc_engine *nand_ecc_sw_hamming_get_engine(void); +#else +static inline struct nand_ecc_engine *nand_ecc_sw_hamming_get_engine(void) +{ + return NULL; +} +#endif + +#if defined(CONFIG_MTD_NAND_ECC_SW_BCH) +struct nand_ecc_engine *nand_ecc_sw_bch_get_engine(void); +#else +static inline struct nand_ecc_engine *nand_ecc_sw_bch_get_engine(void) +{ + return NULL; +} +#endif + +/** + * struct nand_ecc - Information relative to the ECC + * @defaults: Default values, depend on the underlying subsystem + * @requirements: ECC requirements from the NAND chip perspective + * @user_conf: User desires in terms of ECC parameters + * @ctx: ECC context for the ECC engine, derived from the device @requirements + * the @user_conf and the @defaults + * @ondie_engine: On-die ECC engine reference, if any + * @engine: ECC engine actually bound + */ +struct nand_ecc { + struct nand_ecc_props defaults; + struct nand_ecc_props requirements; + struct nand_ecc_props user_conf; + struct nand_ecc_context ctx; + struct nand_ecc_engine *ondie_engine; + struct nand_ecc_engine *engine; +}; + /** * struct nand_device - NAND device * @mtd: MTD instance attached to the NAND device * @memorg: memory layout - * @eccreq: ECC requirements + * @ecc: NAND ECC object attached to the NAND device * @rowconv: position to row address converter * @bbt: bad block table info * @ops: NAND operations attached to the NAND device @@ -181,8 +355,8 @@ struct nand_ops { * Generic NAND object. Specialized NAND layers (raw NAND, SPI NAND, OneNAND) * should declare their own NAND object embedding a nand_device struct (that's * how inheritance is done). - * struct_nand_device->memorg and struct_nand_device->eccreq should be filled - * at device detection time to reflect the NAND device + * struct_nand_device->memorg and struct_nand_device->ecc.requirements should + * be filled at device detection time to reflect the NAND device * capabilities/requirements. Once this is done nanddev_init() can be called. * It will take care of converting NAND information into MTD ones, which means * the specialized NAND layers should never manually tweak @@ -191,7 +365,7 @@ struct nand_ops { struct nand_device { struct mtd_info *mtd; struct nand_memory_organization memorg; - struct nand_ecc_req eccreq; + struct nand_ecc ecc; struct nand_row_converter rowconv; struct nand_bbt bbt; const struct nand_ops *ops; @@ -332,7 +506,7 @@ static inline unsigned int nanddev_ntargets(const struct nand_device *nand) } /** - * nanddev_neraseblocks() - Get the total number of erasablocks + * nanddev_neraseblocks() - Get the total number of eraseblocks * @nand: NAND device * * Return: the total number of eraseblocks exposed by @nand. @@ -370,6 +544,60 @@ nanddev_get_memorg(struct nand_device *nand) return &nand->memorg; } +/** + * nanddev_get_ecc_conf() - Extract the ECC configuration from a NAND device + * @nand: NAND device + */ +static inline const struct nand_ecc_props * +nanddev_get_ecc_conf(struct nand_device *nand) +{ + return &nand->ecc.ctx.conf; +} + +/** + * nanddev_get_ecc_nsteps() - Extract the number of ECC steps + * @nand: NAND device + */ +static inline unsigned int +nanddev_get_ecc_nsteps(struct nand_device *nand) +{ + return nand->ecc.ctx.nsteps; +} + +/** + * nanddev_get_ecc_bytes_per_step() - Extract the number of ECC bytes per step + * @nand: NAND device + */ +static inline unsigned int +nanddev_get_ecc_bytes_per_step(struct nand_device *nand) +{ + return nand->ecc.ctx.total / nand->ecc.ctx.nsteps; +} + +/** + * nanddev_get_ecc_requirements() - Extract the ECC requirements from a NAND + * device + * @nand: NAND device + */ +static inline const struct nand_ecc_props * +nanddev_get_ecc_requirements(struct nand_device *nand) +{ + return &nand->ecc.requirements; +} + +/** + * nanddev_set_ecc_requirements() - Assign the ECC requirements of a NAND + * device + * @nand: NAND device + * @reqs: Requirements + */ +static inline void +nanddev_set_ecc_requirements(struct nand_device *nand, + const struct nand_ecc_props *reqs) +{ + nand->ecc.requirements = *reqs; +} + int nanddev_init(struct nand_device *nand, const struct nand_ops *ops, struct module *owner); void nanddev_cleanup(struct nand_device *nand); @@ -598,7 +826,7 @@ static inline void nanddev_pos_next_eraseblock(struct nand_device *nand, } /** - * nanddev_pos_next_eraseblock() - Move a position to the next page + * nanddev_pos_next_page() - Move a position to the next page * @nand: NAND device * @pos: the position to update * @@ -708,8 +936,18 @@ static inline bool nanddev_io_iter_end(struct nand_device *nand, bool nanddev_isbad(struct nand_device *nand, const struct nand_pos *pos); bool nanddev_isreserved(struct nand_device *nand, const struct nand_pos *pos); +int nanddev_erase(struct nand_device *nand, const struct nand_pos *pos); int nanddev_markbad(struct nand_device *nand, const struct nand_pos *pos); +/* ECC related functions */ +int nanddev_ecc_engine_init(struct nand_device *nand); +void nanddev_ecc_engine_cleanup(struct nand_device *nand); + +static inline void *nand_to_ecc_ctx(struct nand_device *nand) +{ + return nand->ecc.ctx.priv; +} + /* BBT related functions */ enum nand_bbt_block_status { NAND_BBT_BLOCK_STATUS_UNKNOWN, @@ -760,5 +998,6 @@ static inline bool nanddev_bbt_is_initialized(struct nand_device *nand) /* MTD -> NAND helper functions. */ int nanddev_mtd_erase(struct mtd_info *mtd, struct erase_info *einfo); +int nanddev_mtd_max_bad_blocks(struct mtd_info *mtd, loff_t offs, size_t len); #endif /* __LINUX_MTD_NAND_H */ diff --git a/include/linux/mtd/spinand.h b/include/linux/mtd/spinand.h index 81a7b0dbbb2..3bcdbffc34a 100644 --- a/include/linux/mtd/spinand.h +++ b/include/linux/mtd/spinand.h @@ -319,6 +319,15 @@ struct spinand_ecc_info { #define SPINAND_HAS_QE_BIT BIT(0) #define SPINAND_HAS_CR_FEAT_BIT BIT(1) +/** + * struct spinand_ondie_ecc_conf - private SPI-NAND on-die ECC engine structure + * @status: status of the last wait operation that will be used in case + * ->get_status() is not populated by the spinand device. + */ +struct spinand_ondie_ecc_conf { + u8 status; +}; + /** * struct spinand_info - Structure used to describe SPI NAND chips * @model: model name @@ -342,7 +351,7 @@ struct spinand_info { struct spinand_devid devid; u32 flags; struct nand_memory_organization memorg; - struct nand_ecc_req eccreq; + struct nand_ecc_props eccreq; struct spinand_ecc_info eccinfo; struct { const struct spinand_op_variants *read_cache; @@ -391,6 +400,8 @@ struct spinand_info { struct spinand_dirmap { struct spi_mem_dirmap_desc *wdesc; struct spi_mem_dirmap_desc *rdesc; + struct spi_mem_dirmap_desc *wdesc_ecc; + struct spi_mem_dirmap_desc *rdesc_ecc; }; /** diff --git a/include/spi-mem.h b/include/spi-mem.h index 3c8e95b6f53..82dbe21fd5a 100644 --- a/include/spi-mem.h +++ b/include/spi-mem.h @@ -91,6 +91,7 @@ enum spi_mem_data_dir { * @dummy.dtr: whether the dummy bytes should be sent in DTR mode or not * @data.buswidth: number of IO lanes used to send/receive the data * @data.dtr: whether the data should be sent in DTR mode or not + * @data.ecc: whether error correction is required or not * @data.dir: direction of the transfer * @data.buf.in: input buffer * @data.buf.out: output buffer @@ -119,6 +120,7 @@ struct spi_mem_op { struct { u8 buswidth; u8 dtr : 1; + u8 ecc : 1; enum spi_mem_data_dir dir; unsigned int nbytes; /* buf.{in,out} must be DMA-able. */