From mboxrd@z Thu Jan 1 00:00:00 1970 From: Dave Gordon Subject: [PATCH 05/15] drm/i915: GuC-specific firmware loader Date: Fri, 3 Jul 2015 13:30:27 +0100 Message-ID: <1435926637-30892-6-git-send-email-david.s.gordon@intel.com> References: <1435926637-30892-1-git-send-email-david.s.gordon@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by gabe.freedesktop.org (Postfix) with ESMTP id ED2F84A0A1 for ; Fri, 3 Jul 2015 05:31:00 -0700 (PDT) In-Reply-To: <1435926637-30892-1-git-send-email-david.s.gordon@intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: intel-gfx@lists.freedesktop.org List-Id: intel-gfx@lists.freedesktop.org RnJvbTogQWxleCBEYWkgPHl1LmRhaUBpbnRlbC5jb20+CgpUaGlzIHVzZXMgdGhlIGNvbW1vbiBm aXJtd2FyZSBsb2FkZXIgdG8gZmV0Y2ggdGhlIGZpcm13YXJlIGltYWdlLAp0aGVuIGxvYWRzIGl0 IGludG8gdGhlIEd1QydzIG1lbW9yeSB2aWEgYSBkZWRpY2F0ZWQgRE1BIGVuZ2luZS4KClRoaXMg cGF0Y2ggaXMgZGVyaXZlZCBmcm9tIEd1QyBsb2FkaW5nIHdvcmsgb3JpZ2luYWxseSBkb25lIGJ5 ClZpbml0IEF6YWQgYW5kIEJlbiBXaWRhd3NreS4gSXQgaGFzIGJlZW4gcmVjb25zdHJ1Y3RlZCB0 byBhY2NvcmQKd2l0aCB0aGUgY29tbW9uIGZpcm13YXJlIGxvYWRpbmcgbWVjaGFuaXNtIGJ5IERh dmUgR29yZG9uIGFzIHdlbGwKYXMgbmV3IGZpcm13YXJlIGxheW91dCBldGMuCgp2MjoKICAgIFZh cmlvdXMgaW1wcm92ZW1lbnRzIHBlciByZXZpZXcgY29tbWVudHMgYnkgQ2hyaXMgV2lsc29uCgp2 MzoKICAgIFJlbW92ZWQgJ3dhaXQnIHBhcmFtZXRlciB0byBpbnRlbF9ndWNfdWNvZGVfbG9hZCgp IGFzIHByZWZldGNoCiAgICAgICAgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCBpbiB0aGUgY29tbW9u IGZpcm13YXJlIGxvYWRlciwgcGVyCglEYW5pZWwgVmV0dGVyJ3MgcmVxdWVzdC4KICAgIEYvdyBj aGVja2VyIGNhbGxiYWNrIGZuIG5vdyByZXR1cm5zIGVycm5vIHJhdGhlciB0aGFuIGJvb2wuCgpJ c3N1ZTogVklaLTQ4ODQKU2lnbmVkLW9mZi1ieTogQWxleCBEYWkgPHl1LmRhaUBpbnRlbC5jb20+ ClNpZ25lZC1vZmYtYnk6IERhdmUgR29yZG9uIDxkYXZpZC5zLmdvcmRvbkBpbnRlbC5jb20+Ci0t LQogZHJpdmVycy9ncHUvZHJtL2k5MTUvTWFrZWZpbGUgICAgICAgICAgIHwgICAzICsKIGRyaXZl cnMvZ3B1L2RybS9pOTE1L2k5MTVfZG1hLmMgICAgICAgICB8ICAgNCArCiBkcml2ZXJzL2dwdS9k cm0vaTkxNS9pOTE1X2Rydi5oICAgICAgICAgfCAgMTEgKwogZHJpdmVycy9ncHUvZHJtL2k5MTUv aTkxNV9nZW0uYyAgICAgICAgIHwgICA4ICsKIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfcmVn LmggICAgICAgICB8ICAgNCArLQogZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZ3VjLmggICAg ICAgIHwgIDQ5ICsrKysKIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2d1Y19sb2FkZXIuYyB8 IDQ0OCArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwogNyBmaWxlcyBjaGFuZ2VkLCA1 MjYgaW5zZXJ0aW9ucygrKSwgMSBkZWxldGlvbigtKQogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZl cnMvZ3B1L2RybS9pOTE1L2ludGVsX2d1Yy5oCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9n cHUvZHJtL2k5MTUvaW50ZWxfZ3VjX2xvYWRlci5jCgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUv ZHJtL2k5MTUvTWFrZWZpbGUgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9NYWtlZmlsZQppbmRleCBm MWY4MGZjLi42MmE4YzgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9NYWtlZmls ZQorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9NYWtlZmlsZQpAQCAtNDIsNiArNDIsOSBAQCBp OTE1LXkgKz0gaTkxNV9jbWRfcGFyc2VyLm8gXAogIyBnZW5lcmljIGFuY2lsbGlhcnkgbWljcm9j b250cm9sbGVyIHN1cHBvcnQKIGk5MTUteSArPSBpbnRlbF91Y19sb2FkZXIubwogCisjIGdlbmVy YWwtcHVycG9zZSBtaWNyb2NvbnRyb2xsZXIgKEd1Qykgc3VwcG9ydAoraTkxNS15ICs9IGludGVs X2d1Y19sb2FkZXIubworCiAjIGF1dG9nZW5lcmF0ZWQgbnVsbCByZW5kZXIgc3RhdGUKIGk5MTUt eSArPSBpbnRlbF9yZW5kZXJzdGF0ZV9nZW42Lm8gXAogCSAgaW50ZWxfcmVuZGVyc3RhdGVfZ2Vu Ny5vIFwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZG1hLmMgYi9kcml2 ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2RtYS5jCmluZGV4IGM1MzQ5ZmEuLjczMGQ5MWIgMTAwNjQ0 Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZG1hLmMKKysrIGIvZHJpdmVycy9ncHUv ZHJtL2k5MTUvaTkxNV9kbWEuYwpAQCAtNDY5LDYgKzQ2OSw3IEBAIHN0YXRpYyBpbnQgaTkxNV9s b2FkX21vZGVzZXRfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogCiBjbGVhbnVwX2dlbToK IAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJaW50ZWxfZ3VjX3Vjb2RlX2Zpbmko ZGV2KTsKIAlpOTE1X2dlbV9jbGVhbnVwX3JpbmdidWZmZXIoZGV2KTsKIAlpOTE1X2dlbV9jb250 ZXh0X2ZpbmkoZGV2KTsKIAltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKQEAgLTg2 Niw2ICs4NjcsOCBAQCBpbnQgaTkxNV9kcml2ZXJfbG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2 LCB1bnNpZ25lZCBsb25nIGZsYWdzKQogCiAJaW50ZWxfdW5jb3JlX2luaXQoZGV2KTsKIAorCWlu dGVsX2d1Y191Y29kZV9pbml0KGRldik7CisKIAkvKiBMb2FkIENTUiBGaXJtd2FyZSBmb3IgU0tM ICovCiAJaW50ZWxfY3NyX3Vjb2RlX2luaXQoZGV2KTsKIApAQCAtMTExNyw2ICsxMTIwLDcgQEAg aW50IGk5MTVfZHJpdmVyX3VubG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogCWZsdXNoX3dv cmtxdWV1ZShkZXZfcHJpdi0+d3EpOwogCiAJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgp OworCWludGVsX2d1Y191Y29kZV9maW5pKGRldik7CiAJaTkxNV9nZW1fY2xlYW51cF9yaW5nYnVm ZmVyKGRldik7CiAJaTkxNV9nZW1fY29udGV4dF9maW5pKGRldik7CiAJbXV0ZXhfdW5sb2NrKCZk ZXYtPnN0cnVjdF9tdXRleCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1 X2Rydi5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaAppbmRleCA5NjE4ZjU3Li5h N2NjYWM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5oCisrKyBi L2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmgKQEAgLTUwLDYgKzUwLDcgQEAKICNpbmNs dWRlIDxsaW51eC9pbnRlbC1pb21tdS5oPgogI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KICNpbmNs dWRlIDxsaW51eC9wbV9xb3MuaD4KKyNpbmNsdWRlICJpbnRlbF9ndWMuaCIKIAogLyogR2VuZXJh bCBjdXN0b21pemF0aW9uOgogICovCkBAIC0xNjg3LDYgKzE2ODgsOCBAQCBzdHJ1Y3QgZHJtX2k5 MTVfcHJpdmF0ZSB7CiAKIAlzdHJ1Y3QgaTkxNV92aXJ0dWFsX2dwdSB2Z3B1OwogCisJc3RydWN0 IGludGVsX2d1YyBndWM7CisKIAlzdHJ1Y3QgaW50ZWxfY3NyIGNzcjsKIAogCS8qIERpc3BsYXkg Q1NSLXJlbGF0ZWQgcHJvdGVjdGlvbiAqLwpAQCAtMTkzMSw2ICsxOTM0LDExIEBAIHN0YXRpYyBp bmxpbmUgc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl90b19pOTE1KHN0cnVjdCBkZXZpY2Ug KmRldikKIAlyZXR1cm4gdG9faTkxNShkZXZfZ2V0X2RydmRhdGEoZGV2KSk7CiB9CiAKK3N0YXRp YyBpbmxpbmUgc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmd1Y190b19pOTE1KHN0cnVjdCBpbnRl bF9ndWMgKmd1YykKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGd1Yywgc3RydWN0IGRybV9pOTE1 X3ByaXZhdGUsIGd1Yyk7Cit9CisKIC8qIEl0ZXJhdGUgb3ZlciBpbml0aWFsaXNlZCByaW5ncyAq LwogI2RlZmluZSBmb3JfZWFjaF9yaW5nKHJpbmdfXywgZGV2X3ByaXZfXywgaV9fKSBcCiAJZm9y ICgoaV9fKSA9IDA7IChpX18pIDwgSTkxNV9OVU1fUklOR1M7IChpX18pKyspIFwKQEAgLTI1Mzks NiArMjU0Nyw5IEBAIHN0cnVjdCBkcm1faTkxNV9jbWRfdGFibGUgewogCiAjZGVmaW5lIEhBU19D U1IoZGV2KQkoSVNfU0tZTEFLRShkZXYpKQogCisjZGVmaW5lIEhBU19HVUNfVUNPREUoZGV2KQko SVNfR0VOOShkZXYpKQorI2RlZmluZSBIQVNfR1VDX1NDSEVEKGRldikJKElTX0dFTjkoZGV2KSkK KwogI2RlZmluZSBJTlRFTF9QQ0hfREVWSUNFX0lEX01BU0sJCTB4ZmYwMAogI2RlZmluZSBJTlRF TF9QQ0hfSUJYX0RFVklDRV9JRF9UWVBFCQkweDNiMDAKICNkZWZpbmUgSU5URUxfUENIX0NQVF9E RVZJQ0VfSURfVFlQRQkJMHgxYzAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9p OTE1X2dlbS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW0uYwppbmRleCBhYThmNGMz Li44MGQ3ODkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jCisr KyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtLmMKQEAgLTUwNzYsNiArNTA3NiwxNCBA QCBpOTE1X2dlbV9pbml0X2h3KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiAJCQlnb3RvIG91dDsK IAl9CiAKKwkvKgorCSAqIFdlIGNhbid0IGVuYWJsZSBjb250ZXh0cyB1bnRpbCBhbGwgZmlybXdh cmUgaXMgbG9hZGVkOyBpZiB0aGlzCisJICogZmFpbHMsIGRpc2FibGUgR3VDIHN1Ym1pc3Npb25z IGFuZCBmYWxsIGJhY2sgdG8gZXhlY2xpc3QgbW9kZQorCSAqLworCXJldCA9IGludGVsX2d1Y191 Y29kZV9sb2FkKGRldik7CisJaWYgKHJldCkKKwkJaTkxNS5lbmFibGVfZ3VjX3N1Ym1pc3Npb24g PSBmYWxzZTsKKwogCS8qIE5vdyBpdCBpcyBzYWZlIHRvIGdvIGJhY2sgcm91bmQgYW5kIGRvIGV2 ZXJ5dGhpbmcgZWxzZTogKi8KIAlmb3JfZWFjaF9yaW5nKHJpbmcsIGRldl9wcml2LCBpKSB7CiAJ CXN0cnVjdCBkcm1faTkxNV9nZW1fcmVxdWVzdCAqcmVxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9n cHUvZHJtL2k5MTUvaTkxNV9yZWcuaCBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfcmVnLmgK aW5kZXggMzEzYjFmOS4uZWVmYjg0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUv aTkxNV9yZWcuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3JlZy5oCkBAIC02ODM3 LDcgKzY4MzcsOSBAQCBlbnVtIHNrbF9kaXNwX3Bvd2VyX3dlbGxzIHsKICNkZWZpbmUgICBHRU45 X1BHQ1RMX1NTQl9FVTMxMV9BQ0sJKDEgPDwgMTQpCiAKICNkZWZpbmUgR0VON19NSVNDQ1BDVEwJ CQkoMHg5NDI0KQotI2RlZmluZSAgIEdFTjdfRE9QX0NMT0NLX0dBVEVfRU5BQkxFCSgxPDwwKQor I2RlZmluZSAgIEdFTjdfRE9QX0NMT0NLX0dBVEVfRU5BQkxFCQkoMTw8MCkKKyNkZWZpbmUgICBH RU44X0RPUF9DTE9DS19HQVRFX0NGQ0xLX0VOQUJMRQkoMTw8MikKKyNkZWZpbmUgICBHRU44X0RP UF9DTE9DS19HQVRFX0dVQ19FTkFCTEUJKDE8PDQpCiAKIC8qIElWWUJSSURHRSBEUEYgKi8KICNk ZWZpbmUgR0VON19MM0NERVJSU1QxCQkJMHhCMDA4IC8qIEwzQ0QgRXJyb3IgU3RhdHVzIDEgKi8K ZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2d1Yy5oIGIvZHJpdmVycy9n cHUvZHJtL2k5MTUvaW50ZWxfZ3VjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw MC4uYjM4ZDJiMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVs X2d1Yy5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxNCBJbnRlbCBD b3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2Yg Y2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdh cmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAor ICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5n IHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwg bWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBj b3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUK KyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93 aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRo aXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBz aGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9m IHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJ UyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQs IElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB QklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJ TkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQg SE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElB QklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJ U0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNP RlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4K KyAqCisgKi8KKyNpZm5kZWYgX0lOVEVMX0dVQ19IXworI2RlZmluZSBfSU5URUxfR1VDX0hfCisK KyNpbmNsdWRlICJpbnRlbF91Y19sb2FkZXIuaCIKKyNpbmNsdWRlICJpbnRlbF9ndWNfZndpZi5o IgorI2luY2x1ZGUgImk5MTVfZ3VjX3JlZy5oIgorCitzdHJ1Y3QgaW50ZWxfZ3VjIHsKKwkvKiBH ZW5lcmljIHVDIGZpcm13YXJlIG1hbmFnZW1lbnQgKi8KKwlzdHJ1Y3QgaW50ZWxfdWNfZncgZ3Vj X2Z3OworCisJLyogR3VDLXNwZWNpZmljIGFkZGl0aW9ucyAqLworCXVpbnQxNl90IGZ3X21ham9y X3dhbnRlZDsKKwl1aW50MTZfdCBmd19taW5vcl93YW50ZWQ7CisJdWludDE2X3QgZndfbWFqb3Jf Zm91bmQ7CisJdWludDE2X3QgZndfbWlub3JfZm91bmQ7CisKKwl1aW50MzJfdCBsb2dfZmxhZ3M7 Cit9OworCisvKiBpbnRlbF9ndWNfbG9hZGVyLmMgKi8KK2V4dGVybiB2b2lkIGludGVsX2d1Y191 Y29kZV9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCBpbnRlbF9ndWNf dWNvZGVfbG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIGludGVsX2d1 Y191Y29kZV9maW5pKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworCisjZW5kaWYKZGlmZiAtLWdp dCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2d1Y19sb2FkZXIuYyBiL2RyaXZlcnMvZ3B1 L2RybS9pOTE1L2ludGVsX2d1Y19sb2FkZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw MDAwMDAwLi40OTI5ODM4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUv aW50ZWxfZ3VjX2xvYWRlci5jCkBAIC0wLDAgKzEsNDQ4IEBACisvKgorICogQ29weXJpZ2h0IMKp IDIwMTQgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFu dGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBv ZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAi U29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rp b24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBj b3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICog YW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25z IHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3Qg dG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQg bm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAq IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlh bCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQ Uk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9S CisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVT IE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NF IEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMg T1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1Ig T1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRP UlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElP TiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisgKiBJTiBU SEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIFZpbml0IEF6YWQgPHZpbml0LmF6 YWRAaW50ZWwuY29tPgorICogICAgQmVuIFdpZGF3c2t5IDxiZW5AYndpZGF3c2submV0PgorICog ICAgRGF2ZSBHb3Jkb24gPGRhdmlkLnMuZ29yZG9uQGludGVsLmNvbT4KKyAqICAgIEFsZXggRGFp IDx5dS5kYWlAaW50ZWwuY29tPgorICovCisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNp bmNsdWRlICJpOTE1X2Rydi5oIgorI2luY2x1ZGUgImludGVsX2d1Yy5oIgorCisvKioKKyAqIERP QzogR3VDCisgKgorICogaW50ZWxfZ3VjOgorICogVG9wIGxldmVsIHN0cnVjdHVyZSBvZiBndWMu IEl0IGhhbmRsZXMgZmlybXdhcmUgbG9hZGluZyBhbmQgbWFuYWdlcyBjbGllbnQKKyAqIHBvb2wg YW5kIGRvb3JiZWxscy4gaW50ZWxfZ3VjIG93bnMgYSBpOTE1X2d1Y19jbGllbnQgdG8gcmVwbGFj ZSB0aGUgbGVnYWN5CisgKiBFeGVjTGlzdCBzdWJtaXNzaW9uLgorICoKKyAqIEZpcm13YXJlIHZl cnNpb25pbmc6CisgKiBUaGUgZmlybXdhcmUgYnVpbGQgcHJvY2VzcyB3aWxsIGdlbmVyYXRlIGEg dmVyc2lvbiBoZWFkZXIgZmlsZSB3aXRoIG1ham9yIGFuZAorICogbWlub3IgdmVyc2lvbiBkZWZp bmVkLiBUaGUgdmVyc2lvbnMgYXJlIGJ1aWx0IGludG8gQ1NTIGhlYWRlciBvZiBmaXJtd2FyZS4K KyAqIGk5MTUga2VybmVsIGRyaXZlciBzZXQgdGhlIG1pbmltYWwgZmlybXdhcmUgdmVyc2lvbiBy ZXF1aXJlZCBwZXIgcGxhdGZvcm0uCisgKiBUaGUgZmlybXdhcmUgaW5zdGFsbGF0aW9uIHBhY2th Z2Ugd2lsbCBpbnN0YWxsIChzeW1ib2xpYyBsaW5rKSBwcm9wZXIgdmVyc2lvbgorICogb2YgZmly bXdhcmUuCisgKgorICogR3VDIGFkZHJlc3Mgc3BhY2U6CisgKiBHdUMgZG9lcyBub3QgYWxsb3cg YW55IGdmeCBHR1RUIGFkZHJlc3MgdGhhdCBmYWxscyBpbnRvIHJhbmdlIFswLCBXT1BDTV9UT1Ap LAorICogd2hpY2ggaXMgcmVzZXJ2ZWQgZm9yIEJvb3QgUk9NLCBTUkFNIGFuZCBXT1BDTS4gQ3Vy cmVudGx5IHRoaXMgdG9wIGFkZHJlc3MgaXMKKyAqIDUxMksuIEluIG9yZGVyIHRvIGV4Y2x1ZGUg MC01MTJLIGFkZHJlc3Mgc3BhY2UgZnJvbSBHR1RULCBhbGwgZ2Z4IG9iamVjdHMKKyAqIHVzZWQg YnkgR3VDIGlzIHBpbm5lZCB3aXRoIFBJTl9PRkZTRVRfQklBUyBhbG9uZyB3aXRoIHNpemUgb2Yg V09QQ00uCisgKgorICogRmlybXdhcmUgbG9nOgorICogRmlybXdhcmUgbG9nIGlzIGVuYWJsZWQg Ynkgc2V0dGluZyBpOTE1Lmd1Y19sb2dfbGV2ZWwgdG8gbm9uLW5lZ2F0aXZlIGxldmVsLgorICog TG9nIGRhdGEgaXMgcHJpbnRlZCBvdXQgdmlhIHJlYWRpbmcgZGVidWdmcyBpOTE1X2d1Y19sb2df ZHVtcC4gUmVhZGluZyBmcm9tCisgKiBpOTE1X2d1Y19sb2FkX3N0YXR1cyB3aWxsIHByaW50IG91 dCBmaXJtd2FyZSBsb2FkaW5nIHN0YXR1cyBhbmQgc2NyYXRjaAorICogcmVnaXN0ZXJzIHZhbHVl LgorICoKKyAqLworCisjZGVmaW5lIEk5MTVfU0tMX0dVQ19VQ09ERSAiaTkxNS9za2xfZ3VjX3Zl cjMuYmluIgorTU9EVUxFX0ZJUk1XQVJFKEk5MTVfU0tMX0dVQ19VQ09ERSk7CisKK3N0YXRpYyB1 MzIgZ2V0X2d0dHlwZShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCit7CisJLyog WFhYOiBHVCB0eXBlIGJhc2VkIG9uIFBDSSBkZXZpY2UgSUQ/IGZpZWxkIHNlZW1zIHVudXNlZCBi eSBmdyAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgdTMyIGdldF9jb3JlX2ZhbWlseShzdHJ1 Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCit7CisJc3dpdGNoIChJTlRFTF9JTkZPKGRl dl9wcml2KS0+Z2VuKSB7CisJY2FzZSA4OgorCQlyZXR1cm4gR0ZYQ09SRV9GQU1JTFlfR0VOODsK KwljYXNlIDk6CisJCXJldHVybiBHRlhDT1JFX0ZBTUlMWV9HRU45OworCWRlZmF1bHQ6CisJCURS TV9FUlJPUigiR1VDOiB1bmtub3duIGdlbiBmb3Igc2NoZWR1bGVyIGluaXRcbiIpOworCQlyZXR1 cm4gR0ZYQ09SRV9GQU1JTFlfRk9SQ0VfVUxPTkc7CisJfQorfQorCitzdGF0aWMgdm9pZCBzZXRf Z3VjX2luaXRfcGFyYW1zKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKK3sKKwlz dHJ1Y3QgaW50ZWxfZ3VjICpndWMgPSAmZGV2X3ByaXYtPmd1YzsKKwl1MzIgcGFyYW1zW0dVQ19D VExfTUFYX0RXT1JEU107CisJaW50IGk7CisKKwltZW1zZXQoJnBhcmFtcywgMCwgc2l6ZW9mKHBh cmFtcykpOworCisJcGFyYW1zW0dVQ19DVExfREVWSUNFX0lORk9dIHw9CisJCShnZXRfZ3R0eXBl KGRldl9wcml2KSA8PCBHVUNfQ1RMX0dUVFlQRV9TSElGVCkgfAorCQkoZ2V0X2NvcmVfZmFtaWx5 KGRldl9wcml2KSA8PCBHVUNfQ1RMX0NPUkVGQU1JTFlfU0hJRlQpOworCisJLyogR3VDIEFSQVQg aW5jcmVtZW50IGlzIDEwIG5zLiBHdUMgZGVmYXVsdCBzY2hlZHVsZXIgcXVhbnR1bSBpcyBvbmUK KwkgKiBzZWNvbmQuIFRoaXMgQVJBUiBpcyBjYWxjdWxhdGVkIGJ5OgorCSAqIFNjaGVkdWxlci1R dWFudHVtLWluLW5zIC8gQVJBVC1pbmNyZW1lbnQtaW4tbnMgPSAxMDAwMDAwMDAwIC8gMTAKKwkg Ki8KKwlwYXJhbXNbR1VDX0NUTF9BUkFUX0hJR0hdID0gMDsKKwlwYXJhbXNbR1VDX0NUTF9BUkFU X0xPV10gPSAxMDAwMDAwMDA7CisKKwlwYXJhbXNbR1VDX0NUTF9XQV0gfD0gR1VDX0NUTF9XQV9V S19CWV9EUklWRVI7CisKKwlwYXJhbXNbR1VDX0NUTF9GRUFUVVJFXSB8PSBHVUNfQ1RMX0RJU0FC TEVfU0NIRURVTEVSIHwKKwkJCUdVQ19DVExfVkNTMl9FTkFCTEVEOworCisJaWYgKGk5MTUuZ3Vj X2xvZ19sZXZlbCA+PSAwKSB7CisJCXBhcmFtc1tHVUNfQ1RMX0xPR19QQVJBTVNdID0gZ3VjLT5s b2dfZmxhZ3M7CisJCXBhcmFtc1tHVUNfQ1RMX0RFQlVHXSA9CisJCQlpOTE1Lmd1Y19sb2dfbGV2 ZWwgPDwgR1VDX0xPR19WRVJCT1NJVFlfU0hJRlQ7CisJfQorCisJSTkxNV9XUklURShTT0ZUX1ND UkFUQ0goMCksIDApOworCisJZm9yIChpID0gMDsgaSA8IEdVQ19DVExfTUFYX0RXT1JEUzsgaSsr KQorCQlJOTE1X1dSSVRFKFNPRlRfU0NSQVRDSCgxICsgaSksIHBhcmFtc1tpXSk7Cit9CisKKy8q CisgKiBSZWFkIHRoZSBHdUMgc3RhdHVzIHJlZ2lzdGVyIChHVUNfU1RBVFVTKSBhbmQgc3RvcmUg aXQgaW4gdGhlCisgKiBzcGVjaWZpZWQgbG9jYXRpb247IHRoZW4gcmV0dXJuIGEgYm9vbGVhbiBp bmRpY2F0aW5nIHdoZXRoZXIKKyAqIHRoZSB2YWx1ZSBtYXRjaGVzIGVpdGhlciBvZiB0d28gdmFs dWVzIHJlcHJlc2VudGluZyBjb21wbGV0aW9uCisgKiBvZiB0aGUgR3VDIGJvb3QgcHJvY2Vzcy4K KyAqCisgKiBUaGlzIGlzIHVzZWQgZm9yIHBvbGxpbmcgdGhlIEd1QyBzdGF0dXMgaW4gYSB3YWl0 X2Zvcl9hdG9taWMoKQorICogbG9vcCBiZWxvdy4KKyAqLworc3RhdGljIGlubGluZSBib29sIGd1 Y191Y29kZV9yZXNwb25zZShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQkJ ICAgICAgdTMyICpzdGF0dXMpCit7CisJdTMyIHZhbCA9IEk5MTVfUkVBRChHVUNfU1RBVFVTKTsK Kwkqc3RhdHVzID0gdmFsOworCXJldHVybiAoKHZhbCAmIEdTX1VLRVJORUxfTUFTSykgPT0gR1Nf VUtFUk5FTF9SRUFEWSB8fAorCQkodmFsICYgR1NfVUtFUk5FTF9NQVNLKSA9PSBHU19VS0VSTkVM X0xBUElDX0RPTkUpOworfQorCisvKgorICogVHJhbnNmZXIgdGhlIGZpcm13YXJlIGltYWdlIHRv IFJBTSBmb3IgZXhlY3V0aW9uIGJ5IHRoZSBtaWNyb2NvbnRyb2xsZXIuCisgKgorICogR3VDIEZp cm13YXJlIGxheW91dDoKKyAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAgLS0t LQorICogfCAgICAgICAgICBDU1MgaGVhZGVyICAgICAgICAgICB8ICAxMjhCCisgKiB8IGNvbnRh aW5zIG1ham9yL21pbm9yIHZlcnNpb24gIHwKKyAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tKyAgLS0tLQorICogfCAgICAgICAgICAgICB1Q29kZSAgICAgICAgICAgICB8CisgKiAr LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgIC0tLS0KKyAqIHwgICAgICAgICBSU0Eg c2lnbmF0dXJlICAgICAgICAgfCAgMjU2QgorICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0rICAtLS0tCisgKiB8ICAgICAgICAgUlNBIHB1YmxpYyBLZXkgICAgICAgIHwgIDI1NkIK KyAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAgLS0tLQorICogfCAgICAgICBQ dWJsaWMga2V5IG1vZHVsdXMgICAgICB8ICAgIDRCCisgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLSsgIC0tLS0KKyAqCisgKiBBcmNoaXRlY3R1cmFsbHksIHRoZSBETUEgZW5naW5l IGlzIGJpZGlyZWN0aW9uYWwsIGFuZCBjYW4gcG90ZW50aWFsbHkgZXZlbgorICogdHJhbnNmZXIg YmV0d2VlbiBHVFQgbG9jYXRpb25zLiBUaGlzIGZ1bmN0aW9uYWxpdHkgaXMgbGVmdCBvdXQgb2Yg dGhlIEFQSQorICogZm9yIG5vdyBhcyB0aGVyZSBpcyBubyBuZWVkIGZvciBpdC4KKyAqCisgKiBO b3RlIHRoYXQgR3VDIG5lZWRzIHRoZSBDU1MgaGVhZGVyIHBsdXMgdUtlcm5lbCBjb2RlIHRvIGJl IGNvcGllZCBieSB0aGUKKyAqIERNQSBlbmdpbmUgaW4gb25lIG9wZXJhdGlvbiwgd2hlcmVhcyB0 aGUgUlNBIHNpZ25hdHVyZSBpcyBsb2FkZWQgdmlhIE1NSU8uCisgKi8KKworI2RlZmluZSBVT1Nf Q1NTX0hFQURFUl9PRkZTRVQJCTAKKyNkZWZpbmUgVU9TX1ZFUl9NSU5PUl9PRkZTRVQJCTB4NDQK KyNkZWZpbmUgVU9TX1ZFUl9NQUpPUl9PRkZTRVQJCTB4NDYKKyNkZWZpbmUgVU9TX0NTU19IRUFE RVJfU0laRQkJMHg4MAorI2RlZmluZSBVT1NfUlNBX1NJR19TSVpFCQkweDEwMAorI2RlZmluZSBV T1NfQ1NTX1NJR05JTkdfU0laRQkJMHgyMDQKKworc3RhdGljIGludCBndWNfdWNvZGVfeGZlcl9k bWEoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQoreworCXN0cnVjdCBpbnRlbF91 Y19mdyAqZ3VjX2Z3ID0gJmRldl9wcml2LT5ndWMuZ3VjX2Z3OworCXN0cnVjdCBkcm1faTkxNV9n ZW1fb2JqZWN0ICpmd19vYmogPSBndWNfZnctPnVjX2Z3X29iajsKKwl1bnNpZ25lZCBsb25nIG9m ZnNldDsKKwlzdHJ1Y3Qgc2dfdGFibGUgKnNnID0gZndfb2JqLT5wYWdlczsKKwl1MzIgc3RhdHVz LCB1Y29kZV9zaXplLCByc2FbVU9TX1JTQV9TSUdfU0laRSAvIHNpemVvZih1MzIpXTsKKwlpbnQg aSwgcmV0ID0gMDsKKworCS8qIHVDb2RlIHNpemUsIGFsc28gaXMgd2hlcmUgUlNBIHNpZ25hdHVy ZSBzdGFydHMgKi8KKwlvZmZzZXQgPSB1Y29kZV9zaXplID0gZ3VjX2Z3LT51Y19md19zaXplIC0g VU9TX0NTU19TSUdOSU5HX1NJWkU7CisKKwkvKiBDb3B5IFJTQSBzaWduYXR1cmUgZnJvbSB0aGUg ZncgaW1hZ2UgdG8gSFcgZm9yIHZlcmlmaWNhdGlvbiAqLworCXNnX3Bjb3B5X3RvX2J1ZmZlcihz Zy0+c2dsLCBzZy0+bmVudHMsIHJzYSwgVU9TX1JTQV9TSUdfU0laRSwgb2Zmc2V0KTsKKwlmb3Ig KGkgPSAwOyBpIDwgVU9TX1JTQV9TSUdfU0laRSAvIHNpemVvZih1MzIpOyBpKyspCisJCUk5MTVf V1JJVEUoVU9TX1JTQV9TQ1JBVENIXzAgKyBpICogc2l6ZW9mKHUzMiksIHJzYVtpXSk7CisKKwkv KiBTZXQgdGhlIHNvdXJjZSBhZGRyZXNzIGZvciB0aGUgbmV3IGJsb2IgKi8KKwlvZmZzZXQgPSBp OTE1X2dlbV9vYmpfZ2d0dF9vZmZzZXQoZndfb2JqKTsKKwlJOTE1X1dSSVRFKERNQV9BRERSXzBf TE9XLCBsb3dlcl8zMl9iaXRzKG9mZnNldCkpOworCUk5MTVfV1JJVEUoRE1BX0FERFJfMF9ISUdI LCB1cHBlcl8zMl9iaXRzKG9mZnNldCkgJiAweEZGRkYpOworCisJLyogU2V0IHRoZSBkZXN0aW5h dGlvbi4gQ3VycmVudCB1Q29kZSBleHBlY3RzIGFuIDhrIHN0YWNrIHN0YXJ0aW5nIGZyb20KKwkg KiBvZmZzZXQgMC4gKi8KKwlJOTE1X1dSSVRFKERNQV9BRERSXzFfTE9XLCAweDIwMDApOworCisJ LyogWFhYOiBUaGUgaW1hZ2UgaXMgYXV0b21hdGljYWxseSB0cmFuc2ZlcmVkIHRvIFNSQU0gYWZ0 ZXIgdGhlIFJTQQorCSAqIHZlcmlmaWNhdGlvbi4gVGhpcyBpcyB3aHkgdGhlIGFkZHJlc3Mgc3Bh Y2UgaXMgY2hvc2VuIGFzIHN1Y2guICovCisJSTkxNV9XUklURShETUFfQUREUl8xX0hJR0gsIERN QV9BRERSRVNTX1NQQUNFX1dPUENNKTsKKworCUk5MTVfV1JJVEUoRE1BX0NPUFlfU0laRSwgdWNv ZGVfc2l6ZSk7CisKKwkvKiBGaW5hbGx5IHN0YXJ0IHRoZSBETUEgKi8KKwlJOTE1X1dSSVRFKERN QV9DVFJMLCBfTUFTS0VEX0JJVF9FTkFCTEUoVU9TX01PVkUgfCBTVEFSVF9ETUEpKTsKKworCS8q CisJICogU3Bpbi13YWl0IGZvciB0aGUgRE1BIHRvIGNvbXBsZXRlICYgdGhlIEd1QyB0byBzdGFy dCB1cC4KKwkgKiBOQjogRG9jcyByZWNvbW1lbmQgbm90IHVzaW5nIHRoZSBpbnRlcnJ1cHQgZm9y IGNvbXBsZXRpb24uCisJICogTWVhc3VyZW1lbnRzIGluZGljYXRlIHRoaXMgc2hvdWxkIHRha2Ug bm8gbW9yZSB0aGFuIDIwbXMsIHNvIGEKKwkgKiB0aW1lb3V0IGhlcmUgaW5kaWNhdGVzIHRoYXQg dGhlIEd1QyBoYXMgZmFpbGVkIGFuZCBpcyB1bnVzYWJsZS4KKwkgKiAoSGlnaGVyIGxldmVscyBv ZiB0aGUgZHJpdmVyIHdpbGwgYXR0ZW1wdCB0byBmYWxsIGJhY2sgdG8KKwkgKiBleGVjbGlzdCBt b2RlIGlmIHRoaXMgaGFwcGVucy4pCisJICovCisJcmV0ID0gd2FpdF9mb3JfYXRvbWljKGd1Y191 Y29kZV9yZXNwb25zZShkZXZfcHJpdiwgJnN0YXR1cyksIDEwMCk7CisKKwlEUk1fREVCVUdfRFJJ VkVSKCJETUEgc3RhdHVzIDB4JXgsIEd1QyBzdGF0dXMgMHgleFxuIiwKKwkJCUk5MTVfUkVBRChE TUFfQ1RSTCksIHN0YXR1cyk7CisKKwlpZiAoKHN0YXR1cyAmIEdTX0JPT1RST01fTUFTSykgPT0g R1NfQk9PVFJPTV9SU0FfRkFJTEVEKSB7CisJCURSTV9FUlJPUigiJXMgZmlybXdhcmUgc2lnbmF0 dXJlIHZlcmlmaWNhdGlvbiBmYWlsZWRcbiIsCisJCQlndWNfZnctPnVjX25hbWUpOworCQlyZXQg PSAtRU5PRVhFQzsKKwl9CisKKwlEUk1fREVCVUdfRFJJVkVSKCJyZXR1cm5pbmcgJWRcbiIsIHJl dCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogTG9hZCB0aGUgR3VDIGZpcm13YXJlIGJs b2IgaW50byB0aGUgTWludXRlSUEuCisgKi8KK3N0YXRpYyBpbnQgZ3VjX3Vjb2RlX3hmZXIoc3Ry dWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQoreworCXN0cnVjdCBpbnRlbF91Y19mdyAq Z3VjX2Z3ID0gJmRldl9wcml2LT5ndWMuZ3VjX2Z3OworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYg PSBkZXZfcHJpdi0+ZGV2OworCWludCByZXQ7CisKKwlyZXQgPSBpOTE1X2dlbV9vYmplY3Rfc2V0 X3RvX2d0dF9kb21haW4oZ3VjX2Z3LT51Y19md19vYmosIGZhbHNlKTsKKwlpZiAocmV0KSB7CisJ CURSTV9ERUJVR19EUklWRVIoInNldC1kb21haW4gZmFpbGVkICVkXG4iLCByZXQpOworCQlyZXR1 cm4gcmV0OworCX0KKworCXJldCA9IGk5MTVfZ2VtX29ial9nZ3R0X3BpbihndWNfZnctPnVjX2Z3 X29iaiwgMCwgMCk7CisJaWYgKHJldCkgeworCQlEUk1fREVCVUdfRFJJVkVSKCJwaW4gZmFpbGVk ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCVdBUk5fT04oIW11dGV4X2lzX2xv Y2tlZCgmZGV2LT5zdHJ1Y3RfbXV0ZXgpKTsKKwlpbnRlbF91bmNvcmVfZm9yY2V3YWtlX2dldChk ZXZfcHJpdiwgRk9SQ0VXQUtFX0FMTCk7CisKKwkvKiBpbml0IFdPUENNICovCisJSTkxNV9XUklU RShHVUNfV09QQ01fU0laRSwgR1VDX1dPUENNX1NJWkVfVkFMVUUpOworCUk5MTVfV1JJVEUoRE1B X0dVQ19XT1BDTV9PRkZTRVQsIEdVQ19XT1BDTV9PRkZTRVQpOworCisJLyogSW52YWxpZGF0ZSBH dUMgVExCIHRvIGxldCBHdUMgdGFrZSB0aGUgbGF0ZXN0IHVwZGF0ZXMgdG8gR1RULiAqLworCUk5 MTVfV1JJVEUoR0VOOF9HVENSLCBHRU44X0dUQ1JfSU5WQUxJREFURSk7CisKKwkvKiBTZXQgTU1J Ty9XQSBmb3IgR3VDIGluaXQgKi8KKwlJOTE1X1dSSVRFKERSQk1JU0MxLCBET09SQkVMTF9FTkFC TEUpOworCisJLyogRW5hYmxlIE1JQSBjYWNoaW5nLiBHdUMgY2xvY2sgZ2F0aW5nIGlzIGRpc2Fi bGVkLiAqLworCUk5MTVfV1JJVEUoR1VDX1NISU1fQ09OVFJPTCwgR1VDX1NISU1fQ09OVFJPTF9W QUxVRSk7CisKKwkvKiBXYUM2RGlzYWxsb3dCeUdmeFBhdXNlKi8KKwlJOTE1X1dSSVRFKEdFTjZf R0ZYUEFVU0UsIDB4MzBGRkYpOworCisJaWYgKElTX1NLWUxBS0UoZGV2KSkKKwkJSTkxNV9XUklU RShHRU45X0dUX1BNX0NPTkZJRywgR0VOOF9HVF9ET09SQkVMTF9FTkFCTEUpOworCWVsc2UKKwkJ STkxNV9XUklURShHRU44X0dUX1BNX0NPTkZJRywgR0VOOF9HVF9ET09SQkVMTF9FTkFCTEUpOwor CisJaWYgKElTX0dFTjkoZGV2KSkgeworCQkvKiBET1AgQ2xvY2sgR2F0aW5nIEVuYWJsZSBmb3Ig R3VDIGNsb2NrcyAqLworCQlJOTE1X1dSSVRFKEdFTjdfTUlTQ0NQQ1RMLCAoR0VOOF9ET1BfQ0xP Q0tfR0FURV9HVUNfRU5BQkxFIHwKKwkJCQkJICAgIEk5MTVfUkVBRChHRU43X01JU0NDUENUTCkp KTsKKworCQkvKiBhbGxvd3MgZm9yIDV1cyBiZWZvcmUgR1QgY2FuIGdvIHRvIFJDNiAqLworCQlJ OTE1X1dSSVRFKEdVQ19BUkFUX0M2RElTLCAweDFGRik7CisJfQorCisJc2V0X2d1Y19pbml0X3Bh cmFtcyhkZXZfcHJpdik7CisKKwlyZXQgPSBndWNfdWNvZGVfeGZlcl9kbWEoZGV2X3ByaXYpOwor CisJaW50ZWxfdW5jb3JlX2ZvcmNld2FrZV9wdXQoZGV2X3ByaXYsIEZPUkNFV0FLRV9BTEwpOwor CisJLyoKKwkgKiBXZSBrZWVwIHRoZSBvYmplY3QgcGFnZXMgZm9yIHJldXNlIGR1cmluZyByZXN1 bWUuIEJ1dCB3ZSBjYW4gdW5waW4gaXQKKwkgKiBub3cgdGhhdCBETUEgaGFzIGNvbXBsZXRlZCwg c28gaXQgZG9lc24ndCBjb250aW51ZSB0byB0YWtlIHVwIHNwYWNlLgorCSAqLworCWk5MTVfZ2Vt X29iamVjdF9nZ3R0X3VucGluKGd1Y19mdy0+dWNfZndfb2JqKTsKKworCXJldHVybiByZXQ7Cit9 CisKKy8qCisgKiBDaGVjayB0aGUgZmlybXdhcmUgdGhhdCB3YXMgZm91bmQ7IGlmIGl0J3MgdGhl IHdyb25nIHNpemUgb3IgdGhlIHdyb25nCisgKiB2ZXJzaW9uLCByZXR1cm4gYSBuZWdhdGl2ZSBl cnJvciBjb2RlLiBJZiBpdCdzIE9LLCByZXR1cm4gYSBwb3NpdGl2ZQorICogc3RhdHVzIHZhbHVl LiBIZXJlIHdlIGNhbiBqdXN0IHJldHVybiBJTlRFTF9VQ19GV19HT09EOyB0aGUgY29tbW9uIGxv YWRlcgorICogY29kZSB3aWxsIHRoZW4gc2F2ZSB0aGUgZGF0YSBmb3IgbGF0ZXIgaW4gYSBwYWdl YWJsZSAodG1wZnMtYmFja2VkKSBHRU0KKyAqIG9iamVjdC4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5 IChmb3IgZXhhbXBsZSBpZiB3ZSB3YW50ZWQgb25seSBwYXJ0IG9mIHRoZSBpbWFnZSkgd2UgY291 bGQKKyAqIHNhdmUgdGhlIHJlcXVpcmVkIHBvcnRpb24gaGVyZSBhbmQgdGhlbiByZXR1cm4gSU5U RUxfVUNfRldfU0FWRUQgdG8gdGVsbAorICogdGhlIGNvbW1vbiBsb2FkZXIgdGhhdCB0aGUgZGF0 YSBpcyBnb29kLCBhbmQgd2UndmUgYWxyZWFkeSBoYW5kbGVkIHNhdmluZworICogYW55dGhpbmcg d2UgbmVlZCBsYXRlci4KKyAqCisgKiBUaGUgR3VDIGZpcm13YXJlIGltYWdlIGhhcyB0aGUgdmVy c2lvbiBudW1iZXIgZW1iZWRkZWQgYXQgYSB3ZWxsLWtub3duCisgKiBvZmZzZXQgd2l0aGluIHRo ZSBmaXJtd2FyZSBibG9iOyBub3RlIHRoYXQgbWFqb3IgLyBtaW5vciB2ZXJzaW9uIGFyZQorICog VFdPIGJ5dGVzIGVhY2ggKGkuZS4gdTE2KSwgYWx0aG91Z2ggYWxsIHBvaW50ZXJzIGFuZCBvZmZz ZXRzIGFyZSBkZWZpbmVkCisgKiBpbiB0ZXJtcyBvZiBieXRlcyAodTgpLgorICovCitzdGF0aWMg aW50IGd1Y191Y29kZV9jaGVjayhzdHJ1Y3QgaW50ZWxfdWNfZncgKmd1Y19mdykKK3sKKwlzdHJ1 Y3QgaW50ZWxfZ3VjICpndWMgPSBjb250YWluZXJfb2YoZ3VjX2Z3LCBzdHJ1Y3QgaW50ZWxfZ3Vj LCBndWNfZncpOworCWNvbnN0IHU4ICpjc3NfaGVhZGVyID0gZ3VjX2Z3LT51Y19md19ibG9iLT5k YXRhICsgVU9TX0NTU19IRUFERVJfT0ZGU0VUOworCWNvbnN0IHNpemVfdCBibG9ic2l6ZSA9IGd1 Y19mdy0+dWNfZndfYmxvYi0+c2l6ZTsKKwljb25zdCBzaXplX3QgbWluc2l6ZSA9IFVPU19DU1Nf SEVBREVSX1NJWkUgKyBVT1NfQ1NTX1NJR05JTkdfU0laRTsKKwljb25zdCBzaXplX3QgbWF4c2l6 ZSA9IEdVQ19XT1BDTV9TSVpFX1ZBTFVFICsgVU9TX0NTU19TSUdOSU5HX1NJWkUKKwkJCS0gMHg4 MDAwOyAvKiAzMmsgcmVzZXJ2ZWQgKDhLIHN0YWNrICsgMjRrIGNvbnRleHQpICovCisKKwlEUk1f REVCVUdfRFJJVkVSKCJmaXJtd2FyZSBmaWxlIHNpemUgJXp1IChtaW5pbXVtICV6dSwgbWF4aW11 bSAlenUpXG4iLAorCQlibG9ic2l6ZSwgbWluc2l6ZSwgbWF4c2l6ZSk7CisKKwkvKiBDaGVjayB0 aGUgc2l6ZSBvZiB0aGUgYmxvYiBiZWZvZSBleGFtaW5pbmcgYnVmZmVyIGNvbnRlbnRzICovCisJ aWYgKGJsb2JzaXplIDwgbWluc2l6ZSB8fCBibG9ic2l6ZSA+IG1heHNpemUpCisJCXJldHVybiAt RU5PRVhFQzsKKworCWd1Yy0+ZndfbWFqb3JfZm91bmQgPSAqKHUxNiAqKShjc3NfaGVhZGVyICsg VU9TX1ZFUl9NQUpPUl9PRkZTRVQpOworCWd1Yy0+ZndfbWlub3JfZm91bmQgPSAqKHUxNiAqKShj c3NfaGVhZGVyICsgVU9TX1ZFUl9NSU5PUl9PRkZTRVQpOworCisJaWYgKGd1Yy0+ZndfbWFqb3Jf Zm91bmQgIT0gZ3VjLT5md19tYWpvcl93YW50ZWQgfHwKKwkgICAgZ3VjLT5md19taW5vcl9mb3Vu ZCA8IGd1Yy0+ZndfbWlub3Jfd2FudGVkKSB7CisJCURSTV9FUlJPUigiR3VDIGZpcm13YXJlIHZl cnNpb24gJWQuJWQsIHJlcXVpcmVkICVkLiVkXG4iLAorCQkJZ3VjLT5md19tYWpvcl9mb3VuZCwg Z3VjLT5md19taW5vcl9mb3VuZCwKKwkJCWd1Yy0+ZndfbWFqb3Jfd2FudGVkLCBndWMtPmZ3X21p bm9yX3dhbnRlZCk7CisJCXJldHVybiAtRU5PRVhFQzsKKwl9CisKKwlEUk1fREVCVUdfRFJJVkVS KCJmaXJtd2FyZSB2ZXJzaW9uICVkLiVkIE9LIChtaW5pbXVtICVkLiVkKVxuIiwKKwkJCWd1Yy0+ ZndfbWFqb3JfZm91bmQsIGd1Yy0+ZndfbWlub3JfZm91bmQsCisJCQlndWMtPmZ3X21ham9yX3dh bnRlZCwgZ3VjLT5md19taW5vcl93YW50ZWQpOworCisJcmV0dXJuIElOVEVMX1VDX0ZXX0dPT0Q7 Cit9CisKKy8qKgorICogaW50ZWxfZ3VjX3Vjb2RlX2luaXQoKSAtIGluaXRpYXRlIGEgZmlybXdh cmUgbG9hZGluZyByZXF1ZXN0CisgKgorICogQ2FsbGVkIGVhcmx5IGR1cmluZyBkcml2ZXIgbG9h ZCwgYmVmb3JlIEdFTSBpcyBpbml0aWFsaXNlZC4KKyAqIERyaXZlciBpcyBzaW5nbGUgdGhyZWFk ZWQsIHNvIG5vIG11dGV4IGlzIHJlcXVpcmVkLgorICoKKyAqIFRoaXMganVzdCBzZXRzIHBhcmFt ZXRlcnMgZm9yIHVzZSB3aGVuIGludGVsX2d1Y191Y29kZV9sb2FkKCkKKyAqIGlzIGNhbGxlZCBs YXRlciwgYWZ0ZXIgR0VNIGluaXRpYWxpc2F0aW9uIGlzIGNvbXBsZXRlLgorICovCit2b2lkIGlu dGVsX2d1Y191Y29kZV9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRy bV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgaW50 ZWxfZ3VjICpndWMgPSAmZGV2X3ByaXYtPmd1YzsKKwlzdHJ1Y3QgaW50ZWxfdWNfZncgKmd1Y19m dyA9ICZndWMtPmd1Y19mdzsKKwljb25zdCBjaGFyICpwYXRoOworCisJaWYgKCFIQVNfR1VDX1ND SEVEKGRldikpCisJCWk5MTUuZW5hYmxlX2d1Y19zdWJtaXNzaW9uID0gZmFsc2U7CisKKwlpZiAo IUhBU19HVUNfVUNPREUoZGV2KSkgeworCQlwYXRoID0gTlVMTDsKKwl9IGVsc2UgaWYgKElTX1NL WUxBS0UoZGV2KSkgeworCQlwYXRoID0gSTkxNV9TS0xfR1VDX1VDT0RFOworCQlndWMtPmZ3X21h am9yX3dhbnRlZCA9IDM7CisJCWd1Yy0+ZndfbWlub3Jfd2FudGVkID0gMDsKKwl9IGVsc2Ugewor CQlpOTE1LmVuYWJsZV9ndWNfc3VibWlzc2lvbiA9IGZhbHNlOworCQlwYXRoID0gIiI7CS8qIHVu a25vd24gZGV2aWNlICovCisJfQorCisJaW50ZWxfdWNfZndfaW5pdChkZXYsIGd1Y19mdywgIkd1 QyIsIHBhdGgpOworfQorCisvKioKKyAqIGludGVsX2d1Y191Y29kZV9sb2FkKCkgLSBsb2FkIEd1 QyB1Q29kZSBpbnRvIHRoZSBkZXZpY2UKKyAqCisgKiBDYWxsZWQgZnJvbSBnZW1faW5pdF9odygp IGR1cmluZyBkcml2ZXIgbG9hZGluZyBhbmQgYWxzbyBhZnRlciBhIEdQVSByZXNldC4KKyAqCisg KiBDYWxscyB0aGUgY29tbW9uIGxvYWRlciB0byBnZXQgdGhlIGZpcm13YXJlIHJlZ2lzdGVyZWQg ZWFybGllci4gT24gdGhlIGZpcnN0CisgKiBjYWxsLCB0aGlzIHdpbGwgYWN0dWFsbHkgZmV0Y2gg aXQgZnJvbSB0aGUgZmlsZXN5c3RlbTsgdGhlcmVhZnRlciwgd2Ugd2lsbAorICogYWxyZWFkeSBl aXRoZXIgaGF2ZSB0aGUgYmxvYiBpbiBhIEdFTSBvYmplY3QsIG9yIGhhdmUgZGV0ZXJtaW5lZCB0 aGF0IG5vCisgKiB2YWxpZCBmaXJtd2FyZSBpbWFnZSBjb3VsZCBiZSBmb3VuZCkuCisgKgorICog SWYgd2UgaGF2ZSBhIGdvb2QgZmlybXdhcmUgaW1hZ2UsIHRyYW5zZmVyIGl0IHRvIHRoZSBoL3cu CisgKi8KK2ludCBpbnRlbF9ndWNfdWNvZGVfbG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQor eworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7 CisJc3RydWN0IGludGVsX3VjX2Z3ICpndWNfZncgPSAmZGV2X3ByaXYtPmd1Yy5ndWNfZnc7CisJ aW50IGVycjsKKworCURSTV9ERUJVR19EUklWRVIoIiVzIGZ3IHN0YXR1czogZmV0Y2ggJXMsIGxv YWQgJXNcbiIsCisJCWd1Y19mdy0+dWNfbmFtZSwKKwkJaW50ZWxfdWNfZndfc3RhdHVzX3JlcHIo Z3VjX2Z3LT51Y19md19mZXRjaF9zdGF0dXMpLAorCQlpbnRlbF91Y19md19zdGF0dXNfcmVwcihn dWNfZnctPnVjX2Z3X2xvYWRfc3RhdHVzKSk7CisKKwlpZiAoZ3VjX2Z3LT51Y19md19mZXRjaF9z dGF0dXMgPT0gSU5URUxfVUNfRklSTVdBUkVfTk9ORSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoZ3Vj X2Z3LT51Y19md19mZXRjaF9zdGF0dXMgPT0gSU5URUxfVUNfRklSTVdBUkVfU1VDQ0VTUyAmJgor CSAgICBndWNfZnctPnVjX2Z3X2xvYWRfc3RhdHVzID09IElOVEVMX1VDX0ZJUk1XQVJFX0ZBSUwp CisJCXJldHVybiAtRU5PRVhFQzsKKworCWd1Y19mdy0+dWNfZndfbG9hZF9zdGF0dXMgPSBJTlRF TF9VQ19GSVJNV0FSRV9QRU5ESU5HOworCWVyciA9IGludGVsX3VjX2Z3X2ZldGNoKGd1Y19mdywg Z3VjX3Vjb2RlX2NoZWNrKTsKKwlpZiAoZXJyKQorCQlnb3RvIGZhaWw7CisKKwllcnIgPSBndWNf dWNvZGVfeGZlcihkZXZfcHJpdik7CisJaWYgKGVycikKKwkJZ290byBmYWlsOworCisJZ3VjX2Z3 LT51Y19md19sb2FkX3N0YXR1cyA9IElOVEVMX1VDX0ZJUk1XQVJFX1NVQ0NFU1M7CisKKwlEUk1f REVCVUdfRFJJVkVSKCIlcyBmdyBzdGF0dXM6IGZldGNoICVzLCBsb2FkICVzXG4iLAorCQlndWNf ZnctPnVjX25hbWUsCisJCWludGVsX3VjX2Z3X3N0YXR1c19yZXByKGd1Y19mdy0+dWNfZndfZmV0 Y2hfc3RhdHVzKSwKKwkJaW50ZWxfdWNfZndfc3RhdHVzX3JlcHIoZ3VjX2Z3LT51Y19md19sb2Fk X3N0YXR1cykpOworCisJcmV0dXJuIDA7CisKK2ZhaWw6CisJaWYgKGd1Y19mdy0+dWNfZndfbG9h ZF9zdGF0dXMgPT0gSU5URUxfVUNfRklSTVdBUkVfUEVORElORykKKwkJZ3VjX2Z3LT51Y19md19s b2FkX3N0YXR1cyA9IElOVEVMX1VDX0ZJUk1XQVJFX0ZBSUw7CisKKwlEUk1fRVJST1IoIkZhaWxl ZCB0byBpbml0aWFsaXplIEd1QywgZXJyb3IgJWRcbiIsIGVycik7CisKKwlyZXR1cm4gZXJyOwor fQorCisvKioKKyAqIGludGVsX2d1Y191Y29kZV9maW5pKCkgLSBjbGVhbiB1cCBhbGwgYWxsb2Nh dGVkIHJlc291cmNlcworICovCit2b2lkIGludGVsX2d1Y191Y29kZV9maW5pKHN0cnVjdCBkcm1f ZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2 LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgaW50ZWxfdWNfZncgKmd1Y19mdyA9ICZkZXZfcHJpdi0+ Z3VjLmd1Y19mdzsKKworCWludGVsX3VjX2Z3X2ZpbmkoZ3VjX2Z3KTsKK30KLS0gCjEuOS4xCgpf X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpJbnRlbC1nZngg bWFpbGluZyBsaXN0CkludGVsLWdmeEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cDovL2xpc3Rz LmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2ludGVsLWdmeAo=