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 11B5EC433E6 for ; Mon, 15 Mar 2021 07:29:47 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id D668364DE4 for ; Mon, 15 Mar 2021 07:29:46 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230160AbhCOH3T (ORCPT ); Mon, 15 Mar 2021 03:29:19 -0400 Received: from esa.microchip.iphmx.com ([68.232.154.123]:33340 "EHLO esa.microchip.iphmx.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230092AbhCOH2w (ORCPT ); Mon, 15 Mar 2021 03:28:52 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=microchip.com; i=@microchip.com; q=dns/txt; s=mchp; t=1615793332; x=1647329332; h=from:to:cc:subject:date:message-id:references: in-reply-to:content-id:content-transfer-encoding: mime-version; bh=VZm0YZp5zeeQ1jsSJCwqooSeZXukZyV2gDR5SgtvrKI=; b=QiXKx9oJ/FxpBNcQ+P79mFIttSGSP5PBipb7CmCPGqTR5lFhGIHOpSBM Hk+x0NRL8aa0nq6Oj2GkCwQU00mwp0+rvIqei9kWu1DGvwqnFk7ZxlvoX fpTlBUgq0SD6CeJ0mMVF9GpAajFPJ4mRhWYXh7n2pI/5W+QqnX9MmhqO+ 8QoeJFYFb4RGFdeIMRUEBP98Nv2O7ko0S9DJFaFHs6suznnbKE26D5FM3 NLKIrDqTm0pMMNEqtVwycPR8Uh0Ks1KHIwT1VfTyIq0v/pjcxeP8nRB0z QaFQxedr9kafN1abnXM/pwCjNBdlBWXfw7g0sgOHymjV9aEeLXzjIRBE0 Q==; IronPort-SDR: mcxsKXkyocYJMFua5marZqKIGySPOiOONaOBl9VIP8ctxOSCO3zTj5ondWOPR5NhnpUHSvOB5i iRLw9IqqVtQbrD4ipcjqLq6kaPe1P1LYlyl6v++8Do4xRqkOaDGdfWAJFOH3lj21+fEm31nA4g eBVPdSVg+tD/godHJ1TfjQTgvQF1c5rSGWDBz7gXGMR449f3BP1Pxt67NRfvEzfHXrEIbTCJJZ cjUy9V9/fsFJ1ZTsSRAH3l49HuRYulHfzDpqwKvmc1sz6Frzg7d3lx0OWk11p86zkexiiRL8St O9s= X-IronPort-AV: E=Sophos;i="5.81,249,1610434800"; d="scan'208";a="107187495" Received: from smtpout.microchip.com (HELO email.microchip.com) ([198.175.253.82]) by esa4.microchip.iphmx.com with ESMTP/TLS/AES256-SHA256; 15 Mar 2021 00:28:48 -0700 Received: from chn-vm-ex04.mchp-main.com (10.10.85.152) by chn-vm-ex04.mchp-main.com (10.10.85.152) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2176.2; Mon, 15 Mar 2021 00:28:48 -0700 Received: from NAM04-SN1-obe.outbound.protection.outlook.com (10.10.215.89) by email.microchip.com (10.10.87.151) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2176.2 via Frontend Transport; Mon, 15 Mar 2021 00:28:48 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Dc5MpFelq3QHReO37NpNWEV3zg6U5jZu+JxK2g3L/FqPTjC5Xsrfkq3IvETSNBeItdDAW0yCP7cPqz9BnQ6UsVcntTelT7uYCxMjhW0OfV0SjHiKRTKSf9Sv2S8Z8kN7Luso5ljXkAf8cv1Pyz2KQjXo/djh2rD0CNZ8yAYL8VchIn/XRbSvSfr73bmSWHBgVpG0mLTkjbV49kRuVGuEtLLXPZbzvsjsPZmwX9HDR5+daBsNqfw9lk4PktFcTQemwMn+um8mM4prmiS1j18A9MxP970132X3QZBPGvhIyEsy0Te/o8A8QhtBlrhvvdtPucRbTkwQE+KAWiCyn6cF2g== 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=VZm0YZp5zeeQ1jsSJCwqooSeZXukZyV2gDR5SgtvrKI=; b=nN4ILem6IQ529FmtOroxBt842113UrV5Niw3FonPwH7WnMfHT+mlIXA2X/JafV/wuUXRth5w4RSMA13aPauqPOvR257WSCvj6Pcxr+0wH1a7JWurN6AISJJEqCZuTyqjvvCKhM5UpdYn2OaRqXRV5CdAB1bmrxlQzFkmSW8AknFnKJDgw0TOTpLzSbtuzoMpqB9L4WbbSmg+1NI0qvM/DdXzXvF8nxq9IfP9HjAykfGDHf9sQ5/XAJSR8KxZphVaAGbZ6ATBVnORJbGwJ2ZouOSd8nryPV+38lJOTKld2/v+x3DC18r5ugBYEFJzyVnCoUAC5LisrpVqphKy99Z+eA== 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=VZm0YZp5zeeQ1jsSJCwqooSeZXukZyV2gDR5SgtvrKI=; b=FFfWe7fmXHqf1SAR6TDpYwaXo2W9m/BHLNf6wJo1qO7QPYKZuwzJeB61KmTkQSzNgflhqAaV1J7CSs8dXnW/K8kfeHNh9/nvJ7YRMtIF6szPK1v01Px5uqTP5RBMH436j4PRH+MyObRIf90kKo7q6CyN3lV1TdR7N4kdjSq8pPw= Received: from SA2PR11MB4874.namprd11.prod.outlook.com (2603:10b6:806:f9::23) by SA0PR11MB4639.namprd11.prod.outlook.com (2603:10b6:806:70::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3933.31; Mon, 15 Mar 2021 07:28:47 +0000 Received: from SA2PR11MB4874.namprd11.prod.outlook.com ([fe80::c9e8:9bf4:b08c:c30f]) by SA2PR11MB4874.namprd11.prod.outlook.com ([fe80::c9e8:9bf4:b08c:c30f%7]) with mapi id 15.20.3933.032; Mon, 15 Mar 2021 07:28:47 +0000 From: To: , , CC: , , Subject: Re: [PATCH v4 1/4] mtd: spi-nor: add OTP support Thread-Topic: [PATCH v4 1/4] mtd: spi-nor: add OTP support Thread-Index: AQHXGWzVX5jrWvQlhkiOlI7agfm/7w== Date: Mon, 15 Mar 2021 07:28:47 +0000 Message-ID: <7dd4bfb0-bb38-20c8-68e1-ece836c847fa@microchip.com> References: <20210306000535.9890-1-michael@walle.cc> <20210306000535.9890-2-michael@walle.cc> In-Reply-To: <20210306000535.9890-2-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.111] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: e9080fb7-177c-4e94-53e8-08d8e783f8a3 x-ms-traffictypediagnostic: SA0PR11MB4639: x-ms-exchange-transport-forked: True x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:3826; x-ms-exchange-senderadcheck: 1 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: zLgEtv6AK3iLGNstkZqVnEIS7PCZFyylNFi6gzrzbXxv+eKTaaIbqyZTEdyvswarIX6jj8v3tcm/EzhD1kN6jr5wEDBme5bWgT+9JVUXFwcZi71IUlispHHYaXN7JqHyGzRsSkU6kfan0o458LFS4mclfcOJjm4Gd+2s1N/BZphCkvoB4VQnCGq4RGYoG5rfN0SFcUsjhJq2oN9/5LaND9YfxXLeim/NDVGh9aQzPwoxo2gkJayoWFMaBQUhng5jMTG57fjBItQEZdJaeMo3YCrNeMfWGyENarmwo6EsMtkdA3fr/jtke0SZogT/feWrm/c9bfosUbLfNFfUAXlEvvWto5IN3UmKdcRjo8yA3/Yb6r36Z2JVxhAX8uUopaMojVbN7Yp+ZBmKvjWDuLOr5i2DTdSSVDauJbu+0zS8Pw77eLv1401XjfM9nRSuoUbUlQECIHFJvOSpWKi51OLIy07UaZi8T/1zZfAJLLPrBoObq3U6LX++CdacGyq/0eZsTmBeox2Q9puYBNy6a4jMS19vzZWWTfTuJxZCDyjAWkrQSxu17173E4KSxoVT27RddRdm+Qf1/NfideiIvYSBvyKw6ZwEgAi+eH/P3j7KpNeYgxZO0shx1W7/9HxgBSW6e7MLyCwpLlZvhRiVKxv18XcB8itSUStiEnqY5zJPSqI= 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)(376002)(366004)(396003)(39860400002)(31686004)(6486002)(186003)(2616005)(91956017)(66476007)(6506007)(53546011)(26005)(66446008)(64756008)(66556008)(478600001)(36756003)(8936002)(8676002)(2906002)(54906003)(110136005)(6512007)(31696002)(4326008)(30864003)(5660300002)(83380400001)(71200400001)(66946007)(86362001)(316002)(76116006)(45980500001)(43740500002)(309714004);DIR:OUT;SFP:1101; x-ms-exchange-antispam-messagedata: =?utf-8?B?ck4zOVIrZkpGbHFUekpFcmRPNVB2OHlxb0VjdTI5UVlDS1BqT1BFdTB6Z1lC?= =?utf-8?B?cEQ5MkYzdjdJTFdqMU5ySlV4a0xDeUszWFpibit2L1U5ajRrR1UrNzZBWjNv?= =?utf-8?B?bU0rL2ExL0hjTWtUL2YvbTh4bjVmRWppOHgvai9hazc3Wk5xbnplVWYrZnRJ?= =?utf-8?B?OTlhMllqc3ZrYTQxaldHcGU3WTZsdW5QcHNubGhjYnlMenZveVk4bmVsSjUx?= =?utf-8?B?djFHVFhsU0RjSG9YU0NEWXVSOFdJSlFadElWSzcrazltLzBnOXZQK0ZpN3cy?= =?utf-8?B?THdDbyt3LzNLbTN2N3VGUnBkZWJwQlV3NHRad2ZMWGdLVFJsTzJOZ0xDWEhO?= =?utf-8?B?Uk5zbnViYUtKbDZUSzRMcVhhUzBQNWpkdmlIcWVIajVhV3dZOUErWW9YMnF6?= =?utf-8?B?WU9PcmdFdWtVQmJsZVd2U0p1VWFyUW1taGd4SUdGZzh5c09ia0lWSjltaGdK?= =?utf-8?B?YmtiYU96QVdlalNiNFRUSEtmeFUrZ1hBVlpNY2xZS3pIT213UjlPS2hybDV5?= =?utf-8?B?cWNWY3dpdzl4VnVXWmJqN2UwVmxZYll2NHhpMVBMMWZsUzZCOGNFZnczOG9J?= =?utf-8?B?U1pZSzVCMkF0anh4Qmk4TzZiNjlxM3hBa3d3T3hqZjc2M0s1WE9xUmIwYXRW?= =?utf-8?B?MzJRSGZwOXAyQXlMUGROMXZ2bHhVRFZnWWJVRnhoTXMyRDF3QXB6Mm9FZmNM?= =?utf-8?B?OVdYaEMxNTlBWEFQeUhGRGxvRGZ4cStRTmdrOFVqamFVVmhKa3gxOVJ3OWZO?= =?utf-8?B?QWdPU2pCWDlna1NUOFkxSTdNY09LSnRNdDdteXhTOFhyMkhMUFpuOXRObWdV?= =?utf-8?B?ZFo1KzZWL0xjdGlvcXM4MmxsY3UrN1FodkMrajRFUG9qTXY3enl0cEIyQ3NX?= =?utf-8?B?ZWNVNnlUNjNGTDZkeXo0cmJ2VlY5OW9DSnRpMlY2bzFpQVlMR04rVlJvMng1?= =?utf-8?B?R0NVRzRGWVNEek42M0F1VkFPMS8xdGMzU1h3ZTJMai9XLzZGMDFWakZMQjht?= =?utf-8?B?WWxHM1c1b25pNTZsSlRBTTl2SnhVMXNaTVNrUnZRRk5IM01vS29LMVF5azhM?= =?utf-8?B?citZSXpoY2t2T1kvUW8ySlpNUnNOdDNwYUI3eXk4Y09PWGRNM3hjUjNrYUR1?= =?utf-8?B?MGhlcSsrWHpSS21oQ2NJY0wycU5acEh0cVozV0Iyc09ZR1lQaVN2NVZYT3hM?= =?utf-8?B?MUNKRm5NZkhBUGRwM1BucnJCenBZckRtVFliK1k2Y3QwMHZPNm43d09Ubk9n?= =?utf-8?B?eDZsTGZzQXFMd25CT2s2bjlTeXdYZjlFdDNCTG01Q2IwVkRYYkFxdWNleVZa?= =?utf-8?B?QmZrbGJHNGVDazQ5ZGErd3Q1ODdTSnhhWDNkOUgzUEQ2c0RGaDY0VHRvUUcz?= =?utf-8?B?ajVibDlrc3d2cmNUZDArNldWS09PTkx1RXNJTzZRVVJ1QkxadU8vRDRkajZQ?= =?utf-8?B?akxNa0EzVUpIYjVvL0ovMWNqRG0vSGh6WDdEN0JVMlZhRThWejNsZXNsK0xE?= =?utf-8?B?VHR0Zi9oS3Avc01CS2g0ZkRqMU93d0lDUTczZVdqTCtRb21ZQ0tQbUZrNFlQ?= =?utf-8?B?THhpc1MrazNqQzE0MHFIeUd1aXd0bnVkeCtnN1NRbi8rN3pkbG5MdzNqK2ov?= =?utf-8?B?bVQ1RXZqRzU3REZaTGx3N1pkbm5wenNMek9BSVBPRkhHeU9Nc0s3aHMrRXpt?= =?utf-8?B?cGNic2p1ckIvVk0zck80QUNYL0Z0Y0tWMWw1NDFLeEwvWGpQa0NZQnRPV21M?= =?utf-8?Q?P6Z2BjpXHc9EMrp5Gs=3D?= 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: e9080fb7-177c-4e94-53e8-08d8e783f8a3 X-MS-Exchange-CrossTenant-originalarrivaltime: 15 Mar 2021 07:28:47.0174 (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: mQf3TRroJCFMEOYiWFlZAGATnd/PFQ09miSZVmcqH2anZjTcHpAcUZx1EelQW8lyNYxktKI+ZtyLlszFL4k2nPDJmo0ra46l6UE1Giagqoc= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA0PR11MB4639 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org TWljaGFlbCwNCg0KSnVzdCBjb3NtZXRpYyBzdWdnZXN0aW9ucyB0aGlzIHRpbWUuDQoNCk9uIDMv Ni8yMSAyOjA1IEFNLCBNaWNoYWVsIFdhbGxlIHdyb3RlOg0KPiBFWFRFUk5BTCBFTUFJTDogRG8g bm90IGNsaWNrIGxpbmtzIG9yIG9wZW4gYXR0YWNobWVudHMgdW5sZXNzIHlvdSBrbm93IHRoZSBj b250ZW50IGlzIHNhZmUNCj4gDQo+IFNQSSBmbGFzaGVzIHNvbWV0aW1lcyBoYXZlIGEgc3BlY2lh bCBPVFAgYXJlYSwgd2hpY2ggY2FuIChhbmQgaXMpIHVzZWQgdG8NCj4gc3RvcmUgaW1tdXRhYmxl IHByb3BlcnRpZXMgbGlrZSBib2FyZCBzZXJpYWwgbnVtYmVyIG9yIHZlbmRvciBhc3NpZ25lZA0K PiBuZXR3b3JrIGhhcmR3YXJlIGFkZHJlc3Nlcy4NCj4gDQo+IFRoZSBNVEQgc3Vic3lzdGVtIGFs cmVhZHkgc3VwcG9ydHMgYWNjZXNzaW5nIHN1Y2ggYXJlYXMgYW5kIHNvbWUgKG5vbg0KPiBTUEkg Tk9SKSBmbGFzaGVzIGFscmVhZHkgaW1wbGVtZW50IHN1cHBvcnQgZm9yIGl0LiBJdCBkaWZmZXJl bnRpYXRlcw0KPiBiZXR3ZWVuIHVzZXIgYW5kIGZhY3RvcnkgYXJlYXMuIFVzZXIgYXJlYXMgY2Fu IGJlIHdyaXR0ZW4gYnkgdGhlIHVzZXIgYW5kDQo+IGZhY3Rvcnkgb25lcyBhcmUgcHJlLXByb2dy YW1tZWQgYW5kIGxvY2tlZCBkb3duIGJ5IHRoZSB2ZW5kb3IsIHVzdWFsbHkNCj4gY29udGFpbmlu ZyBhbiAiZWxlY3RyaWNhbCBzZXJpYWwgbnVtYmVyIi4gVGhpcyBwYXRjaCB3aWxsIG9ubHkgYWRk IHN1cHBvcnQNCj4gZm9yIHRoZSB1c2VyIGFyZWFzLg0KPiANCj4gTGF5IHRoZSBmb3VuZGF0aW9u IGFuZCBpbXBsZW1lbnQgdGhlIE1URCBjYWxsYmFja3MgZm9yIHRoZSBTUEkgTk9SIGFuZCBhZGQN Cj4gbmVjZXNzYXJ5IHBhcmFtZXRlcnMgdG8gdGhlIGZsYXNoX2luZm8gc3RydWN0dXJlLiBJZiBh IGZsYXNoIHN1cHBvcnRzIE9UUA0KPiBpdCBjYW4gYmUgYWRkZWQgYnkgdGhlIGNvbnZlbmllbmNl IG1hY3JvIE9UUF9JTkZPKCkuIFNvbWV0aW1lcyB0aGVyZSBhcmUNCj4gaW5kaXZpZHVhbCByZWdp b25zLCB3aGljaCBtaWdodCBoYXZlIGluZGl2aWR1YWwgb2Zmc2V0cy4gVGhlcmVmb3JlLCBpdCBp cw0KPiBwb3NzaWJsZSB0byBzcGVjaWZ5IHRoZSBzdGFydGluZyBhZGRyZXNzIG9mIHRoZSBmaXJz dCByZWdpb25zIGFzIHdlbGwgYXMNCj4gdGhlIGRpc3RhbmNlIGJldHdlZW4gdHdvIHJlZ2lvbnMg KGUuZy4gV2luYm9uZCBkZXZpY2VzIHVzZXMgdGhpcyBtZXRob2QpLg0KPiANCj4gQWRkaXRpb25h bGx5LCB0aGUgcmVnaW9ucyBtaWdodCBiZSBsb2NrZWQgZG93bi4gT25jZSBsb2NrZWQsIG5vIGZ1 cnRoZXINCj4gd3JpdGUgYWNjZXNzIGlzIHBvc3NpYmxlLg0KPiANCj4gRm9yIFNQSSBOT1IgZmxh c2hlcyB0aGUgT1RQIGFyZWEgaXMgYWNjZXNzZWQgbGlrZSB0aGUgbm9ybWFsIG1lbW9yeSwgZS5n Lg0KPiBieSBvZmZzZXQgYWRkcmVzc2luZzsgZXhjZXB0IHRoYXQgeW91IGVpdGhlciBoYXZlIHRv IHVzZSBzcGVjaWFsIHJlYWQvd3JpdGUNCj4gY29tbWFuZHMgKFdpbmJvbmQpIG9yIHlvdSBoYXZl IHRvIGVudGVyIChhbmQgZXhpdCkgYSBzcGVjaWZpYyBPVFAgbW9kZQ0KPiAoTWFjcm9uaXgsIE1p Y3JvbikuDQo+IA0KPiBUaHVzIHdlIGludHJvZHVjZSBmb3VyIG9wZXJhdGlvbnMgdG8gd2hpY2gg dGhlIE1URCBjYWxsYmFja3Mgd2lsbCBiZQ0KPiBtYXBwZWQ6IC5yZWFkKCksIC53cml0ZSgpLCAu bG9jaygpIGFuZCAuaXNfbG9ja2VkKCkuIFRoZSByZWFkIGFuZCB0aGUgd3JpdGUNCj4gb3BzIHdp bGwgYmUgZ2l2ZW4gYW4gYWRkcmVzcyBvZmZzZXQgdG8gb3BlcmF0ZSBvbiB3aGlsZSB0aGUgbG9j a2luZyBvcHMgdXNlDQo+IHJlZ2lvbnMgYmVjYXVzZSBsb2NraW5nIGFsd2F5cyBhZmZlY3RzIGEg d2hvbGUgcmVnaW9uLiBJdCBpcyB1cCB0byB0aGUNCj4gZmxhc2ggZHJpdmVyIHRvIGltcGxlbWVu dCB0aGVzZSBvcHMuDQo+IA0KPiBTaWduZWQtb2ZmLWJ5OiBNaWNoYWVsIFdhbGxlIDxtaWNoYWVs QHdhbGxlLmNjPg0KPiAtLS0NCj4gIGRyaXZlcnMvbXRkL3NwaS1ub3IvTWFrZWZpbGUgfCAgIDEg Kw0KPiAgZHJpdmVycy9tdGQvc3BpLW5vci9jb3JlLmMgICB8ICAgNSArDQo+ICBkcml2ZXJzL210 ZC9zcGktbm9yL2NvcmUuaCAgIHwgIDU0ICsrKysrKysrKw0KPiAgZHJpdmVycy9tdGQvc3BpLW5v ci9vdHAuYyAgICB8IDIxOCArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKw0KPiAg NCBmaWxlcyBjaGFuZ2VkLCAyNzggaW5zZXJ0aW9ucygrKQ0KPiAgY3JlYXRlIG1vZGUgMTAwNjQ0 IGRyaXZlcnMvbXRkL3NwaS1ub3Ivb3RwLmMNCj4gDQo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL210 ZC9zcGktbm9yL01ha2VmaWxlIGIvZHJpdmVycy9tdGQvc3BpLW5vci9NYWtlZmlsZQ0KPiBpbmRl eCA2NTM5MjM4OTYyMDUuLjJlZDJlNzZjZTRmMSAxMDA2NDQNCj4gLS0tIGEvZHJpdmVycy9tdGQv c3BpLW5vci9NYWtlZmlsZQ0KPiArKysgYi9kcml2ZXJzL210ZC9zcGktbm9yL01ha2VmaWxlDQo+ IEBAIC0xMiw2ICsxMiw3IEBAIHNwaS1ub3Itb2JqcyAgICAgICAgICAgICAgICAgICs9IGludGVs Lm8NCj4gIHNwaS1ub3Itb2JqcyAgICAgICAgICAgICAgICAgICArPSBpc3NpLm8NCj4gIHNwaS1u b3Itb2JqcyAgICAgICAgICAgICAgICAgICArPSBtYWNyb25peC5vDQo+ICBzcGktbm9yLW9ianMg ICAgICAgICAgICAgICAgICAgKz0gbWljcm9uLXN0Lm8NCj4gK3NwaS1ub3Itb2JqcyAgICAgICAg ICAgICAgICAgICArPSBvdHAubw0KDQpzcGktbm9yLW9ianMgICAgICAgICAgICAgICAgICAgIDo9 IGNvcmUubyBzZmRwLm8gb3RwLm8NCg0KVGhpcyBiZXR0ZXIgaW5kaWNhdGVzIHRoYXQgb3RwIGlz IHBhcnQgb2YgdGhlICJjb3JlIiBkcml2ZXIsIHdoaWxlDQp0aGUgcmVzdCBhcmUgbWFudWZhY3R1 cmVyIGRyaXZlcnMgKHRoYXQgYXJlIHRvbyBwYXJ0IG9mIHRoZSBjb3JlKS4NCg0KPiAgc3BpLW5v ci1vYmpzICAgICAgICAgICAgICAgICAgICs9IHNwYW5zaW9uLm8NCj4gIHNwaS1ub3Itb2JqcyAg ICAgICAgICAgICAgICAgICArPSBzc3Qubw0KPiAgc3BpLW5vci1vYmpzICAgICAgICAgICAgICAg ICAgICs9IHdpbmJvbmQubw0KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvc3BpLW5vci9jb3Jl LmMgYi9kcml2ZXJzL210ZC9zcGktbm9yL2NvcmUuYw0KPiBpbmRleCA0YTMxNWNiMWM0ZGIuLjBj NWM3NTdmYTk1YiAxMDA2NDQNCj4gLS0tIGEvZHJpdmVycy9tdGQvc3BpLW5vci9jb3JlLmMNCj4g KysrIGIvZHJpdmVycy9tdGQvc3BpLW5vci9jb3JlLmMNCj4gQEAgLTMwMDksNiArMzAwOSw4IEBA IHN0YXRpYyB2b2lkIHNwaV9ub3JfaW5mb19pbml0X3BhcmFtcyhzdHJ1Y3Qgc3BpX25vciAqbm9y KQ0KPiAgICAgICAgIHNwaV9ub3Jfc2V0X2VyYXNlX3R5cGUoJm1hcC0+ZXJhc2VfdHlwZVtpXSwg aW5mby0+c2VjdG9yX3NpemUsDQo+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUElO T1JfT1BfU0UpOw0KPiAgICAgICAgIHNwaV9ub3JfaW5pdF91bmlmb3JtX2VyYXNlX21hcChtYXAs IGVyYXNlX21hc2ssIHBhcmFtcy0+c2l6ZSk7DQo+ICsNCj4gKyAgICAgICBub3ItPnBhcmFtcy0+ b3RwLm9yZyA9ICZpbmZvLT5vdHBfb3JnOw0KDQpJbml0IHRoaXMgaW1tZWRpYXRlbHkgYWZ0ZXIg dGhlIHNldHVwIGluaXQsIHNvbWV0aGluZyBsaWtlOg0KCXBhcmFtcy0+c2V0dXAgPSBzcGlfbm9y X2RlZmF1bHRfc2V0dXA7DQoJcGFyYW1zLT5vdHAub3JnID0gJmluZm8tPm90cF9vcmc7DQoNCj4g IH0NCj4gDQo+ICAvKioNCj4gQEAgLTM1NTAsNiArMzU1Miw5IEBAIGludCBzcGlfbm9yX3NjYW4o c3RydWN0IHNwaV9ub3IgKm5vciwgY29uc3QgY2hhciAqbmFtZSwNCj4gICAgICAgICBpZiAocmV0 KQ0KPiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsNCj4gDQo+ICsgICAgICAgLyogQ29uZmln dXJlIE9UUCBwYXJhbWV0ZXJzIGFuZCBvcHMgKi8NCj4gKyAgICAgICBzcGlfbm9yX290cF9pbml0 KG5vcik7DQoNClBsZWFzZSBtb3ZlIHRoaXMgYXMgdGhlIGxhc3QgaW5pdCB0aGluZyBpbiBzcGlf bm9yX3NjYW4sIGltbWVkaWF0ZWx5IGFmdGVyDQpzcGlfbm9yX2luaXQobm9yKTsNCg0KTVREIE9U UCBvcHMgYXJlIG5vdCB1c2VkIGFjY3Jvc3Mgc3BpX25vcl9zY2FuKCksIHRoZXJlJ3Mgbm8gbmVl ZCB0byBpbml0DQp0aGVzZSBlYXJsaWVyLg0KIA0KPiArDQo+ICAgICAgICAgLyogU2VuZCBhbGwg dGhlIHJlcXVpcmVkIFNQSSBmbGFzaCBjb21tYW5kcyB0byBpbml0aWFsaXplIGRldmljZSAqLw0K PiAgICAgICAgIHJldCA9IHNwaV9ub3JfaW5pdChub3IpOw0KPiAgICAgICAgIGlmIChyZXQpDQo+ IGRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9zcGktbm9yL2NvcmUuaCBiL2RyaXZlcnMvbXRkL3Nw aS1ub3IvY29yZS5oDQo+IGluZGV4IDRhM2Y3ZjE1MGI1ZC4uZWM4ZGExMjQzODQ2IDEwMDY0NA0K PiAtLS0gYS9kcml2ZXJzL210ZC9zcGktbm9yL2NvcmUuaA0KPiArKysgYi9kcml2ZXJzL210ZC9z cGktbm9yL2NvcmUuaA0KPiBAQCAtMTg3LDYgKzE4Nyw0NSBAQCBzdHJ1Y3Qgc3BpX25vcl9sb2Nr aW5nX29wcyB7DQo+ICAgICAgICAgaW50ICgqaXNfbG9ja2VkKShzdHJ1Y3Qgc3BpX25vciAqbm9y LCBsb2ZmX3Qgb2ZzLCB1aW50NjRfdCBsZW4pOw0KPiAgfTsNCj4gDQo+ICsvKioNCj4gKyAqIHN0 cnVjdCBzcGlfbm9yX290cF9vcmdhbml6YXRpb24gLSBTdHJ1Y3R1cmUgdG8gZGVzY3JpYmUgdGhl IFNQSSBOT1IgT1RQIHJlZ2lvbnMNCj4gKyAqIEBsZW46ICAgICAgIHNpemUgb2Ygb25lIE9UUCBy ZWdpb24gaW4gYnl0ZXMuDQo+ICsgKiBAYmFzZTogICAgICBzdGFydCBhZGRyZXNzIG9mIHRoZSBP VFAgYXJlYS4NCj4gKyAqIEBvZmZzZXQ6ICAgIG9mZnNldCBiZXR3ZWVuIGNvbnNlY3V0aXZlIE9U UCByZWdpb25zIGlmIHRoZXJlIGFyZSBtb3JlDQo+ICsgKiAgICAgICAgICAgICAgdGhhbiBvbmUu DQo+ICsgKiBAbl9yZWdpb25zOiBudW1iZXIgb2YgaW5kaXZpZHVhbCBPVFAgcmVnaW9ucy4NCj4g KyAqLw0KPiArc3RydWN0IHNwaV9ub3Jfb3RwX29yZ2FuaXphdGlvbiB7DQo+ICsgICAgICAgc2l6 ZV90IGxlbjsNCj4gKyAgICAgICBsb2ZmX3QgYmFzZTsNCj4gKyAgICAgICBsb2ZmX3Qgb2Zmc2V0 Ow0KPiArICAgICAgIHVuc2lnbmVkIGludCBuX3JlZ2lvbnM7DQo+ICt9Ow0KPiArDQo+ICsvKioN Cj4gKyAqIHN0cnVjdCBzcGlfbm9yX290cF9vcHMgLSBTUEkgTk9SIE9UUCBtZXRob2RzDQo+ICsg KiBAcmVhZDogICAgICByZWFkIGZyb20gdGhlIFNQSSBOT1IgT1RQIGFyZWEuDQo+ICsgKiBAd3Jp dGU6ICAgICB3cml0ZSB0byB0aGUgU1BJIE5PUiBPVFAgYXJlYS4NCj4gKyAqIEBsb2NrOiAgICAg IGxvY2sgYW4gT1RQIHJlZ2lvbi4NCj4gKyAqIEBpc19sb2NrZWQ6IGNoZWNrIGlmIGFuIE9UUCBy ZWdpb24gb2YgdGhlIFNQSSBOT1IgaXMgbG9ja2VkLg0KPiArICovDQo+ICtzdHJ1Y3Qgc3BpX25v cl9vdHBfb3BzIHsNCj4gKyAgICAgICBpbnQgKCpyZWFkKShzdHJ1Y3Qgc3BpX25vciAqbm9yLCBs b2ZmX3QgYWRkciwgc2l6ZV90IGxlbiwgdTggKmJ1Zik7DQo+ICsgICAgICAgaW50ICgqd3JpdGUp KHN0cnVjdCBzcGlfbm9yICpub3IsIGxvZmZfdCBhZGRyLCBzaXplX3QgbGVuLCB1OCAqYnVmKTsN Cj4gKyAgICAgICBpbnQgKCpsb2NrKShzdHJ1Y3Qgc3BpX25vciAqbm9yLCB1bnNpZ25lZCBpbnQg cmVnaW9uKTsNCj4gKyAgICAgICBpbnQgKCppc19sb2NrZWQpKHN0cnVjdCBzcGlfbm9yICpub3Is IHVuc2lnbmVkIGludCByZWdpb24pOw0KPiArfTsNCj4gKw0KPiArLyoqDQo+ICsgKiBzdHJ1Y3Qg c3BpX25vcl9vdHAgLSBTUEkgTk9SIE9UUCBncm91cGluZyBzdHJ1Y3R1cmUNCj4gKyAqIEBvcmc6 ICAgICAgIE9UUCByZWdpb24gb3JnYW5pemF0aW9uDQo+ICsgKiBAb3BzOiAgICAgICBPVFAgYWNj ZXNzIG9wcw0KPiArICovDQo+ICtzdHJ1Y3Qgc3BpX25vcl9vdHAgew0KPiArICAgICAgIGNvbnN0 IHN0cnVjdCBzcGlfbm9yX290cF9vcmdhbml6YXRpb24gKm9yZzsNCj4gKyAgICAgICBjb25zdCBz dHJ1Y3Qgc3BpX25vcl9vdHBfb3BzICpvcHM7DQo+ICt9Ow0KPiArDQo+ICAvKioNCj4gICAqIHN0 cnVjdCBzcGlfbm9yX2ZsYXNoX3BhcmFtZXRlciAtIFNQSSBOT1IgZmxhc2ggcGFyYW1ldGVycyBh bmQgc2V0dGluZ3MuDQo+ICAgKiBJbmNsdWRlcyBsZWdhY3kgZmxhc2ggcGFyYW1ldGVycyBhbmQg c2V0dGluZ3MgdGhhdCBjYW4gYmUgb3ZlcndyaXR0ZW4NCj4gQEAgLTIwOCw2ICsyNDcsNyBAQCBz dHJ1Y3Qgc3BpX25vcl9sb2NraW5nX29wcyB7DQo+ICAgKiAgICAgICAgICAgICAgICAgICAgICBo aWdoZXIgaW5kZXggaW4gdGhlIGFycmF5LCB0aGUgaGlnaGVyIHByaW9yaXR5Lg0KPiAgICogQGVy YXNlX21hcDogICAgICAgICB0aGUgZXJhc2UgbWFwIHBhcnNlZCBmcm9tIHRoZSBTRkRQIFNlY3Rv ciBNYXAgUGFyYW1ldGVyDQo+ICAgKiAgICAgICAgICAgICAgICAgICAgICBUYWJsZS4NCj4gKyAq IEBvdHBfaW5mbzogICAgICAgICAgZGVzY3JpYmVzIHRoZSBPVFAgcmVnaW9ucy4NCj4gICAqIEBv Y3RhbF9kdHJfZW5hYmxlOiAgZW5hYmxlcyBTUEkgTk9SIG9jdGFsIERUUiBtb2RlLg0KPiAgICog QHF1YWRfZW5hYmxlOiAgICAgICBlbmFibGVzIFNQSSBOT1IgcXVhZCBtb2RlLg0KPiAgICogQHNl dF80Ynl0ZV9hZGRyX21vZGU6IHB1dHMgdGhlIFNQSSBOT1IgaW4gNCBieXRlIGFkZHJlc3Npbmcg bW9kZS4NCj4gQEAgLTIxOSw2ICsyNTksNyBAQCBzdHJ1Y3Qgc3BpX25vcl9sb2NraW5nX29wcyB7 DQo+ICAgKiAgICAgICAgICAgICAgICAgICAgICBlLmcuIGRpZmZlcmVudCBvcGNvZGVzLCBzcGVj aWZpYyBhZGRyZXNzIGNhbGN1bGF0aW9uLA0KPiAgICogICAgICAgICAgICAgICAgICAgICAgcGFn ZSBzaXplLCBldGMuDQo+ICAgKiBAbG9ja2luZ19vcHM6ICAgICAgIFNQSSBOT1IgbG9ja2luZyBt ZXRob2RzLg0KPiArICogQG90cDogICAgICAgICAgICAgICBTUEkgTk9SIE9UUCBtZXRob2RzLg0K PiAgICovDQo+ICBzdHJ1Y3Qgc3BpX25vcl9mbGFzaF9wYXJhbWV0ZXIgew0KPiAgICAgICAgIHU2 NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTsNCj4gQEAgLTIzMiw2ICsyNzMsNyBA QCBzdHJ1Y3Qgc3BpX25vcl9mbGFzaF9wYXJhbWV0ZXIgew0KPiAgICAgICAgIHN0cnVjdCBzcGlf bm9yX3BwX2NvbW1hbmQgICAgICAgcGFnZV9wcm9ncmFtc1tTTk9SX0NNRF9QUF9NQVhdOw0KPiAN Cj4gICAgICAgICBzdHJ1Y3Qgc3BpX25vcl9lcmFzZV9tYXAgICAgICAgIGVyYXNlX21hcDsNCj4g KyAgICAgICBzdHJ1Y3Qgc3BpX25vcl9vdHAgICAgICAgICAgICAgIG90cDsNCj4gDQo+ICAgICAg ICAgaW50ICgqb2N0YWxfZHRyX2VuYWJsZSkoc3RydWN0IHNwaV9ub3IgKm5vciwgYm9vbCBlbmFi bGUpOw0KPiAgICAgICAgIGludCAoKnF1YWRfZW5hYmxlKShzdHJ1Y3Qgc3BpX25vciAqbm9yKTsN Cj4gQEAgLTM0MSw2ICszODMsOCBAQCBzdHJ1Y3QgZmxhc2hfaW5mbyB7DQo+IA0KPiAgICAgICAg IC8qIFBhcnQgc3BlY2lmaWMgZml4dXAgaG9va3MuICovDQo+ICAgICAgICAgY29uc3Qgc3RydWN0 IHNwaV9ub3JfZml4dXBzICpmaXh1cHM7DQo+ICsNCj4gKyAgICAgICBjb25zdCBzdHJ1Y3Qgc3Bp X25vcl9vdHBfb3JnYW5pemF0aW9uIG90cF9vcmc7DQoNCkNhbiB3ZSBtb3ZlIG90cF9vcmcganVz dCBiZWZvcmUgZml4dXBzPyBGaXh1cHMgYXJlIHVzdWFsbHkgdGhlIGxhc3QgdGhpbmcNCnRoYXQg d2Ugd2FudCB0byBzcGVjaWZ5IGluIGEgZmxhc2ggaW5mby4NCg0KPiAgfTsNCj4gDQo+ICAvKiBV c2VkIHdoZW4gdGhlICJfZXh0X2lkIiBpcyB0d28gYnl0ZXMgYXQgbW9zdCAqLw0KPiBAQCAtMzkz LDYgKzQzNywxNCBAQCBzdHJ1Y3QgZmxhc2hfaW5mbyB7DQo+ICAgICAgICAgICAgICAgICAuYWRk cl93aWR0aCA9IDMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCj4g ICAgICAgICAgICAgICAgIC5mbGFncyA9IFNQSV9OT1JfTk9fRlIgfCBTUElfTk9SX1hTUl9SRFks DQo+IA0KPiArI2RlZmluZSBPVFBfSU5GTyhfbGVuLCBfbl9yZWdpb25zLCBfYmFzZSwgX29mZnNl dCkgICAgICAgICAgICAgICAgICAgICBcDQo+ICsgICAgICAgICAgICAgICAub3RwX29yZyA9IHsg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCj4gKyAgICAgICAg ICAgICAgICAgICAgICAgLmxlbiA9IChfbGVuKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgXA0KPiArICAgICAgICAgICAgICAgICAgICAgICAuYmFzZSA9IChfYmFzZSksICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBcDQo+ICsgICAgICAgICAgICAgICAgICAgICAgIC5v ZmZzZXQgPSAoX29mZnNldCksICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCj4gKyAgICAg ICAgICAgICAgICAgICAgICAgLm5fcmVnaW9ucyA9IChfbl9yZWdpb25zKSwgICAgICAgICAgICAg ICAgICAgICAgXA0KPiArICAgICAgICAgICAgICAgfSwNCj4gKw0KPiAgLyoqDQo+ICAgKiBzdHJ1 Y3Qgc3BpX25vcl9tYW51ZmFjdHVyZXIgLSBTUEkgTk9SIG1hbnVmYWN0dXJlciBvYmplY3QNCj4g ICAqIEBuYW1lOiBtYW51ZmFjdHVyZXIgbmFtZQ0KPiBAQCAtNDczLDYgKzUyNSw4IEBAIGludCBz cGlfbm9yX3Bvc3RfYmZwdF9maXh1cHMoc3RydWN0IHNwaV9ub3IgKm5vciwNCj4gICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgc2ZkcF9iZnB0ICpiZnB0LA0KPiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzcGlfbm9yX2ZsYXNoX3BhcmFtZXRlciAq cGFyYW1zKTsNCj4gDQo+ICt2b2lkIHNwaV9ub3Jfb3RwX2luaXQoc3RydWN0IHNwaV9ub3IgKm5v cik7DQo+ICsNCj4gIHN0YXRpYyBzdHJ1Y3Qgc3BpX25vciBfX21heWJlX3VudXNlZCAqbXRkX3Rv X3NwaV9ub3Ioc3RydWN0IG10ZF9pbmZvICptdGQpDQo+ICB7DQo+ICAgICAgICAgcmV0dXJuIG10 ZC0+cHJpdjsNCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3NwaS1ub3Ivb3RwLmMgYi9kcml2 ZXJzL210ZC9zcGktbm9yL290cC5jDQo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0DQo+IGluZGV4IDAw MDAwMDAwMDAwMC4uNGUzMDFmZDUxNTZiDQo+IC0tLSAvZGV2L251bGwNCj4gKysrIGIvZHJpdmVy cy9tdGQvc3BpLW5vci9vdHAuYw0KPiBAQCAtMCwwICsxLDIxOCBAQA0KPiArLy8gU1BEWC1MaWNl bnNlLUlkZW50aWZpZXI6IEdQTC0yLjANCj4gKy8qDQo+ICsgKiBPVFAgc3VwcG9ydCBmb3IgU1BJ IE5PUiBmbGFzaGVzDQo+ICsgKg0KPiArICogQ29weXJpZ2h0IChDKSAyMDIxIE1pY2hhZWwgV2Fs bGUgPG1pY2hhZWxAd2FsbGUuY2M+PiArICovDQo+ICsNCj4gKyNpbmNsdWRlIDxsaW51eC9sb2cy Lmg+DQo+ICsjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPg0KPiArI2luY2x1ZGUgPGxpbnV4L210 ZC9zcGktbm9yLmg+DQo+ICsNCj4gKyNpbmNsdWRlICJjb3JlLmgiDQo+ICsNCj4gKyNkZWZpbmUg c3BpX25vcl9vdHBfb3BzKG5vcikgKChub3IpLT5wYXJhbXMtPm90cC5vcHMpDQo+ICsjZGVmaW5l IHNwaV9ub3Jfb3RwX3JlZ2lvbl9sZW4obm9yKSAoKG5vciktPnBhcmFtcy0+b3RwLm9yZy0+bGVu KQ0KPiArI2RlZmluZSBzcGlfbm9yX290cF9uX3JlZ2lvbnMobm9yKSAoKG5vciktPnBhcmFtcy0+ b3RwLm9yZy0+bl9yZWdpb25zKQ0KDQpJIGRvbid0IGxpa2UgdGhlc2Ugd3JhcHBlcnMgYmVjYXVz ZSB0aGV5IGdyYXR1aW91c2x5IGhpZGUgd2hhdCdzIHJlYWxseSB0aGVyZS4NCkkgZmluZCB0aGUg Y29kZSBtb3JlIGVhc2llciB0byByZWFkIHdpdGhvdXQgdGhlc2Ugd3JhcHBlcnMsIGJlY2F1c2Ug SSBkb24ndCANCmhhdmUgdG8gbWVtb3JpemUgd2hhdCB0aGVzZSB3cmFwcGVycyBhcmUgZG9pbmcs IGFuZCBJIGJldHRlciBzZWUgaG93IHRoZSBjb2RlDQppcyBvcmdhbml6ZWQuDQoNCj4gKw0KPiAr c3RhdGljIGxvZmZfdCBzcGlfbm9yX290cF9yZWdpb25fc3RhcnQoY29uc3Qgc3RydWN0IHNwaV9u b3IgKm5vciwgaW50IHJlZ2lvbikNCj4gK3sNCj4gKyAgICAgICBjb25zdCBzdHJ1Y3Qgc3BpX25v cl9vdHBfb3JnYW5pemF0aW9uICpvcmcgPSBub3ItPnBhcmFtcy0+b3RwLm9yZzsNCg0KaG93IGFi b3V0IHMvb3JnL290cF9vcmc/DQoNCj4gKw0KPiArICAgICAgIHJldHVybiBvcmctPmJhc2UgKyBy ZWdpb24gKiBvcmctPm9mZnNldDsNCj4gK30NCj4gKw0KPiArc3RhdGljIHNpemVfdCBzcGlfbm9y X290cF9zaXplKHN0cnVjdCBzcGlfbm9yICpub3IpDQo+ICt7DQo+ICsgICAgICAgcmV0dXJuIHNw aV9ub3Jfb3RwX25fcmVnaW9ucyhub3IpICogc3BpX25vcl9vdHBfcmVnaW9uX2xlbihub3IpOw0K PiArfQ0KPiArDQo+ICsvKg0KPiArICogVHJhbnNsYXRlIHRoZSBmaWxlIG9mZnNldHMgZnJvbSBh bmQgdG8gT1RQIHJlZ2lvbnMuIFNlZSBhbHNvDQo+ICsgKiBzcGlfbm9yX210ZF9vdHBfZG9fb3Ao KS4NCj4gKyAqLw0KPiArc3RhdGljIGxvZmZfdCBzcGlfbm9yX290cF9yZWdpb25fdG9fb2Zmc2V0 KHN0cnVjdCBzcGlfbm9yICpub3IsIHVuc2lnbmVkIGludCByZWdpb24pDQo+ICt7DQo+ICsgICAg ICAgcmV0dXJuIHJlZ2lvbiAqIHNwaV9ub3Jfb3RwX3JlZ2lvbl9sZW4obm9yKTsNCj4gK30NCj4g Kw0KPiArc3RhdGljIHVuc2lnbmVkIGludCBzcGlfbm9yX290cF9vZmZzZXRfdG9fcmVnaW9uKHN0 cnVjdCBzcGlfbm9yICpub3IsIGxvZmZfdCBvZnMpDQo+ICt7DQo+ICsgICAgICAgcmV0dXJuIG9m cyAvIHNwaV9ub3Jfb3RwX3JlZ2lvbl9sZW4obm9yKTsNCj4gK30NCj4gKw0KPiArc3RhdGljIGlu dCBzcGlfbm9yX210ZF9vdHBfaW5mbyhzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc2l6ZV90IGxlbiwN Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnJldGxlbiwgc3RydWN0 IG90cF9pbmZvICpidWYpDQo+ICt7DQo+ICsgICAgICAgc3RydWN0IHNwaV9ub3IgKm5vciA9IG10 ZF90b19zcGlfbm9yKG10ZCk7DQo+ICsgICAgICAgY29uc3Qgc3RydWN0IHNwaV9ub3Jfb3RwX29w cyAqb3BzID0gc3BpX25vcl9vdHBfb3BzKG5vcik7DQo+ICsgICAgICAgdW5zaWduZWQgaW50IG5f cmVnaW9ucyA9IHNwaV9ub3Jfb3RwX25fcmVnaW9ucyhub3IpOw0KPiArICAgICAgIHVuc2lnbmVk IGludCByZWdpb247DQo+ICsgICAgICAgaW50IHJldCwgbG9ja2VkOw0KPiArDQo+ICsgICAgICAg aWYgKGxlbiA8IG5fcmVnaW9ucyAqIHNpemVvZigqYnVmKSkNCj4gKyAgICAgICAgICAgICAgIHJl dHVybiAtRU5PU1BDOw0KPiArDQo+ICsgICAgICAgcmV0ID0gc3BpX25vcl9sb2NrX2FuZF9wcmVw KG5vcik7DQo+ICsgICAgICAgaWYgKHJldCkNCj4gKyAgICAgICAgICAgICAgIHJldHVybiByZXQ7 DQo+ICsNCj4gKyAgICAgICBmb3IgKHJlZ2lvbiA9IDA7IHJlZ2lvbiA8IHNwaV9ub3Jfb3RwX25f cmVnaW9ucyhub3IpOyByZWdpb24rKykgew0KDQpmb3IgKGkgPSAwOyBpIDwgIG5fcmVnaW9uczsg aSsrKQ0KDQphbHJlYWR5IGluZGljYXRlcyB0aGF0IGkgaXMgdGhlIGluZGV4IG9mIGEgcmVnaW9u LCBubyBuZWVkIHRvIGhhdmUgYW4gZXhwbGljaXQNCm5hbWUuIEFsc28sIGlmIHlvdSB3YW50IHRv IGludHJvZHVjZSBhIGxvY2FsIHZhcmlhYmxlLCBuX3JlZ2lvbnMsIHVzZSBpdCBoZXJlDQp0b28u DQoNCj4gKyAgICAgICAgICAgICAgIGJ1Zi0+c3RhcnQgPSBzcGlfbm9yX290cF9yZWdpb25fdG9f b2Zmc2V0KG5vciwgcmVnaW9uKTsNCj4gKyAgICAgICAgICAgICAgIGJ1Zi0+bGVuZ3RoID0gc3Bp X25vcl9vdHBfcmVnaW9uX2xlbihub3IpOw0KPiArDQo+ICsgICAgICAgICAgICAgICBsb2NrZWQg PSBvcHMtPmlzX2xvY2tlZChub3IsIHJlZ2lvbik7DQo+ICsgICAgICAgICAgICAgICBpZiAobG9j a2VkIDwgMCkgew0KPiArICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBsb2NrZWQ7DQo+ICsg ICAgICAgICAgICAgICAgICAgICAgIGdvdG8gb3V0Ow0KPiArICAgICAgICAgICAgICAgfQ0KPiAr DQo+ICsgICAgICAgICAgICAgICBidWYtPmxvY2tlZCA9ICEhbG9ja2VkOw0KPiArICAgICAgICAg ICAgICAgYnVmKys7DQo+ICsgICAgICAgfQ0KPiArDQo+ICsgICAgICAgKnJldGxlbiA9IG5fcmVn aW9ucyAqIHNpemVvZigqYnVmKTsNCj4gKw0KPiArb3V0Og0KPiArICAgICAgIHNwaV9ub3JfdW5s b2NrX2FuZF91bnByZXAobm9yKTsNCj4gKw0KPiArICAgICAgIHJldHVybiByZXQ7DQo+ICt9DQo+ ICsNCj4gK3N0YXRpYyBpbnQgc3BpX25vcl9tdGRfb3RwX3JlYWRfd3JpdGUoc3RydWN0IG10ZF9p bmZvICptdGQsIGxvZmZfdCBvZnMsDQo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgc2l6ZV90IHRvdGFsX2xlbiwgc2l6ZV90ICpyZXRsZW4sDQo+ICsgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICpidWYsIGJvb2wgaXNfd3JpdGUpDQoNCm5v dCByZWxhdGVkIHRvIHRoaXMgcGF0Y2gsIGJ1dCB0aGUgbGlzdCBvZiBhcmd1bWVudHMgaXMgcXVp dGUgYmlnLCBtYXliZQ0Kd2UgY2FuIHVwZGF0ZSBtdGQgdG8gcGFzcyBhIHBvaW50ZXIgdG8gYSBz dHJ1Y3QuDQoNCj4gK3sNCj4gKyAgICAgICBzdHJ1Y3Qgc3BpX25vciAqbm9yID0gbXRkX3RvX3Nw aV9ub3IobXRkKTsNCj4gKyAgICAgICBjb25zdCBzdHJ1Y3Qgc3BpX25vcl9vdHBfb3BzICpvcHMg PSBzcGlfbm9yX290cF9vcHMobm9yKTsNCj4gKyAgICAgICBjb25zdCBzaXplX3QgcmxlbiA9IHNw aV9ub3Jfb3RwX3JlZ2lvbl9sZW4obm9yKTsNCj4gKyAgICAgICBsb2ZmX3QgcnN0YXJ0LCByb2Zz Ow0KPiArICAgICAgIHVuc2lnbmVkIGludCByZWdpb247DQo+ICsgICAgICAgc2l6ZV90IGxlbjsN Cj4gKyAgICAgICBpbnQgcmV0Ow0KPiArDQo+ICsgICAgICAgaWYgKG9mcyA8IDAgfHwgb2ZzID49 IHNwaV9ub3Jfb3RwX3NpemUobm9yKSkNCj4gKyAgICAgICAgICAgICAgIHJldHVybiAwOw0KPiAr DQo+ICsgICAgICAgcmV0ID0gc3BpX25vcl9sb2NrX2FuZF9wcmVwKG5vcik7DQo+ICsgICAgICAg aWYgKHJldCkNCj4gKyAgICAgICAgICAgICAgIHJldHVybiByZXQ7DQo+ICsNCj4gKyAgICAgICAv KiBkb24ndCBhY2Nlc3MgYmV5b25kIHRoZSBlbmQgKi8NCj4gKyAgICAgICB0b3RhbF9sZW4gPSBt aW5fdChzaXplX3QsIHRvdGFsX2xlbiwgc3BpX25vcl9vdHBfc2l6ZShub3IpIC0gb2ZzKTsNCj4g Kw0KPiArICAgICAgICpyZXRsZW4gPSAwOw0KPiArICAgICAgIHdoaWxlICh0b3RhbF9sZW4pIHsN Cj4gKyAgICAgICAgICAgICAgIC8qDQo+ICsgICAgICAgICAgICAgICAgKiBUaGUgT1RQIHJlZ2lv bnMgYXJlIG1hcHBlZCBpbnRvIGEgY29udGlndW91cyBhcmVhIHN0YXJ0aW5nDQo+ICsgICAgICAg ICAgICAgICAgKiBhdCAwIGFzIGV4cGVjdGVkIGJ5IHRoZSBNVEQgbGF5ZXIuIFRoaXMgd2lsbCBt YXAgdGhlIE1URA0KPiArICAgICAgICAgICAgICAgICogZmlsZSBvZmZzZXRzIHRvIHRoZSBhZGRy ZXNzIG9mIGFuIE9UUCByZWdpb24gYXMgdXNlZCBpbiB0aGUNCj4gKyAgICAgICAgICAgICAgICAq IGFjdHVhbCBTUEkgY29tbWFuZHMuDQo+ICsgICAgICAgICAgICAgICAgKi8NCj4gKyAgICAgICAg ICAgICAgIHJlZ2lvbiA9IHNwaV9ub3Jfb3RwX29mZnNldF90b19yZWdpb24obm9yLCBvZnMpOw0K PiArICAgICAgICAgICAgICAgcnN0YXJ0ID0gc3BpX25vcl9vdHBfcmVnaW9uX3N0YXJ0KG5vciwg cmVnaW9uKTsNCg0KTWF5YmUgaXQncyBqdXN0IG1lLCBidXQgSSBkb24ndCBsaWtlIHRoZSBoZWxw ZXJzIDopLg0KRXNwZWNpYWxseSBzcGlfbm9yX290cF9vZmZzZXRfdG9fcmVnaW9uLiBBbmQgc3Bp X25vcl9vdHBfcmVnaW9uX3N0YXJ0KCkNCmlzIHVzZWQganVzdCBoZXJlLiBNYXliZSBkaXNjYXJk IHRoZW0gYW5kIHMvcmVnaW9uL2k/DQoNCj4gKw0KPiArICAgICAgICAgICAgICAgLyoNCj4gKyAg ICAgICAgICAgICAgICAqIFRoZSBzaXplIG9mIGEgT1RQIHJlZ2lvbiBpcyBleHBlY3RlZCB0byBi ZSBhIHBvd2VyIG9mIHR3bywNCj4gKyAgICAgICAgICAgICAgICAqIHRodXMgd2UgY2FuIGp1c3Qg bWFzayB0aGUgbG93ZXIgYml0cyBhbmQgZ2V0IHRoZSBvZmZzZXQgaW50bw0KPiArICAgICAgICAg ICAgICAgICogYSByZWdpb24uDQo+ICsgICAgICAgICAgICAgICAgKi8NCj4gKyAgICAgICAgICAg ICAgIHJvZnMgPSBvZnMgJiAocmxlbiAtIDEpOw0KPiArDQo+ICsgICAgICAgICAgICAgICAvKiBk b24ndCBhY2Nlc3MgYmV5b25kIG9uZSBPVFAgcmVnaW9uICovDQo+ICsgICAgICAgICAgICAgICBs ZW4gPSBtaW5fdChzaXplX3QsIHRvdGFsX2xlbiwgcmxlbiAtIHJvZnMpOw0KPiArDQo+ICsgICAg ICAgICAgICAgICBpZiAoaXNfd3JpdGUpDQo+ICsgICAgICAgICAgICAgICAgICAgICAgIHJldCA9 IG9wcy0+d3JpdGUobm9yLCByc3RhcnQgKyByb2ZzLCBsZW4sIGJ1Zik7DQo+ICsgICAgICAgICAg ICAgICBlbHNlDQo+ICsgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IG9wcy0+cmVhZChub3Is IHJzdGFydCArIHJvZnMsIGxlbiwgYnVmKTsNCj4gKyAgICAgICAgICAgICAgIGlmIChyZXQgPT0g MCkNCj4gKyAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gLUVJTzsNCj4gKyAgICAgICAgICAg ICAgIGlmIChyZXQgPCAwKQ0KPiArICAgICAgICAgICAgICAgICAgICAgICBnb3RvIG91dDsNCj4g Kw0KPiArICAgICAgICAgICAgICAgKnJldGxlbiArPSByZXQ7DQo+ICsgICAgICAgICAgICAgICBv ZnMgKz0gcmV0Ow0KPiArICAgICAgICAgICAgICAgYnVmICs9IHJldDsNCj4gKyAgICAgICAgICAg ICAgIHRvdGFsX2xlbiAtPSByZXQ7DQo+ICsgICAgICAgfQ0KPiArICAgICAgIHJldCA9IDA7DQo+ ICsNCj4gK291dDoNCj4gKyAgICAgICBzcGlfbm9yX3VubG9ja19hbmRfdW5wcmVwKG5vcik7DQo+ ICsgICAgICAgcmV0dXJuIHJldDsNCj4gK30NCj4gKw0KPiArc3RhdGljIGludCBzcGlfbm9yX210 ZF9vdHBfcmVhZChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGZyb20sIHNpemVfdCBsZW4s DQo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpyZXRsZW4sIHVfY2hh ciAqYnVmKQ0KPiArew0KPiArICAgICAgIHJldHVybiBzcGlfbm9yX210ZF9vdHBfcmVhZF93cml0 ZShtdGQsIGZyb20sIGxlbiwgcmV0bGVuLCBidWYsIGZhbHNlKTsNCj4gK30NCj4gKw0KPiArc3Rh dGljIGludCBzcGlfbm9yX210ZF9vdHBfd3JpdGUoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZf dCB0bywgc2l6ZV90IGxlbiwNCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6 ZV90ICpyZXRsZW4sIHVfY2hhciAqYnVmKQ0KPiArew0KPiArICAgICAgIHJldHVybiBzcGlfbm9y X210ZF9vdHBfcmVhZF93cml0ZShtdGQsIHRvLCBsZW4sIHJldGxlbiwgYnVmLCB0cnVlKTsNCj4g K30NCj4gKw0KPiArc3RhdGljIGludCBzcGlfbm9yX210ZF9vdHBfbG9jayhzdHJ1Y3QgbXRkX2lu Zm8gKm10ZCwgbG9mZl90IGZyb20sIHNpemVfdCBsZW4pDQo+ICt7DQo+ICsgICAgICAgc3RydWN0 IHNwaV9ub3IgKm5vciA9IG10ZF90b19zcGlfbm9yKG10ZCk7DQo+ICsgICAgICAgY29uc3Qgc3Ry dWN0IHNwaV9ub3Jfb3RwX29wcyAqb3BzID0gc3BpX25vcl9vdHBfb3BzKG5vcik7DQo+ICsgICAg ICAgdW5zaWduZWQgaW50IHJlZ2lvbjsNCj4gKyAgICAgICBpbnQgcmV0Ow0KPiArDQo+ICsgICAg ICAgaWYgKGZyb20gPCAwIHx8IChmcm9tICsgbGVuKSA+IHNwaV9ub3Jfb3RwX3NpemUobm9yKSkN Cj4gKyAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOw0KPiArDQo+ICsgICAgICAgLyogdGhl IHVzZXIgaGFzIHRvIGV4cGxpY2l0bHkgYXNrIGZvciB3aG9sZSByZWdpb25zICovDQo+ICsgICAg ICAgaWYgKGxlbiAlIHNwaV9ub3Jfb3RwX3JlZ2lvbl9sZW4obm9yKSkNCj4gKyAgICAgICAgICAg ICAgIHJldHVybiAtRUlOVkFMOw0KPiArDQo+ICsgICAgICAgaWYgKGZyb20gJSBzcGlfbm9yX290 cF9yZWdpb25fbGVuKG5vcikpDQo+ICsgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsNCj4g Kw0KPiArICAgICAgIHJldCA9IHNwaV9ub3JfbG9ja19hbmRfcHJlcChub3IpOw0KPiArICAgICAg IGlmIChyZXQpDQo+ICsgICAgICAgICAgICAgICByZXR1cm4gcmV0Ow0KPiArDQo+ICsgICAgICAg d2hpbGUgKGxlbikgew0KPiArICAgICAgICAgICAgICAgcmVnaW9uID0gc3BpX25vcl9vdHBfb2Zm c2V0X3RvX3JlZ2lvbihub3IsIGZyb20pOw0KPiArICAgICAgICAgICAgICAgcmV0ID0gb3BzLT5s b2NrKG5vciwgcmVnaW9uKTsNCj4gKyAgICAgICAgICAgICAgIGlmIChyZXQpDQo+ICsgICAgICAg ICAgICAgICAgICAgICAgIGdvdG8gb3V0Ow0KPiArDQo+ICsgICAgICAgICAgICAgICBsZW4gLT0g c3BpX25vcl9vdHBfcmVnaW9uX2xlbihub3IpOw0KPiArICAgICAgICAgICAgICAgZnJvbSArPSBz cGlfbm9yX290cF9yZWdpb25fbGVuKG5vcik7DQo+ICsgICAgICAgfQ0KPiArDQo+ICtvdXQ6DQo+ ICsgICAgICAgc3BpX25vcl91bmxvY2tfYW5kX3VucHJlcChub3IpOw0KPiArDQo+ICsgICAgICAg cmV0dXJuIHJldDsNCj4gK30NCj4gKw0KPiArdm9pZCBzcGlfbm9yX290cF9pbml0KHN0cnVjdCBz cGlfbm9yICpub3IpDQo+ICt7DQo+ICsgICAgICAgc3RydWN0IG10ZF9pbmZvICptdGQgPSAmbm9y LT5tdGQ7DQo+ICsNCj4gKyAgICAgICBpZiAoIW5vci0+cGFyYW1zLT5vdHAub3BzKQ0KPiArICAg ICAgICAgICAgICAgcmV0dXJuOw0KPiArDQo+ICsgICAgICAgaWYgKFdBUk5fT04oIWlzX3Bvd2Vy X29mXzIoc3BpX25vcl9vdHBfcmVnaW9uX2xlbihub3IpKSkpDQoNCldoeSBXQVJOX09OIGFuZCBu b3QganVzdCBhIGRlYnVnIG1lc3NhZ2U/DQoNCkNoZWVycywNCnRhDQoNCj4gKyAgICAgICAgICAg ICAgIHJldHVybjsNCj4gKw0KPiArICAgICAgIC8qDQo+ICsgICAgICAgICogV2Ugb25seSBzdXBw b3J0IHVzZXJfcHJvdCBjYWxsYmFja3MgKHlldCkuDQo+ICsgICAgICAgICoNCj4gKyAgICAgICAg KiBTb21lIFNQSSBOT1IgZmxhc2hlcyBsaWtlIE1hY3Jvbml4IG9uZXMgY2FuIGJlIG9yZGVyZWQg aW4gdHdvDQo+ICsgICAgICAgICogZGlmZmVyZW50IHZhcmlhbnRzLiBPbmUgd2l0aCBhIGZhY3Rv cnkgbG9ja2VkIE9UUCBhcmVhIGFuZCBvbmUgd2hlcmUNCj4gKyAgICAgICAgKiBpdCBpcyBsZWZ0 IHRvIHRoZSB1c2VyIHRvIHdyaXRlIHRvIGl0LiBUaGUgZmFjdG9yeSBsb2NrZWQgT1RQIGlzDQo+ ICsgICAgICAgICogdXN1YWxseSBwcmVwcm9ncmFtbWVkIHdpdGggYW4gImVsZWN0cmljYWwgc2Vy aWFsIG51bWJlciIuIFdlIGRvbid0DQo+ICsgICAgICAgICogc3VwcG9ydCB0aGVzZSBmb3Igbm93 Lg0KPiArICAgICAgICAqLw0KPiArICAgICAgIG10ZC0+X2dldF91c2VyX3Byb3RfaW5mbyA9IHNw aV9ub3JfbXRkX290cF9pbmZvOw0KPiArICAgICAgIG10ZC0+X3JlYWRfdXNlcl9wcm90X3JlZyA9 IHNwaV9ub3JfbXRkX290cF9yZWFkOw0KPiArICAgICAgIG10ZC0+X3dyaXRlX3VzZXJfcHJvdF9y ZWcgPSBzcGlfbm9yX210ZF9vdHBfd3JpdGU7DQo+ICsgICAgICAgbXRkLT5fbG9ja191c2VyX3By b3RfcmVnID0gc3BpX25vcl9tdGRfb3RwX2xvY2s7DQo+ICt9DQo+IC0tDQo+IDIuMjAuMQ0KPiAN Cg0K 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.5 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, 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 D9656C433DB for ; Mon, 15 Mar 2021 07:29:57 +0000 (UTC) Received: from desiato.infradead.org (desiato.infradead.org [90.155.92.199]) (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 57FC864E6B for ; Mon, 15 Mar 2021 07:29:57 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 57FC864E6B 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=desiato.20200630; h=Sender:Content-Transfer-Encoding :Content-Type:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:MIME-Version:Content-ID:In-Reply-To:References: Message-ID:Date:Subject:CC:To:From:Reply-To:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=GQO3WmjQvINnVenFCj9CYWyM+Ltb+0ZFEshdHQQQ2Y8=; b=CzHiCDpW3YJ/89o+q+wFRu5Dj u1OMeXdUTGvZCMHxrirce7aoEXAPR7SHhRqIGL8XIX5d+003vlLylQiR7hew+lMGspNqBGcV3l1ye Co/XgUIe2BxWB9YYtl+HPzP6jywAzQ5qFRfvSd56tFj/w9SmOXGHmYdE11I0tH8r12CS2xyf2cFNL vr2vlMQSL3ALit1f8IWA9nN+e8LqX7tA5uO1R3O7jwpJTmCjXnzM0XMs6vuiCKf4H6Y7izW3u99My YKm7KtitZ4jKWmPs55tcItZOnMpupIzCz97zJPsZVc24lpTrULKrggHe+KCnb77XmMltYSJGzplQk nsrPv/24A==; Received: from localhost ([::1] helo=desiato.infradead.org) by desiato.infradead.org with esmtp (Exim 4.94 #2 (Red Hat Linux)) id 1lLhf5-00F8ln-Qm; Mon, 15 Mar 2021 07:29:12 +0000 Received: from esa.microchip.iphmx.com ([68.232.154.123]) by desiato.infradead.org with esmtps (Exim 4.94 #2 (Red Hat Linux)) id 1lLheq-00F8kA-7g for linux-mtd@lists.infradead.org; Mon, 15 Mar 2021 07:29:06 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=microchip.com; i=@microchip.com; q=dns/txt; s=mchp; t=1615793336; x=1647329336; h=from:to:cc:subject:date:message-id:references: in-reply-to:content-id:content-transfer-encoding: mime-version; bh=VZm0YZp5zeeQ1jsSJCwqooSeZXukZyV2gDR5SgtvrKI=; b=kk7VLCr+5ZO0qPdWn8++nwQ8DZoDyvQmL3qjRfKwM/bTDe82oyMfYxVb QYqZGYkj/GQBF6cZ9+dWtKJQ08tuEYA8bei+/MsO0tvDVHks5WKuyTOfG hMQMxsG/L206e8XZFEKI+/HQUaOSWs+SgdTSyEE5PHiSS6onZEYi08Zlf E6dvsuRsb+RRHoZGGX5DIVJlWNeNARh5ZQc4PvGF6U+ca3sCfjspUGDOg nY9xWVQDwyIwJxkLi3PAKqTsPVwRMVVsWalsOgybbn2G6pbG5mcJetRNm xr364lDCyGg709CciCzFsuldX5DW/h5FxMNgg09FYa3XjDH1TU0BU8lOj w==; IronPort-SDR: mcxsKXkyocYJMFua5marZqKIGySPOiOONaOBl9VIP8ctxOSCO3zTj5ondWOPR5NhnpUHSvOB5i iRLw9IqqVtQbrD4ipcjqLq6kaPe1P1LYlyl6v++8Do4xRqkOaDGdfWAJFOH3lj21+fEm31nA4g eBVPdSVg+tD/godHJ1TfjQTgvQF1c5rSGWDBz7gXGMR449f3BP1Pxt67NRfvEzfHXrEIbTCJJZ cjUy9V9/fsFJ1ZTsSRAH3l49HuRYulHfzDpqwKvmc1sz6Frzg7d3lx0OWk11p86zkexiiRL8St O9s= X-IronPort-AV: E=Sophos;i="5.81,249,1610434800"; d="scan'208";a="107187495" Received: from smtpout.microchip.com (HELO email.microchip.com) ([198.175.253.82]) by esa4.microchip.iphmx.com with ESMTP/TLS/AES256-SHA256; 15 Mar 2021 00:28:48 -0700 Received: from chn-vm-ex04.mchp-main.com (10.10.85.152) by chn-vm-ex04.mchp-main.com (10.10.85.152) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2176.2; Mon, 15 Mar 2021 00:28:48 -0700 Received: from NAM04-SN1-obe.outbound.protection.outlook.com (10.10.215.89) by email.microchip.com (10.10.87.151) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2176.2 via Frontend Transport; Mon, 15 Mar 2021 00:28:48 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Dc5MpFelq3QHReO37NpNWEV3zg6U5jZu+JxK2g3L/FqPTjC5Xsrfkq3IvETSNBeItdDAW0yCP7cPqz9BnQ6UsVcntTelT7uYCxMjhW0OfV0SjHiKRTKSf9Sv2S8Z8kN7Luso5ljXkAf8cv1Pyz2KQjXo/djh2rD0CNZ8yAYL8VchIn/XRbSvSfr73bmSWHBgVpG0mLTkjbV49kRuVGuEtLLXPZbzvsjsPZmwX9HDR5+daBsNqfw9lk4PktFcTQemwMn+um8mM4prmiS1j18A9MxP970132X3QZBPGvhIyEsy0Te/o8A8QhtBlrhvvdtPucRbTkwQE+KAWiCyn6cF2g== 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=VZm0YZp5zeeQ1jsSJCwqooSeZXukZyV2gDR5SgtvrKI=; b=nN4ILem6IQ529FmtOroxBt842113UrV5Niw3FonPwH7WnMfHT+mlIXA2X/JafV/wuUXRth5w4RSMA13aPauqPOvR257WSCvj6Pcxr+0wH1a7JWurN6AISJJEqCZuTyqjvvCKhM5UpdYn2OaRqXRV5CdAB1bmrxlQzFkmSW8AknFnKJDgw0TOTpLzSbtuzoMpqB9L4WbbSmg+1NI0qvM/DdXzXvF8nxq9IfP9HjAykfGDHf9sQ5/XAJSR8KxZphVaAGbZ6ATBVnORJbGwJ2ZouOSd8nryPV+38lJOTKld2/v+x3DC18r5ugBYEFJzyVnCoUAC5LisrpVqphKy99Z+eA== 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=VZm0YZp5zeeQ1jsSJCwqooSeZXukZyV2gDR5SgtvrKI=; b=FFfWe7fmXHqf1SAR6TDpYwaXo2W9m/BHLNf6wJo1qO7QPYKZuwzJeB61KmTkQSzNgflhqAaV1J7CSs8dXnW/K8kfeHNh9/nvJ7YRMtIF6szPK1v01Px5uqTP5RBMH436j4PRH+MyObRIf90kKo7q6CyN3lV1TdR7N4kdjSq8pPw= Received: from SA2PR11MB4874.namprd11.prod.outlook.com (2603:10b6:806:f9::23) by SA0PR11MB4639.namprd11.prod.outlook.com (2603:10b6:806:70::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3933.31; Mon, 15 Mar 2021 07:28:47 +0000 Received: from SA2PR11MB4874.namprd11.prod.outlook.com ([fe80::c9e8:9bf4:b08c:c30f]) by SA2PR11MB4874.namprd11.prod.outlook.com ([fe80::c9e8:9bf4:b08c:c30f%7]) with mapi id 15.20.3933.032; Mon, 15 Mar 2021 07:28:47 +0000 From: To: , , CC: , , Subject: Re: [PATCH v4 1/4] mtd: spi-nor: add OTP support Thread-Topic: [PATCH v4 1/4] mtd: spi-nor: add OTP support Thread-Index: AQHXGWzVX5jrWvQlhkiOlI7agfm/7w== Date: Mon, 15 Mar 2021 07:28:47 +0000 Message-ID: <7dd4bfb0-bb38-20c8-68e1-ece836c847fa@microchip.com> References: <20210306000535.9890-1-michael@walle.cc> <20210306000535.9890-2-michael@walle.cc> In-Reply-To: <20210306000535.9890-2-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.111] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: e9080fb7-177c-4e94-53e8-08d8e783f8a3 x-ms-traffictypediagnostic: SA0PR11MB4639: x-ms-exchange-transport-forked: True x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:3826; x-ms-exchange-senderadcheck: 1 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: zLgEtv6AK3iLGNstkZqVnEIS7PCZFyylNFi6gzrzbXxv+eKTaaIbqyZTEdyvswarIX6jj8v3tcm/EzhD1kN6jr5wEDBme5bWgT+9JVUXFwcZi71IUlispHHYaXN7JqHyGzRsSkU6kfan0o458LFS4mclfcOJjm4Gd+2s1N/BZphCkvoB4VQnCGq4RGYoG5rfN0SFcUsjhJq2oN9/5LaND9YfxXLeim/NDVGh9aQzPwoxo2gkJayoWFMaBQUhng5jMTG57fjBItQEZdJaeMo3YCrNeMfWGyENarmwo6EsMtkdA3fr/jtke0SZogT/feWrm/c9bfosUbLfNFfUAXlEvvWto5IN3UmKdcRjo8yA3/Yb6r36Z2JVxhAX8uUopaMojVbN7Yp+ZBmKvjWDuLOr5i2DTdSSVDauJbu+0zS8Pw77eLv1401XjfM9nRSuoUbUlQECIHFJvOSpWKi51OLIy07UaZi8T/1zZfAJLLPrBoObq3U6LX++CdacGyq/0eZsTmBeox2Q9puYBNy6a4jMS19vzZWWTfTuJxZCDyjAWkrQSxu17173E4KSxoVT27RddRdm+Qf1/NfideiIvYSBvyKw6ZwEgAi+eH/P3j7KpNeYgxZO0shx1W7/9HxgBSW6e7MLyCwpLlZvhRiVKxv18XcB8itSUStiEnqY5zJPSqI= 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)(376002)(366004)(396003)(39860400002)(31686004)(6486002)(186003)(2616005)(91956017)(66476007)(6506007)(53546011)(26005)(66446008)(64756008)(66556008)(478600001)(36756003)(8936002)(8676002)(2906002)(54906003)(110136005)(6512007)(31696002)(4326008)(30864003)(5660300002)(83380400001)(71200400001)(66946007)(86362001)(316002)(76116006)(45980500001)(43740500002)(309714004); DIR:OUT; SFP:1101; x-ms-exchange-antispam-messagedata: =?utf-8?B?ck4zOVIrZkpGbHFUekpFcmRPNVB2OHlxb0VjdTI5UVlDS1BqT1BFdTB6Z1lC?= =?utf-8?B?cEQ5MkYzdjdJTFdqMU5ySlV4a0xDeUszWFpibit2L1U5ajRrR1UrNzZBWjNv?= =?utf-8?B?bU0rL2ExL0hjTWtUL2YvbTh4bjVmRWppOHgvai9hazc3Wk5xbnplVWYrZnRJ?= =?utf-8?B?OTlhMllqc3ZrYTQxaldHcGU3WTZsdW5QcHNubGhjYnlMenZveVk4bmVsSjUx?= =?utf-8?B?djFHVFhsU0RjSG9YU0NEWXVSOFdJSlFadElWSzcrazltLzBnOXZQK0ZpN3cy?= =?utf-8?B?THdDbyt3LzNLbTN2N3VGUnBkZWJwQlV3NHRad2ZMWGdLVFJsTzJOZ0xDWEhO?= =?utf-8?B?Uk5zbnViYUtKbDZUSzRMcVhhUzBQNWpkdmlIcWVIajVhV3dZOUErWW9YMnF6?= =?utf-8?B?WU9PcmdFdWtVQmJsZVd2U0p1VWFyUW1taGd4SUdGZzh5c09ia0lWSjltaGdK?= =?utf-8?B?YmtiYU96QVdlalNiNFRUSEtmeFUrZ1hBVlpNY2xZS3pIT213UjlPS2hybDV5?= =?utf-8?B?cWNWY3dpdzl4VnVXWmJqN2UwVmxZYll2NHhpMVBMMWZsUzZCOGNFZnczOG9J?= =?utf-8?B?U1pZSzVCMkF0anh4Qmk4TzZiNjlxM3hBa3d3T3hqZjc2M0s1WE9xUmIwYXRW?= =?utf-8?B?MzJRSGZwOXAyQXlMUGROMXZ2bHhVRFZnWWJVRnhoTXMyRDF3QXB6Mm9FZmNM?= =?utf-8?B?OVdYaEMxNTlBWEFQeUhGRGxvRGZ4cStRTmdrOFVqamFVVmhKa3gxOVJ3OWZO?= =?utf-8?B?QWdPU2pCWDlna1NUOFkxSTdNY09LSnRNdDdteXhTOFhyMkhMUFpuOXRObWdV?= =?utf-8?B?ZFo1KzZWL0xjdGlvcXM4MmxsY3UrN1FodkMrajRFUG9qTXY3enl0cEIyQ3NX?= =?utf-8?B?ZWNVNnlUNjNGTDZkeXo0cmJ2VlY5OW9DSnRpMlY2bzFpQVlMR04rVlJvMng1?= =?utf-8?B?R0NVRzRGWVNEek42M0F1VkFPMS8xdGMzU1h3ZTJMai9XLzZGMDFWakZMQjht?= =?utf-8?B?WWxHM1c1b25pNTZsSlRBTTl2SnhVMXNaTVNrUnZRRk5IM01vS29LMVF5azhM?= =?utf-8?B?citZSXpoY2t2T1kvUW8ySlpNUnNOdDNwYUI3eXk4Y09PWGRNM3hjUjNrYUR1?= =?utf-8?B?MGhlcSsrWHpSS21oQ2NJY0wycU5acEh0cVozV0Iyc09ZR1lQaVN2NVZYT3hM?= =?utf-8?B?MUNKRm5NZkhBUGRwM1BucnJCenBZckRtVFliK1k2Y3QwMHZPNm43d09Ubk9n?= =?utf-8?B?eDZsTGZzQXFMd25CT2s2bjlTeXdYZjlFdDNCTG01Q2IwVkRYYkFxdWNleVZa?= =?utf-8?B?QmZrbGJHNGVDazQ5ZGErd3Q1ODdTSnhhWDNkOUgzUEQ2c0RGaDY0VHRvUUcz?= =?utf-8?B?ajVibDlrc3d2cmNUZDArNldWS09PTkx1RXNJTzZRVVJ1QkxadU8vRDRkajZQ?= =?utf-8?B?akxNa0EzVUpIYjVvL0ovMWNqRG0vSGh6WDdEN0JVMlZhRThWejNsZXNsK0xE?= =?utf-8?B?VHR0Zi9oS3Avc01CS2g0ZkRqMU93d0lDUTczZVdqTCtRb21ZQ0tQbUZrNFlQ?= =?utf-8?B?THhpc1MrazNqQzE0MHFIeUd1aXd0bnVkeCtnN1NRbi8rN3pkbG5MdzNqK2ov?= =?utf-8?B?bVQ1RXZqRzU3REZaTGx3N1pkbm5wenNMek9BSVBPRkhHeU9Nc0s3aHMrRXpt?= =?utf-8?B?cGNic2p1ckIvVk0zck80QUNYL0Z0Y0tWMWw1NDFLeEwvWGpQa0NZQnRPV21M?= =?utf-8?Q?P6Z2BjpXHc9EMrp5Gs=3D?= 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: e9080fb7-177c-4e94-53e8-08d8e783f8a3 X-MS-Exchange-CrossTenant-originalarrivaltime: 15 Mar 2021 07:28:47.0174 (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: mQf3TRroJCFMEOYiWFlZAGATnd/PFQ09miSZVmcqH2anZjTcHpAcUZx1EelQW8lyNYxktKI+ZtyLlszFL4k2nPDJmo0ra46l6UE1Giagqoc= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA0PR11MB4639 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210315_072900_582590_7CBF397A X-CRM114-Status: GOOD ( 30.24 ) X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , 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 Michael, Just cosmetic suggestions this time. On 3/6/21 2:05 AM, Michael Walle wrote: > EXTERNAL EMAIL: Do not click links or open attachments unless you know the content is safe > > SPI flashes sometimes have a special OTP area, which can (and is) used to > store immutable properties like board serial number or vendor assigned > network hardware addresses. > > The MTD subsystem already supports accessing such areas and some (non > SPI NOR) flashes already implement support for it. It differentiates > between user and factory areas. User areas can be written by the user and > factory ones are pre-programmed and locked down by the vendor, usually > containing an "electrical serial number". This patch will only add support > for the user areas. > > Lay the foundation and implement the MTD callbacks for the SPI NOR and add > necessary parameters to the flash_info structure. If a flash supports OTP > it can be added by the convenience macro OTP_INFO(). Sometimes there are > individual regions, which might have individual offsets. Therefore, it is > possible to specify the starting address of the first regions as well as > the distance between two regions (e.g. Winbond devices uses this method). > > Additionally, the regions might be locked down. Once locked, no further > write access is possible. > > For SPI NOR flashes the OTP area is accessed like the normal memory, e.g. > by offset addressing; except that you either have to use special read/write > commands (Winbond) or you have to enter (and exit) a specific OTP mode > (Macronix, Micron). > > Thus we introduce four operations to which the MTD callbacks will be > mapped: .read(), .write(), .lock() and .is_locked(). The read and the write > ops will be given an address offset to operate on while the locking ops use > regions because locking always affects a whole region. It is up to the > flash driver to implement these ops. > > Signed-off-by: Michael Walle > --- > drivers/mtd/spi-nor/Makefile | 1 + > drivers/mtd/spi-nor/core.c | 5 + > drivers/mtd/spi-nor/core.h | 54 +++++++++ > drivers/mtd/spi-nor/otp.c | 218 +++++++++++++++++++++++++++++++++++ > 4 files changed, 278 insertions(+) > create mode 100644 drivers/mtd/spi-nor/otp.c > > diff --git a/drivers/mtd/spi-nor/Makefile b/drivers/mtd/spi-nor/Makefile > index 653923896205..2ed2e76ce4f1 100644 > --- a/drivers/mtd/spi-nor/Makefile > +++ b/drivers/mtd/spi-nor/Makefile > @@ -12,6 +12,7 @@ spi-nor-objs += intel.o > spi-nor-objs += issi.o > spi-nor-objs += macronix.o > spi-nor-objs += micron-st.o > +spi-nor-objs += otp.o spi-nor-objs := core.o sfdp.o otp.o This better indicates that otp is part of the "core" driver, while the rest are manufacturer drivers (that are too part of the core). > spi-nor-objs += spansion.o > spi-nor-objs += sst.o > spi-nor-objs += winbond.o > diff --git a/drivers/mtd/spi-nor/core.c b/drivers/mtd/spi-nor/core.c > index 4a315cb1c4db..0c5c757fa95b 100644 > --- a/drivers/mtd/spi-nor/core.c > +++ b/drivers/mtd/spi-nor/core.c > @@ -3009,6 +3009,8 @@ static void spi_nor_info_init_params(struct spi_nor *nor) > spi_nor_set_erase_type(&map->erase_type[i], info->sector_size, > SPINOR_OP_SE); > spi_nor_init_uniform_erase_map(map, erase_mask, params->size); > + > + nor->params->otp.org = &info->otp_org; Init this immediately after the setup init, something like: params->setup = spi_nor_default_setup; params->otp.org = &info->otp_org; > } > > /** > @@ -3550,6 +3552,9 @@ int spi_nor_scan(struct spi_nor *nor, const char *name, > if (ret) > return ret; > > + /* Configure OTP parameters and ops */ > + spi_nor_otp_init(nor); Please move this as the last init thing in spi_nor_scan, immediately after spi_nor_init(nor); MTD OTP ops are not used accross spi_nor_scan(), there's no need to init these earlier. > + > /* Send all the required SPI flash commands to initialize device */ > ret = spi_nor_init(nor); > if (ret) > diff --git a/drivers/mtd/spi-nor/core.h b/drivers/mtd/spi-nor/core.h > index 4a3f7f150b5d..ec8da1243846 100644 > --- a/drivers/mtd/spi-nor/core.h > +++ b/drivers/mtd/spi-nor/core.h > @@ -187,6 +187,45 @@ struct spi_nor_locking_ops { > int (*is_locked)(struct spi_nor *nor, loff_t ofs, uint64_t len); > }; > > +/** > + * struct spi_nor_otp_organization - Structure to describe the SPI NOR OTP regions > + * @len: size of one OTP region in bytes. > + * @base: start address of the OTP area. > + * @offset: offset between consecutive OTP regions if there are more > + * than one. > + * @n_regions: number of individual OTP regions. > + */ > +struct spi_nor_otp_organization { > + size_t len; > + loff_t base; > + loff_t offset; > + unsigned int n_regions; > +}; > + > +/** > + * struct spi_nor_otp_ops - SPI NOR OTP methods > + * @read: read from the SPI NOR OTP area. > + * @write: write to the SPI NOR OTP area. > + * @lock: lock an OTP region. > + * @is_locked: check if an OTP region of the SPI NOR is locked. > + */ > +struct spi_nor_otp_ops { > + int (*read)(struct spi_nor *nor, loff_t addr, size_t len, u8 *buf); > + int (*write)(struct spi_nor *nor, loff_t addr, size_t len, u8 *buf); > + int (*lock)(struct spi_nor *nor, unsigned int region); > + int (*is_locked)(struct spi_nor *nor, unsigned int region); > +}; > + > +/** > + * struct spi_nor_otp - SPI NOR OTP grouping structure > + * @org: OTP region organization > + * @ops: OTP access ops > + */ > +struct spi_nor_otp { > + const struct spi_nor_otp_organization *org; > + const struct spi_nor_otp_ops *ops; > +}; > + > /** > * struct spi_nor_flash_parameter - SPI NOR flash parameters and settings. > * Includes legacy flash parameters and settings that can be overwritten > @@ -208,6 +247,7 @@ struct spi_nor_locking_ops { > * higher index in the array, the higher priority. > * @erase_map: the erase map parsed from the SFDP Sector Map Parameter > * Table. > + * @otp_info: describes the OTP regions. > * @octal_dtr_enable: enables SPI NOR octal DTR mode. > * @quad_enable: enables SPI NOR quad mode. > * @set_4byte_addr_mode: puts the SPI NOR in 4 byte addressing mode. > @@ -219,6 +259,7 @@ struct spi_nor_locking_ops { > * e.g. different opcodes, specific address calculation, > * page size, etc. > * @locking_ops: SPI NOR locking methods. > + * @otp: SPI NOR OTP methods. > */ > struct spi_nor_flash_parameter { > u64 size; > @@ -232,6 +273,7 @@ struct spi_nor_flash_parameter { > struct spi_nor_pp_command page_programs[SNOR_CMD_PP_MAX]; > > struct spi_nor_erase_map erase_map; > + struct spi_nor_otp otp; > > int (*octal_dtr_enable)(struct spi_nor *nor, bool enable); > int (*quad_enable)(struct spi_nor *nor); > @@ -341,6 +383,8 @@ struct flash_info { > > /* Part specific fixup hooks. */ > const struct spi_nor_fixups *fixups; > + > + const struct spi_nor_otp_organization otp_org; Can we move otp_org just before fixups? Fixups are usually the last thing that we want to specify in a flash info. > }; > > /* Used when the "_ext_id" is two bytes at most */ > @@ -393,6 +437,14 @@ struct flash_info { > .addr_width = 3, \ > .flags = SPI_NOR_NO_FR | SPI_NOR_XSR_RDY, > > +#define OTP_INFO(_len, _n_regions, _base, _offset) \ > + .otp_org = { \ > + .len = (_len), \ > + .base = (_base), \ > + .offset = (_offset), \ > + .n_regions = (_n_regions), \ > + }, > + > /** > * struct spi_nor_manufacturer - SPI NOR manufacturer object > * @name: manufacturer name > @@ -473,6 +525,8 @@ int spi_nor_post_bfpt_fixups(struct spi_nor *nor, > const struct sfdp_bfpt *bfpt, > struct spi_nor_flash_parameter *params); > > +void spi_nor_otp_init(struct spi_nor *nor); > + > static struct spi_nor __maybe_unused *mtd_to_spi_nor(struct mtd_info *mtd) > { > return mtd->priv; > diff --git a/drivers/mtd/spi-nor/otp.c b/drivers/mtd/spi-nor/otp.c > new file mode 100644 > index 000000000000..4e301fd5156b > --- /dev/null > +++ b/drivers/mtd/spi-nor/otp.c > @@ -0,0 +1,218 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* > + * OTP support for SPI NOR flashes > + * > + * Copyright (C) 2021 Michael Walle > + */ > + > +#include > +#include > +#include > + > +#include "core.h" > + > +#define spi_nor_otp_ops(nor) ((nor)->params->otp.ops) > +#define spi_nor_otp_region_len(nor) ((nor)->params->otp.org->len) > +#define spi_nor_otp_n_regions(nor) ((nor)->params->otp.org->n_regions) I don't like these wrappers because they gratuiously hide what's really there. I find the code more easier to read without these wrappers, because I don't have to memorize what these wrappers are doing, and I better see how the code is organized. > + > +static loff_t spi_nor_otp_region_start(const struct spi_nor *nor, int region) > +{ > + const struct spi_nor_otp_organization *org = nor->params->otp.org; how about s/org/otp_org? > + > + return org->base + region * org->offset; > +} > + > +static size_t spi_nor_otp_size(struct spi_nor *nor) > +{ > + return spi_nor_otp_n_regions(nor) * spi_nor_otp_region_len(nor); > +} > + > +/* > + * Translate the file offsets from and to OTP regions. See also > + * spi_nor_mtd_otp_do_op(). > + */ > +static loff_t spi_nor_otp_region_to_offset(struct spi_nor *nor, unsigned int region) > +{ > + return region * spi_nor_otp_region_len(nor); > +} > + > +static unsigned int spi_nor_otp_offset_to_region(struct spi_nor *nor, loff_t ofs) > +{ > + return ofs / spi_nor_otp_region_len(nor); > +} > + > +static int spi_nor_mtd_otp_info(struct mtd_info *mtd, size_t len, > + size_t *retlen, struct otp_info *buf) > +{ > + struct spi_nor *nor = mtd_to_spi_nor(mtd); > + const struct spi_nor_otp_ops *ops = spi_nor_otp_ops(nor); > + unsigned int n_regions = spi_nor_otp_n_regions(nor); > + unsigned int region; > + int ret, locked; > + > + if (len < n_regions * sizeof(*buf)) > + return -ENOSPC; > + > + ret = spi_nor_lock_and_prep(nor); > + if (ret) > + return ret; > + > + for (region = 0; region < spi_nor_otp_n_regions(nor); region++) { for (i = 0; i < n_regions; i++) already indicates that i is the index of a region, no need to have an explicit name. Also, if you want to introduce a local variable, n_regions, use it here too. > + buf->start = spi_nor_otp_region_to_offset(nor, region); > + buf->length = spi_nor_otp_region_len(nor); > + > + locked = ops->is_locked(nor, region); > + if (locked < 0) { > + ret = locked; > + goto out; > + } > + > + buf->locked = !!locked; > + buf++; > + } > + > + *retlen = n_regions * sizeof(*buf); > + > +out: > + spi_nor_unlock_and_unprep(nor); > + > + return ret; > +} > + > +static int spi_nor_mtd_otp_read_write(struct mtd_info *mtd, loff_t ofs, > + size_t total_len, size_t *retlen, > + u_char *buf, bool is_write) not related to this patch, but the list of arguments is quite big, maybe we can update mtd to pass a pointer to a struct. > +{ > + struct spi_nor *nor = mtd_to_spi_nor(mtd); > + const struct spi_nor_otp_ops *ops = spi_nor_otp_ops(nor); > + const size_t rlen = spi_nor_otp_region_len(nor); > + loff_t rstart, rofs; > + unsigned int region; > + size_t len; > + int ret; > + > + if (ofs < 0 || ofs >= spi_nor_otp_size(nor)) > + return 0; > + > + ret = spi_nor_lock_and_prep(nor); > + if (ret) > + return ret; > + > + /* don't access beyond the end */ > + total_len = min_t(size_t, total_len, spi_nor_otp_size(nor) - ofs); > + > + *retlen = 0; > + while (total_len) { > + /* > + * The OTP regions are mapped into a contiguous area starting > + * at 0 as expected by the MTD layer. This will map the MTD > + * file offsets to the address of an OTP region as used in the > + * actual SPI commands. > + */ > + region = spi_nor_otp_offset_to_region(nor, ofs); > + rstart = spi_nor_otp_region_start(nor, region); Maybe it's just me, but I don't like the helpers :). Especially spi_nor_otp_offset_to_region. And spi_nor_otp_region_start() is used just here. Maybe discard them and s/region/i? > + > + /* > + * The size of a OTP region is expected to be a power of two, > + * thus we can just mask the lower bits and get the offset into > + * a region. > + */ > + rofs = ofs & (rlen - 1); > + > + /* don't access beyond one OTP region */ > + len = min_t(size_t, total_len, rlen - rofs); > + > + if (is_write) > + ret = ops->write(nor, rstart + rofs, len, buf); > + else > + ret = ops->read(nor, rstart + rofs, len, buf); > + if (ret == 0) > + ret = -EIO; > + if (ret < 0) > + goto out; > + > + *retlen += ret; > + ofs += ret; > + buf += ret; > + total_len -= ret; > + } > + ret = 0; > + > +out: > + spi_nor_unlock_and_unprep(nor); > + return ret; > +} > + > +static int spi_nor_mtd_otp_read(struct mtd_info *mtd, loff_t from, size_t len, > + size_t *retlen, u_char *buf) > +{ > + return spi_nor_mtd_otp_read_write(mtd, from, len, retlen, buf, false); > +} > + > +static int spi_nor_mtd_otp_write(struct mtd_info *mtd, loff_t to, size_t len, > + size_t *retlen, u_char *buf) > +{ > + return spi_nor_mtd_otp_read_write(mtd, to, len, retlen, buf, true); > +} > + > +static int spi_nor_mtd_otp_lock(struct mtd_info *mtd, loff_t from, size_t len) > +{ > + struct spi_nor *nor = mtd_to_spi_nor(mtd); > + const struct spi_nor_otp_ops *ops = spi_nor_otp_ops(nor); > + unsigned int region; > + int ret; > + > + if (from < 0 || (from + len) > spi_nor_otp_size(nor)) > + return -EINVAL; > + > + /* the user has to explicitly ask for whole regions */ > + if (len % spi_nor_otp_region_len(nor)) > + return -EINVAL; > + > + if (from % spi_nor_otp_region_len(nor)) > + return -EINVAL; > + > + ret = spi_nor_lock_and_prep(nor); > + if (ret) > + return ret; > + > + while (len) { > + region = spi_nor_otp_offset_to_region(nor, from); > + ret = ops->lock(nor, region); > + if (ret) > + goto out; > + > + len -= spi_nor_otp_region_len(nor); > + from += spi_nor_otp_region_len(nor); > + } > + > +out: > + spi_nor_unlock_and_unprep(nor); > + > + return ret; > +} > + > +void spi_nor_otp_init(struct spi_nor *nor) > +{ > + struct mtd_info *mtd = &nor->mtd; > + > + if (!nor->params->otp.ops) > + return; > + > + if (WARN_ON(!is_power_of_2(spi_nor_otp_region_len(nor)))) Why WARN_ON and not just a debug message? Cheers, ta > + return; > + > + /* > + * We only support user_prot callbacks (yet). > + * > + * Some SPI NOR flashes like Macronix ones can be ordered in two > + * different variants. One with a factory locked OTP area and one where > + * it is left to the user to write to it. The factory locked OTP is > + * usually preprogrammed with an "electrical serial number". We don't > + * support these for now. > + */ > + mtd->_get_user_prot_info = spi_nor_mtd_otp_info; > + mtd->_read_user_prot_reg = spi_nor_mtd_otp_read; > + mtd->_write_user_prot_reg = spi_nor_mtd_otp_write; > + mtd->_lock_user_prot_reg = spi_nor_mtd_otp_lock; > +} > -- > 2.20.1 > ______________________________________________________ Linux MTD discussion mailing list http://lists.infradead.org/mailman/listinfo/linux-mtd/