From mboxrd@z Thu Jan 1 00:00:00 1970 From: Lionel Landwerlin Subject: [PATCH 4/5] drm/i915: Implement color management on bdw/skl/bxt/kbl Date: Mon, 22 Feb 2016 14:18:10 +0000 Message-ID: <1456150691-20231-5-git-send-email-lionel.g.landwerlin@intel.com> References: <1456150691-20231-1-git-send-email-lionel.g.landwerlin@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1456150691-20231-1-git-send-email-lionel.g.landwerlin@intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org Cc: Kumar@freedesktop.org, kausalmalladi@gmail.com, kiran.s.kumar@intel.com List-Id: dri-devel@lists.freedesktop.org UGF0Y2ggYmFzZWQgb24gYSBwcmV2aW91cyBzZXJpZXMgYnkgU2hhc2hhbmsgU2hhcm1hLgoKdjI6 IERvIG5vdCByZWFkIEdBTU1BX01PREUgcmVnaXN0ZXIgdG8gZmlndXJlIHdoYXQgbW9kZSB3ZSdy ZSBpbgoKdjM6IFByb2dyYW0gUFJFQ19QQUxfR0NfTUFYIHRvIGNsYW1wIHBpeGVsIHZhbHVlcyA+ IDEuMAoKICAgIEFkZCBkb2N1bWVudGF0aW9uIG9uIGhvdyB0aGUgQnJvYWRjYXN0IFJHQiBwcm9w ZXJ0eSBpcyBhZmZlY3RlZCBieSBDVE0KCnY0OiBVcGRhdGUgY29udHJpYnV0b3JzCgp2NTogUmVm YWN0b3IgZGVnYW1tYS9nYW1tYSBMVVRzIGxvYWQgaW50byBhIHNpbmdsZSBmdW5jdGlvbgoKdjY6 IEZpeCBtaXNzaW5nIGludGVsX2NydGMgdmFyaWFibGUgKGJpc2VjdCBpc3N1ZSkKClNpZ25lZC1v ZmYtYnk6IFNoYXNoYW5rIFNoYXJtYSA8c2hhc2hhbmsuc2hhcm1hQGludGVsLmNvbT4KU2lnbmVk LW9mZi1ieTogTGlvbmVsIExhbmR3ZXJsaW4gPGxpb25lbC5nLmxhbmR3ZXJsaW5AaW50ZWwuY29t PgpTaWduZWQtb2ZmLWJ5OiBLdW1hciwgS2lyYW4gUyA8a2lyYW4ucy5rdW1hckBpbnRlbC5jb20+ ClNpZ25lZC1vZmYtYnk6IEthdXNhbCBNYWxsYWRpIDxrYXVzYWxtYWxsYWRpQGdtYWlsLmNvbT4K LS0tCiBEb2N1bWVudGF0aW9uL0RvY0Jvb2svZ3B1LnRtcGwgICAgICAgfCAgIDYgKy0KIGRyaXZl cnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmMgICAgICB8ICAyNCArKy0KIGRyaXZlcnMvZ3B1L2Ry bS9pOTE1L2k5MTVfZHJ2LmggICAgICB8ICAgNiArCiBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1 X3JlZy5oICAgICAgfCAgMjIgKysrCiBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9jb2xvci5j ICAgfCAzNTYgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrLS0tLS0KIGRyaXZlcnMvZ3B1 L2RybS9pOTE1L2ludGVsX2Rpc3BsYXkuYyB8ICAyMiArKy0KIGRyaXZlcnMvZ3B1L2RybS9pOTE1 L2ludGVsX2Rydi5oICAgICB8ICAgMyArLQogZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZmJk ZXYuYyAgIHwgICA4ICsKIDggZmlsZXMgY2hhbmdlZCwgMzgzIGluc2VydGlvbnMoKyksIDY0IGRl bGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9ncHUudG1wbCBi L0RvY3VtZW50YXRpb24vRG9jQm9vay9ncHUudG1wbAppbmRleCAxNjkyYzRkLi40MzBlOTliIDEw MDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZ3B1LnRtcGwKKysrIGIvRG9jdW1lbnRh dGlvbi9Eb2NCb29rL2dwdS50bXBsCkBAIC0yMTUzLDcgKzIxNTMsMTEgQEAgdm9pZCBpbnRlbF9j cnRfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogCTx0ZCB2YWxpZ249InRvcCIgPkVOVU08 L3RkPgogCTx0ZCB2YWxpZ249InRvcCIgPnsgIkF1dG9tYXRpYyIsICJGdWxsIiwgIkxpbWl0ZWQg MTY6MjM1IiB9PC90ZD4KIAk8dGQgdmFsaWduPSJ0b3AiID5Db25uZWN0b3I8L3RkPgotCTx0ZCB2 YWxpZ249InRvcCIgPlRCRDwvdGQ+CisJPHRkIHZhbGlnbj0idG9wIiA+V2hlbiB0aGlzIHByb3Bl cnR5IGlzIHNldCB0byBMaW1pdGVkIDE2OjIzNQorCQlhbmQgQ1RNIGlzIHNldCwgdGhlIGhhcmR3 YXJlIHdpbGwgYmUgcHJvZ3JhbW1lZCB3aXRoIHRoZQorCQlyZXN1bHQgb2YgdGhlIG11bHRpcGxp Y2F0aW9uIG9mIENUTSBieSB0aGUgbGltaXRlZCByYW5nZQorCQltYXRyaXggdG8gZW5zdXJlIHRo ZSBwaXhlbHMgbm9ybWFseSBpbiB0aGUgcmFuZ2UgMC4uMS4wIGFyZQorCQlyZW1hcHBlZCB0byB0 aGUgcmFuZ2UgMTYvMjU1Li4yMzUvMjU1LjwvdGQ+CiAJPC90cj4KIAk8dHI+CiAJPHRkIHZhbGln bj0idG9wIiA+4oCcYXVkaW/igJ08L3RkPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5 MTUvaTkxNV9kcnYuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmMKaW5kZXggMjBl ODIwMC4uMzgwN2I3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYu YworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5jCkBAIC02Niw2ICs2Niw5IEBA IHN0YXRpYyBzdHJ1Y3QgZHJtX2RyaXZlciBkcml2ZXI7CiAjZGVmaW5lIElWQl9DVVJTT1JfT0ZG U0VUUyBcCiAJLmN1cnNvcl9vZmZzZXRzID0geyBDVVJTT1JfQV9PRkZTRVQsIElWQl9DVVJTT1Jf Ql9PRkZTRVQsIElWQl9DVVJTT1JfQ19PRkZTRVQgfQogCisjZGVmaW5lIEJEV19DT0xPUlMgXAor CS5jb2xvciA9IHsgLmRlZ2FtbWFfbHV0X3NpemUgPSA1MTIsIC5nYW1tYV9sdXRfc2l6ZSA9IDUx MiB9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW50ZWxfZGV2aWNlX2luZm8gaW50ZWxfaTgzMF9p bmZvID0gewogCS5nZW4gPSAyLCAuaXNfbW9iaWxlID0gMSwgLmN1cnNvcl9uZWVkc19waHlzaWNh bCA9IDEsIC5udW1fcGlwZXMgPSAyLAogCS5oYXNfb3ZlcmxheSA9IDEsIC5vdmVybGF5X25lZWRz X3BoeXNpY2FsID0gMSwKQEAgLTI4OCwyNCArMjkxLDI4IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3Qg aW50ZWxfZGV2aWNlX2luZm8gaW50ZWxfaGFzd2VsbF9tX2luZm8gPSB7CiAJLmlzX21vYmlsZSA9 IDEsCiB9OwogCisjZGVmaW5lIEJEV19GRUFUVVJFUyBcCisJSFNXX0ZFQVRVUkVTLCBcCisJQkRX X0NPTE9SUworCiBzdGF0aWMgY29uc3Qgc3RydWN0IGludGVsX2RldmljZV9pbmZvIGludGVsX2Jy b2Fkd2VsbF9kX2luZm8gPSB7Ci0JSFNXX0ZFQVRVUkVTLAorCUJEV19GRUFUVVJFUywKIAkuZ2Vu ID0gOCwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW50ZWxfZGV2aWNlX2luZm8gaW50ZWxf YnJvYWR3ZWxsX21faW5mbyA9IHsKLQlIU1dfRkVBVFVSRVMsCisJQkRXX0ZFQVRVUkVTLAogCS5n ZW4gPSA4LCAuaXNfbW9iaWxlID0gMSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW50ZWxf ZGV2aWNlX2luZm8gaW50ZWxfYnJvYWR3ZWxsX2d0M2RfaW5mbyA9IHsKLQlIU1dfRkVBVFVSRVMs CisJQkRXX0ZFQVRVUkVTLAogCS5nZW4gPSA4LAogCS5yaW5nX21hc2sgPSBSRU5ERVJfUklORyB8 IEJTRF9SSU5HIHwgQkxUX1JJTkcgfCBWRUJPWF9SSU5HIHwgQlNEMl9SSU5HLAogfTsKIAogc3Rh dGljIGNvbnN0IHN0cnVjdCBpbnRlbF9kZXZpY2VfaW5mbyBpbnRlbF9icm9hZHdlbGxfZ3QzbV9p bmZvID0gewotCUhTV19GRUFUVVJFUywKKwlCRFdfRkVBVFVSRVMsCiAJLmdlbiA9IDgsIC5pc19t b2JpbGUgPSAxLAogCS5yaW5nX21hc2sgPSBSRU5ERVJfUklORyB8IEJTRF9SSU5HIHwgQkxUX1JJ TkcgfCBWRUJPWF9SSU5HIHwgQlNEMl9SSU5HLAogfTsKQEAgLTMyMSwxMyArMzI4LDEzIEBAIHN0 YXRpYyBjb25zdCBzdHJ1Y3QgaW50ZWxfZGV2aWNlX2luZm8gaW50ZWxfY2hlcnJ5dmlld19pbmZv ID0gewogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpbnRlbF9kZXZpY2VfaW5mbyBpbnRlbF9z a3lsYWtlX2luZm8gPSB7Ci0JSFNXX0ZFQVRVUkVTLAorCUJEV19GRUFUVVJFUywKIAkuaXNfc2t5 bGFrZSA9IDEsCiAJLmdlbiA9IDksCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGludGVsX2Rl dmljZV9pbmZvIGludGVsX3NreWxha2VfZ3QzX2luZm8gPSB7Ci0JSFNXX0ZFQVRVUkVTLAorCUJE V19GRUFUVVJFUywKIAkuaXNfc2t5bGFrZSA9IDEsCiAJLmdlbiA9IDksCiAJLnJpbmdfbWFzayA9 IFJFTkRFUl9SSU5HIHwgQlNEX1JJTkcgfCBCTFRfUklORyB8IFZFQk9YX1JJTkcgfCBCU0QyX1JJ TkcsCkBAIC0zNDUsMTcgKzM1MiwxOCBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IGludGVsX2Rldmlj ZV9pbmZvIGludGVsX2Jyb3h0b25faW5mbyA9IHsKIAkuaGFzX2ZiYyA9IDEsCiAJR0VOX0RFRkFV TFRfUElQRU9GRlNFVFMsCiAJSVZCX0NVUlNPUl9PRkZTRVRTLAorCUJEV19DT0xPUlMsCiB9Owog CiBzdGF0aWMgY29uc3Qgc3RydWN0IGludGVsX2RldmljZV9pbmZvIGludGVsX2thYnlsYWtlX2lu Zm8gPSB7Ci0JSFNXX0ZFQVRVUkVTLAorCUJEV19GRUFUVVJFUywKIAkuaXNfcHJlbGltaW5hcnkg PSAxLAogCS5pc19rYWJ5bGFrZSA9IDEsCiAJLmdlbiA9IDksCiB9OwogCiBzdGF0aWMgY29uc3Qg c3RydWN0IGludGVsX2RldmljZV9pbmZvIGludGVsX2thYnlsYWtlX2d0M19pbmZvID0gewotCUhT V19GRUFUVVJFUywKKwlCRFdfRkVBVFVSRVMsCiAJLmlzX3ByZWxpbWluYXJ5ID0gMSwKIAkuaXNf a2FieWxha2UgPSAxLAogCS5nZW4gPSA5LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5 MTUvaTkxNV9kcnYuaCBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmgKaW5kZXggNjYz NGMwOS4uNzYyN2E0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYu aAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5oCkBAIC02NjAsNiArNjYwLDcg QEAgc3RydWN0IGRybV9pOTE1X2Rpc3BsYXlfZnVuY3MgewogCS8qIGRpc3BsYXkgY2xvY2sgaW5j cmVhc2UvZGVjcmVhc2UgKi8KIAkvKiBwbGwgY2xvY2sgaW5jcmVhc2UvZGVjcmVhc2UgKi8KIAor CXZvaWQgKCpsb2FkX2NzY19tYXRyaXgpKHN0cnVjdCBkcm1fY3J0YyAqY3J0Yyk7CiAJdm9pZCAo KmxvYWRfbHV0cykoc3RydWN0IGRybV9jcnRjICpjcnRjKTsKIH07CiAKQEAgLTgwOCw2ICs4MDks MTEgQEAgc3RydWN0IGludGVsX2RldmljZV9pbmZvIHsKIAl1OCBoYXNfc2xpY2VfcGc6MTsKIAl1 OCBoYXNfc3Vic2xpY2VfcGc6MTsKIAl1OCBoYXNfZXVfcGc6MTsKKworCXN0cnVjdCBjb2xvcl9s dXRzIHsKKwkJdTE2IGRlZ2FtbWFfbHV0X3NpemU7CisJCXUxNiBnYW1tYV9sdXRfc2l6ZTsKKwl9 IGNvbG9yOwogfTsKIAogI3VuZGVmIERFRklORV9GTEFHCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dw dS9kcm0vaTkxNS9pOTE1X3JlZy5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9yZWcuaApp bmRleCAzNzc0ODcwLi44Y2U3NmQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9p OTE1X3JlZy5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfcmVnLmgKQEAgLTc2NTAs NiArNzY1MCwyOCBAQCBlbnVtIHNrbF9kaXNwX3Bvd2VyX3dlbGxzIHsKICNkZWZpbmUgUElQRV9D U0NfUE9TVE9GRl9NRShwaXBlKQlfTU1JT19QSVBFKHBpcGUsIF9QSVBFX0FfQ1NDX1BPU1RPRkZf TUUsIF9QSVBFX0JfQ1NDX1BPU1RPRkZfTUUpCiAjZGVmaW5lIFBJUEVfQ1NDX1BPU1RPRkZfTE8o cGlwZSkJX01NSU9fUElQRShwaXBlLCBfUElQRV9BX0NTQ19QT1NUT0ZGX0xPLCBfUElQRV9CX0NT Q19QT1NUT0ZGX0xPKQogCisvKiBwaXBlIGRlZ2FtbWEvZ2FtbWEgTFVUcyBvbiBJVkIrICovCisj ZGVmaW5lIF9QQUxfUFJFQ19JTkRFWF9BCTB4NEE0MDAKKyNkZWZpbmUgX1BBTF9QUkVDX0lOREVY X0IJMHg0QUMwMAorI2RlZmluZSBfUEFMX1BSRUNfSU5ERVhfQwkweDRCNDAwCisjZGVmaW5lICAg UEFMX1BSRUNfMTBfMTJfQklUCQkoMCA8PCAzMSkKKyNkZWZpbmUgICBQQUxfUFJFQ19TUExJVF9N T0RFCQkoMSA8PCAzMSkKKyNkZWZpbmUgICBQQUxfUFJFQ19BVVRPX0lOQ1JFTUVOVAkoMSA8PCAx NSkKKyNkZWZpbmUgX1BBTF9QUkVDX0RBVEFfQQkweDRBNDA0CisjZGVmaW5lIF9QQUxfUFJFQ19E QVRBX0IJMHg0QUMwNAorI2RlZmluZSBfUEFMX1BSRUNfREFUQV9DCTB4NEI0MDQKKyNkZWZpbmUg X1BBTF9QUkVDX0dDX01BWF9BCTB4NEE0MTAKKyNkZWZpbmUgX1BBTF9QUkVDX0dDX01BWF9CCTB4 NEFDMTAKKyNkZWZpbmUgX1BBTF9QUkVDX0dDX01BWF9DCTB4NEI0MTAKKyNkZWZpbmUgX1BBTF9Q UkVDX0VYVF9HQ19NQVhfQQkweDRBNDIwCisjZGVmaW5lIF9QQUxfUFJFQ19FWFRfR0NfTUFYX0IJ MHg0QUMyMAorI2RlZmluZSBfUEFMX1BSRUNfRVhUX0dDX01BWF9DCTB4NEI0MjAKKworI2RlZmlu ZSBQUkVDX1BBTF9JTkRFWChwaXBlKQkJX01NSU9fUElQRShwaXBlLCBfUEFMX1BSRUNfSU5ERVhf QSwgX1BBTF9QUkVDX0lOREVYX0IpCisjZGVmaW5lIFBSRUNfUEFMX0RBVEEocGlwZSkJCV9NTUlP X1BJUEUocGlwZSwgX1BBTF9QUkVDX0RBVEFfQSwgX1BBTF9QUkVDX0RBVEFfQikKKyNkZWZpbmUg UFJFQ19QQUxfR0NfTUFYKHBpcGUsIGkpCV9NTUlPKF9QSVBFKHBpcGUsIF9QQUxfUFJFQ19HQ19N QVhfQSwgX1BBTF9QUkVDX0dDX01BWF9CKSArIChpKSAqIDQpCisjZGVmaW5lIFBSRUNfUEFMX0VY VF9HQ19NQVgocGlwZSwgaSkJX01NSU8oX1BJUEUocGlwZSwgX1BBTF9QUkVDX0VYVF9HQ19NQVhf QSwgX1BBTF9QUkVDX0VYVF9HQ19NQVhfQikgKyAoaSkgKiA0KQorCiAvKiBNSVBJIERTSSByZWdp c3RlcnMgKi8KIAogI2RlZmluZSBfTUlQSV9QT1JUKHBvcnQsIGEsIGMpCV9QT1JUMyhwb3J0LCBh LCAwLCBjKQkvKiBwb3J0cyBBIGFuZCBDIG9ubHkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1 L2RybS9pOTE1L2ludGVsX2NvbG9yLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9jb2xv ci5jCmluZGV4IGJhMjdjZTIuLmE2YzdkMjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9p OTE1L2ludGVsX2NvbG9yLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfY29sb3Iu YwpAQCAtMjQsNDQgKzI0LDE3MiBAQAogCiAjaW5jbHVkZSAiaW50ZWxfZHJ2LmgiCiAKKyNkZWZp bmUgQ1RNX0NPRUZGX1NJR04JKDFVTEwgPDwgNjMpCisKKyNkZWZpbmUgQ1RNX0NPRUZGXzFfMAko MVVMTCA8PCAzMikKKyNkZWZpbmUgQ1RNX0NPRUZGXzJfMAkoQ1RNX0NPRUZGXzFfMCA8PCAxKQor I2RlZmluZSBDVE1fQ09FRkZfNF8wCShDVE1fQ09FRkZfMl8wIDw8IDEpCisjZGVmaW5lIENUTV9D T0VGRl8wXzUJKENUTV9DT0VGRl8xXzAgPj4gMSkKKyNkZWZpbmUgQ1RNX0NPRUZGXzBfMjUJKENU TV9DT0VGRl8wXzUgPj4gMSkKKyNkZWZpbmUgQ1RNX0NPRUZGXzBfMTI1CShDVE1fQ09FRkZfMF8y NSA+PiAxKQorCisjZGVmaW5lIENUTV9DT0VGRl9MSU1JVEVEX1JBTkdFICgoMjM1VUxMIC0gMTZV TEwpICogQ1RNX0NPRUZGXzFfMCAvIDI1NSkKKworI2RlZmluZSBDVE1fQ09FRkZfTkVHQVRJVkUo Y29lZmYpCSgoKGNvZWZmKSAmIENUTV9DT0VGRl9TSUdOKSAhPSAwKQorI2RlZmluZSBDVE1fQ09F RkZfQUJTKGNvZWZmKQkJKChjb2VmZikgJiAoQ1RNX0NPRUZGX1NJR04gLSAxKSkKKworI2RlZmlu ZSBMRUdBQ1lfTFVUX0xFTkdUSAkJKHNpemVvZihzdHJ1Y3QgZHJtX2NvbG9yX2x1dCkgKiAyNTYp CisKIC8qCi0gKiBTZXQgdXAgdGhlIHBpcGUgQ1NDIHVuaXQuCisgKiBFeHRyYWN0IHRoZSBDU0Mg Y29lZmZpY2llbnQgZnJvbSBhIENUTSBjb2VmZmljaWVudCAoaW4gVTMyLjMyIGZpeGVkIHBvaW50 CisgKiBmb3JtYXQpLiBUaGlzIG1hY3JvIHRha2VzIHRoZSBjb2VmZmljaWVudCB3ZSB3YW50IHRy YW5zZm9ybWVkIGFuZCB0aGUKKyAqIG51bWJlciBvZiBmcmFjdGlvbmFsIGJpdHMuCiAgKgotICog Q3VycmVudGx5IG9ubHkgZnVsbCByYW5nZSBSR0IgdG8gbGltaXRlZCByYW5nZSBSR0IgY29udmVy c2lvbgotICogaXMgc3VwcG9ydGVkLCBidXQgZXZlbnR1YWxseSB0aGlzIHNob3VsZCBoYW5kbGUg dmFyaW91cwotICogUkdCPC0+WUNiQ3Igc2NlbmFyaW9zIGFzIHdlbGwuCisgKiBXZSBvbmx5IGhh dmUgYSA5IGJpdHMgcHJlY2lzaW9uIHdpbmRvdyB3aGljaCBzbGlkZXMgZGVwZW5kaW5nIG9uIHRo ZSB2YWx1ZQorICogb2YgdGhlIENUTSBjb2VmZmljaWVudCBhbmQgd2Ugd3JpdGUgdGhlIHZhbHVl IGZyb20gYml0IDMuIFdlIGFsc28gcm91bmQgdGhlCisgKiB2YWx1ZS4KICAqLworI2RlZmluZSBJ OVhYX0NTQ19DT0VGRl9GUChjb2VmZiwgZmJpdHMpCVwKKwkoY2xhbXBfdmFsKCgoY29lZmYpID4+ ICgzMiAtIChmYml0cykgLSAzKSkgKyA0LCAwLCAweGZmZikgJiAweGZmOCkKKworI2RlZmluZSBJ OVhYX0NTQ19DT0VGRl9MSU1JVEVEX1JBTkdFCVwKKwlJOVhYX0NTQ19DT0VGRl9GUChDVE1fQ09F RkZfTElNSVRFRF9SQU5HRSwgOSkKKyNkZWZpbmUgSTlYWF9DU0NfQ09FRkZfMV8wCQlcCisJKCg3 IDw8IDEyKSB8IEk5WFhfQ1NDX0NPRUZGX0ZQKENUTV9DT0VGRl8xXzAsIDgpKQorCitzdGF0aWMg Ym9vbCBjcnRjX3N0YXRlX2lzX2xlZ2FjeShzdHJ1Y3QgZHJtX2NydGNfc3RhdGUgKnN0YXRlKQor eworCXJldHVybiAhc3RhdGUtPmRlZ2FtbWFfbHV0ICYmCisJCSFzdGF0ZS0+Y3RtICYmCisJCXN0 YXRlLT5nYW1tYV9sdXQgJiYKKwkJc3RhdGUtPmdhbW1hX2x1dC0+bGVuZ3RoID09IExFR0FDWV9M VVRfTEVOR1RIOworfQorCisvKgorICogV2hlbiB1c2luZyBsaW1pdGVkIHJhbmdlLCBtdWx0aXBs eSB0aGUgbWF0cml4IGdpdmVuIGJ5IHVzZXJzcGFjZSBieQorICogdGhlIG1hdHJpeCB0aGF0IHdl IHdvdWxkIHVzZSBmb3IgdGhlIGxpbWl0ZWQgcmFuZ2UuIFdlIGRvIHRoZQorICogbXVsdGlwbGlj YXRpb24gaW4gVTIuMzAgZm9ybWF0LgorICovCitzdGF0aWMgdm9pZCBjdG1fbXVsdF9ieV9saW1p dGVkKHVpbnQ2NF90ICpyZXN1bHQsIGludDY0X3QgKmlucHV0KQoreworCWludCBpLCBqOworCXVp bnQ2NF90IGxpbWl0ZWRfY29lZmZzWzldID0geyBDVE1fQ09FRkZfTElNSVRFRF9SQU5HRSwgMCwg MCwKKwkJCQkgICAgICAgMCwgQ1RNX0NPRUZGX0xJTUlURURfUkFOR0UsIDAsCisJCQkJICAgICAg IDAsIDAsIENUTV9DT0VGRl9MSU1JVEVEX1JBTkdFIH07CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJS QVlfU0laRShsaW1pdGVkX2NvZWZmcyk7IGkrKykgeworCQlpbnQgY29sdW1uID0gaSAlIDMsIHJv dyA9IGkgLyAzOworCQlpbnQgbmVnYXRpdmUgPSAwOworCisJCWlucHV0W2ldID0gMDsKKwkJZm9y IChqID0gMDsgaiA8IDM7IGorKykgeworCQkJaW50NjRfdCB1c2VyX2NvZWZmID0gaW5wdXRbaiAq IDMgKyBjb2x1bW5dOworCQkJdWludDY0X3QgbGltaXRlZF9jb2VmZiA9CisJCQkJbGltaXRlZF9j b2VmZnNbcm93ICogMyArIGpdID4+IDI7CisJCQl1aW50NjRfdCBhYnNfY29lZmYgPQorCQkJCWNs YW1wX3ZhbChDVE1fQ09FRkZfQUJTKHVzZXJfY29lZmYpLAorCQkJCQkgIDAsCisJCQkJCSAgQ1RN X0NPRUZGXzRfMCAtIDEpID4+IDI7CisKKwkJCWlmIChDVE1fQ09FRkZfTkVHQVRJVkUodXNlcl9j b2VmZikpCisJCQkJbmVnYXRpdmUgPSAhbmVnYXRpdmU7CisJCQlyZXN1bHRbaV0gKz0gbGltaXRl ZF9jb2VmZiAqIGFic19jb2VmZjsKKwkJfQorCisJCXJlc3VsdFtpXSA+Pj0gMjc7CisJCWlmIChu ZWdhdGl2ZSkKKwkJCXJlc3VsdFtpXSB8PSBDVE1fQ09FRkZfU0lHTjsKKwl9Cit9CisKKy8qIFNl dCB1cCB0aGUgcGlwZSBDU0MgdW5pdC4gKi8KIHN0YXRpYyB2b2lkIGk5eHhfbG9hZF9jc2NfbWF0 cml4KHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0g Y3J0Yy0+ZGV2OworCXN0cnVjdCBkcm1fY3J0Y19zdGF0ZSAqY3J0Y19zdGF0ZSA9IGNydGMtPnN0 YXRlOwogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZh dGU7CiAJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGNydGMp OwotCWludCBwaXBlID0gaW50ZWxfY3J0Yy0+cGlwZTsKLQl1aW50MTZfdCBjb2VmZiA9IDB4Nzgw MDsgLyogMS4wICovCisJaW50IGksIHBpcGUgPSBpbnRlbF9jcnRjLT5waXBlOworCXVpbnQxNl90 IGNvZWZmc1s5XSA9IHsgMCwgfTsKIAotCS8qCi0JICogVE9ETzogQ2hlY2sgd2hhdCBraW5kIG9m IHZhbHVlcyBhY3R1YWxseSBjb21lIG91dCBvZiB0aGUgcGlwZQotCSAqIHdpdGggdGhlc2UgY29l ZmYvcG9zdG9mZiB2YWx1ZXMgYW5kIGFkanVzdCB0byBnZXQgdGhlIGJlc3QKLQkgKiBhY2N1cmFj eS4gUGVyaGFwcyB3ZSBldmVuIG5lZWQgdG8gdGFrZSB0aGUgYnBjIHZhbHVlIGludG8KLQkgKiBj b25zaWRlcmF0aW9uLgotCSAqLworCWlmIChjcnRjX3N0YXRlLT5jdG0pIHsKKwkJc3RydWN0IGRy bV9jb2xvcl9jdG0gKmN0bSA9CisJCQkoc3RydWN0IGRybV9jb2xvcl9jdG0gKiljcnRjX3N0YXRl LT5jdG0tPmRhdGE7CisJCXVpbnQ2NF90IGlucHV0WzldID0geyAwLCB9OwogCi0JaWYgKGludGVs X2NydGMtPmNvbmZpZy0+bGltaXRlZF9jb2xvcl9yYW5nZSkKLQkJY29lZmYgPSAoKDIzNSAtIDE2 KSAqICgxIDw8IDEyKSAvIDI1NSkgJiAweGZmODsgLyogMC54eHguLi4gKi8KKwkJaWYgKGludGVs X2NydGMtPmNvbmZpZy0+bGltaXRlZF9jb2xvcl9yYW5nZSkKKwkJCWN0bV9tdWx0X2J5X2xpbWl0 ZWQoaW5wdXQsIGN0bS0+bWF0cml4KTsKKwkJZWxzZSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgQVJS QVlfU0laRShpbnB1dCk7IGkrKykKKwkJCQlpbnB1dFtpXSA9IGN0bS0+bWF0cml4W2ldOworCQl9 CisKKwkJLyoKKwkJICogQ29udmVydCBmaXhlZCBwb2ludCBTMzEuMzIgaW5wdXQgdG8gZm9ybWF0 IHN1cHBvcnRlZCBieSB0aGUKKwkJICogaGFyZHdhcmUuCisJCSAqLworCQlmb3IgKGkgPSAwOyBp IDwgQVJSQVlfU0laRShjb2VmZnMpOyBpKyspIHsKKwkJCXVpbnQ2NF90IGFic19jb2VmZiA9ICgo MVVMTCA8PCA2MykgLSAxKSAmIGlucHV0W2ldOworCisJCQkvKgorCQkJICogQ2xhbXAgaW5wdXQg dmFsdWUgdG8gbWluL21heCBzdXBwb3J0ZWQgYnkKKwkJCSAqIGhhcmR3YXJlLgorCQkJICovCisJ CQlhYnNfY29lZmYgPSBjbGFtcF92YWwoYWJzX2NvZWZmLCAwLCBDVE1fQ09FRkZfNF8wIC0gMSk7 CisKKwkJCS8qIHNpZ24gYml0ICovCisJCQlpZiAoQ1RNX0NPRUZGX05FR0FUSVZFKGlucHV0W2ld KSkKKwkJCQljb2VmZnNbaV0gfD0gMSA8PCAxNTsKKworCQkJaWYgKGFic19jb2VmZiA8IENUTV9D T0VGRl8wXzEyNSkKKwkJCQljb2VmZnNbaV0gfD0gKDMgPDwgMTIpIHwKKwkJCQkJSTlYWF9DU0Nf Q09FRkZfRlAoYWJzX2NvZWZmLCAxMik7CisJCQllbHNlIGlmIChhYnNfY29lZmYgPCBDVE1fQ09F RkZfMF8yNSkKKwkJCQljb2VmZnNbaV0gfD0gKDIgPDwgMTIpIHwKKwkJCQkJSTlYWF9DU0NfQ09F RkZfRlAoYWJzX2NvZWZmLCAxMSk7CisJCQllbHNlIGlmIChhYnNfY29lZmYgPCBDVE1fQ09FRkZf MF81KQorCQkJCWNvZWZmc1tpXSB8PSAoMSA8PCAxMikgfAorCQkJCQlJOVhYX0NTQ19DT0VGRl9G UChhYnNfY29lZmYsIDEwKTsKKwkJCWVsc2UgaWYgKGFic19jb2VmZiA8IENUTV9DT0VGRl8xXzAp CisJCQkJY29lZmZzW2ldIHw9IEk5WFhfQ1NDX0NPRUZGX0ZQKGFic19jb2VmZiwgOSk7CisJCQll bHNlIGlmIChhYnNfY29lZmYgPCBDVE1fQ09FRkZfMl8wKQorCQkJCWNvZWZmc1tpXSB8PSAoNyA8 PCAxMikgfAorCQkJCQlJOVhYX0NTQ19DT0VGRl9GUChhYnNfY29lZmYsIDgpOworCQkJZWxzZQor CQkJCWNvZWZmc1tpXSB8PSAoNiA8PCAxMikgfAorCQkJCQlJOVhYX0NTQ19DT0VGRl9GUChhYnNf Y29lZmYsIDcpOworCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICogTG9hZCBhbiBpZGVudGlmeSBt YXRyaXggaWYgbm8gY29lZmZpY2llbnRzIGFyZSBwcm92aWRlZC4KKwkJICoKKwkJICogVE9ETzog Q2hlY2sgd2hhdCBraW5kIG9mIHZhbHVlcyBhY3R1YWxseSBjb21lIG91dCBvZiB0aGUKKwkJICog cGlwZSB3aXRoIHRoZXNlIGNvZWZmL3Bvc3RvZmYgdmFsdWVzIGFuZCBhZGp1c3QgdG8gZ2V0IHRo ZQorCQkgKiBiZXN0IGFjY3VyYWN5LiBQZXJoYXBzIHdlIGV2ZW4gbmVlZCB0byB0YWtlIHRoZSBi cGMgdmFsdWUKKwkJICogaW50byBjb25zaWRlcmF0aW9uLgorCQkgKi8KKwkJZm9yIChpID0gMDsg aSA8IDM7IGkrKykgeworCQkJaWYgKGludGVsX2NydGMtPmNvbmZpZy0+bGltaXRlZF9jb2xvcl9y YW5nZSkKKwkJCQljb2VmZnNbaSAqIDMgKyBpXSA9CisJCQkJCUk5WFhfQ1NDX0NPRUZGX0xJTUlU RURfUkFOR0U7CisJCQllbHNlCisJCQkJY29lZmZzW2kgKiAzICsgaV0gPSBJOVhYX0NTQ19DT0VG Rl8xXzA7CisJCX0KKwl9CiAKIAkvKgogCSAqIEdZL0dVIGFuZCBSWS9SVSBzaG91bGQgYmUgdGhl IG90aGVyIHdheSBhcm91bmQgYWNjb3JkaW5nCiAJICogdG8gQlNwZWMsIGJ1dCByZWFsaXR5IGRv ZXNuJ3QgYWdyZWUuIEp1c3Qgc2V0IHRoZW0gdXAgaW4KIAkgKiBhIHdheSB0aGF0IHJlc3VsdHMg aW4gdGhlIGNvcnJlY3QgcGljdHVyZS4KIAkgKi8KLQlJOTE1X1dSSVRFKFBJUEVfQ1NDX0NPRUZG X1JZX0dZKHBpcGUpLCBjb2VmZiA8PCAxNik7Ci0JSTkxNV9XUklURShQSVBFX0NTQ19DT0VGRl9C WShwaXBlKSwgMCk7CisJSTkxNV9XUklURShQSVBFX0NTQ19DT0VGRl9SWV9HWShwaXBlKSwgY29l ZmZzWzBdIDw8IDE2IHwgY29lZmZzWzFdKTsKKwlJOTE1X1dSSVRFKFBJUEVfQ1NDX0NPRUZGX0JZ KHBpcGUpLCBjb2VmZnNbMl0gPDwgMTYpOwogCi0JSTkxNV9XUklURShQSVBFX0NTQ19DT0VGRl9S VV9HVShwaXBlKSwgY29lZmYpOwotCUk5MTVfV1JJVEUoUElQRV9DU0NfQ09FRkZfQlUocGlwZSks IDApOworCUk5MTVfV1JJVEUoUElQRV9DU0NfQ09FRkZfUlVfR1UocGlwZSksIGNvZWZmc1szXSA8 PCAxNiB8IGNvZWZmc1s0XSk7CisJSTkxNV9XUklURShQSVBFX0NTQ19DT0VGRl9CVShwaXBlKSwg Y29lZmZzWzVdIDw8IDE2KTsKIAotCUk5MTVfV1JJVEUoUElQRV9DU0NfQ09FRkZfUlZfR1YocGlw ZSksIDApOwotCUk5MTVfV1JJVEUoUElQRV9DU0NfQ09FRkZfQlYocGlwZSksIGNvZWZmIDw8IDE2 KTsKKwlJOTE1X1dSSVRFKFBJUEVfQ1NDX0NPRUZGX1JWX0dWKHBpcGUpLCBjb2VmZnNbNl0gPDwg MTYgfCBjb2VmZnNbN10pOworCUk5MTVfV1JJVEUoUElQRV9DU0NfQ09FRkZfQlYocGlwZSksIGNv ZWZmc1s4XSA8PCAxNik7CiAKIAlJOTE1X1dSSVRFKFBJUEVfQ1NDX1BSRU9GRl9ISShwaXBlKSwg MCk7CiAJSTkxNV9XUklURShQSVBFX0NTQ19QUkVPRkZfTUUocGlwZSksIDApOwpAQCAtOTAsMTMg KzIxOCwxOCBAQCBzdGF0aWMgdm9pZCBpOXh4X2xvYWRfY3NjX21hdHJpeChzdHJ1Y3QgZHJtX2Ny dGMgKmNydGMpCiAKIHZvaWQgaW50ZWxfY29sb3Jfc2V0X2NzYyhzdHJ1Y3QgZHJtX2NydGMgKmNy dGMpCiB7Ci0JaTl4eF9sb2FkX2NzY19tYXRyaXgoY3J0Yyk7CisJc3RydWN0IGRybV9kZXZpY2Ug KmRldiA9IGNydGMtPmRldjsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBk ZXYtPmRldl9wcml2YXRlOworCisJaWYgKGRldl9wcml2LT5kaXNwbGF5LmxvYWRfY3NjX21hdHJp eCkKKwkJZGV2X3ByaXYtPmRpc3BsYXkubG9hZF9jc2NfbWF0cml4KGNydGMpOwogfQogCi0vKiBM b2FkcyB0aGUgcGFsZXR0ZS9nYW1tYSB1bml0IGZvciB0aGUgQ1JUQyB3aXRoIHRoZSBwcmVwYXJl ZCB2YWx1ZXMuICovCisvKiBMb2FkcyB0aGUgbGVnYWN5IHBhbGV0dGUvZ2FtbWEgdW5pdCBmb3Ig dGhlIENSVEMuICovCiBzdGF0aWMgdm9pZCBpOXh4X2xvYWRfbHV0cyhzdHJ1Y3QgZHJtX2NydGMg KmNydGMpCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKKwlzdHJ1Y3Qg ZHJtX2NydGNfc3RhdGUgKnN0YXRlID0gY3J0Yy0+c3RhdGU7CiAJc3RydWN0IGRybV9pOTE1X3By aXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgaW50ZWxfY3J0YyAq aW50ZWxfY3J0YyA9IHRvX2ludGVsX2NydGMoY3J0Yyk7CiAJZW51bSBwaXBlIHBpcGUgPSBpbnRl bF9jcnRjLT5waXBlOwpAQCAtMTA5LDE4ICsyNDIsMzMgQEAgc3RhdGljIHZvaWQgaTl4eF9sb2Fk X2x1dHMoc3RydWN0IGRybV9jcnRjICpjcnRjKQogCQkJYXNzZXJ0X3BsbF9lbmFibGVkKGRldl9w cml2LCBwaXBlKTsKIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKLQkJdWludDMy X3Qgd29yZCA9IChpbnRlbF9jcnRjLT5sdXRfcltpXSA8PCAxNikgfAotCQkJKGludGVsX2NydGMt Pmx1dF9nW2ldIDw8IDgpIHwKLQkJCWludGVsX2NydGMtPmx1dF9iW2ldOwotCQlpZiAoSEFTX0dN Q0hfRElTUExBWShkZXYpKQotCQkJSTkxNV9XUklURShQQUxFVFRFKHBpcGUsIGkpLCB3b3JkKTsK LQkJZWxzZQotCQkJSTkxNV9XUklURShMR0NfUEFMRVRURShwaXBlLCBpKSwgd29yZCk7CisJaWYg KHN0YXRlLT5nYW1tYV9sdXQpIHsKKwkJc3RydWN0IGRybV9jb2xvcl9sdXQgKmx1dCA9CisJCQko c3RydWN0IGRybV9jb2xvcl9sdXQgKikgc3RhdGUtPmdhbW1hX2x1dC0+ZGF0YTsKKwkJZm9yIChp ID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCQl1aW50MzJfdCB3b3JkID0KKwkJCQkoZHJtX2NvbG9y X2x1dF9leHRyYWN0KGx1dFtpXS5yZWQsIDgpIDw8IDE2KSB8CisJCQkJKGRybV9jb2xvcl9sdXRf ZXh0cmFjdChsdXRbaV0uZ3JlZW4sIDgpIDw8IDgpIHwKKwkJCQlkcm1fY29sb3JfbHV0X2V4dHJh Y3QobHV0W2ldLmJsdWUsIDgpOworCisJCQlpZiAoSEFTX0dNQ0hfRElTUExBWShkZXYpKQorCQkJ CUk5MTVfV1JJVEUoUEFMRVRURShwaXBlLCBpKSwgd29yZCk7CisJCQllbHNlCisJCQkJSTkxNV9X UklURShMR0NfUEFMRVRURShwaXBlLCBpKSwgd29yZCk7CisJCX0KKwl9IGVsc2UgeworCQlmb3Ig KGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKwkJCXVpbnQzMl90IHdvcmQgPSAoaSA8PCAxNikgfCAo aSA8PCA4KSB8IGk7CisKKwkJCWlmIChIQVNfR01DSF9ESVNQTEFZKGRldikpCisJCQkJSTkxNV9X UklURShQQUxFVFRFKHBpcGUsIGkpLCB3b3JkKTsKKwkJCWVsc2UKKwkJCQlJOTE1X1dSSVRFKExH Q19QQUxFVFRFKHBpcGUsIGkpLCB3b3JkKTsKKwkJfQogCX0KIH0KIAotLyogTG9hZHMgdGhlIGxl Z2FjeSBwYWxldHRlL2dhbW1hIHVuaXQgZm9yIHRoZSBDUlRDIG9uIEhhc3dlbGwrLiAqLworLyog TG9hZHMgdGhlIGxlZ2FjeSBwYWxldHRlL2dhbW1hIHVuaXQgZm9yIHRoZSBDUlRDIG9uIEhhc3dl bGwuICovCiBzdGF0aWMgdm9pZCBoYXN3ZWxsX2xvYWRfbHV0cyhzdHJ1Y3QgZHJtX2NydGMgKmNy dGMpCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKQEAgLTE0OSw2ICsy OTcsODkgQEAgc3RhdGljIHZvaWQgaGFzd2VsbF9sb2FkX2x1dHMoc3RydWN0IGRybV9jcnRjICpj cnRjKQogCQloc3dfZW5hYmxlX2lwcyhpbnRlbF9jcnRjKTsKIH0KIAorLyogTG9hZHMgdGhlIHBh bGV0dGUvZ2FtbWEgdW5pdCBmb3IgdGhlIENSVEMgb24gQnJvYWR3ZWxsKy4gKi8KK3N0YXRpYyB2 b2lkIGJyb2Fkd2VsbF9sb2FkX2x1dHMoc3RydWN0IGRybV9jcnRjICpjcnRjKQoreworCXN0cnVj dCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7CisJc3RydWN0IGRybV9jcnRjX3N0YXRlICpz dGF0ZSA9IGNydGMtPnN0YXRlOworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9 IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGludGVsX2NydGNfc3RhdGUgKmludGVsX3N0YXRl ID0gdG9faW50ZWxfY3J0Y19zdGF0ZShzdGF0ZSk7CisJZW51bSBwaXBlIHBpcGUgPSB0b19pbnRl bF9jcnRjKGNydGMpLT5waXBlOworCXVpbnQzMl90IGksIGx1dF9zaXplID0gSU5URUxfSU5GTyhk ZXYpLT5jb2xvci5kZWdhbW1hX2x1dF9zaXplOworCisJaWYgKGNydGNfc3RhdGVfaXNfbGVnYWN5 KHN0YXRlKSkgeworCQloYXN3ZWxsX2xvYWRfbHV0cyhjcnRjKTsKKwkJcmV0dXJuOworCX0KKwor CUk5MTVfV1JJVEUoUFJFQ19QQUxfSU5ERVgocGlwZSksCisJCSAgIFBBTF9QUkVDX1NQTElUX01P REUgfCBQQUxfUFJFQ19BVVRPX0lOQ1JFTUVOVCk7CisKKwlpZiAoc3RhdGUtPmRlZ2FtbWFfbHV0 KSB7CisJCXN0cnVjdCBkcm1fY29sb3JfbHV0ICpsdXQgPQorCQkJKHN0cnVjdCBkcm1fY29sb3Jf bHV0ICopIHN0YXRlLT5kZWdhbW1hX2x1dC0+ZGF0YTsKKworCQlmb3IgKGkgPSAwOyBpIDwgbHV0 X3NpemU7IGkrKykgeworCQkJdWludDMyX3Qgd29yZCA9CisJCQlkcm1fY29sb3JfbHV0X2V4dHJh Y3QobHV0W2ldLnJlZCwgMTApIDw8IDIwIHwKKwkJCWRybV9jb2xvcl9sdXRfZXh0cmFjdChsdXRb aV0uZ3JlZW4sIDEwKSA8PCAxMCB8CisJCQlkcm1fY29sb3JfbHV0X2V4dHJhY3QobHV0W2ldLmJs dWUsIDEwKTsKKworCQkJSTkxNV9XUklURShQUkVDX1BBTF9EQVRBKHBpcGUpLCB3b3JkKTsKKwkJ fQorCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCBsdXRfc2l6ZTsgaSsrKSB7CisJCQl1aW50 MzJfdCB2ID0gKGkgKiAoKDEgPDwgMTApIC0gMSkpIC8gKGx1dF9zaXplIC0gMSk7CisKKwkJCUk5 MTVfV1JJVEUoUFJFQ19QQUxfREFUQShwaXBlKSwKKwkJCQkgICAodiA8PCAyMCkgfCAodiA8PCAx MCkgfCB2KTsKKwkJfQorCX0KKworCWlmIChzdGF0ZS0+Z2FtbWFfbHV0KSB7CisJCXN0cnVjdCBk cm1fY29sb3JfbHV0ICpsdXQgPQorCQkJKHN0cnVjdCBkcm1fY29sb3JfbHV0ICopIHN0YXRlLT5n YW1tYV9sdXQtPmRhdGE7CisKKwkJZm9yIChpID0gMDsgaSA8IGx1dF9zaXplOyBpKyspIHsKKwkJ CXVpbnQzMl90IHdvcmQgPQorCQkJKGRybV9jb2xvcl9sdXRfZXh0cmFjdChsdXRbaV0ucmVkLCAx MCkgPDwgMjApIHwKKwkJCShkcm1fY29sb3JfbHV0X2V4dHJhY3QobHV0W2ldLmdyZWVuLCAxMCkg PDwgMTApIHwKKwkJCWRybV9jb2xvcl9sdXRfZXh0cmFjdChsdXRbaV0uYmx1ZSwgMTApOworCisJ CQlJOTE1X1dSSVRFKFBSRUNfUEFMX0RBVEEocGlwZSksIHdvcmQpOworCQl9CisKKwkJLyogUHJv Z3JhbSB0aGUgbWF4IHJlZ2lzdGVyIHRvIGNsYW1wIHZhbHVlcyA+IDEuMC4gKi8KKwkJSTkxNV9X UklURShQUkVDX1BBTF9HQ19NQVgocGlwZSwgMCksCisJCQkgICBkcm1fY29sb3JfbHV0X2V4dHJh Y3QobHV0W2ldLnJlZCwgMTYpKTsKKwkJSTkxNV9XUklURShQUkVDX1BBTF9HQ19NQVgocGlwZSwg MSksCisJCQkgICBkcm1fY29sb3JfbHV0X2V4dHJhY3QobHV0W2ldLmdyZWVuLCAxNikpOworCQlJ OTE1X1dSSVRFKFBSRUNfUEFMX0dDX01BWChwaXBlLCAyKSwKKwkJCSAgIGRybV9jb2xvcl9sdXRf ZXh0cmFjdChsdXRbaV0uYmx1ZSwgMTYpKTsKKwl9IGVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwg bHV0X3NpemU7IGkrKykgeworCQkJdWludDMyX3QgdiA9IChpICogKCgxIDw8IDEwKSAtIDEpKSAv IChsdXRfc2l6ZSAtIDEpOworCisJCQlJOTE1X1dSSVRFKFBSRUNfUEFMX0RBVEEocGlwZSksCisJ CQkJICAgKHYgPDwgMjApIHwgKHYgPDwgMTApIHwgdik7CisJCX0KKworCQlJOTE1X1dSSVRFKFBS RUNfUEFMX0dDX01BWChwaXBlLCAwKSwgKDEgPDwgMTYpIC0gMSk7CisJCUk5MTVfV1JJVEUoUFJF Q19QQUxfR0NfTUFYKHBpcGUsIDEpLCAoMSA8PCAxNikgLSAxKTsKKwkJSTkxNV9XUklURShQUkVD X1BBTF9HQ19NQVgocGlwZSwgMiksICgxIDw8IDE2KSAtIDEpOworCX0KKworCWludGVsX3N0YXRl LT5nYW1tYV9tb2RlID0gR0FNTUFfTU9ERV9NT0RFX1NQTElUOworCUk5MTVfV1JJVEUoR0FNTUFf TU9ERShwaXBlKSwgR0FNTUFfTU9ERV9NT0RFX1NQTElUKTsKKwlQT1NUSU5HX1JFQUQoR0FNTUFf TU9ERShwaXBlKSk7CisKKwkvKgorCSAqIFJlc2V0IHRoZSBpbmRleCwgb3RoZXJ3aXNlIGl0IHBy ZXZlbnRzIHRoZSBsZWdhY3kgcGFsZXR0ZSB0byBiZQorCSAqIHdyaXR0ZW4gcHJvcGVybHkuCisJ ICovCisJSTkxNV9XUklURShQUkVDX1BBTF9JTkRFWChwaXBlKSwgMCk7Cit9CisKIHZvaWQgaW50 ZWxfY29sb3JfbG9hZF9sdXRzKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKIHsKIAlzdHJ1Y3QgZHJt X2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OwpAQCAtMTYxLDM4ICszOTIsNjEgQEAgdm9pZCBpbnRl bF9jb2xvcl9sb2FkX2x1dHMoc3RydWN0IGRybV9jcnRjICpjcnRjKQogCWRldl9wcml2LT5kaXNw bGF5LmxvYWRfbHV0cyhjcnRjKTsKIH0KIAotdm9pZCBpbnRlbF9jb2xvcl9sZWdhY3lfZ2FtbWFf c2V0KHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgdTE2ICpyZWQsIHUxNiAqZ3JlZW4sCi0JCQkJICB1 MTYgKmJsdWUsIHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBzaXplKQoraW50IGludGVsX2NvbG9y X2NoZWNrKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKKwkJICAgICAgc3RydWN0IGRybV9jcnRjX3N0 YXRlICpjcnRjX3N0YXRlKQogewotCWludCBlbmQgPSAoc3RhcnQgKyBzaXplID4gMjU2KSA/IDI1 NiA6IHN0YXJ0ICsgc2l6ZSwgaTsKLQlzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YyA9IHRv X2ludGVsX2NydGMoY3J0Yyk7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsK KwlzaXplX3QgZ2FtbWFfbGVuZ3RoLCBkZWdhbW1hX2xlbmd0aDsKIAotCWZvciAoaSA9IHN0YXJ0 OyBpIDwgZW5kOyBpKyspIHsKLQkJaW50ZWxfY3J0Yy0+bHV0X3JbaV0gPSByZWRbaV0gPj4gODsK LQkJaW50ZWxfY3J0Yy0+bHV0X2dbaV0gPSBncmVlbltpXSA+PiA4OwotCQlpbnRlbF9jcnRjLT5s dXRfYltpXSA9IGJsdWVbaV0gPj4gODsKLQl9CisJZGVnYW1tYV9sZW5ndGggPSBJTlRFTF9JTkZP KGRldiktPmNvbG9yLmRlZ2FtbWFfbHV0X3NpemUgKgorCQlzaXplb2Yoc3RydWN0IGRybV9jb2xv cl9sdXQpOworCWdhbW1hX2xlbmd0aCA9IElOVEVMX0lORk8oZGV2KS0+Y29sb3IuZ2FtbWFfbHV0 X3NpemUgKgorCQlzaXplb2Yoc3RydWN0IGRybV9jb2xvcl9sdXQpOworCisJLyoKKwkgKiBXZSBh bGxvdyBib3RoIGRlZ2FtbWEgJiBnYW1tYSBsdXRzIGF0IHRoZSByaWdodCBzaXplIG9yCisJICog TlVMTC4KKwkgKi8KKwlpZiAoKCFjcnRjX3N0YXRlLT5kZWdhbW1hX2x1dCB8fAorCSAgICAgY3J0 Y19zdGF0ZS0+ZGVnYW1tYV9sdXQtPmxlbmd0aCA9PSBkZWdhbW1hX2xlbmd0aCkgJiYKKwkgICAg KCFjcnRjX3N0YXRlLT5nYW1tYV9sdXQgfHwKKwkgICAgIGNydGNfc3RhdGUtPmdhbW1hX2x1dC0+ bGVuZ3RoID09IGdhbW1hX2xlbmd0aCkpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBXZSBhbHNv IGFsbG93IG5vIGRlZ2FtbWEgbHV0IGFuZCBhIGdhbW1hIGx1dCBhdCB0aGUgbGVnYWN5CisJICog c2l6ZSAoMjU2IGVudHJpZXMpLgorCSAqLworCWlmICghY3J0Y19zdGF0ZS0+ZGVnYW1tYV9sdXQg JiYKKwkgICAgY3J0Y19zdGF0ZS0+Z2FtbWFfbHV0ICYmCisJICAgIGNydGNfc3RhdGUtPmdhbW1h X2x1dC0+bGVuZ3RoID09IExFR0FDWV9MVVRfTEVOR1RIKQorCQlyZXR1cm4gMDsKIAotCWludGVs X2NvbG9yX2xvYWRfbHV0cyhjcnRjKTsKKwlyZXR1cm4gLUVJTlZBTDsKIH0KIAogdm9pZCBpbnRl bF9jb2xvcl9pbml0KHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKIHsKIAlzdHJ1Y3QgZHJtX2Rldmlj ZSAqZGV2ID0gY3J0Yy0+ZGV2OwogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9 IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19p bnRlbF9jcnRjKGNydGMpOwotCWludCBpOwogCiAJZHJtX21vZGVfY3J0Y19zZXRfZ2FtbWFfc2l6 ZShjcnRjLCAyNTYpOwotCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgewotCQlpbnRlbF9jcnRj LT5sdXRfcltpXSA9IGk7Ci0JCWludGVsX2NydGMtPmx1dF9nW2ldID0gaTsKLQkJaW50ZWxfY3J0 Yy0+bHV0X2JbaV0gPSBpOwotCX0KIAotCWlmIChJU19IQVNXRUxMKGRldikgfHwKLQkgICAgKElO VEVMX0lORk8oZGV2KS0+Z2VuID49IDggJiYgIUlTX0NIRVJSWVZJRVcoZGV2KSkpCisJaWYgKElT X0hBU1dFTEwoZGV2KSkgeworCQlkZXZfcHJpdi0+ZGlzcGxheS5sb2FkX2NzY19tYXRyaXggPSBp OXh4X2xvYWRfY3NjX21hdHJpeDsKIAkJZGV2X3ByaXYtPmRpc3BsYXkubG9hZF9sdXRzID0gaGFz d2VsbF9sb2FkX2x1dHM7Ci0JZWxzZQorCX0gZWxzZSBpZiAoSVNfQlJPQURXRUxMKGRldikgfHwg SVNfU0tZTEFLRShkZXYpIHx8CisJCSAgIElTX0JST1hUT04oZGV2KSB8fCBJU19LQUJZTEFLRShk ZXYpKSB7CisJCWRldl9wcml2LT5kaXNwbGF5LmxvYWRfY3NjX21hdHJpeCA9IGk5eHhfbG9hZF9j c2NfbWF0cml4OworCQlkZXZfcHJpdi0+ZGlzcGxheS5sb2FkX2x1dHMgPSBicm9hZHdlbGxfbG9h ZF9sdXRzOworCX0gZWxzZSB7CiAJCWRldl9wcml2LT5kaXNwbGF5LmxvYWRfbHV0cyA9IGk5eHhf bG9hZF9sdXRzOworCX0KKworCS8qIEVuYWJsZSBjb2xvciBtYW5hZ2VtZW50IHN1cHBvcnQgd2hl biB3ZSBoYXZlIGRlZ2FtbWEgJiBnYW1tYSBMVVRzLiAqLworCWlmIChJTlRFTF9JTkZPKGRldikt PmNvbG9yLmRlZ2FtbWFfbHV0X3NpemUgIT0gMCAmJgorCSAgICBJTlRFTF9JTkZPKGRldiktPmNv bG9yLmdhbW1hX2x1dF9zaXplICE9IDApCisJCWRybV9oZWxwZXJfY3J0Y19lbmFibGVfY29sb3Jf bWdtdChjcnRjLAorCQkJCQlJTlRFTF9JTkZPKGRldiktPmNvbG9yLmRlZ2FtbWFfbHV0X3NpemUs CisJCQkJCUlOVEVMX0lORk8oZGV2KS0+Y29sb3IuZ2FtbWFfbHV0X3NpemUpOwogfQpkaWZmIC0t Z2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZGlzcGxheS5jIGIvZHJpdmVycy9ncHUv ZHJtL2k5MTUvaW50ZWxfZGlzcGxheS5jCmluZGV4IGFjYmIxZDkuLjFhYWZlMDAgMTAwNjQ0Ci0t LSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rpc3BsYXkuYworKysgYi9kcml2ZXJzL2dw dS9kcm0vaTkxNS9pbnRlbF9kaXNwbGF5LmMKQEAgLTExODQ2LDYgKzExODQ2LDEyIEBAIHN0YXRp YyBpbnQgaW50ZWxfY3J0Y19hdG9taWNfY2hlY2soc3RydWN0IGRybV9jcnRjICpjcnRjLAogCQkJ cmV0dXJuIHJldDsKIAl9CiAKKwlpZiAoY3J0Y19zdGF0ZS0+Y29sb3JfbWdtdF9jaGFuZ2VkKSB7 CisJCXJldCA9IGludGVsX2NvbG9yX2NoZWNrKGNydGMsIGNydGNfc3RhdGUpOworCQlpZiAocmV0 KQorCQkJcmV0dXJuIHJldDsKKwl9CisKIAlyZXQgPSAwOwogCWlmIChkZXZfcHJpdi0+ZGlzcGxh eS5jb21wdXRlX3BpcGVfd20pIHsKIAkJcmV0ID0gZGV2X3ByaXYtPmRpc3BsYXkuY29tcHV0ZV9w aXBlX3dtKGludGVsX2NydGMsIHN0YXRlKTsKQEAgLTExODY3LDcgKzExODczLDYgQEAgc3RhdGlj IGludCBpbnRlbF9jcnRjX2F0b21pY19jaGVjayhzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCiAKIHN0 YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2NydGNfaGVscGVyX2Z1bmNzIGludGVsX2hlbHBlcl9mdW5j cyA9IHsKIAkubW9kZV9zZXRfYmFzZV9hdG9taWMgPSBpbnRlbF9waXBlX3NldF9iYXNlX2F0b21p YywKLQkubG9hZF9sdXQgPSBpbnRlbF9jb2xvcl9sb2FkX2x1dHMsCiAJLmF0b21pY19iZWdpbiA9 IGludGVsX2JlZ2luX2NydGNfY29tbWl0LAogCS5hdG9taWNfZmx1c2ggPSBpbnRlbF9maW5pc2hf Y3J0Y19jb21taXQsCiAJLmF0b21pY19jaGVjayA9IGludGVsX2NydGNfYXRvbWljX2NoZWNrLApA QCAtMTMzOTgsNiArMTM0MDMsMTggQEAgc3RhdGljIGludCBpbnRlbF9hdG9taWNfY29tbWl0KHN0 cnVjdCBkcm1fZGV2aWNlICpkZXYsCiAJCQlod19jaGVjayA9IHRydWU7CiAJCX0KIAorCQlpZiAo IW1vZGVzZXQgJiYKKwkJICAgIGNydGMtPnN0YXRlLT5hY3RpdmUgJiYKKwkJICAgIGNydGMtPnN0 YXRlLT5jb2xvcl9tZ210X2NoYW5nZWQpIHsKKwkJCS8qCisJCQkgKiBPbmx5IHVwZGF0ZSBjb2xv ciBtYW5hZ2VtZW50IHdoZW4gbm90IGRvaW5nCisJCQkgKiBhIG1vZGVzZXQgYXMgdGhpcyB3aWxs IGJlIGRvbmUgYnkKKwkJCSAqIGNydGNfZW5hYmxlIGFscmVhZHkuCisJCQkgKi8KKwkJCWludGVs X2NvbG9yX3NldF9jc2MoY3J0Yyk7CisJCQlpbnRlbF9jb2xvcl9sb2FkX2x1dHMoY3J0Yyk7CisJ CX0KKwogCQlpZiAoIW1vZGVzZXQpCiAJCQlpbnRlbF9wcmVfcGxhbmVfdXBkYXRlKHRvX2ludGVs X2NydGNfc3RhdGUoY3J0Y19zdGF0ZSkpOwogCkBAIC0xMzQ4Nyw4ICsxMzUwNCw5IEBAIG91dDoK ICN1bmRlZiBmb3JfZWFjaF9pbnRlbF9jcnRjX21hc2tlZAogCiBzdGF0aWMgY29uc3Qgc3RydWN0 IGRybV9jcnRjX2Z1bmNzIGludGVsX2NydGNfZnVuY3MgPSB7Ci0JLmdhbW1hX3NldCA9IGludGVs X2NvbG9yX2xlZ2FjeV9nYW1tYV9zZXQsCisJLmdhbW1hX3NldCA9IGRybV9hdG9taWNfaGVscGVy X2xlZ2FjeV9nYW1tYV9zZXQsCiAJLnNldF9jb25maWcgPSBkcm1fYXRvbWljX2hlbHBlcl9zZXRf Y29uZmlnLAorCS5zZXRfcHJvcGVydHkgPSBkcm1fYXRvbWljX2hlbHBlcl9jcnRjX3NldF9wcm9w ZXJ0eSwKIAkuZGVzdHJveSA9IGludGVsX2NydGNfZGVzdHJveSwKIAkucGFnZV9mbGlwID0gaW50 ZWxfY3J0Y19wYWdlX2ZsaXAsCiAJLmF0b21pY19kdXBsaWNhdGVfc3RhdGUgPSBpbnRlbF9jcnRj X2R1cGxpY2F0ZV9zdGF0ZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVs X2Rydi5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHJ2LmgKaW5kZXggOTc0MmQ1Yi4u MzA4MmRiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHJ2LmgKKysr IGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHJ2LmgKQEAgLTE2MjQsOSArMTYyNCw4IEBA IGV4dGVybiBjb25zdCBzdHJ1Y3QgZHJtX3BsYW5lX2hlbHBlcl9mdW5jcyBpbnRlbF9wbGFuZV9o ZWxwZXJfZnVuY3M7CiAKIC8qIGludGVsX2NvbG9yLmMgKi8KIHZvaWQgaW50ZWxfY29sb3JfaW5p dChzdHJ1Y3QgZHJtX2NydGMgKmNydGMpOworaW50IGludGVsX2NvbG9yX2NoZWNrKHN0cnVjdCBk cm1fY3J0YyAqY3J0Yywgc3RydWN0IGRybV9jcnRjX3N0YXRlICpzdGF0ZSk7CiB2b2lkIGludGVs X2NvbG9yX3NldF9jc2Moc3RydWN0IGRybV9jcnRjICpjcnRjKTsKIHZvaWQgaW50ZWxfY29sb3Jf bG9hZF9sdXRzKHN0cnVjdCBkcm1fY3J0YyAqY3J0Yyk7Ci12b2lkIGludGVsX2NvbG9yX2xlZ2Fj eV9nYW1tYV9zZXQoc3RydWN0IGRybV9jcnRjICpjcnRjLCB1MTYgKnJlZCwgdTE2ICpncmVlbiwK LQkJCQkgIHUxNiAqYmx1ZSwgdWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IHNpemUpOwogCiAjZW5k aWYgLyogX19JTlRFTF9EUlZfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkx NS9pbnRlbF9mYmRldi5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZmJkZXYuYwppbmRl eCA5N2E5MWU2Li43NzdmOThjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRl bF9mYmRldi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2ZiZGV2LmMKQEAgLTM3 OSw2ICszNzksNyBAQCByZXRyeToKIAkJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcjsK IAkJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyOwogCQlzdHJ1Y3QgZHJtX2ZiX2hlbHBlcl9j cnRjICpuZXdfY3J0YzsKKwkJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGM7CiAKIAkJZmJf Y29ubiA9IGZiX2hlbHBlci0+Y29ubmVjdG9yX2luZm9baV07CiAJCWNvbm5lY3RvciA9IGZiX2Nv bm4tPmNvbm5lY3RvcjsKQEAgLTQyMCw2ICs0MjEsMTMgQEAgcmV0cnk6CiAKIAkJbnVtX2Nvbm5l Y3RvcnNfZW5hYmxlZCsrOwogCisJCWludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGNvbm5lY3Rv ci0+c3RhdGUtPmNydGMpOworCQlmb3IgKGogPSAwOyBqIDwgMjU2OyBqKyspIHsKKwkJCWludGVs X2NydGMtPmx1dF9yW2pdID0gajsKKwkJCWludGVsX2NydGMtPmx1dF9nW2pdID0gajsKKwkJCWlu dGVsX2NydGMtPmx1dF9iW2pdID0gajsKKwkJfQorCiAJCW5ld19jcnRjID0gaW50ZWxfZmJfaGVs cGVyX2NydGMoZmJfaGVscGVyLCBjb25uZWN0b3ItPnN0YXRlLT5jcnRjKTsKIAogCQkvKgotLSAK Mi43LjAKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmRy aS1kZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRw czovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbAo=