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=-8.3 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY,URIBL_BLOCKED, USER_AGENT_SANE_2 autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id D3DB6C433E1 for ; Tue, 7 Jul 2020 07:33:04 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 9069F206B6 for ; Tue, 7 Jul 2020 07:33:04 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=mediatek.com header.i=@mediatek.com header.b="SPd7WdbI" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726852AbgGGHdD (ORCPT ); Tue, 7 Jul 2020 03:33:03 -0400 Received: from mailgw01.mediatek.com ([210.61.82.183]:7126 "EHLO mailgw01.mediatek.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1725825AbgGGHdC (ORCPT ); Tue, 7 Jul 2020 03:33:02 -0400 X-UUID: aa5958b8b8ae46c787b8794d0c6cab6c-20200707 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Transfer-Encoding:MIME-Version:Content-Type:References:In-Reply-To:Date:CC:To:From:Subject:Message-ID; bh=bbruckC3ceq+ERWDrNx+WHxXmMBaz2tWUh5l7zH/VsA=; b=SPd7WdbIV3UpMIi5oaQy4k3V9FGdhnlfAUydzvpkg9yv6bYWSiPaBRH+MHLjLsu+oML0twaDC67qjEDCVfFgogOolFeiQwqA4dMkq+xUCX1oebLldVR3mMwyxd0kR1AWw00mx5fkj1AsdwC9XiFyBpZo9UrBLEpJOie6s9AF9xI=; X-UUID: aa5958b8b8ae46c787b8794d0c6cab6c-20200707 Received: from mtkcas08.mediatek.inc [(172.21.101.126)] by mailgw01.mediatek.com (envelope-from ) (Cellopoint E-mail Firewall v4.1.10 Build 0809 with TLS) with ESMTP id 1125661989; Tue, 07 Jul 2020 15:32:51 +0800 Received: from mtkcas07.mediatek.inc (172.21.101.84) by mtkmbs01n1.mediatek.inc (172.21.101.68) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 7 Jul 2020 15:32:48 +0800 Received: from [172.21.77.33] (172.21.77.33) by mtkcas07.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 7 Jul 2020 15:32:49 +0800 Message-ID: <1594107170.20820.84.camel@mtkswgap22> Subject: Re: [PATCH 2/2] soc: mediatek: devapc: add devapc-mt6779 driver From: Neal Liu To: Matthias Brugger CC: Neal Liu , Rob Herring , , , lkml , "moderated list:ARM/Mediatek SoC support" , Date: Tue, 7 Jul 2020 15:32:50 +0800 In-Reply-To: References: <1594027693-19530-1-git-send-email-neal.liu@mediatek.com> <1594027693-19530-3-git-send-email-neal.liu@mediatek.com> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.2.3-0ubuntu6 MIME-Version: 1.0 X-MTK: N Content-Transfer-Encoding: base64 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org SGkgTWF0dGhpYXMsDQoNClRoYW5rcyBmb3IgeW91ciByZXZpZXcuDQoNCk9uIE1vbiwgMjAyMC0w Ny0wNiBhdCAxMzoyNyArMDIwMCwgTWF0dGhpYXMgQnJ1Z2dlciB3cm90ZToNCj4gQ0MgbGludXgt bWVkaWF0ZWsNCj4gDQo+IFBsZWFzZSB5b3UgLi9zY3JpcHRzL2dldF9tYWludGFpbmVycy5wbCB0 byBmaW5kIG91dCB0byB3aG9tIHlvdSBzaG91bGQgc2VuZCB0aGUNCj4gc2VyaWVzLg0KDQpZZXMs IEkgYWxyZWFkeSBmaW5kIG91dCBmcm9tIGdldF9tYWludGFpbmVycy5wbC4gQnV0IEkgZm9yZ290 IHRvIGFkZCBpdA0KaW50byBjYyBsaXN0Li4uDQoNCj4gDQo+IE9uIDA2LzA3LzIwMjAgMTE6Mjgs IE5lYWwgTGl1IHdyb3RlOg0KPiA+IE1UNjc3OSBidXMgZnJhYnJpYyBwcm92aWRlcyBUcnVzdFpv bmUgc2VjdXJpdHkgc3VwcG9ydCBhbmQgZGF0YQ0KPiA+IHByb3RlY3Rpb24gdG8gcHJldmVudCBz bGF2ZXMgZnJvbSBiZWluZyBhY2Nlc3NlZCBieSB1bmV4cGVjdGVkDQo+ID4gbWFzdGVycy4NCj4g PiBUaGUgc2VjdXJpdHkgdmlvbGF0aW9ucyBhcmUgbG9nZ2VkIGFuZCBzZW50IHRvIHRoZSBwcm9j ZXNzb3IgZm9yDQo+ID4gZnVydGhlciBhbmFseXNpcyBvciBjb3VudGVybWVhc3VyZXMuDQo+ID4g DQo+ID4gQW55IG9jY3VycmVuY2Ugb2Ygc2VjdXJpdHkgdmlvbGF0aW9uIHdvdWxkIHJhaXNlIGFu IGludGVycnVwdCwgYW5kDQo+ID4gaXQgd2lsbCBiZSBoYW5kbGVkIGJ5IGRldmFwYy1tdDY3Nzkg ZHJpdmVyLiBUaGUgdmlvbGF0aW9uDQo+ID4gaW5mb3JtYXRpb24gaXMgcHJpbnRlZCBpbiBvcmRl ciB0byBmaW5kIHRoZSBtdXJkZXJlci4NCj4gPiANCj4gDQo+IFBsZWFzZSBkZXNjcmliZSBpbiBt b3JlIGRldGFpbCBob3cgdGhpcyBIVyB3b3Jrcy4NCg0KImRldmFwYyIgbWVhbnMgRGV2aWNlIEFj Y2VzcyBQZXJtaXNzaW9uIENvbnRyb2wuDQpUaGlzIGhhcmR3YXJlIGNhbiBjb250cm9sIHdoaWNo IGJ1cyBtYXN0ZXJzIGFyZSBhbGxvd2VkIG9yIGRpc2FsbG93ZWQgdG8NCmFjY2VzcyBidXMgc2xh dmVzLiBBbmQgaXQgd2lsbCBnZW5lcmF0ZSBpbnRlcnJ1cHRzIGlmIHNvbWVvbmUgdmlvbGF0ZXMN CnRoZSBydWxlcy4NCllvdSBjYW4gY2hlY2sgYmluZGluZyBmb3IgbW9yZSBkZXRhaWxzLg0KDQo+ IA0KPiA+IFNpZ25lZC1vZmYtYnk6IE5lYWwgTGl1IDxuZWFsLmxpdUBtZWRpYXRlay5jb20+DQo+ ID4gLS0tDQo+IA0KPiBjb3B5aW5nIG15IGNvbW1lbnRzIGZyb20gdGhlIGxhc3QgcmV2aXNpb24s IHdoaWNoIHdlcmVuJ3QgYW5zd2VyZWQgYW5kIGFyZSBub3QNCj4gYWRkcmVzc2VkIGhlcmUuIElm IHlvdSBhcmUgbm90IE9LIHdpdGggbXkgc3VnZ3Vlc3Rpb25zLCBubyBwcm9ibGVtIGJ1dCBwbGVh c2UNCj4gcHJvdmlkZSB5b3VyIGFyZ3VtZW50cyBzbyB0aGF0IHdlIGNhbiBjb21lIHVwIHdpdGgg YSBzb2x1dGlvbi4gT3RoZXJ3aXNlIHlvdSBhcmUNCj4ganVzdCB3YXN0aW5nIHlvdXIgYW5kIG15 IHRpbWU6DQoNClNvcnJ5IGZvciBub3QgcmVwbHlpbmcgeW91ciBwcmV2aW91cyBjb21tZW50cy4g SSB0aGluayB5b3VyIG1vc3QNCmNvbW1lbnRzIGFyZSByZWFsbHkgaGVscGZ1bCBhbmQgSSBhbHJl YWR5IHJldmlzZWQgYW5kIGFwcGxpZWQgaXQgaW4gdGhpcw0KcGF0Y2guDQpMZXQncyBkaXNjdXNz IHRoZSBwYXJ0IEkgbWlzc2VkLg0KDQo+IA0KPiBQbGVhc2UgcmV2aWV3IHlvdXIgZGF0YSBzdHJ1 Y3R1cmVzIGFuZCB0cnkgdG8gZ3JvdXAgdGhlIGluZm9ybWF0aW9uIGluIGxvZ2ljYWwNCj4gc3Ry dWN0cy4gRm9yIGV4YW1wbGUgSSBkb24ndCB1bmRlcnN0YW5kIHdoeSB3ZSBuZWVkIG10a19kZXZh cGNfY29udGV4dC4gSXQgc2VlbXMNCj4gdG8gbWUgdGhhdCBhbGwgdGhlIHZhbHVlcyBpbiB0aGVy ZSBhcmUgU29DIHNwZWNpZmljLg0KPiANCg0KWWVzLCB5b3UgYXJlIHJpZ2h0LiBtdGtfZGV2YXBj X2NvbnRleHQgZGVkaWNhdGVkIHRvIFNvQyBzcGVjaWZpYy4NCg0KPiBXaHkgdm9pZCBfX2lvbWVt ICpkZXZhcGNfcGRfYmFzZSBpc24ndCBwYXJ0IG9mIHRoZSBkZXZpY2VfaW5mbz8NCj4gDQoNCmRl dmljZV9pbmZvIHN0b3JlcyBzbGF2ZXMnIGluZm8gd2hpY2ggYXJlIGNvbnRyb2xsZWQgYnkgZGV2 YXBjLg0KZGV2YXBjX3BkX2Jhc2Ugc3RvcmVzIGRldmFwY19wZCBiYXNlZCByZWdpc3RlciB3aGlj aCBpcyB1c2VkIHRvIGNvbnRyb2wNCmFuZCBkdW1wIHZpb2xhdGlvbiBpbmZvcm1hdGlvbi4NCg0K PiANCj4gDQo+ID4gIGRyaXZlcnMvc29jL21lZGlhdGVrL0tjb25maWcgICAgICAgICAgICAgICAg fCAgICA2ICsNCj4gPiAgZHJpdmVycy9zb2MvbWVkaWF0ZWsvTWFrZWZpbGUgICAgICAgICAgICAg ICB8ICAgIDEgKw0KPiA+ICBkcml2ZXJzL3NvYy9tZWRpYXRlay9kZXZhcGMvS2NvbmZpZyAgICAg ICAgIHwgICAxNyArDQo+ID4gIGRyaXZlcnMvc29jL21lZGlhdGVrL2RldmFwYy9NYWtlZmlsZSAg ICAgICAgfCAgIDEwICsNCj4gPiAgZHJpdmVycy9zb2MvbWVkaWF0ZWsvZGV2YXBjL2RldmFwYy1t dDY3NzkuYyB8IDExMTEgKysrKysrKysrKysrKysrKysrKysrKysrKysrDQo+IA0KPiBGcm9tIHRo ZSBhbnN3ZXJzIG9mIHRoZSBsYXN0IHJldmlzaW9uIGl0IHNlZW1zIHRoYXQgdGhpcyBkcml2ZXIg d2lsbCBiZSB1c2VkIGZvcg0KPiBtb3JlIHRoZW4gb25lIFNvQy4gU28gd2Ugc2hvdWxkIG5vdCBu YW1lIGl0IGRldmFwYy1tdDY3NzkuYyBidXQgZm9yIGV4YW1wbGUNCj4gbXRrLWRldmFwYy5jLg0K DQpPa2F5LCB3ZSBjb3VsZCB1c2UgbXRrLWRldmFwYy5jIGZvciBmaXJzdCBwYXRjaC4gSWYgd2Ug dXBzdHJlYW0gbmV4dA0KU29DLCB0aGVuIHdlIGNvdWxkIHNlcGFyYXRlIFNvQyBzcGVjaWZpYyBw YXJ0Lg0KDQo+IA0KPiBCeSB0aGUgd2F5LCB3aGF0IGRvZXMgdGhlIGRldmFwYyBzdGFuZHMgZm9y PyBJdCdzIG5vdCBjbGVhciBmcm9tIHRoZSBjb21taXQNCj4gbWVzc2FnZSBub3IgZnJvbSB0aGUg YmluZGluZyBkZXNjcmlwdGlvbi4NCg0KSXQgYWxyZWFkeSBkZXNjcmliZWQgaW4gYmluZGluZyB0 aXRsZS4NCnRpdGxlOiBNZWRpYVRlayBNVDY3NzkgRGV2aWNlIEFjY2VzcyBQZXJtaXNzaW9uIENv bnRyb2wgZHJpdmVyDQoNCj4gDQo+ID4gIGRyaXZlcnMvc29jL21lZGlhdGVrL2RldmFwYy9kZXZh cGMtbXQ2Nzc5LmggfCAgIDk5ICsrKw0KPiA+ICA2IGZpbGVzIGNoYW5nZWQsIDEyNDQgaW5zZXJ0 aW9ucygrKQ0KPiA+ICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9zb2MvbWVkaWF0ZWsvZGV2 YXBjL0tjb25maWcNCj4gPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvc29jL21lZGlhdGVr L2RldmFwYy9NYWtlZmlsZQ0KPiA+ICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9zb2MvbWVk aWF0ZWsvZGV2YXBjL2RldmFwYy1tdDY3NzkuYw0KPiA+ICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJp dmVycy9zb2MvbWVkaWF0ZWsvZGV2YXBjL2RldmFwYy1tdDY3NzkuaA0KPiA+IA0KPiA+IGRpZmYg LS1naXQgYS9kcml2ZXJzL3NvYy9tZWRpYXRlay9LY29uZmlnIGIvZHJpdmVycy9zb2MvbWVkaWF0 ZWsvS2NvbmZpZw0KPiA+IGluZGV4IDU5YTU2Y2QuLjJjOWFkMWYgMTAwNjQ0DQo+ID4gLS0tIGEv ZHJpdmVycy9zb2MvbWVkaWF0ZWsvS2NvbmZpZw0KPiA+ICsrKyBiL2RyaXZlcnMvc29jL21lZGlh dGVrL0tjb25maWcNCj4gPiBAQCAtNTEsNCArNTEsMTAgQEAgY29uZmlnIE1US19NTVNZUw0KPiA+ ICAJICBTYXkgeWVzIGhlcmUgdG8gYWRkIHN1cHBvcnQgZm9yIHRoZSBNZWRpYVRlayBNdWx0aW1l ZGlhDQo+ID4gIAkgIFN1YnN5c3RlbSAoTU1TWVMpLg0KPiA+ICANCj4gPiArbWVudSAiU2VjdXJp dHkiDQo+ID4gKw0KPiA+ICtzb3VyY2UgImRyaXZlcnMvc29jL21lZGlhdGVrL2RldmFwYy9LY29u ZmlnIg0KPiA+ICsNCj4gPiArZW5kbWVudSAjIFNlY3VyaXR5DQo+ID4gKw0KPiA+ICBlbmRtZW51 DQo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvc29jL21lZGlhdGVrL01ha2VmaWxlIGIvZHJpdmVy cy9zb2MvbWVkaWF0ZWsvTWFrZWZpbGUNCj4gPiBpbmRleCAwMWY5Zjg3Li5kNjcxN2E4MSAxMDA2 NDQNCj4gPiAtLS0gYS9kcml2ZXJzL3NvYy9tZWRpYXRlay9NYWtlZmlsZQ0KPiA+ICsrKyBiL2Ry aXZlcnMvc29jL21lZGlhdGVrL01ha2VmaWxlDQo+ID4gQEAgLTEsNSArMSw2IEBADQo+ID4gICMg U1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seQ0KPiA+ICBvYmotJChDT05GSUdf TVRLX0NNRFEpICs9IG10ay1jbWRxLWhlbHBlci5vDQo+ID4gK29iai0kKENPTkZJR19NVEtfREVW QVBDKSArPSBkZXZhcGMvDQo+IA0KPiBXaHkgZG8gd2UgbmVlZCBhIG5ldyBmb2xkZXIgZm9yIHRo ZSBkcml2ZXI/DQoNCkN1cnJlbnRseSwgd2UgZG9uJ3QgbmVlZCBpdC4gQnV0IG9uY2UgaXQgc3Vw cG9ydCBtdWx0aXBsZSBwbGF0Zm9ybXMsIHdlDQp3b3VsZCBsaWtlIHRvIGdyb3VwIGl0LiBEb2Vz IGl0IG1ha2Ugc2Vuc2U/DQoNCj4gDQo+ID4gIG9iai0kKENPTkZJR19NVEtfSU5GUkFDRkcpICs9 IG10ay1pbmZyYWNmZy5vDQo+ID4gIG9iai0kKENPTkZJR19NVEtfUE1JQ19XUkFQKSArPSBtdGst cG1pYy13cmFwLm8NCj4gPiAgb2JqLSQoQ09ORklHX01US19TQ1BTWVMpICs9IG10ay1zY3BzeXMu bw0KPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3NvYy9tZWRpYXRlay9kZXZhcGMvS2NvbmZpZyBi L2RyaXZlcnMvc29jL21lZGlhdGVrL2RldmFwYy9LY29uZmlnDQo+ID4gbmV3IGZpbGUgbW9kZSAx MDA2NDQNCj4gPiBpbmRleCAwMDAwMDAwLi5iMGY3ZDBlDQo+ID4gLS0tIC9kZXYvbnVsbA0KPiA+ ICsrKyBiL2RyaXZlcnMvc29jL21lZGlhdGVrL2RldmFwYy9LY29uZmlnDQo+ID4gQEAgLTAsMCAr MSwxNyBAQA0KPiA+ICtjb25maWcgTVRLX0RFVkFQQw0KPiA+ICsJdHJpc3RhdGUgIk1lZGlhdGVr IERldmljZSBBUEMgU3VwcG9ydCINCj4gPiArCWhlbHANCj4gPiArCSAgRGV2aWNlIEFQQyBpcyBh IEhXIElQIGNvbnRyb2xsaW5nIGludGVybmFsIGRldmljZSBzZWN1cml0eS4NCj4gPiArCSAgTWVk aWFUZWsgYnVzIGZyYWJyaWMgcHJvdmlkZXMgVHJ1c3Rab25lIHNlY3VyaXR5IHN1cHBvcnQgYW5k IGRhdGENCj4gPiArCSAgcHJvdGVjdGlvbiB0byBwcmV2ZW50IHNsYXZlcyBmcm9tIGJlaW5nIGFj Y2Vzc2VkIGJ5IHVuZXhwZWN0ZWQNCj4gPiArCSAgYnVzIG1hc3RlcnMuDQo+ID4gKwkgIERldmlj ZSBBUEMgcHJldmVudHMgbWFsaWNpb3VzIGFjY2VzcyB0byBpbnRlcm5hbCBkZXZpY2VzLg0KPiA+ ICsNCj4gPiArY29uZmlnIERFVkFQQ19NVDY3NzkNCj4gPiArCXRyaXN0YXRlICJNZWRpYXRlayBN VDY3NzkgRGV2aWNlIEFQQyBkcml2ZXIiDQo+ID4gKwlzZWxlY3QgTVRLX0RFVkFQQw0KPiA+ICsJ aGVscA0KPiA+ICsJICBTYXkgeWVzIGhlcmUgdG8gZW5hYmxlIHN1cHBvcnQgTWVkaWF0ZWsgTVQ2 Nzc5IERldmljZSBBUEMgZHJpdmVyLg0KPiA+ICsJICBUaGlzIGRyaXZlciBtYWlubHkgdXNlZCB0 byBoYW5kbGUgdGhlIHZpb2xhdGlvbiB3aXRoIDEgREVWQVBDIEFPL1BEcy4NCj4gPiArCSAgVGhl IHZpb2xhdGlvbiBpbmZvcm1hdGlvbiBhcmUgbG9nZ2VkIGZvciBmdXJ0aGVyIGFuYWx5c2lzIG9y DQo+ID4gKwkgIGNvdW50ZXJtZWFzdXJlcy4NCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9zb2Mv bWVkaWF0ZWsvZGV2YXBjL01ha2VmaWxlIGIvZHJpdmVycy9zb2MvbWVkaWF0ZWsvZGV2YXBjL01h a2VmaWxlDQo+ID4gbmV3IGZpbGUgbW9kZSAxMDA2NDQNCj4gPiBpbmRleCAwMDAwMDAwLi4wMzM2 YzFkDQo+ID4gLS0tIC9kZXYvbnVsbA0KPiA+ICsrKyBiL2RyaXZlcnMvc29jL21lZGlhdGVrL2Rl dmFwYy9NYWtlZmlsZQ0KPiA+IEBAIC0wLDAgKzEsMTAgQEANCj4gPiArIyBTUERYLUxpY2Vuc2Ut SWRlbnRpZmllcjogR1BMLTIuMA0KPiA+ICsNCj4gPiAraWZlcSAoJChDT05GSUdfTVRLX0dDT1Zf S0VSTkVMKSx5KQ0KPiA+ICtHQ09WX1BST0ZJTEUgOj0geQ0KPiA+ICtlbmRpZg0KPiA+ICsNCj4g PiArb2JqLSQoQ09ORklHX01US19ERVZBUEMpIDo9IGRldmFwYy5vDQo+ID4gKw0KPiA+ICsjIFBs YXRmb3JtDQo+ID4gK2RldmFwYy0kKENPTkZJR19ERVZBUENfTVQ2Nzc5KSArPSBkZXZhcGMtbXQ2 Nzc5Lm8NCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9zb2MvbWVkaWF0ZWsvZGV2YXBjL2RldmFw Yy1tdDY3NzkuYyBiL2RyaXZlcnMvc29jL21lZGlhdGVrL2RldmFwYy9kZXZhcGMtbXQ2Nzc5LmMN Cj4gPiBuZXcgZmlsZSBtb2RlIDEwMDY0NA0KPiA+IGluZGV4IDAwMDAwMDAuLmEyOGI5ZjMNCj4g PiAtLS0gL2Rldi9udWxsDQo+ID4gKysrIGIvZHJpdmVycy9zb2MvbWVkaWF0ZWsvZGV2YXBjL2Rl dmFwYy1tdDY3NzkuYw0KPiA+IEBAIC0wLDAgKzEsMTExMSBAQA0KPiA+ICsvLyBTUERYLUxpY2Vu c2UtSWRlbnRpZmllcjogR1BMLTIuMA0KPiA+ICsvKg0KPiA+ICsgKiBDb3B5cmlnaHQgKEMpIDIw MjAgTWVkaWFUZWsgSW5jLg0KPiA+ICsgKi8NCj4gPiArDQo+ID4gKyNpbmNsdWRlIDxsaW51eC9j bGsuaD4NCj4gPiArI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPg0KPiA+ICsjaW5jbHVkZSA8 bGludXgvbW9kdWxlLmg+DQo+ID4gKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4N Cj4gPiArI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPg0KPiA+ICsjaW5jbHVkZSA8bGludXgvb2Zf YWRkcmVzcy5oPg0KPiA+ICsNCj4gPiArI2luY2x1ZGUgImRldmFwYy1tdDY3NzkuaCINCj4gPiAr DQo+ID4gK3N0YXRpYyBzdHJ1Y3QgbXRrX2RldmljZV9pbmZvIG10Njc3OV9kZXZpY2VzX2luZnJh W10gPSB7DQo+IA0KPiBMb29rcyBsaWtlIGEgY2FuZGlkYXRlIHRvIHB1dCBpbnRvIHRoZSAqLmgg ZmlsZS4NCj4gDQoNCnNob3VsZCBiZSBva2F5Lg0KDQo+ID4gKwkvKiBzeXNfaWR4LCBjdHJsX2lk eCwgdmlvX2lkeCAqLw0KPiA+ICsJLyogMCAqLw0KPiA+ICsJezAsIDAsIDB9LA0KPiA+ICsJezAs IDEsIDF9LA0KPiA+ICsJezAsIDIsIDJ9LA0KPiA+ICsJezAsIDMsIDN9LA0KPiA+ICsJezAsIDQs IDR9LA0KPiA+ICsJezAsIDUsIDV9LA0KPiA+ICsJezAsIDYsIDZ9LA0KPiA+ICsJezAsIDcsIDd9 LA0KPiA+ICsJezAsIDgsIDh9LA0KPiA+ICsJezAsIDksIDl9LA0KPiA+ICsNCj4gPiArCS8qIDEw ICovDQo+ID4gKwl7MCwgMTAsIDEwfSwNCj4gPiArCXswLCAxMSwgMTF9LA0KPiA+ICsJezAsIDEy LCAxMn0sDQo+ID4gKwl7MCwgMTMsIDEzfSwNCj4gPiArCXswLCAxNCwgMTR9LA0KPiA+ICsJezAs IDE1LCAxNX0sDQo+ID4gKwl7MCwgMTYsIDE2fSwNCj4gPiArCXswLCAxNywgMTd9LA0KPiA+ICsJ ezAsIDE4LCAxOH0sDQo+ID4gKwl7MCwgMTksIDE5fSwNCj4gPiArDQo+ID4gKwkvKiAyMCAqLw0K PiA+ICsJezAsIDIwLCAyMH0sDQo+ID4gKwl7MCwgMjEsIDIxfSwNCj4gPiArCXswLCAyMiwgMjJ9 LA0KPiA+ICsJezAsIDIzLCAyM30sDQo+ID4gKwl7MCwgMjQsIDI0fSwNCj4gPiArCXswLCAyNSwg MjV9LA0KPiA+ICsJezAsIDI2LCAyNn0sDQo+ID4gKwl7MCwgMjcsIDI3fSwNCj4gPiArCXswLCAy OCwgMjh9LA0KPiA+ICsJezAsIDI5LCAyOX0sDQo+ID4gKw0KPiA+ICsJLyogMzAgKi8NCj4gPiAr CXswLCAzMCwgMzB9LA0KPiA+ICsJezAsIDMxLCAzMX0sDQo+ID4gKwl7MCwgMzIsIDMyfSwNCj4g PiArCXswLCAzMywgNzd9LA0KPiA+ICsJezAsIDM0LCA3OH0sDQo+ID4gKwl7MCwgMzUsIDc5fSwN Cj4gPiArCXswLCAzNSwgODB9LA0KPiA+ICsJezAsIDM3LCAzN30sDQo+ID4gKwl7MCwgMzgsIDM4 fSwNCj4gPiArCXswLCAzOSwgMzl9LA0KPiA+ICsNCj4gPiArCS8qIDQwICovDQo+ID4gKwl7MCwg NDAsIDQwfSwNCj4gPiArCXswLCA0MSwgNDF9LA0KPiA+ICsJezAsIDQyLCA0Mn0sDQo+ID4gKwl7 MCwgNDMsIDQzfSwNCj4gPiArCXswLCA0NCwgNDR9LA0KPiA+ICsJezAsIDQ1LCA0NX0sDQo+ID4g Kwl7MCwgNDYsIDQ2fSwNCj4gPiArCXswLCA0NywgNDd9LA0KPiA+ICsJezAsIDQ4LCA0OH0sDQo+ ID4gKwl7MCwgNDksIDQ5fSwNCj4gPiArDQo+ID4gKwkvKiA1MCAqLw0KPiA+ICsJezAsIDUwLCA1 MH0sDQo+ID4gKwl7MCwgNTEsIDUxfSwNCj4gPiArCXswLCA1MiwgNTJ9LA0KPiA+ICsJezAsIDUz LCA1M30sDQo+ID4gKwl7MCwgNTQsIDU0fSwNCj4gPiArCXswLCA1NSwgNTV9LA0KPiA+ICsJezAs IDU2LCA1Nn0sDQo+ID4gKwl7MCwgNTcsIDU3fSwNCj4gPiArCXswLCA1OCwgNTh9LA0KPiA+ICsJ ezAsIDU5LCA1OX0sDQo+ID4gKw0KPiA+ICsJLyogNjAgKi8NCj4gPiArCXswLCA2MCwgNjB9LA0K PiA+ICsJezAsIDYxLCA2MX0sDQo+ID4gKwl7MCwgNjIsIDYyfSwNCj4gPiArCXswLCA2MywgNjN9 LA0KPiA+ICsJezAsIDY0LCA2NH0sDQo+ID4gKwl7MCwgNjUsIDcwfSwNCj4gPiArCXswLCA2Niwg NzF9LA0KPiA+ICsJezAsIDY3LCA3Mn0sDQo+ID4gKwl7MCwgNjgsIDczfSwNCj4gPiArCXswLCA3 MCwgODF9LA0KPiA+ICsNCj4gPiArCS8qIDcwICovDQo+ID4gKwl7MCwgNzEsIDgyfSwNCj4gPiAr CXswLCA3MiwgODN9LA0KPiA+ICsJezAsIDczLCA4NH0sDQo+ID4gKwl7MCwgNzQsIDg1fSwNCj4g PiArCXswLCA3NSwgODZ9LA0KPiA+ICsJezAsIDc2LCA4N30sDQo+ID4gKwl7MCwgNzcsIDg4fSwN Cj4gPiArCXswLCA3OCwgODl9LA0KPiA+ICsJezAsIDc5LCA5MH0sDQo+ID4gKwl7MCwgODAsIDkx fSwNCj4gPiArDQo+ID4gKwkvKiA4MCAqLw0KPiA+ICsJezAsIDgxLCA5Mn0sDQo+ID4gKwl7MCwg ODIsIDkzfSwNCj4gPiArCXswLCA4MywgOTR9LA0KPiA+ICsJezAsIDg0LCA5NX0sDQo+ID4gKwl7 MCwgODUsIDk2fSwNCj4gPiArCXswLCA4NiwgOTd9LA0KPiA+ICsJezAsIDg3LCA5OH0sDQo+ID4g Kwl7MCwgODgsIDk5fSwNCj4gPiArCXswLCA4OSwgMTAwfSwNCj4gPiArCXswLCA5MCwgMTAxfSwN Cj4gPiArDQo+ID4gKwkvKiA5MCAqLw0KPiA+ICsJezAsIDkxLCAxMDJ9LA0KPiA+ICsJezAsIDky LCAxMDN9LA0KPiA+ICsJezAsIDkzLCAxMDR9LA0KPiA+ICsJezAsIDk0LCAxMDV9LA0KPiA+ICsJ ezAsIDk1LCAxMDZ9LA0KPiA+ICsJezAsIDk2LCAxMDd9LA0KPiA+ICsJezAsIDk3LCAxMDh9LA0K PiA+ICsJezAsIDk4LCAxMDl9LA0KPiA+ICsJezAsIDExMCwgMTEwfSwNCj4gPiArCXswLCAxMTEs IDExMX0sDQo+ID4gKw0KPiA+ICsJLyogMTAwICovDQo+IA0KPiBDb21tZW50cyBtYXliZSBub3Qg bmVlZGVkLCBhdCBsZWFzdCBvZiBhZGRlZCwgdGhleSBzaG91bGQgcmVwcmVzZW50IHRoZSBjb2Rl Lg0KDQpUaGlzIGNvbW1lbnRzIHJlcHJlc2VudCBpbmRleCBvZiBtdDY3NzlfZGV2aWNlc19pbmZy YS4NCkl0J3MgaGVscGZ1bCB0byBjaGVjayB0b3RhbCBudW1iZXJzIG9mIHNsYXZlcy4NCg0KPiAN Cj4gPiArCXswLCAxMTIsIDExMn0sDQo+ID4gKwl7MCwgMTEzLCAxMTN9LA0KPiA+ICsJezAsIDEx NCwgMTE0fSwNCj4gPiArCXswLCAxMTUsIDExNX0sDQo+ID4gKwl7MCwgMTE2LCAxMTZ9LA0KPiA+ ICsJezAsIDExNywgMTE3fSwNCj4gPiArCXswLCAxMTgsIDExOH0sDQo+ID4gKwl7MCwgMTE5LCAx MTl9LA0KPiA+ICsJezAsIDEyMCwgMTIwfSwNCj4gPiArCXswLCAxMjEsIDEyMX0sDQo+ID4gKw0K PiA+ICsJLyogMTEwICovDQo+ID4gKwl7MCwgMTIyLCAxMjJ9LA0KPiA+ICsJezAsIDEyMywgMTIz fSwNCj4gPiArCXswLCAxMjQsIDEyNH0sDQo+ID4gKwl7MCwgMTI1LCAxMjV9LA0KPiA+ICsJezAs IDEyNiwgMTI2fSwNCj4gPiArCXswLCAxMjcsIDEyN30sDQo+ID4gKwl7MCwgMTI4LCAxMjh9LA0K PiA+ICsJezAsIDEyOSwgMTI5fSwNCj4gPiArCXswLCAxMzAsIDEzMH0sDQo+ID4gKwl7MCwgMTMx LCAxMzF9LA0KPiA+ICsNCj4gPiArCS8qIDEyMCAqLw0KPiA+ICsJezAsIDEzMiwgMTMyfSwNCj4g PiArCXswLCAxMzMsIDEzM30sDQo+ID4gKwl7MCwgMTM0LCAxMzR9LA0KPiA+ICsJezAsIDEzNSwg MTM1fSwNCj4gPiArCXswLCAxMzYsIDEzNn0sDQo+ID4gKwl7MCwgMTM3LCAxMzd9LA0KPiA+ICsJ ezAsIDEzOCwgMTM4fSwNCj4gPiArCXswLCAxMzksIDEzOX0sDQo+ID4gKwl7MCwgMTQwLCAxNDB9 LA0KPiA+ICsJezAsIDE0MSwgMTQxfSwNCj4gPiArDQo+ID4gKwkvKiAxMzAgKi8NCj4gPiArCXsw LCAxNDIsIDE0Mn0sDQo+ID4gKwl7MCwgMTQzLCAxNDN9LA0KPiA+ICsJezAsIDE0NCwgMTQ0fSwN Cj4gPiArCXswLCAxNDUsIDE0NX0sDQo+ID4gKwl7MCwgMTQ2LCAxNDZ9LA0KPiA+ICsJezAsIDE0 NywgMTQ3fSwNCj4gPiArCXswLCAxNDgsIDE0OH0sDQo+ID4gKwl7MCwgMTQ5LCAxNDl9LA0KPiA+ ICsJezAsIDE1MCwgMTUwfSwNCj4gPiArCXswLCAxNTEsIDE1MX0sDQo+ID4gKw0KPiA+ICsJLyog MTQwICovDQo+ID4gKwl7MCwgMTUyLCAxNTJ9LA0KPiA+ICsJezAsIDE1MywgMTUzfSwNCj4gPiAr CXswLCAxNTQsIDE1NH0sDQo+ID4gKwl7MCwgMTU1LCAxNTV9LA0KPiA+ICsJezAsIDE1NiwgMTU2 fSwNCj4gPiArCXswLCAxNTcsIDE1N30sDQo+ID4gKwl7MCwgMTU4LCAxNTh9LA0KPiA+ICsJezAs IDE1OSwgMTU5fSwNCj4gPiArCXswLCAxNjAsIDE2MH0sDQo+ID4gKwl7MCwgMTYxLCAxNjF9LA0K PiA+ICsNCj4gPiArCS8qIDE1MCAqLw0KPiA+ICsJezAsIDE2MiwgMTYyfSwNCj4gPiArCXswLCAx NjMsIDE2M30sDQo+ID4gKwl7MCwgMTY0LCAxNjR9LA0KPiA+ICsJezAsIDE2NSwgMTY1fSwNCj4g PiArCXswLCAxNjYsIDE2Nn0sDQo+ID4gKwl7MCwgMTY3LCAxNjd9LA0KPiA+ICsJezAsIDE2OCwg MTY4fSwNCj4gPiArCXswLCAxNjksIDE2OX0sDQo+ID4gKwl7MCwgMTcwLCAxNzB9LA0KPiA+ICsJ ezAsIDE3MSwgMTcxfSwNCj4gPiArDQo+ID4gKwkvKiAxNjAgKi8NCj4gPiArCXswLCAxNzIsIDE3 Mn0sDQo+ID4gKwl7MCwgMTczLCAxNzN9LA0KPiA+ICsJezAsIDE3NCwgMTc0fSwNCj4gPiArCXsw LCAxNzUsIDE3NX0sDQo+ID4gKwl7MCwgMTc2LCAxNzZ9LA0KPiA+ICsJezAsIDE3NywgMTc3fSwN Cj4gPiArCXswLCAxNzgsIDE3OH0sDQo+ID4gKwl7MCwgMTc5LCAxNzl9LA0KPiA+ICsJezAsIDE4 MCwgMTgwfSwNCj4gPiArCXswLCAxODEsIDE4MX0sDQo+ID4gKw0KPiA+ICsJLyogMTcwICovDQo+ ID4gKwl7MCwgMTgyLCAxODJ9LA0KPiA+ICsJezAsIDE4MywgMTgzfSwNCj4gPiArCXswLCAxODQs IDE4NH0sDQo+ID4gKwl7MCwgMTg1LCAxODV9LA0KPiA+ICsJezAsIDE4NiwgMTg2fSwNCj4gPiAr CXswLCAxODcsIDE4N30sDQo+ID4gKwl7MCwgMTg4LCAxODh9LA0KPiA+ICsJezAsIDE4OSwgMTg5 fSwNCj4gPiArCXswLCAxOTAsIDE5MH0sDQo+ID4gKwl7MCwgMTkxLCAxOTF9LA0KPiA+ICsNCj4g PiArCS8qIDE4MCAqLw0KPiA+ICsJezAsIDE5MiwgMTkyfSwNCj4gPiArCXswLCAxOTMsIDE5M30s DQo+ID4gKwl7MCwgMTk0LCAxOTR9LA0KPiA+ICsJezAsIDE5NSwgMTk1fSwNCj4gPiArCXswLCAx OTYsIDE5Nn0sDQo+ID4gKwl7MCwgMTk3LCAxOTd9LA0KPiA+ICsJezAsIDE5OCwgMTk4fSwNCj4g PiArCXswLCAxOTksIDE5OX0sDQo+ID4gKwl7MCwgMjAwLCAyMDB9LA0KPiA+ICsJezAsIDIwMSwg MjAxfSwNCj4gPiArDQo+ID4gKwkvKiAxOTAgKi8NCj4gPiArCXswLCAyMDIsIDIwMn0sDQo+ID4g Kwl7MCwgMjAzLCAyMDN9LA0KPiA+ICsJezAsIDIwNCwgMjA0fSwNCj4gPiArCXswLCAyMDUsIDIw NX0sDQo+ID4gKwl7MCwgMjA2LCAyMDZ9LA0KPiA+ICsJezAsIDIwNywgMjA3fSwNCj4gPiArCXsw LCAyMDgsIDIwOH0sDQo+ID4gKwl7MCwgMjA5LCAyMDl9LA0KPiA+ICsJezAsIDIxMCwgMjEwfSwN Cj4gPiArCXswLCAyMTEsIDIxMX0sDQo+ID4gKw0KPiA+ICsJLyogMjAwICovDQo+ID4gKwl7MCwg MjEyLCAyMTJ9LA0KPiA+ICsJezAsIDIxMywgMjEzfSwNCj4gPiArCXswLCAyMTQsIDIxNH0sDQo+ ID4gKwl7MCwgMjE1LCAyMTV9LA0KPiA+ICsJezAsIDIxNiwgMjE2fSwNCj4gPiArCXswLCAyMTcs IDIxN30sDQo+ID4gKwl7MCwgMjE4LCAyMTh9LA0KPiA+ICsJezAsIDIxOSwgMjE5fSwNCj4gPiAr CXswLCAyMjAsIDIyMH0sDQo+ID4gKwl7MCwgMjIxLCAyMjF9LA0KPiA+ICsNCj4gPiArCS8qIDIx MCAqLw0KPiA+ICsJezAsIDIyMiwgMjIyfSwNCj4gPiArCXswLCAyMjMsIDIyM30sDQo+ID4gKwl7 MCwgMjI0LCAyMjR9LA0KPiA+ICsJezAsIDIyNSwgMjI1fSwNCj4gPiArCXswLCAyMjYsIDIyNn0s DQo+ID4gKwl7MCwgMjI3LCAyMjd9LA0KPiA+ICsJezAsIDIyOCwgMjI4fSwNCj4gPiArCXswLCAy MjksIDIyOX0sDQo+ID4gKwl7MCwgMjMwLCAyMzB9LA0KPiA+ICsJezAsIDIzMSwgMjMxfSwNCj4g PiArDQo+ID4gKwkvKiAyMjAgKi8NCj4gPiArCXsxLCAwLCAyMzJ9LA0KPiA+ICsJezEsIDEsIDIz M30sDQo+ID4gKwl7MSwgMiwgMjM0fSwNCj4gPiArCXsxLCAzLCAyMzV9LA0KPiA+ICsJezEsIDQs IDIzNn0sDQo+ID4gKwl7MSwgNSwgMjM3fSwNCj4gPiArCXsxLCA2LCAyMzh9LA0KPiA+ICsJezEs IDcsIDIzOX0sDQo+ID4gKwl7MSwgOCwgMjQwfSwNCj4gPiArCXsxLCA5LCAyNDF9LA0KPiA+ICsN Cj4gPiArCS8qIDIzMCAqLw0KPiA+ICsJezEsIDEwLCAyNDJ9LA0KPiA+ICsJezEsIDExLCAyNDN9 LA0KPiA+ICsJezEsIDEyLCAyNDR9LA0KPiA+ICsJezEsIDEzLCAyNDV9LA0KPiA+ICsJezEsIDE0 LCAyNDZ9LA0KPiA+ICsJezEsIDE1LCAyNDd9LA0KPiA+ICsJezEsIDE2LCAyNDh9LA0KPiA+ICsJ ezEsIDE3LCAyNDl9LA0KPiA+ICsJezEsIDE4LCAyNTB9LA0KPiA+ICsJezEsIDE5LCAyNTF9LA0K PiA+ICsNCj4gPiArCS8qIDI0MCAqLw0KPiA+ICsJezEsIDIwLCAyNTJ9LA0KPiA+ICsJezEsIDIx LCAyNTN9LA0KPiA+ICsJezEsIDIyLCAyNTR9LA0KPiA+ICsJezEsIDIzLCAyNTV9LA0KPiA+ICsJ ezEsIDI0LCAyNTZ9LA0KPiA+ICsJezEsIDI1LCAyNTd9LA0KPiA+ICsJezEsIDI2LCAyNTh9LA0K PiA+ICsJezEsIDI3LCAyNTl9LA0KPiA+ICsJezEsIDI4LCAyNjB9LA0KPiA+ICsJezEsIDI5LCAy NjF9LA0KPiA+ICsNCj4gPiArCS8qIDI1MCAqLw0KPiA+ICsJezEsIDMwLCAyNjJ9LA0KPiA+ICsJ ezEsIDMxLCAyNjN9LA0KPiA+ICsJezEsIDMyLCAyNjR9LA0KPiA+ICsJezEsIDMzLCAyNjV9LA0K PiA+ICsJezEsIDM0LCAyNjZ9LA0KPiA+ICsJezEsIDM1LCAyNjd9LA0KPiA+ICsJezEsIDM2LCAy Njh9LA0KPiA+ICsJezEsIDM3LCAyNjl9LA0KPiA+ICsJezEsIDM4LCAyNzB9LA0KPiA+ICsJezEs IDM5LCAyNzF9LA0KPiA+ICsNCj4gPiArCS8qIDI2MCAqLw0KPiA+ICsJezEsIDQwLCAyNzJ9LA0K PiA+ICsJezEsIDQxLCAyNzN9LA0KPiA+ICsJezEsIDQyLCAyNzR9LA0KPiA+ICsJezEsIDQzLCAy NzV9LA0KPiA+ICsJezEsIDQ0LCAyNzZ9LA0KPiA+ICsJezEsIDQ1LCAyNzd9LA0KPiA+ICsJezEs IDQ2LCAyNzh9LA0KPiA+ICsJezEsIDQ3LCAyNzl9LA0KPiA+ICsJezEsIDQ4LCAyODB9LA0KPiA+ ICsJezEsIDQ5LCAyODF9LA0KPiA+ICsNCj4gPiArCS8qIDI3MCAqLw0KPiA+ICsJezEsIDUwLCAy ODJ9LA0KPiA+ICsJezEsIDUxLCAyODN9LA0KPiA+ICsJezEsIDUyLCAyODR9LA0KPiA+ICsJezEs IDUzLCAyODV9LA0KPiA+ICsJezEsIDU0LCAyODZ9LA0KPiA+ICsJezEsIDU1LCAyODd9LA0KPiA+ ICsJezEsIDU2LCAyODh9LA0KPiA+ICsJezEsIDU3LCAyODl9LA0KPiA+ICsJezEsIDU4LCAyOTB9 LA0KPiA+ICsJezEsIDU5LCAyOTF9LA0KPiA+ICsNCj4gPiArCS8qIDI4MCAqLw0KPiA+ICsJezEs IDYwLCAyOTJ9LA0KPiA+ICsJezEsIDYxLCAyOTN9LA0KPiA+ICsJezEsIDYyLCAyOTR9LA0KPiA+ ICsJezEsIDYzLCAyOTV9LA0KPiA+ICsJezEsIDY0LCAyOTZ9LA0KPiA+ICsJezEsIDY1LCAyOTd9 LA0KPiA+ICsJezEsIDY2LCAyOTh9LA0KPiA+ICsJezEsIDY3LCAyOTl9LA0KPiA+ICsJezEsIDY4 LCAzMDB9LA0KPiA+ICsJezEsIDY5LCAzMDF9LA0KPiA+ICsNCj4gPiArCS8qIDI5MCAqLw0KPiA+ ICsJezEsIDcwLCAzMDJ9LA0KPiA+ICsJezEsIDcxLCAzMDN9LA0KPiA+ICsJezEsIDcyLCAzMDR9 LA0KPiA+ICsJezEsIDczLCAzMDV9LA0KPiA+ICsJezEsIDc0LCAzMDZ9LA0KPiA+ICsJezEsIDc1 LCAzMDd9LA0KPiA+ICsJezEsIDc2LCAzMDh9LA0KPiA+ICsJezEsIDc3LCAzMDl9LA0KPiA+ICsJ ezEsIDc4LCAzMTB9LA0KPiA+ICsJezEsIDc5LCAzMTF9LA0KPiA+ICsNCj4gPiArCS8qIDMwMCAq Lw0KPiA+ICsJezEsIDgwLCAzMTJ9LA0KPiA+ICsJezEsIDgxLCAzMTN9LA0KPiA+ICsJezEsIDgy LCAzMTR9LA0KPiA+ICsJezEsIDgzLCAzMTV9LA0KPiA+ICsJezEsIDg0LCAzMTZ9LA0KPiA+ICsJ ezEsIDg1LCAzMTd9LA0KPiA+ICsJezEsIDg2LCAzMTh9LA0KPiA+ICsJezEsIDg3LCAzMTl9LA0K PiA+ICsJezEsIDg4LCAzMjB9LA0KPiA+ICsJezEsIDg5LCAzMjF9LA0KPiA+ICsNCj4gPiArCS8q IDMxMCAqLw0KPiA+ICsJezEsIDkwLCAzMjJ9LA0KPiA+ICsJezEsIDkxLCAzMjN9LA0KPiA+ICsJ ezEsIDkyLCAzMjR9LA0KPiA+ICsJezEsIDkzLCAzMjV9LA0KPiA+ICsJezEsIDk0LCAzMjZ9LA0K PiA+ICsJezEsIDk1LCAzMjd9LA0KPiA+ICsJezEsIDk2LCAzMjh9LA0KPiA+ICsJezEsIDk3LCAz Mjl9LA0KPiA+ICsJezEsIDk4LCAzMzB9LA0KPiA+ICsJezEsIDk5LCAzMzF9LA0KPiA+ICsNCj4g PiArCS8qIDMyMCAqLw0KPiA+ICsJezEsIDEwMCwgMzMyfSwNCj4gPiArCXsxLCAxMDEsIDMzM30s DQo+ID4gKwl7MSwgMTAyLCAzMzR9LA0KPiA+ICsJezEsIDEwMywgMzM1fSwNCj4gPiArCXsxLCAx MDQsIDMzNn0sDQo+ID4gKwl7MSwgMTA1LCAzMzd9LA0KPiA+ICsJezEsIDEwNiwgMzM4fSwNCj4g PiArCXsxLCAxMDcsIDMzOX0sDQo+ID4gKwl7MSwgMTA4LCAzNDB9LA0KPiA+ICsJezEsIDEwOSwg MzQxfSwNCj4gPiArDQo+ID4gKwkvKiAzMzAgKi8NCj4gPiArCXsxLCAxMTAsIDM0Mn0sDQo+ID4g Kwl7MSwgMTExLCAzNDN9LA0KPiA+ICsJezEsIDExMiwgMzQ0fSwNCj4gPiArCXsxLCAxMTMsIDM0 NX0sDQo+ID4gKwl7MSwgMTE0LCAzNDZ9LA0KPiA+ICsJezEsIDExNSwgMzQ3fSwNCj4gPiArCXsx LCAxMTYsIDM0OH0sDQo+ID4gKwl7MSwgMTE3LCAzNDl9LA0KPiA+ICsJezEsIDExOCwgMzUwfSwN Cj4gPiArCXsxLCAxMTksIDM1MX0sDQo+ID4gKw0KPiA+ICsJLyogMzQwICovDQo+ID4gKwl7MSwg MTIwLCAzNTJ9LA0KPiA+ICsJezEsIDEyMSwgMzUzfSwNCj4gPiArCXsxLCAxMjIsIDM1NH0sDQo+ ID4gKwl7MSwgMTIzLCAzNTV9LA0KPiA+ICsJezEsIDEyNCwgMzU2fSwNCj4gPiArCXsxLCAxMjUs IDM1N30sDQo+ID4gKwl7MSwgMTI2LCAzNTh9LA0KPiA+ICsJezEsIDEyNywgMzU5fSwNCj4gPiAr CXsxLCAxMjgsIDM2MH0sDQo+ID4gKwl7MSwgMTI5LCAzNjF9LA0KPiA+ICsNCj4gPiArCS8qIDM1 MCAqLw0KPiA+ICsJezEsIDEzMCwgMzYyfSwNCj4gPiArCXsxLCAxMzEsIDM2M30sDQo+ID4gKwl7 MSwgMTMyLCAzNjR9LA0KPiA+ICsJezEsIDEzMywgMzY1fSwNCj4gPiArCXsxLCAxMzQsIDM2Nn0s DQo+ID4gKwl7MSwgMTM1LCAzNjd9LA0KPiA+ICsJezEsIDEzNiwgMzY4fSwNCj4gPiArCXsxLCAx MzcsIDM2OX0sDQo+ID4gKwl7MSwgMTM4LCAzNzB9LA0KPiA+ICsJezEsIDEzOSwgMzcxfSwNCj4g PiArDQo+ID4gKwkvKiAzNjAgKi8NCj4gPiArCXsxLCAxNDAsIDM3Mn0sDQo+ID4gKwl7MSwgMTQx LCAzNzN9LA0KPiA+ICsJezEsIDE0MiwgMzc0fSwNCj4gPiArCXsxLCAxNDMsIDM3NX0sDQo+ID4g Kwl7MSwgMTQ0LCAzNzZ9LA0KPiA+ICsJezEsIDE0NSwgMzc3fSwNCj4gPiArCXsxLCAxNDYsIDM3 OH0sDQo+ID4gKwl7MSwgMTQ3LCAzNzl9LA0KPiA+ICsJezEsIDE0OCwgMzgwfSwNCj4gPiArCXsx LCAxNDksIDM4MX0sDQo+ID4gKw0KPiA+ICsJLyogMzcwICovDQo+ID4gKwl7MSwgMTUwLCAzODJ9 LA0KPiA+ICsJezEsIDE1MSwgMzgzfSwNCj4gPiArCXsxLCAxNTIsIDM4NH0sDQo+ID4gKwl7MSwg MTUzLCAzODV9LA0KPiA+ICsJezEsIDE1NCwgMzg2fSwNCj4gPiArCXsxLCAxNTUsIDM4N30sDQo+ ID4gKwl7MSwgMTU2LCAzODh9LA0KPiA+ICsJezEsIDE1NywgMzg5fSwNCj4gPiArCXsxLCAxNTgs IDM5MH0sDQo+ID4gKwl7MSwgMTU5LCAzOTF9LA0KPiA+ICsNCj4gPiArCS8qIDM4MCAqLw0KPiA+ ICsJezEsIDE2MCwgMzkyfSwNCj4gPiArCXsxLCAxNjEsIDM5M30sDQo+ID4gKwl7MSwgMTYyLCAz OTR9LA0KPiA+ICsJezEsIDE2MywgMzk1fSwNCj4gPiArCXsxLCAxNjQsIDM5Nn0sDQo+ID4gKwl7 MSwgMTY1LCAzOTd9LA0KPiA+ICsJezEsIDE2NiwgMzk4fSwNCj4gPiArCXsxLCAxNjcsIDM5OX0s DQo+ID4gKwl7MSwgMTY4LCA0MDB9LA0KPiA+ICsJezEsIDE2OSwgNDAxfSwNCj4gPiArDQo+ID4g KwkvKiAzOTAgKi8NCj4gPiArCXsxLCAxNzAsIDQwMn0sDQo+ID4gKwl7MSwgMTcxLCA0MDN9LA0K PiA+ICsJezEsIDE3MiwgNDA0fSwNCj4gPiArCXsxLCAxNzMsIDQwNX0sDQo+ID4gKwl7MSwgMTc0 LCA0MDZ9LA0KPiA+ICsJezEsIDE3NSwgNDA3fSwNCj4gPiArCXsxLCAxNzYsIDQwOH0sDQo+ID4g Kwl7MSwgMTc3LCA0MDl9LA0KPiA+ICsJezEsIDE3OCwgNDEwfSwNCj4gPiArCXsxLCAxNzksIDQx MX0sDQo+ID4gKw0KPiA+ICsJLyogNDAwICovDQo+ID4gKwl7MSwgMTgwLCA0MTJ9LA0KPiA+ICsJ ezEsIDE4MSwgNDEzfSwNCj4gPiArCXsxLCAxODIsIDQxNH0sDQo+ID4gKwl7MSwgMTgzLCA0MTV9 LA0KPiA+ICsJezEsIDE4NCwgNDE2fSwNCj4gPiArCXsxLCAxODUsIDQxN30sDQo+ID4gKwl7MSwg MTg2LCA0MTh9LA0KPiA+ICsJezEsIDE4NywgNDE5fSwNCj4gPiArCXsxLCAxODgsIDQyMH0sDQo+ ID4gKwl7MSwgMTg5LCA0MjF9LA0KPiA+ICsNCj4gPiArCS8qIDQxMCAqLw0KPiA+ICsJezEsIDE5 MCwgNDIyfSwNCj4gPiArCXsxLCAxOTEsIDQyM30sDQo+ID4gKwl7MSwgMTkyLCA0MjR9LA0KPiA+ ICsJezEsIDE5MywgNDI1fSwNCj4gPiArCXsxLCAxOTQsIDQyNn0sDQo+ID4gKwl7MSwgMTk1LCA0 Mjd9LA0KPiA+ICsJezEsIDE5NiwgNDI4fSwNCj4gPiArCXsxLCAxOTcsIDQyOX0sDQo+ID4gKwl7 MSwgMTk4LCA0MzB9LA0KPiA+ICsJezEsIDE5OSwgNDMxfSwNCj4gPiArDQo+ID4gKwkvKiA0MjAg Ki8NCj4gPiArCXsxLCAyMDAsIDQzMn0sDQo+ID4gKwl7MSwgMjAxLCA0MzN9LA0KPiA+ICsJezEs IDIwMiwgNDM0fSwNCj4gPiArCXsxLCAyMDMsIDQzNX0sDQo+ID4gKwl7MSwgMjA0LCA0MzZ9LA0K PiA+ICsJezEsIDIwNSwgNDM3fSwNCj4gPiArCXsxLCAyMDYsIDQzOH0sDQo+ID4gKwl7MSwgMjA3 LCA0Mzl9LA0KPiA+ICsJezEsIDIwOCwgNDQwfSwNCj4gPiArCXsxLCAyMDksIDQ0MX0sDQo+ID4g Kw0KPiA+ICsJLyogNDMwICovDQo+ID4gKwl7MSwgMjEwLCA0NDJ9LA0KPiA+ICsJezEsIDIxMSwg NDQzfSwNCj4gPiArCXsxLCAyMTIsIDQ0NH0sDQo+ID4gKwl7MSwgMjEzLCA0NDV9LA0KPiA+ICsJ ezEsIDIxNCwgNDQ2fSwNCj4gPiArCXsxLCAyMTUsIDQ0N30sDQo+ID4gKwl7MSwgMjE2LCA0NDh9 LA0KPiA+ICsJezEsIDIxNywgNDQ5fSwNCj4gPiArCXsxLCAyMTgsIDQ1MH0sDQo+ID4gKwl7MSwg MjE5LCA0NTF9LA0KPiA+ICsNCj4gPiArCS8qIDQ0MCAqLw0KPiA+ICsJezEsIDIyMCwgNDUyfSwN Cj4gPiArCXsxLCAyMjEsIDQ1M30sDQo+ID4gKwl7MSwgMjIyLCA0NTR9LA0KPiA+ICsJezEsIDIy MywgNDU1fSwNCj4gPiArCXsxLCAyMjQsIDQ1Nn0sDQo+ID4gKwl7MSwgMjI1LCA0NTd9LA0KPiA+ ICsJezEsIDIyNiwgNDU4fSwNCj4gPiArCXsxLCAyMjcsIDQ1OX0sDQo+ID4gKwl7MSwgMjI4LCA0 NjB9LA0KPiA+ICsJezEsIDIyOSwgNDYxfSwNCj4gPiArDQo+ID4gKwkvKiA0NTAgKi8NCj4gPiAr CXsxLCAyMzAsIDQ2Mn0sDQo+ID4gKwl7MSwgMjMxLCA0NjN9LA0KPiA+ICsJezEsIDIzMiwgNDY0 fSwNCj4gPiArCXsxLCAyMzMsIDQ2NX0sDQo+ID4gKwl7MSwgMjM0LCA0NjZ9LA0KPiA+ICsJezEs IDIzNSwgNDY3fSwNCj4gPiArCXsxLCAyMzYsIDQ2OH0sDQo+ID4gKwl7MSwgMjM3LCA0Njl9LA0K PiA+ICsJezEsIDIzOCwgNDcwfSwNCj4gPiArCXsxLCAyMzksIDQ3MX0sDQo+ID4gKw0KPiA+ICsJ LyogNDYwICovDQo+ID4gKwl7MSwgMjQwLCA0NzJ9LA0KPiA+ICsJezEsIDI0MSwgNDczfSwNCj4g PiArCXsxLCAyNDIsIDQ3NH0sDQo+ID4gKwl7MSwgMjQzLCA0NzV9LA0KPiA+ICsJezEsIDI0NCwg NDc2fSwNCj4gPiArCXsxLCAyNDUsIDQ3N30sDQo+ID4gKwl7MSwgMjQ2LCA0Nzh9LA0KPiA+ICsJ ey0xLCAtMSwgNDc5fSwNCj4gPiArCXstMSwgLTEsIDQ4MH0sDQo+ID4gKwl7LTEsIC0xLCA0ODF9 LA0KPiA+ICsNCj4gPiArCS8qIDQ3MCAqLw0KPiA+ICsJey0xLCAtMSwgNDgyfSwNCj4gPiArCXst MSwgLTEsIDQ4M30sDQo+ID4gKwl7LTEsIC0xLCA0ODR9LA0KPiA+ICsJey0xLCAtMSwgNDg1fSwN Cj4gPiArCXstMSwgLTEsIDQ4Nn0sDQo+ID4gKwl7LTEsIC0xLCA0ODd9LA0KPiA+ICsJey0xLCAt MSwgNDg4fSwNCj4gPiArCXstMSwgLTEsIDQ4OX0sDQo+ID4gKwl7LTEsIC0xLCA0OTB9LA0KPiA+ ICsJey0xLCAtMSwgNDkxfSwNCj4gPiArDQo+ID4gKwkvKiA0ODAgKi8NCj4gPiArCXstMSwgLTEs IDQ5Mn0sDQo+ID4gKwl7LTEsIC0xLCA0OTN9LA0KPiA+ICsJey0xLCAtMSwgNDk0fSwNCj4gPiAr CXstMSwgLTEsIDQ5NX0sDQo+ID4gKwl7LTEsIC0xLCA0OTZ9LA0KPiA+ICsJey0xLCAtMSwgNDk3 fSwNCj4gPiArCXstMSwgLTEsIDQ5OH0sDQo+ID4gKwl7LTEsIC0xLCA0OTl9LA0KPiA+ICsJey0x LCAtMSwgNTAwfSwNCj4gPiArCXstMSwgLTEsIDUwMX0sDQo+ID4gKw0KPiA+ICsJLyogNDkwICov DQo+ID4gKwl7LTEsIC0xLCA1MDJ9LA0KPiA+ICsJey0xLCAtMSwgNTAzfSwNCj4gPiArCXstMSwg LTEsIDUwNH0sDQo+ID4gKwl7LTEsIC0xLCA1MDV9LA0KPiA+ICsJey0xLCAtMSwgNTA2fSwNCj4g PiArCXstMSwgLTEsIDUwN30sDQo+ID4gKwl7LTEsIC0xLCA1MDh9LA0KPiA+ICsJey0xLCAtMSwg NTA5fSwNCj4gPiArCXstMSwgLTEsIDUxMH0sDQo+ID4gKw0KPiA+ICt9Ow0KPiA+ICsNCj4gPiAr c3RhdGljIHN0cnVjdCBtdGtfZGV2aWNlX251bSBtdGs2Nzc5X2RldmljZXNfbnVtW10gPSB7DQo+ ID4gKwl7U0xBVkVfVFlQRV9JTkZSQSwgVklPX1NMQVZFX05VTV9JTkZSQX0sDQo+ID4gK307DQo+ ID4gKw0KPiA+ICtzdGF0aWMgaW50IG10a192aW9fbWFza19zdGFfbnVtW10gPSB7DQo+ID4gKwlW SU9fTUFTS19TVEFfTlVNX0lORlJBLA0KPiA+ICt9Ow0KPiA+ICsNCj4gPiArc3RhdGljIGNvbnN0 IHN0cnVjdCBtdGtfaW5mcmFfdmlvX2RiZ19kZXNjIG10Njc3OV92aW9fZGJncyA9IHsNCj4gPiAr CS52aW9fZGJnX21zdGlkID0gSU5GUkFfVklPX0RCR19NU1RJRCwNCj4gPiArCS52aW9fZGJnX21z dGlkX3N0YXJ0X2JpdCA9IElORlJBX1ZJT19EQkdfTVNUSURfU1RBUlRfQklULA0KPiA+ICsJLnZp b19kYmdfZG1uaWQgPSBJTkZSQV9WSU9fREJHX0RNTklELA0KPiA+ICsJLnZpb19kYmdfZG1uaWRf c3RhcnRfYml0ID0gSU5GUkFfVklPX0RCR19ETU5JRF9TVEFSVF9CSVQsDQo+ID4gKwkudmlvX2Ri Z193X3ZpbyA9IElORlJBX1ZJT19EQkdfV19WSU8sDQo+ID4gKwkudmlvX2RiZ193X3Zpb19zdGFy dF9iaXQgPSBJTkZSQV9WSU9fREJHX1dfVklPX1NUQVJUX0JJVCwNCj4gPiArCS52aW9fZGJnX3Jf dmlvID0gSU5GUkFfVklPX0RCR19SX1ZJTywNCj4gPiArCS52aW9fZGJnX3JfdmlvX3N0YXJ0X2Jp dCA9IElORlJBX1ZJT19EQkdfUl9WSU9fU1RBUlRfQklULA0KPiA+ICsJLnZpb19hZGRyX2hpZ2gg PSBJTkZSQV9WSU9fQUREUl9ISUdILA0KPiA+ICsJLnZpb19hZGRyX2hpZ2hfc3RhcnRfYml0ID0g SU5GUkFfVklPX0FERFJfSElHSF9TVEFSVF9CSVQsDQo+ID4gK307DQo+ID4gKw0KPiA+ICtzdGF0 aWMgY29uc3QgdTMyIG10Njc3OV9kZXZhcGNfcGRzW10gPSB7DQo+ID4gKwlQRF9WSU9fTUFTS19P RkZTRVQsDQo+ID4gKwlQRF9WSU9fU1RBX09GRlNFVCwNCj4gPiArCVBEX1ZJT19EQkcwX09GRlNF VCwNCj4gPiArCVBEX1ZJT19EQkcxX09GRlNFVCwNCj4gPiArCVBEX0FQQ19DT05fT0ZGU0VULA0K PiA+ICsJUERfU0hJRlRfU1RBX09GRlNFVCwNCj4gPiArCVBEX1NISUZUX1NFTF9PRkZTRVQsDQo+ ID4gKwlQRF9TSElGVF9DT05fT0ZGU0VULA0KPiA+ICt9Ow0KPiA+ICsNCj4gPiArc3RhdGljIHUz MiBtdDY3Nzlfc2hpZnRfZ3JvdXBfZ2V0KHUzMiB2aW9faWR4KQ0KPiA+ICt7DQo+ID4gKwlpZiAo dmlvX2lkeCA+PSAwICYmIHZpb19pZHggPD0gMzIpDQo+ID4gKwkJcmV0dXJuIDA7DQo+ID4gKwll bHNlIGlmICh2aW9faWR4ID49IDMzICYmIHZpb19pZHggPD0gMTA5KQ0KPiA+ICsJCXJldHVybiAx Ow0KPiA+ICsJZWxzZSBpZiAoKHZpb19pZHggPj0gMTEwICYmIHZpb19pZHggPD0gMTIxKSB8fA0K PiA+ICsJCSAodmlvX2lkeCA+PSA0NzAgJiYgdmlvX2lkeCA8PSA0NzIpKQ0KPiA+ICsJCXJldHVy biAyOw0KPiA+ICsJZWxzZSBpZiAodmlvX2lkeCA9PSAxMjIgfHwgdmlvX2lkeCA9PSA1MDApDQo+ ID4gKwkJcmV0dXJuIDM7DQo+ID4gKwllbHNlIGlmICh2aW9faWR4ID09IDEyMykNCj4gPiArCQly ZXR1cm4gNDsNCj4gPiArCWVsc2UgaWYgKHZpb19pZHggPT0gMTI0KQ0KPiA+ICsJCXJldHVybiA1 Ow0KPiA+ICsJZWxzZSBpZiAoKHZpb19pZHggPj0gMTI1ICYmIHZpb19pZHggPD0gMTU1KSB8fA0K PiA+ICsJCSAodmlvX2lkeCA+PSA0ODYgJiYgdmlvX2lkeCA8PSA0ODgpKQ0KPiA+ICsJCXJldHVy biA2Ow0KPiA+ICsJZWxzZSBpZiAoKHZpb19pZHggPj0gMTU2ICYmIHZpb19pZHggPD0gMTU3KSB8 fA0KPiA+ICsJCSAodmlvX2lkeCA+PSAxNTkgJiYgdmlvX2lkeCA8PSAxNjUpKQ0KPiA+ICsJCXJl dHVybiA3Ow0KPiA+ICsJZWxzZSBpZiAoKHZpb19pZHggPj0gMTY2ICYmIHZpb19pZHggPD0gMTgx KSB8fA0KPiA+ICsJCSAodmlvX2lkeCA+PSA0NzMgJiYgdmlvX2lkeCA8PSA0NzUpKQ0KPiA+ICsJ CXJldHVybiA4Ow0KPiA+ICsJZWxzZSBpZiAoKHZpb19pZHggPj0gMTgyICYmIHZpb19pZHggPD0g MTk3KSB8fA0KPiA+ICsJCSAodmlvX2lkeCA+PSA0NzYgJiYgdmlvX2lkeCA8PSA0NzgpKQ0KPiA+ ICsJCXJldHVybiA5Ow0KPiA+ICsJZWxzZSBpZiAoKHZpb19pZHggPj0gMTk4ICYmIHZpb19pZHgg PD0gMjA1KSB8fA0KPiA+ICsJCSAodmlvX2lkeCA+PSA0NzkgJiYgdmlvX2lkeCA8PSA0ODEpKQ0K PiA+ICsJCXJldHVybiAxMDsNCj4gPiArCWVsc2UgaWYgKCh2aW9faWR4ID49IDIxNCAmJiB2aW9f aWR4IDw9IDIyOSkgfHwNCj4gPiArCQkgKHZpb19pZHggPj0gNDgyICYmIHZpb19pZHggPD0gNDg0 KSkNCj4gPiArCQlyZXR1cm4gMTE7DQo+ID4gKwllbHNlIGlmICh2aW9faWR4ID09IDIzMCkNCj4g PiArCQlyZXR1cm4gMTI7DQo+ID4gKwllbHNlIGlmICh2aW9faWR4ID09IDE1OCkNCj4gPiArCQly ZXR1cm4gMTM7DQo+ID4gKwllbHNlIGlmICh2aW9faWR4ID09IDIzMSB8fCB2aW9faWR4ID09IDM4 MikNCj4gPiArCQlyZXR1cm4gMTQ7DQo+ID4gKwllbHNlIGlmICh2aW9faWR4ID49IDIzMiAmJiB2 aW9faWR4IDw9IDI0NCkNCj4gPiArCQlyZXR1cm4gMTU7DQo+ID4gKwllbHNlIGlmICh2aW9faWR4 ID49IDI0NSAmJiB2aW9faWR4IDw9IDQ3OCkNCj4gPiArCQlyZXR1cm4gMTY7DQo+ID4gKwllbHNl IGlmICh2aW9faWR4ID49IDUwNCAmJiB2aW9faWR4IDw9IDUwNSkNCj4gPiArCQlyZXR1cm4gMTc7 DQo+ID4gKwllbHNlIGlmICh2aW9faWR4ID09IDQ5NCkNCj4gPiArCQlyZXR1cm4gMTg7DQo+ID4g KwllbHNlIGlmICh2aW9faWR4ID09IDUwMykNCj4gPiArCQlyZXR1cm4gMTk7DQo+ID4gKwllbHNl IGlmICh2aW9faWR4ID09IDUwMSkNCj4gPiArCQlyZXR1cm4gMjA7DQo+ID4gKwllbHNlIGlmICh2 aW9faWR4ID09IDUwMikNCj4gPiArCQlyZXR1cm4gMjE7DQo+ID4gKwllbHNlIGlmICh2aW9faWR4 ID09IDUwNikNCj4gPiArCQlyZXR1cm4gMjI7DQo+ID4gKwllbHNlIGlmICh2aW9faWR4ID09IDUw NykNCj4gPiArCQlyZXR1cm4gMjM7DQo+ID4gKwllbHNlIGlmICh2aW9faWR4ID09IDUwOCkNCj4g PiArCQlyZXR1cm4gMjQ7DQo+ID4gKwllbHNlIGlmICgodmlvX2lkeCA+PSAyMDYgJiYgdmlvX2lk eCA8PSAyMTMpIHx8DQo+ID4gKwkJICh2aW9faWR4ID49IDQ5OCAmJiB2aW9faWR4IDw9IDUwMCkp DQo+ID4gKwkJcmV0dXJuIDI1Ow0KPiA+ICsNCj4gPiArCXJldHVybiAzMTsNCj4gPiArfQ0KPiA+ ICsNCj4gPiArLyoNCj4gPiArICogbXRrX2RldmFwY19wZF9nZXQgLSBnZXQgZGV2YXBjIHBkX3R5 cGVzIG9mIHJlZ2lzdGVyIGFkZHJlc3MuDQo+ID4gKyAqDQo+ID4gKyAqIFJldHVybnMgdGhlIHZh bHVlIG9mIHJlZyBhZGRyDQo+ID4gKyAqLw0KPiA+ICtzdGF0aWMgdm9pZCBfX2lvbWVtICptdGtf ZGV2YXBjX3BkX2dldChzdHJ1Y3QgbXRrX2RldmFwY19jb250ZXh0ICpkZXZhcGNfY3R4LA0KPiA+ ICsJCQkJICAgICAgIGludCBzbGF2ZV90eXBlLA0KPiA+ICsJCQkJICAgICAgIGVudW0gREVWQVBD X1BEX1JFR19UWVBFIHBkX3JlZ190eXBlLA0KPiA+ICsJCQkJICAgICAgIHUzMiBpbmRleCkNCj4g PiArew0KPiA+ICsJY29uc3QgdTMyICpkZXZhcGNfcGRzID0gbXQ2Nzc5X2RldmFwY19wZHM7DQo+ ID4gKwl2b2lkIF9faW9tZW0gKnJlZzsNCj4gPiArDQo+ID4gKwlyZWcgPSBkZXZhcGNfY3R4LT5k ZXZhcGNfcGRfYmFzZVtzbGF2ZV90eXBlXSArIGRldmFwY19wZHNbcGRfcmVnX3R5cGVdOw0KPiA+ ICsNCj4gPiArCWlmIChwZF9yZWdfdHlwZSA9PSBWSU9fTUFTSyB8fCBwZF9yZWdfdHlwZSA9PSBW SU9fU1RBKQ0KPiA+ICsJCXJlZyArPSAweDQgKiBpbmRleDsNCj4gPiArDQo+ID4gKwlyZXR1cm4g cmVnOw0KPiA+ICt9DQo+ID4gKw0KPiA+ICtzdGF0aWMgaW50IGNoZWNrX3Zpb19tYXNrX3N0YShz dHJ1Y3QgbXRrX2RldmFwY19jb250ZXh0ICpkZXZhcGNfY3R4LA0KPiA+ICsJCQkgICAgICBpbnQg c2xhdmVfdHlwZSwgdTMyIG1vZHVsZSwgaW50IHBkX3JlZ190eXBlKQ0KPiA+ICt7DQo+ID4gKwl1 MzIgYXBjX3JlZ2lzdGVyX2luZGV4LCBhcGNfc2V0X2luZGV4Ow0KPiA+ICsJdm9pZCBfX2lvbWVt ICpyZWc7DQo+ID4gKwl1MzIgdmFsdWU7DQo+ID4gKw0KPiA+ICsJYXBjX3JlZ2lzdGVyX2luZGV4 ID0gbW9kdWxlIC8gKE1PRF9OTV9JTl8xX0RFVkFQQyAqIDIpOw0KPiA+ICsJYXBjX3NldF9pbmRl eCA9IG1vZHVsZSAlIChNT0RfTk1fSU5fMV9ERVZBUEMgKiAyKTsNCj4gPiArDQo+ID4gKwlpZiAo YXBjX3JlZ2lzdGVyX2luZGV4IDwgbXRrX3Zpb19tYXNrX3N0YV9udW1bc2xhdmVfdHlwZV0pDQo+ ID4gKwkJcmVnID0gbXRrX2RldmFwY19wZF9nZXQoZGV2YXBjX2N0eCwgc2xhdmVfdHlwZSwgcGRf cmVnX3R5cGUsDQo+ID4gKwkJCQkJYXBjX3JlZ2lzdGVyX2luZGV4KTsNCj4gPiArCWVsc2UNCj4g PiArCQlyZXR1cm4gLUVPVkVSRkxPVzsNCj4gDQo+IEhvdyBjb3VsZCB0aGF0IGhhcHBlbj8NCj4g DQoNCkN1cnJlbnRseSwgYWxsIGNvbXBvbmVudHMgYXJlIGluc2lkZSB0aGlzIGRyaXZlci4gVGhp cyBpcyBub3QgbmVjZXNzYXJ5DQphdCBhbGwuIEknbGwgcmVtb3ZlIGl0Lg0KDQo+ID4gKw0KPiA+ ICsJdmFsdWUgPSAocmVhZGwocmVnKSAmICgweDEgPDwgYXBjX3NldF9pbmRleCkpID4+IGFwY19z ZXRfaW5kZXg7DQo+ID4gKw0KPiA+ICsJcmV0dXJuIHZhbHVlOw0KPiANCj4gdmFsdWUgPSByZWFk bChyZWcpOw0KPiByZXR1cm4gKCh2YWx1ZSA+PiBhcGNfc2V0X2luZGV4KSAmIDB4MSk7DQoNCklz IGl0IGZvciByZWFkYWJpbGl0eT8NCg0KPiANCj4gDQo+ID4gK30NCj4gPiArDQo+ID4gK3N0YXRp YyBpbnQgY2hlY2tfdmlvX21hc2soc3RydWN0IG10a19kZXZhcGNfY29udGV4dCAqZGV2YXBjX2N0 eCwgaW50IHNsYXZlX3R5cGUsDQo+ID4gKwkJCSAgdTMyIG1vZHVsZSkNCj4gPiArew0KPiA+ICsJ cmV0dXJuIGNoZWNrX3Zpb19tYXNrX3N0YShkZXZhcGNfY3R4LCBzbGF2ZV90eXBlLCBtb2R1bGUs IFZJT19NQVNLKTsNCj4gPiArfQ0KPiA+ICsNCj4gPiArc3RhdGljIGludCBjaGVja192aW9fc3Rh dHVzKHN0cnVjdCBtdGtfZGV2YXBjX2NvbnRleHQgKmRldmFwY19jdHgsDQo+ID4gKwkJCSAgICBp bnQgc2xhdmVfdHlwZSwgdTMyIG1vZHVsZSkNCj4gPiArew0KPiA+ICsJcmV0dXJuIGNoZWNrX3Zp b19tYXNrX3N0YShkZXZhcGNfY3R4LCBzbGF2ZV90eXBlLCBtb2R1bGUsIFZJT19TVEEpOw0KPiA+ ICt9DQo+ID4gKw0KPiA+ICtzdGF0aWMgdm9pZCBjbGVhcl92aW9fc3RhdHVzKHN0cnVjdCBtdGtf ZGV2YXBjX2NvbnRleHQgKmRldmFwY19jdHgsDQo+ID4gKwkJCSAgICAgaW50IHNsYXZlX3R5cGUs IHUzMiBtb2R1bGUpDQo+ID4gK3sNCj4gPiArCXUzMiBhcGNfcmVnaXN0ZXJfaW5kZXgsIGFwY19z ZXRfaW5kZXg7DQo+ID4gKwl2b2lkIF9faW9tZW0gKnJlZzsNCj4gPiArDQo+ID4gKwlhcGNfcmVn aXN0ZXJfaW5kZXggPSBtb2R1bGUgLyAoTU9EX05NX0lOXzFfREVWQVBDICogMik7DQo+ID4gKwlh cGNfc2V0X2luZGV4ID0gbW9kdWxlICUgKE1PRF9OTV9JTl8xX0RFVkFQQyAqIDIpOw0KPiANCj4g V2hhdCBkb2VzIE1PRF9OTV9JTl8xX0RFVkFQQyBzdGFuZHMgZm9yPyBXaHkgZG8geW91IGRlZmlu ZSBpdCB3aXRoIDE2IHdoZW4NCj4gYWZ0ZXJ3YXJkcyB5b3Ugb25seSB1c2UgaXQgd2l0aCB2YWx1 ZSAzMj8gRG8gSSB1bmRlcnN0YW5kIGNvcnJlY3RseSB0aGF0IHRoaXMNCj4gY2FsY3VsYXRlcyB0 aGUgcmVnaXN0ZXIgb2Zmc2V0IGFuZCBiaXQgaW4gdGhlIHJlZ2lzdGVyIHRvIHdyaXRlIHRvPw0K DQpZZXMhIEVhY2ggbW9kdWxlIHZpb2xhdGlvbiBpbmRleCBzdGFuZHMgZm9yIDEgYml0LCBzbyB0 aGVyZSBhcmUgMzINCm1vZHVsZXMgaW4gMSBkZXZhcGMgcmVnaXN0ZXIuDQpJIHRoaW5rIE1PRF9O VU1fSU5fMV9ERVZBUEMgaXMgbm90IG5lY2Vzc2FyeSwgSSdsbCByZW1vdmUgaXQgYW5kDQpoYXJk Y29kZSAiMzIiIGZvciB0aGlzIGNhbGN1bGF0aW9uLg0KDQo+IA0KPiA+ICsNCj4gPiArCWlmIChh cGNfcmVnaXN0ZXJfaW5kZXggPCBtdGtfdmlvX21hc2tfc3RhX251bVtzbGF2ZV90eXBlXSkgew0K PiANCj4gbXRrX3Zpb19tYXNrX3N0YV9udW1bc2xhdmVfdHlwZV0gPT0gbWF4aW11bSBvZiByZWdp c3RlcnMgdGhhdCBjYW4gYmUgYWNjZXNzZWQ/DQoNCllhcC4gVGhpcyBjb2RlIGlzIG5vdCBuZWNl c3NhcnkuDQpEaXR0by4NCg0KPiANCj4gPiArCQlyZWcgPSBtdGtfZGV2YXBjX3BkX2dldChkZXZh cGNfY3R4LCBzbGF2ZV90eXBlLCBWSU9fU1RBLA0KPiA+ICsJCQkJCWFwY19yZWdpc3Rlcl9pbmRl eCk7DQo+ID4gKwkJd3JpdGVsKDB4MSA8PCBhcGNfc2V0X2luZGV4LCByZWcpOw0KPiA+ICsNCj4g PiArCX0gZWxzZSB7DQo+ID4gKwkJcHJfZXJyKFBGWCAiJXM6IE91dCBPZiBCb3VuZGFyeSwgc2xh dmVfdHlwZToweCV4LCBtb2R1bGVfaW5kZXg6MHgleFxuIiwNCj4gPiArCQkgICAgICAgX19mdW5j X18sIHNsYXZlX3R5cGUsIG1vZHVsZSk7DQo+IA0KPiBPbmx5IHVzZWQgaW50ZXJuYWxseSBieSB0 aGUgZHJpdmVyLCB3aHkgY2FuJ3Qgd2Ugc3VwcG9zZSB0aGF0IHRoZSBkcml2ZXIgZG9lcw0KPiBu b3QgaW1wbGVtZW50IG1vZHVsZSBudW1iZXIgb3V0c2lkZSBvZiB0aGUgYWNjZXNzaWJsZSByZWdp c3RlcnM/IEkgdGhpbmsgdGhpcw0KPiBjYW4gYmUgZHJvcHBlZC4NCj4gDQoNCkRpdHRvDQoNCj4g PiArCQlyZXR1cm47DQo+ID4gKwl9DQo+ID4gKw0KPiA+ICsJaWYgKGNoZWNrX3Zpb19zdGF0dXMo ZGV2YXBjX2N0eCwgc2xhdmVfdHlwZSwgbW9kdWxlKSkNCj4gPiArCQlwcl9lcnIoUEZYICIlczog Q2xlYXIgZmFpbGVkLCBzbGF2ZV90eXBlOjB4JXgsIG1vZHVsZV9pbmRleDoweCV4XG4iLA0KPiA+ ICsJCSAgICAgICBfX2Z1bmNfXywgc2xhdmVfdHlwZSwgbW9kdWxlKTsNCj4gPiArfQ0KPiA+ICsN Cj4gPiArc3RhdGljIHZvaWQgbWFza19tb2R1bGVfaXJxKHN0cnVjdCBtdGtfZGV2YXBjX2NvbnRl eHQgKmRldmFwY19jdHgsDQo+ID4gKwkJCSAgICBpbnQgc2xhdmVfdHlwZSwgdTMyIG1vZHVsZSwg Ym9vbCBtYXNrKQ0KPiA+ICt7DQo+ID4gKwl1MzIgYXBjX3JlZ2lzdGVyX2luZGV4LCBhcGNfc2V0 X2luZGV4Ow0KPiA+ICsJdm9pZCBfX2lvbWVtICpyZWc7DQo+ID4gKw0KPiA+ICsJYXBjX3JlZ2lz dGVyX2luZGV4ID0gbW9kdWxlIC8gKE1PRF9OTV9JTl8xX0RFVkFQQyAqIDIpOw0KPiA+ICsJYXBj X3NldF9pbmRleCA9IG1vZHVsZSAlIChNT0RfTk1fSU5fMV9ERVZBUEMgKiAyKTsNCj4gDQo+IEJl dHRlciBhZGQgYSBtYWNybyBmb3IgdGhpcyBhbmQgcmVuYW1lIHNldF9pbmRleCBpbnRvIHJlZ2lz dGVyX29mZnNldD8NCg0KSSBhZ3JlZS4NCkRvIHlvdSBzdWdnZXN0IHRvIGluY2x1ZGUgdmFyaWFi bGUgZGVjbGFyYXRpb24gaW50byBtYXJjbz8gT3IganVzdA0KY2FsY3VsYXRpb24gb25seT8NCg0K PiANCj4gPiArDQo+ID4gKwlpZiAoYXBjX3JlZ2lzdGVyX2luZGV4IDwgbXRrX3Zpb19tYXNrX3N0 YV9udW1bc2xhdmVfdHlwZV0pIHsNCj4gPiArCQlyZWcgPSBtdGtfZGV2YXBjX3BkX2dldChkZXZh cGNfY3R4LCBzbGF2ZV90eXBlLCBWSU9fTUFTSywNCj4gPiArCQkJCQlhcGNfcmVnaXN0ZXJfaW5k ZXgpOw0KPiANCj4gSSBkb24ndCBsaWtlIHRoaXMgY29kZSBhbGwgb3ZlciB0aGUgcGxhY2UsIGNv dWxkIGFkZCB0aGUgY29ycmVjdCBvZmZzZXQgdG8NCj4gbXRrX2RldmljZV9pbmZvIGFuZCBqdXN0 IGFkZCBpdCBpbiByZWFkbC93cml0ZWwgZGlyZWN0bHk/DQoNCkRpdHRvLg0KDQo+IA0KPiA+ICsN Cj4gPiArCQlpZiAobWFzaykNCj4gPiArCQkJd3JpdGVsKHJlYWRsKHJlZykgfCAoMSA8PCBhcGNf c2V0X2luZGV4KSwgcmVnKTsNCj4gPiArCQllbHNlDQo+ID4gKwkJCXdyaXRlbChyZWFkbChyZWcp ICYgKH4oMSA8PCBhcGNfc2V0X2luZGV4KSksIHJlZyk7DQo+IA0KPiB2YWx1ZSA9IHJlYWRsKHJl Zyk7DQo+IA0KPiBpZiAobWFzaykNCj4gCXZhbHVlIHw9ICgweDEgPDwgYXBjX3NldF9pbmRleCk7 DQo+IGVsc2UNCj4gCXZhbHVlICY9IH4oMHgxIDw8IGFwY19zZXRfaW5kZXgpOw0KPiANCj4gd3Jp dGVsKHZhbHVlKTsNCj4gDQoNCklzIGl0IGZvciByZWFkYWJpbGl0eT8NCg0KPiA+ICsNCj4gPiAr CX0gZWxzZSB7DQo+ID4gKwkJcHJfZXJyKFBGWCAiJXM6IE91dCBPZiBCb3VuZGFyeSwgc2xhdmVf dHlwZToweCV4LCBtb2R1bGVfaW5kZXg6MHgleCwgbWFzazolc1xuIiwNCj4gPiArCQkgICAgICAg X19mdW5jX18sIHNsYXZlX3R5cGUsIG1vZHVsZSwgbWFzayA/ICJ0cnVlIiA6ICJmYWxzZSIpOw0K PiA+ICsJfQ0KPiA+ICt9DQo+ID4gKw0KPiA+ICsvKg0KPiA+ICsgKiBzeW5jX3Zpb19kYmcgLSBz dGFydCB0byBnZXQgdmlvbGF0aW9uIGluZm9ybWF0aW9uIGJ5IHNlbGVjdGluZyB2aW9sYXRpb24N Cj4gPiArICoJCSAgZ3JvdXAgYW5kIGVuYWJsZSB2aW9sYXRpb24gc2hpZnQuDQo+ID4gKyAqDQo+ ID4gKyAqIFJldHVybnMgc3luYyBkb25lIG9yIG5vdA0KPiA+ICsgKi8NCj4gPiArc3RhdGljIHUz MiBzeW5jX3Zpb19kYmcoc3RydWN0IG10a19kZXZhcGNfY29udGV4dCAqZGV2YXBjX2N0eCwgaW50 IHNsYXZlX3R5cGUsDQo+ID4gKwkJCXUzMiBzaGlmdF9iaXQpDQo+ID4gK3sNCj4gPiArCXZvaWQg X19pb21lbSAqcGRfdmlvX3NoaWZ0X3N0YV9yZWc7DQo+ID4gKwl2b2lkIF9faW9tZW0gKnBkX3Zp b19zaGlmdF9zZWxfcmVnOw0KPiA+ICsJdm9pZCBfX2lvbWVtICpwZF92aW9fc2hpZnRfY29uX3Jl ZzsNCj4gPiArCXUzMiBzaGlmdF9jb3VudDsNCj4gPiArCXUzMiBzeW5jX2RvbmU7DQo+ID4gKw0K PiA+ICsJcGRfdmlvX3NoaWZ0X3N0YV9yZWcgPSBtdGtfZGV2YXBjX3BkX2dldChkZXZhcGNfY3R4 LCBzbGF2ZV90eXBlLA0KPiA+ICsJCQkJCQkgVklPX1NISUZUX1NUQSwgMCk7DQo+ID4gKwlwZF92 aW9fc2hpZnRfc2VsX3JlZyA9IG10a19kZXZhcGNfcGRfZ2V0KGRldmFwY19jdHgsIHNsYXZlX3R5 cGUsDQo+ID4gKwkJCQkJCSBWSU9fU0hJRlRfU0VMLCAwKTsNCj4gPiArCXBkX3Zpb19zaGlmdF9j b25fcmVnID0gbXRrX2RldmFwY19wZF9nZXQoZGV2YXBjX2N0eCwgc2xhdmVfdHlwZSwNCj4gPiAr CQkJCQkJIFZJT19TSElGVF9DT04sIDApOw0KPiA+ICsNCj4gPiArCXdyaXRlbCgweDEgPDwgc2hp ZnRfYml0LCBwZF92aW9fc2hpZnRfc2VsX3JlZyk7DQo+ID4gKwl3cml0ZWwoMHgxLCBwZF92aW9f c2hpZnRfY29uX3JlZyk7DQo+ID4gKw0KPiA+ICsJZm9yIChzaGlmdF9jb3VudCA9IDA7IChzaGlm dF9jb3VudCA8IDEwMCkgJiYNCj4gPiArCSAgICAgKChyZWFkbChwZF92aW9fc2hpZnRfY29uX3Jl ZykgJiAweDMpICE9IDB4Myk7DQo+ID4gKwkgICAgICsrc2hpZnRfY291bnQpDQo+IA0KPiBVc2Ug cmVhZF9wb2xsX3RpbWVvdXQgaGVyZSwgd2UgZG9uJ3Qgd2FudCB0byBkZXBlbmQgb24gdGhlIHRp bWUgMTAwIHJlYWRzIG5lZWQsDQo+IGFzIGZyb20gbXkgdW5kZXJzdGFuZGluZyB0aGlzIGRlcGVu ZHMgb24gdGhlIChkeW5hbWljKSBjbG9jayBmcmVxdWVuY3kuDQo+IA0KDQpPa2F5LCBJJ2xsIHRy eSByZWFkX3BvbGxfdGltZW91dCBoZXJlLg0KDQo+ID4gKwkJOw0KPiA+ICsNCj4gPiArCWlmICgo cmVhZGwocGRfdmlvX3NoaWZ0X2Nvbl9yZWcpICYgMHgzKSA9PSAweDMpDQo+IA0KPiBXZSBjYW4g cmVhZCB0aGUgdmFsdWUgdmlhIHJlYWRsX3BvbGxfdGltZW91dC4gTm8gbmVlZCB0byByZWFkIGl0 IGFnYWluIGhlcmUuDQoNCkRpdHRvLg0KDQo+IA0KPiA+ICsJCXN5bmNfZG9uZSA9IDE7DQo+ID4g KwllbHNlDQo+ID4gKwkJc3luY19kb25lID0gMDsNCj4gPiArDQo+ID4gKwkvKiBEaXNhYmxlIHNo aWZ0IG1lY2hhbmlzbSAqLw0KPiANCj4gV2hhdCBpcyB0aGUgInNoaWZ0IG1lY2hhbmlzbSI/DQoN CiJzaGlmdCBtZWNoYW5pc20iIGlzIGRlcGVuZHMgb24gZGV2YXBjIGhhcmR3YXJlIGRlc2lnbi4N CldlIHNldCBtdWx0aXBsZSBzbGF2ZXMgYXMgYSBncm91cC4gV2hlbiB2aW9sYXRpb24gaXMgdHJp Z2dlcmVkLA0KdmlvbGF0aW9uIGluZm9ybWF0aW9uIGlzIGtlcHQgaW5zaWRlIGhhcmR3YXJlLiAo Q2Fubm90IGdldCBmdWxsDQppbmZvcm1hdGlvbiBmcm9tIHJlZ2lzdGVycy4pDQpXZSBoYXZlIHRv IGRvICJzaGlmdCBtZWNoYW5pc20iIHRvIHNoaWZ0IHZpb2xhdGlvbiBpbmZvcm1hdGlvbiB0bw0K VklPX0RCRzAsIFZJT19EQkcxIHJlZ2lzdGVycy4NCg0KWW91IGNhbiBzZWUgd2UgaGF2ZSB0byBk byBzeW5jX3Zpb19kYmcoKSBiZWZvcmUgZ2V0dGluZyBmdWxsIHZpb2xhdGlvbg0KaW5mb3JtYXRp b24gKGRldmFwY19leHRyYWN0X3Zpb19kYmcoKSkuDQoNCj4gDQo+ID4gKwl3cml0ZWwoMHgwLCBw ZF92aW9fc2hpZnRfY29uX3JlZyk7DQo+ID4gKwl3cml0ZWwoMHgwLCBwZF92aW9fc2hpZnRfc2Vs X3JlZyk7DQo+ID4gKwl3cml0ZWwoMHgxIDw8IHNoaWZ0X2JpdCwgcGRfdmlvX3NoaWZ0X3N0YV9y ZWcpOw0KPiA+ICsNCj4gPiArCXJldHVybiBzeW5jX2RvbmU7DQo+ID4gK30NCj4gPiArDQo+ID4g K3N0YXRpYyB2b2lkIGRldmFwY192aW9faW5mb19wcmludChzdHJ1Y3QgbXRrX2RldmFwY19jb250 ZXh0ICpkZXZhcGNfY3R4KQ0KPiA+ICt7DQo+ID4gKwlzdHJ1Y3QgbXRrX2RldmFwY192aW9faW5m byAqdmlvX2luZm8gPSBkZXZhcGNfY3R4LT52aW9faW5mbzsNCj4gPiArDQo+ID4gKwkvKiBQcmlu dCB2aW9sYXRpb24gaW5mb3JtYXRpb24gKi8NCj4gPiArCWlmICh2aW9faW5mby0+d3JpdGUpDQo+ ID4gKwkJcHJfaW5mbyhQRlggIldyaXRlIFZpb2xhdGlvblxuIik7DQo+ID4gKwllbHNlIGlmICh2 aW9faW5mby0+cmVhZCkNCj4gPiArCQlwcl9pbmZvKFBGWCAiUmVhZCBWaW9sYXRpb25cbiIpOw0K PiA+ICsNCj4gPiArCXByX2luZm8oUEZYICIlcyV4LCAlcyV4LCAlcyV4LCAlcyV4XG4iLA0KPiA+ ICsJCSJWaW8gQWRkcjoweCIsIHZpb19pbmZvLT52aW9fYWRkciwNCj4gPiArCQkiSGlnaDoweCIs IHZpb19pbmZvLT52aW9fYWRkcl9oaWdoLA0KPiA+ICsJCSJCdXMgSUQ6MHgiLCB2aW9faW5mby0+ bWFzdGVyX2lkLA0KPiA+ICsJCSJEb20gSUQ6MHgiLCB2aW9faW5mby0+ZG9tYWluX2lkKTsNCj4g PiArfQ0KPiA+ICsNCj4gPiArc3RhdGljIHZvaWQgZGV2YXBjX2V4dHJhY3RfdmlvX2RiZyhzdHJ1 Y3QgbXRrX2RldmFwY19jb250ZXh0ICpkZXZhcGNfY3R4LA0KPiA+ICsJCQkJICAgaW50IHNsYXZl X3R5cGUpDQo+ID4gK3sNCj4gPiArCXZvaWQgX19pb21lbSAqdmlvX2RiZzBfcmVnLCAqdmlvX2Ri ZzFfcmVnOw0KPiA+ICsJY29uc3Qgc3RydWN0IG10a19pbmZyYV92aW9fZGJnX2Rlc2MgKnZpb19k YmdzOw0KPiA+ICsJc3RydWN0IG10a19kZXZhcGNfdmlvX2luZm8gKnZpb19pbmZvOw0KPiA+ICsJ dTMyIGRiZzA7DQo+ID4gKw0KPiA+ICsJdmlvX2RiZzBfcmVnID0gbXRrX2RldmFwY19wZF9nZXQo ZGV2YXBjX2N0eCwgc2xhdmVfdHlwZSwgVklPX0RCRzAsIDApOw0KPiA+ICsJdmlvX2RiZzFfcmVn ID0gbXRrX2RldmFwY19wZF9nZXQoZGV2YXBjX2N0eCwgc2xhdmVfdHlwZSwgVklPX0RCRzEsIDAp Ow0KPiA+ICsNCj4gPiArCXZpb19kYmdzID0gJm10Njc3OV92aW9fZGJnczsNCj4gPiArCXZpb19p bmZvID0gZGV2YXBjX2N0eC0+dmlvX2luZm87DQo+ID4gKw0KPiA+ICsJLyogRXh0cmFjdCB2aW9s YXRpb24gaW5mb3JtYXRpb24gKi8NCj4gPiArCWRiZzAgPSByZWFkbCh2aW9fZGJnMF9yZWcpOw0K PiA+ICsJdmlvX2luZm8tPnZpb19hZGRyID0gcmVhZGwodmlvX2RiZzFfcmVnKTsNCj4gPiArDQo+ ID4gKwl2aW9faW5mby0+bWFzdGVyX2lkID0gKGRiZzAgJiB2aW9fZGJncy0+dmlvX2RiZ19tc3Rp ZCkgPj4NCj4gPiArCQkJICAgICAgdmlvX2RiZ3MtPnZpb19kYmdfbXN0aWRfc3RhcnRfYml0Ow0K PiA+ICsJdmlvX2luZm8tPmRvbWFpbl9pZCA9IChkYmcwICYgdmlvX2RiZ3MtPnZpb19kYmdfZG1u aWQpID4+DQo+ID4gKwkJCSAgICAgIHZpb19kYmdzLT52aW9fZGJnX2RtbmlkX3N0YXJ0X2JpdDsN Cj4gPiArCXZpb19pbmZvLT53cml0ZSA9ICgoZGJnMCAmIHZpb19kYmdzLT52aW9fZGJnX3dfdmlv KSA+Pg0KPiA+ICsJCQkgICB2aW9fZGJncy0+dmlvX2RiZ193X3Zpb19zdGFydF9iaXQpID09IDE7 DQo+ID4gKwl2aW9faW5mby0+cmVhZCA9ICgoZGJnMCAmIHZpb19kYmdzLT52aW9fZGJnX3Jfdmlv KSA+Pg0KPiA+ICsJCQkgIHZpb19kYmdzLT52aW9fZGJnX3JfdmlvX3N0YXJ0X2JpdCkgPT0gMTsN Cj4gDQo+IFdlIGNhbiBoYXZlIHJlYWQgYW5kIHdyaXRlIHZpb2xhdGlvbiBhdCBhIHRpbWU/DQoN Ck5vLCBidXQgaXQga2VlcHMgaW5kZXBlbmRlbnRseS4NCg0KPiANCj4gPiArCXZpb19pbmZvLT52 aW9fYWRkcl9oaWdoID0gKGRiZzAgJiB2aW9fZGJncy0+dmlvX2FkZHJfaGlnaCkgPj4NCj4gPiAr CQkJCSAgdmlvX2RiZ3MtPnZpb19hZGRyX2hpZ2hfc3RhcnRfYml0Ow0KPiA+ICsNCj4gPiArCWRl dmFwY192aW9faW5mb19wcmludChkZXZhcGNfY3R4KTsNCj4gPiArfQ0KPiA+ICsNCj4gPiArLyoN Cj4gPiArICogbXRrX2RldmFwY19kdW1wX3Zpb19kYmcgLSBzaGlmdCAmIGR1bXAgdGhlIHZpb2xh dGlvbiBkZWJ1ZyBpbmZvcm1hdGlvbi4NCj4gPiArICovDQo+ID4gK3N0YXRpYyBib29sIG10a19k ZXZhcGNfZHVtcF92aW9fZGJnKHN0cnVjdCBtdGtfZGV2YXBjX2NvbnRleHQgKmRldmFwY19jdHgs DQo+ID4gKwkJCQkgICAgaW50IHNsYXZlX3R5cGUsIGludCAqdmlvX2lkeCwgaW50ICppbmRleCkN Cj4gPiArew0KPiA+ICsJY29uc3Qgc3RydWN0IG10a19kZXZpY2VfaW5mbyAqKmRldmljZV9pbmZv Ow0KPiA+ICsJY29uc3Qgc3RydWN0IG10a19kZXZpY2VfbnVtICpuZGV2aWNlczsNCj4gPiArCXZv aWQgX19pb21lbSAqcGRfdmlvX3NoaWZ0X3N0YV9yZWc7DQo+ID4gKwl1MzIgc2hpZnRfYml0Ow0K PiA+ICsJaW50IGk7DQo+ID4gKw0KPiA+ICsJaWYgKCF2aW9faWR4KQ0KPiA+ICsJCXJldHVybiBO VUxMOw0KPiA+ICsNCj4gPiArCWRldmljZV9pbmZvID0gZGV2YXBjX2N0eC0+ZGV2aWNlX2luZm87 DQo+ID4gKwluZGV2aWNlcyA9IG10azY3NzlfZGV2aWNlc19udW07DQo+ID4gKw0KPiA+ICsJcGRf dmlvX3NoaWZ0X3N0YV9yZWcgPSBtdGtfZGV2YXBjX3BkX2dldChkZXZhcGNfY3R4LCBzbGF2ZV90 eXBlLA0KPiA+ICsJCQkJCQkgVklPX1NISUZUX1NUQSwgMCk7DQo+ID4gKw0KPiA+ICsJZm9yIChp ID0gMDsgaSA8IG5kZXZpY2VzW3NsYXZlX3R5cGVdLnZpb19zbGF2ZV9udW07IGkrKykgew0KPiA+ ICsJCSp2aW9faWR4ID0gZGV2aWNlX2luZm9bc2xhdmVfdHlwZV1baV0udmlvX2luZGV4Ow0KPiA+ ICsNCj4gPiArCQlpZiAoY2hlY2tfdmlvX21hc2soZGV2YXBjX2N0eCwgc2xhdmVfdHlwZSwgKnZp b19pZHgpKQ0KPiA+ICsJCQljb250aW51ZTsNCj4gPiArDQo+ID4gKwkJaWYgKGNoZWNrX3Zpb19z dGF0dXMoZGV2YXBjX2N0eCwgc2xhdmVfdHlwZSwgKnZpb19pZHgpIDw9IDApDQo+ID4gKwkJCWNv bnRpbnVlOw0KPiA+ICsNCj4gPiArCQlzaGlmdF9iaXQgPSBtdDY3Nzlfc2hpZnRfZ3JvdXBfZ2V0 KCp2aW9faWR4KTsNCj4gDQo+IHNoaWZ0X2JpdCBzaG91bGQgYmUgcGFydCBvZiBtdGtfZGV2aWNl X2luZm8gZGF0YSBzdHJ1Y3R1cmUuDQo+IFlvdSBjYW4gY3JlYXRlIHR3byBtYWNyb3MgdG8gZGVm aW5lIG10a19kZXZpY2VfaW5mbyBlbnRyaWVzLCBvbmUgd2hpY2ggc2V0cyB0aGUNCj4gc2hpZnQg Yml0IHRvIDMxIGFuZCBhbm90aGVyIG9uZSwgdGhhdCBhbGxvd3MgZm9yIHNldHRpbmcgdGhlIGJp dCBleHBsaWNpdGVseS4NCg0KVGhpcyBpcyBhbm90aGVyIHdheSB0byBnZXQgc2hpZnQgYml0LiBX aGF0IGJlbmVmaXQgY291bGQgd2UgZ2V0Pw0KSSBjb3VsZCBvbmx5IGltYWdpbmUgYXJyYXkgaW5k ZXhpbmcgaXMgbW9yZSBlZmZpY2llbnQgdGhhbiBmdW5jdGlvbg0KY2FsbC4gQnV0IHdlIGRvIG5v dCByZWFsbHkgY2FyZSB0aGUgcGVyZm9ybWFuY2UgaW1wYWN0IHNpbmNlIHRoZQ0KdmlvbGF0aW9u IHNjZW5hcmlvIGlzIHVuZXhwZWN0ZWQuDQoNCj4gDQo+ID4gKw0KPiA+ICsJCWlmICghc3luY192 aW9fZGJnKGRldmFwY19jdHgsIHNsYXZlX3R5cGUsIHNoaWZ0X2JpdCkpDQo+ID4gKwkJCWNvbnRp bnVlOw0KPiA+ICsNCj4gPiArCQlkZXZhcGNfZXh0cmFjdF92aW9fZGJnKGRldmFwY19jdHgsIHNs YXZlX3R5cGUpOw0KPiA+ICsJCSppbmRleCA9IGk7DQo+ID4gKw0KPiA+ICsJCXJldHVybiB0cnVl Ow0KPiA+ICsJfQ0KPiA+ICsNCj4gPiArCXJldHVybiBmYWxzZTsNCj4gPiArfQ0KPiA+ICsNCj4g PiArLyoNCj4gPiArICogZGV2YXBjX3Zpb2xhdGlvbl9pcnEgLSB0aGUgZGV2YXBjIEludGVycnVw dCBTZXJ2aWNlIFJvdXRpbmUgKElTUikgd2lsbCBkdW1wDQo+ID4gKyAqCQkJICB2aW9sYXRpb24g aW5mb3JtYXRpb24gaW5jbHVkaW5nIHdoaWNoIG1hc3RlciB2aW9sYXRlcw0KPiA+ICsgKgkJCSAg YWNjZXNzIHNsYXZlLg0KPiA+ICsgKi8NCj4gPiArc3RhdGljIGlycXJldHVybl90IGRldmFwY192 aW9sYXRpb25faXJxKGludCBpcnFfbnVtYmVyLA0KPiA+ICsJCQkJCXN0cnVjdCBtdGtfZGV2YXBj X2NvbnRleHQgKmRldmFwY19jdHgpDQo+ID4gK3sNCj4gPiArCWNvbnN0IHN0cnVjdCBtdGtfZGV2 aWNlX2luZm8gKipkZXZpY2VfaW5mbyA9IGRldmFwY19jdHgtPmRldmljZV9pbmZvOw0KPiA+ICsJ aW50IHZpb19pZHggPSAtMTsNCj4gPiArCWludCBpbmRleCA9IC0xOw0KPiA+ICsJaW50IHNsYXZl X3R5cGU7DQo+ID4gKw0KPiA+ICsJZm9yIChzbGF2ZV90eXBlID0gMDsgc2xhdmVfdHlwZSA8IFNM QVZFX1RZUEVfTlVNOyBzbGF2ZV90eXBlKyspIHsNCj4gPiArCQlpZiAoIW10a19kZXZhcGNfZHVt cF92aW9fZGJnKGRldmFwY19jdHgsIHNsYXZlX3R5cGUsICZ2aW9faWR4LA0KPiA+ICsJCQkJCSAg ICAgJmluZGV4KSkNCj4gPiArCQkJY29udGludWU7DQo+ID4gKw0KPiA+ICsJCS8qIEVuc3VyZSB0 aGF0IHZpb2xhdGlvbiBpbmZvIGFyZSB3cml0dGVuIGJlZm9yZQ0KPiA+ICsJCSAqIGZ1cnRoZXIg b3BlcmF0aW9ucw0KPiA+ICsJCSAqLw0KPiA+ICsJCXNtcF9tYigpOw0KPiA+ICsNCj4gPiArCQlt YXNrX21vZHVsZV9pcnEoZGV2YXBjX2N0eCwgc2xhdmVfdHlwZSwgdmlvX2lkeCwgdHJ1ZSk7DQo+ ID4gKw0KPiA+ICsJCWNsZWFyX3Zpb19zdGF0dXMoZGV2YXBjX2N0eCwgc2xhdmVfdHlwZSwgdmlv X2lkeCk7DQo+ID4gKw0KPiA+ICsJCXByX2luZm8oUEZYICJWaW9sYXRpb24gLSBzbGF2ZV90eXBl OjB4JXgsIHN5c19pbmRleDoweCV4LCBjdHJsX2luZGV4OjB4JXgsIHZpb19pbmRleDoweCV4XG4i LA0KPiA+ICsJCQlzbGF2ZV90eXBlLA0KPiA+ICsJCQlkZXZpY2VfaW5mb1tzbGF2ZV90eXBlXVtp bmRleF0uc3lzX2luZGV4LA0KPiA+ICsJCQlkZXZpY2VfaW5mb1tzbGF2ZV90eXBlXVtpbmRleF0u Y3RybF9pbmRleCwNCj4gPiArCQkJZGV2aWNlX2luZm9bc2xhdmVfdHlwZV1baW5kZXhdLnZpb19p bmRleCk7DQo+IA0KPiBIb3cgd2lsbCB0aGF0IHRoZW4gYmUgdXNlZD8gV2lsbCB0aGVyZSBzb21l IGtpbmQgb2YgdXNlci1zcGFjZSBkYWVtb24gd2hpY2ggd2lsbA0KPiBwYXJzZSB0aGUga2VybmVs IGxvZyB0byBzZWUgaWYgYSB2aW9sYXRpb24gaGFwcGVucz8gV2hhdCB3aWxsIGl0IGRvIHdpdGgg dGhpcw0KPiBpbmZvcm1hdGlvbj8NCj4gDQo+IEkgc3RpbGwgZG9uJ3QgdW5kZXJzdGFuZCB3aHkg d2UgbmVlZCB0byBkbyB0aGF0IGluIHRoZSBrZXJuZWwgaW5zdGVhZCBvZiBpbg0KPiBURi1BLiBD YW4geW91IHBsZWFzZSBleHBsYWluPw0KPiANCg0KV2Ugd291bGQgZG8gZGlmZmVyZW50IGV4dHJh IGhhbmRsZSBmb3IgZGlmZmVyZW50IGJ1cyBtYXN0ZXJzIGludGVybmFsbHkuDQpCYXNpY2FsbHks IGRpZmZlcmVudCBidXMgbWFzdGVycyBoYXZlIGRpZmZlcmVudCBkZWJ1ZyBtZWNoYW5pc20uDQpB bmQgZGlmZmVyZW50IGN1c3RvbWVycyBoYXZlIGRpZmZlcmVudCBzZXZlcml0eSBhYm91dCBkZXZh cGMgdmlvbGF0aW9uLg0KRm9yIGV4YW1wbGUsIGtlcm5lbCBleGNlcHRpb24sIGV4dGVybmFsIGV4 Y2VwdGlvbiwgd2FybmluZywgZG9uJ3QNCmNhcmUsLi4uDQoNCkkgbGlzdCAyIHJlYXNvbiB3aHkg SSBwdXQgaXQgaW4ga2VybmVsIGluc3RlYWQgb2YgQVRGLg0KMS4gUmljaCBPUyBzdWNoIGFzIExp bnV4IGtlcm5lbCBoYXMgbW9yZSBkZWJ1ZyBtZWNoYW5pc20gYW5kIHRvb2xzIHRvDQpmaW5kIG11 cmRlcmVyLg0KMi4gSWYgaW50ZXJydXB0IGhhcyB0byBiZSBoYW5kbGVkIGluIEFURiwgR0lDIGlu dHIgd291bGQgYmUgc2V0IGFzIEcwUw0KKEdyb3VwIDAgU2VjdXJlKS4gRm9yIG91ciBpbnRlcnJ1 cHQgcm91dGluZywgRzBTIGludHIgd291bGQgYmUgZmlxLiBXaGVuDQp3ZSBoYW5kbGUgaXQgaW4g RUwzLCBpdCB3b3VsZCBtYXNrIGFsbCBFTDEgaXJxIHRlbXBvcmFyaWx5LiBXZSBkbyBub3QNCnRy ZWF0IGRldmFwYyBpbnRlcnJ1cHQgYXMgc3VjaCBjcml0aWNhbC4NCg0KRG9lIGl0IG1ha2Ugc2Vu c2U/IE9yIGRvIHlvdSBoYXZlIGFueSByZWFzb24gdGhhdCBpdCBzaG91bGQgYmUgaGFuZGxlZA0K aW4gQVRGPw0KDQo+IA0KPiA+ICsNCj4gPiArCQltYXNrX21vZHVsZV9pcnEoZGV2YXBjX2N0eCwg c2xhdmVfdHlwZSwgdmlvX2lkeCwgZmFsc2UpOw0KPiA+ICsJfQ0KPiA+ICsNCj4gPiArCXJldHVy biBJUlFfSEFORExFRDsNCj4gPiArfQ0KPiA+ICsNCj4gPiArLyoNCj4gPiArICogc3RhcnRfZGV2 YXBjIC0gaW5pdGlhbGl6ZSBkZXZhcGMgc3RhdHVzIGFuZCBzdGFydCByZWNlaXZpbmcgaW50ZXJy dXB0DQo+ID4gKyAqCQkgIHdoaWxlIGRldmFwYyB2aW9sYXRpb24gaXMgdHJpZ2dlcmVkLg0KPiA+ ICsgKi8NCj4gPiArc3RhdGljIHZvaWQgc3RhcnRfZGV2YXBjKHN0cnVjdCBtdGtfZGV2YXBjX2Nv bnRleHQgKmRldmFwY19jdHgpDQo+ID4gK3sNCj4gPiArCWNvbnN0IHN0cnVjdCBtdGtfZGV2aWNl X2luZm8gKipkZXZpY2VfaW5mbzsNCj4gPiArCWNvbnN0IHN0cnVjdCBtdGtfZGV2aWNlX251bSAq bmRldmljZXM7DQo+ID4gKwl2b2lkIF9faW9tZW0gKnBkX3Zpb19zaGlmdF9zdGFfcmVnOw0KPiA+ ICsJdm9pZCBfX2lvbWVtICpwZF9hcGNfY29uX3JlZzsNCj4gPiArCWludCBzbGF2ZV90eXBlLCB2 aW9faWR4LCBpOw0KPiA+ICsJdTMyIHZpb19zaGlmdF9zdGE7DQo+ID4gKw0KPiA+ICsJZGV2YXBj X2N0eC0+ZGV2aWNlX2luZm9bMF0gPSBtdDY3NzlfZGV2aWNlc19pbmZyYTsNCj4gDQo+IE9uZSBl bGVtZW50IGFycnkgc2hvdWxkIGJlIGEgc2ltcGxlIHBvaW50ZXIuDQo+IG10Njc3OV9kZXZpY2Vz X2luZnJhIHNob3VsZCBiZSBEVCBkYXRhIGZvciB0aGUgbXQ2Nzc5IGNvbXBhdGlibGUuDQoNClll cywgeW91IGFyZSByaWdodC4gSXQncyBubyBuZWVkIHRvIHVzZSBlbGVtZW50IGFycmF5LiBJJ2xs IHRyeSBpdCBjb3VsZA0KcHV0IGludG8gRFQgZGF0YSBvciBub3QuDQoNCj4gDQo+ID4gKwlkZXZp Y2VfaW5mbyA9IGRldmFwY19jdHgtPmRldmljZV9pbmZvOw0KPiA+ICsJbmRldmljZXMgPSBtdGs2 Nzc5X2RldmljZXNfbnVtOw0KPiA+ICsNCj4gPiArCWZvciAoc2xhdmVfdHlwZSA9IDA7IHNsYXZl X3R5cGUgPCBTTEFWRV9UWVBFX05VTTsgc2xhdmVfdHlwZSsrKSB7DQo+IA0KPiBGb3IgbG9vcCBu b3QgbmVlZGVkLCB3ZSBvbnkgaGF2ZSBvbmUgU0xBVkVfVFlQRS4NCg0KWWVzLCBJJ2xsIGZpeCBp dC4NCg0KPiANCj4gPiArCQlwZF9hcGNfY29uX3JlZyA9IG10a19kZXZhcGNfcGRfZ2V0KGRldmFw Y19jdHgsIHNsYXZlX3R5cGUsDQo+ID4gKwkJCQkJCSAgIEFQQ19DT04sIDApOw0KPiA+ICsJCXBk X3Zpb19zaGlmdF9zdGFfcmVnID0gbXRrX2RldmFwY19wZF9nZXQoZGV2YXBjX2N0eCwgc2xhdmVf dHlwZSwNCj4gPiArCQkJCQkJCSBWSU9fU0hJRlRfU1RBLCAwKTsNCj4gPiArDQo+ID4gKwkJaWYg KCFwZF9hcGNfY29uX3JlZyB8fCAhcGRfdmlvX3NoaWZ0X3N0YV9yZWcpDQo+ID4gKwkJCXJldHVy bjsNCj4gPiArDQo+ID4gKwkJLyogQ2xlYXIgZGV2YXBjIHZpb2xhdGlvbiBzdGF0dXMgKi8NCj4g PiArCQl3cml0ZWwoQklUKDMxKSwgcGRfYXBjX2Nvbl9yZWcpOw0KPiA+ICsNCj4gPiArCQkvKiBD bGVhciB2aW9sYXRpb24gc2hpZnQgc3RhdHVzICovDQo+ID4gKwkJdmlvX3NoaWZ0X3N0YSA9IHJl YWRsKHBkX3Zpb19zaGlmdF9zdGFfcmVnKTsNCj4gPiArCQlpZiAodmlvX3NoaWZ0X3N0YSkNCj4g PiArCQkJd3JpdGVsKHZpb19zaGlmdF9zdGEsIHBkX3Zpb19zaGlmdF9zdGFfcmVnKTsNCj4gPiAr DQo+ID4gKwkJLyogQ2xlYXIgc2xhdmUgdmlvbGF0aW9uIHN0YXR1cyAqLw0KPiA+ICsJCWZvciAo aSA9IDA7IGkgPCBuZGV2aWNlc1tzbGF2ZV90eXBlXS52aW9fc2xhdmVfbnVtOyBpKyspIHsNCj4g PiArCQkJdmlvX2lkeCA9IGRldmljZV9pbmZvW3NsYXZlX3R5cGVdW2ldLnZpb19pbmRleDsNCj4g PiArDQo+ID4gKwkJCWNsZWFyX3Zpb19zdGF0dXMoZGV2YXBjX2N0eCwgc2xhdmVfdHlwZSwgdmlv X2lkeCk7DQo+ID4gKw0KPiA+ICsJCQltYXNrX21vZHVsZV9pcnEoZGV2YXBjX2N0eCwgc2xhdmVf dHlwZSwgdmlvX2lkeCwgZmFsc2UpOw0KPiA+ICsJCX0NCj4gPiArCX0NCj4gPiArfQ0KPiA+ICsN Cj4gPiArc3RhdGljIGludCBtdDY3NzlfZGV2YXBjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZp Y2UgKnBkZXYpDQo+ID4gK3sNCj4gPiArCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSA9IHBkZXYt PmRldi5vZl9ub2RlOw0KPiA+ICsJc3RydWN0IG10a19kZXZhcGNfY29udGV4dCAqZGV2YXBjX2N0 eDsNCj4gPiArCXN0cnVjdCBjbGsgKmRldmFwY19pbmZyYV9jbGs7DQo+ID4gKwl1MzIgZGV2YXBj X2lycTsNCj4gPiArCWludCByZXQ7DQo+ID4gKw0KPiA+ICsJaWYgKElTX0VSUihub2RlKSkNCj4g PiArCQlyZXR1cm4gLUVOT0RFVjsNCj4gPiArDQo+ID4gKwlkZXZhcGNfY3R4ID0gZGV2bV9remFs bG9jKCZwZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3QgbXRrX2RldmFwY19jb250ZXh0KSwNCj4gPiAr CQkJCSAgR0ZQX0tFUk5FTCk7DQo+ID4gKwlpZiAoIWRldmFwY19jdHgpDQo+ID4gKwkJcmV0dXJu IC1FTk9NRU07DQo+ID4gKw0KPiA+ICsJZGV2YXBjX2N0eC0+dmlvX2luZm8gPSBkZXZtX2t6YWxs b2MoJnBkZXYtPmRldiwNCj4gPiArCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBtdGtfZGV2YXBjX3Zp b19pbmZvKSwNCj4gPiArCQkJCQkgICAgR0ZQX0tFUk5FTCk7DQo+ID4gKwlpZiAoIWRldmFwY19j dHgtPnZpb19pbmZvKQ0KPiA+ICsJCXJldHVybiAtRU5PTUVNOw0KPiA+ICsNCj4gPiArCWRldmFw Y19jdHgtPmRldmFwY19wZF9iYXNlWzBdID0gb2ZfaW9tYXAobm9kZSwgMCk7DQo+IA0KPiBObyBh cnJheSBuZWVkZWQsIHdlIG9ubHkgaGF2ZSBvbmUgZWxlbWVudC4uLg0KDQpEaXR0by4NCg0KPiAN Cj4gPiArCWlmICghZGV2YXBjX2N0eC0+ZGV2YXBjX3BkX2Jhc2VbMF0pDQo+ID4gKwkJcmV0dXJu IC1FSU5WQUw7DQo+ID4gKw0KPiA+ICsJZGV2YXBjX2lycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFw KG5vZGUsIDApOw0KPiA+ICsJaWYgKCFkZXZhcGNfaXJxKQ0KPiA+ICsJCXJldHVybiAtRUlOVkFM Ow0KPiA+ICsNCj4gPiArCWRldmFwY19pbmZyYV9jbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRl diwgImRldmFwYy1pbmZyYS1jbG9jayIpOw0KPiA+ICsNCj4gDQo+IE5vIG5ldyBsaW5lIGhlcmUs IHBsZWFzZSBjaGVjayBjb25kaW5nIHN0eWxlIGFuZCBhcHBseSB0byBhbGwgdGhlIGNvZGUuDQoN ClllcywgSSdsbCBmaXggaXQuDQoNCj4gDQo+ID4gKwlpZiAoSVNfRVJSKGRldmFwY19pbmZyYV9j bGspKQ0KPiA+ICsJCXJldHVybiAtRUlOVkFMOw0KPiA+ICsNCj4gPiArCWlmIChjbGtfcHJlcGFy ZV9lbmFibGUoZGV2YXBjX2luZnJhX2NsaykpDQo+ID4gKwkJcmV0dXJuIC1FSU5WQUw7DQo+ID4g Kw0KPiA+ICsJc3RhcnRfZGV2YXBjKGRldmFwY19jdHgpOw0KPiA+ICsNCj4gPiArCXJldCA9IGRl dm1fcmVxdWVzdF9pcnEoJnBkZXYtPmRldiwgZGV2YXBjX2lycSwNCj4gPiArCQkJICAgICAgIChp cnFfaGFuZGxlcl90KWRldmFwY192aW9sYXRpb25faXJxLA0KPiA+ICsJCQkgICAgICAgSVJRRl9U UklHR0VSX05PTkUsICJkZXZhcGMiLCBkZXZhcGNfY3R4KTsNCj4gPiArCWlmIChyZXQpDQo+ID4g KwkJcmV0dXJuIHJldDsNCj4gPiArDQo+ID4gKwlyZXR1cm4gMDsNCj4gPiArfQ0KPiA+ICsNCj4g PiArc3RhdGljIGludCBtdDY3NzlfZGV2YXBjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNl ICpkZXYpDQo+ID4gK3sNCj4gPiArCXJldHVybiAwOw0KPiA+ICt9DQo+ID4gKw0KPiA+ICtzdGF0 aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtdDY3NzlfZGV2YXBjX2R0X21hdGNoW10gPSB7 DQo+ID4gKwl7IC5jb21wYXRpYmxlID0gIm1lZGlhdGVrLG10Njc3OS1kZXZhcGMiIH0sDQo+ID4g Kwl7fSwNCj4gPiArfTsNCj4gPiArDQo+ID4gK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVy IG10Njc3OV9kZXZhcGNfZHJpdmVyID0gew0KPiA+ICsJLnByb2JlID0gbXQ2Nzc5X2RldmFwY19w cm9iZSwNCj4gPiArCS5yZW1vdmUgPSBtdDY3NzlfZGV2YXBjX3JlbW92ZSwNCj4gPiArCS5kcml2 ZXIgPSB7DQo+ID4gKwkJLm5hbWUgPSBLQlVJTERfTU9ETkFNRSwNCj4gPiArCQkub2ZfbWF0Y2hf dGFibGUgPSBtdDY3NzlfZGV2YXBjX2R0X21hdGNoLA0KPiA+ICsJfSwNCj4gPiArfTsNCj4gPiAr DQo+ID4gK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIobXQ2Nzc5X2RldmFwY19kcml2ZXIpOw0KPiA+ ICsNCj4gPiArTU9EVUxFX0RFU0NSSVBUSU9OKCJNZWRpYXRlayBNVDY3NzkgRGV2aWNlIEFQQyBE cml2ZXIiKTsNCj4gPiArTU9EVUxFX0FVVEhPUigiTmVhbCBMaXUgPG5lYWwubGl1QG1lZGlhdGVr LmNvbT4iKTsNCj4gPiArTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOw0KPiA+IGRpZmYgLS1naXQgYS9k cml2ZXJzL3NvYy9tZWRpYXRlay9kZXZhcGMvZGV2YXBjLW10Njc3OS5oIGIvZHJpdmVycy9zb2Mv bWVkaWF0ZWsvZGV2YXBjL2RldmFwYy1tdDY3NzkuaA0KPiA+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0 DQo+ID4gaW5kZXggMDAwMDAwMC4uOGMwZTRlNw0KPiA+IC0tLSAvZGV2L251bGwNCj4gPiArKysg Yi9kcml2ZXJzL3NvYy9tZWRpYXRlay9kZXZhcGMvZGV2YXBjLW10Njc3OS5oDQo+ID4gQEAgLTAs MCArMSw5OSBAQA0KPiA+ICsvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqLw0K PiA+ICsvKg0KPiA+ICsgKiBDb3B5cmlnaHQgKEMpIDIwMjAgTWVkaWFUZWsgSW5jLg0KPiA+ICsg Ki8NCj4gPiArDQo+ID4gKyNpZm5kZWYgX19ERVZBUENfTVQ2Nzc5X0hfXw0KPiA+ICsjZGVmaW5l IF9fREVWQVBDX01UNjc3OV9IX18NCj4gPiArDQo+ID4gKyNkZWZpbmUgUEZYCQkJIltERVZBUENd OiAiDQo+ID4gKyNkZWZpbmUgTU9EX05NX0lOXzFfREVWQVBDCTE2DQo+ID4gKw0KPiA+ICtlbnVt IERFVkFQQ19TTEFWRV9UWVBFIHsNCj4gPiArCVNMQVZFX1RZUEVfSU5GUkEgPSAwLA0KPiA+ICsJ U0xBVkVfVFlQRV9OVU0sDQo+ID4gK307DQo+ID4gKw0KPiA+ICtlbnVtIERFVkFQQ19QRF9SRUdf VFlQRSB7DQo+ID4gKwlWSU9fTUFTSyA9IDAsDQo+ID4gKwlWSU9fU1RBLA0KPiA+ICsJVklPX0RC RzAsDQo+ID4gKwlWSU9fREJHMSwNCj4gPiArCUFQQ19DT04sDQo+ID4gKwlWSU9fU0hJRlRfU1RB LA0KPiA+ICsJVklPX1NISUZUX1NFTCwNCj4gPiArCVZJT19TSElGVF9DT04sDQo+ID4gKwlQRF9S RUdfVFlQRV9OVU0sDQo+ID4gK307DQo+ID4gKw0KPiA+ICtlbnVtIERFVkFQQ19WSU9fTUFTS19T VEFfTlVNIHsNCj4gPiArCVZJT19NQVNLX1NUQV9OVU1fSU5GUkEgPSAxNywNCj4gDQo+ICNkZWZp bmUgaW5zdGVhZCBvZiBlbnVtDQoNCk9rYXksIEknbGwgZml4IGl0LiBQdXQgaXQgaW50byBEVCBk YXRhIG1pZ2h0IGJlIGJldHRlciB3YXkuDQoNCj4gDQo+ID4gK307DQo+ID4gKw0KPiA+ICtlbnVt IERFVkFQQ19WSU9fU0xBVkVfTlVNIHsNCj4gPiArCVZJT19TTEFWRV9OVU1fSU5GUkEgPSA0OTks DQo+IA0KPiAjZGVmaW5lIGluc3RlYWQgb2YgZW51bS4NCj4gDQoNCkRpdHRvLg0KDQo+ID4gK307 DQo+ID4gKw0KPiA+ICtlbnVtIERFVkFQQ19QRF9PRkZTRVQgew0KPiA+ICsJUERfVklPX01BU0tf T0ZGU0VUID0gMHgwLA0KPiA+ICsJUERfVklPX1NUQV9PRkZTRVQgPSAweDQwMCwNCj4gPiArCVBE X1ZJT19EQkcwX09GRlNFVCA9IDB4OTAwLA0KPiA+ICsJUERfVklPX0RCRzFfT0ZGU0VUID0gMHg5 MDQsDQo+ID4gKwlQRF9BUENfQ09OX09GRlNFVCA9IDB4RjAwLA0KPiA+ICsJUERfU0hJRlRfU1RB X09GRlNFVCA9IDB4RjEwLA0KPiA+ICsJUERfU0hJRlRfU0VMX09GRlNFVCA9IDB4RjE0LA0KPiA+ ICsJUERfU0hJRlRfQ09OX09GRlNFVCA9IDB4RjIwLA0KPiANCj4gI2RlZmluZSBpbnN0ZWFkIG9m IGVudW0NCj4gSSB0aGluayB0aGlzIHNob3VsZCBiZSBwYXJ0IG9mIG10a19kZXZpY2VfaW5mbyBv biBhIHBlciBTb0MgYmFzZSAocHJvdmlkZWQgdmlhDQo+IERUIGRhdGEpLg0KPiANCg0KRGl0dG8u DQoNCj4gPiArfTsNCj4gPiArDQo+ID4gK3N0cnVjdCBtdGtfZGV2aWNlX251bSB7DQo+ID4gKwlp bnQgc2xhdmVfdHlwZTsNCj4gPiArCXUzMiB2aW9fc2xhdmVfbnVtOw0KPiA+ICt9Ow0KPiA+ICsN Cj4gPiArc3RydWN0IG10a19kZXZhcGNfdmlvX2luZm8gew0KPiA+ICsJYm9vbCByZWFkOw0KPiA+ ICsJYm9vbCB3cml0ZTsNCj4gPiArCXUzMiB2aW9fYWRkcjsNCj4gPiArCXUzMiB2aW9fYWRkcl9o aWdoOw0KPiA+ICsJdTMyIG1hc3Rlcl9pZDsNCj4gPiArCXUzMiBkb21haW5faWQ7DQo+ID4gK307 DQo+ID4gKw0KPiA+ICtzdHJ1Y3QgbXRrX2luZnJhX3Zpb19kYmdfZGVzYyB7DQo+ID4gKwl1MzIg dmlvX2RiZ19tc3RpZDsNCj4gPiArCXU4IHZpb19kYmdfbXN0aWRfc3RhcnRfYml0Ow0KPiA+ICsJ dTMyIHZpb19kYmdfZG1uaWQ7DQo+ID4gKwl1OCB2aW9fZGJnX2RtbmlkX3N0YXJ0X2JpdDsNCj4g PiArCXUzMiB2aW9fZGJnX3dfdmlvOw0KPiA+ICsJdTggdmlvX2RiZ193X3Zpb19zdGFydF9iaXQ7 DQo+ID4gKwl1MzIgdmlvX2RiZ19yX3ZpbzsNCj4gPiArCXU4IHZpb19kYmdfcl92aW9fc3RhcnRf Yml0Ow0KPiA+ICsJdTMyIHZpb19hZGRyX2hpZ2g7DQo+ID4gKwl1OCB2aW9fYWRkcl9oaWdoX3N0 YXJ0X2JpdDsNCj4gPiArfTsNCj4gPiArDQo+ID4gK3N0cnVjdCBtdGtfZGV2aWNlX2luZm8gew0K PiA+ICsJaW50IHN5c19pbmRleDsNCj4gPiArCWludCBjdHJsX2luZGV4Ow0KPiA+ICsJaW50IHZp b19pbmRleDsNCj4gDQo+IEEgcXVpY2sgY2hlY2sgc2hvd2VkIG1lIHRoYXQgdGhlIHZpb19pbmRl eCA9PSB0aGUgaW5kZXggaW4gdGhlIGFycmF5LiBEcm9wIGl0Lg0KPiANCg0KTm8sIHZpb19pbmRl eCBpcyBkaWZmZXJlbnQgZnJvbSBpbmRleCBvZiB0aGUgYXJyYXkuDQoNCj4gPiArfTsNCj4gPiAr DQo+ID4gK3N0cnVjdCBtdGtfZGV2YXBjX2NvbnRleHQgew0KPiA+ICsJdm9pZCBfX2lvbWVtICpk ZXZhcGNfcGRfYmFzZVtTTEFWRV9UWVBFX05VTV07DQo+ID4gKwljb25zdCBzdHJ1Y3QgbXRrX2Rl dmljZV9pbmZvICpkZXZpY2VfaW5mb1tTTEFWRV9UWVBFX05VTV07DQo+ID4gKwlzdHJ1Y3QgbXRr X2RldmFwY192aW9faW5mbyAqdmlvX2luZm87DQo+ID4gK307DQo+ID4gKw0KPiA+ICsvKiBGb3Ig SW5mcmEgVklPX0RCRyAqLw0KPiA+ICsjZGVmaW5lIElORlJBX1ZJT19EQkdfTVNUSUQJCQkweDAw MDBGRkZGDQo+ID4gKyNkZWZpbmUgSU5GUkFfVklPX0RCR19NU1RJRF9TVEFSVF9CSVQJCTANCj4g PiArI2RlZmluZSBJTkZSQV9WSU9fREJHX0RNTklECQkJMHgwMDNGMDAwMA0KPiA+ICsjZGVmaW5l IElORlJBX1ZJT19EQkdfRE1OSURfU1RBUlRfQklUCQkxNg0KPiA+ICsjZGVmaW5lIElORlJBX1ZJ T19EQkdfV19WSU8JCQkweDAwNDAwMDAwDQo+ID4gKyNkZWZpbmUgSU5GUkFfVklPX0RCR19XX1ZJ T19TVEFSVF9CSVQJCTIyDQo+ID4gKyNkZWZpbmUgSU5GUkFfVklPX0RCR19SX1ZJTwkJCTB4MDA4 MDAwMDANCj4gPiArI2RlZmluZSBJTkZSQV9WSU9fREJHX1JfVklPX1NUQVJUX0JJVAkJMjMNCj4g PiArI2RlZmluZSBJTkZSQV9WSU9fQUREUl9ISUdICQkJMHgwRjAwMDAwMA0KPiA+ICsjZGVmaW5l IElORlJBX1ZJT19BRERSX0hJR0hfU1RBUlRfQklUCQkyNA0KPiA+ICsNCj4gPiArI2VuZGlmIC8q IF9fREVWQVBDX01UNjc3OV9IX18gKi8NCj4gPiANCg0K 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=-8.2 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY,URIBL_BLOCKED, USER_AGENT_SANE_2 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 61289C433E0 for ; Tue, 7 Jul 2020 07:33:23 +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 1458920708 for ; Tue, 7 Jul 2020 07:33:23 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="pKNAxl5v"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=mediatek.com header.i=@mediatek.com header.b="SPd7WdbI" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 1458920708 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=mediatek.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-mediatek-bounces+linux-mediatek=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:References:In-Reply-To:Date:To:From: Subject:Message-ID:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=RKMeUodC3xz3yjb8bDZIw5lVcv9TQvccn7YB4x+ho/c=; b=pKNAxl5vH++lP7MAfFNJW/oX6 XtA3B8jovA3WMtEWXGrl2oIK+/76520i/qq5ipm1WPXnpxSKspryIPtLHtZY94AG0pdM3QVwp/ejn Iq0LGmMTkEmLsK7UQdDjN7aM/mpcP6C2KHm9x5BgH0CVYiFgiH2Nzx/YqVxihtQ57o1xFRRt6UU30 v5CRntBUKnxyDhoSq7FvaFqdCU6hJ07ChQpZvwPMa96LbVMmDEIdlexF+caq/IwcJ0StCr49oHYLc HyDX4rRrAT0oO3JH2pjqcSWDXH+wvPAKh0I9Qgd8chv4jfKFdIouL07x8a6YcRGLCNW8eGHXJteSZ 1/K0q46Lg==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1jsi6I-00043n-4H; Tue, 07 Jul 2020 07:33:10 +0000 Received: from mailgw01.mediatek.com ([216.200.240.184]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jsi6D-00042i-33; Tue, 07 Jul 2020 07:33:07 +0000 X-UUID: 55fda6cda72a4e29bd56d0416da3d660-20200706 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Transfer-Encoding:MIME-Version:Content-Type:References:In-Reply-To:Date:CC:To:From:Subject:Message-ID; bh=bbruckC3ceq+ERWDrNx+WHxXmMBaz2tWUh5l7zH/VsA=; b=SPd7WdbIV3UpMIi5oaQy4k3V9FGdhnlfAUydzvpkg9yv6bYWSiPaBRH+MHLjLsu+oML0twaDC67qjEDCVfFgogOolFeiQwqA4dMkq+xUCX1oebLldVR3mMwyxd0kR1AWw00mx5fkj1AsdwC9XiFyBpZo9UrBLEpJOie6s9AF9xI=; X-UUID: 55fda6cda72a4e29bd56d0416da3d660-20200706 Received: from mtkcas66.mediatek.inc [(172.29.193.44)] by mailgw01.mediatek.com (envelope-from ) (musrelay.mediatek.com ESMTP with TLS) with ESMTP id 1994152097; Mon, 06 Jul 2020 23:32:56 -0800 Received: from MTKMBS01N1.mediatek.inc (172.21.101.68) by MTKMBS62DR.mediatek.inc (172.29.94.18) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 7 Jul 2020 00:32:55 -0700 Received: from mtkcas07.mediatek.inc (172.21.101.84) by mtkmbs01n1.mediatek.inc (172.21.101.68) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 7 Jul 2020 15:32:48 +0800 Received: from [172.21.77.33] (172.21.77.33) by mtkcas07.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 7 Jul 2020 15:32:49 +0800 Message-ID: <1594107170.20820.84.camel@mtkswgap22> Subject: Re: [PATCH 2/2] soc: mediatek: devapc: add devapc-mt6779 driver From: Neal Liu To: Matthias Brugger Date: Tue, 7 Jul 2020 15:32:50 +0800 In-Reply-To: References: <1594027693-19530-1-git-send-email-neal.liu@mediatek.com> <1594027693-19530-3-git-send-email-neal.liu@mediatek.com> X-Mailer: Evolution 3.2.3-0ubuntu6 MIME-Version: 1.0 X-MTK: N X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200707_033305_467364_34935397 X-CRM114-Status: GOOD ( 39.89 ) X-BeenThere: linux-mediatek@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: devicetree@vger.kernel.org, wsd_upstream@mediatek.com, lkml , Rob Herring , "moderated list:ARM/Mediatek SoC support" , Neal Liu , linux-arm-kernel@lists.infradead.org Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "Linux-mediatek" Errors-To: linux-mediatek-bounces+linux-mediatek=archiver.kernel.org@lists.infradead.org Hi Matthias, Thanks for your review. On Mon, 2020-07-06 at 13:27 +0200, Matthias Brugger wrote: > CC linux-mediatek > > Please you ./scripts/get_maintainers.pl to find out to whom you should send the > series. Yes, I already find out from get_maintainers.pl. But I forgot to add it into cc list... > > On 06/07/2020 11:28, Neal Liu wrote: > > MT6779 bus frabric provides TrustZone security support and data > > protection to prevent slaves from being accessed by unexpected > > masters. > > The security violations are logged and sent to the processor for > > further analysis or countermeasures. > > > > Any occurrence of security violation would raise an interrupt, and > > it will be handled by devapc-mt6779 driver. The violation > > information is printed in order to find the murderer. > > > > Please describe in more detail how this HW works. "devapc" means Device Access Permission Control. This hardware can control which bus masters are allowed or disallowed to access bus slaves. And it will generate interrupts if someone violates the rules. You can check binding for more details. > > > Signed-off-by: Neal Liu > > --- > > copying my comments from the last revision, which weren't answered and are not > addressed here. If you are not OK with my sugguestions, no problem but please > provide your arguments so that we can come up with a solution. Otherwise you are > just wasting your and my time: Sorry for not replying your previous comments. I think your most comments are really helpful and I already revised and applied it in this patch. Let's discuss the part I missed. > > Please review your data structures and try to group the information in logical > structs. For example I don't understand why we need mtk_devapc_context. It seems > to me that all the values in there are SoC specific. > Yes, you are right. mtk_devapc_context dedicated to SoC specific. > Why void __iomem *devapc_pd_base isn't part of the device_info? > device_info stores slaves' info which are controlled by devapc. devapc_pd_base stores devapc_pd based register which is used to control and dump violation information. > > > > drivers/soc/mediatek/Kconfig | 6 + > > drivers/soc/mediatek/Makefile | 1 + > > drivers/soc/mediatek/devapc/Kconfig | 17 + > > drivers/soc/mediatek/devapc/Makefile | 10 + > > drivers/soc/mediatek/devapc/devapc-mt6779.c | 1111 +++++++++++++++++++++++++++ > > From the answers of the last revision it seems that this driver will be used for > more then one SoC. So we should not name it devapc-mt6779.c but for example > mtk-devapc.c. Okay, we could use mtk-devapc.c for first patch. If we upstream next SoC, then we could separate SoC specific part. > > By the way, what does the devapc stands for? It's not clear from the commit > message nor from the binding description. It already described in binding title. title: MediaTek MT6779 Device Access Permission Control driver > > > drivers/soc/mediatek/devapc/devapc-mt6779.h | 99 +++ > > 6 files changed, 1244 insertions(+) > > create mode 100644 drivers/soc/mediatek/devapc/Kconfig > > create mode 100644 drivers/soc/mediatek/devapc/Makefile > > create mode 100644 drivers/soc/mediatek/devapc/devapc-mt6779.c > > create mode 100644 drivers/soc/mediatek/devapc/devapc-mt6779.h > > > > diff --git a/drivers/soc/mediatek/Kconfig b/drivers/soc/mediatek/Kconfig > > index 59a56cd..2c9ad1f 100644 > > --- a/drivers/soc/mediatek/Kconfig > > +++ b/drivers/soc/mediatek/Kconfig > > @@ -51,4 +51,10 @@ config MTK_MMSYS > > Say yes here to add support for the MediaTek Multimedia > > Subsystem (MMSYS). > > > > +menu "Security" > > + > > +source "drivers/soc/mediatek/devapc/Kconfig" > > + > > +endmenu # Security > > + > > endmenu > > diff --git a/drivers/soc/mediatek/Makefile b/drivers/soc/mediatek/Makefile > > index 01f9f87..d6717a81 100644 > > --- a/drivers/soc/mediatek/Makefile > > +++ b/drivers/soc/mediatek/Makefile > > @@ -1,5 +1,6 @@ > > # SPDX-License-Identifier: GPL-2.0-only > > obj-$(CONFIG_MTK_CMDQ) += mtk-cmdq-helper.o > > +obj-$(CONFIG_MTK_DEVAPC) += devapc/ > > Why do we need a new folder for the driver? Currently, we don't need it. But once it support multiple platforms, we would like to group it. Does it make sense? > > > obj-$(CONFIG_MTK_INFRACFG) += mtk-infracfg.o > > obj-$(CONFIG_MTK_PMIC_WRAP) += mtk-pmic-wrap.o > > obj-$(CONFIG_MTK_SCPSYS) += mtk-scpsys.o > > diff --git a/drivers/soc/mediatek/devapc/Kconfig b/drivers/soc/mediatek/devapc/Kconfig > > new file mode 100644 > > index 0000000..b0f7d0e > > --- /dev/null > > +++ b/drivers/soc/mediatek/devapc/Kconfig > > @@ -0,0 +1,17 @@ > > +config MTK_DEVAPC > > + tristate "Mediatek Device APC Support" > > + help > > + Device APC is a HW IP controlling internal device security. > > + MediaTek bus frabric provides TrustZone security support and data > > + protection to prevent slaves from being accessed by unexpected > > + bus masters. > > + Device APC prevents malicious access to internal devices. > > + > > +config DEVAPC_MT6779 > > + tristate "Mediatek MT6779 Device APC driver" > > + select MTK_DEVAPC > > + help > > + Say yes here to enable support Mediatek MT6779 Device APC driver. > > + This driver mainly used to handle the violation with 1 DEVAPC AO/PDs. > > + The violation information are logged for further analysis or > > + countermeasures. > > diff --git a/drivers/soc/mediatek/devapc/Makefile b/drivers/soc/mediatek/devapc/Makefile > > new file mode 100644 > > index 0000000..0336c1d > > --- /dev/null > > +++ b/drivers/soc/mediatek/devapc/Makefile > > @@ -0,0 +1,10 @@ > > +# SPDX-License-Identifier: GPL-2.0 > > + > > +ifeq ($(CONFIG_MTK_GCOV_KERNEL),y) > > +GCOV_PROFILE := y > > +endif > > + > > +obj-$(CONFIG_MTK_DEVAPC) := devapc.o > > + > > +# Platform > > +devapc-$(CONFIG_DEVAPC_MT6779) += devapc-mt6779.o > > diff --git a/drivers/soc/mediatek/devapc/devapc-mt6779.c b/drivers/soc/mediatek/devapc/devapc-mt6779.c > > new file mode 100644 > > index 0000000..a28b9f3 > > --- /dev/null > > +++ b/drivers/soc/mediatek/devapc/devapc-mt6779.c > > @@ -0,0 +1,1111 @@ > > +// SPDX-License-Identifier: GPL-2.0 > > +/* > > + * Copyright (C) 2020 MediaTek Inc. > > + */ > > + > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > + > > +#include "devapc-mt6779.h" > > + > > +static struct mtk_device_info mt6779_devices_infra[] = { > > Looks like a candidate to put into the *.h file. > should be okay. > > + /* sys_idx, ctrl_idx, vio_idx */ > > + /* 0 */ > > + {0, 0, 0}, > > + {0, 1, 1}, > > + {0, 2, 2}, > > + {0, 3, 3}, > > + {0, 4, 4}, > > + {0, 5, 5}, > > + {0, 6, 6}, > > + {0, 7, 7}, > > + {0, 8, 8}, > > + {0, 9, 9}, > > + > > + /* 10 */ > > + {0, 10, 10}, > > + {0, 11, 11}, > > + {0, 12, 12}, > > + {0, 13, 13}, > > + {0, 14, 14}, > > + {0, 15, 15}, > > + {0, 16, 16}, > > + {0, 17, 17}, > > + {0, 18, 18}, > > + {0, 19, 19}, > > + > > + /* 20 */ > > + {0, 20, 20}, > > + {0, 21, 21}, > > + {0, 22, 22}, > > + {0, 23, 23}, > > + {0, 24, 24}, > > + {0, 25, 25}, > > + {0, 26, 26}, > > + {0, 27, 27}, > > + {0, 28, 28}, > > + {0, 29, 29}, > > + > > + /* 30 */ > > + {0, 30, 30}, > > + {0, 31, 31}, > > + {0, 32, 32}, > > + {0, 33, 77}, > > + {0, 34, 78}, > > + {0, 35, 79}, > > + {0, 35, 80}, > > + {0, 37, 37}, > > + {0, 38, 38}, > > + {0, 39, 39}, > > + > > + /* 40 */ > > + {0, 40, 40}, > > + {0, 41, 41}, > > + {0, 42, 42}, > > + {0, 43, 43}, > > + {0, 44, 44}, > > + {0, 45, 45}, > > + {0, 46, 46}, > > + {0, 47, 47}, > > + {0, 48, 48}, > > + {0, 49, 49}, > > + > > + /* 50 */ > > + {0, 50, 50}, > > + {0, 51, 51}, > > + {0, 52, 52}, > > + {0, 53, 53}, > > + {0, 54, 54}, > > + {0, 55, 55}, > > + {0, 56, 56}, > > + {0, 57, 57}, > > + {0, 58, 58}, > > + {0, 59, 59}, > > + > > + /* 60 */ > > + {0, 60, 60}, > > + {0, 61, 61}, > > + {0, 62, 62}, > > + {0, 63, 63}, > > + {0, 64, 64}, > > + {0, 65, 70}, > > + {0, 66, 71}, > > + {0, 67, 72}, > > + {0, 68, 73}, > > + {0, 70, 81}, > > + > > + /* 70 */ > > + {0, 71, 82}, > > + {0, 72, 83}, > > + {0, 73, 84}, > > + {0, 74, 85}, > > + {0, 75, 86}, > > + {0, 76, 87}, > > + {0, 77, 88}, > > + {0, 78, 89}, > > + {0, 79, 90}, > > + {0, 80, 91}, > > + > > + /* 80 */ > > + {0, 81, 92}, > > + {0, 82, 93}, > > + {0, 83, 94}, > > + {0, 84, 95}, > > + {0, 85, 96}, > > + {0, 86, 97}, > > + {0, 87, 98}, > > + {0, 88, 99}, > > + {0, 89, 100}, > > + {0, 90, 101}, > > + > > + /* 90 */ > > + {0, 91, 102}, > > + {0, 92, 103}, > > + {0, 93, 104}, > > + {0, 94, 105}, > > + {0, 95, 106}, > > + {0, 96, 107}, > > + {0, 97, 108}, > > + {0, 98, 109}, > > + {0, 110, 110}, > > + {0, 111, 111}, > > + > > + /* 100 */ > > Comments maybe not needed, at least of added, they should represent the code. This comments represent index of mt6779_devices_infra. It's helpful to check total numbers of slaves. > > > + {0, 112, 112}, > > + {0, 113, 113}, > > + {0, 114, 114}, > > + {0, 115, 115}, > > + {0, 116, 116}, > > + {0, 117, 117}, > > + {0, 118, 118}, > > + {0, 119, 119}, > > + {0, 120, 120}, > > + {0, 121, 121}, > > + > > + /* 110 */ > > + {0, 122, 122}, > > + {0, 123, 123}, > > + {0, 124, 124}, > > + {0, 125, 125}, > > + {0, 126, 126}, > > + {0, 127, 127}, > > + {0, 128, 128}, > > + {0, 129, 129}, > > + {0, 130, 130}, > > + {0, 131, 131}, > > + > > + /* 120 */ > > + {0, 132, 132}, > > + {0, 133, 133}, > > + {0, 134, 134}, > > + {0, 135, 135}, > > + {0, 136, 136}, > > + {0, 137, 137}, > > + {0, 138, 138}, > > + {0, 139, 139}, > > + {0, 140, 140}, > > + {0, 141, 141}, > > + > > + /* 130 */ > > + {0, 142, 142}, > > + {0, 143, 143}, > > + {0, 144, 144}, > > + {0, 145, 145}, > > + {0, 146, 146}, > > + {0, 147, 147}, > > + {0, 148, 148}, > > + {0, 149, 149}, > > + {0, 150, 150}, > > + {0, 151, 151}, > > + > > + /* 140 */ > > + {0, 152, 152}, > > + {0, 153, 153}, > > + {0, 154, 154}, > > + {0, 155, 155}, > > + {0, 156, 156}, > > + {0, 157, 157}, > > + {0, 158, 158}, > > + {0, 159, 159}, > > + {0, 160, 160}, > > + {0, 161, 161}, > > + > > + /* 150 */ > > + {0, 162, 162}, > > + {0, 163, 163}, > > + {0, 164, 164}, > > + {0, 165, 165}, > > + {0, 166, 166}, > > + {0, 167, 167}, > > + {0, 168, 168}, > > + {0, 169, 169}, > > + {0, 170, 170}, > > + {0, 171, 171}, > > + > > + /* 160 */ > > + {0, 172, 172}, > > + {0, 173, 173}, > > + {0, 174, 174}, > > + {0, 175, 175}, > > + {0, 176, 176}, > > + {0, 177, 177}, > > + {0, 178, 178}, > > + {0, 179, 179}, > > + {0, 180, 180}, > > + {0, 181, 181}, > > + > > + /* 170 */ > > + {0, 182, 182}, > > + {0, 183, 183}, > > + {0, 184, 184}, > > + {0, 185, 185}, > > + {0, 186, 186}, > > + {0, 187, 187}, > > + {0, 188, 188}, > > + {0, 189, 189}, > > + {0, 190, 190}, > > + {0, 191, 191}, > > + > > + /* 180 */ > > + {0, 192, 192}, > > + {0, 193, 193}, > > + {0, 194, 194}, > > + {0, 195, 195}, > > + {0, 196, 196}, > > + {0, 197, 197}, > > + {0, 198, 198}, > > + {0, 199, 199}, > > + {0, 200, 200}, > > + {0, 201, 201}, > > + > > + /* 190 */ > > + {0, 202, 202}, > > + {0, 203, 203}, > > + {0, 204, 204}, > > + {0, 205, 205}, > > + {0, 206, 206}, > > + {0, 207, 207}, > > + {0, 208, 208}, > > + {0, 209, 209}, > > + {0, 210, 210}, > > + {0, 211, 211}, > > + > > + /* 200 */ > > + {0, 212, 212}, > > + {0, 213, 213}, > > + {0, 214, 214}, > > + {0, 215, 215}, > > + {0, 216, 216}, > > + {0, 217, 217}, > > + {0, 218, 218}, > > + {0, 219, 219}, > > + {0, 220, 220}, > > + {0, 221, 221}, > > + > > + /* 210 */ > > + {0, 222, 222}, > > + {0, 223, 223}, > > + {0, 224, 224}, > > + {0, 225, 225}, > > + {0, 226, 226}, > > + {0, 227, 227}, > > + {0, 228, 228}, > > + {0, 229, 229}, > > + {0, 230, 230}, > > + {0, 231, 231}, > > + > > + /* 220 */ > > + {1, 0, 232}, > > + {1, 1, 233}, > > + {1, 2, 234}, > > + {1, 3, 235}, > > + {1, 4, 236}, > > + {1, 5, 237}, > > + {1, 6, 238}, > > + {1, 7, 239}, > > + {1, 8, 240}, > > + {1, 9, 241}, > > + > > + /* 230 */ > > + {1, 10, 242}, > > + {1, 11, 243}, > > + {1, 12, 244}, > > + {1, 13, 245}, > > + {1, 14, 246}, > > + {1, 15, 247}, > > + {1, 16, 248}, > > + {1, 17, 249}, > > + {1, 18, 250}, > > + {1, 19, 251}, > > + > > + /* 240 */ > > + {1, 20, 252}, > > + {1, 21, 253}, > > + {1, 22, 254}, > > + {1, 23, 255}, > > + {1, 24, 256}, > > + {1, 25, 257}, > > + {1, 26, 258}, > > + {1, 27, 259}, > > + {1, 28, 260}, > > + {1, 29, 261}, > > + > > + /* 250 */ > > + {1, 30, 262}, > > + {1, 31, 263}, > > + {1, 32, 264}, > > + {1, 33, 265}, > > + {1, 34, 266}, > > + {1, 35, 267}, > > + {1, 36, 268}, > > + {1, 37, 269}, > > + {1, 38, 270}, > > + {1, 39, 271}, > > + > > + /* 260 */ > > + {1, 40, 272}, > > + {1, 41, 273}, > > + {1, 42, 274}, > > + {1, 43, 275}, > > + {1, 44, 276}, > > + {1, 45, 277}, > > + {1, 46, 278}, > > + {1, 47, 279}, > > + {1, 48, 280}, > > + {1, 49, 281}, > > + > > + /* 270 */ > > + {1, 50, 282}, > > + {1, 51, 283}, > > + {1, 52, 284}, > > + {1, 53, 285}, > > + {1, 54, 286}, > > + {1, 55, 287}, > > + {1, 56, 288}, > > + {1, 57, 289}, > > + {1, 58, 290}, > > + {1, 59, 291}, > > + > > + /* 280 */ > > + {1, 60, 292}, > > + {1, 61, 293}, > > + {1, 62, 294}, > > + {1, 63, 295}, > > + {1, 64, 296}, > > + {1, 65, 297}, > > + {1, 66, 298}, > > + {1, 67, 299}, > > + {1, 68, 300}, > > + {1, 69, 301}, > > + > > + /* 290 */ > > + {1, 70, 302}, > > + {1, 71, 303}, > > + {1, 72, 304}, > > + {1, 73, 305}, > > + {1, 74, 306}, > > + {1, 75, 307}, > > + {1, 76, 308}, > > + {1, 77, 309}, > > + {1, 78, 310}, > > + {1, 79, 311}, > > + > > + /* 300 */ > > + {1, 80, 312}, > > + {1, 81, 313}, > > + {1, 82, 314}, > > + {1, 83, 315}, > > + {1, 84, 316}, > > + {1, 85, 317}, > > + {1, 86, 318}, > > + {1, 87, 319}, > > + {1, 88, 320}, > > + {1, 89, 321}, > > + > > + /* 310 */ > > + {1, 90, 322}, > > + {1, 91, 323}, > > + {1, 92, 324}, > > + {1, 93, 325}, > > + {1, 94, 326}, > > + {1, 95, 327}, > > + {1, 96, 328}, > > + {1, 97, 329}, > > + {1, 98, 330}, > > + {1, 99, 331}, > > + > > + /* 320 */ > > + {1, 100, 332}, > > + {1, 101, 333}, > > + {1, 102, 334}, > > + {1, 103, 335}, > > + {1, 104, 336}, > > + {1, 105, 337}, > > + {1, 106, 338}, > > + {1, 107, 339}, > > + {1, 108, 340}, > > + {1, 109, 341}, > > + > > + /* 330 */ > > + {1, 110, 342}, > > + {1, 111, 343}, > > + {1, 112, 344}, > > + {1, 113, 345}, > > + {1, 114, 346}, > > + {1, 115, 347}, > > + {1, 116, 348}, > > + {1, 117, 349}, > > + {1, 118, 350}, > > + {1, 119, 351}, > > + > > + /* 340 */ > > + {1, 120, 352}, > > + {1, 121, 353}, > > + {1, 122, 354}, > > + {1, 123, 355}, > > + {1, 124, 356}, > > + {1, 125, 357}, > > + {1, 126, 358}, > > + {1, 127, 359}, > > + {1, 128, 360}, > > + {1, 129, 361}, > > + > > + /* 350 */ > > + {1, 130, 362}, > > + {1, 131, 363}, > > + {1, 132, 364}, > > + {1, 133, 365}, > > + {1, 134, 366}, > > + {1, 135, 367}, > > + {1, 136, 368}, > > + {1, 137, 369}, > > + {1, 138, 370}, > > + {1, 139, 371}, > > + > > + /* 360 */ > > + {1, 140, 372}, > > + {1, 141, 373}, > > + {1, 142, 374}, > > + {1, 143, 375}, > > + {1, 144, 376}, > > + {1, 145, 377}, > > + {1, 146, 378}, > > + {1, 147, 379}, > > + {1, 148, 380}, > > + {1, 149, 381}, > > + > > + /* 370 */ > > + {1, 150, 382}, > > + {1, 151, 383}, > > + {1, 152, 384}, > > + {1, 153, 385}, > > + {1, 154, 386}, > > + {1, 155, 387}, > > + {1, 156, 388}, > > + {1, 157, 389}, > > + {1, 158, 390}, > > + {1, 159, 391}, > > + > > + /* 380 */ > > + {1, 160, 392}, > > + {1, 161, 393}, > > + {1, 162, 394}, > > + {1, 163, 395}, > > + {1, 164, 396}, > > + {1, 165, 397}, > > + {1, 166, 398}, > > + {1, 167, 399}, > > + {1, 168, 400}, > > + {1, 169, 401}, > > + > > + /* 390 */ > > + {1, 170, 402}, > > + {1, 171, 403}, > > + {1, 172, 404}, > > + {1, 173, 405}, > > + {1, 174, 406}, > > + {1, 175, 407}, > > + {1, 176, 408}, > > + {1, 177, 409}, > > + {1, 178, 410}, > > + {1, 179, 411}, > > + > > + /* 400 */ > > + {1, 180, 412}, > > + {1, 181, 413}, > > + {1, 182, 414}, > > + {1, 183, 415}, > > + {1, 184, 416}, > > + {1, 185, 417}, > > + {1, 186, 418}, > > + {1, 187, 419}, > > + {1, 188, 420}, > > + {1, 189, 421}, > > + > > + /* 410 */ > > + {1, 190, 422}, > > + {1, 191, 423}, > > + {1, 192, 424}, > > + {1, 193, 425}, > > + {1, 194, 426}, > > + {1, 195, 427}, > > + {1, 196, 428}, > > + {1, 197, 429}, > > + {1, 198, 430}, > > + {1, 199, 431}, > > + > > + /* 420 */ > > + {1, 200, 432}, > > + {1, 201, 433}, > > + {1, 202, 434}, > > + {1, 203, 435}, > > + {1, 204, 436}, > > + {1, 205, 437}, > > + {1, 206, 438}, > > + {1, 207, 439}, > > + {1, 208, 440}, > > + {1, 209, 441}, > > + > > + /* 430 */ > > + {1, 210, 442}, > > + {1, 211, 443}, > > + {1, 212, 444}, > > + {1, 213, 445}, > > + {1, 214, 446}, > > + {1, 215, 447}, > > + {1, 216, 448}, > > + {1, 217, 449}, > > + {1, 218, 450}, > > + {1, 219, 451}, > > + > > + /* 440 */ > > + {1, 220, 452}, > > + {1, 221, 453}, > > + {1, 222, 454}, > > + {1, 223, 455}, > > + {1, 224, 456}, > > + {1, 225, 457}, > > + {1, 226, 458}, > > + {1, 227, 459}, > > + {1, 228, 460}, > > + {1, 229, 461}, > > + > > + /* 450 */ > > + {1, 230, 462}, > > + {1, 231, 463}, > > + {1, 232, 464}, > > + {1, 233, 465}, > > + {1, 234, 466}, > > + {1, 235, 467}, > > + {1, 236, 468}, > > + {1, 237, 469}, > > + {1, 238, 470}, > > + {1, 239, 471}, > > + > > + /* 460 */ > > + {1, 240, 472}, > > + {1, 241, 473}, > > + {1, 242, 474}, > > + {1, 243, 475}, > > + {1, 244, 476}, > > + {1, 245, 477}, > > + {1, 246, 478}, > > + {-1, -1, 479}, > > + {-1, -1, 480}, > > + {-1, -1, 481}, > > + > > + /* 470 */ > > + {-1, -1, 482}, > > + {-1, -1, 483}, > > + {-1, -1, 484}, > > + {-1, -1, 485}, > > + {-1, -1, 486}, > > + {-1, -1, 487}, > > + {-1, -1, 488}, > > + {-1, -1, 489}, > > + {-1, -1, 490}, > > + {-1, -1, 491}, > > + > > + /* 480 */ > > + {-1, -1, 492}, > > + {-1, -1, 493}, > > + {-1, -1, 494}, > > + {-1, -1, 495}, > > + {-1, -1, 496}, > > + {-1, -1, 497}, > > + {-1, -1, 498}, > > + {-1, -1, 499}, > > + {-1, -1, 500}, > > + {-1, -1, 501}, > > + > > + /* 490 */ > > + {-1, -1, 502}, > > + {-1, -1, 503}, > > + {-1, -1, 504}, > > + {-1, -1, 505}, > > + {-1, -1, 506}, > > + {-1, -1, 507}, > > + {-1, -1, 508}, > > + {-1, -1, 509}, > > + {-1, -1, 510}, > > + > > +}; > > + > > +static struct mtk_device_num mtk6779_devices_num[] = { > > + {SLAVE_TYPE_INFRA, VIO_SLAVE_NUM_INFRA}, > > +}; > > + > > +static int mtk_vio_mask_sta_num[] = { > > + VIO_MASK_STA_NUM_INFRA, > > +}; > > + > > +static const struct mtk_infra_vio_dbg_desc mt6779_vio_dbgs = { > > + .vio_dbg_mstid = INFRA_VIO_DBG_MSTID, > > + .vio_dbg_mstid_start_bit = INFRA_VIO_DBG_MSTID_START_BIT, > > + .vio_dbg_dmnid = INFRA_VIO_DBG_DMNID, > > + .vio_dbg_dmnid_start_bit = INFRA_VIO_DBG_DMNID_START_BIT, > > + .vio_dbg_w_vio = INFRA_VIO_DBG_W_VIO, > > + .vio_dbg_w_vio_start_bit = INFRA_VIO_DBG_W_VIO_START_BIT, > > + .vio_dbg_r_vio = INFRA_VIO_DBG_R_VIO, > > + .vio_dbg_r_vio_start_bit = INFRA_VIO_DBG_R_VIO_START_BIT, > > + .vio_addr_high = INFRA_VIO_ADDR_HIGH, > > + .vio_addr_high_start_bit = INFRA_VIO_ADDR_HIGH_START_BIT, > > +}; > > + > > +static const u32 mt6779_devapc_pds[] = { > > + PD_VIO_MASK_OFFSET, > > + PD_VIO_STA_OFFSET, > > + PD_VIO_DBG0_OFFSET, > > + PD_VIO_DBG1_OFFSET, > > + PD_APC_CON_OFFSET, > > + PD_SHIFT_STA_OFFSET, > > + PD_SHIFT_SEL_OFFSET, > > + PD_SHIFT_CON_OFFSET, > > +}; > > + > > +static u32 mt6779_shift_group_get(u32 vio_idx) > > +{ > > + if (vio_idx >= 0 && vio_idx <= 32) > > + return 0; > > + else if (vio_idx >= 33 && vio_idx <= 109) > > + return 1; > > + else if ((vio_idx >= 110 && vio_idx <= 121) || > > + (vio_idx >= 470 && vio_idx <= 472)) > > + return 2; > > + else if (vio_idx == 122 || vio_idx == 500) > > + return 3; > > + else if (vio_idx == 123) > > + return 4; > > + else if (vio_idx == 124) > > + return 5; > > + else if ((vio_idx >= 125 && vio_idx <= 155) || > > + (vio_idx >= 486 && vio_idx <= 488)) > > + return 6; > > + else if ((vio_idx >= 156 && vio_idx <= 157) || > > + (vio_idx >= 159 && vio_idx <= 165)) > > + return 7; > > + else if ((vio_idx >= 166 && vio_idx <= 181) || > > + (vio_idx >= 473 && vio_idx <= 475)) > > + return 8; > > + else if ((vio_idx >= 182 && vio_idx <= 197) || > > + (vio_idx >= 476 && vio_idx <= 478)) > > + return 9; > > + else if ((vio_idx >= 198 && vio_idx <= 205) || > > + (vio_idx >= 479 && vio_idx <= 481)) > > + return 10; > > + else if ((vio_idx >= 214 && vio_idx <= 229) || > > + (vio_idx >= 482 && vio_idx <= 484)) > > + return 11; > > + else if (vio_idx == 230) > > + return 12; > > + else if (vio_idx == 158) > > + return 13; > > + else if (vio_idx == 231 || vio_idx == 382) > > + return 14; > > + else if (vio_idx >= 232 && vio_idx <= 244) > > + return 15; > > + else if (vio_idx >= 245 && vio_idx <= 478) > > + return 16; > > + else if (vio_idx >= 504 && vio_idx <= 505) > > + return 17; > > + else if (vio_idx == 494) > > + return 18; > > + else if (vio_idx == 503) > > + return 19; > > + else if (vio_idx == 501) > > + return 20; > > + else if (vio_idx == 502) > > + return 21; > > + else if (vio_idx == 506) > > + return 22; > > + else if (vio_idx == 507) > > + return 23; > > + else if (vio_idx == 508) > > + return 24; > > + else if ((vio_idx >= 206 && vio_idx <= 213) || > > + (vio_idx >= 498 && vio_idx <= 500)) > > + return 25; > > + > > + return 31; > > +} > > + > > +/* > > + * mtk_devapc_pd_get - get devapc pd_types of register address. > > + * > > + * Returns the value of reg addr > > + */ > > +static void __iomem *mtk_devapc_pd_get(struct mtk_devapc_context *devapc_ctx, > > + int slave_type, > > + enum DEVAPC_PD_REG_TYPE pd_reg_type, > > + u32 index) > > +{ > > + const u32 *devapc_pds = mt6779_devapc_pds; > > + void __iomem *reg; > > + > > + reg = devapc_ctx->devapc_pd_base[slave_type] + devapc_pds[pd_reg_type]; > > + > > + if (pd_reg_type == VIO_MASK || pd_reg_type == VIO_STA) > > + reg += 0x4 * index; > > + > > + return reg; > > +} > > + > > +static int check_vio_mask_sta(struct mtk_devapc_context *devapc_ctx, > > + int slave_type, u32 module, int pd_reg_type) > > +{ > > + u32 apc_register_index, apc_set_index; > > + void __iomem *reg; > > + u32 value; > > + > > + apc_register_index = module / (MOD_NM_IN_1_DEVAPC * 2); > > + apc_set_index = module % (MOD_NM_IN_1_DEVAPC * 2); > > + > > + if (apc_register_index < mtk_vio_mask_sta_num[slave_type]) > > + reg = mtk_devapc_pd_get(devapc_ctx, slave_type, pd_reg_type, > > + apc_register_index); > > + else > > + return -EOVERFLOW; > > How could that happen? > Currently, all components are inside this driver. This is not necessary at all. I'll remove it. > > + > > + value = (readl(reg) & (0x1 << apc_set_index)) >> apc_set_index; > > + > > + return value; > > value = readl(reg); > return ((value >> apc_set_index) & 0x1); Is it for readability? > > > > +} > > + > > +static int check_vio_mask(struct mtk_devapc_context *devapc_ctx, int slave_type, > > + u32 module) > > +{ > > + return check_vio_mask_sta(devapc_ctx, slave_type, module, VIO_MASK); > > +} > > + > > +static int check_vio_status(struct mtk_devapc_context *devapc_ctx, > > + int slave_type, u32 module) > > +{ > > + return check_vio_mask_sta(devapc_ctx, slave_type, module, VIO_STA); > > +} > > + > > +static void clear_vio_status(struct mtk_devapc_context *devapc_ctx, > > + int slave_type, u32 module) > > +{ > > + u32 apc_register_index, apc_set_index; > > + void __iomem *reg; > > + > > + apc_register_index = module / (MOD_NM_IN_1_DEVAPC * 2); > > + apc_set_index = module % (MOD_NM_IN_1_DEVAPC * 2); > > What does MOD_NM_IN_1_DEVAPC stands for? Why do you define it with 16 when > afterwards you only use it with value 32? Do I understand correctly that this > calculates the register offset and bit in the register to write to? Yes! Each module violation index stands for 1 bit, so there are 32 modules in 1 devapc register. I think MOD_NUM_IN_1_DEVAPC is not necessary, I'll remove it and hardcode "32" for this calculation. > > > + > > + if (apc_register_index < mtk_vio_mask_sta_num[slave_type]) { > > mtk_vio_mask_sta_num[slave_type] == maximum of registers that can be accessed? Yap. This code is not necessary. Ditto. > > > + reg = mtk_devapc_pd_get(devapc_ctx, slave_type, VIO_STA, > > + apc_register_index); > > + writel(0x1 << apc_set_index, reg); > > + > > + } else { > > + pr_err(PFX "%s: Out Of Boundary, slave_type:0x%x, module_index:0x%x\n", > > + __func__, slave_type, module); > > Only used internally by the driver, why can't we suppose that the driver does > not implement module number outside of the accessible registers? I think this > can be dropped. > Ditto > > + return; > > + } > > + > > + if (check_vio_status(devapc_ctx, slave_type, module)) > > + pr_err(PFX "%s: Clear failed, slave_type:0x%x, module_index:0x%x\n", > > + __func__, slave_type, module); > > +} > > + > > +static void mask_module_irq(struct mtk_devapc_context *devapc_ctx, > > + int slave_type, u32 module, bool mask) > > +{ > > + u32 apc_register_index, apc_set_index; > > + void __iomem *reg; > > + > > + apc_register_index = module / (MOD_NM_IN_1_DEVAPC * 2); > > + apc_set_index = module % (MOD_NM_IN_1_DEVAPC * 2); > > Better add a macro for this and rename set_index into register_offset? I agree. Do you suggest to include variable declaration into marco? Or just calculation only? > > > + > > + if (apc_register_index < mtk_vio_mask_sta_num[slave_type]) { > > + reg = mtk_devapc_pd_get(devapc_ctx, slave_type, VIO_MASK, > > + apc_register_index); > > I don't like this code all over the place, could add the correct offset to > mtk_device_info and just add it in readl/writel directly? Ditto. > > > + > > + if (mask) > > + writel(readl(reg) | (1 << apc_set_index), reg); > > + else > > + writel(readl(reg) & (~(1 << apc_set_index)), reg); > > value = readl(reg); > > if (mask) > value |= (0x1 << apc_set_index); > else > value &= ~(0x1 << apc_set_index); > > writel(value); > Is it for readability? > > + > > + } else { > > + pr_err(PFX "%s: Out Of Boundary, slave_type:0x%x, module_index:0x%x, mask:%s\n", > > + __func__, slave_type, module, mask ? "true" : "false"); > > + } > > +} > > + > > +/* > > + * sync_vio_dbg - start to get violation information by selecting violation > > + * group and enable violation shift. > > + * > > + * Returns sync done or not > > + */ > > +static u32 sync_vio_dbg(struct mtk_devapc_context *devapc_ctx, int slave_type, > > + u32 shift_bit) > > +{ > > + void __iomem *pd_vio_shift_sta_reg; > > + void __iomem *pd_vio_shift_sel_reg; > > + void __iomem *pd_vio_shift_con_reg; > > + u32 shift_count; > > + u32 sync_done; > > + > > + pd_vio_shift_sta_reg = mtk_devapc_pd_get(devapc_ctx, slave_type, > > + VIO_SHIFT_STA, 0); > > + pd_vio_shift_sel_reg = mtk_devapc_pd_get(devapc_ctx, slave_type, > > + VIO_SHIFT_SEL, 0); > > + pd_vio_shift_con_reg = mtk_devapc_pd_get(devapc_ctx, slave_type, > > + VIO_SHIFT_CON, 0); > > + > > + writel(0x1 << shift_bit, pd_vio_shift_sel_reg); > > + writel(0x1, pd_vio_shift_con_reg); > > + > > + for (shift_count = 0; (shift_count < 100) && > > + ((readl(pd_vio_shift_con_reg) & 0x3) != 0x3); > > + ++shift_count) > > Use read_poll_timeout here, we don't want to depend on the time 100 reads need, > as from my understanding this depends on the (dynamic) clock frequency. > Okay, I'll try read_poll_timeout here. > > + ; > > + > > + if ((readl(pd_vio_shift_con_reg) & 0x3) == 0x3) > > We can read the value via readl_poll_timeout. No need to read it again here. Ditto. > > > + sync_done = 1; > > + else > > + sync_done = 0; > > + > > + /* Disable shift mechanism */ > > What is the "shift mechanism"? "shift mechanism" is depends on devapc hardware design. We set multiple slaves as a group. When violation is triggered, violation information is kept inside hardware. (Cannot get full information from registers.) We have to do "shift mechanism" to shift violation information to VIO_DBG0, VIO_DBG1 registers. You can see we have to do sync_vio_dbg() before getting full violation information (devapc_extract_vio_dbg()). > > > + writel(0x0, pd_vio_shift_con_reg); > > + writel(0x0, pd_vio_shift_sel_reg); > > + writel(0x1 << shift_bit, pd_vio_shift_sta_reg); > > + > > + return sync_done; > > +} > > + > > +static void devapc_vio_info_print(struct mtk_devapc_context *devapc_ctx) > > +{ > > + struct mtk_devapc_vio_info *vio_info = devapc_ctx->vio_info; > > + > > + /* Print violation information */ > > + if (vio_info->write) > > + pr_info(PFX "Write Violation\n"); > > + else if (vio_info->read) > > + pr_info(PFX "Read Violation\n"); > > + > > + pr_info(PFX "%s%x, %s%x, %s%x, %s%x\n", > > + "Vio Addr:0x", vio_info->vio_addr, > > + "High:0x", vio_info->vio_addr_high, > > + "Bus ID:0x", vio_info->master_id, > > + "Dom ID:0x", vio_info->domain_id); > > +} > > + > > +static void devapc_extract_vio_dbg(struct mtk_devapc_context *devapc_ctx, > > + int slave_type) > > +{ > > + void __iomem *vio_dbg0_reg, *vio_dbg1_reg; > > + const struct mtk_infra_vio_dbg_desc *vio_dbgs; > > + struct mtk_devapc_vio_info *vio_info; > > + u32 dbg0; > > + > > + vio_dbg0_reg = mtk_devapc_pd_get(devapc_ctx, slave_type, VIO_DBG0, 0); > > + vio_dbg1_reg = mtk_devapc_pd_get(devapc_ctx, slave_type, VIO_DBG1, 0); > > + > > + vio_dbgs = &mt6779_vio_dbgs; > > + vio_info = devapc_ctx->vio_info; > > + > > + /* Extract violation information */ > > + dbg0 = readl(vio_dbg0_reg); > > + vio_info->vio_addr = readl(vio_dbg1_reg); > > + > > + vio_info->master_id = (dbg0 & vio_dbgs->vio_dbg_mstid) >> > > + vio_dbgs->vio_dbg_mstid_start_bit; > > + vio_info->domain_id = (dbg0 & vio_dbgs->vio_dbg_dmnid) >> > > + vio_dbgs->vio_dbg_dmnid_start_bit; > > + vio_info->write = ((dbg0 & vio_dbgs->vio_dbg_w_vio) >> > > + vio_dbgs->vio_dbg_w_vio_start_bit) == 1; > > + vio_info->read = ((dbg0 & vio_dbgs->vio_dbg_r_vio) >> > > + vio_dbgs->vio_dbg_r_vio_start_bit) == 1; > > We can have read and write violation at a time? No, but it keeps independently. > > > + vio_info->vio_addr_high = (dbg0 & vio_dbgs->vio_addr_high) >> > > + vio_dbgs->vio_addr_high_start_bit; > > + > > + devapc_vio_info_print(devapc_ctx); > > +} > > + > > +/* > > + * mtk_devapc_dump_vio_dbg - shift & dump the violation debug information. > > + */ > > +static bool mtk_devapc_dump_vio_dbg(struct mtk_devapc_context *devapc_ctx, > > + int slave_type, int *vio_idx, int *index) > > +{ > > + const struct mtk_device_info **device_info; > > + const struct mtk_device_num *ndevices; > > + void __iomem *pd_vio_shift_sta_reg; > > + u32 shift_bit; > > + int i; > > + > > + if (!vio_idx) > > + return NULL; > > + > > + device_info = devapc_ctx->device_info; > > + ndevices = mtk6779_devices_num; > > + > > + pd_vio_shift_sta_reg = mtk_devapc_pd_get(devapc_ctx, slave_type, > > + VIO_SHIFT_STA, 0); > > + > > + for (i = 0; i < ndevices[slave_type].vio_slave_num; i++) { > > + *vio_idx = device_info[slave_type][i].vio_index; > > + > > + if (check_vio_mask(devapc_ctx, slave_type, *vio_idx)) > > + continue; > > + > > + if (check_vio_status(devapc_ctx, slave_type, *vio_idx) <= 0) > > + continue; > > + > > + shift_bit = mt6779_shift_group_get(*vio_idx); > > shift_bit should be part of mtk_device_info data structure. > You can create two macros to define mtk_device_info entries, one which sets the > shift bit to 31 and another one, that allows for setting the bit explicitely. This is another way to get shift bit. What benefit could we get? I could only imagine array indexing is more efficient than function call. But we do not really care the performance impact since the violation scenario is unexpected. > > > + > > + if (!sync_vio_dbg(devapc_ctx, slave_type, shift_bit)) > > + continue; > > + > > + devapc_extract_vio_dbg(devapc_ctx, slave_type); > > + *index = i; > > + > > + return true; > > + } > > + > > + return false; > > +} > > + > > +/* > > + * devapc_violation_irq - the devapc Interrupt Service Routine (ISR) will dump > > + * violation information including which master violates > > + * access slave. > > + */ > > +static irqreturn_t devapc_violation_irq(int irq_number, > > + struct mtk_devapc_context *devapc_ctx) > > +{ > > + const struct mtk_device_info **device_info = devapc_ctx->device_info; > > + int vio_idx = -1; > > + int index = -1; > > + int slave_type; > > + > > + for (slave_type = 0; slave_type < SLAVE_TYPE_NUM; slave_type++) { > > + if (!mtk_devapc_dump_vio_dbg(devapc_ctx, slave_type, &vio_idx, > > + &index)) > > + continue; > > + > > + /* Ensure that violation info are written before > > + * further operations > > + */ > > + smp_mb(); > > + > > + mask_module_irq(devapc_ctx, slave_type, vio_idx, true); > > + > > + clear_vio_status(devapc_ctx, slave_type, vio_idx); > > + > > + pr_info(PFX "Violation - slave_type:0x%x, sys_index:0x%x, ctrl_index:0x%x, vio_index:0x%x\n", > > + slave_type, > > + device_info[slave_type][index].sys_index, > > + device_info[slave_type][index].ctrl_index, > > + device_info[slave_type][index].vio_index); > > How will that then be used? Will there some kind of user-space daemon which will > parse the kernel log to see if a violation happens? What will it do with this > information? > > I still don't understand why we need to do that in the kernel instead of in > TF-A. Can you please explain? > We would do different extra handle for different bus masters internally. Basically, different bus masters have different debug mechanism. And different customers have different severity about devapc violation. For example, kernel exception, external exception, warning, don't care,... I list 2 reason why I put it in kernel instead of ATF. 1. Rich OS such as Linux kernel has more debug mechanism and tools to find murderer. 2. If interrupt has to be handled in ATF, GIC intr would be set as G0S (Group 0 Secure). For our interrupt routing, G0S intr would be fiq. When we handle it in EL3, it would mask all EL1 irq temporarily. We do not treat devapc interrupt as such critical. Doe it make sense? Or do you have any reason that it should be handled in ATF? > > > + > > + mask_module_irq(devapc_ctx, slave_type, vio_idx, false); > > + } > > + > > + return IRQ_HANDLED; > > +} > > + > > +/* > > + * start_devapc - initialize devapc status and start receiving interrupt > > + * while devapc violation is triggered. > > + */ > > +static void start_devapc(struct mtk_devapc_context *devapc_ctx) > > +{ > > + const struct mtk_device_info **device_info; > > + const struct mtk_device_num *ndevices; > > + void __iomem *pd_vio_shift_sta_reg; > > + void __iomem *pd_apc_con_reg; > > + int slave_type, vio_idx, i; > > + u32 vio_shift_sta; > > + > > + devapc_ctx->device_info[0] = mt6779_devices_infra; > > One element arry should be a simple pointer. > mt6779_devices_infra should be DT data for the mt6779 compatible. Yes, you are right. It's no need to use element array. I'll try it could put into DT data or not. > > > + device_info = devapc_ctx->device_info; > > + ndevices = mtk6779_devices_num; > > + > > + for (slave_type = 0; slave_type < SLAVE_TYPE_NUM; slave_type++) { > > For loop not needed, we ony have one SLAVE_TYPE. Yes, I'll fix it. > > > + pd_apc_con_reg = mtk_devapc_pd_get(devapc_ctx, slave_type, > > + APC_CON, 0); > > + pd_vio_shift_sta_reg = mtk_devapc_pd_get(devapc_ctx, slave_type, > > + VIO_SHIFT_STA, 0); > > + > > + if (!pd_apc_con_reg || !pd_vio_shift_sta_reg) > > + return; > > + > > + /* Clear devapc violation status */ > > + writel(BIT(31), pd_apc_con_reg); > > + > > + /* Clear violation shift status */ > > + vio_shift_sta = readl(pd_vio_shift_sta_reg); > > + if (vio_shift_sta) > > + writel(vio_shift_sta, pd_vio_shift_sta_reg); > > + > > + /* Clear slave violation status */ > > + for (i = 0; i < ndevices[slave_type].vio_slave_num; i++) { > > + vio_idx = device_info[slave_type][i].vio_index; > > + > > + clear_vio_status(devapc_ctx, slave_type, vio_idx); > > + > > + mask_module_irq(devapc_ctx, slave_type, vio_idx, false); > > + } > > + } > > +} > > + > > +static int mt6779_devapc_probe(struct platform_device *pdev) > > +{ > > + struct device_node *node = pdev->dev.of_node; > > + struct mtk_devapc_context *devapc_ctx; > > + struct clk *devapc_infra_clk; > > + u32 devapc_irq; > > + int ret; > > + > > + if (IS_ERR(node)) > > + return -ENODEV; > > + > > + devapc_ctx = devm_kzalloc(&pdev->dev, sizeof(struct mtk_devapc_context), > > + GFP_KERNEL); > > + if (!devapc_ctx) > > + return -ENOMEM; > > + > > + devapc_ctx->vio_info = devm_kzalloc(&pdev->dev, > > + sizeof(struct mtk_devapc_vio_info), > > + GFP_KERNEL); > > + if (!devapc_ctx->vio_info) > > + return -ENOMEM; > > + > > + devapc_ctx->devapc_pd_base[0] = of_iomap(node, 0); > > No array needed, we only have one element... Ditto. > > > + if (!devapc_ctx->devapc_pd_base[0]) > > + return -EINVAL; > > + > > + devapc_irq = irq_of_parse_and_map(node, 0); > > + if (!devapc_irq) > > + return -EINVAL; > > + > > + devapc_infra_clk = devm_clk_get(&pdev->dev, "devapc-infra-clock"); > > + > > No new line here, please check conding style and apply to all the code. Yes, I'll fix it. > > > + if (IS_ERR(devapc_infra_clk)) > > + return -EINVAL; > > + > > + if (clk_prepare_enable(devapc_infra_clk)) > > + return -EINVAL; > > + > > + start_devapc(devapc_ctx); > > + > > + ret = devm_request_irq(&pdev->dev, devapc_irq, > > + (irq_handler_t)devapc_violation_irq, > > + IRQF_TRIGGER_NONE, "devapc", devapc_ctx); > > + if (ret) > > + return ret; > > + > > + return 0; > > +} > > + > > +static int mt6779_devapc_remove(struct platform_device *dev) > > +{ > > + return 0; > > +} > > + > > +static const struct of_device_id mt6779_devapc_dt_match[] = { > > + { .compatible = "mediatek,mt6779-devapc" }, > > + {}, > > +}; > > + > > +static struct platform_driver mt6779_devapc_driver = { > > + .probe = mt6779_devapc_probe, > > + .remove = mt6779_devapc_remove, > > + .driver = { > > + .name = KBUILD_MODNAME, > > + .of_match_table = mt6779_devapc_dt_match, > > + }, > > +}; > > + > > +module_platform_driver(mt6779_devapc_driver); > > + > > +MODULE_DESCRIPTION("Mediatek MT6779 Device APC Driver"); > > +MODULE_AUTHOR("Neal Liu "); > > +MODULE_LICENSE("GPL"); > > diff --git a/drivers/soc/mediatek/devapc/devapc-mt6779.h b/drivers/soc/mediatek/devapc/devapc-mt6779.h > > new file mode 100644 > > index 0000000..8c0e4e7 > > --- /dev/null > > +++ b/drivers/soc/mediatek/devapc/devapc-mt6779.h > > @@ -0,0 +1,99 @@ > > +/* SPDX-License-Identifier: GPL-2.0 */ > > +/* > > + * Copyright (C) 2020 MediaTek Inc. > > + */ > > + > > +#ifndef __DEVAPC_MT6779_H__ > > +#define __DEVAPC_MT6779_H__ > > + > > +#define PFX "[DEVAPC]: " > > +#define MOD_NM_IN_1_DEVAPC 16 > > + > > +enum DEVAPC_SLAVE_TYPE { > > + SLAVE_TYPE_INFRA = 0, > > + SLAVE_TYPE_NUM, > > +}; > > + > > +enum DEVAPC_PD_REG_TYPE { > > + VIO_MASK = 0, > > + VIO_STA, > > + VIO_DBG0, > > + VIO_DBG1, > > + APC_CON, > > + VIO_SHIFT_STA, > > + VIO_SHIFT_SEL, > > + VIO_SHIFT_CON, > > + PD_REG_TYPE_NUM, > > +}; > > + > > +enum DEVAPC_VIO_MASK_STA_NUM { > > + VIO_MASK_STA_NUM_INFRA = 17, > > #define instead of enum Okay, I'll fix it. Put it into DT data might be better way. > > > +}; > > + > > +enum DEVAPC_VIO_SLAVE_NUM { > > + VIO_SLAVE_NUM_INFRA = 499, > > #define instead of enum. > Ditto. > > +}; > > + > > +enum DEVAPC_PD_OFFSET { > > + PD_VIO_MASK_OFFSET = 0x0, > > + PD_VIO_STA_OFFSET = 0x400, > > + PD_VIO_DBG0_OFFSET = 0x900, > > + PD_VIO_DBG1_OFFSET = 0x904, > > + PD_APC_CON_OFFSET = 0xF00, > > + PD_SHIFT_STA_OFFSET = 0xF10, > > + PD_SHIFT_SEL_OFFSET = 0xF14, > > + PD_SHIFT_CON_OFFSET = 0xF20, > > #define instead of enum > I think this should be part of mtk_device_info on a per SoC base (provided via > DT data). > Ditto. > > +}; > > + > > +struct mtk_device_num { > > + int slave_type; > > + u32 vio_slave_num; > > +}; > > + > > +struct mtk_devapc_vio_info { > > + bool read; > > + bool write; > > + u32 vio_addr; > > + u32 vio_addr_high; > > + u32 master_id; > > + u32 domain_id; > > +}; > > + > > +struct mtk_infra_vio_dbg_desc { > > + u32 vio_dbg_mstid; > > + u8 vio_dbg_mstid_start_bit; > > + u32 vio_dbg_dmnid; > > + u8 vio_dbg_dmnid_start_bit; > > + u32 vio_dbg_w_vio; > > + u8 vio_dbg_w_vio_start_bit; > > + u32 vio_dbg_r_vio; > > + u8 vio_dbg_r_vio_start_bit; > > + u32 vio_addr_high; > > + u8 vio_addr_high_start_bit; > > +}; > > + > > +struct mtk_device_info { > > + int sys_index; > > + int ctrl_index; > > + int vio_index; > > A quick check showed me that the vio_index == the index in the array. Drop it. > No, vio_index is different from index of the array. > > +}; > > + > > +struct mtk_devapc_context { > > + void __iomem *devapc_pd_base[SLAVE_TYPE_NUM]; > > + const struct mtk_device_info *device_info[SLAVE_TYPE_NUM]; > > + struct mtk_devapc_vio_info *vio_info; > > +}; > > + > > +/* For Infra VIO_DBG */ > > +#define INFRA_VIO_DBG_MSTID 0x0000FFFF > > +#define INFRA_VIO_DBG_MSTID_START_BIT 0 > > +#define INFRA_VIO_DBG_DMNID 0x003F0000 > > +#define INFRA_VIO_DBG_DMNID_START_BIT 16 > > +#define INFRA_VIO_DBG_W_VIO 0x00400000 > > +#define INFRA_VIO_DBG_W_VIO_START_BIT 22 > > +#define INFRA_VIO_DBG_R_VIO 0x00800000 > > +#define INFRA_VIO_DBG_R_VIO_START_BIT 23 > > +#define INFRA_VIO_ADDR_HIGH 0x0F000000 > > +#define INFRA_VIO_ADDR_HIGH_START_BIT 24 > > + > > +#endif /* __DEVAPC_MT6779_H__ */ > > _______________________________________________ Linux-mediatek mailing list Linux-mediatek@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-mediatek 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=-8.2 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY,URIBL_BLOCKED, USER_AGENT_SANE_2 autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id C7340C433DF for ; Tue, 7 Jul 2020 07:34:54 +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 776C9206B6 for ; Tue, 7 Jul 2020 07:34:54 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="OUb/nU0B"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=mediatek.com header.i=@mediatek.com header.b="SPd7WdbI" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 776C9206B6 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=mediatek.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To:Date:To:From: Subject:Message-ID:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=EaTVdfwPy3eOP+nxA3sGdFRgCbsK6/Cvqv6MW2fJEjg=; b=OUb/nU0BhiI/8p9kdAcczvgIP RP182PlUUg5BAt5kLHg08YDMpGrxNI8OxQEoW81mRhIQH6otrPj5XOr9i9D3h6KbDFPwBlQjMMfcS 053Tt9lE28Pku9JLI7YkpltPCVavnAVsyxyMAM8y9xI1qMOkL8bMIPxzFPx2SS2fPWqvEGcdpjzLI Q6/t9NUVU7LuSB+FvnMdmgiyUckbarBImX202dcx3dkKaeTqsO2cTPHVACkMQOtDT7XUvMrqBzY5r vO4OV1jkSSUfxyJB+X9u0pa7x4ZD0Q/j+E94xaj6LbLpBIH0uH6gne/QebBXkTtJKPQWzG6I90cLc Td2o/fZ5g==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1jsi6G-00043Z-Ov; Tue, 07 Jul 2020 07:33:08 +0000 Received: from mailgw01.mediatek.com ([216.200.240.184]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jsi6D-00042i-33; Tue, 07 Jul 2020 07:33:07 +0000 X-UUID: 55fda6cda72a4e29bd56d0416da3d660-20200706 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Transfer-Encoding:MIME-Version:Content-Type:References:In-Reply-To:Date:CC:To:From:Subject:Message-ID; bh=bbruckC3ceq+ERWDrNx+WHxXmMBaz2tWUh5l7zH/VsA=; b=SPd7WdbIV3UpMIi5oaQy4k3V9FGdhnlfAUydzvpkg9yv6bYWSiPaBRH+MHLjLsu+oML0twaDC67qjEDCVfFgogOolFeiQwqA4dMkq+xUCX1oebLldVR3mMwyxd0kR1AWw00mx5fkj1AsdwC9XiFyBpZo9UrBLEpJOie6s9AF9xI=; X-UUID: 55fda6cda72a4e29bd56d0416da3d660-20200706 Received: from mtkcas66.mediatek.inc [(172.29.193.44)] by mailgw01.mediatek.com (envelope-from ) (musrelay.mediatek.com ESMTP with TLS) with ESMTP id 1994152097; Mon, 06 Jul 2020 23:32:56 -0800 Received: from MTKMBS01N1.mediatek.inc (172.21.101.68) by MTKMBS62DR.mediatek.inc (172.29.94.18) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 7 Jul 2020 00:32:55 -0700 Received: from mtkcas07.mediatek.inc (172.21.101.84) by mtkmbs01n1.mediatek.inc (172.21.101.68) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 7 Jul 2020 15:32:48 +0800 Received: from [172.21.77.33] (172.21.77.33) by mtkcas07.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 7 Jul 2020 15:32:49 +0800 Message-ID: <1594107170.20820.84.camel@mtkswgap22> Subject: Re: [PATCH 2/2] soc: mediatek: devapc: add devapc-mt6779 driver From: Neal Liu To: Matthias Brugger Date: Tue, 7 Jul 2020 15:32:50 +0800 In-Reply-To: References: <1594027693-19530-1-git-send-email-neal.liu@mediatek.com> <1594027693-19530-3-git-send-email-neal.liu@mediatek.com> X-Mailer: Evolution 3.2.3-0ubuntu6 MIME-Version: 1.0 X-MTK: N X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200707_033305_467364_34935397 X-CRM114-Status: GOOD ( 39.89 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: devicetree@vger.kernel.org, wsd_upstream@mediatek.com, lkml , Rob Herring , "moderated list:ARM/Mediatek SoC support" , Neal Liu , linux-arm-kernel@lists.infradead.org Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Hi Matthias, Thanks for your review. On Mon, 2020-07-06 at 13:27 +0200, Matthias Brugger wrote: > CC linux-mediatek > > Please you ./scripts/get_maintainers.pl to find out to whom you should send the > series. Yes, I already find out from get_maintainers.pl. But I forgot to add it into cc list... > > On 06/07/2020 11:28, Neal Liu wrote: > > MT6779 bus frabric provides TrustZone security support and data > > protection to prevent slaves from being accessed by unexpected > > masters. > > The security violations are logged and sent to the processor for > > further analysis or countermeasures. > > > > Any occurrence of security violation would raise an interrupt, and > > it will be handled by devapc-mt6779 driver. The violation > > information is printed in order to find the murderer. > > > > Please describe in more detail how this HW works. "devapc" means Device Access Permission Control. This hardware can control which bus masters are allowed or disallowed to access bus slaves. And it will generate interrupts if someone violates the rules. You can check binding for more details. > > > Signed-off-by: Neal Liu > > --- > > copying my comments from the last revision, which weren't answered and are not > addressed here. If you are not OK with my sugguestions, no problem but please > provide your arguments so that we can come up with a solution. Otherwise you are > just wasting your and my time: Sorry for not replying your previous comments. I think your most comments are really helpful and I already revised and applied it in this patch. Let's discuss the part I missed. > > Please review your data structures and try to group the information in logical > structs. For example I don't understand why we need mtk_devapc_context. It seems > to me that all the values in there are SoC specific. > Yes, you are right. mtk_devapc_context dedicated to SoC specific. > Why void __iomem *devapc_pd_base isn't part of the device_info? > device_info stores slaves' info which are controlled by devapc. devapc_pd_base stores devapc_pd based register which is used to control and dump violation information. > > > > drivers/soc/mediatek/Kconfig | 6 + > > drivers/soc/mediatek/Makefile | 1 + > > drivers/soc/mediatek/devapc/Kconfig | 17 + > > drivers/soc/mediatek/devapc/Makefile | 10 + > > drivers/soc/mediatek/devapc/devapc-mt6779.c | 1111 +++++++++++++++++++++++++++ > > From the answers of the last revision it seems that this driver will be used for > more then one SoC. So we should not name it devapc-mt6779.c but for example > mtk-devapc.c. Okay, we could use mtk-devapc.c for first patch. If we upstream next SoC, then we could separate SoC specific part. > > By the way, what does the devapc stands for? It's not clear from the commit > message nor from the binding description. It already described in binding title. title: MediaTek MT6779 Device Access Permission Control driver > > > drivers/soc/mediatek/devapc/devapc-mt6779.h | 99 +++ > > 6 files changed, 1244 insertions(+) > > create mode 100644 drivers/soc/mediatek/devapc/Kconfig > > create mode 100644 drivers/soc/mediatek/devapc/Makefile > > create mode 100644 drivers/soc/mediatek/devapc/devapc-mt6779.c > > create mode 100644 drivers/soc/mediatek/devapc/devapc-mt6779.h > > > > diff --git a/drivers/soc/mediatek/Kconfig b/drivers/soc/mediatek/Kconfig > > index 59a56cd..2c9ad1f 100644 > > --- a/drivers/soc/mediatek/Kconfig > > +++ b/drivers/soc/mediatek/Kconfig > > @@ -51,4 +51,10 @@ config MTK_MMSYS > > Say yes here to add support for the MediaTek Multimedia > > Subsystem (MMSYS). > > > > +menu "Security" > > + > > +source "drivers/soc/mediatek/devapc/Kconfig" > > + > > +endmenu # Security > > + > > endmenu > > diff --git a/drivers/soc/mediatek/Makefile b/drivers/soc/mediatek/Makefile > > index 01f9f87..d6717a81 100644 > > --- a/drivers/soc/mediatek/Makefile > > +++ b/drivers/soc/mediatek/Makefile > > @@ -1,5 +1,6 @@ > > # SPDX-License-Identifier: GPL-2.0-only > > obj-$(CONFIG_MTK_CMDQ) += mtk-cmdq-helper.o > > +obj-$(CONFIG_MTK_DEVAPC) += devapc/ > > Why do we need a new folder for the driver? Currently, we don't need it. But once it support multiple platforms, we would like to group it. Does it make sense? > > > obj-$(CONFIG_MTK_INFRACFG) += mtk-infracfg.o > > obj-$(CONFIG_MTK_PMIC_WRAP) += mtk-pmic-wrap.o > > obj-$(CONFIG_MTK_SCPSYS) += mtk-scpsys.o > > diff --git a/drivers/soc/mediatek/devapc/Kconfig b/drivers/soc/mediatek/devapc/Kconfig > > new file mode 100644 > > index 0000000..b0f7d0e > > --- /dev/null > > +++ b/drivers/soc/mediatek/devapc/Kconfig > > @@ -0,0 +1,17 @@ > > +config MTK_DEVAPC > > + tristate "Mediatek Device APC Support" > > + help > > + Device APC is a HW IP controlling internal device security. > > + MediaTek bus frabric provides TrustZone security support and data > > + protection to prevent slaves from being accessed by unexpected > > + bus masters. > > + Device APC prevents malicious access to internal devices. > > + > > +config DEVAPC_MT6779 > > + tristate "Mediatek MT6779 Device APC driver" > > + select MTK_DEVAPC > > + help > > + Say yes here to enable support Mediatek MT6779 Device APC driver. > > + This driver mainly used to handle the violation with 1 DEVAPC AO/PDs. > > + The violation information are logged for further analysis or > > + countermeasures. > > diff --git a/drivers/soc/mediatek/devapc/Makefile b/drivers/soc/mediatek/devapc/Makefile > > new file mode 100644 > > index 0000000..0336c1d > > --- /dev/null > > +++ b/drivers/soc/mediatek/devapc/Makefile > > @@ -0,0 +1,10 @@ > > +# SPDX-License-Identifier: GPL-2.0 > > + > > +ifeq ($(CONFIG_MTK_GCOV_KERNEL),y) > > +GCOV_PROFILE := y > > +endif > > + > > +obj-$(CONFIG_MTK_DEVAPC) := devapc.o > > + > > +# Platform > > +devapc-$(CONFIG_DEVAPC_MT6779) += devapc-mt6779.o > > diff --git a/drivers/soc/mediatek/devapc/devapc-mt6779.c b/drivers/soc/mediatek/devapc/devapc-mt6779.c > > new file mode 100644 > > index 0000000..a28b9f3 > > --- /dev/null > > +++ b/drivers/soc/mediatek/devapc/devapc-mt6779.c > > @@ -0,0 +1,1111 @@ > > +// SPDX-License-Identifier: GPL-2.0 > > +/* > > + * Copyright (C) 2020 MediaTek Inc. > > + */ > > + > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > + > > +#include "devapc-mt6779.h" > > + > > +static struct mtk_device_info mt6779_devices_infra[] = { > > Looks like a candidate to put into the *.h file. > should be okay. > > + /* sys_idx, ctrl_idx, vio_idx */ > > + /* 0 */ > > + {0, 0, 0}, > > + {0, 1, 1}, > > + {0, 2, 2}, > > + {0, 3, 3}, > > + {0, 4, 4}, > > + {0, 5, 5}, > > + {0, 6, 6}, > > + {0, 7, 7}, > > + {0, 8, 8}, > > + {0, 9, 9}, > > + > > + /* 10 */ > > + {0, 10, 10}, > > + {0, 11, 11}, > > + {0, 12, 12}, > > + {0, 13, 13}, > > + {0, 14, 14}, > > + {0, 15, 15}, > > + {0, 16, 16}, > > + {0, 17, 17}, > > + {0, 18, 18}, > > + {0, 19, 19}, > > + > > + /* 20 */ > > + {0, 20, 20}, > > + {0, 21, 21}, > > + {0, 22, 22}, > > + {0, 23, 23}, > > + {0, 24, 24}, > > + {0, 25, 25}, > > + {0, 26, 26}, > > + {0, 27, 27}, > > + {0, 28, 28}, > > + {0, 29, 29}, > > + > > + /* 30 */ > > + {0, 30, 30}, > > + {0, 31, 31}, > > + {0, 32, 32}, > > + {0, 33, 77}, > > + {0, 34, 78}, > > + {0, 35, 79}, > > + {0, 35, 80}, > > + {0, 37, 37}, > > + {0, 38, 38}, > > + {0, 39, 39}, > > + > > + /* 40 */ > > + {0, 40, 40}, > > + {0, 41, 41}, > > + {0, 42, 42}, > > + {0, 43, 43}, > > + {0, 44, 44}, > > + {0, 45, 45}, > > + {0, 46, 46}, > > + {0, 47, 47}, > > + {0, 48, 48}, > > + {0, 49, 49}, > > + > > + /* 50 */ > > + {0, 50, 50}, > > + {0, 51, 51}, > > + {0, 52, 52}, > > + {0, 53, 53}, > > + {0, 54, 54}, > > + {0, 55, 55}, > > + {0, 56, 56}, > > + {0, 57, 57}, > > + {0, 58, 58}, > > + {0, 59, 59}, > > + > > + /* 60 */ > > + {0, 60, 60}, > > + {0, 61, 61}, > > + {0, 62, 62}, > > + {0, 63, 63}, > > + {0, 64, 64}, > > + {0, 65, 70}, > > + {0, 66, 71}, > > + {0, 67, 72}, > > + {0, 68, 73}, > > + {0, 70, 81}, > > + > > + /* 70 */ > > + {0, 71, 82}, > > + {0, 72, 83}, > > + {0, 73, 84}, > > + {0, 74, 85}, > > + {0, 75, 86}, > > + {0, 76, 87}, > > + {0, 77, 88}, > > + {0, 78, 89}, > > + {0, 79, 90}, > > + {0, 80, 91}, > > + > > + /* 80 */ > > + {0, 81, 92}, > > + {0, 82, 93}, > > + {0, 83, 94}, > > + {0, 84, 95}, > > + {0, 85, 96}, > > + {0, 86, 97}, > > + {0, 87, 98}, > > + {0, 88, 99}, > > + {0, 89, 100}, > > + {0, 90, 101}, > > + > > + /* 90 */ > > + {0, 91, 102}, > > + {0, 92, 103}, > > + {0, 93, 104}, > > + {0, 94, 105}, > > + {0, 95, 106}, > > + {0, 96, 107}, > > + {0, 97, 108}, > > + {0, 98, 109}, > > + {0, 110, 110}, > > + {0, 111, 111}, > > + > > + /* 100 */ > > Comments maybe not needed, at least of added, they should represent the code. This comments represent index of mt6779_devices_infra. It's helpful to check total numbers of slaves. > > > + {0, 112, 112}, > > + {0, 113, 113}, > > + {0, 114, 114}, > > + {0, 115, 115}, > > + {0, 116, 116}, > > + {0, 117, 117}, > > + {0, 118, 118}, > > + {0, 119, 119}, > > + {0, 120, 120}, > > + {0, 121, 121}, > > + > > + /* 110 */ > > + {0, 122, 122}, > > + {0, 123, 123}, > > + {0, 124, 124}, > > + {0, 125, 125}, > > + {0, 126, 126}, > > + {0, 127, 127}, > > + {0, 128, 128}, > > + {0, 129, 129}, > > + {0, 130, 130}, > > + {0, 131, 131}, > > + > > + /* 120 */ > > + {0, 132, 132}, > > + {0, 133, 133}, > > + {0, 134, 134}, > > + {0, 135, 135}, > > + {0, 136, 136}, > > + {0, 137, 137}, > > + {0, 138, 138}, > > + {0, 139, 139}, > > + {0, 140, 140}, > > + {0, 141, 141}, > > + > > + /* 130 */ > > + {0, 142, 142}, > > + {0, 143, 143}, > > + {0, 144, 144}, > > + {0, 145, 145}, > > + {0, 146, 146}, > > + {0, 147, 147}, > > + {0, 148, 148}, > > + {0, 149, 149}, > > + {0, 150, 150}, > > + {0, 151, 151}, > > + > > + /* 140 */ > > + {0, 152, 152}, > > + {0, 153, 153}, > > + {0, 154, 154}, > > + {0, 155, 155}, > > + {0, 156, 156}, > > + {0, 157, 157}, > > + {0, 158, 158}, > > + {0, 159, 159}, > > + {0, 160, 160}, > > + {0, 161, 161}, > > + > > + /* 150 */ > > + {0, 162, 162}, > > + {0, 163, 163}, > > + {0, 164, 164}, > > + {0, 165, 165}, > > + {0, 166, 166}, > > + {0, 167, 167}, > > + {0, 168, 168}, > > + {0, 169, 169}, > > + {0, 170, 170}, > > + {0, 171, 171}, > > + > > + /* 160 */ > > + {0, 172, 172}, > > + {0, 173, 173}, > > + {0, 174, 174}, > > + {0, 175, 175}, > > + {0, 176, 176}, > > + {0, 177, 177}, > > + {0, 178, 178}, > > + {0, 179, 179}, > > + {0, 180, 180}, > > + {0, 181, 181}, > > + > > + /* 170 */ > > + {0, 182, 182}, > > + {0, 183, 183}, > > + {0, 184, 184}, > > + {0, 185, 185}, > > + {0, 186, 186}, > > + {0, 187, 187}, > > + {0, 188, 188}, > > + {0, 189, 189}, > > + {0, 190, 190}, > > + {0, 191, 191}, > > + > > + /* 180 */ > > + {0, 192, 192}, > > + {0, 193, 193}, > > + {0, 194, 194}, > > + {0, 195, 195}, > > + {0, 196, 196}, > > + {0, 197, 197}, > > + {0, 198, 198}, > > + {0, 199, 199}, > > + {0, 200, 200}, > > + {0, 201, 201}, > > + > > + /* 190 */ > > + {0, 202, 202}, > > + {0, 203, 203}, > > + {0, 204, 204}, > > + {0, 205, 205}, > > + {0, 206, 206}, > > + {0, 207, 207}, > > + {0, 208, 208}, > > + {0, 209, 209}, > > + {0, 210, 210}, > > + {0, 211, 211}, > > + > > + /* 200 */ > > + {0, 212, 212}, > > + {0, 213, 213}, > > + {0, 214, 214}, > > + {0, 215, 215}, > > + {0, 216, 216}, > > + {0, 217, 217}, > > + {0, 218, 218}, > > + {0, 219, 219}, > > + {0, 220, 220}, > > + {0, 221, 221}, > > + > > + /* 210 */ > > + {0, 222, 222}, > > + {0, 223, 223}, > > + {0, 224, 224}, > > + {0, 225, 225}, > > + {0, 226, 226}, > > + {0, 227, 227}, > > + {0, 228, 228}, > > + {0, 229, 229}, > > + {0, 230, 230}, > > + {0, 231, 231}, > > + > > + /* 220 */ > > + {1, 0, 232}, > > + {1, 1, 233}, > > + {1, 2, 234}, > > + {1, 3, 235}, > > + {1, 4, 236}, > > + {1, 5, 237}, > > + {1, 6, 238}, > > + {1, 7, 239}, > > + {1, 8, 240}, > > + {1, 9, 241}, > > + > > + /* 230 */ > > + {1, 10, 242}, > > + {1, 11, 243}, > > + {1, 12, 244}, > > + {1, 13, 245}, > > + {1, 14, 246}, > > + {1, 15, 247}, > > + {1, 16, 248}, > > + {1, 17, 249}, > > + {1, 18, 250}, > > + {1, 19, 251}, > > + > > + /* 240 */ > > + {1, 20, 252}, > > + {1, 21, 253}, > > + {1, 22, 254}, > > + {1, 23, 255}, > > + {1, 24, 256}, > > + {1, 25, 257}, > > + {1, 26, 258}, > > + {1, 27, 259}, > > + {1, 28, 260}, > > + {1, 29, 261}, > > + > > + /* 250 */ > > + {1, 30, 262}, > > + {1, 31, 263}, > > + {1, 32, 264}, > > + {1, 33, 265}, > > + {1, 34, 266}, > > + {1, 35, 267}, > > + {1, 36, 268}, > > + {1, 37, 269}, > > + {1, 38, 270}, > > + {1, 39, 271}, > > + > > + /* 260 */ > > + {1, 40, 272}, > > + {1, 41, 273}, > > + {1, 42, 274}, > > + {1, 43, 275}, > > + {1, 44, 276}, > > + {1, 45, 277}, > > + {1, 46, 278}, > > + {1, 47, 279}, > > + {1, 48, 280}, > > + {1, 49, 281}, > > + > > + /* 270 */ > > + {1, 50, 282}, > > + {1, 51, 283}, > > + {1, 52, 284}, > > + {1, 53, 285}, > > + {1, 54, 286}, > > + {1, 55, 287}, > > + {1, 56, 288}, > > + {1, 57, 289}, > > + {1, 58, 290}, > > + {1, 59, 291}, > > + > > + /* 280 */ > > + {1, 60, 292}, > > + {1, 61, 293}, > > + {1, 62, 294}, > > + {1, 63, 295}, > > + {1, 64, 296}, > > + {1, 65, 297}, > > + {1, 66, 298}, > > + {1, 67, 299}, > > + {1, 68, 300}, > > + {1, 69, 301}, > > + > > + /* 290 */ > > + {1, 70, 302}, > > + {1, 71, 303}, > > + {1, 72, 304}, > > + {1, 73, 305}, > > + {1, 74, 306}, > > + {1, 75, 307}, > > + {1, 76, 308}, > > + {1, 77, 309}, > > + {1, 78, 310}, > > + {1, 79, 311}, > > + > > + /* 300 */ > > + {1, 80, 312}, > > + {1, 81, 313}, > > + {1, 82, 314}, > > + {1, 83, 315}, > > + {1, 84, 316}, > > + {1, 85, 317}, > > + {1, 86, 318}, > > + {1, 87, 319}, > > + {1, 88, 320}, > > + {1, 89, 321}, > > + > > + /* 310 */ > > + {1, 90, 322}, > > + {1, 91, 323}, > > + {1, 92, 324}, > > + {1, 93, 325}, > > + {1, 94, 326}, > > + {1, 95, 327}, > > + {1, 96, 328}, > > + {1, 97, 329}, > > + {1, 98, 330}, > > + {1, 99, 331}, > > + > > + /* 320 */ > > + {1, 100, 332}, > > + {1, 101, 333}, > > + {1, 102, 334}, > > + {1, 103, 335}, > > + {1, 104, 336}, > > + {1, 105, 337}, > > + {1, 106, 338}, > > + {1, 107, 339}, > > + {1, 108, 340}, > > + {1, 109, 341}, > > + > > + /* 330 */ > > + {1, 110, 342}, > > + {1, 111, 343}, > > + {1, 112, 344}, > > + {1, 113, 345}, > > + {1, 114, 346}, > > + {1, 115, 347}, > > + {1, 116, 348}, > > + {1, 117, 349}, > > + {1, 118, 350}, > > + {1, 119, 351}, > > + > > + /* 340 */ > > + {1, 120, 352}, > > + {1, 121, 353}, > > + {1, 122, 354}, > > + {1, 123, 355}, > > + {1, 124, 356}, > > + {1, 125, 357}, > > + {1, 126, 358}, > > + {1, 127, 359}, > > + {1, 128, 360}, > > + {1, 129, 361}, > > + > > + /* 350 */ > > + {1, 130, 362}, > > + {1, 131, 363}, > > + {1, 132, 364}, > > + {1, 133, 365}, > > + {1, 134, 366}, > > + {1, 135, 367}, > > + {1, 136, 368}, > > + {1, 137, 369}, > > + {1, 138, 370}, > > + {1, 139, 371}, > > + > > + /* 360 */ > > + {1, 140, 372}, > > + {1, 141, 373}, > > + {1, 142, 374}, > > + {1, 143, 375}, > > + {1, 144, 376}, > > + {1, 145, 377}, > > + {1, 146, 378}, > > + {1, 147, 379}, > > + {1, 148, 380}, > > + {1, 149, 381}, > > + > > + /* 370 */ > > + {1, 150, 382}, > > + {1, 151, 383}, > > + {1, 152, 384}, > > + {1, 153, 385}, > > + {1, 154, 386}, > > + {1, 155, 387}, > > + {1, 156, 388}, > > + {1, 157, 389}, > > + {1, 158, 390}, > > + {1, 159, 391}, > > + > > + /* 380 */ > > + {1, 160, 392}, > > + {1, 161, 393}, > > + {1, 162, 394}, > > + {1, 163, 395}, > > + {1, 164, 396}, > > + {1, 165, 397}, > > + {1, 166, 398}, > > + {1, 167, 399}, > > + {1, 168, 400}, > > + {1, 169, 401}, > > + > > + /* 390 */ > > + {1, 170, 402}, > > + {1, 171, 403}, > > + {1, 172, 404}, > > + {1, 173, 405}, > > + {1, 174, 406}, > > + {1, 175, 407}, > > + {1, 176, 408}, > > + {1, 177, 409}, > > + {1, 178, 410}, > > + {1, 179, 411}, > > + > > + /* 400 */ > > + {1, 180, 412}, > > + {1, 181, 413}, > > + {1, 182, 414}, > > + {1, 183, 415}, > > + {1, 184, 416}, > > + {1, 185, 417}, > > + {1, 186, 418}, > > + {1, 187, 419}, > > + {1, 188, 420}, > > + {1, 189, 421}, > > + > > + /* 410 */ > > + {1, 190, 422}, > > + {1, 191, 423}, > > + {1, 192, 424}, > > + {1, 193, 425}, > > + {1, 194, 426}, > > + {1, 195, 427}, > > + {1, 196, 428}, > > + {1, 197, 429}, > > + {1, 198, 430}, > > + {1, 199, 431}, > > + > > + /* 420 */ > > + {1, 200, 432}, > > + {1, 201, 433}, > > + {1, 202, 434}, > > + {1, 203, 435}, > > + {1, 204, 436}, > > + {1, 205, 437}, > > + {1, 206, 438}, > > + {1, 207, 439}, > > + {1, 208, 440}, > > + {1, 209, 441}, > > + > > + /* 430 */ > > + {1, 210, 442}, > > + {1, 211, 443}, > > + {1, 212, 444}, > > + {1, 213, 445}, > > + {1, 214, 446}, > > + {1, 215, 447}, > > + {1, 216, 448}, > > + {1, 217, 449}, > > + {1, 218, 450}, > > + {1, 219, 451}, > > + > > + /* 440 */ > > + {1, 220, 452}, > > + {1, 221, 453}, > > + {1, 222, 454}, > > + {1, 223, 455}, > > + {1, 224, 456}, > > + {1, 225, 457}, > > + {1, 226, 458}, > > + {1, 227, 459}, > > + {1, 228, 460}, > > + {1, 229, 461}, > > + > > + /* 450 */ > > + {1, 230, 462}, > > + {1, 231, 463}, > > + {1, 232, 464}, > > + {1, 233, 465}, > > + {1, 234, 466}, > > + {1, 235, 467}, > > + {1, 236, 468}, > > + {1, 237, 469}, > > + {1, 238, 470}, > > + {1, 239, 471}, > > + > > + /* 460 */ > > + {1, 240, 472}, > > + {1, 241, 473}, > > + {1, 242, 474}, > > + {1, 243, 475}, > > + {1, 244, 476}, > > + {1, 245, 477}, > > + {1, 246, 478}, > > + {-1, -1, 479}, > > + {-1, -1, 480}, > > + {-1, -1, 481}, > > + > > + /* 470 */ > > + {-1, -1, 482}, > > + {-1, -1, 483}, > > + {-1, -1, 484}, > > + {-1, -1, 485}, > > + {-1, -1, 486}, > > + {-1, -1, 487}, > > + {-1, -1, 488}, > > + {-1, -1, 489}, > > + {-1, -1, 490}, > > + {-1, -1, 491}, > > + > > + /* 480 */ > > + {-1, -1, 492}, > > + {-1, -1, 493}, > > + {-1, -1, 494}, > > + {-1, -1, 495}, > > + {-1, -1, 496}, > > + {-1, -1, 497}, > > + {-1, -1, 498}, > > + {-1, -1, 499}, > > + {-1, -1, 500}, > > + {-1, -1, 501}, > > + > > + /* 490 */ > > + {-1, -1, 502}, > > + {-1, -1, 503}, > > + {-1, -1, 504}, > > + {-1, -1, 505}, > > + {-1, -1, 506}, > > + {-1, -1, 507}, > > + {-1, -1, 508}, > > + {-1, -1, 509}, > > + {-1, -1, 510}, > > + > > +}; > > + > > +static struct mtk_device_num mtk6779_devices_num[] = { > > + {SLAVE_TYPE_INFRA, VIO_SLAVE_NUM_INFRA}, > > +}; > > + > > +static int mtk_vio_mask_sta_num[] = { > > + VIO_MASK_STA_NUM_INFRA, > > +}; > > + > > +static const struct mtk_infra_vio_dbg_desc mt6779_vio_dbgs = { > > + .vio_dbg_mstid = INFRA_VIO_DBG_MSTID, > > + .vio_dbg_mstid_start_bit = INFRA_VIO_DBG_MSTID_START_BIT, > > + .vio_dbg_dmnid = INFRA_VIO_DBG_DMNID, > > + .vio_dbg_dmnid_start_bit = INFRA_VIO_DBG_DMNID_START_BIT, > > + .vio_dbg_w_vio = INFRA_VIO_DBG_W_VIO, > > + .vio_dbg_w_vio_start_bit = INFRA_VIO_DBG_W_VIO_START_BIT, > > + .vio_dbg_r_vio = INFRA_VIO_DBG_R_VIO, > > + .vio_dbg_r_vio_start_bit = INFRA_VIO_DBG_R_VIO_START_BIT, > > + .vio_addr_high = INFRA_VIO_ADDR_HIGH, > > + .vio_addr_high_start_bit = INFRA_VIO_ADDR_HIGH_START_BIT, > > +}; > > + > > +static const u32 mt6779_devapc_pds[] = { > > + PD_VIO_MASK_OFFSET, > > + PD_VIO_STA_OFFSET, > > + PD_VIO_DBG0_OFFSET, > > + PD_VIO_DBG1_OFFSET, > > + PD_APC_CON_OFFSET, > > + PD_SHIFT_STA_OFFSET, > > + PD_SHIFT_SEL_OFFSET, > > + PD_SHIFT_CON_OFFSET, > > +}; > > + > > +static u32 mt6779_shift_group_get(u32 vio_idx) > > +{ > > + if (vio_idx >= 0 && vio_idx <= 32) > > + return 0; > > + else if (vio_idx >= 33 && vio_idx <= 109) > > + return 1; > > + else if ((vio_idx >= 110 && vio_idx <= 121) || > > + (vio_idx >= 470 && vio_idx <= 472)) > > + return 2; > > + else if (vio_idx == 122 || vio_idx == 500) > > + return 3; > > + else if (vio_idx == 123) > > + return 4; > > + else if (vio_idx == 124) > > + return 5; > > + else if ((vio_idx >= 125 && vio_idx <= 155) || > > + (vio_idx >= 486 && vio_idx <= 488)) > > + return 6; > > + else if ((vio_idx >= 156 && vio_idx <= 157) || > > + (vio_idx >= 159 && vio_idx <= 165)) > > + return 7; > > + else if ((vio_idx >= 166 && vio_idx <= 181) || > > + (vio_idx >= 473 && vio_idx <= 475)) > > + return 8; > > + else if ((vio_idx >= 182 && vio_idx <= 197) || > > + (vio_idx >= 476 && vio_idx <= 478)) > > + return 9; > > + else if ((vio_idx >= 198 && vio_idx <= 205) || > > + (vio_idx >= 479 && vio_idx <= 481)) > > + return 10; > > + else if ((vio_idx >= 214 && vio_idx <= 229) || > > + (vio_idx >= 482 && vio_idx <= 484)) > > + return 11; > > + else if (vio_idx == 230) > > + return 12; > > + else if (vio_idx == 158) > > + return 13; > > + else if (vio_idx == 231 || vio_idx == 382) > > + return 14; > > + else if (vio_idx >= 232 && vio_idx <= 244) > > + return 15; > > + else if (vio_idx >= 245 && vio_idx <= 478) > > + return 16; > > + else if (vio_idx >= 504 && vio_idx <= 505) > > + return 17; > > + else if (vio_idx == 494) > > + return 18; > > + else if (vio_idx == 503) > > + return 19; > > + else if (vio_idx == 501) > > + return 20; > > + else if (vio_idx == 502) > > + return 21; > > + else if (vio_idx == 506) > > + return 22; > > + else if (vio_idx == 507) > > + return 23; > > + else if (vio_idx == 508) > > + return 24; > > + else if ((vio_idx >= 206 && vio_idx <= 213) || > > + (vio_idx >= 498 && vio_idx <= 500)) > > + return 25; > > + > > + return 31; > > +} > > + > > +/* > > + * mtk_devapc_pd_get - get devapc pd_types of register address. > > + * > > + * Returns the value of reg addr > > + */ > > +static void __iomem *mtk_devapc_pd_get(struct mtk_devapc_context *devapc_ctx, > > + int slave_type, > > + enum DEVAPC_PD_REG_TYPE pd_reg_type, > > + u32 index) > > +{ > > + const u32 *devapc_pds = mt6779_devapc_pds; > > + void __iomem *reg; > > + > > + reg = devapc_ctx->devapc_pd_base[slave_type] + devapc_pds[pd_reg_type]; > > + > > + if (pd_reg_type == VIO_MASK || pd_reg_type == VIO_STA) > > + reg += 0x4 * index; > > + > > + return reg; > > +} > > + > > +static int check_vio_mask_sta(struct mtk_devapc_context *devapc_ctx, > > + int slave_type, u32 module, int pd_reg_type) > > +{ > > + u32 apc_register_index, apc_set_index; > > + void __iomem *reg; > > + u32 value; > > + > > + apc_register_index = module / (MOD_NM_IN_1_DEVAPC * 2); > > + apc_set_index = module % (MOD_NM_IN_1_DEVAPC * 2); > > + > > + if (apc_register_index < mtk_vio_mask_sta_num[slave_type]) > > + reg = mtk_devapc_pd_get(devapc_ctx, slave_type, pd_reg_type, > > + apc_register_index); > > + else > > + return -EOVERFLOW; > > How could that happen? > Currently, all components are inside this driver. This is not necessary at all. I'll remove it. > > + > > + value = (readl(reg) & (0x1 << apc_set_index)) >> apc_set_index; > > + > > + return value; > > value = readl(reg); > return ((value >> apc_set_index) & 0x1); Is it for readability? > > > > +} > > + > > +static int check_vio_mask(struct mtk_devapc_context *devapc_ctx, int slave_type, > > + u32 module) > > +{ > > + return check_vio_mask_sta(devapc_ctx, slave_type, module, VIO_MASK); > > +} > > + > > +static int check_vio_status(struct mtk_devapc_context *devapc_ctx, > > + int slave_type, u32 module) > > +{ > > + return check_vio_mask_sta(devapc_ctx, slave_type, module, VIO_STA); > > +} > > + > > +static void clear_vio_status(struct mtk_devapc_context *devapc_ctx, > > + int slave_type, u32 module) > > +{ > > + u32 apc_register_index, apc_set_index; > > + void __iomem *reg; > > + > > + apc_register_index = module / (MOD_NM_IN_1_DEVAPC * 2); > > + apc_set_index = module % (MOD_NM_IN_1_DEVAPC * 2); > > What does MOD_NM_IN_1_DEVAPC stands for? Why do you define it with 16 when > afterwards you only use it with value 32? Do I understand correctly that this > calculates the register offset and bit in the register to write to? Yes! Each module violation index stands for 1 bit, so there are 32 modules in 1 devapc register. I think MOD_NUM_IN_1_DEVAPC is not necessary, I'll remove it and hardcode "32" for this calculation. > > > + > > + if (apc_register_index < mtk_vio_mask_sta_num[slave_type]) { > > mtk_vio_mask_sta_num[slave_type] == maximum of registers that can be accessed? Yap. This code is not necessary. Ditto. > > > + reg = mtk_devapc_pd_get(devapc_ctx, slave_type, VIO_STA, > > + apc_register_index); > > + writel(0x1 << apc_set_index, reg); > > + > > + } else { > > + pr_err(PFX "%s: Out Of Boundary, slave_type:0x%x, module_index:0x%x\n", > > + __func__, slave_type, module); > > Only used internally by the driver, why can't we suppose that the driver does > not implement module number outside of the accessible registers? I think this > can be dropped. > Ditto > > + return; > > + } > > + > > + if (check_vio_status(devapc_ctx, slave_type, module)) > > + pr_err(PFX "%s: Clear failed, slave_type:0x%x, module_index:0x%x\n", > > + __func__, slave_type, module); > > +} > > + > > +static void mask_module_irq(struct mtk_devapc_context *devapc_ctx, > > + int slave_type, u32 module, bool mask) > > +{ > > + u32 apc_register_index, apc_set_index; > > + void __iomem *reg; > > + > > + apc_register_index = module / (MOD_NM_IN_1_DEVAPC * 2); > > + apc_set_index = module % (MOD_NM_IN_1_DEVAPC * 2); > > Better add a macro for this and rename set_index into register_offset? I agree. Do you suggest to include variable declaration into marco? Or just calculation only? > > > + > > + if (apc_register_index < mtk_vio_mask_sta_num[slave_type]) { > > + reg = mtk_devapc_pd_get(devapc_ctx, slave_type, VIO_MASK, > > + apc_register_index); > > I don't like this code all over the place, could add the correct offset to > mtk_device_info and just add it in readl/writel directly? Ditto. > > > + > > + if (mask) > > + writel(readl(reg) | (1 << apc_set_index), reg); > > + else > > + writel(readl(reg) & (~(1 << apc_set_index)), reg); > > value = readl(reg); > > if (mask) > value |= (0x1 << apc_set_index); > else > value &= ~(0x1 << apc_set_index); > > writel(value); > Is it for readability? > > + > > + } else { > > + pr_err(PFX "%s: Out Of Boundary, slave_type:0x%x, module_index:0x%x, mask:%s\n", > > + __func__, slave_type, module, mask ? "true" : "false"); > > + } > > +} > > + > > +/* > > + * sync_vio_dbg - start to get violation information by selecting violation > > + * group and enable violation shift. > > + * > > + * Returns sync done or not > > + */ > > +static u32 sync_vio_dbg(struct mtk_devapc_context *devapc_ctx, int slave_type, > > + u32 shift_bit) > > +{ > > + void __iomem *pd_vio_shift_sta_reg; > > + void __iomem *pd_vio_shift_sel_reg; > > + void __iomem *pd_vio_shift_con_reg; > > + u32 shift_count; > > + u32 sync_done; > > + > > + pd_vio_shift_sta_reg = mtk_devapc_pd_get(devapc_ctx, slave_type, > > + VIO_SHIFT_STA, 0); > > + pd_vio_shift_sel_reg = mtk_devapc_pd_get(devapc_ctx, slave_type, > > + VIO_SHIFT_SEL, 0); > > + pd_vio_shift_con_reg = mtk_devapc_pd_get(devapc_ctx, slave_type, > > + VIO_SHIFT_CON, 0); > > + > > + writel(0x1 << shift_bit, pd_vio_shift_sel_reg); > > + writel(0x1, pd_vio_shift_con_reg); > > + > > + for (shift_count = 0; (shift_count < 100) && > > + ((readl(pd_vio_shift_con_reg) & 0x3) != 0x3); > > + ++shift_count) > > Use read_poll_timeout here, we don't want to depend on the time 100 reads need, > as from my understanding this depends on the (dynamic) clock frequency. > Okay, I'll try read_poll_timeout here. > > + ; > > + > > + if ((readl(pd_vio_shift_con_reg) & 0x3) == 0x3) > > We can read the value via readl_poll_timeout. No need to read it again here. Ditto. > > > + sync_done = 1; > > + else > > + sync_done = 0; > > + > > + /* Disable shift mechanism */ > > What is the "shift mechanism"? "shift mechanism" is depends on devapc hardware design. We set multiple slaves as a group. When violation is triggered, violation information is kept inside hardware. (Cannot get full information from registers.) We have to do "shift mechanism" to shift violation information to VIO_DBG0, VIO_DBG1 registers. You can see we have to do sync_vio_dbg() before getting full violation information (devapc_extract_vio_dbg()). > > > + writel(0x0, pd_vio_shift_con_reg); > > + writel(0x0, pd_vio_shift_sel_reg); > > + writel(0x1 << shift_bit, pd_vio_shift_sta_reg); > > + > > + return sync_done; > > +} > > + > > +static void devapc_vio_info_print(struct mtk_devapc_context *devapc_ctx) > > +{ > > + struct mtk_devapc_vio_info *vio_info = devapc_ctx->vio_info; > > + > > + /* Print violation information */ > > + if (vio_info->write) > > + pr_info(PFX "Write Violation\n"); > > + else if (vio_info->read) > > + pr_info(PFX "Read Violation\n"); > > + > > + pr_info(PFX "%s%x, %s%x, %s%x, %s%x\n", > > + "Vio Addr:0x", vio_info->vio_addr, > > + "High:0x", vio_info->vio_addr_high, > > + "Bus ID:0x", vio_info->master_id, > > + "Dom ID:0x", vio_info->domain_id); > > +} > > + > > +static void devapc_extract_vio_dbg(struct mtk_devapc_context *devapc_ctx, > > + int slave_type) > > +{ > > + void __iomem *vio_dbg0_reg, *vio_dbg1_reg; > > + const struct mtk_infra_vio_dbg_desc *vio_dbgs; > > + struct mtk_devapc_vio_info *vio_info; > > + u32 dbg0; > > + > > + vio_dbg0_reg = mtk_devapc_pd_get(devapc_ctx, slave_type, VIO_DBG0, 0); > > + vio_dbg1_reg = mtk_devapc_pd_get(devapc_ctx, slave_type, VIO_DBG1, 0); > > + > > + vio_dbgs = &mt6779_vio_dbgs; > > + vio_info = devapc_ctx->vio_info; > > + > > + /* Extract violation information */ > > + dbg0 = readl(vio_dbg0_reg); > > + vio_info->vio_addr = readl(vio_dbg1_reg); > > + > > + vio_info->master_id = (dbg0 & vio_dbgs->vio_dbg_mstid) >> > > + vio_dbgs->vio_dbg_mstid_start_bit; > > + vio_info->domain_id = (dbg0 & vio_dbgs->vio_dbg_dmnid) >> > > + vio_dbgs->vio_dbg_dmnid_start_bit; > > + vio_info->write = ((dbg0 & vio_dbgs->vio_dbg_w_vio) >> > > + vio_dbgs->vio_dbg_w_vio_start_bit) == 1; > > + vio_info->read = ((dbg0 & vio_dbgs->vio_dbg_r_vio) >> > > + vio_dbgs->vio_dbg_r_vio_start_bit) == 1; > > We can have read and write violation at a time? No, but it keeps independently. > > > + vio_info->vio_addr_high = (dbg0 & vio_dbgs->vio_addr_high) >> > > + vio_dbgs->vio_addr_high_start_bit; > > + > > + devapc_vio_info_print(devapc_ctx); > > +} > > + > > +/* > > + * mtk_devapc_dump_vio_dbg - shift & dump the violation debug information. > > + */ > > +static bool mtk_devapc_dump_vio_dbg(struct mtk_devapc_context *devapc_ctx, > > + int slave_type, int *vio_idx, int *index) > > +{ > > + const struct mtk_device_info **device_info; > > + const struct mtk_device_num *ndevices; > > + void __iomem *pd_vio_shift_sta_reg; > > + u32 shift_bit; > > + int i; > > + > > + if (!vio_idx) > > + return NULL; > > + > > + device_info = devapc_ctx->device_info; > > + ndevices = mtk6779_devices_num; > > + > > + pd_vio_shift_sta_reg = mtk_devapc_pd_get(devapc_ctx, slave_type, > > + VIO_SHIFT_STA, 0); > > + > > + for (i = 0; i < ndevices[slave_type].vio_slave_num; i++) { > > + *vio_idx = device_info[slave_type][i].vio_index; > > + > > + if (check_vio_mask(devapc_ctx, slave_type, *vio_idx)) > > + continue; > > + > > + if (check_vio_status(devapc_ctx, slave_type, *vio_idx) <= 0) > > + continue; > > + > > + shift_bit = mt6779_shift_group_get(*vio_idx); > > shift_bit should be part of mtk_device_info data structure. > You can create two macros to define mtk_device_info entries, one which sets the > shift bit to 31 and another one, that allows for setting the bit explicitely. This is another way to get shift bit. What benefit could we get? I could only imagine array indexing is more efficient than function call. But we do not really care the performance impact since the violation scenario is unexpected. > > > + > > + if (!sync_vio_dbg(devapc_ctx, slave_type, shift_bit)) > > + continue; > > + > > + devapc_extract_vio_dbg(devapc_ctx, slave_type); > > + *index = i; > > + > > + return true; > > + } > > + > > + return false; > > +} > > + > > +/* > > + * devapc_violation_irq - the devapc Interrupt Service Routine (ISR) will dump > > + * violation information including which master violates > > + * access slave. > > + */ > > +static irqreturn_t devapc_violation_irq(int irq_number, > > + struct mtk_devapc_context *devapc_ctx) > > +{ > > + const struct mtk_device_info **device_info = devapc_ctx->device_info; > > + int vio_idx = -1; > > + int index = -1; > > + int slave_type; > > + > > + for (slave_type = 0; slave_type < SLAVE_TYPE_NUM; slave_type++) { > > + if (!mtk_devapc_dump_vio_dbg(devapc_ctx, slave_type, &vio_idx, > > + &index)) > > + continue; > > + > > + /* Ensure that violation info are written before > > + * further operations > > + */ > > + smp_mb(); > > + > > + mask_module_irq(devapc_ctx, slave_type, vio_idx, true); > > + > > + clear_vio_status(devapc_ctx, slave_type, vio_idx); > > + > > + pr_info(PFX "Violation - slave_type:0x%x, sys_index:0x%x, ctrl_index:0x%x, vio_index:0x%x\n", > > + slave_type, > > + device_info[slave_type][index].sys_index, > > + device_info[slave_type][index].ctrl_index, > > + device_info[slave_type][index].vio_index); > > How will that then be used? Will there some kind of user-space daemon which will > parse the kernel log to see if a violation happens? What will it do with this > information? > > I still don't understand why we need to do that in the kernel instead of in > TF-A. Can you please explain? > We would do different extra handle for different bus masters internally. Basically, different bus masters have different debug mechanism. And different customers have different severity about devapc violation. For example, kernel exception, external exception, warning, don't care,... I list 2 reason why I put it in kernel instead of ATF. 1. Rich OS such as Linux kernel has more debug mechanism and tools to find murderer. 2. If interrupt has to be handled in ATF, GIC intr would be set as G0S (Group 0 Secure). For our interrupt routing, G0S intr would be fiq. When we handle it in EL3, it would mask all EL1 irq temporarily. We do not treat devapc interrupt as such critical. Doe it make sense? Or do you have any reason that it should be handled in ATF? > > > + > > + mask_module_irq(devapc_ctx, slave_type, vio_idx, false); > > + } > > + > > + return IRQ_HANDLED; > > +} > > + > > +/* > > + * start_devapc - initialize devapc status and start receiving interrupt > > + * while devapc violation is triggered. > > + */ > > +static void start_devapc(struct mtk_devapc_context *devapc_ctx) > > +{ > > + const struct mtk_device_info **device_info; > > + const struct mtk_device_num *ndevices; > > + void __iomem *pd_vio_shift_sta_reg; > > + void __iomem *pd_apc_con_reg; > > + int slave_type, vio_idx, i; > > + u32 vio_shift_sta; > > + > > + devapc_ctx->device_info[0] = mt6779_devices_infra; > > One element arry should be a simple pointer. > mt6779_devices_infra should be DT data for the mt6779 compatible. Yes, you are right. It's no need to use element array. I'll try it could put into DT data or not. > > > + device_info = devapc_ctx->device_info; > > + ndevices = mtk6779_devices_num; > > + > > + for (slave_type = 0; slave_type < SLAVE_TYPE_NUM; slave_type++) { > > For loop not needed, we ony have one SLAVE_TYPE. Yes, I'll fix it. > > > + pd_apc_con_reg = mtk_devapc_pd_get(devapc_ctx, slave_type, > > + APC_CON, 0); > > + pd_vio_shift_sta_reg = mtk_devapc_pd_get(devapc_ctx, slave_type, > > + VIO_SHIFT_STA, 0); > > + > > + if (!pd_apc_con_reg || !pd_vio_shift_sta_reg) > > + return; > > + > > + /* Clear devapc violation status */ > > + writel(BIT(31), pd_apc_con_reg); > > + > > + /* Clear violation shift status */ > > + vio_shift_sta = readl(pd_vio_shift_sta_reg); > > + if (vio_shift_sta) > > + writel(vio_shift_sta, pd_vio_shift_sta_reg); > > + > > + /* Clear slave violation status */ > > + for (i = 0; i < ndevices[slave_type].vio_slave_num; i++) { > > + vio_idx = device_info[slave_type][i].vio_index; > > + > > + clear_vio_status(devapc_ctx, slave_type, vio_idx); > > + > > + mask_module_irq(devapc_ctx, slave_type, vio_idx, false); > > + } > > + } > > +} > > + > > +static int mt6779_devapc_probe(struct platform_device *pdev) > > +{ > > + struct device_node *node = pdev->dev.of_node; > > + struct mtk_devapc_context *devapc_ctx; > > + struct clk *devapc_infra_clk; > > + u32 devapc_irq; > > + int ret; > > + > > + if (IS_ERR(node)) > > + return -ENODEV; > > + > > + devapc_ctx = devm_kzalloc(&pdev->dev, sizeof(struct mtk_devapc_context), > > + GFP_KERNEL); > > + if (!devapc_ctx) > > + return -ENOMEM; > > + > > + devapc_ctx->vio_info = devm_kzalloc(&pdev->dev, > > + sizeof(struct mtk_devapc_vio_info), > > + GFP_KERNEL); > > + if (!devapc_ctx->vio_info) > > + return -ENOMEM; > > + > > + devapc_ctx->devapc_pd_base[0] = of_iomap(node, 0); > > No array needed, we only have one element... Ditto. > > > + if (!devapc_ctx->devapc_pd_base[0]) > > + return -EINVAL; > > + > > + devapc_irq = irq_of_parse_and_map(node, 0); > > + if (!devapc_irq) > > + return -EINVAL; > > + > > + devapc_infra_clk = devm_clk_get(&pdev->dev, "devapc-infra-clock"); > > + > > No new line here, please check conding style and apply to all the code. Yes, I'll fix it. > > > + if (IS_ERR(devapc_infra_clk)) > > + return -EINVAL; > > + > > + if (clk_prepare_enable(devapc_infra_clk)) > > + return -EINVAL; > > + > > + start_devapc(devapc_ctx); > > + > > + ret = devm_request_irq(&pdev->dev, devapc_irq, > > + (irq_handler_t)devapc_violation_irq, > > + IRQF_TRIGGER_NONE, "devapc", devapc_ctx); > > + if (ret) > > + return ret; > > + > > + return 0; > > +} > > + > > +static int mt6779_devapc_remove(struct platform_device *dev) > > +{ > > + return 0; > > +} > > + > > +static const struct of_device_id mt6779_devapc_dt_match[] = { > > + { .compatible = "mediatek,mt6779-devapc" }, > > + {}, > > +}; > > + > > +static struct platform_driver mt6779_devapc_driver = { > > + .probe = mt6779_devapc_probe, > > + .remove = mt6779_devapc_remove, > > + .driver = { > > + .name = KBUILD_MODNAME, > > + .of_match_table = mt6779_devapc_dt_match, > > + }, > > +}; > > + > > +module_platform_driver(mt6779_devapc_driver); > > + > > +MODULE_DESCRIPTION("Mediatek MT6779 Device APC Driver"); > > +MODULE_AUTHOR("Neal Liu "); > > +MODULE_LICENSE("GPL"); > > diff --git a/drivers/soc/mediatek/devapc/devapc-mt6779.h b/drivers/soc/mediatek/devapc/devapc-mt6779.h > > new file mode 100644 > > index 0000000..8c0e4e7 > > --- /dev/null > > +++ b/drivers/soc/mediatek/devapc/devapc-mt6779.h > > @@ -0,0 +1,99 @@ > > +/* SPDX-License-Identifier: GPL-2.0 */ > > +/* > > + * Copyright (C) 2020 MediaTek Inc. > > + */ > > + > > +#ifndef __DEVAPC_MT6779_H__ > > +#define __DEVAPC_MT6779_H__ > > + > > +#define PFX "[DEVAPC]: " > > +#define MOD_NM_IN_1_DEVAPC 16 > > + > > +enum DEVAPC_SLAVE_TYPE { > > + SLAVE_TYPE_INFRA = 0, > > + SLAVE_TYPE_NUM, > > +}; > > + > > +enum DEVAPC_PD_REG_TYPE { > > + VIO_MASK = 0, > > + VIO_STA, > > + VIO_DBG0, > > + VIO_DBG1, > > + APC_CON, > > + VIO_SHIFT_STA, > > + VIO_SHIFT_SEL, > > + VIO_SHIFT_CON, > > + PD_REG_TYPE_NUM, > > +}; > > + > > +enum DEVAPC_VIO_MASK_STA_NUM { > > + VIO_MASK_STA_NUM_INFRA = 17, > > #define instead of enum Okay, I'll fix it. Put it into DT data might be better way. > > > +}; > > + > > +enum DEVAPC_VIO_SLAVE_NUM { > > + VIO_SLAVE_NUM_INFRA = 499, > > #define instead of enum. > Ditto. > > +}; > > + > > +enum DEVAPC_PD_OFFSET { > > + PD_VIO_MASK_OFFSET = 0x0, > > + PD_VIO_STA_OFFSET = 0x400, > > + PD_VIO_DBG0_OFFSET = 0x900, > > + PD_VIO_DBG1_OFFSET = 0x904, > > + PD_APC_CON_OFFSET = 0xF00, > > + PD_SHIFT_STA_OFFSET = 0xF10, > > + PD_SHIFT_SEL_OFFSET = 0xF14, > > + PD_SHIFT_CON_OFFSET = 0xF20, > > #define instead of enum > I think this should be part of mtk_device_info on a per SoC base (provided via > DT data). > Ditto. > > +}; > > + > > +struct mtk_device_num { > > + int slave_type; > > + u32 vio_slave_num; > > +}; > > + > > +struct mtk_devapc_vio_info { > > + bool read; > > + bool write; > > + u32 vio_addr; > > + u32 vio_addr_high; > > + u32 master_id; > > + u32 domain_id; > > +}; > > + > > +struct mtk_infra_vio_dbg_desc { > > + u32 vio_dbg_mstid; > > + u8 vio_dbg_mstid_start_bit; > > + u32 vio_dbg_dmnid; > > + u8 vio_dbg_dmnid_start_bit; > > + u32 vio_dbg_w_vio; > > + u8 vio_dbg_w_vio_start_bit; > > + u32 vio_dbg_r_vio; > > + u8 vio_dbg_r_vio_start_bit; > > + u32 vio_addr_high; > > + u8 vio_addr_high_start_bit; > > +}; > > + > > +struct mtk_device_info { > > + int sys_index; > > + int ctrl_index; > > + int vio_index; > > A quick check showed me that the vio_index == the index in the array. Drop it. > No, vio_index is different from index of the array. > > +}; > > + > > +struct mtk_devapc_context { > > + void __iomem *devapc_pd_base[SLAVE_TYPE_NUM]; > > + const struct mtk_device_info *device_info[SLAVE_TYPE_NUM]; > > + struct mtk_devapc_vio_info *vio_info; > > +}; > > + > > +/* For Infra VIO_DBG */ > > +#define INFRA_VIO_DBG_MSTID 0x0000FFFF > > +#define INFRA_VIO_DBG_MSTID_START_BIT 0 > > +#define INFRA_VIO_DBG_DMNID 0x003F0000 > > +#define INFRA_VIO_DBG_DMNID_START_BIT 16 > > +#define INFRA_VIO_DBG_W_VIO 0x00400000 > > +#define INFRA_VIO_DBG_W_VIO_START_BIT 22 > > +#define INFRA_VIO_DBG_R_VIO 0x00800000 > > +#define INFRA_VIO_DBG_R_VIO_START_BIT 23 > > +#define INFRA_VIO_ADDR_HIGH 0x0F000000 > > +#define INFRA_VIO_ADDR_HIGH_START_BIT 24 > > + > > +#endif /* __DEVAPC_MT6779_H__ */ > > _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel