From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from nz-out-0506.google.com (nz-out-0506.google.com [64.233.162.234]) by ozlabs.org (Postfix) with ESMTP id 8842FDDE09 for ; Sat, 17 Nov 2007 05:44:39 +1100 (EST) Received: by nz-out-0506.google.com with SMTP id i1so913480nzh for ; Fri, 16 Nov 2007 10:44:38 -0800 (PST) Message-ID: Date: Fri, 16 Nov 2007 11:44:37 -0700 From: "Alan Bennett" To: linuxppc-dev@ozlabs.org Subject: Configuration of i2c on 8248 (cpm2) help MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_12546_15796975.1195238677228" List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , ------=_Part_12546_15796975.1195238677228 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-Disposition: inline I'm working to adapt some work by Jochen Friedrich to support CPM2 i2c devices. It appears I have the bus loaded and think I am configuring it properly, but my results tell me different. I see no messages when I attach a i2c monitor after u-boot loads. Can anyone spot what is going wrong based on the following information and the resulting output? Does this look proper for a successful configuration of the cpm2 i2c bus? i2c-cpm: iip e0008afc, dp_addr 0x240 i2c-cpm: iic_tbase 576, iic_rbase 608 Any insight would be greatly appreciated. -Alan My Device tree entry: i2c@11860 { compatible = "fsl,mpc8248-i2c", "fsl,cpm2-i2c", "fsl,cpm-i2c"; reg = <11860 20 8afc 30>; interrupts = <1 8>; interrupt-parent = <&PIC>; fsl,cpm-command = <29600000>; }; ... and then later: muram@0 { #address-cells = <1>; #size-cells = <1>; ranges = <0 0 10000>; data@0 { compatible = "fsl,cpm-muram-data"; reg = <80 1f80 9800 800>; }; }; dump of 0xe0008afc (my immr_base=0xe0000000) at boot e0008afc : 02600240 10100201 00000000 00000000 e0008b0c : 02600000 00000000 00000000 00000000 e0008b1c : 02400000 00000000 78c7ebaf bdefeab1 Probe debug results: i2c-cpm: cpm_iic_init() i2c-cpm: iip e0008afc, dp_addr 0x240 i2c-cpm: iic_tbase 576, iic_rbase 608 Log after modprobe: modprobe i2c-dev Jan 1 00:08:02 192 kernel: i2c /dev entries driver Jan 1 00:08:02 192 kernel: i2c-core: driver [dev_driver] registered Jan 1 00:08:02 192 kernel: i2c-dev: adapter [i2c-cpm] registered as minor 0 Log entries after trying an i2cset: (NOTE: sometimes it hangs doing this) i2cset 0 0x41 0x1 0xff b cpm_xfer:478 cpm_parse_message:329 kernel: i2c-adapter i2c-0: ioctl, cmd=0x720, arg=0xbfecaa0c kernel: i2c-adapter i2c-0: master_xfer[0] W, addr=0x41, len2 kernel: cpm_xfer:478 kernel: i2c-adapter i2c-0: i2c-algo-cpm.o: R: 0 T: 0 kernel: cpm_parse_message:329 kernel: i2c-adapter i2c-0: cpm_iic_write(abyte=0x82) kernel: i2c-adapter i2c-0: tx sc 0 bc00 kernel: i2c-adapter i2c-0: test ready. kernel: i2c-adapter i2c-0: not ready. cpm_xfer:478 cpm_parse_message:329 cpm_parse_message:329 kernel: i2c-adapter i2c-0: force_close() kernel: i2c-adapter i2c-0: IIC read: timeout! kernel: i2c-adapter i2c-0: ioctl, cmd=0x720, arg=0xbfecaa0c kernel: i2c-adapter i2c-0: master_xfer[0] W, addr=0x41, len1 kernel: i2c-adapter i2c-0: master_xfer[1] R, addr=0x41, len1 kernel: cpm_xfer:478 kernel: i2c-adapter i2c-0: i2c-algo-cpm.o: R: 0 T: 0 kernel: cpm_parse_message:329 kernel: i2c-adapter i2c-0: cpm_iic_write(abyte=0x82) kernel: i2c-adapter i2c-0: tx sc 0 9400 kernel: i2c-adapter i2c-0: i2c-algo-cpm.o: R: 0 T: 1 kernel: cpm_parse_message:329 kernel: i2c-adapter i2c-0: cpm_iic_read(abyte=0x83) kernel: i2c-adapter i2c-0: test ready. kernel: i2c-adapter i2c-0: not ready. kernel: i2c-adapter i2c-0: force_close() kernel: i2c-adapter i2c-0: IIC read: timeout! ------=_Part_12546_15796975.1195238677228 Content-Type: text/x-csrc; name=i2c-cpm.c Content-Transfer-Encoding: base64 X-Attachment-Id: f_f931hb6i Content-Disposition: attachment; filename=i2c-cpm.c LyoKICogRnJlZXNjYWxlIENQTTEvQ1BNMiBJMkMgaW50ZXJmYWNlLgogKiBDb3B5cmlnaHQgKGMp IDE5OTkgRGFuIE1hbGVrIChkbWFsZWtAamxjLm5ldCkuCiAqCiAqIG1vdmVkIGludG8gcHJvcGVy IGkyYyBpbnRlcmZhY2U7CiAqIEJyYWQgUGFya2VyIChicmFkQGhlZWx0b2UuY29tKQogKgogKiAo QykgMjAwNyBNb250YXZpc3RhIFNvZnR3YXJlLCBJbmMuCiAqIFZpdGFseSBCb3JkdWcgPHZpdGJA a2VybmVsLmNyYXNoaW5nLm9yZz4KICoKICogUlBYIGxpdGUgc3BlY2lmaWMgcGFydHMgb2YgdGhl IGkyYyBpbnRlcmZhY2UKICogVXBkYXRlOiAgVGhlcmUgYWN0dWFsbHkgaXNuJ3QgYW55dGhpbmcg UlBYTGl0ZS1zcGVjaWZpYyBhYm91dCB0aGlzIG1vZHVsZS4KICogVGhpcyBzaG91bGQgd29yayBm b3IgbW9zdCBhbnkgQ1BNIGJvYXJkLiAgVGhlIGNvbnNvbGUgbWVzc2FnZXMgaGF2ZSBiZWVuCiAq IGNoYW5nZWQgdG8gZWxpbWluYXRlIFJQWExpdGUgcmVmZXJlbmNlcy4KICoKICAgIFRoaXMgcHJv Z3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9k aWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNl bnNlIGFzIHB1Ymxpc2hlZCBieQogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0 aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICAgIChhdCB5b3VyIG9wdGlvbikgYW55 IGxhdGVyIHZlcnNpb24uCgogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBo b3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7 IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZ IG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgR05VIEdl bmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhh dmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAg YWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdh cmUKICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEz OSwgVVNBLgogKgogKiBtb3ZlZCBpbnRvIHByb3BlciBpMmMgaW50ZXJmYWNlOyBzZXBhcmF0ZWQg b3V0IHBsYXRmb3JtIHNwZWNpZmljCiAqIHBhcnRzIGludG8gaTJjLTh4eC5jCiAqIEJyYWQgUGFy a2VyIChicmFkQGhlZWx0b2UuY29tKQogKgogKiBQYXJ0cyBmcm9tIGRib3gyX2kyYy5jIChjdnMu dHV4Ym94Lm9yZykKICogKEMpIDIwMDAtMjAwMSBUbWJpbmMsIEdpbGxlbSAoaHRvYUBnbXgubmV0 KQogKgogKiAoQykgMjAwNyBNb250YXZpc3RhIFNvZnR3YXJlLCBJbmMuCiAqIFZpdGFseSBCb3Jk dWcgPHZpdGJAa2VybmVsLmNyYXNoaW5nLm9yZz4KICoKICogQ29udmVydGVkIHRvIG9mX3BsYXRm b3JtX2RldmljZS4gUmVuYW1lZCB0byBpMmMtY3BtLmMuCiAqIChDKSAyMDA3IEpvY2hlbiBGcmll ZHJpY2ggPGpvY2hlbkBzY3JhbS5kZT4KICovCgojaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiNp bmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiNpbmNsdWRl IDxsaW51eC9zbGFiLmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC9p bnRlcnJ1cHQuaD4KI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiNpbmNsdWRlIDxsaW51eC9zY2hl ZC5oPgojaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CiNpbmNsdWRlIDxsaW51eC9pMmMuaD4KI2lu Y2x1ZGUgPGxpbnV4L2lvLmg+CiNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiNpbmNsdWRlIDxsaW51 eC9kbWEtbWFwcGluZy5oPgojaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CiNpbmNsdWRlIDxs aW51eC9vZl9wbGF0Zm9ybS5oPgojaW5jbHVkZSA8c3lzZGV2L2ZzbF9zb2MuaD4KCiNpZmRlZiBD T05GSUdfQ1BNMgojaW5jbHVkZSA8YXNtL2NwbTIuaD4KI2Vsc2UKI2luY2x1ZGUgPGFzbS9jb21t cHJvYy5oPgojZW5kaWYKLyogVHJ5IHRvIGRlZmluZSB0aGlzIGlmIHlvdSBoYXZlIGFuIG9sZGVy IENQVSAoZWFybGllciB0aGFuIHJldiBENCkgKi8KLyogSG93ZXZlciwgYmV0dGVyIHVzZSBhIEdQ SU8gYmFzZWQgYml0YmFuZyBkcml2ZXIgaW4gdGhpcyBjYXNlIDovICAgKi8KI3VuZGVmCUkyQ19D SElQX0VSUkFUQQoKI2RlZmluZSBDUE1fTUFYX1JFQUQgICAgNTEzCiNkZWZpbmUgQ1BNX01BWEJE ICAgICAgIDQKCnN0cnVjdCBjcG1faTJjIHsKCWNoYXIgKmJhc2U7CglzdHJ1Y3Qgb2ZfZGV2aWNl ICpvZmRldjsKCXN0cnVjdCBpMmNfYWRhcHRlciBhZGFwOwoJdWludCBkcF9hZGRyOwoJaW50IHJl bG9jOwoJaW50IGlycTsKCWludCBjcF9jb21tYW5kOwojaWZkZWYgQ09ORklHX0NQTTIKCWkyY19j cG0yX3QgX19pb21lbSAqaTJjOwojZWxzZQoJaTJjOHh4X3QgX19pb21lbSAqaTJjOwojZW5kaWYK CWlpY190IF9faW9tZW0gKmlpcDsKCXdhaXRfcXVldWVfaGVhZF90IGlpY193YWl0OwoJc3RydWN0 IG11dGV4IGlpY19tdXRleDsgLyogUHJvdGVjdHMgSTJDIENQTSAqLwoJdV9jaGFyICp0eGJ1ZltD UE1fTUFYQkRdOwoJdV9jaGFyICpyeGJ1ZltDUE1fTUFYQkRdOwoJdTMyIHR4ZG1hW0NQTV9NQVhC RF07Cgl1MzIgcnhkbWFbQ1BNX01BWEJEXTsKfTsKCnN0YXRpYyBpcnFyZXR1cm5fdCBjcG1faWlj X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCnsKCXN0cnVjdCBpMmNfYWRhcHRlciAq YWRhcDsKCXN0cnVjdCBjcG1faTJjICpjcG07CiNpZmRlZiBDT05GSUdfQ1BNMgoJaTJjX2NwbTJf dCBfX2lvbWVtICppMmM7CiNlbHNlCglpMmM4eHhfdCBfX2lvbWVtICppMmM7CiNlbmRpZgoJaW50 IGk7CgoJcHJpbnRrICgiJXM6JWRcbiIsIF9fRlVOQ1RJT05fXyxfX0xJTkVfXyk7CglhZGFwID0g KHN0cnVjdCBpMmNfYWRhcHRlciAqKSBkZXZfaWQ7CgljcG0gPSBpMmNfZ2V0X2FkYXBkYXRhKGFk YXApOwoJaTJjID0gY3BtLT5pMmM7CgoJLyogQ2xlYXIgaW50ZXJydXB0LgoJICovCglpID0gaW5f OCgmaTJjLT5pMmNfaTJjZXIpOwoJb3V0XzgoJmkyYy0+aTJjX2kyY2VyLCBpKTsKCglkZXZfZGJn KCZhZGFwLT5kZXYsICJJbnRlcnJ1cHQ6ICV4XG4iLCBpKTsKCgkvKiBHZXQgJ21lIGdvaW5nIGFn YWluLgoJICovCgl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNwbS0+aWljX3dhaXQpOwoKCXJldHVy biBpID8gSVJRX0hBTkRMRUQgOiBJUlFfTk9ORTsKfQoKc3RhdGljIHZvaWQgY3BtX3Jlc2V0X2lp Y19wYXJhbXMoc3RydWN0IGNwbV9pMmMgKmNwbSkKewoJaWljX3QgX19pb21lbSAqaWlwID0gY3Bt LT5paXA7CgoJLyogU2V0IHVwIHRoZSBJSUMgcGFyYW1ldGVycyBpbiB0aGUgcGFyYW1ldGVyIHJh bS4KCSAqLwoJb3V0X2JlMTYoJmlpcC0+aWljX3RiYXNlLCBjcG0tPmRwX2FkZHIpOwoJb3V0X2Jl MTYoJmlpcC0+aWljX3JiYXNlLCBjcG0tPmRwX2FkZHIgKyBzaXplb2YoY2JkX3QpICogQ1BNX01B WEJEKTsKCiNpZmRlZiBDT05GSUdfQ1BNMgoJb3V0XzgoJmlpcC0+aWljX3RmY3IsIENQTUZDUl9F Qik7CglvdXRfOCgmaWlwLT5paWNfcmZjciwgQ1BNRkNSX0VCKTsKI2Vsc2UKCW91dF84KCZpaXAt PmlpY190ZmNyLCBTTUNfRUIpOwoJb3V0XzgoJmlpcC0+aWljX3JmY3IsIFNNQ19FQik7CiNlbmRp ZgoKCW91dF9iZTE2KCZpaXAtPmlpY19tcmJsciwgQ1BNX01BWF9SRUFEKTsKCglvdXRfYmUzMigm aWlwLT5paWNfcnN0YXRlLCAwKTsKCW91dF9iZTMyKCZpaXAtPmlpY19yZHAsIDApOwoJb3V0X2Jl MTYoJmlpcC0+aWljX3JicHRyLCBpbl9iZTE2KCZpaXAtPmlpY19yYmFzZSkpOwoJb3V0X2JlMTYo JmlpcC0+aWljX3JiYywgMCk7CglvdXRfYmUzMigmaWlwLT5paWNfcnh0bXAsIDApOwoJb3V0X2Jl MzIoJmlpcC0+aWljX3RzdGF0ZSwgMCk7CglvdXRfYmUzMigmaWlwLT5paWNfdGRwLCAwKTsKCW91 dF9iZTE2KCZpaXAtPmlpY190YnB0ciwgaW5fYmUxNigmaWlwLT5paWNfdGJhc2UpKTsKCW91dF9i ZTE2KCZpaXAtPmlpY190YmMsIDApOwoJb3V0X2JlMzIoJmlpcC0+aWljX3R4dG1wLCAwKTsKfQoK c3RhdGljIGludCBjcG1faWljX2luaXQoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQp7CglzdHJ1 Y3QgY3BtX2kyYyAqY3BtID0gaTJjX2dldF9hZGFwZGF0YShhZGFwKTsKCWlpY190IF9faW9tZW0g KmlpcCA9IGNwbS0+aWlwOwojaWZkZWYgQ09ORklHX0NQTTIKCWkyY19jcG0yX3QgX19pb21lbSAq aTJjID0gY3BtLT5pMmM7CiNlbHNlCglpMmM4eHhfdCBfX2lvbWVtICppMmMgPSBjcG0tPmkyYzsK I2VuZGlmCgl1bnNpZ25lZCBjaGFyIGJyZzsKCWludCByZXQsIGksIHJlczsKI2lmZGVmIENPTkZJ R19DUE0yCgl1MzIgdjsKI2Vsc2UKCXUxNiB2OwojZW5kaWYKCglwcmludGsoImkyYy1jcG06IGNw bV9paWNfaW5pdCgpXG4iKTsKCglyZXQgPSAwOwoJaW5pdF93YWl0cXVldWVfaGVhZCgmY3BtLT5p aWNfd2FpdCk7CgltdXRleF9pbml0KCZjcG0tPmlpY19tdXRleCk7CgoJLyogSW5pdGlhbGl6ZSBU eC9SeCBwYXJhbWV0ZXJzLgoJICovCgoJY3BtX3Jlc2V0X2lpY19wYXJhbXMoY3BtKTsKCglwcmlu dGsoImkyYy1jcG06IGlpcCAlcCwgZHBfYWRkciAweCV4XG4iLCBjcG0tPmlpcCwgY3BtLT5kcF9h ZGRyKTsKCXByaW50aygiaTJjLWNwbTogaWljX3RiYXNlICVkLCBpaWNfcmJhc2UgJWRcbiIsCgkJ aW5fYmUxNigmaWlwLT5paWNfdGJhc2UpLCBpbl9iZTE2KCZpaXAtPmlpY19yYmFzZSkpOwoKCXYg PSBjcG0tPmNwX2NvbW1hbmQgfCAoQ1BNX0NSX0lOSVRfVFJYIDw8IDgpIHwgQ1BNX0NSX0ZMRzsK CiNpZmRlZiBDT05GSUdfQ1BNMgoJb3V0X2JlMzIoJmNwbXAtPmNwX2NwY3IsIHYpOwoJcmVzID0g d2FpdF9ldmVudF90aW1lb3V0KGNwbS0+aWljX3dhaXQsCgkJCSAhKGluX2JlMzIoJmNwbXAtPmNw X2NwY3IpICYgQ1BNX0NSX0ZMRyksIEhaICogMTApOwojZWxzZQoJb3V0X2JlMTYoJmNwbXAtPmNw X2NwY3IsIHYpOwoJcmVzID0gd2FpdF9ldmVudF90aW1lb3V0KGNwbS0+aWljX3dhaXQsCgkJCSAh KGluX2JlMTYoJmNwbXAtPmNwX2NwY3IpICYgQ1BNX0NSX0ZMRyksIEhaICogMTApOwojZW5kaWYK CWlmICghcmVzKQoJCXJldHVybiAtRUlPOwoKCS8qIFNlbGVjdCBhbiBpbnZhbGlkIGFkZHJlc3Mu IEp1c3QgbWFrZSBzdXJlIHdlIGRvbid0IHVzZSBsb29wYmFjayBtb2RlCgkgKi8KCW91dF84KCZp MmMtPmkyY19pMmFkZCwgMHhmZSk7CgoJLyogTWFrZSBjbG9jayBydW4gYXQgNjAga0h6LgoJICov CgoJYnJnID0gZ2V0X2JyZ2ZyZXEoKSAvICgzMiAqIDIgKiA2MDAwMCkgLSAzOwoJb3V0XzgoJmky Yy0+aTJjX2kyYnJnLCBicmcpOwoKCW91dF84KCZpMmMtPmkyY19pMm1vZCwgMHgwMCk7CglvdXRf OCgmaTJjLT5pMmNfaTJjb20sIDB4MDEpOwkvKiBNYXN0ZXIgbW9kZSAqLwoKCS8qIERpc2FibGUg aW50ZXJydXB0cy4KCSAqLwoJb3V0XzgoJmkyYy0+aTJjX2kyY21yLCAwKTsKCW91dF84KCZpMmMt PmkyY19pMmNlciwgMHhmZik7CgoJLyogQWxsb2NhdGUgVFggYW5kIFJYIGJ1ZmZlcnMgKi8KCWZv ciAoaSA9IDA7IGkgPCBDUE1fTUFYQkQ7IGkrKykgewoJCWNwbS0+cnhidWZbaV0gPSBkbWFfYWxs b2NfY29oZXJlbnQoCgkJCU5VTEwsIENQTV9NQVhfUkVBRCArIDEsICZjcG0tPnJ4ZG1hW2ldLCBH RlBfS0VSTkVMKTsKCQlpZiAoIWNwbS0+cnhidWZbaV0pIHsKCQkJcmV0ID0gLUVOT01FTTsKCQkJ Z290byBvdXQ7CgkJfQoJCWNwbS0+dHhidWZbaV0gPSAodW5zaWduZWQgY2hhciAqKWRtYV9hbGxv Y19jb2hlcmVudCgKCQkJTlVMTCwgQ1BNX01BWF9SRUFEICsgMSwgJmNwbS0+dHhkbWFbaV0sIEdG UF9LRVJORUwpOwoJCWlmICghY3BtLT50eGJ1ZltpXSkgewoJCQlyZXQgPSAtRU5PTUVNOwoJCQln b3RvIG91dDsKCQl9Cgl9CgoJLyogSW5zdGFsbCBpbnRlcnJ1cHQgaGFuZGxlci4KCSAqLwoJcmV0 ID0gcmVxdWVzdF9pcnEoY3BtLT5pcnEsIGNwbV9paWNfaW50ZXJydXB0LCAwLCAiY3BtX2kyYyIs IGFkYXApOwoJaWYgKHJldCkKCQlnb3RvIG91dDsKCglyZXR1cm4gMDsKCm91dDoKCWZvciAoaSA9 IDA7IGkgPCBDUE1fTUFYQkQ7IGkrKykgewoJCWlmIChjcG0tPnJ4YnVmW2ldKQoJCQlkbWFfZnJl ZV9jb2hlcmVudChOVUxMLCBDUE1fTUFYX1JFQUQgKyAxLAoJCQkJY3BtLT5yeGJ1ZltpXSwgY3Bt LT5yeGRtYVtpXSk7CgkJaWYgKGNwbS0+dHhidWZbaV0pCgkJCWRtYV9mcmVlX2NvaGVyZW50KE5V TEwsIENQTV9NQVhfUkVBRCArIDEsCgkJCQljcG0tPnR4YnVmW2ldLCBjcG0tPnR4ZG1hW2ldKTsK CX0KCXJldHVybiByZXQ7Cn0KCnN0YXRpYyBpbnQgY3BtX2lpY19zaHV0ZG93bihzdHJ1Y3QgaTJj X2FkYXB0ZXIgKmFkYXApCnsKCXN0cnVjdCBjcG1faTJjICpjcG0gPSBpMmNfZ2V0X2FkYXBkYXRh KGFkYXApOwoJaW50IGk7CgojaWZkZWYgQ09ORklHX0NQTTIKCWkyY19jcG0yX3QgX19pb21lbSAq aTJjID0gY3BtLT5pMmM7CiNlbHNlCglpMmM4eHhfdCBfX2lvbWVtICppMmMgPSBjcG0tPmkyYzsK I2VuZGlmCgoJLyogU2h1dCBkb3duIElJQy4KCSAqLwoJb3V0XzgoJmkyYy0+aTJjX2kybW9kLCBp bl84KCZpMmMtPmkyY19pMm1vZCkgfCB+MSk7CglvdXRfOCgmaTJjLT5pMmNfaTJjbXIsIDApOwoJ b3V0XzgoJmkyYy0+aTJjX2kyY2VyLCAweGZmKTsKCglmb3IgKGkgPSAwOyBpIDwgQ1BNX01BWEJE OyBpKyspIHsKCQlpZiAoY3BtLT5yeGJ1ZltpXSkKCQkJZG1hX2ZyZWVfY29oZXJlbnQoTlVMTCwg Q1BNX01BWF9SRUFEICsgMSwKCQkJCWNwbS0+cnhidWZbaV0sIGNwbS0+cnhkbWFbaV0pOwoJCWlm IChjcG0tPnR4YnVmW2ldKQoJCQlkbWFfZnJlZV9jb2hlcmVudChOVUxMLCBDUE1fTUFYX1JFQUQg KyAxLAoJCQkJY3BtLT50eGJ1ZltpXSwgY3BtLT50eGRtYVtpXSk7Cgl9CgoJZnJlZV9pcnEoY3Bt LT5pcnEsIGFkYXApOwoKCXJldHVybiAwOwp9CgojZGVmaW5lIEJEX1NDX05BSwkJKDB4MDAwNCkg LyogTkFLIC0gZGlkIG5vdCByZXNwb25kICovCiNkZWZpbmUgQkRfU0NfT1YJCSgweDAwMDIpIC8q IE9WIC0gcmVjZWl2ZSBvdmVycnVuICovCiNkZWZpbmUgQ1BNX0NSX0NMT1NFX1JYQkQJKDB4MDAw NykKCnN0YXRpYyB2b2lkIGZvcmNlX2Nsb3NlKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKewoJ c3RydWN0IGNwbV9pMmMgKmNwbSA9IGkyY19nZXRfYWRhcGRhdGEoYWRhcCk7CiNpZmRlZiBDT05G SUdfQ1BNMgoJaTJjX2NwbTJfdCBfX2lvbWVtICppMmMgPSBjcG0tPmkyYzsKCXUzMiB2OwojZWxz ZQoJaTJjOHh4X3QgX19pb21lbSAqaTJjID0gY3BtLT5pMmM7Cgl1MTYgdjsKI2VuZGlmCgoJZGV2 X2RiZygmYWRhcC0+ZGV2LCAiZm9yY2VfY2xvc2UoKVxuIik7Cgl2ID0gY3BtLT5jcF9jb21tYW5k IHwgKENQTV9DUl9DTE9TRV9SWEJEIDw8IDgpIHwgQ1BNX0NSX0ZMRzsKI2lmZGVmIENPTkZJR19D UE0yCglvdXRfYmUzMigmY3BtcC0+Y3BfY3Bjciwgdik7Cgl3YWl0X2V2ZW50X3RpbWVvdXQoY3Bt LT5paWNfd2FpdCwKCQkJICAgIShpbl9iZTMyKCZjcG1wLT5jcF9jcGNyKSAmIENQTV9DUl9GTEcp LCBIWiAqIDUpOwojZWxzZQoJb3V0X2JlMTYoJmNwbXAtPmNwX2NwY3IsIHYpOwoJd2FpdF9ldmVu dF90aW1lb3V0KGNwbS0+aWljX3dhaXQsCgkJCSAgICEoaW5fYmUxNigmY3BtcC0+Y3BfY3Bjcikg JiBDUE1fQ1JfRkxHKSwgSFogKiA1KTsKI2VuZGlmCgoJb3V0XzgoJmkyYy0+aTJjX2kyY21yLCAw eDAwKTsJLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cyAqLwoJb3V0XzgoJmkyYy0+aTJjX2kyY2Vy LCAweGZmKTsKfQoKc3RhdGljIHZvaWQgY3BtX3BhcnNlX21lc3NhZ2Uoc3RydWN0IGkyY19hZGFw dGVyICphZGFwLCBzdHJ1Y3QgaTJjX21zZyAqcG1zZywKCWludCBudW0sIGludCB0eCwgaW50IHJ4 KQp7CgljYmRfdCAqdGJkZiwgKnJiZGY7Cgl1X2NoYXIgYWRkcjsKCXVfY2hhciAqdGI7Cgl1X2No YXIgKnJiOwoJc3RydWN0IGNwbV9pMmMgKmNwbSA9IGkyY19nZXRfYWRhcGRhdGEoYWRhcCk7Cglp aWNfdCBfX2lvbWVtICppaXAgPSBjcG0tPmlpcDsKCWludCBpLCBkc2NhbjsKCglwcmludGsgKCIl czolZFxuIiwgX19GVU5DVElPTl9fLF9fTElORV9fKTsKCXRiZGYgPSAoY2JkX3QgKikgY3BtX211 cmFtX2FkZHIoaW5fYmUxNigmaWlwLT5paWNfdGJhc2UpKTsKCXJiZGYgPSAoY2JkX3QgKikgY3Bt X211cmFtX2FkZHIoaW5fYmUxNigmaWlwLT5paWNfcmJhc2UpKTsKCgkvKiBUaGlzIGNoaXAgY2Fu J3QgZG8gemVybyBsZW5ndGggd3JpdGVzLiBIb3dldmVyLCB0aGUgaTJjIGNvcmUgdXNlcwoJICAg dGhlbSB0byBzY2FuIGZvciBkZXZpY2VzLiBUaGUgYmVzdCB3ZSBjYW4gZG8gaXMgdG8gY29udmVy dCB0aGVtCgkgICBpbnRvIDEgYnl0ZSByZWFkcyAqLwoKCWRzY2FuID0gKChwbXNnLT5sZW4gPT0g MCkgJiYgKG51bSA9PSAxKSk7CgoJYWRkciA9IHBtc2ctPmFkZHIgPDwgMTsKCWlmICgocG1zZy0+ ZmxhZ3MgJiBJMkNfTV9SRCkgfHwgZHNjYW4pCgkJYWRkciB8PSAxOwoKCXRiID0gY3BtLT50eGJ1 Zlt0eF07CglyYiA9IGNwbS0+cnhidWZbcnhdOwoKCS8qIEFsaWduIHJlYWQgYnVmZmVyICovCgly YiA9ICh1X2NoYXIgKikgKCgodWxvbmcpIHJiICsgMSkgJiB+MSk7CgoJaWYgKChwbXNnLT5mbGFn cyAmIEkyQ19NX1JEKSB8fCBkc2NhbikgewoJCS8qIFRvIHJlYWQsIHdlIG5lZWQgYW4gZW1wdHkg YnVmZmVyIG9mIHRoZSBwcm9wZXIgbGVuZ3RoLgoJCSAqIEFsbCB0aGF0IGlzIHVzZWQgaXMgdGhl IGZpcnN0IGJ5dGUgZm9yIGFkZHJlc3MsIHRoZSByZW1haW5kZXIKCQkgKiBpcyBqdXN0IHVzZWQg Zm9yIHRpbWluZyAoYW5kIGRvZXNuJ3QgcmVhbGx5IGhhdmUgdG8gZXhpc3QpLgoJCSAqLwoJCXRi WzBdID0gYWRkcjsJCS8qIERldmljZSBhZGRyZXNzIGJ5dGUgdy9ydyBmbGFnICovCgoJCWRldl9k YmcoJmFkYXAtPmRldiwgImNwbV9paWNfcmVhZChhYnl0ZT0weCV4KVxuIiwgYWRkcik7CgkJdGJk Zlt0eF0uY2JkX2J1ZmFkZHIgPSBjcG0tPnR4ZG1hW3R4XTsKCgkJaWYgKGRzY2FuKQoJCQl0YmRm W3R4XS5jYmRfZGF0bGVuID0gMjsKCQllbHNlCgkJCXRiZGZbdHhdLmNiZF9kYXRsZW4gPSBwbXNn LT5sZW4gKyAxOwoKCQl0YmRmW3R4XS5jYmRfc2MgPSAwOwoKCQlpZiAoIShwbXNnLT5mbGFncyAm IEkyQ19NX05PU1RBUlQpKQoJCQl0YmRmW3R4XS5jYmRfc2MgfD0gQkRfSUlDX1NUQVJUOwoJCWlm ICh0eCArIDEgPT0gbnVtKQoJCQl0YmRmW3R4XS5jYmRfc2MgfD0gQkRfU0NfTEFTVCB8IEJEX1ND X1dSQVA7CgoJCXJiZGZbcnhdLmNiZF9kYXRsZW4gPSAwOwoJCXJiZGZbcnhdLmNiZF9idWZhZGRy ID0gKChjcG0tPnJ4ZG1hW3J4XSArIDEpICYgfjEpOwoJCXJiZGZbcnhdLmNiZF9zYyA9IEJEX1ND X0VNUFRZIHwgQkRfU0NfSU5UUlBUOwoKCQlpZiAocnggKyAxID09IENQTV9NQVhCRCkKCQkJdGJk ZltyeF0uY2JkX3NjIHw9IEJEX1NDX1dSQVA7CgoJCWVpZWlvKCk7CgkJdGJkZlt0eF0uY2JkX3Nj IHw9IEJEX1NDX1JFQURZOwoJfSBlbHNlIHsKCQl0YlswXSA9IGFkZHI7CQkvKiBEZXZpY2UgYWRk cmVzcyBieXRlIHcvcncgZmxhZyAqLwoJCWZvciAoaSA9IDA7IGkgPCBwbXNnLT5sZW47IGkrKykK CQkJdGJbaSsxXSA9IHBtc2ctPmJ1ZltpXTsKCgkJZGV2X2RiZygmYWRhcC0+ZGV2LCAiY3BtX2lp Y193cml0ZShhYnl0ZT0weCV4KVxuIiwgYWRkcik7CgoJCXRiZGZbdHhdLmNiZF9idWZhZGRyID0g Y3BtLT50eGRtYVt0eF07CgkJdGJkZlt0eF0uY2JkX2RhdGxlbiA9IHBtc2ctPmxlbiArIDE7CgkJ dGJkZlt0eF0uY2JkX3NjID0gMDsKCgkJaWYgKCEocG1zZy0+ZmxhZ3MgJiBJMkNfTV9OT1NUQVJU KSkKCQkJdGJkZlt0eF0uY2JkX3NjIHw9IEJEX0lJQ19TVEFSVDsKCgkJaWYgKHR4ICsgMSA9PSBu dW0pCgkJCXRiZGZbdHhdLmNiZF9zYyB8PSBCRF9TQ19MQVNUIHwgQkRfU0NfV1JBUDsKCgkJZWll aW8oKTsKCQl0YmRmW3R4XS5jYmRfc2MgfD0gQkRfU0NfUkVBRFkgfCBCRF9TQ19JTlRSUFQ7CgoJ CWRldl9kYmcoJmFkYXAtPmRldiwgInR4IHNjICVkICUwNHhcbiIsCgkJCXR4LCB0YmRmW3R4XS5j YmRfc2MpOwoJfQp9CgpzdGF0aWMgaW50IGNwbV9jaGVja19tZXNzYWdlKHN0cnVjdCBpMmNfYWRh cHRlciAqYWRhcCwgc3RydWN0IGkyY19tc2cgKnBtc2csCglpbnQgdHgsIGludCByeCkKewoJY2Jk X3QgKnRiZGYsICpyYmRmOwoJdV9jaGFyICp0YjsKCXVfY2hhciAqcmI7CglzdHJ1Y3QgY3BtX2ky YyAqY3BtID0gaTJjX2dldF9hZGFwZGF0YShhZGFwKTsKCWlpY190IF9faW9tZW0gKmlpcCA9IGNw bS0+aWlwOwoJaW50IGk7CgoJcHJpbnRrICgiJXM6JWRcbiIsIF9fRlVOQ1RJT05fXyxfX0xJTkVf Xyk7Cgl0YmRmID0gKGNiZF90ICopIGNwbV9tdXJhbV9hZGRyKGluX2JlMTYoJmlpcC0+aWljX3Ri YXNlKSk7CglyYmRmID0gKGNiZF90ICopIGNwbV9tdXJhbV9hZGRyKGluX2JlMTYoJmlpcC0+aWlj X3JiYXNlKSk7CgoJdGIgPSBjcG0tPnR4YnVmW3R4XTsKCXJiID0gY3BtLT5yeGJ1ZltyeF07CgoJ LyogQWxpZ24gcmVhZCBidWZmZXIgKi8KCXJiID0gKHVfY2hhciAqKSAoKCh1aW50KSByYiArIDEp ICYgfjEpOwoKCWlmIChwbXNnLT5mbGFncyAmIEkyQ19NX1JEKSB7CgkJZGV2X2RiZygmYWRhcC0+ ZGV2LCAicnggc2MgJTA0eCwgcnggc2MgJTA0eFxuIiwKCQkJdGJkZlt0eF0uY2JkX3NjLCByYmRm W3J4XS5jYmRfc2MpOwoKCQlpZiAodGJkZlt0eF0uY2JkX3NjICYgQkRfU0NfTkFLKSB7CgkJCWRl dl9kYmcoJmFkYXAtPmRldiwgIklJQyByZWFkOyBubyBhY2tcbiIpOwoKCQkJaWYgKHBtc2ctPmZs YWdzICYgSTJDX01fSUdOT1JFX05BSykKCQkJCXJldHVybiAwOwoJCQllbHNlCgkJCQlyZXR1cm4g LUVJTzsKCQl9CgkJaWYgKHJiZGZbcnhdLmNiZF9zYyAmIEJEX1NDX0VNUFRZKSB7CgkJCWRldl9k YmcoJmFkYXAtPmRldiwKCQkJCSJJSUMgcmVhZDsgY29tcGxldGUgYnV0IHJidWYgZW1wdHlcbiIp OwoJCQlyZXR1cm4gLUVSRU1PVEVJTzsKCQl9CgkJaWYgKHJiZGZbcnhdLmNiZF9zYyAmIEJEX1ND X09WKSB7CgkJCWRldl9kYmcoJmFkYXAtPmRldiwgIklJQyByZWFkOyBPdmVycnVuXG4iKTsKCQkJ cmV0dXJuIC1FUkVNT1RFSU87CgkJfQoJCWZvciAoaSA9IDA7IGkgPCBwbXNnLT5sZW47IGkrKykK CQkJcG1zZy0+YnVmW2ldID0gcmJbaV07Cgl9IGVsc2UgewoJCWRldl9kYmcoJmFkYXAtPmRldiwg InR4IHNjICVkICUwNHhcbiIsIHR4LCB0YmRmW3R4XS5jYmRfc2MpOwoKCQlpZiAodGJkZlt0eF0u Y2JkX3NjICYgQkRfU0NfTkFLKSB7CgkJCWRldl9kYmcoJmFkYXAtPmRldiwgIklJQyB3cml0ZTsg bm8gYWNrXG4iKTsKCgkJCWlmIChwbXNnLT5mbGFncyAmIEkyQ19NX0lHTk9SRV9OQUspCgkJCQly ZXR1cm4gMDsKCQkJZWxzZQoJCQkJcmV0dXJuIC1FSU87CgkJfQoJfQoJcmV0dXJuIDA7Cn0KCnN0 YXRpYyBpbnQgY3BtX3hmZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwLCBzdHJ1Y3QgaTJjX21z ZyAqbXNncywgaW50IG51bSkKewoJc3RydWN0IGNwbV9pMmMgKmNwbSA9IGkyY19nZXRfYWRhcGRh dGEoYWRhcCk7CiNpZmRlZiBDT05GSUdfQ1BNMgoJaTJjX2NwbTJfdCBfX2lvbWVtICppMmMgPSBj cG0tPmkyYzsKI2Vsc2UKCWkyYzh4eF90IF9faW9tZW0gKmkyYyA9IGNwbS0+aTJjOwojZW5kaWYK CWlpY190IF9faW9tZW0gKmlpcCA9IGNwbS0+aWlwOwoJc3RydWN0IGkyY19tc2cgKnBtc2csICpy bXNnOwoJaW50IHJldCwgaTsKCWludCB0cHRyOwoJaW50IHJwdHI7CgljYmRfdCAqdGJkZiwgKnJi ZGY7CgoJcHJpbnRrICgiJXM6JWRcbiIsIF9fRlVOQ1RJT05fXyxfX0xJTkVfXyk7CglpZiAobnVt ID4gQ1BNX01BWEJEKQoJCXJldHVybiAtRUlOVkFMOwoKCS8qIENoZWNrIGlmIHdlIGhhdmUgYW55 IG92ZXJzaXplZCBSRUFEIHJlcXVlc3RzICovCglmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsK CQlwbXNnID0gJm1zZ3NbaV07CgkJaWYgKHBtc2ctPmxlbiA+PSBDUE1fTUFYX1JFQUQpCgkJCXJl dHVybiAtRUlOVkFMOwoJfQoKCW11dGV4X2xvY2soJmNwbS0+aWljX211dGV4KTsKCgkvKiBSZXNl dCB0byB1c2UgZmlyc3QgYnVmZmVyICovCglvdXRfYmUxNigmaWlwLT5paWNfcmJwdHIsIGluX2Jl MTYoJmlpcC0+aWljX3JiYXNlKSk7CglvdXRfYmUxNigmaWlwLT5paWNfdGJwdHIsIGluX2JlMTYo JmlpcC0+aWljX3RiYXNlKSk7CgoJdGJkZiA9IChjYmRfdCAqKSBjcG1fbXVyYW1fYWRkcihpbl9i ZTE2KCZpaXAtPmlpY190YmFzZSkpOwoJcmJkZiA9IChjYmRfdCAqKSBjcG1fbXVyYW1fYWRkcihp bl9iZTE2KCZpaXAtPmlpY19yYmFzZSkpOwoKCXRwdHIgPSAwOwoJcnB0ciA9IDA7CgoJd2hpbGUg KHRwdHIgPCBudW0pIHsKCQlwbXNnID0gJm1zZ3NbdHB0cl07CgkJZGV2X2RiZygmYWRhcC0+ZGV2 LCAiaTJjLWFsZ28tY3BtLm86ICIgIlI6ICVkIFQ6ICVkXG4iLAoJCQlycHRyLCB0cHRyKTsKCgkJ Y3BtX3BhcnNlX21lc3NhZ2UoYWRhcCwgcG1zZywgbnVtLCB0cHRyLCBycHRyKTsKCQlpZiAocG1z Zy0+ZmxhZ3MgJiBJMkNfTV9SRCkKCQkJcnB0cisrOwoJCXRwdHIrKzsKCX0KCS8qIFN0YXJ0IHRy YW5zZmVyIG5vdyAqLwoJLyogQ2hpcCBidWcsIHNldCBlbmFibGUgaGVyZSAqLwoJb3V0XzgoJmky Yy0+aTJjX2kyY21yLCAweDEzKTsJLyogRW5hYmxlIHNvbWUgaW50ZXJ1cHRzICovCglvdXRfOCgm aTJjLT5pMmNfaTJjZXIsIDB4ZmYpOwoJb3V0XzgoJmkyYy0+aTJjX2kybW9kLCBpbl84KCZpMmMt PmkyY19pMm1vZCkgfCAxKTsJLyogRW5hYmxlICovCgkvKiBCZWdpbiB0cmFuc21pc3Npb24gKi8K CW91dF84KCZpMmMtPmkyY19pMmNvbSwgaW5fOCgmaTJjLT5pMmNfaTJjb20pIHwgMHg4MCk7CgoJ dHB0ciA9IDA7CglycHRyID0gMDsKCgl3aGlsZSAodHB0ciA8IG51bSkgewoJCS8qIENoZWNrIGZv ciBvdXRzdGFuZGluZyBtZXNzYWdlcyAqLwoJCWRldl9kYmcoJmFkYXAtPmRldiwgInRlc3QgcmVh ZHkuXG4iKTsKCQlpZiAoISh0YmRmW3RwdHJdLmNiZF9zYyAmIEJEX1NDX1JFQURZKSkgewoJCQlk ZXZfZGJnKCZhZGFwLT5kZXYsICJyZWFkeS5cbiIpOwoJCQlybXNnID0gJm1zZ3NbdHB0cl07CgkJ CXJldCA9IGNwbV9jaGVja19tZXNzYWdlKGFkYXAsIHJtc2csIHRwdHIsIHJwdHIpOwoJCQl0cHRy Kys7CgkJCWlmIChybXNnLT5mbGFncyAmIEkyQ19NX1JEKQoJCQkJcnB0cisrOwoJCQlpZiAocmV0 KSB7CgkJCQlmb3JjZV9jbG9zZShhZGFwKTsKCQkJCW11dGV4X3VubG9jaygmY3BtLT5paWNfbXV0 ZXgpOwoJCQkJcmV0dXJuIHJldDsKCQkJfQoJCX0gZWxzZSB7CgkJCWRldl9kYmcoJmFkYXAtPmRl diwgIm5vdCByZWFkeS5cbiIpOwoJCQlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGlt ZW91dChjcG0tPmlpY193YWl0LAoJCQkJISh0YmRmW3RwdHJdLmNiZF9zYyAmIEJEX1NDX1JFQURZ KSwgMSAqIEhaKTsKCQkJaWYgKHJldCA9PSAwKSB7CgkJCQlmb3JjZV9jbG9zZShhZGFwKTsKCQkJ CWRldl9kYmcoJmFkYXAtPmRldiwgIklJQyByZWFkOiB0aW1lb3V0IVxuIik7CgkJCQltdXRleF91 bmxvY2soJmNwbS0+aWljX211dGV4KTsKCQkJCXJldHVybiAtRVJFTU9URUlPOwoJCQl9CgkJfQoJ fQojaWZkZWYgSTJDX0NISVBfRVJSQVRBCgkvKiBDaGlwIGVycmF0YSwgY2xlYXIgZW5hYmxlLiBU aGlzIGlzIG5vdCBuZWVkZWQgb24gcmV2IEQ0IENQVXMuCgkgICBEaXNhYmxpbmcgSTJDIHRvbyBl YXJseSBtYXkgY2F1c2UgdG9vIHNob3J0IHN0b3AgY29uZGl0aW9uICovCgl1ZGVsYXkoNCk7Cglv dXRfOCgmaTJjLT5pMmNfaTJtb2QsIGluXzgoJmkyYy0+aTJjX2kybW9kKSB8IH4xKTsKI2VuZGlm CgltdXRleF91bmxvY2soJmNwbS0+aWljX211dGV4KTsKCXJldHVybiAobnVtKTsKfQoKc3RhdGlj IHUzMiBjcG1fZnVuYyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCnsKCXJldHVybiBJMkNfRlVO Q19JMkMgfCBJMkNfRlVOQ19TTUJVU19FTVVMOwp9CgovKiAtLS0tLWV4cG9ydGVkIGFsZ29yaXRo bSBkYXRhOiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCSovCgpzdGF0aWMg c3RydWN0IGkyY19hbGdvcml0aG0gY3BtX2FsZ28gPSB7CgkubWFzdGVyX3hmZXIgPSBjcG1feGZl ciwKCS5mdW5jdGlvbmFsaXR5ID0gY3BtX2Z1bmMsCn07CgovKgogKiByZWdpc3RlcmluZyBmdW5j dGlvbnMgdG8gbG9hZCBhbGdvcml0aG1zIGF0IHJ1bnRpbWUKICovCmludCBpMmNfY3BtX2FkZF9i dXMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQp7CglpbnQgcmVzOwoKCXByaW50aygiaTJjLWNw bTogaHcgcm91dGluZXMgZm9yICVzIHJlZ2lzdGVyZWQuXG4iLCBhZGFwLT5uYW1lKTsKCgkvKiBy ZWdpc3RlciBuZXcgYWRhcHRlciB0byBpMmMgbW9kdWxlLi4uICovCgoJYWRhcC0+YWxnbyA9ICZj cG1fYWxnbzsKCglyZXMgPSBjcG1faWljX2luaXQoYWRhcCk7CgoJaWYgKHJlcykKCQlyZXR1cm4g cmVzOwoKCXJldHVybiBpMmNfYWRkX2FkYXB0ZXIoYWRhcCk7Cn0KCmludCBpMmNfY3BtX2RlbF9i dXMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQp7CglpMmNfZGVsX2FkYXB0ZXIoYWRhcCk7CgoJ cmV0dXJuIGNwbV9paWNfc2h1dGRvd24oYWRhcCk7Cn0KCnN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJj X2FkYXB0ZXIgY3BtX29wcyA9IHsKCS5vd25lcgkJPSBUSElTX01PRFVMRSwKCS5uYW1lCQk9ICJp MmMtY3BtIiwKCS5pZAkJPSBJMkNfSFdfTVBDOFhYX0VQT04sCgkuY2xhc3MJCT0gSTJDX0NMQVNT X0hXTU9OLAp9OwoKc3RhdGljIGludCBpMmNfY3BtX3NldHVwKHN0cnVjdCBjcG1faTJjICppMmMp CnsKCXN0cnVjdCBvZl9kZXZpY2UgKm9mZGV2ID0gaTJjLT5vZmRldjsKCWNvbnN0IHUzMiAqZGF0 YTsKCWludCBsZW47CgoJLyogUG9pbnRlciB0byBDb21tdW5pY2F0aW9uIFByb2Nlc3NvcgoJICov CglpMmMtPmlycSA9IG9mX2lycV90b19yZXNvdXJjZShvZmRldi0+bm9kZSwgMCwgTlVMTCk7Cglp ZiAoaTJjLT5pcnEgPT0gTk9fSVJRKQoJCXJldHVybiAtRUlOVkFMOwoKCWkyYy0+aWlwID0gb2Zf aW9tYXAob2ZkZXYtPm5vZGUsIDEpOwoJaWYgKGkyYy0+aWlwID09IE5VTEwpCgkJcmV0dXJuIC1F SU5WQUw7CgojaWZuZGVmIENPTkZJR19DUE0yCgkvKiBDaGVjayBmb3IgYW5kIHVzZSBhIG1pY3Jv Y29kZSByZWxvY2F0aW9uIHBhdGNoLgoJICovCglpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUo b2ZkZXYtPm5vZGUsICJmc2wsaTJjLWNwbTEiKSkKCQlpMmMtPnJlbG9jID0gaTJjLT5paXAtPmlp Y19ycGJhc2U7CgoJLyogTWF5YmUgc2hvdWxkIHVzZSBpb3JlbWFwIGluc3RlYWQ/CgkgKi8KCWlm IChpMmMtPnJlbG9jKSB7CgkJaW91bm1hcChpMmMtPmlpcCk7CgkJaTJjLT5paXAgPSBjcG1fbXVy YW1fYWRkcihpMmMtPmlpcC0+aWljX3JwYmFzZSk7Cgl9CiNlbmRpZgoKCWkyYy0+aTJjID0gb2Zf aW9tYXAob2ZkZXYtPm5vZGUsIDApOwoJaWYgKGkyYy0+aTJjID09IE5VTEwpCgkJcmV0dXJuIC1F SU5WQUw7CgoJLyogQWxsb2NhdGUgc3BhY2UgZm9yIHR3byB0cmFuc21pdCBhbmQgdHdvIHJlY2Vp dmUgYnVmZmVyCgkgKiBkZXNjcmlwdG9ycyBpbiB0aGUgRFAgcmFtLgoJICovCglpMmMtPmRwX2Fk ZHIgPSBjcG1fbXVyYW1fYWxsb2Moc2l6ZW9mKGNiZF90KSAqIDQsIDgpOwoJaWYgKCFpMmMtPmRw X2FkZHIpCgkJcmV0dXJuIC1FTk9NRU07CgoJZGF0YSA9IG9mX2dldF9wcm9wZXJ0eShvZmRldi0+ bm9kZSwgImZzbCxjcG0tY29tbWFuZCIsICZsZW4pOwoJaWYgKCFkYXRhIHx8IGxlbiAhPSA0KQoJ CXJldHVybiAtRUlOVkFMOwoKCWkyYy0+Y3BfY29tbWFuZCA9ICpkYXRhOwoJcmV0dXJuIDA7Cn0K CnN0YXRpYyB2b2lkIGkyY19jcG1fcmVsZWFzZShzdHJ1Y3QgY3BtX2kyYyAqaTJjKQp7CglpZiAo aTJjLT5kcF9hZGRyKQoJCWNwbV9tdXJhbV9mcmVlKGkyYy0+ZHBfYWRkcik7CgoJaWYgKGkyYy0+ aTJjKQoJCWlvdW5tYXAoaTJjLT5pMmMpOwoKCWlmICgoaTJjLT5paXApICYmICghaTJjLT5yZWxv YykpCgkJaW91bm1hcChpMmMtPmlpcCk7CgoJcmV0dXJuOwp9CgpzdGF0aWMgaW50IGkyY19jcG1f cHJvYmUoc3RydWN0IG9mX2RldmljZSAqb2ZkZXYsCgkJCSBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNl X2lkICptYXRjaCkKewoJaW50IHJlc3VsdDsKCXN0cnVjdCBjcG1faTJjICppMmM7CgoJaTJjID0g a3phbGxvYyhzaXplb2Yoc3RydWN0IGNwbV9pMmMpLCBHRlBfS0VSTkVMKTsKCWlmICghaTJjKQoJ CXJldHVybiAtRU5PTUVNOwoKCWkyYy0+b2ZkZXYgPSBvZmRldjsKCglyZXN1bHQgPSBpMmNfY3Bt X3NldHVwKGkyYyk7CglpZiAocmVzdWx0KSB7CgkJcHJpbnRrKEtFUk5fRVJSICJpMmMtY3BtOiBV bmFibGUgdG8gcmVnaXN0ZXIgcmVzb3VyY2VzXG4iKTsKCQlnb3RvIG91dDsKCX0KCglkZXZfc2V0 X2RydmRhdGEoJm9mZGV2LT5kZXYsIGkyYyk7CgoJaTJjLT5hZGFwID0gY3BtX29wczsKCWkyY19z ZXRfYWRhcGRhdGEoJmkyYy0+YWRhcCwgaTJjKTsKCWkyYy0+YWRhcC5kZXYucGFyZW50ID0gJm9m ZGV2LT5kZXY7CgoJcmVzdWx0ID0gaTJjX2NwbV9hZGRfYnVzKCZpMmMtPmFkYXApOwoJaWYgKHJl c3VsdCA8IDApIHsKCQlwcmludGsoS0VSTl9FUlIgImkyYy1jcG06IFVuYWJsZSB0byByZWdpc3Rl ciB3aXRoIEkyQ1xuIik7CgkJZ290byBvdXQ7Cgl9CglyZXR1cm4gMDsKCm91dDoKCWkyY19jcG1f cmVsZWFzZShpMmMpOwoJa2ZyZWUoaTJjKTsKCXJldHVybiByZXN1bHQ7Cn0KCnN0YXRpYyBpbnQg aTJjX2NwbV9yZW1vdmUoc3RydWN0IG9mX2RldmljZSAqb2ZkZXYpCnsKCXN0cnVjdCBjcG1faTJj ICppMmMgPSBkZXZfZ2V0X2RydmRhdGEoJm9mZGV2LT5kZXYpOwoKCWkyY19jcG1fZGVsX2J1cygm aTJjLT5hZGFwKTsKCWRldl9zZXRfZHJ2ZGF0YSgmb2ZkZXYtPmRldiwgTlVMTCk7CgoJaTJjX2Nw bV9yZWxlYXNlKGkyYyk7CglrZnJlZShpMmMpOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBzdHJ1Y3Qg b2ZfZGV2aWNlX2lkIGkyY19jcG1fbWF0Y2hbXSA9IHsKCXsKCQkuY29tcGF0aWJsZSA9ICJmc2ws Y3BtLWkyYyIsCgl9LAoJe30sCn07CgpNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBpMmNfY3BtX21h dGNoKTsKCnN0YXRpYyBzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyIGkyY19jcG1fZHJpdmVyID0g ewoJLm5hbWUJCT0gImZzbC1pMmMtY3BtIiwKCS5tYXRjaF90YWJsZQk9IGkyY19jcG1fbWF0Y2gs CgkucHJvYmUJCT0gaTJjX2NwbV9wcm9iZSwKCS5yZW1vdmUJCT0gaTJjX2NwbV9yZW1vdmUsCn07 CgpzdGF0aWMgaW50IF9faW5pdCBpMmNfY3BtX2luaXQodm9pZCkKewoJcmV0dXJuIG9mX3JlZ2lz dGVyX3BsYXRmb3JtX2RyaXZlcigmaTJjX2NwbV9kcml2ZXIpOwp9CgpzdGF0aWMgdm9pZCBfX2V4 aXQgaTJjX2NwbV9leGl0KHZvaWQpCnsKCW9mX3VucmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKCZp MmNfY3BtX2RyaXZlcik7Cn0KCm1vZHVsZV9pbml0KGkyY19jcG1faW5pdCk7Cm1vZHVsZV9leGl0 KGkyY19jcG1fZXhpdCk7CgpNT0RVTEVfQVVUSE9SKCJEYW4gTWFsZWsgPGRtYWxla0BqbGMubmV0 PiIpOwpNT0RVTEVfREVTQ1JJUFRJT04oIkkyQy1CdXMgYWRhcHRlciByb3V0aW5lcyBmb3IgQ1BN IGJvYXJkcyIpOwpNT0RVTEVfTElDRU5TRSgiR1BMIik7Cg== ------=_Part_12546_15796975.1195238677228--