From mboxrd@z Thu Jan 1 00:00:00 1970 From: YT Shen Subject: Re: [PATCH v5 07/10] drm/mediatek: add dsi transfer function Date: Tue, 2 Aug 2016 17:14:48 +0800 Message-ID: <1470129288.30671.13.camel@mtksdaap41> References: <1469698084-20185-1-git-send-email-yt.shen@mediatek.com> <1469698084-20185-8-git-send-email-yt.shen@mediatek.com> <1470120958.16554.16.camel@mtksdaap41> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1470120958.16554.16.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: linux-mediatek@lists.infradead.org SGkgQ0ssCgpPbiBUdWUsIDIwMTYtMDgtMDIgYXQgMTQ6NTUgKzA4MDAsIENLIEh1IHdyb3RlOgo+ IEhpLCBZVDoKPiAKPiBPbiBUaHUsIDIwMTYtMDctMjggYXQgMTc6MjggKzA4MDAsIFlUIFNoZW4g d3JvdGU6Cj4gPiBGcm9tOiBzaGFvbWluZyBjaGVuIDxzaGFvbWluZy5jaGVuQG1lZGlhdGVrLmNv bT4KPiA+IAo+ID4gYWRkIGRzaSByZWFkL3dyaXRlIGNvbW1hbmRzIGZvciB0cmFuc2ZlciBmdW5j dGlvbgo+ID4gCj4gPiBTaWduZWQtb2ZmLWJ5OiBzaGFvbWluZyBjaGVuIDxzaGFvbWluZy5jaGVu QG1lZGlhdGVrLmNvbT4KPiA+IC0tLQo+ID4gIGRyaXZlcnMvZ3B1L2RybS9tZWRpYXRlay9tdGtf ZHNpLmMgfCAgMjg2ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwo+ID4gIDEg ZmlsZSBjaGFuZ2VkLCAyODYgaW5zZXJ0aW9ucygrKQo+ID4gCj4gPiBkaWZmIC0tZ2l0IGEvZHJp dmVycy9ncHUvZHJtL21lZGlhdGVrL210a19kc2kuYyBiL2RyaXZlcnMvZ3B1L2RybS9tZWRpYXRl ay9tdGtfZHNpLmMKPiA+IGluZGV4IDU1MzQ0M2EuLjFkMzY1MjQgMTAwNjQ0Cj4gPiAtLS0gYS9k 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+ ID4gQEAgLTE0OSw2ICsxNzUsMTcgQEAgc3RydWN0IG10a19kc2kgewo+ID4gIAlpbnQgaXJxX2Rh dGE7Cj4gPiAgfTsKPiA+ICAKPiA+ICtzdHJ1Y3QgZHNpX3J4dHhfZGF0YSB7Cj4gPiArCXU4IGJ5 dGUwOwo+ID4gKwl1OCBieXRlMTsKPiA+ICsJdTggYnl0ZTI7Cj4gPiArCXU4IGJ5dGUzOwo+ID4g K307Cj4gPiArCj4gPiArc3RydWN0IGRzaV90eF9jbWRxX3JlZ3Mgewo+ID4gKwlzdHJ1Y3QgZHNp X3J4dHhfZGF0YSBkYXRhWzEyOF07Cj4gPiArfTsKPiA+ICsKPiA+ICBzdGF0aWMgd2FpdF9xdWV1 ZV9oZWFkX3QgX2RzaV9jbWRfZG9uZV93YWl0X3F1ZXVlOwo+ID4gIHN0YXRpYyB3YWl0X3F1ZXVl X2hlYWRfdCBfZHNpX2Rjc19yZWFkX3dhaXRfcXVldWU7Cj4gPiAgc3RhdGljIHdhaXRfcXVldWVf aGVhZF90IF9kc2lfd2FpdF92bV9kb25lX3F1ZXVlOwo+ID4gQEAgLTgxMyw5ICs4NTAsMjU4IEBA IHN0YXRpYyBpbnQgbXRrX2RzaV9ob3N0X2RldGFjaChzdHJ1Y3QgbWlwaV9kc2lfaG9zdCAqaG9z dCwKPiA+ICAJcmV0dXJuIDA7Cj4gPiAgfQo+ID4gIAo+ID4gK3N0YXRpYyB2b2lkIG10a19kc2lf c2V0X2NtZHEodm9pZCBfX2lvbWVtICpyZWcsIHUzMiBtYXNrLCB1MzIgZGF0YSkKPiA+ICt7Cj4g PiArCXUzMiB0ZW1wID0gcmVhZGwocmVnKTsKPiA+ICsKPiA+ICsJd3JpdGVsKCh0ZW1wICYgfm1h c2spIHwgKGRhdGEgJiBtYXNrKSwgcmVnKTsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIHZvaWQg bXRrX2RzaV93YWl0X2Zvcl9pZGxlKHN0cnVjdCBtdGtfZHNpICpkc2kpCj4gPiArewo+ID4gKwl1 MzIgdGltZW91dF9tcyA9IDUwMDAwMDsgLyogdG90YWwgMXMgfiAycyB0aW1lb3V0ICovCj4gPiAr Cj4gPiArCXdoaWxlICh0aW1lb3V0X21zLS0pIHsKPiA+ICsJCWlmICghKHJlYWRsKGRzaS0+cmVn cyArIERTSV9JTlRTVEEpICYgRFNJX0JVU1kpKQo+ID4gKwkJCWJyZWFrOwo+ID4gKwo+ID4gKwkJ dXNsZWVwX3JhbmdlKDIsIDQpOwo+ID4gKwl9Cj4gPiArCj4gPiArCWlmICh0aW1lb3V0X21zID09 IDApIHsKPiA+ICsJCWRldl9pbmZvKGRzaS0+ZGV2LCAicG9sbGluZyBkc2kgd2FpdCBub3QgYnVz eSB0aW1lb3V0IVxuIik7Cj4gPiArCj4gPiArCQltdGtfZHNpX2VuYWJsZShkc2kpOwo+ID4gKwkJ bXRrX2RzaV9yZXNldF9lbmdpbmUoZHNpKTsKPiA+ICsJfQo+ID4gK30KPiA+ICsKPiA+ICtzdGF0 aWMgdm9pZCBtdGtfZHNpX3dhaXRfZm9yX2NtZF9kb25lKHN0cnVjdCBtdGtfZHNpICpkc2kpCj4g PiArewo+ID4gKwlzMzIgcmV0ID0gMDsKPiA+ICsJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gbXNl Y3NfdG9famlmZmllcyg1MDApOwo+ID4gKwo+ID4gKwlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVw dGlibGVfdGltZW91dChfZHNpX2NtZF9kb25lX3dhaXRfcXVldWUsCj4gPiArCQkJZHNpLT5pcnFf ZGF0YSAmIENNRF9ET05FX0lOVF9GTEFHLCB0aW1lb3V0KTsKPiA+ICsJaWYgKHJldCA9PSAwKSB7 Cj4gPiArCQlkZXZfaW5mbyhkc2ktPmRldiwgImRzaSB3YWl0IGVuZ2luZSBjbWQgZG9uZSBmYWls XG4iKTsKPiA+ICsJCW10a19kc2lfZW5hYmxlKGRzaSk7Cj4gPiArCQltdGtfZHNpX3Jlc2V0X2Vu Z2luZShkc2kpOwo+ID4gKwkJcmV0dXJuOwo+ID4gKwl9Cj4gPiArCj4gPiArCWRzaS0+aXJxX2Rh dGEgJj0gfkNNRF9ET05FX0lOVF9GTEFHOwo+IAo+IEkgdGhpbmsgeW91IHNob3VsZCBtb3ZlIHRo aXMgYmVmb3JlIHRyaWdnZXIgSFcuIFNvbWV0aW1lcyB0aGlzIGludGVycnVwdAo+IGlzIGNvbWlu ZyBhbmQgdGhpcyBmbGFnIGlzIHNldCBidXQgeW91IGRvIG5vdCB3YWl0IHRoaXMgZXZlbnQgYW5k IGRvIG5vdAo+IGNsZWFyIGl0LiBUaGVuIHdoZW4geW91IHdhbnQgdG8gd2FpdCwgdGhlIGZsYWcg aXMgYWxyZWFkeSBzZXQgYnkgbG9uZwo+IHRpbWUgYWdvIGludGVycnVwdC4KT0ssIHdlIHdpbGwg Zml4IGl0LgoKPiAKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIHNzaXplX3QgbXRrX2RzaV9ob3N0 X3JlYWRfY21kKHN0cnVjdCBtdGtfZHNpICpkc2ksCj4gPiArCQkJCSAgICAgY29uc3Qgc3RydWN0 IG1pcGlfZHNpX21zZyAqbXNnKQo+ID4gK3sKPiA+ICsJdTggbWF4X3RyeV9jb3VudCA9IDU7Cj4g PiArCXUzMiByZWN2X2NudCwgdG1wX3ZhbDsKPiA+ICsJc3RydWN0IGRzaV9yeHR4X2RhdGEgcmVh ZF9kYXRhMCwgcmVhZF9kYXRhMSwgcmVhZF9kYXRhMiwgcmVhZF9kYXRhMzsKPiA+ICsJdTggY29u ZmlnLCB0eXBlLCBkYXRhMCwgZGF0YTE7Cj4gPiArCXMzMiByZXQ7Cj4gPiArCj4gPiArCXU4ICpi dWZmZXIgPSBtc2ctPnJ4X2J1ZjsKPiA+ICsJdTggYnVmZmVyX3NpemUgPSBtc2ctPnJ4X2xlbjsK PiA+ICsKPiA+ICsJaWYgKHJlYWRsKGRzaS0+cmVncyArIERTSV9NT0RFX0NUUkwpICYgMHgwMykg ewo+ID4gKwkJZGV2X2luZm8oZHNpLT5kZXYsICJkc2kgZW5naW5lIGlzIG5vdCBjb21tYW5kIG1v ZGVcbiIpOwo+ID4gKwkJcmV0dXJuIC0xOwo+ID4gKwl9Cj4gPiArCj4gPiArCWlmICghYnVmZmVy KSB7Cj4gPiArCQlkZXZfaW5mbyhkc2ktPmRldiwgImRzaSByZWNlaXZlIGJ1ZmZlciBzaXplIG1h eSBiZSBOVUxMXG4iKTsKPiA+ICsJCXJldHVybiAtMTsKPiA+ICsJfQo+ID4gKwo+ID4gKwlkbyB7 Cj4gPiArCQlpZiAobWF4X3RyeV9jb3VudCA9PSAwKSB7Cj4gPiArCQkJZGV2X2luZm8oZHNpLT5k ZXYsICJkc2kgZW5naW5lIHJlYWQgY291bnRlciBoYXMgYmVlbiBtYXhpbnVtXG4iKTsKPiA+ICsJ CQlyZXR1cm4gLTE7Cj4gPiArCQl9Cj4gPiArCj4gPiArCQltYXhfdHJ5X2NvdW50LS07Cj4gPiAr CQlyZWN2X2NudCA9IDA7Cj4gPiArCj4gPiArCQltdGtfZHNpX3dhaXRfZm9yX2lkbGUoZHNpKTsK PiA+ICsKPiA+ICsJCWNvbmZpZyA9IDB4MDQ7Cj4gPiArCQlkYXRhMCA9ICooKHU4ICopKG1zZy0+ dHhfYnVmKSk7Cj4gPiArCj4gPiArCQlpZiAoYnVmZmVyX3NpemUgPCAzKQo+ID4gKwkJCXR5cGUg PSBNSVBJX0RTSV9EQ1NfUkVBRDsKPiA+ICsJCWVsc2UKPiA+ICsJCQl0eXBlID0gTUlQSV9EU0lf R0VORVJJQ19SRUFEX1JFUVVFU1RfMV9QQVJBTTsKPiA+ICsKPiA+ICsJCWRhdGExID0gMDsKPiA+ ICsKPiA+ICsJCXRtcF92YWwgPSAoZGF0YTEgPDwgMjQpIHwgKGRhdGEwIDw8IDE2KSB8ICh0eXBl IDw8IDgpIHwgY29uZmlnOwo+ID4gKwo+ID4gKwkJd3JpdGVsKHRtcF92YWwsIGRzaS0+cmVncyAr IERTSV9DTURRMCk7Cj4gPiArCQltdGtfZHNpX21hc2soZHNpLCBEU0lfQ01EUV9TSVpFLCBDTURR X1NJWkUsIDEpOwo+ID4gKwo+ID4gKwkJbXRrX2RzaV9zdGFydChkc2kpOwo+IAo+IFRoaXMgcGFy dCBsb29rcyBsaWtlIHRoZSBzYW1lIGFzIG10a19kc2lfaG9zdF93cml0ZV9jbWQoKSB3aXRoCj4g bXNnLT50eF9sZW4gPSAxLiBNYXliZSB5b3UgY2FuIHRyeSB0byBtZXJnZSB0aGVzZSB0d28gcGFy dC4KV2lsbCBkby4KCj4gCj4gPiArCj4gPiArCQkvKiAycyB0aW1lb3V0Ki8KPiA+ICsJCXJldCA9 IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KF9kc2lfZGNzX3JlYWRfd2FpdF9xdWV1 ZSwKPiA+ICsJCQkJZHNpLT5pcnFfZGF0YSAmIExQUlhfUkRfUkRZX0lOVF9GTEFHLCB0aW1lb3V0 KTsKPiA+ICsJCWlmIChyZXQgPT0gMCkgewo+ID4gKwkJCWRldl9pbmZvKGRzaS0+ZGV2LCAiV2Fp dCBEU0kgcmVhZCByZWFkeSB0aW1lb3V0ISEhXG4iKTsKPiA+ICsKPiA+ICsJCQltdGtfZHNpX2Vu YWJsZShkc2kpOwo+ID4gKwkJCW10a19kc2lfcmVzZXRfZW5naW5lKGRzaSk7Cj4gPiArCj4gPiAr CQkJcmV0dXJuIHJldDsKPiA+ICsJCX0KPiA+ICsKPiA+ICsJCWRzaS0+aXJxX2RhdGEgJj0gfkxQ UlhfUkRfUkRZX0lOVF9GTEFHOwo+IAo+IEkgdGhpbmsgeW91IHNob3VsZCBtb3ZlIHRoaXMgYmVm b3JlIHRyaWdnZXIgSFcuIFNvbWV0aW1lcyB0aGlzIGludGVycnVwdAo+IGlzIGNvbWluZyBhbmQg dGhpcyBmbGFnIGlzIHNldCBidXQgeW91IGRvIG5vdCB3YWl0IHRoaXMgZXZlbnQgYW5kIGRvIG5v dAo+IGNsZWFyIGl0LiBUaGVuIHdoZW4geW91IHdhbnQgdG8gd2FpdCwgdGhlIGZsYWcgaXMgYWxy ZWFkeSBzZXQgYnkgbG9uZwo+IHRpbWUgYWdvIGludGVycnVwdC4KV2lsbCBkby4KCj4gCj4gPiAr Cj4gPiArCQkqKHUzMiAqKSgmcmVhZF9kYXRhMCkgPSByZWFkbChkc2ktPnJlZ3MgKyBEU0lfUlhf REFUQTApOwo+ID4gKwkJKih1MzIgKikoJnJlYWRfZGF0YTEpID0gcmVhZGwoZHNpLT5yZWdzICsg RFNJX1JYX0RBVEExKTsKPiA+ICsJCSoodTMyICopKCZyZWFkX2RhdGEyKSA9IHJlYWRsKGRzaS0+ cmVncyArIERTSV9SWF9EQVRBMik7Cj4gPiArCQkqKHUzMiAqKSgmcmVhZF9kYXRhMykgPSByZWFk bChkc2ktPnJlZ3MgKyBEU0lfUlhfREFUQTMpOwo+ID4gKwo+ID4gKwkJdHlwZSA9IHJlYWRfZGF0 YTAuYnl0ZTA7Cj4gPiArCj4gPiArCQlpZiAodHlwZSA9PSBNSVBJX0RTSV9SWF9HRU5FUklDX0xP TkdfUkVBRF9SRVNQT05TRSB8fAo+ID4gKwkJICAgIHR5cGUgPT0gTUlQSV9EU0lfUlhfRENTX0xP TkdfUkVBRF9SRVNQT05TRSkgewo+ID4gKwo+ID4gKwkJCS8qCj4gPiArCQkJICogRGF0YSBJRCgx IGJ5dGUpICsgV29yZCBDb3VudCgyIGJ5dGVzKSArIEVDQygxIGJ5dGUpICsKPiA+ICsJCQkgKiBk YXRhIDAgKyAuLi4rIGRhdGEgV0MtMSArIENIRUNLU1VNICgyIGJ5dGVzKQo+IAo+IElzIENIRUNL U1VNIHVzZWxlc3M/IFdoeSBub3QgY2hlY2sgaXQ/CldlIHdpbGwgY2hlY2sgdGhpcy4KCj4gCj4g PiArCQkJICovCj4gPiArCQkJcmVjdl9jbnQgPSByZWFkX2RhdGEwLmJ5dGUxICsgcmVhZF9kYXRh MC5ieXRlMiAqIDE2Owo+ID4gKwkJCWRldl9pbmZvKGRzaS0+ZGV2LCAibG9uZyBwYWNrZXQgc2l6 ZTogJWRcbiIsIHJlY3ZfY250KTsKPiA+ICsKPiA+ICsJCQkvKgo+ID4gKwkJCSAqIHRoZSBidWZm ZXIgc2l6ZSBpcyAxNiBieXRlcyBvbmNlLCBzbyB0aGUgZGF0YSBwYXlsb2FkCj4gPiArCQkJICog aXMsIDE2IC0gYnl0ZXMoZGF0YSBJRCArIFdDICsgRUNDICsgQ0hFQ0tTVU0pLCBpZgo+ID4gKwkJ CSAqIG92ZXIgMTAgYnl0ZXMsIGl0IHdpbGwgYmUgcmVhZCBhZ2Fpbgo+ID4gKwkJCSAqLwo+ID4g KwkJCWlmIChyZWN2X2NudCA+IDEwKQo+ID4gKwkJCQlyZWN2X2NudCA9IDEwOwo+ID4gKwo+ID4g KwkJCWlmIChyZWN2X2NudCA+IGJ1ZmZlcl9zaXplKQo+ID4gKwkJCQlyZWN2X2NudCA9IGJ1ZmZl cl9zaXplOwo+ID4gKwo+ID4gKwkJCWlmIChyZWN2X2NudCA8PSA0KSB7Cj4gPiArCQkJCW1lbWNw eShidWZmZXIsICZyZWFkX2RhdGExLCByZWN2X2NudCk7Cj4gPiArCQkJfSBlbHNlIGlmIChyZWN2 X2NudCA8PSA4KSB7Cj4gPiArCQkJCW1lbWNweShidWZmZXIsICZyZWFkX2RhdGExLCA0KTsKPiA+ ICsJCQkJbWVtY3B5KGJ1ZmZlciArIDQsICZyZWFkX2RhdGEyLCByZWN2X2NudCAtIDQpOwo+ID4g KwkJCX0gZWxzZSB7Cj4gPiArCQkJCW1lbWNweShidWZmZXIsICZyZWFkX2RhdGExLCA0KTsKPiA+ ICsJCQkJbWVtY3B5KGJ1ZmZlciArIDQsICZyZWFkX2RhdGEyLCA0KTsKPiA+ICsJCQkJbWVtY3B5 KGJ1ZmZlciArIDgsICZyZWFkX2RhdGEzLCByZWN2X2NudCAtIDgpOwo+ID4gKwkJCX0KPiAKPiBJ IHRoaW5rIHlvdSBjYW4gaWdub3JlIHJlYWRfZGF0YTEsIHJlYWRfZGF0YTIsIGFuZCByZWFkX2Rh dGEzLiBVc2luZyBhCj4gJ2ZvciBsb29wJyBhbmQgcmVhZGIoKSBoZXJlIGNhbiBkaXJlY3RseSBy ZWFkIHJlZ2lzdGVyIGRhdGEgaW50byBidWZmZXIuCldlIHdpbGwgcmV3cml0ZSB0aGlzIHBhcnQu Cgo+IAo+IAo+ID4gKwkJfSBlbHNlIGlmICh0eXBlID09IE1JUElfRFNJX1JYX0dFTkVSSUNfU0hP UlRfUkVBRF9SRVNQT05TRV8xQllURSB8fAo+ID4gKwkJCSAgIHR5cGUgPT0gTUlQSV9EU0lfUlhf R0VORVJJQ19TSE9SVF9SRUFEX1JFU1BPTlNFXzJCWVRFIHx8Cj4gPiArCQkJICAgdHlwZSA9PSBN SVBJX0RTSV9SWF9EQ1NfU0hPUlRfUkVBRF9SRVNQT05TRV8xQllURSB8fAo+ID4gKwkJCSAgIHR5 cGUgPT0gTUlQSV9EU0lfUlhfRENTX1NIT1JUX1JFQURfUkVTUE9OU0VfMkJZVEUpIHsKPiA+ICsK PiA+ICsJCQlpZiAodHlwZSA9PSBNSVBJX0RTSV9SWF9HRU5FUklDX1NIT1JUX1JFQURfUkVTUE9O U0VfMUJZVEUgfHwKPiA+ICsJCQkgICAgdHlwZSA9PSBNSVBJX0RTSV9SWF9EQ1NfU0hPUlRfUkVB RF9SRVNQT05TRV8xQllURSkKPiA+ICsJCQkJcmVjdl9jbnQgPSAxOwo+ID4gKwkJCWVsc2UKPiA+ ICsJCQkJcmVjdl9jbnQgPSAyOwo+ID4gKwo+ID4gKwkJCWlmIChyZWN2X2NudCA+IGJ1ZmZlcl9z aXplKQo+ID4gKwkJCQlyZWN2X2NudCA9IGJ1ZmZlcl9zaXplOwo+ID4gKwo+ID4gKwkJCW1lbWNw eShidWZmZXIsICZyZWFkX2RhdGEwLmJ5dGUxLCByZWN2X2NudCk7Cj4gPiArCQl9IGVsc2UgaWYg KHR5cGUgPT0gTUlQSV9EU0lfUlhfQUNLTk9XTEVER0VfQU5EX0VSUk9SX1JFUE9SVCkgewo+ID4g KwkJCWRldl9pbmZvKGRzaS0+ZGV2LCAicGFja2V0IHR5cGUgaXMgMHgwMiwgdHJ5IGFnYWluXG4i KTsKPiA+ICsJCX0gZWxzZSB7Cj4gPiArCQkJZGV2X2luZm8oZHNpLT5kZXYsICJwYWNrZXQgdHlw ZSgweCV4KSBjYW5ub3QgYmUgbm9uLXJlY29nbml6ZVxuIiwKPiA+ICsJCQkJIHR5cGUpOwo+ID4g Kwo+ID4gKwkJCXJldHVybiAwOwo+ID4gKwkJfQo+ID4gKwl9IHdoaWxlICh0eXBlID09IE1JUElf RFNJX1JYX0FDS05PV0xFREdFX0FORF9FUlJPUl9SRVBPUlQpOwo+ID4gKwo+ID4gKwlkZXZfaW5m byhkc2ktPmRldiwgImRzaSBnZXQgJWQgYnl0ZSBkYXRhIGZyb20gdGhlIHBhbmVsIGFkZHJlc3Mo MHgleClcbiIsCj4gPiArCQkgcmVjdl9jbnQsICooKHU4ICopKG1zZy0+dHhfYnVmKSkpOwo+ID4g Kwo+ID4gKwlyZXR1cm4gcmVjdl9jbnQ7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBzc2l6ZV90 IG10a19kc2lfaG9zdF93cml0ZV9jbWQoc3RydWN0IG10a19kc2kgKmRzaSwKPiA+ICsJCQkJICAg ICAgY29uc3Qgc3RydWN0IG1pcGlfZHNpX21zZyAqbXNnKQo+ID4gK3sKPiA+ICsJdTMyIGk7Cj4g PiArCXUzMiBnb3RvX2FkZHIsIG1hc2tfcGFyYSwgc2V0X3BhcmEsIHJlZ192YWw7Cj4gPiArCXZv aWQgX19pb21lbSAqY21kcV9yZWc7Cj4gPiArCXU4IGNvbmZpZywgdHlwZSwgZGF0YTAsIGRhdGEx Owo+ID4gKwl1MTYgd2MxNjsKPiA+ICsJY29uc3QgY2hhciAqdHhfYnVmID0gbXNnLT50eF9idWY7 Cj4gPiArCXN0cnVjdCBkc2lfdHhfY21kcV9yZWdzICpkc2lfY21kX3JlZzsKPiA+ICsKPiA+ICsJ ZHNpX2NtZF9yZWcgPSAoc3RydWN0IGRzaV90eF9jbWRxX3JlZ3MgKikoZHNpLT5yZWdzICsgRFNJ X0NNRFEwKTsKPiA+ICsKPiA+ICsJbXRrX2RzaV93YWl0X2Zvcl9pZGxlKGRzaSk7Cj4gPiArCj4g PiArCWlmIChtc2ctPnR4X2xlbiA+IDIpIHsKPiA+ICsJCWNvbmZpZyA9IDI7Cj4gPiArCQl0eXBl ID0gbXNnLT50eXBlOwo+ID4gKwkJd2MxNiA9IG1zZy0+dHhfbGVuOwo+ID4gKwo+ID4gKwkJcmVn X3ZhbCA9ICh3YzE2IDw8IDE2KSB8ICh0eXBlIDw8IDgpIHwgY29uZmlnOwo+ID4gKwo+ID4gKwkJ d3JpdGVsKHJlZ192YWwsICZkc2lfY21kX3JlZy0+ZGF0YVswXSk7Cj4gPiArCj4gPiArCQlmb3Ig KGkgPSAwOyBpIDwgbXNnLT50eF9sZW47IGkrKykgewo+ID4gKwkJCWdvdG9fYWRkciA9ICh1MzIp KCZkc2lfY21kX3JlZy0+ZGF0YVsxXS5ieXRlMCkgKyBpOwo+ID4gKwkJCW1hc2tfcGFyYSA9ICgw eGZmIDw8ICgoZ290b19hZGRyICYgMHgzKSAqIDgpKTsKPiA+ICsJCQlzZXRfcGFyYSA9ICh0eF9i dWZbaV0gPDwgKChnb3RvX2FkZHIgJiAweDMpICogOCkpOwo+ID4gKwkJCWNtZHFfcmVnID0gKHZv aWQgX19pb21lbSAqKShnb3RvX2FkZHIgJiAofjB4MykpOwo+ID4gKwkJCW10a19kc2lfc2V0X2Nt ZHEoY21kcV9yZWcsIG1hc2tfcGFyYSwgc2V0X3BhcmEpOwo+ID4gKwkJfQo+IAo+IEJlY2F1c2Ug eW91IHVzZSB3cml0ZWwoKSwgc28gdGhpcyBwYXJ0IGxvb2sgc28gY29tcGxpY2F0ZWQuIElmIHlv dSB1c2UKPiB3cml0ZWIoKSwgdGhpcyB3b3VsZCBiZSBtdWNoIHNpbXBsZXIuCk9LLCB3ZSB3aWxs IHVzZSB3cml0ZWIoKSBpbiB0aGUgbmV4dCB2ZXJzaW9uLgoKUmVnYXJkcywKeXQuc2hlbgoKPiAK PiA+ICsKPiA+ICsJCW10a19kc2lfbWFzayhkc2ksIERTSV9DTURRX1NJWkUsIENNRFFfU0laRSwK PiA+ICsJCQkgICAgIDEgKyAobXNnLT50eF9sZW4gKyAzKSAvIDQpOwo+ID4gKwl9IGVsc2Ugewo+ ID4gKwkJY29uZmlnID0gMDsKPiA+ICsJCWRhdGEwID0gdHhfYnVmWzBdOwo+ID4gKwkJaWYgKG1z Zy0+dHhfbGVuID09IDIpIHsKPiA+ICsJCQl0eXBlID0gTUlQSV9EU0lfRENTX1NIT1JUX1dSSVRF X1BBUkFNOwo+ID4gKwkJCWRhdGExID0gdHhfYnVmWzFdOwo+ID4gKwkJfSBlbHNlIHsKPiA+ICsJ CQl0eXBlID0gTUlQSV9EU0lfRENTX1NIT1JUX1dSSVRFOwo+ID4gKwkJCWRhdGExID0gMDsKPiA+ ICsJCX0KPiA+ICsKPiA+ICsJCXJlZ192YWwgPSAoZGF0YTEgPDwgMjQpIHwgKGRhdGEwIDw8IDE2 KSB8ICh0eXBlIDw8IDgpIHwgY29uZmlnOwo+ID4gKwo+ID4gKwkJd3JpdGVsKHJlZ192YWwsICZk c2lfY21kX3JlZy0+ZGF0YVswXSk7Cj4gPiArCQltdGtfZHNpX21hc2soZHNpLCBEU0lfQ01EUV9T SVpFLCBDTURRX1NJWkUsIDEpOwo+ID4gKwl9Cj4gPiArCj4gPiArCW10a19kc2lfc3RhcnQoZHNp KTsKPiA+ICsJbXRrX2RzaV93YWl0X2Zvcl9jbWRfZG9uZShkc2kpOwo+ID4gKwo+ID4gKwlyZXR1 cm4gMDsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIHNzaXplX3QgbXRrX2RzaV9ob3N0X3RyYW5z ZmVyKHN0cnVjdCBtaXBpX2RzaV9ob3N0ICpob3N0LAo+ID4gKwkJCQkgICAgIGNvbnN0IHN0cnVj dCBtaXBpX2RzaV9tc2cgKm1zZykKPiA+ICt7Cj4gPiArCXN0cnVjdCBtdGtfZHNpICpkc2kgPSBo b3N0X3RvX2RzaShob3N0KTsKPiA+ICsJdTggdHlwZSA9IG1zZy0+dHlwZTsKPiA+ICsJc3NpemVf dCByZXQgPSAwOwo+ID4gKwo+ID4gKwlpZiAoTVRLX0RTSV9IT1NUX0lTX1JFQUQodHlwZSkpCj4g PiArCQlyZXQgPSBtdGtfZHNpX2hvc3RfcmVhZF9jbWQoZHNpLCBtc2cpOwo+ID4gKwllbHNlIGlm IChNVEtfRFNJX0hPU1RfSVNfV1JJVEUodHlwZSkpCj4gPiArCQlyZXQgPSBtdGtfZHNpX2hvc3Rf d3JpdGVfY21kKGRzaSwgbXNnKTsKPiA+ICsKPiA+ICsJcmV0dXJuIHJldDsKPiA+ICt9Cj4gPiAr Cj4gPiAgc3RhdGljIGNvbnN0IHN0cnVjdCBtaXBpX2RzaV9ob3N0X29wcyBtdGtfZHNpX29wcyA9 IHsKPiA+ICAJLmF0dGFjaCA9IG10a19kc2lfaG9zdF9hdHRhY2gsCj4gPiAgCS5kZXRhY2ggPSBt dGtfZHNpX2hvc3RfZGV0YWNoLAo+ID4gKwkudHJhbnNmZXIgPSBtdGtfZHNpX2hvc3RfdHJhbnNm ZXIsCj4gPiAgfTsKPiA+ICAKPiA+ICBzdGF0aWMgaW50IG10a19kc2lfYmluZChzdHJ1Y3QgZGV2 aWNlICpkZXYsIHN0cnVjdCBkZXZpY2UgKm1hc3Rlciwgdm9pZCAqZGF0YSkKPiAKPiBSZWdhcmRz LAo+IENLCj4gCgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3Jn Cmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVs Cg==