From mboxrd@z Thu Jan 1 00:00:00 1970 From: YT Shen Subject: Re: [PATCH v6 07/10] drm/mediatek: add dsi transfer function Date: Wed, 10 Aug 2016 15:24:26 +0800 Message-ID: <1470813866.27526.14.camel@mtksdaap41> References: <1470308844-20895-1-git-send-email-yt.shen@mediatek.com> <1470308844-20895-8-git-send-email-yt.shen@mediatek.com> <1470391697.16554.60.camel@mtksdaap41> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1470391697.16554.60.camel@mtksdaap41> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: CK Hu Cc: Mark Rutland , dri-devel@lists.freedesktop.org, Russell King , Mao Huang , yingjoe.chen@mediatek.com, devicetree@vger.kernel.org, Sascha Hauer , Pawel Moll , Ian Campbell , Rob Herring , linux-mediatek@lists.infradead.org, Matthias Brugger , shaoming chen , linux-arm-kernel@lists.infradead.org, srv_heupstream@mediatek.com, emil.l.velikov@gmail.com, linux-kernel@vger.kernel.org, Kumar Gala List-Id: devicetree@vger.kernel.org SGkgQ0ssCgpPbiBGcmksIDIwMTYtMDgtMDUgYXQgMTg6MDggKzA4MDAsIENLIEh1IHdyb3RlOgo+ IEhpLCBZVDoKPiAKPiBPbiBUaHUsIDIwMTYtMDgtMDQgYXQgMTk6MDcgKzA4MDAsIFlUIFNoZW4g d3JvdGU6Cj4gPiBGcm9tOiBzaGFvbWluZyBjaGVuIDxzaGFvbWluZy5jaGVuQG1lZGlhdGVrLmNv bT4KPiA+IAo+ID4gYWRkIGRzaSByZWFkL3dyaXRlIGNvbW1hbmRzIGZvciB0cmFuc2ZlciBmdW5j dGlvbgo+ID4gCj4gPiBTaWduZWQtb2ZmLWJ5OiBzaGFvbWluZyBjaGVuIDxzaGFvbWluZy5jaGVu QG1lZGlhdGVrLmNvbT4KPiA+IC0tLQo+ID4gIGRyaXZlcnMvZ3B1L2RybS9tZWRpYXRlay9tdGtf ZHNpLmMgfCAgMjYxICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwo+ID4gIDEg ZmlsZSBjaGFuZ2VkLCAyNjEgaW5zZXJ0aW9ucygrKQo+ID4gCj4gPiBkaWZmIC0tZ2l0IGEvZHJp dmVycy9ncHUvZHJtL21lZGlhdGVrL210a19kc2kuYyBiL2RyaXZlcnMvZ3B1L2RybS9tZWRpYXRl ay9tdGtfZHNpLmMKPiA+IGluZGV4IGVlYTYxOTIuLjQ1NDFmNTkgMTAwNjQ0Cj4gPiAtLS0gYS9k cml2ZXJzL2dwdS9kcm0vbWVkaWF0ZWsvbXRrX2RzaS5jCj4gPiArKysgYi9kcml2ZXJzL2dwdS9k cm0vbWVkaWF0ZWsvbXRrX2RzaS5jCj4gPiBAQCAtMjQsNiArMjQsNyBAQAo+ID4gICNpbmNsdWRl IDxsaW51eC9vZl9ncmFwaC5oPgo+ID4gICNpbmNsdWRlIDxsaW51eC9waHkvcGh5Lmg+Cj4gPiAg I2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgo+ID4gKyNpbmNsdWRlIDx2aWRlby9t aXBpX2Rpc3BsYXkuaD4KPiA+ICAjaW5jbHVkZSA8dmlkZW8vdmlkZW9tb2RlLmg+Cj4gPiAgCj4g PiAgI2luY2x1ZGUgIm10a19kcm1fZGRwX2NvbXAuaCIKPiA+IEBAIC04MSw4ICs4MiwxNiBAQAo+ ID4gICNkZWZpbmUgRFNJX0hCUF9XQwkJMHg1NAo+ID4gICNkZWZpbmUgRFNJX0hGUF9XQwkJMHg1 OAo+ID4gIAo+ID4gKyNkZWZpbmUgRFNJX0NNRFFfU0laRQkJMHg2MAo+ID4gKyNkZWZpbmUgQ01E UV9TSVpFCQkweDNmCj4gPiArCj4gPiAgI2RlZmluZSBEU0lfSFNUWF9DS0xfV0MJCTB4NjQKPiA+ ICAKPiA+ICsjZGVmaW5lIERTSV9SWF9EQVRBMAkJMHg3NAo+ID4gKyNkZWZpbmUgRFNJX1JYX0RB VEExCQkweDc4Cj4gPiArI2RlZmluZSBEU0lfUlhfREFUQTIJCTB4N2MKPiA+ICsjZGVmaW5lIERT SV9SWF9EQVRBMwkJMHg4MAo+ID4gKwo+ID4gICNkZWZpbmUgRFNJX1JBQ0sJCTB4ODQKPiA+ICAj ZGVmaW5lIFJBQ0sJCQkJQklUKDApCj4gPiAgCj4gPiBAQCAtMTE4LDggKzEyNywyNSBAQAo+ID4g ICNkZWZpbmUgQ0xLX0hTX1BPU1QJCQkoMHhmZiA8PCA4KQo+ID4gICNkZWZpbmUgQ0xLX0hTX0VY SVQJCQkoMHhmZiA8PCAxNikKPiA+ICAKPiA+ICsjZGVmaW5lIERTSV9DTURRMAkJMHgxODAKPiA+ ICsKPiA+ICAjZGVmaW5lIE5TX1RPX0NZQ0xFKG4sIGMpICAgICgobikgLyAoYykgKyAoKChuKSAl IChjKSkgPyAxIDogMCkpCj4gPiAgCj4gPiArI2RlZmluZSBNVEtfRFNJX0hPU1RfSVNfUkVBRCh0 eXBlKSBcCj4gPiArCSgodHlwZSA9PSBNSVBJX0RTSV9HRU5FUklDX1JFQURfUkVRVUVTVF8wX1BB UkFNKSB8fCBcCj4gPiArCSh0eXBlID09IE1JUElfRFNJX0dFTkVSSUNfUkVBRF9SRVFVRVNUXzFf UEFSQU0pIHx8IFwKPiA+ICsJKHR5cGUgPT0gTUlQSV9EU0lfR0VORVJJQ19SRUFEX1JFUVVFU1Rf Ml9QQVJBTSkgfHwgXAo+ID4gKwkodHlwZSA9PSBNSVBJX0RTSV9EQ1NfUkVBRCkpCj4gPiArCj4g PiArI2RlZmluZSBNVEtfRFNJX0hPU1RfSVNfV1JJVEUodHlwZSkgXAo+ID4gKwkoKHR5cGUgPT0g TUlQSV9EU0lfR0VORVJJQ19TSE9SVF9XUklURV8wX1BBUkFNKSB8fCBcCj4gPiArCSh0eXBlID09 IE1JUElfRFNJX0dFTkVSSUNfU0hPUlRfV1JJVEVfMV9QQVJBTSkgfHwgXAo+ID4gKwkodHlwZSA9 PSBNSVBJX0RTSV9HRU5FUklDX1NIT1JUX1dSSVRFXzJfUEFSQU0pIHx8IFwKPiA+ICsJKHR5cGUg PT0gTUlQSV9EU0lfRENTX1NIT1JUX1dSSVRFKSB8fCBcCj4gPiArCSh0eXBlID09IE1JUElfRFNJ X0RDU19TSE9SVF9XUklURV9QQVJBTSkgfHwgXAo+ID4gKwkodHlwZSA9PSBNSVBJX0RTSV9HRU5F UklDX0xPTkdfV1JJVEUpIHx8IFwKPiA+ICsJKHR5cGUgPT0gTUlQSV9EU0lfRENTX0xPTkdfV1JJ VEUpKQo+ID4gKwo+ID4gIHN0cnVjdCBwaHk7Cj4gPiAgCj4gPiAgc3RydWN0IG10a19kc2kgewo+ ID4gQEAgLTE0OSw2ICsxNzUsMTMgQEAgc3RydWN0IG10a19kc2kgewo+ID4gIAlpbnQgaXJxX2Rh dGE7Cj4gPiAgfTsKPiA+ICAKPiA+ICtzdHJ1Y3QgZHNpX3J4dHhfZGF0YSB7Cj4gPiArCXU4IGJ5 dGUwOwo+ID4gKwl1OCBieXRlMTsKPiA+ICsJdTggYnl0ZTI7Cj4gPiArCXU4IGJ5dGUzOwo+ID4g K307Cj4gPiArCj4gPiAgc3RhdGljIHdhaXRfcXVldWVfaGVhZF90IF9kc2lfaXJxX3dhaXRfcXVl dWU7Cj4gPiAgCj4gPiAgc3RhdGljIGlubGluZSBzdHJ1Y3QgbXRrX2RzaSAqZW5jb2Rlcl90b19k c2koc3RydWN0IGRybV9lbmNvZGVyICplKQo+ID4gQEAgLTc5OSw5ICs4MzIsMjM3IEBAIHN0YXRp YyBpbnQgbXRrX2RzaV9ob3N0X2RldGFjaChzdHJ1Y3QgbWlwaV9kc2lfaG9zdCAqaG9zdCwKPiA+ ICAJcmV0dXJuIDA7Cj4gPiAgfQo+ID4gIAo+ID4gK3N0YXRpYyB2b2lkIG10a19kc2lfd2FpdF9m b3JfaWRsZShzdHJ1Y3QgbXRrX2RzaSAqZHNpKQo+ID4gK3sKPiA+ICsJdTMyIHRpbWVvdXRfbXMg PSA1MDAwMDA7IC8qIHRvdGFsIDFzIH4gMnMgdGltZW91dCAqLwo+ID4gKwo+ID4gKwl3aGlsZSAo dGltZW91dF9tcy0tKSB7Cj4gPiArCQlpZiAoIShyZWFkbChkc2ktPnJlZ3MgKyBEU0lfSU5UU1RB KSAmIERTSV9CVVNZKSkKPiA+ICsJCQlicmVhazsKPiA+ICsKPiA+ICsJCXVzbGVlcF9yYW5nZSgy LCA0KTsKPiA+ICsJfQo+ID4gKwo+ID4gKwlpZiAodGltZW91dF9tcyA9PSAwKSB7Cj4gPiArCQlk ZXZfaW5mbyhkc2ktPmRldiwgInBvbGxpbmcgZHNpIHdhaXQgbm90IGJ1c3kgdGltZW91dCFcbiIp Owo+ID4gKwo+ID4gKwkJbXRrX2RzaV9lbmFibGUoZHNpKTsKPiA+ICsJCW10a19kc2lfcmVzZXRf ZW5naW5lKGRzaSk7Cj4gPiArCX0KPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIHZvaWQgbXRrX2Rz aV93YWl0X2Zvcl9jbWRfZG9uZShzdHJ1Y3QgbXRrX2RzaSAqZHNpKQo+ID4gK3sKPiA+ICsJczMy IHJldCA9IDA7Cj4gPiArCXVuc2lnbmVkIGxvbmcgdGltZW91dCA9IG1zZWNzX3RvX2ppZmZpZXMo NTAwKTsKPiA+ICsKPiA+ICsJZHNpLT5pcnFfZGF0YSAmPSB+Q01EX0RPTkVfSU5UX0ZMQUc7Cj4g Cj4gWW91IHNob3VsZCBtb3ZlIHRoaXMgY2xlYXJpbmcgb2YgZmxhZyBiZWZvcmUgbXRrX2RzaV9z dGFydCgpLgpPSywgd2Ugd2lsbCB1cGRhdGUgaXQgaW4gdGhlIG5leHQgdmVyc2lvbi4KCj4gCj4g PiArCj4gPiArCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KF9kc2lfaXJx X3dhaXRfcXVldWUsCj4gPiArCQkJZHNpLT5pcnFfZGF0YSAmIENNRF9ET05FX0lOVF9GTEFHLCB0 aW1lb3V0KTsKPiA+ICsJaWYgKHJldCA9PSAwKSB7Cj4gPiArCQlkZXZfaW5mbyhkc2ktPmRldiwg ImRzaSB3YWl0IGVuZ2luZSBjbWQgZG9uZSBmYWlsXG4iKTsKPiA+ICsKPiA+ICsJCW10a19kc2lf ZW5hYmxlKGRzaSk7Cj4gPiArCQltdGtfZHNpX3Jlc2V0X2VuZ2luZShkc2kpOwo+ID4gKwl9Cj4g PiArfQo+ID4gKwo+ID4gK3N0YXRpYyB2b2lkIG10a19kc2lfY21kcShzdHJ1Y3QgbXRrX2RzaSAq ZHNpLCBjb25zdCBzdHJ1Y3QgbWlwaV9kc2lfbXNnICptc2cpCj4gPiArewo+ID4gKwljb25zdCBj aGFyICp0eF9idWYgPSBtc2ctPnR4X2J1ZjsKPiA+ICsJdTMyIHJlZ192YWwsIGk7Cj4gPiArCXUx NiB3YzE2Owo+ID4gKwl1OCBjb25maWcsIGRhdGEwLCBkYXRhMSwgdHlwZTsKPiA+ICsKPiA+ICsJ aWYgKE1US19EU0lfSE9TVF9JU19SRUFEKHR5cGUpKSB7Cj4gCj4gJ3R5cGUnIGlzIHVzZWQgYmVm b3JlIGFzc2lnbmVkLgpXaWxsIGZpeC4KCj4gCj4gPiArCQljb25maWcgPSA0Owo+ID4gKwkJZGF0 YTAgPSB0eF9idWZbMF07Cj4gPiArCj4gPiArCQlpZiAobXNnLT5yeF9sZW4gPCAzKQo+ID4gKwkJ CXR5cGUgPSBNSVBJX0RTSV9EQ1NfUkVBRDsKPiA+ICsJCWVsc2UKPiA+ICsJCQl0eXBlID0gTUlQ SV9EU0lfR0VORVJJQ19SRUFEX1JFUVVFU1RfMV9QQVJBTTsKPiA+ICsKPiA+ICsJCWRhdGExID0g MDsKPiA+ICsJCXJlZ192YWwgPSAoZGF0YTEgPDwgMjQpIHwgKGRhdGEwIDw8IDE2KSB8ICh0eXBl IDw8IDgpIHwgY29uZmlnOwo+ID4gKwo+ID4gKwkJd3JpdGVsKHJlZ192YWwsIGRzaS0+cmVncyAr IERTSV9DTURRMCk7Cj4gPiArCQltdGtfZHNpX21hc2soZHNpLCBEU0lfQ01EUV9TSVpFLCBDTURR X1NJWkUsIDEpOwo+IAo+IEkgdGhpbmsgdGhpcyBwYXJ0IGxvb2tzIGxpa2UgJ2Vsc2UnIHBhcnQu IFRoZSBkaWZmZXJlbmNlIGlzIHR5cGUgYW5kCj4gY29uZmlnLiBJIHRoaW5rIHR5cGUgc2hvdWxk IGJlIG1zZy0+dHlwZSBhbmQgeW91IGNhbiBpbmRlcGVuZGVudGx5IHNldAo+IEJJVCgyKSBvZiBj b25maWcuCm1zZy0+dHlwZSBvbmx5IHRlbGxzIGFib3V0IHJlYWQgb3Igd3JpdGUsIGZvciB0aGUg ZGV0YWlscyB3ZSBuZWVkIHRvCmNoZWNrIG90aGVyIHBhcmFtZXRlcnMuICBUaGlzIHBhcnQgaXMg Zm9yIHJlYWQsIHRoZSBlbHNlIHBhcnQgaXMgZm9yCndyaXRlIHNob3J0IHBhY2tldC4gIE5vdCBv bmx5IEJJVCgyKSBvZiBjb25maWcgaXMgZGlmZmVyZW50LCBidXQgYWxzbwp0eXBlIGFuZCBkYXRh MSBpcyBjaGFuZ2VkLiAgU3VjaCBhIGNoYW5nZSB3b3VsZCBsZWFkIHRvIGRpZmZpY3VsdCB0bwp1 bmRlcnN0YW5kLgoKPiAKPiA+ICsJfSBlbHNlIGlmIChtc2ctPnR4X2xlbiA+IDIpIHsJLyogc2Vu ZCBsb25nIHBhY2tldCAqLwo+ID4gKwkJY29uZmlnID0gMjsKPiA+ICsJCXR5cGUgPSBtc2ctPnR5 cGU7Cj4gPiArCQl3YzE2ID0gbXNnLT50eF9sZW47Cj4gPiArCj4gPiArCQlyZWdfdmFsID0gKHdj MTYgPDwgMTYpIHwgKHR5cGUgPDwgOCkgfCBjb25maWc7Cj4gPiArCj4gPiArCQl3cml0ZWwocmVn X3ZhbCwgZHNpLT5yZWdzICsgRFNJX0NNRFEwKTsKPiA+ICsKPiA+ICsJCWZvciAoaSA9IDA7IGkg PCBtc2ctPnR4X2xlbjsgaSsrKQo+ID4gKwkJCXdyaXRlYih0eF9idWZbaV0sIGRzaS0+cmVncyAr IERTSV9DTURRMCArIDQgKyBpKTsKPiA+ICsKPiA+ICsJCW10a19kc2lfbWFzayhkc2ksIERTSV9D TURRX1NJWkUsIENNRFFfU0laRSwKPiA+ICsJCQkgICAgIDEgKyAobXNnLT50eF9sZW4gKyAzKSAv IDQpOwo+ID4gKwl9IGVsc2UgewkvKiBzZW5kIHNob3J0IHBhY2tldCAqLwo+ID4gKwkJY29uZmln ID0gMDsKPiA+ICsJCWRhdGEwID0gdHhfYnVmWzBdOwo+ID4gKwo+ID4gKwkJaWYgKG1zZy0+dHhf bGVuID09IDIpIHsKPiA+ICsJCQl0eXBlID0gTUlQSV9EU0lfRENTX1NIT1JUX1dSSVRFX1BBUkFN Owo+IAo+IFdoeSBkbyB5b3Ugbm90IHNldCB0eXBlIGFzIG1zZy0+dHlwZT8gVGhpcyBiZWhhdmlv ciBsb29rcyBsaWtlIHlvdQo+IG1vZGlmeSB0cmFuc2ZlciB0eXBlLCBidXQgaXMgdGhpcyBhY2Nl cHRhYmxlPwptc2ctPnR5cGUgb25seSB0ZWxscyBhYm91dCByZWFkIG9yIHdyaXRlLCBmb3IgdGhl IGRldGFpbHMgd2UgbmVlZCB0bwpjaGVjayBvdGhlciBwYXJhbWV0ZXJzLgoKPiAKPiA+ICsJCQlk YXRhMSA9IHR4X2J1ZlsxXTsKPiA+ICsJCX0gZWxzZSB7Cj4gPiArCQkJdHlwZSA9IE1JUElfRFNJ X0RDU19TSE9SVF9XUklURTsKPiA+ICsJCQlkYXRhMSA9IDA7Cj4gPiArCQl9Cj4gPiArCj4gPiAr CQlyZWdfdmFsID0gKGRhdGExIDw8IDI0KSB8IChkYXRhMCA8PCAxNikgfCAodHlwZSA8PCA4KSB8 IGNvbmZpZzsKPiA+ICsKPiA+ICsJCXdyaXRlbChyZWdfdmFsLCBkc2ktPnJlZ3MgKyBEU0lfQ01E UTApOwo+ID4gKwkJbXRrX2RzaV9tYXNrKGRzaSwgRFNJX0NNRFFfU0laRSwgQ01EUV9TSVpFLCAx KTsKPiA+ICsJfQo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgc3NpemVfdCBtdGtfZHNpX2hvc3Rf cmVhZF9jbWQoc3RydWN0IG10a19kc2kgKmRzaSwKPiA+ICsJCQkJICAgICBjb25zdCBzdHJ1Y3Qg bWlwaV9kc2lfbXNnICptc2cpCj4gPiArewo+ID4gKwl1OCBtYXhfdHJ5X2NvdW50ID0gNTsKPiA+ ICsJdTMyIHJlY3ZfY250Owo+ID4gKwlzdHJ1Y3QgZHNpX3J4dHhfZGF0YSByZWFkX2RhdGFbNF07 Cj4gPiArCXMzMiByZXQ7Cj4gPiArCXVuc2lnbmVkIGxvbmcgdGltZW91dCA9IG1zZWNzX3RvX2pp ZmZpZXMoMjAwMCk7Cj4gPiArCj4gPiArCXU4ICpidWZmZXIgPSBtc2ctPnJ4X2J1ZjsKPiA+ICsJ dTggYnVmZmVyX3NpemUgPSBtc2ctPnJ4X2xlbjsKPiA+ICsJdTggdHlwZTsKPiA+ICsKPiA+ICsJ aWYgKHJlYWRsKGRzaS0+cmVncyArIERTSV9NT0RFX0NUUkwpICYgTU9ERSkgewo+ID4gKwkJZGV2 X2luZm8oZHNpLT5kZXYsICJkc2kgZW5naW5lIGlzIG5vdCBjb21tYW5kIG1vZGVcbiIpOwo+ID4g KwkJcmV0dXJuIC0xOwo+ID4gKwl9Cj4gPiArCj4gPiArCWlmICghYnVmZmVyKSB7Cj4gPiArCQlk ZXZfaW5mbyhkc2ktPmRldiwgImRzaSByZWNlaXZlIGJ1ZmZlciBzaXplIG1heSBiZSBOVUxMXG4i KTsKPiA+ICsJCXJldHVybiAtMTsKPiA+ICsJfQo+ID4gKwo+ID4gKwlkbyB7Cj4gPiArCQlpZiAo bWF4X3RyeV9jb3VudCA9PSAwKSB7Cj4gPiArCQkJZGV2X2luZm8oZHNpLT5kZXYsICJkc2kgZW5n aW5lIHJlYWQgY291bnRlciBoYXMgYmVlbiBtYXhpbnVtXG4iKTsKPiA+ICsJCQlyZXR1cm4gLTE7 Cj4gPiArCQl9Cj4gPiArCj4gPiArCQltYXhfdHJ5X2NvdW50LS07Cj4gPiArCQlyZWN2X2NudCA9 IDA7Cj4gPiArCj4gPiArCQltdGtfZHNpX3dhaXRfZm9yX2lkbGUoZHNpKTsKPiA+ICsJCW10a19k c2lfY21kcShkc2ksIG1zZyk7Cj4gPiArCj4gPiArCQlkc2ktPmlycV9kYXRhICY9IH5MUFJYX1JE X1JEWV9JTlRfRkxBRzsKPiA+ICsKPiA+ICsJCW10a19kc2lfc3RhcnQoZHNpKTsKPiA+ICsKPiA+ ICsJCS8qIDJzIHRpbWVvdXQqLwo+ID4gKwkJcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxl X3RpbWVvdXQoX2RzaV9pcnFfd2FpdF9xdWV1ZSwKPiA+ICsJCQkJZHNpLT5pcnFfZGF0YSAmIExQ UlhfUkRfUkRZX0lOVF9GTEFHLCB0aW1lb3V0KTsKPiA+ICsJCWlmIChyZXQgPT0gMCkgewo+ID4g KwkJCWRldl9pbmZvKGRzaS0+ZGV2LCAiV2FpdCBEU0kgcmVhZCByZWFkeSB0aW1lb3V0ISEhXG4i KTsKPiA+ICsKPiA+ICsJCQltdGtfZHNpX2VuYWJsZShkc2kpOwo+ID4gKwkJCW10a19kc2lfcmVz ZXRfZW5naW5lKGRzaSk7Cj4gPiArCj4gPiArCQkJcmV0dXJuIHJldDsKPiA+ICsJCX0KPiAKPiBU aGlzIHdhaXRpbmcgY29kZSBsb29rcyBsaWtlIG10a19kc2lfd2FpdF9mb3JfY21kX2RvbmUoKS4g WW91IG1heSBtb2RpZnkKPiB0aGlzIGZ1bmN0aW9uIHRvCj4gCj4gaW50IG10a19kc2lfd2FpdF9m b3JfaXJxX2ZsYWcoc3RydWN0IG10a19kc2kgKmRzaSwgdTMyIGZsYWcsIHVuc2lnbmVkCj4gbG9u ZyB0aW1lb3V0KTsKT0ssIHdpbGwgZG8uCj4gCj4gPiArCj4gPiArCQkqKHUzMiAqKSgmcmVhZF9k YXRhWzBdKSA9IHJlYWRsKGRzaS0+cmVncyArIERTSV9SWF9EQVRBMCk7Cj4gPiArCQkqKHUzMiAq KSgmcmVhZF9kYXRhWzFdKSA9IHJlYWRsKGRzaS0+cmVncyArIERTSV9SWF9EQVRBMSk7Cj4gPiAr CQkqKHUzMiAqKSgmcmVhZF9kYXRhWzJdKSA9IHJlYWRsKGRzaS0+cmVncyArIERTSV9SWF9EQVRB Mik7Cj4gPiArCQkqKHUzMiAqKSgmcmVhZF9kYXRhWzNdKSA9IHJlYWRsKGRzaS0+cmVncyArIERT SV9SWF9EQVRBMyk7Cj4gCj4gWW91IG1heSByZXdyaXRlIHRoaXMgYXMKPiAKPiBmb3IgKGkgPSAw OyBpIDwgMTY7IGkrKykKPiAJKigodTggKilyZWFkX2RhdGEgKyBpKSA9IHJlYWRiKGRzaS0+cmVn cyArIERTSV9SWF9EQVRBMCArIGkpOwo+IApPSy4KCj4gPiArCj4gPiArCQl0eXBlID0gcmVhZF9k YXRhWzBdLmJ5dGUwOwo+ID4gKwo+ID4gKwkJaWYgKHR5cGUgPT0gTUlQSV9EU0lfUlhfR0VORVJJ Q19MT05HX1JFQURfUkVTUE9OU0UgfHwKPiA+ICsJCSAgICB0eXBlID09IE1JUElfRFNJX1JYX0RD U19MT05HX1JFQURfUkVTUE9OU0UpIHsKPiA+ICsJCQkvKgo+ID4gKwkJCSAqIERhdGEgSUQoMSBi eXRlKSArIFdvcmQgQ291bnQoMiBieXRlcykgKyBFQ0MoMSBieXRlKSArCj4gPiArCQkJICogZGF0 YSAwICsgLi4uKyBkYXRhIFdDLTEgKyBDSEVDS1NVTSAoMiBieXRlcykKPiA+ICsJCQkgKi8KPiA+ ICsJCQlyZWN2X2NudCA9IHJlYWRfZGF0YVswXS5ieXRlMSArIHJlYWRfZGF0YVswXS5ieXRlMiAq IDE2Owo+ID4gKwkJCWRldl9pbmZvKGRzaS0+ZGV2LCAibG9uZyBwYWNrZXQgc2l6ZTogJWRcbiIs IHJlY3ZfY250KTsKPiA+ICsKPiA+ICsJCQkvKgo+ID4gKwkJCSAqIHRoZSBidWZmZXIgc2l6ZSBp cyAxNiBieXRlcyBvbmNlLCBzbyB0aGUgZGF0YSBwYXlsb2FkCj4gPiArCQkJICogaXMsIDE2IC0g Ynl0ZXMoZGF0YSBJRCArIFdDICsgRUNDICsgQ0hFQ0tTVU0pLCBpZgo+ID4gKwkJCSAqIG92ZXIg MTAgYnl0ZXMsIGl0IHdpbGwgYmUgcmVhZCBhZ2Fpbgo+ID4gKwkJCSAqLwo+ID4gKwkJCWlmIChy ZWN2X2NudCA+IDEwKQo+ID4gKwkJCQlyZWN2X2NudCA9IDEwOwo+ID4gKwo+ID4gKwkJCWlmIChy ZWN2X2NudCA+IGJ1ZmZlcl9zaXplKQo+ID4gKwkJCQlyZWN2X2NudCA9IGJ1ZmZlcl9zaXplOwo+ ID4gKwo+ID4gKwkJCW1lbWNweShidWZmZXIsICZyZWFkX2RhdGFbMV0sIHJlY3ZfY250KTsKPiA+ ICsJCX0gZWxzZSBpZiAodHlwZSA9PSBNSVBJX0RTSV9SWF9HRU5FUklDX1NIT1JUX1JFQURfUkVT UE9OU0VfMUJZVEUgfHwKPiA+ICsJCQkgICB0eXBlID09IE1JUElfRFNJX1JYX0dFTkVSSUNfU0hP UlRfUkVBRF9SRVNQT05TRV8yQllURSB8fAo+ID4gKwkJCSAgIHR5cGUgPT0gTUlQSV9EU0lfUlhf RENTX1NIT1JUX1JFQURfUkVTUE9OU0VfMUJZVEUgfHwKPiA+ICsJCQkgICB0eXBlID09IE1JUElf RFNJX1JYX0RDU19TSE9SVF9SRUFEX1JFU1BPTlNFXzJCWVRFKSB7Cj4gPiArCQkJaWYgKHR5cGUg PT0gTUlQSV9EU0lfUlhfR0VORVJJQ19TSE9SVF9SRUFEX1JFU1BPTlNFXzFCWVRFIHx8Cj4gPiAr CQkJICAgIHR5cGUgPT0gTUlQSV9EU0lfUlhfRENTX1NIT1JUX1JFQURfUkVTUE9OU0VfMUJZVEUp Cj4gPiArCQkJCXJlY3ZfY250ID0gMTsKPiA+ICsJCQllbHNlCj4gPiArCQkJCXJlY3ZfY250ID0g MjsKPiA+ICsKPiA+ICsJCQlpZiAocmVjdl9jbnQgPiBidWZmZXJfc2l6ZSkKPiA+ICsJCQkJcmVj dl9jbnQgPSBidWZmZXJfc2l6ZTsKPiA+ICsKPiA+ICsJCQltZW1jcHkoYnVmZmVyLCAmcmVhZF9k YXRhWzBdLmJ5dGUxLCByZWN2X2NudCk7Cj4gCj4gSSB0aGluayB5b3UgbWF5IHJld3JpdGUgdGhp cyAnaWYtZWxzZSBpZicgcGFydCBhcyBmb2xsb3cgdG8gbWFrZSB0aGluZ3MKPiBtb3JlIGNsZWFy bHkuCj4gCj4gc3RhdGljIHUzMiBnZXRfcmVjdl9jbnQodTggdHlwZSwgc3RydWN0IGRzaV9yeHR4 X2RhdGEgKnJlYWRfZGF0YSkKPiB7Cj4gCXN3aXRjaCh0eXBlKSB7Cj4gCWNhc2UgTUlQSV9EU0lf UlhfR0VORVJJQ19TSE9SVF9SRUFEX1JFU1BPTlNFXzFCWVRFOgo+IAljYXNlIE1JUElfRFNJX1JY X0RDU19TSE9SVF9SRUFEX1JFU1BPTlNFXzFCWVRFOgo+IAkJcmV0dXJuIDE7Cj4gCWNhc2UgTUlQ SV9EU0lfUlhfR0VORVJJQ19TSE9SVF9SRUFEX1JFU1BPTlNFXzJCWVRFOgo+IAljYXNlIE1JUElf RFNJX1JYX0RDU19TSE9SVF9SRUFEX1JFU1BPTlNFXzJCWVRFOgo+IAkJcmV0dXJuIDI7Cj4gCWNh c2UgTUlQSV9EU0lfUlhfR0VORVJJQ19MT05HX1JFQURfUkVTUE9OU0U6Cj4gCWNhc2UgTUlQSV9E U0lfUlhfRENTX0xPTkdfUkVBRF9SRVNQT05TRToKPiAJCXJldHVybiByZWFkX2RhdGEtPmJ5dGUx ICsgcmVhZF9kYXRhLT5ieXRlMiAqIDE2Owo+IAl9Cj4gCj4gCXJldHVybiAwOwo+IH0KPiAKPiBy ZWN2X2NudCA9IGdldF9yZWN2X2NudCh0eXBlLCByZWFkX2RhdGEpOwo+IAo+IGlmIChyZWN2X2Nu dCA+IDIpCj4gCXNyY19hZGRyID0gJnJlYWRfZGF0YVsxXTsKPiBlbHNlCj4gCXNyY19hZGRyID0g JnJlYWRfZGF0YVswXS5ieXRlMTsKPiAKPiBpZiAocmVjdl9jbnQgPiAxMCkKPiAJcmVjdl9jbnQg PSAxMDsKPiBpZiAocmVjdl9jbnQgPiBidWZmZXJfc2l6ZSkKPiAJcmVjdl9jbnQgPSBidWZmZXJf c2l6ZTsKPiBpZiAocmVjdl9jbnQpCj4gCW1lbWNweShidWZmZXIsIHNyY19hZGRyLCByZWN2X2Nu dCk7Cj4gClRoYW5rcyBmb3IgdGhlIHN1Z2dlc3Rpb25zLCB3ZSB3aWxsIGZvbGxvdyBpdC4KClJl Z2FyZHMsCnl0LnNoZW4KCj4gPiArCQl9IGVsc2UgaWYgKHR5cGUgPT0gTUlQSV9EU0lfUlhfQUNL Tk9XTEVER0VfQU5EX0VSUk9SX1JFUE9SVCkgewo+ID4gKwkJCWRldl9pbmZvKGRzaS0+ZGV2LCAi cGFja2V0IHR5cGUgaXMgMHgwMiwgdHJ5IGFnYWluXG4iKTsKPiA+ICsJCX0gZWxzZSB7Cj4gPiAr CQkJZGV2X2luZm8oZHNpLT5kZXYsICJwYWNrZXQgdHlwZSgweCV4KSBjYW5ub3QgYmUgbm9uLXJl Y29nbml6ZVxuIiwKPiA+ICsJCQkJIHR5cGUpOwo+ID4gKwo+ID4gKwkJCXJldHVybiAwOwo+ID4g KwkJfQo+ID4gKwl9IHdoaWxlICh0eXBlID09IE1JUElfRFNJX1JYX0FDS05PV0xFREdFX0FORF9F UlJPUl9SRVBPUlQpOwo+ID4gKwo+ID4gKwlkZXZfaW5mbyhkc2ktPmRldiwgImRzaSBnZXQgJWQg Ynl0ZSBkYXRhIGZyb20gdGhlIHBhbmVsIGFkZHJlc3MoMHgleClcbiIsCj4gPiArCQkgcmVjdl9j bnQsICooKHU4ICopKG1zZy0+dHhfYnVmKSkpOwo+ID4gKwo+ID4gKwlyZXR1cm4gcmVjdl9jbnQ7 Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBzc2l6ZV90IG10a19kc2lfaG9zdF93cml0ZV9jbWQo c3RydWN0IG10a19kc2kgKmRzaSwKPiA+ICsJCQkJICAgICAgY29uc3Qgc3RydWN0IG1pcGlfZHNp X21zZyAqbXNnKQo+ID4gK3sKPiA+ICsJbXRrX2RzaV93YWl0X2Zvcl9pZGxlKGRzaSk7Cj4gPiAr Cj4gPiArCW10a19kc2lfY21kcShkc2ksIG1zZyk7Cj4gPiArCj4gPiArCW10a19kc2lfc3RhcnQo ZHNpKTsKPiA+ICsJbXRrX2RzaV93YWl0X2Zvcl9jbWRfZG9uZShkc2kpOwo+ID4gKwo+ID4gKwly ZXR1cm4gMDsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIHNzaXplX3QgbXRrX2RzaV9ob3N0X3Ry YW5zZmVyKHN0cnVjdCBtaXBpX2RzaV9ob3N0ICpob3N0LAo+ID4gKwkJCQkgICAgIGNvbnN0IHN0 cnVjdCBtaXBpX2RzaV9tc2cgKm1zZykKPiA+ICt7Cj4gPiArCXN0cnVjdCBtdGtfZHNpICpkc2kg PSBob3N0X3RvX2RzaShob3N0KTsKPiA+ICsJdTggdHlwZSA9IG1zZy0+dHlwZTsKPiA+ICsJc3Np emVfdCByZXQgPSAwOwo+ID4gKwo+ID4gKwlpZiAoTVRLX0RTSV9IT1NUX0lTX1JFQUQodHlwZSkp Cj4gPiArCQlyZXQgPSBtdGtfZHNpX2hvc3RfcmVhZF9jbWQoZHNpLCBtc2cpOwo+ID4gKwllbHNl IGlmIChNVEtfRFNJX0hPU1RfSVNfV1JJVEUodHlwZSkpCj4gPiArCQlyZXQgPSBtdGtfZHNpX2hv c3Rfd3JpdGVfY21kKGRzaSwgbXNnKTsKPiA+ICsKPiA+ICsJcmV0dXJuIHJldDsKPiA+ICt9Cj4g PiArCj4gPiAgc3RhdGljIGNvbnN0IHN0cnVjdCBtaXBpX2RzaV9ob3N0X29wcyBtdGtfZHNpX29w cyA9IHsKPiA+ICAJLmF0dGFjaCA9IG10a19kc2lfaG9zdF9hdHRhY2gsCj4gPiAgCS5kZXRhY2gg PSBtdGtfZHNpX2hvc3RfZGV0YWNoLAo+ID4gKwkudHJhbnNmZXIgPSBtdGtfZHNpX2hvc3RfdHJh bnNmZXIsCj4gPiAgfTsKPiA+ICAKPiA+ICBzdGF0aWMgaW50IG10a19kc2lfYmluZChzdHJ1Y3Qg ZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2UgKm1hc3Rlciwgdm9pZCAqZGF0YSkKPiAKPiBSZWdh cmRzLAo+IENLCj4gCgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Au b3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRl dmVsCg==