From mboxrd@z Thu Jan 1 00:00:00 1970 From: Dan Carpenter Subject: Re: [PATCH v1 2/2] drm/bridge: anx7625: Add anx7625 MIPI to DP bridge driver Date: Mon, 23 Sep 2019 17:03:55 +0300 Message-ID: <20190923140355.GH2959@kadam> References: <02319a7db948900efe0f945b684221ac076bac48.1568957789.git.xji@analogixsemi.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from aserp2120.oracle.com (aserp2120.oracle.com [141.146.126.78]) by gabe.freedesktop.org (Postfix) with ESMTPS id 3643189C46 for ; Mon, 23 Sep 2019 14:04:32 +0000 (UTC) Content-Disposition: inline In-Reply-To: <02319a7db948900efe0f945b684221ac076bac48.1568957789.git.xji@analogixsemi.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Xin Ji Cc: "devel@driverdev.osuosl.org" , Jernej Skrabec , Jonas Karlman , David Airlie , Neil Armstrong , "linux-kernel@vger.kernel.org" , "dri-devel@lists.freedesktop.org" , Laurent Pinchart , Sheng Pan List-Id: dri-devel@lists.freedesktop.org SSB3aXNoIHlvdSB3b3VsZCB0aGluayBtb3JlIGFib3V0IHRoZSBlcnJvciBjb2RlcyB0aGF0IHlv dSdyZSByZXR1cm5pbmcuCk1vc3QgZnVuY3Rpb25zIGRvICJyZXQgfD0gZnJvYigpLiIgd2hpY2gg T1JzIHRoZSBlcnJvciBjb2RlcyB0b2dldGhlciwKYW5kIHJlc3VsdHMgaW4gYSBub25zZW5zZSBu ZWdhdGl2ZSBlcnJvciBjb2RlLiAgQnV0IHRoZW4gc29tZSBmdW5jdGlvbnMKcmV0dXJuIDEgb24g ZXJyb3IgYW5kIHplcm8gb24gc3VjY2VzcyB3aGljaCBpcyBzb21ldGltZXMgYSBidWcsCnNvbWV0 aW1lcyBjb25mdXNpbmcgYnV0IGFsd2F5cyB1Z2x5LgoKT24gRnJpLCBTZXAgMjAsIDIwMTkgYXQg MDY6MDc6NDNBTSArMDAwMCwgWGluIEppIHdyb3RlOgo+IFRoZSBBTlg3NjI1IGlzIGFuIHVsdHJh LWxvdyBwb3dlciA0SyBNb2JpbGUgSEQgVHJhbnNtaXR0ZXIgZGVzaWduZWQKPiBmb3IgcG9ydGFi bGUgZGV2aWNlLiBJdCBjb252ZXJ0cyBNSVBJIHRvIERpc3BsYXlQb3J0IDEuMyA0Sy4KPiAKPiBT aWduZWQtb2ZmLWJ5OiBYaW4gSmkgPHhqaUBhbmFsb2dpeHNlbWkuY29tPgo+IC0tLQo+ICBkcml2 ZXJzL2dwdS9kcm0vYnJpZGdlL01ha2VmaWxlICAgICAgICAgICB8ICAgIDIgKy0KPiAgZHJpdmVy cy9ncHUvZHJtL2JyaWRnZS9hbmFsb2dpeC9LY29uZmlnICAgfCAgICA2ICsKPiAgZHJpdmVycy9n cHUvZHJtL2JyaWRnZS9hbmFsb2dpeC9NYWtlZmlsZSAgfCAgICAxICsKPiAgZHJpdmVycy9ncHUv ZHJtL2JyaWRnZS9hbmFsb2dpeC9hbng3NjI1LmMgfCAyMDg1ICsrKysrKysrKysrKysrKysrKysr KysrKysrKysrCj4gIGRyaXZlcnMvZ3B1L2RybS9icmlkZ2UvYW5hbG9naXgvYW54NzYyNS5oIHwg IDM5NyArKysrKysKPiAgNSBmaWxlcyBjaGFuZ2VkLCAyNDkwIGluc2VydGlvbnMoKyksIDEgZGVs ZXRpb24oLSkKPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9icmlkZ2UvYW5h bG9naXgvYW54NzYyNS5jCj4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vYnJp ZGdlL2FuYWxvZ2l4L2FueDc2MjUuaAo+IAo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0v YnJpZGdlL01ha2VmaWxlIGIvZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9NYWtlZmlsZQo+IGluZGV4 IDQ5MzRmY2YuLmJjZDM4OGEgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9N YWtlZmlsZQo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9icmlkZ2UvTWFrZWZpbGUKPiBAQCAtMTIs OCArMTIsOCBAQCBvYmotJChDT05GSUdfRFJNX1NJSTkyMzQpICs9IHNpaTkyMzQubwo+ICBvYmot JChDT05GSUdfRFJNX1RISU5FX1RIQzYzTFZEMTAyNCkgKz0gdGhjNjNsdmQxMDI0Lm8KPiAgb2Jq LSQoQ09ORklHX0RSTV9UT1NISUJBX1RDMzU4NzY0KSArPSB0YzM1ODc2NC5vCj4gIG9iai0kKENP TkZJR19EUk1fVE9TSElCQV9UQzM1ODc2NykgKz0gdGMzNTg3Njcubwo+IC1vYmotJChDT05GSUdf RFJNX0FOQUxPR0lYX0RQKSArPSBhbmFsb2dpeC8KPiAgb2JqLSQoQ09ORklHX0RSTV9JMkNfQURW NzUxMSkgKz0gYWR2NzUxMS8KPiAgb2JqLSQoQ09ORklHX0RSTV9USV9TTjY1RFNJODYpICs9IHRp LXNuNjVkc2k4Ni5vCj4gIG9iai0kKENPTkZJR19EUk1fVElfVEZQNDEwKSArPSB0aS10ZnA0MTAu bwo+ICtvYmoteSArPSBhbmFsb2dpeC8KPiAgb2JqLXkgKz0gc3lub3BzeXMvCj4gZGlmZiAtLWdp dCBhL2RyaXZlcnMvZ3B1L2RybS9icmlkZ2UvYW5hbG9naXgvS2NvbmZpZyBiL2RyaXZlcnMvZ3B1 L2RybS9icmlkZ2UvYW5hbG9naXgvS2NvbmZpZwo+IGluZGV4IGU5MzBmZjkuLmIyZjEyN2UgMTAw NjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9hbmFsb2dpeC9LY29uZmlnCj4gKysr IGIvZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9hbmFsb2dpeC9LY29uZmlnCj4gQEAgLTIsMyArMiw5 IEBACj4gIGNvbmZpZyBEUk1fQU5BTE9HSVhfRFAKPiAgCXRyaXN0YXRlCj4gIAlkZXBlbmRzIG9u IERSTQo+ICsKPiArY29uZmlnIEFOQUxPR0lYX0FOWDc2MjUKPiArCXRyaXN0YXRlICJBbmFsb2dp eCBNSVBJIHRvIERQIGludGVyZmFjZSBzdXBwb3J0Igo+ICsJaGVscAo+ICsJCUFOWDc2MjUgaXMg YW4gdWx0cmEtbG93IHBvd2VyIDRLIG1vYmlsZSBIRCB0cmFuc21pdHRlciBkZXNpZ25lZAo+ICsJ CWZvciBwb3J0YWJsZSBkZXZpY2VzLiBJdCBjb252ZXJ0cyBNSVBJL0RQSSB0byBEaXNwbGF5UG9y dDEuMyA0Sy4KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9hbmFsb2dpeC9N YWtlZmlsZSBiL2RyaXZlcnMvZ3B1L2RybS9icmlkZ2UvYW5hbG9naXgvTWFrZWZpbGUKPiBpbmRl eCBmZGJmM2ZkLi44YTUyODY3IDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9icmlkZ2Uv YW5hbG9naXgvTWFrZWZpbGUKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL2FuYWxvZ2l4 L01ha2VmaWxlCj4gQEAgLTEsMyArMSw0IEBACj4gICMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6 IEdQTC0yLjAtb25seQo+ICtvYmotJChDT05GSUdfQU5BTE9HSVhfQU5YNzYyNSkgKz0gYW54NzYy NS5vCj4gIGFuYWxvZ2l4X2RwLW9ianMgOj0gYW5hbG9naXhfZHBfY29yZS5vIGFuYWxvZ2l4X2Rw X3JlZy5vCj4gIG9iai0kKENPTkZJR19EUk1fQU5BTE9HSVhfRFApICs9IGFuYWxvZ2l4X2RwLm8K PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9hbmFsb2dpeC9hbng3NjI1LmMg Yi9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL2FuYWxvZ2l4L2FueDc2MjUuYwo+IG5ldyBmaWxlIG1v ZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMC4uZWNlYWRlZgo+IC0tLSAvZGV2L251bGwKPiArKysg Yi9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL2FuYWxvZ2l4L2FueDc2MjUuYwo+IEBAIC0wLDAgKzEs MjA4NSBAQAo+ICsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5Cj4gKy8q Cj4gKyAqIENvcHlyaWdodChjKSAyMDE2LCBBbmFsb2dpeCBTZW1pY29uZHVjdG9yLiBBbGwgcmln aHRzIHJlc2VydmVkLgo+ICsgKgo+ICsgKi8KPiArI2luY2x1ZGUgPGxpbnV4L2V4dGNvbi5oPgo+ ICsjaW5jbHVkZSA8bGludXgvZ2NkLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9ncGlvL2NvbnN1bWVy Lmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KPiArI2luY2x1ZGUgPGxpbnV4L2ludGVycnVw dC5oPgo+ICsjaW5jbHVkZSA8bGludXgvaW9wb2xsLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9rZXJu ZWwuaD4KPiArI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgo+ICsjaW5jbHVkZSA8bGludXgvbXV0 ZXguaD4KPiArI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KPiArI2luY2x1ZGUgPGxpbnV4L3R5cGVz Lmg+Cj4gKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KPiArCj4gKyNpbmNsdWRlIDxsaW51 eC9vZl9ncGlvLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9vZl9ncmFwaC5oPgo+ICsjaW5jbHVkZSA8 bGludXgvb2ZfcGxhdGZvcm0uaD4KPiArCj4gKyNpbmNsdWRlIDxkcm0vZHJtX2F0b21pY19oZWxw ZXIuaD4KPiArI2luY2x1ZGUgPGRybS9kcm1fYnJpZGdlLmg+Cj4gKyNpbmNsdWRlIDxkcm0vZHJt X2NydGNfaGVscGVyLmg+Cj4gKyNpbmNsdWRlIDxkcm0vZHJtX2RwX2hlbHBlci5oPgo+ICsjaW5j bHVkZSA8ZHJtL2RybV9lZGlkLmg+Cj4gKyNpbmNsdWRlIDxkcm0vZHJtX21pcGlfZHNpLmg+Cj4g KyNpbmNsdWRlIDxkcm0vZHJtX3ByaW50Lmg+Cj4gKyNpbmNsdWRlIDxkcm0vZHJtX3Byb2JlX2hl bHBlci5oPgo+ICsKPiArI2luY2x1ZGUgPHZpZGVvL2Rpc3BsYXlfdGltaW5nLmg+Cj4gKwo+ICsj aW5jbHVkZSAiYW54NzYyNS5oIgo+ICsKPiArLyoKPiArICogdGhlcmUgaXMgYSBzeW5jIGlzc3Vl IHdoaWxlIGFjY2VzcyBJMkMgcmVnaXN0ZXIgYmV0d2VlbiBBUChDUFUpIGFuZAo+ICsgKiBpbnRl cm5hbCBmaXJtd2FyZShPQ00pLCB0byBhdm9pZCB0aGUgcmFjZSBjb25kaXRpb24sIEFQIHNob3Vs ZCBhY2Nlc3MKPiArICogdGhlIHJlc2VydmVkIHNsYXZlIGFkZHJlc3MgYmVmb3JlIHNsYXZlIGFk ZHJlc3Mgb2NjdXJzIGNoYW5nZXMuCj4gKyAqLwo+ICtzdGF0aWMgaW50IGkyY19hY2Nlc3Nfd29y a2Fyb3VuZChzdHJ1Y3QgYW54NzYyNV9kYXRhICpjdHgsCj4gKwkJCQkgc3RydWN0IGkyY19jbGll bnQgKmNsaWVudCkKPiArewo+ICsJdTggb2Zmc2V0Owo+ICsJc3RydWN0IGRldmljZSAqZGV2ID0g JmNsaWVudC0+ZGV2Owo+ICsJc3RydWN0IGkyY19jbGllbnQgKmxhc3RfY2xpZW50ID0gY3R4LT5s YXN0X2NsaWVudDsKPiArCWludCByZXQgPSAwOwo+ICsKPiArCWlmIChjbGllbnQgIT0gbGFzdF9j bGllbnQpIHsKCkZsaXAgdGhpcyBhcm91bmQ6CgoJaWYgKGNsaWVudCA9PSBsYXN0X2NsaWVudCkK CQlyZXR1cm4gMDsKCj4gKwkJY3R4LT5sYXN0X2NsaWVudCA9IGNsaWVudDsKPiArCj4gKwkJaWYg KGNsaWVudCA9PSBjdHgtPmkyYy50Y3BjX2NsaWVudCkKPiArCQkJb2Zmc2V0ID0gUlNWRF8wMF9B RERSOwo+ICsJCWVsc2UgaWYgKGNsaWVudCA9PSBjdHgtPmkyYy50eF9wMF9jbGllbnQpCj4gKwkJ CW9mZnNldCA9IFJTVkRfRDFfQUREUjsKPiArCQllbHNlIGlmIChjbGllbnQgPT0gY3R4LT5pMmMu dHhfcDFfY2xpZW50KQo+ICsJCQlvZmZzZXQgPSBSU1ZEXzYwX0FERFI7Cj4gKwkJZWxzZSBpZiAo Y2xpZW50ID09IGN0eC0+aTJjLnJ4X3AwX2NsaWVudCkKPiArCQkJb2Zmc2V0ID0gUlNWRF8zOV9B RERSOwo+ICsJCWVsc2UgaWYgKGNsaWVudCA9PSBjdHgtPmkyYy5yeF9wMV9jbGllbnQpCj4gKwkJ CW9mZnNldCA9IFJTVkRfN0ZfQUREUjsKPiArCQllbHNlCj4gKwkJCW9mZnNldCA9IFJTVkRfMDBf QUREUjsKPiArCj4gKwkJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIG9m ZnNldCwgMHgwMCk7Cj4gKwkJaWYgKHJldCA8IDApCj4gKwkJCURSTV9ERVZfRVJST1IoZGV2LAo+ ICsJCQkJICAgICAgImZhaWxlZCB0byBhY2Nlc3MgaTJjIGlkPSV4XG46JXgiLAo+ICsJCQkJICAg ICAgY2xpZW50LT5hZGRyLCBvZmZzZXQpOwo+ICsJfQo+ICsKPiArCXJldHVybiByZXQ7Cj4gK30K PiArCj4gK3N0YXRpYyBpbnQgYW54NzYyNV9yZWdfcmVhZChzdHJ1Y3QgYW54NzYyNV9kYXRhICpj dHgsCj4gKwkJCSAgICBzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWdfYWRkcikKPiAr ewo+ICsJaW50IHJldDsKPiArCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZjbGllbnQtPmRldjsKPiAr Cj4gKwlpMmNfYWNjZXNzX3dvcmthcm91bmQoY3R4LCBjbGllbnQpOwo+ICsKPiArCXJldCA9IGky Y19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIHJlZ19hZGRyKTsKPiArCWlmIChyZXQgPCAw KQo+ICsJCURSTV9ERVZfRVJST1IoZGV2LCAicmVhZCBpMmMgZmFpbGVkIGlkPSV4OiV4XG4iLAo+ ICsJCQkgICAgICBjbGllbnQtPmFkZHIsIHJlZ19hZGRyKTsKPiArCj4gKwlyZXR1cm4gcmV0Owo+ ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGFueDc2MjVfcmVnX2Jsb2NrX3JlYWQoc3RydWN0IGFueDc2 MjVfZGF0YSAqY3R4LAo+ICsJCQkJICBzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAo+ICsJCQkJ ICB1OCByZWdfYWRkciwgdTggbGVuLCB1OCAqYnVmKQo+ICt7Cj4gKwlpbnQgcmV0Owo+ICsJc3Ry dWN0IGRldmljZSAqZGV2ID0gJmNsaWVudC0+ZGV2Owo+ICsKPiArCWkyY19hY2Nlc3Nfd29ya2Fy b3VuZChjdHgsIGNsaWVudCk7Cj4gKwo+ICsJcmV0ID0gaTJjX3NtYnVzX3JlYWRfaTJjX2Jsb2Nr X2RhdGEoY2xpZW50LCByZWdfYWRkciwgbGVuLCBidWYpOwo+ICsJaWYgKHJldCA8IDApCj4gKwkJ RFJNX0RFVl9FUlJPUihkZXYsICJyZWFkIGkyYyBibG9jayBmYWlsZWQgaWQ9JXg6JXhcbiIsCj4g KwkJCSAgICAgIGNsaWVudC0+YWRkciwgcmVnX2FkZHIpOwo+ICsKPiArCXJldHVybiByZXQ7Cj4g K30KPiArCj4gK3N0YXRpYyBpbnQgYW54NzYyNV9yZWdfd3JpdGUoc3RydWN0IGFueDc2MjVfZGF0 YSAqY3R4LAo+ICsJCQkgICAgIHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCj4gKwkJCSAgICAg dTggcmVnX2FkZHIsIHU4IHJlZ192YWwpCj4gK3sKPiArCWludCByZXQ7Cj4gKwlzdHJ1Y3QgZGV2 aWNlICpkZXYgPSAmY2xpZW50LT5kZXY7Cj4gKwo+ICsJaTJjX2FjY2Vzc193b3JrYXJvdW5kKGN0 eCwgY2xpZW50KTsKPiArCj4gKwlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVu dCwgcmVnX2FkZHIsIHJlZ192YWwpOwo+ICsKPiArCWlmIChyZXQgPCAwKQo+ICsJCURSTV9ERVZf RVJST1IoZGV2LCAiZmFpbGVkIHRvIHdyaXRlIGkyYyBpZD0leFxuOiV4IiwKPiArCQkJICAgICAg Y2xpZW50LT5hZGRyLCByZWdfYWRkcik7Cj4gKwo+ICsJcmV0dXJuIHJldDsKPiArfQo+ICsKPiAr c3RhdGljIGludCBhbng3NjI1X3dyaXRlX29yKHN0cnVjdCBhbng3NjI1X2RhdGEgKmN0eCwKPiAr CQkJICAgIHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCj4gKwkJCSAgICB1OCBvZmZzZXQsIHU4 IG1hc2spCj4gK3sKPiArCWludCB2YWwgPSBhbng3NjI1X3JlZ19yZWFkKGN0eCwgY2xpZW50LCBv ZmZzZXQpOwo+ICsKPiArCXJldHVybiAodmFsIDwgMCkgPyB2YWwgOgo+ICsJCWFueDc2MjVfcmVn X3dyaXRlKGN0eCwgY2xpZW50LCBvZmZzZXQsICh2YWwgfCAobWFzaykpKTsKCgpXcml0ZSB0aGVz ZSBmdW5jdGlvbnMgY2xlYW5lciBsaWtlIHRoaXM6CgoJaW50IHZhbDsKCgl2YWwgPSBhbng3NjI1 X3JlZ19yZWFkKGN0eCwgY2xpZW50LCBvZmZzZXQpOwoJaWYgKHZhbCA8IDApCgkJcmV0dXJuIHZh bDsKCglyZXR1cm4gYW54NzYyNV9yZWdfd3JpdGUoY3R4LCBjbGllbnQsIG9mZnNldCwgKHZhbCB8 IChtYXNrKSkpOwoKCj4gK30KPiArCj4gK3N0YXRpYyBpbnQgYW54NzYyNV93cml0ZV9hbmQoc3Ry dWN0IGFueDc2MjVfZGF0YSAqY3R4LAo+ICsJCQkgICAgIHN0cnVjdCBpMmNfY2xpZW50ICpjbGll bnQsCj4gKwkJCSAgICAgdTggb2Zmc2V0LCB1OCBtYXNrKQo+ICt7Cj4gKwlpbnQgdmFsID0gYW54 NzYyNV9yZWdfcmVhZChjdHgsIGNsaWVudCwgb2Zmc2V0KTsKPiArCj4gKwlyZXR1cm4gKHZhbCA8 IDApID8gdmFsIDoKPiArCQlhbng3NjI1X3JlZ193cml0ZShjdHgsIGNsaWVudCwgb2Zmc2V0LCAo dmFsICYgKG1hc2spKSk7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgYW54NzYyNV93cml0ZV9hbmRf b3Ioc3RydWN0IGFueDc2MjVfZGF0YSAqY3R4LAo+ICsJCQkJc3RydWN0IGkyY19jbGllbnQgKmNs aWVudCwKPiArCQkJCXU4IG9mZnNldCwgdTggYW5kX21hc2ssIHU4IG9yX21hc2spCj4gK3sKPiAr CWludCB2YWwgPSBhbng3NjI1X3JlZ19yZWFkKGN0eCwgY2xpZW50LCBvZmZzZXQpOwo+ICsKPiAr CXJldHVybiAodmFsIDwgMCkgPyB2YWwgOgo+ICsJCWFueDc2MjVfcmVnX3dyaXRlKGN0eCwgY2xp ZW50LCBvZmZzZXQsCj4gKwkJCQkgICh2YWwgJiBhbmRfbWFzaykgfCAob3JfbWFzaykpOwo+ICt9 Cj4gKwo+ICtzdGF0aWMgaW50IGFueDc2MjVfY29uZmlnX2JpdF9tYXRyaXgoc3RydWN0IGFueDc2 MjVfZGF0YSAqY3R4KQo+ICt7Cj4gKwlpbnQgaSwgcmV0Owo+ICsKPiArCXJldCA9IGFueDc2MjVf cmVnX3dyaXRlKGN0eCwgY3R4LT5pMmMudHhfcDJfY2xpZW50LAo+ICsJCQkJQVVESU9fQ09OVFJP TF9SRUdJU1RFUiwgMHg4MCk7Cj4gKwlmb3IgKGkgPSAwOyBpIDwgMTM7IGkrKykKICAgICAgICAg ICAgICAgICAgICAgICAgXl4KTWFnaWMgbnVtYmVyLgoKCj4gKwkJcmV0IHw9IGFueDc2MjVfcmVn X3dyaXRlKGN0eCwgY3R4LT5pMmMudHhfcDJfY2xpZW50LAo+ICsJCQkJCSBWSURFT19CSVRfTUFU UklYXzEyICsgaSwKPiArCQkJCQkgMHgxOCArIGkpOwo+ICsKPiArCXJldHVybiByZXQ7Cj4gK30K PiArCj4gK3N0YXRpYyBpbnQgYW54NzYyNV9yZWFkX2N0cmxfc3RhdHVzX3AwKHN0cnVjdCBhbng3 NjI1X2RhdGEgKmN0eCkKPiArewo+ICsJcmV0dXJuIGFueDc2MjVfcmVnX3JlYWQoY3R4LCBjdHgt PmkyYy5yeF9wMF9jbGllbnQsIEFQX0FVWF9DVFJMX1NUQVRVUyk7Cj4gK30KPiArCj4gK3N0YXRp YyBpbnQgd2FpdF9hdXhfb3BfZmluaXNoKHN0cnVjdCBhbng3NjI1X2RhdGEgKmN0eCkKPiArewo+ ICsJaW50IHZhbDsKPiArCWludCByZXQ7Cj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY3R4LT5j bGllbnQtPmRldjsKPiArCj4gKwlyZXQgPSByZWFkeF9wb2xsX3RpbWVvdXQoYW54NzYyNV9yZWFk X2N0cmxfc3RhdHVzX3AwLAo+ICsJCQkJIGN0eCwgdmFsLAo+ICsJCQkJICghKHZhbCAmIEFQX0FV WF9DVFJMX09QX0VOKSB8fCAodmFsIDwgMCkpLAo+ICsJCQkJIDIwMDAsCj4gKwkJCQkgMjAwMCAq IDE1MCk7Cj4gKwlpZiAocmV0KSB7Cj4gKwkJRFJNX0RFVl9FUlJPUihkZXYsICJhdXggb3BlcmF0 aW9uIGZhaWxlZCFcbiIpOwo+ICsJCXZhbCA9IC1FSU87CgpSZXR1cm4gZGlyZWN0bHk6CgoJaWYg KHJldCkgewoJCURSTV9ERVZfRVJST1IoZGV2LCAiYXV4IG9wZXJhdGlvbiBmYWlsZWQhXG4iKTsK CQlyZXR1cm4gcmV0OwoJfQoKCj4gKwl9IGVsc2Ugewo+ICsJCXZhbCA9IGFueDc2MjVfcmVnX3Jl YWQoY3R4LCBjdHgtPmkyYy5yeF9wMF9jbGllbnQsCj4gKwkJCQkgICAgICAgQVBfQVVYX0NUUkxf U1RBVFVTKTsKPiArCQlpZiAodmFsIDwgMCB8fCAodmFsICYgMHgwRikpIHsKPiArCQkJRFJNX0RF Vl9FUlJPUihkZXYsICJhdXggc3RhdHVzICUwMnhcbiIsIHZhbCk7Cj4gKwkJCXZhbCA9IC1FSU87 Cj4gKwkJfQo+ICsJfQo+ICsKPiArCXJldHVybiB2YWw7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQg d3JpdGVfZHBjZF9hZGRyKHN0cnVjdCBhbng3NjI1X2RhdGEgKmN0eCwKPiArCQkJICAgdTggYWRk cmgsIHU4IGFkZHJtLCB1OCBhZGRybCkKPiArewo+ICsJaW50IHJldDsKPiArCj4gKwlyZXQgPSBh bng3NjI1X3JlZ193cml0ZShjdHgsIGN0eC0+aTJjLnJ4X3AwX2NsaWVudCwKPiArCQkJCUFQX0FV WF9BRERSXzdfMCwgKHU4KWFkZHJsKTsKPiArCXJldCB8PSBhbng3NjI1X3JlZ193cml0ZShjdHgs IGN0eC0+aTJjLnJ4X3AwX2NsaWVudCwKPiArCQkJCSBBUF9BVVhfQUREUl8xNV84LCAodTgpYWRk cm0pOwo+ICsJcmV0IHw9IGFueDc2MjVfcmVnX3dyaXRlKGN0eCwgY3R4LT5pMmMucnhfcDBfY2xp ZW50LAo+ICsJCQkJIEFQX0FVWF9BRERSXzE5XzE2LCAodTgpYWRkcmgpOwo+ICsKPiArCXJldHVy biByZXQ7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgc3BfdHhfYXV4X2RwY2RyZWFkX2J5dGVzKHN0 cnVjdCBhbng3NjI1X2RhdGEgKmN0eCwKPiArCQkJCSAgICB1OCBhZGRyaCwgdTggYWRkcm0sCj4g KwkJCQkgICAgdTggYWRkcmwsIHU4IGNvdW50LAo+ICsJCQkJICAgIHU4ICpidWYpCj4gK3sKPiAr CXU4IGM7Cj4gKwlpbnQgcmV0Owo+ICsJc3RydWN0IGRldmljZSAqZGV2ID0gJmN0eC0+Y2xpZW50 LT5kZXY7Cj4gKwo+ICsJaWYgKFdBUk5fT04oY291bnQgPiAoc2l6ZV90KU1BWF9EUENEX0JVRkZF Ul9TSVpFKSkKClRoaXMgY2FzdCBpcyBub3QgcmVxdWlyZWQuCgo+ICsJCXJldHVybiAtRTJCSUc7 Cj4gKwo+ICsJLyogY29tbWFuZCBhbmQgbGVuZ3RoICovCj4gKwljID0gKChjb3VudCAtIDEpIDw8 IDQpIHwgMHgwOTsKPiArCXJldCA9IGFueDc2MjVfcmVnX3dyaXRlKGN0eCwgY3R4LT5pMmMucnhf cDBfY2xpZW50LCBBUF9BVVhfQ09NTUFORCwgYyk7Cj4gKwkvKiBhZGRyZXNzICovCj4gKwlyZXQg fD0gd3JpdGVfZHBjZF9hZGRyKGN0eCwgYWRkcmgsIGFkZHJtLCBhZGRybCk7Cj4gKwkvKiBhdXgg ZW4gKi8KPiArCXJldCB8PSBhbng3NjI1X3dyaXRlX29yKGN0eCwgY3R4LT5pMmMucnhfcDBfY2xp ZW50LCBBUF9BVVhfQ1RSTF9TVEFUVVMsCj4gKwkJCQlBUF9BVVhfQ1RSTF9PUF9FTik7Cj4gKwlp ZiAocmV0IDwgMCkgewo+ICsJCURSTV9ERVZfRVJST1IoZGV2LCAiYXV4IGVuYWJsZSBmYWlsZWQu XG4iKTsKPiArCQlyZXR1cm4gcmV0Owo+ICsJfQo+ICsKPiArCXVzbGVlcF9yYW5nZSgyMDAwLCAy MTAwKTsKPiArCj4gKwlyZXQgPSB3YWl0X2F1eF9vcF9maW5pc2goY3R4KTsKPiArCWlmIChyZXQg PCAwKSB7Cj4gKwkJRFJNX0RFVl9FUlJPUihkZXYsICJhdXggcmVhZCBmYWlsZWRcbiIpOwo+ICsJ CXJldHVybiByZXQ7Cj4gKwl9Cj4gKwo+ICsJcmV0dXJuIGFueDc2MjVfcmVnX2Jsb2NrX3JlYWQo Y3R4LCBjdHgtPmkyYy5yeF9wMF9jbGllbnQsCj4gKwkJCUFQX0FVWF9CVUZGX1NUQVJULCBjb3Vu dCwgYnVmKTsKPiArfQo+ICsKPiArc3RhdGljIGludCBhbng3NjI1X3ZpZGVvX211dGVfY29udHJv bChzdHJ1Y3QgYW54NzYyNV9kYXRhICpjdHgsCj4gKwkJCQkgICAgICB1OCBzdGF0dXMpCj4gK3sK PiArCWludCByZXQ7Cj4gKwo+ICsJaWYgKHN0YXR1cykgeyAvKiBtdXRlIG9uICovCj4gKwkJLyog c2V0IG11dGUgZmxhZyAqLwo+ICsJCXJldCA9IGFueDc2MjVfd3JpdGVfb3IoY3R4LCBjdHgtPmky Yy5yeF9wMF9jbGllbnQsCj4gKwkJCQkgICAgICAgQVBfQVZfU1RBVFVTLCBBUF9NSVBJX01VVEUp Owo+ICsJCS8qIGNsZWFyIG1pcGkgUlggZW4gKi8KPiArCQlyZXQgfD0gYW54NzYyNV93cml0ZV9h bmQoY3R4LCBjdHgtPmkyYy5yeF9wMF9jbGllbnQsCj4gKwkJCQkJIEFQX0FWX1NUQVRVUywgKHU4 KX5BUF9NSVBJX1JYX0VOKTsKPiArCX0gZWxzZSB7IC8qIG11dGUgb2ZmICovCj4gKwkJLyogY2xl YXIgbXV0ZSBmbGFnICovCj4gKwkJcmV0ID0gYW54NzYyNV93cml0ZV9hbmQoY3R4LCBjdHgtPmky Yy5yeF9wMF9jbGllbnQsCj4gKwkJCQkJQVBfQVZfU1RBVFVTLCAodTgpfkFQX01JUElfTVVURSk7 Cj4gKwkJLyogc2V0IE1JUEkgUlggRU4gKi8KPiArCQlyZXQgfD0gYW54NzYyNV93cml0ZV9vcihj dHgsIGN0eC0+aTJjLnJ4X3AwX2NsaWVudCwKPiArCQkJCQlBUF9BVl9TVEFUVVMsIEFQX01JUElf UlhfRU4pOwo+ICsJfQo+ICsKPiArCXJldHVybiByZXQ7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQg YW54NzYyNV9jb25maWdfYXVkaW9faW5wdXQoc3RydWN0IGFueDc2MjVfZGF0YSAqY3R4KQo+ICt7 Cj4gKwlpbnQgcmV0Owo+ICsKPiArCS8qIGNoYW5uZWwgbnVtICovCj4gKwlyZXQgPSBhbng3NjI1 X3JlZ193cml0ZShjdHgsIGN0eC0+aTJjLnR4X3AyX2NsaWVudCwKPiArCQkJCUFVRElPX0NIQU5O RUxfU1RBVFVTXzYsIEkyU19DSF8yIDw8IDUpOwo+ICsJLyogbGF5b3V0ICovCj4gKwkvKiBhcyBJ MlMgY2hhbm5lbCBpcyAyLCBubyBuZWVkIHRvIHNldCBsYXlvdXQgKi8KPiArCj4gKwkvKiBGUyAq Lwo+ICsJcmV0IHw9IGFueDc2MjVfd3JpdGVfYW5kX29yKGN0eCwgY3R4LT5pMmMudHhfcDJfY2xp ZW50LAo+ICsJCQkJICAgIEFVRElPX0NIQU5ORUxfU1RBVFVTXzQsCj4gKwkJCQkgICAgMHhmMCwg QVVESU9fRlNfNDhLKTsKPiArCS8qIHdvcmQgbGVuZ3RoICovCj4gKwlyZXQgfD0gYW54NzYyNV93 cml0ZV9hbmRfb3IoY3R4LCBjdHgtPmkyYy50eF9wMl9jbGllbnQsCj4gKwkJCQkgICAgQVVESU9f Q0hBTk5FTF9TVEFUVVNfNSwKPiArCQkJCSAgICAweGYwLCBBVURJT19XX0xFTl8yNF8yNE1BWCk7 Cj4gKwkvKiBJMlMgKi8KPiArCXJldCB8PSBhbng3NjI1X3dyaXRlX29yKGN0eCwgY3R4LT5pMmMu dHhfcDJfY2xpZW50LAo+ICsJCQkJQVVESU9fQ0hBTk5FTF9TVEFUVVNfNiwgSTJTX1NMQVZFX01P REUpOwo+ICsJcmV0IHw9IGFueDc2MjVfd3JpdGVfYW5kKGN0eCwgY3R4LT5pMmMudHhfcDJfY2xp ZW50LAo+ICsJCQkJIEFVRElPX0NPTlRST0xfUkVHSVNURVIsIH5URE1fVElNSU5HX01PREUpOwo+ ICsJLyogYXVkaW8gY2hhbmdlIGZsYWcgKi8KPiArCXJldCB8PSBhbng3NjI1X3dyaXRlX29yKGN0 eCwgY3R4LT5pMmMucnhfcDBfY2xpZW50LAo+ICsJCQkJQVBfQVZfU1RBVFVTLCBBUF9BVURJT19D SEcpOwo+ICsKPiArCWlmIChyZXQgPCAwKQo+ICsJCURSTV9FUlJPUigiZmFpbGVkIHRvIGNvbmZp ZyBhdWRpby5cbiIpOwo+ICsKPiArCXJldHVybiByZXQ7Cj4gK30KPiArCj4gKy8qIHJlZHVjdGlv biBvZiBmcmFjdGlvbiBhL2IgKi8KPiArc3RhdGljIHZvaWQgYW54NzYyNV9yZWR1Y3Rpb25fb2Zf YV9mcmFjdGlvbih1bnNpZ25lZCBsb25nICphLCB1bnNpZ25lZCBsb25nICpiKQo+ICt7Cj4gKwl1 bnNpZ25lZCBsb25nIGdjZF9udW07Cj4gKwl1bnNpZ25lZCBsb25nIHRtcF9hLCB0bXBfYjsKPiAr CXUzMiBpID0gMTsKPiArCj4gKwlnY2RfbnVtID0gZ2NkKCphLCAqYik7Cj4gKwkqYSAvPSBnY2Rf bnVtOwo+ICsJKmIgLz0gZ2NkX251bTsKPiArCj4gKwl0bXBfYSA9ICphOwo+ICsJdG1wX2IgPSAq YjsKPiArCj4gKwl3aGlsZSAoKCphID4gTUFYX1VOU0lHTkVEXzI0QklUKSB8fCAoKmIgPiBNQVhf VU5TSUdORURfMjRCSVQpKSB7Cj4gKwkJaSsrOwo+ICsJCSphID0gdG1wX2EgLyBpOwo+ICsJCSpi ID0gdG1wX2IgLyBpOwo+ICsJfQo+ICsKPiArCS8qCj4gKwkgKiBpbiB0aGUgZW5kLCBtYWtlIGEs IGIgbGFyZ2VyIHRvIGhhdmUgaGlnaGVyIE9ERkMgUExMCj4gKwkgKiBvdXRwdXQgZnJlcXVlbmN5 IGFjY3VyYWN5Cj4gKwkgKi8KPiArCXdoaWxlICgoKmEgPCBNQVhfVU5TSUdORURfMjRCSVQpICYm ICgqYiA8IE1BWF9VTlNJR05FRF8yNEJJVCkpIHsKPiArCQkqYSA8PD0gMTsKPiArCQkqYiA8PD0g MTsKPiArCX0KPiArCj4gKwkqYSA+Pj0gMTsKPiArCSpiID4+PSAxOwo+ICt9Cj4gKwo+ICtzdGF0 aWMgaW50IGFueDc2MjVfY2FsY3VsYXRlX21fbih1MzIgcGl4ZWxjbG9jaywKPiArCQkJCSB1bnNp Z25lZCBsb25nICptLAo+ICsJCQkJIHVuc2lnbmVkIGxvbmcgKm4sCj4gKwkJCQkgdTggKnBvc3Rf ZGl2aWRlcikKPiArewo+ICsJaWYgKHBpeGVsY2xvY2sgPiBQTExfT1VUX0ZSRVFfQUJTX01BWCAv IFBPU1RfRElWSURFUl9NSU4pIHsKPiArCQkvKiBwaXhlbCBjbG9jayBmcmVxdWVuY3kgaXMgdG9v IGhpZ2ggKi8KPiArCQlEUk1fRVJST1IoInBpeGVsY2xvY2sgdG9vIGhpZ2gsIGFjdCglZCksIG1h eGltdW0oJWx1KVxuIiwKPiArCQkJICBwaXhlbGNsb2NrLAo+ICsJCQkgIFBMTF9PVVRfRlJFUV9B QlNfTUFYIC8gUE9TVF9ESVZJREVSX01JTik7Cj4gKwkJcmV0dXJuIDE7CgpSZXR1cm5pbmcgb25l IG9uIGVycm9yIGlzIHVnbHkuICByZXR1cm4gLUVJTlZBTDsKCj4gKwl9Cj4gKwo+ICsJaWYgKHBp eGVsY2xvY2sgPCBQTExfT1VUX0ZSRVFfQUJTX01JTiAvIFBPU1RfRElWSURFUl9NQVgpIHsKPiAr CQkvKiBwaXhlbCBjbG9jayBmcmVxdWVuY3kgaXMgdG9vIGxvdyAqLwo+ICsJCURSTV9FUlJPUigi cGl4ZWxjbG9jayB0b28gbG93LCBhY3QoJWQpLCBtYXhpbXVtKCVsdSlcbiIsCj4gKwkJCSAgcGl4 ZWxjbG9jaywKPiArCQkJICBQTExfT1VUX0ZSRVFfQUJTX01JTiAvIFBPU1RfRElWSURFUl9NQVgp Owo+ICsJCXJldHVybiAxOwo+ICsJfQo+ICsKPiArCSpwb3N0X2RpdmlkZXIgPSAxOwo+ICsKPiAr CWZvciAoKnBvc3RfZGl2aWRlciA9IDE7Cj4gKwkJcGl4ZWxjbG9jayA8IChQTExfT1VUX0ZSRVFf TUlOIC8gKCpwb3N0X2RpdmlkZXIpKTspCj4gKwkJKnBvc3RfZGl2aWRlciArPSAxOwo+ICsKPiAr CWlmICgqcG9zdF9kaXZpZGVyID4gUE9TVF9ESVZJREVSX01BWCkgewo+ICsJCWZvciAoKnBvc3Rf ZGl2aWRlciA9IDE7Cj4gKwkJCShwaXhlbGNsb2NrIDwKPiArCQkJIChQTExfT1VUX0ZSRVFfQUJT X01JTiAvICgqcG9zdF9kaXZpZGVyKSkpOykKPiArCQkJKnBvc3RfZGl2aWRlciArPSAxOwo+ICsK PiArCQlpZiAoKnBvc3RfZGl2aWRlciA+IFBPU1RfRElWSURFUl9NQVgpIHsKPiArCQkJRFJNX0VS Uk9SKCJjYW5ub3QgZmluZCBwcm9wZXJ0eSBwb3N0X2RpdmlkZXIoJWQpXG4iLAo+ICsJCQkJICAq cG9zdF9kaXZpZGVyKTsKPiArCQkJcmV0dXJuIDE7Cj4gKwkJfQo+ICsJfQo+ICsKPiArCS8qIHBh dGNoIHRvIGltcHJvdmUgdGhlIGFjY3VyYWN5ICovCj4gKwlpZiAoKnBvc3RfZGl2aWRlciA9PSA3 KSB7Cj4gKwkJLyogMjcsMDAwLDAwMCBpcyBub3QgZGl2aXNpYmxlIGJ5IDcgKi8KPiArCQkqcG9z dF9kaXZpZGVyID0gODsKPiArCX0gZWxzZSBpZiAoKnBvc3RfZGl2aWRlciA9PSAxMSkgewo+ICsJ CS8qIDI3LDAwMCwwMDAgaXMgbm90IGRpdmlzaWJsZSBieSAxMSAqLwo+ICsJCSpwb3N0X2Rpdmlk ZXIgPSAxMjsKPiArCX0gZWxzZSBpZiAoKCpwb3N0X2RpdmlkZXIgPT0gMTMpIHx8ICgqcG9zdF9k aXZpZGVyID09IDE0KSkgewo+ICsJCS8qMjcsMDAwLDAwMCBpcyBub3QgZGl2aXNpYmxlIGJ5IDEz IG9yIDE0Ki8KPiArCQkqcG9zdF9kaXZpZGVyID0gMTU7Cj4gKwl9Cj4gKwo+ICsJaWYgKHBpeGVs Y2xvY2sgKiAoKnBvc3RfZGl2aWRlcikgPiBQTExfT1VUX0ZSRVFfQUJTX01BWCkgewo+ICsJCURS TV9FUlJPUigiYWN0IGNsb2NrKCV1KSBsYXJnZSB0aGFuIG1heGltdW0oJWx1KVxuIiwKPiArCQkJ ICBwaXhlbGNsb2NrICogKCpwb3N0X2RpdmlkZXIpLAo+ICsJCQkgIFBMTF9PVVRfRlJFUV9BQlNf TUFYKTsKPiArCQlyZXR1cm4gMTsKPiArCX0KPiArCj4gKwkqbSA9IHBpeGVsY2xvY2s7Cj4gKwkq biA9IFhUQUxfRlJRIC8gKCpwb3N0X2RpdmlkZXIpOwo+ICsKPiArCWFueDc2MjVfcmVkdWN0aW9u X29mX2FfZnJhY3Rpb24obSwgbik7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRp YyBpbnQgYW54NzYyNV9vZGZjX2NvbmZpZyhzdHJ1Y3QgYW54NzYyNV9kYXRhICpjdHgsCj4gKwkJ CSAgICAgICB1OCBwb3N0X2RpdmlkZXIpCj4gK3sKPiArCWludCByZXQ7Cj4gKwo+ICsJLyogY29u ZmlnIGlucHV0IHJlZmVyZW5jZSBjbG9jayBmcmVxdWVuY3kgMjdNSHovMTkuMk1IeiAqLwo+ICsJ cmV0ID0gYW54NzYyNV93cml0ZV9hbmQoY3R4LCBjdHgtPmkyYy5yeF9wMV9jbGllbnQsIE1JUElf RElHSVRBTF9QTExfMTYsCj4gKwkJCQl+KFJFRl9DTEtfMjcwMDBLSFogPDwgTUlQSV9GUkVGX0Rf SU5EKSk7Cj4gKwlyZXQgfD0gYW54NzYyNV93cml0ZV9vcihjdHgsIGN0eC0+aTJjLnJ4X3AxX2Ns aWVudCwgTUlQSV9ESUdJVEFMX1BMTF8xNiwKPiArCQkJCShSRUZfQ0xLXzI3MDAwS0haIDw8IE1J UElfRlJFRl9EX0lORCkpOwo+ICsJLyogcG9zdCBkaXZpZGVyICovCj4gKwlyZXQgfD0gYW54NzYy NV93cml0ZV9hbmQoY3R4LCBjdHgtPmkyYy5yeF9wMV9jbGllbnQsCj4gKwkJCQkgTUlQSV9ESUdJ VEFMX1BMTF84LCAweDBmKTsKPiArCXJldCB8PSBhbng3NjI1X3dyaXRlX29yKGN0eCwgY3R4LT5p MmMucnhfcDFfY2xpZW50LCBNSVBJX0RJR0lUQUxfUExMXzgsCj4gKwkJCQlwb3N0X2RpdmlkZXIg PDwgNCk7Cj4gKwo+ICsJLyogYWRkIHBhdGNoIGZvciBNSVMyLTEyNSAoNXBjcyBBTlg3NjI1IGZh aWwgQVRFIE1CSVNUIHRlc3QpICovCj4gKwlyZXQgfD0gYW54NzYyNV93cml0ZV9hbmQoY3R4LCBj dHgtPmkyYy5yeF9wMV9jbGllbnQsIE1JUElfRElHSVRBTF9QTExfNywKPiArCQkJCSB+TUlQSV9Q TExfVkNPX1RVTkVfUkVHX1ZBTCk7Cj4gKwo+ICsJLyogcmVzZXQgT0RGQyBQTEwgKi8KPiArCXJl dCB8PSBhbng3NjI1X3dyaXRlX2FuZChjdHgsIGN0eC0+aTJjLnJ4X3AxX2NsaWVudCwgTUlQSV9E SUdJVEFMX1BMTF83LAo+ICsJCQkJIH5NSVBJX1BMTF9SRVNFVF9OKTsKPiArCXJldCB8PSBhbng3 NjI1X3dyaXRlX29yKGN0eCwgY3R4LT5pMmMucnhfcDFfY2xpZW50LCBNSVBJX0RJR0lUQUxfUExM XzcsCj4gKwkJCQlNSVBJX1BMTF9SRVNFVF9OKTsKPiArCj4gKwlpZiAocmV0IDwgMCkKPiArCQlE Uk1fRVJST1IoIklPIGVycm9yLlxuIik7Cj4gKwo+ICsJcmV0dXJuIHJldDsKPiArfQo+ICsKPiAr c3RhdGljIGludCBhbng3NjI1X2RzaV92aWRlb190aW1pbmdfY29uZmlnKHN0cnVjdCBhbng3NjI1 X2RhdGEgKmN0eCkKPiArewo+ICsJc3RydWN0IGRldmljZSAqZGV2ID0gJmN0eC0+Y2xpZW50LT5k ZXY7Cj4gKwl1bnNpZ25lZCBsb25nIG0sIG47Cj4gKwl1MTYgaHRvdGFsOwo+ICsJaW50IHJldDsK PiArCXU4IHBvc3RfZGl2aWRlciA9IDA7Cj4gKwo+ICsJcmV0ID0gYW54NzYyNV9jYWxjdWxhdGVf bV9uKGN0eC0+ZHQucGl4ZWxjbG9jay5taW4gKiAxMDAwLAo+ICsJCQkJICAgICZtLCAmbiwgJnBv c3RfZGl2aWRlcik7Cj4gKwo+ICsJaWYgKHJldCAhPSAwKSB7Cj4gKwkJRFJNX0VSUk9SKCJjYW5u b3QgZ2V0IHByb3BlcnR5IG0gbiB2YWx1ZS5cbiIpOwo+ICsJCXJldHVybiAtRUlOVkFMOwo+ICsJ fQoKCWlmIChyZXQpCgkJcmV0dXJuIHJldDsKCj4gKwo+ICsJRFJNX0RFVl9ERUJVR19EUklWRVIo ZGV2LCAiY29tcHV0ZSBNKCVsdSksIE4oJWx1KSwgZGl2aWRlciglZCkuXG4iLAo+ICsJCQkgICAg IG0sIG4sIHBvc3RfZGl2aWRlcik7Cj4gKwo+ICsJLyogY29uZmlndXJlIHBpeGVsIGNsb2NrICov Cj4gKwlyZXQgPSBhbng3NjI1X3JlZ193cml0ZShjdHgsIGN0eC0+aTJjLnJ4X3AwX2NsaWVudCwg UElYRUxfQ0xPQ0tfTCwKPiArCQkJCShjdHgtPmR0LnBpeGVsY2xvY2subWluIC8gMTAwMCkgJiAw eEZGKTsKPiArCXJldCB8PSBhbng3NjI1X3JlZ193cml0ZShjdHgsIGN0eC0+aTJjLnJ4X3AwX2Ns aWVudCwgUElYRUxfQ0xPQ0tfSCwKPiArCQkJCSAoY3R4LT5kdC5waXhlbGNsb2NrLm1pbiAvIDEw MDApID4+IDgpOwo+ICsJLyogbGFuZSBjb3VudCAqLwo+ICsJcmV0IHw9IGFueDc2MjVfd3JpdGVf YW5kKGN0eCwgY3R4LT5pMmMucnhfcDFfY2xpZW50LAo+ICsJCQlNSVBJX0xBTkVfQ1RSTF8wLCAw eGZjKTsKPiArCWlmIChjdHgtPnBkYXRhLmRzaV9sYW5lcykKPiArCQlyZXQgfD0gYW54NzYyNV93 cml0ZV9vcihjdHgsIGN0eC0+aTJjLnJ4X3AxX2NsaWVudCwKPiArCQkJCQlNSVBJX0xBTkVfQ1RS TF8wLAo+ICsJCQkJCShjdHgtPnBkYXRhLmRzaV9sYW5lcyAtIDEpKTsKPiArCWVsc2UKPiArCQly ZXQgfD0gYW54NzYyNV93cml0ZV9vcihjdHgsIGN0eC0+aTJjLnJ4X3AxX2NsaWVudCwKPiArCQkJ CQlNSVBJX0xBTkVfQ1RSTF8wLCAzKTsKPiArCj4gKwkvKiBIdG90YWwgKi8KPiArCWh0b3RhbCA9 IGN0eC0+ZHQuaGFjdGl2ZS5taW4gKyBjdHgtPmR0Lmhmcm9udF9wb3JjaC5taW4gKwo+ICsJCWN0 eC0+ZHQuaGJhY2tfcG9yY2gubWluICsgY3R4LT5kdC5oc3luY19sZW4ubWluOwo+ICsJcmV0IHw9 IGFueDc2MjVfcmVnX3dyaXRlKGN0eCwgY3R4LT5pMmMucnhfcDJfY2xpZW50LAo+ICsJCQlIT1JJ Wk9OVEFMX1RPVEFMX1BJWEVMU19MLCBodG90YWwgJiAweEZGKTsKPiArCXJldCB8PSBhbng3NjI1 X3JlZ193cml0ZShjdHgsIGN0eC0+aTJjLnJ4X3AyX2NsaWVudCwKPiArCQkJSE9SSVpPTlRBTF9U T1RBTF9QSVhFTFNfSCwgaHRvdGFsID4+IDgpOwo+ICsJLyogSGFjdGl2ZSAqLwo+ICsJcmV0IHw9 IGFueDc2MjVfcmVnX3dyaXRlKGN0eCwgY3R4LT5pMmMucnhfcDJfY2xpZW50LAo+ICsJCQlIT1JJ Wk9OVEFMX0FDVElWRV9QSVhFTFNfTCwgY3R4LT5kdC5oYWN0aXZlLm1pbiAmIDB4RkYpOwo+ICsJ cmV0IHw9IGFueDc2MjVfcmVnX3dyaXRlKGN0eCwgY3R4LT5pMmMucnhfcDJfY2xpZW50LAo+ICsJ CQlIT1JJWk9OVEFMX0FDVElWRV9QSVhFTFNfSCwgY3R4LT5kdC5oYWN0aXZlLm1pbiA+PiA4KTsK PiArCS8qIEhGUCAqLwo+ICsJcmV0IHw9IGFueDc2MjVfcmVnX3dyaXRlKGN0eCwgY3R4LT5pMmMu cnhfcDJfY2xpZW50LAo+ICsJCQlIT1JJWk9OVEFMX0ZST05UX1BPUkNIX0wsIGN0eC0+ZHQuaGZy b250X3BvcmNoLm1pbik7Cj4gKwlyZXQgfD0gYW54NzYyNV9yZWdfd3JpdGUoY3R4LCBjdHgtPmky Yy5yeF9wMl9jbGllbnQsCj4gKwkJCUhPUklaT05UQUxfRlJPTlRfUE9SQ0hfSCwKPiArCQkJY3R4 LT5kdC5oZnJvbnRfcG9yY2gubWluID4+IDgpOwo+ICsJLyogSFdTICovCj4gKwlyZXQgfD0gYW54 NzYyNV9yZWdfd3JpdGUoY3R4LCBjdHgtPmkyYy5yeF9wMl9jbGllbnQsCj4gKwkJCUhPUklaT05U QUxfU1lOQ19XSURUSF9MLCBjdHgtPmR0LmhzeW5jX2xlbi5taW4pOwo+ICsJcmV0IHw9IGFueDc2 MjVfcmVnX3dyaXRlKGN0eCwgY3R4LT5pMmMucnhfcDJfY2xpZW50LAo+ICsJCQlIT1JJWk9OVEFM X1NZTkNfV0lEVEhfSCwgY3R4LT5kdC5oc3luY19sZW4ubWluID4+IDgpOwo+ICsJLyogSEJQICov Cj4gKwlyZXQgfD0gYW54NzYyNV9yZWdfd3JpdGUoY3R4LCBjdHgtPmkyYy5yeF9wMl9jbGllbnQs Cj4gKwkJCUhPUklaT05UQUxfQkFDS19QT1JDSF9MLCBjdHgtPmR0LmhiYWNrX3BvcmNoLm1pbik7 Cj4gKwlyZXQgfD0gYW54NzYyNV9yZWdfd3JpdGUoY3R4LCBjdHgtPmkyYy5yeF9wMl9jbGllbnQs Cj4gKwkJCUhPUklaT05UQUxfQkFDS19QT1JDSF9ILCBjdHgtPmR0LmhiYWNrX3BvcmNoLm1pbiA+ PiA4KTsKPiArCS8qIFZhY3RpdmUgKi8KPiArCXJldCB8PSBhbng3NjI1X3JlZ193cml0ZShjdHgs IGN0eC0+aTJjLnJ4X3AyX2NsaWVudCwgQUNUSVZFX0xJTkVTX0wsCj4gKwkJCWN0eC0+ZHQudmFj dGl2ZS5taW4pOwo+ICsJcmV0IHw9IGFueDc2MjVfcmVnX3dyaXRlKGN0eCwgY3R4LT5pMmMucnhf cDJfY2xpZW50LCBBQ1RJVkVfTElORVNfSCwKPiArCQkJY3R4LT5kdC52YWN0aXZlLm1pbiA+PiA4 KTsKPiArCS8qIFZGUCAqLwo+ICsJcmV0IHw9IGFueDc2MjVfcmVnX3dyaXRlKGN0eCwgY3R4LT5p MmMucnhfcDJfY2xpZW50LAo+ICsJCQlWRVJUSUNBTF9GUk9OVF9QT1JDSCwgY3R4LT5kdC52ZnJv bnRfcG9yY2gubWluKTsKPiArCS8qIFZXUyAqLwo+ICsJcmV0IHw9IGFueDc2MjVfcmVnX3dyaXRl KGN0eCwgY3R4LT5pMmMucnhfcDJfY2xpZW50LAo+ICsJCQlWRVJUSUNBTF9TWU5DX1dJRFRILCBj dHgtPmR0LnZzeW5jX2xlbi5taW4pOwo+ICsJLyogVkJQICovCj4gKwlyZXQgfD0gYW54NzYyNV9y ZWdfd3JpdGUoY3R4LCBjdHgtPmkyYy5yeF9wMl9jbGllbnQsCj4gKwkJCVZFUlRJQ0FMX0JBQ0tf UE9SQ0gsIGN0eC0+ZHQudmJhY2tfcG9yY2gubWluKTsKPiArCS8qIE0gdmFsdWUgKi8KPiArCXJl dCB8PSBhbng3NjI1X3JlZ193cml0ZShjdHgsIGN0eC0+aTJjLnJ4X3AxX2NsaWVudCwKPiArCQkJ TUlQSV9QTExfTV9OVU1fMjNfMTYsIChtID4+IDE2KSAmIDB4ZmYpOwo+ICsJcmV0IHw9IGFueDc2 MjVfcmVnX3dyaXRlKGN0eCwgY3R4LT5pMmMucnhfcDFfY2xpZW50LAo+ICsJCQlNSVBJX1BMTF9N X05VTV8xNV84LCAobSA+PiA4KSAmIDB4ZmYpOwo+ICsJcmV0IHw9IGFueDc2MjVfcmVnX3dyaXRl KGN0eCwgY3R4LT5pMmMucnhfcDFfY2xpZW50LAo+ICsJCQlNSVBJX1BMTF9NX05VTV83XzAsICht ICYgMHhmZikpOwo+ICsJLyogTiB2YWx1ZSAqLwo+ICsJcmV0IHw9IGFueDc2MjVfcmVnX3dyaXRl KGN0eCwgY3R4LT5pMmMucnhfcDFfY2xpZW50LAo+ICsJCQlNSVBJX1BMTF9OX05VTV8yM18xNiwg KG4gPj4gMTYpICYgMHhmZik7Cj4gKwlyZXQgfD0gYW54NzYyNV9yZWdfd3JpdGUoY3R4LCBjdHgt PmkyYy5yeF9wMV9jbGllbnQsCj4gKwkJCU1JUElfUExMX05fTlVNXzE1XzgsIChuID4+IDgpICYg MHhmZik7Cj4gKwlyZXQgfD0gYW54NzYyNV9yZWdfd3JpdGUoY3R4LCBjdHgtPmkyYy5yeF9wMV9j bGllbnQsIE1JUElfUExMX05fTlVNXzdfMCwKPiArCQkJKG4gJiAweGZmKSk7Cj4gKwkvKiBkaWZm ICovCj4gKwlyZXQgfD0gYW54NzYyNV9yZWdfd3JpdGUoY3R4LCBjdHgtPmkyYy5yeF9wMV9jbGll bnQsCj4gKwkJCU1JUElfRElHSVRBTF9BREpfMSwgMHgzNyk7Cj4gKwo+ICsJcmV0IHw9IGFueDc2 MjVfb2RmY19jb25maWcoY3R4LCBwb3N0X2RpdmlkZXIgLSAxKTsKPiArCj4gKwlpZiAocmV0IDwg MCkKPiArCQlEUk1fRVJST1IoIm1pcGkgZHNpIHNldHVwIElPIGVycm9yLlxuIik7Cj4gKwo+ICsJ cmV0dXJuIHJldDsKPiArfQo+ICsKPiArc3RhdGljIGludCBhbng3NjI1X3N3YXBfZHNpX2xhbmUz KHN0cnVjdCBhbng3NjI1X2RhdGEgKmN0eCkKPiArewo+ICsJaW50IHZhbDsKPiArCj4gKwkvKiBz d2FwIE1JUEktRFNJIGRhdGEgbGFuZSAzIFAgYW5kIE4gKi8KPiArCXZhbCA9IGFueDc2MjVfcmVn X3JlYWQoY3R4LCBjdHgtPmkyYy5yeF9wMV9jbGllbnQsIE1JUElfU1dBUCk7Cj4gKwlpZiAodmFs IDwgMCkgewo+ICsJCURSTV9FUlJPUigiSU8gZXJyb3IgOiBhY2Nlc3MgTUlQSV9TV0FQLlxuIik7 Cj4gKwkJcmV0dXJuIC1FSU87Cj4gKwl9Cj4gKwo+ICsJdmFsIHw9ICgxIDw8IE1JUElfU1dBUF9D SDMpOwo+ICsJcmV0dXJuIGFueDc2MjVfcmVnX3dyaXRlKGN0eCwgY3R4LT5pMmMucnhfcDFfY2xp ZW50LCBNSVBJX1NXQVAsIHZhbCk7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgYW54NzYyNV9hcGlf ZHNpX2NvbmZpZyhzdHJ1Y3QgYW54NzYyNV9kYXRhICpjdHgpCj4gKwo+ICt7Cj4gKwlpbnQgdmFs LCByZXQ7Cj4gKwo+ICsJLyogc3dhcCBNSVBJLURTSSBkYXRhIGxhbmUgMyBQIGFuZCBOICovCj4g KwlyZXQgPSBhbng3NjI1X3N3YXBfZHNpX2xhbmUzKGN0eCk7Cj4gKwlpZiAocmV0IDwgMCkgewo+ ICsJCURSTV9FUlJPUigiSU8gZXJyb3IgOiBzd2FwIGRzaSBsYW5lIDMgZmFpbGVkLlxuIik7Cj4g KwkJcmV0dXJuIHJldDsKPiArCX0KPiArCj4gKwkvKiBEU0kgY2xvY2sgc2V0dGluZ3MgKi8KPiAr CXZhbCA9ICgwIDw8IE1JUElfSFNfUFdEX0NMSykJCXwKPiArCQkoMCA8PCBNSVBJX0hTX1JUX0NM SykJCXwKPiArCQkoMCA8PCBNSVBJX1BEX0NMSykJCXwKPiArCQkoMSA8PCBNSVBJX0NMS19SVF9N QU5VQUxfUERfRU4pCXwKPiArCQkoMSA8PCBNSVBJX0NMS19IU19NQU5VQUxfUERfRU4pCXwKPiAr CQkoMCA8PCBNSVBJX0NMS19ERVRfREVUX0JZUEFTUykJfAo+ICsJCSgwIDw8IE1JUElfQ0xLX01J U1NfQ1RSTCkJfAo+ICsJCSgwIDw8IE1JUElfUERfTFBUWF9DSF9NQU5VQUxfUERfRU4pOwo+ICsJ cmV0ID0gYW54NzYyNV9yZWdfd3JpdGUoY3R4LCBjdHgtPmkyYy5yeF9wMV9jbGllbnQsCj4gKwkJ CQlNSVBJX1BIWV9DT05UUk9MXzMsIHZhbCk7Cj4gKwo+ICsJLyoKPiArCSAqIERlY3JlYXNlZCBI UyBwcmVwYXJlIHRpbWluZyBkZWxheSBmcm9tIDE2MG5zIHRvIDgwbnMgd29yayB3aXRoCj4gKwkg KiAgICAgYSkgRHJhZ29uIGJvYXJkIDgxMCBzZXJpZXMgKFF1YWxjb21tIEFQKQo+ICsJICogICAg IGIpIE1vdmluZyBQaXhlbCBEU0kgc291cmNlIChQRzNBIHBhdHRlcm4gZ2VuZXJhdG9yICsKPiAr CSAqCVAzMzIgRC1QSFkgUHJvYmUpIGRlZmF1bHQgRC1QSFkgdGltaW5nCj4gKwkgKgk1bnMvc3Rl cAo+ICsJICovCj4gKwlyZXQgfD0gYW54NzYyNV9yZWdfd3JpdGUoY3R4LCBjdHgtPmkyYy5yeF9w MV9jbGllbnQsCj4gKwkJCQkgTUlQSV9USU1FX0hTX1BSUFIsIDB4MTApOwo+ICsKPiArCS8qIGVu YWJsZSBEU0kgbW9kZSovCj4gKwlyZXQgfD0gYW54NzYyNV93cml0ZV9vcihjdHgsIGN0eC0+aTJj LnJ4X3AxX2NsaWVudCwgTUlQSV9ESUdJVEFMX1BMTF8xOCwKPiArCQkJCVNFTEVDVF9EU0kgPDwg TUlQSV9EUElfU0VMRUNUKTsKPiArCj4gKwlyZXQgfD0gYW54NzYyNV9kc2lfdmlkZW9fdGltaW5n X2NvbmZpZyhjdHgpOwo+ICsJaWYgKHJldCA8IDApIHsKPiArCQlEUk1fRVJST1IoImRzaSB2aWRl byB0aW1pbmcgY29uZmlnIGZhaWxlZFxuIik7Cj4gKwkJcmV0dXJuIHJldDsKPiArCX0KPiArCj4g KwkvKiB0b2dnbGUgbSwgbiByZWFkeSAqLwo+ICsJcmV0ID0gYW54NzYyNV93cml0ZV9hbmQoY3R4 LCBjdHgtPmkyYy5yeF9wMV9jbGllbnQsIE1JUElfRElHSVRBTF9QTExfNiwKPiArCQkJCX4oTUlQ SV9NX05VTV9SRUFEWSB8IE1JUElfTl9OVU1fUkVBRFkpKTsKPiArCXVzbGVlcF9yYW5nZSgxMDAw LCAxMTAwKTsKPiArCXJldCB8PSBhbng3NjI1X3dyaXRlX29yKGN0eCwgY3R4LT5pMmMucnhfcDFf Y2xpZW50LCBNSVBJX0RJR0lUQUxfUExMXzYsCj4gKwkJCQlNSVBJX01fTlVNX1JFQURZIHwgTUlQ SV9OX05VTV9SRUFEWSk7Cj4gKwo+ICsJLyogY29uZmlndXJlIGludGVnZXIgc3RhYmxlIHJlZ2lz dGVyICovCj4gKwlyZXQgfD0gYW54NzYyNV9yZWdfd3JpdGUoY3R4LCBjdHgtPmkyYy5yeF9wMV9j bGllbnQsCj4gKwkJCQkgTUlQSV9WSURFT19TVEFCTEVfQ05ULCAweDAyKTsKPiArCS8qIHBvd2Vy IG9uIE1JUEkgUlggKi8KPiArCXJldCB8PSBhbng3NjI1X3JlZ193cml0ZShjdHgsIGN0eC0+aTJj LnJ4X3AxX2NsaWVudCwKPiArCQkJCSBNSVBJX0xBTkVfQ1RSTF8xMCwgMHgwMCk7Cj4gKwlyZXQg fD0gYW54NzYyNV9yZWdfd3JpdGUoY3R4LCBjdHgtPmkyYy5yeF9wMV9jbGllbnQsCj4gKwkJCQkg TUlQSV9MQU5FX0NUUkxfMTAsIDB4ODApOwo+ICsKPiArCWlmIChyZXQgPCAwKQo+ICsJCURSTV9F UlJPUigiSU8gZXJyb3IgOiBtaXBpIGRzaSBlbmFibGUgaW5pdCBmYWlsZWQuXG4iKTsKPiArCj4g KwlyZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGFueDc2MjVfZHNpX2NvbmZpZyhz dHJ1Y3QgYW54NzYyNV9kYXRhICpjdHgpCj4gK3sKPiArCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZj dHgtPmNsaWVudC0+ZGV2Owo+ICsJaW50IHJldDsKPiArCj4gKwlEUk1fREVWX0RFQlVHX0RSSVZF UihkZXYsICJjb25maWcgZHNpLlxuIik7Cj4gKwo+ICsJLyogRFNDIGRpc2FibGUgKi8KPiArCXJl dCA9IGFueDc2MjVfd3JpdGVfYW5kKGN0eCwgY3R4LT5pMmMucnhfcDBfY2xpZW50LAo+ICsJCQkJ Ul9EU0NfQ1RSTF8wLCB+RFNDX0VOKTsKPiArCj4gKwlyZXQgfD0gYW54NzYyNV9hcGlfZHNpX2Nv bmZpZyhjdHgpOwo+ICsKPiArCWlmIChyZXQgPCAwKSB7Cj4gKwkJRFJNX0VSUk9SKCJJTyBlcnJv ciA6IGFwaSBkc2kgY29uZmlnIGVycm9yLlxuIik7Cj4gKwl9IGVsc2Ugewo+ICsJCS8qIHNldCBN SVBJIFJYIEVOICovCj4gKwkJcmV0ID0gYW54NzYyNV93cml0ZV9vcihjdHgsIGN0eC0+aTJjLnJ4 X3AwX2NsaWVudCwKPiArCQkJCSAgICAgICBBUF9BVl9TVEFUVVMsIEFQX01JUElfUlhfRU4pOwo+ ICsJCS8qIGNsZWFyIG11dGUgZmxhZyAqLwo+ICsJCXJldCB8PSBhbng3NjI1X3dyaXRlX2FuZChj dHgsIGN0eC0+aTJjLnJ4X3AwX2NsaWVudCwKPiArCQkJCQkgQVBfQVZfU1RBVFVTLCAodTgpfkFQ X01JUElfTVVURSk7Cj4gKwkJaWYgKHJldCA8IDApCj4gKwkJCURSTV9FUlJPUigiSU8gZXJyb3Ig OiBlbmFibGUgbWlwaSByeCBmYWlsZWQuXG4iKTsKPiArCQllbHNlCj4gKwkJCURSTV9ERVZfREVC VUdfRFJJVkVSKGRldiwgInN1Y2Nlc3MgdG8gY29uZmlnIERTSVxuIik7Cj4gKwl9Cj4gKwo+ICsJ cmV0dXJuIHJldDsKPiArfQo+ICsKPiArc3RhdGljIGludCBhbng3NjI1X2FwaV9kcGlfY29uZmln KHN0cnVjdCBhbng3NjI1X2RhdGEgKmN0eCkKPiArewo+ICsJdTE2IGZyZXEgPSBjdHgtPmR0LnBp eGVsY2xvY2subWluIC8gMTAwMDsKPiArCWludCByZXQ7Cj4gKwo+ICsJLyogY29uZmlndXJlIHBp eGVsIGNsb2NrICovCj4gKwlyZXQgPSBhbng3NjI1X3JlZ193cml0ZShjdHgsIGN0eC0+aTJjLnJ4 X3AwX2NsaWVudCwKPiArCQkJCVBJWEVMX0NMT0NLX0wsIGZyZXEgJiAweEZGKTsKPiArCXJldCB8 PSBhbng3NjI1X3JlZ193cml0ZShjdHgsIGN0eC0+aTJjLnJ4X3AwX2NsaWVudCwKPiArCQkJCSBQ SVhFTF9DTE9DS19ILCAoZnJlcSA+PiA4KSk7Cj4gKwo+ICsJLyogc2V0IERQSSBtb2RlICovCj4g KwkvKiBzZXQgdG8gRFBJIFBMTCBtb2R1bGUgc2VsICovCj4gKwlyZXQgfD0gYW54NzYyNV9yZWdf d3JpdGUoY3R4LCBjdHgtPmkyYy5yeF9wMV9jbGllbnQsCj4gKwkJCQkgTUlQSV9ESUdJVEFMX1BM TF85LCAweDIwKTsKPiArCS8qIHBvd2VyIGRvd24gTUlQSSAqLwo+ICsJcmV0IHw9IGFueDc2MjVf cmVnX3dyaXRlKGN0eCwgY3R4LT5pMmMucnhfcDFfY2xpZW50LAo+ICsJCQkJIE1JUElfTEFORV9D VFJMXzEwLCAweDA4KTsKPiArCS8qIGVuYWJsZSBEUEkgbW9kZSAqLwo+ICsJcmV0IHw9IGFueDc2 MjVfcmVnX3dyaXRlKGN0eCwgY3R4LT5pMmMucnhfcDFfY2xpZW50LAo+ICsJCQkJIE1JUElfRElH SVRBTF9QTExfMTgsIDB4MUMpOwo+ICsJLyogc2V0IGZpcnN0IGVkZ2UgKi8KPiArCXJldCB8PSBh bng3NjI1X3JlZ193cml0ZShjdHgsIGN0eC0+aTJjLnR4X3AyX2NsaWVudCwKPiArCQkJCSBWSURF T19DT05UUk9MXzAsIDB4MDUpOwo+ICsJaWYgKHJldCA8IDApCj4gKwkJRFJNX0VSUk9SKCJJTyBl cnJvciA6IGRwaSBwaHkgc2V0IGZhaWxlZC5cbiIpOwo+ICsKPiArCXJldHVybiByZXQ7Cj4gK30K PiArCj4gK3N0YXRpYyBpbnQgYW54NzYyNV9kcGlfY29uZmlnKHN0cnVjdCBhbng3NjI1X2RhdGEg KmN0eCkKPiArewo+ICsJc3RydWN0IGRldmljZSAqZGV2ID0gJmN0eC0+Y2xpZW50LT5kZXY7Cj4g KwlpbnQgcmV0Owo+ICsKPiArCURSTV9ERVZfREVCVUdfRFJJVkVSKGRldiwgImNvbmZpZyBkcGlc biIpOwo+ICsKPiArCS8qIERTQyBkaXNhYmxlICovCj4gKwlyZXQgPSBhbng3NjI1X3dyaXRlX2Fu ZChjdHgsIGN0eC0+aTJjLnJ4X3AwX2NsaWVudCwKPiArCQkJCVJfRFNDX0NUUkxfMCwgfkRTQ19F Tik7Cj4gKwlpZiAocmV0IDwgMCkgewo+ICsJCURSTV9FUlJPUigiSU8gZXJyb3IgOiBkaXNhYmxl IGRzYyBmYWlsZWQuXG4iKTsKPiArCQlyZXR1cm4gcmV0Owo+ICsJfQo+ICsKPiArCXJldCA9IGFu eDc2MjVfY29uZmlnX2JpdF9tYXRyaXgoY3R4KTsKPiArCWlmIChyZXQgPCAwKSB7Cj4gKwkJRFJN X0VSUk9SKCJjb25maWcgYml0IG1hdHJpeCBmYWlsZWQuXG4iKTsKPiArCQlyZXR1cm4gcmV0Owo+ ICsJfQo+ICsKPiArCXJldCA9IGFueDc2MjVfYXBpX2RwaV9jb25maWcoY3R4KTsKPiArCWlmIChy ZXQgPCAwKSB7Cj4gKwkJRFJNX0VSUk9SKCJtaXBpIHBoeShkcGkpIHNldHVwIGZhaWxlZC5cbiIp Owo+ICsJCXJldHVybiByZXQ7Cj4gKwl9Cj4gKwo+ICsJLyogc2V0IE1JUEkgUlggRU4gKi8KPiAr CXJldCA9IGFueDc2MjVfd3JpdGVfb3IoY3R4LCBjdHgtPmkyYy5yeF9wMF9jbGllbnQsCj4gKwkJ CSAgICAgICBBUF9BVl9TVEFUVVMsIEFQX01JUElfUlhfRU4pOwo+ICsJLyogY2xlYXIgbXV0ZSBm bGFnICovCj4gKwlyZXQgfD0gYW54NzYyNV93cml0ZV9hbmQoY3R4LCBjdHgtPmkyYy5yeF9wMF9j bGllbnQsCj4gKwkJCQkgQVBfQVZfU1RBVFVTLCAodTgpfkFQX01JUElfTVVURSk7Cj4gKwlpZiAo cmV0IDwgMCkKPiArCQlEUk1fRVJST1IoIklPIGVycm9yIDogZW5hYmxlIG1pcGkgcnggZmFpbGVk LlxuIik7Cj4gKwo+ICsJcmV0dXJuIHJldDsKPiArfQo+ICsKPiArY29uc3QgdTggQU5YX09VSVsz XSA9IHsgMHgwMCwgMHgyMiwgMHhCOSB9Owo+ICtzdGF0aWMgaW50IGlzX2FueF9kb25nbGUoc3Ry dWN0IGFueDc2MjVfZGF0YSAqY3R4KQo+ICt7Cj4gKwl1OCBidWZbM107Cj4gKwo+ICsJLyogMHgw NTAwfjB4MDUwMjogQlJBTkNIX0lFRUVfT1VJICovCj4gKwlzcF90eF9hdXhfZHBjZHJlYWRfYnl0 ZXMoY3R4LCAweDAwLCAweDA1LCAweDAwLCBzaXplb2YoYnVmKSwgYnVmKTsKPiArCWlmIChtZW1j bXAoYnVmLCBBTlhfT1VJLCBzaXplb2YoYnVmKSkgPT0gMCkKPiArCQlyZXR1cm4gMTsKPiArCj4g KwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgc3BfdHhfZ2V0X3J4X2J3KHN0cnVj dCBhbng3NjI1X2RhdGEgKmN0eCwgdTggKmJ3KQo+ICt7Cj4gKwl1OCBkYXRhX2J1Zls0XTsKPiAr CS8qCj4gKwkgKiBXaGVuIEFOWCBkb25nbGUgY29ubmVjdGVkLCBpZiBDSElQX0lEID0gMHg3NzUw LCBiYW5kd2lkdGggaXMgNi43NUcsCj4gKwkgKiBiZWNhdXNlIEFOWDc3NTAgRFBDRCAweDA1Mngg d2FzIG5vdCBhdmFpbGFibGUuCj4gKwkgKi8KPiArCWlmIChpc19hbnhfZG9uZ2xlKGN0eCkpIHsK PiArCQlzcF90eF9hdXhfZHBjZHJlYWRfYnl0ZXMoY3R4LCAweDAwLCAweDA1LCAweDAzLCAweDA0 LCBkYXRhX2J1Zik7Cj4gKwkJaWYgKGRhdGFfYnVmWzBdID09IDB4MzcgJiYgZGF0YV9idWZbMV0g PT0gMHgzNyAmJgo+ICsJCSAgICBkYXRhX2J1ZlsyXSA9PSAweDM1ICYmIGRhdGFfYnVmWzNdID09 IDB4MzApIHsKPiArCQkJLyogMHgxOSA6IDYuNzVHICovCj4gKwkJCSpidyA9IDB4MTk7Cj4gKwkJ fSBlbHNlIHsKPiArCQkJc3BfdHhfYXV4X2RwY2RyZWFkX2J5dGVzKGN0eCwgMHgwMCwgMHgwNSwg MHgyMSwgMSwgYncpOwo+ICsJCQkvKgo+ICsJCQkgKiBzb21lIEFOWCBkb25nbGUgcmVhZCBvdXQg dmFsdWUgMCwKPiArCQkJICogcmV0cnkgc3RhbmRhcmQgcmVnaXN0ZXIuCj4gKwkJCSAqLwo+ICsJ CQlpZiAoKCgqYncpID09IDApIHx8ICgoKmJ3KSA9PSAweGZmKSkKPiArCQkJCXNwX3R4X2F1eF9k cGNkcmVhZF9ieXRlcyhjdHgsIDB4MDAsIDB4MDAsCj4gKwkJCQkJCQkgRFBDRF9NQVhfTElOS19S QVRFLAo+ICsJCQkJCQkJIDEsIGJ3KTsKPiArCQl9Cj4gKwl9IGVsc2Ugewo+ICsJCXNwX3R4X2F1 eF9kcGNkcmVhZF9ieXRlcyhjdHgsIDB4MDAsIDB4MDAsCj4gKwkJCQkJIERQQ0RfTUFYX0xJTktf UkFURSwgMSwgYncpOwo+ICsJfQo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBhbng3NjI1X2RwX3N0 YXJ0KHN0cnVjdCBhbng3NjI1X2RhdGEgKmN0eCkKPiArewo+ICsJaW50IHJldDsKPiArCj4gKwlp ZiAoIWN0eC0+ZGlzcGxheV90aW1pbmdfdmFsaWQpIHsKPiArCQlEUk1fRVJST1IoIm1pcGkgZHJt IGhhdmVuJ3Qgc2V0IGRpc3BsYXkgdGltaW5nIHlldC5cbiIpOwo+ICsJCXJldHVybjsKPiArCX0K PiArCj4gKwlyZXQgPSBhbng3NjI1X2NvbmZpZ19hdWRpb19pbnB1dChjdHgpOwo+ICsJaWYgKHJl dCA8IDApCj4gKwkJRFJNX0VSUk9SKCJjb25maWcgYXVkaW8gaW5wdXQgZmFpbGVkLlxuIik7Cgpy ZXR1cm4gYWZ0ZXIgZXJyb3I/Cgo+ICsKPiArCWlmIChjdHgtPnBkYXRhLmRzaV9zdXBwb3J0ZWQp Cj4gKwkJcmV0ID0gYW54NzYyNV9kc2lfY29uZmlnKGN0eCk7Cj4gKwllbHNlCj4gKwkJcmV0ID0g YW54NzYyNV9kcGlfY29uZmlnKGN0eCk7Cj4gKwo+ICsJaWYgKHJldCA8IDApCj4gKwkJRFJNX0VS Uk9SKCJNSVBJIHBoeSBzZXR1cCBlcnJvci5cbiIpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBh bng3NjI1X2RwX3N0b3Aoc3RydWN0IGFueDc2MjVfZGF0YSAqY3R4KQo+ICt7Cj4gKwlzdHJ1Y3Qg ZGV2aWNlICpkZXYgPSAmY3R4LT5jbGllbnQtPmRldjsKPiArCWludCByZXQ7Cj4gKwo+ICsJRFJN X0RFVl9ERUJVR19EUklWRVIoZGV2LCAic3RvcCBkcCBvdXRwdXRcbiIpOwo+ICsKPiArCS8qCj4g KwkgKiB2aWRlbyBkaXNhYmxlOiAweDcyOjA4IGJpdCA3ID0gMDsKPiArCSAqIGF1ZGlvIGRpc2Fi bGU6IDB4NzA6ODcgYml0IDAgPSAwOwo+ICsJICovCj4gKwlyZXQgPSBhbng3NjI1X3dyaXRlX2Fu ZChjdHgsIGN0eC0+aTJjLnR4X3AwX2NsaWVudCwgMHg4NywgMHhmZSk7Cj4gKwlyZXQgfD0gYW54 NzYyNV93cml0ZV9hbmQoY3R4LCBjdHgtPmkyYy50eF9wMl9jbGllbnQsIDB4MDgsIDB4N2YpOwo+ ICsKPiArCXJldCB8PSBhbng3NjI1X3ZpZGVvX211dGVfY29udHJvbChjdHgsIDEpOwo+ICsJaWYg KHJldCA8IDApCj4gKwkJRFJNX0VSUk9SKCJJTyBlcnJvciA6IG11dGUgdmlkZW8gZmFpbGVkXG4i KTsKPiArfQo+ICsKPiArc3RhdGljIGludCBzcF90eF9yc3RfYXV4KHN0cnVjdCBhbng3NjI1X2Rh dGEgKmN0eCkKPiArewo+ICsJaW50IHJldDsKPiArCj4gKwlyZXQgPSBhbng3NjI1X3dyaXRlX29y KGN0eCwgY3R4LT5pMmMudHhfcDJfY2xpZW50LCBSU1RfQ1RSTDIsCj4gKwkJCSAgICAgICBBVVhf UlNUKTsKPiArCXJldCB8PSBhbng3NjI1X3dyaXRlX2FuZChjdHgsIGN0eC0+aTJjLnR4X3AyX2Ns aWVudCwgUlNUX0NUUkwyLAo+ICsJCQkJIH5BVVhfUlNUKTsKPiArCXJldHVybiByZXQ7Cj4gK30K PiArCj4gK3N0YXRpYyBpbnQgc3BfdHhfYXV4X3dyKHN0cnVjdCBhbng3NjI1X2RhdGEgKmN0eCwg dTggb2Zmc2V0KQo+ICt7Cj4gKwlpbnQgcmV0Owo+ICsKPiArCXJldCA9IGFueDc2MjVfcmVnX3dy aXRlKGN0eCwgY3R4LT5pMmMucnhfcDBfY2xpZW50LAo+ICsJCQkJQVBfQVVYX0JVRkZfU1RBUlQs IG9mZnNldCk7Cj4gKwlyZXQgfD0gYW54NzYyNV9yZWdfd3JpdGUoY3R4LCBjdHgtPmkyYy5yeF9w MF9jbGllbnQsCj4gKwkJCQkgQVBfQVVYX0NPTU1BTkQsIDB4MDQpOwo+ICsJcmV0IHw9IGFueDc2 MjVfd3JpdGVfb3IoY3R4LCBjdHgtPmkyYy5yeF9wMF9jbGllbnQsCj4gKwkJCQlBUF9BVVhfQ1RS TF9TVEFUVVMsIEFQX0FVWF9DVFJMX09QX0VOKTsKPiArCXJldHVybiAocmV0IHwgd2FpdF9hdXhf b3BfZmluaXNoKGN0eCkpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IHNwX3R4X2F1eF9yZChzdHJ1 Y3QgYW54NzYyNV9kYXRhICpjdHgsIHU4IGxlbl9jbWQpCj4gK3sKPiArCWludCByZXQ7Cj4gKwo+ ICsJcmV0ID0gYW54NzYyNV9yZWdfd3JpdGUoY3R4LCBjdHgtPmkyYy5yeF9wMF9jbGllbnQsCj4g KwkJCQlBUF9BVVhfQ09NTUFORCwgbGVuX2NtZCk7Cj4gKwlyZXQgfD0gYW54NzYyNV93cml0ZV9v cihjdHgsIGN0eC0+aTJjLnJ4X3AwX2NsaWVudCwKPiArCQkJCUFQX0FVWF9DVFJMX1NUQVRVUywg QVBfQVVYX0NUUkxfT1BfRU4pOwo+ICsJcmV0dXJuIChyZXQgfCB3YWl0X2F1eF9vcF9maW5pc2go Y3R4KSk7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgc3BfdHhfZ2V0X2VkaWRfYmxvY2soc3RydWN0 IGFueDc2MjVfZGF0YSAqY3R4KQo+ICt7Cj4gKwlpbnQgYyA9IDA7Cj4gKwlzdHJ1Y3QgZGV2aWNl ICpkZXYgPSAmY3R4LT5jbGllbnQtPmRldjsKPiArCj4gKwlzcF90eF9hdXhfd3IoY3R4LCAweDdl KTsKPiArCXNwX3R4X2F1eF9yZChjdHgsIDB4MDEpOwo+ICsJYyA9IGFueDc2MjVfcmVnX3JlYWQo Y3R4LCBjdHgtPmkyYy5yeF9wMF9jbGllbnQsIEFQX0FVWF9CVUZGX1NUQVJUKTsKPiArCWlmIChj IDwgMCkgewo+ICsJCURSTV9FUlJPUigiSU8gZXJyb3IgOiBhY2Nlc3MgQVVYIEJVRkYuXG4iKTsK PiArCQlyZXR1cm4gLUVJTzsKPiArCX0KPiArCj4gKwlEUk1fREVWX0RFQlVHX0RSSVZFUihkZXYs ICIgRURJRCBCbG9jayA9ICVkXG4iLCBjICsgMSk7Cj4gKwo+ICsJaWYgKGMgPiAzKQo+ICsJCWMg PSAxOwo+ICsKPiArCXJldHVybiBjOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGVkaWRfcmVhZChz dHJ1Y3QgYW54NzYyNV9kYXRhICpjdHgsCj4gKwkJICAgICB1OCBvZmZzZXQsIHU4ICpwYmxvY2tf YnVmKQo+ICt7Cj4gKwl1OCBjLCBjbnQgPSAwOwogICAgICAgICAgICAgICAgICBeXl4KCiJjIiBu ZWVkcyB0byBiZSBhbiBpbnRlZ2VyLiAgImNudCIgc2hvdWxkIGJlIGFuIGludCB0b28sIGJ1dCBp dCBkb2Vzbid0CmNhdXNlIGEgYnVnIGVpdGhlciB3YXkuICBEZWxldGUgdGhlIGJvZ3VzICJjbnQi IGluaXRpYWxpemF0aW9uLgoKPiArCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZjdHgtPmNsaWVudC0+ ZGV2Owo+ICsKPiArCWMgPSAwOwogICAgICAgIF5eXl5eCkRlbGV0ZS4KCj4gKwlmb3IgKGNudCA9 IDA7IGNudCA8IDM7IGNudCsrKSB7Cj4gKwkJc3BfdHhfYXV4X3dyKGN0eCwgb2Zmc2V0KTsKPiAr CQkvKiBzZXQgSTJDIHJlYWQgY29tIDB4MDEgbW90ID0gMCBhbmQgcmVhZCAxNiBieXRlcyAqLwo+ ICsJCWMgPSBzcF90eF9hdXhfcmQoY3R4LCAweGYxKTsKPiArCj4gKwkJaWYgKGMgPT0gMSkgewoK MSBpcyBhIG1hZ2ljIG51bWJlciBoZXJlLiAgV2UgbmVlZCB0byBjaGVjayBmb3IgbmVnYXRpdmUg cmV0dXJucyBhcwp3ZWxsLgoKCj4gKwkJCXNwX3R4X3JzdF9hdXgoY3R4KTsKPiArCQkJRFJNX0RF Vl9ERUJVR19EUklWRVIoZGV2LCAiZWRpZCByZWFkIGZhaWxlZCwgcmVzZXQhXG4iKTsKPiArCQkJ Y250Kys7Cj4gKwkJfSBlbHNlIHsKPiArCQkJYW54NzYyNV9yZWdfYmxvY2tfcmVhZChjdHgsIGN0 eC0+aTJjLnJ4X3AwX2NsaWVudCwKPiArCQkJCQkgICAgICAgQVBfQVVYX0JVRkZfU1RBUlQsCj4g KwkJCQkJICAgICAgIE1BWF9EUENEX0JVRkZFUl9TSVpFLAo+ICsJCQkJCSAgICAgICBwYmxvY2tf YnVmKTsKPiArCQkJcmV0dXJuIDA7Cj4gKwkJfQo+ICsJfQo+ICsKPiArCXJldHVybiAxOwo+ICt9 Cj4gKwo+ICtzdGF0aWMgaW50IHNlZ21lbnRzX2VkaWRfcmVhZChzdHJ1Y3QgYW54NzYyNV9kYXRh ICpjdHgsCj4gKwkJCSAgICAgIHU4IHNlZ21lbnQsIHU4ICpidWYsIHU4IG9mZnNldCkKPiArewo+ ICsJdTggYywgY250ID0gMDsKCmMgbmVlZHMgdG8gYmUgYW4gaW50LgoKPiArCWludCByZXQ7Cj4g KwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY3R4LT5jbGllbnQtPmRldjsKPiArCj4gKwkvKiB3cml0 ZSBhZGRyZXNzIG9ubHkgKi8KPiArCXJldCA9IGFueDc2MjVfcmVnX3dyaXRlKGN0eCwgY3R4LT5p MmMucnhfcDBfY2xpZW50LAo+ICsJCQkJQVBfQVVYX0FERFJfN18wLCAweDMwKTsKPiArCXJldCB8 PSBhbng3NjI1X3JlZ193cml0ZShjdHgsIGN0eC0+aTJjLnJ4X3AwX2NsaWVudCwKPiArCQkJCSBB UF9BVVhfQ09NTUFORCwgMHgwNCk7Cj4gKwlyZXQgfD0gYW54NzYyNV9yZWdfd3JpdGUoY3R4LCBj dHgtPmkyYy5yeF9wMF9jbGllbnQsCj4gKwkJCQkgQVBfQVVYX0NUUkxfU1RBVFVTLAo+ICsJCQkJ IEFQX0FVWF9DVFJMX0FERFJPTkxZIHwgQVBfQVVYX0NUUkxfT1BfRU4pOwo+ICsKPiArCXJldCB8 PSB3YWl0X2F1eF9vcF9maW5pc2goY3R4KTsKPiArCS8qIHdyaXRlIHNlZ21lbnQgYWRkcmVzcyAq Lwo+ICsJcmV0IHw9IHNwX3R4X2F1eF93cihjdHgsIHNlZ21lbnQpOwo+ICsJLyogZGF0YSByZWFk ICovCj4gKwlyZXQgfD0gYW54NzYyNV9yZWdfd3JpdGUoY3R4LCBjdHgtPmkyYy5yeF9wMF9jbGll bnQsCj4gKwkJCQkgQVBfQVVYX0FERFJfN18wLCAweDUwKTsKPiArCWlmIChyZXQgPCAwKSB7Cj4g KwkJRFJNX0VSUk9SKCJJTyBlcnJvciA6IGF1eCBpbml0aWFsIGZhaWxlZC5cbiIpOwo+ICsJCXJl dHVybiByZXQ7Cj4gKwl9Cj4gKwo+ICsJZm9yIChjbnQgPSAwOyBjbnQgPCAzOyBjbnQrKykgewo+ ICsJCXNwX3R4X2F1eF93cihjdHgsIG9mZnNldCk7Cj4gKwkJLyogc2V0IEkyQyByZWFkIGNvbSAw eDAxIG1vdCA9IDAgYW5kIHJlYWQgMTYgYnl0ZXMgKi8KPiArCQljID0gc3BfdHhfYXV4X3JkKGN0 eCwgMHhmMSk7Cj4gKwo+ICsJCWlmIChjID09IDEpIHsKCgpXaGVyZSBkb2VzIDEgY29tZSBmcm9t PyAgV2UgbmVlZCB0byBjaGVjayBmb3IgbmVnYXRpdmUgcmV0dXJucy4KCj4gKwkJCXJldCA9IHNw X3R4X3JzdF9hdXgoY3R4KTsKPiArCQkJRFJNX0RFVl9FUlJPUihkZXYsICJzZWdtZW50IHJlYWQg ZmFpbGVkLCByZXNldCFcbiIpOwo+ICsJCQljbnQrKzsKPiArCQl9IGVsc2Ugewo+ICsJCQlyZXQg PSBhbng3NjI1X3JlZ19ibG9ja19yZWFkKGN0eCwgY3R4LT5pMmMucnhfcDBfY2xpZW50LAo+ICsJ CQkJCQkgICAgIEFQX0FVWF9CVUZGX1NUQVJULAo+ICsJCQkJCQkgICAgIE1BWF9EUENEX0JVRkZF Ul9TSVpFLCBidWYpOwo+ICsJCQlyZXR1cm4gcmV0Owo+ICsJCX0KPiArCX0KPiArCj4gKwlyZXR1 cm4gcmV0Owo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IHNwX3R4X2VkaWRfcmVhZChzdHJ1Y3QgYW54 NzYyNV9kYXRhICpjdHgsCj4gKwkJCSAgIHU4ICpwZWRpZF9ibG9ja3NfYnVmKQo+ICt7Cj4gKwl1 OCBvZmZzZXQsIGVkaWRfcG9zOwo+ICsJaW50IGNvdW50LCBibG9ja3NfbnVtOwo+ICsJdTggcGJs b2NrX2J1ZltNQVhfRFBDRF9CVUZGRVJfU0laRV07Cj4gKwl1OCBpLCBqOwo+ICsJdTggZ19lZGlk X2JyZWFrID0gMDsKPiArCWludCByZXQ7Cj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY3R4LT5j bGllbnQtPmRldjsKPiArCj4gKwkvKiBhZGRyZXNzIGluaXRpYWwgKi8KPiArCXJldCA9IGFueDc2 MjVfcmVnX3dyaXRlKGN0eCwgY3R4LT5pMmMucnhfcDBfY2xpZW50LAo+ICsJCQkJQVBfQVVYX0FE RFJfN18wLCAweDUwKTsKPiArCXJldCB8PSBhbng3NjI1X3JlZ193cml0ZShjdHgsIGN0eC0+aTJj LnJ4X3AwX2NsaWVudCwKPiArCQkJCSBBUF9BVVhfQUREUl8xNV84LCAwKTsKPiArCXJldCB8PSBh bng3NjI1X3dyaXRlX2FuZChjdHgsIGN0eC0+aTJjLnJ4X3AwX2NsaWVudCwKPiArCQkJCSBBUF9B VVhfQUREUl8xOV8xNiwgMHhmMCk7Cj4gKwlpZiAocmV0IDwgMCkgewo+ICsJCURSTV9FUlJPUigi YWNjZXNzIGF1eCBjaGFubmVsIElPIGVycm9yLlxuIik7Cj4gKwkJcmV0dXJuIC1FSU87Cj4gKwl9 Cj4gKwo+ICsJYmxvY2tzX251bSA9IHNwX3R4X2dldF9lZGlkX2Jsb2NrKGN0eCk7Cj4gKwlpZiAo YmxvY2tzX251bSA8IDApCj4gKwkJcmV0dXJuIGJsb2Nrc19udW07Cj4gKwo+ICsJY291bnQgPSAw Owo+ICsKPiArCWRvIHsKPiArCQlzd2l0Y2ggKGNvdW50KSB7Cj4gKwkJY2FzZSAwOgo+ICsJCWNh c2UgMToKPiArCQkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewo+ICsJCQkJb2Zmc2V0ID0gKGkg KyBjb3VudCAqIDgpICogTUFYX0RQQ0RfQlVGRkVSX1NJWkU7Cj4gKwkJCQlnX2VkaWRfYnJlYWsg PSBlZGlkX3JlYWQoY3R4LCBvZmZzZXQsCj4gKwkJCQkJCQkgcGJsb2NrX2J1Zik7Cj4gKwo+ICsJ CQkJaWYgKGdfZWRpZF9icmVhayA9PSAxKQo+ICsJCQkJCWJyZWFrOwo+ICsKPiArCQkJCW1lbWNw eSgmcGVkaWRfYmxvY2tzX2J1ZltvZmZzZXRdLAo+ICsJCQkJICAgICAgIHBibG9ja19idWYsCj4g KwkJCQkgICAgICAgTUFYX0RQQ0RfQlVGRkVSX1NJWkUpOwo+ICsJCQl9Cj4gKwo+ICsJCQlicmVh azsKPiArCQljYXNlIDI6Cj4gKwkJCW9mZnNldCA9IDB4MDA7Cj4gKwo+ICsJCQlmb3IgKGogPSAw OyBqIDwgODsgaisrKSB7Cj4gKwkJCQllZGlkX3BvcyA9IChqICsgY291bnQgKiA4KSAqCj4gKwkJ CQkJTUFYX0RQQ0RfQlVGRkVSX1NJWkU7Cj4gKwo+ICsJCQkJaWYgKGdfZWRpZF9icmVhayA9PSAx KQo+ICsJCQkJCWJyZWFrOwo+ICsKPiArCQkJCXNlZ21lbnRzX2VkaWRfcmVhZChjdHgsIGNvdW50 IC8gMiwKPiArCQkJCQkJICAgcGJsb2NrX2J1Ziwgb2Zmc2V0KTsKPiArCQkJCW1lbWNweSgmcGVk aWRfYmxvY2tzX2J1ZltlZGlkX3Bvc10sCj4gKwkJCQkgICAgICAgcGJsb2NrX2J1ZiwKPiArCQkJ CSAgICAgICBNQVhfRFBDRF9CVUZGRVJfU0laRSk7Cj4gKwkJCQlvZmZzZXQgPSBvZmZzZXQgKyAw eDEwOwo+ICsJCQl9Cj4gKwo+ICsJCQlicmVhazsKPiArCQljYXNlIDM6Cj4gKwkJCW9mZnNldCA9 IDB4ODA7Cj4gKwo+ICsJCQlmb3IgKGogPSAwOyBqIDwgODsgaisrKSB7Cj4gKwkJCQllZGlkX3Bv cyA9IChqICsgY291bnQgKiA4KSAqCj4gKwkJCQkJTUFYX0RQQ0RfQlVGRkVSX1NJWkU7Cj4gKwkJ CQlpZiAoZ19lZGlkX2JyZWFrID09IDEpCj4gKwkJCQkJYnJlYWs7Cj4gKwo+ICsJCQkJc2VnbWVu dHNfZWRpZF9yZWFkKGN0eCwgY291bnQgLyAyLAo+ICsJCQkJCQkgICBwYmxvY2tfYnVmLCBvZmZz ZXQpOwo+ICsJCQkJbWVtY3B5KCZwZWRpZF9ibG9ja3NfYnVmW2VkaWRfcG9zXSwKPiArCQkJCSAg ICAgICBwYmxvY2tfYnVmLAo+ICsJCQkJICAgICAgIE1BWF9EUENEX0JVRkZFUl9TSVpFKTsKPiAr CQkJCW9mZnNldCA9IG9mZnNldCArIDB4MTA7Cj4gKwkJCX0KPiArCj4gKwkJCWJyZWFrOwo+ICsJ CWRlZmF1bHQ6Cj4gKwkJCWJyZWFrOwo+ICsJCX0KPiArCj4gKwkJY291bnQrKzsKPiArCj4gKwl9 IHdoaWxlIChibG9ja3NfbnVtID49IGNvdW50KTsKPiArCj4gKwkvKiBjaGVjayBlZGlkIGRhdGEg Ki8KPiArCWlmIChkcm1fZWRpZF9pc192YWxpZCgoc3RydWN0IGVkaWQgKilwZWRpZF9ibG9ja3Nf YnVmKSA9PSBmYWxzZSkKPiArCQlEUk1fREVWX0VSUk9SKGRldiwgIldBUk5JTkchIGVkaWQgY2hl Y2sgZmFpbGVkIVxuIik7Cj4gKwo+ICsJLyogcmVzZXQgYXV4IGNoYW5uZWwgKi8KPiArCXNwX3R4 X3JzdF9hdXgoY3R4KTsKPiArCj4gKwlyZXR1cm4gYmxvY2tzX251bTsKPiArfQo+ICsKPiArc3Rh dGljIHZvaWQgYW54NzYyNV9wb3dlcl9vbihzdHJ1Y3QgYW54NzYyNV9kYXRhICpjdHgpCj4gK3sK PiArCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZjdHgtPmNsaWVudC0+ZGV2Owo+ICsKPiArCWlmIChj dHgtPnBkYXRhLmxvd19wb3dlcl9tb2RlKSB7CgpGbGlwIHRoaXMgYXJvdW5kLgoKCWlmICghY3R4 LT5wZGF0YS5sb3dfcG93ZXJfbW9kZSkgewoJCURSTV9ERVZfREVCVUdfRFJJVkVSKGRldiwgIkFu eDc2MjUgbm90IGxvdyBwb3dlciBtb2RlIVxuIik7CgkJcmV0dXJuOwoJfQoKPiArCQkvKiBwb3dl ciBvbiBwaW4gZW5hYmxlICovCj4gKwkJZ3Bpb19zZXRfdmFsdWUoY3R4LT5wZGF0YS5ncGlvX3Bf b24sIDEpOwo+ICsJCXVzbGVlcF9yYW5nZSgxMDAwMCwgMTEwMDApOwo+ICsJCS8qIHBvd2VyIHJl c2V0IHBpbiBlbmFibGUgKi8KPiArCQlncGlvX3NldF92YWx1ZShjdHgtPnBkYXRhLmdwaW9fcmVz ZXQsIDEpOwo+ICsJCXVzbGVlcF9yYW5nZSgxMDAwMCwgMTEwMDApOwo+ICsKPiArCQlEUk1fREVW X0RFQlVHX0RSSVZFUihkZXYsICJBbng3NjI1IHBvd2VyIG9uICFcbiIpOwo+ICsJfSBlbHNlIHsK PiArCQlEUk1fREVWX0RFQlVHX0RSSVZFUihkZXYsICJBbng3NjI1IG5vdCBsb3cgcG93ZXIgbW9k ZSFcbiIpOwo+ICsJfQo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBhbng3NjI1X3Bvd2VyX3N0YW5k Ynkoc3RydWN0IGFueDc2MjVfZGF0YSAqY3R4KQo+ICt7Cj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXYg PSAmY3R4LT5jbGllbnQtPmRldjsKPiArCj4gKwlpZiAoY3R4LT5wZGF0YS5sb3dfcG93ZXJfbW9k ZSkgewoKRmxpcC4KCj4gKwkJZ3Bpb19zZXRfdmFsdWUoY3R4LT5wZGF0YS5ncGlvX3Jlc2V0LCAw KTsKPiArCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMTEwMCk7Cj4gKwkJZ3Bpb19zZXRfdmFsdWUoY3R4 LT5wZGF0YS5ncGlvX3Bfb24sIDApOwo+ICsJCXVzbGVlcF9yYW5nZSgxMDAwLCAxMTAwKTsKPiAr CQlEUk1fREVWX0RFQlVHX0RSSVZFUihkZXYsICJhbng3NjI1IHBvd2VyIGRvd25cbiIpOwo+ICsJ fSBlbHNlIHsKPiArCQlEUk1fREVWX0RFQlVHX0RSSVZFUihkZXYsICJhbng3NjI1IG5vdCBsb3cg cG93ZXIgbW9kZSFcbiIpOwo+ICsJfQo+ICt9Cj4gKwo+ICsvKiBiYXNpYyBjb25maWd1cmF0aW9u cyBvZiBBTlg3NjI1ICovCj4gK3N0YXRpYyB2b2lkIGFueDc2MjVfY29uZmlnKHN0cnVjdCBhbng3 NjI1X2RhdGEgKmN0eCkKPiArewo+ICsJYW54NzYyNV9yZWdfd3JpdGUoY3R4LCBjdHgtPmkyYy5y eF9wMF9jbGllbnQsCj4gKwkJCSAgWFRBTF9GUlFfU0VMLCBYVEFMX0ZSUV8yN00pOwo+ICt9Cj4g Kwo+ICtzdGF0aWMgdm9pZCBhbng3NjI1X2Rpc2FibGVfcGRfcHJvdG9jb2woc3RydWN0IGFueDc2 MjVfZGF0YSAqY3R4KQo+ICt7Cj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY3R4LT5jbGllbnQt PmRldjsKPiArCWludCByZXQ7Cj4gKwo+ICsJLyogcmVzZXQgbWFpbiBvY20gKi8KPiArCXJldCA9 IGFueDc2MjVfcmVnX3dyaXRlKGN0eCwgY3R4LT5pMmMucnhfcDBfY2xpZW50LCAweDg4LCAweDQw KTsKPiArCS8qIERpc2FibGUgUEQgKi8KPiArCXJldCB8PSBhbng3NjI1X3JlZ193cml0ZShjdHgs IGN0eC0+aTJjLnJ4X3AwX2NsaWVudCwKPiArCQkJCSBBUF9BVl9TVEFUVVMsIEFQX0RJU0FCTEVf UEQpOwo+ICsJLyogcmVsZWFzZSBtYWluIG9jbSAqLwo+ICsJcmV0IHw9IGFueDc2MjVfcmVnX3dy aXRlKGN0eCwgY3R4LT5pMmMucnhfcDBfY2xpZW50LCAweDg4LCAweDAwKTsKPiArCj4gKwlpZiAo cmV0IDwgMCkKPiArCQlEUk1fREVWX0RFQlVHX0RSSVZFUihkZXYsICJkaXNhYmxlIFBEIGZlYXR1 cmUgZmFpbGVkLlxuIik7Cj4gKwllbHNlCj4gKwkJRFJNX0RFVl9ERUJVR19EUklWRVIoZGV2LCAi ZGlzYWJsZSBQRCBmZWF0dXJlIHN1Y2NlZWRlZC5cbiIpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9p ZCBhbng3NjI1X3Bvd2VyX29uX2luaXQoc3RydWN0IGFueDc2MjVfZGF0YSAqY3R4KQo+ICt7Cj4g KwlpbnQgcmV0cnlfY291bnQsIGk7Cj4gKwlpbnQgcmV0ID0gMDsKICAgICAgICAgICAgICAgXl5e XgpEZWxldGUgaW5pdGlhbGl6YXRpb24uCgo+ICsJc3RydWN0IGRldmljZSAqZGV2ID0gJmN0eC0+ Y2xpZW50LT5kZXY7Cj4gKwo+ICsJZm9yIChyZXRyeV9jb3VudCA9IDA7IHJldHJ5X2NvdW50IDwg MzsgcmV0cnlfY291bnQrKykgewo+ICsJCWFueDc2MjVfcG93ZXJfb24oY3R4KTsKPiArCQlhbng3 NjI1X2NvbmZpZyhjdHgpOwo+ICsKPiArCQlmb3IgKGkgPSAwOyBpIDwgT0NNX0xPQURJTkdfVElN RTsgaSsrKSB7Cj4gKwkJCS8qIGNoZWNrIGludGVyZmFjZSB3b3JrYWJsZSAqLwo+ICsJCQlyZXQg PSBhbng3NjI1X3JlZ19yZWFkKGN0eCwgY3R4LT5pMmMucnhfcDBfY2xpZW50LAo+ICsJCQkJCSAg ICAgICBGTEFTSF9MT0FEX1NUQSk7Cj4gKwkJCWlmIChyZXQgPCAwKSB7Cj4gKwkJCQlEUk1fRVJS T1IoIklPIGVycm9yIDogYWNjZXNzIGZsYXNoIGxvYWQuXG4iKTsKPiArCQkJCXJldHVybjsKPiAr CQkJfQo+ICsJCQlpZiAoKHJldCAmIEZMQVNIX0xPQURfU1RBX0NISykgPT0gRkxBU0hfTE9BRF9T VEFfQ0hLKSB7Cj4gKwkJCQlhbng3NjI1X2Rpc2FibGVfcGRfcHJvdG9jb2woY3R4KTsKPiArCQkJ CURSTV9ERVZfREVCVUdfRFJJVkVSKGRldiwKPiArCQkJCQkJICAgICAiRmlybXdhcmUgdmVyICUw MnglMDJ4LCIsCj4gKwkJCQkJYW54NzYyNV9yZWdfcmVhZChjdHgsCj4gKwkJCQkJCQkgY3R4LT5p MmMucnhfcDBfY2xpZW50LAo+ICsJCQkJCQkJIE9DTV9GV19WRVJTSU9OKSwKPiArCQkJCQlhbng3 NjI1X3JlZ19yZWFkKGN0eCwKPiArCQkJCQkJCSBjdHgtPmkyYy5yeF9wMF9jbGllbnQsCj4gKwkJ CQkJCQkgT0NNX0ZXX1JFVkVSU0lPTikpOwo+ICsJCQkJRFJNX0RFVl9ERUJVR19EUklWRVIoZGV2 LCAiRHJpdmVyIHZlcnNpb24gJXNcbiIsCj4gKwkJCQkJCSAgICAgQU5YNzYyNV9EUlZfVkVSU0lP Tik7Cj4gKwo+ICsJCQkJcmV0dXJuOwo+ICsJCQl9Cj4gKwkJCXVzbGVlcF9yYW5nZSgxMDAwLCAx MTAwKTsKPiArCQl9Cj4gKwkJYW54NzYyNV9wb3dlcl9zdGFuZGJ5KGN0eCk7Cj4gKwl9Cj4gK30K PiArCj4gK3N0YXRpYyBpbnQgYW54NzYyNV9leHRjb25fbm90aWZpZXIoc3RydWN0IG5vdGlmaWVy X2Jsb2NrICpuYiwKPiArCQkJCSAgIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKnB0cikKPiAr ewo+ICsJc3RydWN0IGFueDc2MjVfZGF0YSAqY3R4ID0KPiArCQljb250YWluZXJfb2YobmIsIHN0 cnVjdCBhbng3NjI1X2RhdGEsIGV2ZW50X25iKTsKPiArCj4gKwlzY2hlZHVsZV93b3JrKCZjdHgt PmV4dGNvbl93cSk7Cj4gKwlyZXR1cm4gTk9USUZZX0RPTkU7Cj4gK30KPiArCj4gK3N0YXRpYyB2 b2lkIGFueDc2MjVfY2hpcF9jb250cm9sKHN0cnVjdCBhbng3NjI1X2RhdGEgKmN0eCkKPiArewo+ ICsJaW50IHN0YXRlID0gZXh0Y29uX2dldF9zdGF0ZShjdHgtPmV4dGNvbiwgRVhUQ09OX0RJU1Bf RFApOwo+ICsKPiArCWlmIChjdHgtPnBkYXRhLmxvd19wb3dlcl9tb2RlKSB7Cj4gKwkJaWYgKHN0 YXRlID4gMCkgewo+ICsJCQlpZiAoYXRvbWljX3JlYWQoJmN0eC0+cG93ZXJfc3RhdHVzKSA9PSAw KSB7Cj4gKwkJCQlhbng3NjI1X3Bvd2VyX29uX2luaXQoY3R4KTsKPiArCQkJCWF0b21pY19zZXQo JmN0eC0+cG93ZXJfc3RhdHVzLCAxKTsKPiArCQkJfQo+ICsJCX0gZWxzZSB7Cj4gKwkJCWlmIChh dG9taWNfcmVhZCgmY3R4LT5wb3dlcl9zdGF0dXMpID09IDEpIHsKPiArCQkJCWFueDc2MjVfcG93 ZXJfc3RhbmRieShjdHgpOwo+ICsJCQkJYXRvbWljX3NldCgmY3R4LT5wb3dlcl9zdGF0dXMsIDAp Owo+ICsJCQl9Cj4gKwkJfQo+ICsJfQo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBhbng3NjI1X2V4 dGNvbl93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKPiArewo+ICsJc3RydWN0IGFueDc2 MjVfZGF0YSAqY3R4ID0KPiArCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGFueDc2MjVfZGF0 YSwgZXh0Y29uX3dxKTsKPiArCj4gKwltdXRleF9sb2NrKCZjdHgtPmxvY2spOwo+ICsJYW54NzYy NV9jaGlwX2NvbnRyb2woY3R4KTsKPiArCW11dGV4X3VubG9jaygmY3R4LT5sb2NrKTsKPiArfQo+ ICsKPiArc3RhdGljIGludCBhbng3NjI1X2V4dGNvbl9ub3RpZmllcl9pbml0KHN0cnVjdCBhbng3 NjI1X2RhdGEgKmN0eCkKPiArewo+ICsJaW50IHJldDsKPiArCXN0cnVjdCBkZXZpY2UgKmRldiA9 ICZjdHgtPmNsaWVudC0+ZGV2Owo+ICsKPiArCWN0eC0+ZXZlbnRfbmIubm90aWZpZXJfY2FsbCA9 IGFueDc2MjVfZXh0Y29uX25vdGlmaWVyOwo+ICsJSU5JVF9XT1JLKCZjdHgtPmV4dGNvbl93cSwg YW54NzYyNV9leHRjb25fd29yayk7Cj4gKwlyZXQgPSBkZXZtX2V4dGNvbl9yZWdpc3Rlcl9ub3Rp ZmllcigmY3R4LT5jbGllbnQtPmRldiwgY3R4LT5leHRjb24sCj4gKwkJCQkJICAgIEVYVENPTl9E SVNQX0RQLCAmY3R4LT5ldmVudF9uYik7Cj4gKwlpZiAocmV0KSB7Cj4gKwkJRFJNX0RFVl9FUlJP UihkZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgbm90aWZpZXIgZm9yIERQIik7Cj4gKwkJcmV0dXJu IHJldDsKPiArCX0KPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBhbng3NjI1 X2ZyZWVfZ3BpbyhzdHJ1Y3QgYW54NzYyNV9kYXRhICpwbGF0Zm9ybSkKPiArewo+ICsJaWYgKHBs YXRmb3JtLT5wZGF0YS5ncGlvX2ludHJfaHBkKQo+ICsJCWdwaW9fZnJlZShwbGF0Zm9ybS0+cGRh dGEuZ3Bpb19pbnRyX2hwZCk7Cj4gKwo+ICsJaWYgKHBsYXRmb3JtLT5wZGF0YS5sb3dfcG93ZXJf bW9kZSkgewo+ICsJCWdwaW9fZnJlZShwbGF0Zm9ybS0+cGRhdGEuZ3Bpb19yZXNldCk7Cj4gKwkJ Z3Bpb19mcmVlKHBsYXRmb3JtLT5wZGF0YS5ncGlvX3Bfb24pOwo+ICsJfQo+ICt9Cj4gKwo+ICtz dGF0aWMgaW50IGFueDc2MjVfaW5pdF9ncGlvKHN0cnVjdCBhbng3NjI1X2RhdGEgKnBsYXRmb3Jt KQo+ICt7Cj4gKwlpbnQgcmV0ID0gMDsKPiArCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwbGF0Zm9y bS0+Y2xpZW50LT5kZXY7Cj4gKwo+ICsJRFJNX0RFVl9ERUJVR19EUklWRVIoZGV2LCAiYW54NzYy NSBpbml0IGdwaW9cbiIpOwo+ICsKPiArCWlmIChwbGF0Zm9ybS0+cGRhdGEubG93X3Bvd2VyX21v ZGUpIHsKPiArCQkvKiBncGlvIGZvciBjaGlwIHBvd2VyIGRvd24gKi8KPiArCQlyZXQgPSBncGlv X3JlcXVlc3QocGxhdGZvcm0tPnBkYXRhLmdwaW9fcF9vbiwKPiArCQkJCSAgICJhbng3NjI1X3Bf b25fY3RsIik7Cj4gKwkJaWYgKHJldCkgewo+ICsJCQlEUk1fREVWX0VSUk9SKGRldiwgImZhaWxl ZCB0byByZXF1ZXN0IGdwaW8gJWRcbiIsCj4gKwkJCQkgICAgICBwbGF0Zm9ybS0+cGRhdGEuZ3Bp b19wX29uKTsKPiArCQkJZ290byBlcnIwOwoKQ2hvb3NlIGVycm9yIGxhYmVscyB0aGF0IHNheSB3 aGF0IHRoZSBlcnJvciBoYW5kbGluZyBkb2VzLiAgSW1hZ2luZSBpZgp3ZSBkaWRuJ3QgaGF2ZSBu YW1lcywgd2UganVzdCBhbmQgImludCB2YXIxLCB2YXIyLCB2YXIzOyAgZnVuYzEodmFyMik7Ii4K SXQncyB0aGUgc2FtZSB0aGluZyBmb3IgZXJyb3IgbGFiZWxzLCB0aGUgbmFtZSBzaG91bGQgYmUg dXNlZnVsLgoKSW4gdGhpcyBjYXNlIHRoZSBlcnJvciBoYW5kbGluZyBpcyB3cm9uZyBiZWNhdXNl IHRoZSBncGlvX3JlcXVlc3QoKQpmYWlsZWQgc28gdGhlcmUgaXMgbm8gY2xlYW51cCByZXF1aXJl ZC4gIFdlIHNob3VsZCBhbHdheXMganVzdCBjbGVhbgp1cCB0aGUgbW9zdCByZWNlbnQgYWxsb2Nh dGlvbi4gIEluIHRoaXMgY2FzZSBzaW5jZSB3ZSBoYXZlbid0IGFsbG9jYXRlZAphbnl0aGluZyB3 ZSBjYW4ganVzdCByZXR1cm47CgoJCWlmIChyZXQpIHsKCQkJRFJNX0RFVl9FUlJPUihkZXYsICJm YWlsZWQgdG8gcmVxdWVzdCBncGlvICVkXG4iLAoJCQkJICAgICAgcGxhdGZvcm0tPnBkYXRhLmdw aW9fcF9vbik7CgkJCXJldHVybiByZXQ7CgkJfQoKCj4gKwkJfQo+ICsJCS8qIGdwaW8gZm9yIGNo aXAgcmVzZXQgKi8KPiArCQlyZXQgPSBncGlvX3JlcXVlc3QocGxhdGZvcm0tPnBkYXRhLmdwaW9f cmVzZXQsCj4gKwkJCQkgICAiYW54NzYyNV9yZXNldF9uIik7Cj4gKwkJaWYgKHJldCkgewo+ICsJ CQlEUk1fREVWX0VSUk9SKGRldiwgImZhaWxlZCB0byByZXF1ZXN0IGdwaW8gJWRcbiIsCj4gKwkJ CQkgICAgICBwbGF0Zm9ybS0+cGRhdGEuZ3Bpb19yZXNldCk7Cj4gKwkJCWdvdG8gZXJyMTsKClRo ZSBtb3N0IHJlY2VudCBhbGxvY2F0aW9uIGlzIHNvIGdwaW9fcF9vbiAiZ290byBmcmVlX2dwaW9f cF9vbjsiLgoKPiArCQl9Cj4gKwl9Cj4gKwo+ICsJaWYgKHBsYXRmb3JtLT5wZGF0YS5ncGlvX2lu dHJfaHBkKSB7Cj4gKwkJLyogZ3BpbyBmb3IgY2hpcCBpbnRlcmZhY2UgY29tbXVuYWN0aW9uICov Cj4gKwkJcmV0ID0gZ3Bpb19yZXF1ZXN0KHBsYXRmb3JtLT5wZGF0YS5ncGlvX2ludHJfaHBkLAo+ ICsJCQkJICAgImFueDc2MjVfaHBkIik7Cj4gKwkJaWYgKHJldCkgewo+ICsJCQlEUk1fREVWX0VS Uk9SKGRldiwgImZhaWxlZCB0byByZXF1ZXN0IGdwaW8gJWRcbiIsCj4gKwkJCQkgICAgICBwbGF0 Zm9ybS0+cGRhdGEuZ3Bpb19pbnRyX2hwZCk7Cj4gKwkJCWdvdG8gZXJyMjsKCmdvdG8gZnJlZV9n cGlvX3Jlc2V0OwoKPiArCQl9Cj4gKwl9Cj4gKwo+ICsJZ290byBvdXQ7CgpKdXN0ICJyZXR1cm4g MDsiICAicmV0dXJuIDA7IiBpcyBpbW1lZGlhdGVseSByZWFkYWJsZS4gIFRoZSBsaXR0bGUgZ290 bwpob3BzIGFyb3VuZCBhcmUgbGlrZSBjaGFzaW5nIGEgcmFiYml0LiAgRnVuIGZvciBhIGxpdHRs ZSB3aGlsZSBidXQKdGlyaW5nIGluIHRoZSBlbmQuCgpmcmVlX2dwaW9fcmVzZXQ6CglpZiAocGxh dGZvcm0tPnBkYXRhLmxvd19wb3dlcl9tb2RlKQoJCWdwaW9fZnJlZShwbGF0Zm9ybS0+cGRhdGEu Z3Bpb19yZXNldCk7CmZyZWVfZ3Bpb19wX29uOgoJaWYgKHBsYXRmb3JtLT5wZGF0YS5sb3dfcG93 ZXJfbW9kZSkKCQlncGlvX2ZyZWUocGxhdGZvcm0tPnBkYXRhLmdwaW9fcF9vbik7CgoJcmV0dXJu IHJldDsKCgo+ICsKPiArZXJyMjoKPiArCWlmIChwbGF0Zm9ybS0+cGRhdGEuZ3Bpb19pbnRyX2hw ZCkKPiArCQlncGlvX2ZyZWUocGxhdGZvcm0tPnBkYXRhLmdwaW9faW50cl9ocGQpOwo+ICtlcnIx Ogo+ICsJaWYgKHBsYXRmb3JtLT5wZGF0YS5sb3dfcG93ZXJfbW9kZSkKPiArCQlncGlvX2ZyZWUo cGxhdGZvcm0tPnBkYXRhLmdwaW9fcmVzZXQpOwo+ICtlcnIwOgo+ICsJaWYgKHBsYXRmb3JtLT5w ZGF0YS5sb3dfcG93ZXJfbW9kZSkKPiArCQlncGlvX2ZyZWUocGxhdGZvcm0tPnBkYXRhLmdwaW9f cF9vbik7Cj4gKwo+ICsJcmV0dXJuIDE7CgpyZXR1cm5pbmcgMSBoZXJlIGlzIGEgYnVnIGJlY2F1 c2UgaXQgZ2V0IHByb3BvZ2F0ZWQgb3V0c2lkZSB0aGUgZHJpdmVyLgoKPiArb3V0Ogo+ICsKPiAr CXJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBhbng3NjI1X3N0b3BfZHBfd29yayhz dHJ1Y3QgYW54NzYyNV9kYXRhICpjdHgpCj4gK3sKPiArCWN0eC0+aHBkX3N0YXR1cyA9IDA7Cj4g KwljdHgtPmhwZF9oaWdoX2NudCA9IDA7Cj4gKwljdHgtPmRpc3BsYXlfdGltaW5nX3ZhbGlkID0g MDsKPiArCj4gKwlrZnJlZShjdHgtPnNsaW1wb3J0X2VkaWRfcCk7Cj4gKwljdHgtPnNsaW1wb3J0 X2VkaWRfcCA9IE5VTEw7Cj4gKwo+ICsJaWYgKGN0eC0+cGRhdGEubG93X3Bvd2VyX21vZGUgPT0g MCkKPiArCQlhbng3NjI1X2Rpc2FibGVfcGRfcHJvdG9jb2woY3R4KTsKPiArfQo+ICsKPiArc3Rh dGljIHZvaWQgYW54NzYyNV9zdGFydF9kcF93b3JrKHN0cnVjdCBhbng3NjI1X2RhdGEgKmN0eCkK PiArewo+ICsJaW50IHJldDsKPiArCXU4IGJ1ZltNQVhfRFBDRF9CVUZGRVJfU0laRV07Cj4gKwl1 OCBoZGNwX2NhcDsKPiArCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZjdHgtPmNsaWVudC0+ZGV2Owo+ ICsKPiArCXU4IHNwX3R4X2J3OyAvKiBsaW5rdHJhaW5pbmcgYmFud2lkdGggKi8KPiArCXU4IHNw X3R4X2xhbmVfY291bnQ7IC8qIGxpbmsgdHJhaW5pbmcgbGFuZSBjb3VudCAqLwo+ICsKPiArCWlm IChjdHgtPmhwZF9oaWdoX2NudCA+PSAyKSB7Cj4gKwkJRFJNX0RFVl9ERUJVR19EUklWRVIoZGV2 LCAiYW54NzYyNSBmaWx0ZXIgdXNlbGVzcyBIUERcbiIpOwo+ICsJCXJldHVybjsKPiArCX0KPiAr Cj4gKwljdHgtPmhwZF9oaWdoX2NudCsrOwo+ICsKPiArCXNwX3R4X2dldF9yeF9idyhjdHgsICZz cF90eF9idyk7Cj4gKwo+ICsJc3BfdHhfYXV4X2RwY2RyZWFkX2J5dGVzKGN0eCwgMHgwMCwgMHgw MCwgRFBDRF9NQVhfTEFORV9DT1VOVCwKPiArCQkJCSAxLCAmc3BfdHhfbGFuZV9jb3VudCk7Cj4g Kwo+ICsJc3BfdHhfbGFuZV9jb3VudCA9IHNwX3R4X2xhbmVfY291bnQgJiAweDFmOwo+ICsJc3Bf dHhfYXV4X2RwY2RyZWFkX2J5dGVzKGN0eCwgMHgwNiwgMHg4MCwgMHgyOCwgMSwgYnVmKTsvKiBy ZWFkIEJjYXAgKi8KPiArCj4gKwloZGNwX2NhcCA9IGJ1ZlswXSAmIDB4MDE7Cj4gKwo+ICsJLyog bm90IHN1cHBvcnQgSERDUCAqLwo+ICsJcmV0ID0gYW54NzYyNV93cml0ZV9hbmQoY3R4LCBjdHgt PmkyYy5yeF9wMV9jbGllbnQsIDB4ZWUsIDB4OWYpOwo+ICsKPiArCWlmIChoZGNwX2NhcCA9PSAw eDAxKQo+ICsJCURSTV9ERVZfREVCVUdfRFJJVkVSKGRldiwgIkhEQ1AxLjRcbiIpOwo+ICsKPiAr CS8qIHRyeSBhdXRoIGZsYWcgKi8KPiArCXJldCB8PSBhbng3NjI1X3dyaXRlX29yKGN0eCwgY3R4 LT5pMmMucnhfcDFfY2xpZW50LCAweGVjLCAweDEwKTsKPiArCS8qIGludGVycnVwdCBmb3IgRFJN ICovCj4gKwlyZXQgfD0gYW54NzYyNV93cml0ZV9vcihjdHgsIGN0eC0+aTJjLnJ4X3AxX2NsaWVu dCwgMHhmZiwgMHgwMSk7Cj4gKwlpZiAocmV0IDwgMCkKPiArCQlyZXR1cm47Cj4gKwlEUk1fREVW X0RFQlVHX0RSSVZFUihkZXYsICJNQVggQlc9JTAyeCwgTUFYIExhbmUgY250PSUwMngsIEhEQ1A9 JTAyeFxuIiwKPiArCQkJICAgICAodTMyKXNwX3R4X2J3LAo+ICsJCQkgICAgICh1MzIpc3BfdHhf bGFuZV9jb3VudCwKPiArCQkJICAgICAodTMyKWhkY3BfY2FwKTsKPiArCj4gKwlyZXQgPSBhbng3 NjI1X3JlZ19yZWFkKGN0eCwgY3R4LT5pMmMucnhfcDFfY2xpZW50LCAweDg2KTsKPiArCWlmIChy ZXQgPCAwKQo+ICsJCXJldHVybjsKPiArCj4gKwlEUk1fREVWX0RFQlVHX0RSSVZFUihkZXYsICJT ZWN1cmUgT0NNIHZlcnNpb249JTAyeFxuIiwgcmV0KTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQg ZHBfaHBkX2NoYW5nZV9oYW5kbGVyKHN0cnVjdCBhbng3NjI1X2RhdGEgKmN0eCwgYm9vbCBvbikK PiArewo+ICsJc3RydWN0IGRldmljZSAqZGV2ID0gJmN0eC0+Y2xpZW50LT5kZXY7Cj4gKwo+ICsJ LyogaHBkIGNoYW5nZWQgKi8KPiArCURSTV9ERVZfREVCVUdfRFJJVkVSKGRldiwgImRwX2hwZF9j aGFuZ2VfZGVmYXVsdF9mdW5jOiAlZFxuIiwKPiArCQkJICAgICAodTMyKW9uKTsKPiArCj4gKwlp ZiAob24gPT0gMCkgewo+ICsJCURSTV9ERVZfREVCVUdfRFJJVkVSKGRldiwgIiBIUEQgbG93XG4i KTsKPiArCQlhbng3NjI1X3N0b3BfZHBfd29yayhjdHgpOwo+ICsJfSBlbHNlIHsKPiArCQlEUk1f REVWX0RFQlVHX0RSSVZFUihkZXYsICIgSFBEIGhpZ2hcbiIpOwo+ICsJCWFueDc2MjVfc3RhcnRf ZHBfd29yayhjdHgpOwo+ICsJfQo+ICsKPiArCWN0eC0+aHBkX3N0YXR1cyA9IG9uOwo+ICt9Cj4g Kwo+ICtzdGF0aWMgaW50IGFueDc2MjVfaHBkX2NoYW5nZV9kZXRlY3Qoc3RydWN0IGFueDc2MjVf ZGF0YSAqY3R4KQo+ICt7Cj4gKwlpbnQgaW50cl92ZWN0b3IsIHN0YXR1czsKPiArCXN0cnVjdCBk ZXZpY2UgKmRldiA9ICZjdHgtPmNsaWVudC0+ZGV2Owo+ICsKPiArCURSTV9ERVZfREVCVUdfRFJJ VkVSKGRldiwgInBvd2VyX3N0YXR1cz0lZFxuIiwKPiArCQkJICAgICAodTMyKWF0b21pY19yZWFk KCZjdHgtPnBvd2VyX3N0YXR1cykpOwo+ICsKPiArCXN0YXR1cyA9IGFueDc2MjVfcmVnX3dyaXRl KGN0eCwgY3R4LT5pMmMudGNwY19jbGllbnQsCj4gKwkJCQkgICBJTlRSX0FMRVJUXzEsIDB4RkYp Owo+ICsJaWYgKHN0YXR1cyA8IDApIHsKPiArCQlEUk1fRVJST1IoIklPIGVycm9yIDogY2xlYXIg YWxlcnQgcmVnaXN0ZXIuXG4iKTsKPiArCQlyZXR1cm4gc3RhdHVzOwo+ICsJfQo+ICsKPiArCWlu dHJfdmVjdG9yID0gYW54NzYyNV9yZWdfcmVhZChjdHgsIGN0eC0+aTJjLnJ4X3AwX2NsaWVudCwK PiArCQkJCSAgICAgICBJTlRFUkZBQ0VfQ0hBTkdFX0lOVCk7Cj4gKwlpZiAoaW50cl92ZWN0b3Ig PCAwKSB7Cj4gKwkJRFJNX0VSUk9SKCJJTyBlcnJvciA6IGFjY2VzcyBpbnRlcnJ1cHQgY2hhbmdl IHJlZ2lzdGVyLlxuIik7Cj4gKwkJcmV0dXJuIGludHJfdmVjdG9yOwo+ICsJfQo+ICsJRFJNX0RF Vl9ERUJVR19EUklWRVIoZGV2LCAiMHg3ZToweDQ0PSV4XG4iLCBpbnRyX3ZlY3Rvcik7Cj4gKwlz dGF0dXMgPSBhbng3NjI1X3JlZ193cml0ZShjdHgsIGN0eC0+aTJjLnJ4X3AwX2NsaWVudCwKPiAr CQkJCSAgIElOVEVSRkFDRV9DSEFOR0VfSU5ULAo+ICsJCQkJICAgaW50cl92ZWN0b3IgJiAofmlu dHJfdmVjdG9yKSk7Cj4gKwlpZiAoc3RhdHVzIDwgMCkgewo+ICsJCURSTV9FUlJPUigiSU8gZXJy b3IgOiBjbGVhciBpbnRlcnJ1cHQgY2hhbmdlIHJlZ2lzdGVyLlxuIik7Cj4gKwkJcmV0dXJuIHN0 YXR1czsKPiArCX0KPiArCj4gKwlpZiAoaW50cl92ZWN0b3IgJiBIUERfU1RBVFVTX0NIQU5HRSkg ewo+ICsJCXN0YXR1cyA9IGFueDc2MjVfcmVnX3JlYWQoY3R4LCBjdHgtPmkyYy5yeF9wMF9jbGll bnQsCj4gKwkJCQkJICBTWVNURU1fU1RTVFVTKTsKPiArCQlpZiAoc3RhdHVzIDwgMCkgewo+ICsJ CQlEUk1fRVJST1IoIklPIGVycm9yIDogY2xlYXIgaW50ZXJydXB0IHN0YXR1cy5cbiIpOwo+ICsJ CQlyZXR1cm4gc3RhdHVzOwo+ICsJCX0KPiArCj4gKwkJRFJNX0RFVl9ERUJVR19EUklWRVIoZGV2 LCAiMHg3ZToweDQ1PSV4XG4iLCBzdGF0dXMpOwo+ICsJCWRwX2hwZF9jaGFuZ2VfaGFuZGxlcihj dHgsIHN0YXR1cyAmIEhQRF9TVEFUVVMpOwo+ICsJCXJldHVybiAxOwo+ICsJfQo+ICsKPiArCXJl dHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBhbng3NjI1X3dvcmtfZnVuYyhzdHJ1Y3Qg d29ya19zdHJ1Y3QgKndvcmspCj4gK3sKPiArCWludCBldmVudDsKPiArCXN0cnVjdCBhbng3NjI1 X2RhdGEgKmN0eCA9IGNvbnRhaW5lcl9vZih3b3JrLAo+ICsJCQkJCQlzdHJ1Y3QgYW54NzYyNV9k YXRhLCB3b3JrKTsKPiArCj4gKwltdXRleF9sb2NrKCZjdHgtPmxvY2spOwo+ICsJZXZlbnQgPSBh bng3NjI1X2hwZF9jaGFuZ2VfZGV0ZWN0KGN0eCk7Cj4gKwltdXRleF91bmxvY2soJmN0eC0+bG9j ayk7Cj4gKwo+ICsJaWYgKGV2ZW50IDwgMCkKPiArCQlyZXR1cm47Cj4gKwo+ICsJaWYgKGV2ZW50 ICYmIGN0eC0+YnJpZGdlX2F0dGFjaGVkKQo+ICsJCWRybV9oZWxwZXJfaHBkX2lycV9ldmVudChj dHgtPmNvbm5lY3Rvci5kZXYpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaXJxcmV0dXJuX3QgYW54NzYy NV9pbnRyX2hwZF9pc3IoaW50IGlycSwgdm9pZCAqZGF0YSkKPiArewo+ICsJc3RydWN0IGFueDc2 MjVfZGF0YSAqY3R4ID0gKHN0cnVjdCBhbng3NjI1X2RhdGEgKilkYXRhOwo+ICsKPiArCWlmIChh dG9taWNfcmVhZCgmY3R4LT5wb3dlcl9zdGF0dXMpICE9IDEpCj4gKwkJcmV0dXJuIElSUV9OT05F Owo+ICsKPiArCXF1ZXVlX3dvcmsoY3R4LT53b3JrcXVldWUsICZjdHgtPndvcmspOwo+ICsKPiAr CXJldHVybiBJUlFfSEFORExFRDsKPiArfQo+ICsKPiArI2lmZGVmIENPTkZJR19PRgo+ICtzdGF0 aWMgaW50IGFueDc2MjVfcGFyc2VfZHQoc3RydWN0IGRldmljZSAqZGV2LAo+ICsJCQkgICAgc3Ry dWN0IGFueDc2MjVfcGxhdGZvcm1fZGF0YSAqcGRhdGEpCj4gK3sKPiArCWludCByZXQ7Cj4gKwlz dHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gZGV2LT5vZl9ub2RlOwo+ICsKPiArCXJldCA9IG9mX3By b3BlcnR5X3JlYWRfdTMyKGRldi0+b2Zfbm9kZSwgImxvdy1wb3dlci1tb2RlIiwKPiArCQkJCSAg ICZwZGF0YS0+bG93X3Bvd2VyX21vZGUpOwo+ICsJaWYgKHJldCkKPiArCQlwZGF0YS0+bG93X3Bv d2VyX21vZGUgPSAxOyAvKiBkZWZhdWx0IGxvdyBwb3dlciBtb2RlICovCj4gKwo+ICsJcmV0ID0g b2ZfcHJvcGVydHlfcmVhZF91MzIoZGV2LT5vZl9ub2RlLCAiZHNpLXN1cHBvcnRlZCIsCj4gKwkJ CQkgICAmcGRhdGEtPmRzaV9zdXBwb3J0ZWQpOwo+ICsJaWYgKHJldCkKPiArCQlwZGF0YS0+ZHNp X3N1cHBvcnRlZCA9IDE7IC8qIGRlZmF1bHQgZHNpIG1vZGUgKi8KPiArCj4gKwlyZXQgPSBvZl9w cm9wZXJ0eV9yZWFkX3UzMihkZXYtPm9mX25vZGUsICJleHRjb24tc3VwcG9ydGVkIiwKPiArCQkJ CSAgICZwZGF0YS0+ZXh0Y29uX3N1cHBvcnRlZCk7Cj4gKwlpZiAocmV0KQo+ICsJCXBkYXRhLT5l eHRjb25fc3VwcG9ydGVkID0gMDsKPiArCj4gKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihk ZXYtPm9mX25vZGUsICJpbnRlcm5hbC1wYW5uZWwtc3VwcG9ydGVkIiwKPiArCQkJCSAgICZwZGF0 YS0+aW50ZXJuYWxfcGFubmVsKTsKPiArCWlmIChyZXQpCj4gKwkJcGRhdGEtPmludGVybmFsX3Bh bm5lbCA9IDA7Cj4gKwo+ICsJb2ZfcHJvcGVydHlfcmVhZF91MzIoZGV2LT5vZl9ub2RlLCAiZHNp LWNoYW5uZWwtaWQiLAo+ICsJCQkgICAgICZwZGF0YS0+ZHNpX2NoYW5uZWwpOwo+ICsKPiArCW9m X3Byb3BlcnR5X3JlYWRfdTMyKGRldi0+b2Zfbm9kZSwgImRzaS1sYW5lcy1udW0iLCAmcGRhdGEt PmRzaV9sYW5lcyk7Cj4gKwo+ICsJcGRhdGEtPmhvc3Rfbm9kZSA9IG9mX2dyYXBoX2dldF9yZW1v dGVfbm9kZShucCwgMCwgMCk7Cj4gKwlpZiAocGRhdGEtPmhvc3Rfbm9kZSkKPiArCQlvZl9ub2Rl X3B1dChwZGF0YS0+aG9zdF9ub2RlKTsKPiArCj4gKwlEUk1fREVWX0RFQlVHX0RSSVZFUihkZXYs ICJsb3dfcG93ZXJfbW9kZSA6ICVkLCBkc2lfc3VwcG9ydGVkIDogJWRcbiIsCj4gKwkJCSAgICAg cGRhdGEtPmxvd19wb3dlcl9tb2RlLCBwZGF0YS0+ZHNpX3N1cHBvcnRlZCk7Cj4gKwlEUk1fREVW X0RFQlVHX0RSSVZFUihkZXYsICJkc2lfY2hhbm5lbCA6ICVkLCBkc2lfbGFuZXMgOiAlZCwgJXMg bm9kZVxuIiwKPiArCQkJICAgICBwZGF0YS0+ZHNpX2NoYW5uZWwsIHBkYXRhLT5kc2lfbGFuZXMs Cj4gKwkJCSAgICAgKCFwZGF0YS0+aG9zdF9ub2RlKSA/ICJub3QiIDogImhhcyIpOwo+ICsKPiAr CWlmIChwZGF0YS0+bG93X3Bvd2VyX21vZGUpIHsKPiArCQlwZGF0YS0+Z3Bpb19wX29uID0KPiAr CQkJb2ZfZ2V0X25hbWVkX2dwaW9fZmxhZ3MobnAsICJwb24tZ3Bpb3MiLAo+ICsJCQkJCQkwLCBO VUxMKTsKPiArCj4gKwkJcGRhdGEtPmdwaW9fcmVzZXQgPQo+ICsJCQlvZl9nZXRfbmFtZWRfZ3Bp b19mbGFncyhucCwgInJlc2V0LWdwaW9zIiwKPiArCQkJCQkJMCwgTlVMTCk7Cj4gKwkJRFJNX0RF Vl9ERUJVR19EUklWRVIoZGV2LCAiZ3BpbyBwX29uIDogJWQsIHJlc2V0IDogJWRcbiIsCj4gKwkJ CQkgICAgIHBkYXRhLT5ncGlvX3Bfb24sIHBkYXRhLT5ncGlvX3Jlc2V0KTsKPiArCX0KPiArCj4g KwlwZGF0YS0+Z3Bpb19pbnRyX2hwZCA9Cj4gKwkJb2ZfZ2V0X25hbWVkX2dwaW9fZmxhZ3MobnAs ICJocGQtZ3Bpb3MiLCAwLCBOVUxMKTsKPiArCj4gKwlEUk1fREVWX0RFQlVHX0RSSVZFUihkZXYs ICJncGlvIGhwZCA6ICVkXG4iLCBwZGF0YS0+Z3Bpb19pbnRyX2hwZCk7Cj4gKwo+ICsJcmV0dXJu IDA7Cj4gK30KPiArI2Vsc2UKPiArc3RhdGljIGludCBhbng3NjI1X3BhcnNlX2R0KHN0cnVjdCBk ZXZpY2UgKmRldiwKPiArCQkJICAgIHN0cnVjdCBhbng3NjI1X3BsYXRmb3JtX2RhdGEgKnBkYXRh KQo+ICt7Cj4gKwlyZXR1cm4gLUVOT0RFVjsKPiArfQo+ICsjZW5kaWYKPiArCj4gK3N0YXRpYyBp bmxpbmUgc3RydWN0IGFueDc2MjVfZGF0YSAqY29ubmVjdG9yX3RvX2FueDc2MjUoc3RydWN0IGRy bV9jb25uZWN0b3IgKmMpCj4gK3sKPiArCXJldHVybiBjb250YWluZXJfb2YoYywgc3RydWN0IGFu eDc2MjVfZGF0YSwgY29ubmVjdG9yKTsKPiArfQo+ICsKPiArc3RhdGljIGlubGluZSBzdHJ1Y3Qg YW54NzYyNV9kYXRhICpicmlkZ2VfdG9fYW54NzYyNShzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdl KQo+ICt7Cj4gKwlyZXR1cm4gY29udGFpbmVyX29mKGJyaWRnZSwgc3RydWN0IGFueDc2MjVfZGF0 YSwgYnJpZGdlKTsKPiArfQo+ICsKPiArc3RhdGljIGludCBhbng3NjI1X3JlYWRfaHBkX3N0YXR1 c19wMChzdHJ1Y3QgYW54NzYyNV9kYXRhICpjdHgpCj4gK3sKPiArCXJldHVybiBhbng3NjI1X3Jl Z19yZWFkKGN0eCwgY3R4LT5pMmMucnhfcDBfY2xpZW50LCBTWVNURU1fU1RTVFVTKTsKPiArfQo+ ICsKPiArc3RhdGljIGludCBhbng3NjI1X2dldF9tb2RlcyhzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAq Y29ubmVjdG9yKQo+ICt7Cj4gKwlzdHJ1Y3QgYW54NzYyNV9kYXRhICpjdHggPSBjb25uZWN0b3Jf dG9fYW54NzYyNShjb25uZWN0b3IpOwo+ICsJaW50IGVyciwgbnVtX21vZGVzID0gMDsKPiArCWlu dCB2YWwsIHJldDsKPiArCXN0cnVjdCBzX2VkaWRfZGF0YSAqcF9lZGlkID0gKHN0cnVjdCBzX2Vk aWRfZGF0YSAqKWN0eC0+c2xpbXBvcnRfZWRpZF9wOwo+ICsJc3RydWN0IGRldmljZSAqZGV2ID0g JmN0eC0+Y2xpZW50LT5kZXY7Cj4gKwo+ICsJRFJNX0RFVl9ERUJVR19EUklWRVIoZGV2LCAiZHJt IGdldCBtb2Rlc1xuIik7Cj4gKwo+ICsJaWYgKGN0eC0+cGRhdGEuaW50ZXJuYWxfcGFubmVsICYm Cj4gKwkgICAgY3R4LT5wZGF0YS5sb3dfcG93ZXJfbW9kZSAmJgo+ICsJICAgICghYXRvbWljX3Jl YWQoJmN0eC0+cG93ZXJfc3RhdHVzKSkpIHsKPiArCQlhbng3NjI1X3Bvd2VyX29uX2luaXQoY3R4 KTsKPiArCQlhdG9taWNfc2V0KCZjdHgtPnBvd2VyX3N0YXR1cywgMSk7Cj4gKwo+ICsJCXJldCA9 IHJlYWR4X3BvbGxfdGltZW91dChhbng3NjI1X3JlYWRfaHBkX3N0YXR1c19wMCwKPiArCQkJCQkg Y3R4LCB2YWwsCj4gKwkJCQkJICgodmFsICYgSFBEX1NUQVRVUykgfHwgKHZhbCA8IDApKSwKPiAr CQkJCQkgNTAwMCwKPiArCQkJCQkgNTAwMCAqIDEwMCk7Cj4gKwkJaWYgKHJldCkgewo+ICsJCQlE Uk1fREVWX0VSUk9SKGRldiwgIkhQRCBzdGF0dXMgcG9sbGluZyB0aW1lb3V0IVxuIik7Cj4gKwkJ fSBlbHNlIHsKPiArCQkJRFJNX0RFVl9ERUJVR19EUklWRVIoZGV2LCAiSFBEIHJhaXNlIHVwLlxu Iik7Cj4gKwkJCWFueDc2MjVfcmVnX3dyaXRlKGN0eCwgY3R4LT5pMmMudGNwY19jbGllbnQsCj4g KwkJCQkJICBJTlRSX0FMRVJUXzEsIDB4RkYpOwo+ICsJCQlhbng3NjI1X3JlZ193cml0ZShjdHgs IGN0eC0+aTJjLnJ4X3AwX2NsaWVudCwKPiArCQkJCQkgIElOVEVSRkFDRV9DSEFOR0VfSU5ULCAw KTsKPiArCQl9Cj4gKwo+ICsJCWFueDc2MjVfc3RhcnRfZHBfd29yayhjdHgpOwo+ICsJfQo+ICsK PiArCWlmIChXQVJOX09OKCFhdG9taWNfcmVhZCgmY3R4LT5wb3dlcl9zdGF0dXMpKSkKPiArCQly ZXR1cm4gMDsKPiArCj4gKwlpZiAoY3R4LT5zbGltcG9ydF9lZGlkX3AgJiYgY3R4LT5zbGltcG9y dF9lZGlkX3AtPmVkaWRfYmxvY2tfbnVtID49IDApCj4gKwkJcmV0dXJuIGRybV9hZGRfZWRpZF9t b2Rlcyhjb25uZWN0b3IsCj4gKwkJCQkJICAoc3RydWN0IGVkaWQgKikKPiArCQkJCQkgICZwX2Vk aWQtPmVkaWRfcmF3X2RhdGEpOwo+ICsKPiArCW11dGV4X2xvY2soJmN0eC0+bG9jayk7Cj4gKwo+ ICsJaWYgKCFjdHgtPnNsaW1wb3J0X2VkaWRfcCkKPiArCQljdHgtPnNsaW1wb3J0X2VkaWRfcCA9 IGt6YWxsb2Moc2l6ZW9mKCpjdHgtPnNsaW1wb3J0X2VkaWRfcCksCj4gKwkJCQkJICAgICAgIEdG UF9LRVJORUwpOwoKQWRkIGEgY2hlY2sgZm9yIE5VTEwuCgo+ICsJcF9lZGlkID0gY3R4LT5zbGlt cG9ydF9lZGlkX3A7Cj4gKwlwX2VkaWQtPmVkaWRfYmxvY2tfbnVtID0gc3BfdHhfZWRpZF9yZWFk KGN0eCwgcF9lZGlkLT5lZGlkX3Jhd19kYXRhKTsKPiArCWlmIChwX2VkaWQtPmVkaWRfYmxvY2tf bnVtIDwgMCkgewo+ICsJCURSTV9FUlJPUigiRmFpbGVkIHRvIHJlYWQgRURJRC5cbiIpOwo+ICsJ CWdvdG8gdW5sb2NrOwo+ICsJfQo+ICsKPiArCWVyciA9IGRybV9jb25uZWN0b3JfdXBkYXRlX2Vk aWRfcHJvcGVydHkoY29ubmVjdG9yLAo+ICsJCQkJCQkgKHN0cnVjdCBlZGlkICopCj4gKwkJCQkJ CSAmcF9lZGlkLT5lZGlkX3Jhd19kYXRhKTsKPiArCj4gKwlpZiAoZXJyKSB7Cj4gKwkJRFJNX0VS Uk9SKCJGYWlsZWQgdG8gdXBkYXRlIEVESUQgcHJvcGVydHk6ICVkXG4iLCBlcnIpOwo+ICsJCWdv dG8gdW5sb2NrOwo+ICsJfQo+ICsKPiArCW51bV9tb2RlcyA9IGRybV9hZGRfZWRpZF9tb2Rlcyhj b25uZWN0b3IsCj4gKwkJCQkgICAgICAgKHN0cnVjdCBlZGlkICopJnBfZWRpZC0+ZWRpZF9yYXdf ZGF0YSk7Cj4gKwo+ICt1bmxvY2s6Cj4gKwltdXRleF91bmxvY2soJmN0eC0+bG9jayk7Cj4gKwo+ ICsJcmV0dXJuIG51bV9tb2RlczsKPiArfQo+ICsKPiArc3RhdGljIGVudW0gZHJtX21vZGVfc3Rh dHVzCj4gK2FueDc2MjVfY29ubmVjdG9yX21vZGVfdmFsaWQoc3RydWN0IGRybV9jb25uZWN0b3Ig KmNvbm5lY3RvciwKPiArCQkJICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkKPiAr ewo+ICsJc3RydWN0IGFueDc2MjVfZGF0YSAqY3R4ID0gY29ubmVjdG9yX3RvX2FueDc2MjUoY29u bmVjdG9yKTsKPiArCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZjdHgtPmNsaWVudC0+ZGV2Owo+ICsK PiArCURSTV9ERVZfREVCVUdfRFJJVkVSKGRldiwgImRybSBtb2RlcyB2YWxpZCB2ZXJpZnlcbiIp Owo+ICsKPiArCWlmIChtb2RlLT5jbG9jayA+IDMwMDAwMCkKPiArCQlyZXR1cm4gTU9ERV9DTE9D S19ISUdIOwo+ICsKPiArCXJldHVybiBNT0RFX09LOwo+ICt9Cj4gKwo+ICtzdGF0aWMgc3RydWN0 IGRybV9jb25uZWN0b3JfaGVscGVyX2Z1bmNzIGFueDc2MjVfY29ubmVjdG9yX2hlbHBlcl9mdW5j cyA9IHsKPiArCS5nZXRfbW9kZXMgPSBhbng3NjI1X2dldF9tb2RlcywKPiArCS5tb2RlX3ZhbGlk ID0gYW54NzYyNV9jb25uZWN0b3JfbW9kZV92YWxpZCwKPiArfTsKPiArCj4gK3N0YXRpYyBlbnVt IGRybV9jb25uZWN0b3Jfc3RhdHVzIGFueDc2MjVfZGV0ZWN0KHN0cnVjdCBkcm1fY29ubmVjdG9y ICpjb25uZWN0b3IsCj4gKwkJCQkJCWJvb2wgZm9yY2UpCj4gK3sKPiArCXN0cnVjdCBhbng3NjI1 X2RhdGEgKmN0eCA9IGNvbm5lY3Rvcl90b19hbng3NjI1KGNvbm5lY3Rvcik7Cj4gKwlzdHJ1Y3Qg ZGV2aWNlICpkZXYgPSAmY3R4LT5jbGllbnQtPmRldjsKPiArCj4gKwlpZiAoIShjdHgtPmhwZF9z dGF0dXMpKQoKUmVtb3ZlIGV4dHJhIHBhcmVucy4KCj4gKwkJcmV0dXJuIGNvbm5lY3Rvcl9zdGF0 dXNfZGlzY29ubmVjdGVkOwo+ICsKPiArCURSTV9ERVZfREVCVUdfRFJJVkVSKGRldiwgImRybSBk ZXRlY3RcbiIpOwo+ICsKPiArCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZDsKPiAr fQo+ICsKPiArc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fY29ubmVjdG9yX2Z1bmNzIGFueDc2MjVf Y29ubmVjdG9yX2Z1bmNzID0gewo+ICsJLmZpbGxfbW9kZXMgPSBkcm1faGVscGVyX3Byb2JlX3Np bmdsZV9jb25uZWN0b3JfbW9kZXMsCj4gKwkuZGV0ZWN0ID0gYW54NzYyNV9kZXRlY3QsCj4gKwku ZGVzdHJveSA9IGRybV9jb25uZWN0b3JfY2xlYW51cCwKPiArCS5yZXNldCA9IGRybV9hdG9taWNf aGVscGVyX2Nvbm5lY3Rvcl9yZXNldCwKPiArCS5hdG9taWNfZHVwbGljYXRlX3N0YXRlID0gZHJt X2F0b21pY19oZWxwZXJfY29ubmVjdG9yX2R1cGxpY2F0ZV9zdGF0ZSwKPiArCS5hdG9taWNfZGVz dHJveV9zdGF0ZSA9IGRybV9hdG9taWNfaGVscGVyX2Nvbm5lY3Rvcl9kZXN0cm95X3N0YXRlLAo+ ICt9Owo+ICsKPiArc3RhdGljIHZvaWQgYW54NzYyNV9hdHRhY2hfZHNpKHN0cnVjdCBhbng3NjI1 X2RhdGEgKmN0eCkKPiArewo+ICsJc3RydWN0IG1pcGlfZHNpX2hvc3QgKmhvc3Q7Cj4gKwlzdHJ1 Y3QgbWlwaV9kc2lfZGV2aWNlICpkc2k7Cj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY3R4LT5j bGllbnQtPmRldjsKPiArCWNvbnN0IHN0cnVjdCBtaXBpX2RzaV9kZXZpY2VfaW5mbyBpbmZvID0g ewo+ICsJCS50eXBlID0gImFueDc2MjUiLAo+ICsJCS5jaGFubmVsID0gY3R4LT5wZGF0YS5kc2lf Y2hhbm5lbCwKPiArCQkubm9kZSA9IE5VTEwsCj4gKwl9Owo+ICsKPiArCURSTV9ERVZfREVCVUdf RFJJVkVSKGRldiwgImF0dGFjaCBkc2lcbiIpOwo+ICsKPiArCWhvc3QgPSBvZl9maW5kX21pcGlf ZHNpX2hvc3RfYnlfbm9kZShjdHgtPnBkYXRhLmhvc3Rfbm9kZSk7Cj4gKwlpZiAoIWhvc3QpIHsK PiArCQlEUk1fRVJST1IoImZhaWxlZCB0byBmaW5kIGRzaSBob3N0LlxuIik7Cj4gKwkJcmV0dXJu OwoKSSBmZWVsIGxpa2UgdGhpcyBzaG91bGQgcmVhbGx5IHJldHVybiBuZWdhdGl2ZSBlcnJvciBj b2Rlcy4KCj4gKwl9Cj4gKwo+ICsJZHNpID0gbWlwaV9kc2lfZGV2aWNlX3JlZ2lzdGVyX2Z1bGwo aG9zdCwgJmluZm8pOwo+ICsJaWYgKElTX0VSUihkc2kpKSB7Cj4gKwkJRFJNX0VSUk9SKCJmYWls ZWQgdG8gY3JlYXRlIGRzaSBkZXZpY2UuXG4iKTsKPiArCQlyZXR1cm47Cj4gKwl9Cj4gKwo+ICsJ ZHNpLT5sYW5lcyA9IGN0eC0+cGRhdGEuZHNpX2xhbmVzOwo+ICsJZHNpLT5mb3JtYXQgPSBNSVBJ X0RTSV9GTVRfUkdCODg4Owo+ICsJZHNpLT5tb2RlX2ZsYWdzID0gTUlQSV9EU0lfTU9ERV9WSURF Twl8Cj4gKwkJTUlQSV9EU0lfTU9ERV9WSURFT19TWU5DX1BVTFNFCXwKPiArCQlNSVBJX0RTSV9N T0RFX0VPVF9QQUNLRVQJfAo+ICsJCU1JUElfRFNJX01PREVfVklERU9fSFNFOwo+ICsKPiArCWlm IChtaXBpX2RzaV9hdHRhY2goZHNpKSA8IDApIHsKPiArCQlEUk1fRVJST1IoImZhaWxlZCB0byBh dHRhY2ggZHNpIHRvIGhvc3QuXG4iKTsKPiArCQltaXBpX2RzaV9kZXZpY2VfdW5yZWdpc3Rlcihk c2kpOwo+ICsJCXJldHVybjsKPiArCX0KPiArCj4gKwljdHgtPmRzaSA9IGRzaTsKPiArCj4gKwlE Uk1fREVWX0RFQlVHX0RSSVZFUihkZXYsICJhdHRhY2ggZHNpIHN1Y2NlZWRlZC5cbiIpOwo+ICt9 Cj4gKwo+ICtzdGF0aWMgdm9pZCBhbng3NjI1X2RldGFjaF9kc2koc3RydWN0IGFueDc2MjVfZGF0 YSAqY3R4KQo+ICt7Cj4gKwlpZiAoY3R4LT5kc2kpIHsKPiArCQltaXBpX2RzaV9kZXRhY2goY3R4 LT5kc2kpOwo+ICsJCW1pcGlfZHNpX2RldmljZV91bnJlZ2lzdGVyKGN0eC0+ZHNpKTsKPiArCX0K PiArfQo+ICsKPiArc3RhdGljIGludCBhbng3NjI1X2JyaWRnZV9hdHRhY2goc3RydWN0IGRybV9i cmlkZ2UgKmJyaWRnZSkKPiArewo+ICsJc3RydWN0IGFueDc2MjVfZGF0YSAqY3R4ID0gYnJpZGdl X3RvX2FueDc2MjUoYnJpZGdlKTsKPiArCWludCBlcnI7Cj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXYg PSAmY3R4LT5jbGllbnQtPmRldjsKPiArCj4gKwlEUk1fREVWX0RFQlVHX0RSSVZFUihkZXYsICJk cm0gYXR0YWNoXG4iKTsKPiArCWlmICghYnJpZGdlLT5lbmNvZGVyKSB7Cj4gKwkJRFJNX0VSUk9S KCJQYXJlbnQgZW5jb2RlciBvYmplY3Qgbm90IGZvdW5kIik7Cj4gKwkJcmV0dXJuIC1FTk9ERVY7 Cj4gKwl9Cj4gKwo+ICsJZXJyID0gZHJtX2Nvbm5lY3Rvcl9pbml0KGJyaWRnZS0+ZGV2LCAmY3R4 LT5jb25uZWN0b3IsCj4gKwkJCQkgJmFueDc2MjVfY29ubmVjdG9yX2Z1bmNzLAo+ICsJCQkJIERS TV9NT0RFX0NPTk5FQ1RPUl9EaXNwbGF5UG9ydCk7Cj4gKwlpZiAoZXJyKSB7Cj4gKwkJRFJNX0VS Uk9SKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBjb25uZWN0b3I6ICVkXG4iLCBlcnIpOwo+ICsJCXJl dHVybiBlcnI7Cj4gKwl9Cj4gKwo+ICsJZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfYWRkKCZjdHgtPmNv bm5lY3RvciwKPiArCQkJCSAmYW54NzYyNV9jb25uZWN0b3JfaGVscGVyX2Z1bmNzKTsKPiArCj4g KwllcnIgPSBkcm1fY29ubmVjdG9yX3JlZ2lzdGVyKCZjdHgtPmNvbm5lY3Rvcik7Cj4gKwlpZiAo ZXJyKSB7Cj4gKwkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gcmVnaXN0ZXIgY29ubmVjdG9yOiAlZFxu IiwgZXJyKTsKPiArCQlyZXR1cm4gZXJyOwo+ICsJfQo+ICsKPiArCWN0eC0+Y29ubmVjdG9yLnBv bGxlZCA9IERSTV9DT05ORUNUT1JfUE9MTF9IUEQ7Cj4gKwo+ICsJZXJyID0gZHJtX2Nvbm5lY3Rv cl9hdHRhY2hfZW5jb2RlcigmY3R4LT5jb25uZWN0b3IsIGJyaWRnZS0+ZW5jb2Rlcik7Cj4gKwlp ZiAoZXJyKSB7Cj4gKwkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gbGluayB1cCBjb25uZWN0b3IgdG8g ZW5jb2RlcjogJWRcbiIsIGVycik7Cj4gKwkJZHJtX2Nvbm5lY3Rvcl91bnJlZ2lzdGVyKCZjdHgt PmNvbm5lY3Rvcik7Cj4gKwkJcmV0dXJuIGVycjsKPiArCX0KPiArCj4gKwlhbng3NjI1X2F0dGFj aF9kc2koY3R4KTsKPiArCj4gKwljdHgtPmJyaWRnZV9hdHRhY2hlZCA9IDE7Cj4gKwo+ICsJcmV0 dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyBlbnVtIGRybV9tb2RlX3N0YXR1cwo+ICthbng3NjI1 X2JyaWRnZV9tb2RlX3ZhbGlkKHN0cnVjdCBkcm1fYnJpZGdlICpicmlkZ2UsCj4gKwkJCSAgY29u c3Qgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpCj4gK3sKPiArCXN0cnVjdCBhbng3NjI1 X2RhdGEgKmN0eCA9IGJyaWRnZV90b19hbng3NjI1KGJyaWRnZSk7Cj4gKwlzdHJ1Y3QgZGV2aWNl ICpkZXYgPSAmY3R4LT5jbGllbnQtPmRldjsKPiArCj4gKwlEUk1fREVWX0RFQlVHX0RSSVZFUihk ZXYsICJkcm0gbW9kZSBjaGVja2luZ1xuIik7Cj4gKwo+ICsJLyogTWF4IDEyMDBwIGF0IDUuNCBH aHosIG9uZSBsYW5lLCBwaXhlbCBjbG9jayAzMDBNICovCj4gKwlpZiAobW9kZS0+Y2xvY2sgPiAz MDAwMDApIHsKPiArCQlEUk1fREVWX0RFQlVHX0RSSVZFUihkZXYsCj4gKwkJCQkgICAgICJkcm0g bW9kZSBpbnZhbGlkLCBwaXhlbGNsb2NrIHRvbyBoaWdoLlxuIik7Cj4gKwkJcmV0dXJuIE1PREVf Q0xPQ0tfSElHSDsKPiArCX0KPiArCj4gKwlEUk1fREVWX0RFQlVHX0RSSVZFUihkZXYsICJkcm0g bW9kZSB2YWxpZC5cbiIpOwo+ICsJcmV0dXJuIE1PREVfT0s7Cj4gK30KPiArCj4gK3N0YXRpYyB2 b2lkIGFueDc2MjVfYnJpZGdlX21vZGVfc2V0KHN0cnVjdCBkcm1fYnJpZGdlICpicmlkZ2UsCj4g KwkJCQkgICAgY29uc3Qgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm9sZF9tb2RlLAo+ICsJCQkJ ICAgIGNvbnN0IHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKQo+ICt7Cj4gKwlzdHJ1Y3Qg YW54NzYyNV9kYXRhICpjdHggPSBicmlkZ2VfdG9fYW54NzYyNShicmlkZ2UpOwo+ICsJc3RydWN0 IGRldmljZSAqZGV2ID0gJmN0eC0+Y2xpZW50LT5kZXY7Cj4gKwo+ICsJRFJNX0RFVl9ERUJVR19E UklWRVIoZGV2LCAiZHJtIG1vZGUgc2V0XG4iKTsKCllvdSBjYW4gZ2V0IGJldHRlciBpbmZvcm1h dGlvbiB3aXRoIGZ0cmFjZS4KCj4gKwo+ICsJaWYgKFdBUk5fT04oIWF0b21pY19yZWFkKCZjdHgt PnBvd2VyX3N0YXR1cykpKQo+ICsJCXJldHVybjsKPiArCj4gKwltdXRleF9sb2NrKCZjdHgtPmxv Y2spOwo+ICsKPiArCWN0eC0+ZHQucGl4ZWxjbG9jay5taW4gPSBtb2RlLT5jbG9jazsKPiArCWN0 eC0+ZHQuaGFjdGl2ZS5taW4gPSBtb2RlLT5oZGlzcGxheTsKPiArCWN0eC0+ZHQuaHN5bmNfbGVu Lm1pbiA9IG1vZGUtPmhzeW5jX2VuZCAtIG1vZGUtPmhzeW5jX3N0YXJ0Owo+ICsJY3R4LT5kdC5o ZnJvbnRfcG9yY2gubWluID0gbW9kZS0+aHN5bmNfc3RhcnQgLSBtb2RlLT5oZGlzcGxheTsKPiAr CWN0eC0+ZHQuaGJhY2tfcG9yY2gubWluID0gbW9kZS0+aHRvdGFsIC0gbW9kZS0+aHN5bmNfZW5k Owo+ICsJY3R4LT5kdC52YWN0aXZlLm1pbiA9IG1vZGUtPnZkaXNwbGF5Owo+ICsJY3R4LT5kdC52 c3luY19sZW4ubWluID0gbW9kZS0+dnN5bmNfZW5kIC0gbW9kZS0+dnN5bmNfc3RhcnQ7Cj4gKwlj dHgtPmR0LnZmcm9udF9wb3JjaC5taW4gPSBtb2RlLT52c3luY19zdGFydCAtIG1vZGUtPnZkaXNw bGF5Owo+ICsJY3R4LT5kdC52YmFja19wb3JjaC5taW4gPSBtb2RlLT52dG90YWwgLSBtb2RlLT52 c3luY19lbmQ7Cj4gKwo+ICsJY3R4LT5kaXNwbGF5X3RpbWluZ192YWxpZCA9IDE7Cj4gKwo+ICsJ RFJNX0RFVl9ERUJVR19EUklWRVIoZGV2LCAicGl4ZWxjbG9jayglZCkuXG4iLCBjdHgtPmR0LnBp eGVsY2xvY2subWluKTsKPiArCURSTV9ERVZfREVCVUdfRFJJVkVSKGRldiwgImhhY3RpdmUoJWQp LCBoc3luYyglZCksIGhmcCglZCksIGhicCglZClcbiIsCj4gKwkJCSAgICAgY3R4LT5kdC5oYWN0 aXZlLm1pbiwKPiArCQkJICAgICBjdHgtPmR0LmhzeW5jX2xlbi5taW4sCj4gKwkJCSAgICAgY3R4 LT5kdC5oZnJvbnRfcG9yY2gubWluLAo+ICsJCQkgICAgIGN0eC0+ZHQuaGJhY2tfcG9yY2gubWlu KTsKPiArCURSTV9ERVZfREVCVUdfRFJJVkVSKGRldiwgInZhY3RpdmUoJWQpLCB2c3luYyglZCks IHZmcCglZCksIHZicCglZClcbiIsCj4gKwkJCSAgICAgY3R4LT5kdC52YWN0aXZlLm1pbiwKPiAr CQkJICAgICBjdHgtPmR0LnZzeW5jX2xlbi5taW4sCj4gKwkJCSAgICAgY3R4LT5kdC52ZnJvbnRf cG9yY2gubWluLAo+ICsJCQkgICAgIGN0eC0+ZHQudmJhY2tfcG9yY2gubWluKTsKPiArCURSTV9E RVZfREVCVUdfRFJJVkVSKGRldiwgImhkaXNwbGF5KCVkKSxoc3luY19zdGFydCglZCkuXG4iLAo+ ICsJCQkgICAgIG1vZGUtPmhkaXNwbGF5LAo+ICsJCQkgICAgIG1vZGUtPmhzeW5jX3N0YXJ0KTsK PiArCURSTV9ERVZfREVCVUdfRFJJVkVSKGRldiwgImhzeW5jX2VuZCglZCksaHRvdGFsKCVkKS5c biIsCj4gKwkJCSAgICAgbW9kZS0+aHN5bmNfZW5kLAo+ICsJCQkgICAgIG1vZGUtPmh0b3RhbCk7 Cj4gKwlEUk1fREVWX0RFQlVHX0RSSVZFUihkZXYsICJ2ZGlzcGxheSglZCksdnN5bmNfc3RhcnQo JWQpLlxuIiwKPiArCQkJICAgICBtb2RlLT52ZGlzcGxheSwKPiArCQkJICAgICBtb2RlLT52c3lu Y19zdGFydCk7Cj4gKwlEUk1fREVWX0RFQlVHX0RSSVZFUihkZXYsICJ2c3luY19lbmQoJWQpLHZ0 b3RhbCglZCkuXG4iLAo+ICsJCQkgICAgIG1vZGUtPnZzeW5jX2VuZCwKPiArCQkJICAgICBtb2Rl LT52dG90YWwpOwo+ICsKPiArCW11dGV4X3VubG9jaygmY3R4LT5sb2NrKTsKPiArfQo+ICsKPiAr c3RhdGljIHZvaWQgYW54NzYyNV9icmlkZ2VfZW5hYmxlKHN0cnVjdCBkcm1fYnJpZGdlICpicmlk Z2UpCj4gK3sKPiArCXN0cnVjdCBhbng3NjI1X2RhdGEgKmN0eCA9IGJyaWRnZV90b19hbng3NjI1 KGJyaWRnZSk7Cj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY3R4LT5jbGllbnQtPmRldjsKPiAr Cj4gKwlEUk1fREVWX0RFQlVHX0RSSVZFUihkZXYsICJkcm0gZW5hYmxlXG4iKTsKCmZ0cmFjZS4K Cj4gKwo+ICsJaWYgKFdBUk5fT04oIWF0b21pY19yZWFkKCZjdHgtPnBvd2VyX3N0YXR1cykpKQo+ ICsJCXJldHVybjsKPiArCj4gKwltdXRleF9sb2NrKCZjdHgtPmxvY2spOwo+ICsKPiArCWFueDc2 MjVfZHBfc3RhcnQoY3R4KTsKPiArCj4gKwltdXRleF91bmxvY2soJmN0eC0+bG9jayk7Cj4gK30K PiArCj4gK3N0YXRpYyB2b2lkIGFueDc2MjVfYnJpZGdlX2Rpc2FibGUoc3RydWN0IGRybV9icmlk Z2UgKmJyaWRnZSkKPiArewo+ICsJc3RydWN0IGFueDc2MjVfZGF0YSAqY3R4ID0gYnJpZGdlX3Rv X2FueDc2MjUoYnJpZGdlKTsKPiArCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZjdHgtPmNsaWVudC0+ ZGV2Owo+ICsKPiArCWlmIChXQVJOX09OKCFhdG9taWNfcmVhZCgmY3R4LT5wb3dlcl9zdGF0dXMp KSkKPiArCQlyZXR1cm47Cj4gKwo+ICsJRFJNX0RFVl9ERUJVR19EUklWRVIoZGV2LCAiZHJtIGRp c2FibGVcbiIpOwoKZnRyYWNlLgoKPiArCW11dGV4X2xvY2soJmN0eC0+bG9jayk7Cj4gKwo+ICsJ YW54NzYyNV9kcF9zdG9wKGN0eCk7Cj4gKwo+ICsJaWYgKGN0eC0+cGRhdGEuaW50ZXJuYWxfcGFu bmVsICYmCj4gKwkgICAgY3R4LT5wZGF0YS5sb3dfcG93ZXJfbW9kZSAmJgo+ICsJICAgIChhdG9t aWNfcmVhZCgmY3R4LT5wb3dlcl9zdGF0dXMpKSkgewo+ICsJCWFueDc2MjVfc3RvcF9kcF93b3Jr KGN0eCk7Cj4gKwkJYW54NzYyNV9wb3dlcl9zdGFuZGJ5KGN0eCk7Cj4gKwkJYXRvbWljX3NldCgm Y3R4LT5wb3dlcl9zdGF0dXMsIDApOwo+ICsJfQo+ICsKPiArCW11dGV4X3VubG9jaygmY3R4LT5s b2NrKTsKPiArfQo+ICsKPiArc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fYnJpZGdlX2Z1bmNzIGFu eDc2MjVfYnJpZGdlX2Z1bmNzID0gewo+ICsJLmF0dGFjaCA9IGFueDc2MjVfYnJpZGdlX2F0dGFj aCwKPiArCS5kaXNhYmxlID0gYW54NzYyNV9icmlkZ2VfZGlzYWJsZSwKPiArCS5tb2RlX3ZhbGlk ID0gYW54NzYyNV9icmlkZ2VfbW9kZV92YWxpZCwKPiArCS5tb2RlX3NldCA9IGFueDc2MjVfYnJp ZGdlX21vZGVfc2V0LAo+ICsJLmVuYWJsZSA9IGFueDc2MjVfYnJpZGdlX2VuYWJsZSwKPiArfTsK PiArCj4gK3N0YXRpYyBpbnQgYW54NzYyNV9yZWdpc3Rlcl9pMmNfZHVtbXlfY2xpZW50cyhzdHJ1 Y3QgYW54NzYyNV9kYXRhICpjdHgsCj4gKwkJCQkJICAgICAgc3RydWN0IGkyY19jbGllbnQgKmNs aWVudCkKPiArewo+ICsJY3R4LT5pMmMudHhfcDBfY2xpZW50ID0gaTJjX25ld19kdW1teShjbGll bnQtPmFkYXB0ZXIsCj4gKwkJCQkJICAgICBUWF9QMF9BRERSID4+IDEpOwo+ICsJY3R4LT5pMmMu dHhfcDFfY2xpZW50ID0gaTJjX25ld19kdW1teShjbGllbnQtPmFkYXB0ZXIsCj4gKwkJCQkJICAg ICAgVFhfUDFfQUREUiA+PiAxKTsKPiArCWN0eC0+aTJjLnR4X3AyX2NsaWVudCA9IGkyY19uZXdf ZHVtbXkoY2xpZW50LT5hZGFwdGVyLAo+ICsJCQkJCSAgICAgIFRYX1AyX0FERFIgPj4gMSk7Cj4g Kwo+ICsJY3R4LT5pMmMucnhfcDBfY2xpZW50ID0gaTJjX25ld19kdW1teShjbGllbnQtPmFkYXB0 ZXIsCj4gKwkJCQkJICAgICAgUlhfUDBfQUREUiA+PiAxKTsKPiArCWN0eC0+aTJjLnJ4X3AxX2Ns aWVudCA9IGkyY19uZXdfZHVtbXkoY2xpZW50LT5hZGFwdGVyLAo+ICsJCQkJCSAgICAgIFJYX1Ax X0FERFIgPj4gMSk7Cj4gKwljdHgtPmkyYy5yeF9wMl9jbGllbnQgPSBpMmNfbmV3X2R1bW15KGNs aWVudC0+YWRhcHRlciwKPiArCQkJCQkgICAgICBSWF9QMl9BRERSID4+IDEpOwo+ICsKPiArCWN0 eC0+aTJjLnRjcGNfY2xpZW50ID0gaTJjX25ld19kdW1teShjbGllbnQtPmFkYXB0ZXIsCj4gKwkJ CQkJICAgICBUQ1BDX0lOVEVSRkFDRV9BRERSID4+IDEpOwo+ICsKPiArCWlmICgoIWN0eC0+aTJj LnR4X3AwX2NsaWVudCB8Cj4gKwkgICAgICFjdHgtPmkyYy50eF9wMV9jbGllbnQgfAo+ICsJICAg ICAhY3R4LT5pMmMudHhfcDJfY2xpZW50IHwKPiArCSAgICAgIWN0eC0+aTJjLnJ4X3AwX2NsaWVu dCB8Cj4gKwkgICAgICFjdHgtPmkyYy5yeF9wMV9jbGllbnQgfAo+ICsJICAgICAhY3R4LT5pMmMu cnhfcDJfY2xpZW50IHwKPiArCSAgICAgIWN0eC0+aTJjLnRjcGNfY2xpZW50KSAhPSAwKQoKVGhp cyBpcyB0b28gY29tcGxpY2F0ZWQuICBEb24ndCByZXR1cm4gMSBvbiBmYWlsdXJlLiAgRXZlcnkg ZnVuY3Rpb24Kc2hvdWxkIGNsZWFuIHVwIGl0J3Mgb3duIHBhcnRpYWwgYWxsb2NhdGlvbnMuCgoJ aWYgKCFjdHgtPmkyYy50eF9wMF9jbGllbnQgfHwKCSAgICAhY3R4LT5pMmMudHhfcDFfY2xpZW50 IHx8CgkJLi4uCgkgICAgIWN0eC0+aTJjLnRjcGNfY2xpZW50KSB7CgkJYW54NzYyNV91bnJlZ2lz dGVyX2kyY19kdW1teV9jbGllbnRzKGN0eCk7CgkJcmV0dXJuIC1FTk9NRU07Cgl9Cgo+ICsJCXJl dHVybiAxOwo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBhbng3NjI1 X3VucmVnaXN0ZXJfaTJjX2R1bW15X2NsaWVudHMoc3RydWN0IGFueDc2MjVfZGF0YSAqY3R4KQo+ ICt7Cj4gKwlpMmNfdW5yZWdpc3Rlcl9kZXZpY2UoY3R4LT5pMmMudHhfcDBfY2xpZW50KTsKPiAr CWkyY191bnJlZ2lzdGVyX2RldmljZShjdHgtPmkyYy50eF9wMV9jbGllbnQpOwo+ICsJaTJjX3Vu cmVnaXN0ZXJfZGV2aWNlKGN0eC0+aTJjLnR4X3AyX2NsaWVudCk7Cj4gKwlpMmNfdW5yZWdpc3Rl cl9kZXZpY2UoY3R4LT5pMmMucnhfcDFfY2xpZW50KTsKPiArCWkyY191bnJlZ2lzdGVyX2Rldmlj ZShjdHgtPmkyYy5yeF9wMl9jbGllbnQpOwo+ICsJaTJjX3VucmVnaXN0ZXJfZGV2aWNlKGN0eC0+ aTJjLnJ4X3AzX2NsaWVudCk7Cj4gKwlpMmNfdW5yZWdpc3Rlcl9kZXZpY2UoY3R4LT5pMmMudGNw Y19jbGllbnQpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGFueDc2MjVfaTJjX3Byb2JlKHN0cnVj dCBpMmNfY2xpZW50ICpjbGllbnQsCj4gKwkJCSAgICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2Vf aWQgKmlkKQo+ICt7Cj4gKwlzdHJ1Y3QgYW54NzYyNV9kYXRhICpwbGF0Zm9ybTsKPiArCXN0cnVj dCBhbng3NjI1X3BsYXRmb3JtX2RhdGEgKnBkYXRhOwo+ICsJaW50IHJldCA9IDA7Cj4gKwlzdHJ1 Y3QgZGV2aWNlICpkZXYgPSAmY2xpZW50LT5kZXY7Cj4gKwo+ICsJaWYgKCFpMmNfY2hlY2tfZnVu Y3Rpb25hbGl0eShjbGllbnQtPmFkYXB0ZXIsCj4gKwkJCQkgICAgIEkyQ19GVU5DX1NNQlVTX0ky Q19CTE9DSykpIHsKPiArCQlEUk1fREVWX0VSUk9SKGRldiwgImFueDc2MjUncyBpMmMgYnVzIGRv ZXNuJ3Qgc3VwcG9ydFxuIik7Cj4gKwkJcmV0ID0gLUVOT0RFVjsKPiArCQlnb3RvIGV4aXQ7Cgpy ZXR1cm4gLUVOT0RFVjsKCj4gKwl9Cj4gKwo+ICsJcGxhdGZvcm0gPSBremFsbG9jKHNpemVvZigq cGxhdGZvcm0pLCBHRlBfS0VSTkVMKTsKPiArCWlmICghcGxhdGZvcm0pIHsKPiArCQlEUk1fREVW X0VSUk9SKGRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSBkcml2ZXIgZGF0YVxuIik7Cj4gKwkJcmV0 ID0gLUVOT01FTTsKPiArCQlnb3RvIGV4aXQ7CgpVc2UgZGV2bV9remFsbG9jKCk/ICByZXR1cm4g LUVOT01FTTsKCj4gKwl9Cj4gKwo+ICsJcGRhdGEgPSAmcGxhdGZvcm0tPnBkYXRhOwo+ICsKPiAr CS8qIGRldmljZSB0cmVlIHBhcnNpbmcgZnVuY3Rpb24gY2FsbCAqLwo+ICsJcmV0ID0gYW54NzYy NV9wYXJzZV9kdCgmY2xpZW50LT5kZXYsIHBkYXRhKTsKPiArCWlmIChyZXQgIT0gMCkJLyogaWYg b2NjdXJzIGVycm9yICovCgpPbmx5IHVzZSA9PSAwIHdoZW4geW91IGFyZSB0YWxraW5nIGFib3V0 IG51bWJlcnMgYXMgaW4gaWYgKHNpemUgPT0gMCkgb3IKaWYgKGNudCA9PSAwKSBvciBmb3Igc3Ry Y21wKCkgPT0gMC4gIEhlcmUgemVybyBpcyB0aGUgYWJzZW5jZSBvZiBlcnJvcnMKc28gaXQgc2hv dWxkIGJlICJpZiAocmV0KSAiLgoKPiArCQlnb3RvIGVycjA7Cgpnb3RvIGZyZWVfcGxhdGZyb207 Cgo+ICsKPiArCS8qIHRvIGFjY2VzcyBnbG9iYWwgcGxhdGZvcm0gZGF0YSAqLwo+ICsJcGxhdGZv cm0tPmNsaWVudCA9IGNsaWVudDsKPiArCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIHBsYXRm b3JtKTsKPiArCj4gKwlpZiAocGxhdGZvcm0tPnBkYXRhLmV4dGNvbl9zdXBwb3J0ZWQpIHsKPiAr CQkvKiBnZXQgZXh0Y29uIGRldmljZSBmcm9tIERUUyAqLwo+ICsJCXBsYXRmb3JtLT5leHRjb24g PSBleHRjb25fZ2V0X2VkZXZfYnlfcGhhbmRsZSgmY2xpZW50LT5kZXYsIDApOwo+ICsJCWlmIChQ VFJfRVJSKHBsYXRmb3JtLT5leHRjb24pID09IC1FUFJPQkVfREVGRVIpCj4gKwkJCWdvdG8gZXJy MDsKPiArCQlpZiAoSVNfRVJSKHBsYXRmb3JtLT5leHRjb24pKSB7Cj4gKwkJCURSTV9ERVZfRVJS T1IoJmNsaWVudC0+ZGV2LAo+ICsJCQkJICAgICAgImNhbiBub3QgZ2V0IGV4dGNvbiBkZXZpY2Uh Iik7Cj4gKwkJCWdvdG8gZXJyMDsKPiArCQl9Cj4gKwo+ICsJCXJldCA9IGFueDc2MjVfZXh0Y29u X25vdGlmaWVyX2luaXQocGxhdGZvcm0pOwo+ICsJCWlmIChyZXQgPCAwKQo+ICsJCQlnb3RvIGVy cjA7Cj4gKwl9Cj4gKwo+ICsJYXRvbWljX3NldCgmcGxhdGZvcm0tPnBvd2VyX3N0YXR1cywgMCk7 Cj4gKwo+ICsJbXV0ZXhfaW5pdCgmcGxhdGZvcm0tPmxvY2spOwo+ICsKPiArCXJldCA9IGFueDc2 MjVfaW5pdF9ncGlvKHBsYXRmb3JtKTsKPiArCWlmIChyZXQpIHsKPiArCQlEUk1fREVWX0VSUk9S KGRldiwgImZhaWxlZCB0byBpbml0aWFsaXplIGdwaW9cbiIpOwo+ICsJCWdvdG8gZXJyMDsKPiAr CX0KPiArCj4gKwlJTklUX1dPUksoJnBsYXRmb3JtLT53b3JrLCBhbng3NjI1X3dvcmtfZnVuYyk7 Cj4gKwo+ICsJcGxhdGZvcm0tPndvcmtxdWV1ZSA9IGNyZWF0ZV93b3JrcXVldWUoImFueDc2MjVf d29yayIpOwo+ICsJaWYgKCFwbGF0Zm9ybS0+d29ya3F1ZXVlKSB7Cj4gKwkJRFJNX0RFVl9FUlJP UihkZXYsICJmYWlsZWQgdG8gY3JlYXRlIHdvcmsgcXVldWVcbiIpOwo+ICsJCXJldCA9IC1FTk9N RU07Cj4gKwkJZ290byBlcnIxOwoKZ290byBlcnJfZnJlZV9ncGlvOwoKPiArCX0KPiArCj4gKwlp ZiAocGxhdGZvcm0tPnBkYXRhLmdwaW9faW50cl9ocGQpIHsKPiArCQlwbGF0Zm9ybS0+cGRhdGEu aHBkX2lycSA9Cj4gKwkJCWdwaW9fdG9faXJxKHBsYXRmb3JtLT5wZGF0YS5ncGlvX2ludHJfaHBk KTsKPiArCQlpZiAocGxhdGZvcm0tPnBkYXRhLmhwZF9pcnEgPCAwKSB7Cj4gKwkJCURSTV9ERVZf RVJST1IoZGV2LCAiZmFpbGVkIHRvIGdldCBncGlvIGlycVxuIik7Cj4gKwkJCWdvdG8gZXJyMTsK CkxlYWsuICBnb3RvIGVycl9kZXN0cm95X3dxOwoKPiArCQl9Cj4gKwo+ICsJCXJldCA9IHJlcXVl c3RfdGhyZWFkZWRfaXJxKHBsYXRmb3JtLT5wZGF0YS5ocGRfaXJxLAo+ICsJCQkJCSAgIE5VTEws IGFueDc2MjVfaW50cl9ocGRfaXNyLAo+ICsJCQkJCSAgIElSUUZfVFJJR0dFUl9GQUxMSU5HIHwK PiArCQkJCQkgICBJUlFGX1RSSUdHRVJfUklTSU5HIHwKPiArCQkJCQkgICBJUlFGX09ORVNIT1Qs Cj4gKwkJCQkJICAgImFueDc2MjUtaHBkIiwgcGxhdGZvcm0pOwo+ICsJCWlmIChyZXQgPCAwKSB7 Cj4gKwkJCURSTV9ERVZfRVJST1IoZGV2LCAiZmFpbGVkIHRvIHJlcXVlc3QgaXJxXG4iKTsKPiAr CQkJZ290byBlcnIyOwoKCmdvdG8gZnJlZV93b3JrcXVldWU7Cgo+ICsJCX0KPiArCj4gKwkJcmV0 ID0gaXJxX3NldF9pcnFfd2FrZShwbGF0Zm9ybS0+cGRhdGEuaHBkX2lycSwgMSk7Cj4gKwkJaWYg KHJldCA8IDApIHsKPiArCQkJRFJNX0RFVl9FUlJPUihkZXYsICJSZXF1ZXN0IGlycSBmb3IgaHBk Iik7Cj4gKwkJCURSTV9ERVZfRVJST1IoZGV2LCAiaW50ZXJydXB0IHdha2Ugc2V0IGZhaWxcbiIp Owo+ICsJCQlnb3RvIGVycjI7CgpMZWFrPyAgZ290byBlcnJfZnJlZV9pcnE/CgoKPiArCQl9Cj4g Kwo+ICsJCXJldCA9IGVuYWJsZV9pcnFfd2FrZShwbGF0Zm9ybS0+cGRhdGEuaHBkX2lycSk7Cj4g KwkJaWYgKHJldCA8IDApIHsKPiArCQkJRFJNX0RFVl9FUlJPUihkZXYsICJFbmFibGUgaXJxIGZv ciBIUEQiKTsKPiArCQkJRFJNX0RFVl9FUlJPUihkZXYsICJpbnRlcnJ1cHQgd2FrZSBlbmFibGUg ZmFpbFxuIik7Cj4gKwkJCWdvdG8gZXJyMjsKCkxlYWs/Cgo+ICsJCX0KPiArCX0KPiArCj4gKwlp ZiAoYW54NzYyNV9yZWdpc3Rlcl9pMmNfZHVtbXlfY2xpZW50cyhwbGF0Zm9ybSwgY2xpZW50KSAh PSAwKSB7CgpOb3cgdGhhdCBhbng3NjI1X3JlZ2lzdGVyX2kyY19kdW1teV9jbGllbnRzKCkgcmV0 dXJucyBhIHZhbGlkIGVycm9yCmNvZGUgd2Ugc2hvdWxkIHByZXNlcnZlIGl0LiAgTm8gbmVlZCB0 byByZWxlYXNlIHRoZSBwYXJ0aWFsbHkgYWxsb2NhdGVkCmR1bW15IGNsaWVudHMgYmVjYXVzZSBp dCBlaXRoZXIgYWxsb2NhdGVzIGV2ZXJ5dGhpbmcgb3IgaXQgZG9lc24ndAphbGxvY2F0ZSBhbnl0 aGluZy4KCglyZXQgPSBhbng3NjI1X3JlZ2lzdGVyX2kyY19kdW1teV9jbGllbnRzKCk7CglpZiAo cmV0KQoJCWdvdG8gZXJyX2ZyZWVfaXJxOwoKPiArCQlyZXQgPSAtRU5PTUVNOwo+ICsJCURSTV9F UlJPUigiRmFpbGVkIHRvIHJlc2VydmUgSTJDIGJ1cy5cbiIpOwo+ICsJCWdvdG8gZXJyMzsKPiAr CX0KPiArCj4gKwlpZiAocGxhdGZvcm0tPnBkYXRhLmxvd19wb3dlcl9tb2RlID09IDApIHsKPiAr CQlhbng3NjI1X2Rpc2FibGVfcGRfcHJvdG9jb2wocGxhdGZvcm0pOwo+ICsJCWF0b21pY19zZXQo JnBsYXRmb3JtLT5wb3dlcl9zdGF0dXMsIDEpOwo+ICsJfQo+ICsKPiArCS8qIGFkZCB3b3JrIGZ1 bmN0aW9uICovCj4gKwlxdWV1ZV93b3JrKHBsYXRmb3JtLT53b3JrcXVldWUsICZwbGF0Zm9ybS0+ d29yayk7Cj4gKwo+ICsJcGxhdGZvcm0tPmJyaWRnZS5mdW5jcyA9ICZhbng3NjI1X2JyaWRnZV9m dW5jczsKPiArI2lmIElTX0VOQUJMRUQoQ09ORklHX09GKQo+ICsJcGxhdGZvcm0tPmJyaWRnZS5v Zl9ub2RlID0gY2xpZW50LT5kZXYub2Zfbm9kZTsKPiArI2VuZGlmCgpXZSBjYW4gZ2V0IHJpZCBv ZiB0aGUgaWZkZWYuCgoJaWYgKElTX0VOQUJMRUQoQ09ORklHX09GKSkKCQlwbGF0Zm9ybS0+YnJp ZGdlLm9mX25vZGUgPSBjbGllbnQtPmRldi5vZl9ub2RlOwoKCj4gKwlkcm1fYnJpZGdlX2FkZCgm cGxhdGZvcm0tPmJyaWRnZSk7Cj4gKwo+ICsJRFJNX0RFVl9ERUJVR19EUklWRVIoZGV2LCAicHJv YmUgZG9uZVxuIik7Cj4gKwlnb3RvIGV4aXQ7CgpyZXR1cm4gMDsKCj4gKwo+ICtlcnIzOgo+ICsJ YW54NzYyNV91bnJlZ2lzdGVyX2kyY19kdW1teV9jbGllbnRzKHBsYXRmb3JtKTsKPiArZXJyMjoK PiArCWlmIChwbGF0Zm9ybS0+cGRhdGEuZ3Bpb19pbnRyX2hwZCkKPiArCQlmcmVlX2lycShwbGF0 Zm9ybS0+cGRhdGEuaHBkX2lycSwgcGxhdGZvcm0pOwo+ICtlcnIxOgo+ICsJYW54NzYyNV9mcmVl X2dwaW8ocGxhdGZvcm0pOwo+ICsJZGVzdHJveV93b3JrcXVldWUocGxhdGZvcm0tPndvcmtxdWV1 ZSk7Cj4gK2VycjA6Cj4gKwlrZnJlZShwbGF0Zm9ybSk7Cj4gK2V4aXQ6Cj4gKwlyZXR1cm4gcmV0 OwoKZXJyX2ZyZWVfaXJxOgoJaWYgKHBsYXRmb3JtLT5wZGF0YS5ncGlvX2ludHJfaHBkKQoJCWZy ZWVfaXJxKHBsYXRmb3JtLT5wZGF0YS5ocGRfaXJxLCBwbGF0Zm9ybSk7CmVycl9kZXN0cm95X3dx OgoJZGVzdHJveV93b3JrcXVldWUocGxhdGZvcm0tPndvcmtxdWV1ZSk7CmVycl9mcmVlX2dwaW86 Cglhbng3NjI1X2ZyZWVfZ3BpbyhwbGF0Zm9ybSk7CmVycl9mcmVlX3BsYXRmb3JtOgoJa2ZyZWUo cGxhdGZvcm0pOwoKCXJldHVybiByZXQ7CgoKPiArfQo+ICsKPiArc3RhdGljIGludCBhbng3NjI1 X2kyY19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKPiArewo+ICsJc3RydWN0IGFu eDc2MjVfZGF0YSAqcGxhdGZvcm0gPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKPiArCj4g Kwlkcm1fYnJpZGdlX3JlbW92ZSgmcGxhdGZvcm0tPmJyaWRnZSk7Cj4gKwo+ICsJaWYgKHBsYXRm b3JtLT5wZGF0YS5ncGlvX2ludHJfaHBkKQo+ICsJCWZyZWVfaXJxKHBsYXRmb3JtLT5wZGF0YS5o cGRfaXJxLCBwbGF0Zm9ybSk7Cj4gKwo+ICsJZGVzdHJveV93b3JrcXVldWUocGxhdGZvcm0tPndv cmtxdWV1ZSk7Cj4gKwo+ICsJaWYgKHBsYXRmb3JtLT5wZGF0YS5leHRjb25fc3VwcG9ydGVkKSB7 Cj4gKwkJZGV2bV9leHRjb25fdW5yZWdpc3Rlcl9ub3RpZmllcigmcGxhdGZvcm0tPmNsaWVudC0+ ZGV2LAo+ICsJCQkJCQlwbGF0Zm9ybS0+ZXh0Y29uLAo+ICsJCQkJCQlFWFRDT05fRElTUF9EUCwK PiArCQkJCQkJJnBsYXRmb3JtLT5ldmVudF9uYik7Cj4gKwkJZmx1c2hfd29yaygmcGxhdGZvcm0t PmV4dGNvbl93cSk7Cj4gKwl9Cj4gKwo+ICsJYW54NzYyNV9kZXRhY2hfZHNpKHBsYXRmb3JtKTsK PiArCj4gKwlpZiAocGxhdGZvcm0tPmJyaWRnZV9hdHRhY2hlZCkKPiArCQlkcm1fY29ubmVjdG9y X3VucmVnaXN0ZXIoJnBsYXRmb3JtLT5jb25uZWN0b3IpOwo+ICsKCldlIGRvbid0IGNhbGwgYW54 NzYyNV9hdHRhY2hfZGlzKCkgb3IgZHJtX2Nvbm5lY3Rvcl9yZWdpc3RlcigpIGR1cmluZwpwcm9i ZSBzbyBpdCdzIHdlaXJkIHRoYXQgd2UgYXJlIGRvaW5nIGl0IGluIHJlbW92ZS4KCj4gKwlhbng3 NjI1X3VucmVnaXN0ZXJfaTJjX2R1bW15X2NsaWVudHMocGxhdGZvcm0pOwoKVGhpcyBzaG91bGQg ZG9uZSBiZXR3ZWVuIGRybV9icmlkZ2VfcmVtb3ZlKCkgYW5kIGZyZWVfaXJxKCkgc28gdGhhdAp3 ZSB1bndpbmQgaW4gdGhlIG9wcG9zaXRlL21pcnJvciBvcmRlciBvZiBob3cgd2UgcHJvYmUoKS4K Cj4gKwo+ICsJYW54NzYyNV9mcmVlX2dwaW8ocGxhdGZvcm0pOwo+ICsKPiArCWtmcmVlKHBsYXRm b3JtKTsKPiArCXJldHVybiAwOwo+ICt9CgpyZWdhcmRzLApkYW4gY2FycGVudGVyCl9fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmRyaS1kZXZlbCBtYWlsaW5n IGxpc3QKZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVk ZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbA== From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.3 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY, URIBL_BLOCKED,USER_AGENT_SANE_1 autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3285DC04EBF for ; Mon, 23 Sep 2019 14:04:51 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id DA0A920673 for ; Mon, 23 Sep 2019 14:04:50 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b="rUdbJ/8h" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732451AbfIWOEu (ORCPT ); Mon, 23 Sep 2019 10:04:50 -0400 Received: from aserp2120.oracle.com ([141.146.126.78]:57886 "EHLO aserp2120.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729899AbfIWOEt (ORCPT ); Mon, 23 Sep 2019 10:04:49 -0400 Received: from pps.filterd (aserp2120.oracle.com [127.0.0.1]) by aserp2120.oracle.com (8.16.0.27/8.16.0.27) with SMTP id x8NDx5PF042124; Mon, 23 Sep 2019 14:04:13 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=date : from : to : cc : subject : message-id : references : mime-version : content-type : in-reply-to; s=corp-2019-08-05; bh=O+YhmwqJrHg8o6DEETBNoHqDhZ6WmrPrrzc39GoEXSQ=; b=rUdbJ/8hA/VRkmlkYysbjBYbTVpAIEo5jYl1VG/zBgnaU6yTOaLSH91/KDorVc4oaLac 2X/lPPyu5JYGk95UVccSjCyKHj14FknozrdZVGYlbGhnWAoHLjkLDVTMvWDt3RDmx2uJ YfyleDmNpBiDzewPJiIpbLrTOgPtNCzlMQ4i/t0SpMUDzExvj7A/lNgSJfkaKwe+m6W5 l+uU1tXk4v7lcb7NtY6BF7I3Y8siJzayWrNeJe64B2iiPpPosqWRZ8ZFPv2xcj8306FO UcG/0fKULdRPDIq3OGHekuKGEUpRH8hoWBEeKXbqga4gCJ0OB1Kg2rLgmfMhrZemVEF3 Hw== Received: from aserp3020.oracle.com (aserp3020.oracle.com [141.146.126.70]) by aserp2120.oracle.com with ESMTP id 2v5btpq5w9-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 23 Sep 2019 14:04:13 +0000 Received: from pps.filterd (aserp3020.oracle.com [127.0.0.1]) by aserp3020.oracle.com (8.16.0.27/8.16.0.27) with SMTP id x8NE3dd3083540; Mon, 23 Sep 2019 14:04:12 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserp3020.oracle.com with ESMTP id 2v5bpgefpw-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 23 Sep 2019 14:04:12 +0000 Received: from abhmp0020.oracle.com (abhmp0020.oracle.com [141.146.116.26]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id x8NE47q9025842; Mon, 23 Sep 2019 14:04:07 GMT Received: from kadam (/41.57.98.10) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 23 Sep 2019 07:04:05 -0700 Date: Mon, 23 Sep 2019 17:03:55 +0300 From: Dan Carpenter To: Xin Ji Cc: "devel@driverdev.osuosl.org" , Laurent Pinchart , Andrzej Hajda , Jernej Skrabec , Jonas Karlman , David Airlie , Neil Armstrong , "linux-kernel@vger.kernel.org" , "dri-devel@lists.freedesktop.org" , Sheng Pan , Daniel Vetter Subject: Re: [PATCH v1 2/2] drm/bridge: anx7625: Add anx7625 MIPI to DP bridge driver Message-ID: <20190923140355.GH2959@kadam> References: <02319a7db948900efe0f945b684221ac076bac48.1568957789.git.xji@analogixsemi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <02319a7db948900efe0f945b684221ac076bac48.1568957789.git.xji@analogixsemi.com> User-Agent: Mutt/1.9.4 (2018-02-28) X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9388 signatures=668685 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=2 malwarescore=0 phishscore=0 bulkscore=0 spamscore=0 mlxscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1908290000 definitions=main-1909230138 X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9388 signatures=668685 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 priorityscore=1501 malwarescore=0 suspectscore=2 phishscore=0 bulkscore=0 spamscore=0 clxscore=1011 lowpriorityscore=0 mlxscore=0 impostorscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1908290000 definitions=main-1909230138 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org I wish you would think more about the error codes that you're returning. Most functions do "ret |= frob()." which ORs the error codes together, and results in a nonsense negative error code. But then some functions return 1 on error and zero on success which is sometimes a bug, sometimes confusing but always ugly. On Fri, Sep 20, 2019 at 06:07:43AM +0000, Xin Ji wrote: > The ANX7625 is an ultra-low power 4K Mobile HD Transmitter designed > for portable device. It converts MIPI to DisplayPort 1.3 4K. > > Signed-off-by: Xin Ji > --- > drivers/gpu/drm/bridge/Makefile | 2 +- > drivers/gpu/drm/bridge/analogix/Kconfig | 6 + > drivers/gpu/drm/bridge/analogix/Makefile | 1 + > drivers/gpu/drm/bridge/analogix/anx7625.c | 2085 +++++++++++++++++++++++++++++ > drivers/gpu/drm/bridge/analogix/anx7625.h | 397 ++++++ > 5 files changed, 2490 insertions(+), 1 deletion(-) > create mode 100644 drivers/gpu/drm/bridge/analogix/anx7625.c > create mode 100644 drivers/gpu/drm/bridge/analogix/anx7625.h > > diff --git a/drivers/gpu/drm/bridge/Makefile b/drivers/gpu/drm/bridge/Makefile > index 4934fcf..bcd388a 100644 > --- a/drivers/gpu/drm/bridge/Makefile > +++ b/drivers/gpu/drm/bridge/Makefile > @@ -12,8 +12,8 @@ obj-$(CONFIG_DRM_SII9234) += sii9234.o > obj-$(CONFIG_DRM_THINE_THC63LVD1024) += thc63lvd1024.o > obj-$(CONFIG_DRM_TOSHIBA_TC358764) += tc358764.o > obj-$(CONFIG_DRM_TOSHIBA_TC358767) += tc358767.o > -obj-$(CONFIG_DRM_ANALOGIX_DP) += analogix/ > obj-$(CONFIG_DRM_I2C_ADV7511) += adv7511/ > obj-$(CONFIG_DRM_TI_SN65DSI86) += ti-sn65dsi86.o > obj-$(CONFIG_DRM_TI_TFP410) += ti-tfp410.o > +obj-y += analogix/ > obj-y += synopsys/ > diff --git a/drivers/gpu/drm/bridge/analogix/Kconfig b/drivers/gpu/drm/bridge/analogix/Kconfig > index e930ff9..b2f127e 100644 > --- a/drivers/gpu/drm/bridge/analogix/Kconfig > +++ b/drivers/gpu/drm/bridge/analogix/Kconfig > @@ -2,3 +2,9 @@ > config DRM_ANALOGIX_DP > tristate > depends on DRM > + > +config ANALOGIX_ANX7625 > + tristate "Analogix MIPI to DP interface support" > + help > + ANX7625 is an ultra-low power 4K mobile HD transmitter designed > + for portable devices. It converts MIPI/DPI to DisplayPort1.3 4K. > diff --git a/drivers/gpu/drm/bridge/analogix/Makefile b/drivers/gpu/drm/bridge/analogix/Makefile > index fdbf3fd..8a52867 100644 > --- a/drivers/gpu/drm/bridge/analogix/Makefile > +++ b/drivers/gpu/drm/bridge/analogix/Makefile > @@ -1,3 +1,4 @@ > # SPDX-License-Identifier: GPL-2.0-only > +obj-$(CONFIG_ANALOGIX_ANX7625) += anx7625.o > analogix_dp-objs := analogix_dp_core.o analogix_dp_reg.o > obj-$(CONFIG_DRM_ANALOGIX_DP) += analogix_dp.o > diff --git a/drivers/gpu/drm/bridge/analogix/anx7625.c b/drivers/gpu/drm/bridge/analogix/anx7625.c > new file mode 100644 > index 0000000..eceadef > --- /dev/null > +++ b/drivers/gpu/drm/bridge/analogix/anx7625.c > @@ -0,0 +1,2085 @@ > +// SPDX-License-Identifier: GPL-2.0-only > +/* > + * Copyright(c) 2016, Analogix Semiconductor. All rights reserved. > + * > + */ > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#include > +#include > +#include > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#include