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=-15.3 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS,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 6D684C64E7D for ; Sat, 28 Nov 2020 22:03:56 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 0639724073 for ; Sat, 28 Nov 2020 22:03:56 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=microchip.com header.i=@microchip.com header.b="I+1VuhoF"; dkim=pass (1024-bit key) header.d=microchiptechnology.onmicrosoft.com header.i=@microchiptechnology.onmicrosoft.com header.b="EFT6GKdA" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2387522AbgK1Vur (ORCPT ); Sat, 28 Nov 2020 16:50:47 -0500 Received: from esa4.microchip.iphmx.com ([68.232.154.123]:62953 "EHLO esa4.microchip.iphmx.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725616AbgK1SWQ (ORCPT ); Sat, 28 Nov 2020 13:22:16 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=microchip.com; i=@microchip.com; q=dns/txt; s=mchp; t=1606587734; x=1638123734; h=from:to:cc:subject:date:message-id:references: in-reply-to:content-id:content-transfer-encoding: mime-version; bh=zUK7lKqm1/HIcwQxDs8ov1pg/U7VYtZjxlpEvvshpSw=; b=I+1VuhoFX3VyHjjdRPEHqd1ZU5Zj3GXr9cMPdSC0CNcc4cSW9xdQCldZ B+8PQuWowPpyelb4HxGSZebFwyigyNdzcy78Q0vJ1p9DgoChG5eKAbWCF 4XLY+Dn/9WH6Z4eUV04ZH2CoqcCQoMAGHeea6O+aUUYrkG2FLj7RZUCNg Z46KIoOTWvMpZ23N/futCc+KO2AshttmXF2oFrPOdI48I+KSFXlJxTkoK Zi0WQ+mxqcC33/+MT29kwUu6aEwFTFQ6MiCvPhyy5vA62BjWIkpiN5mdb u7bnjZEMMMKmQJjQrFIZ08sqVU9FM4LhznOM7k6FBHCkJs6EHJxYzffcp w==; IronPort-SDR: v+7HzRm6ZU3GkPV64kRGD16/7scyvd2vYdqcHz0ty8cK1vNbtM2HF6uxhNLg4g1GQc3su7FKMi QtntPtKQiTji9A9sGVVlUJKzSa/P4fp+hSBTxOSbJIlZVmRM0VAIsC3YFPAUgiJ9Mnxjp8GB+Y 2w16EzQfeV4aeLyypeGU3GOwUuC2RUorQDPSN05VwYaklmrFmdkaQZGWbsI3MNvgSxDNDdPxrG /GDBxxasFqefzcEk7u8xb39h/VRt6Z9CclwDdN3Ncv2A4bObmUcUpear76MugJejgEXlp/I2ue Y+A= X-IronPort-AV: E=Sophos;i="5.78,377,1599548400"; d="scan'208";a="95101537" Received: from smtpout.microchip.com (HELO email.microchip.com) ([198.175.253.82]) by esa4.microchip.iphmx.com with ESMTP/TLS/AES256-SHA256; 28 Nov 2020 03:17:24 -0700 Received: from chn-vm-ex02.mchp-main.com (10.10.85.144) by chn-vm-ex01.mchp-main.com (10.10.85.143) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.1979.3; Sat, 28 Nov 2020 03:17:24 -0700 Received: from NAM10-DM6-obe.outbound.protection.outlook.com (10.10.215.89) by email.microchip.com (10.10.87.72) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.1979.3 via Frontend Transport; Sat, 28 Nov 2020 03:17:24 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Hj0+pwuggbpCsjwcUV2fbzscL7dk/s2lprGJ2nhjgOWZy9O6ZQ1Cu7txrgrhqUbCbaiOyDzS/dQb47Jc09g2/eTwXLSA3h0ynQzCBTrcXyyLhfmAtqY6orpgyw4iG1FbfaesT8aO7Lp47dTN0AwVXOxyQ1xCS/NPvdKJcf/aH2vgyTV//F/u4dQM4hIu+vDszQR7Emq3N8Su5464H8vd0FlZOX2LAM3299k8O+m2ED/NjhIoMRs9Cieri0TSnxYFDYf2MAghk+1Ox53VzypnCEEFWBEEr+QdCDDG+un8piz0A0dRR9/3tdiqYc/m+vCCingQXfTOaVZg0Yfru8aWFw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=zUK7lKqm1/HIcwQxDs8ov1pg/U7VYtZjxlpEvvshpSw=; b=jytvcUz6+8g6xs2cBq9s5LJhl+HpvS2QgTG3J7cvaBU0toZkj115qbWzhe4dgzM13Tc2Jf4cFEDjvEImLRWIpfB2JdJPrfMTtFdWNFLBea9xgZtjc8L4bzrWcdDJczBdVTXkuDIBBvXFQLNSOBayRmFpLUBDuJkjQUanDo8FJwd7DRCC09Q8uXEGncA+ywsYccBJFDsYRLgDZb9rRvWSy5cwPzeLKQcs9a7vuHUB+ralQ1AmHCKf/OXuvIyjWplqUvYJ8Uf6oJv9DuDcUm+5KUxIHkMTVkRaLJUPzwA6k1LXLRtFN3ZmD/erQcXnyHc9oFdzfpDZPabWz/hW6kqypg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=microchip.com; dmarc=pass action=none header.from=microchip.com; dkim=pass header.d=microchip.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=microchiptechnology.onmicrosoft.com; s=selector2-microchiptechnology-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=zUK7lKqm1/HIcwQxDs8ov1pg/U7VYtZjxlpEvvshpSw=; b=EFT6GKdAiC/RwrrVFOWpALIQWFffmgP7BnFgn/ojBkLykBxMpS927ITpHRfJeek4ST/X73gnNZokcYprNhKwlbZmu9ZI8iPM7dy8zWWDVtKl8dhNHCCtbYehGLrRNH9ZiwJafJ0KAQPMeReBIKDji4F6+k9iY+mlFw2RqYMpZ8Y= Received: from SA2PR11MB4874.namprd11.prod.outlook.com (2603:10b6:806:f9::23) by SA2PR11MB5100.namprd11.prod.outlook.com (2603:10b6:806:119::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3611.20; Sat, 28 Nov 2020 10:17:21 +0000 Received: from SA2PR11MB4874.namprd11.prod.outlook.com ([fe80::6903:3212:cc9e:761]) by SA2PR11MB4874.namprd11.prod.outlook.com ([fe80::6903:3212:cc9e:761%7]) with mapi id 15.20.3611.026; Sat, 28 Nov 2020 10:17:20 +0000 From: To: , , CC: , , , Subject: Re: [PATCH v6 5/5] mtd: spi-nor: keep lock bits if they are non-volatile Thread-Topic: [PATCH v6 5/5] mtd: spi-nor: keep lock bits if they are non-volatile Thread-Index: AQHWxW+nmejBYVo+OESi/M9WLE7bHw== Date: Sat, 28 Nov 2020 10:17:20 +0000 Message-ID: <432b31a7-2560-3b83-44d2-aa82c2e322ae@microchip.com> References: <20201126202614.5710-1-michael@walle.cc> <20201126202614.5710-6-michael@walle.cc> In-Reply-To: <20201126202614.5710-6-michael@walle.cc> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: user-agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.10.0 authentication-results: walle.cc; dkim=none (message not signed) header.d=none;walle.cc; dmarc=none action=none header.from=microchip.com; x-originating-ip: [79.115.63.172] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: cc047ac6-9203-4686-8071-08d89386caca x-ms-traffictypediagnostic: SA2PR11MB5100: x-microsoft-antispam-prvs: x-bypassexternaltag: True x-ms-oob-tlc-oobclassifiers: OLM:10000; x-ms-exchange-senderadcheck: 1 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: cL/rzWhFxHSxl90neM+tOM1ZsQbHV21TBsWggBOhDQ+5yzGVyugXpniTnzQh0u/fYjpc04pMBxPt0RtYxQLecufnFnvmCfqCk7+KUNn8hz8zr8H/iUYCrk+Oe0iwsZBlE0Mwh6L2AIIjttNLnWoSi5n8yOAJaGyPwFMma7XIvzfWn+zze9DhmG6wCcGQZAZb2q+KbZIeE3/D22JTp+1OZD5wescYNHctSUUcP73USaT0Ru8RP5cQBeRSHNquI04P26abbUI64OSsy26D4Einn6EY7zPXe5qh0TOASyNBJqeg1pWY1SjMF7pLaqydQPNY4wTe1r8WU63C9OrwsjA6cmF9eFUP248opZhT7BBrHFf6dE+wz5qptv2gBqXGiX0z x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SA2PR11MB4874.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(136003)(346002)(366004)(39850400004)(376002)(396003)(6486002)(110136005)(54906003)(316002)(83380400001)(71200400001)(478600001)(6512007)(2906002)(8936002)(2616005)(30864003)(8676002)(5660300002)(66946007)(186003)(66476007)(53546011)(31696002)(64756008)(6506007)(26005)(66556008)(36756003)(66446008)(31686004)(86362001)(4326008)(76116006)(43740500002)(579004)(559001);DIR:OUT;SFP:1101; x-ms-exchange-antispam-messagedata: =?utf-8?B?Q1dZUk4rN2JKbFJxckEycW1FeUVaQTdmRkZuY28xSzNVUXhTNkZsTk9rTTk5?= =?utf-8?B?bzdwTjRhdzF0bXB0R0pPV2VxMjBlVzB1b0wwN0ZaSWdYTkpyRHA0ZXdNQXJD?= =?utf-8?B?bUl3eWpPd2hndXV0NGRhd3UvY0tBczFtTm1wMWRQN2VxZWNFMjVqbGk4d0Ex?= =?utf-8?B?ZHRUQURPYXRFK05MV1VNbUZHOXhiVUFvV3NKbk1WVWtsbmswa3F0KzBzRVhP?= =?utf-8?B?YzBNOEpheXFqTWwyUkl2czZsYTk1dUhqdkVkeGlvZ3h3REhyVStMVTBScXRv?= =?utf-8?B?dFk1Mk8wZFNuU25TOEFjZkdWM2t4bzI3YXM3cG9TSnZGbEZPZUZFOG9KNk4x?= =?utf-8?B?cWp0dm5icUh0Tk5TNDVHQVFpNHdKVFZySzAxV3EvK2ZSakRaZGM5RGdXZkJx?= =?utf-8?B?SjYrc1dINXRiVm1zWXZKUUk1d3c3MEZZTTdMZmdoNytCR3dYN212OENBNFNa?= =?utf-8?B?N29aMWRoK0t6SHhaVG5CYmkxdkU4NUVtVlpKNHh1MjI4WWNXU0J6ejFlS1N0?= =?utf-8?B?c3FxYmNZV0ovdktuTkgyV3Y2ZEZxMEc2cjk5T0s1UERreUhrVlZGUGFQNE1D?= =?utf-8?B?ZURyQ3dsYXJFcGl0Unh3K2Q4eDFyVDRoaWlZYkhKK1lXd25INjhpYytxWTVo?= =?utf-8?B?NnZyUjZma3ZVQnNoVU9CY3o0MkM5aE91WlVXVC9yMTJRZ0lpUGQ4SldEZWgx?= =?utf-8?B?Q01mMVZ6Y3QvdjRiYVBhWG9NVzhhK0dhNy9zb0hSOVhTRzM1a2NYcE5lcm53?= =?utf-8?B?eTNiKzBWSFMxM05oaEZwL2Q2UEQwamtINmx6ME1QdTB1TldSeHEwMTE3cHlF?= =?utf-8?B?YzJHR0tKTUErTk1pYXRWWkRnVnRDY0JpUUJURm8xR3h5b2RkNjg5bkErMmI2?= =?utf-8?B?Z0ZBVmdGMUVlbGtPMk9hd1crbE5rMk0zVlZRSldIOCtacHZtZ0ZMeElIRS9U?= =?utf-8?B?bno1VXgrNnk3OThvVnVncW9UVW9hdGFsV2JNMkxLSlozYldqdFg3S2FKUHZu?= =?utf-8?B?V250WXBuMmRPNDNhSVljNjA5ZVJhTXJDelBqQVRNRXE2cWc1SE5udkdkNUJv?= =?utf-8?B?b3p3eCtndWJuZEpFSjdtRHRUZGNKUnFFNXd5Sjd5UXRNUHFMZ3pwSy9OUWxp?= =?utf-8?B?RzBEcGphUXpueWhXeXQ4a3BlWWFNcWZxN3l5SW1EVmN1ZlY3bHNKZFg2Y21z?= =?utf-8?B?TGt5YUwyTFl1bE1PcXJaU0tFNWNnMVo1V292N05PVVlhK3M4ZmNvN2tNYlVZ?= =?utf-8?B?a3dZdU1RYk9DdnRTak9HRlIrS094dmc2MUxucHFDMDdPTzNReWJHdTJyeWph?= =?utf-8?Q?ONh5ZFAEDv0gQ=3D?= x-ms-exchange-transport-forked: True Content-Type: text/plain; charset="utf-8" Content-ID: Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: SA2PR11MB4874.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: cc047ac6-9203-4686-8071-08d89386caca X-MS-Exchange-CrossTenant-originalarrivaltime: 28 Nov 2020 10:17:20.7874 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 3f4057f3-b418-4d4e-ba84-d55b4e897d88 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: BLu+ipo/aZHZMRhDnv9YUKWXVa+iocKYm6jMcHZKxMQtms5GhsibhcjWPdjO4BchDVNIc9gophv8Bh4c2wJcM2lbzB1gZc/u3F43nW7pnOY= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA2PR11MB5100 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org T24gMTEvMjYvMjAgMTA6MjYgUE0sIE1pY2hhZWwgV2FsbGUgd3JvdGU6DQo+IEVYVEVSTkFMIEVN QUlMOiBEbyBub3QgY2xpY2sgbGlua3Mgb3Igb3BlbiBhdHRhY2htZW50cyB1bmxlc3MgeW91IGtu b3cgdGhlIGNvbnRlbnQgaXMgc2FmZQ0KPiANCj4gVHJhZGl0aW9uYWxseSwgbGludXggdW5sb2Nr cyB0aGUgd2hvbGUgZmxhc2ggYmVjYXVzZSB0aGVyZSBhcmUgbGVnYWN5DQo+IGRldmljZXMgd2hp Y2ggaGFzIHRoZSB3cml0ZSBwcm90ZWN0aW9ucyBiaXRzIHNldCBieSBkZWZhdWx0IGF0IHN0YXJ0 dXAuDQo+IElmIHlvdSBhY3R1YWxseSB3YW50IHRvIHVzZSB0aGUgZmxhc2ggcHJvdGVjdGlvbiBi aXRzLCBlZy4gYmVjYXVzZSB0aGVyZQ0KPiBpcyBhIHJlYWQtb25seSBwYXJ0IGZvciBhIGJvb3Rs b2FkZXIsIHRoaXMgYXV0b21hdGljIHVubG9ja2luZyBpcw0KPiBoYXJtZnVsLiBJZiB0aGVyZSBp cyBubyBoYXJkd2FyZSB3cml0ZSBwcm90ZWN0aW9uIGluIHBsYWNlICh1c3VhbGx5DQo+IGNhbGxl ZCBXUCMpLCBhIHN0YXJ0dXAgb2YgdGhlIGtlcm5lbCBqdXN0IGRpc2NhcmRzIHRoaXMgcHJvdGVj dGlvbi4NCj4gDQo+IEkndmUgZ29uZSB0aHJvdWdoIHRoZSBkYXRhc2hlZXRzIG9mIGFsbCB0aGUg Zmxhc2hlcyAoZXhjZXB0IHRoZSBJbnRlbA0KPiBvbmVzIHdoZXJlIEkgY291bGQgbm90IGZpbmQg YW55IGRhdGFzaGVldCBub3IgcmVmZXJlbmNlKSB3aGljaCBzdXBwb3J0cw0KPiB0aGUgdW5sb2Nr aW5nIGZlYXR1cmUgYW5kIGxvb2tlZCBob3cgdGhlIHNlY3RvciBwcm90ZWN0aW9uIHdhcw0KPiBp bXBsZW1lbnRlZC4gVGhlIGN1cnJlbnRseSBzdXBwb3J0ZWQgZmxhc2hlcyBjYW4gYmUgZGl2aWRl ZCBpbnRvIHRoZQ0KPiBmb2xsb3dpbmcgdHdvIGNhdGVnb3JpZXM6DQo+ICAoMSkgYmxvY2sgcHJv dGVjdGlvbiBiaXRzIGFyZSBub24tdm9sYXRpbGUuIFRodXMgdGhleSBrZWVwIHRoZWlyIHZhbHVl cw0KPiAgICAgIGF0IHJlc2V0IGFuZCBwb3dlci1jeWNsZQ0KPiAgKDIpIGZsYXNoZXMgd2hlcmUg dGhlc2UgYml0cyBhcmUgdm9sYXRpbGUuIEFmdGVyIHJlc2V0IG9yIHBvd2VyLWN5Y2xlLA0KPiAg ICAgIHRoZSB3aG9sZSBtZW1vcnkgYXJyYXkgaXMgcHJvdGVjdGVkLg0KPiAgICAgIChhKSBzb21l IGRldmljZXMgbmVlZHMgYSBzcGVjaWFsICJHbG9iYWwgVW5wcm90ZWN0IiBjb21tYW5kLCBlZy4N Cj4gICAgICAgICAgdGhlIEF0bWVsIEFUMjVERjA0MUEuDQo+ICAgICAgKGIpIHNvbWUgZGV2aWNl cyByZXF1aXJlIHRvIGNsZWFyIHRoZSBCUG4gYml0cyBpbiB0aGUgc3RhdHVzDQo+ICAgICAgICAg IHJlZ2lzdGVyLg0KPiANCj4gRHVlIHRvIHRoZSByZWFzb25zIGFib3ZlLCB3ZSBkbyBub3Qgd2Fu dCB0byBjbGVhciB0aGUgYml0cyBmb3IgZmxhc2hlcw0KPiB3aGljaCBiZWxvbmcgdG8gY2F0ZWdv cnkgKDEpLiBGb3J0dW5hdGVseSBmb3IgdXMsIG9ubHkgQXRtZWwgZmxhc2hlcw0KPiBmYWxsIGlu dG8gY2F0ZWdvcnkgKDJhKS4gSW1wbGVtZW50IHRoZSAiR2xvYmFsIFByb3RlY3QiIGFuZCAiR2xv YmFsDQo+IFVucHJvdGVjdCIgY29tbWFuZHMgZm9yIHRoZXNlLiBGb3IgKDJiKSB3ZSBjYW4gdXNl IG5vcm1hbCBibG9jaw0KPiBwcm90ZWN0aW9uIGxvY2tpbmcgc2NoZW1lLg0KPiANCj4gVGhpcyBw YXRjaCBhZGRzIGEgbmV3IGZsYWcgdG8gaW5kaWNhdGUgdGhlIGNhc2UgKDIpLiBPbmx5IGlmIHdl IGhhdmUNCj4gc3VjaCBhIGZsYXNoIHdlIHVubG9jayB0aGUgd2hvbGUgZmxhc2ggYXJyYXkuIFRv IGJlIGJhY2t3YXJkcyBjb21wYXRpYmxlDQo+IGl0IGFsc28gaW50cm9kdWNlcyBhIGtlcm5lbCBj b25maWd1cmF0aW9uIG9wdGlvbiB3aGljaCByZXN0b3JlcyB0aGUNCj4gY29tcGxldGUgbGVnYWN5 IGJlaGF2aW9yICgiRGlzYWJsZSB3cml0ZSBwcm90ZWN0aW9uIG9uIGFueSBmbGFzaGVzIikuDQo+ IEhvcGVmdWxseSwgdGhpcyB3aWxsIGNsZWFuIHVwICJ1bmxvY2sgdGhlIGVudGlyZSBmbGFzaCBm b3IgbGVnYWN5DQo+IGRldmljZXMiIG9uY2UgYW5kIGZvciBhbGwuDQo+IA0KPiBGb3IgcmVmZXJl bmNlIGhlcmUgYXJlIHRoZSBhY3R1YWxseSBjb21taXRzIHdoaWNoIGludHJvZHVjZWQgdGhlIGxl Z2FjeQ0KPiBiZWhhdmlvdXIgKGFuZCBleHRlbmRlZCB0aGUgYmVoYXZpb3VyIHRvIG90aGVyIGNo aXAgbWFudWZhY3R1cmVycyk6DQoNCnR5cG86IGJlaGF2aW9yDQoNCj4gDQo+IGNvbW1pdCBmODBl NTIxYzkxNmNiICgibXRkOiBtMjVwODA6IGFkZCBzdXBwb3J0IGZvciB0aGUgSW50ZWwvTnVtb255 eCB7MTYsMzIsNjR9MFMzM0IgU1BJIGZsYXNoIGNoaXBzIikNCj4gY29tbWl0IGVhNjA2NThhMDhm OGYgKCJtdGQ6IG0yNXA4MDogZGlzYWJsZSBTU1Qgc29mdHdhcmUgcHJvdGVjdGlvbiBiaXRzIGJ5 IGRlZmF1bHQiKQ0KPiBjb21taXQgNzIyODk4MjQ0MjM2NSAoIltNVERdIG0yNXA4MDogZml4IGJ1 ZyAtIEFUbWVsIHNwaSBmbGFzaCBmYWlscyB0byBiZSBjb3BpZWQgdG8iKQ0KPiANCj4gQWN0dWFs bHksIHRoaXMgbWlnaHQgYWxzbyBmaXggaGFuZGxpbmcgb2YgdGhlIEF0bWVsIEFUMjVERiBmbGFz aGVzLA0KPiBiZWNhdXNlIHRoZSBvcmlnaW5hbCBjb21taXQgNzIyODk4MjQ0MjM2NSAoIltNVERd IG0yNXA4MDogZml4IGJ1ZyAtDQo+IEFUbWVsIHNwaSBmbGFzaCBmYWlscyB0byBiZSBjb3BpZWQg dG8iKSB3YXMgd3JpdGluZyBhIDAgdG8gdGhlIHN0YXR1cw0KPiByZWdpc3Rlciwgd2hpY2ggaXMg YSAiR2xvYmFsIFVucHJvdGVjdCIuIFRoaXMgbWlnaHQgbm90IGJlIHRoZSBjYXNlIGluDQo+IHRo ZSBjdXJyZW50IGNvZGUgd2hpY2ggb25seSBoYW5kbGVzIHRoZSBibG9jayBwcm90ZWN0aW9uIGJp dHMgQlAyLCBCUDENCj4gYW5kIEJQMC4gVGh1cywgaXQgZGVwZW5kcyBvbiB0aGUgY3VycmVudCBj b250ZW50cyBvZiB0aGUgc3RhdHVzIHJlZ2lzdGVyDQo+IGlmIHRoaXMgdW5sb2NrIGFjdHVhbGx5 IGNvcnJlc3BvbmRzIHRvIGEgIkdsb2JhbCBVbnByb3RlY3QiIGNvbW1hbmQuIEluDQo+IHRoZSB3 b3JzdCBjYXNlLCB0aGUgY3VycmVudCBjb2RlIG1pZ2h0IGxlYXZlIHRoZSBBVDI1REYgZmxhc2hl cyBpbiBhDQo+IHdyaXRlIHByb3RlY3RlZCBzdGF0ZS4NCj4gDQo+IFRoZSBjb21taXQgMTkxZjVj MmVkNGI2ZiAoIm10ZDogc3BpLW5vcjogdXNlIDE2LWJpdCBXUlIgY29tbWFuZCB3aGVuIFFFDQo+ IGlzIHNldCBvbiBzcGFuc2lvbiBmbGFzaGVzIikgY2hhbmdlZCB0aGF0IGJlaGF2aW91ciBieSBq dXN0IGNsZWFyaW5nIEJQMg0KPiB0byBCUDAgaW5zdGVhZCBvZiB3cml0aW5nIGEgMCB0byB0aGUg c3RhdHVzIHJlZ2lzdGVyLg0KPiANCj4gRnVydGhlciwgdGhlIGNvbW1pdCAzZTA5MzBmMTA5ZTc2 ICgibXRkOiBzcGktbm9yOiBSZXdvcmsgdGhlIGRpc2FibGluZw0KPiBvZiBibG9jayB3cml0ZSBw cm90ZWN0aW9uIikgZXhwYW5kZWQgdGhlIHVubG9ja19hbGwoKSBmZWF0dXJlIHRvIEFOWQ0KPiBm bGFzaCB3aGljaCBzdXBwb3J0cyBsb2NraW5nLg0KPiANCj4gU2lnbmVkLW9mZi1ieTogTWljaGFl bCBXYWxsZSA8bWljaGFlbEB3YWxsZS5jYz4NCj4gLS0tDQo+IGNoYW5nZXMgc2luY2UgdjU6DQo+ ICAtIGFsc28gc2V0IFNSV0QgYml0IGZvciB0aGUgIkdsb2JhbCBQcm90ZWN0IiBjb21tYW5kDQo+ ICAtIHVzZSBzcGlfbm9yX3dyaXRlX3NyKCkgaW5zdGVhZCBvZiBzcGlfbm9yX3dyaXRlX3NyX2Fu ZF9jaGVjaygpIHRvIHNlbmQNCj4gICAgdGhlICJHbG9iYWwgUHJvdGVjdCIgb3IgIkdsb2JhbCBV bnByb3RlY3QiIGNvbW1hbmQNCj4gIC0gbWFyayBFU01UIEYyNUwzMlFBIGFzIG5vbi12b2xhdGls ZSBhcyBpbmRpY2F0ZWQgaW4gYSBuZXdlciBkYXRhc2hlZXQNCj4gICAgcmV2aXNpb24NCj4gIC0g cmViYXNlZCB0byBsYXRlc3QgdHJlZQ0KPiANCj4gY2hhbmdlcyBzaW5jZSB2NDoNCj4gIC0gbWFk ZSBhdG1lbF9nbG9iYWxfcHJvdGVjdGlvbl9kZWZhdWx0X2luaXQoKSBzdGF0aWMsIHNwb3R0ZWQg YnkNCj4gICAgbGtwQGludGVsLmNvbQ0KPiANCj4gY2hhbmdlcyBzaW5jZSB2MzoNCj4gIC0gbm93 IGRlZmF1bHRpbmcgdG8gTVREX1NQSV9OT1JfV1BfRElTQUJMRV9PTl9WT0xBVElMRSwgc3VnZ2Vz dGVkIGJ5IFZpZ25lc2gNCj4gIC0gcmVzdG9yZWQgdGhlIG9yaWdpbmFsIHNwaV9ub3JfdW5sb2Nr X2FsbCgpLCBpbnN0ZWFkIGFkZCBpbmRpdmlkdWFsDQo+ICAgIGxvY2tpbmcgb3BzIGZvciB0aGUg Ikdsb2JhbCBQcm90ZWN0IiBzY2hlbWUgaW4gYXRtZWwuYy4gVGhpcyB3YXMgdGVzdGVkDQo+ICAg IHBhcnRseSB3aXRoIHRoZSBBVDI1U0wzMjEgKGZvciB0aGUgdGVzdCBJIGFkZGVkIHRoZSBmaXh1 cHMgdG8gdGhpcw0KPiAgICBmbGFzaCkuDQo+ICAtIHJlbmFtZWQgU1BJX05PUl9VTlBST1RFQ1Qg dG8gU1BJX05PUl9XUF9JU19WT0xBVElMRS4gU3VnZ2VzdGVkIGJ5DQo+ICAgIFZpbmdlc2gsIGFs dGhvdWdoIEkndmUgcmVuYW1lZCBpdCB0byBhIG1vcmUgZ2VuZXJhbCAiV1BfSVNfVk9MQVRJTEUi DQo+ICAgIGJlY2F1c2UgZWl0aGVyIHRoZSBCUCBiaXRzIG9yIHRoZSBpbmRpdmlkdWFsIHNlY3Rv ciBsb2NrcyBtaWdodCBiZQ0KPiAgICB2b2xhdGlsZS4NCj4gIC0gYWRkIG1lbnRpb24gb2YgYm90 aCBibG9jayBwcm90ZWN0aW9uIGJpdHMgYW5kICJHbG9iYWwgVW5wcm90ZWN0IiBjb21tYW5kDQo+ ICAgIGluIHRoZSBLY29uZmlnIGhlbHAgdGV4dC4NCj4gDQo+IGNoYW5nZXMgc2luY2UgdjI6DQo+ ICAtIGFkZCBLY29uZmlnIG9wdGlvbiB0byBiZSBhYmxlIHRvIHJldGFpbiBsZWdhY3kgYmVoYXZp b3VyDQo+ICAtIHJlYmFzZWQgdGhlIHBhdGNoIGR1ZSB0byB0aGUgc3BpLW5vciByZXdyaXRlDQo+ ICAtIGRyb3BwZWQgdGhlIEZpeGVzOiB0YWcsIGl0IGRvZW5zJ3QgbWFrZSBzZW5zZSBhZnRlciB0 aGUgc3BpLW5vciByZXdyaXRlDQo+ICAtIG1lbnRpb24gY29tbWl0IDNlMDkzMGYxMDllNzYgd2hp Y2ggZnVydGhlciBtb2RpZmllZCB0aGUgdW5sb2NrDQo+ICAgIGJlaGF2aW91ci4NCj4gDQo+IGNo YW5nZXMgc2luY2UgdjE6DQo+ICAtIGNvbXBsZXRlbHkgcmV3cm90ZSBwYXRjaCwgdGhlIGZpcnN0 IHZlcnNpb24gdXNlZCBhIGRldmljZSB0cmVlIGZsYWcNCj4gDQo+ICBkcml2ZXJzL210ZC9zcGkt bm9yL0tjb25maWcgfCAgNDIgKysrKysrKysrKysrDQo+ICBkcml2ZXJzL210ZC9zcGktbm9yL2F0 bWVsLmMgfCAxMjcgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKy0tDQo+ICBkcml2 ZXJzL210ZC9zcGktbm9yL2NvcmUuYyAgfCAgMzYgKysrKysrLS0tLQ0KPiAgZHJpdmVycy9tdGQv c3BpLW5vci9jb3JlLmggIHwgICA4ICsrKw0KPiAgZHJpdmVycy9tdGQvc3BpLW5vci9lc210LmMg IHwgICAyICstDQo+ICBkcml2ZXJzL210ZC9zcGktbm9yL2ludGVsLmMgfCAgIDkgKystDQo+ICBk cml2ZXJzL210ZC9zcGktbm9yL3NzdC5jICAgfCAgMjEgKysrLS0tDQo+ICA3IGZpbGVzIGNoYW5n ZWQsIDIxMyBpbnNlcnRpb25zKCspLCAzMiBkZWxldGlvbnMoLSkNCj4gDQo+IGRpZmYgLS1naXQg YS9kcml2ZXJzL210ZC9zcGktbm9yL0tjb25maWcgYi9kcml2ZXJzL210ZC9zcGktbm9yL0tjb25m aWcNCj4gaW5kZXggZmZjNGIzODBmMmIxLi4xMWU2NjU4ZWU4NWQgMTAwNjQ0DQo+IC0tLSBhL2Ry aXZlcnMvbXRkL3NwaS1ub3IvS2NvbmZpZw0KPiArKysgYi9kcml2ZXJzL210ZC9zcGktbm9yL0tj b25maWcNCj4gQEAgLTI0LDYgKzI0LDQ4IEBAIGNvbmZpZyBNVERfU1BJX05PUl9VU0VfNEtfU0VD VE9SUw0KPiAgICAgICAgICAgUGxlYXNlIG5vdGUgdGhhdCBzb21lIHRvb2xzL2RyaXZlcnMvZmls ZXN5c3RlbXMgbWF5IG5vdCB3b3JrIHdpdGgNCj4gICAgICAgICAgIDQwOTYgQiBlcmFzZSBzaXpl IChlLmcuIFVCSUZTIHJlcXVpcmVzIDE1IEtpQiBhcyBhIG1pbmltdW0pLg0KPiANCj4gK2Nob2lj ZQ0KPiArICAgICAgIHByb21wdCAiV3JpdGUgcHJvdGVjdGlvbiBhdCBib290Ig0KPiArICAgICAg IGRlZmF1bHQgTVREX1NQSV9OT1JfV1BfRElTQUJMRV9PTl9WT0xBVElMRQ0KPiArDQo+ICtjb25m aWcgTVREX1NQSV9OT1JfV1BfRElTQUJMRQ0KDQpNYXliZSBpdCdzIGp1c3QgbWUsIGJ1dCB3aGVu IEkgc2VlIFdQLCBJIHRoaW5rIGFib3V0IHRoZSBXUCMgc2lnbmFsLCB3aGljaCBpcw0Kc29tZWhv dyByZWxhdGVkLiBJIHRoaW5rIEkgd291bGQgcHJlZmVyIHRvIHVzZSAgU1dQIGluc3RlYWQsIHdo aWNoIGNvbWVzIGZyb20NClNvZnR3YXJlIFdyaXRlIFByb3RlY3Rpb24sIHdoaWNoIHNob3VsZCBi ZSBnb29kIGZvciBib3RoIHRoZSBCUG4gcHJvdGVjdGlvbg0KYW5kIGZvciB0aGUgSW5kaXZpZHVh bCBTZWN0b3IgUHJvdGVjdGlvbiB3aXRoIGl0cyBHbG9iYWwgTG9jayBhbmQgVW5sb2NrLg0KDQpJ IHdvbid0IHN0YWxsIHRoZSBzZXJpZXMganVzdCBmb3IgdGhpcywgc28gZG8gYXMgeW91IHByZWZl ci4NCg0KPiArICAgICAgIGJvb2wgIkRpc2FibGUgV1Agb24gYW55IGZsYXNoZXMgKGxlZ2FjeSBi ZWhhdmlvdXIpIg0KDQp0eXBvOiBiZWhhdmlvcg0KDQo+ICsgICAgICAgaGVscA0KPiArICAgICAg ICAgVGhpcyBvcHRpb24gZGlzYWJsZXMgdGhlIHdyaXRlIHByb3RlY3Rpb24gb24gYW55IFNQSSBm bGFzaGVzIGF0DQoNCklmIHlvdSdsbCBjaG9vc2UgU1dQLCB5b3UgaGF2ZSB0byB1cGRhdGUgZGVz Y3JpcHRpb24gaGVyZSBhbmQgdGhlcmUuIEZvcg0KZXhhbXBsZSBzL3dyaXRlIHByb3RlY3Rpb24v c29mdHdhcmUgd3JpdGUgcHJvdGVjdGlvbi4NCg0KPiArICAgICAgICAgYm9vdC11cC4NCj4gKw0K PiArICAgICAgICAgRGVwZW5kaW5nIG9uIHRoZSBmbGFzaCBjaGlwIHRoaXMgZWl0aGVyIGNsZWFy cyB0aGUgYmxvY2sgcHJvdGVjdGlvbg0KPiArICAgICAgICAgYml0cyBvciBkb2VzIGEgIkdsb2Jh bCBVbnByb3RlY3QiIGNvbW1hbmQuDQo+ICsNCj4gKyAgICAgICAgIERvbid0IHVzZSB0aGlzIGlm IHlvdSBpbnRlbnQgdG8gdXNlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIG9mIHlvdXINCj4gKyAgICAg ICAgIFNQSSBmbGFzaC4gVGhpcyBpcyBvbmx5IHRvIGtlZXAgYmFja3dhcmRzIGNvbXBhdGliaWxp dHkuDQo+ICsNCj4gK2NvbmZpZyBNVERfU1BJX05PUl9XUF9ESVNBQkxFX09OX1ZPTEFUSUxFDQo+ ICsgICAgICAgYm9vbCAiRGlzYWJsZSBXUCBvbiBmbGFzaGVzIHcvIHZvbGF0aWxlIHByb3RlY3Rp b24gYml0cyINCj4gKyAgICAgICBoZWxwDQo+ICsgICAgICAgICBTb21lIFNQSSBmbGFzaGVzIGhh dmUgdm9sYXRpbGUgYmxvY2sgcHJvdGVjdGlvbiBiaXRzLCBpZS4gYWZ0ZXIgYQ0KPiArICAgICAg ICAgcG93ZXItdXAgb3IgYSByZXNldCB0aGUgZmxhc2ggaXMgd3JpdGUgcHJvdGVjdGVkIGJ5IGRl ZmF1bHQuDQo+ICsNCj4gKyAgICAgICAgIFRoaXMgb3B0aW9uIGRpc2FibGVzIHRoZSB3cml0ZSBw cm90ZWN0aW9uIGZvciB0aGVzZSBraW5kIG9mIGZsYXNoZXMNCj4gKyAgICAgICAgIHdoaWxlIGtl ZXBpbmcgaXQgZW5hYmxlZCBmb3IgYW55IG90aGVyIFNQSSBmbGFzaGVzIHdoaWNoIGhhdmUNCj4g KyAgICAgICAgIG5vbi12b2xhdGlsZSB3cml0ZSBwcm90ZWN0aW9uIGJpdHMuDQo+ICsNCj4gKyAg ICAgICAgIElmIHRoZSB3cml0ZSBwcm90ZWN0aW9uIHdpbGwgYmUgZGlzYWJsZWQgZGVwZW5kaW5n IG9uIHRoZSBmbGFzaA0KPiArICAgICAgICAgZWl0aGVyIHRoZSBibG9jayBwcm90ZWN0aW9uIGJp dHMgYXJlIGNsZWFyZWQgb3IgYSAiR2xvYmFsIFVucHJvdGVjdCINCj4gKyAgICAgICAgIGNvbW1h bmQgaXMgaXNzdWVkLg0KPiArDQo+ICsgICAgICAgICBJZiB5b3UgYXJlIHVuc3VyZSwgc2VsZWN0 IHRoaXMgb3B0aW9uLg0KPiArDQo+ICtjb25maWcgTVREX1NQSV9OT1JfV1BfS0VFUA0KPiArICAg ICAgIGJvb2wgIktlZXAgd3JpdGUgcHJvdGVjdGlvbiBhcyBpcyINCj4gKyAgICAgICBoZWxwDQo+ ICsgICAgICAgICBJZiB5b3Ugc2VsZWN0IHRoaXMgb3B0aW9uIHRoZSB3cml0ZSBwcm90ZWN0aW9u IG9mIGFueSBTUEkgZmxhc2hlcw0KPiArICAgICAgICAgd2lsbCBub3QgYmUgY2hhbmdlZC4gSWYg eW91ciBmbGFzaCBpcyB3cml0ZSBwcm90ZWN0ZWQgb3Igd2lsbCBiZQ0KPiArICAgICAgICAgYXV0 b21hdGljYWxseSB3cml0ZSBwcm90ZWN0ZWQgYWZ0ZXIgcG93ZXItdXAgeW91IGhhdmUgdG8gbWFu dWFsbHkNCj4gKyAgICAgICAgIHVubG9jayBpdCBiZWZvcmUgeW91IGFyZSBhYmxlIHRvIHdyaXRl IHRvIGl0Lg0KPiArDQo+ICtlbmRjaG9pY2UNCj4gKw0KPiAgc291cmNlICJkcml2ZXJzL210ZC9z cGktbm9yL2NvbnRyb2xsZXJzL0tjb25maWciDQo+IA0KPiAgZW5kaWYgIyBNVERfU1BJX05PUg0K PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvc3BpLW5vci9hdG1lbC5jIGIvZHJpdmVycy9tdGQv c3BpLW5vci9hdG1lbC5jDQo+IGluZGV4IGZlNmE0NjUzODIzZC4uMjE1ZGY3YzQyNzJiIDEwMDY0 NA0KPiAtLS0gYS9kcml2ZXJzL210ZC9zcGktbm9yL2F0bWVsLmMNCj4gKysrIGIvZHJpdmVycy9t dGQvc3BpLW5vci9hdG1lbC5jDQo+IEBAIC04LDYgKzgsOCBAQA0KPiANCj4gICNpbmNsdWRlICJj b3JlLmgiDQo+IA0KPiArI2RlZmluZSBBVE1FTF9TUl9HTE9CQUxfUFJPVEVDVF9NQVNLIEdFTk1B U0soNSwgMikNCj4gKw0KPiAgLyoNCj4gICAqIFRoZSBBdG1lbCBBVDI1RlMwMTAvQVQyNUZTMDQw IHBhcnRzIGhhdmUgc29tZSB3ZWlyZCBjb25maWd1cmF0aW9uIGZvciB0aGUNCj4gICAqIGJsb2Nr IHByb3RlY3Rpb24gYml0cy4gV2UgZG9uJ3Qgc3VwcG9ydCB0aGVtLiBCdXQgbGVnYWN5IGJlaGF2 aW91ciBpbiBsaW51eA0KPiBAQCAtNTUsNiArNTcsMTAzIEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3Qg c3BpX25vcl9maXh1cHMgYXRtZWxfYXQyNWZzX2ZpeHVwcyA9IHsNCj4gICAgICAgICAuZGVmYXVs dF9pbml0ID0gYXRtZWxfYXQyNWZzX2RlZmF1bHRfaW5pdCwNCj4gIH07DQo+IA0KPiArLyoqDQo+ ICsgKiBhdG1lbF9zZXRfZ2xvYmFsX3Byb3RlY3Rpb24gLSBEbyBhIEdsb2JhbCBQcm90ZWN0IG9y IFVucHJvdGVjdCBjb21tYW5kDQo+ICsgKiBAbm9yOiAgICAgICBwb2ludGVyIHRvICdzdHJ1Y3Qg c3BpX25vcicNCj4gKyAqIEBvZnM6ICAgICAgIG9mZnNldCBpbiBieXRlcw0KPiArICogQGxlbjog ICAgICAgbGVuIGluIGJ5dGVzDQo+ICsgKiBAaXNfcHJvdGVjdDogICAgICAgIGlmIHRydWUgZG8g YSBHbG9iYWwgUHJvdGVjdCBvdGhlcndpc2UgaXQgaXMgYSBHbG9iYWwgVW5wcm90ZWN0DQo+ICsg Kg0KPiArICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIC1lcnJvciBvdGhlcndpc2UuDQo+ICsgKi8N Cj4gK3N0YXRpYyBpbnQgYXRtZWxfc2V0X2dsb2JhbF9wcm90ZWN0aW9uKHN0cnVjdCBzcGlfbm9y ICpub3IsIGxvZmZfdCBvZnMsDQo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHVpbnQ2NF90IGxlbiwgYm9vbCBpc19wcm90ZWN0KQ0KPiArew0KPiArICAgICAgIGludCBy ZXQ7DQo+ICsgICAgICAgdTggc3I7DQo+ICsNCj4gKyAgICAgICAvKiBXZSBvbmx5IHN1cHBvcnQg bG9ja2luZyB0aGUgd2hvbGUgZmxhc2ggYXJyYXkgKi8NCj4gKyAgICAgICBpZiAob2ZzIHx8IGxl biAhPSBub3ItPnBhcmFtcy0+c2l6ZSkNCj4gKyAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFM Ow0KPiArDQo+ICsgICAgICAgcmV0ID0gc3BpX25vcl9yZWFkX3NyKG5vciwgbm9yLT5ib3VuY2Vi dWYpOw0KPiArICAgICAgIGlmIChyZXQpDQo+ICsgICAgICAgICAgICAgICByZXR1cm4gcmV0Ow0K DQptYXliZSBhIG5ldyBsaW5lIGluIGJldHdlZW4uDQoNCj4gKyAgICAgICBzciA9IG5vci0+Ym91 bmNlYnVmWzBdOw0KPiArDQo+ICsgICAgICAgLyogU1JXRCBiaXQgbmVlZHMgdG8gYmUgY2xlYXJl ZCwgb3RoZXJ3aXNlIHRoZSBwcm90ZWN0aW9uIGRvZXNuJ3QgY2hhbmdlICovDQo+ICsgICAgICAg aWYgKHNyICYgU1JfU1JXRCkgew0KPiArICAgICAgICAgICAgICAgc3IgJj0gflNSX1NSV0Q7DQo+ ICsgICAgICAgICAgICAgICByZXQgPSBzcGlfbm9yX3dyaXRlX3NyX2FuZF9jaGVjayhub3IsIHNy KTsNCj4gKyAgICAgICAgICAgICAgIGlmIChyZXQpIHsNCj4gKyAgICAgICAgICAgICAgICAgICAg ICAgZGV2X2Vycihub3ItPmRldiwgInVuYWJsZSB0byBjbGVhciBTUldEIGJpdCwgV1AjIGFzc2Vy dGVkP1xuIik7DQoNCnNwaV9ub3Jfd3JpdGVfc3JfYW5kX2NoZWNrKCkgYWxyZWFkeSBwcmludHMg YSBkZXZfZGJnKCkuIElmIHlvdSBmaW5kIGEgc2Vjb25kIG1lc3NhZ2UNCnVzZWZ1bCwgeW91IHNo b3VsZCB1c2UgZGV2X2RiZyBmb3IgbG93IGxldmVsIGluZm8uDQoNCj4gKyAgICAgICAgICAgICAg ICAgICAgICAgcmV0dXJuIHJldDsNCj4gKyAgICAgICAgICAgICAgIH0NCj4gKyAgICAgICB9DQo+ ICsNCj4gKyAgICAgICBpZiAoaXNfcHJvdGVjdCkgew0KPiArICAgICAgICAgICAgICAgc3IgfD0g QVRNRUxfU1JfR0xPQkFMX1BST1RFQ1RfTUFTSzsNCj4gKyAgICAgICAgICAgICAgIC8qDQo+ICsg ICAgICAgICAgICAgICAgKiBTZXQgdGhlIFNSV0QgYml0IGFnYWluIGFzIHNvb24gYXMgd2UgYXJl IHByb3RlY3RpbmcNCj4gKyAgICAgICAgICAgICAgICAqIGFueXRoaW5nLiBUaGlzIHdpbGwgZW5z dXJlIHRoYXQgdGhlIFdQIyBwaW4gaXMgd29ya2luZw0KPiArICAgICAgICAgICAgICAgICogY29y cmVjdGx5LiBCeSBkb2luZyB0aGlzIHdlIGFsc28gYmVoYXZlIHRoZSBzYW1lIGFzDQo+ICsgICAg ICAgICAgICAgICAgKiBzcGlfbm9yX3NyX2xvY2soKSwgd2hpY2ggc2V0cyBTUldEIGlmIGFueSBi bG9jayBwcm90ZWN0aW9uDQo+ICsgICAgICAgICAgICAgICAgKiBpcyBhY3RpdmUuDQo+ICsgICAg ICAgICAgICAgICAgKi8NCj4gKyAgICAgICAgICAgICAgIHNyIHw9IFNSX1NSV0Q7DQo+ICsgICAg ICAgfSBlbHNlIHsNCj4gKyAgICAgICAgICAgICAgIHNyICY9IH5BVE1FTF9TUl9HTE9CQUxfUFJP VEVDVF9NQVNLOw0KPiArICAgICAgIH0NCj4gKw0KPiArICAgICAgIG5vci0+Ym91bmNlYnVmWzBd ID0gc3I7DQo+ICsNCj4gKyAgICAgICAvKg0KPiArICAgICAgICAqIFdlIGNhbm5vdCB1c2UgdGhl IHNwaV9ub3Jfd3JpdGVfc3JfYW5kX2NoZWNrKCkgYmVjYXVzZSB0aGlzIGNvbW1hbmQNCj4gKyAg ICAgICAgKiBpc24ndCByZWFsbHkgc2V0dGluZyBhbnkgYml0cywgaW5zdGVhZCBpdCBpcyBhbiBw c2V1ZG8gY29tbWFuZCBmb3INCj4gKyAgICAgICAgKiAiR2xvYmFsIFVucHJvdGVjdCIgb3IgIkds b2JhbCBQcm90ZWN0Ig0KPiArICAgICAgICAqLw0KPiArICAgICAgIHJldHVybiBzcGlfbm9yX3dy aXRlX3NyKG5vciwgbm9yLT5ib3VuY2VidWYsIDEpOw0KPiArfQ0KPiArDQo+ICtzdGF0aWMgaW50 IGF0bWVsX2dsb2JhbF9wcm90ZWN0KHN0cnVjdCBzcGlfbm9yICpub3IsIGxvZmZfdCBvZnMsIHVp bnQ2NF90IGxlbikNCj4gK3sNCj4gKyAgICAgICByZXR1cm4gYXRtZWxfc2V0X2dsb2JhbF9wcm90 ZWN0aW9uKG5vciwgb2ZzLCBsZW4sIHRydWUpOw0KPiArfQ0KPiArDQo+ICtzdGF0aWMgaW50IGF0 bWVsX2dsb2JhbF91bnByb3RlY3Qoc3RydWN0IHNwaV9ub3IgKm5vciwgbG9mZl90IG9mcywgdWlu dDY0X3QgbGVuKQ0KPiArew0KPiArICAgICAgIHJldHVybiBhdG1lbF9zZXRfZ2xvYmFsX3Byb3Rl Y3Rpb24obm9yLCBvZnMsIGxlbiwgZmFsc2UpOw0KPiArfQ0KPiArDQo+ICtzdGF0aWMgaW50IGF0 bWVsX2lzX2dsb2JhbF9wcm90ZWN0ZWQoc3RydWN0IHNwaV9ub3IgKm5vciwgbG9mZl90IG9mcywg dWludDY0X3QgbGVuKQ0KPiArew0KPiArICAgICAgIGludCByZXQ7DQo+ICsNCj4gKyAgICAgICBp ZiAob2ZzID49IG5vci0+cGFyYW1zLT5zaXplIHx8IChvZnMgKyBsZW4pID4gbm9yLT5wYXJhbXMt PnNpemUpDQo+ICsgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsNCj4gKw0KPiArICAgICAg IHJldCA9IHNwaV9ub3JfcmVhZF9zcihub3IsIG5vci0+Ym91bmNlYnVmKTsNCj4gKyAgICAgICBp ZiAocmV0KQ0KPiArICAgICAgICAgICAgICAgcmV0dXJuIHJldDsNCj4gKw0KPiArICAgICAgIHJl dHVybiAoKG5vci0+Ym91bmNlYnVmWzBdICYgQVRNRUxfU1JfR0xPQkFMX1BST1RFQ1RfTUFTSykg PT0gQVRNRUxfU1JfR0xPQkFMX1BST1RFQ1RfTUFTSyk7DQo+ICt9DQo+ICsNCj4gK3N0YXRpYyBj b25zdCBzdHJ1Y3Qgc3BpX25vcl9sb2NraW5nX29wcyBhdG1lbF9nbG9iYWxfcHJvdGVjdGlvbl9v cHMgPSB7DQo+ICsgICAgICAgLmxvY2sgPSBhdG1lbF9nbG9iYWxfcHJvdGVjdCwNCj4gKyAgICAg ICAudW5sb2NrID0gYXRtZWxfZ2xvYmFsX3VucHJvdGVjdCwNCj4gKyAgICAgICAuaXNfbG9ja2Vk ID0gYXRtZWxfaXNfZ2xvYmFsX3Byb3RlY3RlZCwNCj4gK307DQo+ICsNCj4gK3N0YXRpYyB2b2lk IGF0bWVsX2dsb2JhbF9wcm90ZWN0aW9uX2RlZmF1bHRfaW5pdChzdHJ1Y3Qgc3BpX25vciAqbm9y KQ0KPiArew0KPiArICAgICAgIG5vci0+cGFyYW1zLT5sb2NraW5nX29wcyA9ICZhdG1lbF9nbG9i YWxfcHJvdGVjdGlvbl9vcHM7DQo+ICt9DQo+ICsNCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3Bp X25vcl9maXh1cHMgYXRtZWxfZ2xvYmFsX3Byb3RlY3Rpb25fZml4dXBzID0gew0KPiArICAgICAg IC5kZWZhdWx0X2luaXQgPSBhdG1lbF9nbG9iYWxfcHJvdGVjdGlvbl9kZWZhdWx0X2luaXQsDQo+ ICt9Ow0KPiArDQo+ICBzdGF0aWMgY29uc3Qgc3RydWN0IGZsYXNoX2luZm8gYXRtZWxfcGFydHNb XSA9IHsNCj4gICAgICAgICAvKiBBdG1lbCAtLSBzb21lIGFyZSAoY29uZnVzaW5nbHkpIG1hcmtl dGVkIGFzICJEYXRhRmxhc2giICovDQo+ICAgICAgICAgeyAiYXQyNWZzMDEwIiwgIElORk8oMHgx ZjY2MDEsIDAsIDMyICogMTAyNCwgICA0LCBTRUNUXzRLIHwgU1BJX05PUl9IQVNfTE9DSykNCj4g QEAgLTYyLDE4ICsxNjEsMzIgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBmbGFzaF9pbmZvIGF0bWVs X3BhcnRzW10gPSB7DQo+ICAgICAgICAgeyAiYXQyNWZzMDQwIiwgIElORk8oMHgxZjY2MDQsIDAs IDY0ICogMTAyNCwgICA4LCBTRUNUXzRLIHwgU1BJX05PUl9IQVNfTE9DSykNCj4gICAgICAgICAg ICAgICAgIC5maXh1cHMgPSAmYXRtZWxfYXQyNWZzX2ZpeHVwcyB9LA0KPiANCj4gLSAgICAgICB7 ICJhdDI1ZGYwNDFhIiwgSU5GTygweDFmNDQwMSwgMCwgNjQgKiAxMDI0LCAgIDgsIFNFQ1RfNEsg fCBTUElfTk9SX0hBU19MT0NLKSB9LA0KPiAtICAgICAgIHsgImF0MjVkZjMyMSIsICBJTkZPKDB4 MWY0NzAwLCAwLCA2NCAqIDEwMjQsICA2NCwgU0VDVF80SyB8IFNQSV9OT1JfSEFTX0xPQ0spIH0s DQo+IC0gICAgICAgeyAiYXQyNWRmMzIxYSIsIElORk8oMHgxZjQ3MDEsIDAsIDY0ICogMTAyNCwg IDY0LCBTRUNUXzRLIHwgU1BJX05PUl9IQVNfTE9DSykgfSwNCj4gLSAgICAgICB7ICJhdDI1ZGY2 NDEiLCAgSU5GTygweDFmNDgwMCwgMCwgNjQgKiAxMDI0LCAxMjgsIFNFQ1RfNEsgfCBTUElfTk9S X0hBU19MT0NLKSB9LA0KPiArICAgICAgIHsgImF0MjVkZjA0MWEiLCBJTkZPKDB4MWY0NDAxLCAw LCA2NCAqIDEwMjQsICAgOCwNCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUNUXzRL IHwgU1BJX05PUl9IQVNfTE9DSyB8IFNQSV9OT1JfV1BfSVNfVk9MQVRJTEUpDQo+ICsgICAgICAg ICAgICAgICAgICAgICAgIC5maXh1cHMgPSAmYXRtZWxfZ2xvYmFsX3Byb3RlY3Rpb25fZml4dXBz IH0sDQo+ICsgICAgICAgeyAiYXQyNWRmMzIxIiwgIElORk8oMHgxZjQ3MDAsIDAsIDY0ICogMTAy NCwgIDY0LA0KPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFQ1RfNEsgfCBTUElfTk9S X0hBU19MT0NLIHwgU1BJX05PUl9XUF9JU19WT0xBVElMRSkNCj4gKyAgICAgICAgICAgICAgICAg ICAgICAgLmZpeHVwcyA9ICZhdG1lbF9nbG9iYWxfcHJvdGVjdGlvbl9maXh1cHMgfSwNCj4gKyAg ICAgICB7ICJhdDI1ZGYzMjFhIiwgSU5GTygweDFmNDcwMSwgMCwgNjQgKiAxMDI0LCAgNjQsDQo+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VDVF80SyB8IFNQSV9OT1JfSEFTX0xPQ0sg fCBTUElfTk9SX1dQX0lTX1ZPTEFUSUxFKQ0KPiArICAgICAgICAgICAgICAgICAgICAgICAuZml4 dXBzID0gJmF0bWVsX2dsb2JhbF9wcm90ZWN0aW9uX2ZpeHVwcyB9LA0KPiArICAgICAgIHsgImF0 MjVkZjY0MSIsICBJTkZPKDB4MWY0ODAwLCAwLCA2NCAqIDEwMjQsIDEyOCwNCj4gKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICBTRUNUXzRLIHwgU1BJX05PUl9IQVNfTE9DSyB8IFNQSV9OT1Jf V1BfSVNfVk9MQVRJTEUpDQo+ICsgICAgICAgICAgICAgICAgICAgICAgIC5maXh1cHMgPSAmYXRt ZWxfZ2xvYmFsX3Byb3RlY3Rpb25fZml4dXBzIH0sDQo+IA0KPiAgICAgICAgIHsgImF0MjVzbDMy MSIsICBJTkZPKDB4MWY0MjE2LCAwLCA2NCAqIDEwMjQsIDY0LA0KPiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIFNFQ1RfNEsgfCBTUElfTk9SX0RVQUxfUkVBRCB8IFNQSV9OT1JfUVVBRF9S RUFEKSB9LA0KPiANCj4gICAgICAgICB7ICJhdDI2ZjAwNCIsICAgSU5GTygweDFmMDQwMCwgMCwg NjQgKiAxMDI0LCAgOCwgU0VDVF80SykgfSwNCj4gLSAgICAgICB7ICJhdDI2ZGYwODFhIiwgSU5G TygweDFmNDUwMSwgMCwgNjQgKiAxMDI0LCAxNiwgU0VDVF80SyB8IFNQSV9OT1JfSEFTX0xPQ0sp IH0sDQo+IC0gICAgICAgeyAiYXQyNmRmMTYxYSIsIElORk8oMHgxZjQ2MDEsIDAsIDY0ICogMTAy NCwgMzIsIFNFQ1RfNEsgfCBTUElfTk9SX0hBU19MT0NLKSB9LA0KPiAtICAgICAgIHsgImF0MjZk ZjMyMSIsICBJTkZPKDB4MWY0NzAwLCAwLCA2NCAqIDEwMjQsIDY0LCBTRUNUXzRLIHwgU1BJX05P Ul9IQVNfTE9DSykgfSwNCj4gKyAgICAgICB7ICJhdDI2ZGYwODFhIiwgSU5GTygweDFmNDUwMSwg MCwgNjQgKiAxMDI0LCAxNiwNCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUNUXzRL IHwgU1BJX05PUl9IQVNfTE9DSyB8IFNQSV9OT1JfV1BfSVNfVk9MQVRJTEUpDQo+ICsgICAgICAg ICAgICAgICAgICAgICAgIC5maXh1cHMgPSAmYXRtZWxfZ2xvYmFsX3Byb3RlY3Rpb25fZml4dXBz IH0sDQo+ICsgICAgICAgeyAiYXQyNmRmMTYxYSIsIElORk8oMHgxZjQ2MDEsIDAsIDY0ICogMTAy NCwgMzIsDQo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VDVF80SyB8IFNQSV9OT1Jf SEFTX0xPQ0sgfCBTUElfTk9SX1dQX0lTX1ZPTEFUSUxFKQ0KPiArICAgICAgICAgICAgICAgICAg ICAgICAuZml4dXBzID0gJmF0bWVsX2dsb2JhbF9wcm90ZWN0aW9uX2ZpeHVwcyB9LA0KPiArICAg ICAgIHsgImF0MjZkZjMyMSIsICBJTkZPKDB4MWY0NzAwLCAwLCA2NCAqIDEwMjQsIDY0LA0KPiAr ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFQ1RfNEsgfCBTUElfTk9SX0hBU19MT0NLIHwg U1BJX05PUl9XUF9JU19WT0xBVElMRSkNCj4gKyAgICAgICAgICAgICAgICAgICAgICAgLmZpeHVw cyA9ICZhdG1lbF9nbG9iYWxfcHJvdGVjdGlvbl9maXh1cHMgfSwNCj4gDQo+ICAgICAgICAgeyAi YXQ0NWRiMDgxZCIsIElORk8oMHgxZjI1MDAsIDAsIDY0ICogMTAyNCwgMTYsIFNFQ1RfNEspIH0s DQo+ICB9Ow0KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvc3BpLW5vci9jb3JlLmMgYi9kcml2 ZXJzL210ZC9zcGktbm9yL2NvcmUuYw0KPiBpbmRleCA4YzA2YTI4YTkwZGUuLjgzNTRjZTBjODgx MCAxMDA2NDQNCj4gLS0tIGEvZHJpdmVycy9tdGQvc3BpLW5vci9jb3JlLmMNCj4gKysrIGIvZHJp dmVycy9tdGQvc3BpLW5vci9jb3JlLmMNCj4gQEAgLTM3Nyw3ICszNzcsNyBAQCBpbnQgc3BpX25v cl93cml0ZV9kaXNhYmxlKHN0cnVjdCBzcGlfbm9yICpub3IpDQo+ICAgKg0KPiAgICogUmV0dXJu OiAwIG9uIHN1Y2Nlc3MsIC1lcnJubyBvdGhlcndpc2UuDQo+ICAgKi8NCj4gLXN0YXRpYyBpbnQg c3BpX25vcl9yZWFkX3NyKHN0cnVjdCBzcGlfbm9yICpub3IsIHU4ICpzcikNCj4gK2ludCBzcGlf bm9yX3JlYWRfc3Ioc3RydWN0IHNwaV9ub3IgKm5vciwgdTggKnNyKQ0KPiAgew0KPiAgICAgICAg IGludCByZXQ7DQo+IA0KPiBAQCAtMTA0OSw3ICsxMDQ5LDcgQEAgc3RhdGljIGludCBzcGlfbm9y X3dyaXRlXzE2Yml0X2NyX2FuZF9jaGVjayhzdHJ1Y3Qgc3BpX25vciAqbm9yLCB1OCBjcikNCj4g ICAqDQo+ICAgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgLWVycm5vIG90aGVyd2lzZS4NCj4gICAq Lw0KPiAtc3RhdGljIGludCBzcGlfbm9yX3dyaXRlX3NyX2FuZF9jaGVjayhzdHJ1Y3Qgc3BpX25v ciAqbm9yLCB1OCBzcjEpDQo+ICtpbnQgc3BpX25vcl93cml0ZV9zcl9hbmRfY2hlY2soc3RydWN0 IHNwaV9ub3IgKm5vciwgdTggc3IxKQ0KPiAgew0KPiAgICAgICAgIGlmIChub3ItPmZsYWdzICYg U05PUl9GX0hBU18xNkJJVF9TUikNCj4gICAgICAgICAgICAgICAgIHJldHVybiBzcGlfbm9yX3dy aXRlXzE2Yml0X3NyX2FuZF9jaGVjayhub3IsIHNyMSk7DQo+IEBAIC0zMTI0LDE1ICszMTI0LDE0 IEBAIHN0YXRpYyBpbnQgc3BpX25vcl9xdWFkX2VuYWJsZShzdHJ1Y3Qgc3BpX25vciAqbm9yKQ0K PiAgICogc3BpX25vcl91bmxvY2tfYWxsKCkgLSBVbmxvY2tzIHRoZSBlbnRpcmUgZmxhc2ggbWVt b3J5IGFycmF5Lg0KPiAgICogQG5vcjogICAgICAgcG9pbnRlciB0byBhICdzdHJ1Y3Qgc3BpX25v cicuDQo+ICAgKg0KPiAtICogU29tZSBTUEkgTk9SIGZsYXNoZXMgYXJlIHdyaXRlIHByb3RlY3Rl ZCBieSBkZWZhdWx0IGFmdGVyIGEgcG93ZXItb24gcmVzZXQNCj4gLSAqIGN5Y2xlLCBpbiBvcmRl ciB0byBhdm9pZCBpbmFkdmVydGVudCB3cml0ZXMgZHVyaW5nIHBvd2VyLXVwLiBCYWNrd2FyZA0K PiAtICogY29tcGF0aWJpbGl0eSBpbXBvc2VzIHRvIHVubG9jayB0aGUgZW50aXJlIGZsYXNoIG1l bW9yeSBhcnJheSBhdCBwb3dlci11cA0KPiAtICogYnkgZGVmYXVsdC4NCj4gKyAqIFJldHVybjog MCBvbiBzdWNjZXNzLCAtZXJybm8gb3RoZXJ3aXNlLg0KPiAgICovDQo+ICBzdGF0aWMgaW50IHNw aV9ub3JfdW5sb2NrX2FsbChzdHJ1Y3Qgc3BpX25vciAqbm9yKQ0KPiAgew0KPiAtICAgICAgIGlm IChub3ItPmZsYWdzICYgU05PUl9GX0hBU19MT0NLKQ0KPiArICAgICAgIGlmIChub3ItPmZsYWdz ICYgU05PUl9GX0hBU19MT0NLKSB7DQo+ICsgICAgICAgICAgICAgICBkZXZfZGJnKG5vci0+ZGV2 LCAidW5wcm90ZWN0aW5nIGVudGlyZSBmbGFzaFxuIik7DQo+ICAgICAgICAgICAgICAgICByZXR1 cm4gc3BpX25vcl91bmxvY2soJm5vci0+bXRkLCAwLCBub3ItPnBhcmFtcy0+c2l6ZSk7DQo+ICsg ICAgICAgfQ0KPiANCj4gICAgICAgICByZXR1cm4gMDsNCj4gIH0NCj4gQEAgLTMxNTMsMTAgKzMx NTIsMjMgQEAgc3RhdGljIGludCBzcGlfbm9yX2luaXQoc3RydWN0IHNwaV9ub3IgKm5vcikNCj4g ICAgICAgICAgICAgICAgIHJldHVybiBlcnI7DQo+ICAgICAgICAgfQ0KPiANCj4gLSAgICAgICBl cnIgPSBzcGlfbm9yX3VubG9ja19hbGwobm9yKTsNCj4gLSAgICAgICBpZiAoZXJyKSB7DQo+IC0g ICAgICAgICAgICAgICBkZXZfZGJnKG5vci0+ZGV2LCAiRmFpbGVkIHRvIHVubG9jayB0aGUgZW50 aXJlIGZsYXNoIG1lbW9yeSBhcnJheVxuIik7DQo+IC0gICAgICAgICAgICAgICByZXR1cm4gZXJy Ow0KPiArICAgICAgIC8qDQo+ICsgICAgICAgICogU29tZSBTUEkgTk9SIGZsYXNoZXMgYXJlIHdy aXRlIHByb3RlY3RlZCBieSBkZWZhdWx0IGFmdGVyIGEgcG93ZXItb24NCj4gKyAgICAgICAgKiBy ZXNldCBjeWNsZSwgaW4gb3JkZXIgdG8gYXZvaWQgaW5hZHZlcnRlbnQgd3JpdGVzIGR1cmluZyBw b3dlci11cC4NCj4gKyAgICAgICAgKiBCYWNrd2FyZCBjb21wYXRpYmlsaXR5IGltcG9zZXMgdG8g dW5sb2NrIHRoZSBlbnRpcmUgZmxhc2ggbWVtb3J5DQo+ICsgICAgICAgICogYXJyYXkgYXQgcG93 ZXItdXAgYnkgZGVmYXVsdC4gRGVwZW5kaW5nIG9uIHRoZSBrZXJuZWwgY29uZmlndXJhdGlvbg0K PiArICAgICAgICAqICgxKSB3ZSBkbyBub3RoaW5nLCAoMikgd2UgdW5sb2NrIHRoZSBlbnRpcmUg Zmxhc2ggaW4gYW55IGNhc2Ugb3IgKDMpDQo+ICsgICAgICAgICoganVzdCBkbyBpdCBhY3R1YWxs eSBwb3dlcnMgdXAgd3JpdGUtcHJvdGVjdGVkLiBUaGUgbGF0dGVyIGlzDQoNCmRvIGl0IGlmIGl0 IGFjdHVhbGx5IHBvd2VycyB1cA0KDQpIb3cgYWJvdXQ6ICgxKSBkbyBub3RoaW5nLCAoMikgYWx3 YXlzIHVubG9jayB0aGUgZW50aXJlIGZsYXNoIGFycmF5LCAoMykgdW5sb2NrDQp0aGUgZW50aXJl IGZsYXNoIGFycmF5IG9ubHkgd2hlbiB0aGUgc29mdHdhcmUgcHJvdGVjdGlvbiBiaXRzIGFyZSB2 b2xhdGlsZS4NCg0KPiArICAgICAgICAqIGluZGljYXRlZCBieSBTTk9SX0ZfV1BfSVNfVk9MQVRJ TEUuDQo+ICsgICAgICAgICovDQo+ICsgICAgICAgaWYgKElTX0VOQUJMRUQoQ09ORklHX01URF9T UElfTk9SX1dQX0RJU0FCTEUpIHx8DQo+ICsgICAgICAgICAgIChJU19FTkFCTEVEKENPTkZJR19N VERfU1BJX05PUl9XUF9ESVNBQkxFX09OX1ZPTEFUSUxFKSAmJg0KPiArICAgICAgICAgICAgbm9y LT5mbGFncyAmIFNOT1JfRl9XUF9JU19WT0xBVElMRSkpIHsNCj4gKyAgICAgICAgICAgICAgIGVy ciA9IHNwaV9ub3JfdW5sb2NrX2FsbChub3IpOw0KPiArICAgICAgICAgICAgICAgaWYgKGVycikg ew0KPiArICAgICAgICAgICAgICAgICAgICAgICBkZXZfZXJyKG5vci0+ZGV2LCAiRmFpbGVkIHRv IHVubG9jayB0aGUgZW50aXJlIGZsYXNoIG1lbW9yeSBhcnJheVxuIik7DQoNCmRldl9kYmcgZm9y IGxvdyBsZXZlbCBpbmZvDQoNCj4gKyAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsN Cj4gKyAgICAgICAgICAgICAgIH0NCj4gICAgICAgICB9DQo+IA0KPiAgICAgICAgIGlmIChub3It PmFkZHJfd2lkdGggPT0gNCAmJg0KPiBAQCAtMzQ1Niw2ICszNDY4LDggQEAgaW50IHNwaV9ub3Jf c2NhbihzdHJ1Y3Qgc3BpX25vciAqbm9yLCBjb25zdCBjaGFyICpuYW1lLA0KPiAgICAgICAgICAg ICAgICAgbm9yLT5mbGFncyB8PSBTTk9SX0ZfTk9fT1BfQ0hJUF9FUkFTRTsNCj4gICAgICAgICBp ZiAoaW5mby0+ZmxhZ3MgJiBVU0VfQ0xTUikNCj4gICAgICAgICAgICAgICAgIG5vci0+ZmxhZ3Mg fD0gU05PUl9GX1VTRV9DTFNSOw0KPiArICAgICAgIGlmIChpbmZvLT5mbGFncyAmIFNQSV9OT1Jf V1BfSVNfVk9MQVRJTEUpDQo+ICsgICAgICAgICAgICAgICBub3ItPmZsYWdzIHw9IFNOT1JfRl9X UF9JU19WT0xBVElMRTsNCj4gDQo+ICAgICAgICAgaWYgKGluZm8tPmZsYWdzICYgU1BJX05PUl80 QklUX0JQKSB7DQo+ICAgICAgICAgICAgICAgICBub3ItPmZsYWdzIHw9IFNOT1JfRl9IQVNfNEJJ VF9CUDsNCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3NwaS1ub3IvY29yZS5oIGIvZHJpdmVy cy9tdGQvc3BpLW5vci9jb3JlLmgNCj4gaW5kZXggMTZiMzUwZTFkODY1Li42YmY4NmMyOTk0Yzgg MTAwNjQ0DQo+IC0tLSBhL2RyaXZlcnMvbXRkL3NwaS1ub3IvY29yZS5oDQo+ICsrKyBiL2RyaXZl cnMvbXRkL3NwaS1ub3IvY29yZS5oDQo+IEBAIC0yOCw2ICsyOCw3IEBAIGVudW0gc3BpX25vcl9v cHRpb25fZmxhZ3Mgew0KPiAgICAgICAgIFNOT1JfRl9IQVNfU1JfQlAzX0JJVDYgID0gQklUKDEz KSwNCj4gICAgICAgICBTTk9SX0ZfSU9fTU9ERV9FTl9WT0xBVElMRSA9IEJJVCgxNCksDQo+ICAg ICAgICAgU05PUl9GX1NPRlRfUkVTRVQgICAgICAgPSBCSVQoMTUpLA0KPiArICAgICAgIFNOT1Jf Rl9XUF9JU19WT0xBVElMRSAgID0gQklUKDE2KSwNCj4gIH07DQo+IA0KPiAgc3RydWN0IHNwaV9u b3JfcmVhZF9jb21tYW5kIHsNCj4gQEAgLTMyOSw2ICszMzAsMTEgQEAgc3RydWN0IGZsYXNoX2lu Zm8gew0KPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg KiBhdmFpbGFibGUgSS9PIG1vZGUgdmlhIGENCj4gICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICogdm9sYXRpbGUgYml0Lg0KPiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCj4gKyNkZWZpbmUgU1BJX05PUl9X UF9JU19WT0xBVElMRSBCSVQoMjIpIC8qDQo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgKiBGbGFzaCBoYXMgdm9sYXRpbGUgd3JpdGUgcHJvdGVjdGlvbg0KPiArICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYml0cy4gVXN1YWxseSB0aGVz ZSB3aWxsIHBvd2VyLXVwIGluDQo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgKiBhIHdyaXRlLXByb3RlY3RlZCBzdGF0ZS4NCj4gKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAqLw0KPiANCj4gICAgICAgICAvKiBQYXJ0IHNwZWNpZmljIGZp eHVwIGhvb2tzLiAqLw0KPiAgICAgICAgIGNvbnN0IHN0cnVjdCBzcGlfbm9yX2ZpeHVwcyAqZml4 dXBzOw0KPiBAQCAtNDMwLDcgKzQzNiw5IEBAIHZvaWQgc3BpX25vcl91bmxvY2tfYW5kX3VucHJl cChzdHJ1Y3Qgc3BpX25vciAqbm9yKTsNCj4gIGludCBzcGlfbm9yX3NyMV9iaXQ2X3F1YWRfZW5h YmxlKHN0cnVjdCBzcGlfbm9yICpub3IpOw0KPiAgaW50IHNwaV9ub3Jfc3IyX2JpdDFfcXVhZF9l bmFibGUoc3RydWN0IHNwaV9ub3IgKm5vcik7DQo+ICBpbnQgc3BpX25vcl9zcjJfYml0N19xdWFk X2VuYWJsZShzdHJ1Y3Qgc3BpX25vciAqbm9yKTsNCj4gK2ludCBzcGlfbm9yX3JlYWRfc3Ioc3Ry dWN0IHNwaV9ub3IgKm5vciwgdTggKnNyKTsNCj4gIGludCBzcGlfbm9yX3dyaXRlX3NyKHN0cnVj dCBzcGlfbm9yICpub3IsIGNvbnN0IHU4ICpzciwgc2l6ZV90IGxlbik7DQo+ICtpbnQgc3BpX25v cl93cml0ZV9zcl9hbmRfY2hlY2soc3RydWN0IHNwaV9ub3IgKm5vciwgdTggc3IxKTsNCj4gDQo+ ICBpbnQgc3BpX25vcl94cmVhZF9zcihzdHJ1Y3Qgc3BpX25vciAqbm9yLCB1OCAqc3IpOw0KPiAg c3NpemVfdCBzcGlfbm9yX3JlYWRfZGF0YShzdHJ1Y3Qgc3BpX25vciAqbm9yLCBsb2ZmX3QgZnJv bSwgc2l6ZV90IGxlbiwNCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3NwaS1ub3IvZXNtdC5j IGIvZHJpdmVycy9tdGQvc3BpLW5vci9lc210LmMNCj4gaW5kZXggYzkzMTcwMDA4MTE4Li5kOTcw ZjZkYTI3YzIgMTAwNjQ0DQo+IC0tLSBhL2RyaXZlcnMvbXRkL3NwaS1ub3IvZXNtdC5jDQo+ICsr KyBiL2RyaXZlcnMvbXRkL3NwaS1ub3IvZXNtdC5jDQo+IEBAIC0xMSw3ICsxMSw3IEBADQo+ICBz dGF0aWMgY29uc3Qgc3RydWN0IGZsYXNoX2luZm8gZXNtdF9wYXJ0c1tdID0gew0KPiAgICAgICAg IC8qIEVTTVQgKi8NCj4gICAgICAgICB7ICJmMjVsMzJwYSIsIElORk8oMHg4YzIwMTYsIDAsIDY0 ICogMTAyNCwgNjQsDQo+IC0gICAgICAgICAgICAgICAgICAgICAgICAgIFNFQ1RfNEsgfCBTUElf Tk9SX0hBU19MT0NLKSB9LA0KPiArICAgICAgICAgICAgICAgICAgICAgICAgICBTRUNUXzRLIHwg U1BJX05PUl9IQVNfTE9DSyB8IFNQSV9OT1JfV1BfSVNfVk9MQVRJTEUpIH0sDQo+ICAgICAgICAg eyAiZjI1bDMycWEiLCBJTkZPKDB4OGM0MTE2LCAwLCA2NCAqIDEwMjQsIDY0LA0KPiAgICAgICAg ICAgICAgICAgICAgICAgICAgICBTRUNUXzRLIHwgU1BJX05PUl9IQVNfTE9DSykgfSwNCj4gICAg ICAgICB7ICJmMjVsNjRxYSIsIElORk8oMHg4YzQxMTcsIDAsIDY0ICogMTAyNCwgMTI4LA0KPiBk aWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvc3BpLW5vci9pbnRlbC5jIGIvZHJpdmVycy9tdGQvc3Bp LW5vci9pbnRlbC5jDQo+IGluZGV4IDZjMzFiZWYzZmM2MC4uMGJiMWUzZmQ5NzAyIDEwMDY0NA0K PiAtLS0gYS9kcml2ZXJzL210ZC9zcGktbm9yL2ludGVsLmMNCj4gKysrIGIvZHJpdmVycy9tdGQv c3BpLW5vci9pbnRlbC5jDQo+IEBAIC0xMCw5ICsxMCwxMiBAQA0KPiANCj4gIHN0YXRpYyBjb25z dCBzdHJ1Y3QgZmxhc2hfaW5mbyBpbnRlbF9wYXJ0c1tdID0gew0KPiAgICAgICAgIC8qIEludGVs L051bW9ueXggLS0geHh4czMzYiAqLw0KPiAtICAgICAgIHsgIjE2MHMzM2IiLCAgSU5GTygweDg5 ODkxMSwgMCwgNjQgKiAxMDI0LCAgMzIsIFNQSV9OT1JfSEFTX0xPQ0spIH0sDQo+IC0gICAgICAg eyAiMzIwczMzYiIsICBJTkZPKDB4ODk4OTEyLCAwLCA2NCAqIDEwMjQsICA2NCwgU1BJX05PUl9I QVNfTE9DSykgfSwNCj4gLSAgICAgICB7ICI2NDBzMzNiIiwgIElORk8oMHg4OTg5MTMsIDAsIDY0 ICogMTAyNCwgMTI4LCBTUElfTk9SX0hBU19MT0NLKSB9LA0KPiArICAgICAgIHsgIjE2MHMzM2Ii LCAgSU5GTygweDg5ODkxMSwgMCwgNjQgKiAxMDI0LCAgMzIsDQo+ICsgICAgICAgICAgICAgICAg ICAgICAgICAgIFNQSV9OT1JfSEFTX0xPQ0sgfCBTUElfTk9SX1dQX0lTX1ZPTEFUSUxFKSB9LA0K PiArICAgICAgIHsgIjMyMHMzM2IiLCAgSU5GTygweDg5ODkxMiwgMCwgNjQgKiAxMDI0LCAgNjQs DQo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgIFNQSV9OT1JfSEFTX0xPQ0sgfCBTUElfTk9S X1dQX0lTX1ZPTEFUSUxFKSB9LA0KPiArICAgICAgIHsgIjY0MHMzM2IiLCAgSU5GTygweDg5ODkx MywgMCwgNjQgKiAxMDI0LCAxMjgsDQo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgIFNQSV9O T1JfSEFTX0xPQ0sgfCBTUElfTk9SX1dQX0lTX1ZPTEFUSUxFKSB9LA0KPiAgfTsNCj4gDQo+ICBj b25zdCBzdHJ1Y3Qgc3BpX25vcl9tYW51ZmFjdHVyZXIgc3BpX25vcl9pbnRlbCA9IHsNCj4gZGlm ZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3NwaS1ub3Ivc3N0LmMgYi9kcml2ZXJzL210ZC9zcGktbm9y L3NzdC5jDQo+IGluZGV4IDhiMTY5ZmE0MTAyYS4uNWU0NDUwODc3ZDY2IDEwMDY0NA0KPiAtLS0g YS9kcml2ZXJzL210ZC9zcGktbm9yL3NzdC5jDQo+ICsrKyBiL2RyaXZlcnMvbXRkL3NwaS1ub3Iv c3N0LmMNCj4gQEAgLTExLDI2ICsxMSwyNyBAQA0KPiAgc3RhdGljIGNvbnN0IHN0cnVjdCBmbGFz aF9pbmZvIHNzdF9wYXJ0c1tdID0gew0KPiAgICAgICAgIC8qIFNTVCAtLSBsYXJnZSBlcmFzZSBz aXplcyBhcmUgIm92ZXJsYXlzIiwgInNlY3RvcnMiIGFyZSA0SyAqLw0KPiAgICAgICAgIHsgInNz dDI1dmYwNDBiIiwgSU5GTygweGJmMjU4ZCwgMCwgNjQgKiAxMDI0LCAgOCwNCj4gLSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgU0VDVF80SyB8IFNTVF9XUklURSB8IFNQSV9OT1JfSEFTX0xP Q0spIH0sDQo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFQ1RfNEsgfCBTU1RfV1JJ VEUgfCBTUElfTk9SX0hBU19MT0NLIHwgU1BJX05PUl9XUF9JU19WT0xBVElMRSkgfSwNCj4gICAg ICAgICB7ICJzc3QyNXZmMDgwYiIsIElORk8oMHhiZjI1OGUsIDAsIDY0ICogMTAyNCwgMTYsDQo+ IC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFQ1RfNEsgfCBTU1RfV1JJVEUgfCBTUElf Tk9SX0hBU19MT0NLKSB9LA0KPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUNUXzRL IHwgU1NUX1dSSVRFIHwgU1BJX05PUl9IQVNfTE9DSyB8IFNQSV9OT1JfV1BfSVNfVk9MQVRJTEUp IH0sDQo+ICAgICAgICAgeyAic3N0MjV2ZjAxNmIiLCBJTkZPKDB4YmYyNTQxLCAwLCA2NCAqIDEw MjQsIDMyLA0KPiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUNUXzRLIHwgU1NUX1dS SVRFIHwgU1BJX05PUl9IQVNfTE9DSykgfSwNCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgU0VDVF80SyB8IFNTVF9XUklURSB8IFNQSV9OT1JfSEFTX0xPQ0sgfCBTUElfTk9SX1dQX0lT X1ZPTEFUSUxFKSB9LA0KPiAgICAgICAgIHsgInNzdDI1dmYwMzJiIiwgSU5GTygweGJmMjU0YSwg MCwgNjQgKiAxMDI0LCA2NCwNCj4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VDVF80 SyB8IFNTVF9XUklURSB8IFNQSV9OT1JfSEFTX0xPQ0spIH0sDQo+IC0gICAgICAgeyAic3N0MjV2 ZjA2NGMiLCBJTkZPKDB4YmYyNTRiLCAwLCA2NCAqIDEwMjQsIDEyOCwgU0VDVF80SyB8IFNQSV9O T1JfSEFTX0xPQ0spIH0sDQo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFQ1RfNEsg fCBTU1RfV1JJVEUgfCBTUElfTk9SX0hBU19MT0NLIHwgU1BJX05PUl9XUF9JU19WT0xBVElMRSkg fSwNCj4gKyAgICAgICB7ICJzc3QyNXZmMDY0YyIsIElORk8oMHhiZjI1NGIsIDAsIDY0ICogMTAy NCwgMTI4LA0KPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUNUXzRLIHwgU1BJX05P Ul9IQVNfTE9DSyB8IFNQSV9OT1JfV1BfSVNfVk9MQVRJTEUpIH0sDQo+ICAgICAgICAgeyAic3N0 MjV3ZjUxMiIsICBJTkZPKDB4YmYyNTAxLCAwLCA2NCAqIDEwMjQsICAxLA0KPiAtICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBTRUNUXzRLIHwgU1NUX1dSSVRFIHwgU1BJX05PUl9IQVNfTE9D SykgfSwNCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VDVF80SyB8IFNTVF9XUklU RSB8IFNQSV9OT1JfSEFTX0xPQ0sgfCBTUElfTk9SX1dQX0lTX1ZPTEFUSUxFKSB9LA0KPiAgICAg ICAgIHsgInNzdDI1d2YwMTAiLCAgSU5GTygweGJmMjUwMiwgMCwgNjQgKiAxMDI0LCAgMiwNCj4g LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VDVF80SyB8IFNTVF9XUklURSB8IFNQSV9O T1JfSEFTX0xPQ0spIH0sDQo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFQ1RfNEsg fCBTU1RfV1JJVEUgfCBTUElfTk9SX0hBU19MT0NLIHwgU1BJX05PUl9XUF9JU19WT0xBVElMRSkg fSwNCj4gICAgICAgICB7ICJzc3QyNXdmMDIwIiwgIElORk8oMHhiZjI1MDMsIDAsIDY0ICogMTAy NCwgIDQsDQo+IC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFQ1RfNEsgfCBTU1RfV1JJ VEUgfCBTUElfTk9SX0hBU19MT0NLKSB9LA0KPiArICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBTRUNUXzRLIHwgU1NUX1dSSVRFIHwgU1BJX05PUl9IQVNfTE9DSyB8IFNQSV9OT1JfV1BfSVNf Vk9MQVRJTEUpIH0sDQo+ICAgICAgICAgeyAic3N0MjV3ZjAyMGEiLCBJTkZPKDB4NjIxNjEyLCAw LCA2NCAqIDEwMjQsICA0LCBTRUNUXzRLIHwgU1BJX05PUl9IQVNfTE9DSykgfSwNCj4gICAgICAg ICB7ICJzc3QyNXdmMDQwYiIsIElORk8oMHg2MjE2MTMsIDAsIDY0ICogMTAyNCwgIDgsIFNFQ1Rf NEsgfCBTUElfTk9SX0hBU19MT0NLKSB9LA0KPiAgICAgICAgIHsgInNzdDI1d2YwNDAiLCAgSU5G TygweGJmMjUwNCwgMCwgNjQgKiAxMDI0LCAgOCwNCj4gLSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgU0VDVF80SyB8IFNTVF9XUklURSB8IFNQSV9OT1JfSEFTX0xPQ0spIH0sDQo+ICsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIFNFQ1RfNEsgfCBTU1RfV1JJVEUgfCBTUElfTk9SX0hB U19MT0NLIHwgU1BJX05PUl9XUF9JU19WT0xBVElMRSkgfSwNCj4gICAgICAgICB7ICJzc3QyNXdm MDgwIiwgIElORk8oMHhiZjI1MDUsIDAsIDY0ICogMTAyNCwgMTYsDQo+IC0gICAgICAgICAgICAg ICAgICAgICAgICAgICAgIFNFQ1RfNEsgfCBTU1RfV1JJVEUgfCBTUElfTk9SX0hBU19MT0NLKSB9 LA0KPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUNUXzRLIHwgU1NUX1dSSVRFIHwg U1BJX05PUl9IQVNfTE9DSyB8IFNQSV9OT1JfV1BfSVNfVk9MQVRJTEUpIH0sDQo+ICAgICAgICAg eyAic3N0MjZ3ZjAxNmIiLCBJTkZPKDB4YmYyNjUxLCAwLCA2NCAqIDEwMjQsIDMyLA0KPiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBTRUNUXzRLIHwgU1BJX05PUl9EVUFMX1JFQUQgfA0K PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUElfTk9SX1FVQURfUkVBRCkgfSwNCj4g LS0NCj4gMi4yMC4xDQo+IA0KDQpUaGFua3MsDQp0YQ0K 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=-15.3 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,NICE_REPLY_A,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 BFCE4C63697 for ; Sat, 28 Nov 2020 10:19:02 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (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 17812222BA for ; Sat, 28 Nov 2020 10:19:02 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="L73bxjDb"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=microchip.com header.i=@microchip.com header.b="enJ+Rds2"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=microchiptechnology.onmicrosoft.com header.i=@microchiptechnology.onmicrosoft.com header.b="EFT6GKdA" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 17812222BA Authentication-Results: mail.kernel.org; dmarc=fail (p=quarantine dis=none) header.from=microchip.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=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:MIME-Version:Content-ID:In-Reply-To:References: Message-ID:Date:Subject:To:From:Reply-To:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=jqv13Aay9zlwmwZ6lDFj5tbqTR6cIpyj97OxQl1A3Ww=; b=L73bxjDbcLas4Qm49H0XL65BA E5ZCXae5BMeRd/KZcc5Kv0MhgdgoG2VNLhg4A1FC0IxM2O4Q0in7oTTgJ6XIv0I1jLHdrvcaLDiAE bLvsqlUQ6eSw5vy86i1HDJy6GLddoVjK0U7taK+kBbvTCEu0XwhqrRQy/tzGwO1nA9OMpPweYzI9R DljHYicTGNjKGH1jUIzGX/LqYnwMNXqpo9ByBqrbN5jo71Btksv3YkgcCyBHsIH8dRgLVQHUhEqCG QGJg1DBV58fJeOhaQKS+a4pAGbjVFVl+aU8lSMBoxqZR7vuzIkUC5UrP3i/U8ghq6acYmQPWyANVL j2f6+q5UA==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kixII-0006Qr-1s; Sat, 28 Nov 2020 10:17:30 +0000 Received: from esa4.microchip.iphmx.com ([68.232.154.123]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kixIE-0006Q5-HJ for linux-mtd@lists.infradead.org; Sat, 28 Nov 2020 10:17:28 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=microchip.com; i=@microchip.com; q=dns/txt; s=mchp; t=1606558646; x=1638094646; h=from:to:cc:subject:date:message-id:references: in-reply-to:content-id:content-transfer-encoding: mime-version; bh=zUK7lKqm1/HIcwQxDs8ov1pg/U7VYtZjxlpEvvshpSw=; b=enJ+Rds2RkHNM3FYq4RiPt5hZY3X8Yx29oC0Q9aM94mDkarMgNvFSAfS wb54HVLFFBxjk0FuGHNhJSplcC80xih/3n2VKn6i1Zipl2siy4g3enVgX x4ZnsMfunWRTYJpbga8c6ekHwVu+ld3/MyXRgEDZXxFcuOiHVW8qn7Hi1 XhwQhAsaQ6TZTm56IIbecJJyOEkrm9Mi0kRQrRM1MPuO6KeZj3+Y9cYXB pK3NbvbMM892Fyfd9Un8Yy/LTW67lQKtzEHaQaM+Srd6eNKeOmW/Xroir 9yllTuCBisqeRPN+29bkUb+7EZyLSm5+S9pYLKpYF9Msg0eCOQxe6e/RU g==; IronPort-SDR: v+7HzRm6ZU3GkPV64kRGD16/7scyvd2vYdqcHz0ty8cK1vNbtM2HF6uxhNLg4g1GQc3su7FKMi QtntPtKQiTji9A9sGVVlUJKzSa/P4fp+hSBTxOSbJIlZVmRM0VAIsC3YFPAUgiJ9Mnxjp8GB+Y 2w16EzQfeV4aeLyypeGU3GOwUuC2RUorQDPSN05VwYaklmrFmdkaQZGWbsI3MNvgSxDNDdPxrG /GDBxxasFqefzcEk7u8xb39h/VRt6Z9CclwDdN3Ncv2A4bObmUcUpear76MugJejgEXlp/I2ue Y+A= X-IronPort-AV: E=Sophos;i="5.78,377,1599548400"; d="scan'208";a="95101537" Received: from smtpout.microchip.com (HELO email.microchip.com) ([198.175.253.82]) by esa4.microchip.iphmx.com with ESMTP/TLS/AES256-SHA256; 28 Nov 2020 03:17:24 -0700 Received: from chn-vm-ex02.mchp-main.com (10.10.85.144) by chn-vm-ex01.mchp-main.com (10.10.85.143) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.1979.3; Sat, 28 Nov 2020 03:17:24 -0700 Received: from NAM10-DM6-obe.outbound.protection.outlook.com (10.10.215.89) by email.microchip.com (10.10.87.72) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.1979.3 via Frontend Transport; Sat, 28 Nov 2020 03:17:24 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Hj0+pwuggbpCsjwcUV2fbzscL7dk/s2lprGJ2nhjgOWZy9O6ZQ1Cu7txrgrhqUbCbaiOyDzS/dQb47Jc09g2/eTwXLSA3h0ynQzCBTrcXyyLhfmAtqY6orpgyw4iG1FbfaesT8aO7Lp47dTN0AwVXOxyQ1xCS/NPvdKJcf/aH2vgyTV//F/u4dQM4hIu+vDszQR7Emq3N8Su5464H8vd0FlZOX2LAM3299k8O+m2ED/NjhIoMRs9Cieri0TSnxYFDYf2MAghk+1Ox53VzypnCEEFWBEEr+QdCDDG+un8piz0A0dRR9/3tdiqYc/m+vCCingQXfTOaVZg0Yfru8aWFw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=zUK7lKqm1/HIcwQxDs8ov1pg/U7VYtZjxlpEvvshpSw=; b=jytvcUz6+8g6xs2cBq9s5LJhl+HpvS2QgTG3J7cvaBU0toZkj115qbWzhe4dgzM13Tc2Jf4cFEDjvEImLRWIpfB2JdJPrfMTtFdWNFLBea9xgZtjc8L4bzrWcdDJczBdVTXkuDIBBvXFQLNSOBayRmFpLUBDuJkjQUanDo8FJwd7DRCC09Q8uXEGncA+ywsYccBJFDsYRLgDZb9rRvWSy5cwPzeLKQcs9a7vuHUB+ralQ1AmHCKf/OXuvIyjWplqUvYJ8Uf6oJv9DuDcUm+5KUxIHkMTVkRaLJUPzwA6k1LXLRtFN3ZmD/erQcXnyHc9oFdzfpDZPabWz/hW6kqypg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=microchip.com; dmarc=pass action=none header.from=microchip.com; dkim=pass header.d=microchip.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=microchiptechnology.onmicrosoft.com; s=selector2-microchiptechnology-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=zUK7lKqm1/HIcwQxDs8ov1pg/U7VYtZjxlpEvvshpSw=; b=EFT6GKdAiC/RwrrVFOWpALIQWFffmgP7BnFgn/ojBkLykBxMpS927ITpHRfJeek4ST/X73gnNZokcYprNhKwlbZmu9ZI8iPM7dy8zWWDVtKl8dhNHCCtbYehGLrRNH9ZiwJafJ0KAQPMeReBIKDji4F6+k9iY+mlFw2RqYMpZ8Y= Received: from SA2PR11MB4874.namprd11.prod.outlook.com (2603:10b6:806:f9::23) by SA2PR11MB5100.namprd11.prod.outlook.com (2603:10b6:806:119::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3611.20; Sat, 28 Nov 2020 10:17:21 +0000 Received: from SA2PR11MB4874.namprd11.prod.outlook.com ([fe80::6903:3212:cc9e:761]) by SA2PR11MB4874.namprd11.prod.outlook.com ([fe80::6903:3212:cc9e:761%7]) with mapi id 15.20.3611.026; Sat, 28 Nov 2020 10:17:20 +0000 From: To: , , Subject: Re: [PATCH v6 5/5] mtd: spi-nor: keep lock bits if they are non-volatile Thread-Topic: [PATCH v6 5/5] mtd: spi-nor: keep lock bits if they are non-volatile Thread-Index: AQHWxW+nmejBYVo+OESi/M9WLE7bHw== Date: Sat, 28 Nov 2020 10:17:20 +0000 Message-ID: <432b31a7-2560-3b83-44d2-aa82c2e322ae@microchip.com> References: <20201126202614.5710-1-michael@walle.cc> <20201126202614.5710-6-michael@walle.cc> In-Reply-To: <20201126202614.5710-6-michael@walle.cc> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: user-agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.10.0 authentication-results: walle.cc; dkim=none (message not signed) header.d=none;walle.cc; dmarc=none action=none header.from=microchip.com; x-originating-ip: [79.115.63.172] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: cc047ac6-9203-4686-8071-08d89386caca x-ms-traffictypediagnostic: SA2PR11MB5100: x-microsoft-antispam-prvs: x-bypassexternaltag: True x-ms-oob-tlc-oobclassifiers: OLM:10000; x-ms-exchange-senderadcheck: 1 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: cL/rzWhFxHSxl90neM+tOM1ZsQbHV21TBsWggBOhDQ+5yzGVyugXpniTnzQh0u/fYjpc04pMBxPt0RtYxQLecufnFnvmCfqCk7+KUNn8hz8zr8H/iUYCrk+Oe0iwsZBlE0Mwh6L2AIIjttNLnWoSi5n8yOAJaGyPwFMma7XIvzfWn+zze9DhmG6wCcGQZAZb2q+KbZIeE3/D22JTp+1OZD5wescYNHctSUUcP73USaT0Ru8RP5cQBeRSHNquI04P26abbUI64OSsy26D4Einn6EY7zPXe5qh0TOASyNBJqeg1pWY1SjMF7pLaqydQPNY4wTe1r8WU63C9OrwsjA6cmF9eFUP248opZhT7BBrHFf6dE+wz5qptv2gBqXGiX0z x-forefront-antispam-report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:SA2PR11MB4874.namprd11.prod.outlook.com; PTR:; CAT:NONE; SFS:(136003)(346002)(366004)(39850400004)(376002)(396003)(6486002)(110136005)(54906003)(316002)(83380400001)(71200400001)(478600001)(6512007)(2906002)(8936002)(2616005)(30864003)(8676002)(5660300002)(66946007)(186003)(66476007)(53546011)(31696002)(64756008)(6506007)(26005)(66556008)(36756003)(66446008)(31686004)(86362001)(4326008)(76116006)(43740500002)(579004)(559001); DIR:OUT; SFP:1101; x-ms-exchange-antispam-messagedata: =?utf-8?B?Q1dZUk4rN2JKbFJxckEycW1FeUVaQTdmRkZuY28xSzNVUXhTNkZsTk9rTTk5?= =?utf-8?B?bzdwTjRhdzF0bXB0R0pPV2VxMjBlVzB1b0wwN0ZaSWdYTkpyRHA0ZXdNQXJD?= =?utf-8?B?bUl3eWpPd2hndXV0NGRhd3UvY0tBczFtTm1wMWRQN2VxZWNFMjVqbGk4d0Ex?= =?utf-8?B?ZHRUQURPYXRFK05MV1VNbUZHOXhiVUFvV3NKbk1WVWtsbmswa3F0KzBzRVhP?= =?utf-8?B?YzBNOEpheXFqTWwyUkl2czZsYTk1dUhqdkVkeGlvZ3h3REhyVStMVTBScXRv?= =?utf-8?B?dFk1Mk8wZFNuU25TOEFjZkdWM2t4bzI3YXM3cG9TSnZGbEZPZUZFOG9KNk4x?= =?utf-8?B?cWp0dm5icUh0Tk5TNDVHQVFpNHdKVFZySzAxV3EvK2ZSakRaZGM5RGdXZkJx?= =?utf-8?B?SjYrc1dINXRiVm1zWXZKUUk1d3c3MEZZTTdMZmdoNytCR3dYN212OENBNFNa?= =?utf-8?B?N29aMWRoK0t6SHhaVG5CYmkxdkU4NUVtVlpKNHh1MjI4WWNXU0J6ejFlS1N0?= =?utf-8?B?c3FxYmNZV0ovdktuTkgyV3Y2ZEZxMEc2cjk5T0s1UERreUhrVlZGUGFQNE1D?= =?utf-8?B?ZURyQ3dsYXJFcGl0Unh3K2Q4eDFyVDRoaWlZYkhKK1lXd25INjhpYytxWTVo?= =?utf-8?B?NnZyUjZma3ZVQnNoVU9CY3o0MkM5aE91WlVXVC9yMTJRZ0lpUGQ4SldEZWgx?= =?utf-8?B?Q01mMVZ6Y3QvdjRiYVBhWG9NVzhhK0dhNy9zb0hSOVhTRzM1a2NYcE5lcm53?= =?utf-8?B?eTNiKzBWSFMxM05oaEZwL2Q2UEQwamtINmx6ME1QdTB1TldSeHEwMTE3cHlF?= =?utf-8?B?YzJHR0tKTUErTk1pYXRWWkRnVnRDY0JpUUJURm8xR3h5b2RkNjg5bkErMmI2?= =?utf-8?B?Z0ZBVmdGMUVlbGtPMk9hd1crbE5rMk0zVlZRSldIOCtacHZtZ0ZMeElIRS9U?= =?utf-8?B?bno1VXgrNnk3OThvVnVncW9UVW9hdGFsV2JNMkxLSlozYldqdFg3S2FKUHZu?= =?utf-8?B?V250WXBuMmRPNDNhSVljNjA5ZVJhTXJDelBqQVRNRXE2cWc1SE5udkdkNUJv?= =?utf-8?B?b3p3eCtndWJuZEpFSjdtRHRUZGNKUnFFNXd5Sjd5UXRNUHFMZ3pwSy9OUWxp?= =?utf-8?B?RzBEcGphUXpueWhXeXQ4a3BlWWFNcWZxN3l5SW1EVmN1ZlY3bHNKZFg2Y21z?= =?utf-8?B?TGt5YUwyTFl1bE1PcXJaU0tFNWNnMVo1V292N05PVVlhK3M4ZmNvN2tNYlVZ?= =?utf-8?B?a3dZdU1RYk9DdnRTak9HRlIrS094dmc2MUxucHFDMDdPTzNReWJHdTJyeWph?= =?utf-8?Q?ONh5ZFAEDv0gQ=3D?= x-ms-exchange-transport-forked: True Content-ID: MIME-Version: 1.0 X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: SA2PR11MB4874.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: cc047ac6-9203-4686-8071-08d89386caca X-MS-Exchange-CrossTenant-originalarrivaltime: 28 Nov 2020 10:17:20.7874 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 3f4057f3-b418-4d4e-ba84-d55b4e897d88 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: BLu+ipo/aZHZMRhDnv9YUKWXVa+iocKYm6jMcHZKxMQtms5GhsibhcjWPdjO4BchDVNIc9gophv8Bh4c2wJcM2lbzB1gZc/u3F43nW7pnOY= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA2PR11MB5100 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20201128_051727_056349_B445BAD3 X-CRM114-Status: GOOD ( 33.02 ) 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: richard@nod.at, boris.brezillon@collabora.com, vigneshr@ti.com, miquel.raynal@bootlin.com Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-mtd" Errors-To: linux-mtd-bounces+linux-mtd=archiver.kernel.org@lists.infradead.org On 11/26/20 10:26 PM, Michael Walle wrote: > EXTERNAL EMAIL: Do not click links or open attachments unless you know the content is safe > > Traditionally, linux unlocks the whole flash because there are legacy > devices which has the write protections bits set by default at startup. > If you actually want to use the flash protection bits, eg. because there > is a read-only part for a bootloader, this automatic unlocking is > harmful. If there is no hardware write protection in place (usually > called WP#), a startup of the kernel just discards this protection. > > I've gone through the datasheets of all the flashes (except the Intel > ones where I could not find any datasheet nor reference) which supports > the unlocking feature and looked how the sector protection was > implemented. The currently supported flashes can be divided into the > following two categories: > (1) block protection bits are non-volatile. Thus they keep their values > at reset and power-cycle > (2) flashes where these bits are volatile. After reset or power-cycle, > the whole memory array is protected. > (a) some devices needs a special "Global Unprotect" command, eg. > the Atmel AT25DF041A. > (b) some devices require to clear the BPn bits in the status > register. > > Due to the reasons above, we do not want to clear the bits for flashes > which belong to category (1). Fortunately for us, only Atmel flashes > fall into category (2a). Implement the "Global Protect" and "Global > Unprotect" commands for these. For (2b) we can use normal block > protection locking scheme. > > This patch adds a new flag to indicate the case (2). Only if we have > such a flash we unlock the whole flash array. To be backwards compatible > it also introduces a kernel configuration option which restores the > complete legacy behavior ("Disable write protection on any flashes"). > Hopefully, this will clean up "unlock the entire flash for legacy > devices" once and for all. > > For reference here are the actually commits which introduced the legacy > behaviour (and extended the behaviour to other chip manufacturers): typo: behavior > > commit f80e521c916cb ("mtd: m25p80: add support for the Intel/Numonyx {16,32,64}0S33B SPI flash chips") > commit ea60658a08f8f ("mtd: m25p80: disable SST software protection bits by default") > commit 7228982442365 ("[MTD] m25p80: fix bug - ATmel spi flash fails to be copied to") > > Actually, this might also fix handling of the Atmel AT25DF flashes, > because the original commit 7228982442365 ("[MTD] m25p80: fix bug - > ATmel spi flash fails to be copied to") was writing a 0 to the status > register, which is a "Global Unprotect". This might not be the case in > the current code which only handles the block protection bits BP2, BP1 > and BP0. Thus, it depends on the current contents of the status register > if this unlock actually corresponds to a "Global Unprotect" command. In > the worst case, the current code might leave the AT25DF flashes in a > write protected state. > > The commit 191f5c2ed4b6f ("mtd: spi-nor: use 16-bit WRR command when QE > is set on spansion flashes") changed that behaviour by just clearing BP2 > to BP0 instead of writing a 0 to the status register. > > Further, the commit 3e0930f109e76 ("mtd: spi-nor: Rework the disabling > of block write protection") expanded the unlock_all() feature to ANY > flash which supports locking. > > Signed-off-by: Michael Walle > --- > changes since v5: > - also set SRWD bit for the "Global Protect" command > - use spi_nor_write_sr() instead of spi_nor_write_sr_and_check() to send > the "Global Protect" or "Global Unprotect" command > - mark ESMT F25L32QA as non-volatile as indicated in a newer datasheet > revision > - rebased to latest tree > > changes since v4: > - made atmel_global_protection_default_init() static, spotted by > lkp@intel.com > > changes since v3: > - now defaulting to MTD_SPI_NOR_WP_DISABLE_ON_VOLATILE, suggested by Vignesh > - restored the original spi_nor_unlock_all(), instead add individual > locking ops for the "Global Protect" scheme in atmel.c. This was tested > partly with the AT25SL321 (for the test I added the fixups to this > flash). > - renamed SPI_NOR_UNPROTECT to SPI_NOR_WP_IS_VOLATILE. Suggested by > Vingesh, although I've renamed it to a more general "WP_IS_VOLATILE" > because either the BP bits or the individual sector locks might be > volatile. > - add mention of both block protection bits and "Global Unprotect" command > in the Kconfig help text. > > changes since v2: > - add Kconfig option to be able to retain legacy behaviour > - rebased the patch due to the spi-nor rewrite > - dropped the Fixes: tag, it doens't make sense after the spi-nor rewrite > - mention commit 3e0930f109e76 which further modified the unlock > behaviour. > > changes since v1: > - completely rewrote patch, the first version used a device tree flag > > drivers/mtd/spi-nor/Kconfig | 42 ++++++++++++ > drivers/mtd/spi-nor/atmel.c | 127 ++++++++++++++++++++++++++++++++++-- > drivers/mtd/spi-nor/core.c | 36 ++++++---- > drivers/mtd/spi-nor/core.h | 8 +++ > drivers/mtd/spi-nor/esmt.c | 2 +- > drivers/mtd/spi-nor/intel.c | 9 ++- > drivers/mtd/spi-nor/sst.c | 21 +++--- > 7 files changed, 213 insertions(+), 32 deletions(-) > > diff --git a/drivers/mtd/spi-nor/Kconfig b/drivers/mtd/spi-nor/Kconfig > index ffc4b380f2b1..11e6658ee85d 100644 > --- a/drivers/mtd/spi-nor/Kconfig > +++ b/drivers/mtd/spi-nor/Kconfig > @@ -24,6 +24,48 @@ config MTD_SPI_NOR_USE_4K_SECTORS > Please note that some tools/drivers/filesystems may not work with > 4096 B erase size (e.g. UBIFS requires 15 KiB as a minimum). > > +choice > + prompt "Write protection at boot" > + default MTD_SPI_NOR_WP_DISABLE_ON_VOLATILE > + > +config MTD_SPI_NOR_WP_DISABLE Maybe it's just me, but when I see WP, I think about the WP# signal, which is somehow related. I think I would prefer to use SWP instead, which comes from Software Write Protection, which should be good for both the BPn protection and for the Individual Sector Protection with its Global Lock and Unlock. I won't stall the series just for this, so do as you prefer. > + bool "Disable WP on any flashes (legacy behaviour)" typo: behavior > + help > + This option disables the write protection on any SPI flashes at If you'll choose SWP, you have to update description here and there. For example s/write protection/software write protection. > + boot-up. > + > + Depending on the flash chip this either clears the block protection > + bits or does a "Global Unprotect" command. > + > + Don't use this if you intent to use the write protection of your > + SPI flash. This is only to keep backwards compatibility. > + > +config MTD_SPI_NOR_WP_DISABLE_ON_VOLATILE > + bool "Disable WP on flashes w/ volatile protection bits" > + help > + Some SPI flashes have volatile block protection bits, ie. after a > + power-up or a reset the flash is write protected by default. > + > + This option disables the write protection for these kind of flashes > + while keeping it enabled for any other SPI flashes which have > + non-volatile write protection bits. > + > + If the write protection will be disabled depending on the flash > + either the block protection bits are cleared or a "Global Unprotect" > + command is issued. > + > + If you are unsure, select this option. > + > +config MTD_SPI_NOR_WP_KEEP > + bool "Keep write protection as is" > + help > + If you select this option the write protection of any SPI flashes > + will not be changed. If your flash is write protected or will be > + automatically write protected after power-up you have to manually > + unlock it before you are able to write to it. > + > +endchoice > + > source "drivers/mtd/spi-nor/controllers/Kconfig" > > endif # MTD_SPI_NOR > diff --git a/drivers/mtd/spi-nor/atmel.c b/drivers/mtd/spi-nor/atmel.c > index fe6a4653823d..215df7c4272b 100644 > --- a/drivers/mtd/spi-nor/atmel.c > +++ b/drivers/mtd/spi-nor/atmel.c > @@ -8,6 +8,8 @@ > > #include "core.h" > > +#define ATMEL_SR_GLOBAL_PROTECT_MASK GENMASK(5, 2) > + > /* > * The Atmel AT25FS010/AT25FS040 parts have some weird configuration for the > * block protection bits. We don't support them. But legacy behaviour in linux > @@ -55,6 +57,103 @@ static const struct spi_nor_fixups atmel_at25fs_fixups = { > .default_init = atmel_at25fs_default_init, > }; > > +/** > + * atmel_set_global_protection - Do a Global Protect or Unprotect command > + * @nor: pointer to 'struct spi_nor' > + * @ofs: offset in bytes > + * @len: len in bytes > + * @is_protect: if true do a Global Protect otherwise it is a Global Unprotect > + * > + * Return: 0 on success, -error otherwise. > + */ > +static int atmel_set_global_protection(struct spi_nor *nor, loff_t ofs, > + uint64_t len, bool is_protect) > +{ > + int ret; > + u8 sr; > + > + /* We only support locking the whole flash array */ > + if (ofs || len != nor->params->size) > + return -EINVAL; > + > + ret = spi_nor_read_sr(nor, nor->bouncebuf); > + if (ret) > + return ret; maybe a new line in between. > + sr = nor->bouncebuf[0]; > + > + /* SRWD bit needs to be cleared, otherwise the protection doesn't change */ > + if (sr & SR_SRWD) { > + sr &= ~SR_SRWD; > + ret = spi_nor_write_sr_and_check(nor, sr); > + if (ret) { > + dev_err(nor->dev, "unable to clear SRWD bit, WP# asserted?\n"); spi_nor_write_sr_and_check() already prints a dev_dbg(). If you find a second message useful, you should use dev_dbg for low level info. > + return ret; > + } > + } > + > + if (is_protect) { > + sr |= ATMEL_SR_GLOBAL_PROTECT_MASK; > + /* > + * Set the SRWD bit again as soon as we are protecting > + * anything. This will ensure that the WP# pin is working > + * correctly. By doing this we also behave the same as > + * spi_nor_sr_lock(), which sets SRWD if any block protection > + * is active. > + */ > + sr |= SR_SRWD; > + } else { > + sr &= ~ATMEL_SR_GLOBAL_PROTECT_MASK; > + } > + > + nor->bouncebuf[0] = sr; > + > + /* > + * We cannot use the spi_nor_write_sr_and_check() because this command > + * isn't really setting any bits, instead it is an pseudo command for > + * "Global Unprotect" or "Global Protect" > + */ > + return spi_nor_write_sr(nor, nor->bouncebuf, 1); > +} > + > +static int atmel_global_protect(struct spi_nor *nor, loff_t ofs, uint64_t len) > +{ > + return atmel_set_global_protection(nor, ofs, len, true); > +} > + > +static int atmel_global_unprotect(struct spi_nor *nor, loff_t ofs, uint64_t len) > +{ > + return atmel_set_global_protection(nor, ofs, len, false); > +} > + > +static int atmel_is_global_protected(struct spi_nor *nor, loff_t ofs, uint64_t len) > +{ > + int ret; > + > + if (ofs >= nor->params->size || (ofs + len) > nor->params->size) > + return -EINVAL; > + > + ret = spi_nor_read_sr(nor, nor->bouncebuf); > + if (ret) > + return ret; > + > + return ((nor->bouncebuf[0] & ATMEL_SR_GLOBAL_PROTECT_MASK) == ATMEL_SR_GLOBAL_PROTECT_MASK); > +} > + > +static const struct spi_nor_locking_ops atmel_global_protection_ops = { > + .lock = atmel_global_protect, > + .unlock = atmel_global_unprotect, > + .is_locked = atmel_is_global_protected, > +}; > + > +static void atmel_global_protection_default_init(struct spi_nor *nor) > +{ > + nor->params->locking_ops = &atmel_global_protection_ops; > +} > + > +static const struct spi_nor_fixups atmel_global_protection_fixups = { > + .default_init = atmel_global_protection_default_init, > +}; > + > static const struct flash_info atmel_parts[] = { > /* Atmel -- some are (confusingly) marketed as "DataFlash" */ > { "at25fs010", INFO(0x1f6601, 0, 32 * 1024, 4, SECT_4K | SPI_NOR_HAS_LOCK) > @@ -62,18 +161,32 @@ static const struct flash_info atmel_parts[] = { > { "at25fs040", INFO(0x1f6604, 0, 64 * 1024, 8, SECT_4K | SPI_NOR_HAS_LOCK) > .fixups = &atmel_at25fs_fixups }, > > - { "at25df041a", INFO(0x1f4401, 0, 64 * 1024, 8, SECT_4K | SPI_NOR_HAS_LOCK) }, > - { "at25df321", INFO(0x1f4700, 0, 64 * 1024, 64, SECT_4K | SPI_NOR_HAS_LOCK) }, > - { "at25df321a", INFO(0x1f4701, 0, 64 * 1024, 64, SECT_4K | SPI_NOR_HAS_LOCK) }, > - { "at25df641", INFO(0x1f4800, 0, 64 * 1024, 128, SECT_4K | SPI_NOR_HAS_LOCK) }, > + { "at25df041a", INFO(0x1f4401, 0, 64 * 1024, 8, > + SECT_4K | SPI_NOR_HAS_LOCK | SPI_NOR_WP_IS_VOLATILE) > + .fixups = &atmel_global_protection_fixups }, > + { "at25df321", INFO(0x1f4700, 0, 64 * 1024, 64, > + SECT_4K | SPI_NOR_HAS_LOCK | SPI_NOR_WP_IS_VOLATILE) > + .fixups = &atmel_global_protection_fixups }, > + { "at25df321a", INFO(0x1f4701, 0, 64 * 1024, 64, > + SECT_4K | SPI_NOR_HAS_LOCK | SPI_NOR_WP_IS_VOLATILE) > + .fixups = &atmel_global_protection_fixups }, > + { "at25df641", INFO(0x1f4800, 0, 64 * 1024, 128, > + SECT_4K | SPI_NOR_HAS_LOCK | SPI_NOR_WP_IS_VOLATILE) > + .fixups = &atmel_global_protection_fixups }, > > { "at25sl321", INFO(0x1f4216, 0, 64 * 1024, 64, > SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, > > { "at26f004", INFO(0x1f0400, 0, 64 * 1024, 8, SECT_4K) }, > - { "at26df081a", INFO(0x1f4501, 0, 64 * 1024, 16, SECT_4K | SPI_NOR_HAS_LOCK) }, > - { "at26df161a", INFO(0x1f4601, 0, 64 * 1024, 32, SECT_4K | SPI_NOR_HAS_LOCK) }, > - { "at26df321", INFO(0x1f4700, 0, 64 * 1024, 64, SECT_4K | SPI_NOR_HAS_LOCK) }, > + { "at26df081a", INFO(0x1f4501, 0, 64 * 1024, 16, > + SECT_4K | SPI_NOR_HAS_LOCK | SPI_NOR_WP_IS_VOLATILE) > + .fixups = &atmel_global_protection_fixups }, > + { "at26df161a", INFO(0x1f4601, 0, 64 * 1024, 32, > + SECT_4K | SPI_NOR_HAS_LOCK | SPI_NOR_WP_IS_VOLATILE) > + .fixups = &atmel_global_protection_fixups }, > + { "at26df321", INFO(0x1f4700, 0, 64 * 1024, 64, > + SECT_4K | SPI_NOR_HAS_LOCK | SPI_NOR_WP_IS_VOLATILE) > + .fixups = &atmel_global_protection_fixups }, > > { "at45db081d", INFO(0x1f2500, 0, 64 * 1024, 16, SECT_4K) }, > }; > diff --git a/drivers/mtd/spi-nor/core.c b/drivers/mtd/spi-nor/core.c > index 8c06a28a90de..8354ce0c8810 100644 > --- a/drivers/mtd/spi-nor/core.c > +++ b/drivers/mtd/spi-nor/core.c > @@ -377,7 +377,7 @@ int spi_nor_write_disable(struct spi_nor *nor) > * > * Return: 0 on success, -errno otherwise. > */ > -static int spi_nor_read_sr(struct spi_nor *nor, u8 *sr) > +int spi_nor_read_sr(struct spi_nor *nor, u8 *sr) > { > int ret; > > @@ -1049,7 +1049,7 @@ static int spi_nor_write_16bit_cr_and_check(struct spi_nor *nor, u8 cr) > * > * Return: 0 on success, -errno otherwise. > */ > -static int spi_nor_write_sr_and_check(struct spi_nor *nor, u8 sr1) > +int spi_nor_write_sr_and_check(struct spi_nor *nor, u8 sr1) > { > if (nor->flags & SNOR_F_HAS_16BIT_SR) > return spi_nor_write_16bit_sr_and_check(nor, sr1); > @@ -3124,15 +3124,14 @@ static int spi_nor_quad_enable(struct spi_nor *nor) > * spi_nor_unlock_all() - Unlocks the entire flash memory array. > * @nor: pointer to a 'struct spi_nor'. > * > - * Some SPI NOR flashes are write protected by default after a power-on reset > - * cycle, in order to avoid inadvertent writes during power-up. Backward > - * compatibility imposes to unlock the entire flash memory array at power-up > - * by default. > + * Return: 0 on success, -errno otherwise. > */ > static int spi_nor_unlock_all(struct spi_nor *nor) > { > - if (nor->flags & SNOR_F_HAS_LOCK) > + if (nor->flags & SNOR_F_HAS_LOCK) { > + dev_dbg(nor->dev, "unprotecting entire flash\n"); > return spi_nor_unlock(&nor->mtd, 0, nor->params->size); > + } > > return 0; > } > @@ -3153,10 +3152,23 @@ static int spi_nor_init(struct spi_nor *nor) > return err; > } > > - err = spi_nor_unlock_all(nor); > - if (err) { > - dev_dbg(nor->dev, "Failed to unlock the entire flash memory array\n"); > - return err; > + /* > + * Some SPI NOR flashes are write protected by default after a power-on > + * reset cycle, in order to avoid inadvertent writes during power-up. > + * Backward compatibility imposes to unlock the entire flash memory > + * array at power-up by default. Depending on the kernel configuration > + * (1) we do nothing, (2) we unlock the entire flash in any case or (3) > + * just do it actually powers up write-protected. The latter is do it if it actually powers up How about: (1) do nothing, (2) always unlock the entire flash array, (3) unlock the entire flash array only when the software protection bits are volatile. > + * indicated by SNOR_F_WP_IS_VOLATILE. > + */ > + if (IS_ENABLED(CONFIG_MTD_SPI_NOR_WP_DISABLE) || > + (IS_ENABLED(CONFIG_MTD_SPI_NOR_WP_DISABLE_ON_VOLATILE) && > + nor->flags & SNOR_F_WP_IS_VOLATILE)) { > + err = spi_nor_unlock_all(nor); > + if (err) { > + dev_err(nor->dev, "Failed to unlock the entire flash memory array\n"); dev_dbg for low level info > + return err; > + } > } > > if (nor->addr_width == 4 && > @@ -3456,6 +3468,8 @@ int spi_nor_scan(struct spi_nor *nor, const char *name, > nor->flags |= SNOR_F_NO_OP_CHIP_ERASE; > if (info->flags & USE_CLSR) > nor->flags |= SNOR_F_USE_CLSR; > + if (info->flags & SPI_NOR_WP_IS_VOLATILE) > + nor->flags |= SNOR_F_WP_IS_VOLATILE; > > if (info->flags & SPI_NOR_4BIT_BP) { > nor->flags |= SNOR_F_HAS_4BIT_BP; > diff --git a/drivers/mtd/spi-nor/core.h b/drivers/mtd/spi-nor/core.h > index 16b350e1d865..6bf86c2994c8 100644 > --- a/drivers/mtd/spi-nor/core.h > +++ b/drivers/mtd/spi-nor/core.h > @@ -28,6 +28,7 @@ enum spi_nor_option_flags { > SNOR_F_HAS_SR_BP3_BIT6 = BIT(13), > SNOR_F_IO_MODE_EN_VOLATILE = BIT(14), > SNOR_F_SOFT_RESET = BIT(15), > + SNOR_F_WP_IS_VOLATILE = BIT(16), > }; > > struct spi_nor_read_command { > @@ -329,6 +330,11 @@ struct flash_info { > * available I/O mode via a > * volatile bit. > */ > +#define SPI_NOR_WP_IS_VOLATILE BIT(22) /* > + * Flash has volatile write protection > + * bits. Usually these will power-up in > + * a write-protected state. > + */ > > /* Part specific fixup hooks. */ > const struct spi_nor_fixups *fixups; > @@ -430,7 +436,9 @@ void spi_nor_unlock_and_unprep(struct spi_nor *nor); > int spi_nor_sr1_bit6_quad_enable(struct spi_nor *nor); > int spi_nor_sr2_bit1_quad_enable(struct spi_nor *nor); > int spi_nor_sr2_bit7_quad_enable(struct spi_nor *nor); > +int spi_nor_read_sr(struct spi_nor *nor, u8 *sr); > int spi_nor_write_sr(struct spi_nor *nor, const u8 *sr, size_t len); > +int spi_nor_write_sr_and_check(struct spi_nor *nor, u8 sr1); > > int spi_nor_xread_sr(struct spi_nor *nor, u8 *sr); > ssize_t spi_nor_read_data(struct spi_nor *nor, loff_t from, size_t len, > diff --git a/drivers/mtd/spi-nor/esmt.c b/drivers/mtd/spi-nor/esmt.c > index c93170008118..d970f6da27c2 100644 > --- a/drivers/mtd/spi-nor/esmt.c > +++ b/drivers/mtd/spi-nor/esmt.c > @@ -11,7 +11,7 @@ > static const struct flash_info esmt_parts[] = { > /* ESMT */ > { "f25l32pa", INFO(0x8c2016, 0, 64 * 1024, 64, > - SECT_4K | SPI_NOR_HAS_LOCK) }, > + SECT_4K | SPI_NOR_HAS_LOCK | SPI_NOR_WP_IS_VOLATILE) }, > { "f25l32qa", INFO(0x8c4116, 0, 64 * 1024, 64, > SECT_4K | SPI_NOR_HAS_LOCK) }, > { "f25l64qa", INFO(0x8c4117, 0, 64 * 1024, 128, > diff --git a/drivers/mtd/spi-nor/intel.c b/drivers/mtd/spi-nor/intel.c > index 6c31bef3fc60..0bb1e3fd9702 100644 > --- a/drivers/mtd/spi-nor/intel.c > +++ b/drivers/mtd/spi-nor/intel.c > @@ -10,9 +10,12 @@ > > static const struct flash_info intel_parts[] = { > /* Intel/Numonyx -- xxxs33b */ > - { "160s33b", INFO(0x898911, 0, 64 * 1024, 32, SPI_NOR_HAS_LOCK) }, > - { "320s33b", INFO(0x898912, 0, 64 * 1024, 64, SPI_NOR_HAS_LOCK) }, > - { "640s33b", INFO(0x898913, 0, 64 * 1024, 128, SPI_NOR_HAS_LOCK) }, > + { "160s33b", INFO(0x898911, 0, 64 * 1024, 32, > + SPI_NOR_HAS_LOCK | SPI_NOR_WP_IS_VOLATILE) }, > + { "320s33b", INFO(0x898912, 0, 64 * 1024, 64, > + SPI_NOR_HAS_LOCK | SPI_NOR_WP_IS_VOLATILE) }, > + { "640s33b", INFO(0x898913, 0, 64 * 1024, 128, > + SPI_NOR_HAS_LOCK | SPI_NOR_WP_IS_VOLATILE) }, > }; > > const struct spi_nor_manufacturer spi_nor_intel = { > diff --git a/drivers/mtd/spi-nor/sst.c b/drivers/mtd/spi-nor/sst.c > index 8b169fa4102a..5e4450877d66 100644 > --- a/drivers/mtd/spi-nor/sst.c > +++ b/drivers/mtd/spi-nor/sst.c > @@ -11,26 +11,27 @@ > static const struct flash_info sst_parts[] = { > /* SST -- large erase sizes are "overlays", "sectors" are 4K */ > { "sst25vf040b", INFO(0xbf258d, 0, 64 * 1024, 8, > - SECT_4K | SST_WRITE | SPI_NOR_HAS_LOCK) }, > + SECT_4K | SST_WRITE | SPI_NOR_HAS_LOCK | SPI_NOR_WP_IS_VOLATILE) }, > { "sst25vf080b", INFO(0xbf258e, 0, 64 * 1024, 16, > - SECT_4K | SST_WRITE | SPI_NOR_HAS_LOCK) }, > + SECT_4K | SST_WRITE | SPI_NOR_HAS_LOCK | SPI_NOR_WP_IS_VOLATILE) }, > { "sst25vf016b", INFO(0xbf2541, 0, 64 * 1024, 32, > - SECT_4K | SST_WRITE | SPI_NOR_HAS_LOCK) }, > + SECT_4K | SST_WRITE | SPI_NOR_HAS_LOCK | SPI_NOR_WP_IS_VOLATILE) }, > { "sst25vf032b", INFO(0xbf254a, 0, 64 * 1024, 64, > - SECT_4K | SST_WRITE | SPI_NOR_HAS_LOCK) }, > - { "sst25vf064c", INFO(0xbf254b, 0, 64 * 1024, 128, SECT_4K | SPI_NOR_HAS_LOCK) }, > + SECT_4K | SST_WRITE | SPI_NOR_HAS_LOCK | SPI_NOR_WP_IS_VOLATILE) }, > + { "sst25vf064c", INFO(0xbf254b, 0, 64 * 1024, 128, > + SECT_4K | SPI_NOR_HAS_LOCK | SPI_NOR_WP_IS_VOLATILE) }, > { "sst25wf512", INFO(0xbf2501, 0, 64 * 1024, 1, > - SECT_4K | SST_WRITE | SPI_NOR_HAS_LOCK) }, > + SECT_4K | SST_WRITE | SPI_NOR_HAS_LOCK | SPI_NOR_WP_IS_VOLATILE) }, > { "sst25wf010", INFO(0xbf2502, 0, 64 * 1024, 2, > - SECT_4K | SST_WRITE | SPI_NOR_HAS_LOCK) }, > + SECT_4K | SST_WRITE | SPI_NOR_HAS_LOCK | SPI_NOR_WP_IS_VOLATILE) }, > { "sst25wf020", INFO(0xbf2503, 0, 64 * 1024, 4, > - SECT_4K | SST_WRITE | SPI_NOR_HAS_LOCK) }, > + SECT_4K | SST_WRITE | SPI_NOR_HAS_LOCK | SPI_NOR_WP_IS_VOLATILE) }, > { "sst25wf020a", INFO(0x621612, 0, 64 * 1024, 4, SECT_4K | SPI_NOR_HAS_LOCK) }, > { "sst25wf040b", INFO(0x621613, 0, 64 * 1024, 8, SECT_4K | SPI_NOR_HAS_LOCK) }, > { "sst25wf040", INFO(0xbf2504, 0, 64 * 1024, 8, > - SECT_4K | SST_WRITE | SPI_NOR_HAS_LOCK) }, > + SECT_4K | SST_WRITE | SPI_NOR_HAS_LOCK | SPI_NOR_WP_IS_VOLATILE) }, > { "sst25wf080", INFO(0xbf2505, 0, 64 * 1024, 16, > - SECT_4K | SST_WRITE | SPI_NOR_HAS_LOCK) }, > + SECT_4K | SST_WRITE | SPI_NOR_HAS_LOCK | SPI_NOR_WP_IS_VOLATILE) }, > { "sst26wf016b", INFO(0xbf2651, 0, 64 * 1024, 32, > SECT_4K | SPI_NOR_DUAL_READ | > SPI_NOR_QUAD_READ) }, > -- > 2.20.1 > Thanks, ta ______________________________________________________ Linux MTD discussion mailing list http://lists.infradead.org/mailman/listinfo/linux-mtd/