From owner-freebsd-arm@FreeBSD.ORG Tue May 19 09:28:42 2015 Return-Path: Delivered-To: freebsd-arm@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 2D167325 for ; Tue, 19 May 2015 09:28:42 +0000 (UTC) Received: from phabric-backend.isc.freebsd.org (phabric-backend.isc.freebsd.org [IPv6:2001:4f8:3:ffe0:406a:0:50:2]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 0EC311871 for ; Tue, 19 May 2015 09:28:42 +0000 (UTC) Received: from phabric-backend.isc.freebsd.org (phabric-backend.isc.freebsd.org [127.0.1.5]) by phabric-backend.isc.freebsd.org (8.14.9/8.14.9) with ESMTP id t4J9SfEl017031 for ; Tue, 19 May 2015 09:28:41 GMT (envelope-from daemon-user@phabric-backend.isc.freebsd.org) Received: (from daemon-user@localhost) by phabric-backend.isc.freebsd.org (8.14.9/8.14.9/Submit) id t4J9Sf6T017030; Tue, 19 May 2015 09:28:41 GMT (envelope-from daemon-user) Date: Tue, 19 May 2015 09:28:41 +0000 To: freebsd-arm@freebsd.org From: "jpa-semihalf.com (Jakub Palider)" Subject: [Differential] [Request, 1, 557 lines] D2579: PCI support for Alpine platform from Annapurna Labs Message-ID: X-Priority: 3 Thread-Topic: D2579: PCI support for Alpine platform from Annapurna Labs X-Herald-Rules: none X-Phabricator-To: X-Phabricator-To: X-Phabricator-To: X-Phabricator-To: X-Phabricator-Cc: Thread-Index: NjYxMzQxMmI2MjBmNTRlMzhjMzBkMTMzMmNh Precedence: bulk X-Phabricator-Sent-This-Message: Yes X-Mail-Transport-Agent: MetaMTA X-Auto-Response-Suppress: All X-Phabricator-Mail-Tags: , , , MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="b1_5b195ef0c6e36ed87c42d297273477fd" X-BeenThere: freebsd-arm@freebsd.org X-Mailman-Version: 2.1.20 List-Id: "Porting FreeBSD to ARM processors." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 19 May 2015 09:28:42 -0000 --b1_5b195ef0c6e36ed87c42d297273477fd Content-Type: text/plain; charset = "utf-8" Content-Transfer-Encoding: 8bit jpa-semihalf.com created this revision. jpa-semihalf.com added reviewers: andrew, ian, imp. jpa-semihalf.com added a subscriber: freebsd-arm. REVISION SUMMARY This is a continuation of https://reviews.freebsd.org/D2340 and follows Andrew's suggestion to extract code related to PCI support into a separate review. This is an intermediate step between the first commit and adding MSIx support (including transition towards Linux dts). REVISION DETAIL https://reviews.freebsd.org/D2579 AFFECTED FILES sys/arm/annapurna/alpine/alpine_pci.c sys/arm/annapurna/alpine/alpine_pci.h sys/arm/annapurna/alpine/files.alpine sys/arm/conf/ALPINE EMAIL PREFERENCES https://reviews.freebsd.org/settings/panel/emailpreferences/ To: jpa-semihalf.com, andrew, ian, imp Cc: freebsd-arm --b1_5b195ef0c6e36ed87c42d297273477fd Content-Type: text/x-patch; charset=utf-8; name="D2579.5470.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="D2579.5470.patch" ZGlmZiAtLWdpdCBhL3N5cy9hcm0vY29uZi9BTFBJTkUgYi9zeXMvYXJtL2NvbmYvQUxQSU5FCi0t LSBhL3N5cy9hcm0vY29uZi9BTFBJTkUKKysrIGIvc3lzL2FybS9jb25mL0FMUElORQpAQCAtNjMs OCArNjMsMTMgQEAKICMgU2VyaWFsIHBvcnRzCiBkZXZpY2UJCXVhcnQKIAorI1BDSS9QQ0lFCitk ZXZpY2UJCXBjaQorCiAjIEV0aGVybmV0CiBkZXZpY2UJCWV0aGVyCitkZXZpY2UJCXJlCitkZXZp Y2UJCWVtCiBkZXZpY2UJCW1paQogZGV2aWNlCQlicGYKIG9wdGlvbnMgCURFVklDRV9QT0xMSU5H CmRpZmYgLS1naXQgYS9zeXMvYXJtL2FubmFwdXJuYS9hbHBpbmUvZmlsZXMuYWxwaW5lIGIvc3lz L2FybS9hbm5hcHVybmEvYWxwaW5lL2ZpbGVzLmFscGluZQotLS0gYS9zeXMvYXJtL2FubmFwdXJu YS9hbHBpbmUvZmlsZXMuYWxwaW5lCisrKyBiL3N5cy9hcm0vYW5uYXB1cm5hL2FscGluZS9maWxl cy5hbHBpbmUKQEAgLTExLDYgKzExLDggQEAKIGRldi91YXJ0L3VhcnRfZGV2X25zODI1MC5jCQkJ b3B0aW9uYWwJdWFydAogZGV2L29mdy9vZndfY3B1LmMJCQkJc3RhbmRhcmQKIAorYXJtL2FubmFw dXJuYS9hbHBpbmUvYWxwaW5lX3BjaS5jCQlvcHRpb25hbAlwY2kKK2FybS9hbm5hcHVybmEvYWxw aW5lL2hhbC9hbF9oYWxfcGNpZS5jCQlvcHRpb25hbAlwY2kKIGFybS9hbm5hcHVybmEvYWxwaW5l L2NvbW1vbi5jCQkJc3RhbmRhcmQKIGFybS9hbm5hcHVybmEvYWxwaW5lL2FscGluZV9tYWNoZGVw LmMJCXN0YW5kYXJkCiBhcm0vYW5uYXB1cm5hL2FscGluZS9hbHBpbmVfbWFjaGRlcF9tcC5jCW9w dGlvbmFsCXNtcApkaWZmIC0tZ2l0IGEvc3lzL2FybS9hbm5hcHVybmEvYWxwaW5lL2FscGluZV9w Y2kuaCBiL3N5cy9hcm0vYW5uYXB1cm5hL2FscGluZS9hbHBpbmVfcGNpLmgKbmV3IGZpbGUgbW9k ZSAxMDA2NDQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvYXJtL2FubmFwdXJuYS9hbHBpbmUvYWxw aW5lX3BjaS5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qLQorKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioK K0NvcHlyaWdodCAoQykgMjAxNSBBbm5hcHVybmEgTGFicyBMdGQuCisKK1RoaXMgZmlsZSBtYXkg YmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBbm5hcHVybmEgTGFicyBDb21tZXJj aWFsCitMaWNlbnNlIEFncmVlbWVudC4KKworQWx0ZXJuYXRpdmVseSwgdGhpcyBmaWxlIGNhbiBi ZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMg TGljZW5zZSBWMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBh bmQgY2FuIGJlCitmb3VuZCBhdCBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5o dG1sCisKK0FsdGVybmF0aXZlbHksIHJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKK3dpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0 dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorbWV0OgorCisg ICAgKiAgICAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh Ym92ZSBjb3B5cmlnaHQgbm90aWNlLAordGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm b2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgICogICAgIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Citub3RpY2UsIHRoaXMg bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KK3RoZSBk b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKK2Rp c3RyaWJ1dGlvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hU IEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAorQU5ZIEVYUFJFU1MgT1IgSU1Q TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJ RUQKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ Q1VMQVIgUFVSUE9TRSBBUkUKK0RJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZ UklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKK0FOWSBESVJFQ1QsIElO RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwg REFNQUdFUworKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBT VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJ VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCitBTlkg VEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU WSwgT1IgVE9SVAorKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKK1NPRlRXQVJFLCBFVkVOIElGIEFEVklT RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqLworCisjaWZuZGVmIEFMUElORV9QQ0lfSF8KKyNkZWZpbmUgQUxQSU5FX1BDSV9IXwor CisjZGVmaW5lIEFMX1BDSV9SQU5HRV9NQVgJCTMKKyNkZWZpbmUgQUxfUENJX1JBTkdFX0JSSURH RQkJMAorI2RlZmluZSBBTF9QQ0lfUkFOR0VfTUVNCQkxCisjZGVmaW5lIEFMX1BDSV9SQU5HRV9J TwkJCTIKKworI2VuZGlmIC8qIEFMUElORV9QQ0lfSF8gKi8KZGlmZiAtLWdpdCBhL3N5cy9hcm0v YW5uYXB1cm5hL2FscGluZS9hbHBpbmVfcGNpLmMgYi9zeXMvYXJtL2FubmFwdXJuYS9hbHBpbmUv YWxwaW5lX3BjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lz L2FybS9hbm5hcHVybmEvYWxwaW5lL2FscGluZV9wY2kuYwpAQCAtMCwwICsxLDE1MDUgQEAKKy8q LQorICogQ29weXJpZ2h0IChjKSAyMDA4IE1BUlZFTEwgSU5URVJOQVRJT05BTCBMVEQuCisgKiBD b3B5cmlnaHQgKGMpIDIwMTAgVGhlIEZyZWVCU0QgRm91bmRhdGlvbgorICogQ29weXJpZ2h0IChj KSAyMDEwLTIwMTUgU2VtaWhhbGYKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2 ZWxvcGVkIGJ5IFNlbWloYWxmLgorICoKKyAqIFBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgd2Vy ZSBkZXZlbG9wZWQgYnkgU2VtaWhhbGYKKyAqIHVuZGVyIHNwb25zb3JzaGlwIGZyb20gdGhlIEZy ZWVCU0QgRm91bmRhdGlvbi4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0 aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90 aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgTUFS VkVMTCBub3IgdGhlIG5hbWVzIG9mIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8g ZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisg KiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBU SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMg SVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H LCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBE SVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBM SUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwg RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO T1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VS VklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV UFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFks IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNM VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VU IE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT SUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICovCisKKy8qCisgKiBBbHBpbmUgUENJ L1BDSS1FeHByZXNzIGNvbnRyb2xsZXIgZHJpdmVyLgorICovCisKKyNpbmNsdWRlIDxzeXMvY2Rl ZnMuaD4KK19fRkJTRElEKCIkRnJlZUJTRCQiKTsKKworI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgor I2luY2x1ZGUgPHN5cy9zeXN0bS5oPgorI2luY2x1ZGUgPHN5cy9rZXJuZWwuaD4KKyNpbmNsdWRl IDxzeXMvbG9jay5oPgorI2luY2x1ZGUgPHN5cy9tYWxsb2MuaD4KKyNpbmNsdWRlIDxzeXMvbW9k dWxlLmg+CisjaW5jbHVkZSA8c3lzL211dGV4Lmg+CisjaW5jbHVkZSA8c3lzL3F1ZXVlLmg+Cisj aW5jbHVkZSA8c3lzL2J1cy5oPgorI2luY2x1ZGUgPHN5cy9ybWFuLmg+CisjaW5jbHVkZSA8c3lz L2VuZGlhbi5oPgorI2luY2x1ZGUgPHN5cy9rZGIuaD4KKworI2luY2x1ZGUgPG1hY2hpbmUvaW50 ci5oPgorI2luY2x1ZGUgPG1hY2hpbmUvZmR0Lmg+CisKKyNpbmNsdWRlIDx2bS92bS5oPgorI2lu Y2x1ZGUgPHZtL3BtYXAuaD4KKworI2luY2x1ZGUgPGRldi9mZHQvZmR0X2NvbW1vbi5oPgorI2lu Y2x1ZGUgPGRldi9vZncvb2Z3X3BjaS5oPgorI2luY2x1ZGUgPGRldi9vZncvb2Z3X2J1cy5oPgor I2luY2x1ZGUgPGRldi9vZncvb2Z3X2J1c19zdWJyLmg+CisjaW5jbHVkZSA8ZGV2L3BjaS9wY2l2 YXIuaD4KKyNpbmNsdWRlIDxkZXYvcGNpL3BjaXJlZy5oPgorI2luY2x1ZGUgPGRldi9wY2kvcGNp Yl9wcml2YXRlLmg+CisKKyNpbmNsdWRlICJvZndfYnVzX2lmLmgiCisjaW5jbHVkZSAicGNpYl9p Zi5oIgorI2luY2x1ZGUgImFscGluZV9wY2kuaCIKKyNpbmNsdWRlICJoYWwvYWxfaGFsX3VuaXRf YWRhcHRlcl9yZWdzLmgiCisjaW5jbHVkZSAiaGFsL2FsX2hhbF9wY2llLmgiCisKKyNpbmNsdWRl ICJvcHRfYWxwaW5lLmgiCisKKy8qIE1pbmltdW0gUENJIE1lbW9yeSBhbmQgSS9PIGFsbG9jYXRp b25zIHRha2VuIGZyb20gUENJIHNwZWMgKGluIGJ5dGVzKSAqLworI2RlZmluZQlQQ0lfTUlOX0lP X0FMTE9DCTQKKyNkZWZpbmUJUENJX01JTl9NRU1fQUxMT0MJMTYKKworI2RlZmluZQlQQ0lfTUFY X0JVU19OVU1CRVIJMjU1CisKKyNkZWZpbmUJUENJRV9NSU5fTVBTCTEyOAorI2RlZmluZQlQQ0lF X01BWF9NUFMJNDA5NgorCisjZGVmaW5lCVBDSUVfTUlOX01SUlMJMTI4CisjZGVmaW5lCVBDSUVf TUFYX01SUlMJNDA5NgorCisjZGVmaW5lCUFMX1BDSV9QT1JUUyA0CisKKy8qIE1heGltdW0gUENJ L1BDSUUgTWVtb3J5ICovCisjZGVmaW5lCUFMX1BDSV9NRU1fU0laRQkJKDB4MTAwMDAwMDAwKQor I2RlZmluZQlBTF9QQ0lfTUVNX1NMSUNFX1NJWkUJKEFMX1BDSV9NRU1fU0laRSAvIEFMX1BDSV9Q T1JUUykKKworLyogTWF4aW11bSBQQ0kvUENJRSBJL08gKi8KKyNkZWZpbmUJQUxfUENJX0lPX1NJ WkUJCSgweDEwMDAwMCkJLyogMU1CICovCisjZGVmaW5lCUFMX1BDSV9JT19TTElDRV9TSVpFCShB TF9QQ0lfSU9fU0laRSAvIEFMX1BDSV9QT1JUUykKKworI2RlZmluZQlBTF9QQ0lfTUFYX1NMT1RT CTE2CisjZGVmaW5lCUJJVFNfUEVSX1VJTlQzMgkJKE5CQlkgKiBzaXplb2YodWludDMyX3QpKQor I2RlZmluZQlBTF9NQVhfU1VQUE9SVEVEX01QUwkxMjgKKworI2RlZmluZQlBTF9JTlRFUk5BTF9C UklER0VfRUNBTV9CQVNFCTB4MjAwMAorCisjZGVmaW5lCVBDSUVNX0NUTF9NQVhfUEFZTE9BRF9F TVBUWV9CSVRTCTUKKyNkZWZpbmUJUENJRU1fQ1RMX01BWF9SRUFEX1JFUVVFU1RfRU1QVFlfQklU UwkxMgorCisjZGVmaW5lCUZEVF9SQU5HRVNfQ0VMTFMJKCgzICsgMyArIDIpICogMykKKyNkZWZp bmUJRkRUX1JBTkdFX01FTQkJMHgwMjAwMDAwMAorI2RlZmluZQlGRFRfUkFOR0VfSU8JCTB4MDEw MDAwMDAKKworI2RlZmluZQlBTF9BWElfU0xPVAkxNQorI2RlZmluZQlBTF9BWElfRlVOQwkxMgor CisjZGVmaW5lCUNPTkZJR19BRERSRVNTX1pFUk9fQklUU19NQVNLCQkweDMKKyNkZWZpbmUJQ09O RklHX0FERFJFU1NfQllURV9TRUxFQ1RPUl9NQVNLCTB4MworCisjZGVmaW5lCUJBUl9TSVpFX0lO XzMyQklUX1VOSVRTKGJhcikJKCgoYmFyICYgNykgPT0gNCkgPyAyIDogMSkKKwordHlwZWRlZiBl bnVtIHsKKwlBTF9QQ0lfVFlQRV9JTlRFUk5BTCA9IDEsCisJQUxfUENJX1RZUEVfRVhURVJOQUwg PSAyLAorfSBhbF9wY2lfdHlwZTsKKworc3RhdGljIHN0cnVjdCBvZndfY29tcGF0X2RhdGEgY29t cGF0X2RhdGFbXSA9IHsKKwl7ImFubmFwdXJuYS1sYWJzLGFsLWludGVybmFsLXBjaWUiLCBBTF9Q Q0lfVFlQRV9JTlRFUk5BTH0sCisJeyJhbm5hcHVybmEtbGFicyxhbC1leHRlcm5hbC1wY2llIiwg QUxfUENJX1RZUEVfRVhURVJOQUx9LAorCXtOVUxMLCAwfQorfTsKKworCitzdHJ1Y3QgYWxfcGNp X3JhbmdlIHsKKwl1X2xvbmcJYmFzZV9wY2k7CisJdV9sb25nCWJhc2VfcGFyZW50OworCXVfbG9u ZwlsZW47Cit9OworCit0eXBlZGVmIHN0cnVjdCB7CisJZGV2aWNlX3QJc2NfZGV2OworCWFsX3Bj aV90eXBlCXNjX3R5cGU7CisJdWludDMyX3QJc2NfYnVzbnI7CisJYnVzX2FkZHJfdAllY2FtX2hh bmRsZTsKKwlzdHJ1Y3QgYWxfcGNpZV9wb3J0CXBjaWVfcG9ydDsKKwlidXNfYWRkcl90CXJlZ19o YW5kbGU7CisJdWludDMyX3QJaW5kZXg7CisJc3RydWN0IGFsX3BjaWVfbGlua19zdGF0dXMJc3Rh dHVzOworCXN0cnVjdCBtdHgJY29uZl9sb2NrOworCXVpbnQzMl90CXRhcmdldF9idXM7CisJc3Ry dWN0IGFsX3BjaV9yYW5nZQlwY2lfcmFuZ2VbQUxfUENJX1JBTkdFX01BWF07CisJc3RydWN0IHJt YW4Jc2NfbWVtX3JtYW47CisJc3RydWN0IHJtYW4Jc2NfaW9fcm1hbjsKKwl1aW50MzJfdAlzY19p b19tYXBbQUxfUENJX0lPX1NMSUNFX1NJWkUgLworCSAgICAoUENJX01JTl9JT19BTExPQyAqIEJJ VFNfUEVSX1VJTlQzMildOworCXVpbnQzMl90CXNjX21lbV9tYXBbQUxfUENJX01FTV9TTElDRV9T SVpFIC8KKwkgICAgKFBDSV9NSU5fTUVNX0FMTE9DICogQklUU19QRVJfVUlOVDMyKV07CisJc3Ry dWN0IG9md19idXNfaWluZm8Jc2NfcGNpX2lpbmZvOworfSBhbF9wY2liX3NvZnRjOworCisvKiBG b3J3YXJkIHByb3RvdHlwZXMgKi8KK3N0YXRpYyBpbnQgYWxfcGNpYl9wcm9iZShkZXZpY2VfdCk7 CitzdGF0aWMgaW50IGFsX3BjaWJfYXR0YWNoKGRldmljZV90KTsKKworc3RhdGljIHN0cnVjdCBy ZXNvdXJjZSAqYWxfcGNpYl9hbGxvY19yZXNvdXJjZShkZXZpY2VfdCwgZGV2aWNlX3QsIGludCwK KyAgICBpbnQgKiwgdV9sb25nLCB1X2xvbmcsIHVfbG9uZywgdV9pbnQpOworc3RhdGljIGludCBh bF9wY2liX3JlbGVhc2VfcmVzb3VyY2UoZGV2aWNlX3QsIGRldmljZV90LCBpbnQsIGludCwKKyAg ICBzdHJ1Y3QgcmVzb3VyY2UgKik7CitzdGF0aWMgaW50IGFsX3BjaWJfcmVhZF9pdmFyKGRldmlj ZV90LCBkZXZpY2VfdCwgaW50LCB1aW50cHRyX3QgKik7CitzdGF0aWMgaW50IGFsX3BjaWJfd3Jp dGVfaXZhcihkZXZpY2VfdCwgZGV2aWNlX3QsIGludCwgdWludHB0cl90KTsKK3N0YXRpYyBpbnQg YWxfcGNpYl9pbml0KGFsX3BjaWJfc29mdGMgKnNjLCBpbnQgYnVzLCBpbnQgbWF4c2xvdCk7Citz dGF0aWMgdm9pZCBhbF9wY2liX2VuYWJsZShhbF9wY2liX3NvZnRjICpzYyk7CitzdGF0aWMgaW50 IGFsX3BjaWJfd3JpdGVfaXZhcihkZXZpY2VfdCBkZXYsIGRldmljZV90IGNoaWxkLCBpbnQgd2hp Y2gsCisgICAgdWludHB0cl90IHZhbHVlKTsKK3N0YXRpYyBpbnQgYWxfcGNpYl9tYXhzbG90cyhk ZXZpY2VfdCk7CitzdGF0aWMgdWludDMyX3QgYWxfcGNpYl9yZWFkX2NvbmZpZyhkZXZpY2VfdCwg dV9pbnQsIHVfaW50LCB1X2ludCwgdV9pbnQsCisgICAgaW50KTsKK3N0YXRpYyB2b2lkIGFsX3Bj aWJfd3JpdGVfY29uZmlnKGRldmljZV90LCB1X2ludCwgdV9pbnQsIHVfaW50LCB1X2ludCwKKyAg ICB1aW50MzJfdCwgaW50KTsKK3N0YXRpYyBpbnQgYWxfcGNpYl9yb3V0ZV9pbnRlcnJ1cHQoZGV2 aWNlX3QgcGNpYiwgZGV2aWNlX3QgZGV2LCBpbnQgcGluKTsKK3N0YXRpYyB2b2lkIGFsX3BjaWJf Zml4dXAoYWxfcGNpYl9zb2Z0YyAqc2MsIGludCBidXMsIGludCBzbG90LCBpbnQgZnVuYyk7Citz dGF0aWMgaW50IGFsX3BjaWJfbWVtX2luaXQoYWxfcGNpYl9zb2Z0YyAqc2MpOworc3RhdGljIHVp bnQzMl90IHBjaWJfYml0X2dldCh1aW50MzJfdCAqbWFwLCB1aW50MzJfdCBiaXQpOworc3RhdGlj IHZvaWQgcGNpYl9iaXRfc2V0KHVpbnQzMl90ICptYXAsIHVpbnQzMl90IGJpdCk7CitzdGF0aWMg dWludDMyX3QgcGNpYl9tYXBfY2hlY2sodWludDMyX3QgKm1hcCwgdWludDMyX3Qgc3RhcnQsIHVp bnQzMl90IGJpdHMpOworc3RhdGljIHZvaWQgcGNpYl9tYXBfc2V0KHVpbnQzMl90ICptYXAsIHVp bnQzMl90IHN0YXJ0LCB1aW50MzJfdCBiaXRzKTsKK3N0YXRpYyBidXNfYWRkcl90IHBjaWJfYWxs b2MoYWxfcGNpYl9zb2Z0YyAqc2MsIHVpbnQzMl90IHNtYXNrKTsKK3N0YXRpYyBpbnQgYWxfcGNp Yl9pbml0X2JhcihhbF9wY2liX3NvZnRjICpzYywgaW50IGJ1cywgaW50IHNsb3QsIGludCBmdW5j LAorICAgIGludCBiYXJubyk7CitzdGF0aWMgaW50IGFsX3BjaWJfaW5pdF9hbGxfYmFycyhhbF9w Y2liX3NvZnRjICpzYywgaW50IGJ1cywgaW50IHNsb3QsCisgICAgaW50IGZ1bmMsIGludCBoZHJ0 eXBlKTsKK3N0YXRpYyB2b2lkIGFsX3BjaWJfaW5pdF9icmlkZ2UoYWxfcGNpYl9zb2Z0YyAqc2Ms IGludCBidXMsIGludCBzbG90LCBpbnQgZnVuYyk7CisKK3N0YXRpYyBpbnQgcGNpZV9zZXRfbXBz KGFsX3BjaWJfc29mdGMgKnNjLCBpbnQgbXBzLCBpbnQgYnVzLCBpbnQgc2xvdCwKKyAgICBpbnQg ZnVuYyk7CitzdGF0aWMgaW50IHBjaWVfZ2V0X21wcyhhbF9wY2liX3NvZnRjICpzYywgaW50IGJ1 cywgaW50IHNsb3QsIGludCBmdW5jKTsKK3N0YXRpYyB1aW50MTZfdCBnZXRfcGNpZV9tYXhfcGF5 bG9hZChhbF9wY2liX3NvZnRjICpzYywgaW50IGJ1cywgaW50IHNsb3QsCisgICAgaW50IGZ1bmMp Oworc3RhdGljIHVpbnQxNl90IGdldF9wY2llX2dldF90eXBlKGFsX3BjaWJfc29mdGMgKnNjLCBp bnQgYnVzLCBpbnQgc2xvdCwKKyAgICBpbnQgZnVuYyk7CitzdGF0aWMgdm9pZCBwY2llX3dyaXRl X21wcyhhbF9wY2liX3NvZnRjICpzYywgaW50IG1wcywgaW50IGJ1cywgaW50IHNsb3QsCisgICAg aW50IGZ1bmMpOworc3RhdGljIHVpbnQxNl90IHBjaWVfZ2V0X3JlYWRycShhbF9wY2liX3NvZnRj ICpzYywgaW50IGJ1cywgaW50IHNsb3QsIGludCBmdW5jKTsKK3N0YXRpYyBpbnQgcGNpZV9zZXRf cmVhZHJxKGFsX3BjaWJfc29mdGMgKnNjLCBpbnQgcnEsIGludCBidXMsIGludCBzbG90LAorICAg IGludCBmdW5jKTsKK3N0YXRpYyB2b2lkIHBjaWVfd3JpdGVfbXJycyhhbF9wY2liX3NvZnRjICpz YywgaW50IGJ1cywgaW50IHNsb3QsIGludCBmdW5jKTsKK3N0YXRpYyBpbnQgcGNpZV9idXNfY29u ZmlndXJlX3NldChhbF9wY2liX3NvZnRjICpzYywgaW50IGJ1cywgaW50IHNsb3QsCisgICAgaW50 IGZ1bmMsIHVpbnQ4X3QgKmRhdGEpOworc3RhdGljIGludCBhbF9wY2llX2NmZ19wcmVwYXJlKGFs X3BjaWJfc29mdGMgKnNjKTsKK3N0YXRpYyBpbnQgYWxfcGNpZV9jZmdfYWRkcihkZXZpY2VfdCBk ZXYsIHVfaW50IGJ1cywgdV9pbnQgc2xvdCwgdV9pbnQgZnVuYywKKyAgICB1X2ludCByZWcsICBp bnQgYnl0ZXMsIGJ1c19hZGRyX3QgKmhhbmRsZSwgYnVzX2FkZHJfdCAqYWRkcik7CitzdGF0aWMg aW50IGFsX3BjaWVfZW5hYmxlX2NvbnRyb2xsZXIoYWxfcGNpYl9zb2Z0YyAqc2MpOworc3RhdGlj IGludCBhbF9wY2llX3BvcnRfY2hlY2tfbGluayhhbF9wY2liX3NvZnRjICpzYyk7CitzdGF0aWMg aW50IGFsX3BjaWVfY2ZnX3ByZXBhcmUoYWxfcGNpYl9zb2Z0YyAqc2MpOworc3RhdGljIGludCBh bF9wY2llX2lvX3ByZXBhcmUoYWxfcGNpYl9zb2Z0YyAqc2MpOworCitzdGF0aWMgaW50IGFsX2Zp bmRfY2FwKGRldmljZV90IGNoaWxkLCB1X2ludCBidXMsIHVfaW50IHNsb3QsIHVfaW50IGZ1bmMs CisgICAgaW50IGNhcGFiaWxpdHksIGludCAqY2FwcmVnKTsKK3N0YXRpYyBpbnQgYWxfZmR0X3Bj aV9yYW5nZXNfZGVjb2RlKHBoYW5kbGVfdCBub2RlLAorICAgIHN0cnVjdCBhbF9wY2lfcmFuZ2Ug KmJyaWRnZV9zcGFjZSwgc3RydWN0IGFsX3BjaV9yYW5nZSAqaW9fc3BhY2UsCisgICAgc3RydWN0 IGFsX3BjaV9yYW5nZSAqbWVtX3NwYWNlKTsKKy8qCisgKiBCdXMgaW50ZXJmYWNlIGRlZmluaXRp b25zLgorICovCitzdGF0aWMgZGV2aWNlX21ldGhvZF90IGFsX3BjaWJfbWV0aG9kc1tdID0gewor CS8qIERldmljZSBpbnRlcmZhY2UgKi8KKwlERVZNRVRIT0QoZGV2aWNlX3Byb2JlLAkJCWFsX3Bj aWJfcHJvYmUpLAorCURFVk1FVEhPRChkZXZpY2VfYXR0YWNoLAkJYWxfcGNpYl9hdHRhY2gpLAor CisJLyogQnVzIGludGVyZmFjZSAqLworCURFVk1FVEhPRChidXNfcmVhZF9pdmFyLAkJYWxfcGNp Yl9yZWFkX2l2YXIpLAorCURFVk1FVEhPRChidXNfd3JpdGVfaXZhciwJCWFsX3BjaWJfd3JpdGVf aXZhciksCisJREVWTUVUSE9EKGJ1c19hbGxvY19yZXNvdXJjZSwJCWFsX3BjaWJfYWxsb2NfcmVz b3VyY2UpLAorCURFVk1FVEhPRChidXNfcmVsZWFzZV9yZXNvdXJjZSwJCWFsX3BjaWJfcmVsZWFz ZV9yZXNvdXJjZSksCisJREVWTUVUSE9EKGJ1c19hY3RpdmF0ZV9yZXNvdXJjZSwJYnVzX2dlbmVy aWNfYWN0aXZhdGVfcmVzb3VyY2UpLAorCURFVk1FVEhPRChidXNfZGVhY3RpdmF0ZV9yZXNvdXJj ZSwJYnVzX2dlbmVyaWNfZGVhY3RpdmF0ZV9yZXNvdXJjZSksCisJREVWTUVUSE9EKGJ1c19zZXR1 cF9pbnRyLAkJYnVzX2dlbmVyaWNfc2V0dXBfaW50ciksCisJREVWTUVUSE9EKGJ1c190ZWFyZG93 bl9pbnRyLAkJYnVzX2dlbmVyaWNfdGVhcmRvd25faW50ciksCisKKwkvKiBwY2liIGludGVyZmFj ZSAqLworCURFVk1FVEhPRChwY2liX21heHNsb3RzLAkJYWxfcGNpYl9tYXhzbG90cyksCisJREVW TUVUSE9EKHBjaWJfcmVhZF9jb25maWcsCQlhbF9wY2liX3JlYWRfY29uZmlnKSwKKwlERVZNRVRI T0QocGNpYl93cml0ZV9jb25maWcsCQlhbF9wY2liX3dyaXRlX2NvbmZpZyksCisJREVWTUVUSE9E KHBjaWJfcm91dGVfaW50ZXJydXB0LAkJYWxfcGNpYl9yb3V0ZV9pbnRlcnJ1cHQpLAorCisjaWZk ZWYgQUxQSU5FX1BDSV9NU0kKKwlERVZNRVRIT0QocGNpYl9hbGxvY19tc2ksCQlhbF9wY2liX2Fs bG9jX21zaSksCisJREVWTUVUSE9EKHBjaWJfcmVsZWFzZV9tc2ksCQlhbF9wY2liX3JlbGVhc2Vf bXNpKSwKKwlERVZNRVRIT0QocGNpYl9tYXBfbXNpLAkJCWFsX3BjaWJfbWFwX21zaSksCisjZW5k aWYKKworCS8qIE9GVyBidXMgaW50ZXJmYWNlICovCisJREVWTUVUSE9EKG9md19idXNfZ2V0X2Nv bXBhdCwJCW9md19idXNfZ2VuX2dldF9jb21wYXQpLAorCURFVk1FVEhPRChvZndfYnVzX2dldF9t b2RlbCwJCW9md19idXNfZ2VuX2dldF9tb2RlbCksCisJREVWTUVUSE9EKG9md19idXNfZ2V0X25h bWUsCQlvZndfYnVzX2dlbl9nZXRfbmFtZSksCisJREVWTUVUSE9EKG9md19idXNfZ2V0X25vZGUs CQlvZndfYnVzX2dlbl9nZXRfbm9kZSksCisJREVWTUVUSE9EKG9md19idXNfZ2V0X3R5cGUsCQlv ZndfYnVzX2dlbl9nZXRfdHlwZSksCisKKwlERVZNRVRIT0RfRU5ECit9OworCitzdGF0aWMgZHJp dmVyX3QgYWxfcGNpYl9kcml2ZXIgPSB7CisJInBjaWIiLAorCWFsX3BjaWJfbWV0aG9kcywKKwlz aXplb2YoYWxfcGNpYl9zb2Z0YyksCit9OworCitkZXZjbGFzc190IHBjaWJfZGV2Y2xhc3M7CisK K0RSSVZFUl9NT0RVTEUocGNpYiwgb2Z3YnVzLCBhbF9wY2liX2RyaXZlciwgcGNpYl9kZXZjbGFz cywgMCwgMCk7CisKK3N0YXRpYyBpbnQKK2FsX2ZkdF9wY2lfcmFuZ2VzX2RlY29kZShwaGFuZGxl X3Qgbm9kZSwgc3RydWN0IGFsX3BjaV9yYW5nZSAqYnJpZGdlX3NwYWNlLAorICAgIHN0cnVjdCBh bF9wY2lfcmFuZ2UgKmlvX3NwYWNlLCBzdHJ1Y3QgYWxfcGNpX3JhbmdlICptZW1fc3BhY2UpCit7 CisJcGNlbGxfdCByYW5nZXNbRkRUX1JBTkdFU19DRUxMU107CisJc3RydWN0IGFsX3BjaV9yYW5n ZSAqcGNpX3NwYWNlOworCXBjZWxsX3QgYWRkcl9jZWxscywgc2l6ZV9jZWxscywgcGFyX2FkZHJf Y2VsbHM7CisJcGNlbGxfdCAqcmFuZ2VzcHRyOworCXBjZWxsX3QgY2VsbDAsIGNlbGwxLCBjZWxs MjsKKwlpbnQgdHVwbGVfc2l6ZSwgdHVwbGVzLCBpLCBydiwgb2Zmc2V0X2NlbGxzLCBsZW47CisK KwkvKgorCSAqIFJldHJpZXZlICdyYW5nZXMnIHByb3BlcnR5LgorCSAqLworCWlmICgoZmR0X2Fk ZHJzaXplX2NlbGxzKG5vZGUsICZhZGRyX2NlbGxzLCAmc2l6ZV9jZWxscykpICE9IDApCisJCXJl dHVybiAoRUlOVkFMKTsKKwlpZiAoYWRkcl9jZWxscyAhPSAzIHx8IHNpemVfY2VsbHMgIT0gMikg eworCQlyZXR1cm4gKEVSQU5HRSk7CisJfQorCisJcGFyX2FkZHJfY2VsbHMgPSBmZHRfcGFyZW50 X2FkZHJfY2VsbHMobm9kZSk7CisJaWYgKHBhcl9hZGRyX2NlbGxzID4gMykgeworCQlyZXR1cm4g KEVSQU5HRSk7CisJfQorCisJbGVuID0gT0ZfZ2V0cHJvcGxlbihub2RlLCAicmFuZ2VzIik7CisJ aWYgKGxlbiA+IHNpemVvZihyYW5nZXMpKQorCQlyZXR1cm4gKEVOT01FTSk7CisKKwlpZiAoT0Zf Z2V0cHJvcChub2RlLCAicmFuZ2VzIiwgcmFuZ2VzLCBzaXplb2YocmFuZ2VzKSkgPD0gMCkKKwkJ cmV0dXJuIChFSU5WQUwpOworCisJdHVwbGVfc2l6ZSA9IHNpemVvZihwY2VsbF90KSAqIChhZGRy X2NlbGxzICsgcGFyX2FkZHJfY2VsbHMgKworCSAgICBzaXplX2NlbGxzKTsKKwl0dXBsZXMgPSBs ZW4gLyB0dXBsZV9zaXplOworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSByYW5nZXMgc28gdGhh dCB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0CisJICogaGF2aW5nIHRoZW0gYWxsIGRlZmlu ZWQgaW4gdGhlIEZEVC4gSW4gcGFydGljdWxhciwgaXQgaXMKKwkgKiBwZXJmZWN0bHkgZmluZSBu b3QgdG8gd2FudCBJL08gc3BhY2Ugb24gUENJIGJ1c3Nlcy4KKwkgKi8KKwliemVybyhpb19zcGFj ZSwgc2l6ZW9mKCppb19zcGFjZSkpOworCWJ6ZXJvKG1lbV9zcGFjZSwgc2l6ZW9mKCptZW1fc3Bh Y2UpKTsKKwliemVybyhicmlkZ2Vfc3BhY2UsIHNpemVvZigqYnJpZGdlX3NwYWNlKSk7CisKKwly YW5nZXNwdHIgPSAmcmFuZ2VzWzBdOworCW9mZnNldF9jZWxscyA9IDA7CisJZm9yIChpID0gMDsg aSA8IHR1cGxlczsgaSsrKSB7CisJCWNlbGwwID0gZmR0X2RhdGFfZ2V0KCh2b2lkICopcmFuZ2Vz cHRyLCAxKTsKKwkJcmFuZ2VzcHRyKys7CisJCWNlbGwxID0gZmR0X2RhdGFfZ2V0KCh2b2lkICop cmFuZ2VzcHRyLCAxKTsKKwkJcmFuZ2VzcHRyKys7CisJCWNlbGwyID0gZmR0X2RhdGFfZ2V0KCh2 b2lkICopcmFuZ2VzcHRyLCAxKTsKKwkJcmFuZ2VzcHRyKys7CisKKwkJaWYgKChjZWxsMCAmIEZE VF9SQU5HRV9NRU0pICE9IDApIHsKKwkJCXBjaV9zcGFjZSA9IG1lbV9zcGFjZTsKKwkJfSBlbHNl IGlmICgoY2VsbDAgJiBGRFRfUkFOR0VfSU8pICE9IDApIHsKKwkJCXBjaV9zcGFjZSA9IGlvX3Nw YWNlOworCQl9IGVsc2UgaWYgKGNlbGwwID09IDApIHsKKwkJCXBjaV9zcGFjZSA9IGJyaWRnZV9z cGFjZTsKKwkJfSBlbHNlIHsKKwkJCXJ2ID0gRVJBTkdFOworCQkJZ290byBvdXQ7CisJCX0KKwor CQlpZiAocGFyX2FkZHJfY2VsbHMgPT0gMykgeworCQkJLyoKKwkJCSAqIFRoaXMgaXMgYSBQQ0kg c3Vibm9kZSAncmFuZ2VzJy4gU2tpcCBjZWxsMCBhbmQKKwkJCSAqIGNlbGwxIG9mIHRoaXMgZW50 cnkgYW5kIG9ubHkgdXNlIGNlbGwyLgorCQkJICovCisJCQlvZmZzZXRfY2VsbHMgPSAyOworCQkJ cmFuZ2VzcHRyICs9IG9mZnNldF9jZWxsczsKKwkJfQorCisJCXBjaV9zcGFjZS0+YmFzZV9wYXJl bnQgPSBmZHRfZGF0YV9nZXQoKHZvaWQgKilyYW5nZXNwdHIsCisJCSAgICBwYXJfYWRkcl9jZWxs cyAtIG9mZnNldF9jZWxscyk7CisJCXJhbmdlc3B0ciArPSBwYXJfYWRkcl9jZWxscyAtIG9mZnNl dF9jZWxsczsKKworCQlwY2lfc3BhY2UtPmxlbiA9IGZkdF9kYXRhX2dldCgodm9pZCAqKXJhbmdl c3B0ciwgc2l6ZV9jZWxscyk7CisJCXJhbmdlc3B0ciArPSBzaXplX2NlbGxzOworCisJCXBjaV9z cGFjZS0+YmFzZV9wY2kgPSBjZWxsMjsKKwl9CisJcnYgPSAwOworb3V0OgorCXJldHVybiAocnYp OworfQorCitzdGF0aWMgaW50CithbF9wY2llX2VuYWJsZV9jb250cm9sbGVyKGFsX3BjaWJfc29m dGMgKnNjKQoreworCWlmIChzYy0+c2NfdHlwZSA9PSBBTF9QQ0lfVFlQRV9JTlRFUk5BTCkKKwkJ cmV0dXJuICgwKTsKKworCS8qIEluaXRpYWxpemUgUENJZSBIQUwgd2l0aCByZWdpc3RlciB0YWcg YW5kIGhhbmRsZSAqLworCWFsX3BjaWVfcG9ydF9oYW5kbGVfaW5pdCgmc2MtPnBjaWVfcG9ydCwg YWxfYnVzX2RtYV90b192YShmZHRidXNfYnNfdGFnLAorCSAgICBzYy0+cmVnX2hhbmRsZSksIE5V TEwgLyogZml4bWUgKi8sIHNjLT5pbmRleCk7CisJaWYgKGFsX3BjaWVfb3BlcmF0aW5nX21vZGVf Z2V0KCZzYy0+cGNpZV9wb3J0KSAhPQorCSAgICBBTF9QQ0lFX09QRVJBVElOR19NT0RFX1JDKSB7 CisJCWRldmljZV9wcmludGYoc2MtPnNjX2RldiwKKwkJICAgICJjb250cm9sbGVyIGlzIG5vdCBj b25maWd1cmVkIHRvIFJvb3QtQ29tcGxleCBtb2RlXG4iKTsKKwkJcmV0dXJuIChFTk9TWVMpOwor CX0KKworCXJldHVybiAoMCk7Cit9CisKKy8qIEdldCBFQ0FNIGFkZHJlc3MgYWNjb3JkaW5nIHRv IGJ1cywgZGV2aWNlLCBmdW5jdGlvbiwgYW5kIG9mZnNldCAqLworc3RhdGljIGludAorYWxfcGNp ZV9jZmdfYWRkcihkZXZpY2VfdCBkZXYsIHVfaW50IGJ1cywgdV9pbnQgc2xvdCwgdV9pbnQgZnVu YywgdV9pbnQgcmVnLAorICAgIGludCBieXRlcywgYnVzX2FkZHJfdCAqaGFuZGxlLCBidXNfYWRk cl90ICphZGRyKQoreworCWFsX3BjaWJfc29mdGMgKnNjID0gZGV2aWNlX2dldF9zb2Z0YyhkZXYp OworCWJ1c19hZGRyX3QgcmV0X3ZhbCA9IChidXNfYWRkcl90KU5VTEw7CisKKwkvKiBUcmFwIG91 dCBpbGxlZ2FsIHZhbHVlcyAqLworCWlmIChidXMgPiBQQ0lfTUFYX0JVU19OVU1CRVIpCisJCXJl dHVybiAoRUZBVUxUKTsKKworCXJldF92YWwgPSAoYnVzX2FkZHJfdCkoKChzbG90IDw8IEFMX0FY SV9TTE9UKSB8IChmdW5jIDw8IEFMX0FYSV9GVU5DKSB8IHJlZykpOworCWlmIChzYy0+c2NfdHlw ZSA9PSBBTF9QQ0lfVFlQRV9JTlRFUk5BTCkgeworCQkqYWRkciA9IHJldF92YWw7CisJCSpoYW5k bGUgPSBzYy0+ZWNhbV9oYW5kbGU7CisJCXJldHVybiAoMCk7CisJfQorCisJLyogTm9ybWFsaXpl IGJ1cyBudW1iZXIgdG8gdGhlIGJhc2Ugb2YgcGFyZW50IGJyaWRnZSAqLworCWJ1cyAtPSBzYy0+ c2NfYnVzbnI7CisKKwkvKiBJZiB0aGVyZSBpcyBubyBsaW5rLCBqdXN0IHNob3cgdGhlIFBDSSBi cmlkZ2UuICovCisJaWYgKHNjLT5zdGF0dXMubGlua191cCA9PSBBTF9GQUxTRSkKKwkJcmV0dXJu IChFRkFVTFQpOworCWlmIChidXMgPT0gMCkgeworCQlpZiAoc2xvdCA+IDApIHsKKwkJCXJldHVy biAoRUZBVUxUKTsKKwkJfQorCQlyZXRfdmFsID0gKGJ1c19hZGRyX3QpKEFMX0lOVEVSTkFMX0JS SURHRV9FQ0FNX0JBU0UgKyByZWcpOworCQkqaGFuZGxlID0gc2MtPnJlZ19oYW5kbGU7CisJCSph ZGRyID0gcmV0X3ZhbDsKKwkJcmV0dXJuICgwKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBXb3Jr YXJvdW5kOiBpdCBlbnVtZXJhdGVzIG9uIGFsbCBpbnRlcm5hbCBidXMgbnVtYmVycyBzbworCQkg KiBjb21tdW5pY2F0ZSBvbmx5IHdpdGggdGhlIGZpcnN0IGRldmljZSBvbiB0aGUgYnVzCisJCSAq LworCQlpZiAoc2xvdCA+IDApCisJCQlyZXR1cm4gKEVGQVVMVCk7CisKKwkJaWYgKChidXMpICE9 IHNjLT50YXJnZXRfYnVzKSB7CisJCQlpZiAoYm9vdHZlcmJvc2UpCisJCQkJZGV2aWNlX3ByaW50 ZihzYy0+c2NfZGV2LAorCQkJCSAgICAiY2hhbmdlIHRhcmdldCBidXMgbnVtYmVyIGZyb20gJWQg dG8gJWRcbiIsCisJCQkJICAgICBzYy0+dGFyZ2V0X2J1cywgYnVzKTsKKwkJCXNjLT50YXJnZXRf YnVzID0gYnVzOworCQkJYWxfcGNpZV90YXJnZXRfYnVzX3NldCgmc2MtPnBjaWVfcG9ydCwgc2Mt PnRhcmdldF9idXMsCisJCQkgICAgMHhGRik7CisJCX0KKwl9CisKKwkqYWRkciA9IHJldF92YWw7 CisJKmhhbmRsZSA9IHNjLT5lY2FtX2hhbmRsZTsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMg aW50CithbF9wY2llX3BvcnRfY2hlY2tfbGluayhhbF9wY2liX3NvZnRjICpzYykKK3sKKworCXN0 cnVjdCBhbF9wY2llX2xpbmtfc3RhdHVzICpzdGF0dXMgPSAmc2MtPnN0YXR1czsKKwlpbnQgcmM7 CisKKwlpZiAoc2MtPnNjX3R5cGUgPT0gQUxfUENJX1RZUEVfSU5URVJOQUwpCisJCXJldHVybiAo MSk7CisKKwlyYyA9IGFsX3BjaWVfbGlua19zdGF0dXMoJnNjLT5wY2llX3BvcnQsIHN0YXR1cyk7 CisJaWYgKHJjIDwgMCkgeworCQlkZXZpY2VfcHJpbnRmKHNjLT5zY19kZXYsICJmYWlsZWQgdG8g Z2V0IHBjaWUgbGluayBzdGF0dXNcbiIpOworCQlyZXR1cm4gKDApOworCX0KKworCWlmIChzdGF0 dXMtPmxpbmtfdXAgPT0gQUxfRkFMU0UpIHsKKwkJZGV2aWNlX3ByaW50ZihzYy0+c2NfZGV2LCAi bGluayAldSBkb3duXG4iLCBzYy0+aW5kZXgpOworCQlyZXR1cm4gKDApOworCX0KKwlkZXZpY2Vf cHJpbnRmKHNjLT5zY19kZXYsICJsaW5rIHVwOiBzcGVlZCBHZW4gJWQgd2lkdGggeCV4XG4iLAor CSAgICBzdGF0dXMtPnNwZWVkLCBzdGF0dXMtPmxhbmVzKTsKKworCXJldHVybiAoMSk7CisKK30K KworLyogcHJlcGFyZSBjb250cm9sbGVyIGZvciBpc3N1aW5nIENGRyB0cmFuc2FjdGlvbnMqLwor c3RhdGljIGludAorYWxfcGNpZV9jZmdfcHJlcGFyZShhbF9wY2liX3NvZnRjICpzYykKK3sKKwor CWlmIChzYy0+c2NfdHlwZSA9PSBBTF9QQ0lfVFlQRV9JTlRFUk5BTCkKKwkJcmV0dXJuICgwKTsK KworCXNjLT50YXJnZXRfYnVzID0gMTsKKwkvKgorCSAqIGZvcmNlIHRoZSBjb250cm9sbGVyIHRv IHNldCB0aGUgcGNpIGJ1cyBpbiB0aGUgVExQIHRvCisJICogcGNpZS0+dGFyZ2V0X2J1cyBubyBt YXR0ZXIgd2hhdCBpcyB0aGUgYnVzIHBvcnRpb24gb2YgdGhlIEVDQU0gYWRkZXNzCisJICogaXMu CisJICovCisJYWxfcGNpZV90YXJnZXRfYnVzX3NldCgmc2MtPnBjaWVfcG9ydCwgc2MtPnRhcmdl dF9idXMsIDB4RkYpOworCisJLyogdGhlIGJ1cyBjb25uZWN0ZWQgdG8gdGhlIGNvbnRyb2xsZXIg YWx3YXlzIGVudW1lcmF0ZWQgYXMgYnVzIDEqLworCWFsX3BjaWVfc2Vjb25kYXJ5X2J1c19zZXQo JnNjLT5wY2llX3BvcnQsIDEpOworCS8qIHNldCBzdWJvcmRpbmFyeSB0byBtYXggdmFsdWUgKi8K KwlhbF9wY2llX3N1Ym9yZGluYXJ5X2J1c19zZXQoJnNjLT5wY2llX3BvcnQsIDB4ZmYpOworCisJ cmV0dXJuICgwKTsKK30KKworc3RhdGljIGludAorYWxfcGNpYl9wcm9iZShkZXZpY2VfdCBkZXYp Cit7CisJY29uc3QgY2hhciAqZHR5cGU7CisJYWxfcGNpX3R5cGUgcGNpdDsKKworCWR0eXBlID0g b2Z3X2J1c19nZXRfdHlwZShkZXYpOworCWlmIChkdHlwZSA9PSBOVUxMIHx8IHN0cmNtcChkdHlw ZSwgInBjaSIpICE9IDApIHsKKwkJcmV0dXJuIChFTlhJTyk7CisJfQorCisJcGNpdCA9IG9md19i dXNfc2VhcmNoX2NvbXBhdGlibGUoZGV2LCBjb21wYXRfZGF0YSktPm9jZF9kYXRhOworCisJc3dp dGNoIChwY2l0KSB7CisJY2FzZSBBTF9QQ0lfVFlQRV9JTlRFUk5BTDoKKwkJZGV2aWNlX3NldF9k ZXNjKGRldiwKKwkJICAgICJBbm5hcHVybmEtTGFicyBJbnRlZ3JhdGVkIEludGVybmFsIFBDSS1F IENvbnRyb2xsZXIiKTsKKwkJcmV0dXJuIChCVVNfUFJPQkVfREVGQVVMVCk7CisJY2FzZSBBTF9Q Q0lfVFlQRV9FWFRFUk5BTDoKKwkJZGV2aWNlX3NldF9kZXNjKGRldiwKKwkJICAgICJBbm5hcHVy bmEtTGFicyBJbnRlZ3JhdGVkIEV4dGVybmFsIFBDSS1FIENvbnRyb2xsZXIiKTsKKwkJcmV0dXJu IChCVVNfUFJPQkVfREVGQVVMVCk7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJu IChFTlhJTyk7Cit9CisKKworLyogcHJlcGFyZSBjb250cm9sbGVyIGZvciBpc3N1aW5nIElPIHRy YW5zYWN0aW9ucyovCitzdGF0aWMgaW50CithbF9wY2llX2lvX3ByZXBhcmUoYWxfcGNpYl9zb2Z0 YyAqc2MpCit7CisKKwlpZiAoc2MtPnNjX3R5cGUgPT0gQUxfUENJX1RZUEVfSU5URVJOQUwpCisJ CXJldHVybiAoMCk7CisKKwlzdHJ1Y3QgYWxfcGNpZV9hdHVfcmVnaW9uIGlvX2F0dV9yZWdpb24g PSB7CisJCS5lbmFibGUgPSBBTF9UUlVFLAorCQkuZGlyZWN0aW9uID0gQUxfUENJRV9BVFVfRElS X09VVEJPVU5ELAorCQkuaW5kZXggPSAwLAorCQkuYmFzZV9hZGRyID0gc2MtPnBjaV9yYW5nZVtB TF9QQ0lfUkFOR0VfSU9dLmJhc2VfcGFyZW50LAorCQkubGltaXQgPSBzYy0+cGNpX3JhbmdlW0FM X1BDSV9SQU5HRV9JT10uYmFzZV9wYXJlbnQgKworCQkgICAgc2MtPnBjaV9yYW5nZVtBTF9QQ0lf UkFOR0VfSU9dLmxlbiAtIDEsCisJCS8qIHRoZSBhZGRyZXNzIHRoYXQgbWF0Y2hlcyB3aWxsIGJl IHRyYW5zbGF0ZWQgdG8gdGhpcyBhZGRyZXNzICsgb2Zmc2V0ICovCisJCS50YXJnZXRfYWRkciA9 IHNjLT5wY2lfcmFuZ2VbQUxfUENJX1JBTkdFX0lPXS5iYXNlX3BjaSwKKwkJLmludmVydF9tYXRj aGluZyA9IEFMX0ZBTFNFLAorCQkudGxwX3R5cGUgPSBBTF9QQ0lFX1RMUF9UWVBFX0lPLCAvKiBw Y2llIHRscCB0eXBlKi8KKwkJLmF0dHIgPSAwLCAvKiBwY2llIGZyYW1lIGhlYWRlciBhdHRyIGZp ZWxkKi8KKwkJLyogb3V0Ym91bmQgc3BlY2lmaWMgcGFyYW1zICovCisJCS5tc2dfY29kZSA9IDAs IC8qIHBjaWUgbWVzc2FnZSBjb2RlICovCisJCS5jZmdfc2hpZnRfbW9kZSA9IEFMX0ZBTFNFLAor CQkvKiBpbmJvdW5kIHNwZWNpZmljIHBhcmFtcyovCisJfTsKKworCWRldmljZV9wcmludGYoc2Mt PnNjX2RldiwgIiVzOiBiYXNlICVsbHgsIGxpbWl0ICVsbHgsIHRhcmdldCAlbGx4XG4iLAorCSAg ICBfX2Z1bmNfXywgaW9fYXR1X3JlZ2lvbi5iYXNlX2FkZHIsCisJICAgIGlvX2F0dV9yZWdpb24u bGltaXQsIGlvX2F0dV9yZWdpb24udGFyZ2V0X2FkZHIpOworCWFsX3BjaWVfYXR1X3JlZ2lvbl9z ZXQoJnNjLT5wY2llX3BvcnQsICZpb19hdHVfcmVnaW9uKTsKKworCXJldHVybiAoMCk7Cit9CisK K3N0YXRpYyBpbnQKK2FsX3BjaWJfbWVtX2luaXQoYWxfcGNpYl9zb2Z0YyAqc2MpCit7CisJaW50 IGVycjsKKworCS8qCisJICogTWVtb3J5IG1hbmFnZW1lbnQuCisJICovCisJc2MtPnNjX21lbV9y bWFuLnJtX3R5cGUgPSBSTUFOX0FSUkFZOworCWVyciA9IHJtYW5faW5pdCgmc2MtPnNjX21lbV9y bWFuKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gKGVycik7CisKKwlzYy0+c2NfaW9fcm1hbi5ybV90 eXBlID0gUk1BTl9BUlJBWTsKKwllcnIgPSBybWFuX2luaXQoJnNjLT5zY19pb19ybWFuKTsKKwlp ZiAoZXJyKSB7CisJCXJtYW5fZmluaSgmc2MtPnNjX21lbV9ybWFuKTsKKwkJcmV0dXJuIChlcnIp OworCX0KKworCWVyciA9IHJtYW5fbWFuYWdlX3JlZ2lvbigmc2MtPnNjX21lbV9ybWFuLAorCSAg ICBzYy0+cGNpX3JhbmdlW0FMX1BDSV9SQU5HRV9NRU1dLmJhc2VfcGNpLAorCSAgICBzYy0+cGNp X3JhbmdlW0FMX1BDSV9SQU5HRV9NRU1dLmJhc2VfcGNpICsKKwkgICAgc2MtPnBjaV9yYW5nZVtB TF9QQ0lfUkFOR0VfTUVNXS5sZW4gLSAxKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycm9yOworCisJ ZXJyID0gcm1hbl9tYW5hZ2VfcmVnaW9uKCZzYy0+c2NfaW9fcm1hbiwKKwkgICAgc2MtPnBjaV9y YW5nZVtBTF9QQ0lfUkFOR0VfSU9dLmJhc2VfcGNpLAorCSAgICBzYy0+cGNpX3JhbmdlW0FMX1BD SV9SQU5HRV9JT10uYmFzZV9wY2kgKyBzYy0+cGNpX3JhbmdlW0FMX1BDSV9SQU5HRV9JT10ubGVu IC0gMSk7CisJaWYgKGVycikKKwkJZ290byBlcnJvcjsKKworCXJldHVybiAoMCk7CisKK2Vycm9y OgorCXJtYW5fZmluaSgmc2MtPnNjX21lbV9ybWFuKTsKKwlybWFuX2ZpbmkoJnNjLT5zY19pb19y bWFuKTsKKworCXJldHVybiAoZXJyKTsKK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdAorcGNp Yl9iaXRfZ2V0KHVpbnQzMl90ICptYXAsIHVpbnQzMl90IGJpdCkKK3sKKwl1aW50MzJfdCBuID0g Yml0IC8gQklUU19QRVJfVUlOVDMyOworCisJYml0ID0gYml0ICUgQklUU19QRVJfVUlOVDMyOwor CXJldHVybiAobWFwW25dICYgKDEgPDwgYml0KSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAor cGNpYl9iaXRfc2V0KHVpbnQzMl90ICptYXAsIHVpbnQzMl90IGJpdCkKK3sKKwl1aW50MzJfdCBu ID0gYml0IC8gQklUU19QRVJfVUlOVDMyOworCisJYml0ID0gYml0ICUgQklUU19QRVJfVUlOVDMy OworCW1hcFtuXSB8PSAoMSA8PCBiaXQpOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90Citw Y2liX21hcF9jaGVjayh1aW50MzJfdCAqbWFwLCB1aW50MzJfdCBzdGFydCwgdWludDMyX3QgYml0 cykKK3sKKwl1aW50MzJfdCBpOworCisJZm9yIChpID0gc3RhcnQ7IGkgPCBzdGFydCArIGJpdHM7 IGkrKykKKwkJaWYgKHBjaWJfYml0X2dldChtYXAsIGkpKQorCQkJcmV0dXJuICgwKTsKKworCXJl dHVybiAoMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorcGNpYl9tYXBfc2V0KHVpbnQzMl90 ICptYXAsIHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBiaXRzKQoreworCXVpbnQzMl90IGk7CisK Kwlmb3IgKGkgPSBzdGFydDsgaSA8IHN0YXJ0ICsgYml0czsgaSsrKQorCQlwY2liX2JpdF9zZXQo bWFwLCBpKTsKK30KKworc3RhdGljIGJ1c19hZGRyX3QKK3BjaWJfYWxsb2MoYWxfcGNpYl9zb2Z0 YyAqc2MsIHVpbnQzMl90IHNtYXNrKQoreworCXVpbnQzMl90IGJpdHMsIGJpdHNfbGltaXQsIGks ICptYXAsIG1pbl9hbGxvYywgc2l6ZTsKKwlidXNfYWRkcl90IGFkZHIgPSAwOworCWJ1c19hZGRy X3QgYmFzZTsKKworCWlmIChzbWFzayAmIDEpIHsKKwkJYmFzZSA9IHNjLT5wY2lfcmFuZ2VbQUxf UENJX1JBTkdFX0lPXS5iYXNlX3BjaTsKKwkJbWluX2FsbG9jID0gUENJX01JTl9JT19BTExPQzsK KwkJYml0c19saW1pdCA9IHNjLT5wY2lfcmFuZ2VbQUxfUENJX1JBTkdFX0lPXS5sZW4gLyBtaW5f YWxsb2M7CisJCW1hcCA9IHNjLT5zY19pb19tYXA7CisJCXNtYXNrICY9IH4weDM7CisJfSBlbHNl IHsKKwkJYmFzZSA9IHNjLT5wY2lfcmFuZ2VbQUxfUENJX1JBTkdFX01FTV0uYmFzZV9wY2k7CisJ CW1pbl9hbGxvYyA9IFBDSV9NSU5fTUVNX0FMTE9DOworCQliaXRzX2xpbWl0ID0gc2MtPnBjaV9y YW5nZVtBTF9QQ0lfUkFOR0VfTUVNXS5sZW4gLyBtaW5fYWxsb2M7CisJCW1hcCA9IHNjLT5zY19t ZW1fbWFwOworCQlzbWFzayAmPSB+MHhGOworCX0KKworCXNpemUgPSB+c21hc2sgKyAxOworCWJp dHMgPSBzaXplIC8gbWluX2FsbG9jOworCisJZm9yIChpID0gMDsgaSArIGJpdHMgPD0gYml0c19s aW1pdDsgaSArPSBiaXRzKQorCQlpZiAocGNpYl9tYXBfY2hlY2sobWFwLCBpLCBiaXRzKSkgewor CQkJcGNpYl9tYXBfc2V0KG1hcCwgaSwgYml0cyk7CisJCQlhZGRyID0gYmFzZSArIChpICogbWlu X2FsbG9jKTsKKwkJCWdvdG8gZW5kOworCQl9CisKK2VuZDoKKwlyZXR1cm4gKGFkZHIpOworfQor CitzdGF0aWMgaW50CithbF9wY2liX2luaXRfYmFyKGFsX3BjaWJfc29mdGMgKnNjLCBpbnQgYnVz LCBpbnQgc2xvdCwgaW50IGZ1bmMsCisgICAgaW50IGJhcm5vKQoreworCXVpbnQzMl90IGFkZHIs IGJhcjsKKwlpbnQgcmVnLCB3aWR0aDsKKworCXJlZyA9IFBDSVJfQkFSKGJhcm5vKTsKKworCS8q CisJICogTmVlZCB0byBpbml0IHRoZSBCQVIgcmVnaXN0ZXIgd2l0aCAweGZmZmZmZmZmIGJlZm9y ZSBjb3JyZWN0CisJICogdmFsdWUgY2FuIGJlIHJlYWQuCisJICovCisJYWxfcGNpYl93cml0ZV9j b25maWcoc2MtPnNjX2RldiwgYnVzLCBzbG90LCBmdW5jLCByZWcsIDB4ZmZmZmZmZmZ1bCwgNCk7 CisJYmFyID0gYWxfcGNpYl9yZWFkX2NvbmZpZyhzYy0+c2NfZGV2LCBidXMsIHNsb3QsIGZ1bmMs IHJlZywgNCk7CisJaWYgKGJhciA9PSAwKQorCQlyZXR1cm4gKDEpOworCisJLyogQ2FsY3VsYXRl IEJBUiBzaXplOiA2NCBvciAzMiBiaXQgKGluIDMyLWJpdCB1bml0cykgKi8KKwl3aWR0aCA9IEJB Ul9TSVpFX0lOXzMyQklUX1VOSVRTKGJhcik7CisKKwlhZGRyID0gcGNpYl9hbGxvYyhzYywgYmFy KTsKKwlpZiAoYWRkciA9PSAwKQorCQlyZXR1cm4gKC0xKTsKKworCWlmIChib290dmVyYm9zZSkK KwkJcHJpbnRmKCJQQ0kgJXU6JXU6JXU6IHJlZyAleDogc21hc2s9JTA4eDogYWRkcj0lMDh4XG4i LAorCQkgICAgYnVzLCBzbG90LCBmdW5jLCByZWcsIGJhciwgYWRkcik7CisKKwlhbF9wY2liX3dy aXRlX2NvbmZpZyhzYy0+c2NfZGV2LCBidXMsIHNsb3QsIGZ1bmMsIHJlZywgYWRkciwgNCk7CisJ aWYgKHdpZHRoID09IDIpCisJCWFsX3BjaWJfd3JpdGVfY29uZmlnKHNjLT5zY19kZXYsIGJ1cywg c2xvdCwgZnVuYywgcmVnICsgNCwKKwkJICAgIDAsIDQpOworCisJcmV0dXJuICh3aWR0aCk7Cit9 CisKK3N0YXRpYyBpbnQKK2FsX3BjaWJfaW5pdF9hbGxfYmFycyhhbF9wY2liX3NvZnRjICpzYywg aW50IGJ1cywgaW50IHNsb3QsCisgICAgaW50IGZ1bmMsIGludCBoZHJ0eXBlKQoreworCWludCBt YXhiYXIsIGJhciwgaTsKKworCW1heGJhciA9IChoZHJ0eXBlICYgUENJTV9IRFJUWVBFKSAhPSAw ID8gMCA6IDY7CisJYmFyID0gMDsKKworCS8qIFByb2dyYW0gdGhlIGJhc2UgYWRkcmVzcyByZWdp c3RlcnMgKi8KKwl3aGlsZSAoYmFyIDwgbWF4YmFyKSB7CisJCWkgPSBhbF9wY2liX2luaXRfYmFy KHNjLCBidXMsIHNsb3QsIGZ1bmMsIGJhcik7CisJCWJhciArPSBpOworCQlpZiAoaSA8IDApIHsK KwkJCWRldmljZV9wcmludGYoc2MtPnNjX2RldiwKKwkJCSAgICAiUENJIElPL01lbW9yeSBzcGFj ZSBleGhhdXN0ZWRcbiIpOworCQkJcmV0dXJuIChFTk9NRU0pOworCQl9CisJfQorCisJcmV0dXJu ICgwKTsKK30KKworc3RhdGljIHZvaWQKK2FsX3BjaWJfaW5pdF9icmlkZ2UoYWxfcGNpYl9zb2Z0 YyAqc2MsIGludCBidXMsIGludCBzbG90LCBpbnQgZnVuYykKK3sKKwlidXNfYWRkcl90IGlvX2Jh c2UsIG1lbV9iYXNlOworCXVpbnQzMl90IGlvX2xpbWl0LCBtZW1fbGltaXQ7CisJaW50IHNlY2J1 czsKKworCWlvX2Jhc2UgPSBzYy0+cGNpX3JhbmdlW0FMX1BDSV9SQU5HRV9JT10uYmFzZV9wY2k7 CisJaW9fbGltaXQgPSBpb19iYXNlICsgc2MtPnBjaV9yYW5nZVtBTF9QQ0lfUkFOR0VfSU9dLmxl biAtIDE7CisJbWVtX2Jhc2UgPSBzYy0+cGNpX3JhbmdlW0FMX1BDSV9SQU5HRV9NRU1dLmJhc2Vf cGNpOworCW1lbV9saW1pdCA9IG1lbV9iYXNlICsgc2MtPnBjaV9yYW5nZVtBTF9QQ0lfUkFOR0Vf TUVNXS5sZW4gLSAxOworCisJLyogQ29uZmlndXJlIEkvTyBkZWNvZGUgcmVnaXN0ZXJzICovCisJ YWxfcGNpYl93cml0ZV9jb25maWcoc2MtPnNjX2RldiwgYnVzLCBzbG90LCBmdW5jLCBQQ0lSX0lP QkFTRUxfMSwKKwkgICAgaW9fYmFzZSA+PiA4LCAxKTsKKwlhbF9wY2liX3dyaXRlX2NvbmZpZyhz Yy0+c2NfZGV2LCBidXMsIHNsb3QsIGZ1bmMsIFBDSVJfSU9CQVNFSF8xLAorCSAgICBpb19iYXNl ID4+IDE2LCAyKTsKKwlhbF9wY2liX3dyaXRlX2NvbmZpZyhzYy0+c2NfZGV2LCBidXMsIHNsb3Qs IGZ1bmMsIFBDSVJfSU9MSU1JVExfMSwKKwkgICAgaW9fbGltaXQgPj4gOCwgMSk7CisJYWxfcGNp Yl93cml0ZV9jb25maWcoc2MtPnNjX2RldiwgYnVzLCBzbG90LCBmdW5jLCBQQ0lSX0lPTElNSVRI XzEsCisJICAgIGlvX2xpbWl0ID4+IDE2LCAyKTsKKworCS8qIENvbmZpZ3VyZSBtZW1vcnkgZGVj b2RlIHJlZ2lzdGVycyAqLworCWFsX3BjaWJfd3JpdGVfY29uZmlnKHNjLT5zY19kZXYsIGJ1cywg c2xvdCwgZnVuYywgUENJUl9NRU1CQVNFXzEsCisJICAgIG1lbV9iYXNlID4+IDE2LCAyKTsKKwlh bF9wY2liX3dyaXRlX2NvbmZpZyhzYy0+c2NfZGV2LCBidXMsIHNsb3QsIGZ1bmMsIFBDSVJfTUVN TElNSVRfMSwKKwkgICAgbWVtX2xpbWl0ID4+IDE2LCAyKTsKKworCS8qIERpc2FibGUgbWVtb3J5 IHByZWZldGNoIGRlY29kZSAqLworCWFsX3BjaWJfd3JpdGVfY29uZmlnKHNjLT5zY19kZXYsIGJ1 cywgc2xvdCwgZnVuYywgUENJUl9QTUJBU0VMXzEsCisJICAgIDB4MTAsIDIpOworCWFsX3BjaWJf d3JpdGVfY29uZmlnKHNjLT5zY19kZXYsIGJ1cywgc2xvdCwgZnVuYywgUENJUl9QTUJBU0VIXzEs CisJICAgIDB4MCwgNCk7CisJYWxfcGNpYl93cml0ZV9jb25maWcoc2MtPnNjX2RldiwgYnVzLCBz bG90LCBmdW5jLCBQQ0lSX1BNTElNSVRMXzEsCisJICAgIDB4RiwgMik7CisJYWxfcGNpYl93cml0 ZV9jb25maWcoc2MtPnNjX2RldiwgYnVzLCBzbG90LCBmdW5jLCBQQ0lSX1BNTElNSVRIXzEsCisJ ICAgIDB4MCwgNCk7CisKKwlzZWNidXMgPSBhbF9wY2liX3JlYWRfY29uZmlnKHNjLT5zY19kZXYs IGJ1cywgc2xvdCwgZnVuYywKKwkgICAgUENJUl9TRUNCVVNfMSwgMSk7CisKKwkvKiBDb25maWd1 cmUgYnVzZXMgYmVoaW5kIHRoZSBicmlkZ2UgKi8KKwlhbF9wY2liX2luaXQoc2MsIHNlY2J1cywg UENJX1NMT1RNQVgpOworfQorCitzdGF0aWMgaW50CithbF9maW5kX2NhcChkZXZpY2VfdCBjaGls ZCwgdV9pbnQgYnVzLCB1X2ludCBzbG90LCB1X2ludCBmdW5jLAorICAgIGludCBjYXBhYmlsaXR5 LCBpbnQgKmNhcHJlZykKK3sKKwl1aW50MzJfdCBzdGF0dXM7CisJdWludDhfdCBwdHI7CisJdWlu dDE2X3QgaGRydHlwZTsKKworCS8qCisJICogQ2hlY2sgdGhlIENBUF9MSVNUIGJpdCBvZiB0aGUg UENJIHN0YXR1cyByZWdpc3RlciBmaXJzdC4KKwkgKi8KKwlzdGF0dXMgPSBhbF9wY2liX3JlYWRf Y29uZmlnKGNoaWxkLCBidXMsIHNsb3QsIGZ1bmMsIFBDSVJfU1RBVFVTLCAyKTsKKwlpZiAoKHN0 YXR1cyAmIFBDSU1fU1RBVFVTX0NBUFBSRVNFTlQpICE9IFBDSU1fU1RBVFVTX0NBUFBSRVNFTlQp CisJCXJldHVybiAoRU5YSU8pOworCisJaGRydHlwZSA9IGFsX3BjaWJfcmVhZF9jb25maWcoY2hp bGQsIGJ1cywgc2xvdCwgZnVuYywgUENJUl9IRFJUWVBFLCAxKTsKKworCS8qCisJICogRGV0ZXJt aW5lIHRoZSBzdGFydCBwb2ludGVyIG9mIHRoZSBjYXBhYmlsaXRpZXMgbGlzdC4KKwkgKi8KKwlz d2l0Y2ggKGhkcnR5cGUgJiBQQ0lNX0hEUlRZUEUpIHsKKwljYXNlIFBDSU1fSERSVFlQRV9OT1JN QUw6CisJY2FzZSBQQ0lNX0hEUlRZUEVfQlJJREdFOgorCQlwdHIgPSBQQ0lSX0NBUF9QVFI7CisJ CWJyZWFrOworCWNhc2UgUENJTV9IRFJUWVBFX0NBUkRCVVM6CisJCXB0ciA9IFBDSVJfQ0FQX1BU Ul8yOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZpY2VfcHJpbnRmKGNoaWxkLCAiYWxfZmlu ZF9jYXA6IGludmFsaWQgaGRydHlwZSAleFxuIiwKKwkJICAgIGhkcnR5cGUgJiBQQ0lNX0hEUlRZ UEUpOworCQlyZXR1cm4gKEVOWElPKTsJCS8qIG5vIGV4dGVuZGVkIGNhcGFiaWxpdGllcyBzdXBw b3J0ICovCisJfQorCXB0ciA9IGFsX3BjaWJfcmVhZF9jb25maWcoY2hpbGQsIGJ1cywgc2xvdCwg ZnVuYywgcHRyLCAxKTsKKworCS8qCisJICogVHJhdmVyc2UgdGhlIGNhcGFiaWxpdGllcyBsaXN0 LgorCSAqLworCXdoaWxlIChwdHIgIT0gMCkgeworCQlpZiAoYWxfcGNpYl9yZWFkX2NvbmZpZyhj aGlsZCwgYnVzLCBzbG90LCBmdW5jLAorCQkgICAgcHRyICsgUENJQ0FQX0lELCAxKSA9PSBjYXBh YmlsaXR5KSB7CisJCQlpZiAoY2FwcmVnICE9IE5VTEwpCisJCQkJKmNhcHJlZyA9IHB0cjsKKwkJ CXJldHVybiAoMCk7CisJCX0KKwkJcHRyID0gYWxfcGNpYl9yZWFkX2NvbmZpZyhjaGlsZCwgYnVz LCBzbG90LCBmdW5jLAorCQkgICAgcHRyICsgUENJQ0FQX05FWFRQVFIsIDEpOworCX0KKworCXJl dHVybiAoRU5PRU5UKTsKK30KKworLyoqCisgKiBwY2llX2dldF9tcHMgLSBnZXQgUENJIEV4cHJl c3MgbWF4aW11bSBwYXlsb2FkIHNpemUgY29uZmlndXJlZAorICogQGRldjogUENJIGRldmljZSB0 byBxdWVyeQorICoKKyAqIFJldHVybnMgbWF4aW11bSBwYXlsb2FkIHNpemUgaW4gYnl0ZXMKKyAq ICAgIG9yIGFwcHJvcHJpYXRlIGVycm9yIHZhbHVlLgorICovCitzdGF0aWMgaW50CitwY2llX2dl dF9tcHMoYWxfcGNpYl9zb2Z0YyAqc2MsIGludCBidXMsIGludCBzbG90LCBpbnQgZnVuYykKK3sK Kwl1aW50MTZfdCBjdGw7CisJaW50IHJlZzsKKworCWlmIChhbF9maW5kX2NhcChzYy0+c2NfZGV2 LGJ1cywgc2xvdCwgZnVuYywgUENJWV9FWFBSRVNTLCAmcmVnKSAhPSAwKSB7CisJCWRldmljZV9w cmludGYoc2MtPnNjX2RldiwgIkZhaWVsZCB0byBmaW5kIFBDSVlfRVhQUkVTUyBjYXBcbiIpOwor CQlyZXR1cm4gKDApOworCX0KKworCWN0bCA9IGFsX3BjaWJfcmVhZF9jb25maWcoc2MtPnNjX2Rl diwgYnVzLCBzbG90LCBmdW5jLAorCSAgICByZWcgKyBQQ0lFUl9ERVZJQ0VfQ1RMLCAyKTsKKwor CXJldHVybiAoUENJRV9NSU5fTVBTIDw8ICgoY3RsICYgUENJRU1fQ1RMX01BWF9QQVlMT0FEKSA+ PiA1KSk7Cit9CisKKy8qKgorICogZ2V0X3BjaWVfbWF4X3BheWxvYWQgLSBnZXQgUENJIEV4cHJl c3MgbWF4aW11bSBzdXBwb3J0ZWQgcGF5bG9hZCBzaXplCisgKiBAZGV2OiBQQ0kgZGV2aWNlIHRv IHF1ZXJ5CisgKgorICogUmV0dXJucyBtYXhpbXVtIHBheWxvYWQgc2l6ZSBpbiBieXRlcworICog ICAgb3IgYXBwcm9wcmlhdGUgZXJyb3IgdmFsdWUuCisgKi8KK3N0YXRpYyB1aW50MTZfdAorZ2V0 X3BjaWVfbWF4X3BheWxvYWQoYWxfcGNpYl9zb2Z0YyAqc2MsIGludCBidXMsIGludCBzbG90LCBp bnQgZnVuYykKK3sKKwl1aW50MTZfdCByZWcxNjsKKwlpbnQgcmVnOworCisJaWYgKGFsX2ZpbmRf Y2FwKHNjLT5zY19kZXYsYnVzLCBzbG90LCBmdW5jLCBQQ0lZX0VYUFJFU1MsICZyZWcpICE9IDAp CisJCXJldHVybiAoMCk7CisKKwlyZWcxNiA9IGFsX3BjaWJfcmVhZF9jb25maWcoc2MtPnNjX2Rl diwgYnVzLCBzbG90LAorCSAgICBmdW5jLCByZWcgKyBQQ0lFUl9ERVZJQ0VfQ0FQLCAyKTsKKwly ZXR1cm4gKHJlZzE2ICYgUENJRU1fQ0FQX01BWF9QQVlMT0FEKTsKK30KKworLyoqCisgKiBnZXRf cGNpZV9nZXRfdHlwZSAtIGdldCBQQ0kgRXhwcmVzcyBkZXZpY2UgdHlwZSAoZGV2aWNlIG9yIGJy aWRnZSkKKyAqIEBkZXY6IFBDSSBkZXZpY2UgdG8gcXVlcnkKKyAqCisgKiBSZXR1cm5zIG1heGlt dW0gcGF5bG9hZCBzaXplIGluIGJ5dGVzCisgKiAgICBvciBhcHByb3ByaWF0ZSBlcnJvciB2YWx1 ZS4KKyAqLworc3RhdGljIHVpbnQxNl90CitnZXRfcGNpZV9nZXRfdHlwZShhbF9wY2liX3NvZnRj ICpzYywgaW50IGJ1cywgaW50IHNsb3QsIGludCBmdW5jKQoreworCXVpbnQxNl90IHJlZzE2Owor CWludCByZWc7CisKKwlpZiAoYWxfZmluZF9jYXAoc2MtPnNjX2RldixidXMsIHNsb3QsIGZ1bmMs IFBDSVlfRVhQUkVTUywgJnJlZykgIT0gMCkKKwkJcmV0dXJuICgwKTsKKworCXJlZzE2ID0gYWxf cGNpYl9yZWFkX2NvbmZpZyhzYy0+c2NfZGV2LCBidXMsIHNsb3QsCisJICAgIGZ1bmMsIHJlZyAr IFBDSUVSX0ZMQUdTLCAyKTsKKwlyZXR1cm4gKHJlZzE2ICYgUENJRU1fRkxBR1NfVFlQRSk7Cit9 CisKKy8qKgorICogcGNpZV9zZXRfbXBzIC0gc2V0IFBDSSBFeHByZXNzIG1heGltdW0gcGF5bG9h ZCBzaXplCisgKiBAZGV2OiBQQ0kgZGV2aWNlIHRvIHF1ZXJ5CisgKiBAbXBzOiBtYXhpbXVtIHBh eWxvYWQgc2l6ZSBpbiBieXRlcworICogICAgdmFsaWQgdmFsdWVzIGFyZSAxMjgsIDI1NiwgNTEy LCAxMDI0LCAyMDQ4LCA0MDk2CisgKgorICogSWYgcG9zc2libGUgc2V0cyBtYXhpbXVtIHBheWxv YWQgc2l6ZQorICovCitzdGF0aWMgaW50CitwY2llX3NldF9tcHMoYWxfcGNpYl9zb2Z0YyAqc2Ms IGludCBtcHMsIGludCBidXMsIGludCBzbG90LCBpbnQgZnVuYykKK3sKKwl1aW50MTZfdCB2Owor CWludCByZWc7CisJdWludDE2X3QgdG1wOworCisJaWYgKG1wcyA8IFBDSUVfTUlOX01QUyB8fCBt cHMgPiBQQ0lFX01BWF9NUFMgfHwKKwkgICAgIXBvd2Vyb2YyKG1wcykpCisJCXJldHVybiAoRUZB VUxUKTsKKworCXYgPSBmZnMobXBzKSAtIDg7CisJaWYgKHYgPiBnZXRfcGNpZV9tYXhfcGF5bG9h ZChzYywgYnVzLCBzbG90LCBmdW5jKSkKKwkJcmV0dXJuIChFRkFVTFQpOworCXYgPDw9IFBDSUVN X0NUTF9NQVhfUEFZTE9BRF9FTVBUWV9CSVRTOworCisJaWYgKGFsX2ZpbmRfY2FwKHNjLT5zY19k ZXYsYnVzLCBzbG90LCBmdW5jLCBQQ0lZX0VYUFJFU1MsICZyZWcpICE9IDApCisJCXJldHVybiAo RUZBVUxUKTsKKworCXRtcCA9IGFsX3BjaWJfcmVhZF9jb25maWcoc2MtPnNjX2RldiwgYnVzLCBz bG90LCBmdW5jLAorCSAgICByZWcgKyBQQ0lFUl9ERVZJQ0VfQ1RMLCAyKTsKKwl0bXAgJj0gflBD SUVNX0NUTF9NQVhfUEFZTE9BRDsKKwl0bXAgfD0gKHYgJiBQQ0lFTV9DVExfTUFYX1BBWUxPQUQp OworCWFsX3BjaWJfd3JpdGVfY29uZmlnKHNjLT5zY19kZXYsIGJ1cywgc2xvdCwgZnVuYywKKwkg ICAgcmVnICsgUENJRVJfREVWSUNFX0NUTCwgdG1wLCAyKTsKKworCXJldHVybiAoMCk7Cit9CisK K3N0YXRpYyB2b2lkCitwY2llX3dyaXRlX21wcyhhbF9wY2liX3NvZnRjICpzYywgaW50IG1wcywg aW50IGJ1cywgaW50IHNsb3QsIGludCBmdW5jKQoreworCWludCByYzsKKwlkZXZpY2VfdCBwYXJl bnQ7CisJdWludDE2X3QgdHlwZTsKKworCW1wcyA9IFBDSUVfTUlOX01QUyA8PCBnZXRfcGNpZV9t YXhfcGF5bG9hZChzYywgYnVzLCBzbG90LAorCSAgICBmdW5jKTsKKworCXBhcmVudCA9IGRldmlj ZV9nZXRfcGFyZW50KHNjLT5zY19kZXYpOworCXR5cGUgPSBnZXRfcGNpZV9nZXRfdHlwZShzYywg YnVzLCBzbG90LCBmdW5jKTsKKworCW1wcyA9IG1pbihtcHMsIEFMX01BWF9TVVBQT1JURURfTVBT KTsKKworCXJjID0gcGNpZV9zZXRfbXBzKHNjLCBtcHMsIGJ1cywgc2xvdCwgZnVuYyk7CisJaWYg KHJjICE9IDApCisJCWRldmljZV9wcmludGYoc2MtPnNjX2RldiwKKwkJICAgICJGYWlsZWQgYXR0 ZW1wdGluZyB0byBzZXQgdGhlIE1QUyAlZFxuIiwgbXBzKTsKK30KKworc3RhdGljIHVpbnQxNl90 CitwY2llX2dldF9yZWFkcnEoYWxfcGNpYl9zb2Z0YyAqc2MsIGludCBidXMsIGludCBzbG90LCBp bnQgZnVuYykKK3sKKwl1aW50MTZfdCBjdGw7CisJaW50IHJlZzsKKworCWlmIChhbF9maW5kX2Nh cChzYy0+c2NfZGV2LGJ1cywgc2xvdCwgZnVuYywgUENJWV9FWFBSRVNTLCAmcmVnKSAhPSAwKQor CQlyZXR1cm4gKDApOworCisJY3RsID0gYWxfcGNpYl9yZWFkX2NvbmZpZyhzYy0+c2NfZGV2LCBi dXMsIHNsb3QsIGZ1bmMsCisJICAgIHJlZyArIFBDSUVSX0RFVklDRV9DVEwsIDIpOworCisJcmV0 dXJuIChQQ0lFX01JTl9NUlJTIDw8ICgoY3RsICYgUENJRU1fQ1RMX01BWF9SRUFEX1JFUVVFU1Qp ID4+IDEyKSk7Cit9CisKKy8qKgorICogcGNpZV9zZXRfcmVhZHJxIC0gc2V0IFBDSSBFeHByZXNz IG1heGltdW0gbWVtb3J5IHJlYWQgcmVxdWVzdAorICogQGRldjogUENJIGRldmljZSB0byBxdWVy eQorICogQHJxOiBtYXhpbXVtIG1lbW9yeSByZWFkIGNvdW50IGluIGJ5dGVzCisgKiAgICB2YWxp ZCB2YWx1ZXMgYXJlIDEyOCwgMjU2LCA1MTIsIDEwMjQsIDIwNDgsIDQwOTYKKyAqCisgKiBJZiBw b3NzaWJsZSBzZXRzIG1heGltdW0gbWVtb3J5IHJlYWQgcmVxdWVzdCBpbiBieXRlcworICovCitz dGF0aWMgaW50CitwY2llX3NldF9yZWFkcnEoYWxfcGNpYl9zb2Z0YyAqc2MsIGludCBycSwgaW50 IGJ1cywgaW50IHNsb3QsIGludCBmdW5jKQoreworCXVpbnQxNl90IHY7CisJaW50IG1wczsKKwlp bnQgcmVnOworCXVpbnQxNl90IHRtcDsKKworCWlmIChycSA8IFBDSUVfTUlOX01SUlMgfHwgcnEg PiBQQ0lFX01BWF9NUlJTCisJICAgIHx8ICFwb3dlcm9mMihycSkpCisJCXJldHVybiAoRUlOVkFM KTsKKworCW1wcyA9IHBjaWVfZ2V0X21wcyhzYywgYnVzLCBzbG90LCBmdW5jKTsKKworCWlmICht cHMgPCAwKQorCQlyZXR1cm4gKG1wcyk7CisJaWYgKG1wcyA8IHJxKQorCQlycSA9IG1wczsKKwor CXYgPSAoZmZzKHJxKSAtIDgpIDw8IFBDSUVNX0NUTF9NQVhfUkVBRF9SRVFVRVNUX0VNUFRZX0JJ VFM7CisKKwlpZiAoYWxfZmluZF9jYXAoc2MtPnNjX2RldixidXMsIHNsb3QsIGZ1bmMsIFBDSVlf RVhQUkVTUywgJnJlZykgIT0gMCkKKwkJcmV0dXJuIChFRkFVTFQpOworCisJdG1wID0gYWxfcGNp Yl9yZWFkX2NvbmZpZyhzYy0+c2NfZGV2LCBidXMsIHNsb3QsCisJICAgIGZ1bmMsIHJlZyArIFBD SUVSX0RFVklDRV9DVEwsIDIpOworCXRtcCAmPSB+UENJRU1fQ1RMX01BWF9SRUFEX1JFUVVFU1Q7 CisJdG1wIHw9ICh2ICYgUENJRU1fQ1RMX01BWF9SRUFEX1JFUVVFU1QpOworCWFsX3BjaWJfd3Jp dGVfY29uZmlnKHNjLT5zY19kZXYsIGJ1cywgc2xvdCwKKwkgICAgZnVuYywgcmVnICsgUENJRVJf REVWSUNFX0NUTCwgdG1wLCAyKTsKKworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyB2b2lkCitw Y2llX3dyaXRlX21ycnMoYWxfcGNpYl9zb2Z0YyAqc2MsIGludCBidXMsIGludCBzbG90LCBpbnQg ZnVuYykKK3sKKwlpbnQgcmMsIG1ycnM7CisKKwkvKiBGb3IgTWF4IHBlcmZvcm1hbmNlLCB0aGUg TVJSUyBtdXN0IGJlIHNldCB0byB0aGUgbGFyZ2VzdCBzdXBwb3J0ZWQKKwkgKiB2YWx1ZS4gIEhv d2V2ZXIsIGl0IGNhbm5vdCBiZSBjb25maWd1cmVkIGxhcmdlciB0aGFuIHRoZSBNUFMgdGhlCisJ ICogZGV2aWNlIG9yIHRoZSBidXMgY2FuIHN1cHBvcnQuICBUaGlzIHNob3VsZCBhbHJlYWR5IGJl IHByb3Blcmx5CisJICogY29uZmlndXJlZCBieSBhIHByaW9yIGNhbGwgdG8gcGNpZV93cml0ZV9t cHMuCisJICovCisJbXJycyA9IHBjaWVfZ2V0X21wcyhzYywgYnVzLCBzbG90LCBmdW5jKTsKKwor CS8qIE1SUlMgaXMgYSBSL1cgcmVnaXN0ZXIuICBJbnZhbGlkIHZhbHVlcyBjYW4gYmUgd3JpdHRl biwgYnV0IGEKKwkgKiBzdWJzZXF1ZW50IHJlYWQgd2lsbCB2ZXJpZnkgaWYgdGhlIHZhbHVlIGlz IGFjY2VwdGFibGUgb3Igbm90LgorCSAqIElmIHRoZSBNUlJTIHZhbHVlIHByb3ZpZGVkIGlzIG5v dCBhY2NlcHRhYmxlIChlLmcuLCB0b28gbGFyZ2UpLAorCSAqIHNocmluayB0aGUgdmFsdWUgdW50 aWwgaXQgaXMgYWNjZXB0YWJsZSB0byB0aGUgSFcuCisJICovCisJd2hpbGUgKG1ycnMgIT0gcGNp ZV9nZXRfcmVhZHJxKHNjLCBidXMsIHNsb3QsIGZ1bmMpICYmIG1ycnMgPj0gUENJRV9NSU5fTVJS UykgeworCQlyYyA9IHBjaWVfc2V0X3JlYWRycShzYywgbXJycywgYnVzLCBzbG90LCBmdW5jKTsK KwkJaWYgKCFyYykKKwkJCWJyZWFrOworCisJCWRldmljZV9wcmludGYoc2MtPnNjX2RldiwgIkZh aWxlZCBhdHRlbXB0aW5nIHRvIHNldCB0aGUgTVJSU1xuIik7CisJCW1ycnMgLz0gMjsKKwl9CisK KwlpZiAobXJycyA8IFBDSUVfTUlOX01SUlMpCisJCWRldmljZV9wcmludGYoc2MtPnNjX2Rldiwg Ik1SUlMgd2FzIHVuYWJsZSB0byBiZSBjb25maWd1cmVkIHdpdGggYSAiCisJCSAgICAic2FmZSB2 YWx1ZS4gIElmIHByb2JsZW1zIGFyZSBleHBlcmllbmNlZCwgdHJ5IHJ1bm5pbmcgIgorCQkgICAg IndpdGggcGNpPXBjaWVfYnVzX3NhZmUuXG4iKTsKK30KKworc3RhdGljIGludAorcGNpZV9idXNf Y29uZmlndXJlX3NldChhbF9wY2liX3NvZnRjICpzYywgaW50IGJ1cywgaW50IHNsb3QsIGludCBm dW5jLAorICAgIHVpbnQ4X3QgKmRhdGEpCit7CisJaW50IG1wcywgb3JpZ19tcHM7CisKKwltcHMg PSBQQ0lFX01JTl9NUFMgPDwgKih1aW50OF90ICopZGF0YTsKKworCW9yaWdfbXBzID0gcGNpZV9n ZXRfbXBzKHNjLCBidXMsIHNsb3QsIGZ1bmMpOworCisJcGNpZV93cml0ZV9tcHMoc2MsIG1wcywg YnVzLCBzbG90LCBmdW5jKTsKKwlwY2llX3dyaXRlX21ycnMoc2MsIGJ1cywgc2xvdCwgZnVuYyk7 CisKKwlkZXZpY2VfcHJpbnRmKHNjLT5zY19kZXYsCisJICAgICJQQ0ktRSBNYXggUGF5bG9hZCBT aXplIHNldCB0byAlNGQvJTRkICh3YXMgJTRkKSwgIgorCSAgICAiTWF4IFJlYWQgUnEgJTRkXG4i LCBwY2llX2dldF9tcHMoc2MsIGJ1cywgc2xvdCwgZnVuYyksCisJICAgIFBDSUVfTUlOX01QUyA8 PCBnZXRfcGNpZV9tYXhfcGF5bG9hZChzYywgYnVzLCBzbG90LCBmdW5jKSwKKwkgICAgb3JpZ19t cHMsIHBjaWVfZ2V0X3JlYWRycShzYywgYnVzLCBzbG90LCBmdW5jKSk7CisKKwlyZXR1cm4gKDAp OworfQorCitzdGF0aWMgdm9pZAorYWxfcGNpYl9maXh1cChhbF9wY2liX3NvZnRjICpzYywgaW50 IGJ1cywgaW50IHNsb3QsIGludCBmdW5jKQoreworCXVpbnQ4X3Qgc21wc3MgPSAwOworCXVpbnQz Ml90IHZhbDsKKwlwY2llX2J1c19jb25maWd1cmVfc2V0KHNjLCBidXMsIHNsb3QsIGZ1bmMsICZz bXBzcyk7CisKKwkvKiBEbyBub3QgcnVuIGZpeHVwcyBvbiBleHRlcm5hbCBQQ0llIGJ1cyAqLwor CWlmIChidXMgIT0gMCkKKwkJcmV0dXJuOworCisJdmFsID0gYWxfcGNpYl9yZWFkX2NvbmZpZyhz Yy0+c2NfZGV2LCBidXMsIHNsb3QsIGZ1bmMsIEFMX1BDSV9BWElfQ0ZHX0FORF9DVFJfMCwgNCk7 CisJdmFsIHw9IFBDSUVfQVhJX1BGX0FYSV9BVFRSX09WUkRfRlVOQ19DVFJMXzJfUEZfVkVDX1BI X1ZFQ19PVlJEX0ZST01fQVhVU0VSX01BU0s7CisJYWxfcGNpYl93cml0ZV9jb25maWcoc2MtPnNj X2RldiwgYnVzLCBzbG90LCBmdW5jLCBBTF9QQ0lfQVhJX0NGR19BTkRfQ1RSXzAsIHZhbCwgNCk7 CisKKwl2YWwgPSBhbF9wY2liX3JlYWRfY29uZmlnKHNjLT5zY19kZXYsIGJ1cywgc2xvdCwgZnVu YywgQUxfUENJX0FQUF9DT05UUk9MICwgNCk7CisJdmFsICY9IH4weGZmZmY7CisJdmFsIHw9IFBD SUVfQVhJX1BGX0FYSV9BVFRSX09WUkRfRlVOQ19DVFJMXzRfUEZfVkVDX01FTV9BRERSNTRfNjNf U0VMX1ZNSURfTUFTSzsKKwlhbF9wY2liX3dyaXRlX2NvbmZpZyhzYy0+c2NfZGV2LCBidXMsIHNs b3QsIGZ1bmMsIEFMX1BDSV9BUFBfQ09OVFJPTCAsIHZhbCwgNCk7Cit9CisKK3N0YXRpYyBpbnQK K2FsX3BjaWJfaW5pdChhbF9wY2liX3NvZnRjICpzYywgaW50IGJ1cywgaW50IG1heHNsb3QpCit7 CisJaW50IHNsb3QsIGZ1bmMsIG1heGZ1bmMsIGVycm9yOworCXVpbnQ4X3QgaGRydHlwZSwgY29t bWFuZCwgY2xhc3MsIHN1YmNsYXNzOworCWludCBidXNjbnQgPSBzYy0+c2NfYnVzbnI7CisKKwlm b3IgKHNsb3QgPSAwOyBzbG90IDw9IG1heHNsb3Q7IHNsb3QrKykgeworCQltYXhmdW5jID0gMDsK KwkJZm9yIChmdW5jID0gMDsgZnVuYyA8PSBtYXhmdW5jOyBmdW5jKyspIHsKKwkJCWhkcnR5cGUg PSBhbF9wY2liX3JlYWRfY29uZmlnKHNjLT5zY19kZXYsIGJ1cywgc2xvdCwKKwkJCSAgICBmdW5j LCBQQ0lSX0hEUlRZUEUsIDEpOworCisJCQlpZiAoKGhkcnR5cGUgJiBQQ0lNX0hEUlRZUEUpID4g UENJX01BWEhEUlRZUEUpCisJCQkJY29udGludWU7CisKKwkJCWlmIChmdW5jID09IDAgJiYgKGhk cnR5cGUgJiBQQ0lNX01GREVWKSkKKwkJCQltYXhmdW5jID0gUENJX0ZVTkNNQVg7CisKKwkJCWNv bW1hbmQgPSBhbF9wY2liX3JlYWRfY29uZmlnKHNjLT5zY19kZXYsIGJ1cywgc2xvdCwKKwkJCSAg ICBmdW5jLCBQQ0lSX0NPTU1BTkQsIDEpOworCQkJY29tbWFuZCAmPSB+KFBDSU1fQ01EX01FTUVO IHwgUENJTV9DTURfUE9SVEVOKTsKKwkJCWFsX3BjaWJfd3JpdGVfY29uZmlnKHNjLT5zY19kZXYs IGJ1cywgc2xvdCwgZnVuYywKKwkJCSAgICBQQ0lSX0NPTU1BTkQsIGNvbW1hbmQsIDEpOworCisJ CQllcnJvciA9IGFsX3BjaWJfaW5pdF9hbGxfYmFycyhzYywgYnVzLCBzbG90LCBmdW5jLAorCQkJ ICAgIGhkcnR5cGUpOworCisJCQlpZiAoZXJyb3IpCisJCQkJcmV0dXJuIChlcnJvcik7CisKKwkJ CWNvbW1hbmQgfD0gUENJTV9DTURfUE9SVEVOOworCQkJYWxfcGNpYl93cml0ZV9jb25maWcoc2Mt PnNjX2RldiwgYnVzLCBzbG90LCBmdW5jLAorCQkJICAgIFBDSVJfQ09NTUFORCwgY29tbWFuZCwg MSk7CisKKwkJCS8qIEhhbmRsZSBQQ0ktUENJIGJyaWRnZXMgKi8KKwkJCWNsYXNzID0gYWxfcGNp Yl9yZWFkX2NvbmZpZyhzYy0+c2NfZGV2LCBidXMsIHNsb3QsCisJCQkgICAgZnVuYywgUENJUl9D TEFTUywgMSk7CisJCQlzdWJjbGFzcyA9IGFsX3BjaWJfcmVhZF9jb25maWcoc2MtPnNjX2Rldiwg YnVzLCBzbG90LAorCQkJICAgIGZ1bmMsIFBDSVJfU1VCQ0xBU1MsIDEpOworCisJCQlhbF9wY2li X2ZpeHVwKHNjLCBidXMsIHNsb3QsIGZ1bmMpOworCisJCQlpZiAoY2xhc3MgIT0gUENJQ19CUklE R0UgfHwKKwkJCSAgICBzdWJjbGFzcyAhPSBQQ0lTX0JSSURHRV9QQ0kpCisJCQkJY29udGludWU7 CisKKwkJCS8qIFdyaXRlIGFwcHJvcHJpYXRlIGJ1cyBudW1iZXIgKi8KKwkJCWJ1c2NudCsrOwor CQkJYWxfcGNpYl93cml0ZV9jb25maWcoc2MtPnNjX2RldiwgYnVzLDAsMCwKKwkJCSAgICBQQ0lS X1NFQ0JVU18xLCBidXNjbnQsIDEpOworCQkJYWxfcGNpYl93cml0ZV9jb25maWcoc2MtPnNjX2Rl diwgYnVzLDAsMCwKKwkJCSAgICBQQ0lSX1NVQkJVU18xLCBidXNjbnQsIDEpOworCisJCQlhbF9w Y2liX2luaXRfYnJpZGdlKHNjLCBidXMsIHNsb3QsIGZ1bmMpOworCQl9CisJfQorCisJcmV0dXJu ICgwKTsKK30KKworc3RhdGljIHZvaWQKK2FsX3BjaWJfZW5hYmxlKGFsX3BjaWJfc29mdGMgKnNj KQoreworCXVpbnQzMl90IHZhbDsKKworCS8qCisJICogRW5hYmxlIFBDSSBicmlkZ2UuCisJICov CisJdmFsID0gYWxfcGNpYl9yZWFkX2NvbmZpZyhzYy0+c2NfZGV2LCBzYy0+c2NfYnVzbnIsIDAs IDAsCisJICAgIFBDSVJfQ09NTUFORCwgNCk7CisJdmFsIHw9IFBDSU1fQ01EX1NFUlJFU1BFTiB8 IFBDSU1fQ01EX0JVU01BU1RFUkVOIHwKKwkgICAgUENJTV9DTURfTUVNRU4gfCBQQ0lNX0NNRF9Q T1JURU47CisJYWxfcGNpYl93cml0ZV9jb25maWcoc2MtPnNjX2Rldiwgc2MtPnNjX2J1c25yLCAw LCAwLAorCSAgICBQQ0lSX0NPTU1BTkQsIHZhbCwgNCk7Cit9CisKK3N0YXRpYyBpbnQKK2FsX3Bj aWJfYXR0YWNoKGRldmljZV90IGRldikKK3sKKwlhbF9wY2liX3NvZnRjCSpzYzsKKwlwaGFuZGxl X3QJbm9kZTsKKwlpbnQJCXJldDsKKwl1aW50NjRfdAlyZWdfYmFzZTsKKwl1aW50NjRfdAlyZWdf c2l6ZTsKKworCXNjID0gZGV2aWNlX2dldF9zb2Z0YyhkZXYpOworCW5vZGUgPSBvZndfYnVzX2dl dF9ub2RlKGRldik7CisJc2MtPnNjX2RldiA9IGRldjsKKwlzYy0+c2NfYnVzbnIgPSBkZXZpY2Vf Z2V0X3VuaXQoZGV2KTsKKwlzYy0+aW5kZXggPSBkZXZpY2VfZ2V0X3VuaXQoZGV2KTsKKwlzYy0+ c2NfdHlwZSA9IG9md19idXNfc2VhcmNoX2NvbXBhdGlibGUoZGV2LCBjb21wYXRfZGF0YSktPm9j ZF9kYXRhOworCisJbXR4X2luaXQoJnNjLT5jb25mX2xvY2ssICJBTFBDSUNGRyIsIE5VTEwsIE1U WF9ERUYpOworCisJLyogTWFwIHJlZ2lzdGVyIHNwYWNlICovCisJcmVnX2Jhc2UgPSAwOworCXJl Z19zaXplID0gMDsKKwlyZXQgPSBmZHRfcmVnc2l6ZShub2RlLCAodV9sb25nKikmcmVnX2Jhc2Us ICh1X2xvbmcqKSZyZWdfc2l6ZSk7CisJaWYgKHJldCA9PSAwICYmIHJlZ19zaXplID4gMCkgewor CQlkZXZpY2VfcHJpbnRmKGRldiwgInJlZ2lzdGVyIGJhc2UgPSAweCVsbHgsIHNpemUgPSAweCVs eFxuIiwKKwkJICAgIHJlZ19iYXNlLCAodV9sb25nKXJlZ19zaXplKTsKKwkJcmV0ID0gYnVzX3Nw YWNlX21hcChmZHRidXNfYnNfdGFnLCAoYnVzX2FkZHJfdClyZWdfYmFzZSwKKwkJICAgIChidXNf c2l6ZV90KXJlZ19zaXplLCAwLCAmc2MtPnJlZ19oYW5kbGUpOworCQlpZiAocmV0KSB7CisJCQlk ZXZpY2VfcHJpbnRmKGRldiwgIkZhaWxlZCB0byBtYXAgcmVnaXN0ZXIgc3BhY2VcbiIpOworCQkJ cmV0dXJuIChFRkFVTFQpOworCQl9CisJfQorCisJLyogTWFwIFBDSSByZWdpb25zICovCisJcmV0 ID0gYWxfZmR0X3BjaV9yYW5nZXNfZGVjb2RlKG5vZGUsICZzYy0+cGNpX3JhbmdlW0FMX1BDSV9S QU5HRV9CUklER0VdLAorCSAgICAmc2MtPnBjaV9yYW5nZVtBTF9QQ0lfUkFOR0VfSU9dLCAmc2Mt PnBjaV9yYW5nZVtBTF9QQ0lfUkFOR0VfTUVNXSk7CisJaWYgKHJldCkgeworCQlkZXZpY2VfcHJp bnRmKGRldiwgIkRlY29kZSBQQ0kgcmFuZ2VzIGZhaWxlZCwgcmV0PSVkXG4iLCByZXQpOworCQly ZXR1cm4gKEVGQVVMVCk7CisJfQorCisJLyogR2V0IFBDSSBpbnRlcnJ1cHQgaW5mby4gKi8KKwlv ZndfYnVzX3NldHVwX2lpbmZvKG5vZGUsICZzYy0+c2NfcGNpX2lpbmZvLCBzaXplb2YocGNlbGxf dCkpOworCisJaWYgKGJvb3R2ZXJib3NlKSB7CisJCWRldmljZV9wcmludGYoZGV2LAorCQkgICAg ImJyaWRnZSBzcGFjZTogYmFzZV9wYXJlbnQgPSAweCVseCwgYmFzZV9wY2kgPSAweCVseCAiCisJ CSAgICAibGVuID0gJWx4XG4iLCBzYy0+cGNpX3JhbmdlW0FMX1BDSV9SQU5HRV9CUklER0VdLmJh c2VfcGFyZW50LAorCQkgICAgc2MtPnBjaV9yYW5nZVtBTF9QQ0lfUkFOR0VfQlJJREdFXS5iYXNl X3BjaSwKKwkJICAgIHNjLT5wY2lfcmFuZ2VbQUxfUENJX1JBTkdFX0JSSURHRV0ubGVuKTsKKwkJ ZGV2aWNlX3ByaW50ZihkZXYsCisJCSAgICAibWVtb3J5IHNwYWNlOiBiYXNlX3BhcmVudCA9IDB4 JWx4LCBiYXNlX3BjaSA9IDB4JWx4ICIKKwkJICAgICJsZW4gPSAlbHhcbiIsIHNjLT5wY2lfcmFu Z2VbQUxfUENJX1JBTkdFX01FTV0uYmFzZV9wYXJlbnQsCisJCSAgICBzYy0+cGNpX3JhbmdlW0FM X1BDSV9SQU5HRV9NRU1dLmJhc2VfcGNpLAorCQkgICAgc2MtPnBjaV9yYW5nZVtBTF9QQ0lfUkFO R0VfTUVNXS5sZW4pOworCQlkZXZpY2VfcHJpbnRmKGRldiwKKwkJICAgICJJTyBzcGFjZTogYmFz ZV9wYXJlbnQgPSAweCVseCwgYmFzZV9wY2kgPSAweCVseCAiCisJCSAgICAibGVuID0gJWx4XG4i LCBzYy0+cGNpX3JhbmdlW0FMX1BDSV9SQU5HRV9JT10uYmFzZV9wYXJlbnQsCisJCSAgICBzYy0+ cGNpX3JhbmdlW0FMX1BDSV9SQU5HRV9JT10uYmFzZV9wY2ksCisJCSAgICBzYy0+cGNpX3Jhbmdl W0FMX1BDSV9SQU5HRV9JT10ubGVuKTsKKwl9CisKKwlpZiAoYnVzX3NwYWNlX21hcChmZHRidXNf YnNfdGFnLAorCSAgICBzYy0+cGNpX3JhbmdlW0FMX1BDSV9SQU5HRV9CUklER0VdLmJhc2VfcGFy ZW50LAorCSAgICBzYy0+cGNpX3JhbmdlW0FMX1BDSV9SQU5HRV9CUklER0VdLmxlbiwgMCwgJnNj LT5lY2FtX2hhbmRsZSkpIHsKKwkJZGV2aWNlX3ByaW50ZihkZXYsICJGYWlsZWQgdG8gbWFwIGJy aWRnZSBidXMgYWRkcmVzc1xuIik7CisJCXJldHVybiAoRUZBVUxUKTsKKwl9CisKKwlpZiAoYm9v dHZlcmJvc2UpCisJCWRldmljZV9wcmludGYoZGV2LCAiZWNhbV9iYWRkciA9IDB4JXBcbiIsCisJ CSAgICAodm9pZCopc2MtPmVjYW1faGFuZGxlKTsKKworCXJldCA9IGFsX3BjaWVfZW5hYmxlX2Nv bnRyb2xsZXIoc2MpOworCWlmIChyZXQpIHsKKwkJZGV2aWNlX3ByaW50ZihkZXYsICJGYWlsZWQg dG8gZW5hYmxlIFBDSUUgY29udHJvbGxlclxuIik7CisJCXJldHVybiAoRUZBVUxUKTsKKwl9CisK KwlyZXQgPSBhbF9wY2llX3BvcnRfY2hlY2tfbGluayhzYyk7CisJaWYgKHJldCA9PSAwKSB7CisJ CWRldmljZV9wcmludGYoZGV2LCAiRmFpbGVkIHRvIGNoZWNrIGxpbmtcbiIpOworCQlyZXR1cm4g KEVGQVVMVCk7CisJfQorCisJcmV0ID0gYWxfcGNpZV9jZmdfcHJlcGFyZShzYyk7CisJaWYgKHJl dCkgeworCQlkZXZpY2VfcHJpbnRmKGRldiwgIkZhaWxlZCB0byBwcmVwYXJlIGNvbmZpZ1xuIik7 CisJCXJldHVybiAoRUZBVUxUKTsKKwl9CisKKwlyZXQgPSBhbF9wY2llX2lvX3ByZXBhcmUoc2Mp OworCWlmIChyZXQpIHsKKwkJZGV2aWNlX3ByaW50ZihkZXYsICJGYWlsZWQgdG8gcHJlcGFyZSBJ T1xuIik7CisJCXJldHVybiAoRUZBVUxUKTsKKwl9CisKKwkvKiBDb25maWd1cmUgSU9DQyBmb3Ig ZXh0ZXJuYWwgUENJRSAqLworCWlmIChzYy0+c2NfdHlwZSAhPSBBTF9QQ0lfVFlQRV9JTlRFUk5B TCkgeworCQlhbF9wY2llX3BvcnRfc25vb3BfY29uZmlnKCZzYy0+cGNpZV9wb3J0LCAxKTsKKwkJ YWxfcGNpYl9lbmFibGUoc2MpOworCX0KKworCXJldCA9IGFsX3BjaWJfbWVtX2luaXQoc2MpOwor CWlmIChyZXQpIHsKKwkJZGV2aWNlX3ByaW50ZihkZXYsICJGYWlsZWQgdG8gYWxfcGNpYl9tZW1f aW5pdFxuIik7CisJCXJldHVybiAoRUZBVUxUKTsKKwl9CisKKwlyZXQgPSBhbF9wY2liX2luaXQo c2MsIHNjLT5zY19idXNuciwKKwkgICAgYWxfcGNpYl9tYXhzbG90cyhzYy0+c2NfZGV2KSk7CisJ aWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWRldmljZV9hZGRfY2hpbGQoZGV2LCAicGNpIiwg LTEpOworCisJcmV0dXJuIChidXNfZ2VuZXJpY19hdHRhY2goZGV2KSk7Cit9CisKK3N0YXRpYyBz dHJ1Y3QgcmVzb3VyY2UgKgorYWxfcGNpYl9hbGxvY19yZXNvdXJjZShkZXZpY2VfdCBkZXYsIGRl dmljZV90IGNoaWxkLCBpbnQgdHlwZSwgaW50ICpyaWQsCisgICAgdV9sb25nIHN0YXJ0LCB1X2xv bmcgZW5kLCB1X2xvbmcgY291bnQsIHVfaW50IGZsYWdzKQoreworCWFsX3BjaWJfc29mdGMgKnNj ID0gZGV2aWNlX2dldF9zb2Z0YyhkZXYpOworCXN0cnVjdCBybWFuICpybSA9IE5VTEw7CisJc3Ry dWN0IHJlc291cmNlICpyZXM7CisJdV9sb25nIGJ1c19zdGFydCA9IDAsIGJ1c19zaXplID0gMDsK KworCWlmIChib290dmVyYm9zZSkKKwkJZGV2aWNlX3ByaW50ZihkZXYsICJhbF9wY2liX2FsbG9j X3Jlc291cmNlIGJlZ2luLCBzdGFydD0weCVseCwgIgorCQkgICAgImVuZD0weCVseCwgY291bnQ9 MHglbHgsIHR5cGU9JWRcbiIsCisJCSAgICBzdGFydCwgZW5kLCBjb3VudCwgdHlwZSk7CisKKwlz d2l0Y2ggKHR5cGUpIHsKKwljYXNlIFNZU19SRVNfSU9QT1JUOgorCQlybSA9ICZzYy0+c2NfaW9f cm1hbjsKKwkJYnVzX3N0YXJ0ID0gc2MtPnBjaV9yYW5nZVtBTF9QQ0lfUkFOR0VfSU9dLmJhc2Vf cGNpOworCQlidXNfc2l6ZSA9IHNjLT5wY2lfcmFuZ2VbQUxfUENJX1JBTkdFX0lPXS5sZW47CisJ CWJyZWFrOworCWNhc2UgU1lTX1JFU19NRU1PUlk6CisJCXJtID0gJnNjLT5zY19tZW1fcm1hbjsK KwkJYnVzX3N0YXJ0ID0gc2MtPnBjaV9yYW5nZVtBTF9QQ0lfUkFOR0VfTUVNXS5iYXNlX3BjaTsK KwkJYnVzX3NpemUgPSBzYy0+cGNpX3JhbmdlW0FMX1BDSV9SQU5HRV9NRU1dLmxlbjsKKwkJYnJl YWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIChCVVNfQUxMT0NfUkVTT1VSQ0UoZGV2aWNlX2dldF9w YXJlbnQoZGV2KSwgZGV2LAorCQkJdHlwZSwgcmlkLCBzdGFydCwgZW5kLCBjb3VudCwgZmxhZ3Mp KTsKKwl9OworCisJaWYgKChzdGFydCA9PSAwVUwpICYmIChlbmQgPT0gfjBVTCkpIHsKKwkJc3Rh cnQgPSBidXNfc3RhcnQ7CisJCWVuZCA9IGJ1c19zdGFydCArIGJ1c19zaXplIC0gMTsKKwkJY291 bnQgPSBidXNfc2l6ZTsKKwl9CisKKwlpZiAoKHN0YXJ0IDwgYnVzX3N0YXJ0KSB8fCAoc3RhcnQg KyBjb3VudCAtIDEgIT0gZW5kKSB8fAorCQkoZW5kID4gYnVzX3N0YXJ0ICsgYnVzX3NpemUgLSAx KSkgeworCQlkZXZpY2VfcHJpbnRmKGRldiwgInJhbmdlIGZhaWxlZFxuIik7CisJCXJldHVybiAo TlVMTCk7CisJfQorCisJcmVzID0gcm1hbl9yZXNlcnZlX3Jlc291cmNlKHJtLCBzdGFydCwgZW5k LCBjb3VudCwgZmxhZ3MsIGNoaWxkKTsKKwlpZiAocmVzID09IE5VTEwpIHsKKwkJZGV2aWNlX3By aW50ZihkZXYsICJybWFuX3Jlc2VydmVfcmVzb3VyY2UgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIChO VUxMKTsKKwl9CisKKwlybWFuX3NldF9yaWQocmVzLCAqcmlkKTsKKwlybWFuX3NldF9idXN0YWco cmVzLCBmZHRidXNfYnNfdGFnKTsKKwlybWFuX3NldF9idXNoYW5kbGUocmVzLCBzdGFydCk7CisK KwlpZiAoZmxhZ3MgJiBSRl9BQ1RJVkUpCisJCWlmIChidXNfYWN0aXZhdGVfcmVzb3VyY2UoY2hp bGQsIHR5cGUsICpyaWQsIHJlcykpIHsKKwkJCXJtYW5fcmVsZWFzZV9yZXNvdXJjZShyZXMpOwor CQkJZGV2aWNlX3ByaW50ZihkZXYsICJidXNfYWN0aXZhdGVfcmVzb3VyY2UgZmFpbGVkXG4iKTsK KwkJCXJldHVybiAoTlVMTCk7CisJCX0KKworCXJldHVybiAocmVzKTsKK30KKworc3RhdGljIGlu dAorYWxfcGNpYl9yZWxlYXNlX3Jlc291cmNlKGRldmljZV90IGRldiwgZGV2aWNlX3QgY2hpbGQs IGludCB0eXBlLCBpbnQgcmlkLAorICAgIHN0cnVjdCByZXNvdXJjZSAqcmVzKQoreworCisJcmV0 dXJuICgwKTsKK30KKworc3RhdGljIGludAorYWxfcGNpYl9yZWFkX2l2YXIoZGV2aWNlX3QgZGV2 LCBkZXZpY2VfdCBjaGlsZCwgaW50IHdoaWNoLCB1aW50cHRyX3QgKnJlc3VsdCkKK3sKKwlhbF9w Y2liX3NvZnRjICpzYyA9IGRldmljZV9nZXRfc29mdGMoZGV2KTsKKworCXN3aXRjaCAod2hpY2gp IHsKKwljYXNlIFBDSUJfSVZBUl9CVVM6CisJCSpyZXN1bHQgPSBzYy0+c2NfYnVzbnI7CisJCXJl dHVybiAoMCk7CisJY2FzZSBQQ0lCX0lWQVJfRE9NQUlOOgorCQkqcmVzdWx0ID0gZGV2aWNlX2dl dF91bml0KGRldik7CisJCXJldHVybiAoMCk7CisJfQorCisJcmV0dXJuIChFTk9FTlQpOworfQor CitzdGF0aWMgaW50CithbF9wY2liX3dyaXRlX2l2YXIoZGV2aWNlX3QgZGV2LCBkZXZpY2VfdCBj aGlsZCwgaW50IHdoaWNoLCB1aW50cHRyX3QgdmFsdWUpCit7CisJYWxfcGNpYl9zb2Z0YyAqc2Mg PSBkZXZpY2VfZ2V0X3NvZnRjKGRldik7CisKKwlzd2l0Y2ggKHdoaWNoKSB7CisJY2FzZSBQQ0lC X0lWQVJfQlVTOgorCQlzYy0+c2NfYnVzbnIgPSB2YWx1ZTsKKwkJcmV0dXJuICgwKTsKKwl9CisK KwlyZXR1cm4gKEVOT0VOVCk7Cit9CisKK3N0YXRpYyBpbnQKK2FsX3BjaWJfbWF4c2xvdHMoZGV2 aWNlX3QgZGV2KQoreworCisJcmV0dXJuIChBTF9QQ0lfTUFYX1NMT1RTKTsKK30KKworc3RhdGlj IHVpbnQzMl90CithbF9wY2liX3JlYWRfY29uZmlnKGRldmljZV90IGRldiwgdV9pbnQgYnVzLCB1 X2ludCBzbG90LCB1X2ludCBmdW5jLAorICAgIHVfaW50IHJlZywgaW50IGJ5dGVzKQoreworCWJ1 c19hZGRyX3QgYWRkcjsKKwl1aW50MzJfdCB2YWwgPSAweGZmZmZmZmZmOworCWFsX3BjaWJfc29m dGMgKnNjID0gZGV2aWNlX2dldF9zb2Z0YyhkZXYpOworCWJ1c19hZGRyX3QgaGFuZGxlID0gMDsK KwlpbnQgcmV0OworCisJbXR4X2xvY2soJnNjLT5jb25mX2xvY2spOworCisJcmV0ID0gYWxfcGNp ZV9jZmdfYWRkcihkZXYsIGJ1cywgc2xvdCwgZnVuYywKKwkgICAgcmVnICYgfkNPTkZJR19BRERS RVNTX1pFUk9fQklUU19NQVNLLCBieXRlcywgJmhhbmRsZSwgJmFkZHIpOworCisJaWYgKHJldCkK KwkJZ290byBlbmQ7CisKKwl2YWwgPSBidXNfc3BhY2VfcmVhZF80KGZkdGJ1c19ic190YWcsIGhh bmRsZSwgYWRkcik7CisJc3dpdGNoIChieXRlcykgeworCWNhc2UgMToKKwkJdmFsID0gKHZhbCA+ PiAoKHJlZyAmIENPTkZJR19BRERSRVNTX0JZVEVfU0VMRUNUT1JfTUFTSykgKiBOQkJZKSkgJiAw eGZmOworCQlicmVhazsKKwljYXNlIDI6CisJCXZhbCA9ICh2YWwgPj4gKChyZWcgJiBDT05GSUdf QUREUkVTU19CWVRFX1NFTEVDVE9SX01BU0spICogTkJCWSkpICYgMHhmZmZmOworCQlicmVhazsK KwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKK2VuZDoKKwltdHhfdW5sb2NrKCZzYy0+Y29uZl9s b2NrKTsKKworCWlmIChib290dmVyYm9zZSkKKwkJZGV2aWNlX3ByaW50ZihzYy0+c2NfZGV2LAor CQkgICAgImFsX3BjaWJfcmVhZF9jb25maWcgYmVnaW4gYWRkcj0lcCBidXM9JWQsIHNsb3Q9JWQs ICIKKwkJICAgICJmdW5jPSVkIHJlZz0lZCBieXRlcz0lZCB2YWw9JXhcbiIsCisJCSAgICAodm9p ZCopYWRkciwgYnVzLCBzbG90LCBmdW5jLCByZWcsIGJ5dGVzLCB2YWwpOworCisJcmV0dXJuICh2 YWwpOworfQorCitzdGF0aWMgdm9pZAorYWxfcGNpYl93cml0ZV9jb25maWcoZGV2aWNlX3QgZGV2 LCB1X2ludCBidXMsIHVfaW50IHNsb3QsIHVfaW50IGZ1bmMsCisgICAgdV9pbnQgcmVnLCB1aW50 MzJfdCB2YWwsIGludCBieXRlcykKK3sKKwlidXNfYWRkcl90IGFkZHI7CisJYWxfcGNpYl9zb2Z0 YyAqc2MgPSBkZXZpY2VfZ2V0X3NvZnRjKGRldik7CisJYnVzX2FkZHJfdCBoYW5kbGUgPSAwOwor CWludCByZXQ7CisKKwltdHhfbG9jaygmc2MtPmNvbmZfbG9jayk7CisKKwlyZXQgPSBhbF9wY2ll X2NmZ19hZGRyKGRldiwgYnVzLCBzbG90LCBmdW5jLCByZWcsCisJICAgIGJ5dGVzLCAmaGFuZGxl LCAmYWRkcik7CisJaWYgKHJldCkKKwkJZ290byBlbmQ7CisKKwlzd2l0Y2ggKGJ5dGVzKSB7CisJ Y2FzZSAxOgorCQlidXNfc3BhY2Vfd3JpdGVfMShmZHRidXNfYnNfdGFnLCBoYW5kbGUsIGFkZHIs CisJCSAgICAodWludDhfdCl2YWwpOworCQlicmVhazsKKwljYXNlIDI6CisJCWJ1c19zcGFjZV93 cml0ZV8yKGZkdGJ1c19ic190YWcsIGhhbmRsZSwgYWRkciwKKwkJICAgICh1aW50MTZfdCl2YWwp OworCQlicmVhazsKKwljYXNlIDQ6CisJCWJ1c19zcGFjZV93cml0ZV80KGZkdGJ1c19ic190YWcs IGhhbmRsZSwgYWRkciwKKwkJICAgICh1aW50MzJfdCl2YWwpOworCQlicmVhazsKKwlkZWZhdWx0 OgorCQlicmVhazsKKwl9CisKK2VuZDoKKwltdHhfdW5sb2NrKCZzYy0+Y29uZl9sb2NrKTsKKwor CWlmIChib290dmVyYm9zZSkKKwkJZGV2aWNlX3ByaW50ZihzYy0+c2NfZGV2LAorCQkgICAgImFs X3BjaWJfd3JpdGVfY29uZmlnIGJlZ2luIGFkZHI9JXAgYnVzPSVkLCBzbG90PSVkLCAiCisJCSAg ICAiZnVuYz0lZCByZWc9JWQgYnl0ZXM9JWQgdmFsPSV4XG4iLAorCQkgICAgKHZvaWQqKWFkZHIs IGJ1cywgc2xvdCwgZnVuYywgcmVnLCBieXRlcywgdmFsKTsKKworCXJldHVybjsKK30KKworc3Rh dGljIGludAorYWxfcGNpYl9yb3V0ZV9pbnRlcnJ1cHQoZGV2aWNlX3QgcGNpYiwgZGV2aWNlX3Qg ZGV2LCBpbnQgcGluKQoreworCWFsX3BjaWJfc29mdGMgKnNjOworCXN0cnVjdCBvZndfcGNpX3Jl Z2lzdGVyIHJlZzsKKwl1aW50MzJfdCBwaW50ciwgbWludHJbNF07CisJaW50IGljZWxsczsKKwlw aGFuZGxlX3QgaXBhcmVudDsKKworCXNjID0gZGV2aWNlX2dldF9zb2Z0YyhwY2liKTsKKwlwaW50 ciA9IHBpbjsKKworCS8qIEZhYnJpY2F0ZSBpbWFwIGluZm9ybWF0aW9uIGluIGNhc2UgdGhpcyBp c24ndCBhbiBPRlcgZGV2aWNlICovCisJYnplcm8oJnJlZywgc2l6ZW9mKHJlZykpOworCXJlZy5w aHlzX2hpID0gKHBjaV9nZXRfYnVzKGRldikgPDwgT0ZXX1BDSV9QSFlTX0hJX0JVU1NISUZUKSB8 CisJICAgIChwY2lfZ2V0X3Nsb3QoZGV2KSA8PCBPRldfUENJX1BIWVNfSElfREVWSUNFU0hJRlQp IHwKKwkgICAgKHBjaV9nZXRfZnVuY3Rpb24oZGV2KSA8PCBPRldfUENJX1BIWVNfSElfRlVOQ1RJ T05TSElGVCk7CisKKwlpY2VsbHMgPSBvZndfYnVzX2xvb2t1cF9pbWFwKG9md19idXNfZ2V0X25v ZGUoZGV2KSwgJnNjLT5zY19wY2lfaWluZm8sCisJICAgICZyZWcsIHNpemVvZihyZWcpLCAmcGlu dHIsIHNpemVvZihwaW50ciksIG1pbnRyLCBzaXplb2YobWludHIpLAorCSAgICAmaXBhcmVudCk7 CisJaWYgKGljZWxscyA+IDApCisJCXJldHVybiAob2Z3X2J1c19tYXBfaW50cihkZXYsIGlwYXJl bnQsIGljZWxscywgbWludHIpKTsKKworCS8qIE1heWJlIGl0J3MgYSByZWFsIGludGVycnVwdCwg bm90IGFuIGludHBpbiAqLworCWlmIChwaW4gPiA0KQorCQlyZXR1cm4gKHBpbik7CisKKwlkZXZp Y2VfcHJpbnRmKHBjaWIsICJjb3VsZCBub3Qgcm91dGUgcGluICVkIGZvciBkZXZpY2UgJWQuJWRc biIsCisJICAgIHBpbiwgcGNpX2dldF9zbG90KGRldiksIHBjaV9nZXRfZnVuY3Rpb24oZGV2KSk7 CisJcmV0dXJuIChQQ0lfSU5WQUxJRF9JUlEpOworfQorCgo= --b1_5b195ef0c6e36ed87c42d297273477fd--