From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.0 required=3.0 tests=DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED,DKIM_VALID,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,MENTIONS_GIT_HOSTING, SPF_HELO_NONE,SPF_PASS,USER_AGENT_SANE_1 autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1B936C2D0DB for ; Sat, 25 Jan 2020 22:29:09 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id CAF7420716 for ; Sat, 25 Jan 2020 22:29:08 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="soSPpGMO"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="rLIPleQc" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org CAF7420716 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-mtd-bounces+linux-mtd=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:Date: Message-ID:From:References:To:Subject:Reply-To:Content-ID:Content-Description :Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=cTo+LGBsm3grAMyfFYko9SyfnER1RMqtwvRD0FeSZaM=; b=soSPpGMO9lnsBd LNqJEKQVsiQHuPVqM047ImffBNgn0cNV8Yi2vPutg7Lc278NZz9iBIFTdlC9Kve0vNICIfxGtrdUe 1WXKbxW1JO9Vns4jLG/2jq56wwvvY9ayq1XsjRYwAFcXwN8z9U1cd3NSDCZgpXfj8O0isQLhXyciR +ISlVNiHAuZ1/WNThWOGFejCOyOOGAmiEiWrq5ur/aJ8JgjKqli13vGbrx8ftHc/6D7X2TbwRGxDX 3AjVVAuxEFXAy486wnqx3XBkLOx4JRWiiAkRfyBEshhCPk/wzgxk0Q+IqzmFww+HODTW6yONl+Zc7 f/MTp9OCGpDjLs5jOqKw==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1ivTvC-0000Od-PF; Sat, 25 Jan 2020 22:28:54 +0000 Received: from mail-wm1-x343.google.com ([2a00:1450:4864:20::343]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1ivTuw-0000DY-BY; Sat, 25 Jan 2020 22:28:41 +0000 Received: by mail-wm1-x343.google.com with SMTP id t14so3111744wmi.5; Sat, 25 Jan 2020 14:28:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=subject:to:cc:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=JuIIuzl/aUbh+G2KKabF03wm8Z2xQCzAlj66QQd7f6M=; b=rLIPleQc0Wji7dJaPdcJUUojzJxZLNZckJi1XGzpETZ6cHNZ0p3brsVX/ZgJy7AjYG H9AIxBfJvgruTYpB+/fVLWU0TTa/09bMPQ0XG6Wp6LrR3YFJsV/6LB+kafTCPT+XNDZS tKB3LUkb9OTVd2urF901g5dwLh+uMymY1PA/NUFf4BHiX4VFrwyDwslHMNMEpfxVqyd/ 80oYEyplzCe4x8K7xJMt7Y2XnON855NMuF0caLNSG2mR5byRBtNMtKZGUMcbHP3ec5ML OfKsAlsjVuxhh9cXE6XnDhdfz5EF3QBqCxaeovugPw6bDyZa2HJOE825EswiSKL4+CG8 RirQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:cc:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=JuIIuzl/aUbh+G2KKabF03wm8Z2xQCzAlj66QQd7f6M=; b=W/ILl7WY6wcmPgbZhLiYse1BJAAg5+jHL1Jha1gM7SUOsO42mdjoHsvefd6uwkdcvJ yaPcnlr5XNF0QsLYHakJRwSs2pRdHUY1c6BKuas613CJq2gLqaR3oBu7lCNSij7EJWE1 5icXSCeZgB51Qw70biy4nZ//MR9AUJkGaF+ALpWkn44MY0QchmH1IxVJE7D16AdRmZow kDhnTeQXATcOgcNrcCfnJz1V30s5XCdj7ScKI6XU/ZjTnUJvJxeKcpSP2ixcnbGGFsWc bpLDfXGfPJXfUpnczpLk3aFaLUWmCZicFgG2zanhHtsh+A+6kdknVzmFs6HWemZ+ga41 9N3Q== X-Gm-Message-State: APjAAAVqCV/DYzAxypDWDR5BbWE3CAmSdQ1YQvVUmXKWzP1/+kDXITQa GbyvYp2I2w/bkm2YokiTbr8OohrB X-Google-Smtp-Source: APXvYqz5BIt7pACL1GHEpmqqXj8Xco8xfSye9IZWqYTSbnpswncvmZj5/2o76yKiCIMZj0o+U7EZAw== X-Received: by 2002:a1c:7c18:: with SMTP id x24mr6169031wmc.185.1579991314340; Sat, 25 Jan 2020 14:28:34 -0800 (PST) Received: from [192.168.2.1] (ip51ccf9cd.speed.planet.nl. [81.204.249.205]) by smtp.gmail.com with ESMTPSA id o4sm13290965wrw.97.2020.01.25.14.28.33 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Sat, 25 Jan 2020 14:28:33 -0800 (PST) Subject: Re: [RFC PATCH v2 00/10] Enable RK3066 NANDC for MK808 To: Miquel Raynal References: <20200124163001.28910-1-jbx6244@gmail.com> <20200124181751.721aa428@xps13> From: Johan Jonker Message-ID: Date: Sat, 25 Jan 2020 23:28:31 +0100 User-Agent: Mozilla/5.0 (X11; Linux i686; rv:68.0) Gecko/20100101 Thunderbird/68.4.1 MIME-Version: 1.0 In-Reply-To: <20200124181751.721aa428@xps13> Content-Language: en-US X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200125_142838_425294_75607E40 X-CRM114-Status: GOOD ( 24.54 ) X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: mark.rutland@arm.com, devicetree@vger.kernel.org, vigneshr@ti.com, richard@nod.at, shawn.lin@rock-chips.com, linux-kernel@vger.kernel.org, linux-rockchip@lists.infradead.org, robh+dt@kernel.org, linux-mtd@lists.infradead.org, yifeng.zhao@rock-chips.com, linux-arm-kernel@lists.infradead.org, heiko@sntech.de Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-mtd" Errors-To: linux-mtd-bounces+linux-mtd=archiver.kernel.org@lists.infradead.org SGkgTWlxdWVsLAoKU2VlIGJlbG93LgpCdHcsIHdoYXQgaXMgeW91ciBpbXByZXNzaW9uIG9mIHRo ZSBvdGhlciBWMiAnaW1wcm92ZW1lbnRzJz8KClRoYW5rcwoKWy4uXQoKPj4gTm90IHRlc3RlZDoK Pj4KPj4gTkFOREMgdmVyc2lvbiA5Lgo+PiBOQU5EIHJhdyB3cml0ZS4KPgo+IG5hbmRiaXRlcnJz IC1pIC9kZXYvbXRkPHg+IHRvIHZhbGlkYXRlIGl0IHdvcmtzIQo+Cj4+IFJLMzA2NiBzdGlsbCBo YXMgbm8gc3VwcG9ydCBmb3IgVWJvb3QuCj4+IEFueSB3cml0ZSBjb21tYW5kIHdvdWxkIGludGVy ZmVyZSB3aXRoIGRhdGEgc3RydWN0dXJlcyBtYWRlIGJ5IHRoZQpib290IGxvYWRlci4KPj4KPj4g RXRjLgo+Pgo+PiBQcm9ibGVtczoKPj4KPj4gTm8gYmFkIGJsb2NrIHN1cHBvcnQuIE1vc3QgZGV2 aWNlcyB1c2UgYSBGVEwgYmFkIGJsb2NrIG1hcCB3aXRoIHRhZ3MKPj4gdGhhdCBtdXN0IGJlIGxv Y2F0ZWQgb24gc3BlY2lmaWMgcGFnZSBsb2NhdGlvbnMgd2hpY2ggaXMgb3V0c2lkZQo+PiB0aGUg c2NvcGUgb2YgdGhlIHJhdyBNVEQgZnJhbWV3b3JrLgo+Cj4gSSBkb24ndCB1bmRlcnN0YW5kIHRo aXMgc3Rvcnkgb2YgYmFkIGJsb2NrIG1hcC4gQXJlIHlvdSBjb21wYXJpbmcgd2l0aAo+IGEgdmVu ZG9yIGtlcm5lbD8KClR3byBzZXBhcmF0ZSB0aGluZ3M6CgotUm9ja2NoaXAgRlRMIGhhcyBpdCdz IG93biBGVEwgc3RvcmFnZSBmb3JtYXQuClRoZSBvcmlnaW5hbCBmYWN0b3J5IEJCTSAobWFya2Vy KSBpbmZvcm1hdGlvbiBpcyBsb3N0LCBzbyBpdCBzdG9yZXMKYSBCQiAoYmFkIGJsb2NrKSBtYXAv dGFibGUgYXQgdGhlIChsYXN0IGVyYXNlIGJsb2NrIC0gbikgYW5kIHRoZW4gZG93bndhcmRzLgpT ZWUgc291cmNlIGJlbG93LiBOb3QgdXNhYmxlIGZvciByYXcgTVRELiBJdCdzIHRoZSBzaXR1YXRp b24gbW9zdCB1c2VyIHdpbGwKZmluZCBvbiB0aGVyZSBOQU5ELgoKCi0gRm9yIHJhdyBNVEQgdG8g dXNlIGl0J3Mgb3duIEJCIG1hcCBpbiB0aGlzIHN0YWdlIHRoZSBwcm9wb3NlZCBzb2x1dGlvbgpm b3IgcmF3IE1URCBqdXN0IGRpZG4ndCBnYXZlIG1lIHNvbWV0aGluZy9yZXN1bHRzIHRoYXQgSSB1 bmRlcnN0YW5kLApzbyBJIGxlYXZlIGl0IG91dCBmb3Igbm93LiBGb3IgYW4gZW1wdHkgTkFORCB3 aXRob3V0IFJvY2tjaGlwIEZUTCB0aGlzIGNvdWxkCndvcmsgYXMgbG9uZyBhcyBpdCBzdGF5cyBv dXQgb2Ygb3VyIGJvb3Ryb20gYmxvY2tzLgpJdCdzIGZpbmUgdGhhdCBNVEQgaXMgJ3JpZ2lkJywg YnV0IG5vdCBhbGwgU29jcyBmaXQsIHNvIGZpbmQgc29sdXRpb25zCnRoYXQgYXJlIG1heWJlIHNl Y29uZCBiZXN0LiBNVEQgaGFzIG1vc3QgY29tcG9uZW50cyBhbHJlYWR5IGluIHBsYWNlLApzZWUg d2hhdCB3ZSBjYW4gbWFrZSBvdXQgb2YgaXQuCgo+Cj4gSWYgdmVuZG9ycyBpbnZlbnQgbmV3IHdh eXMgdG8gaGFuZGxlIE1URCBibG9ja3MgaXQncyBzYWQgYnV0IHRoZXkgd2lsbAo+IG5ldmVyIGJl IGNvbXBhdGlibGUgd2l0aCBtYWlubGluZS4gSXQncyBhIGZhY3QuIEhvd2V2ZXIgZm9yIGFuIHVw c3RyZWFtCj4gdmVyc2lvbiwgSSBkb24ndCBnZXQgaWYgdGhlcmUgaXMgYW55IHJlYWwgaXNzdWU/ IFRoZSBsb2NhdGlvbiBvZiB0aGUKPiBCQk0gaXMgbm90IHJlbGF0ZWQgdG8geW91ciBjb250cm9s bGVyIGRyaXZlciBidXQgZGVwZW5kcyBvbiB0aGUgTkFORAo+IGNoaXAgYW5kIGFzIHlvdSBzYXkg YmVsb3cgd2Uga25vdyBwcm92aWRlIHRocmVlIHBvc3NpYmxlIHBvc2l0aW9ucyBpbgo+IGEgYmxv Y2suCj4KCkhhbmRsaW5nIG9mIE1URCBibG9ja3MgcmVtYWlucyB0aGUgc2FtZSBBRkFJQ1QuCkl0 IHRyYW5zZmVycyBkYXRhIGFuZCBvb2IgYnl0ZSB0byBNVEQgZGF0YSBzdHJ1Y3R1cmVzLgpKdXN0 IGZpbmQgYSB3YXkgdG8gdGVsbCBNVEQgbm90IG1lc3Mgd2l0aCBib290cm9tIGJsb2Nrcy4KUHJv Z3JhbW1pbmcvcmVhZGluZyBpbiBVYm9vdCBhbmQgTGludXggaXMgc29tZXRoaW5nIHRoYXQgT3Bl biBTb3VyY2UKaGFzIHRvIGZpbmQgYSBzb2x1dGlvbiBmb3IuCgo+IFdoYXQgeW91IHJlZmVyIGFz IHRoZSBGVEwgaXMgdGhlIGVxdWl2YWxlbnQgb2YgVUJJIGluIExpbnV4LCB3aGljaAo+IGluZGVl ZCBvZmZlcnMgdG8gdGhlIHVzZXIgYSBsaW5lYXIgbG9naWNhbCB2aWV3IG9mIGFsbCB0aGUgdmFs aWQgYmxvY2tzCj4gd2hpbGUgcGh5c2ljYWxseSB0aGUgZGF0YSBpcyBzcHJlYWQgYWNyb3NzIGFs bCB0aGUgYXZhaWxhYmxlCj4gZXJhc2VibG9ja3MuCgpXaGVuIEkgcmVmZXIgdG8gRlRMIGl0J3Mg dG8gdGhlIFJvY2tjaGlwIEZUTC4KSW4gdGhpcyBjdXJyZW50IEVYUEVSSU1FTlRBTCBkcml2ZXIg c3RhZ2UgSSBqdXN0IHdhcm4gYSBwb3RlbnRpYWwKdW5hd2FyZSB1c2VyCm9mIHRoZSB0aGluZ3Mg dGhhdCBhcmUgYXQgcGxheSBvbiB0aGF0IE5BTkQuIFVCSSBtaWdodCB3b3JrIGZpbmUsIGJ1dApu b3Qgbm93LgoKPgo+Pgo+PiBoeW5peF9uYW5kX2luaXQoKSBhZGQgZXh0cmEgb3B0aW9uIE5BTkRf QkJNX0xBU1RQQUdFIGZvciBIMjdVQ0c4VDJBVFItQkMuCj4+CgpFeGFtcGxlOgpUbyBzZWUgd2hh dCBoYXBwZW5zIHdoZW4gYSBwYXJ0aXRpb24gaXMgcGxhY2VkIG92ZXIgdGhlIGJvb3Ryb20gZXJh c2UKYmxvY2tzLgpGcm9tIHRoZSBwcmV2aW91cyBsb2cgZXhhbXBsZSBpdCBzZWVtcyB0aGF0IGl0 IHNvbWVob3cgZG9lcyBkbyBhIHJlYWQKY29tbWFuZAphdCB0aGUgZW5kIG9mIHRoaXMgcGFydGl0 aW9uLiBUaGF0IHdoYXQgdGVzdHMgYXJlIGZvci4KCj4+IE5vIHBhcnRpdGlvbiBzdXBwb3J0LiBB IEZUTCBkcml2ZXIgd2lsbCBzdG9yZSBhdCByYW5kb20gbG9jYXRpb25zIGFuZAo+PiBhIGxpbmVh ciB1c2VyIHNwZWNpZmljIGxheW91dCBkb2VzIG5vdCBmaXQgd2l0aGluCj4+IHRoZSBnZW5lcmlj IGNoYXJhY3RlciBvZiB0aGlzIGJhc2ljIGRyaXZlci4KPj4KCk1URCBwYXJ0aXRpb24gc3VwcG9y dCB3b3JrcyBmaW5lLiBJdCdzIGp1c3QgdGhlIGN1cnJlbnQgY29udGVudCBvZiBteQpSSzMwNjYg TkFORAp3cml0dGVuIHdpdGggYSBSb2NrY2hpcCBGVEwgbG9hZGVyIHRoYXQgbWFrZXMgd3JpdGUg dGVzdHMgbm90IHNvIHNtYXJ0CmFzIEkgaGF2ZQp0byByZXByb2dyYW0gdGhlbiB3aXRoIFVTQi4g Q2hpY2tlbiBlZ2cgcHJvYmxlbS4KCj4+IERyaXZlciBhc3N1bWVzIHRoYXQgSU8gcGlucyBhcmUg Y29ycmVjdGx5IHNldCBieSB0aGUgYm9vdCBsb2FkZXIuCj4KPiBXaGljaCBwaW5zIGFyZSB5b3Ug dGFsa2luZyBhYm91dD8gQXJlIHlvdSBtaXNzaW5nIGEgcGluY3RybCBkcml2ZXI/Cj4KCk5vLCBO QU5EIHNoYXJlIHRoZSBzYW1lIGRhdGEgSU8gcGlucyBhcyBlbW1jLgpTZXQgZGlyZWN0IGluIGdy ZlJlZywgbm90IHdpdGggcGluY3RybC4KRXZlcnkgUm9ja2NoaXAgZ3JmUmVnIGlzIGRpZmZlcmVu dCwgc28gbGVhdmUgaXQgb3V0IGZvciBub3cuCkZvciBteSBMaW51eCBURVNUIGRyaXZlciBub3Qg YSBpc3N1ZSBhcyB0aGF0IGlzIGFscmVhZHkgZG9uZQpieSB0aGUgbG9hZGVyLgoKV291bGQgeW91 IGxpa2UgdGhpcyBncmYgdGhpbmcgaW5jbHVkZWQgaW4gYSBMaW51eCBkcml2ZXIgZm9yIGV2ZXJ5 IFNvYz8KCj4+Cj4+IEZpeGVkIHRpbWluZyBzZXR0aW5nLgoKTWVudGlvbmVkIGZvciBjb21wbGV0 ZW5lc3MuCgo+Pgo+PiBSSzMyMjhBL1JLMzIyOEIgY29tcGF0aWJpbGl0eSB2ZXJzaW9uIDcwMSB1 bmtub3duCj4+IFJWMTEwOCBuYW5kIHZlcnNpb24gdW5rbm93bgoKQ2FuIFNoYXduIExpbiBvciBz b21lb25lIGVsc2UgaGVscCBoZXJlPwpSVjExMDggVFJNIChtYW51YWwpIGlzIHN0aWxsIG1pc3Np bmc/Cgo+PgoKWy4uXQoKSGF2ZSBmdW4hCgovLy8vLy8vLy8vLy8vLy8vLy8vLy8KRnJvbSByazMw NjZhLmR0c2k6ClNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiAoR1BMLTIuMCsgT1IgTUlUKQpDb3B5 cmlnaHQgKGMpIDIwMTMgTXVuZG9SZWFkZXIgUy5MLgoKCQllbW1jIHsKCQkJZW1tY19jbGs6IGVt bWMtY2xrIHsKCQkJCXJvY2tjaGlwLHBpbnMgPSA8MyBSS19QRDcgMiAmcGNmZ19wdWxsX2RlZmF1 bHQ+OwoJCQl9OwoKCQkJZW1tY19jbWQ6IGVtbWMtY21kIHsKCQkJCXJvY2tjaGlwLHBpbnMgPSA8 NCBSS19QQjEgMiAmcGNmZ19wdWxsX2RlZmF1bHQ+OwoJCQl9OwoKCQkJZW1tY19yc3Q6IGVtbWMt cnN0IHsKCQkJCXJvY2tjaGlwLHBpbnMgPSA8NCBSS19QQjIgMiAmcGNmZ19wdWxsX2RlZmF1bHQ+ OwoJCQl9OwoKCQkJLyoKCQkJICogVGhlIGRhdGEgcGlucyBhcmUgc2hhcmVkIGJldHdlZW4gbmFu ZGMgYW5kIGVtbWMgYW5kCgkJCSAqIG5vdCBhY2Nlc3NpYmxlIHRocm91Z2ggcGluY3RybC4gQWxz byB0aGV5IHNob3VsZCd2ZQoJCQkgKiBiZWVuIGFscmVhZHkgc2V0IGNvcnJlY3RseSBieSBmaXJt d2FyZSwgYXMKCQkJICogZmxhc2gvZW1tYyBpcyB0aGUgYm9vdC1kZXZpY2UuCgkJCSAqLwoJCX07 CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8KRnJvbSBwaW5jdHJsX3JrMzA2Ni5jOgpTUERYLUxpY2Vu c2UtSWRlbnRpZmllcjogICAgIEdQTC0yLjArCkNvcHlyaWdodCAyMDE3IFBhd2XFgiBKYXJvc3oK CnN0YXRpYyB2b2lkIHBpbmN0cmxfcmszMDY2X25hbmRfY29uZmlnKHN0cnVjdCByazMwNjZfZ3Jm ICpncmYpCnsKCXJrX2NscnNldHJlZygmZ3JmLT5zb2NfY29uMCwKCQkgICAgIEVNTUNfRkxBU0hf U0VMX01BU0ssCgkJICAgICAwIDw8IEVNTUNfRkxBU0hfU0VMX1NISUZUKTsKCXJrX2NscnNldHJl ZygmZ3JmLT5ncGlvM2RfaW9tdXgsCgkJICAgICBHUElPM0Q3X01BU0ssCgkJICAgICBHUElPM0Q3 X0ZMQVNIX0RRUyA8PCBHUElPM0Q3X1NISUZUKTsKfQoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkZv ciBFTU1DOgoKR1JGX0dQSU9fSU9NVVhbM10uR1BJT0RfSU9NVVggPSAoKDB4Mzw8MTQpPDwxNil8 KDB4Mjw8MTQpOyAvLyBkcXMKR1JGX0dQSU9fSU9NVVhbNF0uR1BJT0JfSU9NVVggPSAoKDB4Zjw8 Mik8PDE2KXwoMHhhPDwyKTsgICAvLyBjbWQscnN0bgpHUkZfU09DX0NPTlswXSA9ICgoMHgxPDwx MSk8PDE2KXwoMHgxPDwxMSk7ICAgICAgICAgICAgICAgIC8vIGVtbWMKZGF0YTAtNyx3cAoKLy8v Ly8vLy8vLy8vLy8vLy8vLy8vCgpHUkZfU09DX0NPTjAgUkszMDY2OgpCaXQgQXR0ciBSZXNldCBW YWx1ZSAgICAgICAgRGVzY3JpcHRpb24KMzE6MTYgUlcgMHgwIHdyaXRlX2VuYWJsZSAgIGJpdCAw fmJpdCAxNSB3cml0ZSBlbmFibGUKCjExICAgIFJXIDB4MCBlbW1jX2ZsYXNoX3NlbCBlbW1jIGZs YXNoIHNlbGVjdCB1c2VkIGZvciBpb211eAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSU9f RkxBU0hfREFUQVs3OjBdICwgSU9fRkxBU0hfV1AgYXJlCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICBzZWxlY3RlZCBmb3IgZW1tYyBpbnN0ZWFkIG9mIGZsYXNoCgovLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgovLyBTUERYLUxp Y2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAovKgogKiBDb3B5cmlnaHQgKGMpIDIwMTksIEpvaGFu IEpvbmtlciA8amJ4NjI0NEBnbWFpbC5jb20+CiAqCiAqIEJhc2VkIG9uOgogKgpodHRwczovL2dp dGh1Yi5jb20vcm9ja2NoaXAtbGludXgva2VybmVsL2Jsb2IvZGV2ZWxvcC00LjQvZHJpdmVycy9y a19uYW5kL3JrX2Z0bF9hcm1fdjcuUwogKgpodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5j b20vcm9ja2NoaXAtbGludXgva2VybmVsL2RldmVsb3AtNC40L2RyaXZlcnMvcmtfbmFuZC9ya19m dGxfYXJtX3Y3LlMKICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTgsIEZ1emhvdSBSb2NrY2hpcCBF bGVjdHJvbmljcyBDby4sIEx0ZAogKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCsK ICoKICoKaHR0cHM6Ly9naXRodWIuY29tL3JvY2tjaGlwLWxpbnV4L3UtYm9vdC9ibG9iL25leHQt ZGV2L2RyaXZlcnMvcmtuYW5kL3JrX2Z0bF9hcm1fdjcuUwogKgpodHRwczovL3Jhdy5naXRodWJ1 c2VyY29udGVudC5jb20vcm9ja2NoaXAtbGludXgvdS1ib290L25leHQtZGV2L2RyaXZlcnMvcmtu YW5kL3JrX2Z0bF9hcm1fdjcuUwogKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCwgRnV6aG91IFJv Y2tjaGlwIEVsZWN0cm9uaWNzIENvLiwgTHRkCiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBH UEwtMi4wKwogKi8KCnN0cnVjdCBuYW5kX3JlcSB7Cgl1aW50MzJfdCBzdGF0dXM7Cgl1aW50MzJf dCBwYWdlX2FkZHI7Cgl1aW50MzJfdCAqcF9kYXRhOwoJdWludDE2X3QgKnBfc3BhcmU7Cgl1aW50 MzJfdCBscG47Cgl1aW50MzJfdCByZXMyOwoJdWludDMyX3QgcmVzMzsKCXVpbnQzMl90IHJlczQ7 Cgl1aW50MzJfdCByZXM1Owp9OwoKc3RydWN0IHRhZ0JidEluZm8gewoJdWludDE2X3QgaWQ7Cgl1 aW50MTZfdCBwYWdlOwoJdWludDE2X3QgcmVnaW9uOwoJdWludDE2X3QgY291bnRlcjsKCXVpbnQz Ml90IGluZGV4OwoJdWludDE2X3QgYmxrX2NudFs4XTsKCXVpbnQzMl90ICptYXBbOF07Cn07Cgpz dHJ1Y3QgdGFnX3N5c19zcGFyZV9idWYgewoJdWludDE2X3QgdGFnOwoJdWludDE2X3QgaWQ7Cgl1 aW50MzJfdCBpbmRleDsKCXVpbnQxNl90IHJlZ2lvbjsKCXVpbnQxNl90IGJiX251bTsKCXVpbnQz Ml90IHN5c19ibGtzX3Blcl9wbGFuZTsKfTsKCnN0cnVjdCB0YWdCYnRJbmZvIGdCYnRJbmZvOwpz dHJ1Y3QgbmFuZF9yZXEgcmVxX3N5czsKCnVpbnQzMl90IEZ0bEJibUlzQmFkQmxvY2sodWludDMy X3QgbGJuKQp7CglyZXR1cm4gKGdCYnRJbmZvLm1hcFsodWludDE2X3QpKGxibiAvIGNfZnRsX25h bmRfYmxrc19wZXJfZGllKV0KCQlbbGJuICUgY19mdGxfbmFuZF9ibGtzX3Blcl9kaWUgPj4gNV0g Pj4KCQkobGJuICUgY19mdGxfbmFuZF9ibGtzX3Blcl9kaWUgJiAweDFGKSkgJiAxOwp9CgppbnQg RnRsTG9hZEJidCh2b2lkKQp7CglzdHJ1Y3QgdGFnX3N5c19zcGFyZV9idWYgKnBfc3BhcmU7Cgl1 aW50MzJfdCBjb3VudGVyOwoJaW50IGk7Cgl1aW50MzJfdCBpbmRleDsKCXVpbnQxNl90IHBhZ2Ux OwoJdWludDMyX3QgcGFnZTI7Cgl1aW50OF90ICpwX2J1ZjsKCXVpbnQzMl90ICpwX21hcDE7Cgl1 aW50OF90ICpwX21hcDI7Cgl1aW50MTZfdCByZWdpb247CglzaXplX3Qgc2l6ZTsKCXVpbnQxNl90 IHN5c19ibGtzX3Blcl9wbGFuZTsKCXVpbnQzMl90IHRtcDsKCglGVExfREJHKCk7CgoJcmVxX3N5 cy5wX2RhdGEgPSBwX3N5c19kYXRhX2J1ZjsKCXBfc3BhcmUgPSAoc3RydWN0IHRhZ19zeXNfc3Bh cmVfYnVmICopcF9zeXNfc3BhcmVfYnVmOwoJcmVxX3N5cy5wX3NwYXJlID0gcF9zeXNfc3BhcmVf YnVmOwoJRnRsQmJ0TWVtSW5pdCgpOwoJZm9yIChpID0gKHVpbnQxNl90KShjX2Z0bF9uYW5kX2Js a3NfcGVyX2RpZSAtIDEpOwoJICAgICBjX2Z0bF9uYW5kX2Jsa3NfcGVyX2RpZSAtIDQ3IDw9IGk7 CgkgICAgIGkgPSAodWludDE2X3QpKGkgLSAxKSkgewoJCXJlcV9zeXMucGFnZV9hZGRyID0gaSA8 PCAxMDsKCQlGbGFzaFJlYWRQYWdlcygmcmVxX3N5cywgMXUsIDF1KTsKCQlpZiAocmVxX3N5cy5z dGF0dXMgPT0gTkFORF9TVFNfRVJST1IpIHsKCQkJKytyZXFfc3lzLnBhZ2VfYWRkcjsKCQkJRmxh c2hSZWFkUGFnZXMoJnJlcV9zeXMsIDF1LCAxdSk7CgkJfQoJCWlmIChyZXFfc3lzLnN0YXR1cyAh PSBOQU5EX1NUU19FUlJPUiAmJgoJCSAgICBwX3NwYXJlLT50YWcgPT0gSURfQkJUQikgewoJCQlp bmRleCA9IHBfc3BhcmUtPmluZGV4OwoJCQlnQmJ0SW5mby5pZCA9IGk7CgkJCWdCYnRJbmZvLmlu ZGV4ID0gaW5kZXg7CgkJCWdCYnRJbmZvLnJlZ2lvbiA9IHBfc3BhcmUtPnJlZ2lvbjsKCQkJYnJl YWs7CgkJfQoJfQoJaWYgKGdCYnRJbmZvLmlkID09IDB4RkZGRikKCQlyZXR1cm4gLTE7CglpZiAo Z0JidEluZm8ucmVnaW9uICE9IDB4RkZGRikgewoJCXJlcV9zeXMucGFnZV9hZGRyID0gZ0JidElu Zm8ucmVnaW9uIDw8IDEwOwoJCUZsYXNoUmVhZFBhZ2VzKCZyZXFfc3lzLCAxdSwgMXUpOwoJCWlm IChyZXFfc3lzLnN0YXR1cyAhPSBOQU5EX1NUU19FUlJPUiAmJgoJCSAgICBwX3NwYXJlLT50YWcg PT0gSURfQkJUQiAmJgoJCSAgICBwX3NwYXJlLT5pbmRleCA+IGdCYnRJbmZvLmluZGV4KSB7CgkJ CWdCYnRJbmZvLmluZGV4ID0gcF9zcGFyZS0+aW5kZXg7CgkJCXJlZ2lvbiA9IHBfc3BhcmUtPnJl Z2lvbjsKCQkJZ0JidEluZm8uaWQgPSBnQmJ0SW5mby5yZWdpb247CgkJCWdCYnRJbmZvLnJlZ2lv biA9IHJlZ2lvbjsKCQl9Cgl9CglwYWdlMSA9IEZ0bEdldExhc3RXcml0dGVuUGFnZShnQmJ0SW5m by5pZCwgMXUpOwoJcGFnZTIgPSAodWludDE2X3QpcGFnZTE7CglnQmJ0SW5mby5wYWdlID0gcGFn ZTEgKyAxOwoJd2hpbGUgKChwYWdlMiAmIDB4ODAwMDAwMDApID09IDApIHsKCQlyZXFfc3lzLnBh Z2VfYWRkciA9IHBhZ2UyIHwgKGdCYnRJbmZvLmlkIDw8IDEwKTsKCQlyZXFfc3lzLnBfZGF0YSA9 IHBfc3lzX2RhdGFfYnVmOwoJCUZsYXNoUmVhZFBhZ2VzKCZyZXFfc3lzLCAxdSwgMXUpOwoJCWlm IChyZXFfc3lzLnN0YXR1cyAhPSBOQU5EX1NUU19FUlJPUiAmJgoJCSAgICBwX3NwYXJlLT50YWcg PT0gSURfQkJUQikgewoJCQlnb3RvIGxhYmVsXzE7CgkJfQoJCXBhZ2UyID0gKHVpbnQxNl90KShw YWdlMiAtIDEpOwoJfQoJRlRMX0VSUigpOwpsYWJlbF8xOgoJc3lzX2Jsa3NfcGVyX3BsYW5lID0g cF9zcGFyZS0+c3lzX2Jsa3NfcGVyX3BsYW5lOwoJZ0JidEluZm8uY291bnRlciA9IHBfc3BhcmUt PmJiX251bTsKCWlmIChzeXNfYmxrc19wZXJfcGxhbmUgIT0gMHhGRkZGICYmCgkgICAgc3lzX2Js a3NfcGVyX3BsYW5lICE9IGNfZnRsX25hbmRfc3lzX2Jsa3NfcGVyX3BsYW5lKSB7CgkJdG1wID0g KHVpbnQzMl90KWNfZnRsX25hbmRfYmxrX3Blcl9wbGFuZSA+PiAyOwoJCWlmIChjX2Z0bF9uYW5k X3N5c19ibGtzX3Blcl9wbGFuZSA8IHRtcCAmJgoJCSAgICBzeXNfYmxrc19wZXJfcGxhbmUgPCB0 bXApIHsKCQkJRnRsU3lzQmxrTnVtSW5pdChzeXNfYmxrc19wZXJfcGxhbmUpOwoJCX0KCX0KCXBf bWFwMSA9ICh1aW50MzJfdCAqKSZnQmJ0SW5mby5ibGtfY250WzZdOwoJY291bnRlciA9IDA7Cgl3 aGlsZSAoY291bnRlciA8IGNfZnRsX25hbmRfZGllX251bSkgewoJCXBfbWFwMiA9ICh1aW50OF90 ICopcF9tYXAxWzFdOwoJCSsrcF9tYXAxOwoJCXNpemUgPSA0ICogY19mdGxfbmFuZF9iYm1fYnVm X3NpemU7CgkJcF9idWYgPSAodWludDhfdCAqKXJlcV9zeXMucF9kYXRhICsgY291bnRlcisrICog c2l6ZTsKCQlmdGxfbWVtY3B5KHBfbWFwMiwgcF9idWYsIHNpemUpOwoJfQoJcmV0dXJuIDA7Cn0K CnZvaWQgRnRsQmJtVGJsRmx1c2godm9pZCkKewoJc3RydWN0IHRhZ19zeXNfc3BhcmVfYnVmICpw X3NwYXJlOwoJdWludDMyX3QgYmJfbnVtOwoJdWludDE2X3QgY291bnRlcjE7Cgl1aW50MzJfdCBj b3VudGVyMjsKCXVpbnQzMl90IGRpZV9jb3VudGVyOwoJdWludDE2X3QgbGJuMTsKCXVpbnQzMl90 IGxibjI7Cgl1aW50MzJfdCAqcF9tYXA7Cgl1aW50MzJfdCBzZWN0b3I7Cgl1aW50OF90ICp0bXBf cF9tYXA7CgoJRlRMX0RCRygpOwoKCWRpZV9jb3VudGVyID0gMDsKCWlmICghZ19mbGFzaF9yZWFk X29ubHlfZW4pIHsKCQlwX21hcCA9ICh1aW50MzJfdCAqKSZnQmJ0SW5mby5ibGtfY250WzZdOwoJ CXJlcV9zeXMucF9zcGFyZSA9IHBfc3lzX3NwYXJlX2J1ZjsKCQlyZXFfc3lzLnBfZGF0YSA9IHBf c3lzX2RhdGFfYnVmOwoJCWZ0bF9tZW1zZXQoCgkJCXBfc3lzX2RhdGFfYnVmLAoJCQlnX2ZsYXNo X3JlYWRfb25seV9lbiwKCQkJY19mdGxfbmFuZF9ieXRlX3Blcl9wYWdlKTsKCQl3aGlsZSAoKHVp bnQzMl90KWRpZV9jb3VudGVyIDwgY19mdGxfbmFuZF9kaWVfbnVtKSB7CgkJCXRtcF9wX21hcCA9 ICh1aW50OF90ICopcF9tYXBbMV07CgkJCSsrcF9tYXA7CgkJCXNlY3RvciA9IGRpZV9jb3VudGVy KysKCQkJCSAqIGNfZnRsX25hbmRfYmJtX2J1Zl9zaXplOwoJCQlmdGxfbWVtY3B5KAoJCQkJJnJl cV9zeXMucF9kYXRhW3NlY3Rvcl0sCgkJCQl0bXBfcF9tYXAsCgkJCQk0ICogY19mdGxfbmFuZF9i Ym1fYnVmX3NpemUpOwoJCX0KCQlwX3NwYXJlID0gKHN0cnVjdCB0YWdfc3lzX3NwYXJlX2J1ZiAq KXJlcV9zeXMucF9zcGFyZTsKCQljb3VudGVyMSA9IDA7CgkJY291bnRlcjIgPSAwOwoJCWZ0bF9t ZW1zZXQocmVxX3N5cy5wX3NwYXJlLCAweEZGdSwgMTZ1KTsKCQlwX3NwYXJlLT50YWcgPSBJRF9C QlRCOwoJCXBfc3BhcmUtPmluZGV4ID0gZ0JidEluZm8uaW5kZXg7CgkJcF9zcGFyZS0+aWQgPSBn QmJ0SW5mby5pZDsKCQlwX3NwYXJlLT5yZWdpb24gPSBnQmJ0SW5mby5yZWdpb247CgkJcF9zcGFy ZS0+YmJfbnVtID0gZ0JidEluZm8uY291bnRlcjsKCQlwX3NwYXJlLT5zeXNfYmxrc19wZXJfcGxh bmUgPSBjX2Z0bF9uYW5kX3N5c19ibGtzX3Blcl9wbGFuZTsKCQlkbyB7CgkJCXdoaWxlICgxKSB7 CgkJCQlyZXFfc3lzLnBfZGF0YSA9IHBfc3lzX2RhdGFfYnVmOwoJCQkJYmJfbnVtID0gcF9zcGFy ZS0+YmJfbnVtOwoJCQkJcmVxX3N5cy5wX3NwYXJlID0gcF9zeXNfc3BhcmVfYnVmOwoJCQkJcmVx X3N5cy5zdGF0dXMgPSBOQU5EX1NUU19PSzsKCQkJCXJlcV9zeXMucGFnZV9hZGRyID0gZ0JidElu Zm8ucGFnZQoJCQkJCQkgICAgfCAoZ0JidEluZm8uaWQgPDwgMTApOwoJCQkJRlRMX0lORk8oCgkJ CQkJIkZ0bEJibVRibEZsdXNoIGlkPSV4LHBhZ2U9JXgsIgoJCQkJCSJwcmV2aWQ9JXggY250PSVk XG4iLAoJCQkJCWdCYnRJbmZvLmlkLAoJCQkJCWdCYnRJbmZvLnBhZ2UsCgkJCQkJZ0JidEluZm8u cmVnaW9uLAoJCQkJCWJiX251bSk7CgkJCQlpZiAoZ0JidEluZm8ucGFnZSA+PQoJCQkJICAgIGNf ZnRsX25hbmRfcGFnZV9wZXJfc2xjX2JsayAtIDEpIHsKCQkJCQlsYm4xID0gZ0JidEluZm8uaWQ7 CgkJCQkJZ0JidEluZm8ucGFnZSA9IDA7CgkJCQkJcF9zcGFyZS0+aW5kZXggPSArK2dCYnRJbmZv LmluZGV4OwoJCQkJCXBfc3BhcmUtPnJlZ2lvbiA9IGxibjE7CgkJCQkJbGJuMiA9IGdCYnRJbmZv LnJlZ2lvbjsKCQkJCQlnQmJ0SW5mby5yZWdpb24gPSBsYm4xOwoJCQkJCWdCYnRJbmZvLmlkID0g bGJuMjsKCQkJCQlyZXFfc3lzLnBhZ2VfYWRkciA9IGxibjIgPDwgMTA7CgkJCQkJcmVxX2VyYXNl LT5wYWdlX2FkZHIgPSBsYm4yIDw8IDEwOwoJCQkJCUZsYXNoRXJhc2VCbG9ja3MoCgkJCQkJCXJl cV9lcmFzZSwKCQkJCQkJMXUsCgkJCQkJCTF1KTsKCQkJCX0KCQkJCUZsYXNoUHJvZ1BhZ2VzKCZy ZXFfc3lzLCAxdSwgMXUsIDF1KTsKCQkJCSsrZ0JidEluZm8ucGFnZTsKCQkJCWlmIChyZXFfc3lz LnN0YXR1cyA9PSBOQU5EX1NUU19FUlJPUikKCQkJCQlicmVhazsKCQkJCWlmICgrK2NvdW50ZXIy ICE9IDEgJiYKCQkJCSAgICByZXFfc3lzLnN0YXR1cyAhPSBOQU5EX1NUU19SRUZSRVNIKSB7CgkJ CQkJcmV0dXJuOwoJCQkJfQoJCQl9CgkJCSsrY291bnRlcjE7CgkJCUZUTF9JTkZPKAoJCQkJIkZ0 bEJibVRibEZsdXNoIGVycm9yOiV4XG4iLAoJCQkJcmVxX3N5cy5wYWdlX2FkZHIpOwoJCX0gd2hp bGUgKGNvdW50ZXIxIDw9IDN1KTsKCQlGVExfSU5GTygKCQkJIkZ0bEJibVRibEZsdXNoIGVycm9y ID0gJXggZXJyb3IgY291bnQgPSAlZFxuIiwKCQkJcmVxX3N5cy5wYWdlX2FkZHIsCgkJCWNvdW50 ZXIxKTsKCQlnX2ZsYXNoX3JlYWRfb25seV9lbiA9IDE7Cgl9Cn0KCl9fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpMaW51eCBNVEQgZGlzY3Vzc2lv biBtYWlsaW5nIGxpc3QKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5m by9saW51eC1tdGQvCg== From mboxrd@z Thu Jan 1 00:00:00 1970 From: Johan Jonker Subject: Re: [RFC PATCH v2 00/10] Enable RK3066 NANDC for MK808 Date: Sat, 25 Jan 2020 23:28:31 +0100 Message-ID: References: <20200124163001.28910-1-jbx6244@gmail.com> <20200124181751.721aa428@xps13> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Return-path: In-Reply-To: <20200124181751.721aa428@xps13> Content-Language: en-US Sender: devicetree-owner-u79uwXL29TY76Z2rM5mHXA@public.gmane.org To: Miquel Raynal Cc: richard-/L3Ra7n9ekc@public.gmane.org, vigneshr-l0cyMroinI0@public.gmane.org, robh+dt-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org, mark.rutland-5wv7dgnIgG8@public.gmane.org, heiko-4mtYJXux2i+zQB+pC5nmwQ@public.gmane.org, linux-mtd-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org, devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org, linux-rockchip-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org, linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, shawn.lin-TNX95d0MmH7DzftRWevZcw@public.gmane.org, yifeng.zhao-TNX95d0MmH7DzftRWevZcw@public.gmane.org List-Id: linux-rockchip.vger.kernel.org Hi Miquel, See below. Btw, what is your impression of the other V2 'improvements'? Thanks [..] >> Not tested: >> >> NANDC version 9. >> NAND raw write. > > nandbiterrs -i /dev/mtd to validate it works! > >> RK3066 still has no support for Uboot. >> Any write command would interfere with data structures made by the boot loader. >> >> Etc. >> >> Problems: >> >> No bad block support. Most devices use a FTL bad block map with tags >> that must be located on specific page locations which is outside >> the scope of the raw MTD framework. > > I don't understand this story of bad block map. Are you comparing with > a vendor kernel? Two separate things: -Rockchip FTL has it's own FTL storage format. The original factory BBM (marker) information is lost, so it stores a BB (bad block) map/table at the (last erase block - n) and then downwards. See source below. Not usable for raw MTD. It's the situation most user will find on there NAND. - For raw MTD to use it's own BB map in this stage the proposed solution for raw MTD just didn't gave me something/results that I understand, so I leave it out for now. For an empty NAND without Rockchip FTL this could work as long as it stays out of our bootrom blocks. It's fine that MTD is 'rigid', but not all Socs fit, so find solutions that are maybe second best. MTD has most components already in place, see what we can make out of it. > > If vendors invent new ways to handle MTD blocks it's sad but they will > never be compatible with mainline. It's a fact. However for an upstream > version, I don't get if there is any real issue? The location of the > BBM is not related to your controller driver but depends on the NAND > chip and as you say below we know provide three possible positions in > a block. > Handling of MTD blocks remains the same AFAICT. It transfers data and oob byte to MTD data structures. Just find a way to tell MTD not mess with bootrom blocks. Programming/reading in Uboot and Linux is something that Open Source has to find a solution for. > What you refer as the FTL is the equivalent of UBI in Linux, which > indeed offers to the user a linear logical view of all the valid blocks > while physically the data is spread across all the available > eraseblocks. When I refer to FTL it's to the Rockchip FTL. In this current EXPERIMENTAL driver stage I just warn a potential unaware user of the things that are at play on that NAND. UBI might work fine, but not now. > >> >> hynix_nand_init() add extra option NAND_BBM_LASTPAGE for H27UCG8T2ATR-BC. >> Example: To see what happens when a partition is placed over the bootrom erase blocks. >From the previous log example it seems that it somehow does do a read command at the end of this partition. That what tests are for. >> No partition support. A FTL driver will store at random locations and >> a linear user specific layout does not fit within >> the generic character of this basic driver. >> MTD partition support works fine. It's just the current content of my RK3066 NAND written with a Rockchip FTL loader that makes write tests not so smart as I have to reprogram then with USB. Chicken egg problem. >> Driver assumes that IO pins are correctly set by the boot loader. > > Which pins are you talking about? Are you missing a pinctrl driver? > No, NAND share the same data IO pins as emmc. Set direct in grfReg, not with pinctrl. Every Rockchip grfReg is different, so leave it out for now. For my Linux TEST driver not a issue as that is already done by the loader. Would you like this grf thing included in a Linux driver for every Soc? >> >> Fixed timing setting. Mentioned for completeness. >> >> RK3228A/RK3228B compatibility version 701 unknown >> RV1108 nand version unknown Can Shawn Lin or someone else help here? RV1108 TRM (manual) is still missing? >> [..] Have fun! ///////////////////// >From rk3066a.dtsi: SPDX-License-Identifier: (GPL-2.0+ OR MIT) Copyright (c) 2013 MundoReader S.L. emmc { emmc_clk: emmc-clk { rockchip,pins = <3 RK_PD7 2 &pcfg_pull_default>; }; emmc_cmd: emmc-cmd { rockchip,pins = <4 RK_PB1 2 &pcfg_pull_default>; }; emmc_rst: emmc-rst { rockchip,pins = <4 RK_PB2 2 &pcfg_pull_default>; }; /* * The data pins are shared between nandc and emmc and * not accessible through pinctrl. Also they should've * been already set correctly by firmware, as * flash/emmc is the boot-device. */ }; ///////////////////// >From pinctrl_rk3066.c: SPDX-License-Identifier: GPL-2.0+ Copyright 2017 Paweł Jarosz static void pinctrl_rk3066_nand_config(struct rk3066_grf *grf) { rk_clrsetreg(&grf->soc_con0, EMMC_FLASH_SEL_MASK, 0 << EMMC_FLASH_SEL_SHIFT); rk_clrsetreg(&grf->gpio3d_iomux, GPIO3D7_MASK, GPIO3D7_FLASH_DQS << GPIO3D7_SHIFT); } ///////////////////// For EMMC: GRF_GPIO_IOMUX[3].GPIOD_IOMUX = ((0x3<<14)<<16)|(0x2<<14); // dqs GRF_GPIO_IOMUX[4].GPIOB_IOMUX = ((0xf<<2)<<16)|(0xa<<2); // cmd,rstn GRF_SOC_CON[0] = ((0x1<<11)<<16)|(0x1<<11); // emmc data0-7,wp ///////////////////// GRF_SOC_CON0 RK3066: Bit Attr Reset Value Description 31:16 RW 0x0 write_enable bit 0~bit 15 write enable 11 RW 0x0 emmc_flash_sel emmc flash select used for iomux IO_FLASH_DATA[7:0] , IO_FLASH_WP are selected for emmc instead of flash ///////////////////////////////////////////////////////////// // SPDX-License-Identifier: GPL-2.0 /* * Copyright (c) 2019, Johan Jonker * * Based on: * https://github.com/rockchip-linux/kernel/blob/develop-4.4/drivers/rk_nand/rk_ftl_arm_v7.S * https://raw.githubusercontent.com/rockchip-linux/kernel/develop-4.4/drivers/rk_nand/rk_ftl_arm_v7.S * Copyright (c) 2016-2018, Fuzhou Rockchip Electronics Co., Ltd * SPDX-License-Identifier: GPL-2.0+ * * https://github.com/rockchip-linux/u-boot/blob/next-dev/drivers/rknand/rk_ftl_arm_v7.S * https://raw.githubusercontent.com/rockchip-linux/u-boot/next-dev/drivers/rknand/rk_ftl_arm_v7.S * Copyright (c) 2016-2018, Fuzhou Rockchip Electronics Co., Ltd * SPDX-License-Identifier: GPL-2.0+ */ struct nand_req { uint32_t status; uint32_t page_addr; uint32_t *p_data; uint16_t *p_spare; uint32_t lpn; uint32_t res2; uint32_t res3; uint32_t res4; uint32_t res5; }; struct tagBbtInfo { uint16_t id; uint16_t page; uint16_t region; uint16_t counter; uint32_t index; uint16_t blk_cnt[8]; uint32_t *map[8]; }; struct tag_sys_spare_buf { uint16_t tag; uint16_t id; uint32_t index; uint16_t region; uint16_t bb_num; uint32_t sys_blks_per_plane; }; struct tagBbtInfo gBbtInfo; struct nand_req req_sys; uint32_t FtlBbmIsBadBlock(uint32_t lbn) { return (gBbtInfo.map[(uint16_t)(lbn / c_ftl_nand_blks_per_die)] [lbn % c_ftl_nand_blks_per_die >> 5] >> (lbn % c_ftl_nand_blks_per_die & 0x1F)) & 1; } int FtlLoadBbt(void) { struct tag_sys_spare_buf *p_spare; uint32_t counter; int i; uint32_t index; uint16_t page1; uint32_t page2; uint8_t *p_buf; uint32_t *p_map1; uint8_t *p_map2; uint16_t region; size_t size; uint16_t sys_blks_per_plane; uint32_t tmp; FTL_DBG(); req_sys.p_data = p_sys_data_buf; p_spare = (struct tag_sys_spare_buf *)p_sys_spare_buf; req_sys.p_spare = p_sys_spare_buf; FtlBbtMemInit(); for (i = (uint16_t)(c_ftl_nand_blks_per_die - 1); c_ftl_nand_blks_per_die - 47 <= i; i = (uint16_t)(i - 1)) { req_sys.page_addr = i << 10; FlashReadPages(&req_sys, 1u, 1u); if (req_sys.status == NAND_STS_ERROR) { ++req_sys.page_addr; FlashReadPages(&req_sys, 1u, 1u); } if (req_sys.status != NAND_STS_ERROR && p_spare->tag == ID_BBTB) { index = p_spare->index; gBbtInfo.id = i; gBbtInfo.index = index; gBbtInfo.region = p_spare->region; break; } } if (gBbtInfo.id == 0xFFFF) return -1; if (gBbtInfo.region != 0xFFFF) { req_sys.page_addr = gBbtInfo.region << 10; FlashReadPages(&req_sys, 1u, 1u); if (req_sys.status != NAND_STS_ERROR && p_spare->tag == ID_BBTB && p_spare->index > gBbtInfo.index) { gBbtInfo.index = p_spare->index; region = p_spare->region; gBbtInfo.id = gBbtInfo.region; gBbtInfo.region = region; } } page1 = FtlGetLastWrittenPage(gBbtInfo.id, 1u); page2 = (uint16_t)page1; gBbtInfo.page = page1 + 1; while ((page2 & 0x80000000) == 0) { req_sys.page_addr = page2 | (gBbtInfo.id << 10); req_sys.p_data = p_sys_data_buf; FlashReadPages(&req_sys, 1u, 1u); if (req_sys.status != NAND_STS_ERROR && p_spare->tag == ID_BBTB) { goto label_1; } page2 = (uint16_t)(page2 - 1); } FTL_ERR(); label_1: sys_blks_per_plane = p_spare->sys_blks_per_plane; gBbtInfo.counter = p_spare->bb_num; if (sys_blks_per_plane != 0xFFFF && sys_blks_per_plane != c_ftl_nand_sys_blks_per_plane) { tmp = (uint32_t)c_ftl_nand_blk_per_plane >> 2; if (c_ftl_nand_sys_blks_per_plane < tmp && sys_blks_per_plane < tmp) { FtlSysBlkNumInit(sys_blks_per_plane); } } p_map1 = (uint32_t *)&gBbtInfo.blk_cnt[6]; counter = 0; while (counter < c_ftl_nand_die_num) { p_map2 = (uint8_t *)p_map1[1]; ++p_map1; size = 4 * c_ftl_nand_bbm_buf_size; p_buf = (uint8_t *)req_sys.p_data + counter++ * size; ftl_memcpy(p_map2, p_buf, size); } return 0; } void FtlBbmTblFlush(void) { struct tag_sys_spare_buf *p_spare; uint32_t bb_num; uint16_t counter1; uint32_t counter2; uint32_t die_counter; uint16_t lbn1; uint32_t lbn2; uint32_t *p_map; uint32_t sector; uint8_t *tmp_p_map; FTL_DBG(); die_counter = 0; if (!g_flash_read_only_en) { p_map = (uint32_t *)&gBbtInfo.blk_cnt[6]; req_sys.p_spare = p_sys_spare_buf; req_sys.p_data = p_sys_data_buf; ftl_memset( p_sys_data_buf, g_flash_read_only_en, c_ftl_nand_byte_per_page); while ((uint32_t)die_counter < c_ftl_nand_die_num) { tmp_p_map = (uint8_t *)p_map[1]; ++p_map; sector = die_counter++ * c_ftl_nand_bbm_buf_size; ftl_memcpy( &req_sys.p_data[sector], tmp_p_map, 4 * c_ftl_nand_bbm_buf_size); } p_spare = (struct tag_sys_spare_buf *)req_sys.p_spare; counter1 = 0; counter2 = 0; ftl_memset(req_sys.p_spare, 0xFFu, 16u); p_spare->tag = ID_BBTB; p_spare->index = gBbtInfo.index; p_spare->id = gBbtInfo.id; p_spare->region = gBbtInfo.region; p_spare->bb_num = gBbtInfo.counter; p_spare->sys_blks_per_plane = c_ftl_nand_sys_blks_per_plane; do { while (1) { req_sys.p_data = p_sys_data_buf; bb_num = p_spare->bb_num; req_sys.p_spare = p_sys_spare_buf; req_sys.status = NAND_STS_OK; req_sys.page_addr = gBbtInfo.page | (gBbtInfo.id << 10); FTL_INFO( "FtlBbmTblFlush id=%x,page=%x," "previd=%x cnt=%d\n", gBbtInfo.id, gBbtInfo.page, gBbtInfo.region, bb_num); if (gBbtInfo.page >= c_ftl_nand_page_per_slc_blk - 1) { lbn1 = gBbtInfo.id; gBbtInfo.page = 0; p_spare->index = ++gBbtInfo.index; p_spare->region = lbn1; lbn2 = gBbtInfo.region; gBbtInfo.region = lbn1; gBbtInfo.id = lbn2; req_sys.page_addr = lbn2 << 10; req_erase->page_addr = lbn2 << 10; FlashEraseBlocks( req_erase, 1u, 1u); } FlashProgPages(&req_sys, 1u, 1u, 1u); ++gBbtInfo.page; if (req_sys.status == NAND_STS_ERROR) break; if (++counter2 != 1 && req_sys.status != NAND_STS_REFRESH) { return; } } ++counter1; FTL_INFO( "FtlBbmTblFlush error:%x\n", req_sys.page_addr); } while (counter1 <= 3u); FTL_INFO( "FtlBbmTblFlush error = %x error count = %d\n", req_sys.page_addr, counter1); g_flash_read_only_en = 1; } } From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.0 required=3.0 tests=DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED,DKIM_VALID,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,MENTIONS_GIT_HOSTING, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8168AC2D0DB for ; Sat, 25 Jan 2020 22:28:47 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 48D2820716 for ; Sat, 25 Jan 2020 22:28:47 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="tCFjggXp"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="rLIPleQc" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 48D2820716 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:Date: Message-ID:From:References:To:Subject:Reply-To:Content-ID:Content-Description :Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=JKuQsGOnTQEvYOZ6wYROBAKatqAYuxiqDJYrOGnI/a8=; b=tCFjggXpv4hW7E BcCqH4gOZd5KnLhAmOBf6OncoPvVw1Vklt1GfYuqUHabZeG0itP+Tig3KNqLGDp1iIGQ/bzbUPwP6 BFYBFVWyoNZsUlh36pF9P4lgKlL7FdSTUzlxGvxgaaNvQQxRe6pNtDtbm+6Vv8gavv2gQQ6Ju+Opi e1462rVTv594YWGWXiGwp9shkYsk5XUglCmF07yKoFjODG+z+xxdrc3irJpo/Y/MN64RMnisyMj6p 79ey7rHfKY22gm1kiKTe6imn7fCcvusyAUB4NOtoh2BUpfG9kjTpaQhQ8pvw6nvefnv0uZWdv0ETb 7F8LytQIt519v01mn8Lw==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1ivTv2-0000Eq-3k; Sat, 25 Jan 2020 22:28:44 +0000 Received: from mail-wm1-x343.google.com ([2a00:1450:4864:20::343]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1ivTuw-0000DY-BY; Sat, 25 Jan 2020 22:28:41 +0000 Received: by mail-wm1-x343.google.com with SMTP id t14so3111744wmi.5; Sat, 25 Jan 2020 14:28:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=subject:to:cc:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=JuIIuzl/aUbh+G2KKabF03wm8Z2xQCzAlj66QQd7f6M=; b=rLIPleQc0Wji7dJaPdcJUUojzJxZLNZckJi1XGzpETZ6cHNZ0p3brsVX/ZgJy7AjYG H9AIxBfJvgruTYpB+/fVLWU0TTa/09bMPQ0XG6Wp6LrR3YFJsV/6LB+kafTCPT+XNDZS tKB3LUkb9OTVd2urF901g5dwLh+uMymY1PA/NUFf4BHiX4VFrwyDwslHMNMEpfxVqyd/ 80oYEyplzCe4x8K7xJMt7Y2XnON855NMuF0caLNSG2mR5byRBtNMtKZGUMcbHP3ec5ML OfKsAlsjVuxhh9cXE6XnDhdfz5EF3QBqCxaeovugPw6bDyZa2HJOE825EswiSKL4+CG8 RirQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:cc:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=JuIIuzl/aUbh+G2KKabF03wm8Z2xQCzAlj66QQd7f6M=; b=W/ILl7WY6wcmPgbZhLiYse1BJAAg5+jHL1Jha1gM7SUOsO42mdjoHsvefd6uwkdcvJ yaPcnlr5XNF0QsLYHakJRwSs2pRdHUY1c6BKuas613CJq2gLqaR3oBu7lCNSij7EJWE1 5icXSCeZgB51Qw70biy4nZ//MR9AUJkGaF+ALpWkn44MY0QchmH1IxVJE7D16AdRmZow kDhnTeQXATcOgcNrcCfnJz1V30s5XCdj7ScKI6XU/ZjTnUJvJxeKcpSP2ixcnbGGFsWc bpLDfXGfPJXfUpnczpLk3aFaLUWmCZicFgG2zanhHtsh+A+6kdknVzmFs6HWemZ+ga41 9N3Q== X-Gm-Message-State: APjAAAVqCV/DYzAxypDWDR5BbWE3CAmSdQ1YQvVUmXKWzP1/+kDXITQa GbyvYp2I2w/bkm2YokiTbr8OohrB X-Google-Smtp-Source: APXvYqz5BIt7pACL1GHEpmqqXj8Xco8xfSye9IZWqYTSbnpswncvmZj5/2o76yKiCIMZj0o+U7EZAw== X-Received: by 2002:a1c:7c18:: with SMTP id x24mr6169031wmc.185.1579991314340; Sat, 25 Jan 2020 14:28:34 -0800 (PST) Received: from [192.168.2.1] (ip51ccf9cd.speed.planet.nl. [81.204.249.205]) by smtp.gmail.com with ESMTPSA id o4sm13290965wrw.97.2020.01.25.14.28.33 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Sat, 25 Jan 2020 14:28:33 -0800 (PST) Subject: Re: [RFC PATCH v2 00/10] Enable RK3066 NANDC for MK808 To: Miquel Raynal References: <20200124163001.28910-1-jbx6244@gmail.com> <20200124181751.721aa428@xps13> From: Johan Jonker Message-ID: Date: Sat, 25 Jan 2020 23:28:31 +0100 User-Agent: Mozilla/5.0 (X11; Linux i686; rv:68.0) Gecko/20100101 Thunderbird/68.4.1 MIME-Version: 1.0 In-Reply-To: <20200124181751.721aa428@xps13> Content-Language: en-US X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200125_142838_425294_75607E40 X-CRM114-Status: GOOD ( 24.54 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: mark.rutland@arm.com, devicetree@vger.kernel.org, vigneshr@ti.com, richard@nod.at, shawn.lin@rock-chips.com, linux-kernel@vger.kernel.org, linux-rockchip@lists.infradead.org, robh+dt@kernel.org, linux-mtd@lists.infradead.org, yifeng.zhao@rock-chips.com, linux-arm-kernel@lists.infradead.org, heiko@sntech.de Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org SGkgTWlxdWVsLAoKU2VlIGJlbG93LgpCdHcsIHdoYXQgaXMgeW91ciBpbXByZXNzaW9uIG9mIHRo ZSBvdGhlciBWMiAnaW1wcm92ZW1lbnRzJz8KClRoYW5rcwoKWy4uXQoKPj4gTm90IHRlc3RlZDoK Pj4KPj4gTkFOREMgdmVyc2lvbiA5Lgo+PiBOQU5EIHJhdyB3cml0ZS4KPgo+IG5hbmRiaXRlcnJz IC1pIC9kZXYvbXRkPHg+IHRvIHZhbGlkYXRlIGl0IHdvcmtzIQo+Cj4+IFJLMzA2NiBzdGlsbCBo YXMgbm8gc3VwcG9ydCBmb3IgVWJvb3QuCj4+IEFueSB3cml0ZSBjb21tYW5kIHdvdWxkIGludGVy ZmVyZSB3aXRoIGRhdGEgc3RydWN0dXJlcyBtYWRlIGJ5IHRoZQpib290IGxvYWRlci4KPj4KPj4g RXRjLgo+Pgo+PiBQcm9ibGVtczoKPj4KPj4gTm8gYmFkIGJsb2NrIHN1cHBvcnQuIE1vc3QgZGV2 aWNlcyB1c2UgYSBGVEwgYmFkIGJsb2NrIG1hcCB3aXRoIHRhZ3MKPj4gdGhhdCBtdXN0IGJlIGxv Y2F0ZWQgb24gc3BlY2lmaWMgcGFnZSBsb2NhdGlvbnMgd2hpY2ggaXMgb3V0c2lkZQo+PiB0aGUg c2NvcGUgb2YgdGhlIHJhdyBNVEQgZnJhbWV3b3JrLgo+Cj4gSSBkb24ndCB1bmRlcnN0YW5kIHRo aXMgc3Rvcnkgb2YgYmFkIGJsb2NrIG1hcC4gQXJlIHlvdSBjb21wYXJpbmcgd2l0aAo+IGEgdmVu ZG9yIGtlcm5lbD8KClR3byBzZXBhcmF0ZSB0aGluZ3M6CgotUm9ja2NoaXAgRlRMIGhhcyBpdCdz IG93biBGVEwgc3RvcmFnZSBmb3JtYXQuClRoZSBvcmlnaW5hbCBmYWN0b3J5IEJCTSAobWFya2Vy KSBpbmZvcm1hdGlvbiBpcyBsb3N0LCBzbyBpdCBzdG9yZXMKYSBCQiAoYmFkIGJsb2NrKSBtYXAv dGFibGUgYXQgdGhlIChsYXN0IGVyYXNlIGJsb2NrIC0gbikgYW5kIHRoZW4gZG93bndhcmRzLgpT ZWUgc291cmNlIGJlbG93LiBOb3QgdXNhYmxlIGZvciByYXcgTVRELiBJdCdzIHRoZSBzaXR1YXRp b24gbW9zdCB1c2VyIHdpbGwKZmluZCBvbiB0aGVyZSBOQU5ELgoKCi0gRm9yIHJhdyBNVEQgdG8g dXNlIGl0J3Mgb3duIEJCIG1hcCBpbiB0aGlzIHN0YWdlIHRoZSBwcm9wb3NlZCBzb2x1dGlvbgpm b3IgcmF3IE1URCBqdXN0IGRpZG4ndCBnYXZlIG1lIHNvbWV0aGluZy9yZXN1bHRzIHRoYXQgSSB1 bmRlcnN0YW5kLApzbyBJIGxlYXZlIGl0IG91dCBmb3Igbm93LiBGb3IgYW4gZW1wdHkgTkFORCB3 aXRob3V0IFJvY2tjaGlwIEZUTCB0aGlzIGNvdWxkCndvcmsgYXMgbG9uZyBhcyBpdCBzdGF5cyBv dXQgb2Ygb3VyIGJvb3Ryb20gYmxvY2tzLgpJdCdzIGZpbmUgdGhhdCBNVEQgaXMgJ3JpZ2lkJywg YnV0IG5vdCBhbGwgU29jcyBmaXQsIHNvIGZpbmQgc29sdXRpb25zCnRoYXQgYXJlIG1heWJlIHNl Y29uZCBiZXN0LiBNVEQgaGFzIG1vc3QgY29tcG9uZW50cyBhbHJlYWR5IGluIHBsYWNlLApzZWUg d2hhdCB3ZSBjYW4gbWFrZSBvdXQgb2YgaXQuCgo+Cj4gSWYgdmVuZG9ycyBpbnZlbnQgbmV3IHdh eXMgdG8gaGFuZGxlIE1URCBibG9ja3MgaXQncyBzYWQgYnV0IHRoZXkgd2lsbAo+IG5ldmVyIGJl IGNvbXBhdGlibGUgd2l0aCBtYWlubGluZS4gSXQncyBhIGZhY3QuIEhvd2V2ZXIgZm9yIGFuIHVw c3RyZWFtCj4gdmVyc2lvbiwgSSBkb24ndCBnZXQgaWYgdGhlcmUgaXMgYW55IHJlYWwgaXNzdWU/ IFRoZSBsb2NhdGlvbiBvZiB0aGUKPiBCQk0gaXMgbm90IHJlbGF0ZWQgdG8geW91ciBjb250cm9s bGVyIGRyaXZlciBidXQgZGVwZW5kcyBvbiB0aGUgTkFORAo+IGNoaXAgYW5kIGFzIHlvdSBzYXkg YmVsb3cgd2Uga25vdyBwcm92aWRlIHRocmVlIHBvc3NpYmxlIHBvc2l0aW9ucyBpbgo+IGEgYmxv Y2suCj4KCkhhbmRsaW5nIG9mIE1URCBibG9ja3MgcmVtYWlucyB0aGUgc2FtZSBBRkFJQ1QuCkl0 IHRyYW5zZmVycyBkYXRhIGFuZCBvb2IgYnl0ZSB0byBNVEQgZGF0YSBzdHJ1Y3R1cmVzLgpKdXN0 IGZpbmQgYSB3YXkgdG8gdGVsbCBNVEQgbm90IG1lc3Mgd2l0aCBib290cm9tIGJsb2Nrcy4KUHJv Z3JhbW1pbmcvcmVhZGluZyBpbiBVYm9vdCBhbmQgTGludXggaXMgc29tZXRoaW5nIHRoYXQgT3Bl biBTb3VyY2UKaGFzIHRvIGZpbmQgYSBzb2x1dGlvbiBmb3IuCgo+IFdoYXQgeW91IHJlZmVyIGFz IHRoZSBGVEwgaXMgdGhlIGVxdWl2YWxlbnQgb2YgVUJJIGluIExpbnV4LCB3aGljaAo+IGluZGVl ZCBvZmZlcnMgdG8gdGhlIHVzZXIgYSBsaW5lYXIgbG9naWNhbCB2aWV3IG9mIGFsbCB0aGUgdmFs aWQgYmxvY2tzCj4gd2hpbGUgcGh5c2ljYWxseSB0aGUgZGF0YSBpcyBzcHJlYWQgYWNyb3NzIGFs bCB0aGUgYXZhaWxhYmxlCj4gZXJhc2VibG9ja3MuCgpXaGVuIEkgcmVmZXIgdG8gRlRMIGl0J3Mg dG8gdGhlIFJvY2tjaGlwIEZUTC4KSW4gdGhpcyBjdXJyZW50IEVYUEVSSU1FTlRBTCBkcml2ZXIg c3RhZ2UgSSBqdXN0IHdhcm4gYSBwb3RlbnRpYWwKdW5hd2FyZSB1c2VyCm9mIHRoZSB0aGluZ3Mg dGhhdCBhcmUgYXQgcGxheSBvbiB0aGF0IE5BTkQuIFVCSSBtaWdodCB3b3JrIGZpbmUsIGJ1dApu b3Qgbm93LgoKPgo+Pgo+PiBoeW5peF9uYW5kX2luaXQoKSBhZGQgZXh0cmEgb3B0aW9uIE5BTkRf QkJNX0xBU1RQQUdFIGZvciBIMjdVQ0c4VDJBVFItQkMuCj4+CgpFeGFtcGxlOgpUbyBzZWUgd2hh dCBoYXBwZW5zIHdoZW4gYSBwYXJ0aXRpb24gaXMgcGxhY2VkIG92ZXIgdGhlIGJvb3Ryb20gZXJh c2UKYmxvY2tzLgpGcm9tIHRoZSBwcmV2aW91cyBsb2cgZXhhbXBsZSBpdCBzZWVtcyB0aGF0IGl0 IHNvbWVob3cgZG9lcyBkbyBhIHJlYWQKY29tbWFuZAphdCB0aGUgZW5kIG9mIHRoaXMgcGFydGl0 aW9uLiBUaGF0IHdoYXQgdGVzdHMgYXJlIGZvci4KCj4+IE5vIHBhcnRpdGlvbiBzdXBwb3J0LiBB IEZUTCBkcml2ZXIgd2lsbCBzdG9yZSBhdCByYW5kb20gbG9jYXRpb25zIGFuZAo+PiBhIGxpbmVh ciB1c2VyIHNwZWNpZmljIGxheW91dCBkb2VzIG5vdCBmaXQgd2l0aGluCj4+IHRoZSBnZW5lcmlj IGNoYXJhY3RlciBvZiB0aGlzIGJhc2ljIGRyaXZlci4KPj4KCk1URCBwYXJ0aXRpb24gc3VwcG9y dCB3b3JrcyBmaW5lLiBJdCdzIGp1c3QgdGhlIGN1cnJlbnQgY29udGVudCBvZiBteQpSSzMwNjYg TkFORAp3cml0dGVuIHdpdGggYSBSb2NrY2hpcCBGVEwgbG9hZGVyIHRoYXQgbWFrZXMgd3JpdGUg dGVzdHMgbm90IHNvIHNtYXJ0CmFzIEkgaGF2ZQp0byByZXByb2dyYW0gdGhlbiB3aXRoIFVTQi4g Q2hpY2tlbiBlZ2cgcHJvYmxlbS4KCj4+IERyaXZlciBhc3N1bWVzIHRoYXQgSU8gcGlucyBhcmUg Y29ycmVjdGx5IHNldCBieSB0aGUgYm9vdCBsb2FkZXIuCj4KPiBXaGljaCBwaW5zIGFyZSB5b3Ug dGFsa2luZyBhYm91dD8gQXJlIHlvdSBtaXNzaW5nIGEgcGluY3RybCBkcml2ZXI/Cj4KCk5vLCBO QU5EIHNoYXJlIHRoZSBzYW1lIGRhdGEgSU8gcGlucyBhcyBlbW1jLgpTZXQgZGlyZWN0IGluIGdy ZlJlZywgbm90IHdpdGggcGluY3RybC4KRXZlcnkgUm9ja2NoaXAgZ3JmUmVnIGlzIGRpZmZlcmVu dCwgc28gbGVhdmUgaXQgb3V0IGZvciBub3cuCkZvciBteSBMaW51eCBURVNUIGRyaXZlciBub3Qg YSBpc3N1ZSBhcyB0aGF0IGlzIGFscmVhZHkgZG9uZQpieSB0aGUgbG9hZGVyLgoKV291bGQgeW91 IGxpa2UgdGhpcyBncmYgdGhpbmcgaW5jbHVkZWQgaW4gYSBMaW51eCBkcml2ZXIgZm9yIGV2ZXJ5 IFNvYz8KCj4+Cj4+IEZpeGVkIHRpbWluZyBzZXR0aW5nLgoKTWVudGlvbmVkIGZvciBjb21wbGV0 ZW5lc3MuCgo+Pgo+PiBSSzMyMjhBL1JLMzIyOEIgY29tcGF0aWJpbGl0eSB2ZXJzaW9uIDcwMSB1 bmtub3duCj4+IFJWMTEwOCBuYW5kIHZlcnNpb24gdW5rbm93bgoKQ2FuIFNoYXduIExpbiBvciBz b21lb25lIGVsc2UgaGVscCBoZXJlPwpSVjExMDggVFJNIChtYW51YWwpIGlzIHN0aWxsIG1pc3Np bmc/Cgo+PgoKWy4uXQoKSGF2ZSBmdW4hCgovLy8vLy8vLy8vLy8vLy8vLy8vLy8KRnJvbSByazMw NjZhLmR0c2k6ClNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiAoR1BMLTIuMCsgT1IgTUlUKQpDb3B5 cmlnaHQgKGMpIDIwMTMgTXVuZG9SZWFkZXIgUy5MLgoKCQllbW1jIHsKCQkJZW1tY19jbGs6IGVt bWMtY2xrIHsKCQkJCXJvY2tjaGlwLHBpbnMgPSA8MyBSS19QRDcgMiAmcGNmZ19wdWxsX2RlZmF1 bHQ+OwoJCQl9OwoKCQkJZW1tY19jbWQ6IGVtbWMtY21kIHsKCQkJCXJvY2tjaGlwLHBpbnMgPSA8 NCBSS19QQjEgMiAmcGNmZ19wdWxsX2RlZmF1bHQ+OwoJCQl9OwoKCQkJZW1tY19yc3Q6IGVtbWMt cnN0IHsKCQkJCXJvY2tjaGlwLHBpbnMgPSA8NCBSS19QQjIgMiAmcGNmZ19wdWxsX2RlZmF1bHQ+ OwoJCQl9OwoKCQkJLyoKCQkJICogVGhlIGRhdGEgcGlucyBhcmUgc2hhcmVkIGJldHdlZW4gbmFu ZGMgYW5kIGVtbWMgYW5kCgkJCSAqIG5vdCBhY2Nlc3NpYmxlIHRocm91Z2ggcGluY3RybC4gQWxz byB0aGV5IHNob3VsZCd2ZQoJCQkgKiBiZWVuIGFscmVhZHkgc2V0IGNvcnJlY3RseSBieSBmaXJt d2FyZSwgYXMKCQkJICogZmxhc2gvZW1tYyBpcyB0aGUgYm9vdC1kZXZpY2UuCgkJCSAqLwoJCX07 CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8KRnJvbSBwaW5jdHJsX3JrMzA2Ni5jOgpTUERYLUxpY2Vu c2UtSWRlbnRpZmllcjogICAgIEdQTC0yLjArCkNvcHlyaWdodCAyMDE3IFBhd2XFgiBKYXJvc3oK CnN0YXRpYyB2b2lkIHBpbmN0cmxfcmszMDY2X25hbmRfY29uZmlnKHN0cnVjdCByazMwNjZfZ3Jm ICpncmYpCnsKCXJrX2NscnNldHJlZygmZ3JmLT5zb2NfY29uMCwKCQkgICAgIEVNTUNfRkxBU0hf U0VMX01BU0ssCgkJICAgICAwIDw8IEVNTUNfRkxBU0hfU0VMX1NISUZUKTsKCXJrX2NscnNldHJl ZygmZ3JmLT5ncGlvM2RfaW9tdXgsCgkJICAgICBHUElPM0Q3X01BU0ssCgkJICAgICBHUElPM0Q3 X0ZMQVNIX0RRUyA8PCBHUElPM0Q3X1NISUZUKTsKfQoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkZv ciBFTU1DOgoKR1JGX0dQSU9fSU9NVVhbM10uR1BJT0RfSU9NVVggPSAoKDB4Mzw8MTQpPDwxNil8 KDB4Mjw8MTQpOyAvLyBkcXMKR1JGX0dQSU9fSU9NVVhbNF0uR1BJT0JfSU9NVVggPSAoKDB4Zjw8 Mik8PDE2KXwoMHhhPDwyKTsgICAvLyBjbWQscnN0bgpHUkZfU09DX0NPTlswXSA9ICgoMHgxPDwx MSk8PDE2KXwoMHgxPDwxMSk7ICAgICAgICAgICAgICAgIC8vIGVtbWMKZGF0YTAtNyx3cAoKLy8v Ly8vLy8vLy8vLy8vLy8vLy8vCgpHUkZfU09DX0NPTjAgUkszMDY2OgpCaXQgQXR0ciBSZXNldCBW YWx1ZSAgICAgICAgRGVzY3JpcHRpb24KMzE6MTYgUlcgMHgwIHdyaXRlX2VuYWJsZSAgIGJpdCAw fmJpdCAxNSB3cml0ZSBlbmFibGUKCjExICAgIFJXIDB4MCBlbW1jX2ZsYXNoX3NlbCBlbW1jIGZs YXNoIHNlbGVjdCB1c2VkIGZvciBpb211eAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSU9f RkxBU0hfREFUQVs3OjBdICwgSU9fRkxBU0hfV1AgYXJlCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICBzZWxlY3RlZCBmb3IgZW1tYyBpbnN0ZWFkIG9mIGZsYXNoCgovLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgovLyBTUERYLUxp Y2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAovKgogKiBDb3B5cmlnaHQgKGMpIDIwMTksIEpvaGFu IEpvbmtlciA8amJ4NjI0NEBnbWFpbC5jb20+CiAqCiAqIEJhc2VkIG9uOgogKgpodHRwczovL2dp dGh1Yi5jb20vcm9ja2NoaXAtbGludXgva2VybmVsL2Jsb2IvZGV2ZWxvcC00LjQvZHJpdmVycy9y a19uYW5kL3JrX2Z0bF9hcm1fdjcuUwogKgpodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5j b20vcm9ja2NoaXAtbGludXgva2VybmVsL2RldmVsb3AtNC40L2RyaXZlcnMvcmtfbmFuZC9ya19m dGxfYXJtX3Y3LlMKICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTgsIEZ1emhvdSBSb2NrY2hpcCBF bGVjdHJvbmljcyBDby4sIEx0ZAogKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCsK ICoKICoKaHR0cHM6Ly9naXRodWIuY29tL3JvY2tjaGlwLWxpbnV4L3UtYm9vdC9ibG9iL25leHQt ZGV2L2RyaXZlcnMvcmtuYW5kL3JrX2Z0bF9hcm1fdjcuUwogKgpodHRwczovL3Jhdy5naXRodWJ1 c2VyY29udGVudC5jb20vcm9ja2NoaXAtbGludXgvdS1ib290L25leHQtZGV2L2RyaXZlcnMvcmtu YW5kL3JrX2Z0bF9hcm1fdjcuUwogKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCwgRnV6aG91IFJv Y2tjaGlwIEVsZWN0cm9uaWNzIENvLiwgTHRkCiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBH UEwtMi4wKwogKi8KCnN0cnVjdCBuYW5kX3JlcSB7Cgl1aW50MzJfdCBzdGF0dXM7Cgl1aW50MzJf dCBwYWdlX2FkZHI7Cgl1aW50MzJfdCAqcF9kYXRhOwoJdWludDE2X3QgKnBfc3BhcmU7Cgl1aW50 MzJfdCBscG47Cgl1aW50MzJfdCByZXMyOwoJdWludDMyX3QgcmVzMzsKCXVpbnQzMl90IHJlczQ7 Cgl1aW50MzJfdCByZXM1Owp9OwoKc3RydWN0IHRhZ0JidEluZm8gewoJdWludDE2X3QgaWQ7Cgl1 aW50MTZfdCBwYWdlOwoJdWludDE2X3QgcmVnaW9uOwoJdWludDE2X3QgY291bnRlcjsKCXVpbnQz Ml90IGluZGV4OwoJdWludDE2X3QgYmxrX2NudFs4XTsKCXVpbnQzMl90ICptYXBbOF07Cn07Cgpz dHJ1Y3QgdGFnX3N5c19zcGFyZV9idWYgewoJdWludDE2X3QgdGFnOwoJdWludDE2X3QgaWQ7Cgl1 aW50MzJfdCBpbmRleDsKCXVpbnQxNl90IHJlZ2lvbjsKCXVpbnQxNl90IGJiX251bTsKCXVpbnQz Ml90IHN5c19ibGtzX3Blcl9wbGFuZTsKfTsKCnN0cnVjdCB0YWdCYnRJbmZvIGdCYnRJbmZvOwpz dHJ1Y3QgbmFuZF9yZXEgcmVxX3N5czsKCnVpbnQzMl90IEZ0bEJibUlzQmFkQmxvY2sodWludDMy X3QgbGJuKQp7CglyZXR1cm4gKGdCYnRJbmZvLm1hcFsodWludDE2X3QpKGxibiAvIGNfZnRsX25h bmRfYmxrc19wZXJfZGllKV0KCQlbbGJuICUgY19mdGxfbmFuZF9ibGtzX3Blcl9kaWUgPj4gNV0g Pj4KCQkobGJuICUgY19mdGxfbmFuZF9ibGtzX3Blcl9kaWUgJiAweDFGKSkgJiAxOwp9CgppbnQg RnRsTG9hZEJidCh2b2lkKQp7CglzdHJ1Y3QgdGFnX3N5c19zcGFyZV9idWYgKnBfc3BhcmU7Cgl1 aW50MzJfdCBjb3VudGVyOwoJaW50IGk7Cgl1aW50MzJfdCBpbmRleDsKCXVpbnQxNl90IHBhZ2Ux OwoJdWludDMyX3QgcGFnZTI7Cgl1aW50OF90ICpwX2J1ZjsKCXVpbnQzMl90ICpwX21hcDE7Cgl1 aW50OF90ICpwX21hcDI7Cgl1aW50MTZfdCByZWdpb247CglzaXplX3Qgc2l6ZTsKCXVpbnQxNl90 IHN5c19ibGtzX3Blcl9wbGFuZTsKCXVpbnQzMl90IHRtcDsKCglGVExfREJHKCk7CgoJcmVxX3N5 cy5wX2RhdGEgPSBwX3N5c19kYXRhX2J1ZjsKCXBfc3BhcmUgPSAoc3RydWN0IHRhZ19zeXNfc3Bh cmVfYnVmICopcF9zeXNfc3BhcmVfYnVmOwoJcmVxX3N5cy5wX3NwYXJlID0gcF9zeXNfc3BhcmVf YnVmOwoJRnRsQmJ0TWVtSW5pdCgpOwoJZm9yIChpID0gKHVpbnQxNl90KShjX2Z0bF9uYW5kX2Js a3NfcGVyX2RpZSAtIDEpOwoJICAgICBjX2Z0bF9uYW5kX2Jsa3NfcGVyX2RpZSAtIDQ3IDw9IGk7 CgkgICAgIGkgPSAodWludDE2X3QpKGkgLSAxKSkgewoJCXJlcV9zeXMucGFnZV9hZGRyID0gaSA8 PCAxMDsKCQlGbGFzaFJlYWRQYWdlcygmcmVxX3N5cywgMXUsIDF1KTsKCQlpZiAocmVxX3N5cy5z dGF0dXMgPT0gTkFORF9TVFNfRVJST1IpIHsKCQkJKytyZXFfc3lzLnBhZ2VfYWRkcjsKCQkJRmxh c2hSZWFkUGFnZXMoJnJlcV9zeXMsIDF1LCAxdSk7CgkJfQoJCWlmIChyZXFfc3lzLnN0YXR1cyAh PSBOQU5EX1NUU19FUlJPUiAmJgoJCSAgICBwX3NwYXJlLT50YWcgPT0gSURfQkJUQikgewoJCQlp bmRleCA9IHBfc3BhcmUtPmluZGV4OwoJCQlnQmJ0SW5mby5pZCA9IGk7CgkJCWdCYnRJbmZvLmlu ZGV4ID0gaW5kZXg7CgkJCWdCYnRJbmZvLnJlZ2lvbiA9IHBfc3BhcmUtPnJlZ2lvbjsKCQkJYnJl YWs7CgkJfQoJfQoJaWYgKGdCYnRJbmZvLmlkID09IDB4RkZGRikKCQlyZXR1cm4gLTE7CglpZiAo Z0JidEluZm8ucmVnaW9uICE9IDB4RkZGRikgewoJCXJlcV9zeXMucGFnZV9hZGRyID0gZ0JidElu Zm8ucmVnaW9uIDw8IDEwOwoJCUZsYXNoUmVhZFBhZ2VzKCZyZXFfc3lzLCAxdSwgMXUpOwoJCWlm IChyZXFfc3lzLnN0YXR1cyAhPSBOQU5EX1NUU19FUlJPUiAmJgoJCSAgICBwX3NwYXJlLT50YWcg PT0gSURfQkJUQiAmJgoJCSAgICBwX3NwYXJlLT5pbmRleCA+IGdCYnRJbmZvLmluZGV4KSB7CgkJ CWdCYnRJbmZvLmluZGV4ID0gcF9zcGFyZS0+aW5kZXg7CgkJCXJlZ2lvbiA9IHBfc3BhcmUtPnJl Z2lvbjsKCQkJZ0JidEluZm8uaWQgPSBnQmJ0SW5mby5yZWdpb247CgkJCWdCYnRJbmZvLnJlZ2lv biA9IHJlZ2lvbjsKCQl9Cgl9CglwYWdlMSA9IEZ0bEdldExhc3RXcml0dGVuUGFnZShnQmJ0SW5m by5pZCwgMXUpOwoJcGFnZTIgPSAodWludDE2X3QpcGFnZTE7CglnQmJ0SW5mby5wYWdlID0gcGFn ZTEgKyAxOwoJd2hpbGUgKChwYWdlMiAmIDB4ODAwMDAwMDApID09IDApIHsKCQlyZXFfc3lzLnBh Z2VfYWRkciA9IHBhZ2UyIHwgKGdCYnRJbmZvLmlkIDw8IDEwKTsKCQlyZXFfc3lzLnBfZGF0YSA9 IHBfc3lzX2RhdGFfYnVmOwoJCUZsYXNoUmVhZFBhZ2VzKCZyZXFfc3lzLCAxdSwgMXUpOwoJCWlm IChyZXFfc3lzLnN0YXR1cyAhPSBOQU5EX1NUU19FUlJPUiAmJgoJCSAgICBwX3NwYXJlLT50YWcg PT0gSURfQkJUQikgewoJCQlnb3RvIGxhYmVsXzE7CgkJfQoJCXBhZ2UyID0gKHVpbnQxNl90KShw YWdlMiAtIDEpOwoJfQoJRlRMX0VSUigpOwpsYWJlbF8xOgoJc3lzX2Jsa3NfcGVyX3BsYW5lID0g cF9zcGFyZS0+c3lzX2Jsa3NfcGVyX3BsYW5lOwoJZ0JidEluZm8uY291bnRlciA9IHBfc3BhcmUt PmJiX251bTsKCWlmIChzeXNfYmxrc19wZXJfcGxhbmUgIT0gMHhGRkZGICYmCgkgICAgc3lzX2Js a3NfcGVyX3BsYW5lICE9IGNfZnRsX25hbmRfc3lzX2Jsa3NfcGVyX3BsYW5lKSB7CgkJdG1wID0g KHVpbnQzMl90KWNfZnRsX25hbmRfYmxrX3Blcl9wbGFuZSA+PiAyOwoJCWlmIChjX2Z0bF9uYW5k X3N5c19ibGtzX3Blcl9wbGFuZSA8IHRtcCAmJgoJCSAgICBzeXNfYmxrc19wZXJfcGxhbmUgPCB0 bXApIHsKCQkJRnRsU3lzQmxrTnVtSW5pdChzeXNfYmxrc19wZXJfcGxhbmUpOwoJCX0KCX0KCXBf bWFwMSA9ICh1aW50MzJfdCAqKSZnQmJ0SW5mby5ibGtfY250WzZdOwoJY291bnRlciA9IDA7Cgl3 aGlsZSAoY291bnRlciA8IGNfZnRsX25hbmRfZGllX251bSkgewoJCXBfbWFwMiA9ICh1aW50OF90 ICopcF9tYXAxWzFdOwoJCSsrcF9tYXAxOwoJCXNpemUgPSA0ICogY19mdGxfbmFuZF9iYm1fYnVm X3NpemU7CgkJcF9idWYgPSAodWludDhfdCAqKXJlcV9zeXMucF9kYXRhICsgY291bnRlcisrICog c2l6ZTsKCQlmdGxfbWVtY3B5KHBfbWFwMiwgcF9idWYsIHNpemUpOwoJfQoJcmV0dXJuIDA7Cn0K CnZvaWQgRnRsQmJtVGJsRmx1c2godm9pZCkKewoJc3RydWN0IHRhZ19zeXNfc3BhcmVfYnVmICpw X3NwYXJlOwoJdWludDMyX3QgYmJfbnVtOwoJdWludDE2X3QgY291bnRlcjE7Cgl1aW50MzJfdCBj b3VudGVyMjsKCXVpbnQzMl90IGRpZV9jb3VudGVyOwoJdWludDE2X3QgbGJuMTsKCXVpbnQzMl90 IGxibjI7Cgl1aW50MzJfdCAqcF9tYXA7Cgl1aW50MzJfdCBzZWN0b3I7Cgl1aW50OF90ICp0bXBf cF9tYXA7CgoJRlRMX0RCRygpOwoKCWRpZV9jb3VudGVyID0gMDsKCWlmICghZ19mbGFzaF9yZWFk X29ubHlfZW4pIHsKCQlwX21hcCA9ICh1aW50MzJfdCAqKSZnQmJ0SW5mby5ibGtfY250WzZdOwoJ CXJlcV9zeXMucF9zcGFyZSA9IHBfc3lzX3NwYXJlX2J1ZjsKCQlyZXFfc3lzLnBfZGF0YSA9IHBf c3lzX2RhdGFfYnVmOwoJCWZ0bF9tZW1zZXQoCgkJCXBfc3lzX2RhdGFfYnVmLAoJCQlnX2ZsYXNo X3JlYWRfb25seV9lbiwKCQkJY19mdGxfbmFuZF9ieXRlX3Blcl9wYWdlKTsKCQl3aGlsZSAoKHVp bnQzMl90KWRpZV9jb3VudGVyIDwgY19mdGxfbmFuZF9kaWVfbnVtKSB7CgkJCXRtcF9wX21hcCA9 ICh1aW50OF90ICopcF9tYXBbMV07CgkJCSsrcF9tYXA7CgkJCXNlY3RvciA9IGRpZV9jb3VudGVy KysKCQkJCSAqIGNfZnRsX25hbmRfYmJtX2J1Zl9zaXplOwoJCQlmdGxfbWVtY3B5KAoJCQkJJnJl cV9zeXMucF9kYXRhW3NlY3Rvcl0sCgkJCQl0bXBfcF9tYXAsCgkJCQk0ICogY19mdGxfbmFuZF9i Ym1fYnVmX3NpemUpOwoJCX0KCQlwX3NwYXJlID0gKHN0cnVjdCB0YWdfc3lzX3NwYXJlX2J1ZiAq KXJlcV9zeXMucF9zcGFyZTsKCQljb3VudGVyMSA9IDA7CgkJY291bnRlcjIgPSAwOwoJCWZ0bF9t ZW1zZXQocmVxX3N5cy5wX3NwYXJlLCAweEZGdSwgMTZ1KTsKCQlwX3NwYXJlLT50YWcgPSBJRF9C QlRCOwoJCXBfc3BhcmUtPmluZGV4ID0gZ0JidEluZm8uaW5kZXg7CgkJcF9zcGFyZS0+aWQgPSBn QmJ0SW5mby5pZDsKCQlwX3NwYXJlLT5yZWdpb24gPSBnQmJ0SW5mby5yZWdpb247CgkJcF9zcGFy ZS0+YmJfbnVtID0gZ0JidEluZm8uY291bnRlcjsKCQlwX3NwYXJlLT5zeXNfYmxrc19wZXJfcGxh bmUgPSBjX2Z0bF9uYW5kX3N5c19ibGtzX3Blcl9wbGFuZTsKCQlkbyB7CgkJCXdoaWxlICgxKSB7 CgkJCQlyZXFfc3lzLnBfZGF0YSA9IHBfc3lzX2RhdGFfYnVmOwoJCQkJYmJfbnVtID0gcF9zcGFy ZS0+YmJfbnVtOwoJCQkJcmVxX3N5cy5wX3NwYXJlID0gcF9zeXNfc3BhcmVfYnVmOwoJCQkJcmVx X3N5cy5zdGF0dXMgPSBOQU5EX1NUU19PSzsKCQkJCXJlcV9zeXMucGFnZV9hZGRyID0gZ0JidElu Zm8ucGFnZQoJCQkJCQkgICAgfCAoZ0JidEluZm8uaWQgPDwgMTApOwoJCQkJRlRMX0lORk8oCgkJ CQkJIkZ0bEJibVRibEZsdXNoIGlkPSV4LHBhZ2U9JXgsIgoJCQkJCSJwcmV2aWQ9JXggY250PSVk XG4iLAoJCQkJCWdCYnRJbmZvLmlkLAoJCQkJCWdCYnRJbmZvLnBhZ2UsCgkJCQkJZ0JidEluZm8u cmVnaW9uLAoJCQkJCWJiX251bSk7CgkJCQlpZiAoZ0JidEluZm8ucGFnZSA+PQoJCQkJICAgIGNf ZnRsX25hbmRfcGFnZV9wZXJfc2xjX2JsayAtIDEpIHsKCQkJCQlsYm4xID0gZ0JidEluZm8uaWQ7 CgkJCQkJZ0JidEluZm8ucGFnZSA9IDA7CgkJCQkJcF9zcGFyZS0+aW5kZXggPSArK2dCYnRJbmZv LmluZGV4OwoJCQkJCXBfc3BhcmUtPnJlZ2lvbiA9IGxibjE7CgkJCQkJbGJuMiA9IGdCYnRJbmZv LnJlZ2lvbjsKCQkJCQlnQmJ0SW5mby5yZWdpb24gPSBsYm4xOwoJCQkJCWdCYnRJbmZvLmlkID0g bGJuMjsKCQkJCQlyZXFfc3lzLnBhZ2VfYWRkciA9IGxibjIgPDwgMTA7CgkJCQkJcmVxX2VyYXNl LT5wYWdlX2FkZHIgPSBsYm4yIDw8IDEwOwoJCQkJCUZsYXNoRXJhc2VCbG9ja3MoCgkJCQkJCXJl cV9lcmFzZSwKCQkJCQkJMXUsCgkJCQkJCTF1KTsKCQkJCX0KCQkJCUZsYXNoUHJvZ1BhZ2VzKCZy ZXFfc3lzLCAxdSwgMXUsIDF1KTsKCQkJCSsrZ0JidEluZm8ucGFnZTsKCQkJCWlmIChyZXFfc3lz LnN0YXR1cyA9PSBOQU5EX1NUU19FUlJPUikKCQkJCQlicmVhazsKCQkJCWlmICgrK2NvdW50ZXIy ICE9IDEgJiYKCQkJCSAgICByZXFfc3lzLnN0YXR1cyAhPSBOQU5EX1NUU19SRUZSRVNIKSB7CgkJ CQkJcmV0dXJuOwoJCQkJfQoJCQl9CgkJCSsrY291bnRlcjE7CgkJCUZUTF9JTkZPKAoJCQkJIkZ0 bEJibVRibEZsdXNoIGVycm9yOiV4XG4iLAoJCQkJcmVxX3N5cy5wYWdlX2FkZHIpOwoJCX0gd2hp bGUgKGNvdW50ZXIxIDw9IDN1KTsKCQlGVExfSU5GTygKCQkJIkZ0bEJibVRibEZsdXNoIGVycm9y ID0gJXggZXJyb3IgY291bnQgPSAlZFxuIiwKCQkJcmVxX3N5cy5wYWdlX2FkZHIsCgkJCWNvdW50 ZXIxKTsKCQlnX2ZsYXNoX3JlYWRfb25seV9lbiA9IDE7Cgl9Cn0KCl9fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBs aXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5m cmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.1 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,MENTIONS_GIT_HOSTING, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_1 autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 61D22C2D0DB for ; Sat, 25 Jan 2020 22:28:39 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 18B6D20716 for ; Sat, 25 Jan 2020 22:28:39 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="rLIPleQc" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727163AbgAYW2i (ORCPT ); Sat, 25 Jan 2020 17:28:38 -0500 Received: from mail-wm1-f68.google.com ([209.85.128.68]:54681 "EHLO mail-wm1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727250AbgAYW2i (ORCPT ); Sat, 25 Jan 2020 17:28:38 -0500 Received: by mail-wm1-f68.google.com with SMTP id g1so3028667wmh.4; Sat, 25 Jan 2020 14:28:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=subject:to:cc:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=JuIIuzl/aUbh+G2KKabF03wm8Z2xQCzAlj66QQd7f6M=; b=rLIPleQc0Wji7dJaPdcJUUojzJxZLNZckJi1XGzpETZ6cHNZ0p3brsVX/ZgJy7AjYG H9AIxBfJvgruTYpB+/fVLWU0TTa/09bMPQ0XG6Wp6LrR3YFJsV/6LB+kafTCPT+XNDZS tKB3LUkb9OTVd2urF901g5dwLh+uMymY1PA/NUFf4BHiX4VFrwyDwslHMNMEpfxVqyd/ 80oYEyplzCe4x8K7xJMt7Y2XnON855NMuF0caLNSG2mR5byRBtNMtKZGUMcbHP3ec5ML OfKsAlsjVuxhh9cXE6XnDhdfz5EF3QBqCxaeovugPw6bDyZa2HJOE825EswiSKL4+CG8 RirQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:cc:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=JuIIuzl/aUbh+G2KKabF03wm8Z2xQCzAlj66QQd7f6M=; b=siXAT0CK6e4ccvB7cVjSAF8wW5PFfedMDA96kEaQNOG/m0hJDRz12nnAH+tDgXN5Tp 5BU0ctS+Ihp+MFgkhlIkqzOfC1wUuucIMJci7aPMntpw7NMtQEP75p4AKbKBU0JTvqWH 9J6DNUPjxnZbMLQnIl+hg63WwgJXOdp6ImfARYslLsajMk0vzCp3UU3aRJREIcSM/Vxq qReJh/OAW/4JAIWo3GuHlMmYTOy0eQCmGp9t9Ewpk5Onif6Cx8WtWEBSrHuMAWSuV5Pd 9XqwofW1FS+vFjQdzxv9mY8iyW6b5I2eL1LZvH7ubESYKn3Qi0IRuh244ceN5QQjq9qG 6T2w== X-Gm-Message-State: APjAAAV04EVAR9WLvwLnC6OLOmMfvjS79Df2lPpC1EEaC09hN0kMitMU L0z6GFDv0B0Vib5McCLWCv4= X-Google-Smtp-Source: APXvYqz5BIt7pACL1GHEpmqqXj8Xco8xfSye9IZWqYTSbnpswncvmZj5/2o76yKiCIMZj0o+U7EZAw== X-Received: by 2002:a1c:7c18:: with SMTP id x24mr6169031wmc.185.1579991314340; Sat, 25 Jan 2020 14:28:34 -0800 (PST) Received: from [192.168.2.1] (ip51ccf9cd.speed.planet.nl. [81.204.249.205]) by smtp.gmail.com with ESMTPSA id o4sm13290965wrw.97.2020.01.25.14.28.33 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Sat, 25 Jan 2020 14:28:33 -0800 (PST) Subject: Re: [RFC PATCH v2 00/10] Enable RK3066 NANDC for MK808 To: Miquel Raynal Cc: richard@nod.at, vigneshr@ti.com, robh+dt@kernel.org, mark.rutland@arm.com, heiko@sntech.de, linux-mtd@lists.infradead.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org, shawn.lin@rock-chips.com, yifeng.zhao@rock-chips.com References: <20200124163001.28910-1-jbx6244@gmail.com> <20200124181751.721aa428@xps13> From: Johan Jonker Message-ID: Date: Sat, 25 Jan 2020 23:28:31 +0100 User-Agent: Mozilla/5.0 (X11; Linux i686; rv:68.0) Gecko/20100101 Thunderbird/68.4.1 MIME-Version: 1.0 In-Reply-To: <20200124181751.721aa428@xps13> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 8bit Sender: devicetree-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org Hi Miquel, See below. Btw, what is your impression of the other V2 'improvements'? Thanks [..] >> Not tested: >> >> NANDC version 9. >> NAND raw write. > > nandbiterrs -i /dev/mtd to validate it works! > >> RK3066 still has no support for Uboot. >> Any write command would interfere with data structures made by the boot loader. >> >> Etc. >> >> Problems: >> >> No bad block support. Most devices use a FTL bad block map with tags >> that must be located on specific page locations which is outside >> the scope of the raw MTD framework. > > I don't understand this story of bad block map. Are you comparing with > a vendor kernel? Two separate things: -Rockchip FTL has it's own FTL storage format. The original factory BBM (marker) information is lost, so it stores a BB (bad block) map/table at the (last erase block - n) and then downwards. See source below. Not usable for raw MTD. It's the situation most user will find on there NAND. - For raw MTD to use it's own BB map in this stage the proposed solution for raw MTD just didn't gave me something/results that I understand, so I leave it out for now. For an empty NAND without Rockchip FTL this could work as long as it stays out of our bootrom blocks. It's fine that MTD is 'rigid', but not all Socs fit, so find solutions that are maybe second best. MTD has most components already in place, see what we can make out of it. > > If vendors invent new ways to handle MTD blocks it's sad but they will > never be compatible with mainline. It's a fact. However for an upstream > version, I don't get if there is any real issue? The location of the > BBM is not related to your controller driver but depends on the NAND > chip and as you say below we know provide three possible positions in > a block. > Handling of MTD blocks remains the same AFAICT. It transfers data and oob byte to MTD data structures. Just find a way to tell MTD not mess with bootrom blocks. Programming/reading in Uboot and Linux is something that Open Source has to find a solution for. > What you refer as the FTL is the equivalent of UBI in Linux, which > indeed offers to the user a linear logical view of all the valid blocks > while physically the data is spread across all the available > eraseblocks. When I refer to FTL it's to the Rockchip FTL. In this current EXPERIMENTAL driver stage I just warn a potential unaware user of the things that are at play on that NAND. UBI might work fine, but not now. > >> >> hynix_nand_init() add extra option NAND_BBM_LASTPAGE for H27UCG8T2ATR-BC. >> Example: To see what happens when a partition is placed over the bootrom erase blocks. >From the previous log example it seems that it somehow does do a read command at the end of this partition. That what tests are for. >> No partition support. A FTL driver will store at random locations and >> a linear user specific layout does not fit within >> the generic character of this basic driver. >> MTD partition support works fine. It's just the current content of my RK3066 NAND written with a Rockchip FTL loader that makes write tests not so smart as I have to reprogram then with USB. Chicken egg problem. >> Driver assumes that IO pins are correctly set by the boot loader. > > Which pins are you talking about? Are you missing a pinctrl driver? > No, NAND share the same data IO pins as emmc. Set direct in grfReg, not with pinctrl. Every Rockchip grfReg is different, so leave it out for now. For my Linux TEST driver not a issue as that is already done by the loader. Would you like this grf thing included in a Linux driver for every Soc? >> >> Fixed timing setting. Mentioned for completeness. >> >> RK3228A/RK3228B compatibility version 701 unknown >> RV1108 nand version unknown Can Shawn Lin or someone else help here? RV1108 TRM (manual) is still missing? >> [..] Have fun! ///////////////////// >From rk3066a.dtsi: SPDX-License-Identifier: (GPL-2.0+ OR MIT) Copyright (c) 2013 MundoReader S.L. emmc { emmc_clk: emmc-clk { rockchip,pins = <3 RK_PD7 2 &pcfg_pull_default>; }; emmc_cmd: emmc-cmd { rockchip,pins = <4 RK_PB1 2 &pcfg_pull_default>; }; emmc_rst: emmc-rst { rockchip,pins = <4 RK_PB2 2 &pcfg_pull_default>; }; /* * The data pins are shared between nandc and emmc and * not accessible through pinctrl. Also they should've * been already set correctly by firmware, as * flash/emmc is the boot-device. */ }; ///////////////////// >From pinctrl_rk3066.c: SPDX-License-Identifier: GPL-2.0+ Copyright 2017 Paweł Jarosz static void pinctrl_rk3066_nand_config(struct rk3066_grf *grf) { rk_clrsetreg(&grf->soc_con0, EMMC_FLASH_SEL_MASK, 0 << EMMC_FLASH_SEL_SHIFT); rk_clrsetreg(&grf->gpio3d_iomux, GPIO3D7_MASK, GPIO3D7_FLASH_DQS << GPIO3D7_SHIFT); } ///////////////////// For EMMC: GRF_GPIO_IOMUX[3].GPIOD_IOMUX = ((0x3<<14)<<16)|(0x2<<14); // dqs GRF_GPIO_IOMUX[4].GPIOB_IOMUX = ((0xf<<2)<<16)|(0xa<<2); // cmd,rstn GRF_SOC_CON[0] = ((0x1<<11)<<16)|(0x1<<11); // emmc data0-7,wp ///////////////////// GRF_SOC_CON0 RK3066: Bit Attr Reset Value Description 31:16 RW 0x0 write_enable bit 0~bit 15 write enable 11 RW 0x0 emmc_flash_sel emmc flash select used for iomux IO_FLASH_DATA[7:0] , IO_FLASH_WP are selected for emmc instead of flash ///////////////////////////////////////////////////////////// // SPDX-License-Identifier: GPL-2.0 /* * Copyright (c) 2019, Johan Jonker * * Based on: * https://github.com/rockchip-linux/kernel/blob/develop-4.4/drivers/rk_nand/rk_ftl_arm_v7.S * https://raw.githubusercontent.com/rockchip-linux/kernel/develop-4.4/drivers/rk_nand/rk_ftl_arm_v7.S * Copyright (c) 2016-2018, Fuzhou Rockchip Electronics Co., Ltd * SPDX-License-Identifier: GPL-2.0+ * * https://github.com/rockchip-linux/u-boot/blob/next-dev/drivers/rknand/rk_ftl_arm_v7.S * https://raw.githubusercontent.com/rockchip-linux/u-boot/next-dev/drivers/rknand/rk_ftl_arm_v7.S * Copyright (c) 2016-2018, Fuzhou Rockchip Electronics Co., Ltd * SPDX-License-Identifier: GPL-2.0+ */ struct nand_req { uint32_t status; uint32_t page_addr; uint32_t *p_data; uint16_t *p_spare; uint32_t lpn; uint32_t res2; uint32_t res3; uint32_t res4; uint32_t res5; }; struct tagBbtInfo { uint16_t id; uint16_t page; uint16_t region; uint16_t counter; uint32_t index; uint16_t blk_cnt[8]; uint32_t *map[8]; }; struct tag_sys_spare_buf { uint16_t tag; uint16_t id; uint32_t index; uint16_t region; uint16_t bb_num; uint32_t sys_blks_per_plane; }; struct tagBbtInfo gBbtInfo; struct nand_req req_sys; uint32_t FtlBbmIsBadBlock(uint32_t lbn) { return (gBbtInfo.map[(uint16_t)(lbn / c_ftl_nand_blks_per_die)] [lbn % c_ftl_nand_blks_per_die >> 5] >> (lbn % c_ftl_nand_blks_per_die & 0x1F)) & 1; } int FtlLoadBbt(void) { struct tag_sys_spare_buf *p_spare; uint32_t counter; int i; uint32_t index; uint16_t page1; uint32_t page2; uint8_t *p_buf; uint32_t *p_map1; uint8_t *p_map2; uint16_t region; size_t size; uint16_t sys_blks_per_plane; uint32_t tmp; FTL_DBG(); req_sys.p_data = p_sys_data_buf; p_spare = (struct tag_sys_spare_buf *)p_sys_spare_buf; req_sys.p_spare = p_sys_spare_buf; FtlBbtMemInit(); for (i = (uint16_t)(c_ftl_nand_blks_per_die - 1); c_ftl_nand_blks_per_die - 47 <= i; i = (uint16_t)(i - 1)) { req_sys.page_addr = i << 10; FlashReadPages(&req_sys, 1u, 1u); if (req_sys.status == NAND_STS_ERROR) { ++req_sys.page_addr; FlashReadPages(&req_sys, 1u, 1u); } if (req_sys.status != NAND_STS_ERROR && p_spare->tag == ID_BBTB) { index = p_spare->index; gBbtInfo.id = i; gBbtInfo.index = index; gBbtInfo.region = p_spare->region; break; } } if (gBbtInfo.id == 0xFFFF) return -1; if (gBbtInfo.region != 0xFFFF) { req_sys.page_addr = gBbtInfo.region << 10; FlashReadPages(&req_sys, 1u, 1u); if (req_sys.status != NAND_STS_ERROR && p_spare->tag == ID_BBTB && p_spare->index > gBbtInfo.index) { gBbtInfo.index = p_spare->index; region = p_spare->region; gBbtInfo.id = gBbtInfo.region; gBbtInfo.region = region; } } page1 = FtlGetLastWrittenPage(gBbtInfo.id, 1u); page2 = (uint16_t)page1; gBbtInfo.page = page1 + 1; while ((page2 & 0x80000000) == 0) { req_sys.page_addr = page2 | (gBbtInfo.id << 10); req_sys.p_data = p_sys_data_buf; FlashReadPages(&req_sys, 1u, 1u); if (req_sys.status != NAND_STS_ERROR && p_spare->tag == ID_BBTB) { goto label_1; } page2 = (uint16_t)(page2 - 1); } FTL_ERR(); label_1: sys_blks_per_plane = p_spare->sys_blks_per_plane; gBbtInfo.counter = p_spare->bb_num; if (sys_blks_per_plane != 0xFFFF && sys_blks_per_plane != c_ftl_nand_sys_blks_per_plane) { tmp = (uint32_t)c_ftl_nand_blk_per_plane >> 2; if (c_ftl_nand_sys_blks_per_plane < tmp && sys_blks_per_plane < tmp) { FtlSysBlkNumInit(sys_blks_per_plane); } } p_map1 = (uint32_t *)&gBbtInfo.blk_cnt[6]; counter = 0; while (counter < c_ftl_nand_die_num) { p_map2 = (uint8_t *)p_map1[1]; ++p_map1; size = 4 * c_ftl_nand_bbm_buf_size; p_buf = (uint8_t *)req_sys.p_data + counter++ * size; ftl_memcpy(p_map2, p_buf, size); } return 0; } void FtlBbmTblFlush(void) { struct tag_sys_spare_buf *p_spare; uint32_t bb_num; uint16_t counter1; uint32_t counter2; uint32_t die_counter; uint16_t lbn1; uint32_t lbn2; uint32_t *p_map; uint32_t sector; uint8_t *tmp_p_map; FTL_DBG(); die_counter = 0; if (!g_flash_read_only_en) { p_map = (uint32_t *)&gBbtInfo.blk_cnt[6]; req_sys.p_spare = p_sys_spare_buf; req_sys.p_data = p_sys_data_buf; ftl_memset( p_sys_data_buf, g_flash_read_only_en, c_ftl_nand_byte_per_page); while ((uint32_t)die_counter < c_ftl_nand_die_num) { tmp_p_map = (uint8_t *)p_map[1]; ++p_map; sector = die_counter++ * c_ftl_nand_bbm_buf_size; ftl_memcpy( &req_sys.p_data[sector], tmp_p_map, 4 * c_ftl_nand_bbm_buf_size); } p_spare = (struct tag_sys_spare_buf *)req_sys.p_spare; counter1 = 0; counter2 = 0; ftl_memset(req_sys.p_spare, 0xFFu, 16u); p_spare->tag = ID_BBTB; p_spare->index = gBbtInfo.index; p_spare->id = gBbtInfo.id; p_spare->region = gBbtInfo.region; p_spare->bb_num = gBbtInfo.counter; p_spare->sys_blks_per_plane = c_ftl_nand_sys_blks_per_plane; do { while (1) { req_sys.p_data = p_sys_data_buf; bb_num = p_spare->bb_num; req_sys.p_spare = p_sys_spare_buf; req_sys.status = NAND_STS_OK; req_sys.page_addr = gBbtInfo.page | (gBbtInfo.id << 10); FTL_INFO( "FtlBbmTblFlush id=%x,page=%x," "previd=%x cnt=%d\n", gBbtInfo.id, gBbtInfo.page, gBbtInfo.region, bb_num); if (gBbtInfo.page >= c_ftl_nand_page_per_slc_blk - 1) { lbn1 = gBbtInfo.id; gBbtInfo.page = 0; p_spare->index = ++gBbtInfo.index; p_spare->region = lbn1; lbn2 = gBbtInfo.region; gBbtInfo.region = lbn1; gBbtInfo.id = lbn2; req_sys.page_addr = lbn2 << 10; req_erase->page_addr = lbn2 << 10; FlashEraseBlocks( req_erase, 1u, 1u); } FlashProgPages(&req_sys, 1u, 1u, 1u); ++gBbtInfo.page; if (req_sys.status == NAND_STS_ERROR) break; if (++counter2 != 1 && req_sys.status != NAND_STS_REFRESH) { return; } } ++counter1; FTL_INFO( "FtlBbmTblFlush error:%x\n", req_sys.page_addr); } while (counter1 <= 3u); FTL_INFO( "FtlBbmTblFlush error = %x error count = %d\n", req_sys.page_addr, counter1); g_flash_read_only_en = 1; } }