From mboxrd@z Thu Jan 1 00:00:00 1970 From: Logan Gunthorpe Subject: [PATCH 01/12] pci-p2p: Support peer to peer memory Date: Thu, 4 Jan 2018 12:01:26 -0700 Message-ID: <20180104190137.7654-2-logang@deltatee.com> References: <20180104190137.7654-1-logang@deltatee.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20180104190137.7654-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 , Keith Busch , =?UTF-8?q?J=C3=A9r=C3=B4me=20Glisse?= , Jason Gunthorpe , Bjorn Helgaas , Max Gurtovoy , Christoph Hellwig List-Id: linux-rdma@vger.kernel.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 ZXJzL3BjaS9LY29uZmlnICAgICAgfCAgMTQgKysKIGRyaXZlcnMvcGNpL01ha2VmaWxlICAgICB8 ICAgMSArCiBkcml2ZXJzL3BjaS9wMnAuYyAgICAgICAgfCA1NDkgKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIGluY2x1ZGUvbGludXgvbWVtcmVtYXAuaCB8 ICAxOCArKwogaW5jbHVkZS9saW51eC9wY2ktcDJwLmggIHwgIDg1ICsrKysrKysrCiBpbmNsdWRl L2xpbnV4L3BjaS5oICAgICAgfCAgIDQgKwogNiBmaWxlcyBjaGFuZ2VkLCA2NzEgaW5zZXJ0aW9u cygrKQogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvcGNpL3AycC5jCiBjcmVhdGUgbW9kZSAx MDA2NDQgaW5jbHVkZS9saW51eC9wY2ktcDJwLmgKCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9L Y29uZmlnIGIvZHJpdmVycy9wY2kvS2NvbmZpZwppbmRleCBiZGExNTE3ODhmM2YuLjE4OGVhOTRj ZmUyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvS2NvbmZpZworKysgYi9kcml2ZXJzL3BjaS9L Y29uZmlnCkBAIC0xMjMsNiArMTIzLDIwIEBAIGNvbmZpZyBQQ0lfUEFTSUQKIAogCSAgSWYgdW5z dXJlLCBzYXkgTi4KIAorY29uZmlnIFBDSV9QMlAKKwlib29sICJQQ0kgUGVlciB0byBQZWVyIHRy YW5zZmVyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBaT05FX0RFVklDRQorCXNlbGVjdCBHRU5FUklD X0FMTE9DQVRPUgorCWhlbHAKKwkgIEVuYWJsZdGVIGRyaXZlcnMgdG8gZG8gUENJIHBlZXIgdG8g cGVlciB0cmFuc2FjdGlvbnMgdG8gYW5kIGZyb20KKwkgIGJhcnMgdGhhdCBhcmUgZXhwb3NlZCB0 byBvdGhlciBkZXZpY2VzIGluIHRoZSBzYW1lIGRvbWFpbi4KKworCSAgTWFueSBQQ0llIHJvb3Qg Y29tcGxleGVzIGRvIG5vdCBzdXBwb3J0IFAyUCB0cmFuc2FjdGlvbnMgYW5kCisJICBpdCdzIGhh cmQgdG8gdGVsbCB3aGljaCBzdXBwb3J0IGl0IHdpdGggZ29vZCBwZXJmb3JtYW5jZSwgc28KKwkg IGF0IHRoaXMgdGltZSB5b3Ugd2lsbCBuZWVkIGEgUENJZSBzd2l0Y2guCisKKwkgIElmIHVuc3Vy ZSwgc2F5IE4uCisKIGNvbmZpZyBQQ0lfTEFCRUwKIAlkZWZfYm9vbCB5IGlmIChETUkgfHwgQUNQ SSkKIAlzZWxlY3QgTkxTCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9NYWtlZmlsZSBiL2RyaXZl cnMvcGNpL01ha2VmaWxlCmluZGV4IGM3ODE5Yjk3M2RmNy4uNzQ5ODU4MjAxNDAwIDEwMDY0NAot LS0gYS9kcml2ZXJzL3BjaS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3BjaS9NYWtlZmlsZQpAQCAt MjMsNiArMjMsNyBAQCBvYmotJChDT05GSUdfUENJX01TSSkgKz0gbXNpLm8KIAogb2JqLSQoQ09O RklHX1BDSV9BVFMpICs9IGF0cy5vCiBvYmotJChDT05GSUdfUENJX0lPVikgKz0gaW92Lm8KK29i ai0kKENPTkZJR19QQ0lfUDJQKSArPSBwMnAubwogCiAjCiAjIEFDUEkgUmVsYXRlZCBQQ0kgRlcg RnVuY3Rpb25zCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wMnAuYyBiL2RyaXZlcnMvcGNpL3Ay cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMC4uYWE0NjVhYzkyNzNk Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9wY2kvcDJwLmMKQEAgLTAsMCArMSw1NDkgQEAK Ky8qCisgKiBQZWVyIDIgUGVlciBNZW1vcnkgc3VwcG9ydC4KKyAqCisgKiBDb3B5cmlnaHQgKGMp IDIwMTYtMjAxNywgTWljcm9zZW1pIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcs IENocmlzdG9waCBIZWxsd2lnLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJl OyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUg dGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAor ICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlv bi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2ls bCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0 aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9S IEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5z ZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvcGNpLXAycC5o PgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNp bmNsdWRlIDxsaW51eC9nZW5hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L21lbXJlbWFwLmg+Cisj aW5jbHVkZSA8bGludXgvcGVyY3B1LXJlZmNvdW50Lmg+CisKK3N0cnVjdCBwY2lfcDJwIHsKKwlz dHJ1Y3QgcGVyY3B1X3JlZiBkZXZtYXBfcmVmOworCXN0cnVjdCBjb21wbGV0aW9uIGRldm1hcF9y ZWZfZG9uZTsKKwlzdHJ1Y3QgZ2VuX3Bvb2wgKnBvb2w7CisJYm9vbCBwdWJsaXNoZWQ7Cit9Owor CitzdGF0aWMgdm9pZCBwY2lfcDJwbWVtX3BlcmNwdV9yZWxlYXNlKHN0cnVjdCBwZXJjcHVfcmVm ICpyZWYpCit7CisJc3RydWN0IHBjaV9wMnAgKnAycCA9CisJCWNvbnRhaW5lcl9vZihyZWYsIHN0 cnVjdCBwY2lfcDJwLCBkZXZtYXBfcmVmKTsKKworCWNvbXBsZXRlX2FsbCgmcDJwLT5kZXZtYXBf cmVmX2RvbmUpOworfQorCitzdGF0aWMgdm9pZCBwY2lfcDJwbWVtX3BlcmNwdV9raWxsKHZvaWQg KmRhdGEpCit7CisJc3RydWN0IHBlcmNwdV9yZWYgKnJlZiA9IGRhdGE7CisKKwlpZiAocGVyY3B1 X3JlZl9pc19keWluZyhyZWYpKQorCQlyZXR1cm47CisKKwlwZXJjcHVfcmVmX2tpbGwocmVmKTsK K30KKworc3RhdGljIHZvaWQgcGNpX3AycG1lbV9yZWxlYXNlKHZvaWQgKmRhdGEpCit7CisJc3Ry dWN0IHBjaV9kZXYgKnBkZXYgPSBkYXRhOworCisJd2FpdF9mb3JfY29tcGxldGlvbigmcGRldi0+ cDJwLT5kZXZtYXBfcmVmX2RvbmUpOworCXBlcmNwdV9yZWZfZXhpdCgmcGRldi0+cDJwLT5kZXZt YXBfcmVmKTsKKworCWdlbl9wb29sX2Rlc3Ryb3kocGRldi0+cDJwLT5wb29sKTsKKwlwZGV2LT5w MnAgPSBOVUxMOworfQorCitzdGF0aWMgaW50IHBjaV9wMnBtZW1fc2V0dXAoc3RydWN0IHBjaV9k ZXYgKnBkZXYpCit7CisJaW50IGVycm9yID0gLUVOT01FTTsKKwlzdHJ1Y3QgcGNpX3AycCAqcDJw OworCisJcDJwID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqcDJwKSwgR0ZQX0tF Uk5FTCk7CisJaWYgKCFwMnApCisJCXJldHVybiAtRU5PTUVNOworCisJcDJwLT5wb29sID0gZ2Vu X3Bvb2xfY3JlYXRlKFBBR0VfU0hJRlQsIGRldl90b19ub2RlKCZwZGV2LT5kZXYpKTsKKwlpZiAo IXAycC0+cG9vbCkKKwkJZ290byBvdXQ7CisKKwlpbml0X2NvbXBsZXRpb24oJnAycC0+ZGV2bWFw X3JlZl9kb25lKTsKKwllcnJvciA9IHBlcmNwdV9yZWZfaW5pdCgmcDJwLT5kZXZtYXBfcmVmLAor CQkJcGNpX3AycG1lbV9wZXJjcHVfcmVsZWFzZSwgMCwgR0ZQX0tFUk5FTCk7CisJaWYgKGVycm9y KQorCQlnb3RvIG91dF9wb29sX2Rlc3Ryb3k7CisKKwlwZXJjcHVfcmVmX3N3aXRjaF90b19hdG9t aWNfc3luYygmcDJwLT5kZXZtYXBfcmVmKTsKKworCWVycm9yID0gZGV2bV9hZGRfYWN0aW9uX29y X3Jlc2V0KCZwZGV2LT5kZXYsIHBjaV9wMnBtZW1fcmVsZWFzZSwgcGRldik7CisJaWYgKGVycm9y KQorCQlnb3RvIG91dF9wb29sX2Rlc3Ryb3k7CisKKwlwZGV2LT5wMnAgPSBwMnA7CisKKwlyZXR1 cm4gMDsKKworb3V0X3Bvb2xfZGVzdHJveToKKwlnZW5fcG9vbF9kZXN0cm95KHAycC0+cG9vbCk7 CitvdXQ6CisJZGV2bV9rZnJlZSgmcGRldi0+ZGV2LCBwMnApOworCXJldHVybiBlcnJvcjsKK30K KworLyoqCisgKiBwY2lfcDJwbWVtX2FkZF9yZXNvdXJjZSAtIGFkZCBtZW1vcnkgZm9yIHVzZSBh cyBwMnAgbWVtb3J5CisgKiBAcGNpOiB0aGUgZGV2aWNlIHRvIGFkZCB0aGUgbWVtb3J5IHRvCisg KiBAYmFyOiBQQ0kgYmFyIHRvIGFkZAorICogQHNpemU6IHNpemUgb2YgdGhlIG1lbW9yeSB0byBh ZGQsIG1heSBiZSB6ZXJvIHRvIHVzZSB0aGUgd2hvbGUgYmFyCisgKiBAb2Zmc2V0OiBvZmZzZXQg aW50byB0aGUgUENJIGJhcgorICoKKyAqIFRoZSBtZW1vcnkgd2lsbCBiZSBnaXZlbiBaT05FX0RF VklDRSBzdHJ1Y3QgcGFnZXMgc28gdGhhdCBpdCBtYXkKKyAqIGJlIHVzZWQgd2l0aCBhbnkgZG1h IHJlcXVlc3QuCisgKi8KK2ludCBwY2lfcDJwbWVtX2FkZF9yZXNvdXJjZShzdHJ1Y3QgcGNpX2Rl diAqcGRldiwgaW50IGJhciwgc2l6ZV90IHNpemUsCisJCQkgICAgdTY0IG9mZnNldCkKK3sKKwlz dHJ1Y3QgZGV2X3BhZ2VtYXAgKnBnbWFwOworCXZvaWQgKmFkZHI7CisJaW50IGVycm9yOworCisJ aWYgKFdBUk5fT04ob2Zmc2V0ID49IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgYmFyKSkpCisJCXJl dHVybiAtRUlOVkFMOworCisJaWYgKCFzaXplKQorCQlzaXplID0gcGNpX3Jlc291cmNlX2xlbihw ZGV2LCBiYXIpIC0gb2Zmc2V0OworCisJaWYgKFdBUk5fT04oc2l6ZSArIG9mZnNldCA+IHBjaV9y ZXNvdXJjZV9sZW4ocGRldiwgYmFyKSkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFwZGV2 LT5wMnApIHsKKwkJZXJyb3IgPSBwY2lfcDJwbWVtX3NldHVwKHBkZXYpOworCQlpZiAoZXJyb3Ip CisJCQlyZXR1cm4gZXJyb3I7CisJfQorCisJcGdtYXAgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRl diwgc2l6ZW9mKCpwZ21hcCksIEdGUF9LRVJORUwpOworCWlmICghcGdtYXApCisJCXJldHVybiAt RU5PTUVNOworCisJcGdtYXAtPnJlcy5zdGFydCA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCBi YXIpICsgb2Zmc2V0OworCXBnbWFwLT5yZXMuZW5kID0gcGdtYXAtPnJlcy5zdGFydCArIHNpemUg LSAxOworCXBnbWFwLT5yZWYgPSAmcGRldi0+cDJwLT5kZXZtYXBfcmVmOworCXBnbWFwLT50eXBl ID0gTUVNT1JZX0RFVklDRV9QQ0lfUDJQOworCisJYWRkciA9IGRldm1fbWVtcmVtYXBfcGFnZXMo JnBkZXYtPmRldiwgcGdtYXApOworCWlmIChJU19FUlIoYWRkcikpCisJCXJldHVybiBQVFJfRVJS KGFkZHIpOworCisJZXJyb3IgPSBnZW5fcG9vbF9hZGRfdmlydChwZGV2LT5wMnAtPnBvb2wsICh1 aW50cHRyX3QpYWRkciwKKwkJCXBjaV9idXNfYWRkcmVzcyhwZGV2LCBiYXIpICsgb2Zmc2V0LAor CQkJcmVzb3VyY2Vfc2l6ZSgmcGdtYXAtPnJlcyksIGRldl90b19ub2RlKCZwZGV2LT5kZXYpKTsK KwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCWVycm9yID0gZGV2bV9hZGRfYWN0aW9u X29yX3Jlc2V0KCZwZGV2LT5kZXYsIHBjaV9wMnBtZW1fcGVyY3B1X2tpbGwsCisJCQkJCSAgJnBk ZXYtPnAycC0+ZGV2bWFwX3JlZik7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwlk ZXZfaW5mbygmcGRldi0+ZGV2LCAiYWRkZWQgJXpkQiBvZiBwMnAgbWVtb3J5XG4iLCBzaXplKTsK KworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwocGNpX3AycG1lbV9hZGRfcmVzb3Vy Y2UpOworCitzdGF0aWMgc3RydWN0IHBjaV9kZXYgKmZpbmRfcGFyZW50X3BjaV9kZXYoc3RydWN0 IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBkZXZpY2UgKnBhcmVudDsKKworCWRldiA9IGdldF9k ZXZpY2UoZGV2KTsKKworCXdoaWxlIChkZXYpIHsKKwkJaWYgKGRldl9pc19wY2koZGV2KSkKKwkJ CXJldHVybiB0b19wY2lfZGV2KGRldik7CisKKwkJcGFyZW50ID0gZ2V0X2RldmljZShkZXYtPnBh cmVudCk7CisJCXB1dF9kZXZpY2UoZGV2KTsKKwkJZGV2ID0gcGFyZW50OworCX0KKworCXJldHVy biBOVUxMOworfQorCisvKgorICogSWYgYSBkZXZpY2UgaXMgYmVoaW5kIGEgc3dpdGNoLCB3ZSB0 cnkgdG8gZmluZCB0aGUgdXBzdHJlYW0gYnJpZGdlCisgKiBwb3J0IG9mIHRoZSBzd2l0Y2guIFRo aXMgcmVxdWlyZXMgdHdvIGNhbGxzIHRvIHBjaV91cHN0cmVhbV9icmlkZ2U6CisgKiBvbmUgZm9y IHRoZSB1cHN0cmVhbSBwb3J0IG9uIHRoZSBzd2l0Y2gsIG9uZSBvbiB0aGUgdXBzdHJlYW0gcG9y dAorICogZm9yIHRoZSBuZXh0IGxldmVsIGluIHRoZSBoaWVyYXJjaHkuIEJlY2F1c2Ugb2YgdGhp cywgZGV2aWNlcyBjb25uZWN0ZWQKKyAqIHRvIHRoZSByb290IHBvcnQgd2lsbCBiZSByZWplY3Rl ZC4KKyAqLworc3RhdGljIHN0cnVjdCBwY2lfZGV2ICpnZXRfdXBzdHJlYW1fc3dpdGNoX3BvcnQo c3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IHBjaV9kZXYgKnVwMSwgKnVwMjsKKwor CWlmICghcGRldikKKwkJcmV0dXJuIE5VTEw7CisKKwl1cDEgPSBwY2lfZGV2X2dldChwY2lfdXBz dHJlYW1fYnJpZGdlKHBkZXYpKTsKKwlpZiAoIXVwMSkKKwkJcmV0dXJuIE5VTEw7CisKKwl1cDIg PSBwY2lfZGV2X2dldChwY2lfdXBzdHJlYW1fYnJpZGdlKHVwMSkpOworCXBjaV9kZXZfcHV0KHVw MSk7CisKKwlyZXR1cm4gdXAyOworfQorCitzdGF0aWMgYm9vbCBfX3Vwc3RyZWFtX2JyaWRnZXNf bWF0Y2goc3RydWN0IHBjaV9kZXYgKnVwc3RyZWFtLAorCQkJCSAgICAgc3RydWN0IHBjaV9kZXYg KmNsaWVudCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqZG1hX3VwOworCWJvb2wgcmV0ID0gdHJ1ZTsK KworCWRtYV91cCA9IGdldF91cHN0cmVhbV9zd2l0Y2hfcG9ydChjbGllbnQpOworCisJaWYgKCFk bWFfdXApIHsKKwkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJub3QgYSBwY2kgZGV2aWNlIGJlaGlu ZCBhIHN3aXRjaFxuIik7CisJCXJldCA9IGZhbHNlOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAo dXBzdHJlYW0gIT0gZG1hX3VwKSB7CisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LAorCQkJImRvZXMg bm90IHJlc2lkZSBvbiB0aGUgc2FtZSB1cHN0cmVhbSBicmlkZ2VcbiIpOworCQlyZXQgPSBmYWxz ZTsKKwkJZ290byBvdXQ7CisJfQorCitvdXQ6CisJcGNpX2Rldl9wdXQoZG1hX3VwKTsKKwlyZXR1 cm4gcmV0OworfQorCitzdGF0aWMgYm9vbCB1cHN0cmVhbV9icmlkZ2VzX21hdGNoKHN0cnVjdCBw Y2lfZGV2ICpwZGV2LAorCQkJCSAgIHN0cnVjdCBwY2lfZGV2ICpjbGllbnQpCit7CisJc3RydWN0 IHBjaV9kZXYgKnVwc3RyZWFtOworCWJvb2wgcmV0OworCisJdXBzdHJlYW0gPSBnZXRfdXBzdHJl YW1fc3dpdGNoX3BvcnQocGRldik7CisJaWYgKCF1cHN0cmVhbSkgeworCQlkZXZfd2FybigmcGRl di0+ZGV2LCAibm90IGJlaGluZCBhIHBjaSBzd2l0Y2hcbiIpOworCQlyZXR1cm4gZmFsc2U7CisJ fQorCisJcmV0ID0gX191cHN0cmVhbV9icmlkZ2VzX21hdGNoKHVwc3RyZWFtLCBjbGllbnQpOwor CisJcGNpX2Rldl9wdXQodXBzdHJlYW0pOworCisJcmV0dXJuIHJldDsKK30KKworc3RydWN0IHBj aV9wMnBtZW1fY2xpZW50IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IHBjaV9k ZXYgKmNsaWVudDsKKwlzdHJ1Y3QgcGNpX2RldiAqcDJwbWVtOworfTsKKworLyoqCisgKiBwY2lf cDJwbWVtX2FkZF9jbGllbnQgLSBhbGxvY2F0ZSBhIG5ldyBlbGVtZW50IGluIGEgY2xpZW50IGRl dmljZSBsaXN0CisgKiBAaGVhZDogbGlzdCBoZWFkIG9mIHAycG1lbSBjbGllbnRzCisgKiBAZGV2 OiBkZXZpY2UgdG8gYWRkIHRvIHRoZSBsaXN0CisgKgorICogVGhpcyBhZGRzIEBkZXYgdG8gYSBs aXN0IG9mIGNsaWVudHMgdXNlZCBieSBhIHAycG1lbSBkZXZpY2UuCisgKiBUaGlzIGxpc3Qgc2hv dWxkIGJlIHBhc3NlZCB0byBwMnBtZW1fZmluZCgpLiBPbmNlIHAycG1lbV9maW5kKCkgaGFzCisg KiBiZWVuIGNhbGxlZCBzdWNjZXNzZnVsbHksIHRoZSBsaXN0IHdpbGwgYmUgYm91bmQgdG8gYSBz cGVjaWZpYyBwMnBtZW0KKyAqIGRldmljZSBhbmQgbmV3IGNsaWVudHMgY2FuIG9ubHkgYmUgYWRk ZWQgdG8gdGhlIGxpc3QgaWYgdGhleSBhcmUKKyAqIHN1cHBvcnRlZCBieSB0aGF0IHAycG1lbSBk ZXZpY2UuCisgKgorICogVGhlIGNhbGxlciBpcyBleHBlY3RlZCB0byBoYXZlIGEgbG9jayB3aGlj aCBwcm90ZWN0cyBAaGVhZCBhcyBuZWNlc3NhcnkKKyAqIHNvIHRoYXQgbm9uZSBvZiB0aGUgcGNp X3AycG1lbSBmdW5jdGlvbnMgY2FuIGJlIGNhbGxlZCBjb25jdXJyZW50bHkKKyAqIG9uIHRoYXQg bGlzdC4KKyAqCisgKiBSZXR1cm5zIDAgaWYgdGhlIGNsaWVudCB3YXMgc3VjY2Vzc2Z1bGx5IGFk ZGVkLgorICovCitpbnQgcGNpX3AycG1lbV9hZGRfY2xpZW50KHN0cnVjdCBsaXN0X2hlYWQgKmhl YWQsIHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGNpX3AycG1lbV9jbGllbnQgKml0 ZW0sICpuZXdfaXRlbTsKKwlzdHJ1Y3QgcGNpX2RldiAqcDJwbWVtID0gTlVMTDsKKwlzdHJ1Y3Qg cGNpX2RldiAqY2xpZW50OworCWludCByZXQ7CisKKwljbGllbnQgPSBmaW5kX3BhcmVudF9wY2lf ZGV2KGRldik7CisJaWYgKCFjbGllbnQpIHsKKwkJZGV2X3dhcm4oZGV2LAorCQkJICJjYW5ub3Qg YmUgdXNlZCBmb3IgcDJwIGFzIGl0IGlzIG5vdCBhIHBjaSBkZXZpY2VcbiIpOworCQlyZXR1cm4g LUVOT0RFVjsKKwl9CisKKwlpdGVtID0gbGlzdF9maXJzdF9lbnRyeV9vcl9udWxsKGhlYWQsIHN0 cnVjdCBwY2lfcDJwbWVtX2NsaWVudCwgbGlzdCk7CisJaWYgKGl0ZW0gJiYgaXRlbS0+cDJwbWVt KSB7CisJCXAycG1lbSA9IGl0ZW0tPnAycG1lbTsKKworCQlpZiAoIXVwc3RyZWFtX2JyaWRnZXNf bWF0Y2gocDJwbWVtLCBjbGllbnQpKSB7CisJCQlyZXQgPSAtRVhERVY7CisJCQlnb3RvIHB1dF9j bGllbnQ7CisJCX0KKwl9CisKKwluZXdfaXRlbSA9IGt6YWxsb2Moc2l6ZW9mKCpuZXdfaXRlbSks IEdGUF9LRVJORUwpOworCWlmICghbmV3X2l0ZW0pIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290 byBwdXRfY2xpZW50OworCX0KKworCW5ld19pdGVtLT5jbGllbnQgPSBjbGllbnQ7CisJbmV3X2l0 ZW0tPnAycG1lbSA9IHBjaV9kZXZfZ2V0KHAycG1lbSk7CisKKwlsaXN0X2FkZF90YWlsKCZuZXdf aXRlbS0+bGlzdCwgaGVhZCk7CisKKwlyZXR1cm4gMDsKKworcHV0X2NsaWVudDoKKwlwY2lfZGV2 X3B1dChjbGllbnQpOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwY2lfcDJw bWVtX2FkZF9jbGllbnQpOworCitzdGF0aWMgdm9pZCBwY2lfcDJwbWVtX2NsaWVudF9mcmVlKHN0 cnVjdCBwY2lfcDJwbWVtX2NsaWVudCAqaXRlbSkKK3sKKwlsaXN0X2RlbCgmaXRlbS0+bGlzdCk7 CisJcGNpX2Rldl9wdXQoaXRlbS0+Y2xpZW50KTsKKwlwY2lfZGV2X3B1dChpdGVtLT5wMnBtZW0p OworCWtmcmVlKGl0ZW0pOworfQorCisvKioKKyAqIHBjaV9wMnBtZW1fcmVtb3ZlX2NsaWVudCAt IHJlbW92ZSBhbmQgZnJlZSBhIG5ldyBwMnBtZW0gY2xpZW50CisgKiBAaGVhZDogbGlzdCBoZWFk IG9mIHAycG1lbSBjbGllbnRzCisgKiBAZGV2OiBkZXZpY2UgdG8gcmVtb3ZlIGZyb20gdGhlIGxp c3QKKyAqCisgKiBUaGlzIHJlbW92ZXMgQGRldiBmcm9tIGEgbGlzdCBvZiBjbGllbnRzIHVzZWQg YnkgYSBwMnBtZW0gZGV2aWNlLgorICogVGhlIGNhbGxlciBpcyBleHBlY3RlZCB0byBoYXZlIGEg bG9jayB3aGljaCBwcm90ZWN0cyBAaGVhZCBhcyBuZWNlc3NhcnkKKyAqIHNvIHRoYXQgbm9uZSBv ZiB0aGUgcGNpX3AycG1lbSBmdW5jdGlvbnMgY2FuIGJlIGNhbGxlZCBjb25jdXJyZW50bHkKKyAq IG9uIHRoYXQgbGlzdC4KKyAqLwordm9pZCBwY2lfcDJwbWVtX3JlbW92ZV9jbGllbnQoc3RydWN0 IGxpc3RfaGVhZCAqaGVhZCwgc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwY2lfcDJw bWVtX2NsaWVudCAqcG9zLCAqdG1wOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCisJcGRldiA9 IGZpbmRfcGFyZW50X3BjaV9kZXYoZGV2KTsKKwlpZiAoIXBkZXYpCisJCXJldHVybjsKKworCWxp c3RfZm9yX2VhY2hfZW50cnlfc2FmZShwb3MsIHRtcCwgaGVhZCwgbGlzdCkgeworCQlpZiAocG9z LT5jbGllbnQgIT0gcGRldikKKwkJCWNvbnRpbnVlOworCisJCXBjaV9wMnBtZW1fY2xpZW50X2Zy ZWUocG9zKTsKKwl9CisKKwlwY2lfZGV2X3B1dChwZGV2KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BM KHBjaV9wMnBtZW1fcmVtb3ZlX2NsaWVudCk7CisKKy8qKgorICogcGNpX3AycG1lbV9jbGllbnRf bGlzdF9mcmVlIC0gZnJlZSBhbiBlbnRpcmUgbGlzdCBvZiBwMnBtZW0gY2xpZW50cworICogQGhl YWQ6IGxpc3QgaGVhZCBvZiBwMnBtZW0gY2xpZW50cworICoKKyAqIFRoaXMgcmVtb3ZlcyBhbGwg ZGV2aWNlcyBpbiBhIGxpc3Qgb2YgY2xpZW50cyB1c2VkIGJ5IGEgcDJwbWVtIGRldmljZS4KKyAq IFRoZSBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8gaGF2ZSBhIGxvY2sgd2hpY2ggcHJvdGVjdHMgQGhl YWQgYXMgbmVjZXNzYXJ5CisgKiBzbyB0aGF0IG5vbmUgb2YgdGhlIHBjaV9wMnBtZW0gZnVuY3Rp b25zIGNhbiBiZSBjYWxsZWQgY29uY3VycmVudGx5CisgKiBvbiB0aGF0IGxpc3QuCisgKi8KK3Zv aWQgcGNpX3AycG1lbV9jbGllbnRfbGlzdF9mcmVlKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCit7 CisJc3RydWN0IHBjaV9wMnBtZW1fY2xpZW50ICpwb3MsICp0bXA7CisKKwlsaXN0X2Zvcl9lYWNo X2VudHJ5X3NhZmUocG9zLCB0bXAsIGhlYWQsIGxpc3QpCisJCXBjaV9wMnBtZW1fY2xpZW50X2Zy ZWUocG9zKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBjaV9wMnBtZW1fY2xpZW50X2xpc3RfZnJl ZSk7CisKK3N0YXRpYyBib29sIHVwc3RyZWFtX2JyaWRnZXNfbWF0Y2hfbGlzdChzdHJ1Y3QgcGNp X2RldiAqcGRldiwKKwkJCQkJc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKK3sKKwlzdHJ1Y3QgcGNp X3AycG1lbV9jbGllbnQgKnBvczsKKwlzdHJ1Y3QgcGNpX2RldiAqdXBzdHJlYW07CisJYm9vbCBy ZXQ7CisKKwl1cHN0cmVhbSA9IGdldF91cHN0cmVhbV9zd2l0Y2hfcG9ydChwZGV2KTsKKwlpZiAo IXVwc3RyZWFtKSB7CisJCWRldl93YXJuKCZwZGV2LT5kZXYsICJub3QgYmVoaW5kIGEgcGNpIHN3 aXRjaFxuIik7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBv cywgaGVhZCwgbGlzdCkgeworCQlyZXQgPSBfX3Vwc3RyZWFtX2JyaWRnZXNfbWF0Y2godXBzdHJl YW0sIHBvcy0+Y2xpZW50KTsKKwkJaWYgKCFyZXQpCisJCQlicmVhazsKKwl9CisKKwlwY2lfZGV2 X3B1dCh1cHN0cmVhbSk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBwY2lfcDJwbWVtX2Zp bmQgLSBmaW5kIGEgcDJwIG1lbSBkZXZpY2UgY29tcGF0aWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQg ZGV2aWNlCisgKiBAZGV2OiBsaXN0IG9mIGRldmljZSB0byBjaGVjayAoTlVMTC10ZXJtaW5hdGVk KQorICoKKyAqIEZvciBub3csIHdlIG9ubHkgc3VwcG9ydCBjYXNlcyB3aGVyZSB0aGUgZGV2aWNl cyB0aGF0IHdpbGwgdHJhbnNmZXIgdG8gdGhlCisgKiBwMnBtZW0gZGV2aWNlIGFyZSBvbiB0aGUg c2FtZSBzd2l0Y2guICBUaGlzIGN1dHMgb3V0IGNhc2VzIHRoYXQgbWF5IHdvcmsgYnV0CisgKiBp cyBzYWZlc3QgZm9yIHRoZSB1c2VyLgorICoKKyAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBQ Q0kgZGV2aWNlIHdpdGggYSByZWZlcmVuY2UgdGFrZW4gKHVzZSBwY2lfZGV2X3B1dAorICogdG8g cmV0dXJuIHRoZSByZWZlcmVuY2UpIG9yIE5VTEwgaWYgbm8gY29tcGF0aWJsZSBkZXZpY2UgaXMg Zm91bmQuCisgKi8KK3N0cnVjdCBwY2lfZGV2ICpwY2lfcDJwbWVtX2ZpbmQoc3RydWN0IGxpc3Rf aGVhZCAqY2xpZW50cykKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IE5VTEw7CisJc3RydWN0 IHBjaV9wMnBtZW1fY2xpZW50ICpwb3M7CisKKwl3aGlsZSAoKHBkZXYgPSBwY2lfZ2V0X2Rldmlj ZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBwZGV2KSkpIHsKKwkJaWYgKCFwZGV2LT5wMnAgfHwg IXBkZXYtPnAycC0+cHVibGlzaGVkKQorCQkJY29udGludWU7CisKKwkJaWYgKCF1cHN0cmVhbV9i cmlkZ2VzX21hdGNoX2xpc3QocGRldiwgY2xpZW50cykpCisJCQljb250aW51ZTsKKworCQlsaXN0 X2Zvcl9lYWNoX2VudHJ5KHBvcywgY2xpZW50cywgbGlzdCkKKwkJCXBvcy0+cDJwbWVtID0gcGRl djsKKworCQlyZXR1cm4gcGRldjsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1C T0xfR1BMKHBjaV9wMnBtZW1fZmluZCk7CisKKy8qKgorICogcGNpX2FsbG9jX3AycF9tZW0gLSBh bGxvY2F0ZSBwMnAgbWVtb3J5CisgKiBAcGRldjoJdGhlIGRldmljZSB0byBhbGxvY2F0ZSBtZW1v cnkgZnJvbQorICogQHNpemU6CW51bWJlciBvZiBieXRlcyB0byBhbGxvY2F0ZQorICoKKyAqIFJl dHVybnMgdGhlIGFsbG9jYXRlZCBtZW1vcnkgb3IgTlVMTCBvbiBlcnJvci4KKyAqLwordm9pZCAq cGNpX2FsbG9jX3AycG1lbShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc2l6ZV90IHNpemUpCit7CisJ dm9pZCAqcmV0OworCisJaWYgKHVubGlrZWx5KCFwZGV2LT5wMnApKQorCQlyZXR1cm4gTlVMTDsK KworCWlmICh1bmxpa2VseSghcGVyY3B1X3JlZl90cnlnZXRfbGl2ZSgmcGRldi0+cDJwLT5kZXZt YXBfcmVmKSkpCisJCXJldHVybiBOVUxMOworCisJcmV0ID0gKHZvaWQgKikodWludHB0cl90KWdl bl9wb29sX2FsbG9jKHBkZXYtPnAycC0+cG9vbCwgc2l6ZSk7CisKKwlpZiAodW5saWtlbHkoIXJl dCkpCisJCXBlcmNwdV9yZWZfcHV0KCZwZGV2LT5wMnAtPmRldm1hcF9yZWYpOworCisJcmV0dXJu IHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBjaV9hbGxvY19wMnBtZW0pOworCisvKioKKyAq IHBjaV9mcmVlX3AycG1lbSAtIGFsbG9jYXRlIHAycCBtZW1vcnkKKyAqIEBwZGV2Ogl0aGUgZGV2 aWNlIHRoZSBtZW1vcnkgd2FzIGFsbG9jYXRlZCBmcm9tCisgKiBAYWRkcjoJYWRkcmVzcyBvZiB0 aGUgbWVtb3J5IHRoYXQgd2FzIGFsbG9jYXRlZAorICogQHNpemU6CW51bWJlciBvZiBieXRlcyB0 aGF0IHdhcyBhbGxvY2F0ZWQKKyAqLwordm9pZCBwY2lfZnJlZV9wMnBtZW0oc3RydWN0IHBjaV9k ZXYgKnBkZXYsIHZvaWQgKmFkZHIsIHNpemVfdCBzaXplKQoreworCWdlbl9wb29sX2ZyZWUocGRl di0+cDJwLT5wb29sLCAodWludHB0cl90KWFkZHIsIHNpemUpOworCXBlcmNwdV9yZWZfcHV0KCZw ZGV2LT5wMnAtPmRldm1hcF9yZWYpOworfQorRVhQT1JUX1NZTUJPTF9HUEwocGNpX2ZyZWVfcDJw bWVtKTsKKworLyoqCisgKiBwY2lfdmlydF90b19idXMgLSByZXR1cm4gdGhlIHBjaSBidXMgYWRk cmVzcyBmb3IgYSBnaXZlbiB2aXJ0dWFsCisgKglhZGRyZXNzIG9idGFpbmVkIHdpdGggcGNpX2Fs bG9jX3AycG1lbQorICogQHBkZXY6CXRoZSBkZXZpY2UgdGhlIG1lbW9yeSB3YXMgYWxsb2NhdGVk IGZyb20KKyAqIEBhZGRyOglhZGRyZXNzIG9mIHRoZSBtZW1vcnkgdGhhdCB3YXMgYWxsb2NhdGVk CisgKi8KK3BjaV9idXNfYWRkcl90IHBjaV9wMnBtZW1fdmlydF90b19idXMoc3RydWN0IHBjaV9k ZXYgKnBkZXYsIHZvaWQgKmFkZHIpCit7CisJaWYgKCFhZGRyKQorCQlyZXR1cm4gMDsKKwlpZiAo IXBkZXYtPnAycCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gZ2VuX3Bvb2xfdmlydF90b19waHlz KHBkZXYtPnAycC0+cG9vbCwgKHVuc2lnbmVkIGxvbmcpYWRkcik7Cit9CitFWFBPUlRfU1lNQk9M X0dQTChwY2lfcDJwbWVtX3ZpcnRfdG9fYnVzKTsKKworLyoqCisgKiBwY2lfcDJwbWVtX2FsbG9j X3NnbCAtIGFsbG9jYXRlIHAycCBtZW1vcnkgaW4gYW4gc2dsCisgKiBAcGRldjoJdGhlIGRldmlj ZSB0byBhbGxvY2F0ZSBtZW1vcnkgZnJvbQorICogQHNnbDoJdGhlIGFsbG9jYXRlZCBzZ2wKKyAq IEBuZW50czogICAgICB0aGUgbnVtYmVyIG9mIHNncyBpbiB0aGUgbGlzdAorICogQGxlbmd0aDog ICAgIG51bWJlciBvZiBieXRlcyB0byBhbGxvY2F0ZQorICoKKyAqIFJldHVybnMgMCBvbiBzdWNj ZXNzCisgKi8KK2ludCBwY2lfcDJwbWVtX2FsbG9jX3NnbChzdHJ1Y3QgcGNpX2RldiAqcGRldiwg c3RydWN0IHNjYXR0ZXJsaXN0ICoqc2dsLAorCQkJIHVuc2lnbmVkIGludCAqbmVudHMsIHUzMiBs ZW5ndGgpCit7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwl2b2lkICphZGRyOworCisJc2cg PSBremFsbG9jKHNpemVvZigqc2cpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNnKQorCQlyZXR1cm4g LUVOT01FTTsKKworCXNnX2luaXRfdGFibGUoc2csIDEpOworCisJYWRkciA9IHBjaV9hbGxvY19w MnBtZW0ocGRldiwgbGVuZ3RoKTsKKwlpZiAoIWFkZHIpCisJCWdvdG8gb3V0X2ZyZWVfc2c7CisK KwlzZ19zZXRfYnVmKHNnLCBhZGRyLCBsZW5ndGgpOworCSpzZ2wgPSBzZzsKKwkqbmVudHMgPSAx OworCXJldHVybiAwOworCitvdXRfZnJlZV9zZzoKKwlrZnJlZShzZyk7CisJcmV0dXJuIC1FTk9N RU07Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwY2lfcDJwbWVtX2FsbG9jX3NnbCk7CisKKy8qKgor ICogcGNpX3AycG1lbV9mcmVlX3NnbCAtIGZyZWUgYW4gc2dsIGFsbG9jYXRlZCBieSBwY2lfcDJw bWVtX2FsbG9jX3NnbAorICogQHBkZXY6CXRoZSBkZXZpY2UgdG8gYWxsb2NhdGUgbWVtb3J5IGZy b20KKyAqIEBzZ2w6CXRoZSBhbGxvY2F0ZWQgc2dsCisgKiBAbmVudHM6ICAgICAgdGhlIG51bWJl ciBvZiBzZ3MgaW4gdGhlIGxpc3QKKyAqLwordm9pZCBwY2lfcDJwbWVtX2ZyZWVfc2dsKHN0cnVj dCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbCwKKwkJCSB1bnNpZ25lZCBp bnQgbmVudHMpCit7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwlpbnQgY291bnQ7CisKKwlp ZiAoIXNnbCB8fCAhbmVudHMpCisJCXJldHVybjsKKworCWZvcl9lYWNoX3NnKHNnbCwgc2csIG5l bnRzLCBjb3VudCkKKwkJcGNpX2ZyZWVfcDJwbWVtKHBkZXYsIHNnX3ZpcnQoc2cpLCBzZy0+bGVu Z3RoKTsKKwlrZnJlZShzZ2wpOworfQorRVhQT1JUX1NZTUJPTF9HUEwocGNpX3AycG1lbV9mcmVl X3NnbCk7CisKKy8qKgorICogcGNpX3AycG1lbV9wdWJsaXNoIC0gcHVibGlzaCB0aGUgcDJwIG1l bW9yeSBmb3IgdXNlIGJ5IG90aGVyIGRldmljZXMKKyAqCXdpdGggcGNpX3AycG1lbV9maW5kCisg KiBAcGRldjoJdGhlIGRldmljZSB3aXRoIHAycCBtZW1vcnkgdG8gcHVibGlzaAorICogQHB1Ymxp c2g6CXNldCB0byB0cnVlIHRvIHB1Ymxpc2ggdGhlIG1lbW9yeSwgZmFsc2UgdG8gdW5wdWJsaXNo IGl0CisgKi8KK3ZvaWQgcGNpX3AycG1lbV9wdWJsaXNoKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBi b29sIHB1Ymxpc2gpCit7CisJaWYgKFdBUk5fT04ocHVibGlzaCAmJiAhcGRldi0+cDJwKSkKKwkJ cmV0dXJuOworCisJcGRldi0+cDJwLT5wdWJsaXNoZWQgPSBwdWJsaXNoOworfQorRVhQT1JUX1NZ TUJPTF9HUEwocGNpX3AycG1lbV9wdWJsaXNoKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgv bWVtcmVtYXAuaCBiL2luY2x1ZGUvbGludXgvbWVtcmVtYXAuaAppbmRleCA3YjQ4OTljMDZmNDku LmMxN2E2ZDE2N2Q0OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZW1yZW1hcC5oCisrKyBi L2luY2x1ZGUvbGludXgvbWVtcmVtYXAuaApAQCAtNTMsMTEgKzUzLDE2IEBAIHN0cnVjdCB2bWVt X2FsdG1hcCB7CiAgKiBkcml2ZXIgY2FuIGhvdHBsdWcgdGhlIGRldmljZSBtZW1vcnkgdXNpbmcg Wk9ORV9ERVZJQ0UgYW5kIHdpdGggdGhhdCBtZW1vcnkKICAqIHR5cGUuIEFueSBwYWdlIG9mIGEg cHJvY2VzcyBjYW4gYmUgbWlncmF0ZWQgdG8gc3VjaCBtZW1vcnkuIEhvd2V2ZXIgbm8gb25lCiAg KiBzaG91bGQgYmUgYWxsb3cgdG8gcGluIHN1Y2ggbWVtb3J5IHNvIHRoYXQgaXQgY2FuIGFsd2F5 cyBiZSBldmljdGVkLgorICoKKyAqIE1FTU9SWV9ERVZJQ0VfUENJX1AyUDoKKyAqIERldmljZSBt ZW1vcnkgcmVzaWRpbmcgaW4gYSBQQ0kgQkFSIGludGVuZGVkIGZvciB1c2Ugd2l0aCBQZWVyLXRv LVBlZXIKKyAqIHRyYW5zYWN0aW9ucy4KICAqLwogZW51bSBtZW1vcnlfdHlwZSB7CiAJTUVNT1JZ X0RFVklDRV9IT1NUID0gMCwKIAlNRU1PUllfREVWSUNFX1BSSVZBVEUsCiAJTUVNT1JZX0RFVklD RV9QVUJMSUMsCisJTUVNT1JZX0RFVklDRV9QQ0lfUDJQLAogfTsKIAogLyoKQEAgLTE2MSw2ICsx NjYsMTkgQEAgc3RhdGljIGlubGluZSB2b2lkIHZtZW1fYWx0bWFwX2ZyZWUoc3RydWN0IHZtZW1f YWx0bWFwICphbHRtYXAsCiB9CiAjZW5kaWYgLyogQ09ORklHX1pPTkVfREVWSUNFICovCiAKKyNp ZmRlZiBDT05GSUdfUENJX1AyUAorc3RhdGljIGlubGluZSBib29sIGlzX3BjaV9wMnBfcGFnZShj b25zdCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlyZXR1cm4gaXNfem9uZV9kZXZpY2VfcGFnZShw YWdlKSAmJgorCQlwYWdlLT5wZ21hcC0+dHlwZSA9PSBNRU1PUllfREVWSUNFX1BDSV9QMlA7Cit9 CisjZWxzZQorc3RhdGljIGlubGluZSBib29sIGlzX3BjaV9wMnBfcGFnZShjb25zdCBzdHJ1Y3Qg cGFnZSAqcGFnZSkKK3sKKwlyZXR1cm4gZmFsc2U7Cit9CisjZW5kaWYKKwogI2lmIGRlZmluZWQo Q09ORklHX0RFVklDRV9QUklWQVRFKSB8fCBkZWZpbmVkKENPTkZJR19ERVZJQ0VfUFVCTElDKQog c3RhdGljIGlubGluZSBib29sIGlzX2RldmljZV9wcml2YXRlX3BhZ2UoY29uc3Qgc3RydWN0IHBh Z2UgKnBhZ2UpCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BjaS1wMnAuaCBiL2luY2x1 ZGUvbGludXgvcGNpLXAycC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAw MC4uZjgxMWM5N2E1ODg2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9wY2ktcDJw LmgKQEAgLTAsMCArMSw4NSBAQAorI2lmbmRlZiBfTElOVVhfUENJX1AyUF9ICisjZGVmaW5lIF9M SU5VWF9QQ0lfUDJQX0gKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxNywgTWljcm9zZW1p IENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIENocmlzdG9waCBIZWxsd2lnLgor ICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0 ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMg b2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJs aXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dy YW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRI T1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBv ZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NF LiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWls cy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisKK3N0cnVjdCBibG9ja19kZXZpY2U7 CitzdHJ1Y3Qgc2NhdHRlcmxpc3Q7CisKKyNpZmRlZiBDT05GSUdfUENJX1AyUAoraW50IHBjaV9w MnBtZW1fYWRkX3Jlc291cmNlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgYmFyLCBzaXplX3Qg c2l6ZSwKKwkJdTY0IG9mZnNldCk7CitpbnQgcGNpX3AycG1lbV9hZGRfY2xpZW50KHN0cnVjdCBs aXN0X2hlYWQgKmhlYWQsIHN0cnVjdCBkZXZpY2UgKmRldik7Cit2b2lkIHBjaV9wMnBtZW1fcmVt b3ZlX2NsaWVudChzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLCBzdHJ1Y3QgZGV2aWNlICpkZXYpOwor dm9pZCBwY2lfcDJwbWVtX2NsaWVudF9saXN0X2ZyZWUoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCk7 CitzdHJ1Y3QgcGNpX2RldiAqcGNpX3AycG1lbV9maW5kKHN0cnVjdCBsaXN0X2hlYWQgKmNsaWVu dHMpOwordm9pZCAqcGNpX2FsbG9jX3AycG1lbShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc2l6ZV90 IHNpemUpOwordm9pZCBwY2lfZnJlZV9wMnBtZW0oc3RydWN0IHBjaV9kZXYgKnBkZXYsIHZvaWQg KmFkZHIsIHNpemVfdCBzaXplKTsKK3BjaV9idXNfYWRkcl90IHBjaV9wMnBtZW1fdmlydF90b19i dXMoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHZvaWQgKmFkZHIpOworaW50IHBjaV9wMnBtZW1fYWxs b2Nfc2dsKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKipzZ2wsCisJ CXVuc2lnbmVkIGludCAqbmVudHMsIHUzMiBsZW5ndGgpOwordm9pZCBwY2lfcDJwbWVtX2ZyZWVf c2dsKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbCwKKwkJdW5z aWduZWQgaW50IG5lbnRzKTsKK3ZvaWQgcGNpX3AycG1lbV9wdWJsaXNoKHN0cnVjdCBwY2lfZGV2 ICpwZGV2LCBib29sIHB1Ymxpc2gpOworI2Vsc2UgLyogQ09ORklHX1BDSV9QMlAgKi8KK3N0YXRp YyBpbmxpbmUgaW50IHBjaV9wMnBtZW1fYWRkX3Jlc291cmNlKHN0cnVjdCBwY2lfZGV2ICpwZGV2 LCBpbnQgYmFyLAorCQlzaXplX3Qgc2l6ZSwgdTY0IG9mZnNldCkKK3sKKwlyZXR1cm4gMDsKK30K K3N0YXRpYyBpbmxpbmUgaW50IHBjaV9wMnBtZW1fYWRkX2NsaWVudChzdHJ1Y3QgbGlzdF9oZWFk ICpoZWFkLAorCQlzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMg aW5saW5lIHZvaWQgcGNpX3AycG1lbV9yZW1vdmVfY2xpZW50KHN0cnVjdCBsaXN0X2hlYWQgKmhl YWQsCisJCXN0cnVjdCBkZXZpY2UgKmRldikKK3sKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBwY2lf cDJwbWVtX2NsaWVudF9saXN0X2ZyZWUoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKK3sKK30KK3N0 YXRpYyBpbmxpbmUgc3RydWN0IHBjaV9kZXYgKnBjaV9wMnBtZW1fZmluZChzdHJ1Y3QgbGlzdF9o ZWFkICpjbGllbnRzKQoreworCXJldHVybiBOVUxMOworfQorc3RhdGljIGlubGluZSB2b2lkICpw Y2lfYWxsb2NfcDJwbWVtKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzaXplX3Qgc2l6ZSkKK3sKKwly ZXR1cm4gTlVMTDsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBwY2lfZnJlZV9wMnBtZW0oc3RydWN0 IHBjaV9kZXYgKnBkZXYsIHZvaWQgKmFkZHIsCisJCXNpemVfdCBzaXplKQoreworfQorc3RhdGlj IGlubGluZSBwY2lfYnVzX2FkZHJfdCBwY2lfcDJwbWVtX3ZpcnRfdG9fYnVzKHN0cnVjdCBwY2lf ZGV2ICpwZGV2LAorCQkJCQkJICAgIHZvaWQgKmFkZHIpCit7CisJcmV0dXJuIDA7Cit9CitzdGF0 aWMgaW5saW5lIGludCBwY2lfcDJwbWVtX2FsbG9jX3NnbChzdHJ1Y3QgcGNpX2RldiAqcGRldiwK KwkJc3RydWN0IHNjYXR0ZXJsaXN0ICoqc2dsLCB1bnNpZ25lZCBpbnQgKm5lbnRzLCB1MzIgbGVu Z3RoKQoreworCXJldHVybiAtRU5PREVWOworfQorc3RhdGljIGlubGluZSB2b2lkIHBjaV9wMnBt ZW1fZnJlZV9zZ2woc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCXN0cnVjdCBzY2F0dGVybGlzdCAq c2dsLCB1bnNpZ25lZCBpbnQgbmVudHMpCit7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgcGNpX3Ay cG1lbV9wdWJsaXNoKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBib29sIHB1Ymxpc2gpCit7Cit9Cisj ZW5kaWYgLyogQ09ORklHX1BDSV9QMlAgKi8KKyNlbmRpZiAvKiBfTElOVVhfUENJX1AyUF9IICov CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BjaS5oIGIvaW5jbHVkZS9saW51eC9wY2kuaApp bmRleCBjMTcwYzkyNTBjOGIuLjA0N2FlYTY3OWU4NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51 eC9wY2kuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BjaS5oCkBAIC0yNzksNiArMjc5LDcgQEAgc3Ry dWN0IHBjaWVfbGlua19zdGF0ZTsKIHN0cnVjdCBwY2lfdnBkOwogc3RydWN0IHBjaV9zcmlvdjsK IHN0cnVjdCBwY2lfYXRzOworc3RydWN0IHBjaV9wMnA7CiAKIC8qCiAgKiBUaGUgcGNpX2RldiBz dHJ1Y3R1cmUgaXMgdXNlZCB0byBkZXNjcmliZSBQQ0kgZGV2aWNlcy4KQEAgLTQzMiw2ICs0MzMs OSBAQCBzdHJ1Y3QgcGNpX2RldiB7CiAjaWZkZWYgQ09ORklHX1BDSV9QQVNJRAogCXUxNgkJcGFz aWRfZmVhdHVyZXM7CiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfUENJX1AyUAorCXN0cnVjdCBwY2lf cDJwICpwMnA7CisjZW5kaWYKIAlwaHlzX2FkZHJfdCByb207IC8qIFBoeXNpY2FsIGFkZHJlc3Mg b2YgUk9NIGlmIGl0J3Mgbm90IGZyb20gdGhlIEJBUiAqLwogCXNpemVfdCByb21sZW47IC8qIExl bmd0aCBvZiBST00gaWYgaXQncyBub3QgZnJvbSB0aGUgQkFSICovCiAJY2hhciAqZHJpdmVyX292 ZXJyaWRlOyAvKiBEcml2ZXIgbmFtZSB0byBmb3JjZSBhIG1hdGNoICovCi0tIAoyLjExLjAKCl9f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkxpbnV4LW52ZGlt bSBtYWlsaW5nIGxpc3QKTGludXgtbnZkaW1tQGxpc3RzLjAxLm9yZwpodHRwczovL2xpc3RzLjAx Lm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LW52ZGltbQo=