From mboxrd@z Thu Jan 1 00:00:00 1970 From: Logan Gunthorpe Subject: [PATCH v2 01/10] PCI/P2PDMA: Support peer to peer memory Date: Wed, 28 Feb 2018 16:39:57 -0700 Message-ID: <20180228234006.21093-2-logang@deltatee.com> References: <20180228234006.21093-1-logang@deltatee.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20180228234006.21093-1-logang-OTvnGxWRz7hWk0Htik3J/w@public.gmane.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: linux-nvdimm-bounces-hn68Rpc1hR1g9hUCZPvPmw@public.gmane.org Sender: "Linux-nvdimm" To: linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-pci-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-nvme-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org, linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-nvdimm-hn68Rpc1hR1g9hUCZPvPmw@public.gmane.org, linux-block-u79uwXL29TY76Z2rM5mHXA@public.gmane.org Cc: Jens Axboe , Benjamin Herrenschmidt , Alex Williamson , Keith Busch , =?UTF-8?q?J=C3=A9r=C3=B4me=20Glisse?= , Jason Gunthorpe , Bjorn Helgaas , Max Gurtovoy , Christoph Hellwig List-Id: linux-nvdimm@lists.01.org U29tZSBQQ0kgZGV2aWNlcyBtYXkgaGF2ZSBtZW1vcnkgbWFwcGVkIGluIGEgQkFSIHNwYWNlIHRo YXQncwppbnRlbmRlZCBmb3IgdXNlIGluIFBlZXItdG8tUGVlciB0cmFuc2FjdGlvbnMuIEluIG9y ZGVyIHRvIGVuYWJsZQpzdWNoIHRyYW5zYWN0aW9ucyB0aGUgbWVtb3J5IG11c3QgYmUgcmVnaXN0 ZXJlZCB3aXRoIFpPTkVfREVWSUNFIHBhZ2VzCnNvIGl0IGNhbiBiZSB1c2VkIGJ5IERNQSBpbnRl cmZhY2VzIGluIGV4aXN0aW5nIGRyaXZlcnMuCgpBIGtlcm5lbCBpbnRlcmZhY2UgaXMgcHJvdmlk ZWQgc28gdGhhdCBvdGhlciBzdWJzeXN0ZW1zIGNhbiBmaW5kIGFuZAphbGxvY2F0ZSBjaHVua3Mg b2YgUDJQIG1lbW9yeSBhcyBuZWNlc3NhcnkgdG8gZmFjaWxpdGF0ZSB0cmFuc2ZlcnMKYmV0d2Vl biB0d28gUENJIHBlZXJzLiBEZXBlbmRpbmcgb24gaGFyZHdhcmUsIHRoaXMgbWF5IHJlZHVjZSB0 aGUKYmFuZHdpZHRoIG9mIHRoZSB0cmFuc2ZlciBidXQgd291bGQgc2lnbmlmaWNhbnRseSByZWR1 Y2UgcHJlc3N1cmUKb24gc3lzdGVtIG1lbW9yeS4gVGhpcyBtYXkgYmUgZGVzaXJhYmxlIGluIG1h bnkgY2FzZXM6IGZvciBleGFtcGxlIGEKc3lzdGVtIGNvdWxkIGJlIGRlc2lnbmVkIHdpdGggYSBz bWFsbCBDUFUgY29ubmVjdGVkIHRvIGEgUENJIHN3aXRjaCBieSBhCnNtYWxsIG51bWJlciBvZiBs YW5lcyB3aGljaCB3b3VsZCBtYXhpbWl6ZSB0aGUgbnVtYmVyIG9mIGxhbmVzIGF2YWlsYWJsZQp0 byBjb25uZWN0IHRvIE5WTUUgZGV2aWNlcy4KClRoZSBpbnRlcmZhY2UgcmVxdWlyZXMgYSB1c2Vy IGRyaXZlciB0byBjb2xsZWN0IGEgbGlzdCBvZiBjbGllbnQgZGV2aWNlcwppbnZvbHZlZCBpbiB0 aGUgdHJhbnNhY3Rpb24gd2l0aCB0aGUgcGNpX3AycG1lbV9hZGRfY2xpZW50KigpIGZ1bmN0aW9u cwp0aGVuIGNhbGwgcGNpX3AycG1lbV9maW5kKCkgdG8gb2J0YWluIGFueSBzdWl0YWJsZSBQMlAg bWVtb3J5LiBPbmNlCnRoaXMgaXMgZG9uZSB0aGUgbGlzdCBpcyBib3VuZCB0byB0aGUgbWVtb3J5 IGFuZCB0aGUgY2FsbGluZyBkcml2ZXIgaXMKZnJlZSB0byBhZGQgYW5kIHJlbW92ZSBjbGllbnRz IGFzIG5lY2Vzc2FyeS4gVGhlIEFDUyBiaXRzIG9uIHRoZQpkb3duc3RyZWFtIHN3aXRjaCBwb3J0 IHdpbGwgYmUgbWFuYWdlZCBmb3IgYWxsIHRoZSByZWdpc3RlcmVkIGNsaWVudHMuCgpUaGUgY29k ZSBpcyBkZXNpZ25lZCB0byBvbmx5IHV0aWxpemUgdGhlIHAycG1lbSBkZXZpY2UgaWYgYWxsIHRo ZSBkZXZpY2VzCmludm9sdmVkIGluIGEgdHJhbnNmZXIgYXJlIGJlaGluZCB0aGUgc2FtZSBQQ0kg c3dpdGNoLiBUaGlzIGlzIGJlY2F1c2UKdXNpbmcgUDJQIHRyYW5zYWN0aW9ucyB0aHJvdWdoIHRo ZSBQQ0kgcm9vdCBjb21wbGV4IGNhbiBoYXZlIHBlcmZvcm1hbmNlCmxpbWl0YXRpb25zIG9yLCB3 b3JzZSwgbWlnaHQgbm90IHdvcmsgYXQgYWxsLiBGaW5kaW5nIG91dCBob3cgd2VsbCBhCnBhcnRp Y3VsYXIgUkMgc3VwcG9ydHMgUDJQIHRyYW5zZmVycyBpcyBub24tdHJpdmlhbC4gQWRkaXRpb25h bGx5LCB0aGUKYmVuZWZpdHMgb2YgUDJQIHRyYW5zZmVycyB0aGF0IGdvIHRocm91Z2ggdGhlIFJD IGlzIGxpbWl0ZWQgdG8gb25seQpyZWR1Y2luZyBEUkFNIHVzYWdlLgoKVGhpcyBjb21taXQgaW5j bHVkZXMgc2lnbmlmaWNhbnQgcmV3b3JrIGFuZCBmZWVkYmFjayBmcm9tIENocmlzdG9waApIZWxs d2lnLgoKU2lnbmVkLW9mZi1ieTogQ2hyaXN0b3BoIEhlbGx3aWcgPGhjaEBsc3QuZGU+ClNpZ25l ZC1vZmYtYnk6IExvZ2FuIEd1bnRob3JwZSA8bG9nYW5nQGRlbHRhdGVlLmNvbT4KLS0tCiBkcml2 ZXJzL3BjaS9LY29uZmlnICAgICAgICB8ICAxNiArKwogZHJpdmVycy9wY2kvTWFrZWZpbGUgICAg ICAgfCAgIDEgKwogZHJpdmVycy9wY2kvcDJwZG1hLmMgICAgICAgfCA1NjggKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiBpbmNsdWRlL2xpbnV4L21lbXJlbWFw LmggICB8ICAxOCArKwogaW5jbHVkZS9saW51eC9wY2ktcDJwZG1hLmggfCAgODcgKysrKysrKwog aW5jbHVkZS9saW51eC9wY2kuaCAgICAgICAgfCAgIDQgKwogNiBmaWxlcyBjaGFuZ2VkLCA2OTQg aW5zZXJ0aW9ucygrKQogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvcGNpL3AycGRtYS5jCiBj cmVhdGUgbW9kZSAxMDA2NDQgaW5jbHVkZS9saW51eC9wY2ktcDJwZG1hLmgKCmRpZmYgLS1naXQg YS9kcml2ZXJzL3BjaS9LY29uZmlnIGIvZHJpdmVycy9wY2kvS2NvbmZpZwppbmRleCAzNGI1NmE4 Zjg0ODAuLjg0MDgzMTQxOGNiZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvS2NvbmZpZworKysg Yi9kcml2ZXJzL3BjaS9LY29uZmlnCkBAIC0xMjQsNiArMTI0LDIyIEBAIGNvbmZpZyBQQ0lfUEFT SUQKIAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAorY29uZmlnIFBDSV9QMlBETUEKKwlib29sICJQ Q0kgUGVlciB0byBQZWVyIHRyYW5zZmVyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBaT05FX0RFVklD RQorCXNlbGVjdCBHRU5FUklDX0FMTE9DQVRPUgorCWhlbHAKKwkgIEVuYWJsZdGVIGRyaXZlcnMg dG8gZG8gUENJIHBlZXIgdG8gcGVlciB0cmFuc2FjdGlvbnMgdG8gYW5kIGZyb20KKwkgIEJBUnMg dGhhdCBhcmUgZXhwb3NlZCBpbiBvdGhlciBkZXZpY2VzIHRoYXQgYXJlIHRoZSBwYXJ0IG9mCisJ ICB0aGUgaGllcmFyY2h5IHdoZXJlIHBlZXItdG8tcGVlciBETUEgaXMgZ3VhcmFudGVlZCBieSB0 aGUgUENJCisJICBzcGVjaWZpY2F0aW9uIHRvIHdvcmsgKGllLiBhbnl0aGluZyBiZWxvdyBhIHNp bmdsZSBQQ0kgYnJpZGdlKS4KKworCSAgTWFueSBQQ0llIHJvb3QgY29tcGxleGVzIGRvIG5vdCBz dXBwb3J0IFAyUCB0cmFuc2FjdGlvbnMgYW5kCisJICBpdCdzIGhhcmQgdG8gdGVsbCB3aGljaCBz dXBwb3J0IGl0IHdpdGggZ29vZCBwZXJmb3JtYW5jZSwgc28KKwkgIGF0IHRoaXMgdGltZSB5b3Ug d2lsbCBuZWVkIGEgUENJZSBzd2l0Y2guCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKIGNvbmZp ZyBQQ0lfTEFCRUwKIAlkZWZfYm9vbCB5IGlmIChETUkgfHwgQUNQSSkKIAlkZXBlbmRzIG9uIFBD SQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvTWFrZWZpbGUgYi9kcml2ZXJzL3BjaS9NYWtlZmls ZQppbmRleCA5NDE5NzA5MzY4NDAuLjQ1ZTBmZjZmMzIxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9w Y2kvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9wY2kvTWFrZWZpbGUKQEAgLTI2LDYgKzI2LDcgQEAg b2JqLSQoQ09ORklHX1BDSV9NU0kpICs9IG1zaS5vCiAKIG9iai0kKENPTkZJR19QQ0lfQVRTKSAr PSBhdHMubwogb2JqLSQoQ09ORklHX1BDSV9JT1YpICs9IGlvdi5vCitvYmotJChDT05GSUdfUENJ X1AyUERNQSkgKz0gcDJwZG1hLm8KIAogIwogIyBBQ1BJIFJlbGF0ZWQgUENJIEZXIEZ1bmN0aW9u cwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcDJwZG1hLmMgYi9kcml2ZXJzL3BjaS9wMnBkbWEu YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAuLmVjMGE2Y2I5ZTUwMAot LS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcGNpL3AycGRtYS5jCkBAIC0wLDAgKzEsNTY4IEBA CisvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqLworLyoKKyAqIFBDSSBQZWVy IDIgUGVlciBETUEgc3VwcG9ydC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxNywgTWlj cm9zZW1pIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIENocmlzdG9waCBIZWxs d2lnLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlz dHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRp dGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBh cyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlz IHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1 dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJy YW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQ VVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUg ZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvcGNpLXAycGRtYS5oPgorI2luY2x1ZGUg PGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51 eC9nZW5hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L21lbXJlbWFwLmg+CisjaW5jbHVkZSA8bGlu dXgvcGVyY3B1LXJlZmNvdW50Lmg+CisKK3N0cnVjdCBwY2lfcDJwZG1hIHsKKwlzdHJ1Y3QgcGVy Y3B1X3JlZiBkZXZtYXBfcmVmOworCXN0cnVjdCBjb21wbGV0aW9uIGRldm1hcF9yZWZfZG9uZTsK KwlzdHJ1Y3QgZ2VuX3Bvb2wgKnBvb2w7CisJYm9vbCBwdWJsaXNoZWQ7Cit9OworCitzdGF0aWMg dm9pZCBwY2lfcDJwZG1hX3BlcmNwdV9yZWxlYXNlKHN0cnVjdCBwZXJjcHVfcmVmICpyZWYpCit7 CisJc3RydWN0IHBjaV9wMnBkbWEgKnAycCA9CisJCWNvbnRhaW5lcl9vZihyZWYsIHN0cnVjdCBw Y2lfcDJwZG1hLCBkZXZtYXBfcmVmKTsKKworCWNvbXBsZXRlX2FsbCgmcDJwLT5kZXZtYXBfcmVm X2RvbmUpOworfQorCitzdGF0aWMgdm9pZCBwY2lfcDJwZG1hX3BlcmNwdV9raWxsKHZvaWQgKmRh dGEpCit7CisJc3RydWN0IHBlcmNwdV9yZWYgKnJlZiA9IGRhdGE7CisKKwlpZiAocGVyY3B1X3Jl Zl9pc19keWluZyhyZWYpKQorCQlyZXR1cm47CisKKwlwZXJjcHVfcmVmX2tpbGwocmVmKTsKK30K Kworc3RhdGljIHZvaWQgcGNpX3AycGRtYV9yZWxlYXNlKHZvaWQgKmRhdGEpCit7CisJc3RydWN0 IHBjaV9kZXYgKnBkZXYgPSBkYXRhOworCisJd2FpdF9mb3JfY29tcGxldGlvbigmcGRldi0+cDJw ZG1hLT5kZXZtYXBfcmVmX2RvbmUpOworCXBlcmNwdV9yZWZfZXhpdCgmcGRldi0+cDJwZG1hLT5k ZXZtYXBfcmVmKTsKKworCWdlbl9wb29sX2Rlc3Ryb3kocGRldi0+cDJwZG1hLT5wb29sKTsKKwlw ZGV2LT5wMnBkbWEgPSBOVUxMOworfQorCitzdGF0aWMgaW50IHBjaV9wMnBkbWFfc2V0dXAoc3Ry dWN0IHBjaV9kZXYgKnBkZXYpCit7CisJaW50IGVycm9yID0gLUVOT01FTTsKKwlzdHJ1Y3QgcGNp X3AycGRtYSAqcDJwOworCisJcDJwID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigq cDJwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwMnApCisJCXJldHVybiAtRU5PTUVNOworCisJcDJw LT5wb29sID0gZ2VuX3Bvb2xfY3JlYXRlKFBBR0VfU0hJRlQsIGRldl90b19ub2RlKCZwZGV2LT5k ZXYpKTsKKwlpZiAoIXAycC0+cG9vbCkKKwkJZ290byBvdXQ7CisKKwlpbml0X2NvbXBsZXRpb24o JnAycC0+ZGV2bWFwX3JlZl9kb25lKTsKKwllcnJvciA9IHBlcmNwdV9yZWZfaW5pdCgmcDJwLT5k ZXZtYXBfcmVmLAorCQkJcGNpX3AycGRtYV9wZXJjcHVfcmVsZWFzZSwgMCwgR0ZQX0tFUk5FTCk7 CisJaWYgKGVycm9yKQorCQlnb3RvIG91dF9wb29sX2Rlc3Ryb3k7CisKKwlwZXJjcHVfcmVmX3N3 aXRjaF90b19hdG9taWNfc3luYygmcDJwLT5kZXZtYXBfcmVmKTsKKworCWVycm9yID0gZGV2bV9h ZGRfYWN0aW9uX29yX3Jlc2V0KCZwZGV2LT5kZXYsIHBjaV9wMnBkbWFfcmVsZWFzZSwgcGRldik7 CisJaWYgKGVycm9yKQorCQlnb3RvIG91dF9wb29sX2Rlc3Ryb3k7CisKKwlwZGV2LT5wMnBkbWEg PSBwMnA7CisKKwlyZXR1cm4gMDsKKworb3V0X3Bvb2xfZGVzdHJveToKKwlnZW5fcG9vbF9kZXN0 cm95KHAycC0+cG9vbCk7CitvdXQ6CisJZGV2bV9rZnJlZSgmcGRldi0+ZGV2LCBwMnApOworCXJl dHVybiBlcnJvcjsKK30KKworLyoqCisgKiBwY2lfcDJwZG1hX2FkZF9yZXNvdXJjZSAtIGFkZCBt ZW1vcnkgZm9yIHVzZSBhcyBwMnAgbWVtb3J5CisgKiBAcGNpOiB0aGUgZGV2aWNlIHRvIGFkZCB0 aGUgbWVtb3J5IHRvCisgKiBAYmFyOiBQQ0kgQkFSIHRvIGFkZAorICogQHNpemU6IHNpemUgb2Yg dGhlIG1lbW9yeSB0byBhZGQsIG1heSBiZSB6ZXJvIHRvIHVzZSB0aGUgd2hvbGUgQkFSCisgKiBA b2Zmc2V0OiBvZmZzZXQgaW50byB0aGUgUENJIEJBUgorICoKKyAqIFRoZSBtZW1vcnkgd2lsbCBi ZSBnaXZlbiBaT05FX0RFVklDRSBzdHJ1Y3QgcGFnZXMgc28gdGhhdCBpdCBtYXkKKyAqIGJlIHVz ZWQgd2l0aCBhbnkgZG1hIHJlcXVlc3QuCisgKi8KK2ludCBwY2lfcDJwZG1hX2FkZF9yZXNvdXJj ZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IGJhciwgc2l6ZV90IHNpemUsCisJCQkgICAgdTY0 IG9mZnNldCkKK3sKKwlzdHJ1Y3QgZGV2X3BhZ2VtYXAgKnBnbWFwOworCXZvaWQgKmFkZHI7CisJ aW50IGVycm9yOworCisJaWYgKCEocGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIGJhcikgJiBJT1JF U09VUkNFX01FTSkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKG9mZnNldCA+PSBwY2lfcmVz b3VyY2VfbGVuKHBkZXYsIGJhcikpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFzaXplKQor CQlzaXplID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LCBiYXIpIC0gb2Zmc2V0OworCisJaWYgKHNp emUgKyBvZmZzZXQgPiBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIGJhcikpCisJCXJldHVybiAtRUlO VkFMOworCisJaWYgKCFwZGV2LT5wMnBkbWEpIHsKKwkJZXJyb3IgPSBwY2lfcDJwZG1hX3NldHVw KHBkZXYpOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gZXJyb3I7CisJfQorCisJcGdtYXAgPSBk ZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpwZ21hcCksIEdGUF9LRVJORUwpOworCWlm ICghcGdtYXApCisJCXJldHVybiAtRU5PTUVNOworCisJcGdtYXAtPnJlcy5zdGFydCA9IHBjaV9y ZXNvdXJjZV9zdGFydChwZGV2LCBiYXIpICsgb2Zmc2V0OworCXBnbWFwLT5yZXMuZW5kID0gcGdt YXAtPnJlcy5zdGFydCArIHNpemUgLSAxOworCXBnbWFwLT5yZXMuZmxhZ3MgPSBwY2lfcmVzb3Vy Y2VfZmxhZ3MocGRldiwgYmFyKTsKKwlwZ21hcC0+cmVmID0gJnBkZXYtPnAycGRtYS0+ZGV2bWFw X3JlZjsKKwlwZ21hcC0+dHlwZSA9IE1FTU9SWV9ERVZJQ0VfUENJX1AyUERNQTsKKworCWFkZHIg PSBkZXZtX21lbXJlbWFwX3BhZ2VzKCZwZGV2LT5kZXYsIHBnbWFwKTsKKwlpZiAoSVNfRVJSKGFk ZHIpKQorCQlyZXR1cm4gUFRSX0VSUihhZGRyKTsKKworCWVycm9yID0gZ2VuX3Bvb2xfYWRkX3Zp cnQocGRldi0+cDJwZG1hLT5wb29sLCAodWludHB0cl90KWFkZHIsCisJCQlwY2lfYnVzX2FkZHJl c3MocGRldiwgYmFyKSArIG9mZnNldCwKKwkJCXJlc291cmNlX3NpemUoJnBnbWFwLT5yZXMpLCBk ZXZfdG9fbm9kZSgmcGRldi0+ZGV2KSk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisK KwllcnJvciA9IGRldm1fYWRkX2FjdGlvbl9vcl9yZXNldCgmcGRldi0+ZGV2LCBwY2lfcDJwZG1h X3BlcmNwdV9raWxsLAorCQkJCQkgICZwZGV2LT5wMnBkbWEtPmRldm1hcF9yZWYpOworCWlmIChl cnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJZGV2X2luZm8oJnBkZXYtPmRldiwgImFkZGVkIHBl ZXItdG8tcGVlciBETUEgbWVtb3J5ICVwUlxuIiwKKwkJICZwZ21hcC0+cmVzKTsKKworCXJldHVy biAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwocGNpX3AycGRtYV9hZGRfcmVzb3VyY2UpOworCitz dGF0aWMgc3RydWN0IHBjaV9kZXYgKmZpbmRfcGFyZW50X3BjaV9kZXYoc3RydWN0IGRldmljZSAq ZGV2KQoreworCXN0cnVjdCBkZXZpY2UgKnBhcmVudDsKKworCWRldiA9IGdldF9kZXZpY2UoZGV2 KTsKKworCXdoaWxlIChkZXYpIHsKKwkJaWYgKGRldl9pc19wY2koZGV2KSkKKwkJCXJldHVybiB0 b19wY2lfZGV2KGRldik7CisKKwkJcGFyZW50ID0gZ2V0X2RldmljZShkZXYtPnBhcmVudCk7CisJ CXB1dF9kZXZpY2UoZGV2KTsKKwkJZGV2ID0gcGFyZW50OworCX0KKworCXJldHVybiBOVUxMOwor fQorCisvKgorICogSWYgYSBkZXZpY2UgaXMgYmVoaW5kIGEgc3dpdGNoLCB3ZSB0cnkgdG8gZmlu ZCB0aGUgdXBzdHJlYW0gYnJpZGdlCisgKiBwb3J0IG9mIHRoZSBzd2l0Y2guIFRoaXMgcmVxdWly ZXMgdHdvIGNhbGxzIHRvIHBjaV91cHN0cmVhbV9icmlkZ2U6CisgKiBvbmUgZm9yIHRoZSB1cHN0 cmVhbSBwb3J0IG9uIHRoZSBzd2l0Y2gsIG9uZSBvbiB0aGUgdXBzdHJlYW0gcG9ydAorICogZm9y IHRoZSBuZXh0IGxldmVsIGluIHRoZSBoaWVyYXJjaHkuIEJlY2F1c2Ugb2YgdGhpcywgZGV2aWNl cyBjb25uZWN0ZWQKKyAqIHRvIHRoZSByb290IHBvcnQgd2lsbCBiZSByZWplY3RlZC4KKyAqLwor c3RhdGljIHN0cnVjdCBwY2lfZGV2ICpnZXRfdXBzdHJlYW1fYnJpZGdlX3BvcnQoc3RydWN0IHBj aV9kZXYgKnBkZXYpCit7CisJc3RydWN0IHBjaV9kZXYgKnVwMSwgKnVwMjsKKworCWlmICghcGRl dikKKwkJcmV0dXJuIE5VTEw7CisKKwl1cDEgPSBwY2lfZGV2X2dldChwY2lfdXBzdHJlYW1fYnJp ZGdlKHBkZXYpKTsKKwlpZiAoIXVwMSkKKwkJcmV0dXJuIE5VTEw7CisKKwl1cDIgPSBwY2lfZGV2 X2dldChwY2lfdXBzdHJlYW1fYnJpZGdlKHVwMSkpOworCXBjaV9kZXZfcHV0KHVwMSk7CisKKwly ZXR1cm4gdXAyOworfQorCitzdGF0aWMgYm9vbCBfX3Vwc3RyZWFtX2JyaWRnZXNfbWF0Y2goc3Ry dWN0IHBjaV9kZXYgKnVwc3RyZWFtLAorCQkJCSAgICAgc3RydWN0IHBjaV9kZXYgKmNsaWVudCkK K3sKKwlzdHJ1Y3QgcGNpX2RldiAqZG1hX3VwOworCWJvb2wgcmV0ID0gdHJ1ZTsKKworCWRtYV91 cCA9IGdldF91cHN0cmVhbV9icmlkZ2VfcG9ydChjbGllbnQpOworCisJaWYgKCFkbWFfdXApIHsK KwkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJub3QgYSBQQ0kgZGV2aWNlIGJlaGluZCBhIGJyaWRn ZVxuIik7CisJCXJldCA9IGZhbHNlOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAodXBzdHJlYW0g IT0gZG1hX3VwKSB7CisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LAorCQkJImRvZXMgbm90IHJlc2lk ZSBvbiB0aGUgc2FtZSB1cHN0cmVhbSBicmlkZ2VcbiIpOworCQlyZXQgPSBmYWxzZTsKKwkJZ290 byBvdXQ7CisJfQorCitvdXQ6CisJcGNpX2Rldl9wdXQoZG1hX3VwKTsKKwlyZXR1cm4gcmV0Owor fQorCitzdGF0aWMgYm9vbCB1cHN0cmVhbV9icmlkZ2VzX21hdGNoKHN0cnVjdCBwY2lfZGV2ICpw ZGV2LAorCQkJCSAgIHN0cnVjdCBwY2lfZGV2ICpjbGllbnQpCit7CisJc3RydWN0IHBjaV9kZXYg KnVwc3RyZWFtOworCWJvb2wgcmV0OworCisJdXBzdHJlYW0gPSBnZXRfdXBzdHJlYW1fYnJpZGdl X3BvcnQocGRldik7CisJaWYgKCF1cHN0cmVhbSkgeworCQlkZXZfd2FybigmcGRldi0+ZGV2LCAi bm90IGJlaGluZCBhIFBDSSBicmlkZ2VcbiIpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcmV0 ID0gX191cHN0cmVhbV9icmlkZ2VzX21hdGNoKHVwc3RyZWFtLCBjbGllbnQpOworCisJcGNpX2Rl dl9wdXQodXBzdHJlYW0pOworCisJcmV0dXJuIHJldDsKK30KKworc3RydWN0IHBjaV9wMnBkbWFf Y2xpZW50IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IHBjaV9kZXYgKmNsaWVu dDsKKwlzdHJ1Y3QgcGNpX2RldiAqcDJwZG1hOworfTsKKworLyoqCisgKiBwY2lfcDJwZG1hX2Fk ZF9jbGllbnQgLSBhbGxvY2F0ZSBhIG5ldyBlbGVtZW50IGluIGEgY2xpZW50IGRldmljZSBsaXN0 CisgKiBAaGVhZDogbGlzdCBoZWFkIG9mIHAycGRtYSBjbGllbnRzCisgKiBAZGV2OiBkZXZpY2Ug dG8gYWRkIHRvIHRoZSBsaXN0CisgKgorICogVGhpcyBhZGRzIEBkZXYgdG8gYSBsaXN0IG9mIGNs aWVudHMgdXNlZCBieSBhIHAycGRtYSBkZXZpY2UuCisgKiBUaGlzIGxpc3Qgc2hvdWxkIGJlIHBh c3NlZCB0byBwMnBtZW1fZmluZCgpLiBPbmNlIHAycG1lbV9maW5kKCkgaGFzCisgKiBiZWVuIGNh bGxlZCBzdWNjZXNzZnVsbHksIHRoZSBsaXN0IHdpbGwgYmUgYm91bmQgdG8gYSBzcGVjaWZpYyBw MnBkbWEKKyAqIGRldmljZSBhbmQgbmV3IGNsaWVudHMgY2FuIG9ubHkgYmUgYWRkZWQgdG8gdGhl IGxpc3QgaWYgdGhleSBhcmUKKyAqIHN1cHBvcnRlZCBieSB0aGF0IHAycGRtYSBkZXZpY2UuCisg KgorICogVGhlIGNhbGxlciBpcyBleHBlY3RlZCB0byBoYXZlIGEgbG9jayB3aGljaCBwcm90ZWN0 cyBAaGVhZCBhcyBuZWNlc3NhcnkKKyAqIHNvIHRoYXQgbm9uZSBvZiB0aGUgcGNpX3AycCBmdW5j dGlvbnMgY2FuIGJlIGNhbGxlZCBjb25jdXJyZW50bHkKKyAqIG9uIHRoYXQgbGlzdC4KKyAqCisg KiBSZXR1cm5zIDAgaWYgdGhlIGNsaWVudCB3YXMgc3VjY2Vzc2Z1bGx5IGFkZGVkLgorICovCitp bnQgcGNpX3AycGRtYV9hZGRfY2xpZW50KHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsIHN0cnVjdCBk ZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGNpX3AycGRtYV9jbGllbnQgKml0ZW0sICpuZXdfaXRl bTsKKwlzdHJ1Y3QgcGNpX2RldiAqcDJwZG1hID0gTlVMTDsKKwlzdHJ1Y3QgcGNpX2RldiAqY2xp ZW50OworCWludCByZXQ7CisKKwlpZiAoSVNfRU5BQkxFRChDT05GSUdfRE1BX1ZJUlRfT1BTKSAm JiBkZXYtPmRtYV9vcHMgPT0gJmRtYV92aXJ0X29wcykgeworCQlkZXZfd2FybihkZXYsCisJCQkg ImNhbm5vdCBiZSB1c2VkIGZvciBwZWVyLXRvLXBlZXIgRE1BIGJlY2F1c2UgdGhlIGRyaXZlciBt YWtlcyB1c2Ugb2YgZG1hX3ZpcnRfb3BzXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisK KwljbGllbnQgPSBmaW5kX3BhcmVudF9wY2lfZGV2KGRldik7CisJaWYgKCFjbGllbnQpIHsKKwkJ ZGV2X3dhcm4oZGV2LAorCQkJICJjYW5ub3QgYmUgdXNlZCBmb3IgcGVlci10by1wZWVyIERNQSBh cyBpdCBpcyBub3QgYSBQQ0kgZGV2aWNlXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJ aXRlbSA9IGxpc3RfZmlyc3RfZW50cnlfb3JfbnVsbChoZWFkLCBzdHJ1Y3QgcGNpX3AycGRtYV9j bGllbnQsIGxpc3QpOworCWlmIChpdGVtICYmIGl0ZW0tPnAycGRtYSkgeworCQlwMnBkbWEgPSBp dGVtLT5wMnBkbWE7CisKKwkJaWYgKCF1cHN0cmVhbV9icmlkZ2VzX21hdGNoKHAycGRtYSwgY2xp ZW50KSkgeworCQkJcmV0ID0gLUVYREVWOworCQkJZ290byBwdXRfY2xpZW50OworCQl9CisJfQor CisJbmV3X2l0ZW0gPSBremFsbG9jKHNpemVvZigqbmV3X2l0ZW0pLCBHRlBfS0VSTkVMKTsKKwlp ZiAoIW5ld19pdGVtKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gcHV0X2NsaWVudDsKKwl9 CisKKwluZXdfaXRlbS0+Y2xpZW50ID0gY2xpZW50OworCW5ld19pdGVtLT5wMnBkbWEgPSBwY2lf ZGV2X2dldChwMnBkbWEpOworCisJbGlzdF9hZGRfdGFpbCgmbmV3X2l0ZW0tPmxpc3QsIGhlYWQp OworCisJcmV0dXJuIDA7CisKK3B1dF9jbGllbnQ6CisJcGNpX2Rldl9wdXQoY2xpZW50KTsKKwly ZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwocGNpX3AycGRtYV9hZGRfY2xpZW50KTsK Kworc3RhdGljIHZvaWQgcGNpX3AycGRtYV9jbGllbnRfZnJlZShzdHJ1Y3QgcGNpX3AycGRtYV9j bGllbnQgKml0ZW0pCit7CisJbGlzdF9kZWwoJml0ZW0tPmxpc3QpOworCXBjaV9kZXZfcHV0KGl0 ZW0tPmNsaWVudCk7CisJcGNpX2Rldl9wdXQoaXRlbS0+cDJwZG1hKTsKKwlrZnJlZShpdGVtKTsK K30KKworLyoqCisgKiBwY2lfcDJwZG1hX3JlbW92ZV9jbGllbnQgLSByZW1vdmUgYW5kIGZyZWUg YSBuZXcgcDJwZG1hIGNsaWVudAorICogQGhlYWQ6IGxpc3QgaGVhZCBvZiBwMnBkbWEgY2xpZW50 cworICogQGRldjogZGV2aWNlIHRvIHJlbW92ZSBmcm9tIHRoZSBsaXN0CisgKgorICogVGhpcyBy ZW1vdmVzIEBkZXYgZnJvbSBhIGxpc3Qgb2YgY2xpZW50cyB1c2VkIGJ5IGEgcDJwZG1hIGRldmlj ZS4KKyAqIFRoZSBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8gaGF2ZSBhIGxvY2sgd2hpY2ggcHJvdGVj dHMgQGhlYWQgYXMgbmVjZXNzYXJ5CisgKiBzbyB0aGF0IG5vbmUgb2YgdGhlIHBjaV9wMnAgZnVu Y3Rpb25zIGNhbiBiZSBjYWxsZWQgY29uY3VycmVudGx5CisgKiBvbiB0aGF0IGxpc3QuCisgKi8K K3ZvaWQgcGNpX3AycGRtYV9yZW1vdmVfY2xpZW50KHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsIHN0 cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGNpX3AycGRtYV9jbGllbnQgKnBvcywgKnRt cDsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKworCXBkZXYgPSBmaW5kX3BhcmVudF9wY2lfZGV2 KGRldik7CisJaWYgKCFwZGV2KQorCQlyZXR1cm47CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3Nh ZmUocG9zLCB0bXAsIGhlYWQsIGxpc3QpIHsKKwkJaWYgKHBvcy0+Y2xpZW50ICE9IHBkZXYpCisJ CQljb250aW51ZTsKKworCQlwY2lfcDJwZG1hX2NsaWVudF9mcmVlKHBvcyk7CisJfQorCisJcGNp X2Rldl9wdXQocGRldik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwY2lfcDJwZG1hX3JlbW92ZV9j bGllbnQpOworCisvKioKKyAqIHBjaV9wMnBkbWFfY2xpZW50X2xpc3RfZnJlZSAtIGZyZWUgYW4g ZW50aXJlIGxpc3Qgb2YgcDJwZG1hIGNsaWVudHMKKyAqIEBoZWFkOiBsaXN0IGhlYWQgb2YgcDJw ZG1hIGNsaWVudHMKKyAqCisgKiBUaGlzIHJlbW92ZXMgYWxsIGRldmljZXMgaW4gYSBsaXN0IG9m IGNsaWVudHMgdXNlZCBieSBhIHAycGRtYSBkZXZpY2UuCisgKiBUaGUgY2FsbGVyIGlzIGV4cGVj dGVkIHRvIGhhdmUgYSBsb2NrIHdoaWNoIHByb3RlY3RzIEBoZWFkIGFzIG5lY2Vzc2FyeQorICog c28gdGhhdCBub25lIG9mIHRoZSBwY2lfcDJwZG1hIGZ1bmN0aW9ucyBjYW4gYmUgY2FsbGVkIGNv bmN1cnJlbnRseQorICogb24gdGhhdCBsaXN0LgorICovCit2b2lkIHBjaV9wMnBkbWFfY2xpZW50 X2xpc3RfZnJlZShzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQoreworCXN0cnVjdCBwY2lfcDJwZG1h X2NsaWVudCAqcG9zLCAqdG1wOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBvcywgdG1w LCBoZWFkLCBsaXN0KQorCQlwY2lfcDJwZG1hX2NsaWVudF9mcmVlKHBvcyk7Cit9CitFWFBPUlRf U1lNQk9MX0dQTChwY2lfcDJwZG1hX2NsaWVudF9saXN0X2ZyZWUpOworCitzdGF0aWMgYm9vbCB1 cHN0cmVhbV9icmlkZ2VzX21hdGNoX2xpc3Qoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJCXN0 cnVjdCBsaXN0X2hlYWQgKmhlYWQpCit7CisJc3RydWN0IHBjaV9wMnBkbWFfY2xpZW50ICpwb3M7 CisJc3RydWN0IHBjaV9kZXYgKnVwc3RyZWFtOworCWJvb2wgcmV0OworCisJdXBzdHJlYW0gPSBn ZXRfdXBzdHJlYW1fYnJpZGdlX3BvcnQocGRldik7CisJaWYgKCF1cHN0cmVhbSkgeworCQlkZXZf d2FybigmcGRldi0+ZGV2LCAibm90IGJlaGluZCBhIFBDSSBicmlkZ2VcbiIpOworCQlyZXR1cm4g ZmFsc2U7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwb3MsIGhlYWQsIGxpc3QpIHsKKwkJ cmV0ID0gX191cHN0cmVhbV9icmlkZ2VzX21hdGNoKHVwc3RyZWFtLCBwb3MtPmNsaWVudCk7CisJ CWlmICghcmV0KQorCQkJYnJlYWs7CisJfQorCisJcGNpX2Rldl9wdXQodXBzdHJlYW0pOworCXJl dHVybiByZXQ7Cit9CisKKy8qKgorICogcGNpX3AycG1lbV9maW5kIC0gZmluZCBhIHBlZXItdG8t cGVlciBETUEgbWVtb3J5IGRldmljZSBjb21wYXRpYmxlIHdpdGgKKyAqCXRoZSBzcGVjaWZpZWQg bGlzdCBvZiBjbGllbnRzCisgKiBAZGV2OiBsaXN0IG9mIGRldmljZXMgdG8gY2hlY2sgKE5VTEwt dGVybWluYXRlZCkKKyAqCisgKiBGb3Igbm93LCB3ZSBvbmx5IHN1cHBvcnQgY2FzZXMgd2hlcmUg dGhlIGRldmljZXMgdGhhdCB3aWxsIHRyYW5zZmVyIHRvIHRoZQorICogcDJwbWVtIGRldmljZSBh cmUgYmVoaW5kIHRoZSBzYW1lIGJyaWRnZS4gVGhpcyBjdXRzIG91dCBjYXNlcyB0aGF0IG1heSB3 b3JrCisgKiBidXQgaXMgc2FmZXN0IGZvciB0aGUgdXNlci4KKyAqCisgKiBSZXR1cm5zIGEgcG9p bnRlciB0byB0aGUgUENJIGRldmljZSB3aXRoIGEgcmVmZXJlbmNlIHRha2VuICh1c2UgcGNpX2Rl dl9wdXQKKyAqIHRvIHJldHVybiB0aGUgcmVmZXJlbmNlKSBvciBOVUxMIGlmIG5vIGNvbXBhdGli bGUgZGV2aWNlIGlzIGZvdW5kLgorICovCitzdHJ1Y3QgcGNpX2RldiAqcGNpX3AycG1lbV9maW5k KHN0cnVjdCBsaXN0X2hlYWQgKmNsaWVudHMpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBO VUxMOworCXN0cnVjdCBwY2lfcDJwZG1hX2NsaWVudCAqcG9zOworCisJd2hpbGUgKChwZGV2ID0g cGNpX2dldF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgcGRldikpKSB7CisJCWlmICgh cGRldi0+cDJwZG1hIHx8ICFwZGV2LT5wMnBkbWEtPnB1Ymxpc2hlZCkKKwkJCWNvbnRpbnVlOwor CisJCWlmICghdXBzdHJlYW1fYnJpZGdlc19tYXRjaF9saXN0KHBkZXYsIGNsaWVudHMpKQorCQkJ Y29udGludWU7CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShwb3MsIGNsaWVudHMsIGxpc3QpCisJ CQlwb3MtPnAycGRtYSA9IHBkZXY7CisKKwkJcmV0dXJuIHBkZXY7CisJfQorCisJcmV0dXJuIE5V TEw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwY2lfcDJwbWVtX2ZpbmQpOworCisvKioKKyAqIHBj aV9hbGxvY19wMnBfbWVtIC0gYWxsb2NhdGUgcGVlci10by1wZWVyIERNQSBtZW1vcnkKKyAqIEBw ZGV2Ogl0aGUgZGV2aWNlIHRvIGFsbG9jYXRlIG1lbW9yeSBmcm9tCisgKiBAc2l6ZToJbnVtYmVy IG9mIGJ5dGVzIHRvIGFsbG9jYXRlCisgKgorICogUmV0dXJucyB0aGUgYWxsb2NhdGVkIG1lbW9y eSBvciBOVUxMIG9uIGVycm9yLgorICovCit2b2lkICpwY2lfYWxsb2NfcDJwbWVtKHN0cnVjdCBw Y2lfZGV2ICpwZGV2LCBzaXplX3Qgc2l6ZSkKK3sKKwl2b2lkICpyZXQ7CisKKwlpZiAodW5saWtl bHkoIXBkZXYtPnAycGRtYSkpCisJCXJldHVybiBOVUxMOworCisJaWYgKHVubGlrZWx5KCFwZXJj cHVfcmVmX3RyeWdldF9saXZlKCZwZGV2LT5wMnBkbWEtPmRldm1hcF9yZWYpKSkKKwkJcmV0dXJu IE5VTEw7CisKKwlyZXQgPSAodm9pZCAqKSh1aW50cHRyX3QpZ2VuX3Bvb2xfYWxsb2MocGRldi0+ cDJwZG1hLT5wb29sLCBzaXplKTsKKworCWlmICh1bmxpa2VseSghcmV0KSkKKwkJcGVyY3B1X3Jl Zl9wdXQoJnBkZXYtPnAycGRtYS0+ZGV2bWFwX3JlZik7CisKKwlyZXR1cm4gcmV0OworfQorRVhQ T1JUX1NZTUJPTF9HUEwocGNpX2FsbG9jX3AycG1lbSk7CisKKy8qKgorICogcGNpX2ZyZWVfcDJw bWVtIC0gYWxsb2NhdGUgcGVlci10by1wZWVyIERNQSBtZW1vcnkKKyAqIEBwZGV2Ogl0aGUgZGV2 aWNlIHRoZSBtZW1vcnkgd2FzIGFsbG9jYXRlZCBmcm9tCisgKiBAYWRkcjoJYWRkcmVzcyBvZiB0 aGUgbWVtb3J5IHRoYXQgd2FzIGFsbG9jYXRlZAorICogQHNpemU6CW51bWJlciBvZiBieXRlcyB0 aGF0IHdhcyBhbGxvY2F0ZWQKKyAqLwordm9pZCBwY2lfZnJlZV9wMnBtZW0oc3RydWN0IHBjaV9k ZXYgKnBkZXYsIHZvaWQgKmFkZHIsIHNpemVfdCBzaXplKQoreworCWdlbl9wb29sX2ZyZWUocGRl di0+cDJwZG1hLT5wb29sLCAodWludHB0cl90KWFkZHIsIHNpemUpOworCXBlcmNwdV9yZWZfcHV0 KCZwZGV2LT5wMnBkbWEtPmRldm1hcF9yZWYpOworfQorRVhQT1JUX1NZTUJPTF9HUEwocGNpX2Zy ZWVfcDJwbWVtKTsKKworLyoqCisgKiBwY2lfdmlydF90b19idXMgLSByZXR1cm4gdGhlIFBDSSBi dXMgYWRkcmVzcyBmb3IgYSBnaXZlbiB2aXJ0dWFsCisgKglhZGRyZXNzIG9idGFpbmVkIHdpdGgg cGNpX2FsbG9jX3AycG1lbQorICogQHBkZXY6CXRoZSBkZXZpY2UgdGhlIG1lbW9yeSB3YXMgYWxs b2NhdGVkIGZyb20KKyAqIEBhZGRyOglhZGRyZXNzIG9mIHRoZSBtZW1vcnkgdGhhdCB3YXMgYWxs b2NhdGVkCisgKi8KK3BjaV9idXNfYWRkcl90IHBjaV9wMnBtZW1fdmlydF90b19idXMoc3RydWN0 IHBjaV9kZXYgKnBkZXYsIHZvaWQgKmFkZHIpCit7CisJaWYgKCFhZGRyKQorCQlyZXR1cm4gMDsK KwlpZiAoIXBkZXYtPnAycGRtYSkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIE5vdGU6IHdoZW4g d2UgYWRkZWQgdGhlIG1lbW9yeSB0byB0aGUgcG9vbCB3ZSB1c2VkIHRoZSBQQ0kKKwkgKiBidXMg YWRkcmVzcyBhcyB0aGUgcGh5c2ljYWwgYWRkcmVzcy4gU28gZ2VuX3Bvb2xfdmlydF90b19waHlz KCkKKwkgKiBhY3R1YWxseSByZXR1cm5zIHRoZSBidXMgYWRkcmVzcyBkZXNwaXRlIHRoZSBtaXNs ZWFkaW5nIG5hbWUuCisJICovCisJcmV0dXJuIGdlbl9wb29sX3ZpcnRfdG9fcGh5cyhwZGV2LT5w MnBkbWEtPnBvb2wsICh1bnNpZ25lZCBsb25nKWFkZHIpOworfQorRVhQT1JUX1NZTUJPTF9HUEwo cGNpX3AycG1lbV92aXJ0X3RvX2J1cyk7CisKKy8qKgorICogcGNpX3AycG1lbV9hbGxvY19zZ2wg LSBhbGxvY2F0ZSBwZWVyLXRvLXBlZXIgRE1BIG1lbW9yeSBpbiBhbiBzY2F0dGVybGlzdAorICog QHBkZXY6CXRoZSBkZXZpY2UgdG8gYWxsb2NhdGUgbWVtb3J5IGZyb20KKyAqIEBzZ2w6CXRoZSBh bGxvY2F0ZWQgc2NhdHRlcmxpc3QKKyAqIEBuZW50czogICAgICB0aGUgbnVtYmVyIG9mIFNHIGVu dHJpZXMgaW4gdGhlIGxpc3QKKyAqIEBsZW5ndGg6ICAgICBudW1iZXIgb2YgYnl0ZXMgdG8gYWxs b2NhdGUKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcworICovCitpbnQgcGNpX3AycG1lbV9h bGxvY19zZ2woc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqKnNnbCwK KwkJCSB1bnNpZ25lZCBpbnQgKm5lbnRzLCB1MzIgbGVuZ3RoKQoreworCXN0cnVjdCBzY2F0dGVy bGlzdCAqc2c7CisJdm9pZCAqYWRkcjsKKworCXNnID0ga3phbGxvYyhzaXplb2YoKnNnKSwgR0ZQ X0tFUk5FTCk7CisJaWYgKCFzZykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzZ19pbml0X3RhYmxl KHNnLCAxKTsKKworCWFkZHIgPSBwY2lfYWxsb2NfcDJwbWVtKHBkZXYsIGxlbmd0aCk7CisJaWYg KCFhZGRyKQorCQlnb3RvIG91dF9mcmVlX3NnOworCisJc2dfc2V0X2J1ZihzZywgYWRkciwgbGVu Z3RoKTsKKwkqc2dsID0gc2c7CisJKm5lbnRzID0gMTsKKwlyZXR1cm4gMDsKKworb3V0X2ZyZWVf c2c6CisJa2ZyZWUoc2cpOworCXJldHVybiAtRU5PTUVNOworfQorRVhQT1JUX1NZTUJPTF9HUEwo cGNpX3AycG1lbV9hbGxvY19zZ2wpOworCisvKioKKyAqIHBjaV9wMnBtZW1fZnJlZV9zZ2wgLSBm cmVlIGEgc2NhdHRlcmxpc3QgIGFsbG9jYXRlZCBieSBwY2lfcDJwbWVtX2FsbG9jX3NnbAorICog QHBkZXY6CXRoZSBkZXZpY2UgdG8gYWxsb2NhdGUgbWVtb3J5IGZyb20KKyAqIEBzZ2w6CXRoZSBh bGxvY2F0ZWQgc2NhdHRlcmxpc3QKKyAqIEBuZW50czogICAgICB0aGUgbnVtYmVyIG9mIFNHIGVu dHJpZXMgaW4gdGhlIGxpc3QKKyAqLwordm9pZCBwY2lfcDJwbWVtX2ZyZWVfc2dsKHN0cnVjdCBw Y2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbCwKKwkJCSB1bnNpZ25lZCBpbnQg bmVudHMpCit7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwlpbnQgY291bnQ7CisKKwlpZiAo IXNnbCB8fCAhbmVudHMpCisJCXJldHVybjsKKworCWZvcl9lYWNoX3NnKHNnbCwgc2csIG5lbnRz LCBjb3VudCkKKwkJcGNpX2ZyZWVfcDJwbWVtKHBkZXYsIHNnX3ZpcnQoc2cpLCBzZy0+bGVuZ3Ro KTsKKwlrZnJlZShzZ2wpOworfQorRVhQT1JUX1NZTUJPTF9HUEwocGNpX3AycG1lbV9mcmVlX3Nn bCk7CisKKy8qKgorICogcGNpX3AycG1lbV9wdWJsaXNoIC0gcHVibGlzaCB0aGUgcGVlci10by1w ZWVyIERNQSBtZW1vcnkgZm9yIHVzZSBieQorICoJb3RoZXIgZGV2aWNlcyB3aXRoIHBjaV9wMnBt ZW1fZmluZAorICogQHBkZXY6CXRoZSBkZXZpY2Ugd2l0aCBwZWVyLXRvLXBlZXIgRE1BIG1lbW9y eSB0byBwdWJsaXNoCisgKiBAcHVibGlzaDoJc2V0IHRvIHRydWUgdG8gcHVibGlzaCB0aGUgbWVt b3J5LCBmYWxzZSB0byB1bnB1Ymxpc2ggaXQKKyAqLwordm9pZCBwY2lfcDJwbWVtX3B1Ymxpc2go c3RydWN0IHBjaV9kZXYgKnBkZXYsIGJvb2wgcHVibGlzaCkKK3sKKwlpZiAocHVibGlzaCAmJiAh cGRldi0+cDJwZG1hKQorCQlyZXR1cm47CisKKwlwZGV2LT5wMnBkbWEtPnB1Ymxpc2hlZCA9IHB1 Ymxpc2g7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwY2lfcDJwbWVtX3B1Ymxpc2gpOwpkaWZmIC0t Z2l0IGEvaW5jbHVkZS9saW51eC9tZW1yZW1hcC5oIGIvaW5jbHVkZS9saW51eC9tZW1yZW1hcC5o CmluZGV4IDdiNDg5OWMwNmY0OS4uOWU5MDdjMzM4YTQ0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xp bnV4L21lbXJlbWFwLmgKKysrIGIvaW5jbHVkZS9saW51eC9tZW1yZW1hcC5oCkBAIC01MywxMSAr NTMsMTYgQEAgc3RydWN0IHZtZW1fYWx0bWFwIHsKICAqIGRyaXZlciBjYW4gaG90cGx1ZyB0aGUg ZGV2aWNlIG1lbW9yeSB1c2luZyBaT05FX0RFVklDRSBhbmQgd2l0aCB0aGF0IG1lbW9yeQogICog dHlwZS4gQW55IHBhZ2Ugb2YgYSBwcm9jZXNzIGNhbiBiZSBtaWdyYXRlZCB0byBzdWNoIG1lbW9y eS4gSG93ZXZlciBubyBvbmUKICAqIHNob3VsZCBiZSBhbGxvdyB0byBwaW4gc3VjaCBtZW1vcnkg c28gdGhhdCBpdCBjYW4gYWx3YXlzIGJlIGV2aWN0ZWQuCisgKgorICogTUVNT1JZX0RFVklDRV9Q Q0lfUDJQRE1BOgorICogRGV2aWNlIG1lbW9yeSByZXNpZGluZyBpbiBhIFBDSSBCQVIgaW50ZW5k ZWQgZm9yIHVzZSB3aXRoIFBlZXItdG8tUGVlcgorICogdHJhbnNhY3Rpb25zLgogICovCiBlbnVt IG1lbW9yeV90eXBlIHsKIAlNRU1PUllfREVWSUNFX0hPU1QgPSAwLAogCU1FTU9SWV9ERVZJQ0Vf UFJJVkFURSwKIAlNRU1PUllfREVWSUNFX1BVQkxJQywKKwlNRU1PUllfREVWSUNFX1BDSV9QMlBE TUEsCiB9OwogCiAvKgpAQCAtMTYxLDYgKzE2NiwxOSBAQCBzdGF0aWMgaW5saW5lIHZvaWQgdm1l bV9hbHRtYXBfZnJlZShzdHJ1Y3Qgdm1lbV9hbHRtYXAgKmFsdG1hcCwKIH0KICNlbmRpZiAvKiBD T05GSUdfWk9ORV9ERVZJQ0UgKi8KIAorI2lmZGVmIENPTkZJR19QQ0lfUDJQRE1BCitzdGF0aWMg aW5saW5lIGJvb2wgaXNfcGNpX3AycGRtYV9wYWdlKGNvbnN0IHN0cnVjdCBwYWdlICpwYWdlKQor eworCXJldHVybiBpc196b25lX2RldmljZV9wYWdlKHBhZ2UpICYmCisJCXBhZ2UtPnBnbWFwLT50 eXBlID09IE1FTU9SWV9ERVZJQ0VfUENJX1AyUERNQTsKK30KKyNlbHNlIC8qIENPTkZJR19QQ0lf UDJQRE1BICovCitzdGF0aWMgaW5saW5lIGJvb2wgaXNfcGNpX3AycGRtYV9wYWdlKGNvbnN0IHN0 cnVjdCBwYWdlICpwYWdlKQoreworCXJldHVybiBmYWxzZTsKK30KKyNlbmRpZiAvKiBDT05GSUdf UENJX1AyUERNQSAqLworCiAjaWYgZGVmaW5lZChDT05GSUdfREVWSUNFX1BSSVZBVEUpIHx8IGRl ZmluZWQoQ09ORklHX0RFVklDRV9QVUJMSUMpCiBzdGF0aWMgaW5saW5lIGJvb2wgaXNfZGV2aWNl X3ByaXZhdGVfcGFnZShjb25zdCBzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKZGlmZiAtLWdpdCBhL2lu Y2x1ZGUvbGludXgvcGNpLXAycGRtYS5oIGIvaW5jbHVkZS9saW51eC9wY2ktcDJwZG1hLmgKbmV3 IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwLi5jMGRkZTNkM2FhYzQKLS0tIC9k ZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3BjaS1wMnBkbWEuaApAQCAtMCwwICsxLDg3IEBA CisvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqLworLyoKKyAqIENvcHlyaWdo dCAoYykgMjAxNi0yMDE3LCBNaWNyb3NlbWkgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykg MjAxNywgQ2hyaXN0b3BoIEhlbGx3aWcuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29m dHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVy IHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vu c2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3Vu ZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBp dCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBl dmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVT UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBM aWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX0xJTlVYX1BDSV9Q MlBETUFfSAorI2RlZmluZSBfTElOVVhfUENJX1AyUERNQV9ICisKKyNpbmNsdWRlIDxsaW51eC9w Y2kuaD4KKworc3RydWN0IGJsb2NrX2RldmljZTsKK3N0cnVjdCBzY2F0dGVybGlzdDsKKworI2lm ZGVmIENPTkZJR19QQ0lfUDJQRE1BCitpbnQgcGNpX3AycGRtYV9hZGRfcmVzb3VyY2Uoc3RydWN0 IHBjaV9kZXYgKnBkZXYsIGludCBiYXIsIHNpemVfdCBzaXplLAorCQl1NjQgb2Zmc2V0KTsKK2lu dCBwY2lfcDJwZG1hX2FkZF9jbGllbnQoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwgc3RydWN0IGRl dmljZSAqZGV2KTsKK3ZvaWQgcGNpX3AycGRtYV9yZW1vdmVfY2xpZW50KHN0cnVjdCBsaXN0X2hl YWQgKmhlYWQsIHN0cnVjdCBkZXZpY2UgKmRldik7Cit2b2lkIHBjaV9wMnBkbWFfY2xpZW50X2xp c3RfZnJlZShzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKTsKK3N0cnVjdCBwY2lfZGV2ICpwY2lfcDJw bWVtX2ZpbmQoc3RydWN0IGxpc3RfaGVhZCAqY2xpZW50cyk7Cit2b2lkICpwY2lfYWxsb2NfcDJw bWVtKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzaXplX3Qgc2l6ZSk7Cit2b2lkIHBjaV9mcmVlX3Ay cG1lbShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdm9pZCAqYWRkciwgc2l6ZV90IHNpemUpOworcGNp X2J1c19hZGRyX3QgcGNpX3AycG1lbV92aXJ0X3RvX2J1cyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwg dm9pZCAqYWRkcik7CitpbnQgcGNpX3AycG1lbV9hbGxvY19zZ2woc3RydWN0IHBjaV9kZXYgKnBk ZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqKnNnbCwKKwkJdW5zaWduZWQgaW50ICpuZW50cywgdTMy IGxlbmd0aCk7Cit2b2lkIHBjaV9wMnBtZW1fZnJlZV9zZ2woc3RydWN0IHBjaV9kZXYgKnBkZXYs IHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsLAorCQl1bnNpZ25lZCBpbnQgbmVudHMpOwordm9pZCBw Y2lfcDJwbWVtX3B1Ymxpc2goc3RydWN0IHBjaV9kZXYgKnBkZXYsIGJvb2wgcHVibGlzaCk7Cisj ZWxzZSAvKiBDT05GSUdfUENJX1AyUERNQSAqLworc3RhdGljIGlubGluZSBpbnQgcGNpX3AycGRt YV9hZGRfcmVzb3VyY2Uoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBiYXIsCisJCXNpemVfdCBz aXplLCB1NjQgb2Zmc2V0KQoreworCXJldHVybiAwOworfQorc3RhdGljIGlubGluZSBpbnQgcGNp X3AycGRtYV9hZGRfY2xpZW50KHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsCisJCXN0cnVjdCBkZXZp Y2UgKmRldikKK3sKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBwY2lfcDJwZG1h X3JlbW92ZV9jbGllbnQoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwKKwkJc3RydWN0IGRldmljZSAq ZGV2KQoreworfQorc3RhdGljIGlubGluZSB2b2lkIHBjaV9wMnBkbWFfY2xpZW50X2xpc3RfZnJl ZShzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQoreworfQorc3RhdGljIGlubGluZSBzdHJ1Y3QgcGNp X2RldiAqcGNpX3AycG1lbV9maW5kKHN0cnVjdCBsaXN0X2hlYWQgKmNsaWVudHMpCit7CisJcmV0 dXJuIE5VTEw7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgKnBjaV9hbGxvY19wMnBtZW0oc3RydWN0 IHBjaV9kZXYgKnBkZXYsIHNpemVfdCBzaXplKQoreworCXJldHVybiBOVUxMOworfQorc3RhdGlj IGlubGluZSB2b2lkIHBjaV9mcmVlX3AycG1lbShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdm9pZCAq YWRkciwKKwkJc2l6ZV90IHNpemUpCit7Cit9CitzdGF0aWMgaW5saW5lIHBjaV9idXNfYWRkcl90 IHBjaV9wMnBtZW1fdmlydF90b19idXMoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJCQkgICAg dm9pZCAqYWRkcikKK3sKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbmxpbmUgaW50IHBjaV9wMnBt ZW1fYWxsb2Nfc2dsKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQlzdHJ1Y3Qgc2NhdHRlcmxpc3Qg KipzZ2wsIHVuc2lnbmVkIGludCAqbmVudHMsIHUzMiBsZW5ndGgpCit7CisJcmV0dXJuIC1FTk9E RVY7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgcGNpX3AycG1lbV9mcmVlX3NnbChzdHJ1Y3QgcGNp X2RldiAqcGRldiwKKwkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2wsIHVuc2lnbmVkIGludCBuZW50 cykKK3sKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBwY2lfcDJwbWVtX3B1Ymxpc2goc3RydWN0IHBj aV9kZXYgKnBkZXYsIGJvb2wgcHVibGlzaCkKK3sKK30KKyNlbmRpZiAvKiBDT05GSUdfUENJX1Ay UERNQSAqLworI2VuZGlmIC8qIF9MSU5VWF9QQ0lfUDJQX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1 ZGUvbGludXgvcGNpLmggYi9pbmNsdWRlL2xpbnV4L3BjaS5oCmluZGV4IDAyNGExYmVkYTAwOC4u NDM3ZTQyNjE1ODk2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BjaS5oCisrKyBiL2luY2x1 ZGUvbGludXgvcGNpLmgKQEAgLTI3Niw2ICsyNzYsNyBAQCBzdHJ1Y3QgcGNpZV9saW5rX3N0YXRl Owogc3RydWN0IHBjaV92cGQ7CiBzdHJ1Y3QgcGNpX3NyaW92Owogc3RydWN0IHBjaV9hdHM7Citz dHJ1Y3QgcGNpX3AycGRtYTsKIAogLyogVGhlIHBjaV9kZXYgc3RydWN0dXJlIGRlc2NyaWJlcyBQ Q0kgZGV2aWNlcyAqLwogc3RydWN0IHBjaV9kZXYgewpAQCAtNDI5LDYgKzQzMCw5IEBAIHN0cnVj dCBwY2lfZGV2IHsKICNpZmRlZiBDT05GSUdfUENJX1BBU0lECiAJdTE2CQlwYXNpZF9mZWF0dXJl czsKICNlbmRpZgorI2lmZGVmIENPTkZJR19QQ0lfUDJQRE1BCisJc3RydWN0IHBjaV9wMnBkbWEg KnAycGRtYTsKKyNlbmRpZgogCXBoeXNfYWRkcl90CXJvbTsJCS8qIFBoeXNpY2FsIGFkZHJlc3Mg aWYgbm90IGZyb20gQkFSICovCiAJc2l6ZV90CQlyb21sZW47CQkvKiBMZW5ndGggaWYgbm90IGZy b20gQkFSICovCiAJY2hhcgkJKmRyaXZlcl9vdmVycmlkZTsgLyogRHJpdmVyIG5hbWUgdG8gZm9y Y2UgYSBtYXRjaCAqLwotLSAKMi4xMS4wCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fXwpMaW51eC1udmRpbW0gbWFpbGluZyBsaXN0CkxpbnV4LW52ZGltbUBs aXN0cy4wMS5vcmcKaHR0cHM6Ly9saXN0cy4wMS5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1u dmRpbW0K