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_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 CE22EC0650E for ; Mon, 1 Jul 2019 09:53:00 +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 912C6212F5 for ; Mon, 1 Jul 2019 09:53:00 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="tWZh2hOG"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=cadence.com header.i=@cadence.com header.b="ieaExeNa"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=cadence.com header.i=@cadence.com header.b="Onr0Xg2p" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 912C6212F5 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=FhQqw9ZxUOyjns+3X2mzdFFIUctXaENCutNKmGqT/w8=; b=tWZh2hOGIC/4/komsUf57zzuJ NMQprMXNhohkkr+Hh4rUdbkotzFKferTk+uvyTfr75VYPOtciTd4hi6V2MuMdURm5NcwP4KlB1bDT /Z29H4XbHgKC1roNaX4biYFxXPiYfjskSRw4GLCqHfC4XL+CO9U6dsxnf6PL8ZontYP749oINSoDl JRehw+PXOG3vpJg2YrmwdtAZwJe9jRlYorA1m2r36E3Z1qlJeS/owVtZIlbCOUM1aPNQl1PZIce6+ SYSSBc7LveVCKROuSqLkHQCPheklP0k3KTV5EJS04y+VNkzLSit+/7eOinBSGsz744ulbCVWmFpR+ MMimrH8mg==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92 #3 (Red Hat Linux)) id 1hhszI-0007i1-Cf; Mon, 01 Jul 2019 09:52:40 +0000 Received: from mx0a-0014ca01.pphosted.com ([208.84.65.235]) by bombadil.infradead.org with esmtps (Exim 4.92 #3 (Red Hat Linux)) id 1hhszD-0007hB-6m for linux-mtd@lists.infradead.org; Mon, 01 Jul 2019 09:52:38 +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 x619l3BX015873; Mon, 1 Jul 2019 02:52:03 -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=V/dBgr4DAKXxjCZVyabs7FtjjI59AJ588mSgcsPIhfc=; b=ieaExeNaso2pclAafcUMaphrhXCb16fjgNqKOcI3fsNr5gH79lEzk3Vt/b4cfPHe0mwg s7s7qU5XFBJG/3APei8o1VGDfJjFO49NAejmCpqxXHFCcYQKoONHBTx6R7H14ZBi4Shr Vha4a8pulw3zHjbfOYK2X1DKlptwEXRJR68eRwHrakbj7dgLT5EgP4mzHvJIQAANauEi V6KKBrS2uAyatGh+iJhUZ3TZ1u361ycQunlwi5Gx6I+PVcD7pAh6AmUnXRvgSKyjX425 yLDs6W1n4phNyqPEHKLqxx7gMA0IbAoHDotgB8uXbtIKb5gWAy+HIrQ4+sJQ7UL1h+Zb 9A== Authentication-Results: cadence.com; spf=pass smtp.mailfrom=piotrs@cadence.com Received: from nam04-bn3-obe.outbound.protection.outlook.com (mail-bn3nam04lp2057.outbound.protection.outlook.com [104.47.46.57]) by mx0a-0014ca01.pphosted.com with ESMTP id 2te4hwedp2-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Mon, 01 Jul 2019 02:52:02 -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=V/dBgr4DAKXxjCZVyabs7FtjjI59AJ588mSgcsPIhfc=; b=Onr0Xg2pWK5cNRbpStqPFmbbnHLmILNwiXZpdvwWpmf5w6EcFWJmBww3t6mSYq8vzDnX6kwJ10fxn9EWi8z/ew8ev+zhj5fxSJFZG3Om7CuNKHWxZr+zV2C13fgANs1qb97iC9uT0xwS0hGOhEdBVqC43d9sdD8+mxghEFRBdDs= Received: from BN8PR07CA0026.namprd07.prod.outlook.com (2603:10b6:408:ac::39) by BL0PR07MB5569.namprd07.prod.outlook.com (2603:10b6:208:8a::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2032.18; Mon, 1 Jul 2019 09:51:59 +0000 Received: from DM3NAM05FT044.eop-nam05.prod.protection.outlook.com (2a01:111:f400:7e51::201) by BN8PR07CA0026.outlook.office365.com (2603:10b6:408:ac::39) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.2008.16 via Frontend Transport; Mon, 1 Jul 2019 09:51:59 +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 DM3NAM05FT044.mail.protection.outlook.com (10.152.98.157) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.2052.8 via Frontend Transport; Mon, 1 Jul 2019 09:51:58 +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 x619ptID008807 (version=TLSv1/SSLv3 cipher=AES256-SHA bits=256 verify=OK); Mon, 1 Jul 2019 02:51:55 -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; Mon, 1 Jul 2019 02:51:52 -0700 Date: Mon, 1 Jul 2019 10:51:45 +0100 From: Piotr Sroka To: Miquel Raynal Subject: Re: [PATCH v2 1/2] mtd: nand: Add Cadence NAND controller driver Message-ID: <20190701095143.GA21903@global.cadence.com> References: <20190219161406.4340-1-piotrs@cadence.com> <20190219161823.22466-1-piotrs@cadence.com> <20190305190954.6c38d681@xps13> <20190321093356.GA19577@global.cadence.com> <20190512142426.11453a6c@xps13> <20190606151948.GA10565@global.cadence.com> <20190627181542.131aa061@xps13> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20190627181542.131aa061@xps13> User-Agent: Mutt/1.5.20 (2009-12-10) X-Originating-IP: [158.140.32.37] X-ClientProxiedBy: mailsj6.global.cadence.com (158.140.32.112) 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)(4636009)(136003)(346002)(376002)(396003)(39860400002)(2980300002)(199004)(189003)(36092001)(4326008)(6116002)(3846002)(14444005)(5024004)(53416004)(305945005)(246002)(8936002)(426003)(336012)(8676002)(7416002)(7736002)(7636002)(186003)(16526019)(47776003)(2870700001)(50466002)(67846002)(229853002)(316002)(486006)(54906003)(58126008)(26005)(6286002)(66066001)(2906002)(6246003)(6916009)(33656002)(11346002)(956004)(476003)(126002)(446003)(55016002)(2486003)(23676004)(7696005)(386003)(76176011)(70586007)(1076003)(70206006)(86362001)(356004)(6666004)(26826003)(76130400001)(5660300002)(478600001)(66574012)(30864003); DIR:OUT; SFP:1101; SCL:1; SRVR:BL0PR07MB5569; H:sjmaillnx1.cadence.com; FPR:; SPF:SoftFail; LANG:en; PTR:corp.cadence.com; A:1; MX:1; X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 45b55ac1-44d7-4e15-8185-08d6fe09c277 X-Microsoft-Antispam: BCL:0; PCL:0; RULEID:(2390118)(7020095)(4652040)(8989299)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(5600148)(711020)(4605104)(1401327)(2017052603328)(7193020); SRVR:BL0PR07MB5569; X-MS-TrafficTypeDiagnostic: BL0PR07MB5569: X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:4714; X-Forefront-PRVS: 00851CA28B X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam-Message-Info: 3NwcwJMrWeyuhLNk4cFTR+uksyrIqz/pWSrGdF4Bf6/1Rnk+R9ckinS1mfFcNYw9mbTsBhqiu1qoKg0o8qqGFN7uDAS39UjJr5tbPI/nDBLLoBU4BzzgHxJK/prja29kOIeVncYkSjM8YBt1UNWkIaZB9yW1v+k0o8YFhneGj9v1FCOXX3a2uC0e4IthFmk0Usd+6fpYzVutXP1E3JR2gYIO3qrEKdEhvDMQndczpLgR4evQ8kZaYmpXoqC30ROMlaM1LstgwIJZtg+uDoBjlHEg3GMnH9SI/Qhu/O/IfEIlqaQhUFMiD925z2B56r+6WXQtmND2O7tMyMAfISn5QHs2rxTN0Pt89qyyxOfMeMdgfF+kONzon+nuZGesydpolRCMFpvHzMooCnAb6eTypQZtUpE3zgc8qRj1szQeqQ4= X-OriginatorOrg: cadence.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Jul 2019 09:51:58.1909 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 45b55ac1-44d7-4e15-8185-08d6fe09c277 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: BL0PR07MB5569 X-Proofpoint-SPF-Result: pass X-Proofpoint-SPF-Record: v=spf1 include:spf.smktg.jp 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-07-01_08:, , signatures=0 X-Proofpoint-Spam-Details: rule=outbound_check_notspam policy=outbound_check score=0 priorityscore=1501 malwarescore=0 suspectscore=0 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-1907010121 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20190701_025235_666030_2A90CC00 X-CRM114-Status: GOOD ( 28.45 ) 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: 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 VGhlIDA2LzI3LzIwMTkgMTg6MTUsIE1pcXVlbCBSYXluYWwgd3JvdGU6Cj5FWFRFUk5BTCBNQUlM Cj4KPgo+SGkgUGlvdHIsCj4KPlBpb3RyIFNyb2thIDxwaW90cnNAY2FkZW5jZS5jb20+IHdyb3Rl IG9uIFRodSwgNiBKdW4gMjAxOSAxNjoxOTo1MQo+KzAxMDA6Cj4KPj4gSGkgTWlxdWVsCj4+Cj4+ Cj4+IFRoZSAwNS8xMi8yMDE5IDE0OjI0LCBNaXF1ZWwgUmF5bmFsIHdyb3RlOgo+PiA+RVhURVJO QUwgTUFJTAo+PiA+Cj4+ID4KPj4gPkVYVEVSTkFMIE1BSUwKPj4gPgo+PiA+Cj4+ID5IaSBQaW90 ciwKPj4gPgo+PiA+U29ycnkgZm9yIGRlIGRlbGF5Lgo+PiA+Cj4+ID5QaW90ciBTcm9rYSA8cGlv dHJzQGNhZGVuY2UuY29tPiB3cm90ZSBvbiBUaHUsIDIxIE1hciAyMDE5IDA5OjMzOjU4Cj4+ID4r MDAwMDoKPj4gPgo+PiA+PiBUaGUgMDMvMDUvMjAxOSAxOTowOSwgTWlxdWVsIFJheW5hbCB3cm90 ZToKPj4gPj4gPkVYVEVSTkFMIE1BSUwKPj4gPj4gPgo+PiA+PiA+Cj4+ID4+ID5IaSBQaW90ciwK Pj4gPj4gPgo+PiA+PiA+UGlvdHIgU3Jva2EgPHBpb3Ryc0BjYWRlbmNlLmNvbT4gd3JvdGUgb24g VHVlLCAxOSBGZWIgMjAxOSAxNjoxODoyMwo+PiA+PiA+KzAwMDA6Cj4+ID4+ID4KPj4gPj4gPj4g VGhpcyBwYXRjaCBhZGRzIGRyaXZlciBmb3IgQ2FkZW5jZSBIUE5GQyBOQU5EIGNvbnRyb2xsZXIu Cj4+ID4+ID4+Cj4+ID4+ID4+IFNpZ25lZC1vZmYtYnk6IFBpb3RyIFNyb2thIDxwaW90cnNAY2Fk ZW5jZS5jb20+Cj4+ID4+ID4+IC0tLQo+PiA+PiA+PiBDaGFuZ2VzIGZvciB2MjoKPj4gPj4gPj4g LSBjcmVhdGUgb25lIHVuaXZlcnNhbCB3YWl0IGZ1bmN0aW9uIGZvciBhbGwgZXZlbnRzIGluc3Rl YWQgb2Ygb25lCj4+ID4+ID4+ICAgZnVuY3Rpb24gcGVyIGV2ZW50Lgo+PiA+PiA+PiAtIHNwbGl0 IG9uZSBiaWcgZnVuY3Rpb24gZXhlY3V0aW5nIG5hbmQgb3BlcmF0aW9ucyB0byBzZXBhcmF0ZQo+ PiA+PiA+PiAgIGZ1bmN0aW9ucyBvbmUgcGVyIGVhY2ggdHlwZSBvZiBvcGVyYXRpb24uCj4+ID4+ ID4+IC0gYWRkIGVyYXNlIGF0b21pYyBvcGVyYXRpb24gdG8gbmFuZCBvcGVyYXRpb24gcGFyc2Vy Cj4+ID4+ID4+IC0gcmVtb3ZlIHVubmVjZXNzYXJ5IGluY2x1ZGVzLgo+PiA+PiA+PiAtIHJlbW92 ZSB1bnVzZWQgcmVnaXN0ZXIgZGVmaW5lcwo+PiA+PiA+PiAtIGFkZCBzdXBwb3J0IGZvciBtdWx0 aXBsZSBuYW5kIGNoaXBzCj4+ID4+ID4+IC0gcmVtb3ZlIGFsbCBjb2RlIHVzaW5nIGxlZ2FjeSBm dW5jdGlvbnMKPj4gPj4gPj4gLSByZW1vdmUgY2hpcCBkZXBlbmRlbnRzIHBhcmFtZXRlcnMgZnJv bSBkdHMgYmluZGluZ3MsIHRoZXkgd2VyZQo+PiA+PiA+PiAgIGF0dGFjaGVkIHRvIHRoZSBTb0Mg c3BlY2lmaWMgY29tcGF0aWJsZSBhdCB0aGUgZHJpdmVyIGxldmVsCj4+ID4+ID4+IC0gc2ltcGxp ZnkgaW50ZXJydXB0IGhhbmRsaW5nCj4+ID4+ID4+IC0gc2ltcGxpZnkgdGltaW5nIGNhbGN1bGF0 aW9ucwo+PiA+PiA+PiAtIGZpeCBjYWxjdWxhdGlvbiBvZiBtYXhpbXVtIHN1cHBvcnRlZCBjcyBz aWduYWxzCj4+ID4+ID4+IC0gc2ltcGxpZnkgZWNjIHNpemUgY2FsY3VsYXRpb24KPj4gPj4gPj4g LSByZW1vdmUgaGVhZGVyIGZpbGUgYW5kIHB1dCB3aG9sZSBjb2RlIHRvIG9uZSBjIGZpbGUKPj4g Pj4gPj4gLS0tCj4+ID4+ID4+ICBkcml2ZXJzL210ZC9uYW5kL3Jhdy9LY29uZmlnICAgICAgICAg ICAgICAgICAgIHwgICAgOCArCj4+ID4+ID4+ICBkcml2ZXJzL210ZC9uYW5kL3Jhdy9NYWtlZmls ZSAgICAgICAgICAgICAgICAgIHwgICAgMSArCj4+ID4+ID4+ICBkcml2ZXJzL210ZC9uYW5kL3Jh dy9jYWRlbmNlLW5hbmQtY29udHJvbGxlci5jIHwgMzI4OCArKysrKysrKysrKysrKysrKysrKysr KysKPj4gPj4gPgo+PiA+PiA+VGhpcyBkcml2ZXIgaXMgd2F5IHRvbyBtYXNzaXZlLCBJIGFtIHBy ZXR0eSBzdXJlIGl0IGNhbiBzaHJpbmsgYQo+PiA+PiA+bGl0dGxlIGJpdCBtb3JlLgo+PiA+PiA+ Wy4uLl0KPj4gPj4gPgo+PiA+PiBJIHdpbGwgdHJ5IHRvIG1ha2UgaXQgc2hvcmVyIGJ1dCBpdCB3 aWxsIGJlIGRpZnVjdWx0IHRvIGFjaGl2ZS4gSXQgaXMgYmVjYXVzZSAtIHRoZXJlIGFyZSBhIGxv dCBvZiBjYWxjdWxhdGlvbiBuZWVkZWQgZm9yIFBIWSAgICAgIC0gRUNDIGFyZSBpbnRlcmxlYXZl ZCB3aXRoIGRhdGEgKGxpa2Ugb24gbWFydmVsbC1uYW5kIG9yIGdwbWktbmFuZCkuCj4+ID4+ICAg IFRoZXJlZm9yZTogICAgKyBSQVcgbW9kZSBpcyBjb21wbGljYXRlZCAgICArIHByb3RlY3Rpbmcg QkJNIGluY3JlYXNlcyBudW1iZXIgb2YgbGluZXMgb2Ygc291cmNlIGNvZGUKPj4gPj4gLSBuZWVk IHRvIHN1cHBvcnQgdHdvIERNQSBlbmdpbmVzIGludGVybmFsIGFuZCBleHRlcm5hbCAoc2xhdmUp IFdlIHdpbGwgc2VlIG9uIG5leHQgcGF0Y2ggdmVyc2lvbiB3aGF0IGlzIHRoZSByZXN1bHQuICAg ICAgVGhhdCBwYWdlIGxheW91dCBsb29rczoKPj4gPgo+PiA+TWF5YmUgeW91IGRvbid0IG5lZWQg dG8gc3VwcG9ydCBib3RoIGludGVybmFsIGFuZCBleHRlcm5hbCBETUE/Cj4+ID4KPj4gPkkgYW0g cHJldHR5IHN1cmUgdGhlcmUgYXJlIHJvb21zIGZvciBzaXplIHJlZHVjdGlvbi4KPj4KPj4gSSBk ZXNjcmliZSBob3cgaXQgd29ya3MgaW4gZ2VuZXJhbCBhbmQgbWF5YmUgeW91IGhlbHAgbWUgY2hv c2UgYmV0dGVyIHNvbHV0aW9uLgo+Pgo+PiBIVyBjb250cm9sbGVyIGNhbiB3b3JrIGluIDMgbW9k ZXMuIFBJTyAtIGNhbiB3b3JrIGluIG1hc3RlciBvciBzbGF2ZSBETUEKPj4gQ0RNQSAtIG5lZWRz IE1hc3RlciBETUEgZm9yIGFjY2Vzc2luZyBjb21tYW5kIGRlc2NyaXB0b3JzLgo+PiBHZW5lcmlj IG1vZGUgLSBjYW4gdXNlIG9ubHkgU2xhdmUgRE1BLgo+Pgo+PiBHZW5lcmljIG1vZGUgaXMgbmVj Y2Vzc2VyeSB0byBpbXBsZW1lbnQgZnVuY3Rpb25zIG90aGVyIHRoYW4gcGFnZQo+PiBwcm9ncmFt LCBwYWdlIHJlYWQsIGJsb2NrIGVyYXNlLiBTbyBpdCBpcyBlc3NlbnRpYWwuIEkgY2Fubm90IGF2 b2lkCj4+IHRvIHVzZSBTbGF2ZSBETUEuCj4KPlRoaXMgZGVzZXJ2ZXMgYSBuaWNlIGNvbW1lbnQg YXQgdGhlIHRvcC4KT2sgSSB3aWxsIGFkZCB0aGUgbW9kZXMgZGVzY3JpcHRpb24gdG8gY292ZXIg bGV0dGVyLiAKPgo+Pgo+PiBJIGNoYW5nZSBDRE1BIG1vZGUgdG8gUElPIG1vZGUuIFRoZW4gSSBj YW4gdXNlIG9ubHkgc2xhdmUgRE1BLiBCdXQgQ0RNQSBoYXMgYSBmZWF0dXJlIHdoaWNoIGlzIG5v dCBwcmVzZW50IGluIFBJTyBtb2RlLiBUaGUgZmVhdHVyZQo+PiBnaXZlcyBwb3NzaWJpbGl0eSB0 byBwb2ludCBETUEgZW5naW5lIHR3byBidWZmZXJzIHRvIHRyYW5zZmVyLiBJdCBpcwo+PiB1c2Vk IHRvIHBvaW50IGRhdGEgYnVmZmVyIGFuZCBvb2IgYnVmZXIuIEluIFBJTyBtb2RlIEkgd291bGQg bmVlZCB0bwo+PiBjb3B5IGRhdGEgYnVmZmVyIGFuZCBvb2IgYnVmZmVyIHRvIHRoaXJkIGJ1ZmZl ci4gTmV4dCB0cmFuc2ZlciBkYXRhIGZyb20KPj4gdGhpcmQgYnVmZmVyLgo+PiBJbiB0aGF0IHNv bHV0aW9uIHdlIG5lZWQgdG8gY29weSBhbGwgZGF0YSBieSBDUFUgYW5kIHRoZW4gdXNlIERNQS4g IENvbnRyb2xsZXIgbmVlZHMgYWx3YXlzIHRyYW5zZmVyIG9vYiBiZWNhdXNlIG9mIEhXIEVDQyBy ZXN0cmljdGlvbnMuIFN1Y2ggY2hhbmdlIHdpbGwgZGVjcmVhc2UgcGVyZm9ybWNlIGZvciBhbGwg ZGF0YSB0cmFuc2ZlcnMuCj4+IEkgdGhpbmsgcGVyZm9ybWFuY2UgaXMgbW9yZSBpbXBvcnRhbnQg aW4gdGhhdCBjYXNlLiBXaGF0IGlzIHlvdXIKPj4gb3Bpbmlvbj8gWy4uLl0KPgo+SW5kZWVkCj4K Pj4gPj4gPgo+PiA+PiA+V2hhdCBpcyB0aGlzIGZvcj8KPj4gPj4gRnVjbnRpb25zIGVuYWJsZXMv ZGlzYWJsZXMgaGFyZHdhcmUgZGV0ZWN0aW9uIG9mIGVyYXNlZCBkYXRhCj4+ID4+IHBhZ2VzLiA+ Cj4+ID4KPj4gPk9rLCB0aGUgbmFtZSBpcyBub3QgdmVyeSBleHBsaWNpdCAsIG1heWJlIHlvdSBj b3VsZCB0ZWxsIHRoaXMgd2l0aCBhCj4+ID5jb21tZW50Lgo+PiA+Cj4+IE9rLgo+Pgo+PiA+PiA+ PiArCj4+ID4+ID4+ICsvKiBoYXJkd2FyZSBpbml0aWFsaXphdGlvbiAqLwo+PiA+PiA+PiArc3Rh dGljIGludCBjYWRlbmNlX25hbmRfaHdfaW5pdChzdHJ1Y3QgY2Ruc19uYW5kX2N0cmwgKmNkbnNf Y3RybCkKPj4gPj4gPj4gK3sKPj4gPj4gPj4gKwlpbnQgc3RhdHVzID0gMDsKPj4gPj4gPj4gKwl1 MzIgcmVnOwo+PiA+PiA+PiArCj4+ID4+ID4+ICsJc3RhdHVzID0gY2FkZW5jZV9uYW5kX3dhaXRf Zm9yX3ZhbHVlKGNkbnNfY3RybCwgQ1RSTF9TVEFUVVMsCj4+ID4+ID4+ICsJCQkJCSAgICAgMTAw MDAwMCwKPj4gPj4gPj4gKwkJCQkJICAgICBDVFJMX1NUQVRVU19JTklUX0NPTVAsIGZhbHNlKTsK Pj4gPj4gPj4gKwlpZiAoc3RhdHVzKQo+PiA+PiA+PiArCQlyZXR1cm4gc3RhdHVzOwo+PiA+PiA+ PiArCj4+ID4+ID4+ICsJcmVnID0gcmVhZGwoY2Ruc19jdHJsLT5yZWcgKyBDVFJMX1ZFUlNJT04p Owo+PiA+PiA+PiArCj4+ID4+ID4+ICsJZGV2X2luZm8oY2Ruc19jdHJsLT5kZXYsCj4+ID4+ID4+ ICsJCSAiJXM6IGNhZGVuY2UgbmFuZCBjb250cm9sbGVyIHZlcnNpb24gcmVnICV4XG4iLAo+PiA+ PiA+PiArCQkgX19mdW5jX18sIHJlZyk7Cj4+ID4+ID4+ICsKPj4gPj4gPj4gKwkvKiBkaXNhYmxl IGNhY2hlIGFuZCBtdWx0aXBsYW5lICovCj4+ID4+ID4+ICsJd3JpdGVsKDAsIGNkbnNfY3RybC0+ cmVnICsgTVVMVElQTEFORV9DRkcpOwo+PiA+PiA+PiArCXdyaXRlbCgwLCBjZG5zX2N0cmwtPnJl ZyArIENBQ0hFX0NGRyk7Cj4+ID4+ID4+ICsKPj4gPj4gPj4gKwkvKiBjbGVhciBhbGwgaW50ZXJy dXB0cyAqLwo+PiA+PiA+PiArCXdyaXRlbCgweEZGRkZGRkZGLCBjZG5zX2N0cmwtPnJlZyArIElO VFJfU1RBVFVTKTsKPj4gPj4gPj4gKwo+PiA+PiA+PiArCWNhZGVuY2VfbmFuZF9nZXRfY2Fwcyhj ZG5zX2N0cmwpOwo+PiA+PiA+PiArCWNhZGVuY2VfbmFuZF9yZWFkX2JjaF9jZmcoY2Ruc19jdHJs KTsKPj4gPj4gPgo+PiA+PiA+Tm8sIHlvdSBjYW5ub3QgcmVseSBvbiB0aGUgYm9vdGxvYWRlcidz IGNvbmZpZ3VyYXRpb24uIEFuZCBJIHN1cHBvc2UKPj4gPj4gPnRoaXMgaXMgd2hhdCB0aGUgZmly c3QgY2FsbCB0byByZWFkX2JjaF9jZmcgZG9lcz8KPj4gPj4gSSBkbyBub3QgcmVhbHkgb24gYm9v dCBsb2FkZXIuIEp1c3QgcmVhZCBOQU5EIGZsYXNoCj4+ID4+IGNvbnRyb2xsZXIgY29uZmlndXJh dGlvbiBmcm9tIHJlYWQgb25seSBjYXBhYmlsaXRpZXMgcmVnaXN0ZXJzLgo+PiA+Cj4+ID5Paywg aWYgdGhlc2UgYXJlIFJPIHJlZ2lzdGVycywgaXQncyBmaW5lLiBCdXQgbWF5YmUgZG9uJ3QgY2Fs bCB0aGUKPj4gPmZ1bmN0aW9uICJyZWFkIGJjaCBjb25maWciIHdoaWNoIHN1Z2dlc3QgdGhhdCB0 aGlzIGlzIHNvbWV0aGluZyB5b3UgY2FuCj4+ID5jaGFuZ2UuCj4+ID4KPj4gb2suCj4+Cj4+ID4+ Cj4+ID4+Cj4+ID4+ID4+ICsKPj4gPj4gPj4gKyNkZWZpbmUgVFRfT09CX0FSRUEJCTEKPj4gPj4g Pj4gKyNkZWZpbmUgVFRfTUFJTl9PT0JfQVJFQVMJMgo+PiA+PiA+PiArI2RlZmluZSBUVF9SQVdf UEFHRQkJMwo+PiA+PiA+PiArI2RlZmluZSBUVF9CQk0JCQk0Cj4+ID4+ID4+ICsjZGVmaW5lIFRU X01BSU5fT09CX0FSRUFfRVhUCTUKPj4gPj4gPj4gKwo+PiA+PiA+PiArLyogcHJlcGFyZSBzaXpl IG9mIGRhdGEgdG8gdHJhbnNmZXIgKi8KPj4gPj4gPj4gK3N0YXRpYyBpbnQKPj4gPj4gPj4gK2Nh ZGVuY2VfbmFuZF9wcmVwYXJlX2RhdGFfc2l6ZShzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLAo+PiA+ PiA+PiArCQkJICAgICAgIGludCB0cmFuc2Zlcl90eXBlKQo+PiA+PiA+PiArewo+PiA+PiA+PiAr CXN0cnVjdCBjZG5zX25hbmRfY3RybCAqY2Ruc19jdHJsID0gdG9fY2Ruc19uYW5kX2N0cmwoY2hp cC0+Y29udHJvbGxlcik7Cj4+ID4+ID4+ICsJc3RydWN0IGNkbnNfbmFuZF9jaGlwICpjZG5zX2No aXAgPSB0b19jZG5zX25hbmRfY2hpcChjaGlwKTsKPj4gPj4gPj4gKwl1MzIgc2VjX3NpemUgPSAw LCBsYXN0X3NlY19zaXplLCBvZmZzZXQgPSAwLCBzZWNfY250ID0gMTsKPj4gPj4gPj4gKwl1MzIg ZWNjX3NpemUgPSBjaGlwLT5lY2MuYnl0ZXM7Cj4+ID4+ID4+ICsJdTMyIGRhdGFfY3RybF9zaXpl ID0gMDsKPj4gPj4gPj4gKwl1MzIgcmVnID0gMDsKPj4gPj4gPj4gKwo+PiA+PiA+PiArCWlmIChj ZG5zX2N0cmwtPmN1cnJfdHJhbnNfdHlwZSA9PSB0cmFuc2Zlcl90eXBlKQo+PiA+PiA+PiArCQly ZXR1cm4gMDsKPj4gPj4gPj4gKwo+PiA+PiA+PiArCXN3aXRjaCAodHJhbnNmZXJfdHlwZSkgewo+ PiA+PiA+Cj4+ID4+ID5QbGVhc2UgdHVybiB0aGUgY29udHJvbGxlciBkcml2ZXIgYXMgZHVtYiBh cyBwb3NzaWJsZS4gWW91IHNob3VsZCBub3QKPj4gPj4gPmNhcmUgd2hpY2ggcGFydCBvZiB0aGUg T09CIGFyZWEgeW91IGFyZSBhY2Nlc3NpbmcuCj4+ID4+IEl0IGlzIGEgYml0IGNvbmZ1c2luZyBm b3IgbWUgaG93IGFjY2Vzc2luZyBPT0Igc2hvdWxkIGJlIGltcGxlbWVudGVkLgo+PiA+PiBJIGtu b3cgdGhhdCByZWFkX29vYiBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gY2hlY2sgQkJNIHZhbHVlIHdo ZW4gQkJUIGlzCj4+ID4+IGluaXRpYWxpemVkLiBJdCBpcyBhbHNvIGEgYml0IGNvbmZ1c2luZyBm b3IgbWUgd2h5IHRoZSByYXcgdmVyc2lvbiBpcwo+PiA+PiBub3QgdXNlZCBmb3IgdGhhdCBwdXJw b3NlLiAgICBJbiBjdXJyZW50IGltcGxlbWVudGF0aW9uIGlmIHlvdSB3cml0ZSBvb2IgYnkgd3Jp dGVfcGFnZSBmdW5jdGlvbiBuZXh0Cj4+ID4+IHJlYWQgb29iIGJ5IHJlYWRfb29iIGZ1bmN0aW9u IHRoZW4gZGF0YSB3aWxsIGJlIHRoZSBzYW1lLgo+PiA+PiBJZiBJIGltcGxlbWVudCBkdW1wIGZ1 bmN0aW9ucyByZWFkX29vYiBhbmQgd3JpdGVfb29iIHRoZW4KPj4gPj4gMS4gRUNDIG11c3QgYmUg ZGlzYWJsZWQgZm9yIHRoZXNlIGZ1bmN0aW9ucwo+PiA+PiAyLiBvb2IgZGF0YSBhY2Nlc3Npbmcg Ynkgd3JpdGVfcGFnZS9yZWFkX3BhZ2Ugd2lsbCBiZSBkaWZmZXJlbnQKPj4gPj4gICAgKGRpZmZl cmVudCBvZmZzZXRzKSB0aGF0IHRoZSBkYXRhIGFjY2Vzc2luZyBieSByZWFkX29vYi93cml0ZV9v b2IKPj4gPj4gICAgZnVuY3Rpb25zCj4+ID4KPj4gPk5vLCBJIGZlYXIgdGhpcyBpcyBub3QgYWNj ZXB0YWJsZS4KPj4gPgo+PiA+PiBJZiAgYWJvdmUgZGVzY3JpYmVkICJmdW5jdGlvbmFsaXRpZXMi IGFyZSBhY2NlcHRhYmxlIEkgd2lsbCBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2Ygd3JpdGVfb29i IGFuZCByZWFkX29vYiBmdW5jdGlvbnMuCj4+ID4+IFRoZSB3cml0ZV9wYWdlIGFuZCByZWFkX3Bh Z2UgbXVzdCBiZSBpbXBsZW1lbnRlZCBpbiB0aGF0IHdheSBhcyBpdCBpcyBub3cuICAgIExldCBt ZSBrbm93IHdoaWNoIHNvbHV0aW9uIGlzIHByZWZmZXJlZC4KPj4gPgo+PiA+SWYgdGhpcyBpcyB0 b28gY29tcGxpY2F0ZWQgdG8ganVzdCB3cml0ZSB0aGUgb29iLCB3aHkgbm90IGZhbGxiYWNrIG9u Cj4+ID5yZWFkL3dyaXRlX3BhZ2UgKHdpdGggb29iX3JlcXVpcmVkIGFuZCBhIGR1bW15IGRhdGEg YnVmZmVyKT8KPj4KPj4gSSBjb25zaWRlcmVkIGl0LiBBY3R1YWxseSwgaXQgd291bGQgc2ltcGxp ZnkgdGhlIGNvZGUuIFRoZSBkaXNhZHZhbnRhZ2UKPj4gb2YgdXNpbmcgdGhlIHNhbWUgZnVuY3Rp b24gaXMgdGhhdCB0aGUgZWFjaCB3cml0ZS9yZWFkIG9vYiB3aWxsIGNhdXNlIGZ1bGwgcGFnZQo+ PiByZWFkL3dyaXRlLiBJbiBjdXJyZW50IHZlcnNpb24gb25seSBsYXN0IHNlY3RvciBpcyByZWFk L3dyaXRlIHRvZ2V0aGVyCj4+IHdpdGggb29iLiBUaGlzIHdpbGwgYWZmZWN0IHRoZSBwZXJmb3Jt YW5jZSBkZWdyYWRhdGlvbiBvZiBvb2Igd3JpdGUvcmVhZCBmdW5jdGlvbi4gU28gSSBkbyBub3Qg a25vdyB3aGF0IGlzIG1vcmUgaW1wb3J0YW50LiAxLiBPT0IgZnVuY3Rpb25zIHBlcmZvcm1hbmNl LAo+PiAyLiBzaW1wbGllciBjb2RlLgo+Cj5Ib25lc3RseSBJIGRvbid0IHRoaW5rIHNsb3dpbmcg ZG93biBhIGJpdCBPT0IgYWNjZXNzIGlzIGNyaXRpY2FsIGFzLAo+d2l0aCByZWNlbnQgc29mdHdh cmUgbGF5ZXJzIGxpa2UgVUJJL1VCSUZTIHdlIGRvIG5vdCBhY2Nlc3MgT09CIG9ubHkKPnRoYXQg bXVjaC4gU28gaGVyZSBJIHdvdWxkIGNob29zZSAyLgpPayBzbyBJIHdpbGwgZG8gaXQgYXMgeW91 IHByb3Bvc2UuCj4KPj4+Cj4+ID4+ID4+ICsJY2FzZSBUVF9PT0JfQVJFQToKPj4gPj4gPj4gKwkJ b2Zmc2V0ID0gY2Ruc19jaGlwLT5tYWluX3NpemUgLSBjZG5zX2NoaXAtPnNlY3Rvcl9zaXplOwo+ PiA+PiA+PiArCQllY2Nfc2l6ZSA9IGVjY19zaXplICogKG9mZnNldCAvIGNkbnNfY2hpcC0+c2Vj dG9yX3NpemUpOwo+PiA+PiA+PiArCQlvZmZzZXQgPSBvZmZzZXQgKyBlY2Nfc2l6ZTsKPj4gPj4g Pj4gKwkJc2VjX2NudCA9IDE7Cj4+ID4+ID4+ICsJCWxhc3Rfc2VjX3NpemUgPSBjZG5zX2NoaXAt PnNlY3Rvcl9zaXplCj4+ID4+ID4+ICsJCQkrIGNkbnNfY2hpcC0+YXZhaWxfb29iX3NpemU7Cj4+ ID4+ID4+ICsJCWJyZWFrOwo+PiA+PiA+PiArCWNhc2UgVFRfTUFJTl9PT0JfQVJFQV9FWFQ6Cj4+ ID4+ID4+ICsJCXNlY19jbnQgPSBjZG5zX2NoaXAtPnNlY3Rvcl9jb3VudDsKPj4gPj4gPj4gKwkJ bGFzdF9zZWNfc2l6ZSA9IGNkbnNfY2hpcC0+c2VjdG9yX3NpemU7Cj4+ID4+ID4+ICsJCXNlY19z aXplID0gY2Ruc19jaGlwLT5zZWN0b3Jfc2l6ZTsKPj4gPj4gPj4gKwkJZGF0YV9jdHJsX3NpemUg PSBjZG5zX2NoaXAtPmF2YWlsX29vYl9zaXplOwo+PiA+PiA+PiArCQlicmVhazsKPj4gPj4gPj4g KwljYXNlIFRUX01BSU5fT09CX0FSRUFTOgo+PiA+PiA+PiArCQlzZWNfY250ID0gY2Ruc19jaGlw LT5zZWN0b3JfY291bnQ7Cj4+ID4+ID4+ICsJCWxhc3Rfc2VjX3NpemUgPSBjZG5zX2NoaXAtPnNl Y3Rvcl9zaXplCj4+ID4+ID4+ICsJCQkrIGNkbnNfY2hpcC0+YXZhaWxfb29iX3NpemU7Cj4+ID4+ ID4+ICsJCXNlY19zaXplID0gY2Ruc19jaGlwLT5zZWN0b3Jfc2l6ZTsKPj4gPj4gPj4gKwkJYnJl YWs7Cj4+ID4+ID4+ICsJY2FzZSBUVF9SQVdfUEFHRToKPj4gPj4gPj4gKwkJbGFzdF9zZWNfc2l6 ZSA9IGNkbnNfY2hpcC0+bWFpbl9zaXplICsgY2Ruc19jaGlwLT5vb2Jfc2l6ZTsKPj4gPj4gPj4g KwkJYnJlYWs7Cj4+ID4+ID4+ICsJY2FzZSBUVF9CQk06Cj4+ID4+ID4+ICsJCW9mZnNldCA9IGNk bnNfY2hpcC0+bWFpbl9zaXplICsgY2Ruc19jaGlwLT5iYm1fb2ZmczsKPj4gPj4gPj4gKwkJbGFz dF9zZWNfc2l6ZSA9IDg7Cj4+ID4+ID4+ICsJCWJyZWFrOwo+PiA+PiA+PiArCWRlZmF1bHQ6Cj4+ ID4+ID4+ICsJCWRldl9lcnIoY2Ruc19jdHJsLT5kZXYsICJEYXRhIHNpemUgcHJlcGFyYXRpb24g ZmFpbGVkXG4iKTsKPj4gPj4gPj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4+ID4+ID4+ICsJfQo+PiA+ PiA+PiArCj4+ID4+ID4+ICsJcmVnID0gMDsKPj4gPj4gPj4gKwlyZWcgfD0gRklFTERfUFJFUChU UkFOX0NGR18wX09GRlNFVCwgb2Zmc2V0KTsKPj4gPj4gPj4gKwlyZWcgfD0gRklFTERfUFJFUChU UkFOX0NGR18wX1NFQ19DTlQsIHNlY19jbnQpOwo+PiA+PiA+PiArCXdyaXRlbChyZWcsIGNkbnNf Y3RybC0+cmVnICsgVFJBTl9DRkdfMCk7Cj4+ID4+ID4+ICsKPj4gPj4gPj4gKwlyZWcgPSAwOwo+ PiA+PiA+PiArCXJlZyB8PSBGSUVMRF9QUkVQKFRSQU5fQ0ZHXzFfTEFTVF9TRUNfU0laRSwgbGFz dF9zZWNfc2l6ZSk7Cj4+ID4+ID4+ICsJcmVnIHw9IEZJRUxEX1BSRVAoVFJBTl9DRkdfMV9TRUNU T1JfU0laRSwgc2VjX3NpemUpOwo+PiA+PiA+PiArCXdyaXRlbChyZWcsIGNkbnNfY3RybC0+cmVn ICsgVFJBTl9DRkdfMSk7Cj4+ID4+ID4+ICsKPj4gPj4gPj4gKwlyZWcgPSByZWFkbChjZG5zX2N0 cmwtPnJlZyArIENPTlRST0xfREFUQV9DVFJMKTsKPj4gPj4gPj4gKwlyZWcgJj0gfkNPTlRST0xf REFUQV9DVFJMX1NJWkU7Cj4+ID4+ID4+ICsJcmVnIHw9IEZJRUxEX1BSRVAoQ09OVFJPTF9EQVRB X0NUUkxfU0laRSwgZGF0YV9jdHJsX3NpemUpOwo+PiA+PiA+PiArCXdyaXRlbChyZWcsIGNkbnNf Y3RybC0+cmVnICsgQ09OVFJPTF9EQVRBX0NUUkwpOwo+PiA+PiA+PiArCj4+ID4+ID4+ICsJY2Ru c19jdHJsLT5jdXJyX3RyYW5zX3R5cGUgPSB0cmFuc2Zlcl90eXBlOwo+PiA+PiA+PiArCj4+ID4+ ID4+ICsJcmV0dXJuIDA7Cj4+ID4+ID4+ICt9Cj4+ID4+ID4+ICsKPj4gWy4uLl0gPj4gPj4gKwo+ PiA+PiBbLi4uXSA+PiArCS8qCj4+ID4+ID4+ICsJICogdGhlIGlkZWEgb2YgdGhvc2UgY2FsY3Vs YXRpb24gaXMgdG8gZ2V0IHRoZSBvcHRpbXVtIHZhbHVlCj4+ID4+ID4+ICsJICogZm9yIHRSUCBh bmQgdFJIIHRpbWluZ3MgaWYgaXQgaXMgTk9UIHBvc3NpYmxlIHRvIHNhbXBsZSBkYXRhCj4+ID4+ ID4+ICsJICogd2l0aCBvcHRpbWFsIHRSUC90Ukggc2V0dGluZ3MgdGhlIHBhcmFtZXRlcnMgd2ls bCBiZSBleHRlbmRlZAo+PiA+PiA+PiArCSAqLwo+PiA+PiA+PiArCWlmIChzZHItPnRSQ19taW4g PD0gY2xrX3BlcmlvZCAmJgo+PiA+PiA+PiArCSAgICBzZHItPnRSUF9taW4gPD0gKGNsa19wZXJp b2QgLyAyKSAmJgo+PiA+PiA+PiArCSAgICBzZHItPnRSRUhfbWluIDw9IChjbGtfcGVyaW9kIC8g MikpIHsKPj4gPj4gPgo+PiA+PiA+V2lsbCB0aGlzIHNpdHVhdGlvbiByZWFsbHkgaGFwcGVuPwo+ PiA+PiBJIHRoaW5rIHllcyBmb3IgZm9sbHdpbmcgdmFsdWVzIHRyY19taW4gIDIwMDAwIHBzCj4+ ID4+IHRycF9taW4gIDEwMDAwIHBzCj4+ID4+IHRyZWhfbWluIDcwMDAgIHBzCj4+ID4+IGNsa19w ZXJpb2QgMjAwMDAgcHMKPj4gPgo+PiA+T2ssIHlvdSBtYXkgYWRkIGEgY29tbWVudCBzdGF0aW5n IHRoYXQgdGhpcyBtYXkgYmUgdGhlIGNhc2UgaW4gRURPIG1vZGUKPj4gPjUuCj4+IEkgZGlkIG5v dCBhbndlciBjbGVhcmx5IGxhc3QgdGltZS4gSXQgd2FzIGp1c3QgYW4gZXhhbXBsZS4gVGhlIHJl c3VsdCBvZiB0aGF0ICJpZiIgZGVwZW5kcyBvbiBOQU5EIGZsYXNoIGRldmljZSB0aW1pbmcgbW9k ZSBhbmQgTkFORCBmbGFzaCBjb250cm9sbGVyIGNsb2NrLiBNaW51bXVtIHZhbHVlIG9mIGNsayBp cyAyME1IeiAoNTBucykuIFNvIGl0IG1heSBiZSBhIGNhc2UgZm9yIEFzeW5jaHJvbm91cyBNb2Rl IDEgaWYKPj4gTkFORCBmbGFzaCBjb250cm9sbGVyIGNsb2NrIGlzIDIwTUh6LiBJIHdpbGwgYWRk IHRoaXMgaW5mbyBpbiBjb21tZW50Lgo+Cj5JIGFtIG5vdCBzdXJlIHRvIHVuZGVyc3RhbmQgY29y cmVjdGx5IHdoYXQgeW91IG1lYW4uIFBsZWFzZSB0cnkgdG8KPndyaXRlIGEgbmljZSBjb21tZW50 IGFuZCB3ZSdsbCBzZWUuCk9rLiBJIGFkZGVkIGEgZGVzY3JpcHRpb24gdG8gbGFzdCBwYXRjaCB2 ZXJzaW9uIHY0LiBMZXQgbWUga25vdyBpZiBpdAp3YXMgc3RpbGwgdW5jbGVhci4KPgo+PiA+PiBb Li4uXQo+PiA+PiA+PiArCX0KPj4gPj4gPj4gKwo+PiA+PiA+PiArCWlmIChjZG5zX2N0cmwtPmNh cHMyLmlzX3BoeV90eXBlX2RsbCkgewo+PiA+PiA+Cj4+ID4+ID5JcyB0aGUgZWxzZSBwYXJ0IGFs bG93ZWQ/Cj4+IFJlZ2lzdGVyIGFjY2Vzc2VkIGluIHRoaXMgYmxvY2sgZG9lcyBub3QgZXhpc3Rz IGlmIGlzX3BoeV90eXBlX2RsbCBpcyAwLiBTbyB0aGV5IGFyZSBwcmV2ZXRlZCB0byBiZSBhY2Nl c3NlZC4gdGhlIGVsc2UgaXMgbm90IG5lZWRlZC4KPj4gPj4gPgo+PiA+PiBmb2xsb3dpbmcgcmVn aXN0ZXIgZG9lcyBub3QgZXhpc3QgaWYgY2FwczIuaXNfcGh5X3R5cGVfZGxsIGlzIDAgPj4gKwkJ dTMyIHRwcmVfY250ID0gY2FsY19jeWNsKHRwcmUsIGNsa19wZXJpb2QpOwo+PiA+PiA+PiArCQl1 MzIgdGNkcXNzX2NudCA9IGNhbGNfY3ljbCh0Y2Rxc3MgKyBpZl9za2V3LCBjbGtfcGVyaW9kKTsK Pj4gPj4gPj4gKwkJdTMyIHRwc3RoX2NudCA9IGNhbGNfY3ljbCh0cHN0aCArIGlmX3NrZXcsIGNs a19wZXJpb2QpOwo+PiA+PiA+PiArCj4+ID4+ID4+ICsJCXUzMiB0cnBzdF9jbnQgPSBjYWxjX2N5 Y2wodHJwc3QgKyBpZl9za2V3LCBjbGtfcGVyaW9kKSArIDE7Cj4+ID4+ID4+ICsJCXUzMiB0d3Bz dF9jbnQgPSBjYWxjX2N5Y2wodHdwc3QgKyBpZl9za2V3LCBjbGtfcGVyaW9kKSArIDE7Cj4+ID4+ ID4+ICsJCXUzMiB0Y3Jlc19jbnQgPSBjYWxjX2N5Y2wodGNyZXMgKyBpZl9za2V3LCBjbGtfcGVy aW9kKSArIDE7Cj4+ID4+ID4+ICsJCXUzMiB0Y2Rxc2hfY250ID0gY2FsY19jeWNsKHRjZHFzaCAr IGlmX3NrZXcsIGNsa19wZXJpb2QpICsgNTsKPj4gPj4gPj4gKwo+PiA+PiA+PiArCQl0Y3JfY250 ID0gY2FsY19jeWNsKHRjciArIGlmX3NrZXcsIGNsa19wZXJpb2QpOwo+PiA+PiA+PiArCQkvKgo+ PiA+PiA+PiArCQkgKiBza2V3IG5vdCBpbmNsdWRlZCBiZWNhdXNlIHRoaXMgdGltaW5nIGRlZmlu ZXMgZHVyYXRpb24gb2YKPj4gPj4gPj4gKwkJICogUkUgb3IgRFFTIGJlZm9yZSBkYXRhIHRyYW5z ZmVyCj4+ID4+ID4+ICsJCSAqLwo+PiA+PiA+PiArCQl0cHN0aF9jbnQgPSB0cHN0aF9jbnQgKyAx Owo+PiA+PiA+PiArCQlyZWcgPSBGSUVMRF9QUkVQKFRPR0dMRV9USU1JTkdTMF9UUFNUSCwgdHBz dGhfY250KTsKPj4gPj4gPj4gKwkJcmVnIHw9IEZJRUxEX1BSRVAoVE9HR0xFX1RJTUlOR1MwX1RD RFFTUywgdGNkcXNzX2NudCk7Cj4+ID4+ID4+ICsJCXJlZyB8PSBGSUVMRF9QUkVQKFRPR0dMRV9U SU1JTkdTMF9UUFJFLCB0cHJlX2NudCk7Cj4+ID4+ID4+ICsJCXJlZyB8PSBGSUVMRF9QUkVQKFRP R0dMRV9USU1JTkdTMF9UQ1IsIHRjcl9jbnQpOwo+PiA+PiA+PiArCQl0LT50b2dnbGVfdGltaW5n c18wID0gcmVnOwo+PiA+PiA+PiArCQlkZXZfZGJnKGNkbnNfY3RybC0+ZGV2LCAiVE9HR0xFX1RJ TUlOR1NfMF9TRFJcdCV4XG4iLCByZWcpOwo+PiA+PiA+PiArCj4+ID4+ID4+ICsJCS8vdG9nZ2xl X3RpbWluZ3NfMSAtIHRSUFNULHRXUFNUCj4+ID4+ID4+ICsJCXJlZyA9IEZJRUxEX1BSRVAoVE9H R0xFX1RJTUlOR1MxX1RDRFFTSCwgdGNkcXNoX2NudCk7Cj4+ID4+ID4+ICsJCXJlZyB8PSBGSUVM RF9QUkVQKFRPR0dMRV9USU1JTkdTMV9UQ1JFUywgdGNyZXNfY250KTsKPj4gPj4gPj4gKwkJcmVn IHw9IEZJRUxEX1BSRVAoVE9HR0xFX1RJTUlOR1MxX1RSUFNULCB0cnBzdF9jbnQpOwo+PiA+PiA+ PiArCQlyZWcgfD0gRklFTERfUFJFUChUT0dHTEVfVElNSU5HUzFfVFdQU1QsIHR3cHN0X2NudCk7 Cj4+ID4+ID4+ICsJCXQtPnRvZ2dsZV90aW1pbmdzXzEgPSByZWc7Cj4+ID4+ID4+ICsJCWRldl9k YmcoY2Ruc19jdHJsLT5kZXYsICJUT0dHTEVfVElNSU5HU18xX1NEUlx0JXhcbiIsIHJlZyk7Cj4+ ID4+ID4+ICsJfQo+PiA+PiBbLi4uXSA+Cj4+ID4+ID5UaGlzIGZ1bmN0aW9uIGlzIHNvIGNvbXBs aWNhdGVkICEhISBIb3cgY2FuIHRoaXMgZXZlbiB3b3JrPyBSZWFsbHksIGl0Cj4+ID4+ID5pcyBo YXJkIHRvIGdldCBpbnRvIHRoZSBjb2RlIGFuZCBmb2xsb3csIEkgYW0gc3VyZSB5b3UgY2FuIGRv Cj4+ID4+ID5zb21ldGhpbmcuCj4+ID4+IFllcyBpdCBpcyBjb21wbGljYXRlZCBidXQgd29ya3Ms IEkgd2lsbCB0cnkgdG8gc2ltcGxpZnkgaXQuLi4gICBbLi4uXQo+PiA+Cj4+ID5ZZXMgcGxlYXNl IQo+PiA+Cj4+ID4+ID4+ICsJCQkJIkNTICVkIGFscmVhZHkgYXNzaWduZWRcbiIsIGNzKTsKPj4g Pj4gPj4gKwkJCXJldHVybiAtRUlOVkFMOwo+PiA+PiA+PiArCQl9Cj4+ID4+ID4+ICsKPj4gPj4g Pj4gKwkJY2Ruc19jaGlwLT5jc1tpXSA9IGNzOwo+PiA+PiA+PiArCX0KPj4gPj4gPj4gKwo+PiA+ PiA+PiArCWNoaXAgPSAmY2Ruc19jaGlwLT5jaGlwOwo+PiA+PiA+PiArCWNoaXAtPmNvbnRyb2xs ZXIgPSAmY2Ruc19jdHJsLT5jb250cm9sbGVyOwo+PiA+PiA+PiArCW5hbmRfc2V0X2ZsYXNoX25v ZGUoY2hpcCwgbnApOwo+PiA+PiA+PiArCj4+ID4+ID4+ICsJbXRkID0gbmFuZF90b19tdGQoY2hp cCk7Cj4+ID4+ID4+ICsJbXRkLT5kZXYucGFyZW50ID0gY2Ruc19jdHJsLT5kZXY7Cj4+ID4+ID4+ ICsKPj4gPj4gPj4gKwkvKgo+PiA+PiA+PiArCSAqIERlZmF1bHQgdG8gSFcgRUNDIGVuZ2luZSBt b2RlLiBJZiB0aGUgbmFuZC1lY2MtbW9kZSBwcm9wZXJ0eSBpcyBnaXZlbgo+PiA+PiA+PiArCSAq IGluIHRoZSBEVCBub2RlLCB0aGlzIGVudHJ5IHdpbGwgYmUgb3ZlcndyaXR0ZW4gaW4gbmFuZF9z Y2FuX2lkZW50KCkuCj4+ID4+ID4+ICsJICovCj4+ID4+ID4+ICsJY2hpcC0+ZWNjLm1vZGUgPSBO QU5EX0VDQ19IVzsKPj4gPj4gPj4gKwo+PiA+PiA+PiArCS8qCj4+ID4+ID4+ICsJICogU2F2ZSBh IHJlZmVyZW5jZSB2YWx1ZSBmb3IgdGltaW5nIHJlZ2lzdGVycyBiZWZvcmUKPj4gPj4gPj4gKwkg KiAtPnNldHVwX2RhdGFfaW50ZXJmYWNlKCkgaXMgY2FsbGVkLgo+PiA+PiA+PiArCSAqLwo+PiA+ PiA+PiArCWNhZGVuY2VfbmFuZF9nZXRfdGltaW5ncyhjZG5zX2N0cmwsICZjZG5zX2NoaXAtPnRp bWluZ3MpOwo+PiA+PiA+Cj4+ID4+ID5Zb3UgY2Fubm90IHJlbHkgb24gdGhlIEJvb3Rsb2FkZXIn cyBjb25maWd1cmF0aW9uLiBUaGlzIGRyaXZlciBzaG91bGQKPj4gPj4gPmRlcml2ZSBpdC4KPj4g Pj4gSSBkbyBub3QgcmVsYXkgb24gdGhlIEJvb3Rsb2FkZXIncyBjb25maWd1cmF0aW9uIGluIGFu eSBwYXJ0LiBJIGp1c3QKPj4gPj4gaW5pdCB0aW1pbmdzIHN0cnVjdHVyZSBiYXNlIG9uIGN1cnJl bnQgdmFsdWVzIG9mIHJlZ2lzdGVycyB0byBkbyBub3QKPj4gPj4gICBoYXZlIHJ1YmlzaCBpbiB0 aW1pbmcgc3RydWN0dXJlLiBWYWx1ZXMgd2lsbCBiZSBjYWxjdWxhdGVkIGJ5IGRyaXZlciB3aGVu Cj4+ID4+IHNldHVwX2RhdGFfaW50ZXJmYWNlIGlzIGNhbGxlZC4gSW4gY2FzZSBzZXRfdGltaW5n cyBpcyBjYWxsZWQgYmVmb3JlCj4+ID4+IHNldHVwX2RhdGFfaW50ZXJmYWNlCj4+ID4KPj4gPkRv ZXMgdGhpcyByZWFsbHkgaGFwcGVucz8gSSBhbSBwcmV0dHkgc3VyZSBpdCBpcyB0YWtlbiBjYXJl IG9mIGJ5IHRoZQo+PiA+Y29yZS4gSSBkb24ndCB0aGluayB5b3Ugc2hvdWxkIHJlbHkgb24gd2hh dCdzIGluIHRoZSByZWdpc3RlcnMgYXQgYm9vdAo+PiA+dGltZS4KPj4gT2sgSSB3aWxsIGNoZWNr IGl0IG9uZSBtb3JlIHRpbWUgYW5kIHJlbW92ZSBpZiBub3QgbmVlZGVkLgo+Pgo+PiA+Cj4+ID4K Pj4gPj4gdGhlbiB3ZSB3cml0ZSB0aGUgc2FtZSB2YWx1cyB0byB0aW1pbmcgcmVnaXN0ZXJzCj4+ ID4+IHdoaWNoIGFyZSBwcmVzZXQgaW4gcmVnaXN0cmVzLiBUbyBiZSBzaG9ydGVyIHRpbWluZyBy ZWdpc3RlcnMgd2lsbCBzdGF5Cj4+ID4+IHVuY2hhbmdlZC4gID4+ICsJcmV0ID0gbmFuZF9zY2Fu KGNoaXAsIGNkbnNfY2hpcC0+bnNlbHMpOwo+PiA+PiA+PiArCWlmIChyZXQpIHsKPj4gPj4gPj4g KwkJZGV2X2VycihjZG5zX2N0cmwtPmRldiwgImNvdWxkIG5vdCBzY2FuIHRoZSBuYW5kIGNoaXBc biIpOwo+PiA+PiA+PiArCQlyZXR1cm4gcmV0Owo+PiA+PiA+PiArCX0KPj4gPj4gPj4gKwo+PiA+ PiA+PiArCXJldCA9IG10ZF9kZXZpY2VfcmVnaXN0ZXIobXRkLCBOVUxMLCAwKTsKPj4gPj4gPj4g KwlpZiAocmV0KSB7Cj4+ID4+ID4+ICsJCWRldl9lcnIoY2Ruc19jdHJsLT5kZXYsCj4+ID4+ID4+ ICsJCQkiZmFpbGVkIHRvIHJlZ2lzdGVyIG10ZCBkZXZpY2U6ICVkXG4iLCByZXQpOwo+PiA+PiA+ PiArCQluYW5kX3JlbGVhc2UoY2hpcCk7Cj4+ID4+ID4KPj4gPj4gPkkgdGhpbmsgeW91IHNob3Vs ZCBjYWxsIG5hbmRfY2xlYW51cCBpbnN0ZWFkIG9mIG5hbmRfcmVsZWFzZSBoZXJlIGhhcwo+PiA+ PiA+dGhlIG10ZCBkZXZpY2UgaXMgbm90IHJlZ2lzdGVyZWQgeWV0Lgo+PiBvawo+Pgo+PiA+PiA+ PiArCQlyZXR1cm4gcmV0Owo+PiA+PiA+PiArCX0KPj4gPj4gPj4gKwo+PiA+PiA+PiArCWxpc3Rf YWRkX3RhaWwoJmNkbnNfY2hpcC0+bm9kZSwgJmNkbnNfY3RybC0+Y2hpcHMpOwo+PiA+PiA+PiAr Cj4+ID4+ID4+ICsJcmV0dXJuIDA7Cj4+ID4+ID4+ICt9Cj4+ID4+ID4+ICsKPj4gPj4gPj4gK3N0 YXRpYyBpbnQgY2FkZW5jZV9uYW5kX2NoaXBzX2luaXQoc3RydWN0IGNkbnNfbmFuZF9jdHJsICpj ZG5zX2N0cmwpCj4+ID4+ID4+ICt7Cj4+ID4+ID4+ICsJc3RydWN0IGRldmljZV9ub2RlICpucCA9 IGNkbnNfY3RybC0+ZGV2LT5vZl9ub2RlOwo+PiA+PiA+PiArCXN0cnVjdCBkZXZpY2Vfbm9kZSAq bmFuZF9ucDsKPj4gPj4gPj4gKwlpbnQgbWF4X2NzID0gY2Ruc19jdHJsLT5jYXBzMi5tYXhfYmFu a3M7Cj4+ID4+ID4+ICsJaW50IG5jaGlwczsKPj4gPj4gPj4gKwlpbnQgcmV0Owo+PiA+PiA+PiAr Cj4+ID4+ID4+ICsJbmNoaXBzID0gb2ZfZ2V0X2NoaWxkX2NvdW50KG5wKTsKPj4gPj4gPj4gKwo+ PiA+PiA+PiArCWlmIChuY2hpcHMgPiBtYXhfY3MpIHsKPj4gPj4gPj4gKwkJZGV2X2VycihjZG5z X2N0cmwtPmRldiwKPj4gPj4gPj4gKwkJCSJ0b28gbWFueSBOQU5EIGNoaXBzOiAlZCAobWF4ID0g JWQgQ1MpXG4iLAo+PiA+PiA+PiArCQkJbmNoaXBzLCBtYXhfY3MpOwo+PiA+PiA+PiArCQlyZXR1 cm4gLUVJTlZBTDsKPj4gPj4gPj4gKwl9Cj4+ID4+ID4+ICsKPj4gPj4gPj4gKwlmb3JfZWFjaF9j aGlsZF9vZl9ub2RlKG5wLCBuYW5kX25wKSB7Cj4+ID4+ID4+ICsJCXJldCA9IGNhZGVuY2VfbmFu ZF9jaGlwX2luaXQoY2Ruc19jdHJsLCBuYW5kX25wKTsKPj4gPj4gPj4gKwkJaWYgKHJldCkgewo+ PiA+PiA+PiArCQkJb2Zfbm9kZV9wdXQobmFuZF9ucCk7Cj4+ID4+ID4+ICsJCQlyZXR1cm4gcmV0 Owo+PiA+PiA+PiArCQl9Cj4+ID4+ID4KPj4gPj4gPklmIG5hbmRfY2hpcF9pbml0KCkgZmFpbHMg b24gYW5vdGhlciBjaGlwIHRoYW4gdGhlIGZpcnN0IG9uZSwgdGhlcmUgaXMKPj4gPj4gPnNvbWUg Z2FyYmFnZSBjb2xsZWN0aW9uIHRvIGRvLgo+PiBvawo+Pgo+PiA+PiA+PiArCX0KPj4gPj4gPj4g Kwo+PiA+PiA+PiArCXJldHVybiAwOwo+PiA+PiA+PiArfQo+PiA+PiA+PiArCj4+ID4+ID4+ICtz dGF0aWMgaW50IGNhZGVuY2VfbmFuZF9pbml0KHN0cnVjdCBjZG5zX25hbmRfY3RybCAqY2Ruc19j dHJsKQo+PiA+PiA+PiArewo+PiA+PiA+PiArCWRtYV9jYXBfbWFza190IG1hc2s7Cj4+ID4+ID4+ ICsJaW50IHJldCA9IDA7Cj4+ID4+ID4+ICsKPj4gPj4gPj4gKwljZG5zX2N0cmwtPmNkbWFfZGVz YyA9IGRtYV9hbGxvY19jb2hlcmVudChjZG5zX2N0cmwtPmRldiwKPj4gPj4gPj4gKwkJCQkJCSAg c2l6ZW9mKCpjZG5zX2N0cmwtPmNkbWFfZGVzYyksCj4+ID4+ID4+ICsJCQkJCQkgICZjZG5zX2N0 cmwtPmRtYV9jZG1hX2Rlc2MsCj4+ID4+ID4+ICsJCQkJCQkgIEdGUF9LRVJORUwpOwo+PiA+PiA+ PiArCWlmICghY2Ruc19jdHJsLT5kbWFfY2RtYV9kZXNjKQo+PiA+PiA+PiArCQlyZXR1cm4gLUVO T01FTTsKPj4gPj4gPj4gKwo+PiA+PiA+PiArCWNkbnNfY3RybC0+YnVmX3NpemUgPSAxNiAqIDEw MjQ7Cj4+ID4+ID4KPj4gPj4gPnMvMTAyNC9TWl8xSy8KPj4gPj4gPgo+PiA+PiA+PiArCWNkbnNf Y3RybC0+YnVmID0ga21hbGxvYyhjZG5zX2N0cmwtPmJ1Zl9zaXplLCBHRlBfS0VSTkVMKTsKPj4g Pj4gPgo+PiA+PiA+SWYgeW91IHVzZSBrbWFsbG9jIGhlcmUgdGhlbiB0aGlzIGJ1ZmZlciB3aWxs IGFsd2F5cyBiZSBETUEtYWJsZSwKPj4gPj4gPnJpZ2h0Pwo+PiA+PiBSaWdodCBJIGhhdmUgc2Vl biBzdWNoIHNvbHV0aW9uIGluIGFub3RoZXIgZHJpdmVyLgo+PiA+Pgo+PiA+Pgo+PiA+PiBUaGFu a3MgZm9yIHJldmlldmluZyB0aGlzIHBhdGNoLiBQbGVhc2UgYW5zd2VyIG9uIG15IHF1ZXN0aW9u IGhvdyB3cml0ZV9vb2IKPj4gPj4gYW5kIHJlYWRfb29iIGZ1bmN0aW9ucyBzaG91bGQgYmUgaW1w bGVtZW50ZWQuCj4+ID4+Cj4+ID4+ID4KPj4gPj4gPgo+PiA+PiA+VGhhbmtzLAo+PiA+PiA+TWlx dcOobAo+PiA+Pgo+PiA+PiAgIFRoYW5rcwo+PiA+PiBQaW90ciBTcm9rYQo+PiA+Cj4+ID5UaGFu a3MsCj4+ID5NaXF1w6hsCj4+Cj4+IFRoYW5rcwo+PiBQaW90cgo+Cj5UaGFua3MsCj5NaXF1w6hs CgpUaGFua3MsClBpb3RyIAoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fCkxpbnV4IE1URCBkaXNjdXNzaW9uIG1haWxpbmcgbGlzdApodHRwOi8v bGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LW10ZC8K 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_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 1B81CC0650E for ; Mon, 1 Jul 2019 09:53:04 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id CA03E212F5 for ; Mon, 1 Jul 2019 09:53:03 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=cadence.com header.i=@cadence.com header.b="ieaExeNa"; dkim=pass (1024-bit key) header.d=cadence.com header.i=@cadence.com header.b="Onr0Xg2p" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727457AbfGAJxC (ORCPT ); Mon, 1 Jul 2019 05:53:02 -0400 Received: from mx0a-0014ca01.pphosted.com ([208.84.65.235]:49412 "EHLO mx0a-0014ca01.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726967AbfGAJxC (ORCPT ); Mon, 1 Jul 2019 05:53:02 -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 x619l3BX015873; Mon, 1 Jul 2019 02:52:03 -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=V/dBgr4DAKXxjCZVyabs7FtjjI59AJ588mSgcsPIhfc=; b=ieaExeNaso2pclAafcUMaphrhXCb16fjgNqKOcI3fsNr5gH79lEzk3Vt/b4cfPHe0mwg s7s7qU5XFBJG/3APei8o1VGDfJjFO49NAejmCpqxXHFCcYQKoONHBTx6R7H14ZBi4Shr Vha4a8pulw3zHjbfOYK2X1DKlptwEXRJR68eRwHrakbj7dgLT5EgP4mzHvJIQAANauEi V6KKBrS2uAyatGh+iJhUZ3TZ1u361ycQunlwi5Gx6I+PVcD7pAh6AmUnXRvgSKyjX425 yLDs6W1n4phNyqPEHKLqxx7gMA0IbAoHDotgB8uXbtIKb5gWAy+HIrQ4+sJQ7UL1h+Zb 9A== Authentication-Results: cadence.com; spf=pass smtp.mailfrom=piotrs@cadence.com Received: from nam04-bn3-obe.outbound.protection.outlook.com (mail-bn3nam04lp2057.outbound.protection.outlook.com [104.47.46.57]) by mx0a-0014ca01.pphosted.com with ESMTP id 2te4hwedp2-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Mon, 01 Jul 2019 02:52:02 -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=V/dBgr4DAKXxjCZVyabs7FtjjI59AJ588mSgcsPIhfc=; b=Onr0Xg2pWK5cNRbpStqPFmbbnHLmILNwiXZpdvwWpmf5w6EcFWJmBww3t6mSYq8vzDnX6kwJ10fxn9EWi8z/ew8ev+zhj5fxSJFZG3Om7CuNKHWxZr+zV2C13fgANs1qb97iC9uT0xwS0hGOhEdBVqC43d9sdD8+mxghEFRBdDs= Received: from BN8PR07CA0026.namprd07.prod.outlook.com (2603:10b6:408:ac::39) by BL0PR07MB5569.namprd07.prod.outlook.com (2603:10b6:208:8a::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2032.18; Mon, 1 Jul 2019 09:51:59 +0000 Received: from DM3NAM05FT044.eop-nam05.prod.protection.outlook.com (2a01:111:f400:7e51::201) by BN8PR07CA0026.outlook.office365.com (2603:10b6:408:ac::39) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.2008.16 via Frontend Transport; Mon, 1 Jul 2019 09:51:59 +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 DM3NAM05FT044.mail.protection.outlook.com (10.152.98.157) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.2052.8 via Frontend Transport; Mon, 1 Jul 2019 09:51:58 +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 x619ptID008807 (version=TLSv1/SSLv3 cipher=AES256-SHA bits=256 verify=OK); Mon, 1 Jul 2019 02:51:55 -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; Mon, 1 Jul 2019 02:51:52 -0700 Date: Mon, 1 Jul 2019 10:51:45 +0100 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: <20190701095143.GA21903@global.cadence.com> References: <20190219161406.4340-1-piotrs@cadence.com> <20190219161823.22466-1-piotrs@cadence.com> <20190305190954.6c38d681@xps13> <20190321093356.GA19577@global.cadence.com> <20190512142426.11453a6c@xps13> <20190606151948.GA10565@global.cadence.com> <20190627181542.131aa061@xps13> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8"; format=flowed Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20190627181542.131aa061@xps13> User-Agent: Mutt/1.5.20 (2009-12-10) X-Originating-IP: [158.140.32.37] X-ClientProxiedBy: mailsj6.global.cadence.com (158.140.32.112) 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)(4636009)(136003)(346002)(376002)(396003)(39860400002)(2980300002)(199004)(189003)(36092001)(4326008)(6116002)(3846002)(14444005)(5024004)(53416004)(305945005)(246002)(8936002)(426003)(336012)(8676002)(7416002)(7736002)(7636002)(186003)(16526019)(47776003)(2870700001)(50466002)(67846002)(229853002)(316002)(486006)(54906003)(58126008)(26005)(6286002)(66066001)(2906002)(6246003)(6916009)(33656002)(11346002)(956004)(476003)(126002)(446003)(55016002)(2486003)(23676004)(7696005)(386003)(76176011)(70586007)(1076003)(70206006)(86362001)(356004)(6666004)(26826003)(76130400001)(5660300002)(478600001)(66574012)(30864003);DIR:OUT;SFP:1101;SCL:1;SRVR:BL0PR07MB5569;H:sjmaillnx1.cadence.com;FPR:;SPF:SoftFail;LANG:en;PTR:corp.cadence.com;A:1;MX:1; X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 45b55ac1-44d7-4e15-8185-08d6fe09c277 X-Microsoft-Antispam: BCL:0;PCL:0;RULEID:(2390118)(7020095)(4652040)(8989299)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(5600148)(711020)(4605104)(1401327)(2017052603328)(7193020);SRVR:BL0PR07MB5569; X-MS-TrafficTypeDiagnostic: BL0PR07MB5569: X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:4714; X-Forefront-PRVS: 00851CA28B X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam-Message-Info: 3NwcwJMrWeyuhLNk4cFTR+uksyrIqz/pWSrGdF4Bf6/1Rnk+R9ckinS1mfFcNYw9mbTsBhqiu1qoKg0o8qqGFN7uDAS39UjJr5tbPI/nDBLLoBU4BzzgHxJK/prja29kOIeVncYkSjM8YBt1UNWkIaZB9yW1v+k0o8YFhneGj9v1FCOXX3a2uC0e4IthFmk0Usd+6fpYzVutXP1E3JR2gYIO3qrEKdEhvDMQndczpLgR4evQ8kZaYmpXoqC30ROMlaM1LstgwIJZtg+uDoBjlHEg3GMnH9SI/Qhu/O/IfEIlqaQhUFMiD925z2B56r+6WXQtmND2O7tMyMAfISn5QHs2rxTN0Pt89qyyxOfMeMdgfF+kONzon+nuZGesydpolRCMFpvHzMooCnAb6eTypQZtUpE3zgc8qRj1szQeqQ4= X-OriginatorOrg: cadence.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Jul 2019 09:51:58.1909 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 45b55ac1-44d7-4e15-8185-08d6fe09c277 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: BL0PR07MB5569 X-Proofpoint-SPF-Result: pass X-Proofpoint-SPF-Record: v=spf1 include:spf.smktg.jp 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-07-01_08:,, signatures=0 X-Proofpoint-Spam-Details: rule=outbound_check_notspam policy=outbound_check score=0 priorityscore=1501 malwarescore=0 suspectscore=0 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-1907010121 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The 06/27/2019 18:15, Miquel Raynal wrote: >EXTERNAL MAIL > > >Hi Piotr, > >Piotr Sroka wrote on Thu, 6 Jun 2019 16:19:51 >+0100: > >> Hi Miquel >> >> >> The 05/12/2019 14:24, Miquel Raynal wrote: >> >EXTERNAL MAIL >> > >> > >> >EXTERNAL MAIL >> > >> > >> >Hi Piotr, >> > >> >Sorry for de delay. >> > >> >Piotr Sroka wrote on Thu, 21 Mar 2019 09:33:58 >> >+0000: >> > >> >> 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: >> > >> >Maybe you don't need to support both internal and external DMA? >> > >> >I am pretty sure there are rooms for size reduction. >> >> I describe how it works in general and maybe you help me chose better solution. >> >> HW controller can work in 3 modes. PIO - can work in master or slave DMA >> CDMA - needs Master DMA for accessing command descriptors. >> Generic mode - can use only Slave DMA. >> >> Generic mode is neccessery to implement functions other than page >> program, page read, block erase. So it is essential. I cannot avoid >> to use Slave DMA. > >This deserves a nice comment at the top. Ok I will add the modes description to cover letter. > >> >> I change CDMA mode to PIO mode. Then I can use only slave DMA. But CDMA has a feature which is not present in PIO mode. The feature >> gives possibility to point DMA engine two buffers to transfer. It is >> used to point data buffer and oob bufer. In PIO mode I would need to >> copy data buffer and oob buffer to third buffer. Next transfer data from >> third buffer. >> In that solution we need to copy all data by CPU and then use DMA. Controller needs always transfer oob because of HW ECC restrictions. Such change will decrease performce for all data transfers. >> I think performance is more important in that case. What is your >> opinion? [...] > >Indeed > >> >> > >> >> >What is this for? >> >> Fucntions enables/disables hardware detection of erased data >> >> pages. > >> > >> >Ok, the name is not very explicit , maybe you could tell this with a >> >comment. >> > >> Ok. >> >> >> >> + >> >> >> +/* 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. >> > >> >Ok, if these are RO registers, it's fine. But maybe don't call the >> >function "read bch config" which suggest that this is something you can >> >change. >> > >> ok. >> >> >> >> >> >> >> >> + >> >> >> +#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 >> > >> >No, I fear this is not acceptable. >> > >> >> 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. >> > >> >If this is too complicated to just write the oob, why not fallback on >> >read/write_page (with oob_required and a dummy data buffer)? >> >> I considered it. Actually, it would simplify the code. The disadvantage >> of using the same function is that the each write/read oob will cause full page >> read/write. In current version only last sector is read/write together >> with oob. This will affect the performance degradation of oob write/read function. So I do not know what is more important. 1. OOB functions performance, >> 2. simplier code. > >Honestly I don't think slowing down a bit OOB access is critical as, >with recent software layers like UBI/UBIFS we do not access OOB only >that much. So here I would choose 2. Ok so I will do it as you propose. > >>> >> >> >> + 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; >> >> >> +} >> >> >> + >> [...] >> >> + >> >> [...] >> + /* >> >> >> + * 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 >> > >> >Ok, you may add a comment stating that this may be the case in EDO mode >> >5. >> I did not anwer clearly last time. It was just an example. The result of that "if" depends on NAND flash device timing mode and NAND flash controller clock. Minumum value of clk is 20MHz (50ns). So it may be a case for Asynchronous Mode 1 if >> NAND flash controller clock is 20MHz. I will add this info in comment. > >I am not sure to understand correctly what you mean. Please try to >write a nice comment and we'll see. Ok. I added a description to last patch version v4. Let me know if it was still unclear. > >> >> [...] >> >> >> + } >> >> >> + >> >> >> + if (cdns_ctrl->caps2.is_phy_type_dll) { >> >> > >> >> >Is the else part allowed? >> Register accessed in this block does not exists if is_phy_type_dll is 0. So they are preveted to be accessed. the else is not needed. >> >> > >> >> 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... [...] >> > >> >Yes please! >> > >> >> >> + "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 >> > >> >Does this really happens? I am pretty sure it is taken care of by the >> >core. I don't think you should rely on what's in the registers at boot >> >time. >> Ok I will check it one more time and remove if not needed. >> >> > >> > >> >> 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. >> ok >> >> >> >> + 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. >> ok >> >> >> >> + } >> >> >> + >> >> >> + 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 >> > >> >Thanks, >> >Miquèl >> >> Thanks >> Piotr > >Thanks, >Miquèl Thanks, Piotr