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=-5.5 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_PASS,URIBL_BLOCKED,USER_AGENT_MUTT 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 8203EC43381 for ; Thu, 21 Mar 2019 09:35:04 +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 2FFC221874 for ; Thu, 21 Mar 2019 09:35:04 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="E4l4WY0/"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=cadence.com header.i=@cadence.com header.b="PaCboa10"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=cadence.com header.i=@cadence.com header.b="QNzORNi/" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 2FFC221874 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=cadence.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-Type: Content-Transfer-Encoding:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References:Message-ID: Subject:To:From:Date:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=1WnMw/kW6j+aFsu6RZ92Kef9XtIURd01aaHf8ERs0eo=; b=E4l4WY0/JTuSvVpmpQ8gH7Jsy pe0UPGK+QTY32PsdcjOv+Rewn6eeksYiAHFCruNfO3PVNazgNC3p5wDIgPz5cxDZ3RNaC8FpC73Uz bi4xxt/juYRqD9G88+Zg+HgIVz1B6bQdikOwy+Y0dWr4UR5pQNE5DOuAbhj/V0U79Q2H36ArlhI0j YZjmlTsFKH5Bqwrb39JYI/couR963yQUI68cW0xUmfLO9qBE9DLGxjvExsTe7m3ZZrHy+5sUKDfLp cqrCTLSDJ6YqV+ix42gtmzNgPfZvwvIEAdbqS3O/tyMcuE/2S/V62iGwjjNi1ptM5fd2jIjQ5tdlr iKFC00tjA==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1h6u6G-0002D7-Or; Thu, 21 Mar 2019 09:35:00 +0000 Received: from mx0a-0014ca01.pphosted.com ([208.84.65.235]) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1h6u6D-0002CU-1x for linux-mtd@lists.infradead.org; Thu, 21 Mar 2019 09:34:59 +0000 Received: from pps.filterd (m0042385.ppops.net [127.0.0.1]) by mx0a-0014ca01.pphosted.com (8.16.0.27/8.16.0.27) with SMTP id x2L9YBeO003727; Thu, 21 Mar 2019 02:34:23 -0700 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cadence.com; h=date : from : to : cc : subject : message-id : references : mime-version : content-type : content-transfer-encoding : in-reply-to; s=proofpoint; bh=+IAOx91IQPZtKA1RA4PPagV9BEc59DuSyl8mRVcUHyg=; b=PaCboa1080G7yqOiZEupG4BRin+0JEjsOFDBhSy1z2+kapmyvWor/VVvNqRuXPZvsxLI +sQFtaua5uoay0mPBzZB9Ajm/gZ2hXdd64s9YIhIEZzcgeYczHolMuPBE/ZS4BrmY7/h DwaKWf1WhaH+mpvwX5JE778GLhwHlWM+6ifq1+nic5YNTitl7T3+lZ44ivweEnk8AJIt xbLv4JW26hNWS9iVTQ6jR79TqClU6aVTI1jE5BunuI6EhujpiVRm48IjivqhzSIYZ9l+ IQ187jhmUOGzdzR77IHyalaDRSUGeGqVvGOccwD8cu6m0gzcbI7PdvYKr8xIORfs0Qgu 5g== Authentication-Results: cadence.com; spf=pass smtp.mailfrom=piotrs@cadence.com Received: from nam03-by2-obe.outbound.protection.outlook.com (mail-by2nam03lp2050.outbound.protection.outlook.com [104.47.42.50]) by mx0a-0014ca01.pphosted.com with ESMTP id 2r8wpvr2na-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 21 Mar 2019 02:34:22 -0700 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cadence.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=+IAOx91IQPZtKA1RA4PPagV9BEc59DuSyl8mRVcUHyg=; b=QNzORNi/0PqKFmWpvqyiI7UwL+2y05/qIp6Q5elf0Nj2wfvBFeOiCTH56txRlzvLGgCvv0nt7HfwciDxalflBozovEduDRs4PLLBMTD+pCCYU8fHLSiThQPJMEplem47LU3fZRd6JPJPSEogVTXiM8z1jzH9daH4zTD1Mw5RtG0= Received: from DM5PR07CA0054.namprd07.prod.outlook.com (2603:10b6:4:ad::19) by MN2PR07MB5919.namprd07.prod.outlook.com (2603:10b6:208:ae::25) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1730.16; Thu, 21 Mar 2019 09:34:19 +0000 Received: from DM3NAM05FT033.eop-nam05.prod.protection.outlook.com (2a01:111:f400:7e51::205) by DM5PR07CA0054.outlook.office365.com (2603:10b6:4:ad::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1709.14 via Frontend Transport; Thu, 21 Mar 2019 09:34:19 +0000 Received-SPF: SoftFail (protection.outlook.com: domain of transitioning cadence.com discourages use of 158.140.1.28 as permitted sender) Received: from sjmaillnx1.cadence.com (158.140.1.28) by DM3NAM05FT033.mail.protection.outlook.com (10.152.98.145) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1750.4 via Frontend Transport; Thu, 21 Mar 2019 09:34:18 +0000 Received: from mailsj6.global.cadence.com (mailsj6.cadence.com [158.140.32.112]) by sjmaillnx1.cadence.com (8.14.4/8.14.4) with ESMTP id x2L9YCOs030245 (version=TLSv1/SSLv3 cipher=AES256-SHA bits=256 verify=OK); Thu, 21 Mar 2019 02:34:12 -0700 X-CrossPremisesHeadersFilteredBySendConnector: mailsj6.global.cadence.com Received: from global.cadence.com (158.140.32.37) by mailsj6.global.cadence.com (158.140.32.112) with Microsoft SMTP Server (TLS) id 15.0.1367.3; Thu, 21 Mar 2019 02:34:08 -0700 Date: Thu, 21 Mar 2019 09:33:58 +0000 From: Piotr Sroka To: Miquel Raynal Subject: Re: [PATCH v2 1/2] mtd: nand: Add Cadence NAND controller driver Message-ID: <20190321093356.GA19577@global.cadence.com> References: <20190219161406.4340-1-piotrs@cadence.com> <20190219161823.22466-1-piotrs@cadence.com> <20190305190954.6c38d681@xps13> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20190305190954.6c38d681@xps13> User-Agent: Mutt/1.5.20 (2009-12-10) X-Originating-IP: [158.140.32.37] X-ClientProxiedBy: mailsj7.global.cadence.com (158.140.32.114) To mailsj6.global.cadence.com (158.140.32.112) X-OrganizationHeadersPreserved: mailsj6.global.cadence.com X-EOPAttributedMessage: 0 X-Forefront-Antispam-Report: CIP:158.140.1.28; IPV:CAL; SCL:-1; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(39850400004)(136003)(376002)(346002)(396003)(2980300002)(189003)(199004)(36092001)(23676004)(2486003)(386003)(76176011)(7696005)(67846002)(16526019)(6286002)(33656002)(186003)(6246003)(26005)(11346002)(476003)(5024004)(336012)(126002)(8936002)(486006)(26826003)(956004)(478600001)(446003)(426003)(14444005)(6666004)(356004)(7416002)(106466001)(105596002)(50466002)(6916009)(2870700001)(3846002)(6116002)(86362001)(2906002)(7636002)(58126008)(30864003)(7736002)(305945005)(66066001)(4326008)(229853002)(54906003)(55016002)(47776003)(53416004)(246002)(8676002)(5660300002)(1076003)(66574012)(316002); DIR:OUT; SFP:1101; SCL:1; SRVR:MN2PR07MB5919; H:sjmaillnx1.cadence.com; FPR:; SPF:SoftFail; LANG:en; PTR:corp.cadence.com; MX:1; A:1; X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 2a5c6cb6-f093-4652-fd0c-08d6ade06488 X-Microsoft-Antispam: BCL:0; PCL:0; RULEID:(2390118)(7020095)(4652040)(8989299)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(5600127)(711020)(4605104)(2017052603328)(7153060)(7193020); SRVR:MN2PR07MB5919; X-MS-TrafficTypeDiagnostic: MN2PR07MB5919: X-Microsoft-Antispam-PRVS: X-Forefront-PRVS: 0983EAD6B2 X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam-Message-Info: qtg3u6IkNWNNnNkkjrIeSJL9jgyIaFdoN7CGqlhqRK6TReR2+7DO57Fvh1MObA9j6Mrb4bRM/rwVPfDI5h9JfwINzIIBWDNSRtBPuyfmlHnyiP0RnwT4djfQa8LWztjhyeMRZ5ouomM3R7E/xEexFTIbecLD69VcI0VrTYhoiHb04lpMbpgbVW3C7rw9NrYlPnp8QasQmOqQLiXnzBnqRra4FDVXTXUgk7qC5XF77dCGtvRk4d7VUmpbD4OzzFM6m9aoXg515fvOWARDxTJwMA4NBgFha/31LefUA/tJPNS5SeiIynRWdBsBrwvl/JQQnIJ3k6Y6S6dkyc0rj95Rsc+Snmz7AaarVnA2HZRH9AsR0w7yTxZAvsKA1y2oBL0ayIdV4WhPNsG1DrAJq1siWAQO4wUd8p9FijPEQ7AnIv4= X-OriginatorOrg: cadence.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 21 Mar 2019 09:34:18.2453 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 2a5c6cb6-f093-4652-fd0c-08d6ade06488 X-MS-Exchange-CrossTenant-Id: d36035c5-6ce6-4662-a3dc-e762e61ae4c9 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=d36035c5-6ce6-4662-a3dc-e762e61ae4c9; Ip=[158.140.1.28]; Helo=[sjmaillnx1.cadence.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: MN2PR07MB5919 X-Proofpoint-SPF-Result: pass X-Proofpoint-SPF-Record: v=spf1 include:_spf.salesforce.com include:mktomail.com include:spf-0014ca01.pphosted.com include:spf.protection.outlook.com include:auth.msgapp.com include:spf.mandrillapp.com ~all X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:, , definitions=2019-03-21_05:, , signatures=0 X-Proofpoint-Spam-Details: rule=outbound_check_notspam policy=outbound_check score=0 priorityscore=1501 malwarescore=0 suspectscore=2 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 lowpriorityscore=0 mlxscore=0 impostorscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1810050000 definitions=main-1903210069 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20190321_023457_388459_66A30DC3 X-CRM114-Status: GOOD ( 28.47 ) X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Arnd Bergmann , Boris Brezillon , Marcel Ziswiler , Richard Weinberger , linux-kernel@vger.kernel.org, Stefan Agner , Marek Vasut , Paul Burton , Geert Uytterhoeven , linux-mtd@lists.infradead.org, Dmitry Osipenko , Brian Norris , David Woodhouse Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Sender: "linux-mtd" Errors-To: linux-mtd-bounces+linux-mtd=archiver.kernel.org@lists.infradead.org VGhlIDAzLzA1LzIwMTkgMTk6MDksIE1pcXVlbCBSYXluYWwgd3JvdGU6Cj5FWFRFUk5BTCBNQUlM Cj4KPgo+SGkgUGlvdHIsCj4KPlBpb3RyIFNyb2thIDxwaW90cnNAY2FkZW5jZS5jb20+IHdyb3Rl IG9uIFR1ZSwgMTkgRmViIDIwMTkgMTY6MTg6MjMKPiswMDAwOgo+Cj4+IFRoaXMgcGF0Y2ggYWRk cyBkcml2ZXIgZm9yIENhZGVuY2UgSFBORkMgTkFORCBjb250cm9sbGVyLgo+Pgo+PiBTaWduZWQt b2ZmLWJ5OiBQaW90ciBTcm9rYSA8cGlvdHJzQGNhZGVuY2UuY29tPgo+PiAtLS0KPj4gQ2hhbmdl cyBmb3IgdjI6Cj4+IC0gY3JlYXRlIG9uZSB1bml2ZXJzYWwgd2FpdCBmdW5jdGlvbiBmb3IgYWxs IGV2ZW50cyBpbnN0ZWFkIG9mIG9uZQo+PiAgIGZ1bmN0aW9uIHBlciBldmVudC4KPj4gLSBzcGxp dCBvbmUgYmlnIGZ1bmN0aW9uIGV4ZWN1dGluZyBuYW5kIG9wZXJhdGlvbnMgdG8gc2VwYXJhdGUK Pj4gICBmdW5jdGlvbnMgb25lIHBlciBlYWNoIHR5cGUgb2Ygb3BlcmF0aW9uLgo+PiAtIGFkZCBl cmFzZSBhdG9taWMgb3BlcmF0aW9uIHRvIG5hbmQgb3BlcmF0aW9uIHBhcnNlcgo+PiAtIHJlbW92 ZSB1bm5lY2Vzc2FyeSBpbmNsdWRlcy4KPj4gLSByZW1vdmUgdW51c2VkIHJlZ2lzdGVyIGRlZmlu ZXMKPj4gLSBhZGQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgbmFuZCBjaGlwcwo+PiAtIHJlbW92ZSBh bGwgY29kZSB1c2luZyBsZWdhY3kgZnVuY3Rpb25zCj4+IC0gcmVtb3ZlIGNoaXAgZGVwZW5kZW50 cyBwYXJhbWV0ZXJzIGZyb20gZHRzIGJpbmRpbmdzLCB0aGV5IHdlcmUKPj4gICBhdHRhY2hlZCB0 byB0aGUgU29DIHNwZWNpZmljIGNvbXBhdGlibGUgYXQgdGhlIGRyaXZlciBsZXZlbAo+PiAtIHNp bXBsaWZ5IGludGVycnVwdCBoYW5kbGluZwo+PiAtIHNpbXBsaWZ5IHRpbWluZyBjYWxjdWxhdGlv bnMKPj4gLSBmaXggY2FsY3VsYXRpb24gb2YgbWF4aW11bSBzdXBwb3J0ZWQgY3Mgc2lnbmFscwo+ PiAtIHNpbXBsaWZ5IGVjYyBzaXplIGNhbGN1bGF0aW9uCj4+IC0gcmVtb3ZlIGhlYWRlciBmaWxl IGFuZCBwdXQgd2hvbGUgY29kZSB0byBvbmUgYyBmaWxlCj4+IC0tLQo+PiAgZHJpdmVycy9tdGQv bmFuZC9yYXcvS2NvbmZpZyAgICAgICAgICAgICAgICAgICB8ICAgIDggKwo+PiAgZHJpdmVycy9t dGQvbmFuZC9yYXcvTWFrZWZpbGUgICAgICAgICAgICAgICAgICB8ICAgIDEgKwo+PiAgZHJpdmVy cy9tdGQvbmFuZC9yYXcvY2FkZW5jZS1uYW5kLWNvbnRyb2xsZXIuYyB8IDMyODggKysrKysrKysr KysrKysrKysrKysrKysrCj4KPlRoaXMgZHJpdmVyIGlzIHdheSB0b28gbWFzc2l2ZSwgSSBhbSBw cmV0dHkgc3VyZSBpdCBjYW4gc2hyaW5rIGEKPmxpdHRsZSBiaXQgbW9yZS4KPlsuLi5dCj4KSSB3 aWxsIHRyeSB0byBtYWtlIGl0IHNob3JlciBidXQgaXQgd2lsbCBiZSBkaWZ1Y3VsdCB0byBhY2hp dmUuIEl0IGlzIGJlY2F1c2UgCi0gdGhlcmUgYXJlIGEgbG90IG9mIGNhbGN1bGF0aW9uIG5lZWRl ZCBmb3IgUEhZICAgICAgCi0gRUNDIGFyZSBpbnRlcmxlYXZlZCB3aXRoIGRhdGEgKGxpa2Ugb24g bWFydmVsbC1uYW5kIG9yIGdwbWktbmFuZCkuCiAgIFRoZXJlZm9yZTogCiAgICsgUkFXIG1vZGUg aXMgY29tcGxpY2F0ZWQgCiAgICsgcHJvdGVjdGluZyBCQk0gaW5jcmVhc2VzIG51bWJlciBvZiBs aW5lcyBvZiBzb3VyY2UgY29kZQotIG5lZWQgdG8gc3VwcG9ydCB0d28gRE1BIGVuZ2luZXMgaW50 ZXJuYWwgYW5kIGV4dGVybmFsIChzbGF2ZSkgCldlIHdpbGwgc2VlIG9uIG5leHQgcGF0Y2ggdmVy c2lvbiB3aGF0IGlzIHRoZSByZXN1bHQuICAKICAgIApUaGF0IHBhZ2UgbGF5b3V0IGxvb2tzOgoK ICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICB8IERhdGEgMSB8 IEVDQyAxIHwgLi4uIHwgRGF0YSBOICB8IEVDQyBOIHwgIAogICstLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0rCiAgICAgICAgTGFzdCBEYXRhIHwgT09CIGJ5dGVzIHwgTGFzdCBFQ0MgfAogICAg ICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCSAgICAvXCAKCSAgICB8fCAK ICAgICAgICBPT0IgYXJlYSBzdGFydGVkCiAgICAgdXN1YWx5IHZlbmRvciBzcGVjaWZpZWQgQkJN CgpGbGFzaCBPT0IgYXJlYSBzdGFydHMgc29tZXdoZXJlIGluIGxhc3QgZGF0YSBzZWN0b3IuIApG bGFzaCBPT0IgYXJlYSBjb250YWlucyBwYXJ0IG9mIGxhc3Qgc2VjdG9yLCBvb2IgZGF0YSAKKGFj Y2Vzc2libGUgYnkgZHJpdmVyKSwgYW5kIGxhc3QgRUNDIGNvZGUgICAKCj4+ICsKPj4gK3N0cnVj dCBjZG5zX25hbmRfY2hpcCB7Cj4+ICsJc3RydWN0IGNhZGVuY2VfbmFuZF90aW1pbmdzIHRpbWlu Z3M7Cj4+ICsJc3RydWN0IG5hbmRfY2hpcCBjaGlwOwo+PiArCXU4IG5zZWxzOwo+PiArCXN0cnVj dCBsaXN0X2hlYWQgbm9kZTsKPj4gKwo+PiArCS8qCj4+ICsJICogcGFydCBvZiBvb2IgYXJlYSBv ZiBOQU5GIGZsYXNoIG1lbW9yeSBwYWdlLgo+PiArCSAqIFRoaXMgcGFydCBpcyBhdmFpbGFibGUg Zm9yIHVzZXIgdG8gcmVhZCBvciB3cml0ZS4KPj4gKwkgKi8KPj4gKwl1MzIgYXZhaWxfb29iX3Np emU7Cj4+ICsJLyogb29iIGFyZWEgc2l6ZSBvZiBOQU5GIGZsYXNoIG1lbW9yeSBwYWdlICovCj4+ ICsJdTMyIG9vYl9zaXplOwo+PiArCS8qIG1haW4gYXJlYSBzaXplIG9mIE5BTkYgZmxhc2ggbWVt b3J5IHBhZ2UgKi8KPj4gKwl1MzIgbWFpbl9zaXplOwo+Cj5UaGVzZSBmaWVsZHMgYXJlIHJlZHVu ZGFudCBhbmQgZXhpc3QgaW4gbXRkX2luZm8vbmFuZF9jaGlwLgo+Ck9rIEkgd2lsbCB1c2UgdGhl IHBhcmFtZXRlcnMgZnJvbSBtdGRfaW5mby4KPj4gKwo+PiArCS8qIHNlY3RvciBzaXplIGZldyBz ZWN0b3JzIGFyZSBsb2NhdGVkIG9uIG1haW4gYXJlYSBvZiBORiBtZW1vcnkgcGFnZSAqLwo+PiAr CXUzMiBzZWN0b3Jfc2l6ZTsKPj4gKwl1MzIgc2VjdG9yX2NvdW50Owo+PiArCj4+ICsJLyogb2Zm c2V0IG9mIEJCTSovCj4+ICsJdTggYmJtX29mZnM7Cj4+ICsJLyogbnVtYmVyIG9mIGJ5dGVzIHJl c2VydmVkIGZvciBCQk0gKi8KPj4gKwl1OCBiYm1fbGVuOwo+Cj5XaHkgZG8geW91IGJvdGhlciBh dCB0aGUgY29udHJvbGxlciBkcml2ZXIgbGV2ZWwgd2l0aCBiYm0/Cj4KV2hlbiBFQ0MgaXMgZW5h YmxlZCB0aGVuIEJCTSBpcyBzb21ld2hlcmUgaW4gbGFzdCBkYXRhIHNlY3Rvci4gClNvIGZvciB3 cml0ZSBvcGVyYXRpb24gcmVhbCBCQk0gd2lsbCBiZSBvdmVyd3JpdHRlbi4gRm9yIHJlYWQgb3Bl cmF0aW9uCml0IHdpbGwgYmUgcmVhZCBmcm9tIHdyb25nIG9mZnNldC4gVG8gcHJvdGVjdCBCQk0g d2UgdXNlIEhXIGZlYXR1cmUgCnNraXAgYnl0ZXMuIFRvIGJlIGFibGUgdG8gcHJvcGVybHkgY29u ZmlndXJlIHRoaXMgZmVhdHVyZSB3ZSBuZWVkIHRvCmtub3cgd2hhdCBpcyB0aGUgb2Zmc2V0IG9m IEJCTS4gICAKPj4gKwo+PiArc3RhdGljIGludCBjYWRlbmNlX25hbmRfc2V0X2VyYXNlX2RldGVj dGlvbihzdHJ1Y3QgY2Ruc19uYW5kX2N0cmwgKmNkbnNfY3RybCwKPj4gKwkJCQkJICAgIGJvb2wg ZW5hYmxlLAo+PiArCQkJCQkgICAgdTggYml0ZmxpcHNfdGhyZXNob2xkKQo+Cj5XaGF0IGlzIHRo aXMgZm9yPwpGdWNudGlvbnMgZW5hYmxlcy9kaXNhYmxlcyBoYXJkd2FyZSBkZXRlY3Rpb24gb2Yg ZXJhc2VkIGRhdGEKcGFnZXMuIAo+Cj4+ICsKPj4gKy8qIGhhcmR3YXJlIGluaXRpYWxpemF0aW9u ICovCj4+ICtzdGF0aWMgaW50IGNhZGVuY2VfbmFuZF9od19pbml0KHN0cnVjdCBjZG5zX25hbmRf Y3RybCAqY2Ruc19jdHJsKQo+PiArewo+PiArCWludCBzdGF0dXMgPSAwOwo+PiArCXUzMiByZWc7 Cj4+ICsKPj4gKwlzdGF0dXMgPSBjYWRlbmNlX25hbmRfd2FpdF9mb3JfdmFsdWUoY2Ruc19jdHJs LCBDVFJMX1NUQVRVUywKPj4gKwkJCQkJICAgICAxMDAwMDAwLAo+PiArCQkJCQkgICAgIENUUkxf U1RBVFVTX0lOSVRfQ09NUCwgZmFsc2UpOwo+PiArCWlmIChzdGF0dXMpCj4+ICsJCXJldHVybiBz dGF0dXM7Cj4+ICsKPj4gKwlyZWcgPSByZWFkbChjZG5zX2N0cmwtPnJlZyArIENUUkxfVkVSU0lP Tik7Cj4+ICsKPj4gKwlkZXZfaW5mbyhjZG5zX2N0cmwtPmRldiwKPj4gKwkJICIlczogY2FkZW5j ZSBuYW5kIGNvbnRyb2xsZXIgdmVyc2lvbiByZWcgJXhcbiIsCj4+ICsJCSBfX2Z1bmNfXywgcmVn KTsKPj4gKwo+PiArCS8qIGRpc2FibGUgY2FjaGUgYW5kIG11bHRpcGxhbmUgKi8KPj4gKwl3cml0 ZWwoMCwgY2Ruc19jdHJsLT5yZWcgKyBNVUxUSVBMQU5FX0NGRyk7Cj4+ICsJd3JpdGVsKDAsIGNk bnNfY3RybC0+cmVnICsgQ0FDSEVfQ0ZHKTsKPj4gKwo+PiArCS8qIGNsZWFyIGFsbCBpbnRlcnJ1 cHRzICovCj4+ICsJd3JpdGVsKDB4RkZGRkZGRkYsIGNkbnNfY3RybC0+cmVnICsgSU5UUl9TVEFU VVMpOwo+PiArCj4+ICsJY2FkZW5jZV9uYW5kX2dldF9jYXBzKGNkbnNfY3RybCk7Cj4+ICsJY2Fk ZW5jZV9uYW5kX3JlYWRfYmNoX2NmZyhjZG5zX2N0cmwpOwo+Cj5ObywgeW91IGNhbm5vdCByZWx5 IG9uIHRoZSBib290bG9hZGVyJ3MgY29uZmlndXJhdGlvbi4gQW5kIEkgc3VwcG9zZQo+dGhpcyBp cyB3aGF0IHRoZSBmaXJzdCBjYWxsIHRvIHJlYWRfYmNoX2NmZyBkb2VzPwpJIGRvIG5vdCByZWFs eSBvbiBib290IGxvYWRlci4gSnVzdCByZWFkIE5BTkQgZmxhc2gKY29udHJvbGxlciBjb25maWd1 cmF0aW9uIGZyb20gcmVhZCBvbmx5IGNhcGFiaWxpdGllcyByZWdpc3RlcnMuCgoKPj4gKwo+PiAr I2RlZmluZSBUVF9PT0JfQVJFQQkJMQo+PiArI2RlZmluZSBUVF9NQUlOX09PQl9BUkVBUwkyCj4+ ICsjZGVmaW5lIFRUX1JBV19QQUdFCQkzCj4+ICsjZGVmaW5lIFRUX0JCTQkJCTQKPj4gKyNkZWZp bmUgVFRfTUFJTl9PT0JfQVJFQV9FWFQJNQo+PiArCj4+ICsvKiBwcmVwYXJlIHNpemUgb2YgZGF0 YSB0byB0cmFuc2ZlciAqLwo+PiArc3RhdGljIGludAo+PiArY2FkZW5jZV9uYW5kX3ByZXBhcmVf ZGF0YV9zaXplKHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAsCj4+ICsJCQkgICAgICAgaW50IHRyYW5z ZmVyX3R5cGUpCj4+ICt7Cj4+ICsJc3RydWN0IGNkbnNfbmFuZF9jdHJsICpjZG5zX2N0cmwgPSB0 b19jZG5zX25hbmRfY3RybChjaGlwLT5jb250cm9sbGVyKTsKPj4gKwlzdHJ1Y3QgY2Ruc19uYW5k X2NoaXAgKmNkbnNfY2hpcCA9IHRvX2NkbnNfbmFuZF9jaGlwKGNoaXApOwo+PiArCXUzMiBzZWNf c2l6ZSA9IDAsIGxhc3Rfc2VjX3NpemUsIG9mZnNldCA9IDAsIHNlY19jbnQgPSAxOwo+PiArCXUz MiBlY2Nfc2l6ZSA9IGNoaXAtPmVjYy5ieXRlczsKPj4gKwl1MzIgZGF0YV9jdHJsX3NpemUgPSAw Owo+PiArCXUzMiByZWcgPSAwOwo+PiArCj4+ICsJaWYgKGNkbnNfY3RybC0+Y3Vycl90cmFuc190 eXBlID09IHRyYW5zZmVyX3R5cGUpCj4+ICsJCXJldHVybiAwOwo+PiArCj4+ICsJc3dpdGNoICh0 cmFuc2Zlcl90eXBlKSB7Cj4KPlBsZWFzZSB0dXJuIHRoZSBjb250cm9sbGVyIGRyaXZlciBhcyBk dW1iIGFzIHBvc3NpYmxlLiBZb3Ugc2hvdWxkIG5vdAo+Y2FyZSB3aGljaCBwYXJ0IG9mIHRoZSBP T0IgYXJlYSB5b3UgYXJlIGFjY2Vzc2luZy4KSXQgaXMgYSBiaXQgY29uZnVzaW5nIGZvciBtZSBo b3cgYWNjZXNzaW5nIE9PQiBzaG91bGQgYmUgaW1wbGVtZW50ZWQuCkkga25vdyB0aGF0IHJlYWRf b29iIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBjaGVjayBCQk0gdmFsdWUgd2hlbiBCQlQgaXMKaW5p dGlhbGl6ZWQuIEl0IGlzIGFsc28gYSBiaXQgY29uZnVzaW5nIGZvciBtZSB3aHkgdGhlIHJhdyB2 ZXJzaW9uIGlzCm5vdCB1c2VkIGZvciB0aGF0IHB1cnBvc2UuICAgIApJbiBjdXJyZW50IGltcGxl bWVudGF0aW9uIGlmIHlvdSB3cml0ZSBvb2IgYnkgd3JpdGVfcGFnZSBmdW5jdGlvbiBuZXh0CnJl YWQgb29iIGJ5IHJlYWRfb29iIGZ1bmN0aW9uIHRoZW4gZGF0YSB3aWxsIGJlIHRoZSBzYW1lLgpJ ZiBJIGltcGxlbWVudCBkdW1wIGZ1bmN0aW9ucyByZWFkX29vYiBhbmQgd3JpdGVfb29iIHRoZW4g CjEuIEVDQyBtdXN0IGJlIGRpc2FibGVkIGZvciB0aGVzZSBmdW5jdGlvbnMKMi4gb29iIGRhdGEg YWNjZXNzaW5nIGJ5IHdyaXRlX3BhZ2UvcmVhZF9wYWdlIHdpbGwgYmUgZGlmZmVyZW50CiAgIChk aWZmZXJlbnQgb2Zmc2V0cykgdGhhdCB0aGUgZGF0YSBhY2Nlc3NpbmcgYnkgcmVhZF9vb2Ivd3Jp dGVfb29iCiAgIGZ1bmN0aW9ucwpJZiAgYWJvdmUgZGVzY3JpYmVkICJmdW5jdGlvbmFsaXRpZXMi IGFyZSBhY2NlcHRhYmxlIEkgd2lsbCBjaGFuZ2UgCmltcGxlbWVudGF0aW9uIG9mIHdyaXRlX29v YiBhbmQgcmVhZF9vb2IgZnVuY3Rpb25zLgpUaGUgd3JpdGVfcGFnZSBhbmQgcmVhZF9wYWdlIG11 c3QgYmUgaW1wbGVtZW50ZWQgaW4gdGhhdCB3YXkgYXMgaXQgaXMgbm93LiAgICAKTGV0IG1lIGtu b3cgd2hpY2ggc29sdXRpb24gaXMgcHJlZmZlcmVkLgoKPj4gKwljYXNlIFRUX09PQl9BUkVBOgo+ PiArCQlvZmZzZXQgPSBjZG5zX2NoaXAtPm1haW5fc2l6ZSAtIGNkbnNfY2hpcC0+c2VjdG9yX3Np emU7Cj4+ICsJCWVjY19zaXplID0gZWNjX3NpemUgKiAob2Zmc2V0IC8gY2Ruc19jaGlwLT5zZWN0 b3Jfc2l6ZSk7Cj4+ICsJCW9mZnNldCA9IG9mZnNldCArIGVjY19zaXplOwo+PiArCQlzZWNfY250 ID0gMTsKPj4gKwkJbGFzdF9zZWNfc2l6ZSA9IGNkbnNfY2hpcC0+c2VjdG9yX3NpemUKPj4gKwkJ CSsgY2Ruc19jaGlwLT5hdmFpbF9vb2Jfc2l6ZTsKPj4gKwkJYnJlYWs7Cj4+ICsJY2FzZSBUVF9N QUlOX09PQl9BUkVBX0VYVDoKPj4gKwkJc2VjX2NudCA9IGNkbnNfY2hpcC0+c2VjdG9yX2NvdW50 Owo+PiArCQlsYXN0X3NlY19zaXplID0gY2Ruc19jaGlwLT5zZWN0b3Jfc2l6ZTsKPj4gKwkJc2Vj X3NpemUgPSBjZG5zX2NoaXAtPnNlY3Rvcl9zaXplOwo+PiArCQlkYXRhX2N0cmxfc2l6ZSA9IGNk bnNfY2hpcC0+YXZhaWxfb29iX3NpemU7Cj4+ICsJCWJyZWFrOwo+PiArCWNhc2UgVFRfTUFJTl9P T0JfQVJFQVM6Cj4+ICsJCXNlY19jbnQgPSBjZG5zX2NoaXAtPnNlY3Rvcl9jb3VudDsKPj4gKwkJ bGFzdF9zZWNfc2l6ZSA9IGNkbnNfY2hpcC0+c2VjdG9yX3NpemUKPj4gKwkJCSsgY2Ruc19jaGlw LT5hdmFpbF9vb2Jfc2l6ZTsKPj4gKwkJc2VjX3NpemUgPSBjZG5zX2NoaXAtPnNlY3Rvcl9zaXpl Owo+PiArCQlicmVhazsKPj4gKwljYXNlIFRUX1JBV19QQUdFOgo+PiArCQlsYXN0X3NlY19zaXpl ID0gY2Ruc19jaGlwLT5tYWluX3NpemUgKyBjZG5zX2NoaXAtPm9vYl9zaXplOwo+PiArCQlicmVh azsKPj4gKwljYXNlIFRUX0JCTToKPj4gKwkJb2Zmc2V0ID0gY2Ruc19jaGlwLT5tYWluX3NpemUg KyBjZG5zX2NoaXAtPmJibV9vZmZzOwo+PiArCQlsYXN0X3NlY19zaXplID0gODsKPj4gKwkJYnJl YWs7Cj4+ICsJZGVmYXVsdDoKPj4gKwkJZGV2X2VycihjZG5zX2N0cmwtPmRldiwgIkRhdGEgc2l6 ZSBwcmVwYXJhdGlvbiBmYWlsZWRcbiIpOwo+PiArCQlyZXR1cm4gLUVJTlZBTDsKPj4gKwl9Cj4+ ICsKPj4gKwlyZWcgPSAwOwo+PiArCXJlZyB8PSBGSUVMRF9QUkVQKFRSQU5fQ0ZHXzBfT0ZGU0VU LCBvZmZzZXQpOwo+PiArCXJlZyB8PSBGSUVMRF9QUkVQKFRSQU5fQ0ZHXzBfU0VDX0NOVCwgc2Vj X2NudCk7Cj4+ICsJd3JpdGVsKHJlZywgY2Ruc19jdHJsLT5yZWcgKyBUUkFOX0NGR18wKTsKPj4g Kwo+PiArCXJlZyA9IDA7Cj4+ICsJcmVnIHw9IEZJRUxEX1BSRVAoVFJBTl9DRkdfMV9MQVNUX1NF Q19TSVpFLCBsYXN0X3NlY19zaXplKTsKPj4gKwlyZWcgfD0gRklFTERfUFJFUChUUkFOX0NGR18x X1NFQ1RPUl9TSVpFLCBzZWNfc2l6ZSk7Cj4+ICsJd3JpdGVsKHJlZywgY2Ruc19jdHJsLT5yZWcg KyBUUkFOX0NGR18xKTsKPj4gKwo+PiArCXJlZyA9IHJlYWRsKGNkbnNfY3RybC0+cmVnICsgQ09O VFJPTF9EQVRBX0NUUkwpOwo+PiArCXJlZyAmPSB+Q09OVFJPTF9EQVRBX0NUUkxfU0laRTsKPj4g KwlyZWcgfD0gRklFTERfUFJFUChDT05UUk9MX0RBVEFfQ1RSTF9TSVpFLCBkYXRhX2N0cmxfc2l6 ZSk7Cj4+ICsJd3JpdGVsKHJlZywgY2Ruc19jdHJsLT5yZWcgKyBDT05UUk9MX0RBVEFfQ1RSTCk7 Cj4+ICsKPj4gKwljZG5zX2N0cmwtPmN1cnJfdHJhbnNfdHlwZSA9IHRyYW5zZmVyX3R5cGU7Cj4+ ICsKPj4gKwlyZXR1cm4gMDsKPj4gK30KPj4gKwo+Cj5bLi4uXQo+Cj4+ICsKPj4gK3N0YXRpYyBp bnQgY2FkZW5jZV9uYW5kX3JlYWRfcGFnZV9yYXcoc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwKPj4g KwkJCQkgICAgICB1OCAqYnVmLCBpbnQgb29iX3JlcXVpcmVkLCBpbnQgcGFnZSkKPj4gK3sKPj4g KwlzdHJ1Y3QgY2Ruc19uYW5kX2N0cmwgKmNkbnNfY3RybCA9IHRvX2NkbnNfbmFuZF9jdHJsKGNo aXAtPmNvbnRyb2xsZXIpOwo+PiArCXN0cnVjdCBjZG5zX25hbmRfY2hpcCAqY2Ruc19jaGlwID0g dG9fY2Ruc19uYW5kX2NoaXAoY2hpcCk7Cj4+ICsJaW50IG9vYl9za2lwID0gY2Ruc19jaGlwLT5i Ym1fbGVuOwo+Cj5XaHkgZG8geW91IHNraXAgdGhlIEJCTT8KPgo+SW4gYW55IG9mIHRoZSByZWFk X3BhZ2Uvb29iIGhlbHBlcnMgSSBkb24ndCB0aGluayB0aGlzIGlzIHJlbGV2YW50IGF0Cj5hbGwu CkkgZGVzY3JpYmVkIHRoZSBwcm9ibGVtIGF0IHRoZSBiZWdpbm5pZy4gRUNDIGFyZSBpbnRlcmxl YXZlZCB3aXRoIGRhdGEuClNvIHJlYWwgcG9zc2l0aW9uIG9mIEJCTSBpcyBzb21ld2VocmUgaW4g bGFzdCBkYXRhIHNlY3Rvci4gV2UgdXNlIHNraXAKYnl0ZSBmZWF0dXJlIHRvIHNraXAgdGhpcyBC Qk0uIE9uY2UgdXNlZCBuZWVkIHRvIGhhbmRsZSBpbiBlYWNoCmZ1bmN0aW9uLiBTa2lwIEJCTSBp cyBhbHNvIHVzZWQgaW4gZGVuYWxpLW5hbmQKICAgICAKPgo+PiArCWludCB3cml0ZXNpemUgPSBj ZG5zX2NoaXAtPm1haW5fc2l6ZTsKPj4gKwlpbnQgZWNjX3N0ZXBzID0gY2hpcC0+ZWNjLnN0ZXBz Owo+PiArCWludCBlY2Nfc2l6ZSA9IGNoaXAtPmVjYy5zaXplOwo+PiArCWludCBlY2NfYnl0ZXMg PSBjaGlwLT5lY2MuYnl0ZXM7Cj4+ICsJdm9pZCAqdG1wX2J1ZiA9IGNkbnNfY3RybC0+YnVmOwo+ PiArCWludCBpLCBwb3MsIGxlbjsKPj4gKwlpbnQgc3RhdHVzID0gMDsKPj4gKwo+PiArCXN0YXR1 cyA9IGNhZGVuY2VfbmFuZF9zZWxlY3RfdGFyZ2V0KGNoaXApOwo+PiArCWlmIChzdGF0dXMpCj4+ ICsJCXJldHVybiBzdGF0dXM7Cj4+ICsKPj4gKwljYWRlbmNlX25hbmRfc2V0X3NraXBfYnl0ZXNf Y29uZihjZG5zX2N0cmwsIDAsIDAsIDApOwo+PiArCj4+ICsJY2FkZW5jZV9uYW5kX3ByZXBhcmVf ZGF0YV9zaXplKGNoaXAsIFRUX1JBV19QQUdFKTsKPj4gKwlzdGF0dXMgPSBjYWRlbmNlX25hbmRf Y2RtYV90cmFuc2ZlcihjZG5zX2N0cmwsCj4+ICsJCQkJCSAgICBjZG5zX2NoaXAtPmNzW2NoaXAt PmN1cl9jc10sCj4+ICsJCQkJCSAgICBwYWdlLCBjZG5zX2N0cmwtPmJ1ZiwKPj4gKwkJCQkJICAg IE5VTEwsCj4+ICsJCQkJCSAgICBjZG5zX2NoaXAtPm1haW5fc2l6ZQo+PiArCQkJCQkgICAgKyBj ZG5zX2NoaXAtPm9vYl9zaXplLAo+PiArCQkJCQkgICAgMCwgRE1BX0ZST01fREVWSUNFLCBmYWxz ZSk7Cj4+ICsKPj4gKwlzd2l0Y2ggKHN0YXR1cykgewo+PiArCWNhc2UgU1RBVF9FUkFTRUQ6Cj4+ ICsJY2FzZSBTVEFUX09LOgo+PiArCQlicmVhazsKPj4gKwlkZWZhdWx0Ogo+PiArCQlkZXZfZXJy KGNkbnNfY3RybC0+ZGV2LCAicmVhZCByYXcgcGFnZSBmYWlsZWRcbiIpOwo+PiArCQlyZXR1cm4g LUVJTzsKPj4gKwl9Cj4+ICsKPj4gKwkvKiBBcnJhbmdlIHRoZSBidWZmZXIgZm9yIHN5bmRyb21l IHBheWxvYWQvZWNjIGxheW91dCAqLwo+PiArCWlmIChidWYpIHsKPj4gKwkJZm9yIChpID0gMDsg aSA8IGVjY19zdGVwczsgaSsrKSB7Cj4+ICsJCQlwb3MgPSBpICogKGVjY19zaXplICsgZWNjX2J5 dGVzKTsKPj4gKwkJCWxlbiA9IGVjY19zaXplOwo+PiArCj4+ICsJCQlpZiAocG9zID49IHdyaXRl c2l6ZSkKPj4gKwkJCQlwb3MgKz0gb29iX3NraXA7Cj4+ICsJCQllbHNlIGlmIChwb3MgKyBsZW4g PiB3cml0ZXNpemUpCj4+ICsJCQkJbGVuID0gd3JpdGVzaXplIC0gcG9zOwo+PiArCj4+ICsJCQlt ZW1jcHkoYnVmLCB0bXBfYnVmICsgcG9zLCBsZW4pOwo+PiArCQkJYnVmICs9IGxlbjsKPj4gKwkJ CWlmIChsZW4gPCBlY2Nfc2l6ZSkgewo+PiArCQkJCWxlbiA9IGVjY19zaXplIC0gbGVuOwo+PiAr CQkJCW1lbWNweShidWYsIHRtcF9idWYgKyB3cml0ZXNpemUgKyBvb2Jfc2tpcCwKPj4gKwkJCQkg ICAgICAgbGVuKTsKPj4gKwkJCQlidWYgKz0gbGVuOwo+PiArCQkJfQo+PiArCQl9Cj4+ICsJfQo+ PiArCj4+ICsJaWYgKG9vYl9yZXF1aXJlZCkgewo+PiArCQl1OCAqb29iID0gY2hpcC0+b29iX3Bv aTsKPj4gKwkJdTMyIG9vYl9kYXRhX29mZnNldCA9IChjZG5zX2NoaXAtPnNlY3Rvcl9jb3VudCAt IDEpICoKPj4gKwkJCShjZG5zX2NoaXAtPnNlY3Rvcl9zaXplICsgY2hpcC0+ZWNjLmJ5dGVzKQo+ PiArCQkJKyBjZG5zX2NoaXAtPnNlY3Rvcl9zaXplICsgb29iX3NraXA7Cj4+ICsKPj4gKwkJLyog T09CIGZyZWUgKi8KPj4gKwkJbWVtY3B5KG9vYiwgdG1wX2J1ZiArIG9vYl9kYXRhX29mZnNldCwK Pj4gKwkJICAgICAgIGNkbnNfY2hpcC0+YXZhaWxfb29iX3NpemUpOwo+PiArCj4+ICsJCS8qIEJC TSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBPT0IgYXJlYSAqLwo+PiArCQltZW1jcHkob29iLCB0 bXBfYnVmICsgd3JpdGVzaXplLCBvb2Jfc2tpcCk7Cj4+ICsKPj4gKwkJb29iICs9IGNkbnNfY2hp cC0+YXZhaWxfb29iX3NpemU7Cj4+ICsKPj4gKwkJLyogT09CIEVDQyAqLwo+PiArCQlmb3IgKGkg PSAwOyBpIDwgZWNjX3N0ZXBzOyBpKyspIHsKPj4gKwkJCXBvcyA9IGVjY19zaXplICsgaSAqIChl Y2Nfc2l6ZSArIGVjY19ieXRlcyk7Cj4+ICsJCQlsZW4gPSBlY2NfYnl0ZXM7Cj4+ICsKPj4gKwkJ CWlmIChpID09IChlY2Nfc3RlcHMgLSAxKSkKPj4gKwkJCQlwb3MgKz0gY2Ruc19jaGlwLT5hdmFp bF9vb2Jfc2l6ZTsKPj4gKwo+PiArCQkJaWYgKHBvcyA+PSB3cml0ZXNpemUpCj4+ICsJCQkJcG9z ICs9IG9vYl9za2lwOwo+PiArCQkJZWxzZSBpZiAocG9zICsgbGVuID4gd3JpdGVzaXplKQo+PiAr CQkJCWxlbiA9IHdyaXRlc2l6ZSAtIHBvczsKPj4gKwo+PiArCQkJbWVtY3B5KG9vYiwgdG1wX2J1 ZiArIHBvcywgbGVuKTsKPj4gKwkJCW9vYiArPSBsZW47Cj4+ICsJCQlpZiAobGVuIDwgZWNjX2J5 dGVzKSB7Cj4+ICsJCQkJbGVuID0gZWNjX2J5dGVzIC0gbGVuOwo+PiArCQkJCW1lbWNweShvb2Is IHRtcF9idWYgKyB3cml0ZXNpemUgKyBvb2Jfc2tpcCwKPj4gKwkJCQkgICAgICAgbGVuKTsKPj4g KwkJCQlvb2IgKz0gbGVuOwo+PiArCQkJfQo+PiArCQl9Cj4+ICsJfQo+PiArCj4+ICsJcmV0dXJu IDA7Cj4+ICt9ClsgLi4uXQogIAo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW50IGNhZGVuY2VfbmFu ZF9yZWFkX2J1ZihzdHJ1Y3QgY2Ruc19uYW5kX2N0cmwgKmNkbnNfY3RybCwKPj4gK3N0YXRpYyBp bnQgY2FkZW5jZV9uYW5kX3dyaXRlX2J1ZihzdHJ1Y3QgY2Ruc19uYW5kX2N0cmwgKmNkbnNfY3Ry bCwKPj4gK3N0YXRpYyBpbnQgY2FkZW5jZV9uYW5kX2NtZF9vcGNvZGUoc3RydWN0IG5hbmRfY2hp cCAqY2hpcCwKPj4gK3N0YXRpYyBpbnQgY2FkZW5jZV9uYW5kX2NtZF9hZGRyZXNzKHN0cnVjdCBu YW5kX2NoaXAgKmNoaXAsCj4+ICtzdGF0aWMgaW50IGNhZGVuY2VfbmFuZF9jbWRfZXJhc2Uoc3Ry dWN0IG5hbmRfY2hpcCAqY2hpcCwKPj4gK3N0YXRpYyBpbnQgY2FkZW5jZV9uYW5kX2NtZF9kYXRh KHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAsCj4KPlRoaXMgbG9va3MgcHJldHR5IGZhbWlsaWFyIHdp dGggdGhlIGxlZ2FjeSBhcHByb2FjaCwgSSB0aGluayB5b3UganVzdAo+cmVuYW1lZCBzb21lIGZ1 bmN0aW9ucyBpbnN0ZWFkIG9mIHRyeWluZyB0byBmaXQgdGhlIC0+ZXhlY19vcCBpbnRlcmZhY2UK PmFuZCB0aGVyZSBpcyBwcm9iYWJseSBhIGxvdCB0byBkbyBvbiB0aGlzIHNpZGUgdGhhdCB3b3Vs ZCByZWR1Y2UgdGhlCj5kcml2ZXIgc2l6ZS4gVGhlcmUgYXJlIHBsZW50eSBvZiBvcGVyYXRpb25z IGRvbmUgYnkgZWFjaCBvZiB0aGUgYWJvdmUKPmhlbHBlcnMgdGhhdCBzaG91bGQgcHJvYmFibHkg ZmFjdG9yZWQgb3V0Lgo+Ck5vIEkgaGF2ZSBuZXZlciB1c2VkIGxlZ2FjeSBhcHByb2FjaCBmb3Ig dGhhdCBwYXJ0LgpJbiBwcmV2aW91cyBwYXRjaCBJIGhhdmUgb25lIGZ1bmN0aW9uIHRvIGhhbmxk ZSBpdCBidXQgQm9yaXMgcG9pbnQKdGhhdCBvbmUgZnVuY3Rpb24gY29udGFpbmluZyBzd2l0Y2gg aXMgbm90IGEgZ29vZCBzb2x1dGlvbiBzbyBJIHNwbGl0ZWQKdG8gZmV3IGZ1bmN0aW9ucy4gCiAg Cj4+ICsKPj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmFuZF9vcF9wYXJzZXIgY2FkZW5jZV9uYW5k X29wX3BhcnNlciA9IE5BTkRfT1BfUEFSU0VSKAo+PiArCU5BTkRfT1BfUEFSU0VSX1BBVFRFUk4o Cj4+ICsJCWNhZGVuY2VfbmFuZF9jbWRfZXJhc2UsCj4+ICsJCU5BTkRfT1BfUEFSU0VSX1BBVF9D TURfRUxFTShmYWxzZSksCj4+ICsJCU5BTkRfT1BfUEFSU0VSX1BBVF9BRERSX0VMRU0oZmFsc2Us IE1BWF9FUkFTRV9BRERSRVNTX0NZQyksCj4+ICsJCU5BTkRfT1BfUEFSU0VSX1BBVF9DTURfRUxF TShmYWxzZSksCj4+ICsJCU5BTkRfT1BfUEFSU0VSX1BBVF9XQUlUUkRZX0VMRU0oZmFsc2UpKSwK Pj4gKwlOQU5EX09QX1BBUlNFUl9QQVRURVJOKAo+PiArCQljYWRlbmNlX25hbmRfY21kX29wY29k ZSwKPj4gKwkJTkFORF9PUF9QQVJTRVJfUEFUX0NNRF9FTEVNKGZhbHNlKSksCj4+ICsJTkFORF9P UF9QQVJTRVJfUEFUVEVSTigKPj4gKwkJY2FkZW5jZV9uYW5kX2NtZF9hZGRyZXNzLAo+PiArCQlO QU5EX09QX1BBUlNFUl9QQVRfQUREUl9FTEVNKGZhbHNlLCBNQVhfQUREUkVTU19DWUMpKSwKPj4g KwlOQU5EX09QX1BBUlNFUl9QQVRURVJOKAo+PiArCQljYWRlbmNlX25hbmRfY21kX2RhdGEsCj4+ ICsJCU5BTkRfT1BfUEFSU0VSX1BBVF9EQVRBX0lOX0VMRU0oZmFsc2UsIE1BWF9EQVRBX1NJWkUp KSwKPj4gKwlOQU5EX09QX1BBUlNFUl9QQVRURVJOKAo+PiArCQljYWRlbmNlX25hbmRfY21kX2Rh dGEsCj4+ICsJCU5BTkRfT1BfUEFSU0VSX1BBVF9EQVRBX09VVF9FTEVNKGZhbHNlLCBNQVhfREFU QV9TSVpFKSksCj4+ICsJTkFORF9PUF9QQVJTRVJfUEFUVEVSTigKPj4gKwkJY2FkZW5jZV9uYW5k X2NtZF93YWl0cmR5LAo+PiArCQlOQU5EX09QX1BBUlNFUl9QQVRfV0FJVFJEWV9FTEVNKGZhbHNl KSkKPj4gKwkpOwo+PiArCj4+ICtzdGF0aWMgaW50IGNhZGVuY2VfbmFuZF9leGVjX29wKHN0cnVj dCBuYW5kX2NoaXAgKmNoaXAsCj4+ICsJCQkJY29uc3Qgc3RydWN0IG5hbmRfb3BlcmF0aW9uICpv cCwKPj4gKwkJCQlib29sIGNoZWNrX29ubHkpCj4+ICt7Cj4+ICsJaW50IHN0YXR1cyA9IGNhZGVu Y2VfbmFuZF9zZWxlY3RfdGFyZ2V0KGNoaXApOwo+PiArCj4+ICsJaWYgKHN0YXR1cykKPj4gKwkJ cmV0dXJuIHN0YXR1czsKPj4gKwo+PiArCXJldHVybiBuYW5kX29wX3BhcnNlcl9leGVjX29wKGNo aXAsICZjYWRlbmNlX25hbmRfb3BfcGFyc2VyLCBvcCwKPj4gKwkJCQkgICAgICBjaGVja19vbmx5 KTsKPj4gK30KPj4gKwo+PiArc3RhdGljIGludCBjYWRlbmNlX25hbmRfb29ibGF5b3V0X2ZyZWUo c3RydWN0IG10ZF9pbmZvICptdGQsIGludCBzZWN0aW9uLAo+PiArCQkJCSAgICAgICBzdHJ1Y3Qg bXRkX29vYl9yZWdpb24gKm9vYnJlZ2lvbikKPj4gK3sKPj4gKwlzdHJ1Y3QgbmFuZF9jaGlwICpj aGlwID0gbXRkX3RvX25hbmQobXRkKTsKPj4gKwlzdHJ1Y3QgY2Ruc19uYW5kX2NoaXAgKmNkbnNf Y2hpcCA9IHRvX2NkbnNfbmFuZF9jaGlwKGNoaXApOwo+PiArCj4+ICsJaWYgKHNlY3Rpb24pCj4+ ICsJCXJldHVybiAtRVJBTkdFOwo+PiArCj4+ICsJb29icmVnaW9uLT5vZmZzZXQgPSBjZG5zX2No aXAtPmJibV9sZW47Cj4+ICsJb29icmVnaW9uLT5sZW5ndGggPSBjZG5zX2NoaXAtPmF2YWlsX29v Yl9zaXplCj4+ICsJCS0gY2Ruc19jaGlwLT5iYm1fbGVuOwo+PiArCj4+ICsJcmV0dXJuIDA7Cj4+ ICt9Cj4+ICsKPj4gK3N0YXRpYyBpbnQgY2FkZW5jZV9uYW5kX29vYmxheW91dF9lY2Moc3RydWN0 IG10ZF9pbmZvICptdGQsIGludCBzZWN0aW9uLAo+PiArCQkJCSAgICAgIHN0cnVjdCBtdGRfb29i X3JlZ2lvbiAqb29icmVnaW9uKQo+PiArewo+PiArCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSBt dGRfdG9fbmFuZChtdGQpOwo+PiArCXN0cnVjdCBjZG5zX25hbmRfY2hpcCAqY2Ruc19jaGlwID0g dG9fY2Ruc19uYW5kX2NoaXAoY2hpcCk7Cj4+ICsKPj4gKwlpZiAoc2VjdGlvbikKPj4gKwkJcmV0 dXJuIC1FUkFOR0U7Cj4+ICsKPj4gKwlvb2JyZWdpb24tPm9mZnNldCA9IGNkbnNfY2hpcC0+YXZh aWxfb29iX3NpemU7Cj4+ICsJb29icmVnaW9uLT5sZW5ndGggPSBjaGlwLT5lY2MudG90YWw7Cj4+ ICsKPj4gKwlyZXR1cm4gMDsKPj4gK30KPj4gKwo+PiArc3RhdGljIGNvbnN0IHN0cnVjdCBtdGRf b29ibGF5b3V0X29wcyBjYWRlbmNlX25hbmRfb29ibGF5b3V0X29wcyA9IHsKPj4gKwkuZnJlZSA9 IGNhZGVuY2VfbmFuZF9vb2JsYXlvdXRfZnJlZSwKPj4gKwkuZWNjID0gY2FkZW5jZV9uYW5kX29v YmxheW91dF9lY2MsCj4+ICt9Owo+PiArCj4+ICtzdGF0aWMgaW50IGNhbGNfY3ljbCh1MzIgdGlt aW5nLCB1MzIgY2xvY2spCj4+ICt7Cj4+ICsJaWYgKHRpbWluZyA9PSAwIHx8IGNsb2NrID09IDAp Cj4+ICsJCXJldHVybiAwOwo+PiArCj4+ICsJaWYgKCh0aW1pbmcgJSBjbG9jaykgPiAwKQo+PiAr CQlyZXR1cm4gdGltaW5nIC8gY2xvY2s7Cj4+ICsJZWxzZQo+PiArCQlyZXR1cm4gdGltaW5nIC8g Y2xvY2sgLSAxOwo+PiArfQo+PiArClsuLi5dIAo+PiArCS8qCj4+ICsJICogdGhlIGlkZWEgb2Yg dGhvc2UgY2FsY3VsYXRpb24gaXMgdG8gZ2V0IHRoZSBvcHRpbXVtIHZhbHVlCj4+ICsJICogZm9y IHRSUCBhbmQgdFJIIHRpbWluZ3MgaWYgaXQgaXMgTk9UIHBvc3NpYmxlIHRvIHNhbXBsZSBkYXRh Cj4+ICsJICogd2l0aCBvcHRpbWFsIHRSUC90Ukggc2V0dGluZ3MgdGhlIHBhcmFtZXRlcnMgd2ls bCBiZSBleHRlbmRlZAo+PiArCSAqLwo+PiArCWlmIChzZHItPnRSQ19taW4gPD0gY2xrX3Blcmlv ZCAmJgo+PiArCSAgICBzZHItPnRSUF9taW4gPD0gKGNsa19wZXJpb2QgLyAyKSAmJgo+PiArCSAg ICBzZHItPnRSRUhfbWluIDw9IChjbGtfcGVyaW9kIC8gMikpIHsKPgo+V2lsbCB0aGlzIHNpdHVh dGlvbiByZWFsbHkgaGFwcGVuPwpJIHRoaW5rIHllcyBmb3IgZm9sbHdpbmcgdmFsdWVzIAp0cmNf bWluICAyMDAwMCBwcwp0cnBfbWluICAxMDAwMCBwcwp0cmVoX21pbiA3MDAwICBwcwpjbGtfcGVy aW9kIDIwMDAwIHBzClsuLi5dCj4+ICsJfQo+PiArCj4+ICsJaWYgKGNkbnNfY3RybC0+Y2FwczIu aXNfcGh5X3R5cGVfZGxsKSB7Cj4KPklzIHRoZSBlbHNlIHBhcnQgYWxsb3dlZD8KPgpmb2xsb3dp bmcgcmVnaXN0ZXIgZG9lcyBub3QgZXhpc3QgaWYgY2FwczIuaXNfcGh5X3R5cGVfZGxsIGlzIDAg Cj4+ICsJCXUzMiB0cHJlX2NudCA9IGNhbGNfY3ljbCh0cHJlLCBjbGtfcGVyaW9kKTsKPj4gKwkJ dTMyIHRjZHFzc19jbnQgPSBjYWxjX2N5Y2wodGNkcXNzICsgaWZfc2tldywgY2xrX3BlcmlvZCk7 Cj4+ICsJCXUzMiB0cHN0aF9jbnQgPSBjYWxjX2N5Y2wodHBzdGggKyBpZl9za2V3LCBjbGtfcGVy aW9kKTsKPj4gKwo+PiArCQl1MzIgdHJwc3RfY250ID0gY2FsY19jeWNsKHRycHN0ICsgaWZfc2tl dywgY2xrX3BlcmlvZCkgKyAxOwo+PiArCQl1MzIgdHdwc3RfY250ID0gY2FsY19jeWNsKHR3cHN0 ICsgaWZfc2tldywgY2xrX3BlcmlvZCkgKyAxOwo+PiArCQl1MzIgdGNyZXNfY250ID0gY2FsY19j eWNsKHRjcmVzICsgaWZfc2tldywgY2xrX3BlcmlvZCkgKyAxOwo+PiArCQl1MzIgdGNkcXNoX2Nu dCA9IGNhbGNfY3ljbCh0Y2Rxc2ggKyBpZl9za2V3LCBjbGtfcGVyaW9kKSArIDU7Cj4+ICsKPj4g KwkJdGNyX2NudCA9IGNhbGNfY3ljbCh0Y3IgKyBpZl9za2V3LCBjbGtfcGVyaW9kKTsKPj4gKwkJ LyoKPj4gKwkJICogc2tldyBub3QgaW5jbHVkZWQgYmVjYXVzZSB0aGlzIHRpbWluZyBkZWZpbmVz IGR1cmF0aW9uIG9mCj4+ICsJCSAqIFJFIG9yIERRUyBiZWZvcmUgZGF0YSB0cmFuc2Zlcgo+PiAr CQkgKi8KPj4gKwkJdHBzdGhfY250ID0gdHBzdGhfY250ICsgMTsKPj4gKwkJcmVnID0gRklFTERf UFJFUChUT0dHTEVfVElNSU5HUzBfVFBTVEgsIHRwc3RoX2NudCk7Cj4+ICsJCXJlZyB8PSBGSUVM RF9QUkVQKFRPR0dMRV9USU1JTkdTMF9UQ0RRU1MsIHRjZHFzc19jbnQpOwo+PiArCQlyZWcgfD0g RklFTERfUFJFUChUT0dHTEVfVElNSU5HUzBfVFBSRSwgdHByZV9jbnQpOwo+PiArCQlyZWcgfD0g RklFTERfUFJFUChUT0dHTEVfVElNSU5HUzBfVENSLCB0Y3JfY250KTsKPj4gKwkJdC0+dG9nZ2xl X3RpbWluZ3NfMCA9IHJlZzsKPj4gKwkJZGV2X2RiZyhjZG5zX2N0cmwtPmRldiwgIlRPR0dMRV9U SU1JTkdTXzBfU0RSXHQleFxuIiwgcmVnKTsKPj4gKwo+PiArCQkvL3RvZ2dsZV90aW1pbmdzXzEg LSB0UlBTVCx0V1BTVAo+PiArCQlyZWcgPSBGSUVMRF9QUkVQKFRPR0dMRV9USU1JTkdTMV9UQ0RR U0gsIHRjZHFzaF9jbnQpOwo+PiArCQlyZWcgfD0gRklFTERfUFJFUChUT0dHTEVfVElNSU5HUzFf VENSRVMsIHRjcmVzX2NudCk7Cj4+ICsJCXJlZyB8PSBGSUVMRF9QUkVQKFRPR0dMRV9USU1JTkdT MV9UUlBTVCwgdHJwc3RfY250KTsKPj4gKwkJcmVnIHw9IEZJRUxEX1BSRVAoVE9HR0xFX1RJTUlO R1MxX1RXUFNULCB0d3BzdF9jbnQpOwo+PiArCQl0LT50b2dnbGVfdGltaW5nc18xID0gcmVnOwo+ PiArCQlkZXZfZGJnKGNkbnNfY3RybC0+ZGV2LCAiVE9HR0xFX1RJTUlOR1NfMV9TRFJcdCV4XG4i LCByZWcpOwo+PiArCX0KWy4uLl0gCj4KPlRoaXMgZnVuY3Rpb24gaXMgc28gY29tcGxpY2F0ZWQg ISEhIEhvdyBjYW4gdGhpcyBldmVuIHdvcms/IFJlYWxseSwgaXQKPmlzIGhhcmQgdG8gZ2V0IGlu dG8gdGhlIGNvZGUgYW5kIGZvbGxvdywgSSBhbSBzdXJlIHlvdSBjYW4gZG8KPnNvbWV0aGluZy4K WWVzIGl0IGlzIGNvbXBsaWNhdGVkIGJ1dCB3b3JrcywgSSB3aWxsIHRyeSB0byBzaW1wbGlmeSBp dC4uLiAgIApbLi4uXQo+PiArCQkJCSJDUyAlZCBhbHJlYWR5IGFzc2lnbmVkXG4iLCBjcyk7Cj4+ ICsJCQlyZXR1cm4gLUVJTlZBTDsKPj4gKwkJfQo+PiArCj4+ICsJCWNkbnNfY2hpcC0+Y3NbaV0g PSBjczsKPj4gKwl9Cj4+ICsKPj4gKwljaGlwID0gJmNkbnNfY2hpcC0+Y2hpcDsKPj4gKwljaGlw LT5jb250cm9sbGVyID0gJmNkbnNfY3RybC0+Y29udHJvbGxlcjsKPj4gKwluYW5kX3NldF9mbGFz aF9ub2RlKGNoaXAsIG5wKTsKPj4gKwo+PiArCW10ZCA9IG5hbmRfdG9fbXRkKGNoaXApOwo+PiAr CW10ZC0+ZGV2LnBhcmVudCA9IGNkbnNfY3RybC0+ZGV2Owo+PiArCj4+ICsJLyoKPj4gKwkgKiBE ZWZhdWx0IHRvIEhXIEVDQyBlbmdpbmUgbW9kZS4gSWYgdGhlIG5hbmQtZWNjLW1vZGUgcHJvcGVy dHkgaXMgZ2l2ZW4KPj4gKwkgKiBpbiB0aGUgRFQgbm9kZSwgdGhpcyBlbnRyeSB3aWxsIGJlIG92 ZXJ3cml0dGVuIGluIG5hbmRfc2Nhbl9pZGVudCgpLgo+PiArCSAqLwo+PiArCWNoaXAtPmVjYy5t b2RlID0gTkFORF9FQ0NfSFc7Cj4+ICsKPj4gKwkvKgo+PiArCSAqIFNhdmUgYSByZWZlcmVuY2Ug dmFsdWUgZm9yIHRpbWluZyByZWdpc3RlcnMgYmVmb3JlCj4+ICsJICogLT5zZXR1cF9kYXRhX2lu dGVyZmFjZSgpIGlzIGNhbGxlZC4KPj4gKwkgKi8KPj4gKwljYWRlbmNlX25hbmRfZ2V0X3RpbWlu Z3MoY2Ruc19jdHJsLCAmY2Ruc19jaGlwLT50aW1pbmdzKTsKPgo+WW91IGNhbm5vdCByZWx5IG9u IHRoZSBCb290bG9hZGVyJ3MgY29uZmlndXJhdGlvbi4gVGhpcyBkcml2ZXIgc2hvdWxkCj5kZXJp dmUgaXQuCkkgZG8gbm90IHJlbGF5IG9uIHRoZSBCb290bG9hZGVyJ3MgY29uZmlndXJhdGlvbiBp biBhbnkgcGFydC4gSSBqdXN0CmluaXQgdGltaW5ncyBzdHJ1Y3R1cmUgYmFzZSBvbiBjdXJyZW50 IHZhbHVlcyBvZiByZWdpc3RlcnMgdG8gZG8gbm90CiAgaGF2ZSBydWJpc2ggaW4gdGltaW5nIHN0 cnVjdHVyZS4gVmFsdWVzIHdpbGwgYmUgY2FsY3VsYXRlZCBieSBkcml2ZXIgd2hlbgpzZXR1cF9k YXRhX2ludGVyZmFjZSBpcyBjYWxsZWQuIEluIGNhc2Ugc2V0X3RpbWluZ3MgaXMgY2FsbGVkIGJl Zm9yZQpzZXR1cF9kYXRhX2ludGVyZmFjZSB0aGVuIHdlIHdyaXRlIHRoZSBzYW1lIHZhbHVzIHRv IHRpbWluZyByZWdpc3RlcnMKd2hpY2ggYXJlIHByZXNldCBpbiByZWdpc3RyZXMuIFRvIGJlIHNo b3J0ZXIgdGltaW5nIHJlZ2lzdGVycyB3aWxsIHN0YXkKdW5jaGFuZ2VkLiAgCgoKPj4gKwlyZXQg PSBuYW5kX3NjYW4oY2hpcCwgY2Ruc19jaGlwLT5uc2Vscyk7Cj4+ICsJaWYgKHJldCkgewo+PiAr CQlkZXZfZXJyKGNkbnNfY3RybC0+ZGV2LCAiY291bGQgbm90IHNjYW4gdGhlIG5hbmQgY2hpcFxu Iik7Cj4+ICsJCXJldHVybiByZXQ7Cj4+ICsJfQo+PiArCj4+ICsJcmV0ID0gbXRkX2RldmljZV9y ZWdpc3RlcihtdGQsIE5VTEwsIDApOwo+PiArCWlmIChyZXQpIHsKPj4gKwkJZGV2X2VycihjZG5z X2N0cmwtPmRldiwKPj4gKwkJCSJmYWlsZWQgdG8gcmVnaXN0ZXIgbXRkIGRldmljZTogJWRcbiIs IHJldCk7Cj4+ICsJCW5hbmRfcmVsZWFzZShjaGlwKTsKPgo+SSB0aGluayB5b3Ugc2hvdWxkIGNh bGwgbmFuZF9jbGVhbnVwIGluc3RlYWQgb2YgbmFuZF9yZWxlYXNlIGhlcmUgaGFzCj50aGUgbXRk IGRldmljZSBpcyBub3QgcmVnaXN0ZXJlZCB5ZXQuCj4KPj4gKwkJcmV0dXJuIHJldDsKPj4gKwl9 Cj4+ICsKPj4gKwlsaXN0X2FkZF90YWlsKCZjZG5zX2NoaXAtPm5vZGUsICZjZG5zX2N0cmwtPmNo aXBzKTsKPj4gKwo+PiArCXJldHVybiAwOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW50IGNhZGVu Y2VfbmFuZF9jaGlwc19pbml0KHN0cnVjdCBjZG5zX25hbmRfY3RybCAqY2Ruc19jdHJsKQo+PiAr ewo+PiArCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBjZG5zX2N0cmwtPmRldi0+b2Zfbm9kZTsK Pj4gKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5hbmRfbnA7Cj4+ICsJaW50IG1heF9jcyA9IGNkbnNf Y3RybC0+Y2FwczIubWF4X2JhbmtzOwo+PiArCWludCBuY2hpcHM7Cj4+ICsJaW50IHJldDsKPj4g Kwo+PiArCW5jaGlwcyA9IG9mX2dldF9jaGlsZF9jb3VudChucCk7Cj4+ICsKPj4gKwlpZiAobmNo aXBzID4gbWF4X2NzKSB7Cj4+ICsJCWRldl9lcnIoY2Ruc19jdHJsLT5kZXYsCj4+ICsJCQkidG9v IG1hbnkgTkFORCBjaGlwczogJWQgKG1heCA9ICVkIENTKVxuIiwKPj4gKwkJCW5jaGlwcywgbWF4 X2NzKTsKPj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4+ICsJfQo+PiArCj4+ICsJZm9yX2VhY2hfY2hp bGRfb2Zfbm9kZShucCwgbmFuZF9ucCkgewo+PiArCQlyZXQgPSBjYWRlbmNlX25hbmRfY2hpcF9p bml0KGNkbnNfY3RybCwgbmFuZF9ucCk7Cj4+ICsJCWlmIChyZXQpIHsKPj4gKwkJCW9mX25vZGVf cHV0KG5hbmRfbnApOwo+PiArCQkJcmV0dXJuIHJldDsKPj4gKwkJfQo+Cj5JZiBuYW5kX2NoaXBf aW5pdCgpIGZhaWxzIG9uIGFub3RoZXIgY2hpcCB0aGFuIHRoZSBmaXJzdCBvbmUsIHRoZXJlIGlz Cj5zb21lIGdhcmJhZ2UgY29sbGVjdGlvbiB0byBkby4KPgo+PiArCX0KPj4gKwo+PiArCXJldHVy biAwOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW50IGNhZGVuY2VfbmFuZF9pbml0KHN0cnVjdCBj ZG5zX25hbmRfY3RybCAqY2Ruc19jdHJsKQo+PiArewo+PiArCWRtYV9jYXBfbWFza190IG1hc2s7 Cj4+ICsJaW50IHJldCA9IDA7Cj4+ICsKPj4gKwljZG5zX2N0cmwtPmNkbWFfZGVzYyA9IGRtYV9h bGxvY19jb2hlcmVudChjZG5zX2N0cmwtPmRldiwKPj4gKwkJCQkJCSAgc2l6ZW9mKCpjZG5zX2N0 cmwtPmNkbWFfZGVzYyksCj4+ICsJCQkJCQkgICZjZG5zX2N0cmwtPmRtYV9jZG1hX2Rlc2MsCj4+ ICsJCQkJCQkgIEdGUF9LRVJORUwpOwo+PiArCWlmICghY2Ruc19jdHJsLT5kbWFfY2RtYV9kZXNj KQo+PiArCQlyZXR1cm4gLUVOT01FTTsKPj4gKwo+PiArCWNkbnNfY3RybC0+YnVmX3NpemUgPSAx NiAqIDEwMjQ7Cj4KPnMvMTAyNC9TWl8xSy8KPgo+PiArCWNkbnNfY3RybC0+YnVmID0ga21hbGxv YyhjZG5zX2N0cmwtPmJ1Zl9zaXplLCBHRlBfS0VSTkVMKTsKPgo+SWYgeW91IHVzZSBrbWFsbG9j IGhlcmUgdGhlbiB0aGlzIGJ1ZmZlciB3aWxsIGFsd2F5cyBiZSBETUEtYWJsZSwKPnJpZ2h0PwpS aWdodCBJIGhhdmUgc2VlbiBzdWNoIHNvbHV0aW9uIGluIGFub3RoZXIgZHJpdmVyLgoKClRoYW5r cyBmb3IgcmV2aWV2aW5nIHRoaXMgcGF0Y2guIFBsZWFzZSBhbnN3ZXIgb24gbXkgcXVlc3Rpb24g aG93IHdyaXRlX29vYgphbmQgcmVhZF9vb2IgZnVuY3Rpb25zIHNob3VsZCBiZSBpbXBsZW1lbnRl ZC4KCj4KPgo+VGhhbmtzLAo+TWlxdcOobAoKICAKVGhhbmtzClBpb3RyIFNyb2thCgpfX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KTGludXggTVRE IGRpc2N1c3Npb24gbWFpbGluZyBsaXN0Cmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxt YW4vbGlzdGluZm8vbGludXgtbXRkLwo= 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=-5.6 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_PASS,URIBL_BLOCKED,USER_AGENT_MUTT 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 32BCCC43381 for ; Thu, 21 Mar 2019 09:35:19 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id D672621874 for ; Thu, 21 Mar 2019 09:35:18 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=cadence.com header.i=@cadence.com header.b="PaCboa10"; dkim=pass (1024-bit key) header.d=cadence.com header.i=@cadence.com header.b="QNzORNi/" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728117AbfCUJfR (ORCPT ); Thu, 21 Mar 2019 05:35:17 -0400 Received: from mx0a-0014ca01.pphosted.com ([208.84.65.235]:59706 "EHLO mx0a-0014ca01.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727883AbfCUJfQ (ORCPT ); Thu, 21 Mar 2019 05:35:16 -0400 Received: from pps.filterd (m0042385.ppops.net [127.0.0.1]) by mx0a-0014ca01.pphosted.com (8.16.0.27/8.16.0.27) with SMTP id x2L9YBeO003727; Thu, 21 Mar 2019 02:34:23 -0700 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cadence.com; h=date : from : to : cc : subject : message-id : references : mime-version : content-type : content-transfer-encoding : in-reply-to; s=proofpoint; bh=+IAOx91IQPZtKA1RA4PPagV9BEc59DuSyl8mRVcUHyg=; b=PaCboa1080G7yqOiZEupG4BRin+0JEjsOFDBhSy1z2+kapmyvWor/VVvNqRuXPZvsxLI +sQFtaua5uoay0mPBzZB9Ajm/gZ2hXdd64s9YIhIEZzcgeYczHolMuPBE/ZS4BrmY7/h DwaKWf1WhaH+mpvwX5JE778GLhwHlWM+6ifq1+nic5YNTitl7T3+lZ44ivweEnk8AJIt xbLv4JW26hNWS9iVTQ6jR79TqClU6aVTI1jE5BunuI6EhujpiVRm48IjivqhzSIYZ9l+ IQ187jhmUOGzdzR77IHyalaDRSUGeGqVvGOccwD8cu6m0gzcbI7PdvYKr8xIORfs0Qgu 5g== Authentication-Results: cadence.com; spf=pass smtp.mailfrom=piotrs@cadence.com Received: from nam03-by2-obe.outbound.protection.outlook.com (mail-by2nam03lp2050.outbound.protection.outlook.com [104.47.42.50]) by mx0a-0014ca01.pphosted.com with ESMTP id 2r8wpvr2na-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 21 Mar 2019 02:34:22 -0700 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cadence.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=+IAOx91IQPZtKA1RA4PPagV9BEc59DuSyl8mRVcUHyg=; b=QNzORNi/0PqKFmWpvqyiI7UwL+2y05/qIp6Q5elf0Nj2wfvBFeOiCTH56txRlzvLGgCvv0nt7HfwciDxalflBozovEduDRs4PLLBMTD+pCCYU8fHLSiThQPJMEplem47LU3fZRd6JPJPSEogVTXiM8z1jzH9daH4zTD1Mw5RtG0= Received: from DM5PR07CA0054.namprd07.prod.outlook.com (2603:10b6:4:ad::19) by MN2PR07MB5919.namprd07.prod.outlook.com (2603:10b6:208:ae::25) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1730.16; Thu, 21 Mar 2019 09:34:19 +0000 Received: from DM3NAM05FT033.eop-nam05.prod.protection.outlook.com (2a01:111:f400:7e51::205) by DM5PR07CA0054.outlook.office365.com (2603:10b6:4:ad::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1709.14 via Frontend Transport; Thu, 21 Mar 2019 09:34:19 +0000 Received-SPF: SoftFail (protection.outlook.com: domain of transitioning cadence.com discourages use of 158.140.1.28 as permitted sender) Received: from sjmaillnx1.cadence.com (158.140.1.28) by DM3NAM05FT033.mail.protection.outlook.com (10.152.98.145) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1750.4 via Frontend Transport; Thu, 21 Mar 2019 09:34:18 +0000 Received: from mailsj6.global.cadence.com (mailsj6.cadence.com [158.140.32.112]) by sjmaillnx1.cadence.com (8.14.4/8.14.4) with ESMTP id x2L9YCOs030245 (version=TLSv1/SSLv3 cipher=AES256-SHA bits=256 verify=OK); Thu, 21 Mar 2019 02:34:12 -0700 X-CrossPremisesHeadersFilteredBySendConnector: mailsj6.global.cadence.com Received: from global.cadence.com (158.140.32.37) by mailsj6.global.cadence.com (158.140.32.112) with Microsoft SMTP Server (TLS) id 15.0.1367.3; Thu, 21 Mar 2019 02:34:08 -0700 Date: Thu, 21 Mar 2019 09:33:58 +0000 From: Piotr Sroka To: Miquel Raynal CC: , Boris Brezillon , Richard Weinberger , David Woodhouse , Brian Norris , Marek Vasut , Paul Burton , "Geert Uytterhoeven" , Arnd Bergmann , "Marcel Ziswiler" , Dmitry Osipenko , Stefan Agner , Subject: Re: [PATCH v2 1/2] mtd: nand: Add Cadence NAND controller driver Message-ID: <20190321093356.GA19577@global.cadence.com> References: <20190219161406.4340-1-piotrs@cadence.com> <20190219161823.22466-1-piotrs@cadence.com> <20190305190954.6c38d681@xps13> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8"; format=flowed Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20190305190954.6c38d681@xps13> User-Agent: Mutt/1.5.20 (2009-12-10) X-Originating-IP: [158.140.32.37] X-ClientProxiedBy: mailsj7.global.cadence.com (158.140.32.114) To mailsj6.global.cadence.com (158.140.32.112) X-OrganizationHeadersPreserved: mailsj6.global.cadence.com X-EOPAttributedMessage: 0 X-Forefront-Antispam-Report: CIP:158.140.1.28;IPV:CAL;SCL:-1;CTRY:US;EFV:NLI;SFV:NSPM;SFS:(10009020)(39850400004)(136003)(376002)(346002)(396003)(2980300002)(189003)(199004)(36092001)(23676004)(2486003)(386003)(76176011)(7696005)(67846002)(16526019)(6286002)(33656002)(186003)(6246003)(26005)(11346002)(476003)(5024004)(336012)(126002)(8936002)(486006)(26826003)(956004)(478600001)(446003)(426003)(14444005)(6666004)(356004)(7416002)(106466001)(105596002)(50466002)(6916009)(2870700001)(3846002)(6116002)(86362001)(2906002)(7636002)(58126008)(30864003)(7736002)(305945005)(66066001)(4326008)(229853002)(54906003)(55016002)(47776003)(53416004)(246002)(8676002)(5660300002)(1076003)(66574012)(316002);DIR:OUT;SFP:1101;SCL:1;SRVR:MN2PR07MB5919;H:sjmaillnx1.cadence.com;FPR:;SPF:SoftFail;LANG:en;PTR:corp.cadence.com;MX:1;A:1; X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 2a5c6cb6-f093-4652-fd0c-08d6ade06488 X-Microsoft-Antispam: BCL:0;PCL:0;RULEID:(2390118)(7020095)(4652040)(8989299)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(5600127)(711020)(4605104)(2017052603328)(7153060)(7193020);SRVR:MN2PR07MB5919; X-MS-TrafficTypeDiagnostic: MN2PR07MB5919: X-Microsoft-Antispam-PRVS: X-Forefront-PRVS: 0983EAD6B2 X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam-Message-Info: qtg3u6IkNWNNnNkkjrIeSJL9jgyIaFdoN7CGqlhqRK6TReR2+7DO57Fvh1MObA9j6Mrb4bRM/rwVPfDI5h9JfwINzIIBWDNSRtBPuyfmlHnyiP0RnwT4djfQa8LWztjhyeMRZ5ouomM3R7E/xEexFTIbecLD69VcI0VrTYhoiHb04lpMbpgbVW3C7rw9NrYlPnp8QasQmOqQLiXnzBnqRra4FDVXTXUgk7qC5XF77dCGtvRk4d7VUmpbD4OzzFM6m9aoXg515fvOWARDxTJwMA4NBgFha/31LefUA/tJPNS5SeiIynRWdBsBrwvl/JQQnIJ3k6Y6S6dkyc0rj95Rsc+Snmz7AaarVnA2HZRH9AsR0w7yTxZAvsKA1y2oBL0ayIdV4WhPNsG1DrAJq1siWAQO4wUd8p9FijPEQ7AnIv4= X-OriginatorOrg: cadence.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 21 Mar 2019 09:34:18.2453 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 2a5c6cb6-f093-4652-fd0c-08d6ade06488 X-MS-Exchange-CrossTenant-Id: d36035c5-6ce6-4662-a3dc-e762e61ae4c9 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=d36035c5-6ce6-4662-a3dc-e762e61ae4c9;Ip=[158.140.1.28];Helo=[sjmaillnx1.cadence.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: MN2PR07MB5919 X-Proofpoint-SPF-Result: pass X-Proofpoint-SPF-Record: v=spf1 include:_spf.salesforce.com include:mktomail.com include:spf-0014ca01.pphosted.com include:spf.protection.outlook.com include:auth.msgapp.com include:spf.mandrillapp.com ~all X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:,, definitions=2019-03-21_05:,, signatures=0 X-Proofpoint-Spam-Details: rule=outbound_check_notspam policy=outbound_check score=0 priorityscore=1501 malwarescore=0 suspectscore=2 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 lowpriorityscore=0 mlxscore=0 impostorscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1810050000 definitions=main-1903210069 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The 03/05/2019 19:09, Miquel Raynal wrote: >EXTERNAL MAIL > > >Hi Piotr, > >Piotr Sroka wrote on Tue, 19 Feb 2019 16:18:23 >+0000: > >> This patch adds driver for Cadence HPNFC NAND controller. >> >> Signed-off-by: Piotr Sroka >> --- >> Changes for v2: >> - create one universal wait function for all events instead of one >> function per event. >> - split one big function executing nand operations to separate >> functions one per each type of operation. >> - add erase atomic operation to nand operation parser >> - remove unnecessary includes. >> - remove unused register defines >> - add support for multiple nand chips >> - remove all code using legacy functions >> - remove chip dependents parameters from dts bindings, they were >> attached to the SoC specific compatible at the driver level >> - simplify interrupt handling >> - simplify timing calculations >> - fix calculation of maximum supported cs signals >> - simplify ecc size calculation >> - remove header file and put whole code to one c file >> --- >> drivers/mtd/nand/raw/Kconfig | 8 + >> drivers/mtd/nand/raw/Makefile | 1 + >> drivers/mtd/nand/raw/cadence-nand-controller.c | 3288 ++++++++++++++++++++++++ > >This driver is way too massive, I am pretty sure it can shrink a >little bit more. >[...] > I will try to make it shorer but it will be difucult to achive. It is because - there are a lot of calculation needed for PHY - ECC are interleaved with data (like on marvell-nand or gpmi-nand). Therefore: + RAW mode is complicated + protecting BBM increases number of lines of source code - need to support two DMA engines internal and external (slave) We will see on next patch version what is the result. That page layout looks: +----------------------------------------- | Data 1 | ECC 1 | ... | Data N | ECC N | +----------------------------------------- ----------------------------------+ Last Data | OOB bytes | Last ECC | ----------------------------------+ /\ || OOB area started usualy vendor specified BBM Flash OOB area starts somewhere in last data sector. Flash OOB area contains part of last sector, oob data (accessible by driver), and last ECC code >> + >> +struct cdns_nand_chip { >> + struct cadence_nand_timings timings; >> + struct nand_chip chip; >> + u8 nsels; >> + struct list_head node; >> + >> + /* >> + * part of oob area of NANF flash memory page. >> + * This part is available for user to read or write. >> + */ >> + u32 avail_oob_size; >> + /* oob area size of NANF flash memory page */ >> + u32 oob_size; >> + /* main area size of NANF flash memory page */ >> + u32 main_size; > >These fields are redundant and exist in mtd_info/nand_chip. > Ok I will use the parameters from mtd_info. >> + >> + /* sector size few sectors are located on main area of NF memory page */ >> + u32 sector_size; >> + u32 sector_count; >> + >> + /* offset of BBM*/ >> + u8 bbm_offs; >> + /* number of bytes reserved for BBM */ >> + u8 bbm_len; > >Why do you bother at the controller driver level with bbm? > When ECC is enabled then BBM is somewhere in last data sector. So for write operation real BBM will be overwritten. For read operation it will be read from wrong offset. To protect BBM we use HW feature skip bytes. To be able to properly configure this feature we need to know what is the offset of BBM. >> + >> +static int cadence_nand_set_erase_detection(struct cdns_nand_ctrl *cdns_ctrl, >> + bool enable, >> + u8 bitflips_threshold) > >What is this for? Fucntions enables/disables hardware detection of erased data pages. > >> + >> +/* hardware initialization */ >> +static int cadence_nand_hw_init(struct cdns_nand_ctrl *cdns_ctrl) >> +{ >> + int status = 0; >> + u32 reg; >> + >> + status = cadence_nand_wait_for_value(cdns_ctrl, CTRL_STATUS, >> + 1000000, >> + CTRL_STATUS_INIT_COMP, false); >> + if (status) >> + return status; >> + >> + reg = readl(cdns_ctrl->reg + CTRL_VERSION); >> + >> + dev_info(cdns_ctrl->dev, >> + "%s: cadence nand controller version reg %x\n", >> + __func__, reg); >> + >> + /* disable cache and multiplane */ >> + writel(0, cdns_ctrl->reg + MULTIPLANE_CFG); >> + writel(0, cdns_ctrl->reg + CACHE_CFG); >> + >> + /* clear all interrupts */ >> + writel(0xFFFFFFFF, cdns_ctrl->reg + INTR_STATUS); >> + >> + cadence_nand_get_caps(cdns_ctrl); >> + cadence_nand_read_bch_cfg(cdns_ctrl); > >No, you cannot rely on the bootloader's configuration. And I suppose >this is what the first call to read_bch_cfg does? I do not realy on boot loader. Just read NAND flash controller configuration from read only capabilities registers. >> + >> +#define TT_OOB_AREA 1 >> +#define TT_MAIN_OOB_AREAS 2 >> +#define TT_RAW_PAGE 3 >> +#define TT_BBM 4 >> +#define TT_MAIN_OOB_AREA_EXT 5 >> + >> +/* prepare size of data to transfer */ >> +static int >> +cadence_nand_prepare_data_size(struct nand_chip *chip, >> + int transfer_type) >> +{ >> + struct cdns_nand_ctrl *cdns_ctrl = to_cdns_nand_ctrl(chip->controller); >> + struct cdns_nand_chip *cdns_chip = to_cdns_nand_chip(chip); >> + u32 sec_size = 0, last_sec_size, offset = 0, sec_cnt = 1; >> + u32 ecc_size = chip->ecc.bytes; >> + u32 data_ctrl_size = 0; >> + u32 reg = 0; >> + >> + if (cdns_ctrl->curr_trans_type == transfer_type) >> + return 0; >> + >> + switch (transfer_type) { > >Please turn the controller driver as dumb as possible. You should not >care which part of the OOB area you are accessing. It is a bit confusing for me how accessing OOB should be implemented. I know that read_oob function is called to check BBM value when BBT is initialized. It is also a bit confusing for me why the raw version is not used for that purpose. In current implementation if you write oob by write_page function next read oob by read_oob function then data will be the same. If I implement dump functions read_oob and write_oob then 1. ECC must be disabled for these functions 2. oob data accessing by write_page/read_page will be different (different offsets) that the data accessing by read_oob/write_oob functions If above described "functionalities" are acceptable I will change implementation of write_oob and read_oob functions. The write_page and read_page must be implemented in that way as it is now. Let me know which solution is preffered. >> + case TT_OOB_AREA: >> + offset = cdns_chip->main_size - cdns_chip->sector_size; >> + ecc_size = ecc_size * (offset / cdns_chip->sector_size); >> + offset = offset + ecc_size; >> + sec_cnt = 1; >> + last_sec_size = cdns_chip->sector_size >> + + cdns_chip->avail_oob_size; >> + break; >> + case TT_MAIN_OOB_AREA_EXT: >> + sec_cnt = cdns_chip->sector_count; >> + last_sec_size = cdns_chip->sector_size; >> + sec_size = cdns_chip->sector_size; >> + data_ctrl_size = cdns_chip->avail_oob_size; >> + break; >> + case TT_MAIN_OOB_AREAS: >> + sec_cnt = cdns_chip->sector_count; >> + last_sec_size = cdns_chip->sector_size >> + + cdns_chip->avail_oob_size; >> + sec_size = cdns_chip->sector_size; >> + break; >> + case TT_RAW_PAGE: >> + last_sec_size = cdns_chip->main_size + cdns_chip->oob_size; >> + break; >> + case TT_BBM: >> + offset = cdns_chip->main_size + cdns_chip->bbm_offs; >> + last_sec_size = 8; >> + break; >> + default: >> + dev_err(cdns_ctrl->dev, "Data size preparation failed\n"); >> + return -EINVAL; >> + } >> + >> + reg = 0; >> + reg |= FIELD_PREP(TRAN_CFG_0_OFFSET, offset); >> + reg |= FIELD_PREP(TRAN_CFG_0_SEC_CNT, sec_cnt); >> + writel(reg, cdns_ctrl->reg + TRAN_CFG_0); >> + >> + reg = 0; >> + reg |= FIELD_PREP(TRAN_CFG_1_LAST_SEC_SIZE, last_sec_size); >> + reg |= FIELD_PREP(TRAN_CFG_1_SECTOR_SIZE, sec_size); >> + writel(reg, cdns_ctrl->reg + TRAN_CFG_1); >> + >> + reg = readl(cdns_ctrl->reg + CONTROL_DATA_CTRL); >> + reg &= ~CONTROL_DATA_CTRL_SIZE; >> + reg |= FIELD_PREP(CONTROL_DATA_CTRL_SIZE, data_ctrl_size); >> + writel(reg, cdns_ctrl->reg + CONTROL_DATA_CTRL); >> + >> + cdns_ctrl->curr_trans_type = transfer_type; >> + >> + return 0; >> +} >> + > >[...] > >> + >> +static int cadence_nand_read_page_raw(struct nand_chip *chip, >> + u8 *buf, int oob_required, int page) >> +{ >> + struct cdns_nand_ctrl *cdns_ctrl = to_cdns_nand_ctrl(chip->controller); >> + struct cdns_nand_chip *cdns_chip = to_cdns_nand_chip(chip); >> + int oob_skip = cdns_chip->bbm_len; > >Why do you skip the BBM? > >In any of the read_page/oob helpers I don't think this is relevant at >all. I described the problem at the beginnig. ECC are interleaved with data. So real possition of BBM is somewehre in last data sector. We use skip byte feature to skip this BBM. Once used need to handle in each function. Skip BBM is also used in denali-nand > >> + int writesize = cdns_chip->main_size; >> + int ecc_steps = chip->ecc.steps; >> + int ecc_size = chip->ecc.size; >> + int ecc_bytes = chip->ecc.bytes; >> + void *tmp_buf = cdns_ctrl->buf; >> + int i, pos, len; >> + int status = 0; >> + >> + status = cadence_nand_select_target(chip); >> + if (status) >> + return status; >> + >> + cadence_nand_set_skip_bytes_conf(cdns_ctrl, 0, 0, 0); >> + >> + cadence_nand_prepare_data_size(chip, TT_RAW_PAGE); >> + status = cadence_nand_cdma_transfer(cdns_ctrl, >> + cdns_chip->cs[chip->cur_cs], >> + page, cdns_ctrl->buf, >> + NULL, >> + cdns_chip->main_size >> + + cdns_chip->oob_size, >> + 0, DMA_FROM_DEVICE, false); >> + >> + switch (status) { >> + case STAT_ERASED: >> + case STAT_OK: >> + break; >> + default: >> + dev_err(cdns_ctrl->dev, "read raw page failed\n"); >> + return -EIO; >> + } >> + >> + /* Arrange the buffer for syndrome payload/ecc layout */ >> + if (buf) { >> + for (i = 0; i < ecc_steps; i++) { >> + pos = i * (ecc_size + ecc_bytes); >> + len = ecc_size; >> + >> + if (pos >= writesize) >> + pos += oob_skip; >> + else if (pos + len > writesize) >> + len = writesize - pos; >> + >> + memcpy(buf, tmp_buf + pos, len); >> + buf += len; >> + if (len < ecc_size) { >> + len = ecc_size - len; >> + memcpy(buf, tmp_buf + writesize + oob_skip, >> + len); >> + buf += len; >> + } >> + } >> + } >> + >> + if (oob_required) { >> + u8 *oob = chip->oob_poi; >> + u32 oob_data_offset = (cdns_chip->sector_count - 1) * >> + (cdns_chip->sector_size + chip->ecc.bytes) >> + + cdns_chip->sector_size + oob_skip; >> + >> + /* OOB free */ >> + memcpy(oob, tmp_buf + oob_data_offset, >> + cdns_chip->avail_oob_size); >> + >> + /* BBM at the beginning of the OOB area */ >> + memcpy(oob, tmp_buf + writesize, oob_skip); >> + >> + oob += cdns_chip->avail_oob_size; >> + >> + /* OOB ECC */ >> + for (i = 0; i < ecc_steps; i++) { >> + pos = ecc_size + i * (ecc_size + ecc_bytes); >> + len = ecc_bytes; >> + >> + if (i == (ecc_steps - 1)) >> + pos += cdns_chip->avail_oob_size; >> + >> + if (pos >= writesize) >> + pos += oob_skip; >> + else if (pos + len > writesize) >> + len = writesize - pos; >> + >> + memcpy(oob, tmp_buf + pos, len); >> + oob += len; >> + if (len < ecc_bytes) { >> + len = ecc_bytes - len; >> + memcpy(oob, tmp_buf + writesize + oob_skip, >> + len); >> + oob += len; >> + } >> + } >> + } >> + >> + return 0; >> +} [ ...] >> +} >> + >> +static int cadence_nand_read_buf(struct cdns_nand_ctrl *cdns_ctrl, >> +static int cadence_nand_write_buf(struct cdns_nand_ctrl *cdns_ctrl, >> +static int cadence_nand_cmd_opcode(struct nand_chip *chip, >> +static int cadence_nand_cmd_address(struct nand_chip *chip, >> +static int cadence_nand_cmd_erase(struct nand_chip *chip, >> +static int cadence_nand_cmd_data(struct nand_chip *chip, > >This looks pretty familiar with the legacy approach, I think you just >renamed some functions instead of trying to fit the ->exec_op interface >and there is probably a lot to do on this side that would reduce the >driver size. There are plenty of operations done by each of the above >helpers that should probably factored out. > No I have never used legacy approach for that part. In previous patch I have one function to hanlde it but Boris point that one function containing switch is not a good solution so I splited to few functions. >> + >> +static const struct nand_op_parser cadence_nand_op_parser = NAND_OP_PARSER( >> + NAND_OP_PARSER_PATTERN( >> + cadence_nand_cmd_erase, >> + NAND_OP_PARSER_PAT_CMD_ELEM(false), >> + NAND_OP_PARSER_PAT_ADDR_ELEM(false, MAX_ERASE_ADDRESS_CYC), >> + NAND_OP_PARSER_PAT_CMD_ELEM(false), >> + NAND_OP_PARSER_PAT_WAITRDY_ELEM(false)), >> + NAND_OP_PARSER_PATTERN( >> + cadence_nand_cmd_opcode, >> + NAND_OP_PARSER_PAT_CMD_ELEM(false)), >> + NAND_OP_PARSER_PATTERN( >> + cadence_nand_cmd_address, >> + NAND_OP_PARSER_PAT_ADDR_ELEM(false, MAX_ADDRESS_CYC)), >> + NAND_OP_PARSER_PATTERN( >> + cadence_nand_cmd_data, >> + NAND_OP_PARSER_PAT_DATA_IN_ELEM(false, MAX_DATA_SIZE)), >> + NAND_OP_PARSER_PATTERN( >> + cadence_nand_cmd_data, >> + NAND_OP_PARSER_PAT_DATA_OUT_ELEM(false, MAX_DATA_SIZE)), >> + NAND_OP_PARSER_PATTERN( >> + cadence_nand_cmd_waitrdy, >> + NAND_OP_PARSER_PAT_WAITRDY_ELEM(false)) >> + ); >> + >> +static int cadence_nand_exec_op(struct nand_chip *chip, >> + const struct nand_operation *op, >> + bool check_only) >> +{ >> + int status = cadence_nand_select_target(chip); >> + >> + if (status) >> + return status; >> + >> + return nand_op_parser_exec_op(chip, &cadence_nand_op_parser, op, >> + check_only); >> +} >> + >> +static int cadence_nand_ooblayout_free(struct mtd_info *mtd, int section, >> + struct mtd_oob_region *oobregion) >> +{ >> + struct nand_chip *chip = mtd_to_nand(mtd); >> + struct cdns_nand_chip *cdns_chip = to_cdns_nand_chip(chip); >> + >> + if (section) >> + return -ERANGE; >> + >> + oobregion->offset = cdns_chip->bbm_len; >> + oobregion->length = cdns_chip->avail_oob_size >> + - cdns_chip->bbm_len; >> + >> + return 0; >> +} >> + >> +static int cadence_nand_ooblayout_ecc(struct mtd_info *mtd, int section, >> + struct mtd_oob_region *oobregion) >> +{ >> + struct nand_chip *chip = mtd_to_nand(mtd); >> + struct cdns_nand_chip *cdns_chip = to_cdns_nand_chip(chip); >> + >> + if (section) >> + return -ERANGE; >> + >> + oobregion->offset = cdns_chip->avail_oob_size; >> + oobregion->length = chip->ecc.total; >> + >> + return 0; >> +} >> + >> +static const struct mtd_ooblayout_ops cadence_nand_ooblayout_ops = { >> + .free = cadence_nand_ooblayout_free, >> + .ecc = cadence_nand_ooblayout_ecc, >> +}; >> + >> +static int calc_cycl(u32 timing, u32 clock) >> +{ >> + if (timing == 0 || clock == 0) >> + return 0; >> + >> + if ((timing % clock) > 0) >> + return timing / clock; >> + else >> + return timing / clock - 1; >> +} >> + [...] >> + /* >> + * the idea of those calculation is to get the optimum value >> + * for tRP and tRH timings if it is NOT possible to sample data >> + * with optimal tRP/tRH settings the parameters will be extended >> + */ >> + if (sdr->tRC_min <= clk_period && >> + sdr->tRP_min <= (clk_period / 2) && >> + sdr->tREH_min <= (clk_period / 2)) { > >Will this situation really happen? I think yes for follwing values trc_min 20000 ps trp_min 10000 ps treh_min 7000 ps clk_period 20000 ps [...] >> + } >> + >> + if (cdns_ctrl->caps2.is_phy_type_dll) { > >Is the else part allowed? > following register does not exist if caps2.is_phy_type_dll is 0 >> + u32 tpre_cnt = calc_cycl(tpre, clk_period); >> + u32 tcdqss_cnt = calc_cycl(tcdqss + if_skew, clk_period); >> + u32 tpsth_cnt = calc_cycl(tpsth + if_skew, clk_period); >> + >> + u32 trpst_cnt = calc_cycl(trpst + if_skew, clk_period) + 1; >> + u32 twpst_cnt = calc_cycl(twpst + if_skew, clk_period) + 1; >> + u32 tcres_cnt = calc_cycl(tcres + if_skew, clk_period) + 1; >> + u32 tcdqsh_cnt = calc_cycl(tcdqsh + if_skew, clk_period) + 5; >> + >> + tcr_cnt = calc_cycl(tcr + if_skew, clk_period); >> + /* >> + * skew not included because this timing defines duration of >> + * RE or DQS before data transfer >> + */ >> + tpsth_cnt = tpsth_cnt + 1; >> + reg = FIELD_PREP(TOGGLE_TIMINGS0_TPSTH, tpsth_cnt); >> + reg |= FIELD_PREP(TOGGLE_TIMINGS0_TCDQSS, tcdqss_cnt); >> + reg |= FIELD_PREP(TOGGLE_TIMINGS0_TPRE, tpre_cnt); >> + reg |= FIELD_PREP(TOGGLE_TIMINGS0_TCR, tcr_cnt); >> + t->toggle_timings_0 = reg; >> + dev_dbg(cdns_ctrl->dev, "TOGGLE_TIMINGS_0_SDR\t%x\n", reg); >> + >> + //toggle_timings_1 - tRPST,tWPST >> + reg = FIELD_PREP(TOGGLE_TIMINGS1_TCDQSH, tcdqsh_cnt); >> + reg |= FIELD_PREP(TOGGLE_TIMINGS1_TCRES, tcres_cnt); >> + reg |= FIELD_PREP(TOGGLE_TIMINGS1_TRPST, trpst_cnt); >> + reg |= FIELD_PREP(TOGGLE_TIMINGS1_TWPST, twpst_cnt); >> + t->toggle_timings_1 = reg; >> + dev_dbg(cdns_ctrl->dev, "TOGGLE_TIMINGS_1_SDR\t%x\n", reg); >> + } [...] > >This function is so complicated !!! How can this even work? Really, it >is hard to get into the code and follow, I am sure you can do >something. Yes it is complicated but works, I will try to simplify it... [...] >> + "CS %d already assigned\n", cs); >> + return -EINVAL; >> + } >> + >> + cdns_chip->cs[i] = cs; >> + } >> + >> + chip = &cdns_chip->chip; >> + chip->controller = &cdns_ctrl->controller; >> + nand_set_flash_node(chip, np); >> + >> + mtd = nand_to_mtd(chip); >> + mtd->dev.parent = cdns_ctrl->dev; >> + >> + /* >> + * Default to HW ECC engine mode. If the nand-ecc-mode property is given >> + * in the DT node, this entry will be overwritten in nand_scan_ident(). >> + */ >> + chip->ecc.mode = NAND_ECC_HW; >> + >> + /* >> + * Save a reference value for timing registers before >> + * ->setup_data_interface() is called. >> + */ >> + cadence_nand_get_timings(cdns_ctrl, &cdns_chip->timings); > >You cannot rely on the Bootloader's configuration. This driver should >derive it. I do not relay on the Bootloader's configuration in any part. I just init timings structure base on current values of registers to do not have rubish in timing structure. Values will be calculated by driver when setup_data_interface is called. In case set_timings is called before setup_data_interface then we write the same valus to timing registers which are preset in registres. To be shorter timing registers will stay unchanged. >> + ret = nand_scan(chip, cdns_chip->nsels); >> + if (ret) { >> + dev_err(cdns_ctrl->dev, "could not scan the nand chip\n"); >> + return ret; >> + } >> + >> + ret = mtd_device_register(mtd, NULL, 0); >> + if (ret) { >> + dev_err(cdns_ctrl->dev, >> + "failed to register mtd device: %d\n", ret); >> + nand_release(chip); > >I think you should call nand_cleanup instead of nand_release here has >the mtd device is not registered yet. > >> + return ret; >> + } >> + >> + list_add_tail(&cdns_chip->node, &cdns_ctrl->chips); >> + >> + return 0; >> +} >> + >> +static int cadence_nand_chips_init(struct cdns_nand_ctrl *cdns_ctrl) >> +{ >> + struct device_node *np = cdns_ctrl->dev->of_node; >> + struct device_node *nand_np; >> + int max_cs = cdns_ctrl->caps2.max_banks; >> + int nchips; >> + int ret; >> + >> + nchips = of_get_child_count(np); >> + >> + if (nchips > max_cs) { >> + dev_err(cdns_ctrl->dev, >> + "too many NAND chips: %d (max = %d CS)\n", >> + nchips, max_cs); >> + return -EINVAL; >> + } >> + >> + for_each_child_of_node(np, nand_np) { >> + ret = cadence_nand_chip_init(cdns_ctrl, nand_np); >> + if (ret) { >> + of_node_put(nand_np); >> + return ret; >> + } > >If nand_chip_init() fails on another chip than the first one, there is >some garbage collection to do. > >> + } >> + >> + return 0; >> +} >> + >> +static int cadence_nand_init(struct cdns_nand_ctrl *cdns_ctrl) >> +{ >> + dma_cap_mask_t mask; >> + int ret = 0; >> + >> + cdns_ctrl->cdma_desc = dma_alloc_coherent(cdns_ctrl->dev, >> + sizeof(*cdns_ctrl->cdma_desc), >> + &cdns_ctrl->dma_cdma_desc, >> + GFP_KERNEL); >> + if (!cdns_ctrl->dma_cdma_desc) >> + return -ENOMEM; >> + >> + cdns_ctrl->buf_size = 16 * 1024; > >s/1024/SZ_1K/ > >> + cdns_ctrl->buf = kmalloc(cdns_ctrl->buf_size, GFP_KERNEL); > >If you use kmalloc here then this buffer will always be DMA-able, >right? Right I have seen such solution in another driver. Thanks for revieving this patch. Please answer on my question how write_oob and read_oob functions should be implemented. > > >Thanks, >Miquèl Thanks Piotr Sroka