Message ID | 457c1da7-61dc-2a56-4f86-47413795138c@gmail.com |
---|---|
State | New |
Headers |
Return-Path: <linux-kernel-owner@vger.kernel.org> Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:994d:0:b0:3d9:f83d:47d9 with SMTP id k13csp837791vqr; Thu, 15 Jun 2023 11:32:57 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ5pJeqis5URnq4wieabFz9geQ/LJsNqtmjshWkegkE1WfrIZJTweFLQ62tmlMbHc3RJahnR X-Received: by 2002:a05:6a00:b83:b0:65f:2fbd:370a with SMTP id g3-20020a056a000b8300b0065f2fbd370amr5639831pfj.30.1686853977317; Thu, 15 Jun 2023 11:32:57 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1686853977; cv=none; d=google.com; s=arc-20160816; b=GzXwdg8Fm+qVNxQUOMkjOON9blEAjmmgauXUWTIPVs7IDUPaBVz1DDaKfwPOT9gLgY AuCWO2PB5Fv45fz4YmT2hS1imm4RTXb9Lv/wVPLFhifE+B2hZ2sOuUePvrpx0of7SAHH GGto5/J6cBpC+72rD3ov0lU5MOY0NzJY6ohW5YnPka3X7i+ZMSxGvs+uiWMNlCTrolOM 3YW1n/A5bKs3fMzdCgjZiWiv/ctbp3xkgTV1a4vFPkqSBVEfgcggVcocwd5bEOnuCfra Fxk7JeEm7Vu8zstlD5Lq4QFu8R0DqpmXGjvtV6DphJzayIW6rHRmJeKdbLb6rvtHrjc7 8jUQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:in-reply-to :content-language:references:cc:to:subject:from:user-agent :mime-version:date:message-id:dkim-signature; bh=6YhjaIcOgdSC4loqdzWjGFqfQ0Mx8Oy4umDdDUkZduk=; b=mTe/z5E2CAhBzZHM2Bgf6pVNiFJYKGLBCFAxXaAvGdil+COAW/OTAhH+wy6RAkQTEt e8B3QpM9TNFNBtOjO6Rz/Mf/PZYghKBUOBedVSRRlu3VkMDdIcU9EgSaf8XzW5SQ0Hsb vagMcwxMUBLdAKi4iQNll06k8o2FICZTA56SrNXZSZOJHgbKDzgaO5rNYF03EXvVO70M hfbxAKE8Dj0dKgAKFFmy+whE5/yJz4haGoj60MI/22q7IuoKEMAYjNIDAq3XW2uJ0JMy qC0e6xuZK34u6SrWpsXVhopA8gQnMJuhTZ2mR++3S5zkowdXpXeAURrX+v+usH9u+PQ1 k79g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20221208 header.b=jwM1Pqg8; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id q29-20020aa7961d000000b006546d0d5832si10406871pfg.183.2023.06.15.11.32.44; Thu, 15 Jun 2023 11:32:57 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20221208 header.b=jwM1Pqg8; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229719AbjFORel (ORCPT <rfc822;maxin.john@gmail.com> + 99 others); Thu, 15 Jun 2023 13:34:41 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46054 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S238199AbjFOReh (ORCPT <rfc822;linux-kernel@vger.kernel.org>); Thu, 15 Jun 2023 13:34:37 -0400 Received: from mail-ej1-x629.google.com (mail-ej1-x629.google.com [IPv6:2a00:1450:4864:20::629]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8484D295D for <linux-kernel@vger.kernel.org>; Thu, 15 Jun 2023 10:34:29 -0700 (PDT) Received: by mail-ej1-x629.google.com with SMTP id a640c23a62f3a-982af24987fso109562166b.0 for <linux-kernel@vger.kernel.org>; Thu, 15 Jun 2023 10:34:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1686850468; x=1689442468; h=content-transfer-encoding:in-reply-to:content-language:references :cc:to:subject:from:user-agent:mime-version:date:message-id:from:to :cc:subject:date:message-id:reply-to; bh=6YhjaIcOgdSC4loqdzWjGFqfQ0Mx8Oy4umDdDUkZduk=; b=jwM1Pqg8HWVT/EJnvWaYVy3KEBqmdy1Y++omiie2N9IE8Qyoh0Lf08ez8cpR2OBQQW vfLYhT7fAUSZoBuz1+20EBDtxawgNkuuLBo2tzxhU+7xFy31ABGx3LRZShTVNxUSukSe MN+INi2UbtRiCuaNZ/WnSV2WJ3szOiGLECvIlxDJ9IBqCbtlw6C4Xpdrn91bXXv1P73l 9he9MsGsfpyL5ljmD2lphS5vamDzmtLGF6yVL7DCW8jzkEbyoRi5pZnZGqG5YQW06KFT gJlaSoNEZZd3VqHgdsstWA/OD26H98tGrow2pKaPU7h+5QPKDmrc1jHSYJeTu62/z8bX D/+Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1686850468; x=1689442468; h=content-transfer-encoding:in-reply-to:content-language:references :cc:to:subject:from:user-agent:mime-version:date:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=6YhjaIcOgdSC4loqdzWjGFqfQ0Mx8Oy4umDdDUkZduk=; b=MiSntZol9Fg8MKnrRIicTqFjqSlXeo5H9XPYgKms0I/yTz9yGBrcZGCzhIQ9KHB+xN DycK6NMXvlmWnqCiDJpyAZDVF6bfnorakNikkmCvf5W5dQYE605QV3XzNruDvELZJlGh tBDHUEEqnb2OsTJ0u8uM4u11YRXQPn2gw6AZ0sVbq0w7ujf+3IEpwUDSoM0EJD/dlraI X8l+iAw/QfSSr0pjY1z8S02YLEHdOVb1tPLHnrNI75jmFRqJ4D9S5PSeSP5lzpuCO/w4 Pl41xp0qfHfOF+vXZq5EbLS0djst3SwCxwOxeQul7PbCi+uvTmU1ZZHkokqdD7Wfnfic ej4g== X-Gm-Message-State: AC+VfDzaFmRJ15tgyk7NbO/l+q5SNEkssaZXBne0yplaTcwtSD5K507e DtHiDJpgkIwgoxWpOgK9uAQ= X-Received: by 2002:a17:907:1613:b0:96f:b58e:7e21 with SMTP id hb19-20020a170907161300b0096fb58e7e21mr23568267ejc.52.1686850467735; Thu, 15 Jun 2023 10:34:27 -0700 (PDT) Received: from [192.168.2.2] (81-204-249-205.fixed.kpn.net. [81.204.249.205]) by smtp.gmail.com with ESMTPSA id lf29-20020a170907175d00b009787062d21csm9647072ejc.77.2023.06.15.10.34.26 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 15 Jun 2023 10:34:27 -0700 (PDT) Message-ID: <457c1da7-61dc-2a56-4f86-47413795138c@gmail.com> Date: Thu, 15 Jun 2023 19:34:26 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.11.0 From: Johan Jonker <jbx6244@gmail.com> Subject: [PATCH v3 3/3] mtd: rawnand: rockchip-nand-controller: add skipbbt option To: miquel.raynal@bootlin.com Cc: richard@nod.at, vigneshr@ti.com, heiko@sntech.de, linux-mtd@lists.infradead.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, yifeng.zhao@rock-chips.com References: <0047fc52-bc45-a768-8bdd-c0f12cddc17e@gmail.com> Content-Language: en-US In-Reply-To: <0047fc52-bc45-a768-8bdd-c0f12cddc17e@gmail.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: <linux-kernel.vger.kernel.org> X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1768794596118418068?= X-GMAIL-MSGID: =?utf-8?q?1768794596118418068?= |
Series |
Fixes for Rockchip NAND controller driver
|
|
Commit Message
Johan Jonker
June 15, 2023, 5:34 p.m. UTC
On Rockchip SoCs the first boot stages are written on NAND
with help of manufacturer software that uses a different format
then the MTD framework. Skip the automatic BBT scan with the
NAND_SKIP_BBTSCAN option so that the original content is unchanged
during the driver probe.
The NAND_NO_BBM_QUIRK option allows us to erase bad blocks with
the nand_erase_nand() function and the flash_erase command.
With these options the user has the "freedom of choice" by neutral
access mode to read and write in whatever format is needed.
Signed-off-by: Johan Jonker <jbx6244@gmail.com>
---
Changes V3:
Change prefixes
Changed V2:
reword
---
I'm aware that the maintainer finds it "awful",
but it's absolute necessary to:
1: read/write boot blocks in user space without touching original content
2: format a NAND for MTD either with built in or external driver module
So we keep it include in this serie.
---
drivers/mtd/nand/raw/rockchip-nand-controller.c | 7 +++++++
1 file changed, 7 insertions(+)
--
2.30.2
Comments
Hi Johan, jbx6244@gmail.com wrote on Thu, 15 Jun 2023 19:34:26 +0200: > On Rockchip SoCs the first boot stages are written on NAND > with help of manufacturer software that uses a different format > then the MTD framework. Skip the automatic BBT scan with the > NAND_SKIP_BBTSCAN option so that the original content is unchanged > during the driver probe. > The NAND_NO_BBM_QUIRK option allows us to erase bad blocks with > the nand_erase_nand() function and the flash_erase command. > With these options the user has the "freedom of choice" by neutral > access mode to read and write in whatever format is needed. Can the boot_rom_mode thing help? For writing this part you can disable the bad block protection using debugfs and then write an externally processed file in raw mode I guess. For the boot I think I proposed a DT property. I don't remember how far the discussion went. > > Signed-off-by: Johan Jonker <jbx6244@gmail.com> > --- > > Changes V3: > Change prefixes > > Changed V2: > reword > > --- > > I'm aware that the maintainer finds it "awful", > but it's absolute necessary to: > 1: read/write boot blocks in user space without touching original content > 2: format a NAND for MTD either with built in or external driver module > > So we keep it include in this serie. > --- > drivers/mtd/nand/raw/rockchip-nand-controller.c | 7 +++++++ > 1 file changed, 7 insertions(+) > > diff --git a/drivers/mtd/nand/raw/rockchip-nand-controller.c b/drivers/mtd/nand/raw/rockchip-nand-controller.c > index 5a0468034..fcda4c760 100644 > --- a/drivers/mtd/nand/raw/rockchip-nand-controller.c > +++ b/drivers/mtd/nand/raw/rockchip-nand-controller.c > @@ -188,6 +188,10 @@ struct rk_nfc { > unsigned long assigned_cs; > }; > > +static int skipbbt; > +module_param(skipbbt, int, 0644); > +MODULE_PARM_DESC(skipbbt, "Skip BBT scan if data on the NAND chip is not in MTD format."); > + > static inline struct rk_nfc_nand_chip *rk_nfc_to_rknand(struct nand_chip *chip) > { > return container_of(chip, struct rk_nfc_nand_chip, chip); > @@ -1153,6 +1157,9 @@ static int rk_nfc_nand_chip_init(struct device *dev, struct rk_nfc *nfc, > > nand_set_controller_data(chip, nfc); > > + if (skipbbt) > + chip->options |= NAND_SKIP_BBTSCAN | NAND_NO_BBM_QUIRK; > + > chip->options |= NAND_USES_DMA | NAND_NO_SUBPAGE_WRITE; > chip->bbt_options = NAND_BBT_USE_FLASH | NAND_BBT_NO_OOB; > > -- > 2.30.2 > Thanks, Miquèl
Hi Miquel, Some comments/questions below, On 7/4/23 17:13, Miquel Raynal wrote: > Hi Johan, > > jbx6244@gmail.com wrote on Thu, 15 Jun 2023 19:34:26 +0200: > >> On Rockchip SoCs the first boot stages are written on NAND >> with help of manufacturer software that uses a different format >> then the MTD framework. Skip the automatic BBT scan with the Not only about the boot blocks. The rest of the Nand is formatted as well by closed source. It formats the location at the new BBT pages as well. >> NAND_SKIP_BBTSCAN option so that the original content is unchanged >> during the driver probe. >> The NAND_NO_BBM_QUIRK option allows us to erase bad blocks with >> the nand_erase_nand() function and the flash_erase command. >> With these options the user has the "freedom of choice" by neutral >> access mode to read and write in whatever format is needed. > > Can the boot_rom_mode thing help? This boot_rom_mode thing is for switching ECC mode in boot block pages and is not related to BBT pages. > > For writing this part you can disable the bad block protection using > debugfs and then write an externally processed file in raw mode I guess. The use of debugfs only might make sense when the driver can pass the probe function without errors. It does however not save guard existing data when it creates and writes to a new BBT page location. When the data at the new BBT pages previously is written with a different ECC or data/OOB format the hardware driver probe fails. Your suggestion does not work for the Rockchip case. Please advise what to do with this patch. === [ 2148.026403] calling rk_nfc_driver_init+0x0/0x1000 [rockchip_nand_controller] @ 2062 [ 2148.039156] rockchip-nfc 10500000.nand-controller: timing 11e1 [ 2148.056891] nand: device found, Manufacturer ID: 0xad, Chip ID: 0xde [ 2148.067700] nand: Hynix H27UCG8T2ATR-BC 64G 3.3V 8-bit [ 2148.076717] nand: 8192 MiB, MLC, erase size: 2048 KiB, page size: 8192, OOB size: 640 [ 2148.089022] rockchip-nfc 10500000.nand-controller: hynix_nand_init [ 2148.099317] rockchip-nfc 10500000.nand-controller: h27ucg8t2atrbc_choose_interface_config [ 2148.111779] rockchip-nfc 10500000.nand-controller: timing 11e1 [ 2148.129836] rockchip-nfc 10500000.nand-controller: rd hw page: 1048575 [ 2148.149364] rockchip-nfc 10500000.nand-controller: read page: fffff ecc error! [ 2148.160742] rockchip-nfc 10500000.nand-controller: rd hw page: 1048319 [ 2148.180164] rockchip-nfc 10500000.nand-controller: read page: ffeff ecc error! [ 2148.191413] rockchip-nfc 10500000.nand-controller: rd hw page: 1048063 [..] Check for existing BBT pages. [ 2148.339836] rockchip-nfc 10500000.nand-controller: read page: ffdff ecc error! [ 2148.350864] rockchip-nfc 10500000.nand-controller: rd hw page: 1047807 [ 2148.369835] rockchip-nfc 10500000.nand-controller: read page: ffcff ecc error! [ 2148.380597] Bad block table not found for chip 0 [ 2148.388479] Scanning device for bad blocks [ 2148.395591] rockchip-nfc 10500000.nand-controller: rd hw page: 255 [ 2148.414087] rockchip-nfc 10500000.nand-controller: read page: max_bitflips: 0 [..] Check all pages to create a new BBT. [ 2258.693279] rockchip-nfc 10500000.nand-controller: rd hw page: 1030143 [ 2258.710970] rockchip-nfc 10500000.nand-controller: read page: max_bitflips: 0 [ 2258.720804] rockchip-nfc 10500000.nand-controller: rd hw page: 1030399 [ 2258.738394] rockchip-nfc 10500000.nand-controller: read page: fb8ff ecc error! [ 2258.748229] Bad eraseblock 4024 at 0x0001f7000000 [..] All BBT pages are marked bad, so it thinks there's no space left [ 2261.403708] rockchip-nfc 10500000.nand-controller: rd hw page: 1048575 [ 2261.422750] rockchip-nfc 10500000.nand-controller: read page: fffff ecc error! [ 2261.433634] Bad eraseblock 4095 at 0x0001ffe00000 [ 2261.441723] No space left to write bad block table This is not done. A Nand disk should not be altered if it's formatted in a different format unless an explicit command is given. [ 2261.449860] nand_bbt: error while writing bad block table -28 [ 2261.467156] rockchip-nfc 10500000.nand-controller: failed to init NAND chips [ 2261.477917] rockchip-nfc: probe of 10500000.nand-controller failed with error -28 [ 2261.497011] probe of 10500000.nand-controller returned 28 after 113456649 usecs [ 2261.508273] initcall rk_nfc_driver_init+0x0/0x1000 [rockchip_nand_controller] returned 0 after 113468040 usecs Probe failed, but there nothing wrong with hardware. MTDx partitions are not created. User space commands that rely strings like "/dev/mtd0" don't work. === Application Kernel Drivers Hardware Why do we fail a hardware driver probe when the level above doesn't deal with all real world situations. Shouldn't that be more separated in MTD levels. === > > For the boot I think I proposed a DT property. I don't remember how far > the discussion went. Is there a web link of that discussion? How do I link 'compatible' to '/dev/mtd0' for example. In a '/proc/mtd' entry? See /drivers/mtd/spi-nor/debugfs.c In order to write boot blocks in a pattern it needs to know the chip ID as used in nand_flash_ids[]. How can we export this ID to userspace? Also in a '/proc/mtd' entry? === partitions { compatible = "fixed-partitions"; #address-cells = <2>; #size-cells = <2>; partition@0 { reg = <0x0 0x0 0x0 0x02000000>; compatible = "rockchip,boot-blk"; label = "boot-blk"; }; partition@2000000 { reg = <0x0 0x02000000 0x1 0xfa000000>; label = "rootfs"; }; partition@1fc000000 { reg = <0x1 0xfc000000 0x0 0x04000000>; compatible = "mtd,bbt" label = "bbt"; }; }; How many erase blocks is MTD using for BBT pages? 4 or 8 or ? BBT pages are not clearly defined in the DT. They are somehow marked bad in the overlapping partition. How are suppose to erase BBT pages in a automated way? Is there a need for a new BBT compatible? What is your idea about compatibles suggestion: rockchip,boot-blk mtd,bbt === Johan > >> >> Signed-off-by: Johan Jonker <jbx6244@gmail.com> >> --- >> >> Changes V3: >> Change prefixes >> >> Changed V2: >> reword >> >> --- >> >> I'm aware that the maintainer finds it "awful", >> but it's absolute necessary to: >> 1: read/write boot blocks in user space without touching original content >> 2: format a NAND for MTD either with built in or external driver module >> >> So we keep it include in this serie. >> --- >> drivers/mtd/nand/raw/rockchip-nand-controller.c | 7 +++++++ >> 1 file changed, 7 insertions(+) >> >> diff --git a/drivers/mtd/nand/raw/rockchip-nand-controller.c b/drivers/mtd/nand/raw/rockchip-nand-controller.c >> index 5a0468034..fcda4c760 100644 >> --- a/drivers/mtd/nand/raw/rockchip-nand-controller.c >> +++ b/drivers/mtd/nand/raw/rockchip-nand-controller.c >> @@ -188,6 +188,10 @@ struct rk_nfc { >> unsigned long assigned_cs; >> }; >> >> +static int skipbbt; >> +module_param(skipbbt, int, 0644); >> +MODULE_PARM_DESC(skipbbt, "Skip BBT scan if data on the NAND chip is not in MTD format."); >> + >> static inline struct rk_nfc_nand_chip *rk_nfc_to_rknand(struct nand_chip *chip) >> { >> return container_of(chip, struct rk_nfc_nand_chip, chip); >> @@ -1153,6 +1157,9 @@ static int rk_nfc_nand_chip_init(struct device *dev, struct rk_nfc *nfc, >> >> nand_set_controller_data(chip, nfc); >> >> + if (skipbbt) >> + chip->options |= NAND_SKIP_BBTSCAN | NAND_NO_BBM_QUIRK; >> + >> chip->options |= NAND_USES_DMA | NAND_NO_SUBPAGE_WRITE; >> chip->bbt_options = NAND_BBT_USE_FLASH | NAND_BBT_NO_OOB; >> >> -- >> 2.30.2 >> > > > Thanks, > Miquèl
Hi Johan, Richard, a question for you below :-) jbx6244@gmail.com wrote on Fri, 7 Jul 2023 17:27:56 +0200: > Hi Miquel, > > Some comments/questions below, There are a lot, I've selected the ones which appear the most relevant to me right now. > On 7/4/23 17:13, Miquel Raynal wrote: > > Hi Johan, > > > > jbx6244@gmail.com wrote on Thu, 15 Jun 2023 19:34:26 +0200: > > > >> On Rockchip SoCs the first boot stages are written on NAND > > >> with help of manufacturer software that uses a different format > >> then the MTD framework. Skip the automatic BBT scan with the > > Not only about the boot blocks. > The rest of the Nand is formatted as well by closed source. > It formats the location at the new BBT pages as well. > > >> NAND_SKIP_BBTSCAN option so that the original content is unchanged > >> during the driver probe. > >> The NAND_NO_BBM_QUIRK option allows us to erase bad blocks with > >> the nand_erase_nand() function and the flash_erase command. > >> With these options the user has the "freedom of choice" by neutral > >> access mode to read and write in whatever format is needed. > > > > > Can the boot_rom_mode thing help? > > This boot_rom_mode thing is for switching ECC mode in boot block pages and is not related to BBT pages. > > > > > For writing this part you can disable the bad block protection using > > debugfs and then write an externally processed file in raw mode I guess. > > The use of debugfs only might make sense when the driver can pass the probe function without errors. > It does however not save guard existing data when it creates and writes to a new BBT page location. > When the data at the new BBT pages previously is written with a different ECC or data/OOB format the hardware driver probe fails. > > Your suggestion does not work for the Rockchip case. > Please advise what to do with this patch. > > === > > [ 2148.026403] calling rk_nfc_driver_init+0x0/0x1000 [rockchip_nand_controller] @ 2062 > [ 2148.039156] rockchip-nfc 10500000.nand-controller: timing 11e1 > [ 2148.056891] nand: device found, Manufacturer ID: 0xad, Chip ID: 0xde > [ 2148.067700] nand: Hynix H27UCG8T2ATR-BC 64G 3.3V 8-bit > [ 2148.076717] nand: 8192 MiB, MLC, erase size: 2048 KiB, page size: 8192, OOB size: 640 > [ 2148.089022] rockchip-nfc 10500000.nand-controller: hynix_nand_init > [ 2148.099317] rockchip-nfc 10500000.nand-controller: h27ucg8t2atrbc_choose_interface_config > [ 2148.111779] rockchip-nfc 10500000.nand-controller: timing 11e1 > [ 2148.129836] rockchip-nfc 10500000.nand-controller: rd hw page: 1048575 > [ 2148.149364] rockchip-nfc 10500000.nand-controller: read page: fffff ecc error! > [ 2148.160742] rockchip-nfc 10500000.nand-controller: rd hw page: 1048319 > [ 2148.180164] rockchip-nfc 10500000.nand-controller: read page: ffeff ecc error! > [ 2148.191413] rockchip-nfc 10500000.nand-controller: rd hw page: 1048063 > > [..] > > Check for existing BBT pages. > > [ 2148.339836] rockchip-nfc 10500000.nand-controller: read page: ffdff ecc error! > [ 2148.350864] rockchip-nfc 10500000.nand-controller: rd hw page: 1047807 > [ 2148.369835] rockchip-nfc 10500000.nand-controller: read page: ffcff ecc error! > [ 2148.380597] Bad block table not found for chip 0 > [ 2148.388479] Scanning device for bad blocks > [ 2148.395591] rockchip-nfc 10500000.nand-controller: rd hw page: 255 > [ 2148.414087] rockchip-nfc 10500000.nand-controller: read page: max_bitflips: 0 > > [..] > > Check all pages to create a new BBT. > > [ 2258.693279] rockchip-nfc 10500000.nand-controller: rd hw page: 1030143 > [ 2258.710970] rockchip-nfc 10500000.nand-controller: read page: max_bitflips: 0 > [ 2258.720804] rockchip-nfc 10500000.nand-controller: rd hw page: 1030399 > [ 2258.738394] rockchip-nfc 10500000.nand-controller: read page: fb8ff ecc error! > [ 2258.748229] Bad eraseblock 4024 at 0x0001f7000000 > > [..] > > All BBT pages are marked bad, so it thinks there's no space left > > [ 2261.403708] rockchip-nfc 10500000.nand-controller: rd hw page: 1048575 > [ 2261.422750] rockchip-nfc 10500000.nand-controller: read page: fffff ecc error! > [ 2261.433634] Bad eraseblock 4095 at 0x0001ffe00000 > > [ 2261.441723] No space left to write bad block table > > This is not done. > A Nand disk should not be altered if it's formatted in a different format unless an explicit command is given. > > [ 2261.449860] nand_bbt: error while writing bad block table -28 > [ 2261.467156] rockchip-nfc 10500000.nand-controller: failed to init NAND chips > [ 2261.477917] rockchip-nfc: probe of 10500000.nand-controller failed with error -28 > [ 2261.497011] probe of 10500000.nand-controller returned 28 after 113456649 usecs > [ 2261.508273] initcall rk_nfc_driver_init+0x0/0x1000 [rockchip_nand_controller] returned 0 after 113468040 usecs > > Probe failed, but there nothing wrong with hardware. > MTDx partitions are not created. > User space commands that rely strings like "/dev/mtd0" don't work. > > === > > Application > Kernel > Drivers > Hardware > > Why do we fail a hardware driver probe when the level above doesn't deal with all real world situations. > Shouldn't that be more separated in MTD levels. > > === > > > > > For the boot I think I proposed a DT property. I don't remember how far > > the discussion went. > > Is there a web link of that discussion? https://lore.kernel.org/linux-mtd/20230609104426.3901df54@xps-13/ Maybe the term "DT property" did not appear but that's what I had in mind :-) I don't know if it must be a chip or a partition property. Richard, here is where I would like your feedback, I am kind of opposed to a "skip_bbt" module parameter. It's not a strong opinion, if you think it's fine I'm open. I would rather prefer a DT property which says "do not use the standard pattern". Johan, how are bad blocks supposed to be tracked if the bad block tables are written in a way which does not allow Linux to read it? > How do I link 'compatible' to '/dev/mtd0' for example. > In a '/proc/mtd' entry? > See /drivers/mtd/spi-nor/debugfs.c > > > In order to write boot blocks in a pattern it needs to know the chip ID as used in nand_flash_ids[]. > How can we export this ID to userspace? There was an attempt a few days back, it's not upstream, I can't find it back ATM. I'll send it once I find it back. > Also in a '/proc/mtd' entry? > > === > > partitions { > compatible = "fixed-partitions"; > #address-cells = <2>; > #size-cells = <2>; > > partition@0 { > reg = <0x0 0x0 0x0 0x02000000>; > compatible = "rockchip,boot-blk"; > label = "boot-blk"; > }; > > partition@2000000 { > reg = <0x0 0x02000000 0x1 0xfa000000>; > label = "rootfs"; > }; > > partition@1fc000000 { > reg = <0x1 0xfc000000 0x0 0x04000000>; > compatible = "mtd,bbt" > label = "bbt"; This does not work, it would take me hours to explain why, it's all about: - stability - how mtd has been implemented > }; > }; > > How many erase blocks is MTD using for BBT pages? 4 or 8 or ? As many blocks are needed to cover the size of the device, times 2. > BBT pages are not clearly defined in the DT. No, because this is software, not hardware. MTD is a Linux thing, which gives you access to an mtd device through a number of operations. It handles bad blocks. > They are somehow marked bad in the overlapping partition. Not sure what "overlapping partition" means. > How are suppose to erase BBT pages in a automated way? > Is there a need for a new BBT compatible? No, Linux has run with this standard pattern for 20 years, downstream kernels sometimes make silly design decisions, we do not want to support them. > What is your idea about compatibles suggestion: > rockchip,boot-blk > mtd,bbt > > === > > Johan > > > > >> > >> Signed-off-by: Johan Jonker <jbx6244@gmail.com> > >> --- > >> > >> Changes V3: > >> Change prefixes > >> > >> Changed V2: > >> reword > >> > >> --- > >> > >> I'm aware that the maintainer finds it "awful", > >> but it's absolute necessary to: > >> 1: read/write boot blocks in user space without touching original content > >> 2: format a NAND for MTD either with built in or external driver module > >> > >> So we keep it include in this serie. > >> --- > >> drivers/mtd/nand/raw/rockchip-nand-controller.c | 7 +++++++ > >> 1 file changed, 7 insertions(+) > >> > >> diff --git a/drivers/mtd/nand/raw/rockchip-nand-controller.c b/drivers/mtd/nand/raw/rockchip-nand-controller.c > >> index 5a0468034..fcda4c760 100644 > >> --- a/drivers/mtd/nand/raw/rockchip-nand-controller.c > >> +++ b/drivers/mtd/nand/raw/rockchip-nand-controller.c > >> @@ -188,6 +188,10 @@ struct rk_nfc { > >> unsigned long assigned_cs; > >> }; > >> > >> +static int skipbbt; > >> +module_param(skipbbt, int, 0644); > >> +MODULE_PARM_DESC(skipbbt, "Skip BBT scan if data on the NAND chip is not in MTD format."); > >> + > >> static inline struct rk_nfc_nand_chip *rk_nfc_to_rknand(struct nand_chip *chip) > >> { > >> return container_of(chip, struct rk_nfc_nand_chip, chip); > >> @@ -1153,6 +1157,9 @@ static int rk_nfc_nand_chip_init(struct device *dev, struct rk_nfc *nfc, > >> > >> nand_set_controller_data(chip, nfc); > >> > >> + if (skipbbt) > >> + chip->options |= NAND_SKIP_BBTSCAN | NAND_NO_BBM_QUIRK; > >> + > >> chip->options |= NAND_USES_DMA | NAND_NO_SUBPAGE_WRITE; > >> chip->bbt_options = NAND_BBT_USE_FLASH | NAND_BBT_NO_OOB; > >> > >> -- > >> 2.30.2 > >> > > > > > > Thanks, > > Miquèl Thanks, Miquèl
----- Ursprüngliche Mail ----- > >> > For the boot I think I proposed a DT property. I don't remember how far >> > the discussion went. >> >> Is there a web link of that discussion? > > https://lore.kernel.org/linux-mtd/20230609104426.3901df54@xps-13/ > > Maybe the term "DT property" did not appear but that's what I had in > mind :-) I don't know if it must be a chip or a partition property. > > Richard, here is where I would like your feedback, I am kind of opposed > to a "skip_bbt" module parameter. It's not a strong opinion, if you > think it's fine I'm open. > > I would rather prefer a DT property which says "do not use the > standard pattern". Yes, please no new module parameters. A module parameter should only affect the behavior of the driver itself (e.g. debug mode) but not be device specific. We made this mistake in the past too often. :-( A single driver can serve more devices. Therefore IMHO controlling this via DT makes perfectly sense. Thanks, //richard
diff --git a/drivers/mtd/nand/raw/rockchip-nand-controller.c b/drivers/mtd/nand/raw/rockchip-nand-controller.c index 5a0468034..fcda4c760 100644 --- a/drivers/mtd/nand/raw/rockchip-nand-controller.c +++ b/drivers/mtd/nand/raw/rockchip-nand-controller.c @@ -188,6 +188,10 @@ struct rk_nfc { unsigned long assigned_cs; }; +static int skipbbt; +module_param(skipbbt, int, 0644); +MODULE_PARM_DESC(skipbbt, "Skip BBT scan if data on the NAND chip is not in MTD format."); + static inline struct rk_nfc_nand_chip *rk_nfc_to_rknand(struct nand_chip *chip) { return container_of(chip, struct rk_nfc_nand_chip, chip); @@ -1153,6 +1157,9 @@ static int rk_nfc_nand_chip_init(struct device *dev, struct rk_nfc *nfc, nand_set_controller_data(chip, nfc); + if (skipbbt) + chip->options |= NAND_SKIP_BBTSCAN | NAND_NO_BBM_QUIRK; + chip->options |= NAND_USES_DMA | NAND_NO_SUBPAGE_WRITE; chip->bbt_options = NAND_BBT_USE_FLASH | NAND_BBT_NO_OOB;