From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mblankhorst.nl (mblankhorst.nl [141.105.120.124]) by gabe.freedesktop.org (Postfix) with ESMTPS id 6F0646ECBB for ; Wed, 31 Jan 2018 16:52:05 +0000 (UTC) From: Maarten Lankhorst Date: Wed, 31 Jan 2018 17:52:00 +0100 Message-Id: <20180131165200.72670-1-maarten.lankhorst@linux.intel.com> In-Reply-To: <20180131143226.GL5453@intel.com> References: <20180131143226.GL5453@intel.com> Subject: [igt-dev] [PATCH i-g-t] lib/igt_fb: Add support for NV12 format through conversion, v2. List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: igt-dev-bounces@lists.freedesktop.org Sender: "igt-dev" To: igt-dev@lists.freedesktop.org List-ID: Rm9yIE5WMTIgYSBmb3JtYXQgY29udmVyc2lvbiBpcyBuZWVkZWQuIEJlY2F1c2UgWVVWIGZvcm1h dHMgYXJlIG5vdApmdWxseSBkZWZpbmVkIHdpdGgganVzdCBhIGZvdXJjYywgSSd2ZSBjaG9zZW4g QlQuNjAxIGxpbWl0ZWQgcmFuZ2UuClRoaXMgcHV0cyB0aGUgcGl4ZWwgY2VudGVyIG9mIHRoZSBD YkNyIGNvbXBvbmVudHMgYmV0d2VlbiB0aGUgdG9wCmxlZnQgWSBhbmQgYm90dG9tIGxlZnQgWToK ClkgICBZICAgWSAgIFkKVVYgICAgICBVVgpZICAgWSAgIFkgICBZCgpTb21lIHdvcmsgaXMgcHV0 IGludG8gb3B0aW1pc2luZyB0aGUgY29udmVyc2lvbiByb3V0aW5lcyBpbiBvcmRlciB0bwptYWtl IGl0IGZhc3QgZW5vdWdoLiBCZWZvcmUgY29udmVydGluZyBudjEyIHRvIHJnYjI0LCBpdCBpcyBj b3BpZWQgdG8KYSB0ZW1wb3JhcnkgYnVmZmVyIHRvIHRha2UgYWR2YW50YWdlIG9mIG1lbW9yeSBj YWNoaW5nLiBUaGlzIGlzCmFwcHJveGltYXRlbHkgMjB4IGZhc3RlciB0aGFuIGRpcmVjdGx5IHJl YWRpbmcgdGhlIEJPLgoKV2hlbiB0ZXN0aW5nIG9uIG15IEtCTCB3aXRoIGEgMTA4MHAgYnVmZmVy LCBpdCB0YWtlcyBhcHByb3hpbWF0ZWx5Ci4xcyB0byBjb252ZXJ0IGVpdGhlciB3YXksIHRoaXMg aXMgZmFzdCBlbm91Z2ggbm90IHRvIGJvdGhlciBvcHRpbWlzaW5nCmV2ZW4gZnVydGhlciBmb3Ig bWUuCgpDaGFuZ2VzIHNpbmNlIHYxOgotIFVzZSBCVC42MDEgaW5zdGVhZCBvZiBCVC43MDkgY29l ZmZpY2llbnRzLiAoVmlsbGUpCgpTaWduZWQtb2ZmLWJ5OiBNYWFydGVuIExhbmtob3JzdCA8bWFh cnRlbi5sYW5raG9yc3RAbGludXguaW50ZWwuY29tPgotLS0KIGxpYi9pZ3RfZmIuYyB8IDM5MSAr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKystLS0tLS0tLS0t LQogMSBmaWxlIGNoYW5nZWQsIDMxOSBpbnNlcnRpb25zKCspLCA3MiBkZWxldGlvbnMoLSkKCmRp ZmYgLS1naXQgYS9saWIvaWd0X2ZiLmMgYi9saWIvaWd0X2ZiLmMKaW5kZXggOWQ2MDI4MGYxOThl Li42ZjU3YWI2OWE4MjIgMTAwNjQ0Ci0tLSBhL2xpYi9pZ3RfZmIuYworKysgYi9saWIvaWd0X2Zi LmMKQEAgLTcwLDYgKzcwLDcgQEAgc3RhdGljIHN0cnVjdCBmb3JtYXRfZGVzY19zdHJ1Y3Qgewog CURGKFhSR0I4ODg4LAlSR0IyNCwJCTMyLCAyNCksCiAJREYoWFJHQjIxMDEwMTAsCVJHQjMwLAkJ MzIsIDMwKSwKIAlERihBUkdCODg4OCwJQVJHQjMyLAkJMzIsIDMyKSwKKwlERihOVjEyLAlSR0Iy NCwJCTMyLCAtMSwgMiwgezgsIDE2fSksCiB9OwogI3VuZGVmIERGCiAKQEAgLTM2NCwxNCArMzY1 LDIwIEBAIHN0YXRpYyBpbnQgY3JlYXRlX2JvX2Zvcl9mYihpbnQgZmQsIGludCB3aWR0aCwgaW50 IGhlaWdodCwKIAkJCSppc19kdW1iID0gZmFsc2U7CiAKIAkJaWYgKGlzX2k5MTVfZGV2aWNlKGZk KSkgewotCQkJdWludDMyX3QgKnB0cjsKKwkJCXVpbnQ4X3QgKnB0cjsKIAogCQkJYm8gPSBnZW1f Y3JlYXRlKGZkLCBzaXplKTsKIAkJCWdlbV9zZXRfdGlsaW5nKGZkLCBibywgaWd0X2ZiX21vZF90 b190aWxpbmcodGlsaW5nKSwgc3RyaWRlKTsKIAogCQkJLyogRW5zdXJlIHRoZSBmcmFtZWJ1ZmZl ciBpcyBwcmVhbGxvY2F0ZWQgKi8KLQkJCXB0ciA9IGdlbV9tbWFwX19ndHQoZmQsIGJvLCBzaXpl LCBQUk9UX1JFQUQpOwotCQkJaWd0X2Fzc2VydCgqcHRyID09IDApOworCQkJcHRyID0gZ2VtX21t YXBfX2d0dChmZCwgYm8sIHNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUpOworCQkJaWd0X2Fz c2VydCgqKHVpbnQzMl90ICopcHRyID09IDApOworCisJCQlpZiAoZm9ybWF0LT5kcm1faWQgPT0g RFJNX0ZPUk1BVF9OVjEyKSB7CisJCQkJLyogY29tcG9uZW50IGZvcm1hdHMgaGF2ZSBhIGRpZmZl cmVudCB6ZXJvIHBvaW50ICovCisJCQkJbWVtc2V0KHB0ciwgMTYsIG9mZnNldHNbMV0pOworCQkJ CW1lbXNldChwdHIgKyBvZmZzZXRzWzFdLCAweDgwLCAoaGVpZ2h0ICsgMSkvMiAqIHN0cmlkZSk7 CisJCQl9CiAJCQlnZW1fbXVubWFwKHB0ciwgc2l6ZSk7CiAKIAkJCWlmIChzaXplX3JldCkKQEAg LTExMjcsMTAzICsxMTM0LDExNyBAQCBzdGF0aWMgY2Fpcm9fZm9ybWF0X3QgZHJtX2Zvcm1hdF90 b19jYWlybyh1aW50MzJfdCBkcm1fZm9ybWF0KQogCQkgICAgIGRybV9mb3JtYXQsIGlndF9mb3Jt YXRfc3RyKGRybV9mb3JtYXQpKTsKIH0KIAorc3RydWN0IGZiX2JsaXRfbGluZWFyIHsKKwl1aW50 MzJfdCBoYW5kbGU7CisJdW5zaWduZWQgc2l6ZSwgc3RyaWRlOworCXVpbnQ4X3QgKm1hcDsKKwli b29sIGlzX2R1bWI7CisJdWludDMyX3Qgb2Zmc2V0c1s0XTsKK307CisKIHN0cnVjdCBmYl9ibGl0 X3VwbG9hZCB7CiAJaW50IGZkOwogCXN0cnVjdCBpZ3RfZmIgKmZiOwotCXN0cnVjdCB7Ci0JCXVp bnQzMl90IGhhbmRsZTsKLQkJdW5zaWduZWQgc2l6ZSwgc3RyaWRlOwotCQl1aW50OF90ICptYXA7 Ci0JCWJvb2wgaXNfZHVtYjsKLQl9IGxpbmVhcjsKKwlzdHJ1Y3QgZmJfYmxpdF9saW5lYXIgbGlu ZWFyOwogfTsKIAotc3RhdGljIHZvaWQgZGVzdHJveV9jYWlyb19zdXJmYWNlX19ibGl0KHZvaWQg KmFyZykKK3N0YXRpYyB2b2lkIGZyZWVfbGluZWFyX21hcHBpbmcoaW50IGZkLCBzdHJ1Y3QgaWd0 X2ZiICpmYiwgc3RydWN0IGZiX2JsaXRfbGluZWFyICpsaW5lYXIpCiB7Ci0Jc3RydWN0IGZiX2Js aXRfdXBsb2FkICpibGl0ID0gYXJnOwotCXN0cnVjdCBpZ3RfZmIgKmZiID0gYmxpdC0+ZmI7CiAJ dW5zaWduZWQgaW50IG9ial90aWxpbmcgPSBpZ3RfZmJfbW9kX3RvX3RpbGluZyhmYi0+dGlsaW5n KTsKKwlpbnQgaTsKIAotCWdlbV9tdW5tYXAoYmxpdC0+bGluZWFyLm1hcCwgYmxpdC0+bGluZWFy LnNpemUpOwotCWZiLT5jYWlyb19zdXJmYWNlID0gTlVMTDsKKwlnZW1fbXVubWFwKGxpbmVhci0+ bWFwLCBsaW5lYXItPnNpemUpOworCWdlbV9zZXRfZG9tYWluKGZkLCBsaW5lYXItPmhhbmRsZSwK KwkJICAgICAgIEk5MTVfR0VNX0RPTUFJTl9HVFQsIDApOworCisJZm9yIChpID0gMDsgaSA8IGZi LT5udW1fcGxhbmVzOyBpKyspCisJCWlndF9ibGl0dGVyX2Zhc3RfY29weV9fcmF3KGZkLAorCQkJ CQkgICBsaW5lYXItPmhhbmRsZSwKKwkJCQkJICAgbGluZWFyLT5vZmZzZXRzW2ldLAorCQkJCQkg ICBsaW5lYXItPnN0cmlkZSwKKwkJCQkJICAgSTkxNV9USUxJTkdfTk9ORSwKKwkJCQkJICAgMCwg MCwgLyogc3JjX3gsIHNyY195ICovCisJCQkJCSAgIGZiLT5wbGFuZV93aWR0aFtpXSwgZmItPnBs YW5lX2hlaWdodFtpXSwKKwkJCQkJICAgZmItPnBsYW5lX2JwcFtpXSwKKwkJCQkJICAgZmItPmdl bV9oYW5kbGUsCisJCQkJCSAgIGZiLT5vZmZzZXRzW2ldLAorCQkJCQkgICBmYi0+c3RyaWRlLAor CQkJCQkgICBvYmpfdGlsaW5nLAorCQkJCQkgICAwLCAwIC8qIGRzdF94LCBkc3RfeSAqLyk7CisK KwlnZW1fc3luYyhmZCwgbGluZWFyLT5oYW5kbGUpOworCWdlbV9jbG9zZShmZCwgbGluZWFyLT5o YW5kbGUpOworfQogCi0JZ2VtX3NldF9kb21haW4oYmxpdC0+ZmQsIGJsaXQtPmxpbmVhci5oYW5k bGUsCi0JCQlJOTE1X0dFTV9ET01BSU5fR1RULCAwKTsKK3N0YXRpYyB2b2lkIGRlc3Ryb3lfY2Fp cm9fc3VyZmFjZV9fYmxpdCh2b2lkICphcmcpCit7CisJc3RydWN0IGZiX2JsaXRfdXBsb2FkICpi bGl0ID0gYXJnOwogCi0JaWd0X2JsaXR0ZXJfZmFzdF9jb3B5X19yYXcoYmxpdC0+ZmQsCi0JCQkJ ICAgYmxpdC0+bGluZWFyLmhhbmRsZSwgMCwKLQkJCQkgICBibGl0LT5saW5lYXIuc3RyaWRlLAot CQkJCSAgIEk5MTVfVElMSU5HX05PTkUsCi0JCQkJICAgMCwgMCwgLyogc3JjX3gsIHNyY195ICov Ci0JCQkJICAgZmItPndpZHRoLCBmYi0+aGVpZ2h0LAotCQkJCSAgIGlndF9kcm1fZm9ybWF0X3Rv X2JwcChmYi0+ZHJtX2Zvcm1hdCksCi0JCQkJICAgZmItPmdlbV9oYW5kbGUsCi0JCQkJICAgZmIt Pm9mZnNldHNbMF0sCi0JCQkJICAgZmItPnN0cmlkZSwKLQkJCQkgICBvYmpfdGlsaW5nLAotCQkJ CSAgIDAsIDAgLyogZHN0X3gsIGRzdF95ICovKTsKLQotCWdlbV9zeW5jKGJsaXQtPmZkLCBibGl0 LT5saW5lYXIuaGFuZGxlKTsKLQlnZW1fY2xvc2UoYmxpdC0+ZmQsIGJsaXQtPmxpbmVhci5oYW5k bGUpOworCWJsaXQtPmZiLT5jYWlyb19zdXJmYWNlID0gTlVMTDsKKworCWZyZWVfbGluZWFyX21h cHBpbmcoYmxpdC0+ZmQsIGJsaXQtPmZiLCAmYmxpdC0+bGluZWFyKTsKIAogCWZyZWUoYmxpdCk7 CiB9CiAKLXN0YXRpYyB2b2lkIGNyZWF0ZV9jYWlyb19zdXJmYWNlX19ibGl0KGludCBmZCwgc3Ry dWN0IGlndF9mYiAqZmIpCitzdGF0aWMgdm9pZCBzZXR1cF9saW5lYXJfbWFwcGluZyhpbnQgZmQs IHN0cnVjdCBpZ3RfZmIgKmZiLCBzdHJ1Y3QgZmJfYmxpdF9saW5lYXIgKmxpbmVhcikKIHsKLQlz dHJ1Y3QgZmJfYmxpdF91cGxvYWQgKmJsaXQ7Ci0JY2Fpcm9fZm9ybWF0X3QgY2Fpcm9fZm9ybWF0 OwogCXVuc2lnbmVkIGludCBvYmpfdGlsaW5nID0gaWd0X2ZiX21vZF90b190aWxpbmcoZmItPnRp bGluZyk7Ci0JdWludDMyX3Qgb2Zmc2V0c1s0XTsKLQotCWJsaXQgPSBtYWxsb2Moc2l6ZW9mKCpi bGl0KSk7Ci0JaWd0X2Fzc2VydChibGl0KTsKKwlpbnQgaTsKIAogCS8qCiAJICogV2UgY3JlYXRl IGEgbGluZWFyIEJPIHRoYXQgd2UnbGwgbWFwIGZvciB0aGUgQ1BVIHRvIHdyaXRlIHRvICh1c2lu ZwogCSAqIGNhaXJvKS4gVGhpcyBsaW5lYXIgYm8gd2lsbCBiZSB0aGVuIGJsaXR0ZWQgdG8gaXRz IGZpbmFsCiAJICogZGVzdGluYXRpb24sIHRpbGluZyBpdCBhdCB0aGUgc2FtZSB0aW1lLgogCSAq LwotCWJsaXQtPmxpbmVhci5oYW5kbGUgPSBjcmVhdGVfYm9fZm9yX2ZiKGZkLCBmYi0+d2lkdGgs IGZiLT5oZWlnaHQsCisJbGluZWFyLT5oYW5kbGUgPSBjcmVhdGVfYm9fZm9yX2ZiKGZkLCBmYi0+ d2lkdGgsIGZiLT5oZWlnaHQsCiAJCQkJCSAgICAgICBsb29rdXBfZHJtX2Zvcm1hdChmYi0+ZHJt X2Zvcm1hdCksCiAJCQkJCSAgICAgICBMT0NBTF9EUk1fRk9STUFUX01PRF9OT05FLCAwLAotCQkJ CQkgICAgICAgMCwgJmJsaXQtPmxpbmVhci5zaXplLAotCQkJCQkgICAgICAgJmJsaXQtPmxpbmVh ci5zdHJpZGUsCi0JCQkJCSAgICAgICBvZmZzZXRzLCAmYmxpdC0+bGluZWFyLmlzX2R1bWIpOwot Ci0JaWd0X2Fzc2VydChibGl0LT5saW5lYXIuaGFuZGxlID4gMCk7CisJCQkJCSAgICAgICAwLCAm bGluZWFyLT5zaXplLAorCQkJCQkgICAgICAgJmxpbmVhci0+c3RyaWRlLAorCQkJCQkgICAgICAg bGluZWFyLT5vZmZzZXRzLCAmbGluZWFyLT5pc19kdW1iKTsKIAotCWJsaXQtPmZkID0gZmQ7Ci0J YmxpdC0+ZmIgPSBmYjsKKwlpZ3RfYXNzZXJ0KGxpbmVhci0+aGFuZGxlID4gMCk7CiAKIAkvKiBD b3B5IGZiIGNvbnRlbnQgdG8gbGluZWFyIEJPICovCi0JZ2VtX3NldF9kb21haW4oZmQsIGJsaXQt PmxpbmVhci5oYW5kbGUsCisJZ2VtX3NldF9kb21haW4oZmQsIGxpbmVhci0+aGFuZGxlLAogCQkJ STkxNV9HRU1fRE9NQUlOX0dUVCwgMCk7CiAKLQlpZ3RfYmxpdHRlcl9mYXN0X2NvcHlfX3Jhdyhm ZCwKLQkJCQkgICBmYi0+Z2VtX2hhbmRsZSwKLQkJCQkgICBmYi0+b2Zmc2V0c1swXSwKLQkJCQkg ICBmYi0+c3RyaWRlLAotCQkJCSAgIG9ial90aWxpbmcsCi0JCQkJICAgMCwgMCwgLyogc3JjX3gs IHNyY195ICovCi0JCQkJICAgZmItPndpZHRoLCBmYi0+aGVpZ2h0LAotCQkJCSAgIGlndF9kcm1f Zm9ybWF0X3RvX2JwcChmYi0+ZHJtX2Zvcm1hdCksCi0JCQkJICAgYmxpdC0+bGluZWFyLmhhbmRs ZSwgMCwKLQkJCQkgICBibGl0LT5saW5lYXIuc3RyaWRlLAotCQkJCSAgIEk5MTVfVElMSU5HX05P TkUsCi0JCQkJICAgMCwgMCAvKiBkc3RfeCwgZHN0X3kgKi8pOwotCi0JZ2VtX3N5bmMoZmQsIGJs aXQtPmxpbmVhci5oYW5kbGUpOwotCi0JZ2VtX3NldF9kb21haW4oZmQsIGJsaXQtPmxpbmVhci5o YW5kbGUsCisJZm9yIChpID0gMDsgaSA8IGZiLT5udW1fcGxhbmVzOyBpKyspCisJCWlndF9ibGl0 dGVyX2Zhc3RfY29weV9fcmF3KGZkLAorCQkJCQkgIGZiLT5nZW1faGFuZGxlLAorCQkJCQkgIGZi LT5vZmZzZXRzW2ldLAorCQkJCQkgIGZiLT5zdHJpZGUsCisJCQkJCSAgb2JqX3RpbGluZywKKwkJ CQkJICAwLCAwLCAvKiBzcmNfeCwgc3JjX3kgKi8KKwkJCQkJICBmYi0+cGxhbmVfd2lkdGhbaV0s IGZiLT5wbGFuZV9oZWlnaHRbaV0sCisJCQkJCSAgZmItPnBsYW5lX2JwcFtpXSwKKwkJCQkJICBs aW5lYXItPmhhbmRsZSwgbGluZWFyLT5vZmZzZXRzW2ldLAorCQkJCQkgIGxpbmVhci0+c3RyaWRl LAorCQkJCQkgIEk5MTVfVElMSU5HX05PTkUsCisJCQkJCSAgMCwgMCAvKiBkc3RfeCwgZHN0X3kg Ki8pOworCisJZ2VtX3N5bmMoZmQsIGxpbmVhci0+aGFuZGxlKTsKKworCWdlbV9zZXRfZG9tYWlu KGZkLCBsaW5lYXItPmhhbmRsZSwKIAkJICAgICAgIEk5MTVfR0VNX0RPTUFJTl9DUFUsIEk5MTVf R0VNX0RPTUFJTl9DUFUpOwogCiAJLyogU2V0dXAgY2Fpcm8gY29udGV4dCAqLwotCWJsaXQtPmxp bmVhci5tYXAgPSBnZW1fbW1hcF9fY3B1KGZkLAotCQkJCQkgYmxpdC0+bGluZWFyLmhhbmRsZSwK LQkJCQkJIDAsCi0JCQkJCSBibGl0LT5saW5lYXIuc2l6ZSwKLQkJCQkJIFBST1RfUkVBRCB8IFBS T1RfV1JJVEUpOworCWxpbmVhci0+bWFwID0gZ2VtX21tYXBfX2NwdShmZCwgbGluZWFyLT5oYW5k bGUsCisJCQkJICAgIDAsIGxpbmVhci0+c2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSk7Cit9 CisKK3N0YXRpYyB2b2lkIGNyZWF0ZV9jYWlyb19zdXJmYWNlX19ibGl0KGludCBmZCwgc3RydWN0 IGlndF9mYiAqZmIpCit7CisJc3RydWN0IGZiX2JsaXRfdXBsb2FkICpibGl0OworCWNhaXJvX2Zv cm1hdF90IGNhaXJvX2Zvcm1hdDsKKworCWJsaXQgPSBtYWxsb2Moc2l6ZW9mKCpibGl0KSk7CisJ aWd0X2Fzc2VydChibGl0KTsKKworCWJsaXQtPmZkID0gZmQ7CisJYmxpdC0+ZmIgPSBmYjsKKwlz ZXR1cF9saW5lYXJfbWFwcGluZyhmZCwgZmIsICZibGl0LT5saW5lYXIpOwogCiAJY2Fpcm9fZm9y bWF0ID0gZHJtX2Zvcm1hdF90b19jYWlybyhmYi0+ZHJtX2Zvcm1hdCk7CiAJZmItPmNhaXJvX3N1 cmZhY2UgPQpAQCAtMTI4NSw2ICsxMzA2LDIzMyBAQCBzdGF0aWMgdm9pZCBjcmVhdGVfY2Fpcm9f c3VyZmFjZV9fZ3R0KGludCBmZCwgc3RydWN0IGlndF9mYiAqZmIpCiAJCQkJICAgIGZiLCBkZXN0 cm95X2NhaXJvX3N1cmZhY2VfX2d0dCk7CiB9CiAKK3N0cnVjdCBmYl9jb252ZXJ0X2JsaXRfdXBs b2FkIHsKKwlpbnQgZmQ7CisJc3RydWN0IGlndF9mYiAqZmI7CisKKwlzdHJ1Y3QgeworCQl1aW50 OF90ICptYXA7CisJCXVuc2lnbmVkIHN0cmlkZSwgc2l6ZTsKKwl9IHJnYjI0OworCisJc3RydWN0 IGZiX2JsaXRfbGluZWFyIGxpbmVhcjsKK307CisKK3N0YXRpYyB1aW50OF90IGNsYW1wcmdiKGZs b2F0IHZhbCkgeworCWlmICh2YWwgPCAwKQorCQlyZXR1cm4gMDsKKwlpZiAodmFsID4gMjU1KQor CQlyZXR1cm4gMjU1OworCisJcmV0dXJuICh1aW50OF90KXZhbDsKK30KKworc3RhdGljIHZvaWQg Y29udmVydF9udjEyX3RvX3JnYjI0KHN0cnVjdCBpZ3RfZmIgKmZiLCBzdHJ1Y3QgZmJfY29udmVy dF9ibGl0X3VwbG9hZCAqYmxpdCkKK3sKKwlpbnQgaSwgajsKKwljb25zdCB1aW50OF90ICp5LCAq dXY7CisJdWludDhfdCAqcmdiMjQgPSBibGl0LT5yZ2IyNC5tYXA7CisJdW5zaWduZWQgcmdiMjRf c3RyaWRlID0gYmxpdC0+cmdiMjQuc3RyaWRlLCBwbGFuYXJfc3RyaWRlID0gYmxpdC0+bGluZWFy LnN0cmlkZTsKKwl1aW50OF90ICpidWYgPSBtYWxsb2MoYmxpdC0+bGluZWFyLnNpemUpOworCisJ LyoKKwkgKiBSZWFkaW5nIGZyb20gdGhlIEJPIGlzIGF3ZnVsbHkgc2xvdyBiZWNhdXNlIG9mIGxh Y2sgb2YgcmVhZCBjYWNoaW5nLAorCSAqIGl0J3MgZmFzdGVyIHRvIGNvcHkgdGhlIHdob2xlIEJP IHRvIGEgdGVtcG9yYXJ5IGJ1ZmZlciBhbmQgY29udmVydAorCSAqIGZyb20gdGhlcmUuCisJICov CisJbWVtY3B5KGJ1ZiwgYmxpdC0+bGluZWFyLm1hcCwgYmxpdC0+bGluZWFyLnNpemUpOworCXkg PSAmYnVmW2JsaXQtPmxpbmVhci5vZmZzZXRzWzBdXTsKKwl1diA9ICZidWZbYmxpdC0+bGluZWFy Lm9mZnNldHNbMV1dOworCisJLyogQ29udmVydCBmcm9tIGxpbWl0ZWQgY29sb3IgcmFuZ2UgQlQu NjAxICovCisJZm9yIChpID0gMDsgaSA8IGZiLT5oZWlnaHQgLyAyOyBpKyspIHsKKwkJZm9yIChq ID0gMDsgaiA8IGZiLT53aWR0aDsgaisrKSB7CisJCQlmbG9hdCByXywgZ18sIGJfLCB5MCwgeTEs IGNiLCBjcjsKKwkJCS8qIENvbnZlcnQgMXgyIHBpeGVsIGJsb2NrcyAqLworCisJCQl5MCA9IDEu MTY0ZiAqICh5W2pdIC0gMTYuZik7CisJCQl5MSA9IDEuMTY0ZiAqICh5W2ogKyBwbGFuYXJfc3Ry aWRlXSAtIDE2LmYpOworCisJCQljYiA9IHV2W2ogJiB+MV0gLSAxMjguZjsKKwkJCWNyID0gdXZb aiB8IDFdIC0gMTI4LmY7CisKKwkJCXJfID0gIDAuMDAwZiAqIGNiICsgIDEuNTk2ZiAqIGNyOwor CQkJZ18gPSAtMC4zOTJmICogY2IgKyAtMC44MTNmICogY3I7CisJCQliXyA9ICAyLjAxN2YgKiBj YiArICAwLjAwMGYgKiBjcjsKKworCQkJcmdiMjRbaiAqIDQgKyAyXSA9IGNsYW1wcmdiKHkwICsg cl8pOworCQkJcmdiMjRbaiAqIDQgKyAyICsgcmdiMjRfc3RyaWRlXSA9IGNsYW1wcmdiKHkxICsg cl8pOworCisJCQlyZ2IyNFtqICogNCArIDFdID0gY2xhbXByZ2IoeTAgKyBnXyk7CisJCQlyZ2Iy NFtqICogNCArIDEgKyByZ2IyNF9zdHJpZGVdID0gY2xhbXByZ2IoeTEgKyBnXyk7CisKKwkJCXJn YjI0W2ogKiA0XSA9IGNsYW1wcmdiKHkwICsgYl8pOworCQkJcmdiMjRbaiAqIDQgKyByZ2IyNF9z dHJpZGVdID0gY2xhbXByZ2IoeTEgKyBiXyk7CisJCX0KKworCQlyZ2IyNCArPSAyICogcmdiMjRf c3RyaWRlOworCQl5ICs9IDIgKiBwbGFuYXJfc3RyaWRlOworCQl1diArPSBwbGFuYXJfc3RyaWRl OworCX0KKworCWlmIChmYi0+aGVpZ2h0ICYgMSkgeworCQkvKiBDb252ZXJ0IGxhc3Qgcm93ICov CisJCWZvciAoaiA9IDA7IGogPCBmYi0+d2lkdGg7IGorKykgeworCQkJZmxvYXQgcl8sIGdfLCBi XywgeTAsIGNiLCBjcjsKKwkJCS8qIENvbnZlcnQgc2luZ2xlIHBpeGVsICovCisKKwkJCWNiID0g dXZbaiAmIH4xXSAtIDEyOC5mOworCQkJY3IgPSB1dltqIHwgMV0gLSAxMjguZjsKKworCQkJeTAg PSAxLjE2NGYgKiAoeVtqXSAtIDE2LmYpOworCQkJcl8gPSAgMC4wMDBmICogY2IgKyAgMS41OTZm ICogY3I7CisJCQlnXyA9IC0wLjM5MmYgKiBjYiArIC0wLjgxM2YgKiBjcjsKKwkJCWJfID0gIDIu MDE3ZiAqIGNiICsgIDAuMDAwZiAqIGNyOworCisJCQlyZ2IyNFtqICogNCArIDJdID0gY2xhbXBy Z2IoeTAgKyByXyk7CisJCQlyZ2IyNFtqICogNCArIDFdID0gY2xhbXByZ2IoeTAgKyBnXyk7CisJ CQlyZ2IyNFtqICogNF0gPSBjbGFtcHJnYih5MCArIGJfKTsKKwkJfQorCX0KKworCWZyZWUoYnVm KTsKK30KKworc3RhdGljIHZvaWQgY29udmVydF9yZ2IyNF90b19udjEyKHN0cnVjdCBpZ3RfZmIg KmZiLCBzdHJ1Y3QgZmJfY29udmVydF9ibGl0X3VwbG9hZCAqYmxpdCkKK3sKKwlpbnQgaSwgajsK Kwl1aW50OF90ICp5ID0gJmJsaXQtPmxpbmVhci5tYXBbYmxpdC0+bGluZWFyLm9mZnNldHNbMF1d OworCXVpbnQ4X3QgKnV2ID0gJmJsaXQtPmxpbmVhci5tYXBbYmxpdC0+bGluZWFyLm9mZnNldHNb MV1dOworCWNvbnN0IHVpbnQ4X3QgKnJnYjI0ID0gYmxpdC0+cmdiMjQubWFwOworCXVuc2lnbmVk IHJnYjI0X3N0cmlkZSA9IGJsaXQtPnJnYjI0LnN0cmlkZTsKKwl1bnNpZ25lZCBwbGFuYXJfc3Ry aWRlID0gYmxpdC0+bGluZWFyLnN0cmlkZTsKKworCWlndF9hc3NlcnRfZihmYi0+ZHJtX2Zvcm1h dCA9PSBEUk1fRk9STUFUX05WMTIsCisJCSAgICAgIkNvbnZlcnNpb24gbm90IGltcGxlbWVudGVk IGZvciAhTlYxMiBwbGFuYXIgZm9ybWF0c1xuIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgZmItPnBs YW5lX2hlaWdodFswXTsgaSsrKSB7CisJCS8qIFVzZSBsaW1pdGVkIGNvbG9yIHJhbmdlIEJULjYw MSAqLworCisJCWZvciAoaiA9IDA7IGogPCBmYi0+cGxhbmVfd2lkdGhbMF07IGorKykgeworCQkJ ZmxvYXQgeWYgPSAwLjI1N2YgKiByZ2IyNFtqICogNCArIDJdICsKKwkJCQkgICAwLjUwNGYgKiBy Z2IyNFtqICogNCArIDFdICsKKwkJCQkgICAwLjA5OGYgKiByZ2IyNFtqICogNF0gKyAxNjsKKwor CQkJeVtqXSA9ICh1aW50OF90KXlmOworCQl9CisKKwkJcmdiMjQgKz0gcmdiMjRfc3RyaWRlOwor CQl5ICs9IHBsYW5hcl9zdHJpZGU7CisJfQorCisJcmdiMjQgPSBibGl0LT5yZ2IyNC5tYXA7CisK Kwlmb3IgKGkgPSAwOyBpIDwgZmItPmhlaWdodCAvIDI7IGkrKykgeworCQlmb3IgKGogPSAwOyBq IDwgZmItPnBsYW5lX3dpZHRoWzFdOyBqKyspIHsKKwkJCS8qCisJCQkgKiBQaXhlbCBjZW50ZXIg Zm9yIENiJ0NyJyBpcyBiZXR3ZWVuIHRoZSBsZWZ0IHRvcCBhbmQKKwkJCSAqIGJvdHRvbSBwaXhl bCBpbiBhIDJ4MiBibG9jaywgc28gdGFrZSB0aGUgYXZlcmFnZS4KKwkJCSAqLworCQkJZmxvYXQg dWYgPSAtMC4xNDhmLzIgKiByZ2IyNFtqICogOCArIDJdICsKKwkJCQkgICAtMC4xNDhmLzIgKiBy Z2IyNFtqICogOCArIDIgKyByZ2IyNF9zdHJpZGVdICsKKwkJCQkgICAtMC4yOTFmLzIgKiByZ2Iy NFtqICogOCArIDFdICsKKwkJCQkgICAtMC4yOTFmLzIgKiByZ2IyNFtqICogOCArIDEgKyByZ2Iy NF9zdHJpZGVdICsKKwkJCQkgICAgMC40MzlmLzIgKiByZ2IyNFtqICogOF0gKworCQkJCSAgICAw LjQzOWYvMiAqIHJnYjI0W2ogKiA4ICsgcmdiMjRfc3RyaWRlXSArIDEyODsKKwkJCWZsb2F0IHZm ID0gIDAuNDM5Zi8yICogcmdiMjRbaiAqIDggKyAyXSArCisJCQkJICAgIDAuNDM5Zi8yICogcmdi MjRbaiAqIDggKyAyICsgcmdiMjRfc3RyaWRlXSArCisJCQkJICAgLTAuMzY4Zi8yICogcmdiMjRb aiAqIDggKyAxXSArCisJCQkJICAgLTAuMzY4Zi8yICogcmdiMjRbaiAqIDggKyAxICsgcmdiMjRf c3RyaWRlXSArCisJCQkJICAgLTAuMDcxZi8yICogcmdiMjRbaiAqIDhdICsKKwkJCQkgICAtMC4w NzFmLzIgKiByZ2IyNFtqICogOCArIHJnYjI0X3N0cmlkZV0gKyAxMjg7CisJCQl1dltqICogMl0g PSAodWludDhfdCl1ZjsKKwkJCXV2W2ogKiAyICsgMV0gPSAodWludDhfdCl2ZjsKKwkJfQorCisJ CXJnYjI0ICs9IDIgKiByZ2IyNF9zdHJpZGU7CisJCXV2ICs9IHBsYW5hcl9zdHJpZGU7CisJfQor CisJLyogTGFzdCByb3cgY2Fubm90IGJlIGludGVycG9sYXRlZCBiZXR3ZWVuIDIgcGl4ZWxzLCB0 YWtlIHRoZSBzaW5nbGUgdmFsdWUgKi8KKwlpZiAoaSA8IGZiLT5wbGFuZV9oZWlnaHRbMV0pIHsK KwkJZm9yIChqID0gMDsgaiA8IGZiLT5wbGFuZV93aWR0aFsxXTsgaisrKSB7CisJCQlmbG9hdCB1 ZiA9IC0wLjE0OGYgKiByZ2IyNFtqICogOCArIDJdICsKKwkJCQkgICAtMC4yOTFmICogcmdiMjRb aiAqIDggKyAxXSArCisJCQkJICAgIDAuNDM5ZiAqIHJnYjI0W2ogKiA4XSArIDEyODsKKwkJCWZs b2F0IHZmID0gIDAuNDM5ZiAqIHJnYjI0W2ogKiA4ICsgMl0gKworCQkJCSAgIC0wLjM2OGYgKiBy Z2IyNFtqICogOCArIDFdICsKKwkJCQkgICAtMC4wNzFmICogcmdiMjRbaiAqIDhdICsgMTI4Owor CisJCQl1dltqICogMl0gPSAodWludDhfdCl1ZjsKKwkJCXV2W2ogKiAyICsgMV0gPSAodWludDhf dCl2ZjsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgZGVzdHJveV9jYWlyb19zdXJmYWNlX19j b252ZXJ0KHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgZmJfY29udmVydF9ibGl0X3VwbG9hZCAqYmxp dCA9IGFyZzsKKwlzdHJ1Y3QgaWd0X2ZiICpmYiA9IGJsaXQtPmZiOworCisJLyogQ29udmVydCBi YWNrIHRvIHBsYW5hciEgKi8KKwlpZ3RfYXNzZXJ0X2YoZmItPmRybV9mb3JtYXQgPT0gRFJNX0ZP Uk1BVF9OVjEyLAorCQkgICAgICJDb252ZXJzaW9uIG5vdCBpbXBsZW1lbnRlZCBmb3IgIU5WMTIg cGxhbmFyIGZvcm1hdHNcbiIpOworCisJY29udmVydF9yZ2IyNF90b19udjEyKGZiLCBibGl0KTsK KworCW11bm1hcChibGl0LT5yZ2IyNC5tYXAsIGJsaXQtPnJnYjI0LnNpemUpOworCisJaWYgKGJs aXQtPmxpbmVhci5oYW5kbGUpCisJCWZyZWVfbGluZWFyX21hcHBpbmcoYmxpdC0+ZmQsIGJsaXQt PmZiLCAmYmxpdC0+bGluZWFyKTsKKwllbHNlCisJCWdlbV9tdW5tYXAoYmxpdC0+bGluZWFyLm1h cCwgZmItPnNpemUpOworCisJZnJlZShibGl0KTsKKworCWZiLT5jYWlyb19zdXJmYWNlID0gTlVM TDsKK30KKworc3RhdGljIHZvaWQgY3JlYXRlX2NhaXJvX3N1cmZhY2VfX2NvbnZlcnQoaW50IGZk LCBzdHJ1Y3QgaWd0X2ZiICpmYikKK3sKKwlzdHJ1Y3QgZmJfY29udmVydF9ibGl0X3VwbG9hZCAq YmxpdCA9IG1hbGxvYyhzaXplb2YoKmJsaXQpKTsKKwlpZ3RfYXNzZXJ0KGJsaXQpOworCisJYmxp dC0+ZmQgPSBmZDsKKwlibGl0LT5mYiA9IGZiOworCWJsaXQtPnJnYjI0LnN0cmlkZSA9IEFMSUdO KGZiLT53aWR0aCAqIDQsIDE2KTsKKwlibGl0LT5yZ2IyNC5zaXplID0gQUxJR04oYmxpdC0+cmdi MjQuc3RyaWRlICogZmItPmhlaWdodCwgc3lzY29uZihfU0NfUEFHRVNJWkUpKTsKKwlibGl0LT5y Z2IyNC5tYXAgPSBtbWFwKE5VTEwsIGJsaXQtPnJnYjI0LnNpemUsIFBST1RfUkVBRCB8IFBST1Rf V1JJVEUsIE1BUF9QUklWQVRFIHwgTUFQX0FOT05ZTU9VUywgLTEsIDApOworCWlndF9hc3NlcnQo YmxpdC0+cmdiMjQubWFwICE9IE1BUF9GQUlMRUQpOworCisJaWYgKGZiLT50aWxpbmcgPT0gTE9D QUxfSTkxNV9GT1JNQVRfTU9EX1lfVElMRUQgfHwKKwkgICAgZmItPnRpbGluZyA9PSBMT0NBTF9J OTE1X0ZPUk1BVF9NT0RfWWZfVElMRUQpIHsKKwkJc2V0dXBfbGluZWFyX21hcHBpbmcoZmQsIGZi LCAmYmxpdC0+bGluZWFyKTsKKwl9IGVsc2UgeworCQlibGl0LT5saW5lYXIuaGFuZGxlID0gMDsK KwkJYmxpdC0+bGluZWFyLm1hcCA9IGdlbV9tbWFwX19ndHQoZmQsIGZiLT5nZW1faGFuZGxlLCBm Yi0+c2l6ZSwKKwkJCQkJICAgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSk7CisJCWlndF9hc3Nl cnQoYmxpdC0+bGluZWFyLm1hcCk7CisJCWJsaXQtPmxpbmVhci5zdHJpZGUgPSBmYi0+c3RyaWRl OworCQlibGl0LT5saW5lYXIuc2l6ZSA9IGZiLT5zaXplOworCQltZW1jcHkoYmxpdC0+bGluZWFy Lm9mZnNldHMsIGZiLT5vZmZzZXRzLCBzaXplb2YoZmItPm9mZnNldHMpKTsKKwl9CisKKwkvKiBD b252ZXJ0IHRvIGxpbmVhciEgKi8KKwlpZ3RfYXNzZXJ0X2YoZmItPmRybV9mb3JtYXQgPT0gRFJN X0ZPUk1BVF9OVjEyLAorCQkgICAgICJDb252ZXJzaW9uIG5vdCBpbXBsZW1lbnRlZCBmb3IgIU5W MTIgcGxhbmFyIGZvcm1hdHNcbiIpOworCWNvbnZlcnRfbnYxMl90b19yZ2IyNChmYiwgYmxpdCk7 CisKKwlmYi0+Y2Fpcm9fc3VyZmFjZSA9CisJCWNhaXJvX2ltYWdlX3N1cmZhY2VfY3JlYXRlX2Zv cl9kYXRhKGJsaXQtPnJnYjI0Lm1hcCwKKwkJCQkJCSAgICBDQUlST19GT1JNQVRfUkdCMjQsCisJ CQkJCQkgICAgZmItPndpZHRoLCBmYi0+aGVpZ2h0LAorCQkJCQkJICAgIGJsaXQtPnJnYjI0LnN0 cmlkZSk7CisKKwljYWlyb19zdXJmYWNlX3NldF91c2VyX2RhdGEoZmItPmNhaXJvX3N1cmZhY2Us CisJCQkJICAgIChjYWlyb191c2VyX2RhdGFfa2V5X3QgKiljcmVhdGVfY2Fpcm9fc3VyZmFjZV9f Y29udmVydCwKKwkJCQkgICAgYmxpdCwgZGVzdHJveV9jYWlyb19zdXJmYWNlX19jb252ZXJ0KTsK K30KKwogLyoqCiAgKiBpZ3RfZ2V0X2NhaXJvX3N1cmZhY2U6CiAgKiBAZmQ6IG9wZW4gZHJtIGZp bGUgZGVzY3JpcHRvcgpAQCAtMTI5OCwxMSArMTU0NiwxMCBAQCBzdGF0aWMgdm9pZCBjcmVhdGVf Y2Fpcm9fc3VyZmFjZV9fZ3R0KGludCBmZCwgc3RydWN0IGlndF9mYiAqZmIpCiAgKi8KIGNhaXJv X3N1cmZhY2VfdCAqaWd0X2dldF9jYWlyb19zdXJmYWNlKGludCBmZCwgc3RydWN0IGlndF9mYiAq ZmIpCiB7Ci0JLyogVGhpcyBkb2Vzbid0IHdvcmsgZm9yIHBsYW5hciBmb3JtYXRzIGZvciBub3cs IGJ1dCB3ZSB3aWxsIGNvbnZlcnQgdGhlbSB0byBSR0IyNCBpbiB0aGUgZnV0dXJlLiAqLwotCWln dF9hc3NlcnQoZmItPm51bV9wbGFuZXMgPCAyKTsKLQogCWlmIChmYi0+Y2Fpcm9fc3VyZmFjZSA9 PSBOVUxMKSB7Ci0JCWlmIChmYi0+dGlsaW5nID09IExPQ0FMX0k5MTVfRk9STUFUX01PRF9ZX1RJ TEVEIHx8CisJCWlmIChmYi0+bnVtX3BsYW5lcyA+IDEpCisJCQljcmVhdGVfY2Fpcm9fc3VyZmFj ZV9fY29udmVydChmZCwgZmIpOworCQllbHNlIGlmIChmYi0+dGlsaW5nID09IExPQ0FMX0k5MTVf Rk9STUFUX01PRF9ZX1RJTEVEIHx8CiAJCSAgICBmYi0+dGlsaW5nID09IExPQ0FMX0k5MTVfRk9S TUFUX01PRF9ZZl9USUxFRCkKIAkJCWNyZWF0ZV9jYWlyb19zdXJmYWNlX19ibGl0KGZkLCBmYik7 CiAJCWVsc2UKLS0gCjIuMTUuMQoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX18KaWd0LWRldiBtYWlsaW5nIGxpc3QKaWd0LWRldkBsaXN0cy5mcmVlZGVza3Rv cC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9pZ3Qt ZGV2Cg==