From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Subject: [v3,2/6] dmaengine: fsl-qdma: add NXP Layerscape qDMA engine driver support From: Vinod Koul Message-Id: <20180123090812.GX18649@localhost> Date: Tue, 23 Jan 2018 14:38:12 +0530 To: Wen He Cc: robh+dt@kernel.org, devicetree@vger.kernel.org, dmaengine@vger.kernel.org, leoyang.li@nxp.com, jiafei.pan@nxp.com, jiaheng.fan@nxp.com List-ID: T24gVGh1LCBKYW4gMTEsIDIwMTggYXQgMDU6MzI6MTFQTSArMDgwMCwgV2VuIEhlIHdyb3RlOgoK PiAgY29uZmlnIEZTTF9SQUlECj4gICAgICAgICAgdHJpc3RhdGUgIkZyZWVzY2FsZSBSQUlEIGVu Z2luZSBTdXBwb3J0Igo+IC0gICAgICAgIGRlcGVuZHMgb24gRlNMX1NPQyAmJiAhQVNZTkNfVFhf RU5BQkxFX0NIQU5ORUxfU1dJVENICj4gKwlkZXBlbmRzIG9uIEZTTF9TT0MgJiYgIUFTWU5DX1RY X0VOQUJMRV9DSEFOTkVMX1NXSVRDSAoKV2h5IHRoaXMgY2hhbmdlPwoKPiArLyoKPiArICogRHJp dmVyIGZvciBOWFAgTGF5ZXJzY2FwZSBRdWV1ZSBkaXJlY3QgbWVtb3J5IGFjY2VzcyBjb250cm9s bGVyIChxRE1BKQo+ICsgKgo+ICsgKiBDb3B5cmlnaHQgMjAxNyBOWFAKPiArICoKPiArICogQXV0 aG9yOgo+ICsgKiAgSmlhaGVuZyBGYW4gPGppYWhlbmcuZmFuQG54cC5jb20+Cj4gKyAqICBXZW4g SGUgPHdlbi5oZV8xQG54cC5jb20+Cj4gKyAqCj4gKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVy OiBHUEwtMi4wKwoKdGhpcyBuZWVkcyB0byBiZToKCi8vU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6 IEdQTC0yLjArCi8vQ29weXJpZ2h0IDIwMTcgTlhQCgphbmQgYXQgdG9wIG9mIHRoZSBmaWxlCgo+ ICsKPiArI2RlZmluZSBGU0xfUURNQV9DUUlEUl9DUVQJCTB4ZmYwMDAwMDAKPiArI2RlZmluZSBG U0xfUURNQV9DUUlEUl9TUVBFCQkweDgwMDAwMAo+ICsjZGVmaW5lIEZTTF9RRE1BX0NRSURSX1NR VAkJMHg4MDAwCgpCSVQgYW5kIEdFTk1BU0soKSBmb3IgdGhlc2UgYW5kIHJlc3Qgb2YgdGhlbSBw bGVhc2UKCj4gK3N0YXRpYyBpbmxpbmUgdTY0Cj4gK3FkbWFfY2NkZl9hZGRyX2dldDY0KGNvbnN0 IHN0cnVjdCBmc2xfcWRtYV9mb3JtYXQgKmNjZGYpCj4gK3sKPiArCXJldHVybiBsZTY0X3RvX2Nw dShjY2RmLT5kYXRhKSAmIDB4ZmZmZmZmZmZmZkxMVTsKCQkJCQkJXl5eXl4KCkRvIHlvdSB3YW50 IHNvbWV0aGluZyBsaWtlIElOVF9NQVgsIGlmIG5vdCBHRU5NQVNLKCkgcGxzIGZvciB0aGUgY29u c3RhbnQKCj4gK30KPiArCj4gK3N0YXRpYyBpbmxpbmUgdm9pZAo+ICtxZG1hX2Rlc2NfYWRkcl9z ZXQ2NChzdHJ1Y3QgZnNsX3FkbWFfZm9ybWF0ICpjY2RmLCB1NjQgYWRkcikKPiArewo+ICsJY2Nk Zi0+YWRkcl9oaSA9IHVwcGVyXzMyX2JpdHMoYWRkcik7Cj4gKwljY2RmLT5hZGRyX2xvID0gY3B1 X3RvX2xlMzIobG93ZXJfMzJfYml0cyhhZGRyKSk7Cj4gK30KPiArCj4gK3N0YXRpYyBpbmxpbmUg dTY0Cj4gK3FkbWFfY2NkZl9nZXRfcXVldWUoY29uc3Qgc3RydWN0IGZzbF9xZG1hX2Zvcm1hdCAq Y2NkZikKPiArewo+ICsJcmV0dXJuIGNjZGYtPmNmZzhiX3cxICYgMHhmZjsKClVTSFJUX01BWAoK PiArc3RhdGljIHZvaWQgZnNsX3FkbWFfY29tcF9maWxsX21lbWNweShzdHJ1Y3QgZnNsX3FkbWFf Y29tcCAqZnNsX2NvbXAsCj4gKwkJCQkJZG1hX2FkZHJfdCBkc3QsIGRtYV9hZGRyX3Qgc3JjLCB1 MzIgbGVuKQo+ICt7Cj4gKwlzdHJ1Y3QgZnNsX3FkbWFfZm9ybWF0ICpjY2RmLCAqY3NnZl9kZXNj LCAqY3NnZl9zcmMsICpjc2dmX2Rlc3Q7Cj4gKwlzdHJ1Y3QgZnNsX3FkbWFfc2RmICpzZGY7Cj4g KwlzdHJ1Y3QgZnNsX3FkbWFfZGRmICpkZGY7Cj4gKwo+ICsJY2NkZiA9IChzdHJ1Y3QgZnNsX3Fk bWFfZm9ybWF0ICopZnNsX2NvbXAtPnZpcnRfYWRkcjsKCndoeSBhcmUgZG9pbmcgYSBjYXN0IGF3 YXkgZnJvbSB2b2lkICo/Cgo+ICsJY3NnZl9kZXNjID0gKHN0cnVjdCBmc2xfcWRtYV9mb3JtYXQg Kilmc2xfY29tcC0+dmlydF9hZGRyICsgMTsKPiArCWNzZ2Zfc3JjID0gKHN0cnVjdCBmc2xfcWRt YV9mb3JtYXQgKilmc2xfY29tcC0+dmlydF9hZGRyICsgMjsKPiArCWNzZ2ZfZGVzdCA9IChzdHJ1 Y3QgZnNsX3FkbWFfZm9ybWF0ICopZnNsX2NvbXAtPnZpcnRfYWRkciArIDM7Cgp3aHkgbm90IGNj ZGYgKyAxIGFuZCBzbyBvbj8KIAo+ICsJc2RmID0gKHN0cnVjdCBmc2xfcWRtYV9zZGYgKilmc2xf Y29tcC0+dmlydF9hZGRyICsgNDsKPiArCWRkZiA9IChzdHJ1Y3QgZnNsX3FkbWFfZGRmICopZnNs X2NvbXAtPnZpcnRfYWRkciArIDU7Cj4gKwo+ICsJbWVtc2V0KGZzbF9jb21wLT52aXJ0X2FkZHIs IDAsIEZTTF9RRE1BX0JBU0VfQlVGRkVSX1NJWkUpOwo+ICsJLyogSGVhZCBDb21tYW5kIERlc2Ny aXB0b3IoRnJhbWUgRGVzY3JpcHRvcikgKi8KPiArCXFkbWFfZGVzY19hZGRyX3NldDY0KGNjZGYs IGZzbF9jb21wLT5idXNfYWRkciArIDE2KTsKPiArCXFkbWFfY2NkZl9zZXRfZm9ybWF0KGNjZGYs IHFkbWFfY2NkZl9nZXRfb2Zmc2V0KGNjZGYpKTsKPiArCXFkbWFfY2NkZl9zZXRfc2VyKGNjZGYs IHFkbWFfY2NkZl9nZXRfc3RhdHVzKGNjZGYpKTsKCmVtcHR5IGxpbmUgYWZ0ZXIgZWFjaCBsb2dp Y2FsIGJsb2NrIHRvIGhlbHAgcmVhZCB0aGUgY29kZSBiZXR0ZXIKCj4gK3N0YXRpYyBpbnQgZnNs X3FkbWFfcHJlX3JlcXVlc3RfZW5xdWV1ZV9kZXNjKHN0cnVjdCBmc2xfcWRtYV9xdWV1ZSAqcXVl dWUpCj4gK3sKPiArCXN0cnVjdCBmc2xfcWRtYV9jb21wICpjb21wX3RlbXA7Cj4gKwlpbnQgaTsK PiArCj4gKwlmb3IgKGkgPSAwOyBpIDwgcXVldWUtPm5fY3E7IGkrKykgewo+ICsJCWNvbXBfdGVt cCA9IGt6YWxsb2Moc2l6ZW9mKCpjb21wX3RlbXApLCBHRlBfS0VSTkVMKTsKCkdGUF9LRVJORUwg aGVyZQoKPiArCQlpZiAoIWNvbXBfdGVtcCkKPiArCQkJcmV0dXJuIC1FTk9NRU07Cj4gKwkJY29t cF90ZW1wLT52aXJ0X2FkZHIgPSBkbWFfcG9vbF9hbGxvYyhxdWV1ZS0+Y29tcF9wb29sLAo+ICsJ CQkJCQkgICAgICBHRlBfTk9XQUlULAoKR0ZQX05PV0FJVCBoZXJlID8/Cgp0aGlzIHNlZW1zIHRv IGJlIGNhbGxlZCBpbiBwcm9iZSByaWdodD8KCgo+ICtzdGF0aWMgc3RydWN0IGZzbF9xZG1hX2Nv bXAgKmZzbF9xZG1hX3JlcXVlc3RfZW5xdWV1ZV9kZXNjKAo+ICsJCQkJCXN0cnVjdCBmc2xfcWRt YV9jaGFuICpmc2xfY2hhbiwKPiArCQkJCQl1bnNpZ25lZCBpbnQgZHN0X25lbnRzLAo+ICsJCQkJ CXVuc2lnbmVkIGludCBzcmNfbmVudHMpCj4gK3sKPiArCXN0cnVjdCBmc2xfcWRtYV9jb21wICpj b21wX3RlbXA7Cj4gKwlzdHJ1Y3QgZnNsX3FkbWFfc2cgKnNnX2Jsb2NrOwo+ICsJc3RydWN0IGZz bF9xZG1hX3F1ZXVlICpxdWV1ZSA9IGZzbF9jaGFuLT5xdWV1ZTsKPiArCXVuc2lnbmVkIGxvbmcg ZmxhZ3M7Cj4gKwl1bnNpZ25lZCBpbnQgZHN0X3NnX2VudHJ5X2Jsb2NrLCBzcmNfc2dfZW50cnlf YmxvY2ssIHNnX2VudHJ5X3RvdGFsLCBpOwo+ICsKPiArCXNwaW5fbG9ja19pcnFzYXZlKCZxdWV1 ZS0+cXVldWVfbG9jaywgZmxhZ3MpOwo+ICsJaWYgKGxpc3RfZW1wdHkoJnF1ZXVlLT5jb21wX2Zy ZWUpKSB7Cj4gKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcXVldWUtPnF1ZXVlX2xvY2ssIGZs YWdzKTsKPiArCQljb21wX3RlbXAgPSBremFsbG9jKHNpemVvZigqY29tcF90ZW1wKSwgR0ZQX0tF Uk5FTCk7Cj4gKwkJaWYgKCFjb21wX3RlbXApCj4gKwkJCXJldHVybiBOVUxMOwo+ICsJCWNvbXBf dGVtcC0+dmlydF9hZGRyID0gZG1hX3Bvb2xfYWxsb2MocXVldWUtPmNvbXBfcG9vbCwKPiArCQkJ CQkJICAgICAgR0ZQX05PV0FJVCwKCmhlcmUgdG9vISB0aGlzIGlzIGNhbGxlZCBmcm9tIHByZXBf IGNvbnRleHQKCj4gKwkJCQkJCSAgICAgICZjb21wX3RlbXAtPmJ1c19hZGRyKTsKPiArCQlpZiAo IWNvbXBfdGVtcC0+dmlydF9hZGRyKSB7Cj4gKwkJCWtmcmVlKGNvbXBfdGVtcCk7Cj4gKwkJCXJl dHVybiBOVUxMOwo+ICsJCX0KPiArCj4gKwl9IGVsc2Ugewo+ICsJCWNvbXBfdGVtcCA9IGxpc3Rf Zmlyc3RfZW50cnkoJnF1ZXVlLT5jb21wX2ZyZWUsCj4gKwkJCQkJICAgICBzdHJ1Y3QgZnNsX3Fk bWFfY29tcCwKPiArCQkJCQkgICAgIGxpc3QpOwo+ICsJCWxpc3RfZGVsKCZjb21wX3RlbXAtPmxp c3QpOwo+ICsJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnF1ZXVlLT5xdWV1ZV9sb2NrLCBmbGFn cyk7Cj4gKwl9Cj4gKwo+ICsJaWYgKGRzdF9uZW50cyAhPSAwKQo+ICsJCWRzdF9zZ19lbnRyeV9i bG9jayA9IGRzdF9uZW50cyAvCj4gKwkJCQkJKEZTTF9RRE1BX0VYUEVDVF9TR19FTlRSWV9OVU0g LSAxKSArIDE7CgpESVZfUk9VTkRfVVAgb3Igc29tZXRoaW5nLiBQTHMgY2hlY2sga2VybmVsIGhh cyBkZWZpbmVzIGZvciB0aGVzZSBzb3J0IG9mCnRoaW5ncy4uLgoKPiArCWVsc2UKPiArCQlkc3Rf c2dfZW50cnlfYmxvY2sgPSAwOwo+ICsKPiArCWlmIChzcmNfbmVudHMgIT0gMCkKPiArCQlzcmNf c2dfZW50cnlfYmxvY2sgPSBzcmNfbmVudHMgLwo+ICsJCQkJCShGU0xfUURNQV9FWFBFQ1RfU0df RU5UUllfTlVNIC0gMSkgKyAxOwo+ICsJZWxzZQo+ICsJCXNyY19zZ19lbnRyeV9ibG9jayA9IDA7 Cj4gKwo+ICsJc2dfZW50cnlfdG90YWwgPSBkc3Rfc2dfZW50cnlfYmxvY2sgKyBzcmNfc2dfZW50 cnlfYmxvY2s7Cj4gKwlpZiAoc2dfZW50cnlfdG90YWwpIHsKPiArCQlzZ19ibG9jayA9IGt6YWxs b2Moc2l6ZW9mKCpzZ19ibG9jaykgKgo+ICsJCQkJCSAgICAgIHNnX2VudHJ5X3RvdGFsLAo+ICsJ CQkJCSAgICAgIEdGUF9LRVJORUwpOwo+ICsJCWlmICghc2dfYmxvY2spIHsKPiArCQkJZG1hX3Bv b2xfZnJlZShxdWV1ZS0+Y29tcF9wb29sLAo+ICsJCQkJCWNvbXBfdGVtcC0+dmlydF9hZGRyLAo+ ICsJCQkJCWNvbXBfdGVtcC0+YnVzX2FkZHIpOwo+ICsJCQlyZXR1cm4gTlVMTDsKPiArCQl9Cj4g KwkJY29tcF90ZW1wLT5zZ19ibG9jayA9IHNnX2Jsb2NrOwo+ICsJCWZvciAoaSA9IDA7IGkgPCBz Z19lbnRyeV90b3RhbDsgaSsrKSB7Cj4gKwkJCXNnX2Jsb2NrLT52aXJ0X2FkZHIgPSBkbWFfcG9v bF9hbGxvYyhxdWV1ZS0+c2dfcG9vbCwKPiArCQkJCQkJCUdGUF9OT1dBSVQsCgppIGd1ZXNzIHRo ZXNlIGFyZSBjb3B5IHBhc3RlciBlcnJvcnMuIEFuZCB0aGlzIGNvZGUgc2hvdWxkIHRoZW4gYmUg aW4KaGVscGVyIGFuZCB1c2VkIGV2ZXJ5d2hlcmUuLi4KCj4gK3N0YXRpYyBzdHJ1Y3QgZnNsX3Fk bWFfcXVldWUgKmZzbF9xZG1hX2FsbG9jX3F1ZXVlX3Jlc291cmNlcygKPiArCQkJCQlzdHJ1Y3Qg cGxhdGZvcm1fZGV2aWNlICpwZGV2LAo+ICsJCQkJCXVuc2lnbmVkIGludCBxdWV1ZV9udW0pCj4g K3sKPiArCXN0cnVjdCBmc2xfcWRtYV9xdWV1ZSAqcXVldWVfaGVhZCwgKnF1ZXVlX3RlbXA7Cj4g KwlpbnQgcmV0LCBsZW4sIGk7Cj4gKwl1bnNpZ25lZCBpbnQgcXVldWVfc2l6ZVtGU0xfUURNQV9R VUVVRV9NQVhdOwo+ICsKPiArCWlmIChxdWV1ZV9udW0gPiBGU0xfUURNQV9RVUVVRV9NQVgpCj4g KwkJcXVldWVfbnVtID0gRlNMX1FETUFfUVVFVUVfTUFYOwo+ICsJbGVuID0gc2l6ZW9mKCpxdWV1 ZV9oZWFkKSAqIHF1ZXVlX251bTsKPiArCXF1ZXVlX2hlYWQgPSBkZXZtX2t6YWxsb2MoJnBkZXYt PmRldiwgbGVuLCBHRlBfS0VSTkVMKTsKPiArCWlmICghcXVldWVfaGVhZCkKPiArCQlyZXR1cm4g TlVMTDsKPiArCj4gKwlyZXQgPSBkZXZpY2VfcHJvcGVydHlfcmVhZF91MzJfYXJyYXkoJnBkZXYt PmRldiwgInF1ZXVlLXNpemVzIiwKPiArCQkJCQlxdWV1ZV9zaXplLCBxdWV1ZV9udW0pOwo+ICsJ aWYgKHJldCkgewo+ICsJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbid0IGdldCBxdWV1ZS1zaXpl cy5cbiIpOwo+ICsJCXJldHVybiBOVUxMOwo+ICsJfQo+ICsKPiArCWZvciAoaSA9IDA7IGkgPCBx dWV1ZV9udW07IGkrKykgewo+ICsJCWlmIChxdWV1ZV9zaXplW2ldID4gRlNMX1FETUFfQ0lSQ1VM QVJfREVTQ19TSVpFX01BWAo+ICsJCQl8fCBxdWV1ZV9zaXplW2ldIDwgRlNMX1FETUFfQ0lSQ1VM QVJfREVTQ19TSVpFX01JTikgewo+ICsJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJHZXQgd3Jvbmcg cXVldWUtc2l6ZXMuXG4iKTsKPiArCQkJcmV0dXJuIE5VTEw7Cj4gKwkJfQo+ICsJCXF1ZXVlX3Rl bXAgPSBxdWV1ZV9oZWFkICsgaTsKPiArCQlxdWV1ZV90ZW1wLT5jcSA9IGRtYV9hbGxvY19jb2hl cmVudCgmcGRldi0+ZGV2LAo+ICsJCQkJCQlzaXplb2Yoc3RydWN0IGZzbF9xZG1hX2Zvcm1hdCkg Kgo+ICsJCQkJCQlxdWV1ZV9zaXplW2ldLAo+ICsJCQkJCQkmcXVldWVfdGVtcC0+YnVzX2FkZHIs Cj4gKwkJCQkJCUdGUF9LRVJORUwpOwoKc28gd2UgYWxsb2NhdGVkIGhlcmUKCj4gKwkJaWYgKCFx dWV1ZV90ZW1wLT5jcSkKPiArCQkJcmV0dXJuIE5VTEw7Cj4gKwkJcXVldWVfdGVtcC0+bl9jcSA9 IHF1ZXVlX3NpemVbaV07Cj4gKwkJcXVldWVfdGVtcC0+aWQgPSBpOwo+ICsJCXF1ZXVlX3RlbXAt PnZpcnRfaGVhZCA9IHF1ZXVlX3RlbXAtPmNxOwo+ICsJCXF1ZXVlX3RlbXAtPnZpcnRfdGFpbCA9 IHF1ZXVlX3RlbXAtPmNxOwo+ICsJCS8qCj4gKwkJICogVGhlIGRtYSBwb29sIGZvciBxdWV1ZSBj b21tYW5kIGJ1ZmZlcgo+ICsJCSAqLwo+ICsJCXF1ZXVlX3RlbXAtPmNvbXBfcG9vbCA9IGRtYV9w b29sX2NyZWF0ZSgiY29tcF9wb29sIiwKPiArCQkJCQkJJnBkZXYtPmRldiwKPiArCQkJCQkJRlNM X1FETUFfQkFTRV9CVUZGRVJfU0laRSwKPiArCQkJCQkJMTYsIDApOwoKYW5kIGhlcmUKCj4gKwkJ aWYgKCFxdWV1ZV90ZW1wLT5jb21wX3Bvb2wpIHsKPiArCQkJZG1hX2ZyZWVfY29oZXJlbnQoJnBk ZXYtPmRldiwKPiArCQkJCQkJc2l6ZW9mKHN0cnVjdCBmc2xfcWRtYV9mb3JtYXQpICoKPiArCQkJ CQkJcXVldWVfc2l6ZVtpXSwKPiArCQkJCQkJcXVldWVfdGVtcC0+Y3EsCj4gKwkJCQkJCXF1ZXVl X3RlbXAtPmJ1c19hZGRyKTsKPiArCQkJcmV0dXJuIE5VTEw7CgphbmQgZnJlZWQgaGVyZSBvbiBl cnJvcgoKPiArCQl9Cj4gKwkJLyoKPiArCQkgKiBUaGUgZG1hIHBvb2wgZm9yIHF1ZXVlIGNvbW1h bmQgYnVmZmVyCj4gKwkJICovCj4gKwkJcXVldWVfdGVtcC0+c2dfcG9vbCA9IGRtYV9wb29sX2Ny ZWF0ZSgic2dfcG9vbCIsCj4gKwkJCQkJJnBkZXYtPmRldiwKPiArCQkJCQlGU0xfUURNQV9FWFBF Q1RfU0dfRU5UUllfTlVNICogMTYsCj4gKwkJCQkJNjQsIDApOwo+ICsJCWlmICghcXVldWVfdGVt cC0+c2dfcG9vbCkgewo+ICsJCQlkbWFfZnJlZV9jb2hlcmVudCgmcGRldi0+ZGV2LAo+ICsJCQkJ CQlzaXplb2Yoc3RydWN0IGZzbF9xZG1hX2Zvcm1hdCkgKgo+ICsJCQkJCQlxdWV1ZV9zaXplW2ld LAo+ICsJCQkJCQlxdWV1ZV90ZW1wLT5jcSwKPiArCQkJCQkJcXVldWVfdGVtcC0+YnVzX2FkZHIp Owo+ICsJCQlkbWFfcG9vbF9kZXN0cm95KHF1ZXVlX3RlbXAtPmNvbXBfcG9vbCk7Cj4gKwkJCXJl dHVybiBOVUxMOwoKYW5kIHJlcGVhdGVkIHNhbWUgaGVyZSwgbWF5YmUgeW91IHNob3VsZCBhZGQg Z290bydzIGFuZCBoYXZlIGNvbW1vbiBlcnJvcgpoYW5kbGluZyByYXRoZXIgdGhlc2UgZXZlcnl3 aGVyZS4uCgo+ICtzdGF0aWMgc3RydWN0IGZzbF9xZG1hX3F1ZXVlICpmc2xfcWRtYV9wcmVwX3N0 YXR1c19xdWV1ZSgKPiArCQkJCQkJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKPiArewo+ ICsJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2RlOwo+ICsJc3RydWN0 IGZzbF9xZG1hX3F1ZXVlICpzdGF0dXNfaGVhZDsKPiArCXVuc2lnbmVkIGludCBzdGF0dXNfc2l6 ZTsKPiArCWludCByZXQ7Cj4gKwo+ICsJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJz dGF0dXMtc2l6ZXMiLCAmc3RhdHVzX3NpemUpOwo+ICsJaWYgKHJldCkgewo+ICsJCWRldl9lcnIo JnBkZXYtPmRldiwgIkNhbid0IGdldCBzdGF0dXMtc2l6ZXMuXG4iKTsKPiArCQlyZXR1cm4gTlVM TDsKPiArCX0KPiArCWlmIChzdGF0dXNfc2l6ZSA+IEZTTF9RRE1BX0NJUkNVTEFSX0RFU0NfU0la RV9NQVgKPiArCQkJfHwgc3RhdHVzX3NpemUgPCBGU0xfUURNQV9DSVJDVUxBUl9ERVNDX1NJWkVf TUlOKSB7Cj4gKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiR2V0IHdyb25nIHN0YXR1c19zaXplLlxu Iik7Cj4gKwkJcmV0dXJuIE5VTEw7Cj4gKwl9Cj4gKwlzdGF0dXNfaGVhZCA9IGRldm1fa3phbGxv YygmcGRldi0+ZGV2LCBzaXplb2YoKnN0YXR1c19oZWFkKSwKPiArCQkJCQkJCQlHRlBfS0VSTkVM KTsKPiArCWlmICghc3RhdHVzX2hlYWQpCj4gKwkJcmV0dXJuIE5VTEw7Cj4gKwo+ICsJLyoKPiAr CSAqIEJ1ZmZlciBmb3IgcXVldWUgY29tbWFuZAo+ICsJICovCj4gKwlzdGF0dXNfaGVhZC0+Y3Eg PSBkbWFfYWxsb2NfY29oZXJlbnQoJnBkZXYtPmRldiwKPiArCQkJCQkJc2l6ZW9mKHN0cnVjdCBm c2xfcWRtYV9mb3JtYXQpICoKPiArCQkJCQkJc3RhdHVzX3NpemUsCj4gKwkJCQkJCSZzdGF0dXNf aGVhZC0+YnVzX2FkZHIsCj4gKwkJCQkJCUdGUF9LRVJORUwpOwo+ICsJaWYgKCFzdGF0dXNfaGVh ZC0+Y3EpCj4gKwkJcmV0dXJuIE5VTEw7CgplbXB0eSBsaW5lIGhlcmUuLi4KCj4gK3N0YXRpYyBl bnVtIGRtYV9zdGF0dXMgZnNsX3FkbWFfdHhfc3RhdHVzKHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwK PiArCQlkbWFfY29va2llX3QgY29va2llLCBzdHJ1Y3QgZG1hX3R4X3N0YXRlICp0eHN0YXRlKQo+ ICt7Cj4gKwlyZXR1cm4gZG1hX2Nvb2tpZV9zdGF0dXMoY2hhbiwgY29va2llLCB0eHN0YXRlKTsK CndoeSBub3Qgc2V0IHRoaXMgdG8gZG1hX2Nvb2tpZV9zdGF0dXMoKQo=