ZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vcGNpLmMgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL3BjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NzI3NTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL3BjaS5jCkBAIC0wLDAgKzEsNTI4IEBACisvKgorICoJUENJIGhhbmRsaW5nIG9mIEkyTyBjb250cm9sbGVyCisgKgorICogCUNvcHlyaWdodCAoQykgMTk5OS0yMDAyCVJlZCBIYXQgU29mdHdhcmUKKyAqCisgKglXcml0dGVuIGJ5IEFsYW4gQ294LCBCdWlsZGluZyBOdW1iZXIgVGhyZWUgTHRkCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqCXVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICoJRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICoJb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglBIGxvdCBvZiB0aGUgSTJPIG1lc3NhZ2Ugc2lkZSBjb2RlIGZyb20gdGhpcyBpcyB0YWtlbiBmcm9tIHRoZSBSZWQKKyAqCUNyZWVrIFJDUENJNDUgYWRhcHRlciBkcml2ZXIgYnkgUmVkIENyZWVrIENvbW11bmljYXRpb25zCisgKgorICoJRml4ZXMvYWRkaXRpb25zOgorICoJCVBoaWxpcHAgUnVtcGYKKyAqCQlKdWhhIFNpZXbkbmVuIDxKdWhhLlNpZXZhbmVuQGNzLkhlbHNpbmtpLkZJPgorICoJCUF1dm8gSORra2luZW4gPEF1dm8uSGFra2luZW5AY3MuSGVsc2lua2kuRkk+CisgKgkJRGVlcGFrIFNheGVuYSA8ZGVlcGFrQHBsZXhpdHkubmV0PgorICoJCUJvamkgVCBLYW5uYW50aGFuYW0gPGJvamkudC5rYW5uYW50aGFuYW1AaW50ZWwuY29tPgorICoJCUFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+OgorICoJCQlQb3J0ZWQgdG8gTGludXggMi41LgorICoJCU1hcmt1cyBMaWRlbCA8TWFya3VzLkxpZGVsQHNoYWRvd2Nvbm5lY3QuY29tPjoKKyAqCQkJTWlub3IgZml4ZXMgZm9yIDIuNi4KKyAqCQlNYXJrdXMgTGlkZWwgPE1hcmt1cy5MaWRlbEBzaGFkb3djb25uZWN0LmNvbT46CisgKgkJCVN1cHBvcnQgZm9yIHN5c2ZzIGluY2x1ZGVkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pMm8uaD4KKworI2lmZGVmIENPTkZJR19NVFJSCisjaW5jbHVkZSA8YXNtL210cnIuaD4KKyNlbmRpZgkJCQkvLyBDT05GSUdfTVRSUgorCisvKiBNb2R1bGUgaW50ZXJuYWwgZnVuY3Rpb25zIGZyb20gb3RoZXIgc291cmNlcyAqLworZXh0ZXJuIHN0cnVjdCBpMm9fY29udHJvbGxlciAqaTJvX2lvcF9hbGxvYyh2b2lkKTsKK2V4dGVybiB2b2lkIGkyb19pb3BfZnJlZShzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKik7CisKK2V4dGVybiBpbnQgaTJvX2lvcF9hZGQoc3RydWN0IGkyb19jb250cm9sbGVyICopOworZXh0ZXJuIHZvaWQgaTJvX2lvcF9yZW1vdmUoc3RydWN0IGkyb19jb250cm9sbGVyICopOworCitleHRlcm4gaW50IGkyb19kcml2ZXJfZGlzcGF0Y2goc3RydWN0IGkyb19jb250cm9sbGVyICosIHUzMiwKKwkJCSAgICAgICBzdHJ1Y3QgaTJvX21lc3NhZ2UgKik7CisKKy8qIFBDSSBkZXZpY2UgaWQgdGFibGUgZm9yIGFsbCBJMk8gY29udHJvbGxlcnMgKi8KK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBfX2RldmluaXRkYXRhIGkyb19wY2lfaWRzW10gPSB7CisJe1BDSV9ERVZJQ0VfQ0xBU1MoUENJX0NMQVNTX0lOVEVMTElHRU5UX0kyTyA8PCA4LCAweGZmZmYwMCl9LAorCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfRFBULCAweGE1MTEpfSwKKwl7MH0KK307CisKKy8qKgorICoJaTJvX2RtYV9yZWFsbG9jIC0gUmVhbGxvYyBETUEgbWVtb3J5CisgKglAZGV2OiBzdHJ1Y3QgZGV2aWNlIHBvaW50ZXIgdG8gdGhlIFBDSSBkZXZpY2Ugb2YgdGhlIEkyTyBjb250cm9sbGVyCisgKglAYWRkcjogcG9pbnRlciB0byBhIGkyb19kbWEgc3RydWN0IERNQSBidWZmZXIKKyAqCUBsZW46IG5ldyBsZW5ndGggb2YgbWVtb3J5CisgKglAZ2ZwX21hc2s6IEdGUCBtYXNrCisgKgorICoJSWYgdGhlcmUgd2FzIHNvbWV0aGluZyBhbGxvY2F0ZWQgaW4gdGhlIGFkZHIsIGZyZWUgaXQgZmlyc3QuIElmIGxlbiA+IDAKKyAqCXRoYW4gdHJ5IHRvIGFsbG9jYXRlIGl0IGFuZCB3cml0ZSB0aGUgYWRkcmVzc2VzIGJhY2sgdG8gdGhlIGFkZHIKKyAqCXN0cnVjdHVyZS4gSWYgbGVuID09IDAgc2V0IHRoZSB2aXJ0dWFsIGFkZHJlc3MgdG8gTlVMTC4KKyAqCisgKglSZXR1cm5zIHRoZSAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCitpbnQgaTJvX2RtYV9yZWFsbG9jKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGkyb19kbWEgKmFkZHIsIHNpemVfdCBsZW4sCisJCSAgICB1bnNpZ25lZCBpbnQgZ2ZwX21hc2spCit7CisJaTJvX2RtYV9mcmVlKGRldiwgYWRkcik7CisKKwlpZiAobGVuKQorCQlyZXR1cm4gaTJvX2RtYV9hbGxvYyhkZXYsIGFkZHIsIGxlbiwgZ2ZwX21hc2spOworCisJcmV0dXJuIDA7Cit9OworCisvKioKKyAqCWkyb19wY2lfZnJlZSAtIEZyZWVzIHRoZSBETUEgbWVtb3J5IGZvciB0aGUgSTJPIGNvbnRyb2xsZXIKKyAqCUBjOiBJMk8gY29udHJvbGxlciB0byBmcmVlCisgKgorICoJUmVtb3ZlIGFsbCBhbGxvY2F0ZWQgRE1BIG1lbW9yeSBhbmQgdW5tYXAgbWVtb3J5IElPIHJlZ2lvbnMuIElmIE1UUlIKKyAqCWlzIGVuYWJsZWQsIGFsc28gcmVtb3ZlIGl0IGFnYWluLgorICovCitzdGF0aWMgdm9pZCBpMm9fcGNpX2ZyZWUoc3RydWN0IGkyb19jb250cm9sbGVyICpjKQoreworCXN0cnVjdCBkZXZpY2UgKmRldjsKKworCWRldiA9ICZjLT5wZGV2LT5kZXY7CisKKwlpMm9fZG1hX2ZyZWUoZGV2LCAmYy0+b3V0X3F1ZXVlKTsKKwlpMm9fZG1hX2ZyZWUoZGV2LCAmYy0+c3RhdHVzX2Jsb2NrKTsKKwlpZiAoYy0+bGN0KQorCQlrZnJlZShjLT5sY3QpOworCWkyb19kbWFfZnJlZShkZXYsICZjLT5kbGN0KTsKKwlpMm9fZG1hX2ZyZWUoZGV2LCAmYy0+aHJ0KTsKKwlpMm9fZG1hX2ZyZWUoZGV2LCAmYy0+c3RhdHVzKTsKKworI2lmZGVmIENPTkZJR19NVFJSCisJaWYgKGMtPm10cnJfcmVnMCA+PSAwKQorCQltdHJyX2RlbChjLT5tdHJyX3JlZzAsIDAsIDApOworCWlmIChjLT5tdHJyX3JlZzEgPj0gMCkKKwkJbXRycl9kZWwoYy0+bXRycl9yZWcxLCAwLCAwKTsKKyNlbmRpZgorCisJaWYgKGMtPnJhcHRvciAmJiBjLT5pbl9xdWV1ZS52aXJ0KQorCQlpb3VubWFwKGMtPmluX3F1ZXVlLnZpcnQpOworCisJaWYgKGMtPmJhc2UudmlydCkKKwkJaW91bm1hcChjLT5iYXNlLnZpcnQpOworfQorCisvKioKKyAqCWkyb19wY2lfYWxsb2MgLSBBbGxvY2F0ZSBETUEgbWVtb3J5LCBtYXAgSU8gbWVtb3J5IGZvciBJMk8gY29udHJvbGxlcgorICoJQGM6IEkyTyBjb250cm9sbGVyCisgKgorICoJQWxsb2NhdGUgRE1BIG1lbW9yeSBmb3IgYSBQQ0kgKG9yIGluIHRoZW9yeSBBR1ApIEkyTyBjb250cm9sbGVyLiBBbGwKKyAqCUlPIG1hcHBpbmdzIGFyZSBhbHNvIGRvbmUgaGVyZS4gSWYgTVRSUiBpcyBlbmFibGVkLCBhbHNvIGRvIGFkZCBtZW1vcnkKKyAqCXJlZ2lvbnMgaGVyZS4KKyAqCisgKglSZXR1cm5zIDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IGkyb19wY2lfYWxsb2Moc3RydWN0IGkyb19jb250cm9sbGVyICpjKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYy0+cGRldjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCQkvKiBTa2lwIEkvTyBzcGFjZXMgKi8KKwkJaWYgKCEocGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIGkpICYgSU9SRVNPVVJDRV9JTykpIHsKKwkJCWlmICghYy0+YmFzZS5waHlzKSB7CisJCQkJYy0+YmFzZS5waHlzID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIGkpOworCQkJCWMtPmJhc2UubGVuID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LCBpKTsKKworCQkJCS8qCisJCQkJICogSWYgd2Uga25vdyB3aGF0IGNhcmQgaXQgaXMsIHNldCB0aGUgc2l6ZQorCQkJCSAqIGNvcnJlY3RseS4gQ29kZSBpcyB0YWtlbiBmcm9tIGRwdF9pMm8uYworCQkJCSAqLworCQkJCWlmIChwZGV2LT5kZXZpY2UgPT0gMHhhNTAxKSB7CisJCQkJCWlmIChwZGV2LT5zdWJzeXN0ZW1fZGV2aWNlID49IDB4YzAzMiAmJgorCQkJCQkgICAgcGRldi0+c3Vic3lzdGVtX2RldmljZSA8PSAweGMwM2IpIHsKKwkJCQkJCWlmIChjLT5iYXNlLmxlbiA+IDB4NDAwMDAwKQorCQkJCQkJCWMtPmJhc2UubGVuID0gMHg0MDAwMDA7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlpZiAoYy0+YmFzZS5sZW4gPiAweDEwMDAwMCkKKwkJCQkJCQljLT5iYXNlLmxlbiA9IDB4MTAwMDAwOworCQkJCQl9CisJCQkJfQorCQkJCWlmICghYy0+cmFwdG9yKQorCQkJCQlicmVhazsKKwkJCX0gZWxzZSB7CisJCQkJYy0+aW5fcXVldWUucGh5cyA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCBpKTsKKwkJCQljLT5pbl9xdWV1ZS5sZW4gPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIGkpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJaWYgKGkgPT0gNikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBJMk8gY29udHJvbGxlciBoYXMgbm8gbWVtb3J5IHJlZ2lvbnMiCisJCSAgICAgICAiIGRlZmluZWQuXG4iLCBjLT5uYW1lKTsKKwkJaTJvX3BjaV9mcmVlKGMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBNYXAgdGhlIEkyTyBjb250cm9sbGVyICovCisJaWYgKGMtPnJhcHRvcikgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogUENJIEkyTyBjb250cm9sbGVyXG4iLCBjLT5uYW1lKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiICAgICBCQVIwIGF0IDB4JTA4bFggc2l6ZT0lbGRcbiIsCisJCSAgICAgICAodW5zaWduZWQgbG9uZyljLT5iYXNlLnBoeXMsICh1bnNpZ25lZCBsb25nKWMtPmJhc2UubGVuKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiICAgICBCQVIxIGF0IDB4JTA4bFggc2l6ZT0lbGRcbiIsCisJCSAgICAgICAodW5zaWduZWQgbG9uZyljLT5pbl9xdWV1ZS5waHlzLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpYy0+aW5fcXVldWUubGVuKTsKKwl9IGVsc2UKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFBDSSBJMk8gY29udHJvbGxlciBhdCAlMDhsWCBzaXplPSVsZFxuIiwKKwkJICAgICAgIGMtPm5hbWUsICh1bnNpZ25lZCBsb25nKWMtPmJhc2UucGh5cywKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKWMtPmJhc2UubGVuKTsKKworCWMtPmJhc2UudmlydCA9IGlvcmVtYXAoYy0+YmFzZS5waHlzLCBjLT5iYXNlLmxlbik7CisJaWYgKCFjLT5iYXNlLnZpcnQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogVW5hYmxlIHRvIG1hcCBjb250cm9sbGVyLlxuIiwgYy0+bmFtZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmIChjLT5yYXB0b3IpIHsKKwkJYy0+aW5fcXVldWUudmlydCA9IGlvcmVtYXAoYy0+aW5fcXVldWUucGh5cywgYy0+aW5fcXVldWUubGVuKTsKKwkJaWYgKCFjLT5pbl9xdWV1ZS52aXJ0KSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBVbmFibGUgdG8gbWFwIGNvbnRyb2xsZXIuXG4iLAorCQkJICAgICAgIGMtPm5hbWUpOworCQkJaTJvX3BjaV9mcmVlKGMpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwl9IGVsc2UKKwkJYy0+aW5fcXVldWUgPSBjLT5iYXNlOworCisJYy0+aXJxX21hc2sgPSBjLT5iYXNlLnZpcnQgKyAweDM0OworCWMtPnBvc3RfcG9ydCA9IGMtPmJhc2UudmlydCArIDB4NDA7CisJYy0+cmVwbHlfcG9ydCA9IGMtPmJhc2UudmlydCArIDB4NDQ7CisKKyNpZmRlZiBDT05GSUdfTVRSUgorCS8qIEVuYWJsZSBXcml0ZSBDb21iaW5pbmcgTVRSUiBmb3IgSU9QJ3MgbWVtb3J5IHJlZ2lvbiAqLworCWMtPm10cnJfcmVnMCA9IG10cnJfYWRkKGMtPmluX3F1ZXVlLnBoeXMsIGMtPmluX3F1ZXVlLmxlbiwKKwkJCQlNVFJSX1RZUEVfV1JDT01CLCAxKTsKKwljLT5tdHJyX3JlZzEgPSAtMTsKKworCWlmIChjLT5tdHJyX3JlZzAgPCAwKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogY291bGQgbm90IGVuYWJsZSB3cml0ZSBjb21iaW5pbmcgIgorCQkgICAgICAgIk1UUlJcbiIsIGMtPm5hbWUpOworCWVsc2UKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHVzaW5nIHdyaXRlIGNvbWJpbmluZyBNVFJSXG4iLCBjLT5uYW1lKTsKKworCS8qCisJICogSWYgaXQgaXMgYW4gSU5URUwgaTk2MCBJL08gcHJvY2Vzc29yIHRoZW4gc2V0IHRoZSBmaXJzdCA2NEsgdG8KKwkgKiBVbmNhY2hlYWJsZSBzaW5jZSB0aGUgcmVnaW9uIGNvbnRhaW5zIHRoZSBtZXNzYWdpbmcgdW5pdCB3aGljaAorCSAqIHNob3VsZG4ndCBiZSBjYWNoZWQuCisJICovCisJaWYgKChwZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9JTlRFTCB8fAorCSAgICAgcGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfRFBUKSAmJiAhYy0+cmFwdG9yKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBNVFJSIHdvcmthcm91bmQgZm9yIEludGVsIGk5NjAgcHJvY2Vzc29yIgorCQkgICAgICAgIlxuIiwgYy0+bmFtZSk7CisJCWMtPm10cnJfcmVnMSA9IG10cnJfYWRkKGMtPmJhc2UucGh5cywgMHgxMDAwMCwKKwkJCQkJTVRSUl9UWVBFX1VOQ0FDSEFCTEUsIDEpOworCisJCWlmIChjLT5tdHJyX3JlZzEgPCAwKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogRXJyb3IgaW4gc2V0dGluZyAiCisJCQkgICAgICAgIk1UUlJfVFlQRV9VTkNBQ0hBQkxFXG4iLCBjLT5uYW1lKTsKKwkJCW10cnJfZGVsKGMtPm10cnJfcmVnMCwgYy0+aW5fcXVldWUucGh5cywKKwkJCQkgYy0+aW5fcXVldWUubGVuKTsKKwkJCWMtPm10cnJfcmVnMCA9IC0xOworCQl9CisJfQorI2VuZGlmCisKKwlpZiAoaTJvX2RtYV9hbGxvYyhkZXYsICZjLT5zdGF0dXMsIDgsIEdGUF9LRVJORUwpKSB7CisJCWkyb19wY2lfZnJlZShjKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaWYgKGkyb19kbWFfYWxsb2MoZGV2LCAmYy0+aHJ0LCBzaXplb2YoaTJvX2hydCksIEdGUF9LRVJORUwpKSB7CisJCWkyb19wY2lfZnJlZShjKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaWYgKGkyb19kbWFfYWxsb2MoZGV2LCAmYy0+ZGxjdCwgODE5MiwgR0ZQX0tFUk5FTCkpIHsKKwkJaTJvX3BjaV9mcmVlKGMpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAoaTJvX2RtYV9hbGxvYyhkZXYsICZjLT5zdGF0dXNfYmxvY2ssIHNpemVvZihpMm9fc3RhdHVzX2Jsb2NrKSwKKwkJCSAgR0ZQX0tFUk5FTCkpIHsKKwkJaTJvX3BjaV9mcmVlKGMpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAoaTJvX2RtYV9hbGxvYyhkZXYsICZjLT5vdXRfcXVldWUsIE1TR19QT09MX1NJWkUsIEdGUF9LRVJORUwpKSB7CisJCWkyb19wY2lfZnJlZShjKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGMpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJaTJvX3BjaV9pbnRlcnJ1cHQgLSBJbnRlcnJ1cHQgaGFuZGxlciBmb3IgSTJPIGNvbnRyb2xsZXIKKyAqCUBpcnE6IGludGVycnVwdCBsaW5lCisgKglAZGV2X2lkOiBwb2ludGVyIHRvIHRoZSBJMk8gY29udHJvbGxlcgorICoJQHI6IHBvaW50ZXIgdG8gcmVnaXN0ZXJzCisgKgorICoJSGFuZGxlIGFuIGludGVycnVwdCBmcm9tIGEgUENJIGJhc2VkIEkyTyBjb250cm9sbGVyLiBUaGlzIHR1cm5zIG91dAorICoJdG8gYmUgcmF0aGVyIHNpbXBsZS4gV2Uga2VlcCB0aGUgY29udHJvbGxlciBwb2ludGVyIGluIHRoZSBjb29raWUuCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBpMm9fcGNpX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyKQoreworCXN0cnVjdCBpMm9fY29udHJvbGxlciAqYyA9IGRldl9pZDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmYy0+cGRldi0+ZGV2OworCXN0cnVjdCBpMm9fbWVzc2FnZSAqbTsKKwl1MzIgbXY7CisKKwkvKgorCSAqIE9sZCA5NjAgc3RlcHBpbmdzIGhhZCBhIGJ1ZyBpbiB0aGUgSTJPIHVuaXQgdGhhdCBjYXVzZWQKKwkgKiB0aGUgcXVldWUgdG8gYXBwZWFyIGVtcHR5IHdoZW4gaXQgd2Fzbid0LgorCSAqLworCW12ID0gSTJPX1JFUExZX1JFQUQzMihjKTsKKwlpZiAobXYgPT0gSTJPX1FVRVVFX0VNUFRZKSB7CisJCW12ID0gSTJPX1JFUExZX1JFQUQzMihjKTsKKwkJaWYgKHVubGlrZWx5KG12ID09IEkyT19RVUVVRV9FTVBUWSkpIHsKKwkJCXJldHVybiBJUlFfTk9ORTsKKwkJfSBlbHNlCisJCQlwcl9kZWJ1ZygiJXM6IDk2MCBidWcgZGV0ZWN0ZWRcbiIsIGMtPm5hbWUpOworCX0KKworCXdoaWxlIChtdiAhPSBJMk9fUVVFVUVfRU1QVFkpIHsKKwkJLyoKKwkJICogTWFwIHRoZSBtZXNzYWdlIGZyb20gdGhlIHBhZ2UgZnJhbWUgbWFwIHRvIGtlcm5lbCB2aXJ0dWFsLgorCQkgKiBCZWNhdXNlIGJ1c190b192aXJ0IGlzIGRlcHJlY2F0ZWQsIHdlIGhhdmUgY2FsY3VsYXRlIHRoZQorCQkgKiBsb2NhdGlvbiBieSBvdXJzZWxmIQorCQkgKi8KKwkJbSA9IGkyb19tc2dfb3V0X3RvX3ZpcnQoYywgbXYpOworCisJCS8qCisJCSAqICAgICAgRW5zdXJlIHRoaXMgbWVzc2FnZSBpcyBzZWVuIGNvaGVyZW50bHkgYnV0IGNhY2hhYmx5IGJ5CisJCSAqICAgICAgdGhlIHByb2Nlc3NvcgorCQkgKi8KKwkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoZGV2LCBtdiwgTVNHX0ZSQU1FX1NJWkUgKiA0LAorCQkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJCS8qIGRpc3BhdGNoIGl0ICovCisJCWlmIChpMm9fZHJpdmVyX2Rpc3BhdGNoKGMsIG12LCBtKSkKKwkJCS8qIGZsdXNoIGl0IGlmIHJlc3VsdCAhPSAwICovCisJCQlpMm9fZmx1c2hfcmVwbHkoYywgbXYpOworCisJCS8qCisJCSAqIFRoYXQgOTYwIGJ1ZyBhZ2Fpbi4uLgorCQkgKi8KKwkJbXYgPSBJMk9fUkVQTFlfUkVBRDMyKGMpOworCQlpZiAobXYgPT0gSTJPX1FVRVVFX0VNUFRZKQorCQkJbXYgPSBJMk9fUkVQTFlfUkVBRDMyKGMpOworCX0KKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qKgorICoJaTJvX3BjaV9pcnFfZW5hYmxlIC0gQWxsb2NhdGUgaW50ZXJydXB0IGZvciBJMk8gY29udHJvbGxlcgorICoKKyAqCUFsbG9jYXRlIGFuIGludGVycnVwdCBmb3IgdGhlIEkyTyBjb250cm9sbGVyLCBhbmQgYWN0aXZhdGUgaW50ZXJydXB0cworICoJb24gdGhlIEkyTyBjb250cm9sbGVyLgorICoKKyAqCVJldHVybnMgMCBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGludCBpMm9fcGNpX2lycV9lbmFibGUoc3RydWN0IGkyb19jb250cm9sbGVyICpjKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYy0+cGRldjsKKwlpbnQgcmM7CisKKwlJMk9fSVJRX1dSSVRFMzIoYywgMHhmZmZmZmZmZik7CisKKwlpZiAocGRldi0+aXJxKSB7CisJCXJjID0gcmVxdWVzdF9pcnEocGRldi0+aXJxLCBpMm9fcGNpX2ludGVycnVwdCwgU0FfU0hJUlEsCisJCQkJIGMtPm5hbWUsIGMpOworCQlpZiAocmMgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmFibGUgdG8gYWxsb2NhdGUgaW50ZXJydXB0ICVkLiIKKwkJCSAgICAgICAiXG4iLCBjLT5uYW1lLCBwZGV2LT5pcnEpOworCQkJcmV0dXJuIHJjOworCQl9CisJfQorCisJSTJPX0lSUV9XUklURTMyKGMsIDB4MDAwMDAwMDApOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEluc3RhbGxlZCBhdCBJUlEgJWRcbiIsIGMtPm5hbWUsIHBkZXYtPmlycSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglpMm9fcGNpX2lycV9kaXNhYmxlIC0gRnJlZSBpbnRlcnJ1cHQgZm9yIEkyTyBjb250cm9sbGVyCisgKglAYzogSTJPIGNvbnRyb2xsZXIKKyAqCisgKglEaXNhYmxlIGludGVycnVwdHMgaW4gSTJPIGNvbnRyb2xsZXIgYW5kIHRoZW4gZnJlZSBpbnRlcnJ1cHQuCisgKi8KK3N0YXRpYyB2b2lkIGkyb19wY2lfaXJxX2Rpc2FibGUoc3RydWN0IGkyb19jb250cm9sbGVyICpjKQoreworCUkyT19JUlFfV1JJVEUzMihjLCAweGZmZmZmZmZmKTsKKworCWlmIChjLT5wZGV2LT5pcnEgPiAwKQorCQlmcmVlX2lycShjLT5wZGV2LT5pcnEsIGMpOworfQorCisvKioKKyAqCWkyb19wY2lfcHJvYmUgLSBQcm9iZSB0aGUgUENJIGRldmljZSBmb3IgYW4gSTJPIGNvbnRyb2xsZXIKKyAqCUBkZXY6IFBDSSBkZXZpY2UgdG8gdGVzdAorICoJQGlkOiBpZCB3aGljaCBtYXRjaGVkIHdpdGggdGhlIFBDSSBkZXZpY2UgaWQgdGFibGUKKyAqCisgKglQcm9iZSB0aGUgUENJIGRldmljZSBmb3IgYW55IGRldmljZSB3aGljaCBpcyBhIG1lbW9yeSBvZiB0aGUKKyAqCUludGVsbGlnZW50LCBJMk8gY2xhc3Mgb3IgYW4gQWRhcHRlYyBaZXJvIENoYW5uZWwgQ29udHJvbGxlci4gV2UKKyAqCWF0dGVtcHQgdG8gc2V0IHVwIGVhY2ggc3VjaCBkZXZpY2UgYW5kIHJlZ2lzdGVyIGl0IHdpdGggdGhlIGNvcmUuCisgKgorICoJUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCBpMm9fcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmM7CisJaW50IHJjOworCisJcHJpbnRrKEtFUk5fSU5GTyAiaTJvOiBDaGVja2luZyBmb3IgUENJIEkyTyBjb250cm9sbGVycy4uLlxuIik7CisKKwlpZiAoKHBkZXYtPmNsYXNzICYgMHhmZikgPiAxKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImkybzogSTJPIGNvbnRyb2xsZXIgZm91bmQgYnV0IGRvZXMgbm90ICIKKwkJICAgICAgICJzdXBwb3J0IEkyTyAxLjUgKHNraXBwaW5nKS5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoKHJjID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldikpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImkybzogSTJPIGNvbnRyb2xsZXIgZm91bmQgYnV0IGNvdWxkIG5vdCBiZSIKKwkJICAgICAgICIgZW5hYmxlZC5cbiIpOworCQlyZXR1cm4gcmM7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiaTJvOiBJMk8gY29udHJvbGxlciBmb3VuZCBvbiBidXMgJWQgYXQgJWQuXG4iLAorCSAgICAgICBwZGV2LT5idXMtPm51bWJlciwgcGRldi0+ZGV2Zm4pOworCisJaWYgKHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BXzMyQklUX01BU0spKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImkybzogSTJPIGNvbnRyb2xsZXIgb24gYnVzICVkIGF0ICVkOiBObyAiCisJCSAgICAgICAic3VpdGFibGUgRE1BIGF2YWlsYWJsZSFcbiIsIHBkZXYtPmJ1cy0+bnVtYmVyLAorCQkgICAgICAgcGRldi0+ZGV2Zm4pOworCQlyYyA9IC1FTk9ERVY7CisJCWdvdG8gZGlzYWJsZTsKKwl9CisKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCWMgPSBpMm9faW9wX2FsbG9jKCk7CisJaWYgKElTX0VSUihjKSkgeworCQlwcmludGsoS0VSTl9FUlIgImkybzogbWVtb3J5IGZvciBJMk8gY29udHJvbGxlciBjb3VsZCBub3QgYmUgIgorCQkgICAgICAgImFsbG9jYXRlZFxuIik7CisJCXJjID0gUFRSX0VSUihjKTsKKwkJZ290byBkaXNhYmxlOworCX0KKworCWMtPnBkZXYgPSBwZGV2OworCWMtPmRldmljZSA9IHBkZXYtPmRldjsKKworCS8qIENhcmRzIHRoYXQgZmFsbCBhcGFydCBpZiB5b3UgaGl0IHRoZW0gd2l0aCBsYXJnZSBJL08gbG9hZHMuLi4gKi8KKwlpZiAocGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfTkNSICYmIHBkZXYtPmRldmljZSA9PSAweDA2MzApIHsKKwkJYy0+c2hvcnRfcmVxID0gMTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFN5bWJpb3MgRkM5MjAgd29ya2Fyb3VuZHMgYWN0aXZhdGVkLlxuIiwKKwkJICAgICAgIGMtPm5hbWUpOworCX0KKworCWlmIChwZGV2LT5zdWJzeXN0ZW1fdmVuZG9yID09IFBDSV9WRU5ET1JfSURfUFJPTUlTRSkgeworCQljLT5wcm9taXNlID0gMTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFByb21pc2Ugd29ya2Fyb3VuZHMgYWN0aXZhdGVkLlxuIiwKKwkJICAgICAgIGMtPm5hbWUpOworCX0KKworCS8qIENhcmRzIHRoYXQgZ28gYmFuYW5hcyBpZiB5b3UgcXVpZXNjZSB0aGVtIGJlZm9yZSB5b3UgcmVzZXQgdGhlbS4gKi8KKwlpZiAocGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfRFBUKSB7CisJCWMtPm5vX3F1aWVzY2UgPSAxOworCQlpZiAocGRldi0+ZGV2aWNlID09IDB4YTUxMSkKKwkJCWMtPnJhcHRvciA9IDE7CisJfQorCisJaWYgKChyYyA9IGkyb19wY2lfYWxsb2MoYykpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IERNQSAvIElPIGFsbG9jYXRpb24gZm9yIEkyTyBjb250cm9sbGVyICIKKwkJICAgICAgICIgZmFpbGVkXG4iLCBjLT5uYW1lKTsKKwkJZ290byBmcmVlX2NvbnRyb2xsZXI7CisJfQorCisJaWYgKGkyb19wY2lfaXJxX2VuYWJsZShjKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmFibGUgdG8gZW5hYmxlIGludGVycnVwdHMgZm9yIEkyTyAiCisJCSAgICAgICAiY29udHJvbGxlclxuIiwgYy0+bmFtZSk7CisJCWdvdG8gZnJlZV9wY2k7CisJfQorCisJaWYgKChyYyA9IGkyb19pb3BfYWRkKGMpKSkKKwkJZ290byB1bmluc3RhbGw7CisKKwlyZXR1cm4gMDsKKworICAgICAgdW5pbnN0YWxsOgorCWkyb19wY2lfaXJxX2Rpc2FibGUoYyk7CisKKyAgICAgIGZyZWVfcGNpOgorCWkyb19wY2lfZnJlZShjKTsKKworICAgICAgZnJlZV9jb250cm9sbGVyOgorCWkyb19pb3BfZnJlZShjKTsKKworICAgICAgZGlzYWJsZToKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICoJaTJvX3BjaV9yZW1vdmUgLSBSZW1vdmVzIGEgSTJPIGNvbnRyb2xsZXIgZnJvbSB0aGUgc3lzdGVtCisgKglwZGV2OiBJMk8gY29udHJvbGxlciB3aGljaCBzaG91bGQgYmUgcmVtb3ZlZAorICoKKyAqCVJlc2V0IHRoZSBJMk8gY29udHJvbGxlciwgZGlzYWJsZSBpbnRlcnJ1cHRzIGFuZCByZW1vdmUgYWxsIGFsbG9jYXRlZAorICoJcmVzb3VyY2VzLgorICovCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgaTJvX3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IGkyb19jb250cm9sbGVyICpjOworCWMgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwlpMm9faW9wX3JlbW92ZShjKTsKKwlpMm9fcGNpX2lycV9kaXNhYmxlKGMpOworCWkyb19wY2lfZnJlZShjKTsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBDb250cm9sbGVyIHJlbW92ZWQuXG4iLCBjLT5uYW1lKTsKKworCWkyb19pb3BfZnJlZShjKTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Cit9OworCisvKiBQQ0kgZHJpdmVyIGZvciBJMk8gY29udHJvbGxlciAqLworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGkyb19wY2lfZHJpdmVyID0geworCS5uYW1lID0gIkkyTyBjb250cm9sbGVyIiwKKwkuaWRfdGFibGUgPSBpMm9fcGNpX2lkcywKKwkucHJvYmUgPSBpMm9fcGNpX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChpMm9fcGNpX3JlbW92ZSksCit9OworCisvKioKKyAqCWkyb19wY2lfaW5pdCAtIHJlZ2lzdGVycyBJMk8gUENJIGRyaXZlciBpbiBQQ0kgc3Vic3lzdGVtCisgKgorICoJUmV0dXJucyA+IDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK2ludCBfX2luaXQgaTJvX3BjaV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmkyb19wY2lfZHJpdmVyKTsKK307CisKKy8qKgorICoJaTJvX3BjaV9leGl0IC0gdW5yZWdpc3RlcnMgSTJPIFBDSSBkcml2ZXIgZnJvbSBQQ0kgc3Vic3lzdGVtCisgKi8KK3ZvaWQgX19leGl0IGkyb19wY2lfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmaTJvX3BjaV9kcml2ZXIpOworfTsKKworRVhQT1JUX1NZTUJPTChpMm9fZG1hX3JlYWxsb2MpOworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGkyb19wY2lfaWRzKTsK