From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-11.4 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,MIME_BASE64_TEXT,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, UNPARSEABLE_RELAY,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id D804CC433EB for ; Wed, 22 Jul 2020 06:50:33 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 83437206C1 for ; Wed, 22 Jul 2020 06:50:33 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=mediatek.com header.i=@mediatek.com header.b="S/Q5kjwA" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730151AbgGVGuc (ORCPT ); Wed, 22 Jul 2020 02:50:32 -0400 Received: from mailgw01.mediatek.com ([210.61.82.183]:43035 "EHLO mailgw01.mediatek.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1727922AbgGVGub (ORCPT ); Wed, 22 Jul 2020 02:50:31 -0400 X-UUID: d478c7e3f5654563a14d05e6d7266192-20200722 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Transfer-Encoding:Content-Type:MIME-Version:References:In-Reply-To:Message-ID:Date:Subject:CC:To:From; bh=XNoz/xHt880Hu0k/rHv10JQlmDwWKOoyQtsl8pNW760=; b=S/Q5kjwAEb/jvFcLbxz6NhTiG3FwDewn9m7RgGIHQRDgKeVVjyiFPOICkNOfQFXynqlhPM9xAOQm7WdVRKIj61A+NKNwpihoNNKRfn+dQJMBk51UEhsv9ZYiJhoEbwUmdFd1DXPygetRJFA2qfC+RZ8rakEFBfcVzlNI9ZDuV6U=; X-UUID: d478c7e3f5654563a14d05e6d7266192-20200722 Received: from mtkcas06.mediatek.inc [(172.21.101.30)] by mailgw01.mediatek.com (envelope-from ) (Cellopoint E-mail Firewall v4.1.10 Build 0809 with TLS) with ESMTP id 265327318; Wed, 22 Jul 2020 14:50:05 +0800 Received: from mtkcas07.mediatek.inc (172.21.101.84) by mtkmbs08n2.mediatek.inc (172.21.101.56) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Wed, 22 Jul 2020 14:50:02 +0800 Received: from mtksdccf07.mediatek.inc (172.21.84.99) by mtkcas07.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Wed, 22 Jul 2020 14:50:03 +0800 From: Weiyi Lu To: Matthias Brugger , Rob Herring , Stephen Boyd , Nicolas Boichat CC: James Liao , , , , , , Weiyi Lu , Wendell Lin Subject: [PATCH 4/4] clk: mediatek: Add MT8192 clock support Date: Wed, 22 Jul 2020 14:50:01 +0800 Message-ID: <1595400601-26220-5-git-send-email-weiyi.lu@mediatek.com> X-Mailer: git-send-email 1.8.1.1.dirty In-Reply-To: <1595400601-26220-1-git-send-email-weiyi.lu@mediatek.com> References: <1595400601-26220-1-git-send-email-weiyi.lu@mediatek.com> MIME-Version: 1.0 Content-Type: text/plain X-TM-SNTS-SMTP: F8E7F4CD76DC7E91FC4014FDE279C4E70874FB47967BA901F08607644FF8D83F2000:8 X-MTK: N Content-Transfer-Encoding: base64 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org QWRkIE1UODE5MiBjbG9jayBzdXBwb3J0LCBpbmNsdWRlIHRvcGNrZ2VuLCBhcG1peGVkc3lzLA0K aW5mcmFjZmcsIHBlcmljZmcgYW5kIHN1YnN5c3RlbSBjbG9ja3MuDQoNClNpZ25lZC1vZmYtYnk6 IFdlaXlpIEx1IDx3ZWl5aS5sdUBtZWRpYXRlay5jb20+DQotLS0NCiBkcml2ZXJzL2Nsay9tZWRp YXRlay9LY29uZmlnICAgICAgICAgICAgICAgICAgICAgIHwgIDE0NiArKw0KIGRyaXZlcnMvY2xr L21lZGlhdGVrL01ha2VmaWxlICAgICAgICAgICAgICAgICAgICAgfCAgIDI0ICsNCiBkcml2ZXJz L2Nsay9tZWRpYXRlay9jbGstbXQ4MTkyLWF1ZC5jICAgICAgICAgICAgIHwgIDE1MCArKw0KIGRy aXZlcnMvY2xrL21lZGlhdGVrL2Nsay1tdDgxOTItY2FtLmMgICAgICAgICAgICAgfCAgIDY5ICsN CiBkcml2ZXJzL2Nsay9tZWRpYXRlay9jbGstbXQ4MTkyLWNhbV9yYXdhLmMgICAgICAgIHwgICA1 NiArDQogZHJpdmVycy9jbGsvbWVkaWF0ZWsvY2xrLW10ODE5Mi1jYW1fcmF3Yi5jICAgICAgICB8 ICAgNTYgKw0KIGRyaXZlcnMvY2xrL21lZGlhdGVrL2Nsay1tdDgxOTItY2FtX3Jhd2MuYyAgICAg ICAgfCAgIDU2ICsNCiBkcml2ZXJzL2Nsay9tZWRpYXRlay9jbGstbXQ4MTkyLWltZy5jICAgICAg ICAgICAgIHwgICA1NyArDQogZHJpdmVycy9jbGsvbWVkaWF0ZWsvY2xrLW10ODE5Mi1pbWcyLmMg ICAgICAgICAgICB8ICAgNTkgKw0KIGRyaXZlcnMvY2xrL21lZGlhdGVrL2Nsay1tdDgxOTItaW1w X2lpY193cmFwX2MuYyAgfCAgIDYxICsNCiBkcml2ZXJzL2Nsay9tZWRpYXRlay9jbGstbXQ4MTky LWltcF9paWNfd3JhcF9lLmMgIHwgICA1NSArDQogZHJpdmVycy9jbGsvbWVkaWF0ZWsvY2xrLW10 ODE5Mi1pbXBfaWljX3dyYXBfbi5jICB8ICAgNTcgKw0KIGRyaXZlcnMvY2xrL21lZGlhdGVrL2Ns ay1tdDgxOTItaW1wX2lpY193cmFwX3MuYyAgfCAgIDU5ICsNCiBkcml2ZXJzL2Nsay9tZWRpYXRl ay9jbGstbXQ4MTkyLWltcF9paWNfd3JhcF93LmMgIHwgICA1NSArDQogZHJpdmVycy9jbGsvbWVk aWF0ZWsvY2xrLW10ODE5Mi1pbXBfaWljX3dyYXBfd3MuYyB8ICAgNTkgKw0KIGRyaXZlcnMvY2xr L21lZGlhdGVrL2Nsay1tdDgxOTItaXBlLmMgICAgICAgICAgICAgfCAgIDYxICsNCiBkcml2ZXJz L2Nsay9tZWRpYXRlay9jbGstbXQ4MTkyLW1kcC5jICAgICAgICAgICAgIHwgICA4OSArKw0KIGRy aXZlcnMvY2xrL21lZGlhdGVrL2Nsay1tdDgxOTItbWZnLmMgICAgICAgICAgICAgfCAgIDU0ICsN CiBkcml2ZXJzL2Nsay9tZWRpYXRlay9jbGstbXQ4MTkyLW1tLmMgICAgICAgICAgICAgIHwgIDEw OCArKw0KIGRyaXZlcnMvY2xrL21lZGlhdGVrL2Nsay1tdDgxOTItbXNkYy5jICAgICAgICAgICAg fCAgIDU0ICsNCiBkcml2ZXJzL2Nsay9tZWRpYXRlay9jbGstbXQ4MTkyLW1zZGNfdG9wLmMgICAg ICAgIHwgICA4MyArKw0KIGRyaXZlcnMvY2xrL21lZGlhdGVrL2Nsay1tdDgxOTItc2NwX2Fkc3Au YyAgICAgICAgfCAgIDU1ICsNCiBkcml2ZXJzL2Nsay9tZWRpYXRlay9jbGstbXQ4MTkyLXZkZWMu YyAgICAgICAgICAgIHwgICA4MSArKw0KIGRyaXZlcnMvY2xrL21lZGlhdGVrL2Nsay1tdDgxOTIt dmRlY19zb2MuYyAgICAgICAgfCAgIDg2ICsrDQogZHJpdmVycy9jbGsvbWVkaWF0ZWsvY2xrLW10 ODE5Mi12ZW5jLmMgICAgICAgICAgICB8ICAgNTcgKw0KIGRyaXZlcnMvY2xrL21lZGlhdGVrL2Ns ay1tdDgxOTIuYyAgICAgICAgICAgICAgICAgfCAxNTQ5ICsrKysrKysrKysrKysrKysrKysrKw0K IGRyaXZlcnMvY2xrL21lZGlhdGVrL2Nsay1tdXguaCAgICAgICAgICAgICAgICAgICAgfCAgIDE1 ICsNCiAyNyBmaWxlcyBjaGFuZ2VkLCAzMzExIGluc2VydGlvbnMoKykNCiBjcmVhdGUgbW9kZSAx MDA2NDQgZHJpdmVycy9jbGsvbWVkaWF0ZWsvY2xrLW10ODE5Mi1hdWQuYw0KIGNyZWF0ZSBtb2Rl IDEwMDY0NCBkcml2ZXJzL2Nsay9tZWRpYXRlay9jbGstbXQ4MTkyLWNhbS5jDQogY3JlYXRlIG1v ZGUgMTAwNjQ0IGRyaXZlcnMvY2xrL21lZGlhdGVrL2Nsay1tdDgxOTItY2FtX3Jhd2EuYw0KIGNy ZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2Nsay9tZWRpYXRlay9jbGstbXQ4MTkyLWNhbV9yYXdi LmMNCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9jbGsvbWVkaWF0ZWsvY2xrLW10ODE5Mi1j YW1fcmF3Yy5jDQogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvY2xrL21lZGlhdGVrL2Nsay1t dDgxOTItaW1nLmMNCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9jbGsvbWVkaWF0ZWsvY2xr LW10ODE5Mi1pbWcyLmMNCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9jbGsvbWVkaWF0ZWsv Y2xrLW10ODE5Mi1pbXBfaWljX3dyYXBfYy5jDQogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMv Y2xrL21lZGlhdGVrL2Nsay1tdDgxOTItaW1wX2lpY193cmFwX2UuYw0KIGNyZWF0ZSBtb2RlIDEw MDY0NCBkcml2ZXJzL2Nsay9tZWRpYXRlay9jbGstbXQ4MTkyLWltcF9paWNfd3JhcF9uLmMNCiBj cmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9jbGsvbWVkaWF0ZWsvY2xrLW10ODE5Mi1pbXBfaWlj X3dyYXBfcy5jDQogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvY2xrL21lZGlhdGVrL2Nsay1t dDgxOTItaW1wX2lpY193cmFwX3cuYw0KIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2Nsay9t ZWRpYXRlay9jbGstbXQ4MTkyLWltcF9paWNfd3JhcF93cy5jDQogY3JlYXRlIG1vZGUgMTAwNjQ0 IGRyaXZlcnMvY2xrL21lZGlhdGVrL2Nsay1tdDgxOTItaXBlLmMNCiBjcmVhdGUgbW9kZSAxMDA2 NDQgZHJpdmVycy9jbGsvbWVkaWF0ZWsvY2xrLW10ODE5Mi1tZHAuYw0KIGNyZWF0ZSBtb2RlIDEw MDY0NCBkcml2ZXJzL2Nsay9tZWRpYXRlay9jbGstbXQ4MTkyLW1mZy5jDQogY3JlYXRlIG1vZGUg MTAwNjQ0IGRyaXZlcnMvY2xrL21lZGlhdGVrL2Nsay1tdDgxOTItbW0uYw0KIGNyZWF0ZSBtb2Rl IDEwMDY0NCBkcml2ZXJzL2Nsay9tZWRpYXRlay9jbGstbXQ4MTkyLW1zZGMuYw0KIGNyZWF0ZSBt b2RlIDEwMDY0NCBkcml2ZXJzL2Nsay9tZWRpYXRlay9jbGstbXQ4MTkyLW1zZGNfdG9wLmMNCiBj cmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9jbGsvbWVkaWF0ZWsvY2xrLW10ODE5Mi1zY3BfYWRz cC5jDQogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvY2xrL21lZGlhdGVrL2Nsay1tdDgxOTIt dmRlYy5jDQogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvY2xrL21lZGlhdGVrL2Nsay1tdDgx OTItdmRlY19zb2MuYw0KIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2Nsay9tZWRpYXRlay9j bGstbXQ4MTkyLXZlbmMuYw0KIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2Nsay9tZWRpYXRl ay9jbGstbXQ4MTkyLmMNCg0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL21lZGlhdGVrL0tjb25m aWcgYi9kcml2ZXJzL2Nsay9tZWRpYXRlay9LY29uZmlnDQppbmRleCA4OWNlYjJmYi4uYzIwNDgy OSAxMDA2NDQNCi0tLSBhL2RyaXZlcnMvY2xrL21lZGlhdGVrL0tjb25maWcNCisrKyBiL2RyaXZl cnMvY2xrL21lZGlhdGVrL0tjb25maWcNCkBAIC00NDEsNiArNDQxLDE1MiBAQCBjb25maWcgQ09N TU9OX0NMS19NVDgxODNfVkVOQ1NZUw0KIAloZWxwDQogCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMg TWVkaWFUZWsgTVQ4MTgzIHZlbmNzeXMgY2xvY2tzLg0KIA0KK2NvbmZpZyBDT01NT05fQ0xLX01U ODE5Mg0KKwlib29sICJDbG9jayBkcml2ZXIgZm9yIE1lZGlhVGVrIE1UODE5MiINCisJZGVwZW5k cyBvbiAoQVJDSF9NRURJQVRFSyAmJiBBUk02NCkgfHwgQ09NUElMRV9URVNUDQorCXNlbGVjdCBD T01NT05fQ0xLX01FRElBVEVLDQorCWRlZmF1bHQgQVJDSF9NRURJQVRFSyAmJiBBUk02NA0KKwlo ZWxwDQorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgTWVkaWFUZWsgTVQ4MTkyIGJhc2ljIGNsb2Nr cy4NCisNCitjb25maWcgQ09NTU9OX0NMS19NVDgxOTJfQVVEU1lTDQorCWJvb2wgIkNsb2NrIGRy aXZlciBmb3IgTWVkaWFUZWsgTVQ4MTkyIGF1ZHN5cyINCisJZGVwZW5kcyBvbiBDT01NT05fQ0xL X01UODE5Mg0KKwloZWxwDQorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgTWVkaWFUZWsgTVQ4MTky IGF1ZHN5cyBjbG9ja3MuDQorDQorY29uZmlnIENPTU1PTl9DTEtfTVQ4MTkyX0NBTVNZUw0KKwli b29sICJDbG9jayBkcml2ZXIgZm9yIE1lZGlhVGVrIE1UODE5MiBjYW1zeXMiDQorCWRlcGVuZHMg b24gQ09NTU9OX0NMS19NVDgxOTINCisJaGVscA0KKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIE1l ZGlhVGVrIE1UODE5MiBjYW1zeXMgY2xvY2tzLg0KKw0KK2NvbmZpZyBDT01NT05fQ0xLX01UODE5 Ml9DQU1TWVNfUkFXQQ0KKwlib29sICJDbG9jayBkcml2ZXIgZm9yIE1lZGlhVGVrIE1UODE5MiBj YW1zeXNfcmF3YSINCisJZGVwZW5kcyBvbiBDT01NT05fQ0xLX01UODE5Mg0KKwloZWxwDQorCSAg VGhpcyBkcml2ZXIgc3VwcG9ydHMgTWVkaWFUZWsgTVQ4MTkyIGNhbXN5c19yYXdhIGNsb2Nrcy4N CisNCitjb25maWcgQ09NTU9OX0NMS19NVDgxOTJfQ0FNU1lTX1JBV0INCisJYm9vbCAiQ2xvY2sg ZHJpdmVyIGZvciBNZWRpYVRlayBNVDgxOTIgY2Ftc3lzX3Jhd2IiDQorCWRlcGVuZHMgb24gQ09N TU9OX0NMS19NVDgxOTINCisJaGVscA0KKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIE1lZGlhVGVr IE1UODE5MiBjYW1zeXNfcmF3YiBjbG9ja3MuDQorDQorY29uZmlnIENPTU1PTl9DTEtfTVQ4MTky X0NBTVNZU19SQVdDDQorCWJvb2wgIkNsb2NrIGRyaXZlciBmb3IgTWVkaWFUZWsgTVQ4MTkyIGNh bXN5c19yYXdjIg0KKwlkZXBlbmRzIG9uIENPTU1PTl9DTEtfTVQ4MTkyDQorCWhlbHANCisJICBU aGlzIGRyaXZlciBzdXBwb3J0cyBNZWRpYVRlayBNVDgxOTIgY2Ftc3lzX3Jhd2MgY2xvY2tzLg0K Kw0KK2NvbmZpZyBDT01NT05fQ0xLX01UODE5Ml9JTUdTWVMNCisJYm9vbCAiQ2xvY2sgZHJpdmVy IGZvciBNZWRpYVRlayBNVDgxOTIgaW1nc3lzIg0KKwlkZXBlbmRzIG9uIENPTU1PTl9DTEtfTVQ4 MTkyDQorCWhlbHANCisJICBUaGlzIGRyaXZlciBzdXBwb3J0cyBNZWRpYVRlayBNVDgxOTIgaW1n c3lzIGNsb2Nrcy4NCisNCitjb25maWcgQ09NTU9OX0NMS19NVDgxOTJfSU1HU1lTMg0KKwlib29s ICJDbG9jayBkcml2ZXIgZm9yIE1lZGlhVGVrIE1UODE5MiBpbWdzeXMyIg0KKwlkZXBlbmRzIG9u IENPTU1PTl9DTEtfTVQ4MTkyDQorCWhlbHANCisJICBUaGlzIGRyaXZlciBzdXBwb3J0cyBNZWRp YVRlayBNVDgxOTIgaW1nc3lzMiBjbG9ja3MuDQorDQorY29uZmlnIENPTU1PTl9DTEtfTVQ4MTky X0lNUF9JSUNfV1JBUF9DDQorCWJvb2wgIkNsb2NrIGRyaXZlciBmb3IgTWVkaWFUZWsgTVQ4MTky IGltcF9paWNfd3JhcF9jIg0KKwlkZXBlbmRzIG9uIENPTU1PTl9DTEtfTVQ4MTkyDQorCWhlbHAN CisJICBUaGlzIGRyaXZlciBzdXBwb3J0cyBNZWRpYVRlayBNVDgxOTIgaW1wX2lpY193cmFwX2Mg Y2xvY2tzLg0KKw0KK2NvbmZpZyBDT01NT05fQ0xLX01UODE5Ml9JTVBfSUlDX1dSQVBfRQ0KKwli b29sICJDbG9jayBkcml2ZXIgZm9yIE1lZGlhVGVrIE1UODE5MiBpbXBfaWljX3dyYXBfZSINCisJ ZGVwZW5kcyBvbiBDT01NT05fQ0xLX01UODE5Mg0KKwloZWxwDQorCSAgVGhpcyBkcml2ZXIgc3Vw cG9ydHMgTWVkaWFUZWsgTVQ4MTkyIGltcF9paWNfd3JhcF9lIGNsb2Nrcy4NCisNCitjb25maWcg Q09NTU9OX0NMS19NVDgxOTJfSU1QX0lJQ19XUkFQX04NCisJYm9vbCAiQ2xvY2sgZHJpdmVyIGZv ciBNZWRpYVRlayBNVDgxOTIgaW1wX2lpY193cmFwX24iDQorCWRlcGVuZHMgb24gQ09NTU9OX0NM S19NVDgxOTINCisJaGVscA0KKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIE1lZGlhVGVrIE1UODE5 MiBpbXBfaWljX3dyYXBfbiBjbG9ja3MuDQorDQorY29uZmlnIENPTU1PTl9DTEtfTVQ4MTkyX0lN UF9JSUNfV1JBUF9TDQorCWJvb2wgIkNsb2NrIGRyaXZlciBmb3IgTWVkaWFUZWsgTVQ4MTkyIGlt cF9paWNfd3JhcF9zIg0KKwlkZXBlbmRzIG9uIENPTU1PTl9DTEtfTVQ4MTkyDQorCWhlbHANCisJ ICBUaGlzIGRyaXZlciBzdXBwb3J0cyBNZWRpYVRlayBNVDgxOTIgaW1wX2lpY193cmFwX3MgY2xv Y2tzLg0KKw0KK2NvbmZpZyBDT01NT05fQ0xLX01UODE5Ml9JTVBfSUlDX1dSQVBfVw0KKwlib29s ICJDbG9jayBkcml2ZXIgZm9yIE1lZGlhVGVrIE1UODE5MiBpbXBfaWljX3dyYXBfdyINCisJZGVw ZW5kcyBvbiBDT01NT05fQ0xLX01UODE5Mg0KKwloZWxwDQorCSAgVGhpcyBkcml2ZXIgc3VwcG9y dHMgTWVkaWFUZWsgTVQ4MTkyIGltcF9paWNfd3JhcF93IGNsb2Nrcy4NCisNCitjb25maWcgQ09N TU9OX0NMS19NVDgxOTJfSU1QX0lJQ19XUkFQX1dTDQorCWJvb2wgIkNsb2NrIGRyaXZlciBmb3Ig TWVkaWFUZWsgTVQ4MTkyIGltcF9paWNfd3JhcF93cyINCisJZGVwZW5kcyBvbiBDT01NT05fQ0xL X01UODE5Mg0KKwloZWxwDQorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgTWVkaWFUZWsgTVQ4MTky IGltcF9paWNfd3JhcF93cyBjbG9ja3MuDQorDQorY29uZmlnIENPTU1PTl9DTEtfTVQ4MTkyX0lQ RVNZUw0KKwlib29sICJDbG9jayBkcml2ZXIgZm9yIE1lZGlhVGVrIE1UODE5MiBpcGVzeXMiDQor CWRlcGVuZHMgb24gQ09NTU9OX0NMS19NVDgxOTINCisJaGVscA0KKwkgIFRoaXMgZHJpdmVyIHN1 cHBvcnRzIE1lZGlhVGVrIE1UODE5MiBpcGVzeXMgY2xvY2tzLg0KKw0KK2NvbmZpZyBDT01NT05f Q0xLX01UODE5Ml9NRFBTWVMNCisJYm9vbCAiQ2xvY2sgZHJpdmVyIGZvciBNZWRpYVRlayBNVDgx OTIgbWRwc3lzIg0KKwlkZXBlbmRzIG9uIENPTU1PTl9DTEtfTVQ4MTkyDQorCWhlbHANCisJICBU aGlzIGRyaXZlciBzdXBwb3J0cyBNZWRpYVRlayBNVDgxOTIgbWRwc3lzIGNsb2Nrcy4NCisNCitj b25maWcgQ09NTU9OX0NMS19NVDgxOTJfTUZHQ0ZHDQorCWJvb2wgIkNsb2NrIGRyaXZlciBmb3Ig TWVkaWFUZWsgTVQ4MTkyIG1mZ2NmZyINCisJZGVwZW5kcyBvbiBDT01NT05fQ0xLX01UODE5Mg0K KwloZWxwDQorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgTWVkaWFUZWsgTVQ4MTkyIG1mZ2NmZyBj bG9ja3MuDQorDQorY29uZmlnIENPTU1PTl9DTEtfTVQ4MTkyX01NU1lTDQorCWJvb2wgIkNsb2Nr IGRyaXZlciBmb3IgTWVkaWFUZWsgTVQ4MTkyIG1tc3lzIg0KKwlkZXBlbmRzIG9uIENPTU1PTl9D TEtfTVQ4MTkyDQorCWhlbHANCisJICBUaGlzIGRyaXZlciBzdXBwb3J0cyBNZWRpYVRlayBNVDgx OTIgbW1zeXMgY2xvY2tzLg0KKw0KK2NvbmZpZyBDT01NT05fQ0xLX01UODE5Ml9NU0RDX1RPUA0K Kwlib29sICJDbG9jayBkcml2ZXIgZm9yIE1lZGlhVGVrIE1UODE5MiBtc2RjX3RvcCINCisJZGVw ZW5kcyBvbiBDT01NT05fQ0xLX01UODE5Mg0KKwloZWxwDQorCSAgVGhpcyBkcml2ZXIgc3VwcG9y dHMgTWVkaWFUZWsgTVQ4MTkyIG1zZGNfdG9wIGNsb2Nrcy4NCisNCitjb25maWcgQ09NTU9OX0NM S19NVDgxOTJfTVNEQw0KKwlib29sICJDbG9jayBkcml2ZXIgZm9yIE1lZGlhVGVrIE1UODE5MiBt c2RjIg0KKwlkZXBlbmRzIG9uIENPTU1PTl9DTEtfTVQ4MTkyDQorCWhlbHANCisJICBUaGlzIGRy aXZlciBzdXBwb3J0cyBNZWRpYVRlayBNVDgxOTIgbXNkYyBjbG9ja3MuDQorDQorY29uZmlnIENP TU1PTl9DTEtfTVQ4MTkyX1NDUF9BRFNQDQorCWJvb2wgIkNsb2NrIGRyaXZlciBmb3IgTWVkaWFU ZWsgTVQ4MTkyIHNjcF9hZHNwIg0KKwlkZXBlbmRzIG9uIENPTU1PTl9DTEtfTVQ4MTkyDQorCWhl bHANCisJICBUaGlzIGRyaXZlciBzdXBwb3J0cyBNZWRpYVRlayBNVDgxOTIgc2NwX2Fkc3AgY2xv Y2tzLg0KKw0KK2NvbmZpZyBDT01NT05fQ0xLX01UODE5Ml9WREVDU1lTDQorCWJvb2wgIkNsb2Nr IGRyaXZlciBmb3IgTWVkaWFUZWsgTVQ4MTkyIHZkZWNzeXMiDQorCWRlcGVuZHMgb24gQ09NTU9O X0NMS19NVDgxOTINCisJaGVscA0KKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIE1lZGlhVGVrIE1U ODE5MiB2ZGVjc3lzIGNsb2Nrcy4NCisNCitjb25maWcgQ09NTU9OX0NMS19NVDgxOTJfVkRFQ1NZ U19TT0MNCisJYm9vbCAiQ2xvY2sgZHJpdmVyIGZvciBNZWRpYVRlayBNVDgxOTIgdmRlY3N5c19z b2MiDQorCWRlcGVuZHMgb24gQ09NTU9OX0NMS19NVDgxOTINCisJaGVscA0KKwkgIFRoaXMgZHJp dmVyIHN1cHBvcnRzIE1lZGlhVGVrIE1UODE5MiB2ZGVjc3lzX3NvYyBjbG9ja3MuDQorDQorY29u ZmlnIENPTU1PTl9DTEtfTVQ4MTkyX1ZFTkNTWVMNCisJYm9vbCAiQ2xvY2sgZHJpdmVyIGZvciBN ZWRpYVRlayBNVDgxOTIgdmVuY3N5cyINCisJZGVwZW5kcyBvbiBDT01NT05fQ0xLX01UODE5Mg0K KwloZWxwDQorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgTWVkaWFUZWsgTVQ4MTkyIHZlbmNzeXMg Y2xvY2tzLg0KKw0KIGNvbmZpZyBDT01NT05fQ0xLX01UODUxNg0KIAlib29sICJDbG9jayBkcml2 ZXIgZm9yIE1lZGlhVGVrIE1UODUxNiINCiAJZGVwZW5kcyBvbiBBUkNIX01FRElBVEVLIHx8IENP TVBJTEVfVEVTVA0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL21lZGlhdGVrL01ha2VmaWxlIGIv ZHJpdmVycy9jbGsvbWVkaWF0ZWsvTWFrZWZpbGUNCmluZGV4IDk1OWI1NTYuLjNlNjYwYWMgMTAw NjQ0DQotLS0gYS9kcml2ZXJzL2Nsay9tZWRpYXRlay9NYWtlZmlsZQ0KKysrIGIvZHJpdmVycy9j bGsvbWVkaWF0ZWsvTWFrZWZpbGUNCkBAIC02MSw1ICs2MSwyOSBAQCBvYmotJChDT05GSUdfQ09N TU9OX0NMS19NVDgxODNfTUZHQ0ZHKSArPSBjbGstbXQ4MTgzLW1mZ2NmZy5vDQogb2JqLSQoQ09O RklHX0NPTU1PTl9DTEtfTVQ4MTgzX01NU1lTKSArPSBjbGstbXQ4MTgzLW1tLm8NCiBvYmotJChD T05GSUdfQ09NTU9OX0NMS19NVDgxODNfVkRFQ1NZUykgKz0gY2xrLW10ODE4My12ZGVjLm8NCiBv YmotJChDT05GSUdfQ09NTU9OX0NMS19NVDgxODNfVkVOQ1NZUykgKz0gY2xrLW10ODE4My12ZW5j Lm8NCitvYmotJChDT05GSUdfQ09NTU9OX0NMS19NVDgxOTIpICs9IGNsay1tdDgxOTIubw0KK29i ai0kKENPTkZJR19DT01NT05fQ0xLX01UODE5Ml9BVURTWVMpICs9IGNsay1tdDgxOTItYXVkLm8N CitvYmotJChDT05GSUdfQ09NTU9OX0NMS19NVDgxOTJfQ0FNU1lTKSArPSBjbGstbXQ4MTkyLWNh bS5vDQorb2JqLSQoQ09ORklHX0NPTU1PTl9DTEtfTVQ4MTkyX0NBTVNZU19SQVdBKSArPSBjbGst bXQ4MTkyLWNhbV9yYXdhLm8NCitvYmotJChDT05GSUdfQ09NTU9OX0NMS19NVDgxOTJfQ0FNU1lT X1JBV0IpICs9IGNsay1tdDgxOTItY2FtX3Jhd2Iubw0KK29iai0kKENPTkZJR19DT01NT05fQ0xL X01UODE5Ml9DQU1TWVNfUkFXQykgKz0gY2xrLW10ODE5Mi1jYW1fcmF3Yy5vDQorb2JqLSQoQ09O RklHX0NPTU1PTl9DTEtfTVQ4MTkyX0lNR1NZUykgKz0gY2xrLW10ODE5Mi1pbWcubw0KK29iai0k KENPTkZJR19DT01NT05fQ0xLX01UODE5Ml9JTUdTWVMyKSArPSBjbGstbXQ4MTkyLWltZzIubw0K K29iai0kKENPTkZJR19DT01NT05fQ0xLX01UODE5Ml9JTVBfSUlDX1dSQVBfQykgKz0gY2xrLW10 ODE5Mi1pbXBfaWljX3dyYXBfYy5vDQorb2JqLSQoQ09ORklHX0NPTU1PTl9DTEtfTVQ4MTkyX0lN UF9JSUNfV1JBUF9FKSArPSBjbGstbXQ4MTkyLWltcF9paWNfd3JhcF9lLm8NCitvYmotJChDT05G SUdfQ09NTU9OX0NMS19NVDgxOTJfSU1QX0lJQ19XUkFQX04pICs9IGNsay1tdDgxOTItaW1wX2lp Y193cmFwX24ubw0KK29iai0kKENPTkZJR19DT01NT05fQ0xLX01UODE5Ml9JTVBfSUlDX1dSQVBf UykgKz0gY2xrLW10ODE5Mi1pbXBfaWljX3dyYXBfcy5vDQorb2JqLSQoQ09ORklHX0NPTU1PTl9D TEtfTVQ4MTkyX0lNUF9JSUNfV1JBUF9XKSArPSBjbGstbXQ4MTkyLWltcF9paWNfd3JhcF93Lm8N CitvYmotJChDT05GSUdfQ09NTU9OX0NMS19NVDgxOTJfSU1QX0lJQ19XUkFQX1dTKSArPSBjbGst bXQ4MTkyLWltcF9paWNfd3JhcF93cy5vDQorb2JqLSQoQ09ORklHX0NPTU1PTl9DTEtfTVQ4MTky X0lQRVNZUykgKz0gY2xrLW10ODE5Mi1pcGUubw0KK29iai0kKENPTkZJR19DT01NT05fQ0xLX01U ODE5Ml9NRFBTWVMpICs9IGNsay1tdDgxOTItbWRwLm8NCitvYmotJChDT05GSUdfQ09NTU9OX0NM S19NVDgxOTJfTUZHQ0ZHKSArPSBjbGstbXQ4MTkyLW1mZy5vDQorb2JqLSQoQ09ORklHX0NPTU1P Tl9DTEtfTVQ4MTkyX01NU1lTKSArPSBjbGstbXQ4MTkyLW1tLm8NCitvYmotJChDT05GSUdfQ09N TU9OX0NMS19NVDgxOTJfTVNEQ19UT1ApICs9IGNsay1tdDgxOTItbXNkY190b3Aubw0KK29iai0k KENPTkZJR19DT01NT05fQ0xLX01UODE5Ml9NU0RDKSArPSBjbGstbXQ4MTkyLW1zZGMubw0KK29i ai0kKENPTkZJR19DT01NT05fQ0xLX01UODE5Ml9TQ1BfQURTUCkgKz0gY2xrLW10ODE5Mi1zY3Bf YWRzcC5vDQorb2JqLSQoQ09ORklHX0NPTU1PTl9DTEtfTVQ4MTkyX1ZERUNTWVMpICs9IGNsay1t dDgxOTItdmRlYy5vDQorb2JqLSQoQ09ORklHX0NPTU1PTl9DTEtfTVQ4MTkyX1ZERUNTWVNfU09D KSArPSBjbGstbXQ4MTkyLXZkZWNfc29jLm8NCitvYmotJChDT05GSUdfQ09NTU9OX0NMS19NVDgx OTJfVkVOQ1NZUykgKz0gY2xrLW10ODE5Mi12ZW5jLm8NCiBvYmotJChDT05GSUdfQ09NTU9OX0NM S19NVDg1MTYpICs9IGNsay1tdDg1MTYubw0KIG9iai0kKENPTkZJR19DT01NT05fQ0xLX01UODUx Nl9BVURTWVMpICs9IGNsay1tdDg1MTYtYXVkLm8NCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9t ZWRpYXRlay9jbGstbXQ4MTkyLWF1ZC5jIGIvZHJpdmVycy9jbGsvbWVkaWF0ZWsvY2xrLW10ODE5 Mi1hdWQuYw0KbmV3IGZpbGUgbW9kZSAxMDA2NDQNCmluZGV4IDAwMDAwMDAuLjM2YmY5MTkNCi0t LSAvZGV2L251bGwNCisrKyBiL2RyaXZlcnMvY2xrL21lZGlhdGVrL2Nsay1tdDgxOTItYXVkLmMN CkBAIC0wLDAgKzEsMTUwIEBADQorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAN CisvLw0KKy8vIENvcHlyaWdodCAoYykgMjAyMCBNZWRpYVRlayBJbmMuDQorLy8gQXV0aG9yOiBX ZWl5aSBMdSA8d2VpeWkubHVAbWVkaWF0ZWsuY29tPg0KKw0KKyNpbmNsdWRlIDxsaW51eC9jbGst cHJvdmlkZXIuaD4NCisjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4NCisjaW5jbHVkZSA8 bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+DQorDQorI2luY2x1ZGUgImNsay1tdGsuaCINCisjaW5j bHVkZSAiY2xrLWdhdGUuaCINCisNCisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svbXQ4MTky LWNsay5oPg0KKw0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXRrX2dhdGVfcmVncyBhdWQwX2NnX3Jl Z3MgPSB7DQorCS5zZXRfb2ZzID0gMHgwLA0KKwkuY2xyX29mcyA9IDB4MCwNCisJLnN0YV9vZnMg PSAweDAsDQorfTsNCisNCitzdGF0aWMgY29uc3Qgc3RydWN0IG10a19nYXRlX3JlZ3MgYXVkMV9j Z19yZWdzID0gew0KKwkuc2V0X29mcyA9IDB4NCwNCisJLmNscl9vZnMgPSAweDQsDQorCS5zdGFf b2ZzID0gMHg0LA0KK307DQorDQorc3RhdGljIGNvbnN0IHN0cnVjdCBtdGtfZ2F0ZV9yZWdzIGF1 ZDJfY2dfcmVncyA9IHsNCisJLnNldF9vZnMgPSAweDgsDQorCS5jbHJfb2ZzID0gMHg4LA0KKwku c3RhX29mcyA9IDB4OCwNCit9Ow0KKw0KKyNkZWZpbmUgR0FURV9BVUQwKF9pZCwgX25hbWUsIF9w YXJlbnQsIF9zaGlmdCkJCQlcDQorCUdBVEVfTVRLKF9pZCwgX25hbWUsIF9wYXJlbnQsICZhdWQw X2NnX3JlZ3MsIF9zaGlmdCwJXA0KKwkJJm10a19jbGtfZ2F0ZV9vcHNfbm9fc2V0Y2xyKQ0KKw0K KyNkZWZpbmUgR0FURV9BVUQxKF9pZCwgX25hbWUsIF9wYXJlbnQsIF9zaGlmdCkJCQlcDQorCUdB VEVfTVRLKF9pZCwgX25hbWUsIF9wYXJlbnQsICZhdWQxX2NnX3JlZ3MsIF9zaGlmdCwJXA0KKwkJ Jm10a19jbGtfZ2F0ZV9vcHNfbm9fc2V0Y2xyKQ0KKw0KKyNkZWZpbmUgR0FURV9BVUQyKF9pZCwg X25hbWUsIF9wYXJlbnQsIF9zaGlmdCkJCQlcDQorCUdBVEVfTVRLKF9pZCwgX25hbWUsIF9wYXJl bnQsICZhdWQyX2NnX3JlZ3MsIF9zaGlmdCwJXA0KKwkJJm10a19jbGtfZ2F0ZV9vcHNfbm9fc2V0 Y2xyKQ0KKw0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXRrX2dhdGUgYXVkX2Nsa3NbXSA9IHsNCisJ LyogQVVEMCAqLw0KKwlHQVRFX0FVRDAoQ0xLX0FVRF9BRkUsICJhdWRfYWZlIiwgImF1ZGlvX3Nl bCIsDQorCQkyKSwNCisJR0FURV9BVUQwKENMS19BVURfMjJNLCAiYXVkXzIybSIsICJhdWRfZW5n ZW4xX3NlbCIsDQorCQk4KSwNCisJR0FURV9BVUQwKENMS19BVURfMjRNLCAiYXVkXzI0bSIsICJh dWRfZW5nZW4yX3NlbCIsDQorCQk5KSwNCisJR0FURV9BVUQwKENMS19BVURfQVBMTDJfVFVORVIs ICJhdWRfYXBsbDJfdHVuZXIiLCAiYXVkX2VuZ2VuMl9zZWwiLA0KKwkJMTgpLA0KKwlHQVRFX0FV RDAoQ0xLX0FVRF9BUExMX1RVTkVSLCAiYXVkX2FwbGxfdHVuZXIiLCAiYXVkX2VuZ2VuMV9zZWwi LA0KKwkJMTkpLA0KKwlHQVRFX0FVRDAoQ0xLX0FVRF9URE0sICJhdWRfdGRtIiwgImF1ZF8xX3Nl bCIsDQorCQkyMCksDQorCUdBVEVfQVVEMChDTEtfQVVEX0FEQywgImF1ZF9hZGMiLCAiYXVkaW9f c2VsIiwNCisJCTI0KSwNCisJR0FURV9BVUQwKENMS19BVURfREFDLCAiYXVkX2RhYyIsICJhdWRp b19zZWwiLA0KKwkJMjUpLA0KKwlHQVRFX0FVRDAoQ0xLX0FVRF9EQUNfUFJFRElTLCAiYXVkX2Rh Y19wcmVkaXMiLCAiYXVkaW9fc2VsIiwNCisJCTI2KSwNCisJR0FURV9BVUQwKENMS19BVURfVE1M LCAiYXVkX3RtbCIsICJhdWRpb19zZWwiLA0KKwkJMjcpLA0KKwlHQVRFX0FVRDAoQ0xLX0FVRF9O TEUsICJhdWRfbmxlIiwgImF1ZGlvX3NlbCIsDQorCQkyOCksDQorCS8qIEFVRDEgKi8NCisJR0FU RV9BVUQxKENMS19BVURfSTJTMV9CLCAiYXVkX2kyczFfYiIsICJhdWRpb19zZWwiLA0KKwkJNCks DQorCUdBVEVfQVVEMShDTEtfQVVEX0kyUzJfQiwgImF1ZF9pMnMyX2IiLCAiYXVkaW9fc2VsIiwN CisJCTUpLA0KKwlHQVRFX0FVRDEoQ0xLX0FVRF9JMlMzX0IsICJhdWRfaTJzM19iIiwgImF1ZGlv X3NlbCIsDQorCQk2KSwNCisJR0FURV9BVUQxKENMS19BVURfSTJTNF9CLCAiYXVkX2kyczRfYiIs ICJhdWRpb19zZWwiLA0KKwkJNyksDQorCUdBVEVfQVVEMShDTEtfQVVEX0NPTk5TWVNfSTJTX0FT UkMsICJhdWRfY29ubnN5c19pMnNfYXNyYyIsICJhdWRpb19zZWwiLA0KKwkJMTIpLA0KKwlHQVRF X0FVRDEoQ0xLX0FVRF9HRU5FUkFMMV9BU1JDLCAiYXVkX2dlbmVyYWwxX2FzcmMiLCAiYXVkaW9f c2VsIiwNCisJCTEzKSwNCisJR0FURV9BVUQxKENMS19BVURfR0VORVJBTDJfQVNSQywgImF1ZF9n ZW5lcmFsMl9hc3JjIiwgImF1ZGlvX3NlbCIsDQorCQkxNCksDQorCUdBVEVfQVVEMShDTEtfQVVE X0RBQ19ISVJFUywgImF1ZF9kYWNfaGlyZXMiLCAiYXVkaW9faF9zZWwiLA0KKwkJMTUpLA0KKwlH QVRFX0FVRDEoQ0xLX0FVRF9BRENfSElSRVMsICJhdWRfYWRjX2hpcmVzIiwgImF1ZGlvX2hfc2Vs IiwNCisJCTE2KSwNCisJR0FURV9BVUQxKENMS19BVURfQURDX0hJUkVTX1RNTCwgImF1ZF9hZGNf aGlyZXNfdG1sIiwgImF1ZGlvX2hfc2VsIiwNCisJCTE3KSwNCisJR0FURV9BVUQxKENMS19BVURf QUREQTZfQURDLCAiYXVkX2FkZGE2X2FkYyIsICJhdWRpb19zZWwiLA0KKwkJMjApLA0KKwlHQVRF X0FVRDEoQ0xLX0FVRF9BRERBNl9BRENfSElSRVMsICJhdWRfYWRkYTZfYWRjX2hpcmVzIiwgImF1 ZGlvX2hfc2VsIiwNCisJCTIxKSwNCisJR0FURV9BVUQxKENMS19BVURfM1JEX0RBQywgImF1ZF8z cmRfZGFjIiwgImF1ZGlvX3NlbCIsDQorCQkyOCksDQorCUdBVEVfQVVEMShDTEtfQVVEXzNSRF9E QUNfUFJFRElTLCAiYXVkXzNyZF9kYWNfcHJlZGlzIiwgImF1ZGlvX3NlbCIsDQorCQkyOSksDQor CUdBVEVfQVVEMShDTEtfQVVEXzNSRF9EQUNfVE1MLCAiYXVkXzNyZF9kYWNfdG1sIiwgImF1ZGlv X3NlbCIsDQorCQkzMCksDQorCUdBVEVfQVVEMShDTEtfQVVEXzNSRF9EQUNfSElSRVMsICJhdWRf M3JkX2RhY19oaXJlcyIsICJhdWRpb19oX3NlbCIsDQorCQkzMSksDQorCS8qIEFVRDIgKi8NCisJ R0FURV9BVUQyKENMS19BVURfSTJTNV9CLCAiYXVkX2kyczVfYiIsICJhdWRpb19zZWwiLA0KKwkJ MCksDQorCUdBVEVfQVVEMihDTEtfQVVEX0kyUzZfQiwgImF1ZF9pMnM2X2IiLCAiYXVkaW9fc2Vs IiwNCisJCTEpLA0KKwlHQVRFX0FVRDIoQ0xLX0FVRF9JMlM3X0IsICJhdWRfaTJzN19iIiwgImF1 ZGlvX3NlbCIsDQorCQkyKSwNCisJR0FURV9BVUQyKENMS19BVURfSTJTOF9CLCAiYXVkX2kyczhf YiIsICJhdWRpb19zZWwiLA0KKwkJMyksDQorCUdBVEVfQVVEMihDTEtfQVVEX0kyUzlfQiwgImF1 ZF9pMnM5X2IiLCAiYXVkaW9fc2VsIiwNCisJCTQpLA0KK307DQorDQorc3RhdGljIGludCBjbGtf bXQ4MTkyX2F1ZF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQ0KK3sNCisJc3Ry dWN0IGNsa19vbmVjZWxsX2RhdGEgKmNsa19kYXRhOw0KKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5v ZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsNCisJaW50IHI7DQorDQorCWNsa19kYXRhID0gbXRrX2Fs bG9jX2Nsa19kYXRhKENMS19BVURfTlJfQ0xLKTsNCisNCisJbXRrX2Nsa19yZWdpc3Rlcl9nYXRl cyhub2RlLCBhdWRfY2xrcywgQVJSQVlfU0laRShhdWRfY2xrcyksDQorCQkJY2xrX2RhdGEpOw0K Kw0KKwlyID0gb2ZfY2xrX2FkZF9wcm92aWRlcihub2RlLCBvZl9jbGtfc3JjX29uZWNlbGxfZ2V0 LCBjbGtfZGF0YSk7DQorCWlmIChyKQ0KKwkJcmV0dXJuIHI7DQorDQorCXIgPSBkZXZtX29mX3Bs YXRmb3JtX3BvcHVsYXRlKCZwZGV2LT5kZXYpOw0KKwlpZiAocikNCisJCW9mX2Nsa19kZWxfcHJv dmlkZXIobm9kZSk7DQorDQorCXJldHVybiByOw0KK30NCisNCitzdGF0aWMgY29uc3Qgc3RydWN0 IG9mX2RldmljZV9pZCBvZl9tYXRjaF9jbGtfbXQ4MTkyX2F1ZFtdID0gew0KKwl7IC5jb21wYXRp YmxlID0gIm1lZGlhdGVrLG10ODE5Mi1hdWRzeXMiLCB9LA0KKwl7fQ0KK307DQorDQorc3RhdGlj IHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgY2xrX210ODE5Ml9hdWRfZHJ2ID0gew0KKwkucHJvYmUg PSBjbGtfbXQ4MTkyX2F1ZF9wcm9iZSwNCisJLmRyaXZlciA9IHsNCisJCS5uYW1lID0gImNsay1t dDgxOTItYXVkIiwNCisJCS5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX2Nsa19tdDgxOTJfYXVk LA0KKwl9LA0KK307DQorDQorYnVpbHRpbl9wbGF0Zm9ybV9kcml2ZXIoY2xrX210ODE5Ml9hdWRf ZHJ2KTsNCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9tZWRpYXRlay9jbGstbXQ4MTkyLWNhbS5j IGIvZHJpdmVycy9jbGsvbWVkaWF0ZWsvY2xrLW10ODE5Mi1jYW0uYw0KbmV3IGZpbGUgbW9kZSAx MDA2NDQNCmluZGV4IDAwMDAwMDAuLjMwOTYyNWINCi0tLSAvZGV2L251bGwNCisrKyBiL2RyaXZl cnMvY2xrL21lZGlhdGVrL2Nsay1tdDgxOTItY2FtLmMNCkBAIC0wLDAgKzEsNjkgQEANCisvLyBT UERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMA0KKy8vDQorLy8gQ29weXJpZ2h0IChjKSAy MDIwIE1lZGlhVGVrIEluYy4NCisvLyBBdXRob3I6IFdlaXlpIEx1IDx3ZWl5aS5sdUBtZWRpYXRl ay5jb20+DQorDQorI2luY2x1ZGUgPGxpbnV4L2Nsay1wcm92aWRlci5oPg0KKyNpbmNsdWRlIDxs aW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4NCisNCisjaW5jbHVkZSAiY2xrLW10ay5oIg0KKyNpbmNs dWRlICJjbGstZ2F0ZS5oIg0KKw0KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9tdDgxOTIt Y2xrLmg+DQorDQorc3RhdGljIGNvbnN0IHN0cnVjdCBtdGtfZ2F0ZV9yZWdzIGNhbV9jZ19yZWdz ID0gew0KKwkuc2V0X29mcyA9IDB4NCwNCisJLmNscl9vZnMgPSAweDgsDQorCS5zdGFfb2ZzID0g MHgwLA0KK307DQorDQorI2RlZmluZSBHQVRFX0NBTShfaWQsIF9uYW1lLCBfcGFyZW50LCBfc2hp ZnQpCQkJXA0KKwlHQVRFX01USyhfaWQsIF9uYW1lLCBfcGFyZW50LCAmY2FtX2NnX3JlZ3MsIF9z aGlmdCwJXA0KKwkJJm10a19jbGtfZ2F0ZV9vcHNfc2V0Y2xyKQ0KKw0KK3N0YXRpYyBjb25zdCBz dHJ1Y3QgbXRrX2dhdGUgY2FtX2Nsa3NbXSA9IHsNCisJR0FURV9DQU0oQ0xLX0NBTV9MQVJCMTMs ICJjYW1fbGFyYjEzIiwgImNhbV9zZWwiLCAwKSwNCisJR0FURV9DQU0oQ0xLX0NBTV9ERlBfVkFE LCAiY2FtX2RmcF92YWQiLCAiY2FtX3NlbCIsIDEpLA0KKwlHQVRFX0NBTShDTEtfQ0FNX0xBUkIx NCwgImNhbV9sYXJiMTQiLCAiY2FtX3NlbCIsIDIpLA0KKwlHQVRFX0NBTShDTEtfQ0FNX0NBTSwg ImNhbV9jYW0iLCAiY2FtX3NlbCIsIDYpLA0KKwlHQVRFX0NBTShDTEtfQ0FNX0NBTVRHLCAiY2Ft X2NhbXRnIiwgImNhbV9zZWwiLCA3KSwNCisJR0FURV9DQU0oQ0xLX0NBTV9TRU5JTkYsICJjYW1f c2VuaW5mIiwgImNhbV9zZWwiLCA4KSwNCisJR0FURV9DQU0oQ0xLX0NBTV9DQU1TVjAsICJjYW1f Y2Ftc3YwIiwgImNhbV9zZWwiLCA5KSwNCisJR0FURV9DQU0oQ0xLX0NBTV9DQU1TVjEsICJjYW1f Y2Ftc3YxIiwgImNhbV9zZWwiLCAxMCksDQorCUdBVEVfQ0FNKENMS19DQU1fQ0FNU1YyLCAiY2Ft X2NhbXN2MiIsICJjYW1fc2VsIiwgMTEpLA0KKwlHQVRFX0NBTShDTEtfQ0FNX0NBTVNWMywgImNh bV9jYW1zdjMiLCAiY2FtX3NlbCIsIDEyKSwNCisJR0FURV9DQU0oQ0xLX0NBTV9DQ1UwLCAiY2Ft X2NjdTAiLCAiY2FtX3NlbCIsIDEzKSwNCisJR0FURV9DQU0oQ0xLX0NBTV9DQ1UxLCAiY2FtX2Nj dTEiLCAiY2FtX3NlbCIsIDE0KSwNCisJR0FURV9DQU0oQ0xLX0NBTV9NUkFXMCwgImNhbV9tcmF3 MCIsICJjYW1fc2VsIiwgMTUpLA0KKwlHQVRFX0NBTShDTEtfQ0FNX0ZBS0VfRU5HLCAiY2FtX2Zh a2VfZW5nIiwgImNhbV9zZWwiLCAxNyksDQorCUdBVEVfQ0FNKENMS19DQU1fQ0NVX0dBTFMsICJj YW1fY2N1X2dhbHMiLCAiY2FtX3NlbCIsIDE4KSwNCisJR0FURV9DQU0oQ0xLX0NBTV9DQU0yTU1f R0FMUywgImNhbTJtbV9nYWxzIiwgImNhbV9zZWwiLCAxOSksDQorfTsNCisNCitzdGF0aWMgaW50 IGNsa19tdDgxOTJfY2FtX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpDQorew0K KwlzdHJ1Y3QgY2xrX29uZWNlbGxfZGF0YSAqY2xrX2RhdGE7DQorCXN0cnVjdCBkZXZpY2Vfbm9k ZSAqbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOw0KKw0KKwljbGtfZGF0YSA9IG10a19hbGxvY19j bGtfZGF0YShDTEtfQ0FNX05SX0NMSyk7DQorDQorCW10a19jbGtfcmVnaXN0ZXJfZ2F0ZXMobm9k ZSwgY2FtX2Nsa3MsIEFSUkFZX1NJWkUoY2FtX2Nsa3MpLA0KKwkJCWNsa19kYXRhKTsNCisNCisJ cmV0dXJuIG9mX2Nsa19hZGRfcHJvdmlkZXIobm9kZSwgb2ZfY2xrX3NyY19vbmVjZWxsX2dldCwg Y2xrX2RhdGEpOw0KK30NCisNCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBvZl9t YXRjaF9jbGtfbXQ4MTkyX2NhbVtdID0gew0KKwl7IC5jb21wYXRpYmxlID0gIm1lZGlhdGVrLG10 ODE5Mi1jYW1zeXMiLCB9LA0KKwl7fQ0KK307DQorDQorc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9k cml2ZXIgY2xrX210ODE5Ml9jYW1fZHJ2ID0gew0KKwkucHJvYmUgPSBjbGtfbXQ4MTkyX2NhbV9w cm9iZSwNCisJLmRyaXZlciA9IHsNCisJCS5uYW1lID0gImNsay1tdDgxOTItY2FtIiwNCisJCS5v Zl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX2Nsa19tdDgxOTJfY2FtLA0KKwl9LA0KK307DQorDQor YnVpbHRpbl9wbGF0Zm9ybV9kcml2ZXIoY2xrX210ODE5Ml9jYW1fZHJ2KTsNCmRpZmYgLS1naXQg YS9kcml2ZXJzL2Nsay9tZWRpYXRlay9jbGstbXQ4MTkyLWNhbV9yYXdhLmMgYi9kcml2ZXJzL2Ns ay9tZWRpYXRlay9jbGstbXQ4MTkyLWNhbV9yYXdhLmMNCm5ldyBmaWxlIG1vZGUgMTAwNjQ0DQpp bmRleCAwMDAwMDAwLi5jYjE5MTFhDQotLS0gL2Rldi9udWxsDQorKysgYi9kcml2ZXJzL2Nsay9t ZWRpYXRlay9jbGstbXQ4MTkyLWNhbV9yYXdhLmMNCkBAIC0wLDAgKzEsNTYgQEANCisvLyBTUERY LUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMA0KKy8vDQorLy8gQ29weXJpZ2h0IChjKSAyMDIw IE1lZGlhVGVrIEluYy4NCisvLyBBdXRob3I6IFdlaXlpIEx1IDx3ZWl5aS5sdUBtZWRpYXRlay5j b20+DQorDQorI2luY2x1ZGUgPGxpbnV4L2Nsay1wcm92aWRlci5oPg0KKyNpbmNsdWRlIDxsaW51 eC9wbGF0Zm9ybV9kZXZpY2UuaD4NCisNCisjaW5jbHVkZSAiY2xrLW10ay5oIg0KKyNpbmNsdWRl ICJjbGstZ2F0ZS5oIg0KKw0KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9tdDgxOTItY2xr Lmg+DQorDQorc3RhdGljIGNvbnN0IHN0cnVjdCBtdGtfZ2F0ZV9yZWdzIGNhbV9yYXdhX2NnX3Jl Z3MgPSB7DQorCS5zZXRfb2ZzID0gMHg0LA0KKwkuY2xyX29mcyA9IDB4OCwNCisJLnN0YV9vZnMg PSAweDAsDQorfTsNCisNCisjZGVmaW5lIEdBVEVfQ0FNX1JBV0EoX2lkLCBfbmFtZSwgX3BhcmVu dCwgX3NoaWZ0KQkJCVwNCisJR0FURV9NVEsoX2lkLCBfbmFtZSwgX3BhcmVudCwgJmNhbV9yYXdh X2NnX3JlZ3MsIF9zaGlmdCwJXA0KKwkJJm10a19jbGtfZ2F0ZV9vcHNfc2V0Y2xyKQ0KKw0KK3N0 YXRpYyBjb25zdCBzdHJ1Y3QgbXRrX2dhdGUgY2FtX3Jhd2FfY2xrc1tdID0gew0KKwlHQVRFX0NB TV9SQVdBKENMS19DQU1fUkFXQV9MQVJCWCwgImNhbV9yYXdhX2xhcmJ4IiwgImNhbV9zZWwiLCAw KSwNCisJR0FURV9DQU1fUkFXQShDTEtfQ0FNX1JBV0FfQ0FNLCAiY2FtX3Jhd2FfY2FtIiwgImNh bV9zZWwiLCAxKSwNCisJR0FURV9DQU1fUkFXQShDTEtfQ0FNX1JBV0FfQ0FNVEcsICJjYW1fcmF3 YV9jYW10ZyIsICJjYW1fc2VsIiwgMiksDQorfTsNCisNCitzdGF0aWMgaW50IGNsa19tdDgxOTJf Y2FtX3Jhd2FfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikNCit7DQorCXN0cnVj dCBjbGtfb25lY2VsbF9kYXRhICpjbGtfZGF0YTsNCisJc3RydWN0IGRldmljZV9ub2RlICpub2Rl ID0gcGRldi0+ZGV2Lm9mX25vZGU7DQorDQorCWNsa19kYXRhID0gbXRrX2FsbG9jX2Nsa19kYXRh KENMS19DQU1fUkFXQV9OUl9DTEspOw0KKw0KKwltdGtfY2xrX3JlZ2lzdGVyX2dhdGVzKG5vZGUs IGNhbV9yYXdhX2Nsa3MsIEFSUkFZX1NJWkUoY2FtX3Jhd2FfY2xrcyksDQorCQkJY2xrX2RhdGEp Ow0KKw0KKwlyZXR1cm4gb2ZfY2xrX2FkZF9wcm92aWRlcihub2RlLCBvZl9jbGtfc3JjX29uZWNl bGxfZ2V0LCBjbGtfZGF0YSk7DQorfQ0KKw0KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNl X2lkIG9mX21hdGNoX2Nsa19tdDgxOTJfY2FtX3Jhd2FbXSA9IHsNCisJeyAuY29tcGF0aWJsZSA9 ICJtZWRpYXRlayxtdDgxOTItY2Ftc3lzX3Jhd2EiLCB9LA0KKwl7fQ0KK307DQorDQorc3RhdGlj IHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgY2xrX210ODE5Ml9jYW1fcmF3YV9kcnYgPSB7DQorCS5w cm9iZSA9IGNsa19tdDgxOTJfY2FtX3Jhd2FfcHJvYmUsDQorCS5kcml2ZXIgPSB7DQorCQkubmFt ZSA9ICJjbGstbXQ4MTkyLWNhbV9yYXdhIiwNCisJCS5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNo X2Nsa19tdDgxOTJfY2FtX3Jhd2EsDQorCX0sDQorfTsNCisNCitidWlsdGluX3BsYXRmb3JtX2Ry aXZlcihjbGtfbXQ4MTkyX2NhbV9yYXdhX2Rydik7DQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsv bWVkaWF0ZWsvY2xrLW10ODE5Mi1jYW1fcmF3Yi5jIGIvZHJpdmVycy9jbGsvbWVkaWF0ZWsvY2xr LW10ODE5Mi1jYW1fcmF3Yi5jDQpuZXcgZmlsZSBtb2RlIDEwMDY0NA0KaW5kZXggMDAwMDAwMC4u N2ZjYzMzZg0KLS0tIC9kZXYvbnVsbA0KKysrIGIvZHJpdmVycy9jbGsvbWVkaWF0ZWsvY2xrLW10 ODE5Mi1jYW1fcmF3Yi5jDQpAQCAtMCwwICsxLDU2IEBADQorLy8gU1BEWC1MaWNlbnNlLUlkZW50 aWZpZXI6IEdQTC0yLjANCisvLw0KKy8vIENvcHlyaWdodCAoYykgMjAyMCBNZWRpYVRlayBJbmMu DQorLy8gQXV0aG9yOiBXZWl5aSBMdSA8d2VpeWkubHVAbWVkaWF0ZWsuY29tPg0KKw0KKyNpbmNs dWRlIDxsaW51eC9jbGstcHJvdmlkZXIuaD4NCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2 aWNlLmg+DQorDQorI2luY2x1ZGUgImNsay1tdGsuaCINCisjaW5jbHVkZSAiY2xrLWdhdGUuaCIN CisNCisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svbXQ4MTkyLWNsay5oPg0KKw0KK3N0YXRp YyBjb25zdCBzdHJ1Y3QgbXRrX2dhdGVfcmVncyBjYW1fcmF3Yl9jZ19yZWdzID0gew0KKwkuc2V0 X29mcyA9IDB4NCwNCisJLmNscl9vZnMgPSAweDgsDQorCS5zdGFfb2ZzID0gMHgwLA0KK307DQor DQorI2RlZmluZSBHQVRFX0NBTV9SQVdCKF9pZCwgX25hbWUsIF9wYXJlbnQsIF9zaGlmdCkJCQlc DQorCUdBVEVfTVRLKF9pZCwgX25hbWUsIF9wYXJlbnQsICZjYW1fcmF3Yl9jZ19yZWdzLCBfc2hp ZnQsCVwNCisJCSZtdGtfY2xrX2dhdGVfb3BzX3NldGNscikNCisNCitzdGF0aWMgY29uc3Qgc3Ry dWN0IG10a19nYXRlIGNhbV9yYXdiX2Nsa3NbXSA9IHsNCisJR0FURV9DQU1fUkFXQihDTEtfQ0FN X1JBV0JfTEFSQlgsICJjYW1fcmF3Yl9sYXJieCIsICJjYW1fc2VsIiwgMCksDQorCUdBVEVfQ0FN X1JBV0IoQ0xLX0NBTV9SQVdCX0NBTSwgImNhbV9yYXdiX2NhbSIsICJjYW1fc2VsIiwgMSksDQor CUdBVEVfQ0FNX1JBV0IoQ0xLX0NBTV9SQVdCX0NBTVRHLCAiY2FtX3Jhd2JfY2FtdGciLCAiY2Ft X3NlbCIsIDIpLA0KK307DQorDQorc3RhdGljIGludCBjbGtfbXQ4MTkyX2NhbV9yYXdiX3Byb2Jl KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpDQorew0KKwlzdHJ1Y3QgY2xrX29uZWNlbGxf ZGF0YSAqY2xrX2RhdGE7DQorCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSA9IHBkZXYtPmRldi5v Zl9ub2RlOw0KKw0KKwljbGtfZGF0YSA9IG10a19hbGxvY19jbGtfZGF0YShDTEtfQ0FNX1JBV0Jf TlJfQ0xLKTsNCisNCisJbXRrX2Nsa19yZWdpc3Rlcl9nYXRlcyhub2RlLCBjYW1fcmF3Yl9jbGtz LCBBUlJBWV9TSVpFKGNhbV9yYXdiX2Nsa3MpLA0KKwkJCWNsa19kYXRhKTsNCisNCisJcmV0dXJu IG9mX2Nsa19hZGRfcHJvdmlkZXIobm9kZSwgb2ZfY2xrX3NyY19vbmVjZWxsX2dldCwgY2xrX2Rh dGEpOw0KK30NCisNCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBvZl9tYXRjaF9j bGtfbXQ4MTkyX2NhbV9yYXdiW10gPSB7DQorCXsgLmNvbXBhdGlibGUgPSAibWVkaWF0ZWssbXQ4 MTkyLWNhbXN5c19yYXdiIiwgfSwNCisJe30NCit9Ow0KKw0KK3N0YXRpYyBzdHJ1Y3QgcGxhdGZv cm1fZHJpdmVyIGNsa19tdDgxOTJfY2FtX3Jhd2JfZHJ2ID0gew0KKwkucHJvYmUgPSBjbGtfbXQ4 MTkyX2NhbV9yYXdiX3Byb2JlLA0KKwkuZHJpdmVyID0gew0KKwkJLm5hbWUgPSAiY2xrLW10ODE5 Mi1jYW1fcmF3YiIsDQorCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9jbGtfbXQ4MTkyX2Nh bV9yYXdiLA0KKwl9LA0KK307DQorDQorYnVpbHRpbl9wbGF0Zm9ybV9kcml2ZXIoY2xrX210ODE5 Ml9jYW1fcmF3Yl9kcnYpOw0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL21lZGlhdGVrL2Nsay1t dDgxOTItY2FtX3Jhd2MuYyBiL2RyaXZlcnMvY2xrL21lZGlhdGVrL2Nsay1tdDgxOTItY2FtX3Jh d2MuYw0KbmV3IGZpbGUgbW9kZSAxMDA2NDQNCmluZGV4IDAwMDAwMDAuLmJjMmFhNTQNCi0tLSAv ZGV2L251bGwNCisrKyBiL2RyaXZlcnMvY2xrL21lZGlhdGVrL2Nsay1tdDgxOTItY2FtX3Jhd2Mu Yw0KQEAgLTAsMCArMSw1NiBAQA0KKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4w DQorLy8NCisvLyBDb3B5cmlnaHQgKGMpIDIwMjAgTWVkaWFUZWsgSW5jLg0KKy8vIEF1dGhvcjog V2VpeWkgTHUgPHdlaXlpLmx1QG1lZGlhdGVrLmNvbT4NCisNCisjaW5jbHVkZSA8bGludXgvY2xr LXByb3ZpZGVyLmg+DQorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPg0KKw0KKyNp bmNsdWRlICJjbGstbXRrLmgiDQorI2luY2x1ZGUgImNsay1nYXRlLmgiDQorDQorI2luY2x1ZGUg PGR0LWJpbmRpbmdzL2Nsb2NrL210ODE5Mi1jbGsuaD4NCisNCitzdGF0aWMgY29uc3Qgc3RydWN0 IG10a19nYXRlX3JlZ3MgY2FtX3Jhd2NfY2dfcmVncyA9IHsNCisJLnNldF9vZnMgPSAweDQsDQor CS5jbHJfb2ZzID0gMHg4LA0KKwkuc3RhX29mcyA9IDB4MCwNCit9Ow0KKw0KKyNkZWZpbmUgR0FU RV9DQU1fUkFXQyhfaWQsIF9uYW1lLCBfcGFyZW50LCBfc2hpZnQpCQkJXA0KKwlHQVRFX01USyhf aWQsIF9uYW1lLCBfcGFyZW50LCAmY2FtX3Jhd2NfY2dfcmVncywgX3NoaWZ0LAlcDQorCQkmbXRr X2Nsa19nYXRlX29wc19zZXRjbHIpDQorDQorc3RhdGljIGNvbnN0IHN0cnVjdCBtdGtfZ2F0ZSBj YW1fcmF3Y19jbGtzW10gPSB7DQorCUdBVEVfQ0FNX1JBV0MoQ0xLX0NBTV9SQVdDX0xBUkJYLCAi Y2FtX3Jhd2NfbGFyYngiLCAiY2FtX3NlbCIsIDApLA0KKwlHQVRFX0NBTV9SQVdDKENMS19DQU1f UkFXQ19DQU0sICJjYW1fcmF3Y19jYW0iLCAiY2FtX3NlbCIsIDEpLA0KKwlHQVRFX0NBTV9SQVdD KENMS19DQU1fUkFXQ19DQU1URywgImNhbV9yYXdjX2NhbXRnIiwgImNhbV9zZWwiLCAyKSwNCit9 Ow0KKw0KK3N0YXRpYyBpbnQgY2xrX210ODE5Ml9jYW1fcmF3Y19wcm9iZShzdHJ1Y3QgcGxhdGZv cm1fZGV2aWNlICpwZGV2KQ0KK3sNCisJc3RydWN0IGNsa19vbmVjZWxsX2RhdGEgKmNsa19kYXRh Ow0KKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsNCisNCisJ Y2xrX2RhdGEgPSBtdGtfYWxsb2NfY2xrX2RhdGEoQ0xLX0NBTV9SQVdDX05SX0NMSyk7DQorDQor CW10a19jbGtfcmVnaXN0ZXJfZ2F0ZXMobm9kZSwgY2FtX3Jhd2NfY2xrcywgQVJSQVlfU0laRShj YW1fcmF3Y19jbGtzKSwNCisJCQljbGtfZGF0YSk7DQorDQorCXJldHVybiBvZl9jbGtfYWRkX3By b3ZpZGVyKG5vZGUsIG9mX2Nsa19zcmNfb25lY2VsbF9nZXQsIGNsa19kYXRhKTsNCit9DQorDQor c3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgb2ZfbWF0Y2hfY2xrX210ODE5Ml9jYW1f cmF3Y1tdID0gew0KKwl7IC5jb21wYXRpYmxlID0gIm1lZGlhdGVrLG10ODE5Mi1jYW1zeXNfcmF3 YyIsIH0sDQorCXt9DQorfTsNCisNCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBjbGtf bXQ4MTkyX2NhbV9yYXdjX2RydiA9IHsNCisJLnByb2JlID0gY2xrX210ODE5Ml9jYW1fcmF3Y19w cm9iZSwNCisJLmRyaXZlciA9IHsNCisJCS5uYW1lID0gImNsay1tdDgxOTItY2FtX3Jhd2MiLA0K KwkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfY2xrX210ODE5Ml9jYW1fcmF3YywNCisJfSwN Cit9Ow0KKw0KK2J1aWx0aW5fcGxhdGZvcm1fZHJpdmVyKGNsa19tdDgxOTJfY2FtX3Jhd2NfZHJ2 KTsNCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9tZWRpYXRlay9jbGstbXQ4MTkyLWltZy5jIGIv ZHJpdmVycy9jbGsvbWVkaWF0ZWsvY2xrLW10ODE5Mi1pbWcuYw0KbmV3IGZpbGUgbW9kZSAxMDA2 NDQNCmluZGV4IDAwMDAwMDAuLjlmYTBmNDcNCi0tLSAvZGV2L251bGwNCisrKyBiL2RyaXZlcnMv Y2xrL21lZGlhdGVrL2Nsay1tdDgxOTItaW1nLmMNCkBAIC0wLDAgKzEsNTcgQEANCisvLyBTUERY LUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMA0KKy8vDQorLy8gQ29weXJpZ2h0IChjKSAyMDIw IE1lZGlhVGVrIEluYy4NCisvLyBBdXRob3I6IFdlaXlpIEx1IDx3ZWl5aS5sdUBtZWRpYXRlay5j b20+DQorDQorI2luY2x1ZGUgPGxpbnV4L2Nsay1wcm92aWRlci5oPg0KKyNpbmNsdWRlIDxsaW51 eC9wbGF0Zm9ybV9kZXZpY2UuaD4NCisNCisjaW5jbHVkZSAiY2xrLW10ay5oIg0KKyNpbmNsdWRl ICJjbGstZ2F0ZS5oIg0KKw0KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9tdDgxOTItY2xr Lmg+DQorDQorc3RhdGljIGNvbnN0IHN0cnVjdCBtdGtfZ2F0ZV9yZWdzIGltZ19jZ19yZWdzID0g ew0KKwkuc2V0X29mcyA9IDB4NCwNCisJLmNscl9vZnMgPSAweDgsDQorCS5zdGFfb2ZzID0gMHgw LA0KK307DQorDQorI2RlZmluZSBHQVRFX0lNRyhfaWQsIF9uYW1lLCBfcGFyZW50LCBfc2hpZnQp CQkJXA0KKwlHQVRFX01USyhfaWQsIF9uYW1lLCBfcGFyZW50LCAmaW1nX2NnX3JlZ3MsIF9zaGlm dCwJXA0KKwkJJm10a19jbGtfZ2F0ZV9vcHNfc2V0Y2xyKQ0KKw0KK3N0YXRpYyBjb25zdCBzdHJ1 Y3QgbXRrX2dhdGUgaW1nX2Nsa3NbXSA9IHsNCisJR0FURV9JTUcoQ0xLX0lNR19MQVJCOSwgImlt Z19sYXJiOSIsICJpbWcxX3NlbCIsIDApLA0KKwlHQVRFX0lNRyhDTEtfSU1HX0xBUkIxMCwgImlt Z19sYXJiMTAiLCAiaW1nMV9zZWwiLCAxKSwNCisJR0FURV9JTUcoQ0xLX0lNR19ESVAsICJpbWdf ZGlwIiwgImltZzFfc2VsIiwgMiksDQorCUdBVEVfSU1HKENMS19JTUdfR0FMUywgImltZ19nYWxz IiwgImltZzFfc2VsIiwgMTIpLA0KK307DQorDQorc3RhdGljIGludCBjbGtfbXQ4MTkyX2ltZ19w cm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQ0KK3sNCisJc3RydWN0IGNsa19vbmVj ZWxsX2RhdGEgKmNsa19kYXRhOw0KKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUgPSBwZGV2LT5k ZXYub2Zfbm9kZTsNCisNCisJY2xrX2RhdGEgPSBtdGtfYWxsb2NfY2xrX2RhdGEoQ0xLX0lNR19O Ul9DTEspOw0KKw0KKwltdGtfY2xrX3JlZ2lzdGVyX2dhdGVzKG5vZGUsIGltZ19jbGtzLCBBUlJB WV9TSVpFKGltZ19jbGtzKSwNCisJCQljbGtfZGF0YSk7DQorDQorCXJldHVybiBvZl9jbGtfYWRk X3Byb3ZpZGVyKG5vZGUsIG9mX2Nsa19zcmNfb25lY2VsbF9nZXQsIGNsa19kYXRhKTsNCit9DQor DQorc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgb2ZfbWF0Y2hfY2xrX210ODE5Ml9p bWdbXSA9IHsNCisJeyAuY29tcGF0aWJsZSA9ICJtZWRpYXRlayxtdDgxOTItaW1nc3lzIiwgfSwN CisJe30NCit9Ow0KKw0KK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGNsa19tdDgxOTJf aW1nX2RydiA9IHsNCisJLnByb2JlID0gY2xrX210ODE5Ml9pbWdfcHJvYmUsDQorCS5kcml2ZXIg PSB7DQorCQkubmFtZSA9ICJjbGstbXQ4MTkyLWltZyIsDQorCQkub2ZfbWF0Y2hfdGFibGUgPSBv Zl9tYXRjaF9jbGtfbXQ4MTkyX2ltZywNCisJfSwNCit9Ow0KKw0KK2J1aWx0aW5fcGxhdGZvcm1f ZHJpdmVyKGNsa19tdDgxOTJfaW1nX2Rydik7DQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvbWVk aWF0ZWsvY2xrLW10ODE5Mi1pbWcyLmMgYi9kcml2ZXJzL2Nsay9tZWRpYXRlay9jbGstbXQ4MTky LWltZzIuYw0KbmV3IGZpbGUgbW9kZSAxMDA2NDQNCmluZGV4IDAwMDAwMDAuLjQyOTI1Y2MNCi0t LSAvZGV2L251bGwNCisrKyBiL2RyaXZlcnMvY2xrL21lZGlhdGVrL2Nsay1tdDgxOTItaW1nMi5j DQpAQCAtMCwwICsxLDU5IEBADQorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAN CisvLw0KKy8vIENvcHlyaWdodCAoYykgMjAyMCBNZWRpYVRlayBJbmMuDQorLy8gQXV0aG9yOiBX ZWl5aSBMdSA8d2VpeWkubHVAbWVkaWF0ZWsuY29tPg0KKw0KKyNpbmNsdWRlIDxsaW51eC9jbGst cHJvdmlkZXIuaD4NCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+DQorDQorI2lu Y2x1ZGUgImNsay1tdGsuaCINCisjaW5jbHVkZSAiY2xrLWdhdGUuaCINCisNCisjaW5jbHVkZSA8 ZHQtYmluZGluZ3MvY2xvY2svbXQ4MTkyLWNsay5oPg0KKw0KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qg bXRrX2dhdGVfcmVncyBpbWcyX2NnX3JlZ3MgPSB7DQorCS5zZXRfb2ZzID0gMHg0LA0KKwkuY2xy X29mcyA9IDB4OCwNCisJLnN0YV9vZnMgPSAweDAsDQorfTsNCisNCisjZGVmaW5lIEdBVEVfSU1H MihfaWQsIF9uYW1lLCBfcGFyZW50LCBfc2hpZnQpCQkJXA0KKwlHQVRFX01USyhfaWQsIF9uYW1l LCBfcGFyZW50LCAmaW1nMl9jZ19yZWdzLCBfc2hpZnQsCVwNCisJCSZtdGtfY2xrX2dhdGVfb3Bz X3NldGNscikNCisNCitzdGF0aWMgY29uc3Qgc3RydWN0IG10a19nYXRlIGltZzJfY2xrc1tdID0g ew0KKwlHQVRFX0lNRzIoQ0xLX0lNRzJfTEFSQjExLCAiaW1nMl9sYXJiMTEiLCAiaW1nMV9zZWwi LCAwKSwNCisJR0FURV9JTUcyKENMS19JTUcyX0xBUkIxMiwgImltZzJfbGFyYjEyIiwgImltZzFf c2VsIiwgMSksDQorCUdBVEVfSU1HMihDTEtfSU1HMl9NRkIsICJpbWcyX21mYiIsICJpbWcxX3Nl bCIsIDYpLA0KKwlHQVRFX0lNRzIoQ0xLX0lNRzJfV1BFLCAiaW1nMl93cGUiLCAiaW1nMV9zZWwi LCA3KSwNCisJR0FURV9JTUcyKENMS19JTUcyX01TUywgImltZzJfbXNzIiwgImltZzFfc2VsIiwg OCksDQorCUdBVEVfSU1HMihDTEtfSU1HMl9HQUxTLCAiaW1nMl9nYWxzIiwgImltZzFfc2VsIiwg MTIpLA0KK307DQorDQorc3RhdGljIGludCBjbGtfbXQ4MTkyX2ltZzJfcHJvYmUoc3RydWN0IHBs YXRmb3JtX2RldmljZSAqcGRldikNCit7DQorCXN0cnVjdCBjbGtfb25lY2VsbF9kYXRhICpjbGtf ZGF0YTsNCisJc3RydWN0IGRldmljZV9ub2RlICpub2RlID0gcGRldi0+ZGV2Lm9mX25vZGU7DQor DQorCWNsa19kYXRhID0gbXRrX2FsbG9jX2Nsa19kYXRhKENMS19JTUcyX05SX0NMSyk7DQorDQor CW10a19jbGtfcmVnaXN0ZXJfZ2F0ZXMobm9kZSwgaW1nMl9jbGtzLCBBUlJBWV9TSVpFKGltZzJf Y2xrcyksDQorCQkJY2xrX2RhdGEpOw0KKw0KKwlyZXR1cm4gb2ZfY2xrX2FkZF9wcm92aWRlcihu b2RlLCBvZl9jbGtfc3JjX29uZWNlbGxfZ2V0LCBjbGtfZGF0YSk7DQorfQ0KKw0KK3N0YXRpYyBj b25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG9mX21hdGNoX2Nsa19tdDgxOTJfaW1nMltdID0gew0K Kwl7IC5jb21wYXRpYmxlID0gIm1lZGlhdGVrLG10ODE5Mi1pbWdzeXMyIiwgfSwNCisJe30NCit9 Ow0KKw0KK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGNsa19tdDgxOTJfaW1nMl9kcnYg PSB7DQorCS5wcm9iZSA9IGNsa19tdDgxOTJfaW1nMl9wcm9iZSwNCisJLmRyaXZlciA9IHsNCisJ CS5uYW1lID0gImNsay1tdDgxOTItaW1nMiIsDQorCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRj aF9jbGtfbXQ4MTkyX2ltZzIsDQorCX0sDQorfTsNCisNCitidWlsdGluX3BsYXRmb3JtX2RyaXZl cihjbGtfbXQ4MTkyX2ltZzJfZHJ2KTsNCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9tZWRpYXRl ay9jbGstbXQ4MTkyLWltcF9paWNfd3JhcF9jLmMgYi9kcml2ZXJzL2Nsay9tZWRpYXRlay9jbGst bXQ4MTkyLWltcF9paWNfd3JhcF9jLmMNCm5ldyBmaWxlIG1vZGUgMTAwNjQ0DQppbmRleCAwMDAw MDAwLi44OGQ4ZDEyDQotLS0gL2Rldi9udWxsDQorKysgYi9kcml2ZXJzL2Nsay9tZWRpYXRlay9j bGstbXQ4MTkyLWltcF9paWNfd3JhcF9jLmMNCkBAIC0wLDAgKzEsNjEgQEANCisvLyBTUERYLUxp Y2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMA0KKy8vDQorLy8gQ29weXJpZ2h0IChjKSAyMDIwIE1l ZGlhVGVrIEluYy4NCisvLyBBdXRob3I6IFdlaXlpIEx1IDx3ZWl5aS5sdUBtZWRpYXRlay5jb20+ DQorDQorI2luY2x1ZGUgPGxpbnV4L2Nsay1wcm92aWRlci5oPg0KKyNpbmNsdWRlIDxsaW51eC9w bGF0Zm9ybV9kZXZpY2UuaD4NCisNCisjaW5jbHVkZSAiY2xrLW10ay5oIg0KKyNpbmNsdWRlICJj bGstZ2F0ZS5oIg0KKw0KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9tdDgxOTItY2xrLmg+ DQorDQorc3RhdGljIGNvbnN0IHN0cnVjdCBtdGtfZ2F0ZV9yZWdzIGltcF9paWNfd3JhcF9jX2Nn X3JlZ3MgPSB7DQorCS5zZXRfb2ZzID0gMHhlMDgsDQorCS5jbHJfb2ZzID0gMHhlMDQsDQorCS5z dGFfb2ZzID0gMHhlMDAsDQorfTsNCisNCisjZGVmaW5lIEdBVEVfSU1QX0lJQ19XUkFQX0MoX2lk LCBfbmFtZSwgX3BhcmVudCwgX3NoaWZ0KQkJXA0KKwlHQVRFX01USyhfaWQsIF9uYW1lLCBfcGFy ZW50LCAmaW1wX2lpY193cmFwX2NfY2dfcmVncywgX3NoaWZ0LAlcDQorCQkmbXRrX2Nsa19nYXRl X29wc19zZXRjbHIpDQorDQorc3RhdGljIGNvbnN0IHN0cnVjdCBtdGtfZ2F0ZSBpbXBfaWljX3dy YXBfY19jbGtzW10gPSB7DQorCUdBVEVfSU1QX0lJQ19XUkFQX0MoQ0xLX0lNUF9JSUNfV1JBUF9D X0kyQzEwLCAiaW1wX2lpY193cmFwX2NfaTJjMTAiLA0KKwkJImluZnJhX2kyYzAiLCAwKSwNCisJ R0FURV9JTVBfSUlDX1dSQVBfQyhDTEtfSU1QX0lJQ19XUkFQX0NfSTJDMTEsICJpbXBfaWljX3dy YXBfY19pMmMxMSIsDQorCQkiaW5mcmFfaTJjMCIsIDEpLA0KKwlHQVRFX0lNUF9JSUNfV1JBUF9D KENMS19JTVBfSUlDX1dSQVBfQ19JMkMxMiwgImltcF9paWNfd3JhcF9jX2kyYzEyIiwNCisJCSJp bmZyYV9pMmMwIiwgMiksDQorCUdBVEVfSU1QX0lJQ19XUkFQX0MoQ0xLX0lNUF9JSUNfV1JBUF9D X0kyQzEzLCAiaW1wX2lpY193cmFwX2NfaTJjMTMiLA0KKwkJImluZnJhX2kyYzAiLCAzKSwNCit9 Ow0KKw0KK3N0YXRpYyBpbnQgY2xrX210ODE5Ml9pbXBfaWljX3dyYXBfY19wcm9iZShzdHJ1Y3Qg cGxhdGZvcm1fZGV2aWNlICpwZGV2KQ0KK3sNCisJc3RydWN0IGNsa19vbmVjZWxsX2RhdGEgKmNs a19kYXRhOw0KKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsN CisNCisJY2xrX2RhdGEgPSBtdGtfYWxsb2NfY2xrX2RhdGEoQ0xLX0lNUF9JSUNfV1JBUF9DX05S X0NMSyk7DQorDQorCW10a19jbGtfcmVnaXN0ZXJfZ2F0ZXMobm9kZSwgaW1wX2lpY193cmFwX2Nf Y2xrcywNCisJCUFSUkFZX1NJWkUoaW1wX2lpY193cmFwX2NfY2xrcyksIGNsa19kYXRhKTsNCisN CisJcmV0dXJuIG9mX2Nsa19hZGRfcHJvdmlkZXIobm9kZSwgb2ZfY2xrX3NyY19vbmVjZWxsX2dl dCwgY2xrX2RhdGEpOw0KK30NCisNCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBv Zl9tYXRjaF9jbGtfbXQ4MTkyX2ltcF9paWNfd3JhcF9jW10gPSB7DQorCXsgLmNvbXBhdGlibGUg PSAibWVkaWF0ZWssbXQ4MTkyLWltcF9paWNfd3JhcF9jIiwgfSwNCisJe30NCit9Ow0KKw0KK3N0 YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGNsa19tdDgxOTJfaW1wX2lpY193cmFwX2NfZHJ2 ID0gew0KKwkucHJvYmUgPSBjbGtfbXQ4MTkyX2ltcF9paWNfd3JhcF9jX3Byb2JlLA0KKwkuZHJp dmVyID0gew0KKwkJLm5hbWUgPSAiY2xrLW10ODE5Mi1pbXBfaWljX3dyYXBfYyIsDQorCQkub2Zf bWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9jbGtfbXQ4MTkyX2ltcF9paWNfd3JhcF9jLA0KKwl9LA0K K307DQorDQorYnVpbHRpbl9wbGF0Zm9ybV9kcml2ZXIoY2xrX210ODE5Ml9pbXBfaWljX3dyYXBf Y19kcnYpOw0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL21lZGlhdGVrL2Nsay1tdDgxOTItaW1w X2lpY193cmFwX2UuYyBiL2RyaXZlcnMvY2xrL21lZGlhdGVrL2Nsay1tdDgxOTItaW1wX2lpY193 cmFwX2UuYw0KbmV3IGZpbGUgbW9kZSAxMDA2NDQNCmluZGV4IDAwMDAwMDAuLmZjMTQwMTMNCi0t LSAvZGV2L251bGwNCisrKyBiL2RyaXZlcnMvY2xrL21lZGlhdGVrL2Nsay1tdDgxOTItaW1wX2lp Y193cmFwX2UuYw0KQEAgLTAsMCArMSw1NSBAQA0KKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVy OiBHUEwtMi4wDQorLy8NCisvLyBDb3B5cmlnaHQgKGMpIDIwMjAgTWVkaWFUZWsgSW5jLg0KKy8v IEF1dGhvcjogV2VpeWkgTHUgPHdlaXlpLmx1QG1lZGlhdGVrLmNvbT4NCisNCisjaW5jbHVkZSA8 bGludXgvY2xrLXByb3ZpZGVyLmg+DQorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5o Pg0KKw0KKyNpbmNsdWRlICJjbGstbXRrLmgiDQorI2luY2x1ZGUgImNsay1nYXRlLmgiDQorDQor I2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL210ODE5Mi1jbGsuaD4NCisNCitzdGF0aWMgY29u c3Qgc3RydWN0IG10a19nYXRlX3JlZ3MgaW1wX2lpY193cmFwX2VfY2dfcmVncyA9IHsNCisJLnNl dF9vZnMgPSAweGUwOCwNCisJLmNscl9vZnMgPSAweGUwNCwNCisJLnN0YV9vZnMgPSAweGUwMCwN Cit9Ow0KKw0KKyNkZWZpbmUgR0FURV9JTVBfSUlDX1dSQVBfRShfaWQsIF9uYW1lLCBfcGFyZW50 LCBfc2hpZnQpCQlcDQorCUdBVEVfTVRLKF9pZCwgX25hbWUsIF9wYXJlbnQsICZpbXBfaWljX3dy YXBfZV9jZ19yZWdzLCBfc2hpZnQsCVwNCisJCSZtdGtfY2xrX2dhdGVfb3BzX3NldGNscikNCisN CitzdGF0aWMgY29uc3Qgc3RydWN0IG10a19nYXRlIGltcF9paWNfd3JhcF9lX2Nsa3NbXSA9IHsN CisJR0FURV9JTVBfSUlDX1dSQVBfRShDTEtfSU1QX0lJQ19XUkFQX0VfSTJDMywgImltcF9paWNf d3JhcF9lX2kyYzMiLA0KKwkJImluZnJhX2kyYzAiLCAwKSwNCit9Ow0KKw0KK3N0YXRpYyBpbnQg Y2xrX210ODE5Ml9pbXBfaWljX3dyYXBfZV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpw ZGV2KQ0KK3sNCisJc3RydWN0IGNsa19vbmVjZWxsX2RhdGEgKmNsa19kYXRhOw0KKwlzdHJ1Y3Qg ZGV2aWNlX25vZGUgKm5vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsNCisNCisJY2xrX2RhdGEgPSBt dGtfYWxsb2NfY2xrX2RhdGEoQ0xLX0lNUF9JSUNfV1JBUF9FX05SX0NMSyk7DQorDQorCW10a19j bGtfcmVnaXN0ZXJfZ2F0ZXMobm9kZSwgaW1wX2lpY193cmFwX2VfY2xrcywNCisJCUFSUkFZX1NJ WkUoaW1wX2lpY193cmFwX2VfY2xrcyksIGNsa19kYXRhKTsNCisNCisJcmV0dXJuIG9mX2Nsa19h ZGRfcHJvdmlkZXIobm9kZSwgb2ZfY2xrX3NyY19vbmVjZWxsX2dldCwgY2xrX2RhdGEpOw0KK30N CisNCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBvZl9tYXRjaF9jbGtfbXQ4MTky X2ltcF9paWNfd3JhcF9lW10gPSB7DQorCXsgLmNvbXBhdGlibGUgPSAibWVkaWF0ZWssbXQ4MTky LWltcF9paWNfd3JhcF9lIiwgfSwNCisJe30NCit9Ow0KKw0KK3N0YXRpYyBzdHJ1Y3QgcGxhdGZv cm1fZHJpdmVyIGNsa19tdDgxOTJfaW1wX2lpY193cmFwX2VfZHJ2ID0gew0KKwkucHJvYmUgPSBj bGtfbXQ4MTkyX2ltcF9paWNfd3JhcF9lX3Byb2JlLA0KKwkuZHJpdmVyID0gew0KKwkJLm5hbWUg PSAiY2xrLW10ODE5Mi1pbXBfaWljX3dyYXBfZSIsDQorCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9t YXRjaF9jbGtfbXQ4MTkyX2ltcF9paWNfd3JhcF9lLA0KKwl9LA0KK307DQorDQorYnVpbHRpbl9w bGF0Zm9ybV9kcml2ZXIoY2xrX210ODE5Ml9pbXBfaWljX3dyYXBfZV9kcnYpOw0KZGlmZiAtLWdp dCBhL2RyaXZlcnMvY2xrL21lZGlhdGVrL2Nsay1tdDgxOTItaW1wX2lpY193cmFwX24uYyBiL2Ry aXZlcnMvY2xrL21lZGlhdGVrL2Nsay1tdDgxOTItaW1wX2lpY193cmFwX24uYw0KbmV3IGZpbGUg bW9kZSAxMDA2NDQNCmluZGV4IDAwMDAwMDAuLjUyNWU0M2QNCi0tLSAvZGV2L251bGwNCisrKyBi L2RyaXZlcnMvY2xrL21lZGlhdGVrL2Nsay1tdDgxOTItaW1wX2lpY193cmFwX24uYw0KQEAgLTAs MCArMSw1NyBAQA0KKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wDQorLy8NCisv LyBDb3B5cmlnaHQgKGMpIDIwMjAgTWVkaWFUZWsgSW5jLg0KKy8vIEF1dGhvcjogV2VpeWkgTHUg PHdlaXlpLmx1QG1lZGlhdGVrLmNvbT4NCisNCisjaW5jbHVkZSA8bGludXgvY2xrLXByb3ZpZGVy Lmg+DQorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPg0KKw0KKyNpbmNsdWRlICJj bGstbXRrLmgiDQorI2luY2x1ZGUgImNsay1nYXRlLmgiDQorDQorI2luY2x1ZGUgPGR0LWJpbmRp bmdzL2Nsb2NrL210ODE5Mi1jbGsuaD4NCisNCitzdGF0aWMgY29uc3Qgc3RydWN0IG10a19nYXRl X3JlZ3MgaW1wX2lpY193cmFwX25fY2dfcmVncyA9IHsNCisJLnNldF9vZnMgPSAweGUwOCwNCisJ LmNscl9vZnMgPSAweGUwNCwNCisJLnN0YV9vZnMgPSAweGUwMCwNCit9Ow0KKw0KKyNkZWZpbmUg R0FURV9JTVBfSUlDX1dSQVBfTihfaWQsIF9uYW1lLCBfcGFyZW50LCBfc2hpZnQpCQlcDQorCUdB VEVfTVRLKF9pZCwgX25hbWUsIF9wYXJlbnQsICZpbXBfaWljX3dyYXBfbl9jZ19yZWdzLCBfc2hp ZnQsCVwNCisJCSZtdGtfY2xrX2dhdGVfb3BzX3NldGNscikNCisNCitzdGF0aWMgY29uc3Qgc3Ry dWN0IG10a19nYXRlIGltcF9paWNfd3JhcF9uX2Nsa3NbXSA9IHsNCisJR0FURV9JTVBfSUlDX1dS QVBfTihDTEtfSU1QX0lJQ19XUkFQX05fSTJDMCwgImltcF9paWNfd3JhcF9uX2kyYzAiLA0KKwkJ ImluZnJhX2kyYzAiLCAwKSwNCisJR0FURV9JTVBfSUlDX1dSQVBfTihDTEtfSU1QX0lJQ19XUkFQ X05fSTJDNiwgImltcF9paWNfd3JhcF9uX2kyYzYiLA0KKwkJImluZnJhX2kyYzAiLCAxKSwNCit9 Ow0KKw0KK3N0YXRpYyBpbnQgY2xrX210ODE5Ml9pbXBfaWljX3dyYXBfbl9wcm9iZShzdHJ1Y3Qg cGxhdGZvcm1fZGV2aWNlICpwZGV2KQ0KK3sNCisJc3RydWN0IGNsa19vbmVjZWxsX2RhdGEgKmNs a19kYXRhOw0KKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsN CisNCisJY2xrX2RhdGEgPSBtdGtfYWxsb2NfY2xrX2RhdGEoQ0xLX0lNUF9JSUNfV1JBUF9OX05S X0NMSyk7DQorDQorCW10a19jbGtfcmVnaXN0ZXJfZ2F0ZXMobm9kZSwgaW1wX2lpY193cmFwX25f Y2xrcywNCisJCUFSUkFZX1NJWkUoaW1wX2lpY193cmFwX25fY2xrcyksIGNsa19kYXRhKTsNCisN CisJcmV0dXJuIG9mX2Nsa19hZGRfcHJvdmlkZXIobm9kZSwgb2ZfY2xrX3NyY19vbmVjZWxsX2dl dCwgY2xrX2RhdGEpOw0KK30NCisNCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBv Zl9tYXRjaF9jbGtfbXQ4MTkyX2ltcF9paWNfd3JhcF9uW10gPSB7DQorCXsgLmNvbXBhdGlibGUg PSAibWVkaWF0ZWssbXQ4MTkyLWltcF9paWNfd3JhcF9uIiwgfSwNCisJe30NCit9Ow0KKw0KK3N0 YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGNsa19tdDgxOTJfaW1wX2lpY193cmFwX25fZHJ2 ID0gew0KKwkucHJvYmUgPSBjbGtfbXQ4MTkyX2ltcF9paWNfd3JhcF9uX3Byb2JlLA0KKwkuZHJp dmVyID0gew0KKwkJLm5hbWUgPSAiY2xrLW10ODE5Mi1pbXBfaWljX3dyYXBfbiIsDQorCQkub2Zf bWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9jbGtfbXQ4MTkyX2ltcF9paWNfd3JhcF9uLA0KKwl9LA0K K307DQorDQorYnVpbHRpbl9wbGF0Zm9ybV9kcml2ZXIoY2xrX210ODE5Ml9pbXBfaWljX3dyYXBf bl9kcnYpOw0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL21lZGlhdGVrL2Nsay1tdDgxOTItaW1w X2lpY193cmFwX3MuYyBiL2RyaXZlcnMvY2xrL21lZGlhdGVrL2Nsay1tdDgxOTItaW1wX2lpY193 cmFwX3MuYw0KbmV3IGZpbGUgbW9kZSAxMDA2NDQNCmluZGV4IDAwMDAwMDAuLjBkNjUyYmQNCi0t LSAvZGV2L251bGwNCisrKyBiL2RyaXZlcnMvY2xrL21lZGlhdGVrL2Nsay1tdDgxOTItaW1wX2lp Y193cmFwX3MuYw0KQEAgLTAsMCArMSw1OSBAQA0KKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVy OiBHUEwtMi4wDQorLy8NCisvLyBDb3B5cmlnaHQgKGMpIDIwMjAgTWVkaWFUZWsgSW5jLg0KKy8v IEF1dGhvcjogV2VpeWkgTHUgPHdlaXlpLmx1QG1lZGlhdGVrLmNvbT4NCisNCisjaW5jbHVkZSA8 bGludXgvY2xrLXByb3ZpZGVyLmg+DQorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5o Pg0KKw0KKyNpbmNsdWRlICJjbGstbXRrLmgiDQorI2luY2x1ZGUgImNsay1nYXRlLmgiDQorDQor I2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL210ODE5Mi1jbGsuaD4NCisNCitzdGF0aWMgY29u c3Qgc3RydWN0IG10a19nYXRlX3JlZ3MgaW1wX2lpY193cmFwX3NfY2dfcmVncyA9IHsNCisJLnNl dF9vZnMgPSAweGUwOCwNCisJLmNscl9vZnMgPSAweGUwNCwNCisJLnN0YV9vZnMgPSAweGUwMCwN Cit9Ow0KKw0KKyNkZWZpbmUgR0FURV9JTVBfSUlDX1dSQVBfUyhfaWQsIF9uYW1lLCBfcGFyZW50 LCBfc2hpZnQpCQlcDQorCUdBVEVfTVRLKF9pZCwgX25hbWUsIF9wYXJlbnQsICZpbXBfaWljX3dy YXBfc19jZ19yZWdzLCBfc2hpZnQsCVwNCisJCSZtdGtfY2xrX2dhdGVfb3BzX3NldGNscikNCisN CitzdGF0aWMgY29uc3Qgc3RydWN0IG10a19nYXRlIGltcF9paWNfd3JhcF9zX2Nsa3NbXSA9IHsN CisJR0FURV9JTVBfSUlDX1dSQVBfUyhDTEtfSU1QX0lJQ19XUkFQX1NfSTJDNywgImltcF9paWNf d3JhcF9zX2kyYzciLA0KKwkJImluZnJhX2kyYzAiLCAwKSwNCisJR0FURV9JTVBfSUlDX1dSQVBf UyhDTEtfSU1QX0lJQ19XUkFQX1NfSTJDOCwgImltcF9paWNfd3JhcF9zX2kyYzgiLA0KKwkJImlu ZnJhX2kyYzAiLCAxKSwNCisJR0FURV9JTVBfSUlDX1dSQVBfUyhDTEtfSU1QX0lJQ19XUkFQX1Nf STJDOSwgImltcF9paWNfd3JhcF9zX2kyYzkiLA0KKwkJImluZnJhX2kyYzAiLCAyKSwNCit9Ow0K Kw0KK3N0YXRpYyBpbnQgY2xrX210ODE5Ml9pbXBfaWljX3dyYXBfc19wcm9iZShzdHJ1Y3QgcGxh dGZvcm1fZGV2aWNlICpwZGV2KQ0KK3sNCisJc3RydWN0IGNsa19vbmVjZWxsX2RhdGEgKmNsa19k YXRhOw0KKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsNCisN CisJY2xrX2RhdGEgPSBtdGtfYWxsb2NfY2xrX2RhdGEoQ0xLX0lNUF9JSUNfV1JBUF9TX05SX0NM Syk7DQorDQorCW10a19jbGtfcmVnaXN0ZXJfZ2F0ZXMobm9kZSwgaW1wX2lpY193cmFwX3NfY2xr cywNCisJCUFSUkFZX1NJWkUoaW1wX2lpY193cmFwX3NfY2xrcyksIGNsa19kYXRhKTsNCisNCisJ cmV0dXJuIG9mX2Nsa19hZGRfcHJvdmlkZXIobm9kZSwgb2ZfY2xrX3NyY19vbmVjZWxsX2dldCwg Y2xrX2RhdGEpOw0KK30NCisNCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBvZl9t YXRjaF9jbGtfbXQ4MTkyX2ltcF9paWNfd3JhcF9zW10gPSB7DQorCXsgLmNvbXBhdGlibGUgPSAi bWVkaWF0ZWssbXQ4MTkyLWltcF9paWNfd3JhcF9zIiwgfSwNCisJe30NCit9Ow0KKw0KK3N0YXRp YyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGNsa19tdDgxOTJfaW1wX2lpY193cmFwX3NfZHJ2ID0g ew0KKwkucHJvYmUgPSBjbGtfbXQ4MTkyX2ltcF9paWNfd3JhcF9zX3Byb2JlLA0KKwkuZHJpdmVy ID0gew0KKwkJLm5hbWUgPSAiY2xrLW10ODE5Mi1pbXBfaWljX3dyYXBfcyIsDQorCQkub2ZfbWF0 Y2hfdGFibGUgPSBvZl9tYXRjaF9jbGtfbXQ4MTkyX2ltcF9paWNfd3JhcF9zLA0KKwl9LA0KK307 DQorDQorYnVpbHRpbl9wbGF0Zm9ybV9kcml2ZXIoY2xrX210ODE5Ml9pbXBfaWljX3dyYXBfc19k cnYpOw0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL21lZGlhdGVrL2Nsay1tdDgxOTItaW1wX2lp Y193cmFwX3cuYyBiL2RyaXZlcnMvY2xrL21lZGlhdGVrL2Nsay1tdDgxOTItaW1wX2lpY193cmFw X3cuYw0KbmV3IGZpbGUgbW9kZSAxMDA2NDQNCmluZGV4IDAwMDAwMDAuLjE2NjkyMmMNCi0tLSAv ZGV2L251bGwNCisrKyBiL2RyaXZlcnMvY2xrL21lZGlhdGVrL2Nsay1tdDgxOTItaW1wX2lpY193 cmFwX3cuYw0KQEAgLTAsMCArMSw1NSBAQA0KKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBH UEwtMi4wDQorLy8NCisvLyBDb3B5cmlnaHQgKGMpIDIwMjAgTWVkaWFUZWsgSW5jLg0KKy8vIEF1 dGhvcjogV2VpeWkgTHUgPHdlaXlpLmx1QG1lZGlhdGVrLmNvbT4NCisNCisjaW5jbHVkZSA8bGlu dXgvY2xrLXByb3ZpZGVyLmg+DQorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPg0K Kw0KKyNpbmNsdWRlICJjbGstbXRrLmgiDQorI2luY2x1ZGUgImNsay1nYXRlLmgiDQorDQorI2lu Y2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL210ODE5Mi1jbGsuaD4NCisNCitzdGF0aWMgY29uc3Qg c3RydWN0IG10a19nYXRlX3JlZ3MgaW1wX2lpY193cmFwX3dfY2dfcmVncyA9IHsNCisJLnNldF9v ZnMgPSAweGUwOCwNCisJLmNscl9vZnMgPSAweGUwNCwNCisJLnN0YV9vZnMgPSAweGUwMCwNCit9 Ow0KKw0KKyNkZWZpbmUgR0FURV9JTVBfSUlDX1dSQVBfVyhfaWQsIF9uYW1lLCBfcGFyZW50LCBf c2hpZnQpCQlcDQorCUdBVEVfTVRLKF9pZCwgX25hbWUsIF9wYXJlbnQsICZpbXBfaWljX3dyYXBf d19jZ19yZWdzLCBfc2hpZnQsCVwNCisJCSZtdGtfY2xrX2dhdGVfb3BzX3NldGNscikNCisNCitz dGF0aWMgY29uc3Qgc3RydWN0IG10a19nYXRlIGltcF9paWNfd3JhcF93X2Nsa3NbXSA9IHsNCisJ R0FURV9JTVBfSUlDX1dSQVBfVyhDTEtfSU1QX0lJQ19XUkFQX1dfSTJDNSwgImltcF9paWNfd3Jh cF93X2kyYzUiLA0KKwkJImluZnJhX2kyYzAiLCAwKSwNCit9Ow0KKw0KK3N0YXRpYyBpbnQgY2xr X210ODE5Ml9pbXBfaWljX3dyYXBfd19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2 KQ0KK3sNCisJc3RydWN0IGNsa19vbmVjZWxsX2RhdGEgKmNsa19kYXRhOw0KKwlzdHJ1Y3QgZGV2 aWNlX25vZGUgKm5vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsNCisNCisJY2xrX2RhdGEgPSBtdGtf YWxsb2NfY2xrX2RhdGEoQ0xLX0lNUF9JSUNfV1JBUF9XX05SX0NMSyk7DQorDQorCW10a19jbGtf cmVnaXN0ZXJfZ2F0ZXMobm9kZSwgaW1wX2lpY193cmFwX3dfY2xrcywNCisJCUFSUkFZX1NJWkUo aW1wX2lpY193cmFwX3dfY2xrcyksIGNsa19kYXRhKTsNCisNCisJcmV0dXJuIG9mX2Nsa19hZGRf cHJvdmlkZXIobm9kZSwgb2ZfY2xrX3NyY19vbmVjZWxsX2dldCwgY2xrX2RhdGEpOw0KK30NCisN CitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBvZl9tYXRjaF9jbGtfbXQ4MTkyX2lt cF9paWNfd3JhcF93W10gPSB7DQorCXsgLmNvbXBhdGlibGUgPSAibWVkaWF0ZWssbXQ4MTkyLWlt cF9paWNfd3JhcF93IiwgfSwNCisJe30NCit9Ow0KKw0KK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1f ZHJpdmVyIGNsa19tdDgxOTJfaW1wX2lpY193cmFwX3dfZHJ2ID0gew0KKwkucHJvYmUgPSBjbGtf bXQ4MTkyX2ltcF9paWNfd3JhcF93X3Byb2JlLA0KKwkuZHJpdmVyID0gew0KKwkJLm5hbWUgPSAi Y2xrLW10ODE5Mi1pbXBfaWljX3dyYXBfdyIsDQorCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRj aF9jbGtfbXQ4MTkyX2ltcF9paWNfd3JhcF93LA0KKwl9LA0KK307DQorDQorYnVpbHRpbl9wbGF0 Zm9ybV9kcml2ZXIoY2xrX210ODE5Ml9pbXBfaWljX3dyYXBfd19kcnYpOw0KZGlmZiAtLWdpdCBh L2RyaXZlcnMvY2xrL21lZGlhdGVrL2Nsay1tdDgxOTItaW1wX2lpY193cmFwX3dzLmMgYi9kcml2 ZXJzL2Nsay9tZWRpYXRlay9jbGstbXQ4MTkyLWltcF9paWNfd3JhcF93cy5jDQpuZXcgZmlsZSBt b2RlIDEwMDY0NA0KaW5kZXggMDAwMDAwMC4uYmQxM2ZkYw0KLS0tIC9kZXYvbnVsbA0KKysrIGIv ZHJpdmVycy9jbGsvbWVkaWF0ZWsvY2xrLW10ODE5Mi1pbXBfaWljX3dyYXBfd3MuYw0KQEAgLTAs MCArMSw1OSBAQA0KKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wDQorLy8NCisv LyBDb3B5cmlnaHQgKGMpIDIwMjAgTWVkaWFUZWsgSW5jLg0KKy8vIEF1dGhvcjogV2VpeWkgTHUg PHdlaXlpLmx1QG1lZGlhdGVrLmNvbT4NCisNCisjaW5jbHVkZSA8bGludXgvY2xrLXByb3ZpZGVy Lmg+DQorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPg0KKw0KKyNpbmNsdWRlICJj bGstbXRrLmgiDQorI2luY2x1ZGUgImNsay1nYXRlLmgiDQorDQorI2luY2x1ZGUgPGR0LWJpbmRp bmdzL2Nsb2NrL210ODE5Mi1jbGsuaD4NCisNCitzdGF0aWMgY29uc3Qgc3RydWN0IG10a19nYXRl X3JlZ3MgaW1wX2lpY193cmFwX3dzX2NnX3JlZ3MgPSB7DQorCS5zZXRfb2ZzID0gMHhlMDgsDQor CS5jbHJfb2ZzID0gMHhlMDQsDQorCS5zdGFfb2ZzID0gMHhlMDAsDQorfTsNCisNCisjZGVmaW5l IEdBVEVfSU1QX0lJQ19XUkFQX1dTKF9pZCwgX25hbWUsIF9wYXJlbnQsIF9zaGlmdCkJCVwNCisJ R0FURV9NVEsoX2lkLCBfbmFtZSwgX3BhcmVudCwgJmltcF9paWNfd3JhcF93c19jZ19yZWdzLCBf c2hpZnQsCVwNCisJCSZtdGtfY2xrX2dhdGVfb3BzX3NldGNscikNCisNCitzdGF0aWMgY29uc3Qg c3RydWN0IG10a19nYXRlIGltcF9paWNfd3JhcF93c19jbGtzW10gPSB7DQorCUdBVEVfSU1QX0lJ Q19XUkFQX1dTKENMS19JTVBfSUlDX1dSQVBfV1NfSTJDMSwgImltcF9paWNfd3JhcF93c19pMmMx IiwNCisJCSJpbmZyYV9pMmMwIiwgMCksDQorCUdBVEVfSU1QX0lJQ19XUkFQX1dTKENMS19JTVBf SUlDX1dSQVBfV1NfSTJDMiwgImltcF9paWNfd3JhcF93c19pMmMyIiwNCisJCSJpbmZyYV9pMmMw IiwgMSksDQorCUdBVEVfSU1QX0lJQ19XUkFQX1dTKENMS19JTVBfSUlDX1dSQVBfV1NfSTJDNCwg ImltcF9paWNfd3JhcF93c19pMmM0IiwNCisJCSJpbmZyYV9pMmMwIiwgMiksDQorfTsNCisNCitz dGF0aWMgaW50IGNsa19tdDgxOTJfaW1wX2lpY193cmFwX3dzX3Byb2JlKHN0cnVjdCBwbGF0Zm9y bV9kZXZpY2UgKnBkZXYpDQorew0KKwlzdHJ1Y3QgY2xrX29uZWNlbGxfZGF0YSAqY2xrX2RhdGE7 DQorCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOw0KKw0KKwlj bGtfZGF0YSA9IG10a19hbGxvY19jbGtfZGF0YShDTEtfSU1QX0lJQ19XUkFQX1dTX05SX0NMSyk7 DQorDQorCW10a19jbGtfcmVnaXN0ZXJfZ2F0ZXMobm9kZSwgaW1wX2lpY193cmFwX3dzX2Nsa3Ms DQorCQlBUlJBWV9TSVpFKGltcF9paWNfd3JhcF93c19jbGtzKSwgY2xrX2RhdGEpOw0KKw0KKwly ZXR1cm4gb2ZfY2xrX2FkZF9wcm92aWRlcihub2RlLCBvZl9jbGtfc3JjX29uZWNlbGxfZ2V0LCBj bGtfZGF0YSk7DQorfQ0KKw0KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG9mX21h dGNoX2Nsa19tdDgxOTJfaW1wX2lpY193cmFwX3dzW10gPSB7DQorCXsgLmNvbXBhdGlibGUgPSAi bWVkaWF0ZWssbXQ4MTkyLWltcF9paWNfd3JhcF93cyIsIH0sDQorCXt9DQorfTsNCisNCitzdGF0 aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBjbGtfbXQ4MTkyX2ltcF9paWNfd3JhcF93c19kcnYg PSB7DQorCS5wcm9iZSA9IGNsa19tdDgxOTJfaW1wX2lpY193cmFwX3dzX3Byb2JlLA0KKwkuZHJp dmVyID0gew0KKwkJLm5hbWUgPSAiY2xrLW10ODE5Mi1pbXBfaWljX3dyYXBfd3MiLA0KKwkJLm9m X21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfY2xrX210ODE5Ml9pbXBfaWljX3dyYXBfd3MsDQorCX0s DQorfTsNCisNCitidWlsdGluX3BsYXRmb3JtX2RyaXZlcihjbGtfbXQ4MTkyX2ltcF9paWNfd3Jh cF93c19kcnYpOw0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL21lZGlhdGVrL2Nsay1tdDgxOTIt aXBlLmMgYi9kcml2ZXJzL2Nsay9tZWRpYXRlay9jbGstbXQ4MTkyLWlwZS5jDQpuZXcgZmlsZSBt b2RlIDEwMDY0NA0KaW5kZXggMDAwMDAwMC4uMTUxMDlhOA0KLS0tIC9kZXYvbnVsbA0KKysrIGIv ZHJpdmVycy9jbGsvbWVkaWF0ZWsvY2xrLW10ODE5Mi1pcGUuYw0KQEAgLTAsMCArMSw2MSBAQA0K Ky8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wDQorLy8NCisvLyBDb3B5cmlnaHQg KGMpIDIwMjAgTWVkaWFUZWsgSW5jLg0KKy8vIEF1dGhvcjogV2VpeWkgTHUgPHdlaXlpLmx1QG1l ZGlhdGVrLmNvbT4NCisNCisjaW5jbHVkZSA8bGludXgvY2xrLXByb3ZpZGVyLmg+DQorI2luY2x1 ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPg0KKw0KKyNpbmNsdWRlICJjbGstbXRrLmgiDQor I2luY2x1ZGUgImNsay1nYXRlLmgiDQorDQorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL210 ODE5Mi1jbGsuaD4NCisNCitzdGF0aWMgY29uc3Qgc3RydWN0IG10a19nYXRlX3JlZ3MgaXBlX2Nn X3JlZ3MgPSB7DQorCS5zZXRfb2ZzID0gMHg0LA0KKwkuY2xyX29mcyA9IDB4OCwNCisJLnN0YV9v ZnMgPSAweDAsDQorfTsNCisNCisjZGVmaW5lIEdBVEVfSVBFKF9pZCwgX25hbWUsIF9wYXJlbnQs IF9zaGlmdCkJCQlcDQorCUdBVEVfTVRLKF9pZCwgX25hbWUsIF9wYXJlbnQsICZpcGVfY2dfcmVn cywgX3NoaWZ0LAlcDQorCQkmbXRrX2Nsa19nYXRlX29wc19zZXRjbHIpDQorDQorc3RhdGljIGNv bnN0IHN0cnVjdCBtdGtfZ2F0ZSBpcGVfY2xrc1tdID0gew0KKwlHQVRFX0lQRShDTEtfSVBFX0xB UkIxOSwgImlwZV9sYXJiMTkiLCAiaXBlX3NlbCIsIDApLA0KKwlHQVRFX0lQRShDTEtfSVBFX0xB UkIyMCwgImlwZV9sYXJiMjAiLCAiaXBlX3NlbCIsIDEpLA0KKwlHQVRFX0lQRShDTEtfSVBFX1NN SV9TVUJDT00sICJpcGVfc21pX3N1YmNvbSIsICJpcGVfc2VsIiwgMiksDQorCUdBVEVfSVBFKENM S19JUEVfRkQsICJpcGVfZmQiLCAiaXBlX3NlbCIsIDMpLA0KKwlHQVRFX0lQRShDTEtfSVBFX0ZF LCAiaXBlX2ZlIiwgImlwZV9zZWwiLCA0KSwNCisJR0FURV9JUEUoQ0xLX0lQRV9SU0MsICJpcGVf cnNjIiwgImlwZV9zZWwiLCA1KSwNCisJR0FURV9JUEUoQ0xLX0lQRV9EUEUsICJpcGVfZHBlIiwg ImlwZV9zZWwiLCA2KSwNCisJR0FURV9JUEUoQ0xLX0lQRV9HQUxTLCAiaXBlX2dhbHMiLCAiaXBl X3NlbCIsIDgpLA0KK307DQorDQorc3RhdGljIGludCBjbGtfbXQ4MTkyX2lwZV9wcm9iZShzdHJ1 Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQ0KK3sNCisJc3RydWN0IGNsa19vbmVjZWxsX2RhdGEg KmNsa19kYXRhOw0KKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUgPSBwZGV2LT5kZXYub2Zfbm9k ZTsNCisNCisJY2xrX2RhdGEgPSBtdGtfYWxsb2NfY2xrX2RhdGEoQ0xLX0lQRV9OUl9DTEspOw0K Kw0KKwltdGtfY2xrX3JlZ2lzdGVyX2dhdGVzKG5vZGUsIGlwZV9jbGtzLCBBUlJBWV9TSVpFKGlw ZV9jbGtzKSwNCisJCQljbGtfZGF0YSk7DQorDQorCXJldHVybiBvZl9jbGtfYWRkX3Byb3ZpZGVy KG5vZGUsIG9mX2Nsa19zcmNfb25lY2VsbF9nZXQsIGNsa19kYXRhKTsNCit9DQorDQorc3RhdGlj IGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgb2ZfbWF0Y2hfY2xrX210ODE5Ml9pcGVbXSA9IHsN CisJeyAuY29tcGF0aWJsZSA9ICJtZWRpYXRlayxtdDgxOTItaXBlc3lzIiwgfSwNCisJe30NCit9 Ow0KKw0KK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGNsa19tdDgxOTJfaXBlX2RydiA9 IHsNCisJLnByb2JlID0gY2xrX210ODE5Ml9pcGVfcHJvYmUsDQorCS5kcml2ZXIgPSB7DQorCQku bmFtZSA9ICJjbGstbXQ4MTkyLWlwZSIsDQorCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9j bGtfbXQ4MTkyX2lwZSwNCisJfSwNCit9Ow0KKw0KK2J1aWx0aW5fcGxhdGZvcm1fZHJpdmVyKGNs a19tdDgxOTJfaXBlX2Rydik7DQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvbWVkaWF0ZWsvY2xr LW10ODE5Mi1tZHAuYyBiL2RyaXZlcnMvY2xrL21lZGlhdGVrL2Nsay1tdDgxOTItbWRwLmMNCm5l dyBmaWxlIG1vZGUgMTAwNjQ0DQppbmRleCAwMDAwMDAwLi5jZTViZDdiDQotLS0gL2Rldi9udWxs DQorKysgYi9kcml2ZXJzL2Nsay9tZWRpYXRlay9jbGstbXQ4MTkyLW1kcC5jDQpAQCAtMCwwICsx LDg5IEBADQorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjANCisvLw0KKy8vIENv cHlyaWdodCAoYykgMjAyMCBNZWRpYVRlayBJbmMuDQorLy8gQXV0aG9yOiBXZWl5aSBMdSA8d2Vp eWkubHVAbWVkaWF0ZWsuY29tPg0KKw0KKyNpbmNsdWRlIDxsaW51eC9jbGstcHJvdmlkZXIuaD4N CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+DQorDQorI2luY2x1ZGUgImNsay1t dGsuaCINCisjaW5jbHVkZSAiY2xrLWdhdGUuaCINCisNCisjaW5jbHVkZSA8ZHQtYmluZGluZ3Mv Y2xvY2svbXQ4MTkyLWNsay5oPg0KKw0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXRrX2dhdGVfcmVn cyBtZHAwX2NnX3JlZ3MgPSB7DQorCS5zZXRfb2ZzID0gMHgxMDQsDQorCS5jbHJfb2ZzID0gMHgx MDgsDQorCS5zdGFfb2ZzID0gMHgxMDAsDQorfTsNCisNCitzdGF0aWMgY29uc3Qgc3RydWN0IG10 a19nYXRlX3JlZ3MgbWRwMV9jZ19yZWdzID0gew0KKwkuc2V0X29mcyA9IDB4MTI0LA0KKwkuY2xy X29mcyA9IDB4MTI4LA0KKwkuc3RhX29mcyA9IDB4MTIwLA0KK307DQorDQorI2RlZmluZSBHQVRF X01EUDAoX2lkLCBfbmFtZSwgX3BhcmVudCwgX3NoaWZ0KQkJCVwNCisJR0FURV9NVEsoX2lkLCBf bmFtZSwgX3BhcmVudCwgJm1kcDBfY2dfcmVncywgX3NoaWZ0LAlcDQorCQkmbXRrX2Nsa19nYXRl X29wc19zZXRjbHIpDQorDQorI2RlZmluZSBHQVRFX01EUDEoX2lkLCBfbmFtZSwgX3BhcmVudCwg X3NoaWZ0KQkJCVwNCisJR0FURV9NVEsoX2lkLCBfbmFtZSwgX3BhcmVudCwgJm1kcDFfY2dfcmVn cywgX3NoaWZ0LAlcDQorCQkmbXRrX2Nsa19nYXRlX29wc19zZXRjbHIpDQorDQorc3RhdGljIGNv bnN0IHN0cnVjdCBtdGtfZ2F0ZSBtZHBfY2xrc1tdID0gew0KKwkvKiBNRFAwICovDQorCUdBVEVf TURQMChDTEtfTURQX1JETUEwLCAibWRwX21kcF9yZG1hMCIsICJtZHBfc2VsIiwgMCksDQorCUdB VEVfTURQMChDTEtfTURQX1REU0hQMCwgIm1kcF9tZHBfdGRzaHAwIiwgIm1kcF9zZWwiLCAxKSwN CisJR0FURV9NRFAwKENMS19NRFBfSU1HX0RMX0FTWU5DMCwgIm1kcF9pbWdfZGxfYXN5bmMwIiwg Im1kcF9zZWwiLCAyKSwNCisJR0FURV9NRFAwKENMS19NRFBfSU1HX0RMX0FTWU5DMSwgIm1kcF9p bWdfZGxfYXN5bmMxIiwgIm1kcF9zZWwiLCAzKSwNCisJR0FURV9NRFAwKENMS19NRFBfUkRNQTEs ICJtZHBfbWRwX3JkbWExIiwgIm1kcF9zZWwiLCA0KSwNCisJR0FURV9NRFAwKENMS19NRFBfVERT SFAxLCAibWRwX21kcF90ZHNocDEiLCAibWRwX3NlbCIsIDUpLA0KKwlHQVRFX01EUDAoQ0xLX01E UF9TTUkwLCAibWRwX3NtaTAiLCAibWRwX3NlbCIsIDYpLA0KKwlHQVRFX01EUDAoQ0xLX01EUF9B UEJfQlVTLCAibWRwX2FwYl9idXMiLCAibWRwX3NlbCIsIDcpLA0KKwlHQVRFX01EUDAoQ0xLX01E UF9XUk9UMCwgIm1kcF9tZHBfd3JvdDAiLCAibWRwX3NlbCIsIDgpLA0KKwlHQVRFX01EUDAoQ0xL X01EUF9SU1owLCAibWRwX21kcF9yc3owIiwgIm1kcF9zZWwiLCA5KSwNCisJR0FURV9NRFAwKENM S19NRFBfSERSMCwgIm1kcF9tZHBfaGRyMCIsICJtZHBfc2VsIiwgMTApLA0KKwlHQVRFX01EUDAo Q0xLX01EUF9NVVRFWDAsICJtZHBfbWRwX211dGV4MCIsICJtZHBfc2VsIiwgMTEpLA0KKwlHQVRF X01EUDAoQ0xLX01EUF9XUk9UMSwgIm1kcF9tZHBfd3JvdDEiLCAibWRwX3NlbCIsIDEyKSwNCisJ R0FURV9NRFAwKENMS19NRFBfUlNaMSwgIm1kcF9tZHBfcnN6MSIsICJtZHBfc2VsIiwgMTMpLA0K KwlHQVRFX01EUDAoQ0xLX01EUF9IRFIxLCAibWRwX21kcF9oZHIxIiwgIm1kcF9zZWwiLCAxNCks DQorCUdBVEVfTURQMChDTEtfTURQX0ZBS0VfRU5HMCwgIm1kcF9tZHBfZmFrZV9lbmcwIiwgIm1k cF9zZWwiLCAxNSksDQorCUdBVEVfTURQMChDTEtfTURQX0FBTDAsICJtZHBfbWRwX2FhbDAiLCAi bWRwX3NlbCIsIDE2KSwNCisJR0FURV9NRFAwKENMS19NRFBfQUFMMSwgIm1kcF9tZHBfYWFsMSIs ICJtZHBfc2VsIiwgMTcpLA0KKwlHQVRFX01EUDAoQ0xLX01EUF9DT0xPUjAsICJtZHBfbWRwX2Nv bG9yMCIsICJtZHBfc2VsIiwgMTgpLA0KKwlHQVRFX01EUDAoQ0xLX01EUF9DT0xPUjEsICJtZHBf bWRwX2NvbG9yMSIsICJtZHBfc2VsIiwgMTkpLA0KKwkvKiBNRFAxICovDQorCUdBVEVfTURQMShD TEtfTURQX0lNR19ETF9SRUxBWTBfQVNZTkMwLCAibWRwX2ltZ19kbF9yZWxheTBfYXN5bmMwIiwN CisJCSJtZHBfc2VsIiwgMCksDQorCUdBVEVfTURQMShDTEtfTURQX0lNR19ETF9SRUxBWTFfQVNZ TkMxLCAibWRwX2ltZ19kbF9yZWxheTFfYXN5bmMxIiwNCisJCSJtZHBfc2VsIiwgOCksDQorfTsN CisNCitzdGF0aWMgaW50IGNsa19tdDgxOTJfbWRwX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZp Y2UgKnBkZXYpDQorew0KKwlzdHJ1Y3QgY2xrX29uZWNlbGxfZGF0YSAqY2xrX2RhdGE7DQorCXN0 cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOw0KKw0KKwljbGtfZGF0 YSA9IG10a19hbGxvY19jbGtfZGF0YShDTEtfTURQX05SX0NMSyk7DQorDQorCW10a19jbGtfcmVn aXN0ZXJfZ2F0ZXMobm9kZSwgbWRwX2Nsa3MsIEFSUkFZX1NJWkUobWRwX2Nsa3MpLA0KKwkJCWNs a19kYXRhKTsNCisNCisJcmV0dXJuIG9mX2Nsa19hZGRfcHJvdmlkZXIobm9kZSwgb2ZfY2xrX3Ny Y19vbmVjZWxsX2dldCwgY2xrX2RhdGEpOw0KK30NCisNCitzdGF0aWMgY29uc3Qgc3RydWN0IG9m X2RldmljZV9pZCBvZl9tYXRjaF9jbGtfbXQ4MTkyX21kcFtdID0gew0KKwl7IC5jb21wYXRpYmxl ID0gIm1lZGlhdGVrLG10ODE5Mi1tZHBzeXMiLCB9LA0KKwl7fQ0KK307DQorDQorc3RhdGljIHN0 cnVjdCBwbGF0Zm9ybV9kcml2ZXIgY2xrX210ODE5Ml9tZHBfZHJ2ID0gew0KKwkucHJvYmUgPSBj bGtfbXQ4MTkyX21kcF9wcm9iZSwNCisJLmRyaXZlciA9IHsNCisJCS5uYW1lID0gImNsay1tdDgx OTItbWRwIiwNCisJCS5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX2Nsa19tdDgxOTJfbWRwLA0K Kwl9LA0KK307DQorDQorYnVpbHRpbl9wbGF0Zm9ybV9kcml2ZXIoY2xrX210ODE5Ml9tZHBfZHJ2 KTsNCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9tZWRpYXRlay9jbGstbXQ4MTkyLW1mZy5jIGIv ZHJpdmVycy9jbGsvbWVkaWF0ZWsvY2xrLW10ODE5Mi1tZmcuYw0KbmV3IGZpbGUgbW9kZSAxMDA2 NDQNCmluZGV4IDAwMDAwMDAuLjFkOGMxN2QNCi0tLSAvZGV2L251bGwNCisrKyBiL2RyaXZlcnMv Y2xrL21lZGlhdGVrL2Nsay1tdDgxOTItbWZnLmMNCkBAIC0wLDAgKzEsNTQgQEANCisvLyBTUERY LUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMA0KKy8vDQorLy8gQ29weXJpZ2h0IChjKSAyMDIw IE1lZGlhVGVrIEluYy4NCisvLyBBdXRob3I6IFdlaXlpIEx1IDx3ZWl5aS5sdUBtZWRpYXRlay5j b20+DQorDQorI2luY2x1ZGUgPGxpbnV4L2Nsay1wcm92aWRlci5oPg0KKyNpbmNsdWRlIDxsaW51 eC9wbGF0Zm9ybV9kZXZpY2UuaD4NCisNCisjaW5jbHVkZSAiY2xrLW10ay5oIg0KKyNpbmNsdWRl ICJjbGstZ2F0ZS5oIg0KKw0KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9tdDgxOTItY2xr Lmg+DQorDQorc3RhdGljIGNvbnN0IHN0cnVjdCBtdGtfZ2F0ZV9yZWdzIG1mZ19jZ19yZWdzID0g ew0KKwkuc2V0X29mcyA9IDB4NCwNCisJLmNscl9vZnMgPSAweDgsDQorCS5zdGFfb2ZzID0gMHgw LA0KK307DQorDQorI2RlZmluZSBHQVRFX01GRyhfaWQsIF9uYW1lLCBfcGFyZW50LCBfc2hpZnQp CQkJXA0KKwlHQVRFX01USyhfaWQsIF9uYW1lLCBfcGFyZW50LCAmbWZnX2NnX3JlZ3MsIF9zaGlm dCwJXA0KKwkJJm10a19jbGtfZ2F0ZV9vcHNfc2V0Y2xyKQ0KKw0KK3N0YXRpYyBjb25zdCBzdHJ1 Y3QgbXRrX2dhdGUgbWZnX2Nsa3NbXSA9IHsNCisJR0FURV9NRkcoQ0xLX01GR19CRzNELCAibWZn X2JnM2QiLCAibWZnX3BsbF9zZWwiLCAwKSwNCit9Ow0KKw0KK3N0YXRpYyBpbnQgY2xrX210ODE5 Ml9tZmdfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikNCit7DQorCXN0cnVjdCBj bGtfb25lY2VsbF9kYXRhICpjbGtfZGF0YTsNCisJc3RydWN0IGRldmljZV9ub2RlICpub2RlID0g cGRldi0+ZGV2Lm9mX25vZGU7DQorDQorCWNsa19kYXRhID0gbXRrX2FsbG9jX2Nsa19kYXRhKENM S19NRkdfTlJfQ0xLKTsNCisNCisJbXRrX2Nsa19yZWdpc3Rlcl9nYXRlcyhub2RlLCBtZmdfY2xr cywgQVJSQVlfU0laRShtZmdfY2xrcyksDQorCQkJY2xrX2RhdGEpOw0KKw0KKwlyZXR1cm4gb2Zf Y2xrX2FkZF9wcm92aWRlcihub2RlLCBvZl9jbGtfc3JjX29uZWNlbGxfZ2V0LCBjbGtfZGF0YSk7 DQorfQ0KKw0KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG9mX21hdGNoX2Nsa19t dDgxOTJfbWZnW10gPSB7DQorCXsgLmNvbXBhdGlibGUgPSAibWVkaWF0ZWssbXQ4MTkyLW1mZ2Nm ZyIsIH0sDQorCXt9DQorfTsNCisNCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBjbGtf bXQ4MTkyX21mZ19kcnYgPSB7DQorCS5wcm9iZSA9IGNsa19tdDgxOTJfbWZnX3Byb2JlLA0KKwku ZHJpdmVyID0gew0KKwkJLm5hbWUgPSAiY2xrLW10ODE5Mi1tZmciLA0KKwkJLm9mX21hdGNoX3Rh YmxlID0gb2ZfbWF0Y2hfY2xrX210ODE5Ml9tZmcsDQorCX0sDQorfTsNCisNCitidWlsdGluX3Bs YXRmb3JtX2RyaXZlcihjbGtfbXQ4MTkyX21mZ19kcnYpOw0KZGlmZiAtLWdpdCBhL2RyaXZlcnMv Y2xrL21lZGlhdGVrL2Nsay1tdDgxOTItbW0uYyBiL2RyaXZlcnMvY2xrL21lZGlhdGVrL2Nsay1t dDgxOTItbW0uYw0KbmV3IGZpbGUgbW9kZSAxMDA2NDQNCmluZGV4IDAwMDAwMDAuLjAyZWVmMjQN Ci0tLSAvZGV2L251bGwNCisrKyBiL2RyaXZlcnMvY2xrL21lZGlhdGVrL2Nsay1tdDgxOTItbW0u Yw0KQEAgLTAsMCArMSwxMDggQEANCisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIu MA0KKy8vDQorLy8gQ29weXJpZ2h0IChjKSAyMDIwIE1lZGlhVGVrIEluYy4NCisvLyBBdXRob3I6 IFdlaXlpIEx1IDx3ZWl5aS5sdUBtZWRpYXRlay5jb20+DQorDQorI2luY2x1ZGUgPGxpbnV4L2Ns ay1wcm92aWRlci5oPg0KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4NCisNCisj aW5jbHVkZSAiY2xrLW10ay5oIg0KKyNpbmNsdWRlICJjbGstZ2F0ZS5oIg0KKw0KKyNpbmNsdWRl IDxkdC1iaW5kaW5ncy9jbG9jay9tdDgxOTItY2xrLmg+DQorDQorc3RhdGljIGNvbnN0IHN0cnVj dCBtdGtfZ2F0ZV9yZWdzIG1tMF9jZ19yZWdzID0gew0KKwkuc2V0X29mcyA9IDB4MTA0LA0KKwku Y2xyX29mcyA9IDB4MTA4LA0KKwkuc3RhX29mcyA9IDB4MTAwLA0KK307DQorDQorc3RhdGljIGNv bnN0IHN0cnVjdCBtdGtfZ2F0ZV9yZWdzIG1tMV9jZ19yZWdzID0gew0KKwkuc2V0X29mcyA9IDB4 MTE0LA0KKwkuY2xyX29mcyA9IDB4MTE4LA0KKwkuc3RhX29mcyA9IDB4MTEwLA0KK307DQorDQor c3RhdGljIGNvbnN0IHN0cnVjdCBtdGtfZ2F0ZV9yZWdzIG1tMl9jZ19yZWdzID0gew0KKwkuc2V0 X29mcyA9IDB4MWE0LA0KKwkuY2xyX29mcyA9IDB4MWE4LA0KKwkuc3RhX29mcyA9IDB4MWEwLA0K K307DQorDQorI2RlZmluZSBHQVRFX01NMChfaWQsIF9uYW1lLCBfcGFyZW50LCBfc2hpZnQpCQkJ XA0KKwlHQVRFX01USyhfaWQsIF9uYW1lLCBfcGFyZW50LCAmbW0wX2NnX3JlZ3MsIF9zaGlmdCwJ XA0KKwkJJm10a19jbGtfZ2F0ZV9vcHNfc2V0Y2xyKQ0KKw0KKyNkZWZpbmUgR0FURV9NTTEoX2lk LCBfbmFtZSwgX3BhcmVudCwgX3NoaWZ0KQkJCVwNCisJR0FURV9NVEsoX2lkLCBfbmFtZSwgX3Bh cmVudCwgJm1tMV9jZ19yZWdzLCBfc2hpZnQsCVwNCisJCSZtdGtfY2xrX2dhdGVfb3BzX3NldGNs cikNCisNCisjZGVmaW5lIEdBVEVfTU0yKF9pZCwgX25hbWUsIF9wYXJlbnQsIF9zaGlmdCkJCQlc DQorCUdBVEVfTVRLKF9pZCwgX25hbWUsIF9wYXJlbnQsICZtbTJfY2dfcmVncywgX3NoaWZ0LAlc DQorCQkmbXRrX2Nsa19nYXRlX29wc19zZXRjbHIpDQorDQorc3RhdGljIGNvbnN0IHN0cnVjdCBt dGtfZ2F0ZSBtbV9jbGtzW10gPSB7DQorCS8qIE1NMCAqLw0KKwlHQVRFX01NMChDTEtfTU1fRElT UF9NVVRFWDAsICJtbV9kaXNwX211dGV4MCIsICJkaXNwX3NlbCIsIDApLA0KKwlHQVRFX01NMChD TEtfTU1fRElTUF9DT05GSUcsICJtbV9kaXNwX2NvbmZpZyIsICJkaXNwX3NlbCIsIDEpLA0KKwlH QVRFX01NMChDTEtfTU1fRElTUF9PVkwwLCAibW1fZGlzcF9vdmwwIiwgImRpc3Bfc2VsIiwgMiks DQorCUdBVEVfTU0wKENMS19NTV9ESVNQX1JETUEwLCAibW1fZGlzcF9yZG1hMCIsICJkaXNwX3Nl bCIsIDMpLA0KKwlHQVRFX01NMChDTEtfTU1fRElTUF9PVkwwXzJMLCAibW1fZGlzcF9vdmwwXzJs IiwgImRpc3Bfc2VsIiwgNCksDQorCUdBVEVfTU0wKENMS19NTV9ESVNQX1dETUEwLCAibW1fZGlz cF93ZG1hMCIsICJkaXNwX3NlbCIsIDUpLA0KKwlHQVRFX01NMChDTEtfTU1fRElTUF9VRkJDX1dE TUEwLCAibW1fZGlzcF91ZmJjX3dkbWEwIiwgImRpc3Bfc2VsIiwgNiksDQorCUdBVEVfTU0wKENM S19NTV9ESVNQX1JTWjAsICJtbV9kaXNwX3JzejAiLCAiZGlzcF9zZWwiLCA3KSwNCisJR0FURV9N TTAoQ0xLX01NX0RJU1BfQUFMMCwgIm1tX2Rpc3BfYWFsMCIsICJkaXNwX3NlbCIsIDgpLA0KKwlH QVRFX01NMChDTEtfTU1fRElTUF9DQ09SUjAsICJtbV9kaXNwX2Njb3JyMCIsICJkaXNwX3NlbCIs IDkpLA0KKwlHQVRFX01NMChDTEtfTU1fRElTUF9ESVRIRVIwLCAibW1fZGlzcF9kaXRoZXIwIiwg ImRpc3Bfc2VsIiwgMTApLA0KKwlHQVRFX01NMChDTEtfTU1fU01JX0lORlJBLCAibW1fc21pX2lu ZnJhIiwgImRpc3Bfc2VsIiwgMTEpLA0KKwlHQVRFX01NMChDTEtfTU1fRElTUF9HQU1NQTAsICJt bV9kaXNwX2dhbW1hMCIsICJkaXNwX3NlbCIsIDEyKSwNCisJR0FURV9NTTAoQ0xLX01NX0RJU1Bf UE9TVE1BU0swLCAibW1fZGlzcF9wb3N0bWFzazAiLCAiZGlzcF9zZWwiLCAxMyksDQorCUdBVEVf TU0wKENMS19NTV9ESVNQX0RTQ19XUkFQMCwgIm1tX2Rpc3BfZHNjX3dyYXAwIiwgImRpc3Bfc2Vs IiwgMTQpLA0KKwlHQVRFX01NMChDTEtfTU1fRFNJMCwgIm1tX2RzaTAiLCAiZGlzcF9zZWwiLCAx NSksDQorCUdBVEVfTU0wKENMS19NTV9ESVNQX0NPTE9SMCwgIm1tX2Rpc3BfY29sb3IwIiwgImRp c3Bfc2VsIiwgMTYpLA0KKwlHQVRFX01NMChDTEtfTU1fU01JX0NPTU1PTiwgIm1tX3NtaV9jb21t b24iLCAiZGlzcF9zZWwiLCAxNyksDQorCUdBVEVfTU0wKENMS19NTV9ESVNQX0ZBS0VfRU5HMCwg Im1tX2Rpc3BfZmFrZV9lbmcwIiwgImRpc3Bfc2VsIiwgMTgpLA0KKwlHQVRFX01NMChDTEtfTU1f RElTUF9GQUtFX0VORzEsICJtbV9kaXNwX2Zha2VfZW5nMSIsICJkaXNwX3NlbCIsIDE5KSwNCisJ R0FURV9NTTAoQ0xLX01NX01EUF9URFNIUDQsICJtbV9tZHBfdGRzaHA0IiwgImRpc3Bfc2VsIiwg MjApLA0KKwlHQVRFX01NMChDTEtfTU1fTURQX1JTWjQsICJtbV9tZHBfcnN6NCIsICJkaXNwX3Nl bCIsIDIxKSwNCisJR0FURV9NTTAoQ0xLX01NX01EUF9BQUw0LCAibW1fbWRwX2FhbDQiLCAiZGlz cF9zZWwiLCAyMiksDQorCUdBVEVfTU0wKENMS19NTV9NRFBfSERSNCwgIm1tX21kcF9oZHI0Iiwg ImRpc3Bfc2VsIiwgMjMpLA0KKwlHQVRFX01NMChDTEtfTU1fTURQX1JETUE0LCAibW1fbWRwX3Jk bWE0IiwgImRpc3Bfc2VsIiwgMjQpLA0KKwlHQVRFX01NMChDTEtfTU1fTURQX0NPTE9SNCwgIm1t X21kcF9jb2xvcjQiLCAiZGlzcF9zZWwiLCAyNSksDQorCUdBVEVfTU0wKENMS19NTV9ESVNQX1ky UjAsICJtbV9kaXNwX3kycjAiLCAiZGlzcF9zZWwiLCAyNiksDQorCUdBVEVfTU0wKENMS19NTV9T TUlfR0FMUywgIm1tX3NtaV9nYWxzIiwgImRpc3Bfc2VsIiwgMjcpLA0KKwlHQVRFX01NMChDTEtf TU1fRElTUF9PVkwyXzJMLCAibW1fZGlzcF9vdmwyXzJsIiwgImRpc3Bfc2VsIiwgMjgpLA0KKwlH QVRFX01NMChDTEtfTU1fRElTUF9SRE1BNCwgIm1tX2Rpc3BfcmRtYTQiLCAiZGlzcF9zZWwiLCAy OSksDQorCUdBVEVfTU0wKENMS19NTV9ESVNQX0RQSTAsICJtbV9kaXNwX2RwaTAiLCAiZGlzcF9z ZWwiLCAzMCksDQorCS8qIE1NMSAqLw0KKwlHQVRFX01NMShDTEtfTU1fU01JX0lPTU1VLCAibW1f c21pX2lvbW11IiwgImRpc3Bfc2VsIiwgMCksDQorCS8qIE1NMiAqLw0KKwlHQVRFX01NMihDTEtf TU1fRFNJX0RTSTAsICJtbV9kc2lfZHNpMCIsICJkaXNwX3NlbCIsIDApLA0KKwlHQVRFX01NMihD TEtfTU1fRFBJX0RQSTAsICJtbV9kcGlfZHBpMCIsICJkcGlfc2VsIiwgOCksDQorCUdBVEVfTU0y KENMS19NTV8yNk1IWiwgIm1tXzI2bWh6IiwgImNsazI2bSIsIDI0KSwNCisJR0FURV9NTTIoQ0xL X01NXzMyS0haLCAibW1fMzJraHoiLCAiY2xrMzJrIiwgMjUpLA0KK307DQorDQorc3RhdGljIGlu dCBjbGtfbXQ4MTkyX21tX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpDQorew0K KwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2Ow0KKwlzdHJ1Y3QgZGV2aWNlX25vZGUg Km5vZGUgPSBkZXYtPnBhcmVudC0+b2Zfbm9kZTsNCisJc3RydWN0IGNsa19vbmVjZWxsX2RhdGEg KmNsa19kYXRhOw0KKw0KKwljbGtfZGF0YSA9IG10a19hbGxvY19jbGtfZGF0YShDTEtfTU1fTlJf Q0xLKTsNCisNCisJbXRrX2Nsa19yZWdpc3Rlcl9nYXRlcyhub2RlLCBtbV9jbGtzLCBBUlJBWV9T SVpFKG1tX2Nsa3MpLA0KKwkJCWNsa19kYXRhKTsNCisNCisJcmV0dXJuIG9mX2Nsa19hZGRfcHJv dmlkZXIobm9kZSwgb2ZfY2xrX3NyY19vbmVjZWxsX2dldCwgY2xrX2RhdGEpOw0KK30NCisNCisN CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBjbGtfbXQ4MTkyX21tX2RydiA9IHsNCisJ LnByb2JlID0gY2xrX210ODE5Ml9tbV9wcm9iZSwNCisJLmRyaXZlciA9IHsNCisJCS5uYW1lID0g ImNsay1tdDgxOTItbW0iLA0KKwl9LA0KK307DQorDQorYnVpbHRpbl9wbGF0Zm9ybV9kcml2ZXIo Y2xrX210ODE5Ml9tbV9kcnYpOw0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL21lZGlhdGVrL2Ns ay1tdDgxOTItbXNkYy5jIGIvZHJpdmVycy9jbGsvbWVkaWF0ZWsvY2xrLW10ODE5Mi1tc2RjLmMN Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0DQppbmRleCAwMDAwMDAwLi5mMGIzMGExDQotLS0gL2Rldi9u dWxsDQorKysgYi9kcml2ZXJzL2Nsay9tZWRpYXRlay9jbGstbXQ4MTkyLW1zZGMuYw0KQEAgLTAs MCArMSw1NCBAQA0KKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wDQorLy8NCisv LyBDb3B5cmlnaHQgKGMpIDIwMjAgTWVkaWFUZWsgSW5jLg0KKy8vIEF1dGhvcjogV2VpeWkgTHUg PHdlaXlpLmx1QG1lZGlhdGVrLmNvbT4NCisNCisjaW5jbHVkZSA8bGludXgvY2xrLXByb3ZpZGVy Lmg+DQorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPg0KKw0KKyNpbmNsdWRlICJj bGstbXRrLmgiDQorI2luY2x1ZGUgImNsay1nYXRlLmgiDQorDQorI2luY2x1ZGUgPGR0LWJpbmRp bmdzL2Nsb2NrL210ODE5Mi1jbGsuaD4NCisNCitzdGF0aWMgY29uc3Qgc3RydWN0IG10a19nYXRl X3JlZ3MgbXNkY19jZ19yZWdzID0gew0KKwkuc2V0X29mcyA9IDB4YjQsDQorCS5jbHJfb2ZzID0g MHhiNCwNCisJLnN0YV9vZnMgPSAweGI0LA0KK307DQorDQorI2RlZmluZSBHQVRFX01TREMoX2lk LCBfbmFtZSwgX3BhcmVudCwgX3NoaWZ0KQkJCVwNCisJR0FURV9NVEsoX2lkLCBfbmFtZSwgX3Bh cmVudCwgJm1zZGNfY2dfcmVncywgX3NoaWZ0LAlcDQorCQkmbXRrX2Nsa19nYXRlX29wc19ub19z ZXRjbHJfaW52KQ0KKw0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXRrX2dhdGUgbXNkY19jbGtzW10g PSB7DQorCUdBVEVfTVNEQyhDTEtfTVNEQ19BWElfV1JBUCwgIm1zZGNfYXhpX3dyYXAiLCAiYXhp X3NlbCIsIDIyKSwNCit9Ow0KKw0KK3N0YXRpYyBpbnQgY2xrX210ODE5Ml9tc2RjX3Byb2JlKHN0 cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpDQorew0KKwlzdHJ1Y3QgY2xrX29uZWNlbGxfZGF0 YSAqY2xrX2RhdGE7DQorCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSA9IHBkZXYtPmRldi5vZl9u b2RlOw0KKw0KKwljbGtfZGF0YSA9IG10a19hbGxvY19jbGtfZGF0YShDTEtfTVNEQ19OUl9DTEsp Ow0KKw0KKwltdGtfY2xrX3JlZ2lzdGVyX2dhdGVzKG5vZGUsIG1zZGNfY2xrcywgQVJSQVlfU0la RShtc2RjX2Nsa3MpLA0KKwkJCWNsa19kYXRhKTsNCisNCisJcmV0dXJuIG9mX2Nsa19hZGRfcHJv dmlkZXIobm9kZSwgb2ZfY2xrX3NyY19vbmVjZWxsX2dldCwgY2xrX2RhdGEpOw0KK30NCisNCitz dGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBvZl9tYXRjaF9jbGtfbXQ4MTkyX21zZGNb XSA9IHsNCisJeyAuY29tcGF0aWJsZSA9ICJtZWRpYXRlayxtdDgxOTItbXNkYyIsIH0sDQorCXt9 DQorfTsNCisNCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBjbGtfbXQ4MTkyX21zZGNf ZHJ2ID0gew0KKwkucHJvYmUgPSBjbGtfbXQ4MTkyX21zZGNfcHJvYmUsDQorCS5kcml2ZXIgPSB7 DQorCQkubmFtZSA9ICJjbGstbXQ4MTkyLW1zZGMiLA0KKwkJLm9mX21hdGNoX3RhYmxlID0gb2Zf bWF0Y2hfY2xrX210ODE5Ml9tc2RjLA0KKwl9LA0KK307DQorDQorYnVpbHRpbl9wbGF0Zm9ybV9k cml2ZXIoY2xrX210ODE5Ml9tc2RjX2Rydik7DQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvbWVk aWF0ZWsvY2xrLW10ODE5Mi1tc2RjX3RvcC5jIGIvZHJpdmVycy9jbGsvbWVkaWF0ZWsvY2xrLW10 ODE5Mi1tc2RjX3RvcC5jDQpuZXcgZmlsZSBtb2RlIDEwMDY0NA0KaW5kZXggMDAwMDAwMC4uNTRl MmRhNA0KLS0tIC9kZXYvbnVsbA0KKysrIGIvZHJpdmVycy9jbGsvbWVkaWF0ZWsvY2xrLW10ODE5 Mi1tc2RjX3RvcC5jDQpAQCAtMCwwICsxLDgzIEBADQorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZp ZXI6IEdQTC0yLjANCisvLw0KKy8vIENvcHlyaWdodCAoYykgMjAyMCBNZWRpYVRlayBJbmMuDQor Ly8gQXV0aG9yOiBXZWl5aSBMdSA8d2VpeWkubHVAbWVkaWF0ZWsuY29tPg0KKw0KKyNpbmNsdWRl IDxsaW51eC9jbGstcHJvdmlkZXIuaD4NCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNl Lmg+DQorDQorI2luY2x1ZGUgImNsay1tdGsuaCINCisjaW5jbHVkZSAiY2xrLWdhdGUuaCINCisN CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svbXQ4MTkyLWNsay5oPg0KKw0KK3N0YXRpYyBj b25zdCBzdHJ1Y3QgbXRrX2dhdGVfcmVncyBtc2RjX3RvcF9jZ19yZWdzID0gew0KKwkuc2V0X29m cyA9IDB4MCwNCisJLmNscl9vZnMgPSAweDAsDQorCS5zdGFfb2ZzID0gMHgwLA0KK307DQorDQor I2RlZmluZSBHQVRFX01TRENfVE9QKF9pZCwgX25hbWUsIF9wYXJlbnQsIF9zaGlmdCkJCQlcDQor CUdBVEVfTVRLKF9pZCwgX25hbWUsIF9wYXJlbnQsICZtc2RjX3RvcF9jZ19yZWdzLCBfc2hpZnQs CVwNCisJCSZtdGtfY2xrX2dhdGVfb3BzX25vX3NldGNscl9pbnYpDQorDQorc3RhdGljIGNvbnN0 IHN0cnVjdCBtdGtfZ2F0ZSBtc2RjX3RvcF9jbGtzW10gPSB7DQorCUdBVEVfTVNEQ19UT1AoQ0xL X01TRENfVE9QX0FFU18wUCwgIm1zZGNfdG9wX2Flc18wcCIsDQorCQkiYWVzX21zZGNmZGVfc2Vs IiwgMCksDQorCUdBVEVfTVNEQ19UT1AoQ0xLX01TRENfVE9QX1NSQ18wUCwgIm1zZGNfdG9wX3Ny Y18wcCIsDQorCQkiaW5mcmFfbXNkYzBfc3JjIiwgMSksDQorCUdBVEVfTVNEQ19UT1AoQ0xLX01T RENfVE9QX1NSQ18xUCwgIm1zZGNfdG9wX3NyY18xcCIsDQorCQkiaW5mcmFfbXNkYzFfc3JjIiwg MiksDQorCUdBVEVfTVNEQ19UT1AoQ0xLX01TRENfVE9QX1NSQ18yUCwgIm1zZGNfdG9wX3NyY18y cCIsDQorCQkiaW5mcmFfbXNkYzJfc3JjIiwgMyksDQorCUdBVEVfTVNEQ19UT1AoQ0xLX01TRENf VE9QX1BfTVNEQzAsICJtc2RjX3RvcF9wX21zZGMwIiwNCisJCSJheGlfc2VsIiwgNCksDQorCUdB VEVfTVNEQ19UT1AoQ0xLX01TRENfVE9QX1BfTVNEQzEsICJtc2RjX3RvcF9wX21zZGMxIiwNCisJ CSJheGlfc2VsIiwgNSksDQorCUdBVEVfTVNEQ19UT1AoQ0xLX01TRENfVE9QX1BfTVNEQzIsICJt c2RjX3RvcF9wX21zZGMyIiwNCisJCSJheGlfc2VsIiwgNiksDQorCUdBVEVfTVNEQ19UT1AoQ0xL X01TRENfVE9QX1BfQ0ZHLCAibXNkY190b3BfcF9jZmciLA0KKwkJImF4aV9zZWwiLCA3KSwNCisJ R0FURV9NU0RDX1RPUChDTEtfTVNEQ19UT1BfQVhJLCAibXNkY190b3BfYXhpIiwNCisJCSJheGlf c2VsIiwgOCksDQorCUdBVEVfTVNEQ19UT1AoQ0xLX01TRENfVE9QX0hfTVNUXzBQLCAibXNkY190 b3BfaF9tc3RfMHAiLA0KKwkJImluZnJhX21zZGMwIiwgOSksDQorCUdBVEVfTVNEQ19UT1AoQ0xL X01TRENfVE9QX0hfTVNUXzFQLCAibXNkY190b3BfaF9tc3RfMXAiLA0KKwkJImluZnJhX21zZGMx IiwgMTApLA0KKwlHQVRFX01TRENfVE9QKENMS19NU0RDX1RPUF9IX01TVF8yUCwgIm1zZGNfdG9w X2hfbXN0XzJwIiwNCisJCSJpbmZyYV9tc2RjMiIsIDExKSwNCisJR0FURV9NU0RDX1RPUChDTEtf TVNEQ19UT1BfTUVNX09GRl9ETFlfMjZNLCAibXNkY190b3BfbWVtX29mZl9kbHlfMjZtIiwNCisJ CSJjbGsyNm0iLCAxMiksDQorCUdBVEVfTVNEQ19UT1AoQ0xLX01TRENfVE9QXzMySywgIm1zZGNf dG9wXzMyayIsDQorCQkiY2xrMzJrIiwgMTMpLA0KKwlHQVRFX01TRENfVE9QKENMS19NU0RDX1RP UF9BSEIyQVhJX0JSR19BWEksICJtc2RjX3RvcF9haGIyYXhpX2JyZ19heGkiLA0KKwkJImF4aV9z ZWwiLCAxNCksDQorfTsNCisNCitzdGF0aWMgaW50IGNsa19tdDgxOTJfbXNkY190b3BfcHJvYmUo c3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikNCit7DQorCXN0cnVjdCBjbGtfb25lY2VsbF9k YXRhICpjbGtfZGF0YTsNCisJc3RydWN0IGRldmljZV9ub2RlICpub2RlID0gcGRldi0+ZGV2Lm9m X25vZGU7DQorDQorCWNsa19kYXRhID0gbXRrX2FsbG9jX2Nsa19kYXRhKENMS19NU0RDX1RPUF9O Ul9DTEspOw0KKw0KKwltdGtfY2xrX3JlZ2lzdGVyX2dhdGVzKG5vZGUsIG1zZGNfdG9wX2Nsa3Ms IEFSUkFZX1NJWkUobXNkY190b3BfY2xrcyksDQorCQkJY2xrX2RhdGEpOw0KKw0KKwlyZXR1cm4g b2ZfY2xrX2FkZF9wcm92aWRlcihub2RlLCBvZl9jbGtfc3JjX29uZWNlbGxfZ2V0LCBjbGtfZGF0 YSk7DQorfQ0KKw0KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG9mX21hdGNoX2Ns a19tdDgxOTJfbXNkY190b3BbXSA9IHsNCisJeyAuY29tcGF0aWJsZSA9ICJtZWRpYXRlayxtdDgx OTItbXNkY190b3AiLCB9LA0KKwl7fQ0KK307DQorDQorc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9k cml2ZXIgY2xrX210ODE5Ml9tc2RjX3RvcF9kcnYgPSB7DQorCS5wcm9iZSA9IGNsa19tdDgxOTJf bXNkY190b3BfcHJvYmUsDQorCS5kcml2ZXIgPSB7DQorCQkubmFtZSA9ICJjbGstbXQ4MTkyLW1z ZGNfdG9wIiwNCisJCS5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX2Nsa19tdDgxOTJfbXNkY190 b3AsDQorCX0sDQorfTsNCisNCitidWlsdGluX3BsYXRmb3JtX2RyaXZlcihjbGtfbXQ4MTkyX21z ZGNfdG9wX2Rydik7DQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvbWVkaWF0ZWsvY2xrLW10ODE5 Mi1zY3BfYWRzcC5jIGIvZHJpdmVycy9jbGsvbWVkaWF0ZWsvY2xrLW10ODE5Mi1zY3BfYWRzcC5j DQpuZXcgZmlsZSBtb2RlIDEwMDY0NA0KaW5kZXggMDAwMDAwMC4uYTc4NTc3Mg0KLS0tIC9kZXYv bnVsbA0KKysrIGIvZHJpdmVycy9jbGsvbWVkaWF0ZWsvY2xrLW10ODE5Mi1zY3BfYWRzcC5jDQpA QCAtMCwwICsxLDU1IEBADQorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjANCisv Lw0KKy8vIENvcHlyaWdodCAoYykgMjAyMCBNZWRpYVRlayBJbmMuDQorLy8gQXV0aG9yOiBXZWl5 aSBMdSA8d2VpeWkubHVAbWVkaWF0ZWsuY29tPg0KKw0KKyNpbmNsdWRlIDxsaW51eC9jbGstcHJv dmlkZXIuaD4NCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+DQorDQorI2luY2x1 ZGUgImNsay1tdGsuaCINCisjaW5jbHVkZSAiY2xrLWdhdGUuaCINCisNCisjaW5jbHVkZSA8ZHQt YmluZGluZ3MvY2xvY2svbXQ4MTkyLWNsay5oPg0KKw0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXRr X2dhdGVfcmVncyBzY3BfYWRzcF9jZ19yZWdzID0gew0KKwkuc2V0X29mcyA9IDB4MTgwLA0KKwku Y2xyX29mcyA9IDB4MTgwLA0KKwkuc3RhX29mcyA9IDB4MTgwLA0KK307DQorDQorI2RlZmluZSBH QVRFX1NDUF9BRFNQKF9pZCwgX25hbWUsIF9wYXJlbnQsIF9zaGlmdCkJCQlcDQorCUdBVEVfTVRL KF9pZCwgX25hbWUsIF9wYXJlbnQsICZzY3BfYWRzcF9jZ19yZWdzLCBfc2hpZnQsCVwNCisJCSZt dGtfY2xrX2dhdGVfb3BzX25vX3NldGNscikNCisNCitzdGF0aWMgY29uc3Qgc3RydWN0IG10a19n YXRlIHNjcF9hZHNwX2Nsa3NbXSA9IHsNCisJR0FURV9TQ1BfQURTUChDTEtfU0NQX0FEU1BfQVVE SU9EU1AsICJzY3BfYWRzcF9hdWRpb2RzcCIsICJhZHNwX3NlbCIsDQorCQkwKSwNCit9Ow0KKw0K K3N0YXRpYyBpbnQgY2xrX210ODE5Ml9zY3BfYWRzcF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2 aWNlICpwZGV2KQ0KK3sNCisJc3RydWN0IGNsa19vbmVjZWxsX2RhdGEgKmNsa19kYXRhOw0KKwlz dHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsNCisNCisJY2xrX2Rh dGEgPSBtdGtfYWxsb2NfY2xrX2RhdGEoQ0xLX1NDUF9BRFNQX05SX0NMSyk7DQorDQorCW10a19j bGtfcmVnaXN0ZXJfZ2F0ZXMobm9kZSwgc2NwX2Fkc3BfY2xrcywgQVJSQVlfU0laRShzY3BfYWRz cF9jbGtzKSwNCisJCQljbGtfZGF0YSk7DQorDQorCXJldHVybiBvZl9jbGtfYWRkX3Byb3ZpZGVy KG5vZGUsIG9mX2Nsa19zcmNfb25lY2VsbF9nZXQsIGNsa19kYXRhKTsNCit9DQorDQorc3RhdGlj IGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgb2ZfbWF0Y2hfY2xrX210ODE5Ml9zY3BfYWRzcFtd ID0gew0KKwl7IC5jb21wYXRpYmxlID0gIm1lZGlhdGVrLG10ODE5Mi1zY3BfYWRzcCIsIH0sDQor CXt9DQorfTsNCisNCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBjbGtfbXQ4MTkyX3Nj cF9hZHNwX2RydiA9IHsNCisJLnByb2JlID0gY2xrX210ODE5Ml9zY3BfYWRzcF9wcm9iZSwNCisJ LmRyaXZlciA9IHsNCisJCS5uYW1lID0gImNsay1tdDgxOTItc2NwX2Fkc3AiLA0KKwkJLm9mX21h dGNoX3RhYmxlID0gb2ZfbWF0Y2hfY2xrX210ODE5Ml9zY3BfYWRzcCwNCisJfSwNCit9Ow0KKw0K K2J1aWx0aW5fcGxhdGZvcm1fZHJpdmVyKGNsa19tdDgxOTJfc2NwX2Fkc3BfZHJ2KTsNCmRpZmYg LS1naXQgYS9kcml2ZXJzL2Nsay9tZWRpYXRlay9jbGstbXQ4MTkyLXZkZWMuYyBiL2RyaXZlcnMv Y2xrL21lZGlhdGVrL2Nsay1tdDgxOTItdmRlYy5jDQpuZXcgZmlsZSBtb2RlIDEwMDY0NA0KaW5k ZXggMDAwMDAwMC4uMzdmOGE4Mw0KLS0tIC9kZXYvbnVsbA0KKysrIGIvZHJpdmVycy9jbGsvbWVk aWF0ZWsvY2xrLW10ODE5Mi12ZGVjLmMNCkBAIC0wLDAgKzEsODEgQEANCisvLyBTUERYLUxpY2Vu c2UtSWRlbnRpZmllcjogR1BMLTIuMA0KKy8vDQorLy8gQ29weXJpZ2h0IChjKSAyMDIwIE1lZGlh VGVrIEluYy4NCisvLyBBdXRob3I6IFdlaXlpIEx1IDx3ZWl5aS5sdUBtZWRpYXRlay5jb20+DQor DQorI2luY2x1ZGUgPGxpbnV4L2Nsay1wcm92aWRlci5oPg0KKyNpbmNsdWRlIDxsaW51eC9wbGF0 Zm9ybV9kZXZpY2UuaD4NCisNCisjaW5jbHVkZSAiY2xrLW10ay5oIg0KKyNpbmNsdWRlICJjbGst Z2F0ZS5oIg0KKw0KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9tdDgxOTItY2xrLmg+DQor DQorc3RhdGljIGNvbnN0IHN0cnVjdCBtdGtfZ2F0ZV9yZWdzIHZkZWMwX2NnX3JlZ3MgPSB7DQor CS5zZXRfb2ZzID0gMHgwLA0KKwkuY2xyX29mcyA9IDB4NCwNCisJLnN0YV9vZnMgPSAweDAsDQor fTsNCisNCitzdGF0aWMgY29uc3Qgc3RydWN0IG10a19nYXRlX3JlZ3MgdmRlYzFfY2dfcmVncyA9 IHsNCisJLnNldF9vZnMgPSAweDIwMCwNCisJLmNscl9vZnMgPSAweDIwNCwNCisJLnN0YV9vZnMg PSAweDIwMCwNCit9Ow0KKw0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXRrX2dhdGVfcmVncyB2ZGVj Ml9jZ19yZWdzID0gew0KKwkuc2V0X29mcyA9IDB4OCwNCisJLmNscl9vZnMgPSAweGMsDQorCS5z dGFfb2ZzID0gMHg4LA0KK307DQorDQorI2RlZmluZSBHQVRFX1ZERUMwKF9pZCwgX25hbWUsIF9w YXJlbnQsIF9zaGlmdCkJCQlcDQorCUdBVEVfTVRLKF9pZCwgX25hbWUsIF9wYXJlbnQsICZ2ZGVj MF9jZ19yZWdzLCBfc2hpZnQsCVwNCisJCSZtdGtfY2xrX2dhdGVfb3BzX3NldGNscl9pbnYpDQor DQorI2RlZmluZSBHQVRFX1ZERUMxKF9pZCwgX25hbWUsIF9wYXJlbnQsIF9zaGlmdCkJCQlcDQor CUdBVEVfTVRLKF9pZCwgX25hbWUsIF9wYXJlbnQsICZ2ZGVjMV9jZ19yZWdzLCBfc2hpZnQsCVwN CisJCSZtdGtfY2xrX2dhdGVfb3BzX3NldGNscl9pbnYpDQorDQorI2RlZmluZSBHQVRFX1ZERUMy KF9pZCwgX25hbWUsIF9wYXJlbnQsIF9zaGlmdCkJCQlcDQorCUdBVEVfTVRLKF9pZCwgX25hbWUs IF9wYXJlbnQsICZ2ZGVjMl9jZ19yZWdzLCBfc2hpZnQsCVwNCisJCSZtdGtfY2xrX2dhdGVfb3Bz X3NldGNscl9pbnYpDQorDQorc3RhdGljIGNvbnN0IHN0cnVjdCBtdGtfZ2F0ZSB2ZGVjX2Nsa3Nb XSA9IHsNCisJLyogVkRFQzAgKi8NCisJR0FURV9WREVDMChDTEtfVkRFQ19WREVDLCAidmRlY192 ZGVjIiwgInZkZWNfc2VsIiwgMCksDQorCUdBVEVfVkRFQzAoQ0xLX1ZERUNfQUNUSVZFLCAidmRl Y19hY3RpdmUiLCAidmRlY19zZWwiLCA0KSwNCisJLyogVkRFQzEgKi8NCisJR0FURV9WREVDMShD TEtfVkRFQ19MQVQsICJ2ZGVjX2xhdCIsICJ2ZGVjX3NlbCIsIDApLA0KKwlHQVRFX1ZERUMxKENM S19WREVDX0xBVF9BQ1RJVkUsICJ2ZGVjX2xhdF9hY3RpdmUiLCAidmRlY19zZWwiLCA0KSwNCisJ LyogVkRFQzIgKi8NCisJR0FURV9WREVDMihDTEtfVkRFQ19MQVJCMSwgInZkZWNfbGFyYjEiLCAi dmRlY19zZWwiLCAwKSwNCit9Ow0KKw0KK3N0YXRpYyBpbnQgY2xrX210ODE5Ml92ZGVjX3Byb2Jl KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpDQorew0KKwlzdHJ1Y3QgY2xrX29uZWNlbGxf ZGF0YSAqY2xrX2RhdGE7DQorCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSA9IHBkZXYtPmRldi5v Zl9ub2RlOw0KKw0KKwljbGtfZGF0YSA9IG10a19hbGxvY19jbGtfZGF0YShDTEtfVkRFQ19OUl9D TEspOw0KKw0KKwltdGtfY2xrX3JlZ2lzdGVyX2dhdGVzKG5vZGUsIHZkZWNfY2xrcywgQVJSQVlf U0laRSh2ZGVjX2Nsa3MpLA0KKwkJCWNsa19kYXRhKTsNCisNCisJcmV0dXJuIG9mX2Nsa19hZGRf cHJvdmlkZXIobm9kZSwgb2ZfY2xrX3NyY19vbmVjZWxsX2dldCwgY2xrX2RhdGEpOw0KK30NCisN CitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBvZl9tYXRjaF9jbGtfbXQ4MTkyX3Zk ZWNbXSA9IHsNCisJeyAuY29tcGF0aWJsZSA9ICJtZWRpYXRlayxtdDgxOTItdmRlY3N5cyIsIH0s DQorCXt9DQorfTsNCisNCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBjbGtfbXQ4MTky X3ZkZWNfZHJ2ID0gew0KKwkucHJvYmUgPSBjbGtfbXQ4MTkyX3ZkZWNfcHJvYmUsDQorCS5kcml2 ZXIgPSB7DQorCQkubmFtZSA9ICJjbGstbXQ4MTkyLXZkZWMiLA0KKwkJLm9mX21hdGNoX3RhYmxl ID0gb2ZfbWF0Y2hfY2xrX210ODE5Ml92ZGVjLA0KKwl9LA0KK307DQorDQorYnVpbHRpbl9wbGF0 Zm9ybV9kcml2ZXIoY2xrX210ODE5Ml92ZGVjX2Rydik7DQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9j bGsvbWVkaWF0ZWsvY2xrLW10ODE5Mi12ZGVjX3NvYy5jIGIvZHJpdmVycy9jbGsvbWVkaWF0ZWsv Y2xrLW10ODE5Mi12ZGVjX3NvYy5jDQpuZXcgZmlsZSBtb2RlIDEwMDY0NA0KaW5kZXggMDAwMDAw MC4uNWRmOThkNA0KLS0tIC9kZXYvbnVsbA0KKysrIGIvZHJpdmVycy9jbGsvbWVkaWF0ZWsvY2xr LW10ODE5Mi12ZGVjX3NvYy5jDQpAQCAtMCwwICsxLDg2IEBADQorLy8gU1BEWC1MaWNlbnNlLUlk ZW50aWZpZXI6IEdQTC0yLjANCisvLw0KKy8vIENvcHlyaWdodCAoYykgMjAyMCBNZWRpYVRlayBJ bmMuDQorLy8gQXV0aG9yOiBXZWl5aSBMdSA8d2VpeWkubHVAbWVkaWF0ZWsuY29tPg0KKw0KKyNp bmNsdWRlIDxsaW51eC9jbGstcHJvdmlkZXIuaD4NCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1f ZGV2aWNlLmg+DQorDQorI2luY2x1ZGUgImNsay1tdGsuaCINCisjaW5jbHVkZSAiY2xrLWdhdGUu aCINCisNCisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svbXQ4MTkyLWNsay5oPg0KKw0KK3N0 YXRpYyBjb25zdCBzdHJ1Y3QgbXRrX2dhdGVfcmVncyB2ZGVjX3NvYzBfY2dfcmVncyA9IHsNCisJ LnNldF9vZnMgPSAweDAsDQorCS5jbHJfb2ZzID0gMHg0LA0KKwkuc3RhX29mcyA9IDB4MCwNCit9 Ow0KKw0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXRrX2dhdGVfcmVncyB2ZGVjX3NvYzFfY2dfcmVn cyA9IHsNCisJLnNldF9vZnMgPSAweDIwMCwNCisJLmNscl9vZnMgPSAweDIwNCwNCisJLnN0YV9v ZnMgPSAweDIwMCwNCit9Ow0KKw0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXRrX2dhdGVfcmVncyB2 ZGVjX3NvYzJfY2dfcmVncyA9IHsNCisJLnNldF9vZnMgPSAweDgsDQorCS5jbHJfb2ZzID0gMHhj LA0KKwkuc3RhX29mcyA9IDB4OCwNCit9Ow0KKw0KKyNkZWZpbmUgR0FURV9WREVDX1NPQzAoX2lk LCBfbmFtZSwgX3BhcmVudCwgX3NoaWZ0KQkJCVwNCisJR0FURV9NVEsoX2lkLCBfbmFtZSwgX3Bh cmVudCwgJnZkZWNfc29jMF9jZ19yZWdzLCBfc2hpZnQsCVwNCisJCSZtdGtfY2xrX2dhdGVfb3Bz X3NldGNscl9pbnYpDQorDQorI2RlZmluZSBHQVRFX1ZERUNfU09DMShfaWQsIF9uYW1lLCBfcGFy ZW50LCBfc2hpZnQpCQkJXA0KKwlHQVRFX01USyhfaWQsIF9uYW1lLCBfcGFyZW50LCAmdmRlY19z b2MxX2NnX3JlZ3MsIF9zaGlmdCwJXA0KKwkJJm10a19jbGtfZ2F0ZV9vcHNfc2V0Y2xyX2ludikN CisNCisjZGVmaW5lIEdBVEVfVkRFQ19TT0MyKF9pZCwgX25hbWUsIF9wYXJlbnQsIF9zaGlmdCkJ CQlcDQorCUdBVEVfTVRLKF9pZCwgX25hbWUsIF9wYXJlbnQsICZ2ZGVjX3NvYzJfY2dfcmVncywg X3NoaWZ0LAlcDQorCQkmbXRrX2Nsa19nYXRlX29wc19zZXRjbHJfaW52KQ0KKw0KK3N0YXRpYyBj b25zdCBzdHJ1Y3QgbXRrX2dhdGUgdmRlY19zb2NfY2xrc1tdID0gew0KKwkvKiBWREVDX1NPQzAg Ki8NCisJR0FURV9WREVDX1NPQzAoQ0xLX1ZERUNfU09DX1ZERUMsICJ2ZGVjX3NvY192ZGVjIiwN CisJCSJ2ZGVjX3NlbCIsIDApLA0KKwlHQVRFX1ZERUNfU09DMChDTEtfVkRFQ19TT0NfVkRFQ19B Q1RJVkUsICJ2ZGVjX3NvY192ZGVjX2FjdGl2ZSIsDQorCQkidmRlY19zZWwiLCA0KSwNCisJLyog VkRFQ19TT0MxICovDQorCUdBVEVfVkRFQ19TT0MxKENMS19WREVDX1NPQ19MQVQsICJ2ZGVjX3Nv Y19sYXQiLA0KKwkJInZkZWNfc2VsIiwgMCksDQorCUdBVEVfVkRFQ19TT0MxKENMS19WREVDX1NP Q19MQVRfQUNUSVZFLCAidmRlY19zb2NfbGF0X2FjdGl2ZSIsDQorCQkidmRlY19zZWwiLCA0KSwN CisJLyogVkRFQ19TT0MyICovDQorCUdBVEVfVkRFQ19TT0MyKENMS19WREVDX1NPQ19MQVJCMSwg InZkZWNfc29jX2xhcmIxIiwNCisJCSJ2ZGVjX3NlbCIsIDApLA0KK307DQorDQorc3RhdGljIGlu dCBjbGtfbXQ4MTkyX3ZkZWNfc29jX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYp DQorew0KKwlzdHJ1Y3QgY2xrX29uZWNlbGxfZGF0YSAqY2xrX2RhdGE7DQorCXN0cnVjdCBkZXZp Y2Vfbm9kZSAqbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOw0KKw0KKwljbGtfZGF0YSA9IG10a19h bGxvY19jbGtfZGF0YShDTEtfVkRFQ19TT0NfTlJfQ0xLKTsNCisNCisJbXRrX2Nsa19yZWdpc3Rl cl9nYXRlcyhub2RlLCB2ZGVjX3NvY19jbGtzLCBBUlJBWV9TSVpFKHZkZWNfc29jX2Nsa3MpLA0K KwkJCWNsa19kYXRhKTsNCisNCisJcmV0dXJuIG9mX2Nsa19hZGRfcHJvdmlkZXIobm9kZSwgb2Zf Y2xrX3NyY19vbmVjZWxsX2dldCwgY2xrX2RhdGEpOw0KK30NCisNCitzdGF0aWMgY29uc3Qgc3Ry dWN0IG9mX2RldmljZV9pZCBvZl9tYXRjaF9jbGtfbXQ4MTkyX3ZkZWNfc29jW10gPSB7DQorCXsg LmNvbXBhdGlibGUgPSAibWVkaWF0ZWssbXQ4MTkyLXZkZWNzeXNfc29jIiwgfSwNCisJe30NCit9 Ow0KKw0KK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGNsa19tdDgxOTJfdmRlY19zb2Nf ZHJ2ID0gew0KKwkucHJvYmUgPSBjbGtfbXQ4MTkyX3ZkZWNfc29jX3Byb2JlLA0KKwkuZHJpdmVy ID0gew0KKwkJLm5hbWUgPSAiY2xrLW10ODE5Mi12ZGVjX3NvYyIsDQorCQkub2ZfbWF0Y2hfdGFi bGUgPSBvZl9tYXRjaF9jbGtfbXQ4MTkyX3ZkZWNfc29jLA0KKwl9LA0KK307DQorDQorYnVpbHRp bl9wbGF0Zm9ybV9kcml2ZXIoY2xrX210ODE5Ml92ZGVjX3NvY19kcnYpOw0KZGlmZiAtLWdpdCBh L2RyaXZlcnMvY2xrL21lZGlhdGVrL2Nsay1tdDgxOTItdmVuYy5jIGIvZHJpdmVycy9jbGsvbWVk aWF0ZWsvY2xrLW10ODE5Mi12ZW5jLmMNCm5ldyBmaWxlIG1vZGUgMTAwNjQ0DQppbmRleCAwMDAw MDAwLi44Njc1ZDZhDQotLS0gL2Rldi9udWxsDQorKysgYi9kcml2ZXJzL2Nsay9tZWRpYXRlay9j bGstbXQ4MTkyLXZlbmMuYw0KQEAgLTAsMCArMSw1NyBAQA0KKy8vIFNQRFgtTGljZW5zZS1JZGVu dGlmaWVyOiBHUEwtMi4wDQorLy8NCisvLyBDb3B5cmlnaHQgKGMpIDIwMjAgTWVkaWFUZWsgSW5j Lg0KKy8vIEF1dGhvcjogV2VpeWkgTHUgPHdlaXlpLmx1QG1lZGlhdGVrLmNvbT4NCisNCisjaW5j bHVkZSA8bGludXgvY2xrLXByb3ZpZGVyLmg+DQorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2Rl dmljZS5oPg0KKw0KKyNpbmNsdWRlICJjbGstbXRrLmgiDQorI2luY2x1ZGUgImNsay1nYXRlLmgi DQorDQorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL210ODE5Mi1jbGsuaD4NCisNCitzdGF0 aWMgY29uc3Qgc3RydWN0IG10a19nYXRlX3JlZ3MgdmVuY19jZ19yZWdzID0gew0KKwkuc2V0X29m cyA9IDB4NCwNCisJLmNscl9vZnMgPSAweDgsDQorCS5zdGFfb2ZzID0gMHgwLA0KK307DQorDQor I2RlZmluZSBHQVRFX1ZFTkMoX2lkLCBfbmFtZSwgX3BhcmVudCwgX3NoaWZ0KQkJCVwNCisJR0FU RV9NVEsoX2lkLCBfbmFtZSwgX3BhcmVudCwgJnZlbmNfY2dfcmVncywgX3NoaWZ0LAlcDQorCQkm bXRrX2Nsa19nYXRlX29wc19zZXRjbHJfaW52KQ0KKw0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXRr X2dhdGUgdmVuY19jbGtzW10gPSB7DQorCUdBVEVfVkVOQyhDTEtfVkVOQ19TRVQwX0xBUkIsICJ2 ZW5jX3NldDBfbGFyYiIsICJ2ZW5jX3NlbCIsIDApLA0KKwlHQVRFX1ZFTkMoQ0xLX1ZFTkNfU0VU MV9WRU5DLCAidmVuY19zZXQxX3ZlbmMiLCAidmVuY19zZWwiLCA0KSwNCisJR0FURV9WRU5DKENM S19WRU5DX1NFVDJfSlBHRU5DLCAidmVuY19zZXQyX2pwZ2VuYyIsICJ2ZW5jX3NlbCIsIDgpLA0K KwlHQVRFX1ZFTkMoQ0xLX1ZFTkNfU0VUNV9HQUxTLCAidmVuY19zZXQ1X2dhbHMiLCAidmVuY19z ZWwiLCAyOCksDQorfTsNCisNCitzdGF0aWMgaW50IGNsa19tdDgxOTJfdmVuY19wcm9iZShzdHJ1 Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQ0KK3sNCisJc3RydWN0IGNsa19vbmVjZWxsX2RhdGEg KmNsa19kYXRhOw0KKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUgPSBwZGV2LT5kZXYub2Zfbm9k ZTsNCisNCisJY2xrX2RhdGEgPSBtdGtfYWxsb2NfY2xrX2RhdGEoQ0xLX1ZFTkNfTlJfQ0xLKTsN CisNCisJbXRrX2Nsa19yZWdpc3Rlcl9nYXRlcyhub2RlLCB2ZW5jX2Nsa3MsIEFSUkFZX1NJWkUo dmVuY19jbGtzKSwNCisJCQljbGtfZGF0YSk7DQorDQorCXJldHVybiBvZl9jbGtfYWRkX3Byb3Zp ZGVyKG5vZGUsIG9mX2Nsa19zcmNfb25lY2VsbF9nZXQsIGNsa19kYXRhKTsNCit9DQorDQorc3Rh dGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgb2ZfbWF0Y2hfY2xrX210ODE5Ml92ZW5jW10g PSB7DQorCXsgLmNvbXBhdGlibGUgPSAibWVkaWF0ZWssbXQ4MTkyLXZlbmNzeXMiLCB9LA0KKwl7 fQ0KK307DQorDQorc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgY2xrX210ODE5Ml92ZW5j X2RydiA9IHsNCisJLnByb2JlID0gY2xrX210ODE5Ml92ZW5jX3Byb2JlLA0KKwkuZHJpdmVyID0g ew0KKwkJLm5hbWUgPSAiY2xrLW10ODE5Mi12ZW5jIiwNCisJCS5vZl9tYXRjaF90YWJsZSA9IG9m X21hdGNoX2Nsa19tdDgxOTJfdmVuYywNCisJfSwNCit9Ow0KKw0KK2J1aWx0aW5fcGxhdGZvcm1f ZHJpdmVyKGNsa19tdDgxOTJfdmVuY19kcnYpOw0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL21l ZGlhdGVrL2Nsay1tdDgxOTIuYyBiL2RyaXZlcnMvY2xrL21lZGlhdGVrL2Nsay1tdDgxOTIuYw0K bmV3IGZpbGUgbW9kZSAxMDA2NDQNCmluZGV4IDAwMDAwMDAuLjM3ZDhkZWYNCi0tLSAvZGV2L251 bGwNCisrKyBiL2RyaXZlcnMvY2xrL21lZGlhdGVrL2Nsay1tdDgxOTIuYw0KQEAgLTAsMCArMSwx NTQ5IEBADQorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjANCisvLw0KKy8vIENv cHlyaWdodCAoYykgMjAyMCBNZWRpYVRlayBJbmMuDQorLy8gQXV0aG9yOiBXZWl5aSBMdSA8d2Vp eWkubHVAbWVkaWF0ZWsuY29tPg0KKw0KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4NCisjaW5jbHVk ZSA8bGludXgvZGVsYXkuaD4NCisjaW5jbHVkZSA8bGludXgvbWZkL3N5c2Nvbi5oPg0KKyNpbmNs dWRlIDxsaW51eC9vZi5oPg0KKyNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+DQorI2luY2x1 ZGUgPGxpbnV4L29mX2RldmljZS5oPg0KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2Uu aD4NCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPg0KKw0KKyNpbmNsdWRlICJjbGstbXRrLmgiDQor I2luY2x1ZGUgImNsay1tdXguaCINCisjaW5jbHVkZSAiY2xrLWdhdGUuaCINCisNCisjaW5jbHVk ZSA8ZHQtYmluZGluZ3MvY2xvY2svbXQ4MTkyLWNsay5oPg0KKw0KK3N0YXRpYyBERUZJTkVfU1BJ TkxPQ0sobXQ4MTkyX2Nsa19sb2NrKTsNCisNCitzdGF0aWMgY29uc3Qgc3RydWN0IG10a19maXhl ZF9jbGsgdG9wX2ZpeGVkX2Nsa3NbXSA9IHsNCisJRklYRURfQ0xLKENMS19UT1BfVUxQT1NDLCAi dWxwb3NjIiwgTlVMTCwgMjYwMDAwMDAwKSwNCit9Ow0KKw0KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qg bXRrX2ZpeGVkX2ZhY3RvciB0b3BfZWFybHlfZGl2c1tdID0gew0KKwlGQUNUT1IoQ0xLX1RPUF9D U1dfRjI2TV9EMiwgImNzd19mMjZtX2QyIiwgImNsazI2bSIsIDEsIDIpLA0KK307DQorDQorc3Rh dGljIGNvbnN0IHN0cnVjdCBtdGtfZml4ZWRfZmFjdG9yIHRvcF9kaXZzW10gPSB7DQorCUZBQ1RP UihDTEtfVE9QX01BSU5QTExfRDMsICJtYWlucGxsX2QzIiwgIm1haW5wbGwiLCAxLA0KKwkJMyks DQorCUZBQ1RPUihDTEtfVE9QX01BSU5QTExfRDQsICJtYWlucGxsX2Q0IiwgIm1haW5wbGwiLCAx LA0KKwkJNCksDQorCUZBQ1RPUihDTEtfVE9QX01BSU5QTExfRDRfRDIsICJtYWlucGxsX2Q0X2Qy IiwgIm1haW5wbGxfZDQiLCAxLA0KKwkJMiksDQorCUZBQ1RPUihDTEtfVE9QX01BSU5QTExfRDRf RDQsICJtYWlucGxsX2Q0X2Q0IiwgIm1haW5wbGxfZDQiLCAxLA0KKwkJNCksDQorCUZBQ1RPUihD TEtfVE9QX01BSU5QTExfRDRfRDgsICJtYWlucGxsX2Q0X2Q4IiwgIm1haW5wbGxfZDQiLCAxLA0K KwkJOCksDQorCUZBQ1RPUihDTEtfVE9QX01BSU5QTExfRDRfRDE2LCAibWFpbnBsbF9kNF9kMTYi LCAibWFpbnBsbF9kNCIsIDEsDQorCQkxNiksDQorCUZBQ1RPUihDTEtfVE9QX01BSU5QTExfRDUs ICJtYWlucGxsX2Q1IiwgIm1haW5wbGwiLCAxLA0KKwkJNSksDQorCUZBQ1RPUihDTEtfVE9QX01B SU5QTExfRDVfRDIsICJtYWlucGxsX2Q1X2QyIiwgIm1haW5wbGxfZDUiLCAxLA0KKwkJMiksDQor CUZBQ1RPUihDTEtfVE9QX01BSU5QTExfRDVfRDQsICJtYWlucGxsX2Q1X2Q0IiwgIm1haW5wbGxf ZDUiLCAxLA0KKwkJNCksDQorCUZBQ1RPUihDTEtfVE9QX01BSU5QTExfRDVfRDgsICJtYWlucGxs X2Q1X2Q4IiwgIm1haW5wbGxfZDUiLCAxLA0KKwkJOCksDQorCUZBQ1RPUihDTEtfVE9QX01BSU5Q TExfRDYsICJtYWlucGxsX2Q2IiwgIm1haW5wbGwiLCAxLA0KKwkJNiksDQorCUZBQ1RPUihDTEtf VE9QX01BSU5QTExfRDZfRDIsICJtYWlucGxsX2Q2X2QyIiwgIm1haW5wbGxfZDYiLCAxLA0KKwkJ MiksDQorCUZBQ1RPUihDTEtfVE9QX01BSU5QTExfRDZfRDQsICJtYWlucGxsX2Q2X2Q0IiwgIm1h aW5wbGxfZDYiLCAxLA0KKwkJNCksDQorCUZBQ1RPUihDTEtfVE9QX01BSU5QTExfRDcsICJtYWlu cGxsX2Q3IiwgIm1haW5wbGwiLCAxLA0KKwkJNyksDQorCUZBQ1RPUihDTEtfVE9QX01BSU5QTExf RDdfRDIsICJtYWlucGxsX2Q3X2QyIiwgIm1haW5wbGxfZDciLCAxLA0KKwkJMiksDQorCUZBQ1RP UihDTEtfVE9QX01BSU5QTExfRDdfRDQsICJtYWlucGxsX2Q3X2Q0IiwgIm1haW5wbGxfZDciLCAx LA0KKwkJNCksDQorCUZBQ1RPUihDTEtfVE9QX01BSU5QTExfRDdfRDgsICJtYWlucGxsX2Q3X2Q4 IiwgIm1haW5wbGxfZDciLCAxLA0KKwkJOCksDQorCUZBQ1RPUihDTEtfVE9QX1VOSVZQTExfRDMs ICJ1bml2cGxsX2QzIiwgInVuaXZwbGwiLCAxLA0KKwkJMyksDQorCUZBQ1RPUihDTEtfVE9QX1VO SVZQTExfRDQsICJ1bml2cGxsX2Q0IiwgInVuaXZwbGwiLCAxLA0KKwkJNCksDQorCUZBQ1RPUihD TEtfVE9QX1VOSVZQTExfRDRfRDIsICJ1bml2cGxsX2Q0X2QyIiwgInVuaXZwbGxfZDQiLCAxLA0K KwkJMiksDQorCUZBQ1RPUihDTEtfVE9QX1VOSVZQTExfRDRfRDQsICJ1bml2cGxsX2Q0X2Q0Iiwg InVuaXZwbGxfZDQiLCAxLA0KKwkJNCksDQorCUZBQ1RPUihDTEtfVE9QX1VOSVZQTExfRDRfRDgs ICJ1bml2cGxsX2Q0X2Q4IiwgInVuaXZwbGxfZDQiLCAxLA0KKwkJOCksDQorCUZBQ1RPUihDTEtf VE9QX1VOSVZQTExfRDUsICJ1bml2cGxsX2Q1IiwgInVuaXZwbGwiLCAxLA0KKwkJNSksDQorCUZB Q1RPUihDTEtfVE9QX1VOSVZQTExfRDVfRDIsICJ1bml2cGxsX2Q1X2QyIiwgInVuaXZwbGxfZDUi LCAxLA0KKwkJMiksDQorCUZBQ1RPUihDTEtfVE9QX1VOSVZQTExfRDVfRDQsICJ1bml2cGxsX2Q1 X2Q0IiwgInVuaXZwbGxfZDUiLCAxLA0KKwkJNCksDQorCUZBQ1RPUihDTEtfVE9QX1VOSVZQTExf RDVfRDgsICJ1bml2cGxsX2Q1X2Q4IiwgInVuaXZwbGxfZDUiLCAxLA0KKwkJOCksDQorCUZBQ1RP UihDTEtfVE9QX1VOSVZQTExfRDYsICJ1bml2cGxsX2Q2IiwgInVuaXZwbGwiLCAxLA0KKwkJNiks DQorCUZBQ1RPUihDTEtfVE9QX1VOSVZQTExfRDZfRDIsICJ1bml2cGxsX2Q2X2QyIiwgInVuaXZw bGxfZDYiLCAxLA0KKwkJMiksDQorCUZBQ1RPUihDTEtfVE9QX1VOSVZQTExfRDZfRDQsICJ1bml2 cGxsX2Q2X2Q0IiwgInVuaXZwbGxfZDYiLCAxLA0KKwkJNCksDQorCUZBQ1RPUihDTEtfVE9QX1VO SVZQTExfRDZfRDgsICJ1bml2cGxsX2Q2X2Q4IiwgInVuaXZwbGxfZDYiLCAxLA0KKwkJOCksDQor CUZBQ1RPUihDTEtfVE9QX1VOSVZQTExfRDZfRDE2LCAidW5pdnBsbF9kNl9kMTYiLCAidW5pdnBs bF9kNiIsIDEsDQorCQkxNiksDQorCUZBQ1RPUihDTEtfVE9QX1VOSVZQTExfRDcsICJ1bml2cGxs X2Q3IiwgInVuaXZwbGwiLCAxLA0KKwkJNyksDQorCUZBQ1RPUihDTEtfVE9QX0FQTEwxLCAiYXBs bDFfY2siLCAiYXBsbDEiLCAxLA0KKwkJMSksDQorCUZBQ1RPUihDTEtfVE9QX0FQTEwxX0QyLCAi YXBsbDFfZDIiLCAiYXBsbDEiLCAxLA0KKwkJMiksDQorCUZBQ1RPUihDTEtfVE9QX0FQTEwxX0Q0 LCAiYXBsbDFfZDQiLCAiYXBsbDEiLCAxLA0KKwkJNCksDQorCUZBQ1RPUihDTEtfVE9QX0FQTEwx X0Q4LCAiYXBsbDFfZDgiLCAiYXBsbDEiLCAxLA0KKwkJOCksDQorCUZBQ1RPUihDTEtfVE9QX0FQ TEwyLCAiYXBsbDJfY2siLCAiYXBsbDIiLCAxLA0KKwkJMSksDQorCUZBQ1RPUihDTEtfVE9QX0FQ TEwyX0QyLCAiYXBsbDJfZDIiLCAiYXBsbDIiLCAxLA0KKwkJMiksDQorCUZBQ1RPUihDTEtfVE9Q X0FQTEwyX0Q0LCAiYXBsbDJfZDQiLCAiYXBsbDIiLCAxLA0KKwkJNCksDQorCUZBQ1RPUihDTEtf VE9QX0FQTEwyX0Q4LCAiYXBsbDJfZDgiLCAiYXBsbDIiLCAxLA0KKwkJOCksDQorCUZBQ1RPUihD TEtfVE9QX01NUExMX0Q0LCAibW1wbGxfZDQiLCAibW1wbGwiLCAxLA0KKwkJNCksDQorCUZBQ1RP UihDTEtfVE9QX01NUExMX0Q0X0QyLCAibW1wbGxfZDRfZDIiLCAibW1wbGxfZDQiLCAxLA0KKwkJ MiksDQorCUZBQ1RPUihDTEtfVE9QX01NUExMX0Q1LCAibW1wbGxfZDUiLCAibW1wbGwiLCAxLA0K KwkJNSksDQorCUZBQ1RPUihDTEtfVE9QX01NUExMX0Q1X0QyLCAibW1wbGxfZDVfZDIiLCAibW1w bGxfZDUiLCAxLA0KKwkJMiksDQorCUZBQ1RPUihDTEtfVE9QX01NUExMX0Q2LCAibW1wbGxfZDYi LCAibW1wbGwiLCAxLA0KKwkJNiksDQorCUZBQ1RPUihDTEtfVE9QX01NUExMX0Q2X0QyLCAibW1w bGxfZDZfZDIiLCAibW1wbGxfZDYiLCAxLA0KKwkJMiksDQorCUZBQ1RPUihDTEtfVE9QX01NUExM X0Q3LCAibW1wbGxfZDciLCAibW1wbGwiLCAxLA0KKwkJNyksDQorCUZBQ1RPUihDTEtfVE9QX01N UExMX0Q5LCAibW1wbGxfZDkiLCAibW1wbGwiLCAxLA0KKwkJOSksDQorCUZBQ1RPUihDTEtfVE9Q X0FQVVBMTCwgImFwdXBsbF9jayIsICJhcHVwbGwiLCAxLA0KKwkJMiksDQorCUZBQ1RPUihDTEtf VE9QX05QVVBMTCwgIm5wdXBsbF9jayIsICJucHVwbGwiLCAxLA0KKwkJMSksDQorCUZBQ1RPUihD TEtfVE9QX1RWRFBMTCwgInR2ZHBsbF9jayIsICJ0dmRwbGwiLCAxLA0KKwkJMSksDQorCUZBQ1RP UihDTEtfVE9QX1RWRFBMTF9EMiwgInR2ZHBsbF9kMiIsICJ0dmRwbGwiLCAxLA0KKwkJMiksDQor CUZBQ1RPUihDTEtfVE9QX1RWRFBMTF9ENCwgInR2ZHBsbF9kNCIsICJ0dmRwbGwiLCAxLA0KKwkJ NCksDQorCUZBQ1RPUihDTEtfVE9QX1RWRFBMTF9EOCwgInR2ZHBsbF9kOCIsICJ0dmRwbGwiLCAx LA0KKwkJOCksDQorCUZBQ1RPUihDTEtfVE9QX1RWRFBMTF9EMTYsICJ0dmRwbGxfZDE2IiwgInR2 ZHBsbCIsIDEsDQorCQkxNiksDQorCUZBQ1RPUihDTEtfVE9QX01TRENQTEwsICJtc2RjcGxsX2Nr IiwgIm1zZGNwbGwiLCAxLA0KKwkJMSksDQorCUZBQ1RPUihDTEtfVE9QX01TRENQTExfRDIsICJt c2RjcGxsX2QyIiwgIm1zZGNwbGwiLCAxLA0KKwkJMiksDQorCUZBQ1RPUihDTEtfVE9QX01TRENQ TExfRDQsICJtc2RjcGxsX2Q0IiwgIm1zZGNwbGwiLCAxLA0KKwkJNCksDQorCUZBQ1RPUihDTEtf VE9QX09TQ19EMiwgIm9zY19kMiIsICJ1bHBvc2MiLCAxLA0KKwkJMiksDQorCUZBQ1RPUihDTEtf VE9QX09TQ19ENCwgIm9zY19kNCIsICJ1bHBvc2MiLCAxLA0KKwkJNCksDQorCUZBQ1RPUihDTEtf VE9QX09TQ19EOCwgIm9zY19kOCIsICJ1bHBvc2MiLCAxLA0KKwkJOCksDQorCUZBQ1RPUihDTEtf VE9QX09TQ19EMTAsICJvc2NfZDEwIiwgInVscG9zYyIsIDEsDQorCQkxMCksDQorCUZBQ1RPUihD TEtfVE9QX09TQ19EMTYsICJvc2NfZDE2IiwgInVscG9zYyIsIDEsDQorCQkxNiksDQorCUZBQ1RP UihDTEtfVE9QX09TQ19EMjAsICJvc2NfZDIwIiwgInVscG9zYyIsIDEsDQorCQkyMCksDQorCUZB Q1RPUihDTEtfVE9QX0FEU1BQTEwsICJhZHNwcGxsX2NrIiwgImFkc3BwbGwiLCAxLA0KKwkJMSks DQorCUZBQ1RPUihDTEtfVE9QX1VOSVZQTExfMTkyTSwgInVuaXZwbGxfMTkybSIsICJ1bml2cGxs IiwgMSwNCisJCTEzKSwNCisJRkFDVE9SKENMS19UT1BfVU5JVlBMTF8xOTJNX0QyLCAidW5pdnBs bF8xOTJtX2QyIiwgInVuaXZwbGxfMTkybSIsIDEsDQorCQkyKSwNCisJRkFDVE9SKENMS19UT1Bf VU5JVlBMTF8xOTJNX0Q0LCAidW5pdnBsbF8xOTJtX2Q0IiwgInVuaXZwbGxfMTkybSIsIDEsDQor CQk0KSwNCisJRkFDVE9SKENMS19UT1BfVU5JVlBMTF8xOTJNX0Q4LCAidW5pdnBsbF8xOTJtX2Q4 IiwgInVuaXZwbGxfMTkybSIsIDEsDQorCQk4KSwNCisJRkFDVE9SKENMS19UT1BfVU5JVlBMTF8x OTJNX0QxNiwgInVuaXZwbGxfMTkybV9kMTYiLCAidW5pdnBsbF8xOTJtIiwgMSwNCisJCTE2KSwN CisJRkFDVE9SKENMS19UT1BfVU5JVlBMTF8xOTJNX0QzMiwgInVuaXZwbGxfMTkybV9kMzIiLCAi dW5pdnBsbF8xOTJtIiwgMSwNCisJCTMyKSwNCit9Ow0KKw0KK3N0YXRpYyBjb25zdCBjaGFyICog Y29uc3QgYXhpX3BhcmVudHNbXSA9IHsNCisJImNsazI2bSIsDQorCSJtYWlucGxsX2Q0X2Q0IiwN CisJIm1haW5wbGxfZDdfZDIiLA0KKwkibWFpbnBsbF9kNF9kMiIsDQorCSJtYWlucGxsX2Q1X2Qy IiwNCisJIm1haW5wbGxfZDZfZDIiLA0KKwkib3NjX2Q0Ig0KK307DQorDQorc3RhdGljIGNvbnN0 IGNoYXIgKiBjb25zdCBzcG1fcGFyZW50c1tdID0gew0KKwkiY2xrMjZtIiwNCisJIm9zY19kMTAi LA0KKwkibWFpbnBsbF9kN19kNCIsDQorCSJjbGszMmsiDQorfTsNCisNCitzdGF0aWMgY29uc3Qg Y2hhciAqIGNvbnN0IHNjcF9wYXJlbnRzW10gPSB7DQorCSJjbGsyNm0iLA0KKwkidW5pdnBsbF9k NSIsDQorCSJtYWlucGxsX2Q2X2QyIiwNCisJIm1haW5wbGxfZDYiLA0KKwkidW5pdnBsbF9kNiIs DQorCSJtYWlucGxsX2Q0X2QyIiwNCisJIm1haW5wbGxfZDVfZDIiLA0KKwkidW5pdnBsbF9kNF9k MiINCit9Ow0KKw0KK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYnVzX2F4aW1lbV9wYXJlbnRz W10gPSB7DQorCSJjbGsyNm0iLA0KKwkibWFpbnBsbF9kN19kMiIsDQorCSJtYWlucGxsX2Q0X2Qy IiwNCisJIm1haW5wbGxfZDVfZDIiLA0KKwkibWFpbnBsbF9kNiINCit9Ow0KKw0KK3N0YXRpYyBj b25zdCBjaGFyICogY29uc3QgZGlzcF9wYXJlbnRzW10gPSB7DQorCSJjbGsyNm0iLA0KKwkidW5p dnBsbF9kNl9kMiIsDQorCSJtYWlucGxsX2Q1X2QyIiwNCisJIm1tcGxsX2Q2X2QyIiwNCisJInVu aXZwbGxfZDVfZDIiLA0KKwkidW5pdnBsbF9kNF9kMiIsDQorCSJtbXBsbF9kNyIsDQorCSJ1bml2 cGxsX2Q2IiwNCisJIm1haW5wbGxfZDQiLA0KKwkibW1wbGxfZDVfZDIiDQorfTsNCisNCitzdGF0 aWMgY29uc3QgY2hhciAqIGNvbnN0IG1kcF9wYXJlbnRzW10gPSB7DQorCSJjbGsyNm0iLA0KKwki bWFpbnBsbF9kNV9kMiIsDQorCSJtbXBsbF9kNl9kMiIsDQorCSJtYWlucGxsX2Q0X2QyIiwNCisJ Im1tcGxsX2Q0X2QyIiwNCisJIm1haW5wbGxfZDYiLA0KKwkidW5pdnBsbF9kNiIsDQorCSJtYWlu cGxsX2Q0IiwNCisJInR2ZHBsbF9jayIsDQorCSJ1bml2cGxsX2Q0IiwNCisJIm1tcGxsX2Q1X2Qy Ig0KK307DQorDQorc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpbWcxX3BhcmVudHNbXSA9IHsN CisJImNsazI2bSIsDQorCSJ1bml2cGxsX2Q0IiwNCisJInR2ZHBsbF9jayIsDQorCSJtYWlucGxs X2Q0IiwNCisJInVuaXZwbGxfZDUiLA0KKwkibW1wbGxfZDYiLA0KKwkidW5pdnBsbF9kNiIsDQor CSJtYWlucGxsX2Q2IiwNCisJIm1tcGxsX2Q0X2QyIiwNCisJIm1haW5wbGxfZDRfZDIiLA0KKwki bW1wbGxfZDZfZDIiLA0KKwkibW1wbGxfZDVfZDIiDQorfTsNCisNCitzdGF0aWMgY29uc3QgY2hh ciAqIGNvbnN0IGltZzJfcGFyZW50c1tdID0gew0KKwkiY2xrMjZtIiwNCisJInVuaXZwbGxfZDQi LA0KKwkidHZkcGxsX2NrIiwNCisJIm1haW5wbGxfZDQiLA0KKwkidW5pdnBsbF9kNSIsDQorCSJt bXBsbF9kNiIsDQorCSJ1bml2cGxsX2Q2IiwNCisJIm1haW5wbGxfZDYiLA0KKwkibW1wbGxfZDRf ZDIiLA0KKwkibWFpbnBsbF9kNF9kMiIsDQorCSJtbXBsbF9kNl9kMiIsDQorCSJtbXBsbF9kNV9k MiINCit9Ow0KKw0KK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaXBlX3BhcmVudHNbXSA9IHsN CisJImNsazI2bSIsDQorCSJtYWlucGxsX2Q0IiwNCisJIm1tcGxsX2Q2IiwNCisJInVuaXZwbGxf ZDYiLA0KKwkibWFpbnBsbF9kNiIsDQorCSJ1bml2cGxsX2Q0X2QyIiwNCisJIm1haW5wbGxfZDRf ZDIiLA0KKwkibW1wbGxfZDZfZDIiLA0KKwkibW1wbGxfZDVfZDIiDQorfTsNCisNCitzdGF0aWMg Y29uc3QgY2hhciAqIGNvbnN0IGRwZV9wYXJlbnRzW10gPSB7DQorCSJjbGsyNm0iLA0KKwkibWFp bnBsbF9kNCIsDQorCSJtbXBsbF9kNiIsDQorCSJ1bml2cGxsX2Q2IiwNCisJIm1haW5wbGxfZDYi LA0KKwkidW5pdnBsbF9kNF9kMiIsDQorCSJ1bml2cGxsX2Q1X2QyIiwNCisJIm1tcGxsX2Q2X2Qy Ig0KK307DQorDQorc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjYW1fcGFyZW50c1tdID0gew0K KwkiY2xrMjZtIiwNCisJIm1haW5wbGxfZDQiLA0KKwkibW1wbGxfZDYiLA0KKwkidW5pdnBsbF9k NCIsDQorCSJ1bml2cGxsX2Q1IiwNCisJInVuaXZwbGxfZDYiLA0KKwkibW1wbGxfZDciLA0KKwki dW5pdnBsbF9kNF9kMiIsDQorCSJtYWlucGxsX2Q0X2QyIiwNCisJInVuaXZwbGxfZDZfZDIiDQor fTsNCisNCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNjdV9wYXJlbnRzW10gPSB7DQorCSJj bGsyNm0iLA0KKwkibWFpbnBsbF9kNCIsDQorCSJtbXBsbF9kNiIsDQorCSJtYWlucGxsX2Q2IiwN CisJIm1tcGxsX2Q3IiwNCisJInVuaXZwbGxfZDRfZDIiLA0KKwkibW1wbGxfZDZfZDIiLA0KKwki bW1wbGxfZDVfZDIiLA0KKwkidW5pdnBsbF9kNSIsDQorCSJ1bml2cGxsX2Q2X2QyIg0KK307DQor DQorc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkc3A3X3BhcmVudHNbXSA9IHsNCisJImNsazI2 bSIsDQorCSJtYWlucGxsX2Q0X2QyIiwNCisJIm1haW5wbGxfZDYiLA0KKwkibW1wbGxfZDYiLA0K KwkidW5pdnBsbF9kNSIsDQorCSJtbXBsbF9kNSIsDQorCSJ1bml2cGxsX2Q0IiwNCisJIm1tcGxs X2Q0Ig0KK307DQorDQorc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtZmdfcmVmX3BhcmVudHNb XSA9IHsNCisJImNsazI2bSIsDQorCSJjbGsyNm0iLA0KKwkidW5pdnBsbF9kNiIsDQorCSJtYWlu cGxsX2Q1X2QyIg0KK307DQorDQorc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtZmdfcGxsX3Bh cmVudHNbXSA9IHsNCisJIm1mZ19yZWZfc2VsIiwNCisJIm1mZ3BsbCINCit9Ow0KKw0KK3N0YXRp YyBjb25zdCBjaGFyICogY29uc3QgY2FtdGdfcGFyZW50c1tdID0gew0KKwkiY2xrMjZtIiwNCisJ InVuaXZwbGxfMTkybV9kOCIsDQorCSJ1bml2cGxsX2Q2X2Q4IiwNCisJInVuaXZwbGxfMTkybV9k NCIsDQorCSJ1bml2cGxsX2Q2X2QxNiIsDQorCSJjc3dfZjI2bV9kMiIsDQorCSJ1bml2cGxsXzE5 Mm1fZDE2IiwNCisJInVuaXZwbGxfMTkybV9kMzIiDQorfTsNCisNCitzdGF0aWMgY29uc3QgY2hh ciAqIGNvbnN0IGNhbXRnMl9wYXJlbnRzW10gPSB7DQorCSJjbGsyNm0iLA0KKwkidW5pdnBsbF8x OTJtX2Q4IiwNCisJInVuaXZwbGxfZDZfZDgiLA0KKwkidW5pdnBsbF8xOTJtX2Q0IiwNCisJInVu aXZwbGxfZDZfZDE2IiwNCisJImNzd19mMjZtX2QyIiwNCisJInVuaXZwbGxfMTkybV9kMTYiLA0K KwkidW5pdnBsbF8xOTJtX2QzMiINCit9Ow0KKw0KK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qg Y2FtdGczX3BhcmVudHNbXSA9IHsNCisJImNsazI2bSIsDQorCSJ1bml2cGxsXzE5Mm1fZDgiLA0K KwkidW5pdnBsbF9kNl9kOCIsDQorCSJ1bml2cGxsXzE5Mm1fZDQiLA0KKwkidW5pdnBsbF9kNl9k MTYiLA0KKwkiY3N3X2YyNm1fZDIiLA0KKwkidW5pdnBsbF8xOTJtX2QxNiIsDQorCSJ1bml2cGxs XzE5Mm1fZDMyIg0KK307DQorDQorc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjYW10ZzRfcGFy ZW50c1tdID0gew0KKwkiY2xrMjZtIiwNCisJInVuaXZwbGxfMTkybV9kOCIsDQorCSJ1bml2cGxs X2Q2X2Q4IiwNCisJInVuaXZwbGxfMTkybV9kNCIsDQorCSJ1bml2cGxsX2Q2X2QxNiIsDQorCSJj c3dfZjI2bV9kMiIsDQorCSJ1bml2cGxsXzE5Mm1fZDE2IiwNCisJInVuaXZwbGxfMTkybV9kMzIi DQorfTsNCisNCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNhbXRnNV9wYXJlbnRzW10gPSB7 DQorCSJjbGsyNm0iLA0KKwkidW5pdnBsbF8xOTJtX2Q4IiwNCisJInVuaXZwbGxfZDZfZDgiLA0K KwkidW5pdnBsbF8xOTJtX2Q0IiwNCisJInVuaXZwbGxfZDZfZDE2IiwNCisJImNzd19mMjZtX2Qy IiwNCisJInVuaXZwbGxfMTkybV9kMTYiLA0KKwkidW5pdnBsbF8xOTJtX2QzMiINCit9Ow0KKw0K K3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY2FtdGc2X3BhcmVudHNbXSA9IHsNCisJImNsazI2 bSIsDQorCSJ1bml2cGxsXzE5Mm1fZDgiLA0KKwkidW5pdnBsbF9kNl9kOCIsDQorCSJ1bml2cGxs XzE5Mm1fZDQiLA0KKwkidW5pdnBsbF9kNl9kMTYiLA0KKwkiY3N3X2YyNm1fZDIiLA0KKwkidW5p dnBsbF8xOTJtX2QxNiIsDQorCSJ1bml2cGxsXzE5Mm1fZDMyIg0KK307DQorDQorc3RhdGljIGNv bnN0IGNoYXIgKiBjb25zdCB1YXJ0X3BhcmVudHNbXSA9IHsNCisJImNsazI2bSIsDQorCSJ1bml2 cGxsX2Q2X2Q4Ig0KK307DQorDQorc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzcGlfcGFyZW50 c1tdID0gew0KKwkiY2xrMjZtIiwNCisJIm1haW5wbGxfZDVfZDQiLA0KKwkibWFpbnBsbF9kNl9k NCIsDQorCSJtc2RjcGxsX2Q0Ig0KK307DQorDQorc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBt c2RjNTBfMF9oX3BhcmVudHNbXSA9IHsNCisJImNsazI2bSIsDQorCSJtYWlucGxsX2Q0X2QyIiwN CisJIm1haW5wbGxfZDZfZDIiDQorfTsNCisNCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1z ZGM1MF8wX3BhcmVudHNbXSA9IHsNCisJImNsazI2bSIsDQorCSJtc2RjcGxsX2NrIiwNCisJIm1z ZGNwbGxfZDIiLA0KKwkidW5pdnBsbF9kNF9kNCIsDQorCSJtYWlucGxsX2Q2X2QyIiwNCisJInVu aXZwbGxfZDRfZDIiDQorfTsNCisNCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1zZGMzMF8x X3BhcmVudHNbXSA9IHsNCisJImNsazI2bSIsDQorCSJ1bml2cGxsX2Q2X2QyIiwNCisJIm1haW5w bGxfZDZfZDIiLA0KKwkibWFpbnBsbF9kN19kMiIsDQorCSJtc2RjcGxsX2QyIg0KK307DQorDQor c3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtc2RjMzBfMl9wYXJlbnRzW10gPSB7DQorCSJjbGsy Nm0iLA0KKwkidW5pdnBsbF9kNl9kMiIsDQorCSJtYWlucGxsX2Q2X2QyIiwNCisJIm1haW5wbGxf ZDdfZDIiLA0KKwkibXNkY3BsbF9kMiINCit9Ow0KKw0KK3N0YXRpYyBjb25zdCBjaGFyICogY29u c3QgYXVkaW9fcGFyZW50c1tdID0gew0KKwkiY2xrMjZtIiwNCisJIm1haW5wbGxfZDVfZDgiLA0K KwkibWFpbnBsbF9kN19kOCIsDQorCSJtYWlucGxsX2Q0X2QxNiINCit9Ow0KKw0KK3N0YXRpYyBj b25zdCBjaGFyICogY29uc3QgYXVkX2ludGJ1c19wYXJlbnRzW10gPSB7DQorCSJjbGsyNm0iLA0K KwkibWFpbnBsbF9kNF9kNCIsDQorCSJtYWlucGxsX2Q3X2Q0Ig0KK307DQorDQorc3RhdGljIGNv bnN0IGNoYXIgKiBjb25zdCBwd3JhcF91bHBvc2NfcGFyZW50c1tdID0gew0KKwkib3NjX2QxMCIs DQorCSJjbGsyNm0iLA0KKwkib3NjX2Q0IiwNCisJIm9zY19kOCIsDQorCSJvc2NfZDE2Ig0KK307 DQorDQorc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhdGJfcGFyZW50c1tdID0gew0KKwkiY2xr MjZtIiwNCisJIm1haW5wbGxfZDRfZDIiLA0KKwkibWFpbnBsbF9kNV9kMiINCit9Ow0KKw0KK3N0 YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3NwbV9wYXJlbnRzW10gPSB7DQorCSJjbGsyNm0iLA0K KwkibWFpbnBsbF9kNV9kMiIsDQorCSJ1bml2cGxsX2Q1X2QyIiwNCisJIm1haW5wbGxfZDRfZDIi LA0KKwkidW5pdnBsbF9kNF9kMiIsDQorCSJtYWlucGxsX2Q2Ig0KK307DQorDQorc3RhdGljIGNv bnN0IGNoYXIgKiBjb25zdCBkcGlfcGFyZW50c1tdID0gew0KKwkiY2xrMjZtIiwNCisJInR2ZHBs bF9kMiIsDQorCSJ0dmRwbGxfZDQiLA0KKwkidHZkcGxsX2Q4IiwNCisJInR2ZHBsbF9kMTYiDQor fTsNCisNCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNjYW1fcGFyZW50c1tdID0gew0KKwki Y2xrMjZtIiwNCisJIm1haW5wbGxfZDVfZDQiDQorfTsNCisNCitzdGF0aWMgY29uc3QgY2hhciAq IGNvbnN0IGRpc3BfcHdtX3BhcmVudHNbXSA9IHsNCisJImNsazI2bSIsDQorCSJ1bml2cGxsX2Q2 X2Q0IiwNCisJIm9zY19kMiIsDQorCSJvc2NfZDQiLA0KKwkib3NjX2QxNiINCit9Ow0KKw0KK3N0 YXRpYyBjb25zdCBjaGFyICogY29uc3QgdXNiX3RvcF9wYXJlbnRzW10gPSB7DQorCSJjbGsyNm0i LA0KKwkidW5pdnBsbF9kNV9kNCIsDQorCSJ1bml2cGxsX2Q2X2Q0IiwNCisJInVuaXZwbGxfZDVf ZDIiDQorfTsNCisNCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNzdXNiX3hoY2lfcGFyZW50 c1tdID0gew0KKwkiY2xrMjZtIiwNCisJInVuaXZwbGxfZDVfZDQiLA0KKwkidW5pdnBsbF9kNl9k NCIsDQorCSJ1bml2cGxsX2Q1X2QyIg0KK307DQorDQorc3RhdGljIGNvbnN0IGNoYXIgKiBjb25z dCBpMmNfcGFyZW50c1tdID0gew0KKwkiY2xrMjZtIiwNCisJIm1haW5wbGxfZDRfZDgiLA0KKwki dW5pdnBsbF9kNV9kNCINCit9Ow0KKw0KK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2VuaW5m X3BhcmVudHNbXSA9IHsNCisJImNsazI2bSIsDQorCSJ1bml2cGxsX2Q0X2Q0IiwNCisJInVuaXZw bGxfZDZfZDIiLA0KKwkidW5pdnBsbF9kNF9kMiIsDQorCSJ1bml2cGxsX2Q3IiwNCisJInVuaXZw bGxfZDYiLA0KKwkibW1wbGxfZDYiLA0KKwkidW5pdnBsbF9kNSINCit9Ow0KKw0KK3N0YXRpYyBj b25zdCBjaGFyICogY29uc3Qgc2VuaW5mMV9wYXJlbnRzW10gPSB7DQorCSJjbGsyNm0iLA0KKwki dW5pdnBsbF9kNF9kNCIsDQorCSJ1bml2cGxsX2Q2X2QyIiwNCisJInVuaXZwbGxfZDRfZDIiLA0K KwkidW5pdnBsbF9kNyIsDQorCSJ1bml2cGxsX2Q2IiwNCisJIm1tcGxsX2Q2IiwNCisJInVuaXZw bGxfZDUiDQorfTsNCisNCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNlbmluZjJfcGFyZW50 c1tdID0gew0KKwkiY2xrMjZtIiwNCisJInVuaXZwbGxfZDRfZDQiLA0KKwkidW5pdnBsbF9kNl9k MiIsDQorCSJ1bml2cGxsX2Q0X2QyIiwNCisJInVuaXZwbGxfZDciLA0KKwkidW5pdnBsbF9kNiIs DQorCSJtbXBsbF9kNiIsDQorCSJ1bml2cGxsX2Q1Ig0KK307DQorDQorc3RhdGljIGNvbnN0IGNo YXIgKiBjb25zdCBzZW5pbmYzX3BhcmVudHNbXSA9IHsNCisJImNsazI2bSIsDQorCSJ1bml2cGxs X2Q0X2Q0IiwNCisJInVuaXZwbGxfZDZfZDIiLA0KKwkidW5pdnBsbF9kNF9kMiIsDQorCSJ1bml2 cGxsX2Q3IiwNCisJInVuaXZwbGxfZDYiLA0KKwkibW1wbGxfZDYiLA0KKwkidW5pdnBsbF9kNSIN Cit9Ow0KKw0KK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdGxfcGFyZW50c1tdID0gew0KKwki Y2xrMjZtIiwNCisJInVuaXZwbGxfMTkybV9kMiIsDQorCSJtYWlucGxsX2Q2X2Q0Ig0KK307DQor DQorc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkeGNjX3BhcmVudHNbXSA9IHsNCisJImNsazI2 bSIsDQorCSJtYWlucGxsX2Q0X2QyIiwNCisJIm1haW5wbGxfZDRfZDQiLA0KKwkibWFpbnBsbF9k NF9kOCINCit9Ow0KKw0KK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYXVkX2VuZ2VuMV9wYXJl bnRzW10gPSB7DQorCSJjbGsyNm0iLA0KKwkiYXBsbDFfZDIiLA0KKwkiYXBsbDFfZDQiLA0KKwki YXBsbDFfZDgiDQorfTsNCisNCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGF1ZF9lbmdlbjJf cGFyZW50c1tdID0gew0KKwkiY2xrMjZtIiwNCisJImFwbGwyX2QyIiwNCisJImFwbGwyX2Q0IiwN CisJImFwbGwyX2Q4Ig0KK307DQorDQorc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhZXNfdWZz ZmRlX3BhcmVudHNbXSA9IHsNCisJImNsazI2bSIsDQorCSJtYWlucGxsX2Q0IiwNCisJIm1haW5w bGxfZDRfZDIiLA0KKwkibWFpbnBsbF9kNiIsDQorCSJtYWlucGxsX2Q0X2Q0IiwNCisJInVuaXZw bGxfZDRfZDIiLA0KKwkidW5pdnBsbF9kNiINCit9Ow0KKw0KK3N0YXRpYyBjb25zdCBjaGFyICog Y29uc3QgdWZzX3BhcmVudHNbXSA9IHsNCisJImNsazI2bSIsDQorCSJtYWlucGxsX2Q0X2Q0IiwN CisJIm1haW5wbGxfZDRfZDgiLA0KKwkidW5pdnBsbF9kNF9kNCIsDQorCSJtYWlucGxsX2Q2X2Qy IiwNCisJIm1haW5wbGxfZDVfZDIiLA0KKwkibXNkY3BsbF9kMiINCit9Ow0KKw0KK3N0YXRpYyBj b25zdCBjaGFyICogY29uc3QgYXVkXzFfcGFyZW50c1tdID0gew0KKwkiY2xrMjZtIiwNCisJImFw bGwxX2NrIg0KK307DQorDQorc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhdWRfMl9wYXJlbnRz W10gPSB7DQorCSJjbGsyNm0iLA0KKwkiYXBsbDJfY2siDQorfTsNCisNCitzdGF0aWMgY29uc3Qg Y2hhciAqIGNvbnN0IGFkc3BfcGFyZW50c1tdID0gew0KKwkiY2xrMjZtIiwNCisJIm1haW5wbGxf ZDYiLA0KKwkibWFpbnBsbF9kNV9kMiIsDQorCSJ1bml2cGxsX2Q0X2Q0IiwNCisJInVuaXZwbGxf ZDQiLA0KKwkidW5pdnBsbF9kNiIsDQorCSJ1bHBvc2MiLA0KKwkiYWRzcHBsbF9jayINCit9Ow0K Kw0KK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZHBtYWlmX21haW5fcGFyZW50c1tdID0gew0K KwkiY2xrMjZtIiwNCisJInVuaXZwbGxfZDRfZDQiLA0KKwkibWFpbnBsbF9kNiIsDQorCSJtYWlu cGxsX2Q0X2QyIiwNCisJInVuaXZwbGxfZDRfZDIiDQorfTsNCisNCitzdGF0aWMgY29uc3QgY2hh ciAqIGNvbnN0IHZlbmNfcGFyZW50c1tdID0gew0KKwkiY2xrMjZtIiwNCisJIm1tcGxsX2Q3IiwN CisJIm1haW5wbGxfZDYiLA0KKwkidW5pdnBsbF9kNF9kMiIsDQorCSJtYWlucGxsX2Q0X2QyIiwN CisJInVuaXZwbGxfZDYiLA0KKwkibW1wbGxfZDYiLA0KKwkibWFpbnBsbF9kNV9kMiIsDQorCSJt YWlucGxsX2Q2X2QyIiwNCisJIm1tcGxsX2Q5IiwNCisJInVuaXZwbGxfZDRfZDQiLA0KKwkibWFp bnBsbF9kNCIsDQorCSJ1bml2cGxsX2Q0IiwNCisJInVuaXZwbGxfZDUiLA0KKwkidW5pdnBsbF9k NV9kMiIsDQorCSJtYWlucGxsX2Q1Ig0KK307DQorDQorc3RhdGljIGNvbnN0IGNoYXIgKiBjb25z dCB2ZGVjX3BhcmVudHNbXSA9IHsNCisJImNsazI2bSIsDQorCSJ1bml2cGxsXzE5Mm1fZDIiLA0K KwkidW5pdnBsbF9kNV9kNCIsDQorCSJtYWlucGxsX2Q1IiwNCisJIm1haW5wbGxfZDVfZDIiLA0K KwkibW1wbGxfZDZfZDIiLA0KKwkidW5pdnBsbF9kNV9kMiIsDQorCSJtYWlucGxsX2Q0X2QyIiwN CisJInVuaXZwbGxfZDRfZDIiLA0KKwkidW5pdnBsbF9kNyIsDQorCSJtbXBsbF9kNyIsDQorCSJt bXBsbF9kNiIsDQorCSJ1bml2cGxsX2Q1IiwNCisJIm1haW5wbGxfZDQiLA0KKwkidW5pdnBsbF9k NCIsDQorCSJ1bml2cGxsX2Q2Ig0KK307DQorDQorc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBj YW10bV9wYXJlbnRzW10gPSB7DQorCSJjbGsyNm0iLA0KKwkidW5pdnBsbF9kNyIsDQorCSJ1bml2 cGxsX2Q2X2QyIiwNCisJInVuaXZwbGxfZDRfZDIiDQorfTsNCisNCitzdGF0aWMgY29uc3QgY2hh ciAqIGNvbnN0IHB3bV9wYXJlbnRzW10gPSB7DQorCSJjbGsyNm0iLA0KKwkidW5pdnBsbF9kNF9k OCINCit9Ow0KKw0KK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYXVkaW9faF9wYXJlbnRzW10g PSB7DQorCSJjbGsyNm0iLA0KKwkidW5pdnBsbF9kNyIsDQorCSJhcGxsMV9jayIsDQorCSJhcGxs Ml9jayINCit9Ow0KKw0KK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3BtaV9tc3RfcGFyZW50 c1tdID0gew0KKwkiY2xrMjZtIiwNCisJImNzd19mMjZtX2QyIiwNCisJIm9zY19kOCIsDQorCSJv c2NfZDEwIiwNCisJIm9zY19kMTYiLA0KKwkib3NjX2QyMCIsDQorCSJjbGszMmsiDQorfTsNCisN CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFlc19tc2RjZmRlX3BhcmVudHNbXSA9IHsNCisJ ImNsazI2bSIsDQorCSJtYWlucGxsX2Q0X2QyIiwNCisJIm1haW5wbGxfZDYiLA0KKwkibWFpbnBs bF9kNF9kNCIsDQorCSJ1bml2cGxsX2Q0X2QyIiwNCisJInVuaXZwbGxfZDYiDQorfTsNCisNCitz dGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1jdXBtX3BhcmVudHNbXSA9IHsNCisJImNsazI2bSIs DQorCSJtYWlucGxsX2Q2X2Q0IiwNCisJIm1haW5wbGxfZDZfZDIiDQorfTsNCisNCitzdGF0aWMg Y29uc3QgY2hhciAqIGNvbnN0IHNmbGFzaF9wYXJlbnRzW10gPSB7DQorCSJjbGsyNm0iLA0KKwki bWFpbnBsbF9kN19kOCIsDQorCSJ1bml2cGxsX2Q2X2Q4IiwNCisJInVuaXZwbGxfZDVfZDgiDQor fTsNCisNCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFwbGxfaTJzMF9tX3BhcmVudHNbXSA9 IHsNCisJImF1ZF8xX3NlbCIsDQorCSJhdWRfMl9zZWwiDQorfTsNCisNCitzdGF0aWMgY29uc3Qg Y2hhciAqIGNvbnN0IGFwbGxfaTJzMV9tX3BhcmVudHNbXSA9IHsNCisJImF1ZF8xX3NlbCIsDQor CSJhdWRfMl9zZWwiDQorfTsNCisNCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFwbGxfaTJz Ml9tX3BhcmVudHNbXSA9IHsNCisJImF1ZF8xX3NlbCIsDQorCSJhdWRfMl9zZWwiDQorfTsNCisN CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFwbGxfaTJzM19tX3BhcmVudHNbXSA9IHsNCisJ ImF1ZF8xX3NlbCIsDQorCSJhdWRfMl9zZWwiDQorfTsNCisNCitzdGF0aWMgY29uc3QgY2hhciAq IGNvbnN0IGFwbGxfaTJzNF9tX3BhcmVudHNbXSA9IHsNCisJImF1ZF8xX3NlbCIsDQorCSJhdWRf Ml9zZWwiDQorfTsNCisNCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFwbGxfaTJzNV9tX3Bh cmVudHNbXSA9IHsNCisJImF1ZF8xX3NlbCIsDQorCSJhdWRfMl9zZWwiDQorfTsNCisNCitzdGF0 aWMgY29uc3QgY2hhciAqIGNvbnN0IGFwbGxfaTJzNl9tX3BhcmVudHNbXSA9IHsNCisJImF1ZF8x X3NlbCIsDQorCSJhdWRfMl9zZWwiDQorfTsNCisNCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0 IGFwbGxfaTJzN19tX3BhcmVudHNbXSA9IHsNCisJImF1ZF8xX3NlbCIsDQorCSJhdWRfMl9zZWwi DQorfTsNCisNCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFwbGxfaTJzOF9tX3BhcmVudHNb XSA9IHsNCisJImF1ZF8xX3NlbCIsDQorCSJhdWRfMl9zZWwiDQorfTsNCisNCitzdGF0aWMgY29u c3QgY2hhciAqIGNvbnN0IGFwbGxfaTJzOV9tX3BhcmVudHNbXSA9IHsNCisJImF1ZF8xX3NlbCIs DQorCSJhdWRfMl9zZWwiDQorfTsNCisNCisvKg0KKyAqIENSSVRJQ0FMIENMT0NLOg0KKyAqIGF4 aV9zZWwgaXMgdGhlIG1haW4gYnVzIGNsb2NrIG9mIHdob2xlIFNPQy4NCisgKiBzcG1fc2VsIGlz IHRoZSBjbG9jayBvZiB0aGUgYWx3YXlzLW9uIGNvLXByb2Nlc3Nvci4NCisgKiBidXNfYXhpbWVt X3NlbCBpcyBjbG9jayBvZiB0aGUgYnVzIHRoYXQgYWNjZXNzIGVtaS4NCisgKi8NCitzdGF0aWMg Y29uc3Qgc3RydWN0IG10a19tdXggdG9wX210a19tdXhlc1tdID0gew0KKwkvKiBDTEtfQ0ZHXzAg Ki8NCisJTVVYX0dBVEVfQ0xSX1NFVF9VUERfRkxBR1MoQ0xLX1RPUF9BWElfU0VMLCAiYXhpX3Nl bCIsDQorCQlheGlfcGFyZW50cywgMHgwMTAsIDB4MDE0LCAweDAxOCwgMCwgMywgNywgMHgwMDQs IDAsDQorCQlDTEtfSVNfQ1JJVElDQUwpLA0KKwlNVVhfR0FURV9DTFJfU0VUX1VQRF9GTEFHUyhD TEtfVE9QX1NQTV9TRUwsICJzcG1fc2VsIiwNCisJCXNwbV9wYXJlbnRzLCAweDAxMCwgMHgwMTQs IDB4MDE4LCA4LCAyLCAxNSwgMHgwMDQsIDEsDQorCQlDTEtfSVNfQ1JJVElDQUwpLA0KKwlNVVhf R0FURV9DTFJfU0VUX1VQRChDTEtfVE9QX1NDUF9TRUwsICJzY3Bfc2VsIiwNCisJCXNjcF9wYXJl bnRzLCAweDAxMCwgMHgwMTQsIDB4MDE4LCAxNiwgMywgMjMsIDB4MDA0LCAyKSwNCisJTVVYX0dB VEVfQ0xSX1NFVF9VUERfRkxBR1MoQ0xLX1RPUF9CVVNfQVhJTUVNX1NFTCwgImJ1c19heGltZW1f c2VsIiwNCisJCWJ1c19heGltZW1fcGFyZW50cywgMHgwMTAsIDB4MDE0LCAweDAxOCwgMjQsIDMs IDMxLCAweDAwNCwgMywNCisJCUNMS19JU19DUklUSUNBTCksDQorCS8qIENMS19DRkdfMSAqLw0K KwlNVVhfR0FURV9DTFJfU0VUX1VQRChDTEtfVE9QX0RJU1BfU0VMLCAiZGlzcF9zZWwiLA0KKwkJ ZGlzcF9wYXJlbnRzLCAweDAyMCwgMHgwMjQsIDB4MDI4LCAwLCA0LCA3LCAweDAwNCwgNCksDQor CU1VWF9HQVRFX0NMUl9TRVRfVVBEKENMS19UT1BfTURQX1NFTCwgIm1kcF9zZWwiLA0KKwkJbWRw X3BhcmVudHMsIDB4MDIwLCAweDAyNCwgMHgwMjgsIDgsIDQsIDE1LCAweDAwNCwgNSksDQorCU1V WF9HQVRFX0NMUl9TRVRfVVBEKENMS19UT1BfSU1HMV9TRUwsICJpbWcxX3NlbCIsDQorCQlpbWcx X3BhcmVudHMsIDB4MDIwLCAweDAyNCwgMHgwMjgsIDE2LCA0LCAyMywgMHgwMDQsIDYpLA0KKwlN VVhfR0FURV9DTFJfU0VUX1VQRChDTEtfVE9QX0lNRzJfU0VMLCAiaW1nMl9zZWwiLA0KKwkJaW1n Ml9wYXJlbnRzLCAweDAyMCwgMHgwMjQsIDB4MDI4LCAyNCwgNCwgMzEsIDB4MDA0LCA3KSwNCisJ LyogQ0xLX0NGR18yICovDQorCU1VWF9HQVRFX0NMUl9TRVRfVVBEKENMS19UT1BfSVBFX1NFTCwg ImlwZV9zZWwiLA0KKwkJaXBlX3BhcmVudHMsIDB4MDMwLCAweDAzNCwgMHgwMzgsIDAsIDQsIDcs IDB4MDA0LCA4KSwNCisJTVVYX0dBVEVfQ0xSX1NFVF9VUEQoQ0xLX1RPUF9EUEVfU0VMLCAiZHBl X3NlbCIsDQorCQlkcGVfcGFyZW50cywgMHgwMzAsIDB4MDM0LCAweDAzOCwgOCwgMywgMTUsIDB4 MDA0LCA5KSwNCisJTVVYX0dBVEVfQ0xSX1NFVF9VUEQoQ0xLX1RPUF9DQU1fU0VMLCAiY2FtX3Nl bCIsDQorCQljYW1fcGFyZW50cywgMHgwMzAsIDB4MDM0LCAweDAzOCwgMTYsIDQsIDIzLCAweDAw NCwgMTApLA0KKwlNVVhfR0FURV9DTFJfU0VUX1VQRChDTEtfVE9QX0NDVV9TRUwsICJjY3Vfc2Vs IiwNCisJCWNjdV9wYXJlbnRzLCAweDAzMCwgMHgwMzQsIDB4MDM4LCAyNCwgNCwgMzEsIDB4MDA0 LCAxMSksDQorCS8qIENMS19DRkdfNCAqLw0KKwlNVVhfR0FURV9DTFJfU0VUX1VQRChDTEtfVE9Q X0RTUDdfU0VMLCAiZHNwN19zZWwiLA0KKwkJZHNwN19wYXJlbnRzLCAweDA1MCwgMHgwNTQsIDB4 MDU4LCAwLCAzLCA3LCAweDAwNCwgMTYpLA0KKwlNVVhfR0FURV9DTFJfU0VUX1VQRChDTEtfVE9Q X01GR19SRUZfU0VMLCAibWZnX3JlZl9zZWwiLA0KKwkJbWZnX3JlZl9wYXJlbnRzLCAweDA1MCwg MHgwNTQsIDB4MDU4LCAxNiwgMiwgMjMsIDB4MDA0LCAxOCksDQorCU1VWF9DTFJfU0VUX1VQRChD TEtfVE9QX01GR19QTExfU0VMLCAibWZnX3BsbF9zZWwiLA0KKwkJbWZnX3BsbF9wYXJlbnRzLCAw eDA1MCwgMHgwNTQsIDB4MDU4LCAxOCwgMSwgLTEsIC0xKSwNCisJTVVYX0dBVEVfQ0xSX1NFVF9V UEQoQ0xLX1RPUF9DQU1UR19TRUwsICJjYW10Z19zZWwiLA0KKwkJY2FtdGdfcGFyZW50cywgMHgw NTAsIDB4MDU0LCAweDA1OCwgMjQsIDMsIDMxLCAweDAwNCwgMTkpLA0KKwkvKiBDTEtfQ0ZHXzUg Ki8NCisJTVVYX0dBVEVfQ0xSX1NFVF9VUEQoQ0xLX1RPUF9DQU1URzJfU0VMLCAiY2FtdGcyX3Nl bCIsDQorCQljYW10ZzJfcGFyZW50cywgMHgwNjAsIDB4MDY0LCAweDA2OCwgMCwgMywgNywgMHgw MDQsIDIwKSwNCisJTVVYX0dBVEVfQ0xSX1NFVF9VUEQoQ0xLX1RPUF9DQU1URzNfU0VMLCAiY2Ft dGczX3NlbCIsDQorCQljYW10ZzNfcGFyZW50cywgMHgwNjAsIDB4MDY0LCAweDA2OCwgOCwgMywg MTUsIDB4MDA0LCAyMSksDQorCU1VWF9HQVRFX0NMUl9TRVRfVVBEKENMS19UT1BfQ0FNVEc0X1NF TCwgImNhbXRnNF9zZWwiLA0KKwkJY2FtdGc0X3BhcmVudHMsIDB4MDYwLCAweDA2NCwgMHgwNjgs IDE2LCAzLCAyMywgMHgwMDQsIDIyKSwNCisJTVVYX0dBVEVfQ0xSX1NFVF9VUEQoQ0xLX1RPUF9D QU1URzVfU0VMLCAiY2FtdGc1X3NlbCIsDQorCQljYW10ZzVfcGFyZW50cywgMHgwNjAsIDB4MDY0 LCAweDA2OCwgMjQsIDMsIDMxLCAweDAwNCwgMjMpLA0KKwkvKiBDTEtfQ0ZHXzYgKi8NCisJTVVY X0dBVEVfQ0xSX1NFVF9VUEQoQ0xLX1RPUF9DQU1URzZfU0VMLCAiY2FtdGc2X3NlbCIsDQorCQlj YW10ZzZfcGFyZW50cywgMHgwNzAsIDB4MDc0LCAweDA3OCwgMCwgMywgNywgMHgwMDQsIDI0KSwN CisJTVVYX0dBVEVfQ0xSX1NFVF9VUEQoQ0xLX1RPUF9VQVJUX1NFTCwgInVhcnRfc2VsIiwNCisJ CXVhcnRfcGFyZW50cywgMHgwNzAsIDB4MDc0LCAweDA3OCwgOCwgMSwgMTUsIDB4MDA0LCAyNSks DQorCU1VWF9HQVRFX0NMUl9TRVRfVVBEKENMS19UT1BfU1BJX1NFTCwgInNwaV9zZWwiLA0KKwkJ c3BpX3BhcmVudHMsIDB4MDcwLCAweDA3NCwgMHgwNzgsIDE2LCAyLCAyMywgMHgwMDQsIDI2KSwN CisJTVVYX0dBVEVfQ0xSX1NFVF9VUEQoQ0xLX1RPUF9NU0RDNTBfMF9IX1NFTCwgIm1zZGM1MF8w X2hfc2VsIiwNCisJCW1zZGM1MF8wX2hfcGFyZW50cywgMHgwNzAsIDB4MDc0LCAweDA3OCwgMjQs IDIsIDMxLCAweDAwNCwgMjcpLA0KKwkvKiBDTEtfQ0ZHXzcgKi8NCisJTVVYX0dBVEVfQ0xSX1NF VF9VUEQoQ0xLX1RPUF9NU0RDNTBfMF9TRUwsICJtc2RjNTBfMF9zZWwiLA0KKwkJbXNkYzUwXzBf cGFyZW50cywgMHgwODAsIDB4MDg0LCAweDA4OCwgMCwgMywgNywgMHgwMDQsIDI4KSwNCisJTVVY X0dBVEVfQ0xSX1NFVF9VUEQoQ0xLX1RPUF9NU0RDMzBfMV9TRUwsICJtc2RjMzBfMV9zZWwiLA0K KwkJbXNkYzMwXzFfcGFyZW50cywgMHgwODAsIDB4MDg0LCAweDA4OCwgOCwgMywgMTUsIDB4MDA0 LCAyOSksDQorCU1VWF9HQVRFX0NMUl9TRVRfVVBEKENMS19UT1BfTVNEQzMwXzJfU0VMLCAibXNk YzMwXzJfc2VsIiwNCisJCW1zZGMzMF8yX3BhcmVudHMsIDB4MDgwLCAweDA4NCwgMHgwODgsIDE2 LCAzLCAyMywgMHgwMDQsIDMwKSwNCisJTVVYX0dBVEVfQ0xSX1NFVF9VUEQoQ0xLX1RPUF9BVURJ T19TRUwsICJhdWRpb19zZWwiLA0KKwkJYXVkaW9fcGFyZW50cywgMHgwODAsIDB4MDg0LCAweDA4 OCwgMjQsIDIsIDMxLCAweDAwOCwgMCksDQorCS8qIENMS19DRkdfOCAqLw0KKwlNVVhfR0FURV9D TFJfU0VUX1VQRChDTEtfVE9QX0FVRF9JTlRCVVNfU0VMLCAiYXVkX2ludGJ1c19zZWwiLA0KKwkJ YXVkX2ludGJ1c19wYXJlbnRzLCAweDA5MCwgMHgwOTQsIDB4MDk4LCAwLCAyLCA3LCAweDAwOCwg MSksDQorCU1VWF9HQVRFX0NMUl9TRVRfVVBEKENMS19UT1BfUFdSQVBfVUxQT1NDX1NFTCwgInB3 cmFwX3VscG9zY19zZWwiLA0KKwkJcHdyYXBfdWxwb3NjX3BhcmVudHMsIDB4MDkwLCAweDA5NCwg MHgwOTgsIDgsIDMsIDE1LCAweDAwOCwgMiksDQorCU1VWF9HQVRFX0NMUl9TRVRfVVBEKENMS19U T1BfQVRCX1NFTCwgImF0Yl9zZWwiLA0KKwkJYXRiX3BhcmVudHMsIDB4MDkwLCAweDA5NCwgMHgw OTgsIDE2LCAyLCAyMywgMHgwMDgsIDMpLA0KKwlNVVhfR0FURV9DTFJfU0VUX1VQRChDTEtfVE9Q X1NTUE1fU0VMLCAic3NwbV9zZWwiLA0KKwkJc3NwbV9wYXJlbnRzLCAweDA5MCwgMHgwOTQsIDB4 MDk4LCAyNCwgMywgMzEsIDB4MDA4LCA0KSwNCisJLyogQ0xLX0NGR185ICovDQorCU1VWF9HQVRF X0NMUl9TRVRfVVBEKENMS19UT1BfRFBJX1NFTCwgImRwaV9zZWwiLA0KKwkJZHBpX3BhcmVudHMs IDB4MGEwLCAweDBhNCwgMHgwYTgsIDAsIDMsIDcsIDB4MDA4LCA1KSwNCisJTVVYX0dBVEVfQ0xS X1NFVF9VUEQoQ0xLX1RPUF9TQ0FNX1NFTCwgInNjYW1fc2VsIiwNCisJCXNjYW1fcGFyZW50cywg MHgwYTAsIDB4MGE0LCAweDBhOCwgOCwgMSwgMTUsIDB4MDA4LCA2KSwNCisJTVVYX0dBVEVfQ0xS X1NFVF9VUEQoQ0xLX1RPUF9ESVNQX1BXTV9TRUwsICJkaXNwX3B3bV9zZWwiLA0KKwkJZGlzcF9w d21fcGFyZW50cywgMHgwYTAsIDB4MGE0LCAweDBhOCwgMTYsIDMsIDIzLCAweDAwOCwgNyksDQor CU1VWF9HQVRFX0NMUl9TRVRfVVBEKENMS19UT1BfVVNCX1RPUF9TRUwsICJ1c2JfdG9wX3NlbCIs DQorCQl1c2JfdG9wX3BhcmVudHMsIDB4MGEwLCAweDBhNCwgMHgwYTgsIDI0LCAyLCAzMSwgMHgw MDgsIDgpLA0KKwkvKiBDTEtfQ0ZHXzEwICovDQorCU1VWF9HQVRFX0NMUl9TRVRfVVBEKENMS19U T1BfU1NVU0JfWEhDSV9TRUwsICJzc3VzYl94aGNpX3NlbCIsDQorCQlzc3VzYl94aGNpX3BhcmVu dHMsIDB4MGIwLCAweDBiNCwgMHgwYjgsIDAsIDIsIDcsIDB4MDA4LCA5KSwNCisJTVVYX0dBVEVf Q0xSX1NFVF9VUEQoQ0xLX1RPUF9JMkNfU0VMLCAiaTJjX3NlbCIsDQorCQlpMmNfcGFyZW50cywg MHgwYjAsIDB4MGI0LCAweDBiOCwgOCwgMiwgMTUsIDB4MDA4LCAxMCksDQorCU1VWF9HQVRFX0NM Ul9TRVRfVVBEKENMS19UT1BfU0VOSU5GX1NFTCwgInNlbmluZl9zZWwiLA0KKwkJc2VuaW5mX3Bh cmVudHMsIDB4MGIwLCAweDBiNCwgMHgwYjgsIDE2LCAzLCAyMywgMHgwMDgsIDExKSwNCisJTVVY X0dBVEVfQ0xSX1NFVF9VUEQoQ0xLX1RPUF9TRU5JTkYxX1NFTCwgInNlbmluZjFfc2VsIiwNCisJ CXNlbmluZjFfcGFyZW50cywgMHgwYjAsIDB4MGI0LCAweDBiOCwgMjQsIDMsIDMxLCAweDAwOCwg MTIpLA0KKwkvKiBDTEtfQ0ZHXzExICovDQorCU1VWF9HQVRFX0NMUl9TRVRfVVBEKENMS19UT1Bf U0VOSU5GMl9TRUwsICJzZW5pbmYyX3NlbCIsDQorCQlzZW5pbmYyX3BhcmVudHMsIDB4MGMwLCAw eDBjNCwgMHgwYzgsIDAsIDMsIDcsIDB4MDA4LCAxMyksDQorCU1VWF9HQVRFX0NMUl9TRVRfVVBE KENMS19UT1BfU0VOSU5GM19TRUwsICJzZW5pbmYzX3NlbCIsDQorCQlzZW5pbmYzX3BhcmVudHMs IDB4MGMwLCAweDBjNCwgMHgwYzgsIDgsIDMsIDE1LCAweDAwOCwgMTQpLA0KKwlNVVhfR0FURV9D TFJfU0VUX1VQRChDTEtfVE9QX1RMX1NFTCwgInRsX3NlbCIsDQorCQl0bF9wYXJlbnRzLCAweDBj MCwgMHgwYzQsIDB4MGM4LCAxNiwgMiwgMjMsIDB4MDA4LCAxNSksDQorCU1VWF9HQVRFX0NMUl9T RVRfVVBEKENMS19UT1BfRFhDQ19TRUwsICJkeGNjX3NlbCIsDQorCQlkeGNjX3BhcmVudHMsIDB4 MGMwLCAweDBjNCwgMHgwYzgsIDI0LCAyLCAzMSwgMHgwMDgsIDE2KSwNCisJLyogQ0xLX0NGR18x MiAqLw0KKwlNVVhfR0FURV9DTFJfU0VUX1VQRChDTEtfVE9QX0FVRF9FTkdFTjFfU0VMLCAiYXVk X2VuZ2VuMV9zZWwiLA0KKwkJYXVkX2VuZ2VuMV9wYXJlbnRzLCAweDBkMCwgMHgwZDQsIDB4MGQ4 LCAwLCAyLCA3LCAweDAwOCwgMTcpLA0KKwlNVVhfR0FURV9DTFJfU0VUX1VQRChDTEtfVE9QX0FV RF9FTkdFTjJfU0VMLCAiYXVkX2VuZ2VuMl9zZWwiLA0KKwkJYXVkX2VuZ2VuMl9wYXJlbnRzLCAw eDBkMCwgMHgwZDQsIDB4MGQ4LCA4LCAyLCAxNSwgMHgwMDgsIDE4KSwNCisJTVVYX0dBVEVfQ0xS X1NFVF9VUEQoQ0xLX1RPUF9BRVNfVUZTRkRFX1NFTCwgImFlc191ZnNmZGVfc2VsIiwNCisJCWFl c191ZnNmZGVfcGFyZW50cywgMHgwZDAsIDB4MGQ0LCAweDBkOCwgMTYsIDMsIDIzLCAweDAwOCwg MTkpLA0KKwlNVVhfR0FURV9DTFJfU0VUX1VQRChDTEtfVE9QX1VGU19TRUwsICJ1ZnNfc2VsIiwN CisJCXVmc19wYXJlbnRzLCAweDBkMCwgMHgwZDQsIDB4MGQ4LCAyNCwgMywgMzEsIDB4MDA4LCAy MCksDQorCS8qIENMS19DRkdfMTMgKi8NCisJTVVYX0dBVEVfQ0xSX1NFVF9VUEQoQ0xLX1RPUF9B VURfMV9TRUwsICJhdWRfMV9zZWwiLA0KKwkJYXVkXzFfcGFyZW50cywgMHgwZTAsIDB4MGU0LCAw eDBlOCwgMCwgMSwgNywgMHgwMDgsIDIxKSwNCisJTVVYX0dBVEVfQ0xSX1NFVF9VUEQoQ0xLX1RP UF9BVURfMl9TRUwsICJhdWRfMl9zZWwiLA0KKwkJYXVkXzJfcGFyZW50cywgMHgwZTAsIDB4MGU0 LCAweDBlOCwgOCwgMSwgMTUsIDB4MDA4LCAyMiksDQorCU1VWF9HQVRFX0NMUl9TRVRfVVBEKENM S19UT1BfQURTUF9TRUwsICJhZHNwX3NlbCIsDQorCQlhZHNwX3BhcmVudHMsIDB4MGUwLCAweDBl NCwgMHgwZTgsIDE2LCAzLCAyMywgMHgwMDgsIDIzKSwNCisJTVVYX0dBVEVfQ0xSX1NFVF9VUEQo Q0xLX1RPUF9EUE1BSUZfTUFJTl9TRUwsICJkcG1haWZfbWFpbl9zZWwiLA0KKwkJZHBtYWlmX21h aW5fcGFyZW50cywgMHgwZTAsIDB4MGU0LCAweDBlOCwgMjQsIDMsIDMxLCAweDAwOCwgMjQpLA0K KwkvKiBDTEtfQ0ZHXzE0ICovDQorCU1VWF9HQVRFX0NMUl9TRVRfVVBEKENMS19UT1BfVkVOQ19T RUwsICJ2ZW5jX3NlbCIsDQorCQl2ZW5jX3BhcmVudHMsIDB4MGYwLCAweDBmNCwgMHgwZjgsIDAs IDQsIDcsIDB4MDA4LCAyNSksDQorCU1VWF9HQVRFX0NMUl9TRVRfVVBEKENMS19UT1BfVkRFQ19T RUwsICJ2ZGVjX3NlbCIsDQorCQl2ZGVjX3BhcmVudHMsIDB4MGYwLCAweDBmNCwgMHgwZjgsIDgs IDQsIDE1LCAweDAwOCwgMjYpLA0KKwlNVVhfR0FURV9DTFJfU0VUX1VQRChDTEtfVE9QX0NBTVRN X1NFTCwgImNhbXRtX3NlbCIsDQorCQljYW10bV9wYXJlbnRzLCAweDBmMCwgMHgwZjQsIDB4MGY4 LCAxNiwgMiwgMjMsIDB4MDA4LCAyNyksDQorCU1VWF9HQVRFX0NMUl9TRVRfVVBEKENMS19UT1Bf UFdNX1NFTCwgInB3bV9zZWwiLA0KKwkJcHdtX3BhcmVudHMsIDB4MGYwLCAweDBmNCwgMHgwZjgs IDI0LCAxLCAzMSwgMHgwMDgsIDI4KSwNCisJLyogQ0xLX0NGR18xNSAqLw0KKwlNVVhfR0FURV9D TFJfU0VUX1VQRChDTEtfVE9QX0FVRElPX0hfU0VMLCAiYXVkaW9faF9zZWwiLA0KKwkJYXVkaW9f aF9wYXJlbnRzLCAweDEwMCwgMHgxMDQsIDB4MTA4LCAwLCAyLCA3LCAweDAwOCwgMjkpLA0KKwlN VVhfR0FURV9DTFJfU0VUX1VQRChDTEtfVE9QX1NQTUlfTVNUX1NFTCwgInNwbWlfbXN0X3NlbCIs DQorCQlzcG1pX21zdF9wYXJlbnRzLCAweDEwMCwgMHgxMDQsIDB4MTA4LCA4LCAzLCAxNSwgMHgw MDgsIDMwKSwNCisJTVVYX0dBVEVfQ0xSX1NFVF9VUEQoQ0xLX1RPUF9BRVNfTVNEQ0ZERV9TRUws ICJhZXNfbXNkY2ZkZV9zZWwiLA0KKwkJYWVzX21zZGNmZGVfcGFyZW50cywgMHgxMDAsIDB4MTA0 LCAweDEwOCwgMjQsIDMsIDMxLCAweDAwYywgMSksDQorCS8qIENMS19DRkdfMTYgKi8NCisJTVVY X0dBVEVfQ0xSX1NFVF9VUEQoQ0xLX1RPUF9NQ1VQTV9TRUwsICJtY3VwbV9zZWwiLA0KKwkJbWN1 cG1fcGFyZW50cywgMHgxMTAsIDB4MTE0LCAweDExOCwgMCwgMiwgNywgMHgwMGMsIDIpLA0KKwlN VVhfR0FURV9DTFJfU0VUX1VQRChDTEtfVE9QX1NGTEFTSF9TRUwsICJzZmxhc2hfc2VsIiwNCisJ CXNmbGFzaF9wYXJlbnRzLCAweDExMCwgMHgxMTQsIDB4MTE4LCA4LCAyLCAxNSwgMHgwMGMsIDMp LA0KK307DQorDQorc3RhdGljIHN0cnVjdCBtdGtfY29tcG9zaXRlIHRvcF9tdXhlc1tdID0gew0K KwkvKiBDTEtfQVVERElWXzAgKi8NCisJTVVYKENMS19UT1BfQVBMTF9JMlMwX01fU0VMLCAiYXBs bF9pMnMwX21fc2VsIiwgYXBsbF9pMnMwX21fcGFyZW50cywNCisJCTB4MzIwLCAxNiwgMSksDQor CU1VWChDTEtfVE9QX0FQTExfSTJTMV9NX1NFTCwgImFwbGxfaTJzMV9tX3NlbCIsIGFwbGxfaTJz MV9tX3BhcmVudHMsDQorCQkweDMyMCwgMTcsIDEpLA0KKwlNVVgoQ0xLX1RPUF9BUExMX0kyUzJf TV9TRUwsICJhcGxsX2kyczJfbV9zZWwiLCBhcGxsX2kyczJfbV9wYXJlbnRzLA0KKwkJMHgzMjAs IDE4LCAxKSwNCisJTVVYKENMS19UT1BfQVBMTF9JMlMzX01fU0VMLCAiYXBsbF9pMnMzX21fc2Vs IiwgYXBsbF9pMnMzX21fcGFyZW50cywNCisJCTB4MzIwLCAxOSwgMSksDQorCU1VWChDTEtfVE9Q X0FQTExfSTJTNF9NX1NFTCwgImFwbGxfaTJzNF9tX3NlbCIsIGFwbGxfaTJzNF9tX3BhcmVudHMs DQorCQkweDMyMCwgMjAsIDEpLA0KKwlNVVgoQ0xLX1RPUF9BUExMX0kyUzVfTV9TRUwsICJhcGxs X2kyczVfbV9zZWwiLCBhcGxsX2kyczVfbV9wYXJlbnRzLA0KKwkJMHgzMjAsIDIxLCAxKSwNCisJ TVVYKENMS19UT1BfQVBMTF9JMlM2X01fU0VMLCAiYXBsbF9pMnM2X21fc2VsIiwgYXBsbF9pMnM2 X21fcGFyZW50cywNCisJCTB4MzIwLCAyMiwgMSksDQorCU1VWChDTEtfVE9QX0FQTExfSTJTN19N X1NFTCwgImFwbGxfaTJzN19tX3NlbCIsIGFwbGxfaTJzN19tX3BhcmVudHMsDQorCQkweDMyMCwg MjMsIDEpLA0KKwlNVVgoQ0xLX1RPUF9BUExMX0kyUzhfTV9TRUwsICJhcGxsX2kyczhfbV9zZWwi LCBhcGxsX2kyczhfbV9wYXJlbnRzLA0KKwkJMHgzMjAsIDI0LCAxKSwNCisJTVVYKENMS19UT1Bf QVBMTF9JMlM5X01fU0VMLCAiYXBsbF9pMnM5X21fc2VsIiwgYXBsbF9pMnM5X21fcGFyZW50cywN CisJCTB4MzIwLCAyNSwgMSksDQorfTsNCisNCitzdGF0aWMgY29uc3Qgc3RydWN0IG10a19jb21w b3NpdGUgdG9wX2Fkal9kaXZzW10gPSB7DQorCURJVl9HQVRFKENMS19UT1BfQVBMTDEyX0RJVjAs ICJhcGxsMTJfZGl2MCIsICJhcGxsX2kyczBfbV9zZWwiLCAweDMyMCwNCisJCTAsIDB4MzI4LCA4 LCAwKSwNCisJRElWX0dBVEUoQ0xLX1RPUF9BUExMMTJfRElWMSwgImFwbGwxMl9kaXYxIiwgImFw bGxfaTJzMV9tX3NlbCIsIDB4MzIwLA0KKwkJMSwgMHgzMjgsIDgsIDgpLA0KKwlESVZfR0FURShD TEtfVE9QX0FQTEwxMl9ESVYyLCAiYXBsbDEyX2RpdjIiLCAiYXBsbF9pMnMyX21fc2VsIiwgMHgz MjAsDQorCQkyLCAweDMyOCwgOCwgMTYpLA0KKwlESVZfR0FURShDTEtfVE9QX0FQTEwxMl9ESVYz LCAiYXBsbDEyX2RpdjMiLCAiYXBsbF9pMnMzX21fc2VsIiwgMHgzMjAsDQorCQkzLCAweDMyOCwg OCwgMjQpLA0KKwlESVZfR0FURShDTEtfVE9QX0FQTEwxMl9ESVY0LCAiYXBsbDEyX2RpdjQiLCAi YXBsbF9pMnM0X21fc2VsIiwgMHgzMjAsDQorCQk0LCAweDMzNCwgOCwgMCksDQorCURJVl9HQVRF KENMS19UT1BfQVBMTDEyX0RJVkIsICJhcGxsMTJfZGl2YiIsICJhcGxsMTJfZGl2NCIsIDB4MzIw LA0KKwkJNSwgMHgzMzQsIDgsIDgpLA0KKwlESVZfR0FURShDTEtfVE9QX0FQTEwxMl9ESVY1LCAi YXBsbDEyX2RpdjUiLCAiYXBsbF9pMnM1X21fc2VsIiwgMHgzMjAsDQorCQk2LCAweDMzNCwgOCwg MTYpLA0KKwlESVZfR0FURShDTEtfVE9QX0FQTEwxMl9ESVY2LCAiYXBsbDEyX2RpdjYiLCAiYXBs bF9pMnM2X21fc2VsIiwgMHgzMjAsDQorCQk3LCAweDMzNCwgOCwgMjQpLA0KKwlESVZfR0FURShD TEtfVE9QX0FQTEwxMl9ESVY3LCAiYXBsbDEyX2RpdjciLCAiYXBsbF9pMnM3X21fc2VsIiwgMHgz MjAsDQorCQk4LCAweDMzOCwgOCwgMCksDQorCURJVl9HQVRFKENMS19UT1BfQVBMTDEyX0RJVjgs ICJhcGxsMTJfZGl2OCIsICJhcGxsX2kyczhfbV9zZWwiLCAweDMyMCwNCisJCTksIDB4MzM4LCA4 LCA4KSwNCisJRElWX0dBVEUoQ0xLX1RPUF9BUExMMTJfRElWOSwgImFwbGwxMl9kaXY5IiwgImFw bGxfaTJzOV9tX3NlbCIsIDB4MzIwLA0KKwkJMTAsIDB4MzM4LCA4LCAxNiksDQorfTsNCisNCitz dGF0aWMgY29uc3Qgc3RydWN0IG10a19nYXRlX3JlZ3MgYXBtaXhlZF9jZ19yZWdzID0gew0KKwku c2V0X29mcyA9IDB4MTQsDQorCS5jbHJfb2ZzID0gMHgxNCwNCisJLnN0YV9vZnMgPSAweDE0LA0K K307DQorDQorI2RlZmluZSBHQVRFX0FQTUlYRUQoX2lkLCBfbmFtZSwgX3BhcmVudCwgX3NoaWZ0 KQkJCVwNCisJR0FURV9NVEsoX2lkLCBfbmFtZSwgX3BhcmVudCwgJmFwbWl4ZWRfY2dfcmVncywg X3NoaWZ0LAlcDQorCQkmbXRrX2Nsa19nYXRlX29wc19ub19zZXRjbHJfaW52KQ0KKw0KK3N0YXRp YyBjb25zdCBzdHJ1Y3QgbXRrX2dhdGUgYXBtaXhlZF9jbGtzW10gPSB7DQorCUdBVEVfQVBNSVhF RChDTEtfQVBNSVhFRF9NSVBJRDI2TSwgIm1pcGlkMjZtIiwgImNsazI2bSIsIDE2KSwNCit9Ow0K Kw0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXRrX2dhdGVfcmVncyBpbmZyYTBfY2dfcmVncyA9IHsN CisJLnNldF9vZnMgPSAweDgwLA0KKwkuY2xyX29mcyA9IDB4ODQsDQorCS5zdGFfb2ZzID0gMHg5 MCwNCit9Ow0KKw0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXRrX2dhdGVfcmVncyBpbmZyYTFfY2df cmVncyA9IHsNCisJLnNldF9vZnMgPSAweDg4LA0KKwkuY2xyX29mcyA9IDB4OGMsDQorCS5zdGFf b2ZzID0gMHg5NCwNCit9Ow0KKw0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXRrX2dhdGVfcmVncyBp bmZyYTJfY2dfcmVncyA9IHsNCisJLnNldF9vZnMgPSAweGE0LA0KKwkuY2xyX29mcyA9IDB4YTgs DQorCS5zdGFfb2ZzID0gMHhhYywNCit9Ow0KKw0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXRrX2dh dGVfcmVncyBpbmZyYTNfY2dfcmVncyA9IHsNCisJLnNldF9vZnMgPSAweGMwLA0KKwkuY2xyX29m cyA9IDB4YzQsDQorCS5zdGFfb2ZzID0gMHhjOCwNCit9Ow0KKw0KK3N0YXRpYyBjb25zdCBzdHJ1 Y3QgbXRrX2dhdGVfcmVncyBpbmZyYTRfY2dfcmVncyA9IHsNCisJLnNldF9vZnMgPSAweGQwLA0K KwkuY2xyX29mcyA9IDB4ZDQsDQorCS5zdGFfb2ZzID0gMHhkOCwNCit9Ow0KKw0KK3N0YXRpYyBj b25zdCBzdHJ1Y3QgbXRrX2dhdGVfcmVncyBpbmZyYTVfY2dfcmVncyA9IHsNCisJLnNldF9vZnMg PSAweGUwLA0KKwkuY2xyX29mcyA9IDB4ZTQsDQorCS5zdGFfb2ZzID0gMHhlOCwNCit9Ow0KKw0K KyNkZWZpbmUgR0FURV9JTkZSQTAoX2lkLCBfbmFtZSwgX3BhcmVudCwgX3NoaWZ0KQkJXA0KKwlH QVRFX01USyhfaWQsIF9uYW1lLCBfcGFyZW50LCAmaW5mcmEwX2NnX3JlZ3MsIF9zaGlmdCwJXA0K KwkJJm10a19jbGtfZ2F0ZV9vcHNfc2V0Y2xyKQ0KKw0KKyNkZWZpbmUgR0FURV9JTkZSQTEoX2lk LCBfbmFtZSwgX3BhcmVudCwgX3NoaWZ0KQkJXA0KKwlHQVRFX01USyhfaWQsIF9uYW1lLCBfcGFy ZW50LCAmaW5mcmExX2NnX3JlZ3MsIF9zaGlmdCwJXA0KKwkJJm10a19jbGtfZ2F0ZV9vcHNfc2V0 Y2xyKQ0KKw0KKyNkZWZpbmUgR0FURV9JTkZSQTIoX2lkLCBfbmFtZSwgX3BhcmVudCwgX3NoaWZ0 KQkJXA0KKwlHQVRFX01USyhfaWQsIF9uYW1lLCBfcGFyZW50LCAmaW5mcmEyX2NnX3JlZ3MsIF9z aGlmdCwJXA0KKwkJJm10a19jbGtfZ2F0ZV9vcHNfc2V0Y2xyKQ0KKw0KKyNkZWZpbmUgR0FURV9J TkZSQTMoX2lkLCBfbmFtZSwgX3BhcmVudCwgX3NoaWZ0KQkJXA0KKwlHQVRFX01USyhfaWQsIF9u YW1lLCBfcGFyZW50LCAmaW5mcmEzX2NnX3JlZ3MsIF9zaGlmdCwJXA0KKwkJJm10a19jbGtfZ2F0 ZV9vcHNfc2V0Y2xyKQ0KKw0KKyNkZWZpbmUgR0FURV9JTkZSQTQoX2lkLCBfbmFtZSwgX3BhcmVu dCwgX3NoaWZ0KQkJXA0KKwlHQVRFX01USyhfaWQsIF9uYW1lLCBfcGFyZW50LCAmaW5mcmE0X2Nn X3JlZ3MsIF9zaGlmdCwJXA0KKwkJJm10a19jbGtfZ2F0ZV9vcHNfc2V0Y2xyKQ0KKw0KKyNkZWZp bmUgR0FURV9JTkZSQTUoX2lkLCBfbmFtZSwgX3BhcmVudCwgX3NoaWZ0KQkJXA0KKwlHQVRFX01U SyhfaWQsIF9uYW1lLCBfcGFyZW50LCAmaW5mcmE1X2NnX3JlZ3MsIF9zaGlmdCwJXA0KKwkJJm10 a19jbGtfZ2F0ZV9vcHNfc2V0Y2xyKQ0KKw0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXRrX2dhdGUg aW5mcmFfY2xrc1tdID0gew0KKwkvKiBJTkZSQTAgKi8NCisJR0FURV9JTkZSQTAoQ0xLX0lORlJB X1BNSUNfVE1SLCAiaW5mcmFfcG1pY190bXIiLA0KKwkJInB3cmFwX3VscG9zY19zZWwiLCAwKSwN CisJR0FURV9JTkZSQTAoQ0xLX0lORlJBX1BNSUNfQVAsICJpbmZyYV9wbWljX2FwIiwNCisJCSJw d3JhcF91bHBvc2Nfc2VsIiwgMSksDQorCUdBVEVfSU5GUkEwKENMS19JTkZSQV9QTUlDX01ELCAi aW5mcmFfcG1pY19tZCIsDQorCQkicHdyYXBfdWxwb3NjX3NlbCIsIDIpLA0KKwlHQVRFX0lORlJB MChDTEtfSU5GUkFfUE1JQ19DT05OLCAiaW5mcmFfcG1pY19jb25uIiwNCisJCSJwd3JhcF91bHBv c2Nfc2VsIiwgMyksDQorCUdBVEVfSU5GUkEwKENMS19JTkZSQV9TQ1BTWVMsICJpbmZyYV9zY3Bz eXMiLA0KKwkJInNjcF9zZWwiLCA0KSwNCisJR0FURV9JTkZSQTAoQ0xLX0lORlJBX1NFSiwgImlu ZnJhX3NlaiIsDQorCQkiYXhpX3NlbCIsIDUpLA0KKwlHQVRFX0lORlJBMChDTEtfSU5GUkFfQVBY R1BULCAiaW5mcmFfYXB4Z3B0IiwNCisJCSJheGlfc2VsIiwgNiksDQorCUdBVEVfSU5GUkEwKENM S19JTkZSQV9NQ1VQTSwgImluZnJhX21jdXBtIiwNCisJCSJtY3VwbV9zZWwiLCA3KSwNCisJR0FU RV9JTkZSQTAoQ0xLX0lORlJBX0dDRSwgImluZnJhX2djZSIsDQorCQkiYXhpX3NlbCIsIDgpLA0K KwlHQVRFX0lORlJBMChDTEtfSU5GUkFfR0NFMiwgImluZnJhX2djZTIiLA0KKwkJImF4aV9zZWwi LCA5KSwNCisJR0FURV9JTkZSQTAoQ0xLX0lORlJBX1RIRVJNLCAiaW5mcmFfdGhlcm0iLA0KKwkJ ImF4aV9zZWwiLCAxMCksDQorCUdBVEVfSU5GUkEwKENMS19JTkZSQV9JMkMwLCAiaW5mcmFfaTJj MCIsDQorCQkiaTJjX3NlbCIsIDExKSwNCisJR0FURV9JTkZSQTAoQ0xLX0lORlJBX0FQX0RNQV9Q U0VVRE8sICJpbmZyYV9hcF9kbWFfcHNldWRvIiwNCisJCSJheGlfc2VsIiwgMTIpLA0KKwlHQVRF X0lORlJBMChDTEtfSU5GUkFfSTJDMiwgImluZnJhX2kyYzIiLA0KKwkJImkyY19zZWwiLCAxMyks DQorCUdBVEVfSU5GUkEwKENMS19JTkZSQV9JMkMzLCAiaW5mcmFfaTJjMyIsDQorCQkiaTJjX3Nl bCIsIDE0KSwNCisJR0FURV9JTkZSQTAoQ0xLX0lORlJBX1BXTV9ILCAiaW5mcmFfcHdtX2giLA0K KwkJImF4aV9zZWwiLCAxNSksDQorCUdBVEVfSU5GUkEwKENMS19JTkZSQV9QV00xLCAiaW5mcmFf cHdtMSIsDQorCQkicHdtX3NlbCIsIDE2KSwNCisJR0FURV9JTkZSQTAoQ0xLX0lORlJBX1BXTTIs ICJpbmZyYV9wd20yIiwNCisJCSJwd21fc2VsIiwgMTcpLA0KKwlHQVRFX0lORlJBMChDTEtfSU5G UkFfUFdNMywgImluZnJhX3B3bTMiLA0KKwkJInB3bV9zZWwiLCAxOCksDQorCUdBVEVfSU5GUkEw KENMS19JTkZSQV9QV000LCAiaW5mcmFfcHdtNCIsDQorCQkicHdtX3NlbCIsIDE5KSwNCisJR0FU RV9JTkZSQTAoQ0xLX0lORlJBX1BXTSwgImluZnJhX3B3bSIsDQorCQkicHdtX3NlbCIsIDIxKSwN CisJR0FURV9JTkZSQTAoQ0xLX0lORlJBX1VBUlQwLCAiaW5mcmFfdWFydDAiLA0KKwkJInVhcnRf c2VsIiwgMjIpLA0KKwlHQVRFX0lORlJBMChDTEtfSU5GUkFfVUFSVDEsICJpbmZyYV91YXJ0MSIs DQorCQkidWFydF9zZWwiLCAyMyksDQorCUdBVEVfSU5GUkEwKENMS19JTkZSQV9VQVJUMiwgImlu ZnJhX3VhcnQyIiwNCisJCSJ1YXJ0X3NlbCIsIDI0KSwNCisJR0FURV9JTkZSQTAoQ0xLX0lORlJB X1VBUlQzLCAiaW5mcmFfdWFydDMiLA0KKwkJInVhcnRfc2VsIiwgMjUpLA0KKwlHQVRFX0lORlJB MChDTEtfSU5GUkFfR0NFXzI2TSwgImluZnJhX2djZV8yNm0iLA0KKwkJImF4aV9zZWwiLCAyNyks DQorCUdBVEVfSU5GUkEwKENMS19JTkZSQV9DUV9ETUFfRlBDLCAiaW5mcmFfY3FfZG1hX2ZwYyIs DQorCQkiYXhpX3NlbCIsIDI4KSwNCisJR0FURV9JTkZSQTAoQ0xLX0lORlJBX0JUSUYsICJpbmZy YV9idGlmIiwNCisJCSJheGlfc2VsIiwgMzEpLA0KKwkvKiBJTkZSQTEgKi8NCisJR0FURV9JTkZS QTEoQ0xLX0lORlJBX1NQSTAsICJpbmZyYV9zcGkwIiwNCisJCSJzcGlfc2VsIiwgMSksDQorCUdB VEVfSU5GUkExKENMS19JTkZSQV9NU0RDMCwgImluZnJhX21zZGMwIiwNCisJCSJtc2RjNTBfMF9o X3NlbCIsIDIpLA0KKwlHQVRFX0lORlJBMShDTEtfSU5GUkFfTVNEQzEsICJpbmZyYV9tc2RjMSIs DQorCQkibXNkYzUwXzBfaF9zZWwiLCA0KSwNCisJR0FURV9JTkZSQTEoQ0xLX0lORlJBX01TREMy LCAiaW5mcmFfbXNkYzIiLA0KKwkJIm1zZGM1MF8wX2hfc2VsIiwgNSksDQorCUdBVEVfSU5GUkEx KENMS19JTkZSQV9NU0RDMF9TUkMsICJpbmZyYV9tc2RjMF9zcmMiLA0KKwkJIm1zZGM1MF8wX3Nl bCIsIDYpLA0KKwlHQVRFX0lORlJBMShDTEtfSU5GUkFfR0NQVSwgImluZnJhX2djcHUiLA0KKwkJ ImF4aV9zZWwiLCA4KSwNCisJR0FURV9JTkZSQTEoQ0xLX0lORlJBX1RSTkcsICJpbmZyYV90cm5n IiwNCisJCSJheGlfc2VsIiwgOSksDQorCUdBVEVfSU5GUkExKENMS19JTkZSQV9BVVhBREMsICJp bmZyYV9hdXhhZGMiLA0KKwkJImNsazI2bSIsIDEwKSwNCisJR0FURV9JTkZSQTEoQ0xLX0lORlJB X0NQVU0sICJpbmZyYV9jcHVtIiwNCisJCSJheGlfc2VsIiwgMTEpLA0KKwlHQVRFX0lORlJBMShD TEtfSU5GUkFfQ0NJRjFfQVAsICJpbmZyYV9jY2lmMV9hcCIsDQorCQkiYXhpX3NlbCIsIDEyKSwN CisJR0FURV9JTkZSQTEoQ0xLX0lORlJBX0NDSUYxX01ELCAiaW5mcmFfY2NpZjFfbWQiLA0KKwkJ ImF4aV9zZWwiLCAxMyksDQorCUdBVEVfSU5GUkExKENMS19JTkZSQV9BVVhBRENfTUQsICJpbmZy YV9hdXhhZGNfbWQiLA0KKwkJImNsazI2bSIsIDE0KSwNCisJR0FURV9JTkZSQTEoQ0xLX0lORlJB X1BDSUVfVExfMjZNLCAiaW5mcmFfcGNpZV90bF8yNm0iLA0KKwkJImF4aV9zZWwiLCAxNSksDQor CUdBVEVfSU5GUkExKENMS19JTkZSQV9NU0RDMV9TUkMsICJpbmZyYV9tc2RjMV9zcmMiLA0KKwkJ Im1zZGMzMF8xX3NlbCIsIDE2KSwNCisJR0FURV9JTkZSQTEoQ0xLX0lORlJBX01TREMyX1NSQywg ImluZnJhX21zZGMyX3NyYyIsDQorCQkibXNkYzMwXzJfc2VsIiwgMTcpLA0KKwlHQVRFX0lORlJB MShDTEtfSU5GUkFfUENJRV9UTF85Nk0sICJpbmZyYV9wY2llX3RsXzk2bSIsDQorCQkiYXhpX3Nl bCIsIDE4KSwNCisJR0FURV9JTkZSQTEoQ0xLX0lORlJBX1BDSUVfUExfUF8yNTBNLCAiaW5mcmFf cGNpZV9wbF9wXzI1MG0iLA0KKwkJImF4aV9zZWwiLCAxOSksDQorCUdBVEVfSU5GUkExKENMS19J TkZSQV9ERVZJQ0VfQVBDLCAiaW5mcmFfZGV2aWNlX2FwYyIsDQorCQkiYXhpX3NlbCIsIDIwKSwN CisJR0FURV9JTkZSQTEoQ0xLX0lORlJBX0NDSUZfQVAsICJpbmZyYV9jY2lmX2FwIiwNCisJCSJh eGlfc2VsIiwgMjMpLA0KKwlHQVRFX0lORlJBMShDTEtfSU5GUkFfREVCVUdTWVMsICJpbmZyYV9k ZWJ1Z3N5cyIsDQorCQkiYXhpX3NlbCIsIDI0KSwNCisJR0FURV9JTkZSQTEoQ0xLX0lORlJBX0FV RElPLCAiaW5mcmFfYXVkaW8iLA0KKwkJImF4aV9zZWwiLCAyNSksDQorCUdBVEVfSU5GUkExKENM S19JTkZSQV9DQ0lGX01ELCAiaW5mcmFfY2NpZl9tZCIsDQorCQkiYXhpX3NlbCIsIDI2KSwNCisJ R0FURV9JTkZSQTEoQ0xLX0lORlJBX0RYQ0NfU0VDX0NPUkUsICJpbmZyYV9keGNjX3NlY19jb3Jl IiwNCisJCSJkeGNjX3NlbCIsIDI3KSwNCisJR0FURV9JTkZSQTEoQ0xLX0lORlJBX0RYQ0NfQU8s ICJpbmZyYV9keGNjX2FvIiwNCisJCSJkeGNjX3NlbCIsIDI4KSwNCisJR0FURV9JTkZSQTEoQ0xL X0lORlJBX0RCR19UUkFDRSwgImluZnJhX2RiZ190cmFjZSIsDQorCQkiYXhpX3NlbCIsIDI5KSwN CisJR0FURV9JTkZSQTEoQ0xLX0lORlJBX0RFVk1QVV9CLCAiaW5mcmFfZGV2bXB1X2IiLA0KKwkJ ImF4aV9zZWwiLCAzMCksDQorCUdBVEVfSU5GUkExKENMS19JTkZSQV9EUkFNQ19GMjZNLCAiaW5m cmFfZHJhbWNfZjI2bSIsDQorCQkiY2xrMjZtIiwgMzEpLA0KKwkvKiBJTkZSQTIgKi8NCisJR0FU RV9JTkZSQTIoQ0xLX0lORlJBX0lSVFgsICJpbmZyYV9pcnR4IiwNCisJCSJjbGsyNm0iLCAwKSwN CisJR0FURV9JTkZSQTIoQ0xLX0lORlJBX1NTVVNCLCAiaW5mcmFfc3N1c2IiLA0KKwkJInVzYl90 b3Bfc2VsIiwgMSksDQorCUdBVEVfSU5GUkEyKENMS19JTkZSQV9ESVNQX1BXTSwgImluZnJhX2Rp c3BfcHdtIiwNCisJCSJheGlfc2VsIiwgMiksDQorCUdBVEVfSU5GUkEyKENMS19JTkZSQV9DTERN QV9CLCAiaW5mcmFfY2xkbWFfYiIsDQorCQkiYXhpX3NlbCIsIDMpLA0KKwlHQVRFX0lORlJBMihD TEtfSU5GUkFfQVVESU9fMjZNX0IsICJpbmZyYV9hdWRpb18yNm1fYiIsDQorCQkiY2xrMjZtIiwg NCksDQorCUdBVEVfSU5GUkEyKENMS19JTkZSQV9NT0RFTV9URU1QX1NIQVJFLCAiaW5mcmFfbW9k ZW1fdGVtcF9zaGFyZSIsDQorCQkiY2xrMjZtIiwgNSksDQorCUdBVEVfSU5GUkEyKENMS19JTkZS QV9TUEkxLCAiaW5mcmFfc3BpMSIsDQorCQkic3BpX3NlbCIsIDYpLA0KKwlHQVRFX0lORlJBMihD TEtfSU5GUkFfSTJDNCwgImluZnJhX2kyYzQiLA0KKwkJImkyY19zZWwiLCA3KSwNCisJR0FURV9J TkZSQTIoQ0xLX0lORlJBX1NQSTIsICJpbmZyYV9zcGkyIiwNCisJCSJzcGlfc2VsIiwgOSksDQor CUdBVEVfSU5GUkEyKENMS19JTkZSQV9TUEkzLCAiaW5mcmFfc3BpMyIsDQorCQkic3BpX3NlbCIs IDEwKSwNCisJR0FURV9JTkZSQTIoQ0xLX0lORlJBX1VOSVBST19TWVMsICJpbmZyYV91bmlwcm9f c3lzIiwNCisJCSJ1ZnNfc2VsIiwgMTEpLA0KKwlHQVRFX0lORlJBMihDTEtfSU5GUkFfVU5JUFJP X1RJQ0ssICJpbmZyYV91bmlwcm9fdGljayIsDQorCQkiY2xrMjZtIiwgMTIpLA0KKwlHQVRFX0lO RlJBMihDTEtfSU5GUkFfVUZTX01QX1NBUF9CLCAiaW5mcmFfdWZzX21wX3NhcF9iIiwNCisJCSJj bGsyNm0iLCAxMyksDQorCUdBVEVfSU5GUkEyKENMS19JTkZSQV9NRDMyX0IsICJpbmZyYV9tZDMy X2IiLA0KKwkJImF4aV9zZWwiLCAxNCksDQorCUdBVEVfSU5GUkEyKENMS19JTkZSQV9TU1BNLCAi aW5mcmFfc3NwbSIsDQorCQkic3NwbV9zZWwiLCAxNSksDQorCUdBVEVfSU5GUkEyKENMS19JTkZS QV9VTklQUk9fTUJJU1QsICJpbmZyYV91bmlwcm9fbWJpc3QiLA0KKwkJImF4aV9zZWwiLCAxNiks DQorCUdBVEVfSU5GUkEyKENMS19JTkZSQV9TU1BNX0JVU19ILCAiaW5mcmFfc3NwbV9idXNfaCIs DQorCQkiYXhpX3NlbCIsIDE3KSwNCisJR0FURV9JTkZSQTIoQ0xLX0lORlJBX0kyQzUsICJpbmZy YV9pMmM1IiwNCisJCSJpMmNfc2VsIiwgMTgpLA0KKwlHQVRFX0lORlJBMihDTEtfSU5GUkFfSTJD NV9BUkJJVEVSLCAiaW5mcmFfaTJjNV9hcmJpdGVyIiwNCisJCSJpMmNfc2VsIiwgMTkpLA0KKwlH QVRFX0lORlJBMihDTEtfSU5GUkFfSTJDNV9JTU0sICJpbmZyYV9pMmM1X2ltbSIsDQorCQkiaTJj X3NlbCIsIDIwKSwNCisJR0FURV9JTkZSQTIoQ0xLX0lORlJBX0kyQzFfQVJCSVRFUiwgImluZnJh X2kyYzFfYXJiaXRlciIsDQorCQkiaTJjX3NlbCIsIDIxKSwNCisJR0FURV9JTkZSQTIoQ0xLX0lO RlJBX0kyQzFfSU1NLCAiaW5mcmFfaTJjMV9pbW0iLA0KKwkJImkyY19zZWwiLCAyMiksDQorCUdB VEVfSU5GUkEyKENMS19JTkZSQV9JMkMyX0FSQklURVIsICJpbmZyYV9pMmMyX2FyYml0ZXIiLA0K KwkJImkyY19zZWwiLCAyMyksDQorCUdBVEVfSU5GUkEyKENMS19JTkZSQV9JMkMyX0lNTSwgImlu ZnJhX2kyYzJfaW1tIiwNCisJCSJpMmNfc2VsIiwgMjQpLA0KKwlHQVRFX0lORlJBMihDTEtfSU5G UkFfU1BJNCwgImluZnJhX3NwaTQiLA0KKwkJInNwaV9zZWwiLCAyNSksDQorCUdBVEVfSU5GUkEy KENMS19JTkZSQV9TUEk1LCAiaW5mcmFfc3BpNSIsDQorCQkic3BpX3NlbCIsIDI2KSwNCisJR0FU RV9JTkZSQTIoQ0xLX0lORlJBX0NRX0RNQSwgImluZnJhX2NxX2RtYSIsDQorCQkiYXhpX3NlbCIs IDI3KSwNCisJR0FURV9JTkZSQTIoQ0xLX0lORlJBX1VGUywgImluZnJhX3VmcyIsDQorCQkidWZz X3NlbCIsIDI4KSwNCisJR0FURV9JTkZSQTIoQ0xLX0lORlJBX0FFU19VRlNGREUsICJpbmZyYV9h ZXNfdWZzZmRlIiwNCisJCSJhZXNfdWZzZmRlX3NlbCIsIDI5KSwNCisJR0FURV9JTkZSQTIoQ0xL X0lORlJBX1VGU19USUNLLCAiaW5mcmFfdWZzX3RpY2siLA0KKwkJInVmc19zZWwiLCAzMCksDQor CUdBVEVfSU5GUkEyKENMS19JTkZSQV9TU1VTQl9YSENJLCAiaW5mcmFfc3N1c2JfeGhjaSIsDQor CQkic3N1c2JfeGhjaV9zZWwiLCAzMSksDQorCS8qIElORlJBMyAqLw0KKwlHQVRFX0lORlJBMyhD TEtfSU5GUkFfTVNEQzBfU0VMRiwgImluZnJhX21zZGMwX3NlbGYiLA0KKwkJIm1zZGM1MF8wX3Nl bCIsIDApLA0KKwlHQVRFX0lORlJBMyhDTEtfSU5GUkFfTVNEQzFfU0VMRiwgImluZnJhX21zZGMx X3NlbGYiLA0KKwkJIm1zZGM1MF8wX3NlbCIsIDEpLA0KKwlHQVRFX0lORlJBMyhDTEtfSU5GUkFf TVNEQzJfU0VMRiwgImluZnJhX21zZGMyX3NlbGYiLA0KKwkJIm1zZGM1MF8wX3NlbCIsIDIpLA0K KwlHQVRFX0lORlJBMyhDTEtfSU5GUkFfU1NQTV8yNk1fU0VMRiwgImluZnJhX3NzcG1fMjZtX3Nl bGYiLA0KKwkJImNsazI2bSIsIDMpLA0KKwlHQVRFX0lORlJBMyhDTEtfSU5GUkFfU1NQTV8zMktf U0VMRiwgImluZnJhX3NzcG1fMzJrX3NlbGYiLA0KKwkJImNsazMyayIsIDQpLA0KKwlHQVRFX0lO RlJBMyhDTEtfSU5GUkFfVUZTX0FYSSwgImluZnJhX3Vmc19heGkiLA0KKwkJImF4aV9zZWwiLCA1 KSwNCisJR0FURV9JTkZSQTMoQ0xLX0lORlJBX0kyQzYsICJpbmZyYV9pMmM2IiwNCisJCSJpMmNf c2VsIiwgNiksDQorCUdBVEVfSU5GUkEzKENMS19JTkZSQV9BUF9NU0RDMCwgImluZnJhX2FwX21z ZGMwIiwNCisJCSJtc2RjNTBfMF9zZWwiLCA3KSwNCisJR0FURV9JTkZSQTMoQ0xLX0lORlJBX01E X01TREMwLCAiaW5mcmFfbWRfbXNkYzAiLA0KKwkJIm1zZGM1MF8wX3NlbCIsIDgpLA0KKwlHQVRF X0lORlJBMyhDTEtfSU5GUkFfQ0NJRjVfQVAsICJpbmZyYV9jY2lmNV9hcCIsDQorCQkiYXhpX3Nl bCIsIDkpLA0KKwlHQVRFX0lORlJBMyhDTEtfSU5GUkFfQ0NJRjVfTUQsICJpbmZyYV9jY2lmNV9t ZCIsDQorCQkiYXhpX3NlbCIsIDEwKSwNCisJR0FURV9JTkZSQTMoQ0xLX0lORlJBX1BDSUVfVE9Q X0hfMTMzTSwgImluZnJhX3BjaWVfdG9wX2hfMTMzbSIsDQorCQkiYXhpX3NlbCIsIDExKSwNCisJ R0FURV9JTkZSQTMoQ0xLX0lORlJBX0ZMQVNISUZfVE9QX0hfMTMzTSwgImluZnJhX2ZsYXNoaWZf dG9wX2hfMTMzbSIsDQorCQkiYXhpX3NlbCIsIDE0KSwNCisJR0FURV9JTkZSQTMoQ0xLX0lORlJB X1BDSUVfUEVSSV8yNk0sICJpbmZyYV9wY2llX3BlcmlfMjZtIiwNCisJCSJheGlfc2VsIiwgMTUp LA0KKwlHQVRFX0lORlJBMyhDTEtfSU5GUkFfQ0NJRjJfQVAsICJpbmZyYV9jY2lmMl9hcCIsDQor CQkiYXhpX3NlbCIsIDE2KSwNCisJR0FURV9JTkZSQTMoQ0xLX0lORlJBX0NDSUYyX01ELCAiaW5m cmFfY2NpZjJfbWQiLA0KKwkJImF4aV9zZWwiLCAxNyksDQorCUdBVEVfSU5GUkEzKENMS19JTkZS QV9DQ0lGM19BUCwgImluZnJhX2NjaWYzX2FwIiwNCisJCSJheGlfc2VsIiwgMTgpLA0KKwlHQVRF X0lORlJBMyhDTEtfSU5GUkFfQ0NJRjNfTUQsICJpbmZyYV9jY2lmM19tZCIsDQorCQkiYXhpX3Nl bCIsIDE5KSwNCisJR0FURV9JTkZSQTMoQ0xLX0lORlJBX1NFSl9GMTNNLCAiaW5mcmFfc2VqX2Yx M20iLA0KKwkJImNsazI2bSIsIDIwKSwNCisJR0FURV9JTkZSQTMoQ0xLX0lORlJBX0FFUywgImlu ZnJhX2FlcyIsDQorCQkiYXhpX3NlbCIsIDIxKSwNCisJR0FURV9JTkZSQTMoQ0xLX0lORlJBX0ky QzcsICJpbmZyYV9pMmM3IiwNCisJCSJpMmNfc2VsIiwgMjIpLA0KKwlHQVRFX0lORlJBMyhDTEtf SU5GUkFfSTJDOCwgImluZnJhX2kyYzgiLA0KKwkJImkyY19zZWwiLCAyMyksDQorCUdBVEVfSU5G UkEzKENMS19JTkZSQV9GQklTVDJGUEMsICJpbmZyYV9mYmlzdDJmcGMiLA0KKwkJIm1zZGM1MF8w X3NlbCIsIDI0KSwNCisJR0FURV9JTkZSQTMoQ0xLX0lORlJBX0RFVklDRV9BUENfU1lOQywgImlu ZnJhX2RldmljZV9hcGNfc3luYyIsDQorCQkiYXhpX3NlbCIsIDI1KSwNCisJR0FURV9JTkZSQTMo Q0xLX0lORlJBX0RQTUFJRl9NQUlOLCAiaW5mcmFfZHBtYWlmX21haW4iLA0KKwkJImRwbWFpZl9t YWluX3NlbCIsIDI2KSwNCisJR0FURV9JTkZSQTMoQ0xLX0lORlJBX1BDSUVfVExfMzJLLCAiaW5m cmFfcGNpZV90bF8zMmsiLA0KKwkJImF4aV9zZWwiLCAyNyksDQorCUdBVEVfSU5GUkEzKENMS19J TkZSQV9DQ0lGNF9BUCwgImluZnJhX2NjaWY0X2FwIiwNCisJCSJheGlfc2VsIiwgMjgpLA0KKwlH QVRFX0lORlJBMyhDTEtfSU5GUkFfQ0NJRjRfTUQsICJpbmZyYV9jY2lmNF9tZCIsDQorCQkiYXhp X3NlbCIsIDI5KSwNCisJR0FURV9JTkZSQTMoQ0xLX0lORlJBX1NQSTYsICJpbmZyYV9zcGk2IiwN CisJCSJzcGlfc2VsIiwgMzApLA0KKwlHQVRFX0lORlJBMyhDTEtfSU5GUkFfU1BJNywgImluZnJh X3NwaTciLA0KKwkJInNwaV9zZWwiLCAzMSksDQorCS8qIElORlJBNCAqLw0KKwlHQVRFX0lORlJB NChDTEtfSU5GUkFfQVBfRE1BLCAiaW5mcmFfYXBfZG1hIiwNCisJCSJpbmZyYV9hcF9kbWFfcHNl dWRvIiwgMzEpLA0KKwkvKiBJTkZSQTUgKi8NCisJR0FURV9JTkZSQTUoQ0xLX0lORlJBXzEzM00s ICJpbmZyYV8xMzNtIiwNCisJCSJheGlfc2VsIiwgMCksDQorCUdBVEVfSU5GUkE1KENMS19JTkZS QV82Nk0sICJpbmZyYV82Nm0iLA0KKwkJImF4aV9zZWwiLCAxKSwNCisJR0FURV9JTkZSQTUoQ0xL X0lORlJBXzY2TV9QRVJJX0JVUywgImluZnJhXzY2bV9wZXJpX2J1cyIsDQorCQkiYXhpX3NlbCIs IDIpLA0KKwlHQVRFX0lORlJBNShDTEtfSU5GUkFfRlJFRV9EQ01fMTMzTSwgImluZnJhX2ZyZWVf ZGNtXzEzM20iLA0KKwkJImF4aV9zZWwiLCAzKSwNCisJR0FURV9JTkZSQTUoQ0xLX0lORlJBX0ZS RUVfRENNXzY2TSwgImluZnJhX2ZyZWVfZGNtXzY2bSIsDQorCQkiYXhpX3NlbCIsIDQpLA0KKwlH QVRFX0lORlJBNShDTEtfSU5GUkFfUEVSSV9CVVNfRENNXzEzM00sICJpbmZyYV9wZXJpX2J1c19k Y21fMTMzbSIsDQorCQkiYXhpX3NlbCIsIDUpLA0KKwlHQVRFX0lORlJBNShDTEtfSU5GUkFfUEVS SV9CVVNfRENNXzY2TSwgImluZnJhX3BlcmlfYnVzX2RjbV82Nm0iLA0KKwkJImF4aV9zZWwiLCA2 KSwNCisJR0FURV9JTkZSQTUoQ0xLX0lORlJBX0ZMQVNISUZfUEVSSV8yNk0sICJpbmZyYV9mbGFz aGlmX3BlcmlfMjZtIiwNCisJCSJheGlfc2VsIiwgMzApLA0KKwlHQVRFX0lORlJBNShDTEtfSU5G UkFfRkxBU0hJRl9TRkxBU0gsICJpbmZyYV9mbGFzaGlmX2ZzZmxhc2giLA0KKwkJImF4aV9zZWwi LCAzMSksDQorfTsNCisNCitzdGF0aWMgY29uc3Qgc3RydWN0IG10a19nYXRlX3JlZ3MgcGVyaV9j Z19yZWdzID0gew0KKwkuc2V0X29mcyA9IDB4MjBjLA0KKwkuY2xyX29mcyA9IDB4MjBjLA0KKwku c3RhX29mcyA9IDB4MjBjLA0KK307DQorDQorI2RlZmluZSBHQVRFX1BFUkkoX2lkLCBfbmFtZSwg X3BhcmVudCwgX3NoaWZ0KQkJCVwNCisJR0FURV9NVEsoX2lkLCBfbmFtZSwgX3BhcmVudCwgJnBl cmlfY2dfcmVncywgX3NoaWZ0LAlcDQorCQkmbXRrX2Nsa19nYXRlX29wc19ub19zZXRjbHJfaW52 KQ0KKw0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXRrX2dhdGUgcGVyaV9jbGtzW10gPSB7DQorCUdB VEVfUEVSSShDTEtfUEVSSV9QRVJJQVhJLCAicGVyaV9wZXJpYXhpIiwgImF4aV9zZWwiLCAzMSks DQorfTsNCisNCitzdGF0aWMgY29uc3Qgc3RydWN0IG10a19nYXRlX3JlZ3MgdG9wX2NnX3JlZ3Mg PSB7DQorCS5zZXRfb2ZzID0gMHgxNTAsDQorCS5jbHJfb2ZzID0gMHgxNTAsDQorCS5zdGFfb2Zz ID0gMHgxNTAsDQorfTsNCisNCisjZGVmaW5lIEdBVEVfVE9QKF9pZCwgX25hbWUsIF9wYXJlbnQs IF9zaGlmdCkJCQlcDQorCUdBVEVfTVRLKF9pZCwgX25hbWUsIF9wYXJlbnQsICZ0b3BfY2dfcmVn cywgX3NoaWZ0LAlcDQorCQkmbXRrX2Nsa19nYXRlX29wc19ub19zZXRjbHJfaW52KQ0KKw0KK3N0 YXRpYyBjb25zdCBzdHJ1Y3QgbXRrX2dhdGUgdG9wX2Nsa3NbXSA9IHsNCisJR0FURV9UT1AoQ0xL X1RPUF9TU1VTQl9UT1BfUkVGLCAic3N1c2JfdG9wX3JlZiIsICJjbGsyNm0iLCAyNCksDQorCUdB VEVfVE9QKENMS19UT1BfU1NVU0JfUEhZX1JFRiwgInNzdXNiX3BoeV9yZWYiLCAiY2xrMjZtIiwg MjUpLA0KK307DQorDQorI2RlZmluZSBNVDgxOTJfUExMX0ZNQVgJCSgzODAwVUwgKiBNSFopDQor I2RlZmluZSBNVDgxOTJfUExMX0ZNSU4JCSgxNTAwVUwgKiBNSFopDQorI2RlZmluZSBNVDgxOTJf SU5URUdFUl9CSVRTCTgNCisNCisjZGVmaW5lIFBMTChfaWQsIF9uYW1lLCBfcmVnLCBfcHdyX3Jl ZywgX2VuX21hc2ssIF9mbGFncywJCVwNCisJCQlfcnN0X2Jhcl9tYXNrLCBfcGN3Yml0cywgX3Bk X3JlZywgX3BkX3NoaWZ0LAlcDQorCQkJX3R1bmVyX3JlZywgX3R1bmVyX2VuX3JlZywgX3R1bmVy X2VuX2JpdCwJXA0KKwkJCV9wY3dfcmVnLCBfcGN3X3NoaWZ0LCBfcGN3X2NoZ19yZWcsCQlcDQor CQkJX2VuX3JlZywgX2Jhc2VfZW5fYml0KSB7CQkJXA0KKwkJLmlkID0gX2lkLAkJCQkJCVwNCisJ CS5uYW1lID0gX25hbWUsCQkJCQkJXA0KKwkJLnJlZyA9IF9yZWcsCQkJCQkJXA0KKwkJLnB3cl9y ZWcgPSBfcHdyX3JlZywJCQkJCVwNCisJCS5lbl9tYXNrID0gX2VuX21hc2ssCQkJCQlcDQorCQku ZmxhZ3MgPSBfZmxhZ3MsCQkJCQlcDQorCQkucnN0X2Jhcl9tYXNrID0gX3JzdF9iYXJfbWFzaywJ CQkJXA0KKwkJLmZtYXggPSBNVDgxOTJfUExMX0ZNQVgsCQkJCVwNCisJCS5mbWluID0gTVQ4MTky X1BMTF9GTUlOLAkJCQlcDQorCQkucGN3Yml0cyA9IF9wY3diaXRzLAkJCQkJXA0KKwkJLnBjd2li aXRzID0gTVQ4MTkyX0lOVEVHRVJfQklUUywJCQlcDQorCQkucGRfcmVnID0gX3BkX3JlZywJCQkJ CVwNCisJCS5wZF9zaGlmdCA9IF9wZF9zaGlmdCwJCQkJCVwNCisJCS50dW5lcl9yZWcgPSBfdHVu ZXJfcmVnLAkJCQlcDQorCQkudHVuZXJfZW5fcmVnID0gX3R1bmVyX2VuX3JlZywJCQkJXA0KKwkJ LnR1bmVyX2VuX2JpdCA9IF90dW5lcl9lbl9iaXQsCQkJCVwNCisJCS5wY3dfcmVnID0gX3Bjd19y ZWcsCQkJCQlcDQorCQkucGN3X3NoaWZ0ID0gX3Bjd19zaGlmdCwJCQkJXA0KKwkJLnBjd19jaGdf cmVnID0gX3Bjd19jaGdfcmVnLAkJCQlcDQorCQkuZW5fcmVnID0gX2VuX3JlZywJCQkJCVwNCisJ CS5iYXNlX2VuX2JpdCA9IF9iYXNlX2VuX2JpdCwJCQkJXA0KKwl9DQorDQorI2RlZmluZSBQTExf QihfaWQsIF9uYW1lLCBfcmVnLCBfcHdyX3JlZywgX2VuX21hc2ssIF9mbGFncywJCVwNCisJCQlf cnN0X2Jhcl9tYXNrLCBfcGN3Yml0cywgX3BkX3JlZywgX3BkX3NoaWZ0LAlcDQorCQkJX3R1bmVy X3JlZywgX3R1bmVyX2VuX3JlZywgX3R1bmVyX2VuX2JpdCwJXA0KKwkJCV9wY3dfcmVnLCBfcGN3 X3NoaWZ0KQkJCQlcDQorCQlQTEwoX2lkLCBfbmFtZSwgX3JlZywgX3B3cl9yZWcsIF9lbl9tYXNr LCBfZmxhZ3MsCVwNCisJCQlfcnN0X2Jhcl9tYXNrLCBfcGN3Yml0cywgX3BkX3JlZywgX3BkX3No aWZ0LAlcDQorCQkJX3R1bmVyX3JlZywgX3R1bmVyX2VuX3JlZywgX3R1bmVyX2VuX2JpdCwJXA0K KwkJCV9wY3dfcmVnLCBfcGN3X3NoaWZ0LCAwLCAwLCAwKQ0KKw0KK3N0YXRpYyBjb25zdCBzdHJ1 Y3QgbXRrX3BsbF9kYXRhIHBsbHNbXSA9IHsNCisJUExMX0IoQ0xLX0FQTUlYRURfTUFJTlBMTCwg Im1haW5wbGwiLCAweDAzNDAsIDB4MDM0YywgMHhmZjAwMDAwMSwNCisJCUhBVkVfUlNUX0JBUiwg QklUKDIzKSwgMjIsIDB4MDM0NCwgMjQsIDAsIDAsIDAsIDB4MDM0NCwgMCksDQorCVBMTF9CKENM S19BUE1JWEVEX1VOSVZQTEwsICJ1bml2cGxsIiwgMHgwMzA4LCAweDAzMTQsIDB4ZmYwMDAwMDEs DQorCQlIQVZFX1JTVF9CQVIsIEJJVCgyMyksIDIyLCAweDAzMGMsIDI0LCAwLCAwLCAwLCAweDAz MGMsIDApLA0KKwlQTEwoQ0xLX0FQTUlYRURfVVNCUExMLCAidXNicGxsIiwgMHgwM2M0LCAweDAz Y2MsIDB4MDAwMDAwMDAsDQorCQkwLCAwLCAyMiwgMHgwM2M0LCAyNCwgMCwgMCwgMCwgMHgwM2M0 LCAwLCAweDAzYzQsIDB4MDNjYywgMiksDQorCVBMTF9CKENMS19BUE1JWEVEX01TRENQTEwsICJt c2RjcGxsIiwgMHgwMzUwLCAweDAzNWMsIDB4MDAwMDAwMDEsDQorCQkwLCAwLCAyMiwgMHgwMzU0 LCAyNCwgMCwgMCwgMCwgMHgwMzU0LCAwKSwNCisJUExMX0IoQ0xLX0FQTUlYRURfTU1QTEwsICJt bXBsbCIsIDB4MDM2MCwgMHgwMzZjLCAweGZmMDAwMDAxLA0KKwkJSEFWRV9SU1RfQkFSLCBCSVQo MjMpLCAyMiwgMHgwMzY0LCAyNCwgMCwgMCwgMCwgMHgwMzY0LCAwKSwNCisJUExMX0IoQ0xLX0FQ TUlYRURfQURTUFBMTCwgImFkc3BwbGwiLCAweDAzNzAsIDB4MDM3YywgMHhmZjAwMDAwMSwNCisJ CUhBVkVfUlNUX0JBUiwgQklUKDIzKSwgMjIsIDB4MDM3NCwgMjQsIDAsIDAsIDAsIDB4MDM3NCwg MCksDQorCVBMTF9CKENMS19BUE1JWEVEX01GR1BMTCwgIm1mZ3BsbCIsIDB4MDI2OCwgMHgwMjc0 LCAweDAwMDAwMDAxLA0KKwkJMCwgMCwgMjIsIDB4MDI2YywgMjQsIDAsIDAsIDAsIDB4MDI2Yywg MCksDQorCVBMTF9CKENMS19BUE1JWEVEX1RWRFBMTCwgInR2ZHBsbCIsIDB4MDM4MCwgMHgwMzhj LCAweDAwMDAwMDAxLA0KKwkJMCwgMCwgMjIsIDB4MDM4NCwgMjQsIDAsIDAsIDAsIDB4MDM4NCwg MCksDQorCVBMTF9CKENMS19BUE1JWEVEX0FQTEwxLCAiYXBsbDEiLCAweDAzMTgsIDB4MDMyOCwg MHgwMDAwMDAwMSwNCisJCTAsIDAsIDMyLCAweDAzMWMsIDI0LCAweDAwNDAsIDB4MDAwYywgMCwg MHgwMzIwLCAwKSwNCisJUExMX0IoQ0xLX0FQTUlYRURfQVBMTDIsICJhcGxsMiIsIDB4MDMyYywg MHgwMzNjLCAweDAwMDAwMDAxLA0KKwkJMCwgMCwgMzIsIDB4MDMzMCwgMjQsIDAsIDAsIDAsIDB4 MDMzNCwgMCksDQorfTsNCisNCitzdGF0aWMgc3RydWN0IGNsa19vbmVjZWxsX2RhdGEgKnRvcF9j bGtfZGF0YTsNCisNCitzdGF0aWMgdm9pZCBjbGtfbXQ4MTkyX3RvcF9pbml0X2Vhcmx5KHN0cnVj dCBkZXZpY2Vfbm9kZSAqbm9kZSkNCit7DQorCWludCBpOw0KKw0KKwl0b3BfY2xrX2RhdGEgPSBt dGtfYWxsb2NfY2xrX2RhdGEoQ0xLX1RPUF9OUl9DTEspOw0KKw0KKwlmb3IgKGkgPSAwOyBpIDwg Q0xLX1RPUF9OUl9DTEs7IGkrKykNCisJCXRvcF9jbGtfZGF0YS0+Y2xrc1tpXSA9IEVSUl9QVFIo LUVQUk9CRV9ERUZFUik7DQorDQorCW10a19jbGtfcmVnaXN0ZXJfZmFjdG9ycyh0b3BfZWFybHlf ZGl2cywgQVJSQVlfU0laRSh0b3BfZWFybHlfZGl2cyksDQorCQkJdG9wX2Nsa19kYXRhKTsNCisN CisJb2ZfY2xrX2FkZF9wcm92aWRlcihub2RlLCBvZl9jbGtfc3JjX29uZWNlbGxfZ2V0LCB0b3Bf Y2xrX2RhdGEpOw0KK30NCisNCitDTEtfT0ZfREVDTEFSRV9EUklWRVIobXQ4MTkyX3RvcGNrZ2Vu LCAibWVkaWF0ZWssbXQ4MTkyLXRvcGNrZ2VuIiwNCisJCQljbGtfbXQ4MTkyX3RvcF9pbml0X2Vh cmx5KTsNCisNCitzdGF0aWMgaW50IGNsa19tdDgxOTJfdG9wX3Byb2JlKHN0cnVjdCBwbGF0Zm9y bV9kZXZpY2UgKnBkZXYpDQorew0KKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUgPSBwZGV2LT5k ZXYub2Zfbm9kZTsNCisJdm9pZCBfX2lvbWVtICpiYXNlOw0KKw0KKwliYXNlID0gZGV2bV9wbGF0 Zm9ybV9pb3JlbWFwX3Jlc291cmNlKHBkZXYsIDApOw0KKwlpZiAoSVNfRVJSKGJhc2UpKQ0KKwkJ cmV0dXJuIFBUUl9FUlIoYmFzZSk7DQorDQorCW10a19jbGtfcmVnaXN0ZXJfZml4ZWRfY2xrcyh0 b3BfZml4ZWRfY2xrcywgQVJSQVlfU0laRSh0b3BfZml4ZWRfY2xrcyksDQorCQkJdG9wX2Nsa19k YXRhKTsNCisJbXRrX2Nsa19yZWdpc3Rlcl9mYWN0b3JzKHRvcF9lYXJseV9kaXZzLCBBUlJBWV9T SVpFKHRvcF9lYXJseV9kaXZzKSwNCisJCQl0b3BfY2xrX2RhdGEpOw0KKwltdGtfY2xrX3JlZ2lz dGVyX2ZhY3RvcnModG9wX2RpdnMsIEFSUkFZX1NJWkUodG9wX2RpdnMpLCB0b3BfY2xrX2RhdGEp Ow0KKwltdGtfY2xrX3JlZ2lzdGVyX211eGVzKHRvcF9tdGtfbXV4ZXMsIEFSUkFZX1NJWkUodG9w X210a19tdXhlcyksIG5vZGUsDQorCQkJJm10ODE5Ml9jbGtfbG9jaywgdG9wX2Nsa19kYXRhKTsN CisNCisJbXRrX2Nsa19yZWdpc3Rlcl9jb21wb3NpdGVzKHRvcF9tdXhlcywgQVJSQVlfU0laRSh0 b3BfbXV4ZXMpLCBiYXNlLA0KKwkJCSZtdDgxOTJfY2xrX2xvY2ssIHRvcF9jbGtfZGF0YSk7DQor CW10a19jbGtfcmVnaXN0ZXJfY29tcG9zaXRlcyh0b3BfYWRqX2RpdnMsIEFSUkFZX1NJWkUodG9w X2Fkal9kaXZzKSwNCisJCQliYXNlLCAmbXQ4MTkyX2Nsa19sb2NrLCB0b3BfY2xrX2RhdGEpOw0K KwltdGtfY2xrX3JlZ2lzdGVyX2dhdGVzKG5vZGUsIHRvcF9jbGtzLCBBUlJBWV9TSVpFKHRvcF9j bGtzKSwNCisJCQl0b3BfY2xrX2RhdGEpOw0KKw0KKwlyZXR1cm4gb2ZfY2xrX2FkZF9wcm92aWRl cihub2RlLCBvZl9jbGtfc3JjX29uZWNlbGxfZ2V0LCB0b3BfY2xrX2RhdGEpOw0KK30NCisNCitz dGF0aWMgaW50IGNsa19tdDgxOTJfaW5mcmFfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAq cGRldikNCit7DQorCXN0cnVjdCBjbGtfb25lY2VsbF9kYXRhICpjbGtfZGF0YTsNCisJc3RydWN0 IGRldmljZV9ub2RlICpub2RlID0gcGRldi0+ZGV2Lm9mX25vZGU7DQorDQorCWNsa19kYXRhID0g bXRrX2FsbG9jX2Nsa19kYXRhKENMS19JTkZSQV9OUl9DTEspOw0KKw0KKwltdGtfY2xrX3JlZ2lz dGVyX2dhdGVzKG5vZGUsIGluZnJhX2Nsa3MsIEFSUkFZX1NJWkUoaW5mcmFfY2xrcyksDQorCQkJ Y2xrX2RhdGEpOw0KKw0KKwlyZXR1cm4gb2ZfY2xrX2FkZF9wcm92aWRlcihub2RlLCBvZl9jbGtf c3JjX29uZWNlbGxfZ2V0LCBjbGtfZGF0YSk7DQorfQ0KKw0KK3N0YXRpYyBpbnQgY2xrX210ODE5 Ml9wZXJpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpDQorew0KKwlzdHJ1Y3Qg Y2xrX29uZWNlbGxfZGF0YSAqY2xrX2RhdGE7DQorCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSA9 IHBkZXYtPmRldi5vZl9ub2RlOw0KKw0KKwljbGtfZGF0YSA9IG10a19hbGxvY19jbGtfZGF0YShD TEtfUEVSSV9OUl9DTEspOw0KKw0KKwltdGtfY2xrX3JlZ2lzdGVyX2dhdGVzKG5vZGUsIHBlcmlf Y2xrcywgQVJSQVlfU0laRShwZXJpX2Nsa3MpLA0KKwkJCWNsa19kYXRhKTsNCisNCisJcmV0dXJu IG9mX2Nsa19hZGRfcHJvdmlkZXIobm9kZSwgb2ZfY2xrX3NyY19vbmVjZWxsX2dldCwgY2xrX2Rh dGEpOw0KK30NCisNCitzdGF0aWMgaW50IGNsa19tdDgxOTJfYXBtaXhlZF9wcm9iZShzdHJ1Y3Qg cGxhdGZvcm1fZGV2aWNlICpwZGV2KQ0KK3sNCisJc3RydWN0IGNsa19vbmVjZWxsX2RhdGEgKmNs a19kYXRhOw0KKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsN CisNCisJY2xrX2RhdGEgPSBtdGtfYWxsb2NfY2xrX2RhdGEoQ0xLX0FQTUlYRURfTlJfQ0xLKTsN CisNCisJbXRrX2Nsa19yZWdpc3Rlcl9wbGxzKG5vZGUsIHBsbHMsIEFSUkFZX1NJWkUocGxscyks IGNsa19kYXRhKTsNCisJbXRrX2Nsa19yZWdpc3Rlcl9nYXRlcyhub2RlLCBhcG1peGVkX2Nsa3Ms IEFSUkFZX1NJWkUoYXBtaXhlZF9jbGtzKSwNCisJCQljbGtfZGF0YSk7DQorDQorCXJldHVybiBv Zl9jbGtfYWRkX3Byb3ZpZGVyKG5vZGUsIG9mX2Nsa19zcmNfb25lY2VsbF9nZXQsIGNsa19kYXRh KTsNCit9DQorDQorc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgb2ZfbWF0Y2hfY2xr X210ODE5MltdID0gew0KKwl7DQorCQkuY29tcGF0aWJsZSA9ICJtZWRpYXRlayxtdDgxOTItYXBt aXhlZHN5cyIsDQorCQkuZGF0YSA9IGNsa19tdDgxOTJfYXBtaXhlZF9wcm9iZSwNCisJfSwgew0K KwkJLmNvbXBhdGlibGUgPSAibWVkaWF0ZWssbXQ4MTkyLXRvcGNrZ2VuIiwNCisJCS5kYXRhID0g Y2xrX210ODE5Ml90b3BfcHJvYmUsDQorCX0sIHsNCisJCS5jb21wYXRpYmxlID0gIm1lZGlhdGVr LG10ODE5Mi1pbmZyYWNmZyIsDQorCQkuZGF0YSA9IGNsa19tdDgxOTJfaW5mcmFfcHJvYmUsDQor CX0sIHsNCisJCS5jb21wYXRpYmxlID0gIm1lZGlhdGVrLG10ODE5Mi1wZXJpY2ZnIiwNCisJCS5k YXRhID0gY2xrX210ODE5Ml9wZXJpX3Byb2JlLA0KKwl9LCB7DQorCQkvKiBzZW50aW5lbCAqLw0K Kwl9DQorfTsNCisNCitzdGF0aWMgaW50IGNsa19tdDgxOTJfcHJvYmUoc3RydWN0IHBsYXRmb3Jt X2RldmljZSAqcGRldikNCit7DQorCWludCAoKmNsa19wcm9iZSkoc3RydWN0IHBsYXRmb3JtX2Rl dmljZSAqcGRldik7DQorCWludCByOw0KKw0KKwljbGtfcHJvYmUgPSBvZl9kZXZpY2VfZ2V0X21h dGNoX2RhdGEoJnBkZXYtPmRldik7DQorCWlmICghY2xrX3Byb2JlKQ0KKwkJcmV0dXJuIC1FSU5W QUw7DQorDQorCXIgPSBjbGtfcHJvYmUocGRldik7DQorCWlmIChyKQ0KKwkJZGV2X2VycigmcGRl di0+ZGV2LA0KKwkJCSJjb3VsZCBub3QgcmVnaXN0ZXIgY2xvY2sgcHJvdmlkZXI6ICVzOiAlZFxu IiwNCisJCQlwZGV2LT5uYW1lLCByKTsNCisNCisJcmV0dXJuIHI7DQorfQ0KKw0KK3N0YXRpYyBz dHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGNsa19tdDgxOTJfZHJ2ID0gew0KKwkucHJvYmUgPSBjbGtf bXQ4MTkyX3Byb2JlLA0KKwkuZHJpdmVyID0gew0KKwkJLm5hbWUgPSAiY2xrLW10ODE5MiIsDQor CQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9jbGtfbXQ4MTkyLA0KKwl9LA0KK307DQorDQor c3RhdGljIGludCBfX2luaXQgY2xrX210ODE5Ml9pbml0KHZvaWQpDQorew0KKwlyZXR1cm4gcGxh dGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZjbGtfbXQ4MTkyX2Rydik7DQorfQ0KKw0KK2FyY2hfaW5p dGNhbGwoY2xrX210ODE5Ml9pbml0KTsNCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9tZWRpYXRl ay9jbGstbXV4LmggYi9kcml2ZXJzL2Nsay9tZWRpYXRlay9jbGstbXV4LmgNCmluZGV4IGY1NjI1 ZjQuLmFmYmM3ZGYgMTAwNjQ0DQotLS0gYS9kcml2ZXJzL2Nsay9tZWRpYXRlay9jbGstbXV4LmgN CisrKyBiL2RyaXZlcnMvY2xrL21lZGlhdGVrL2Nsay1tdXguaA0KQEAgLTc3LDYgKzc3LDIxIEBA IHN0cnVjdCBtdGtfbXV4IHsNCiAJCQlfd2lkdGgsIF9nYXRlLCBfdXBkX29mcywgX3VwZCwJCQlc DQogCQkJQ0xLX1NFVF9SQVRFX1BBUkVOVCkNCiANCisjZGVmaW5lIE1VWF9DTFJfU0VUX1VQRF9G TEFHUyhfaWQsIF9uYW1lLCBfcGFyZW50cywgX211eF9vZnMsCQlcDQorCQkJX211eF9zZXRfb2Zz LCBfbXV4X2Nscl9vZnMsIF9zaGlmdCwgX3dpZHRoLAlcDQorCQkJX3VwZF9vZnMsIF91cGQsIF9m bGFncykJCQkJXA0KKwkJR0FURV9DTFJfU0VUX1VQRF9GTEFHUyhfaWQsIF9uYW1lLCBfcGFyZW50 cywgX211eF9vZnMsCVwNCisJCQlfbXV4X3NldF9vZnMsIF9tdXhfY2xyX29mcywgX3NoaWZ0LCBf d2lkdGgsCVwNCisJCQkwLCBfdXBkX29mcywgX3VwZCwgX2ZsYWdzLAkJCVwNCisJCQltdGtfbXV4 X2Nscl9zZXRfdXBkX29wcykNCisNCisjZGVmaW5lIE1VWF9DTFJfU0VUX1VQRChfaWQsIF9uYW1l LCBfcGFyZW50cywgX211eF9vZnMsCQkJXA0KKwkJCV9tdXhfc2V0X29mcywgX211eF9jbHJfb2Zz LCBfc2hpZnQsIF93aWR0aCwJXA0KKwkJCV91cGRfb2ZzLCBfdXBkKQkJCQkJXA0KKwkJTVVYX0NM Ul9TRVRfVVBEX0ZMQUdTKF9pZCwgX25hbWUsIF9wYXJlbnRzLAkJXA0KKwkJCV9tdXhfb2ZzLCBf bXV4X3NldF9vZnMsIF9tdXhfY2xyX29mcywgX3NoaWZ0LAlcDQorCQkJX3dpZHRoLCBfdXBkX29m cywgX3VwZCwJQ0xLX1NFVF9SQVRFX1BBUkVOVCkNCisNCiBzdHJ1Y3QgY2xrICptdGtfY2xrX3Jl Z2lzdGVyX211eChjb25zdCBzdHJ1Y3QgbXRrX211eCAqbXV4LA0KIAkJCQkgc3RydWN0IHJlZ21h cCAqcmVnbWFwLA0KIAkJCQkgc3BpbmxvY2tfdCAqbG9jayk7DQotLSANCjEuOC4xLjEuZGlydHkN Cg== From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-13.0 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY, USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 212FBC433E2 for ; Wed, 22 Jul 2020 06:50:43 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id B445320657 for ; Wed, 22 Jul 2020 06:50:42 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="gOj/+qiP"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=mediatek.com header.i=@mediatek.com header.b="S/Q5kjwA" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org B445320657 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=mediatek.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-mediatek-bounces+linux-mediatek=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To:Message-ID:Date: Subject:To:From:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=j4NWexwT3OTIIcQudT3JnYk+D7oATC2kPgaVszMkPck=; b=gOj/+qiPJ7I8oeTnGxNBGdXJP gHElEdVpnw4Ir1o9JrJ2vZt3IWjY17wu1wJr81CrAJgtamFLKa3qpmSJOuX0P4dOhIg57WtFha83d rTTqwRCv25T57EYXbWxSzBfyUngUDfXQEm5vVtLlV751GJ4fkavO01VIN76V0YwQaTjH1ge4+16IX v1t8ukPhBtNMCr5xGnJ++RhnfjggfUBduFTLapRVQRJI5KY/BAgEIBMmTGh1xCGgzVOOA/mn75cLZ 3+nRs6pkv7MdKx3WGP6e8Q78Mn/C3F3mZuLaOaThw2gyJfHo+JCSBGySu6UlqLB/2aKm8n+iHxbCf YboQozOvg==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1jy8aC-0005j8-J0; Wed, 22 Jul 2020 06:50:28 +0000 Received: from mailgw01.mediatek.com ([216.200.240.184]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jy8a0-0005fL-98; Wed, 22 Jul 2020 06:50:20 +0000 X-UUID: d94bce02beb74e25beb64c975ad56bba-20200721 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Transfer-Encoding:Content-Type:MIME-Version:References:In-Reply-To:Message-ID:Date:Subject:CC:To:From; bh=XNoz/xHt880Hu0k/rHv10JQlmDwWKOoyQtsl8pNW760=; b=S/Q5kjwAEb/jvFcLbxz6NhTiG3FwDewn9m7RgGIHQRDgKeVVjyiFPOICkNOfQFXynqlhPM9xAOQm7WdVRKIj61A+NKNwpihoNNKRfn+dQJMBk51UEhsv9ZYiJhoEbwUmdFd1DXPygetRJFA2qfC+RZ8rakEFBfcVzlNI9ZDuV6U=; X-UUID: d94bce02beb74e25beb64c975ad56bba-20200721 Received: from mtkcas68.mediatek.inc [(172.29.94.19)] by mailgw01.mediatek.com (envelope-from ) (musrelay.mediatek.com ESMTP with TLS) with ESMTP id 1686747606; Tue, 21 Jul 2020 22:50:12 -0800 Received: from mtkmbs08n2.mediatek.inc (172.21.101.56) by MTKMBS62N1.mediatek.inc (172.29.193.41) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 21 Jul 2020 23:50:04 -0700 Received: from mtkcas07.mediatek.inc (172.21.101.84) by mtkmbs08n2.mediatek.inc (172.21.101.56) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Wed, 22 Jul 2020 14:50:02 +0800 Received: from mtksdccf07.mediatek.inc (172.21.84.99) by mtkcas07.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Wed, 22 Jul 2020 14:50:03 +0800 From: Weiyi Lu To: Matthias Brugger , Rob Herring , Stephen Boyd , Nicolas Boichat Subject: [PATCH 4/4] clk: mediatek: Add MT8192 clock support Date: Wed, 22 Jul 2020 14:50:01 +0800 Message-ID: <1595400601-26220-5-git-send-email-weiyi.lu@mediatek.com> X-Mailer: git-send-email 1.8.1.1.dirty In-Reply-To: <1595400601-26220-1-git-send-email-weiyi.lu@mediatek.com> References: <1595400601-26220-1-git-send-email-weiyi.lu@mediatek.com> MIME-Version: 1.0 X-TM-SNTS-SMTP: F8E7F4CD76DC7E91FC4014FDE279C4E70874FB47967BA901F08607644FF8D83F2000:8 X-MTK: N X-BeenThere: linux-mediatek@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: James Liao , Weiyi Lu , srv_heupstream@mediatek.com, linux-kernel@vger.kernel.org, linux-mediatek@lists.infradead.org, Wendell Lin , linux-clk@vger.kernel.org, linux-arm-kernel@lists.infradead.org Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "Linux-mediatek" Errors-To: linux-mediatek-bounces+linux-mediatek=archiver.kernel.org@lists.infradead.org Add MT8192 clock support, include topckgen, apmixedsys, infracfg, pericfg and subsystem clocks. Signed-off-by: Weiyi Lu --- drivers/clk/mediatek/Kconfig | 146 ++ drivers/clk/mediatek/Makefile | 24 + drivers/clk/mediatek/clk-mt8192-aud.c | 150 ++ drivers/clk/mediatek/clk-mt8192-cam.c | 69 + drivers/clk/mediatek/clk-mt8192-cam_rawa.c | 56 + drivers/clk/mediatek/clk-mt8192-cam_rawb.c | 56 + drivers/clk/mediatek/clk-mt8192-cam_rawc.c | 56 + drivers/clk/mediatek/clk-mt8192-img.c | 57 + drivers/clk/mediatek/clk-mt8192-img2.c | 59 + drivers/clk/mediatek/clk-mt8192-imp_iic_wrap_c.c | 61 + drivers/clk/mediatek/clk-mt8192-imp_iic_wrap_e.c | 55 + drivers/clk/mediatek/clk-mt8192-imp_iic_wrap_n.c | 57 + drivers/clk/mediatek/clk-mt8192-imp_iic_wrap_s.c | 59 + drivers/clk/mediatek/clk-mt8192-imp_iic_wrap_w.c | 55 + drivers/clk/mediatek/clk-mt8192-imp_iic_wrap_ws.c | 59 + drivers/clk/mediatek/clk-mt8192-ipe.c | 61 + drivers/clk/mediatek/clk-mt8192-mdp.c | 89 ++ drivers/clk/mediatek/clk-mt8192-mfg.c | 54 + drivers/clk/mediatek/clk-mt8192-mm.c | 108 ++ drivers/clk/mediatek/clk-mt8192-msdc.c | 54 + drivers/clk/mediatek/clk-mt8192-msdc_top.c | 83 ++ drivers/clk/mediatek/clk-mt8192-scp_adsp.c | 55 + drivers/clk/mediatek/clk-mt8192-vdec.c | 81 ++ drivers/clk/mediatek/clk-mt8192-vdec_soc.c | 86 ++ drivers/clk/mediatek/clk-mt8192-venc.c | 57 + drivers/clk/mediatek/clk-mt8192.c | 1549 +++++++++++++++++++++ drivers/clk/mediatek/clk-mux.h | 15 + 27 files changed, 3311 insertions(+) create mode 100644 drivers/clk/mediatek/clk-mt8192-aud.c create mode 100644 drivers/clk/mediatek/clk-mt8192-cam.c create mode 100644 drivers/clk/mediatek/clk-mt8192-cam_rawa.c create mode 100644 drivers/clk/mediatek/clk-mt8192-cam_rawb.c create mode 100644 drivers/clk/mediatek/clk-mt8192-cam_rawc.c create mode 100644 drivers/clk/mediatek/clk-mt8192-img.c create mode 100644 drivers/clk/mediatek/clk-mt8192-img2.c create mode 100644 drivers/clk/mediatek/clk-mt8192-imp_iic_wrap_c.c create mode 100644 drivers/clk/mediatek/clk-mt8192-imp_iic_wrap_e.c create mode 100644 drivers/clk/mediatek/clk-mt8192-imp_iic_wrap_n.c create mode 100644 drivers/clk/mediatek/clk-mt8192-imp_iic_wrap_s.c create mode 100644 drivers/clk/mediatek/clk-mt8192-imp_iic_wrap_w.c create mode 100644 drivers/clk/mediatek/clk-mt8192-imp_iic_wrap_ws.c create mode 100644 drivers/clk/mediatek/clk-mt8192-ipe.c create mode 100644 drivers/clk/mediatek/clk-mt8192-mdp.c create mode 100644 drivers/clk/mediatek/clk-mt8192-mfg.c create mode 100644 drivers/clk/mediatek/clk-mt8192-mm.c create mode 100644 drivers/clk/mediatek/clk-mt8192-msdc.c create mode 100644 drivers/clk/mediatek/clk-mt8192-msdc_top.c create mode 100644 drivers/clk/mediatek/clk-mt8192-scp_adsp.c create mode 100644 drivers/clk/mediatek/clk-mt8192-vdec.c create mode 100644 drivers/clk/mediatek/clk-mt8192-vdec_soc.c create mode 100644 drivers/clk/mediatek/clk-mt8192-venc.c create mode 100644 drivers/clk/mediatek/clk-mt8192.c diff --git a/drivers/clk/mediatek/Kconfig b/drivers/clk/mediatek/Kconfig index 89ceb2fb..c204829 100644 --- a/drivers/clk/mediatek/Kconfig +++ b/drivers/clk/mediatek/Kconfig @@ -441,6 +441,152 @@ config COMMON_CLK_MT8183_VENCSYS help This driver supports MediaTek MT8183 vencsys clocks. +config COMMON_CLK_MT8192 + bool "Clock driver for MediaTek MT8192" + depends on (ARCH_MEDIATEK && ARM64) || COMPILE_TEST + select COMMON_CLK_MEDIATEK + default ARCH_MEDIATEK && ARM64 + help + This driver supports MediaTek MT8192 basic clocks. + +config COMMON_CLK_MT8192_AUDSYS + bool "Clock driver for MediaTek MT8192 audsys" + depends on COMMON_CLK_MT8192 + help + This driver supports MediaTek MT8192 audsys clocks. + +config COMMON_CLK_MT8192_CAMSYS + bool "Clock driver for MediaTek MT8192 camsys" + depends on COMMON_CLK_MT8192 + help + This driver supports MediaTek MT8192 camsys clocks. + +config COMMON_CLK_MT8192_CAMSYS_RAWA + bool "Clock driver for MediaTek MT8192 camsys_rawa" + depends on COMMON_CLK_MT8192 + help + This driver supports MediaTek MT8192 camsys_rawa clocks. + +config COMMON_CLK_MT8192_CAMSYS_RAWB + bool "Clock driver for MediaTek MT8192 camsys_rawb" + depends on COMMON_CLK_MT8192 + help + This driver supports MediaTek MT8192 camsys_rawb clocks. + +config COMMON_CLK_MT8192_CAMSYS_RAWC + bool "Clock driver for MediaTek MT8192 camsys_rawc" + depends on COMMON_CLK_MT8192 + help + This driver supports MediaTek MT8192 camsys_rawc clocks. + +config COMMON_CLK_MT8192_IMGSYS + bool "Clock driver for MediaTek MT8192 imgsys" + depends on COMMON_CLK_MT8192 + help + This driver supports MediaTek MT8192 imgsys clocks. + +config COMMON_CLK_MT8192_IMGSYS2 + bool "Clock driver for MediaTek MT8192 imgsys2" + depends on COMMON_CLK_MT8192 + help + This driver supports MediaTek MT8192 imgsys2 clocks. + +config COMMON_CLK_MT8192_IMP_IIC_WRAP_C + bool "Clock driver for MediaTek MT8192 imp_iic_wrap_c" + depends on COMMON_CLK_MT8192 + help + This driver supports MediaTek MT8192 imp_iic_wrap_c clocks. + +config COMMON_CLK_MT8192_IMP_IIC_WRAP_E + bool "Clock driver for MediaTek MT8192 imp_iic_wrap_e" + depends on COMMON_CLK_MT8192 + help + This driver supports MediaTek MT8192 imp_iic_wrap_e clocks. + +config COMMON_CLK_MT8192_IMP_IIC_WRAP_N + bool "Clock driver for MediaTek MT8192 imp_iic_wrap_n" + depends on COMMON_CLK_MT8192 + help + This driver supports MediaTek MT8192 imp_iic_wrap_n clocks. + +config COMMON_CLK_MT8192_IMP_IIC_WRAP_S + bool "Clock driver for MediaTek MT8192 imp_iic_wrap_s" + depends on COMMON_CLK_MT8192 + help + This driver supports MediaTek MT8192 imp_iic_wrap_s clocks. + +config COMMON_CLK_MT8192_IMP_IIC_WRAP_W + bool "Clock driver for MediaTek MT8192 imp_iic_wrap_w" + depends on COMMON_CLK_MT8192 + help + This driver supports MediaTek MT8192 imp_iic_wrap_w clocks. + +config COMMON_CLK_MT8192_IMP_IIC_WRAP_WS + bool "Clock driver for MediaTek MT8192 imp_iic_wrap_ws" + depends on COMMON_CLK_MT8192 + help + This driver supports MediaTek MT8192 imp_iic_wrap_ws clocks. + +config COMMON_CLK_MT8192_IPESYS + bool "Clock driver for MediaTek MT8192 ipesys" + depends on COMMON_CLK_MT8192 + help + This driver supports MediaTek MT8192 ipesys clocks. + +config COMMON_CLK_MT8192_MDPSYS + bool "Clock driver for MediaTek MT8192 mdpsys" + depends on COMMON_CLK_MT8192 + help + This driver supports MediaTek MT8192 mdpsys clocks. + +config COMMON_CLK_MT8192_MFGCFG + bool "Clock driver for MediaTek MT8192 mfgcfg" + depends on COMMON_CLK_MT8192 + help + This driver supports MediaTek MT8192 mfgcfg clocks. + +config COMMON_CLK_MT8192_MMSYS + bool "Clock driver for MediaTek MT8192 mmsys" + depends on COMMON_CLK_MT8192 + help + This driver supports MediaTek MT8192 mmsys clocks. + +config COMMON_CLK_MT8192_MSDC_TOP + bool "Clock driver for MediaTek MT8192 msdc_top" + depends on COMMON_CLK_MT8192 + help + This driver supports MediaTek MT8192 msdc_top clocks. + +config COMMON_CLK_MT8192_MSDC + bool "Clock driver for MediaTek MT8192 msdc" + depends on COMMON_CLK_MT8192 + help + This driver supports MediaTek MT8192 msdc clocks. + +config COMMON_CLK_MT8192_SCP_ADSP + bool "Clock driver for MediaTek MT8192 scp_adsp" + depends on COMMON_CLK_MT8192 + help + This driver supports MediaTek MT8192 scp_adsp clocks. + +config COMMON_CLK_MT8192_VDECSYS + bool "Clock driver for MediaTek MT8192 vdecsys" + depends on COMMON_CLK_MT8192 + help + This driver supports MediaTek MT8192 vdecsys clocks. + +config COMMON_CLK_MT8192_VDECSYS_SOC + bool "Clock driver for MediaTek MT8192 vdecsys_soc" + depends on COMMON_CLK_MT8192 + help + This driver supports MediaTek MT8192 vdecsys_soc clocks. + +config COMMON_CLK_MT8192_VENCSYS + bool "Clock driver for MediaTek MT8192 vencsys" + depends on COMMON_CLK_MT8192 + help + This driver supports MediaTek MT8192 vencsys clocks. + config COMMON_CLK_MT8516 bool "Clock driver for MediaTek MT8516" depends on ARCH_MEDIATEK || COMPILE_TEST diff --git a/drivers/clk/mediatek/Makefile b/drivers/clk/mediatek/Makefile index 959b556..3e660ac 100644 --- a/drivers/clk/mediatek/Makefile +++ b/drivers/clk/mediatek/Makefile @@ -61,5 +61,29 @@ obj-$(CONFIG_COMMON_CLK_MT8183_MFGCFG) += clk-mt8183-mfgcfg.o obj-$(CONFIG_COMMON_CLK_MT8183_MMSYS) += clk-mt8183-mm.o obj-$(CONFIG_COMMON_CLK_MT8183_VDECSYS) += clk-mt8183-vdec.o obj-$(CONFIG_COMMON_CLK_MT8183_VENCSYS) += clk-mt8183-venc.o +obj-$(CONFIG_COMMON_CLK_MT8192) += clk-mt8192.o +obj-$(CONFIG_COMMON_CLK_MT8192_AUDSYS) += clk-mt8192-aud.o +obj-$(CONFIG_COMMON_CLK_MT8192_CAMSYS) += clk-mt8192-cam.o +obj-$(CONFIG_COMMON_CLK_MT8192_CAMSYS_RAWA) += clk-mt8192-cam_rawa.o +obj-$(CONFIG_COMMON_CLK_MT8192_CAMSYS_RAWB) += clk-mt8192-cam_rawb.o +obj-$(CONFIG_COMMON_CLK_MT8192_CAMSYS_RAWC) += clk-mt8192-cam_rawc.o +obj-$(CONFIG_COMMON_CLK_MT8192_IMGSYS) += clk-mt8192-img.o +obj-$(CONFIG_COMMON_CLK_MT8192_IMGSYS2) += clk-mt8192-img2.o +obj-$(CONFIG_COMMON_CLK_MT8192_IMP_IIC_WRAP_C) += clk-mt8192-imp_iic_wrap_c.o +obj-$(CONFIG_COMMON_CLK_MT8192_IMP_IIC_WRAP_E) += clk-mt8192-imp_iic_wrap_e.o +obj-$(CONFIG_COMMON_CLK_MT8192_IMP_IIC_WRAP_N) += clk-mt8192-imp_iic_wrap_n.o +obj-$(CONFIG_COMMON_CLK_MT8192_IMP_IIC_WRAP_S) += clk-mt8192-imp_iic_wrap_s.o +obj-$(CONFIG_COMMON_CLK_MT8192_IMP_IIC_WRAP_W) += clk-mt8192-imp_iic_wrap_w.o +obj-$(CONFIG_COMMON_CLK_MT8192_IMP_IIC_WRAP_WS) += clk-mt8192-imp_iic_wrap_ws.o +obj-$(CONFIG_COMMON_CLK_MT8192_IPESYS) += clk-mt8192-ipe.o +obj-$(CONFIG_COMMON_CLK_MT8192_MDPSYS) += clk-mt8192-mdp.o +obj-$(CONFIG_COMMON_CLK_MT8192_MFGCFG) += clk-mt8192-mfg.o +obj-$(CONFIG_COMMON_CLK_MT8192_MMSYS) += clk-mt8192-mm.o +obj-$(CONFIG_COMMON_CLK_MT8192_MSDC_TOP) += clk-mt8192-msdc_top.o +obj-$(CONFIG_COMMON_CLK_MT8192_MSDC) += clk-mt8192-msdc.o +obj-$(CONFIG_COMMON_CLK_MT8192_SCP_ADSP) += clk-mt8192-scp_adsp.o +obj-$(CONFIG_COMMON_CLK_MT8192_VDECSYS) += clk-mt8192-vdec.o +obj-$(CONFIG_COMMON_CLK_MT8192_VDECSYS_SOC) += clk-mt8192-vdec_soc.o +obj-$(CONFIG_COMMON_CLK_MT8192_VENCSYS) += clk-mt8192-venc.o obj-$(CONFIG_COMMON_CLK_MT8516) += clk-mt8516.o obj-$(CONFIG_COMMON_CLK_MT8516_AUDSYS) += clk-mt8516-aud.o diff --git a/drivers/clk/mediatek/clk-mt8192-aud.c b/drivers/clk/mediatek/clk-mt8192-aud.c new file mode 100644 index 0000000..36bf919 --- /dev/null +++ b/drivers/clk/mediatek/clk-mt8192-aud.c @@ -0,0 +1,150 @@ +// SPDX-License-Identifier: GPL-2.0 +// +// Copyright (c) 2020 MediaTek Inc. +// Author: Weiyi Lu + +#include +#include +#include + +#include "clk-mtk.h" +#include "clk-gate.h" + +#include + +static const struct mtk_gate_regs aud0_cg_regs = { + .set_ofs = 0x0, + .clr_ofs = 0x0, + .sta_ofs = 0x0, +}; + +static const struct mtk_gate_regs aud1_cg_regs = { + .set_ofs = 0x4, + .clr_ofs = 0x4, + .sta_ofs = 0x4, +}; + +static const struct mtk_gate_regs aud2_cg_regs = { + .set_ofs = 0x8, + .clr_ofs = 0x8, + .sta_ofs = 0x8, +}; + +#define GATE_AUD0(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &aud0_cg_regs, _shift, \ + &mtk_clk_gate_ops_no_setclr) + +#define GATE_AUD1(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &aud1_cg_regs, _shift, \ + &mtk_clk_gate_ops_no_setclr) + +#define GATE_AUD2(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &aud2_cg_regs, _shift, \ + &mtk_clk_gate_ops_no_setclr) + +static const struct mtk_gate aud_clks[] = { + /* AUD0 */ + GATE_AUD0(CLK_AUD_AFE, "aud_afe", "audio_sel", + 2), + GATE_AUD0(CLK_AUD_22M, "aud_22m", "aud_engen1_sel", + 8), + GATE_AUD0(CLK_AUD_24M, "aud_24m", "aud_engen2_sel", + 9), + GATE_AUD0(CLK_AUD_APLL2_TUNER, "aud_apll2_tuner", "aud_engen2_sel", + 18), + GATE_AUD0(CLK_AUD_APLL_TUNER, "aud_apll_tuner", "aud_engen1_sel", + 19), + GATE_AUD0(CLK_AUD_TDM, "aud_tdm", "aud_1_sel", + 20), + GATE_AUD0(CLK_AUD_ADC, "aud_adc", "audio_sel", + 24), + GATE_AUD0(CLK_AUD_DAC, "aud_dac", "audio_sel", + 25), + GATE_AUD0(CLK_AUD_DAC_PREDIS, "aud_dac_predis", "audio_sel", + 26), + GATE_AUD0(CLK_AUD_TML, "aud_tml", "audio_sel", + 27), + GATE_AUD0(CLK_AUD_NLE, "aud_nle", "audio_sel", + 28), + /* AUD1 */ + GATE_AUD1(CLK_AUD_I2S1_B, "aud_i2s1_b", "audio_sel", + 4), + GATE_AUD1(CLK_AUD_I2S2_B, "aud_i2s2_b", "audio_sel", + 5), + GATE_AUD1(CLK_AUD_I2S3_B, "aud_i2s3_b", "audio_sel", + 6), + GATE_AUD1(CLK_AUD_I2S4_B, "aud_i2s4_b", "audio_sel", + 7), + GATE_AUD1(CLK_AUD_CONNSYS_I2S_ASRC, "aud_connsys_i2s_asrc", "audio_sel", + 12), + GATE_AUD1(CLK_AUD_GENERAL1_ASRC, "aud_general1_asrc", "audio_sel", + 13), + GATE_AUD1(CLK_AUD_GENERAL2_ASRC, "aud_general2_asrc", "audio_sel", + 14), + GATE_AUD1(CLK_AUD_DAC_HIRES, "aud_dac_hires", "audio_h_sel", + 15), + GATE_AUD1(CLK_AUD_ADC_HIRES, "aud_adc_hires", "audio_h_sel", + 16), + GATE_AUD1(CLK_AUD_ADC_HIRES_TML, "aud_adc_hires_tml", "audio_h_sel", + 17), + GATE_AUD1(CLK_AUD_ADDA6_ADC, "aud_adda6_adc", "audio_sel", + 20), + GATE_AUD1(CLK_AUD_ADDA6_ADC_HIRES, "aud_adda6_adc_hires", "audio_h_sel", + 21), + GATE_AUD1(CLK_AUD_3RD_DAC, "aud_3rd_dac", "audio_sel", + 28), + GATE_AUD1(CLK_AUD_3RD_DAC_PREDIS, "aud_3rd_dac_predis", "audio_sel", + 29), + GATE_AUD1(CLK_AUD_3RD_DAC_TML, "aud_3rd_dac_tml", "audio_sel", + 30), + GATE_AUD1(CLK_AUD_3RD_DAC_HIRES, "aud_3rd_dac_hires", "audio_h_sel", + 31), + /* AUD2 */ + GATE_AUD2(CLK_AUD_I2S5_B, "aud_i2s5_b", "audio_sel", + 0), + GATE_AUD2(CLK_AUD_I2S6_B, "aud_i2s6_b", "audio_sel", + 1), + GATE_AUD2(CLK_AUD_I2S7_B, "aud_i2s7_b", "audio_sel", + 2), + GATE_AUD2(CLK_AUD_I2S8_B, "aud_i2s8_b", "audio_sel", + 3), + GATE_AUD2(CLK_AUD_I2S9_B, "aud_i2s9_b", "audio_sel", + 4), +}; + +static int clk_mt8192_aud_probe(struct platform_device *pdev) +{ + struct clk_onecell_data *clk_data; + struct device_node *node = pdev->dev.of_node; + int r; + + clk_data = mtk_alloc_clk_data(CLK_AUD_NR_CLK); + + mtk_clk_register_gates(node, aud_clks, ARRAY_SIZE(aud_clks), + clk_data); + + r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data); + if (r) + return r; + + r = devm_of_platform_populate(&pdev->dev); + if (r) + of_clk_del_provider(node); + + return r; +} + +static const struct of_device_id of_match_clk_mt8192_aud[] = { + { .compatible = "mediatek,mt8192-audsys", }, + {} +}; + +static struct platform_driver clk_mt8192_aud_drv = { + .probe = clk_mt8192_aud_probe, + .driver = { + .name = "clk-mt8192-aud", + .of_match_table = of_match_clk_mt8192_aud, + }, +}; + +builtin_platform_driver(clk_mt8192_aud_drv); diff --git a/drivers/clk/mediatek/clk-mt8192-cam.c b/drivers/clk/mediatek/clk-mt8192-cam.c new file mode 100644 index 0000000..309625b --- /dev/null +++ b/drivers/clk/mediatek/clk-mt8192-cam.c @@ -0,0 +1,69 @@ +// SPDX-License-Identifier: GPL-2.0 +// +// Copyright (c) 2020 MediaTek Inc. +// Author: Weiyi Lu + +#include +#include + +#include "clk-mtk.h" +#include "clk-gate.h" + +#include + +static const struct mtk_gate_regs cam_cg_regs = { + .set_ofs = 0x4, + .clr_ofs = 0x8, + .sta_ofs = 0x0, +}; + +#define GATE_CAM(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &cam_cg_regs, _shift, \ + &mtk_clk_gate_ops_setclr) + +static const struct mtk_gate cam_clks[] = { + GATE_CAM(CLK_CAM_LARB13, "cam_larb13", "cam_sel", 0), + GATE_CAM(CLK_CAM_DFP_VAD, "cam_dfp_vad", "cam_sel", 1), + GATE_CAM(CLK_CAM_LARB14, "cam_larb14", "cam_sel", 2), + GATE_CAM(CLK_CAM_CAM, "cam_cam", "cam_sel", 6), + GATE_CAM(CLK_CAM_CAMTG, "cam_camtg", "cam_sel", 7), + GATE_CAM(CLK_CAM_SENINF, "cam_seninf", "cam_sel", 8), + GATE_CAM(CLK_CAM_CAMSV0, "cam_camsv0", "cam_sel", 9), + GATE_CAM(CLK_CAM_CAMSV1, "cam_camsv1", "cam_sel", 10), + GATE_CAM(CLK_CAM_CAMSV2, "cam_camsv2", "cam_sel", 11), + GATE_CAM(CLK_CAM_CAMSV3, "cam_camsv3", "cam_sel", 12), + GATE_CAM(CLK_CAM_CCU0, "cam_ccu0", "cam_sel", 13), + GATE_CAM(CLK_CAM_CCU1, "cam_ccu1", "cam_sel", 14), + GATE_CAM(CLK_CAM_MRAW0, "cam_mraw0", "cam_sel", 15), + GATE_CAM(CLK_CAM_FAKE_ENG, "cam_fake_eng", "cam_sel", 17), + GATE_CAM(CLK_CAM_CCU_GALS, "cam_ccu_gals", "cam_sel", 18), + GATE_CAM(CLK_CAM_CAM2MM_GALS, "cam2mm_gals", "cam_sel", 19), +}; + +static int clk_mt8192_cam_probe(struct platform_device *pdev) +{ + struct clk_onecell_data *clk_data; + struct device_node *node = pdev->dev.of_node; + + clk_data = mtk_alloc_clk_data(CLK_CAM_NR_CLK); + + mtk_clk_register_gates(node, cam_clks, ARRAY_SIZE(cam_clks), + clk_data); + + return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data); +} + +static const struct of_device_id of_match_clk_mt8192_cam[] = { + { .compatible = "mediatek,mt8192-camsys", }, + {} +}; + +static struct platform_driver clk_mt8192_cam_drv = { + .probe = clk_mt8192_cam_probe, + .driver = { + .name = "clk-mt8192-cam", + .of_match_table = of_match_clk_mt8192_cam, + }, +}; + +builtin_platform_driver(clk_mt8192_cam_drv); diff --git a/drivers/clk/mediatek/clk-mt8192-cam_rawa.c b/drivers/clk/mediatek/clk-mt8192-cam_rawa.c new file mode 100644 index 0000000..cb1911a --- /dev/null +++ b/drivers/clk/mediatek/clk-mt8192-cam_rawa.c @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: GPL-2.0 +// +// Copyright (c) 2020 MediaTek Inc. +// Author: Weiyi Lu + +#include +#include + +#include "clk-mtk.h" +#include "clk-gate.h" + +#include + +static const struct mtk_gate_regs cam_rawa_cg_regs = { + .set_ofs = 0x4, + .clr_ofs = 0x8, + .sta_ofs = 0x0, +}; + +#define GATE_CAM_RAWA(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &cam_rawa_cg_regs, _shift, \ + &mtk_clk_gate_ops_setclr) + +static const struct mtk_gate cam_rawa_clks[] = { + GATE_CAM_RAWA(CLK_CAM_RAWA_LARBX, "cam_rawa_larbx", "cam_sel", 0), + GATE_CAM_RAWA(CLK_CAM_RAWA_CAM, "cam_rawa_cam", "cam_sel", 1), + GATE_CAM_RAWA(CLK_CAM_RAWA_CAMTG, "cam_rawa_camtg", "cam_sel", 2), +}; + +static int clk_mt8192_cam_rawa_probe(struct platform_device *pdev) +{ + struct clk_onecell_data *clk_data; + struct device_node *node = pdev->dev.of_node; + + clk_data = mtk_alloc_clk_data(CLK_CAM_RAWA_NR_CLK); + + mtk_clk_register_gates(node, cam_rawa_clks, ARRAY_SIZE(cam_rawa_clks), + clk_data); + + return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data); +} + +static const struct of_device_id of_match_clk_mt8192_cam_rawa[] = { + { .compatible = "mediatek,mt8192-camsys_rawa", }, + {} +}; + +static struct platform_driver clk_mt8192_cam_rawa_drv = { + .probe = clk_mt8192_cam_rawa_probe, + .driver = { + .name = "clk-mt8192-cam_rawa", + .of_match_table = of_match_clk_mt8192_cam_rawa, + }, +}; + +builtin_platform_driver(clk_mt8192_cam_rawa_drv); diff --git a/drivers/clk/mediatek/clk-mt8192-cam_rawb.c b/drivers/clk/mediatek/clk-mt8192-cam_rawb.c new file mode 100644 index 0000000..7fcc33f --- /dev/null +++ b/drivers/clk/mediatek/clk-mt8192-cam_rawb.c @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: GPL-2.0 +// +// Copyright (c) 2020 MediaTek Inc. +// Author: Weiyi Lu + +#include +#include + +#include "clk-mtk.h" +#include "clk-gate.h" + +#include + +static const struct mtk_gate_regs cam_rawb_cg_regs = { + .set_ofs = 0x4, + .clr_ofs = 0x8, + .sta_ofs = 0x0, +}; + +#define GATE_CAM_RAWB(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &cam_rawb_cg_regs, _shift, \ + &mtk_clk_gate_ops_setclr) + +static const struct mtk_gate cam_rawb_clks[] = { + GATE_CAM_RAWB(CLK_CAM_RAWB_LARBX, "cam_rawb_larbx", "cam_sel", 0), + GATE_CAM_RAWB(CLK_CAM_RAWB_CAM, "cam_rawb_cam", "cam_sel", 1), + GATE_CAM_RAWB(CLK_CAM_RAWB_CAMTG, "cam_rawb_camtg", "cam_sel", 2), +}; + +static int clk_mt8192_cam_rawb_probe(struct platform_device *pdev) +{ + struct clk_onecell_data *clk_data; + struct device_node *node = pdev->dev.of_node; + + clk_data = mtk_alloc_clk_data(CLK_CAM_RAWB_NR_CLK); + + mtk_clk_register_gates(node, cam_rawb_clks, ARRAY_SIZE(cam_rawb_clks), + clk_data); + + return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data); +} + +static const struct of_device_id of_match_clk_mt8192_cam_rawb[] = { + { .compatible = "mediatek,mt8192-camsys_rawb", }, + {} +}; + +static struct platform_driver clk_mt8192_cam_rawb_drv = { + .probe = clk_mt8192_cam_rawb_probe, + .driver = { + .name = "clk-mt8192-cam_rawb", + .of_match_table = of_match_clk_mt8192_cam_rawb, + }, +}; + +builtin_platform_driver(clk_mt8192_cam_rawb_drv); diff --git a/drivers/clk/mediatek/clk-mt8192-cam_rawc.c b/drivers/clk/mediatek/clk-mt8192-cam_rawc.c new file mode 100644 index 0000000..bc2aa54 --- /dev/null +++ b/drivers/clk/mediatek/clk-mt8192-cam_rawc.c @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: GPL-2.0 +// +// Copyright (c) 2020 MediaTek Inc. +// Author: Weiyi Lu + +#include +#include + +#include "clk-mtk.h" +#include "clk-gate.h" + +#include + +static const struct mtk_gate_regs cam_rawc_cg_regs = { + .set_ofs = 0x4, + .clr_ofs = 0x8, + .sta_ofs = 0x0, +}; + +#define GATE_CAM_RAWC(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &cam_rawc_cg_regs, _shift, \ + &mtk_clk_gate_ops_setclr) + +static const struct mtk_gate cam_rawc_clks[] = { + GATE_CAM_RAWC(CLK_CAM_RAWC_LARBX, "cam_rawc_larbx", "cam_sel", 0), + GATE_CAM_RAWC(CLK_CAM_RAWC_CAM, "cam_rawc_cam", "cam_sel", 1), + GATE_CAM_RAWC(CLK_CAM_RAWC_CAMTG, "cam_rawc_camtg", "cam_sel", 2), +}; + +static int clk_mt8192_cam_rawc_probe(struct platform_device *pdev) +{ + struct clk_onecell_data *clk_data; + struct device_node *node = pdev->dev.of_node; + + clk_data = mtk_alloc_clk_data(CLK_CAM_RAWC_NR_CLK); + + mtk_clk_register_gates(node, cam_rawc_clks, ARRAY_SIZE(cam_rawc_clks), + clk_data); + + return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data); +} + +static const struct of_device_id of_match_clk_mt8192_cam_rawc[] = { + { .compatible = "mediatek,mt8192-camsys_rawc", }, + {} +}; + +static struct platform_driver clk_mt8192_cam_rawc_drv = { + .probe = clk_mt8192_cam_rawc_probe, + .driver = { + .name = "clk-mt8192-cam_rawc", + .of_match_table = of_match_clk_mt8192_cam_rawc, + }, +}; + +builtin_platform_driver(clk_mt8192_cam_rawc_drv); diff --git a/drivers/clk/mediatek/clk-mt8192-img.c b/drivers/clk/mediatek/clk-mt8192-img.c new file mode 100644 index 0000000..9fa0f47 --- /dev/null +++ b/drivers/clk/mediatek/clk-mt8192-img.c @@ -0,0 +1,57 @@ +// SPDX-License-Identifier: GPL-2.0 +// +// Copyright (c) 2020 MediaTek Inc. +// Author: Weiyi Lu + +#include +#include + +#include "clk-mtk.h" +#include "clk-gate.h" + +#include + +static const struct mtk_gate_regs img_cg_regs = { + .set_ofs = 0x4, + .clr_ofs = 0x8, + .sta_ofs = 0x0, +}; + +#define GATE_IMG(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &img_cg_regs, _shift, \ + &mtk_clk_gate_ops_setclr) + +static const struct mtk_gate img_clks[] = { + GATE_IMG(CLK_IMG_LARB9, "img_larb9", "img1_sel", 0), + GATE_IMG(CLK_IMG_LARB10, "img_larb10", "img1_sel", 1), + GATE_IMG(CLK_IMG_DIP, "img_dip", "img1_sel", 2), + GATE_IMG(CLK_IMG_GALS, "img_gals", "img1_sel", 12), +}; + +static int clk_mt8192_img_probe(struct platform_device *pdev) +{ + struct clk_onecell_data *clk_data; + struct device_node *node = pdev->dev.of_node; + + clk_data = mtk_alloc_clk_data(CLK_IMG_NR_CLK); + + mtk_clk_register_gates(node, img_clks, ARRAY_SIZE(img_clks), + clk_data); + + return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data); +} + +static const struct of_device_id of_match_clk_mt8192_img[] = { + { .compatible = "mediatek,mt8192-imgsys", }, + {} +}; + +static struct platform_driver clk_mt8192_img_drv = { + .probe = clk_mt8192_img_probe, + .driver = { + .name = "clk-mt8192-img", + .of_match_table = of_match_clk_mt8192_img, + }, +}; + +builtin_platform_driver(clk_mt8192_img_drv); diff --git a/drivers/clk/mediatek/clk-mt8192-img2.c b/drivers/clk/mediatek/clk-mt8192-img2.c new file mode 100644 index 0000000..42925cc --- /dev/null +++ b/drivers/clk/mediatek/clk-mt8192-img2.c @@ -0,0 +1,59 @@ +// SPDX-License-Identifier: GPL-2.0 +// +// Copyright (c) 2020 MediaTek Inc. +// Author: Weiyi Lu + +#include +#include + +#include "clk-mtk.h" +#include "clk-gate.h" + +#include + +static const struct mtk_gate_regs img2_cg_regs = { + .set_ofs = 0x4, + .clr_ofs = 0x8, + .sta_ofs = 0x0, +}; + +#define GATE_IMG2(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &img2_cg_regs, _shift, \ + &mtk_clk_gate_ops_setclr) + +static const struct mtk_gate img2_clks[] = { + GATE_IMG2(CLK_IMG2_LARB11, "img2_larb11", "img1_sel", 0), + GATE_IMG2(CLK_IMG2_LARB12, "img2_larb12", "img1_sel", 1), + GATE_IMG2(CLK_IMG2_MFB, "img2_mfb", "img1_sel", 6), + GATE_IMG2(CLK_IMG2_WPE, "img2_wpe", "img1_sel", 7), + GATE_IMG2(CLK_IMG2_MSS, "img2_mss", "img1_sel", 8), + GATE_IMG2(CLK_IMG2_GALS, "img2_gals", "img1_sel", 12), +}; + +static int clk_mt8192_img2_probe(struct platform_device *pdev) +{ + struct clk_onecell_data *clk_data; + struct device_node *node = pdev->dev.of_node; + + clk_data = mtk_alloc_clk_data(CLK_IMG2_NR_CLK); + + mtk_clk_register_gates(node, img2_clks, ARRAY_SIZE(img2_clks), + clk_data); + + return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data); +} + +static const struct of_device_id of_match_clk_mt8192_img2[] = { + { .compatible = "mediatek,mt8192-imgsys2", }, + {} +}; + +static struct platform_driver clk_mt8192_img2_drv = { + .probe = clk_mt8192_img2_probe, + .driver = { + .name = "clk-mt8192-img2", + .of_match_table = of_match_clk_mt8192_img2, + }, +}; + +builtin_platform_driver(clk_mt8192_img2_drv); diff --git a/drivers/clk/mediatek/clk-mt8192-imp_iic_wrap_c.c b/drivers/clk/mediatek/clk-mt8192-imp_iic_wrap_c.c new file mode 100644 index 0000000..88d8d12 --- /dev/null +++ b/drivers/clk/mediatek/clk-mt8192-imp_iic_wrap_c.c @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: GPL-2.0 +// +// Copyright (c) 2020 MediaTek Inc. +// Author: Weiyi Lu + +#include +#include + +#include "clk-mtk.h" +#include "clk-gate.h" + +#include + +static const struct mtk_gate_regs imp_iic_wrap_c_cg_regs = { + .set_ofs = 0xe08, + .clr_ofs = 0xe04, + .sta_ofs = 0xe00, +}; + +#define GATE_IMP_IIC_WRAP_C(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &imp_iic_wrap_c_cg_regs, _shift, \ + &mtk_clk_gate_ops_setclr) + +static const struct mtk_gate imp_iic_wrap_c_clks[] = { + GATE_IMP_IIC_WRAP_C(CLK_IMP_IIC_WRAP_C_I2C10, "imp_iic_wrap_c_i2c10", + "infra_i2c0", 0), + GATE_IMP_IIC_WRAP_C(CLK_IMP_IIC_WRAP_C_I2C11, "imp_iic_wrap_c_i2c11", + "infra_i2c0", 1), + GATE_IMP_IIC_WRAP_C(CLK_IMP_IIC_WRAP_C_I2C12, "imp_iic_wrap_c_i2c12", + "infra_i2c0", 2), + GATE_IMP_IIC_WRAP_C(CLK_IMP_IIC_WRAP_C_I2C13, "imp_iic_wrap_c_i2c13", + "infra_i2c0", 3), +}; + +static int clk_mt8192_imp_iic_wrap_c_probe(struct platform_device *pdev) +{ + struct clk_onecell_data *clk_data; + struct device_node *node = pdev->dev.of_node; + + clk_data = mtk_alloc_clk_data(CLK_IMP_IIC_WRAP_C_NR_CLK); + + mtk_clk_register_gates(node, imp_iic_wrap_c_clks, + ARRAY_SIZE(imp_iic_wrap_c_clks), clk_data); + + return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data); +} + +static const struct of_device_id of_match_clk_mt8192_imp_iic_wrap_c[] = { + { .compatible = "mediatek,mt8192-imp_iic_wrap_c", }, + {} +}; + +static struct platform_driver clk_mt8192_imp_iic_wrap_c_drv = { + .probe = clk_mt8192_imp_iic_wrap_c_probe, + .driver = { + .name = "clk-mt8192-imp_iic_wrap_c", + .of_match_table = of_match_clk_mt8192_imp_iic_wrap_c, + }, +}; + +builtin_platform_driver(clk_mt8192_imp_iic_wrap_c_drv); diff --git a/drivers/clk/mediatek/clk-mt8192-imp_iic_wrap_e.c b/drivers/clk/mediatek/clk-mt8192-imp_iic_wrap_e.c new file mode 100644 index 0000000..fc14013 --- /dev/null +++ b/drivers/clk/mediatek/clk-mt8192-imp_iic_wrap_e.c @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: GPL-2.0 +// +// Copyright (c) 2020 MediaTek Inc. +// Author: Weiyi Lu + +#include +#include + +#include "clk-mtk.h" +#include "clk-gate.h" + +#include + +static const struct mtk_gate_regs imp_iic_wrap_e_cg_regs = { + .set_ofs = 0xe08, + .clr_ofs = 0xe04, + .sta_ofs = 0xe00, +}; + +#define GATE_IMP_IIC_WRAP_E(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &imp_iic_wrap_e_cg_regs, _shift, \ + &mtk_clk_gate_ops_setclr) + +static const struct mtk_gate imp_iic_wrap_e_clks[] = { + GATE_IMP_IIC_WRAP_E(CLK_IMP_IIC_WRAP_E_I2C3, "imp_iic_wrap_e_i2c3", + "infra_i2c0", 0), +}; + +static int clk_mt8192_imp_iic_wrap_e_probe(struct platform_device *pdev) +{ + struct clk_onecell_data *clk_data; + struct device_node *node = pdev->dev.of_node; + + clk_data = mtk_alloc_clk_data(CLK_IMP_IIC_WRAP_E_NR_CLK); + + mtk_clk_register_gates(node, imp_iic_wrap_e_clks, + ARRAY_SIZE(imp_iic_wrap_e_clks), clk_data); + + return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data); +} + +static const struct of_device_id of_match_clk_mt8192_imp_iic_wrap_e[] = { + { .compatible = "mediatek,mt8192-imp_iic_wrap_e", }, + {} +}; + +static struct platform_driver clk_mt8192_imp_iic_wrap_e_drv = { + .probe = clk_mt8192_imp_iic_wrap_e_probe, + .driver = { + .name = "clk-mt8192-imp_iic_wrap_e", + .of_match_table = of_match_clk_mt8192_imp_iic_wrap_e, + }, +}; + +builtin_platform_driver(clk_mt8192_imp_iic_wrap_e_drv); diff --git a/drivers/clk/mediatek/clk-mt8192-imp_iic_wrap_n.c b/drivers/clk/mediatek/clk-mt8192-imp_iic_wrap_n.c new file mode 100644 index 0000000..525e43d --- /dev/null +++ b/drivers/clk/mediatek/clk-mt8192-imp_iic_wrap_n.c @@ -0,0 +1,57 @@ +// SPDX-License-Identifier: GPL-2.0 +// +// Copyright (c) 2020 MediaTek Inc. +// Author: Weiyi Lu + +#include +#include + +#include "clk-mtk.h" +#include "clk-gate.h" + +#include + +static const struct mtk_gate_regs imp_iic_wrap_n_cg_regs = { + .set_ofs = 0xe08, + .clr_ofs = 0xe04, + .sta_ofs = 0xe00, +}; + +#define GATE_IMP_IIC_WRAP_N(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &imp_iic_wrap_n_cg_regs, _shift, \ + &mtk_clk_gate_ops_setclr) + +static const struct mtk_gate imp_iic_wrap_n_clks[] = { + GATE_IMP_IIC_WRAP_N(CLK_IMP_IIC_WRAP_N_I2C0, "imp_iic_wrap_n_i2c0", + "infra_i2c0", 0), + GATE_IMP_IIC_WRAP_N(CLK_IMP_IIC_WRAP_N_I2C6, "imp_iic_wrap_n_i2c6", + "infra_i2c0", 1), +}; + +static int clk_mt8192_imp_iic_wrap_n_probe(struct platform_device *pdev) +{ + struct clk_onecell_data *clk_data; + struct device_node *node = pdev->dev.of_node; + + clk_data = mtk_alloc_clk_data(CLK_IMP_IIC_WRAP_N_NR_CLK); + + mtk_clk_register_gates(node, imp_iic_wrap_n_clks, + ARRAY_SIZE(imp_iic_wrap_n_clks), clk_data); + + return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data); +} + +static const struct of_device_id of_match_clk_mt8192_imp_iic_wrap_n[] = { + { .compatible = "mediatek,mt8192-imp_iic_wrap_n", }, + {} +}; + +static struct platform_driver clk_mt8192_imp_iic_wrap_n_drv = { + .probe = clk_mt8192_imp_iic_wrap_n_probe, + .driver = { + .name = "clk-mt8192-imp_iic_wrap_n", + .of_match_table = of_match_clk_mt8192_imp_iic_wrap_n, + }, +}; + +builtin_platform_driver(clk_mt8192_imp_iic_wrap_n_drv); diff --git a/drivers/clk/mediatek/clk-mt8192-imp_iic_wrap_s.c b/drivers/clk/mediatek/clk-mt8192-imp_iic_wrap_s.c new file mode 100644 index 0000000..0d652bd --- /dev/null +++ b/drivers/clk/mediatek/clk-mt8192-imp_iic_wrap_s.c @@ -0,0 +1,59 @@ +// SPDX-License-Identifier: GPL-2.0 +// +// Copyright (c) 2020 MediaTek Inc. +// Author: Weiyi Lu + +#include +#include + +#include "clk-mtk.h" +#include "clk-gate.h" + +#include + +static const struct mtk_gate_regs imp_iic_wrap_s_cg_regs = { + .set_ofs = 0xe08, + .clr_ofs = 0xe04, + .sta_ofs = 0xe00, +}; + +#define GATE_IMP_IIC_WRAP_S(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &imp_iic_wrap_s_cg_regs, _shift, \ + &mtk_clk_gate_ops_setclr) + +static const struct mtk_gate imp_iic_wrap_s_clks[] = { + GATE_IMP_IIC_WRAP_S(CLK_IMP_IIC_WRAP_S_I2C7, "imp_iic_wrap_s_i2c7", + "infra_i2c0", 0), + GATE_IMP_IIC_WRAP_S(CLK_IMP_IIC_WRAP_S_I2C8, "imp_iic_wrap_s_i2c8", + "infra_i2c0", 1), + GATE_IMP_IIC_WRAP_S(CLK_IMP_IIC_WRAP_S_I2C9, "imp_iic_wrap_s_i2c9", + "infra_i2c0", 2), +}; + +static int clk_mt8192_imp_iic_wrap_s_probe(struct platform_device *pdev) +{ + struct clk_onecell_data *clk_data; + struct device_node *node = pdev->dev.of_node; + + clk_data = mtk_alloc_clk_data(CLK_IMP_IIC_WRAP_S_NR_CLK); + + mtk_clk_register_gates(node, imp_iic_wrap_s_clks, + ARRAY_SIZE(imp_iic_wrap_s_clks), clk_data); + + return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data); +} + +static const struct of_device_id of_match_clk_mt8192_imp_iic_wrap_s[] = { + { .compatible = "mediatek,mt8192-imp_iic_wrap_s", }, + {} +}; + +static struct platform_driver clk_mt8192_imp_iic_wrap_s_drv = { + .probe = clk_mt8192_imp_iic_wrap_s_probe, + .driver = { + .name = "clk-mt8192-imp_iic_wrap_s", + .of_match_table = of_match_clk_mt8192_imp_iic_wrap_s, + }, +}; + +builtin_platform_driver(clk_mt8192_imp_iic_wrap_s_drv); diff --git a/drivers/clk/mediatek/clk-mt8192-imp_iic_wrap_w.c b/drivers/clk/mediatek/clk-mt8192-imp_iic_wrap_w.c new file mode 100644 index 0000000..166922c --- /dev/null +++ b/drivers/clk/mediatek/clk-mt8192-imp_iic_wrap_w.c @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: GPL-2.0 +// +// Copyright (c) 2020 MediaTek Inc. +// Author: Weiyi Lu + +#include +#include + +#include "clk-mtk.h" +#include "clk-gate.h" + +#include + +static const struct mtk_gate_regs imp_iic_wrap_w_cg_regs = { + .set_ofs = 0xe08, + .clr_ofs = 0xe04, + .sta_ofs = 0xe00, +}; + +#define GATE_IMP_IIC_WRAP_W(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &imp_iic_wrap_w_cg_regs, _shift, \ + &mtk_clk_gate_ops_setclr) + +static const struct mtk_gate imp_iic_wrap_w_clks[] = { + GATE_IMP_IIC_WRAP_W(CLK_IMP_IIC_WRAP_W_I2C5, "imp_iic_wrap_w_i2c5", + "infra_i2c0", 0), +}; + +static int clk_mt8192_imp_iic_wrap_w_probe(struct platform_device *pdev) +{ + struct clk_onecell_data *clk_data; + struct device_node *node = pdev->dev.of_node; + + clk_data = mtk_alloc_clk_data(CLK_IMP_IIC_WRAP_W_NR_CLK); + + mtk_clk_register_gates(node, imp_iic_wrap_w_clks, + ARRAY_SIZE(imp_iic_wrap_w_clks), clk_data); + + return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data); +} + +static const struct of_device_id of_match_clk_mt8192_imp_iic_wrap_w[] = { + { .compatible = "mediatek,mt8192-imp_iic_wrap_w", }, + {} +}; + +static struct platform_driver clk_mt8192_imp_iic_wrap_w_drv = { + .probe = clk_mt8192_imp_iic_wrap_w_probe, + .driver = { + .name = "clk-mt8192-imp_iic_wrap_w", + .of_match_table = of_match_clk_mt8192_imp_iic_wrap_w, + }, +}; + +builtin_platform_driver(clk_mt8192_imp_iic_wrap_w_drv); diff --git a/drivers/clk/mediatek/clk-mt8192-imp_iic_wrap_ws.c b/drivers/clk/mediatek/clk-mt8192-imp_iic_wrap_ws.c new file mode 100644 index 0000000..bd13fdc --- /dev/null +++ b/drivers/clk/mediatek/clk-mt8192-imp_iic_wrap_ws.c @@ -0,0 +1,59 @@ +// SPDX-License-Identifier: GPL-2.0 +// +// Copyright (c) 2020 MediaTek Inc. +// Author: Weiyi Lu + +#include +#include + +#include "clk-mtk.h" +#include "clk-gate.h" + +#include + +static const struct mtk_gate_regs imp_iic_wrap_ws_cg_regs = { + .set_ofs = 0xe08, + .clr_ofs = 0xe04, + .sta_ofs = 0xe00, +}; + +#define GATE_IMP_IIC_WRAP_WS(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &imp_iic_wrap_ws_cg_regs, _shift, \ + &mtk_clk_gate_ops_setclr) + +static const struct mtk_gate imp_iic_wrap_ws_clks[] = { + GATE_IMP_IIC_WRAP_WS(CLK_IMP_IIC_WRAP_WS_I2C1, "imp_iic_wrap_ws_i2c1", + "infra_i2c0", 0), + GATE_IMP_IIC_WRAP_WS(CLK_IMP_IIC_WRAP_WS_I2C2, "imp_iic_wrap_ws_i2c2", + "infra_i2c0", 1), + GATE_IMP_IIC_WRAP_WS(CLK_IMP_IIC_WRAP_WS_I2C4, "imp_iic_wrap_ws_i2c4", + "infra_i2c0", 2), +}; + +static int clk_mt8192_imp_iic_wrap_ws_probe(struct platform_device *pdev) +{ + struct clk_onecell_data *clk_data; + struct device_node *node = pdev->dev.of_node; + + clk_data = mtk_alloc_clk_data(CLK_IMP_IIC_WRAP_WS_NR_CLK); + + mtk_clk_register_gates(node, imp_iic_wrap_ws_clks, + ARRAY_SIZE(imp_iic_wrap_ws_clks), clk_data); + + return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data); +} + +static const struct of_device_id of_match_clk_mt8192_imp_iic_wrap_ws[] = { + { .compatible = "mediatek,mt8192-imp_iic_wrap_ws", }, + {} +}; + +static struct platform_driver clk_mt8192_imp_iic_wrap_ws_drv = { + .probe = clk_mt8192_imp_iic_wrap_ws_probe, + .driver = { + .name = "clk-mt8192-imp_iic_wrap_ws", + .of_match_table = of_match_clk_mt8192_imp_iic_wrap_ws, + }, +}; + +builtin_platform_driver(clk_mt8192_imp_iic_wrap_ws_drv); diff --git a/drivers/clk/mediatek/clk-mt8192-ipe.c b/drivers/clk/mediatek/clk-mt8192-ipe.c new file mode 100644 index 0000000..15109a8 --- /dev/null +++ b/drivers/clk/mediatek/clk-mt8192-ipe.c @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: GPL-2.0 +// +// Copyright (c) 2020 MediaTek Inc. +// Author: Weiyi Lu + +#include +#include + +#include "clk-mtk.h" +#include "clk-gate.h" + +#include + +static const struct mtk_gate_regs ipe_cg_regs = { + .set_ofs = 0x4, + .clr_ofs = 0x8, + .sta_ofs = 0x0, +}; + +#define GATE_IPE(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &ipe_cg_regs, _shift, \ + &mtk_clk_gate_ops_setclr) + +static const struct mtk_gate ipe_clks[] = { + GATE_IPE(CLK_IPE_LARB19, "ipe_larb19", "ipe_sel", 0), + GATE_IPE(CLK_IPE_LARB20, "ipe_larb20", "ipe_sel", 1), + GATE_IPE(CLK_IPE_SMI_SUBCOM, "ipe_smi_subcom", "ipe_sel", 2), + GATE_IPE(CLK_IPE_FD, "ipe_fd", "ipe_sel", 3), + GATE_IPE(CLK_IPE_FE, "ipe_fe", "ipe_sel", 4), + GATE_IPE(CLK_IPE_RSC, "ipe_rsc", "ipe_sel", 5), + GATE_IPE(CLK_IPE_DPE, "ipe_dpe", "ipe_sel", 6), + GATE_IPE(CLK_IPE_GALS, "ipe_gals", "ipe_sel", 8), +}; + +static int clk_mt8192_ipe_probe(struct platform_device *pdev) +{ + struct clk_onecell_data *clk_data; + struct device_node *node = pdev->dev.of_node; + + clk_data = mtk_alloc_clk_data(CLK_IPE_NR_CLK); + + mtk_clk_register_gates(node, ipe_clks, ARRAY_SIZE(ipe_clks), + clk_data); + + return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data); +} + +static const struct of_device_id of_match_clk_mt8192_ipe[] = { + { .compatible = "mediatek,mt8192-ipesys", }, + {} +}; + +static struct platform_driver clk_mt8192_ipe_drv = { + .probe = clk_mt8192_ipe_probe, + .driver = { + .name = "clk-mt8192-ipe", + .of_match_table = of_match_clk_mt8192_ipe, + }, +}; + +builtin_platform_driver(clk_mt8192_ipe_drv); diff --git a/drivers/clk/mediatek/clk-mt8192-mdp.c b/drivers/clk/mediatek/clk-mt8192-mdp.c new file mode 100644 index 0000000..ce5bd7b --- /dev/null +++ b/drivers/clk/mediatek/clk-mt8192-mdp.c @@ -0,0 +1,89 @@ +// SPDX-License-Identifier: GPL-2.0 +// +// Copyright (c) 2020 MediaTek Inc. +// Author: Weiyi Lu + +#include +#include + +#include "clk-mtk.h" +#include "clk-gate.h" + +#include + +static const struct mtk_gate_regs mdp0_cg_regs = { + .set_ofs = 0x104, + .clr_ofs = 0x108, + .sta_ofs = 0x100, +}; + +static const struct mtk_gate_regs mdp1_cg_regs = { + .set_ofs = 0x124, + .clr_ofs = 0x128, + .sta_ofs = 0x120, +}; + +#define GATE_MDP0(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &mdp0_cg_regs, _shift, \ + &mtk_clk_gate_ops_setclr) + +#define GATE_MDP1(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &mdp1_cg_regs, _shift, \ + &mtk_clk_gate_ops_setclr) + +static const struct mtk_gate mdp_clks[] = { + /* MDP0 */ + GATE_MDP0(CLK_MDP_RDMA0, "mdp_mdp_rdma0", "mdp_sel", 0), + GATE_MDP0(CLK_MDP_TDSHP0, "mdp_mdp_tdshp0", "mdp_sel", 1), + GATE_MDP0(CLK_MDP_IMG_DL_ASYNC0, "mdp_img_dl_async0", "mdp_sel", 2), + GATE_MDP0(CLK_MDP_IMG_DL_ASYNC1, "mdp_img_dl_async1", "mdp_sel", 3), + GATE_MDP0(CLK_MDP_RDMA1, "mdp_mdp_rdma1", "mdp_sel", 4), + GATE_MDP0(CLK_MDP_TDSHP1, "mdp_mdp_tdshp1", "mdp_sel", 5), + GATE_MDP0(CLK_MDP_SMI0, "mdp_smi0", "mdp_sel", 6), + GATE_MDP0(CLK_MDP_APB_BUS, "mdp_apb_bus", "mdp_sel", 7), + GATE_MDP0(CLK_MDP_WROT0, "mdp_mdp_wrot0", "mdp_sel", 8), + GATE_MDP0(CLK_MDP_RSZ0, "mdp_mdp_rsz0", "mdp_sel", 9), + GATE_MDP0(CLK_MDP_HDR0, "mdp_mdp_hdr0", "mdp_sel", 10), + GATE_MDP0(CLK_MDP_MUTEX0, "mdp_mdp_mutex0", "mdp_sel", 11), + GATE_MDP0(CLK_MDP_WROT1, "mdp_mdp_wrot1", "mdp_sel", 12), + GATE_MDP0(CLK_MDP_RSZ1, "mdp_mdp_rsz1", "mdp_sel", 13), + GATE_MDP0(CLK_MDP_HDR1, "mdp_mdp_hdr1", "mdp_sel", 14), + GATE_MDP0(CLK_MDP_FAKE_ENG0, "mdp_mdp_fake_eng0", "mdp_sel", 15), + GATE_MDP0(CLK_MDP_AAL0, "mdp_mdp_aal0", "mdp_sel", 16), + GATE_MDP0(CLK_MDP_AAL1, "mdp_mdp_aal1", "mdp_sel", 17), + GATE_MDP0(CLK_MDP_COLOR0, "mdp_mdp_color0", "mdp_sel", 18), + GATE_MDP0(CLK_MDP_COLOR1, "mdp_mdp_color1", "mdp_sel", 19), + /* MDP1 */ + GATE_MDP1(CLK_MDP_IMG_DL_RELAY0_ASYNC0, "mdp_img_dl_relay0_async0", + "mdp_sel", 0), + GATE_MDP1(CLK_MDP_IMG_DL_RELAY1_ASYNC1, "mdp_img_dl_relay1_async1", + "mdp_sel", 8), +}; + +static int clk_mt8192_mdp_probe(struct platform_device *pdev) +{ + struct clk_onecell_data *clk_data; + struct device_node *node = pdev->dev.of_node; + + clk_data = mtk_alloc_clk_data(CLK_MDP_NR_CLK); + + mtk_clk_register_gates(node, mdp_clks, ARRAY_SIZE(mdp_clks), + clk_data); + + return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data); +} + +static const struct of_device_id of_match_clk_mt8192_mdp[] = { + { .compatible = "mediatek,mt8192-mdpsys", }, + {} +}; + +static struct platform_driver clk_mt8192_mdp_drv = { + .probe = clk_mt8192_mdp_probe, + .driver = { + .name = "clk-mt8192-mdp", + .of_match_table = of_match_clk_mt8192_mdp, + }, +}; + +builtin_platform_driver(clk_mt8192_mdp_drv); diff --git a/drivers/clk/mediatek/clk-mt8192-mfg.c b/drivers/clk/mediatek/clk-mt8192-mfg.c new file mode 100644 index 0000000..1d8c17d --- /dev/null +++ b/drivers/clk/mediatek/clk-mt8192-mfg.c @@ -0,0 +1,54 @@ +// SPDX-License-Identifier: GPL-2.0 +// +// Copyright (c) 2020 MediaTek Inc. +// Author: Weiyi Lu + +#include +#include + +#include "clk-mtk.h" +#include "clk-gate.h" + +#include + +static const struct mtk_gate_regs mfg_cg_regs = { + .set_ofs = 0x4, + .clr_ofs = 0x8, + .sta_ofs = 0x0, +}; + +#define GATE_MFG(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &mfg_cg_regs, _shift, \ + &mtk_clk_gate_ops_setclr) + +static const struct mtk_gate mfg_clks[] = { + GATE_MFG(CLK_MFG_BG3D, "mfg_bg3d", "mfg_pll_sel", 0), +}; + +static int clk_mt8192_mfg_probe(struct platform_device *pdev) +{ + struct clk_onecell_data *clk_data; + struct device_node *node = pdev->dev.of_node; + + clk_data = mtk_alloc_clk_data(CLK_MFG_NR_CLK); + + mtk_clk_register_gates(node, mfg_clks, ARRAY_SIZE(mfg_clks), + clk_data); + + return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data); +} + +static const struct of_device_id of_match_clk_mt8192_mfg[] = { + { .compatible = "mediatek,mt8192-mfgcfg", }, + {} +}; + +static struct platform_driver clk_mt8192_mfg_drv = { + .probe = clk_mt8192_mfg_probe, + .driver = { + .name = "clk-mt8192-mfg", + .of_match_table = of_match_clk_mt8192_mfg, + }, +}; + +builtin_platform_driver(clk_mt8192_mfg_drv); diff --git a/drivers/clk/mediatek/clk-mt8192-mm.c b/drivers/clk/mediatek/clk-mt8192-mm.c new file mode 100644 index 0000000..02eef24 --- /dev/null +++ b/drivers/clk/mediatek/clk-mt8192-mm.c @@ -0,0 +1,108 @@ +// SPDX-License-Identifier: GPL-2.0 +// +// Copyright (c) 2020 MediaTek Inc. +// Author: Weiyi Lu + +#include +#include + +#include "clk-mtk.h" +#include "clk-gate.h" + +#include + +static const struct mtk_gate_regs mm0_cg_regs = { + .set_ofs = 0x104, + .clr_ofs = 0x108, + .sta_ofs = 0x100, +}; + +static const struct mtk_gate_regs mm1_cg_regs = { + .set_ofs = 0x114, + .clr_ofs = 0x118, + .sta_ofs = 0x110, +}; + +static const struct mtk_gate_regs mm2_cg_regs = { + .set_ofs = 0x1a4, + .clr_ofs = 0x1a8, + .sta_ofs = 0x1a0, +}; + +#define GATE_MM0(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &mm0_cg_regs, _shift, \ + &mtk_clk_gate_ops_setclr) + +#define GATE_MM1(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &mm1_cg_regs, _shift, \ + &mtk_clk_gate_ops_setclr) + +#define GATE_MM2(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &mm2_cg_regs, _shift, \ + &mtk_clk_gate_ops_setclr) + +static const struct mtk_gate mm_clks[] = { + /* MM0 */ + GATE_MM0(CLK_MM_DISP_MUTEX0, "mm_disp_mutex0", "disp_sel", 0), + GATE_MM0(CLK_MM_DISP_CONFIG, "mm_disp_config", "disp_sel", 1), + GATE_MM0(CLK_MM_DISP_OVL0, "mm_disp_ovl0", "disp_sel", 2), + GATE_MM0(CLK_MM_DISP_RDMA0, "mm_disp_rdma0", "disp_sel", 3), + GATE_MM0(CLK_MM_DISP_OVL0_2L, "mm_disp_ovl0_2l", "disp_sel", 4), + GATE_MM0(CLK_MM_DISP_WDMA0, "mm_disp_wdma0", "disp_sel", 5), + GATE_MM0(CLK_MM_DISP_UFBC_WDMA0, "mm_disp_ufbc_wdma0", "disp_sel", 6), + GATE_MM0(CLK_MM_DISP_RSZ0, "mm_disp_rsz0", "disp_sel", 7), + GATE_MM0(CLK_MM_DISP_AAL0, "mm_disp_aal0", "disp_sel", 8), + GATE_MM0(CLK_MM_DISP_CCORR0, "mm_disp_ccorr0", "disp_sel", 9), + GATE_MM0(CLK_MM_DISP_DITHER0, "mm_disp_dither0", "disp_sel", 10), + GATE_MM0(CLK_MM_SMI_INFRA, "mm_smi_infra", "disp_sel", 11), + GATE_MM0(CLK_MM_DISP_GAMMA0, "mm_disp_gamma0", "disp_sel", 12), + GATE_MM0(CLK_MM_DISP_POSTMASK0, "mm_disp_postmask0", "disp_sel", 13), + GATE_MM0(CLK_MM_DISP_DSC_WRAP0, "mm_disp_dsc_wrap0", "disp_sel", 14), + GATE_MM0(CLK_MM_DSI0, "mm_dsi0", "disp_sel", 15), + GATE_MM0(CLK_MM_DISP_COLOR0, "mm_disp_color0", "disp_sel", 16), + GATE_MM0(CLK_MM_SMI_COMMON, "mm_smi_common", "disp_sel", 17), + GATE_MM0(CLK_MM_DISP_FAKE_ENG0, "mm_disp_fake_eng0", "disp_sel", 18), + GATE_MM0(CLK_MM_DISP_FAKE_ENG1, "mm_disp_fake_eng1", "disp_sel", 19), + GATE_MM0(CLK_MM_MDP_TDSHP4, "mm_mdp_tdshp4", "disp_sel", 20), + GATE_MM0(CLK_MM_MDP_RSZ4, "mm_mdp_rsz4", "disp_sel", 21), + GATE_MM0(CLK_MM_MDP_AAL4, "mm_mdp_aal4", "disp_sel", 22), + GATE_MM0(CLK_MM_MDP_HDR4, "mm_mdp_hdr4", "disp_sel", 23), + GATE_MM0(CLK_MM_MDP_RDMA4, "mm_mdp_rdma4", "disp_sel", 24), + GATE_MM0(CLK_MM_MDP_COLOR4, "mm_mdp_color4", "disp_sel", 25), + GATE_MM0(CLK_MM_DISP_Y2R0, "mm_disp_y2r0", "disp_sel", 26), + GATE_MM0(CLK_MM_SMI_GALS, "mm_smi_gals", "disp_sel", 27), + GATE_MM0(CLK_MM_DISP_OVL2_2L, "mm_disp_ovl2_2l", "disp_sel", 28), + GATE_MM0(CLK_MM_DISP_RDMA4, "mm_disp_rdma4", "disp_sel", 29), + GATE_MM0(CLK_MM_DISP_DPI0, "mm_disp_dpi0", "disp_sel", 30), + /* MM1 */ + GATE_MM1(CLK_MM_SMI_IOMMU, "mm_smi_iommu", "disp_sel", 0), + /* MM2 */ + GATE_MM2(CLK_MM_DSI_DSI0, "mm_dsi_dsi0", "disp_sel", 0), + GATE_MM2(CLK_MM_DPI_DPI0, "mm_dpi_dpi0", "dpi_sel", 8), + GATE_MM2(CLK_MM_26MHZ, "mm_26mhz", "clk26m", 24), + GATE_MM2(CLK_MM_32KHZ, "mm_32khz", "clk32k", 25), +}; + +static int clk_mt8192_mm_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + struct device_node *node = dev->parent->of_node; + struct clk_onecell_data *clk_data; + + clk_data = mtk_alloc_clk_data(CLK_MM_NR_CLK); + + mtk_clk_register_gates(node, mm_clks, ARRAY_SIZE(mm_clks), + clk_data); + + return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data); +} + + +static struct platform_driver clk_mt8192_mm_drv = { + .probe = clk_mt8192_mm_probe, + .driver = { + .name = "clk-mt8192-mm", + }, +}; + +builtin_platform_driver(clk_mt8192_mm_drv); diff --git a/drivers/clk/mediatek/clk-mt8192-msdc.c b/drivers/clk/mediatek/clk-mt8192-msdc.c new file mode 100644 index 0000000..f0b30a1 --- /dev/null +++ b/drivers/clk/mediatek/clk-mt8192-msdc.c @@ -0,0 +1,54 @@ +// SPDX-License-Identifier: GPL-2.0 +// +// Copyright (c) 2020 MediaTek Inc. +// Author: Weiyi Lu + +#include +#include + +#include "clk-mtk.h" +#include "clk-gate.h" + +#include + +static const struct mtk_gate_regs msdc_cg_regs = { + .set_ofs = 0xb4, + .clr_ofs = 0xb4, + .sta_ofs = 0xb4, +}; + +#define GATE_MSDC(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &msdc_cg_regs, _shift, \ + &mtk_clk_gate_ops_no_setclr_inv) + +static const struct mtk_gate msdc_clks[] = { + GATE_MSDC(CLK_MSDC_AXI_WRAP, "msdc_axi_wrap", "axi_sel", 22), +}; + +static int clk_mt8192_msdc_probe(struct platform_device *pdev) +{ + struct clk_onecell_data *clk_data; + struct device_node *node = pdev->dev.of_node; + + clk_data = mtk_alloc_clk_data(CLK_MSDC_NR_CLK); + + mtk_clk_register_gates(node, msdc_clks, ARRAY_SIZE(msdc_clks), + clk_data); + + return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data); +} + +static const struct of_device_id of_match_clk_mt8192_msdc[] = { + { .compatible = "mediatek,mt8192-msdc", }, + {} +}; + +static struct platform_driver clk_mt8192_msdc_drv = { + .probe = clk_mt8192_msdc_probe, + .driver = { + .name = "clk-mt8192-msdc", + .of_match_table = of_match_clk_mt8192_msdc, + }, +}; + +builtin_platform_driver(clk_mt8192_msdc_drv); diff --git a/drivers/clk/mediatek/clk-mt8192-msdc_top.c b/drivers/clk/mediatek/clk-mt8192-msdc_top.c new file mode 100644 index 0000000..54e2da4 --- /dev/null +++ b/drivers/clk/mediatek/clk-mt8192-msdc_top.c @@ -0,0 +1,83 @@ +// SPDX-License-Identifier: GPL-2.0 +// +// Copyright (c) 2020 MediaTek Inc. +// Author: Weiyi Lu + +#include +#include + +#include "clk-mtk.h" +#include "clk-gate.h" + +#include + +static const struct mtk_gate_regs msdc_top_cg_regs = { + .set_ofs = 0x0, + .clr_ofs = 0x0, + .sta_ofs = 0x0, +}; + +#define GATE_MSDC_TOP(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &msdc_top_cg_regs, _shift, \ + &mtk_clk_gate_ops_no_setclr_inv) + +static const struct mtk_gate msdc_top_clks[] = { + GATE_MSDC_TOP(CLK_MSDC_TOP_AES_0P, "msdc_top_aes_0p", + "aes_msdcfde_sel", 0), + GATE_MSDC_TOP(CLK_MSDC_TOP_SRC_0P, "msdc_top_src_0p", + "infra_msdc0_src", 1), + GATE_MSDC_TOP(CLK_MSDC_TOP_SRC_1P, "msdc_top_src_1p", + "infra_msdc1_src", 2), + GATE_MSDC_TOP(CLK_MSDC_TOP_SRC_2P, "msdc_top_src_2p", + "infra_msdc2_src", 3), + GATE_MSDC_TOP(CLK_MSDC_TOP_P_MSDC0, "msdc_top_p_msdc0", + "axi_sel", 4), + GATE_MSDC_TOP(CLK_MSDC_TOP_P_MSDC1, "msdc_top_p_msdc1", + "axi_sel", 5), + GATE_MSDC_TOP(CLK_MSDC_TOP_P_MSDC2, "msdc_top_p_msdc2", + "axi_sel", 6), + GATE_MSDC_TOP(CLK_MSDC_TOP_P_CFG, "msdc_top_p_cfg", + "axi_sel", 7), + GATE_MSDC_TOP(CLK_MSDC_TOP_AXI, "msdc_top_axi", + "axi_sel", 8), + GATE_MSDC_TOP(CLK_MSDC_TOP_H_MST_0P, "msdc_top_h_mst_0p", + "infra_msdc0", 9), + GATE_MSDC_TOP(CLK_MSDC_TOP_H_MST_1P, "msdc_top_h_mst_1p", + "infra_msdc1", 10), + GATE_MSDC_TOP(CLK_MSDC_TOP_H_MST_2P, "msdc_top_h_mst_2p", + "infra_msdc2", 11), + GATE_MSDC_TOP(CLK_MSDC_TOP_MEM_OFF_DLY_26M, "msdc_top_mem_off_dly_26m", + "clk26m", 12), + GATE_MSDC_TOP(CLK_MSDC_TOP_32K, "msdc_top_32k", + "clk32k", 13), + GATE_MSDC_TOP(CLK_MSDC_TOP_AHB2AXI_BRG_AXI, "msdc_top_ahb2axi_brg_axi", + "axi_sel", 14), +}; + +static int clk_mt8192_msdc_top_probe(struct platform_device *pdev) +{ + struct clk_onecell_data *clk_data; + struct device_node *node = pdev->dev.of_node; + + clk_data = mtk_alloc_clk_data(CLK_MSDC_TOP_NR_CLK); + + mtk_clk_register_gates(node, msdc_top_clks, ARRAY_SIZE(msdc_top_clks), + clk_data); + + return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data); +} + +static const struct of_device_id of_match_clk_mt8192_msdc_top[] = { + { .compatible = "mediatek,mt8192-msdc_top", }, + {} +}; + +static struct platform_driver clk_mt8192_msdc_top_drv = { + .probe = clk_mt8192_msdc_top_probe, + .driver = { + .name = "clk-mt8192-msdc_top", + .of_match_table = of_match_clk_mt8192_msdc_top, + }, +}; + +builtin_platform_driver(clk_mt8192_msdc_top_drv); diff --git a/drivers/clk/mediatek/clk-mt8192-scp_adsp.c b/drivers/clk/mediatek/clk-mt8192-scp_adsp.c new file mode 100644 index 0000000..a785772 --- /dev/null +++ b/drivers/clk/mediatek/clk-mt8192-scp_adsp.c @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: GPL-2.0 +// +// Copyright (c) 2020 MediaTek Inc. +// Author: Weiyi Lu + +#include +#include + +#include "clk-mtk.h" +#include "clk-gate.h" + +#include + +static const struct mtk_gate_regs scp_adsp_cg_regs = { + .set_ofs = 0x180, + .clr_ofs = 0x180, + .sta_ofs = 0x180, +}; + +#define GATE_SCP_ADSP(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &scp_adsp_cg_regs, _shift, \ + &mtk_clk_gate_ops_no_setclr) + +static const struct mtk_gate scp_adsp_clks[] = { + GATE_SCP_ADSP(CLK_SCP_ADSP_AUDIODSP, "scp_adsp_audiodsp", "adsp_sel", + 0), +}; + +static int clk_mt8192_scp_adsp_probe(struct platform_device *pdev) +{ + struct clk_onecell_data *clk_data; + struct device_node *node = pdev->dev.of_node; + + clk_data = mtk_alloc_clk_data(CLK_SCP_ADSP_NR_CLK); + + mtk_clk_register_gates(node, scp_adsp_clks, ARRAY_SIZE(scp_adsp_clks), + clk_data); + + return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data); +} + +static const struct of_device_id of_match_clk_mt8192_scp_adsp[] = { + { .compatible = "mediatek,mt8192-scp_adsp", }, + {} +}; + +static struct platform_driver clk_mt8192_scp_adsp_drv = { + .probe = clk_mt8192_scp_adsp_probe, + .driver = { + .name = "clk-mt8192-scp_adsp", + .of_match_table = of_match_clk_mt8192_scp_adsp, + }, +}; + +builtin_platform_driver(clk_mt8192_scp_adsp_drv); diff --git a/drivers/clk/mediatek/clk-mt8192-vdec.c b/drivers/clk/mediatek/clk-mt8192-vdec.c new file mode 100644 index 0000000..37f8a83 --- /dev/null +++ b/drivers/clk/mediatek/clk-mt8192-vdec.c @@ -0,0 +1,81 @@ +// SPDX-License-Identifier: GPL-2.0 +// +// Copyright (c) 2020 MediaTek Inc. +// Author: Weiyi Lu + +#include +#include + +#include "clk-mtk.h" +#include "clk-gate.h" + +#include + +static const struct mtk_gate_regs vdec0_cg_regs = { + .set_ofs = 0x0, + .clr_ofs = 0x4, + .sta_ofs = 0x0, +}; + +static const struct mtk_gate_regs vdec1_cg_regs = { + .set_ofs = 0x200, + .clr_ofs = 0x204, + .sta_ofs = 0x200, +}; + +static const struct mtk_gate_regs vdec2_cg_regs = { + .set_ofs = 0x8, + .clr_ofs = 0xc, + .sta_ofs = 0x8, +}; + +#define GATE_VDEC0(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &vdec0_cg_regs, _shift, \ + &mtk_clk_gate_ops_setclr_inv) + +#define GATE_VDEC1(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &vdec1_cg_regs, _shift, \ + &mtk_clk_gate_ops_setclr_inv) + +#define GATE_VDEC2(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &vdec2_cg_regs, _shift, \ + &mtk_clk_gate_ops_setclr_inv) + +static const struct mtk_gate vdec_clks[] = { + /* VDEC0 */ + GATE_VDEC0(CLK_VDEC_VDEC, "vdec_vdec", "vdec_sel", 0), + GATE_VDEC0(CLK_VDEC_ACTIVE, "vdec_active", "vdec_sel", 4), + /* VDEC1 */ + GATE_VDEC1(CLK_VDEC_LAT, "vdec_lat", "vdec_sel", 0), + GATE_VDEC1(CLK_VDEC_LAT_ACTIVE, "vdec_lat_active", "vdec_sel", 4), + /* VDEC2 */ + GATE_VDEC2(CLK_VDEC_LARB1, "vdec_larb1", "vdec_sel", 0), +}; + +static int clk_mt8192_vdec_probe(struct platform_device *pdev) +{ + struct clk_onecell_data *clk_data; + struct device_node *node = pdev->dev.of_node; + + clk_data = mtk_alloc_clk_data(CLK_VDEC_NR_CLK); + + mtk_clk_register_gates(node, vdec_clks, ARRAY_SIZE(vdec_clks), + clk_data); + + return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data); +} + +static const struct of_device_id of_match_clk_mt8192_vdec[] = { + { .compatible = "mediatek,mt8192-vdecsys", }, + {} +}; + +static struct platform_driver clk_mt8192_vdec_drv = { + .probe = clk_mt8192_vdec_probe, + .driver = { + .name = "clk-mt8192-vdec", + .of_match_table = of_match_clk_mt8192_vdec, + }, +}; + +builtin_platform_driver(clk_mt8192_vdec_drv); diff --git a/drivers/clk/mediatek/clk-mt8192-vdec_soc.c b/drivers/clk/mediatek/clk-mt8192-vdec_soc.c new file mode 100644 index 0000000..5df98d4 --- /dev/null +++ b/drivers/clk/mediatek/clk-mt8192-vdec_soc.c @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: GPL-2.0 +// +// Copyright (c) 2020 MediaTek Inc. +// Author: Weiyi Lu + +#include +#include + +#include "clk-mtk.h" +#include "clk-gate.h" + +#include + +static const struct mtk_gate_regs vdec_soc0_cg_regs = { + .set_ofs = 0x0, + .clr_ofs = 0x4, + .sta_ofs = 0x0, +}; + +static const struct mtk_gate_regs vdec_soc1_cg_regs = { + .set_ofs = 0x200, + .clr_ofs = 0x204, + .sta_ofs = 0x200, +}; + +static const struct mtk_gate_regs vdec_soc2_cg_regs = { + .set_ofs = 0x8, + .clr_ofs = 0xc, + .sta_ofs = 0x8, +}; + +#define GATE_VDEC_SOC0(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &vdec_soc0_cg_regs, _shift, \ + &mtk_clk_gate_ops_setclr_inv) + +#define GATE_VDEC_SOC1(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &vdec_soc1_cg_regs, _shift, \ + &mtk_clk_gate_ops_setclr_inv) + +#define GATE_VDEC_SOC2(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &vdec_soc2_cg_regs, _shift, \ + &mtk_clk_gate_ops_setclr_inv) + +static const struct mtk_gate vdec_soc_clks[] = { + /* VDEC_SOC0 */ + GATE_VDEC_SOC0(CLK_VDEC_SOC_VDEC, "vdec_soc_vdec", + "vdec_sel", 0), + GATE_VDEC_SOC0(CLK_VDEC_SOC_VDEC_ACTIVE, "vdec_soc_vdec_active", + "vdec_sel", 4), + /* VDEC_SOC1 */ + GATE_VDEC_SOC1(CLK_VDEC_SOC_LAT, "vdec_soc_lat", + "vdec_sel", 0), + GATE_VDEC_SOC1(CLK_VDEC_SOC_LAT_ACTIVE, "vdec_soc_lat_active", + "vdec_sel", 4), + /* VDEC_SOC2 */ + GATE_VDEC_SOC2(CLK_VDEC_SOC_LARB1, "vdec_soc_larb1", + "vdec_sel", 0), +}; + +static int clk_mt8192_vdec_soc_probe(struct platform_device *pdev) +{ + struct clk_onecell_data *clk_data; + struct device_node *node = pdev->dev.of_node; + + clk_data = mtk_alloc_clk_data(CLK_VDEC_SOC_NR_CLK); + + mtk_clk_register_gates(node, vdec_soc_clks, ARRAY_SIZE(vdec_soc_clks), + clk_data); + + return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data); +} + +static const struct of_device_id of_match_clk_mt8192_vdec_soc[] = { + { .compatible = "mediatek,mt8192-vdecsys_soc", }, + {} +}; + +static struct platform_driver clk_mt8192_vdec_soc_drv = { + .probe = clk_mt8192_vdec_soc_probe, + .driver = { + .name = "clk-mt8192-vdec_soc", + .of_match_table = of_match_clk_mt8192_vdec_soc, + }, +}; + +builtin_platform_driver(clk_mt8192_vdec_soc_drv); diff --git a/drivers/clk/mediatek/clk-mt8192-venc.c b/drivers/clk/mediatek/clk-mt8192-venc.c new file mode 100644 index 0000000..8675d6a --- /dev/null +++ b/drivers/clk/mediatek/clk-mt8192-venc.c @@ -0,0 +1,57 @@ +// SPDX-License-Identifier: GPL-2.0 +// +// Copyright (c) 2020 MediaTek Inc. +// Author: Weiyi Lu + +#include +#include + +#include "clk-mtk.h" +#include "clk-gate.h" + +#include + +static const struct mtk_gate_regs venc_cg_regs = { + .set_ofs = 0x4, + .clr_ofs = 0x8, + .sta_ofs = 0x0, +}; + +#define GATE_VENC(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &venc_cg_regs, _shift, \ + &mtk_clk_gate_ops_setclr_inv) + +static const struct mtk_gate venc_clks[] = { + GATE_VENC(CLK_VENC_SET0_LARB, "venc_set0_larb", "venc_sel", 0), + GATE_VENC(CLK_VENC_SET1_VENC, "venc_set1_venc", "venc_sel", 4), + GATE_VENC(CLK_VENC_SET2_JPGENC, "venc_set2_jpgenc", "venc_sel", 8), + GATE_VENC(CLK_VENC_SET5_GALS, "venc_set5_gals", "venc_sel", 28), +}; + +static int clk_mt8192_venc_probe(struct platform_device *pdev) +{ + struct clk_onecell_data *clk_data; + struct device_node *node = pdev->dev.of_node; + + clk_data = mtk_alloc_clk_data(CLK_VENC_NR_CLK); + + mtk_clk_register_gates(node, venc_clks, ARRAY_SIZE(venc_clks), + clk_data); + + return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data); +} + +static const struct of_device_id of_match_clk_mt8192_venc[] = { + { .compatible = "mediatek,mt8192-vencsys", }, + {} +}; + +static struct platform_driver clk_mt8192_venc_drv = { + .probe = clk_mt8192_venc_probe, + .driver = { + .name = "clk-mt8192-venc", + .of_match_table = of_match_clk_mt8192_venc, + }, +}; + +builtin_platform_driver(clk_mt8192_venc_drv); diff --git a/drivers/clk/mediatek/clk-mt8192.c b/drivers/clk/mediatek/clk-mt8192.c new file mode 100644 index 0000000..37d8def --- /dev/null +++ b/drivers/clk/mediatek/clk-mt8192.c @@ -0,0 +1,1549 @@ +// SPDX-License-Identifier: GPL-2.0 +// +// Copyright (c) 2020 MediaTek Inc. +// Author: Weiyi Lu + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "clk-mtk.h" +#include "clk-mux.h" +#include "clk-gate.h" + +#include + +static DEFINE_SPINLOCK(mt8192_clk_lock); + +static const struct mtk_fixed_clk top_fixed_clks[] = { + FIXED_CLK(CLK_TOP_ULPOSC, "ulposc", NULL, 260000000), +}; + +static const struct mtk_fixed_factor top_early_divs[] = { + FACTOR(CLK_TOP_CSW_F26M_D2, "csw_f26m_d2", "clk26m", 1, 2), +}; + +static const struct mtk_fixed_factor top_divs[] = { + FACTOR(CLK_TOP_MAINPLL_D3, "mainpll_d3", "mainpll", 1, + 3), + FACTOR(CLK_TOP_MAINPLL_D4, "mainpll_d4", "mainpll", 1, + 4), + FACTOR(CLK_TOP_MAINPLL_D4_D2, "mainpll_d4_d2", "mainpll_d4", 1, + 2), + FACTOR(CLK_TOP_MAINPLL_D4_D4, "mainpll_d4_d4", "mainpll_d4", 1, + 4), + FACTOR(CLK_TOP_MAINPLL_D4_D8, "mainpll_d4_d8", "mainpll_d4", 1, + 8), + FACTOR(CLK_TOP_MAINPLL_D4_D16, "mainpll_d4_d16", "mainpll_d4", 1, + 16), + FACTOR(CLK_TOP_MAINPLL_D5, "mainpll_d5", "mainpll", 1, + 5), + FACTOR(CLK_TOP_MAINPLL_D5_D2, "mainpll_d5_d2", "mainpll_d5", 1, + 2), + FACTOR(CLK_TOP_MAINPLL_D5_D4, "mainpll_d5_d4", "mainpll_d5", 1, + 4), + FACTOR(CLK_TOP_MAINPLL_D5_D8, "mainpll_d5_d8", "mainpll_d5", 1, + 8), + FACTOR(CLK_TOP_MAINPLL_D6, "mainpll_d6", "mainpll", 1, + 6), + FACTOR(CLK_TOP_MAINPLL_D6_D2, "mainpll_d6_d2", "mainpll_d6", 1, + 2), + FACTOR(CLK_TOP_MAINPLL_D6_D4, "mainpll_d6_d4", "mainpll_d6", 1, + 4), + FACTOR(CLK_TOP_MAINPLL_D7, "mainpll_d7", "mainpll", 1, + 7), + FACTOR(CLK_TOP_MAINPLL_D7_D2, "mainpll_d7_d2", "mainpll_d7", 1, + 2), + FACTOR(CLK_TOP_MAINPLL_D7_D4, "mainpll_d7_d4", "mainpll_d7", 1, + 4), + FACTOR(CLK_TOP_MAINPLL_D7_D8, "mainpll_d7_d8", "mainpll_d7", 1, + 8), + FACTOR(CLK_TOP_UNIVPLL_D3, "univpll_d3", "univpll", 1, + 3), + FACTOR(CLK_TOP_UNIVPLL_D4, "univpll_d4", "univpll", 1, + 4), + FACTOR(CLK_TOP_UNIVPLL_D4_D2, "univpll_d4_d2", "univpll_d4", 1, + 2), + FACTOR(CLK_TOP_UNIVPLL_D4_D4, "univpll_d4_d4", "univpll_d4", 1, + 4), + FACTOR(CLK_TOP_UNIVPLL_D4_D8, "univpll_d4_d8", "univpll_d4", 1, + 8), + FACTOR(CLK_TOP_UNIVPLL_D5, "univpll_d5", "univpll", 1, + 5), + FACTOR(CLK_TOP_UNIVPLL_D5_D2, "univpll_d5_d2", "univpll_d5", 1, + 2), + FACTOR(CLK_TOP_UNIVPLL_D5_D4, "univpll_d5_d4", "univpll_d5", 1, + 4), + FACTOR(CLK_TOP_UNIVPLL_D5_D8, "univpll_d5_d8", "univpll_d5", 1, + 8), + FACTOR(CLK_TOP_UNIVPLL_D6, "univpll_d6", "univpll", 1, + 6), + FACTOR(CLK_TOP_UNIVPLL_D6_D2, "univpll_d6_d2", "univpll_d6", 1, + 2), + FACTOR(CLK_TOP_UNIVPLL_D6_D4, "univpll_d6_d4", "univpll_d6", 1, + 4), + FACTOR(CLK_TOP_UNIVPLL_D6_D8, "univpll_d6_d8", "univpll_d6", 1, + 8), + FACTOR(CLK_TOP_UNIVPLL_D6_D16, "univpll_d6_d16", "univpll_d6", 1, + 16), + FACTOR(CLK_TOP_UNIVPLL_D7, "univpll_d7", "univpll", 1, + 7), + FACTOR(CLK_TOP_APLL1, "apll1_ck", "apll1", 1, + 1), + FACTOR(CLK_TOP_APLL1_D2, "apll1_d2", "apll1", 1, + 2), + FACTOR(CLK_TOP_APLL1_D4, "apll1_d4", "apll1", 1, + 4), + FACTOR(CLK_TOP_APLL1_D8, "apll1_d8", "apll1", 1, + 8), + FACTOR(CLK_TOP_APLL2, "apll2_ck", "apll2", 1, + 1), + FACTOR(CLK_TOP_APLL2_D2, "apll2_d2", "apll2", 1, + 2), + FACTOR(CLK_TOP_APLL2_D4, "apll2_d4", "apll2", 1, + 4), + FACTOR(CLK_TOP_APLL2_D8, "apll2_d8", "apll2", 1, + 8), + FACTOR(CLK_TOP_MMPLL_D4, "mmpll_d4", "mmpll", 1, + 4), + FACTOR(CLK_TOP_MMPLL_D4_D2, "mmpll_d4_d2", "mmpll_d4", 1, + 2), + FACTOR(CLK_TOP_MMPLL_D5, "mmpll_d5", "mmpll", 1, + 5), + FACTOR(CLK_TOP_MMPLL_D5_D2, "mmpll_d5_d2", "mmpll_d5", 1, + 2), + FACTOR(CLK_TOP_MMPLL_D6, "mmpll_d6", "mmpll", 1, + 6), + FACTOR(CLK_TOP_MMPLL_D6_D2, "mmpll_d6_d2", "mmpll_d6", 1, + 2), + FACTOR(CLK_TOP_MMPLL_D7, "mmpll_d7", "mmpll", 1, + 7), + FACTOR(CLK_TOP_MMPLL_D9, "mmpll_d9", "mmpll", 1, + 9), + FACTOR(CLK_TOP_APUPLL, "apupll_ck", "apupll", 1, + 2), + FACTOR(CLK_TOP_NPUPLL, "npupll_ck", "npupll", 1, + 1), + FACTOR(CLK_TOP_TVDPLL, "tvdpll_ck", "tvdpll", 1, + 1), + FACTOR(CLK_TOP_TVDPLL_D2, "tvdpll_d2", "tvdpll", 1, + 2), + FACTOR(CLK_TOP_TVDPLL_D4, "tvdpll_d4", "tvdpll", 1, + 4), + FACTOR(CLK_TOP_TVDPLL_D8, "tvdpll_d8", "tvdpll", 1, + 8), + FACTOR(CLK_TOP_TVDPLL_D16, "tvdpll_d16", "tvdpll", 1, + 16), + FACTOR(CLK_TOP_MSDCPLL, "msdcpll_ck", "msdcpll", 1, + 1), + FACTOR(CLK_TOP_MSDCPLL_D2, "msdcpll_d2", "msdcpll", 1, + 2), + FACTOR(CLK_TOP_MSDCPLL_D4, "msdcpll_d4", "msdcpll", 1, + 4), + FACTOR(CLK_TOP_OSC_D2, "osc_d2", "ulposc", 1, + 2), + FACTOR(CLK_TOP_OSC_D4, "osc_d4", "ulposc", 1, + 4), + FACTOR(CLK_TOP_OSC_D8, "osc_d8", "ulposc", 1, + 8), + FACTOR(CLK_TOP_OSC_D10, "osc_d10", "ulposc", 1, + 10), + FACTOR(CLK_TOP_OSC_D16, "osc_d16", "ulposc", 1, + 16), + FACTOR(CLK_TOP_OSC_D20, "osc_d20", "ulposc", 1, + 20), + FACTOR(CLK_TOP_ADSPPLL, "adsppll_ck", "adsppll", 1, + 1), + FACTOR(CLK_TOP_UNIVPLL_192M, "univpll_192m", "univpll", 1, + 13), + FACTOR(CLK_TOP_UNIVPLL_192M_D2, "univpll_192m_d2", "univpll_192m", 1, + 2), + FACTOR(CLK_TOP_UNIVPLL_192M_D4, "univpll_192m_d4", "univpll_192m", 1, + 4), + FACTOR(CLK_TOP_UNIVPLL_192M_D8, "univpll_192m_d8", "univpll_192m", 1, + 8), + FACTOR(CLK_TOP_UNIVPLL_192M_D16, "univpll_192m_d16", "univpll_192m", 1, + 16), + FACTOR(CLK_TOP_UNIVPLL_192M_D32, "univpll_192m_d32", "univpll_192m", 1, + 32), +}; + +static const char * const axi_parents[] = { + "clk26m", + "mainpll_d4_d4", + "mainpll_d7_d2", + "mainpll_d4_d2", + "mainpll_d5_d2", + "mainpll_d6_d2", + "osc_d4" +}; + +static const char * const spm_parents[] = { + "clk26m", + "osc_d10", + "mainpll_d7_d4", + "clk32k" +}; + +static const char * const scp_parents[] = { + "clk26m", + "univpll_d5", + "mainpll_d6_d2", + "mainpll_d6", + "univpll_d6", + "mainpll_d4_d2", + "mainpll_d5_d2", + "univpll_d4_d2" +}; + +static const char * const bus_aximem_parents[] = { + "clk26m", + "mainpll_d7_d2", + "mainpll_d4_d2", + "mainpll_d5_d2", + "mainpll_d6" +}; + +static const char * const disp_parents[] = { + "clk26m", + "univpll_d6_d2", + "mainpll_d5_d2", + "mmpll_d6_d2", + "univpll_d5_d2", + "univpll_d4_d2", + "mmpll_d7", + "univpll_d6", + "mainpll_d4", + "mmpll_d5_d2" +}; + +static const char * const mdp_parents[] = { + "clk26m", + "mainpll_d5_d2", + "mmpll_d6_d2", + "mainpll_d4_d2", + "mmpll_d4_d2", + "mainpll_d6", + "univpll_d6", + "mainpll_d4", + "tvdpll_ck", + "univpll_d4", + "mmpll_d5_d2" +}; + +static const char * const img1_parents[] = { + "clk26m", + "univpll_d4", + "tvdpll_ck", + "mainpll_d4", + "univpll_d5", + "mmpll_d6", + "univpll_d6", + "mainpll_d6", + "mmpll_d4_d2", + "mainpll_d4_d2", + "mmpll_d6_d2", + "mmpll_d5_d2" +}; + +static const char * const img2_parents[] = { + "clk26m", + "univpll_d4", + "tvdpll_ck", + "mainpll_d4", + "univpll_d5", + "mmpll_d6", + "univpll_d6", + "mainpll_d6", + "mmpll_d4_d2", + "mainpll_d4_d2", + "mmpll_d6_d2", + "mmpll_d5_d2" +}; + +static const char * const ipe_parents[] = { + "clk26m", + "mainpll_d4", + "mmpll_d6", + "univpll_d6", + "mainpll_d6", + "univpll_d4_d2", + "mainpll_d4_d2", + "mmpll_d6_d2", + "mmpll_d5_d2" +}; + +static const char * const dpe_parents[] = { + "clk26m", + "mainpll_d4", + "mmpll_d6", + "univpll_d6", + "mainpll_d6", + "univpll_d4_d2", + "univpll_d5_d2", + "mmpll_d6_d2" +}; + +static const char * const cam_parents[] = { + "clk26m", + "mainpll_d4", + "mmpll_d6", + "univpll_d4", + "univpll_d5", + "univpll_d6", + "mmpll_d7", + "univpll_d4_d2", + "mainpll_d4_d2", + "univpll_d6_d2" +}; + +static const char * const ccu_parents[] = { + "clk26m", + "mainpll_d4", + "mmpll_d6", + "mainpll_d6", + "mmpll_d7", + "univpll_d4_d2", + "mmpll_d6_d2", + "mmpll_d5_d2", + "univpll_d5", + "univpll_d6_d2" +}; + +static const char * const dsp7_parents[] = { + "clk26m", + "mainpll_d4_d2", + "mainpll_d6", + "mmpll_d6", + "univpll_d5", + "mmpll_d5", + "univpll_d4", + "mmpll_d4" +}; + +static const char * const mfg_ref_parents[] = { + "clk26m", + "clk26m", + "univpll_d6", + "mainpll_d5_d2" +}; + +static const char * const mfg_pll_parents[] = { + "mfg_ref_sel", + "mfgpll" +}; + +static const char * const camtg_parents[] = { + "clk26m", + "univpll_192m_d8", + "univpll_d6_d8", + "univpll_192m_d4", + "univpll_d6_d16", + "csw_f26m_d2", + "univpll_192m_d16", + "univpll_192m_d32" +}; + +static const char * const camtg2_parents[] = { + "clk26m", + "univpll_192m_d8", + "univpll_d6_d8", + "univpll_192m_d4", + "univpll_d6_d16", + "csw_f26m_d2", + "univpll_192m_d16", + "univpll_192m_d32" +}; + +static const char * const camtg3_parents[] = { + "clk26m", + "univpll_192m_d8", + "univpll_d6_d8", + "univpll_192m_d4", + "univpll_d6_d16", + "csw_f26m_d2", + "univpll_192m_d16", + "univpll_192m_d32" +}; + +static const char * const camtg4_parents[] = { + "clk26m", + "univpll_192m_d8", + "univpll_d6_d8", + "univpll_192m_d4", + "univpll_d6_d16", + "csw_f26m_d2", + "univpll_192m_d16", + "univpll_192m_d32" +}; + +static const char * const camtg5_parents[] = { + "clk26m", + "univpll_192m_d8", + "univpll_d6_d8", + "univpll_192m_d4", + "univpll_d6_d16", + "csw_f26m_d2", + "univpll_192m_d16", + "univpll_192m_d32" +}; + +static const char * const camtg6_parents[] = { + "clk26m", + "univpll_192m_d8", + "univpll_d6_d8", + "univpll_192m_d4", + "univpll_d6_d16", + "csw_f26m_d2", + "univpll_192m_d16", + "univpll_192m_d32" +}; + +static const char * const uart_parents[] = { + "clk26m", + "univpll_d6_d8" +}; + +static const char * const spi_parents[] = { + "clk26m", + "mainpll_d5_d4", + "mainpll_d6_d4", + "msdcpll_d4" +}; + +static const char * const msdc50_0_h_parents[] = { + "clk26m", + "mainpll_d4_d2", + "mainpll_d6_d2" +}; + +static const char * const msdc50_0_parents[] = { + "clk26m", + "msdcpll_ck", + "msdcpll_d2", + "univpll_d4_d4", + "mainpll_d6_d2", + "univpll_d4_d2" +}; + +static const char * const msdc30_1_parents[] = { + "clk26m", + "univpll_d6_d2", + "mainpll_d6_d2", + "mainpll_d7_d2", + "msdcpll_d2" +}; + +static const char * const msdc30_2_parents[] = { + "clk26m", + "univpll_d6_d2", + "mainpll_d6_d2", + "mainpll_d7_d2", + "msdcpll_d2" +}; + +static const char * const audio_parents[] = { + "clk26m", + "mainpll_d5_d8", + "mainpll_d7_d8", + "mainpll_d4_d16" +}; + +static const char * const aud_intbus_parents[] = { + "clk26m", + "mainpll_d4_d4", + "mainpll_d7_d4" +}; + +static const char * const pwrap_ulposc_parents[] = { + "osc_d10", + "clk26m", + "osc_d4", + "osc_d8", + "osc_d16" +}; + +static const char * const atb_parents[] = { + "clk26m", + "mainpll_d4_d2", + "mainpll_d5_d2" +}; + +static const char * const sspm_parents[] = { + "clk26m", + "mainpll_d5_d2", + "univpll_d5_d2", + "mainpll_d4_d2", + "univpll_d4_d2", + "mainpll_d6" +}; + +static const char * const dpi_parents[] = { + "clk26m", + "tvdpll_d2", + "tvdpll_d4", + "tvdpll_d8", + "tvdpll_d16" +}; + +static const char * const scam_parents[] = { + "clk26m", + "mainpll_d5_d4" +}; + +static const char * const disp_pwm_parents[] = { + "clk26m", + "univpll_d6_d4", + "osc_d2", + "osc_d4", + "osc_d16" +}; + +static const char * const usb_top_parents[] = { + "clk26m", + "univpll_d5_d4", + "univpll_d6_d4", + "univpll_d5_d2" +}; + +static const char * const ssusb_xhci_parents[] = { + "clk26m", + "univpll_d5_d4", + "univpll_d6_d4", + "univpll_d5_d2" +}; + +static const char * const i2c_parents[] = { + "clk26m", + "mainpll_d4_d8", + "univpll_d5_d4" +}; + +static const char * const seninf_parents[] = { + "clk26m", + "univpll_d4_d4", + "univpll_d6_d2", + "univpll_d4_d2", + "univpll_d7", + "univpll_d6", + "mmpll_d6", + "univpll_d5" +}; + +static const char * const seninf1_parents[] = { + "clk26m", + "univpll_d4_d4", + "univpll_d6_d2", + "univpll_d4_d2", + "univpll_d7", + "univpll_d6", + "mmpll_d6", + "univpll_d5" +}; + +static const char * const seninf2_parents[] = { + "clk26m", + "univpll_d4_d4", + "univpll_d6_d2", + "univpll_d4_d2", + "univpll_d7", + "univpll_d6", + "mmpll_d6", + "univpll_d5" +}; + +static const char * const seninf3_parents[] = { + "clk26m", + "univpll_d4_d4", + "univpll_d6_d2", + "univpll_d4_d2", + "univpll_d7", + "univpll_d6", + "mmpll_d6", + "univpll_d5" +}; + +static const char * const tl_parents[] = { + "clk26m", + "univpll_192m_d2", + "mainpll_d6_d4" +}; + +static const char * const dxcc_parents[] = { + "clk26m", + "mainpll_d4_d2", + "mainpll_d4_d4", + "mainpll_d4_d8" +}; + +static const char * const aud_engen1_parents[] = { + "clk26m", + "apll1_d2", + "apll1_d4", + "apll1_d8" +}; + +static const char * const aud_engen2_parents[] = { + "clk26m", + "apll2_d2", + "apll2_d4", + "apll2_d8" +}; + +static const char * const aes_ufsfde_parents[] = { + "clk26m", + "mainpll_d4", + "mainpll_d4_d2", + "mainpll_d6", + "mainpll_d4_d4", + "univpll_d4_d2", + "univpll_d6" +}; + +static const char * const ufs_parents[] = { + "clk26m", + "mainpll_d4_d4", + "mainpll_d4_d8", + "univpll_d4_d4", + "mainpll_d6_d2", + "mainpll_d5_d2", + "msdcpll_d2" +}; + +static const char * const aud_1_parents[] = { + "clk26m", + "apll1_ck" +}; + +static const char * const aud_2_parents[] = { + "clk26m", + "apll2_ck" +}; + +static const char * const adsp_parents[] = { + "clk26m", + "mainpll_d6", + "mainpll_d5_d2", + "univpll_d4_d4", + "univpll_d4", + "univpll_d6", + "ulposc", + "adsppll_ck" +}; + +static const char * const dpmaif_main_parents[] = { + "clk26m", + "univpll_d4_d4", + "mainpll_d6", + "mainpll_d4_d2", + "univpll_d4_d2" +}; + +static const char * const venc_parents[] = { + "clk26m", + "mmpll_d7", + "mainpll_d6", + "univpll_d4_d2", + "mainpll_d4_d2", + "univpll_d6", + "mmpll_d6", + "mainpll_d5_d2", + "mainpll_d6_d2", + "mmpll_d9", + "univpll_d4_d4", + "mainpll_d4", + "univpll_d4", + "univpll_d5", + "univpll_d5_d2", + "mainpll_d5" +}; + +static const char * const vdec_parents[] = { + "clk26m", + "univpll_192m_d2", + "univpll_d5_d4", + "mainpll_d5", + "mainpll_d5_d2", + "mmpll_d6_d2", + "univpll_d5_d2", + "mainpll_d4_d2", + "univpll_d4_d2", + "univpll_d7", + "mmpll_d7", + "mmpll_d6", + "univpll_d5", + "mainpll_d4", + "univpll_d4", + "univpll_d6" +}; + +static const char * const camtm_parents[] = { + "clk26m", + "univpll_d7", + "univpll_d6_d2", + "univpll_d4_d2" +}; + +static const char * const pwm_parents[] = { + "clk26m", + "univpll_d4_d8" +}; + +static const char * const audio_h_parents[] = { + "clk26m", + "univpll_d7", + "apll1_ck", + "apll2_ck" +}; + +static const char * const spmi_mst_parents[] = { + "clk26m", + "csw_f26m_d2", + "osc_d8", + "osc_d10", + "osc_d16", + "osc_d20", + "clk32k" +}; + +static const char * const aes_msdcfde_parents[] = { + "clk26m", + "mainpll_d4_d2", + "mainpll_d6", + "mainpll_d4_d4", + "univpll_d4_d2", + "univpll_d6" +}; + +static const char * const mcupm_parents[] = { + "clk26m", + "mainpll_d6_d4", + "mainpll_d6_d2" +}; + +static const char * const sflash_parents[] = { + "clk26m", + "mainpll_d7_d8", + "univpll_d6_d8", + "univpll_d5_d8" +}; + +static const char * const apll_i2s0_m_parents[] = { + "aud_1_sel", + "aud_2_sel" +}; + +static const char * const apll_i2s1_m_parents[] = { + "aud_1_sel", + "aud_2_sel" +}; + +static const char * const apll_i2s2_m_parents[] = { + "aud_1_sel", + "aud_2_sel" +}; + +static const char * const apll_i2s3_m_parents[] = { + "aud_1_sel", + "aud_2_sel" +}; + +static const char * const apll_i2s4_m_parents[] = { + "aud_1_sel", + "aud_2_sel" +}; + +static const char * const apll_i2s5_m_parents[] = { + "aud_1_sel", + "aud_2_sel" +}; + +static const char * const apll_i2s6_m_parents[] = { + "aud_1_sel", + "aud_2_sel" +}; + +static const char * const apll_i2s7_m_parents[] = { + "aud_1_sel", + "aud_2_sel" +}; + +static const char * const apll_i2s8_m_parents[] = { + "aud_1_sel", + "aud_2_sel" +}; + +static const char * const apll_i2s9_m_parents[] = { + "aud_1_sel", + "aud_2_sel" +}; + +/* + * CRITICAL CLOCK: + * axi_sel is the main bus clock of whole SOC. + * spm_sel is the clock of the always-on co-processor. + * bus_aximem_sel is clock of the bus that access emi. + */ +static const struct mtk_mux top_mtk_muxes[] = { + /* CLK_CFG_0 */ + MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_AXI_SEL, "axi_sel", + axi_parents, 0x010, 0x014, 0x018, 0, 3, 7, 0x004, 0, + CLK_IS_CRITICAL), + MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_SPM_SEL, "spm_sel", + spm_parents, 0x010, 0x014, 0x018, 8, 2, 15, 0x004, 1, + CLK_IS_CRITICAL), + MUX_GATE_CLR_SET_UPD(CLK_TOP_SCP_SEL, "scp_sel", + scp_parents, 0x010, 0x014, 0x018, 16, 3, 23, 0x004, 2), + MUX_GATE_CLR_SET_UPD_FLAGS(CLK_TOP_BUS_AXIMEM_SEL, "bus_aximem_sel", + bus_aximem_parents, 0x010, 0x014, 0x018, 24, 3, 31, 0x004, 3, + CLK_IS_CRITICAL), + /* CLK_CFG_1 */ + MUX_GATE_CLR_SET_UPD(CLK_TOP_DISP_SEL, "disp_sel", + disp_parents, 0x020, 0x024, 0x028, 0, 4, 7, 0x004, 4), + MUX_GATE_CLR_SET_UPD(CLK_TOP_MDP_SEL, "mdp_sel", + mdp_parents, 0x020, 0x024, 0x028, 8, 4, 15, 0x004, 5), + MUX_GATE_CLR_SET_UPD(CLK_TOP_IMG1_SEL, "img1_sel", + img1_parents, 0x020, 0x024, 0x028, 16, 4, 23, 0x004, 6), + MUX_GATE_CLR_SET_UPD(CLK_TOP_IMG2_SEL, "img2_sel", + img2_parents, 0x020, 0x024, 0x028, 24, 4, 31, 0x004, 7), + /* CLK_CFG_2 */ + MUX_GATE_CLR_SET_UPD(CLK_TOP_IPE_SEL, "ipe_sel", + ipe_parents, 0x030, 0x034, 0x038, 0, 4, 7, 0x004, 8), + MUX_GATE_CLR_SET_UPD(CLK_TOP_DPE_SEL, "dpe_sel", + dpe_parents, 0x030, 0x034, 0x038, 8, 3, 15, 0x004, 9), + MUX_GATE_CLR_SET_UPD(CLK_TOP_CAM_SEL, "cam_sel", + cam_parents, 0x030, 0x034, 0x038, 16, 4, 23, 0x004, 10), + MUX_GATE_CLR_SET_UPD(CLK_TOP_CCU_SEL, "ccu_sel", + ccu_parents, 0x030, 0x034, 0x038, 24, 4, 31, 0x004, 11), + /* CLK_CFG_4 */ + MUX_GATE_CLR_SET_UPD(CLK_TOP_DSP7_SEL, "dsp7_sel", + dsp7_parents, 0x050, 0x054, 0x058, 0, 3, 7, 0x004, 16), + MUX_GATE_CLR_SET_UPD(CLK_TOP_MFG_REF_SEL, "mfg_ref_sel", + mfg_ref_parents, 0x050, 0x054, 0x058, 16, 2, 23, 0x004, 18), + MUX_CLR_SET_UPD(CLK_TOP_MFG_PLL_SEL, "mfg_pll_sel", + mfg_pll_parents, 0x050, 0x054, 0x058, 18, 1, -1, -1), + MUX_GATE_CLR_SET_UPD(CLK_TOP_CAMTG_SEL, "camtg_sel", + camtg_parents, 0x050, 0x054, 0x058, 24, 3, 31, 0x004, 19), + /* CLK_CFG_5 */ + MUX_GATE_CLR_SET_UPD(CLK_TOP_CAMTG2_SEL, "camtg2_sel", + camtg2_parents, 0x060, 0x064, 0x068, 0, 3, 7, 0x004, 20), + MUX_GATE_CLR_SET_UPD(CLK_TOP_CAMTG3_SEL, "camtg3_sel", + camtg3_parents, 0x060, 0x064, 0x068, 8, 3, 15, 0x004, 21), + MUX_GATE_CLR_SET_UPD(CLK_TOP_CAMTG4_SEL, "camtg4_sel", + camtg4_parents, 0x060, 0x064, 0x068, 16, 3, 23, 0x004, 22), + MUX_GATE_CLR_SET_UPD(CLK_TOP_CAMTG5_SEL, "camtg5_sel", + camtg5_parents, 0x060, 0x064, 0x068, 24, 3, 31, 0x004, 23), + /* CLK_CFG_6 */ + MUX_GATE_CLR_SET_UPD(CLK_TOP_CAMTG6_SEL, "camtg6_sel", + camtg6_parents, 0x070, 0x074, 0x078, 0, 3, 7, 0x004, 24), + MUX_GATE_CLR_SET_UPD(CLK_TOP_UART_SEL, "uart_sel", + uart_parents, 0x070, 0x074, 0x078, 8, 1, 15, 0x004, 25), + MUX_GATE_CLR_SET_UPD(CLK_TOP_SPI_SEL, "spi_sel", + spi_parents, 0x070, 0x074, 0x078, 16, 2, 23, 0x004, 26), + MUX_GATE_CLR_SET_UPD(CLK_TOP_MSDC50_0_H_SEL, "msdc50_0_h_sel", + msdc50_0_h_parents, 0x070, 0x074, 0x078, 24, 2, 31, 0x004, 27), + /* CLK_CFG_7 */ + MUX_GATE_CLR_SET_UPD(CLK_TOP_MSDC50_0_SEL, "msdc50_0_sel", + msdc50_0_parents, 0x080, 0x084, 0x088, 0, 3, 7, 0x004, 28), + MUX_GATE_CLR_SET_UPD(CLK_TOP_MSDC30_1_SEL, "msdc30_1_sel", + msdc30_1_parents, 0x080, 0x084, 0x088, 8, 3, 15, 0x004, 29), + MUX_GATE_CLR_SET_UPD(CLK_TOP_MSDC30_2_SEL, "msdc30_2_sel", + msdc30_2_parents, 0x080, 0x084, 0x088, 16, 3, 23, 0x004, 30), + MUX_GATE_CLR_SET_UPD(CLK_TOP_AUDIO_SEL, "audio_sel", + audio_parents, 0x080, 0x084, 0x088, 24, 2, 31, 0x008, 0), + /* CLK_CFG_8 */ + MUX_GATE_CLR_SET_UPD(CLK_TOP_AUD_INTBUS_SEL, "aud_intbus_sel", + aud_intbus_parents, 0x090, 0x094, 0x098, 0, 2, 7, 0x008, 1), + MUX_GATE_CLR_SET_UPD(CLK_TOP_PWRAP_ULPOSC_SEL, "pwrap_ulposc_sel", + pwrap_ulposc_parents, 0x090, 0x094, 0x098, 8, 3, 15, 0x008, 2), + MUX_GATE_CLR_SET_UPD(CLK_TOP_ATB_SEL, "atb_sel", + atb_parents, 0x090, 0x094, 0x098, 16, 2, 23, 0x008, 3), + MUX_GATE_CLR_SET_UPD(CLK_TOP_SSPM_SEL, "sspm_sel", + sspm_parents, 0x090, 0x094, 0x098, 24, 3, 31, 0x008, 4), + /* CLK_CFG_9 */ + MUX_GATE_CLR_SET_UPD(CLK_TOP_DPI_SEL, "dpi_sel", + dpi_parents, 0x0a0, 0x0a4, 0x0a8, 0, 3, 7, 0x008, 5), + MUX_GATE_CLR_SET_UPD(CLK_TOP_SCAM_SEL, "scam_sel", + scam_parents, 0x0a0, 0x0a4, 0x0a8, 8, 1, 15, 0x008, 6), + MUX_GATE_CLR_SET_UPD(CLK_TOP_DISP_PWM_SEL, "disp_pwm_sel", + disp_pwm_parents, 0x0a0, 0x0a4, 0x0a8, 16, 3, 23, 0x008, 7), + MUX_GATE_CLR_SET_UPD(CLK_TOP_USB_TOP_SEL, "usb_top_sel", + usb_top_parents, 0x0a0, 0x0a4, 0x0a8, 24, 2, 31, 0x008, 8), + /* CLK_CFG_10 */ + MUX_GATE_CLR_SET_UPD(CLK_TOP_SSUSB_XHCI_SEL, "ssusb_xhci_sel", + ssusb_xhci_parents, 0x0b0, 0x0b4, 0x0b8, 0, 2, 7, 0x008, 9), + MUX_GATE_CLR_SET_UPD(CLK_TOP_I2C_SEL, "i2c_sel", + i2c_parents, 0x0b0, 0x0b4, 0x0b8, 8, 2, 15, 0x008, 10), + MUX_GATE_CLR_SET_UPD(CLK_TOP_SENINF_SEL, "seninf_sel", + seninf_parents, 0x0b0, 0x0b4, 0x0b8, 16, 3, 23, 0x008, 11), + MUX_GATE_CLR_SET_UPD(CLK_TOP_SENINF1_SEL, "seninf1_sel", + seninf1_parents, 0x0b0, 0x0b4, 0x0b8, 24, 3, 31, 0x008, 12), + /* CLK_CFG_11 */ + MUX_GATE_CLR_SET_UPD(CLK_TOP_SENINF2_SEL, "seninf2_sel", + seninf2_parents, 0x0c0, 0x0c4, 0x0c8, 0, 3, 7, 0x008, 13), + MUX_GATE_CLR_SET_UPD(CLK_TOP_SENINF3_SEL, "seninf3_sel", + seninf3_parents, 0x0c0, 0x0c4, 0x0c8, 8, 3, 15, 0x008, 14), + MUX_GATE_CLR_SET_UPD(CLK_TOP_TL_SEL, "tl_sel", + tl_parents, 0x0c0, 0x0c4, 0x0c8, 16, 2, 23, 0x008, 15), + MUX_GATE_CLR_SET_UPD(CLK_TOP_DXCC_SEL, "dxcc_sel", + dxcc_parents, 0x0c0, 0x0c4, 0x0c8, 24, 2, 31, 0x008, 16), + /* CLK_CFG_12 */ + MUX_GATE_CLR_SET_UPD(CLK_TOP_AUD_ENGEN1_SEL, "aud_engen1_sel", + aud_engen1_parents, 0x0d0, 0x0d4, 0x0d8, 0, 2, 7, 0x008, 17), + MUX_GATE_CLR_SET_UPD(CLK_TOP_AUD_ENGEN2_SEL, "aud_engen2_sel", + aud_engen2_parents, 0x0d0, 0x0d4, 0x0d8, 8, 2, 15, 0x008, 18), + MUX_GATE_CLR_SET_UPD(CLK_TOP_AES_UFSFDE_SEL, "aes_ufsfde_sel", + aes_ufsfde_parents, 0x0d0, 0x0d4, 0x0d8, 16, 3, 23, 0x008, 19), + MUX_GATE_CLR_SET_UPD(CLK_TOP_UFS_SEL, "ufs_sel", + ufs_parents, 0x0d0, 0x0d4, 0x0d8, 24, 3, 31, 0x008, 20), + /* CLK_CFG_13 */ + MUX_GATE_CLR_SET_UPD(CLK_TOP_AUD_1_SEL, "aud_1_sel", + aud_1_parents, 0x0e0, 0x0e4, 0x0e8, 0, 1, 7, 0x008, 21), + MUX_GATE_CLR_SET_UPD(CLK_TOP_AUD_2_SEL, "aud_2_sel", + aud_2_parents, 0x0e0, 0x0e4, 0x0e8, 8, 1, 15, 0x008, 22), + MUX_GATE_CLR_SET_UPD(CLK_TOP_ADSP_SEL, "adsp_sel", + adsp_parents, 0x0e0, 0x0e4, 0x0e8, 16, 3, 23, 0x008, 23), + MUX_GATE_CLR_SET_UPD(CLK_TOP_DPMAIF_MAIN_SEL, "dpmaif_main_sel", + dpmaif_main_parents, 0x0e0, 0x0e4, 0x0e8, 24, 3, 31, 0x008, 24), + /* CLK_CFG_14 */ + MUX_GATE_CLR_SET_UPD(CLK_TOP_VENC_SEL, "venc_sel", + venc_parents, 0x0f0, 0x0f4, 0x0f8, 0, 4, 7, 0x008, 25), + MUX_GATE_CLR_SET_UPD(CLK_TOP_VDEC_SEL, "vdec_sel", + vdec_parents, 0x0f0, 0x0f4, 0x0f8, 8, 4, 15, 0x008, 26), + MUX_GATE_CLR_SET_UPD(CLK_TOP_CAMTM_SEL, "camtm_sel", + camtm_parents, 0x0f0, 0x0f4, 0x0f8, 16, 2, 23, 0x008, 27), + MUX_GATE_CLR_SET_UPD(CLK_TOP_PWM_SEL, "pwm_sel", + pwm_parents, 0x0f0, 0x0f4, 0x0f8, 24, 1, 31, 0x008, 28), + /* CLK_CFG_15 */ + MUX_GATE_CLR_SET_UPD(CLK_TOP_AUDIO_H_SEL, "audio_h_sel", + audio_h_parents, 0x100, 0x104, 0x108, 0, 2, 7, 0x008, 29), + MUX_GATE_CLR_SET_UPD(CLK_TOP_SPMI_MST_SEL, "spmi_mst_sel", + spmi_mst_parents, 0x100, 0x104, 0x108, 8, 3, 15, 0x008, 30), + MUX_GATE_CLR_SET_UPD(CLK_TOP_AES_MSDCFDE_SEL, "aes_msdcfde_sel", + aes_msdcfde_parents, 0x100, 0x104, 0x108, 24, 3, 31, 0x00c, 1), + /* CLK_CFG_16 */ + MUX_GATE_CLR_SET_UPD(CLK_TOP_MCUPM_SEL, "mcupm_sel", + mcupm_parents, 0x110, 0x114, 0x118, 0, 2, 7, 0x00c, 2), + MUX_GATE_CLR_SET_UPD(CLK_TOP_SFLASH_SEL, "sflash_sel", + sflash_parents, 0x110, 0x114, 0x118, 8, 2, 15, 0x00c, 3), +}; + +static struct mtk_composite top_muxes[] = { + /* CLK_AUDDIV_0 */ + MUX(CLK_TOP_APLL_I2S0_M_SEL, "apll_i2s0_m_sel", apll_i2s0_m_parents, + 0x320, 16, 1), + MUX(CLK_TOP_APLL_I2S1_M_SEL, "apll_i2s1_m_sel", apll_i2s1_m_parents, + 0x320, 17, 1), + MUX(CLK_TOP_APLL_I2S2_M_SEL, "apll_i2s2_m_sel", apll_i2s2_m_parents, + 0x320, 18, 1), + MUX(CLK_TOP_APLL_I2S3_M_SEL, "apll_i2s3_m_sel", apll_i2s3_m_parents, + 0x320, 19, 1), + MUX(CLK_TOP_APLL_I2S4_M_SEL, "apll_i2s4_m_sel", apll_i2s4_m_parents, + 0x320, 20, 1), + MUX(CLK_TOP_APLL_I2S5_M_SEL, "apll_i2s5_m_sel", apll_i2s5_m_parents, + 0x320, 21, 1), + MUX(CLK_TOP_APLL_I2S6_M_SEL, "apll_i2s6_m_sel", apll_i2s6_m_parents, + 0x320, 22, 1), + MUX(CLK_TOP_APLL_I2S7_M_SEL, "apll_i2s7_m_sel", apll_i2s7_m_parents, + 0x320, 23, 1), + MUX(CLK_TOP_APLL_I2S8_M_SEL, "apll_i2s8_m_sel", apll_i2s8_m_parents, + 0x320, 24, 1), + MUX(CLK_TOP_APLL_I2S9_M_SEL, "apll_i2s9_m_sel", apll_i2s9_m_parents, + 0x320, 25, 1), +}; + +static const struct mtk_composite top_adj_divs[] = { + DIV_GATE(CLK_TOP_APLL12_DIV0, "apll12_div0", "apll_i2s0_m_sel", 0x320, + 0, 0x328, 8, 0), + DIV_GATE(CLK_TOP_APLL12_DIV1, "apll12_div1", "apll_i2s1_m_sel", 0x320, + 1, 0x328, 8, 8), + DIV_GATE(CLK_TOP_APLL12_DIV2, "apll12_div2", "apll_i2s2_m_sel", 0x320, + 2, 0x328, 8, 16), + DIV_GATE(CLK_TOP_APLL12_DIV3, "apll12_div3", "apll_i2s3_m_sel", 0x320, + 3, 0x328, 8, 24), + DIV_GATE(CLK_TOP_APLL12_DIV4, "apll12_div4", "apll_i2s4_m_sel", 0x320, + 4, 0x334, 8, 0), + DIV_GATE(CLK_TOP_APLL12_DIVB, "apll12_divb", "apll12_div4", 0x320, + 5, 0x334, 8, 8), + DIV_GATE(CLK_TOP_APLL12_DIV5, "apll12_div5", "apll_i2s5_m_sel", 0x320, + 6, 0x334, 8, 16), + DIV_GATE(CLK_TOP_APLL12_DIV6, "apll12_div6", "apll_i2s6_m_sel", 0x320, + 7, 0x334, 8, 24), + DIV_GATE(CLK_TOP_APLL12_DIV7, "apll12_div7", "apll_i2s7_m_sel", 0x320, + 8, 0x338, 8, 0), + DIV_GATE(CLK_TOP_APLL12_DIV8, "apll12_div8", "apll_i2s8_m_sel", 0x320, + 9, 0x338, 8, 8), + DIV_GATE(CLK_TOP_APLL12_DIV9, "apll12_div9", "apll_i2s9_m_sel", 0x320, + 10, 0x338, 8, 16), +}; + +static const struct mtk_gate_regs apmixed_cg_regs = { + .set_ofs = 0x14, + .clr_ofs = 0x14, + .sta_ofs = 0x14, +}; + +#define GATE_APMIXED(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &apmixed_cg_regs, _shift, \ + &mtk_clk_gate_ops_no_setclr_inv) + +static const struct mtk_gate apmixed_clks[] = { + GATE_APMIXED(CLK_APMIXED_MIPID26M, "mipid26m", "clk26m", 16), +}; + +static const struct mtk_gate_regs infra0_cg_regs = { + .set_ofs = 0x80, + .clr_ofs = 0x84, + .sta_ofs = 0x90, +}; + +static const struct mtk_gate_regs infra1_cg_regs = { + .set_ofs = 0x88, + .clr_ofs = 0x8c, + .sta_ofs = 0x94, +}; + +static const struct mtk_gate_regs infra2_cg_regs = { + .set_ofs = 0xa4, + .clr_ofs = 0xa8, + .sta_ofs = 0xac, +}; + +static const struct mtk_gate_regs infra3_cg_regs = { + .set_ofs = 0xc0, + .clr_ofs = 0xc4, + .sta_ofs = 0xc8, +}; + +static const struct mtk_gate_regs infra4_cg_regs = { + .set_ofs = 0xd0, + .clr_ofs = 0xd4, + .sta_ofs = 0xd8, +}; + +static const struct mtk_gate_regs infra5_cg_regs = { + .set_ofs = 0xe0, + .clr_ofs = 0xe4, + .sta_ofs = 0xe8, +}; + +#define GATE_INFRA0(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &infra0_cg_regs, _shift, \ + &mtk_clk_gate_ops_setclr) + +#define GATE_INFRA1(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &infra1_cg_regs, _shift, \ + &mtk_clk_gate_ops_setclr) + +#define GATE_INFRA2(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &infra2_cg_regs, _shift, \ + &mtk_clk_gate_ops_setclr) + +#define GATE_INFRA3(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &infra3_cg_regs, _shift, \ + &mtk_clk_gate_ops_setclr) + +#define GATE_INFRA4(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &infra4_cg_regs, _shift, \ + &mtk_clk_gate_ops_setclr) + +#define GATE_INFRA5(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &infra5_cg_regs, _shift, \ + &mtk_clk_gate_ops_setclr) + +static const struct mtk_gate infra_clks[] = { + /* INFRA0 */ + GATE_INFRA0(CLK_INFRA_PMIC_TMR, "infra_pmic_tmr", + "pwrap_ulposc_sel", 0), + GATE_INFRA0(CLK_INFRA_PMIC_AP, "infra_pmic_ap", + "pwrap_ulposc_sel", 1), + GATE_INFRA0(CLK_INFRA_PMIC_MD, "infra_pmic_md", + "pwrap_ulposc_sel", 2), + GATE_INFRA0(CLK_INFRA_PMIC_CONN, "infra_pmic_conn", + "pwrap_ulposc_sel", 3), + GATE_INFRA0(CLK_INFRA_SCPSYS, "infra_scpsys", + "scp_sel", 4), + GATE_INFRA0(CLK_INFRA_SEJ, "infra_sej", + "axi_sel", 5), + GATE_INFRA0(CLK_INFRA_APXGPT, "infra_apxgpt", + "axi_sel", 6), + GATE_INFRA0(CLK_INFRA_MCUPM, "infra_mcupm", + "mcupm_sel", 7), + GATE_INFRA0(CLK_INFRA_GCE, "infra_gce", + "axi_sel", 8), + GATE_INFRA0(CLK_INFRA_GCE2, "infra_gce2", + "axi_sel", 9), + GATE_INFRA0(CLK_INFRA_THERM, "infra_therm", + "axi_sel", 10), + GATE_INFRA0(CLK_INFRA_I2C0, "infra_i2c0", + "i2c_sel", 11), + GATE_INFRA0(CLK_INFRA_AP_DMA_PSEUDO, "infra_ap_dma_pseudo", + "axi_sel", 12), + GATE_INFRA0(CLK_INFRA_I2C2, "infra_i2c2", + "i2c_sel", 13), + GATE_INFRA0(CLK_INFRA_I2C3, "infra_i2c3", + "i2c_sel", 14), + GATE_INFRA0(CLK_INFRA_PWM_H, "infra_pwm_h", + "axi_sel", 15), + GATE_INFRA0(CLK_INFRA_PWM1, "infra_pwm1", + "pwm_sel", 16), + GATE_INFRA0(CLK_INFRA_PWM2, "infra_pwm2", + "pwm_sel", 17), + GATE_INFRA0(CLK_INFRA_PWM3, "infra_pwm3", + "pwm_sel", 18), + GATE_INFRA0(CLK_INFRA_PWM4, "infra_pwm4", + "pwm_sel", 19), + GATE_INFRA0(CLK_INFRA_PWM, "infra_pwm", + "pwm_sel", 21), + GATE_INFRA0(CLK_INFRA_UART0, "infra_uart0", + "uart_sel", 22), + GATE_INFRA0(CLK_INFRA_UART1, "infra_uart1", + "uart_sel", 23), + GATE_INFRA0(CLK_INFRA_UART2, "infra_uart2", + "uart_sel", 24), + GATE_INFRA0(CLK_INFRA_UART3, "infra_uart3", + "uart_sel", 25), + GATE_INFRA0(CLK_INFRA_GCE_26M, "infra_gce_26m", + "axi_sel", 27), + GATE_INFRA0(CLK_INFRA_CQ_DMA_FPC, "infra_cq_dma_fpc", + "axi_sel", 28), + GATE_INFRA0(CLK_INFRA_BTIF, "infra_btif", + "axi_sel", 31), + /* INFRA1 */ + GATE_INFRA1(CLK_INFRA_SPI0, "infra_spi0", + "spi_sel", 1), + GATE_INFRA1(CLK_INFRA_MSDC0, "infra_msdc0", + "msdc50_0_h_sel", 2), + GATE_INFRA1(CLK_INFRA_MSDC1, "infra_msdc1", + "msdc50_0_h_sel", 4), + GATE_INFRA1(CLK_INFRA_MSDC2, "infra_msdc2", + "msdc50_0_h_sel", 5), + GATE_INFRA1(CLK_INFRA_MSDC0_SRC, "infra_msdc0_src", + "msdc50_0_sel", 6), + GATE_INFRA1(CLK_INFRA_GCPU, "infra_gcpu", + "axi_sel", 8), + GATE_INFRA1(CLK_INFRA_TRNG, "infra_trng", + "axi_sel", 9), + GATE_INFRA1(CLK_INFRA_AUXADC, "infra_auxadc", + "clk26m", 10), + GATE_INFRA1(CLK_INFRA_CPUM, "infra_cpum", + "axi_sel", 11), + GATE_INFRA1(CLK_INFRA_CCIF1_AP, "infra_ccif1_ap", + "axi_sel", 12), + GATE_INFRA1(CLK_INFRA_CCIF1_MD, "infra_ccif1_md", + "axi_sel", 13), + GATE_INFRA1(CLK_INFRA_AUXADC_MD, "infra_auxadc_md", + "clk26m", 14), + GATE_INFRA1(CLK_INFRA_PCIE_TL_26M, "infra_pcie_tl_26m", + "axi_sel", 15), + GATE_INFRA1(CLK_INFRA_MSDC1_SRC, "infra_msdc1_src", + "msdc30_1_sel", 16), + GATE_INFRA1(CLK_INFRA_MSDC2_SRC, "infra_msdc2_src", + "msdc30_2_sel", 17), + GATE_INFRA1(CLK_INFRA_PCIE_TL_96M, "infra_pcie_tl_96m", + "axi_sel", 18), + GATE_INFRA1(CLK_INFRA_PCIE_PL_P_250M, "infra_pcie_pl_p_250m", + "axi_sel", 19), + GATE_INFRA1(CLK_INFRA_DEVICE_APC, "infra_device_apc", + "axi_sel", 20), + GATE_INFRA1(CLK_INFRA_CCIF_AP, "infra_ccif_ap", + "axi_sel", 23), + GATE_INFRA1(CLK_INFRA_DEBUGSYS, "infra_debugsys", + "axi_sel", 24), + GATE_INFRA1(CLK_INFRA_AUDIO, "infra_audio", + "axi_sel", 25), + GATE_INFRA1(CLK_INFRA_CCIF_MD, "infra_ccif_md", + "axi_sel", 26), + GATE_INFRA1(CLK_INFRA_DXCC_SEC_CORE, "infra_dxcc_sec_core", + "dxcc_sel", 27), + GATE_INFRA1(CLK_INFRA_DXCC_AO, "infra_dxcc_ao", + "dxcc_sel", 28), + GATE_INFRA1(CLK_INFRA_DBG_TRACE, "infra_dbg_trace", + "axi_sel", 29), + GATE_INFRA1(CLK_INFRA_DEVMPU_B, "infra_devmpu_b", + "axi_sel", 30), + GATE_INFRA1(CLK_INFRA_DRAMC_F26M, "infra_dramc_f26m", + "clk26m", 31), + /* INFRA2 */ + GATE_INFRA2(CLK_INFRA_IRTX, "infra_irtx", + "clk26m", 0), + GATE_INFRA2(CLK_INFRA_SSUSB, "infra_ssusb", + "usb_top_sel", 1), + GATE_INFRA2(CLK_INFRA_DISP_PWM, "infra_disp_pwm", + "axi_sel", 2), + GATE_INFRA2(CLK_INFRA_CLDMA_B, "infra_cldma_b", + "axi_sel", 3), + GATE_INFRA2(CLK_INFRA_AUDIO_26M_B, "infra_audio_26m_b", + "clk26m", 4), + GATE_INFRA2(CLK_INFRA_MODEM_TEMP_SHARE, "infra_modem_temp_share", + "clk26m", 5), + GATE_INFRA2(CLK_INFRA_SPI1, "infra_spi1", + "spi_sel", 6), + GATE_INFRA2(CLK_INFRA_I2C4, "infra_i2c4", + "i2c_sel", 7), + GATE_INFRA2(CLK_INFRA_SPI2, "infra_spi2", + "spi_sel", 9), + GATE_INFRA2(CLK_INFRA_SPI3, "infra_spi3", + "spi_sel", 10), + GATE_INFRA2(CLK_INFRA_UNIPRO_SYS, "infra_unipro_sys", + "ufs_sel", 11), + GATE_INFRA2(CLK_INFRA_UNIPRO_TICK, "infra_unipro_tick", + "clk26m", 12), + GATE_INFRA2(CLK_INFRA_UFS_MP_SAP_B, "infra_ufs_mp_sap_b", + "clk26m", 13), + GATE_INFRA2(CLK_INFRA_MD32_B, "infra_md32_b", + "axi_sel", 14), + GATE_INFRA2(CLK_INFRA_SSPM, "infra_sspm", + "sspm_sel", 15), + GATE_INFRA2(CLK_INFRA_UNIPRO_MBIST, "infra_unipro_mbist", + "axi_sel", 16), + GATE_INFRA2(CLK_INFRA_SSPM_BUS_H, "infra_sspm_bus_h", + "axi_sel", 17), + GATE_INFRA2(CLK_INFRA_I2C5, "infra_i2c5", + "i2c_sel", 18), + GATE_INFRA2(CLK_INFRA_I2C5_ARBITER, "infra_i2c5_arbiter", + "i2c_sel", 19), + GATE_INFRA2(CLK_INFRA_I2C5_IMM, "infra_i2c5_imm", + "i2c_sel", 20), + GATE_INFRA2(CLK_INFRA_I2C1_ARBITER, "infra_i2c1_arbiter", + "i2c_sel", 21), + GATE_INFRA2(CLK_INFRA_I2C1_IMM, "infra_i2c1_imm", + "i2c_sel", 22), + GATE_INFRA2(CLK_INFRA_I2C2_ARBITER, "infra_i2c2_arbiter", + "i2c_sel", 23), + GATE_INFRA2(CLK_INFRA_I2C2_IMM, "infra_i2c2_imm", + "i2c_sel", 24), + GATE_INFRA2(CLK_INFRA_SPI4, "infra_spi4", + "spi_sel", 25), + GATE_INFRA2(CLK_INFRA_SPI5, "infra_spi5", + "spi_sel", 26), + GATE_INFRA2(CLK_INFRA_CQ_DMA, "infra_cq_dma", + "axi_sel", 27), + GATE_INFRA2(CLK_INFRA_UFS, "infra_ufs", + "ufs_sel", 28), + GATE_INFRA2(CLK_INFRA_AES_UFSFDE, "infra_aes_ufsfde", + "aes_ufsfde_sel", 29), + GATE_INFRA2(CLK_INFRA_UFS_TICK, "infra_ufs_tick", + "ufs_sel", 30), + GATE_INFRA2(CLK_INFRA_SSUSB_XHCI, "infra_ssusb_xhci", + "ssusb_xhci_sel", 31), + /* INFRA3 */ + GATE_INFRA3(CLK_INFRA_MSDC0_SELF, "infra_msdc0_self", + "msdc50_0_sel", 0), + GATE_INFRA3(CLK_INFRA_MSDC1_SELF, "infra_msdc1_self", + "msdc50_0_sel", 1), + GATE_INFRA3(CLK_INFRA_MSDC2_SELF, "infra_msdc2_self", + "msdc50_0_sel", 2), + GATE_INFRA3(CLK_INFRA_SSPM_26M_SELF, "infra_sspm_26m_self", + "clk26m", 3), + GATE_INFRA3(CLK_INFRA_SSPM_32K_SELF, "infra_sspm_32k_self", + "clk32k", 4), + GATE_INFRA3(CLK_INFRA_UFS_AXI, "infra_ufs_axi", + "axi_sel", 5), + GATE_INFRA3(CLK_INFRA_I2C6, "infra_i2c6", + "i2c_sel", 6), + GATE_INFRA3(CLK_INFRA_AP_MSDC0, "infra_ap_msdc0", + "msdc50_0_sel", 7), + GATE_INFRA3(CLK_INFRA_MD_MSDC0, "infra_md_msdc0", + "msdc50_0_sel", 8), + GATE_INFRA3(CLK_INFRA_CCIF5_AP, "infra_ccif5_ap", + "axi_sel", 9), + GATE_INFRA3(CLK_INFRA_CCIF5_MD, "infra_ccif5_md", + "axi_sel", 10), + GATE_INFRA3(CLK_INFRA_PCIE_TOP_H_133M, "infra_pcie_top_h_133m", + "axi_sel", 11), + GATE_INFRA3(CLK_INFRA_FLASHIF_TOP_H_133M, "infra_flashif_top_h_133m", + "axi_sel", 14), + GATE_INFRA3(CLK_INFRA_PCIE_PERI_26M, "infra_pcie_peri_26m", + "axi_sel", 15), + GATE_INFRA3(CLK_INFRA_CCIF2_AP, "infra_ccif2_ap", + "axi_sel", 16), + GATE_INFRA3(CLK_INFRA_CCIF2_MD, "infra_ccif2_md", + "axi_sel", 17), + GATE_INFRA3(CLK_INFRA_CCIF3_AP, "infra_ccif3_ap", + "axi_sel", 18), + GATE_INFRA3(CLK_INFRA_CCIF3_MD, "infra_ccif3_md", + "axi_sel", 19), + GATE_INFRA3(CLK_INFRA_SEJ_F13M, "infra_sej_f13m", + "clk26m", 20), + GATE_INFRA3(CLK_INFRA_AES, "infra_aes", + "axi_sel", 21), + GATE_INFRA3(CLK_INFRA_I2C7, "infra_i2c7", + "i2c_sel", 22), + GATE_INFRA3(CLK_INFRA_I2C8, "infra_i2c8", + "i2c_sel", 23), + GATE_INFRA3(CLK_INFRA_FBIST2FPC, "infra_fbist2fpc", + "msdc50_0_sel", 24), + GATE_INFRA3(CLK_INFRA_DEVICE_APC_SYNC, "infra_device_apc_sync", + "axi_sel", 25), + GATE_INFRA3(CLK_INFRA_DPMAIF_MAIN, "infra_dpmaif_main", + "dpmaif_main_sel", 26), + GATE_INFRA3(CLK_INFRA_PCIE_TL_32K, "infra_pcie_tl_32k", + "axi_sel", 27), + GATE_INFRA3(CLK_INFRA_CCIF4_AP, "infra_ccif4_ap", + "axi_sel", 28), + GATE_INFRA3(CLK_INFRA_CCIF4_MD, "infra_ccif4_md", + "axi_sel", 29), + GATE_INFRA3(CLK_INFRA_SPI6, "infra_spi6", + "spi_sel", 30), + GATE_INFRA3(CLK_INFRA_SPI7, "infra_spi7", + "spi_sel", 31), + /* INFRA4 */ + GATE_INFRA4(CLK_INFRA_AP_DMA, "infra_ap_dma", + "infra_ap_dma_pseudo", 31), + /* INFRA5 */ + GATE_INFRA5(CLK_INFRA_133M, "infra_133m", + "axi_sel", 0), + GATE_INFRA5(CLK_INFRA_66M, "infra_66m", + "axi_sel", 1), + GATE_INFRA5(CLK_INFRA_66M_PERI_BUS, "infra_66m_peri_bus", + "axi_sel", 2), + GATE_INFRA5(CLK_INFRA_FREE_DCM_133M, "infra_free_dcm_133m", + "axi_sel", 3), + GATE_INFRA5(CLK_INFRA_FREE_DCM_66M, "infra_free_dcm_66m", + "axi_sel", 4), + GATE_INFRA5(CLK_INFRA_PERI_BUS_DCM_133M, "infra_peri_bus_dcm_133m", + "axi_sel", 5), + GATE_INFRA5(CLK_INFRA_PERI_BUS_DCM_66M, "infra_peri_bus_dcm_66m", + "axi_sel", 6), + GATE_INFRA5(CLK_INFRA_FLASHIF_PERI_26M, "infra_flashif_peri_26m", + "axi_sel", 30), + GATE_INFRA5(CLK_INFRA_FLASHIF_SFLASH, "infra_flashif_fsflash", + "axi_sel", 31), +}; + +static const struct mtk_gate_regs peri_cg_regs = { + .set_ofs = 0x20c, + .clr_ofs = 0x20c, + .sta_ofs = 0x20c, +}; + +#define GATE_PERI(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &peri_cg_regs, _shift, \ + &mtk_clk_gate_ops_no_setclr_inv) + +static const struct mtk_gate peri_clks[] = { + GATE_PERI(CLK_PERI_PERIAXI, "peri_periaxi", "axi_sel", 31), +}; + +static const struct mtk_gate_regs top_cg_regs = { + .set_ofs = 0x150, + .clr_ofs = 0x150, + .sta_ofs = 0x150, +}; + +#define GATE_TOP(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &top_cg_regs, _shift, \ + &mtk_clk_gate_ops_no_setclr_inv) + +static const struct mtk_gate top_clks[] = { + GATE_TOP(CLK_TOP_SSUSB_TOP_REF, "ssusb_top_ref", "clk26m", 24), + GATE_TOP(CLK_TOP_SSUSB_PHY_REF, "ssusb_phy_ref", "clk26m", 25), +}; + +#define MT8192_PLL_FMAX (3800UL * MHZ) +#define MT8192_PLL_FMIN (1500UL * MHZ) +#define MT8192_INTEGER_BITS 8 + +#define PLL(_id, _name, _reg, _pwr_reg, _en_mask, _flags, \ + _rst_bar_mask, _pcwbits, _pd_reg, _pd_shift, \ + _tuner_reg, _tuner_en_reg, _tuner_en_bit, \ + _pcw_reg, _pcw_shift, _pcw_chg_reg, \ + _en_reg, _base_en_bit) { \ + .id = _id, \ + .name = _name, \ + .reg = _reg, \ + .pwr_reg = _pwr_reg, \ + .en_mask = _en_mask, \ + .flags = _flags, \ + .rst_bar_mask = _rst_bar_mask, \ + .fmax = MT8192_PLL_FMAX, \ + .fmin = MT8192_PLL_FMIN, \ + .pcwbits = _pcwbits, \ + .pcwibits = MT8192_INTEGER_BITS, \ + .pd_reg = _pd_reg, \ + .pd_shift = _pd_shift, \ + .tuner_reg = _tuner_reg, \ + .tuner_en_reg = _tuner_en_reg, \ + .tuner_en_bit = _tuner_en_bit, \ + .pcw_reg = _pcw_reg, \ + .pcw_shift = _pcw_shift, \ + .pcw_chg_reg = _pcw_chg_reg, \ + .en_reg = _en_reg, \ + .base_en_bit = _base_en_bit, \ + } + +#define PLL_B(_id, _name, _reg, _pwr_reg, _en_mask, _flags, \ + _rst_bar_mask, _pcwbits, _pd_reg, _pd_shift, \ + _tuner_reg, _tuner_en_reg, _tuner_en_bit, \ + _pcw_reg, _pcw_shift) \ + PLL(_id, _name, _reg, _pwr_reg, _en_mask, _flags, \ + _rst_bar_mask, _pcwbits, _pd_reg, _pd_shift, \ + _tuner_reg, _tuner_en_reg, _tuner_en_bit, \ + _pcw_reg, _pcw_shift, 0, 0, 0) + +static const struct mtk_pll_data plls[] = { + PLL_B(CLK_APMIXED_MAINPLL, "mainpll", 0x0340, 0x034c, 0xff000001, + HAVE_RST_BAR, BIT(23), 22, 0x0344, 24, 0, 0, 0, 0x0344, 0), + PLL_B(CLK_APMIXED_UNIVPLL, "univpll", 0x0308, 0x0314, 0xff000001, + HAVE_RST_BAR, BIT(23), 22, 0x030c, 24, 0, 0, 0, 0x030c, 0), + PLL(CLK_APMIXED_USBPLL, "usbpll", 0x03c4, 0x03cc, 0x00000000, + 0, 0, 22, 0x03c4, 24, 0, 0, 0, 0x03c4, 0, 0x03c4, 0x03cc, 2), + PLL_B(CLK_APMIXED_MSDCPLL, "msdcpll", 0x0350, 0x035c, 0x00000001, + 0, 0, 22, 0x0354, 24, 0, 0, 0, 0x0354, 0), + PLL_B(CLK_APMIXED_MMPLL, "mmpll", 0x0360, 0x036c, 0xff000001, + HAVE_RST_BAR, BIT(23), 22, 0x0364, 24, 0, 0, 0, 0x0364, 0), + PLL_B(CLK_APMIXED_ADSPPLL, "adsppll", 0x0370, 0x037c, 0xff000001, + HAVE_RST_BAR, BIT(23), 22, 0x0374, 24, 0, 0, 0, 0x0374, 0), + PLL_B(CLK_APMIXED_MFGPLL, "mfgpll", 0x0268, 0x0274, 0x00000001, + 0, 0, 22, 0x026c, 24, 0, 0, 0, 0x026c, 0), + PLL_B(CLK_APMIXED_TVDPLL, "tvdpll", 0x0380, 0x038c, 0x00000001, + 0, 0, 22, 0x0384, 24, 0, 0, 0, 0x0384, 0), + PLL_B(CLK_APMIXED_APLL1, "apll1", 0x0318, 0x0328, 0x00000001, + 0, 0, 32, 0x031c, 24, 0x0040, 0x000c, 0, 0x0320, 0), + PLL_B(CLK_APMIXED_APLL2, "apll2", 0x032c, 0x033c, 0x00000001, + 0, 0, 32, 0x0330, 24, 0, 0, 0, 0x0334, 0), +}; + +static struct clk_onecell_data *top_clk_data; + +static void clk_mt8192_top_init_early(struct device_node *node) +{ + int i; + + top_clk_data = mtk_alloc_clk_data(CLK_TOP_NR_CLK); + + for (i = 0; i < CLK_TOP_NR_CLK; i++) + top_clk_data->clks[i] = ERR_PTR(-EPROBE_DEFER); + + mtk_clk_register_factors(top_early_divs, ARRAY_SIZE(top_early_divs), + top_clk_data); + + of_clk_add_provider(node, of_clk_src_onecell_get, top_clk_data); +} + +CLK_OF_DECLARE_DRIVER(mt8192_topckgen, "mediatek,mt8192-topckgen", + clk_mt8192_top_init_early); + +static int clk_mt8192_top_probe(struct platform_device *pdev) +{ + struct device_node *node = pdev->dev.of_node; + void __iomem *base; + + base = devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(base)) + return PTR_ERR(base); + + mtk_clk_register_fixed_clks(top_fixed_clks, ARRAY_SIZE(top_fixed_clks), + top_clk_data); + mtk_clk_register_factors(top_early_divs, ARRAY_SIZE(top_early_divs), + top_clk_data); + mtk_clk_register_factors(top_divs, ARRAY_SIZE(top_divs), top_clk_data); + mtk_clk_register_muxes(top_mtk_muxes, ARRAY_SIZE(top_mtk_muxes), node, + &mt8192_clk_lock, top_clk_data); + + mtk_clk_register_composites(top_muxes, ARRAY_SIZE(top_muxes), base, + &mt8192_clk_lock, top_clk_data); + mtk_clk_register_composites(top_adj_divs, ARRAY_SIZE(top_adj_divs), + base, &mt8192_clk_lock, top_clk_data); + mtk_clk_register_gates(node, top_clks, ARRAY_SIZE(top_clks), + top_clk_data); + + return of_clk_add_provider(node, of_clk_src_onecell_get, top_clk_data); +} + +static int clk_mt8192_infra_probe(struct platform_device *pdev) +{ + struct clk_onecell_data *clk_data; + struct device_node *node = pdev->dev.of_node; + + clk_data = mtk_alloc_clk_data(CLK_INFRA_NR_CLK); + + mtk_clk_register_gates(node, infra_clks, ARRAY_SIZE(infra_clks), + clk_data); + + return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data); +} + +static int clk_mt8192_peri_probe(struct platform_device *pdev) +{ + struct clk_onecell_data *clk_data; + struct device_node *node = pdev->dev.of_node; + + clk_data = mtk_alloc_clk_data(CLK_PERI_NR_CLK); + + mtk_clk_register_gates(node, peri_clks, ARRAY_SIZE(peri_clks), + clk_data); + + return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data); +} + +static int clk_mt8192_apmixed_probe(struct platform_device *pdev) +{ + struct clk_onecell_data *clk_data; + struct device_node *node = pdev->dev.of_node; + + clk_data = mtk_alloc_clk_data(CLK_APMIXED_NR_CLK); + + mtk_clk_register_plls(node, plls, ARRAY_SIZE(plls), clk_data); + mtk_clk_register_gates(node, apmixed_clks, ARRAY_SIZE(apmixed_clks), + clk_data); + + return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data); +} + +static const struct of_device_id of_match_clk_mt8192[] = { + { + .compatible = "mediatek,mt8192-apmixedsys", + .data = clk_mt8192_apmixed_probe, + }, { + .compatible = "mediatek,mt8192-topckgen", + .data = clk_mt8192_top_probe, + }, { + .compatible = "mediatek,mt8192-infracfg", + .data = clk_mt8192_infra_probe, + }, { + .compatible = "mediatek,mt8192-pericfg", + .data = clk_mt8192_peri_probe, + }, { + /* sentinel */ + } +}; + +static int clk_mt8192_probe(struct platform_device *pdev) +{ + int (*clk_probe)(struct platform_device *pdev); + int r; + + clk_probe = of_device_get_match_data(&pdev->dev); + if (!clk_probe) + return -EINVAL; + + r = clk_probe(pdev); + if (r) + dev_err(&pdev->dev, + "could not register clock provider: %s: %d\n", + pdev->name, r); + + return r; +} + +static struct platform_driver clk_mt8192_drv = { + .probe = clk_mt8192_probe, + .driver = { + .name = "clk-mt8192", + .of_match_table = of_match_clk_mt8192, + }, +}; + +static int __init clk_mt8192_init(void) +{ + return platform_driver_register(&clk_mt8192_drv); +} + +arch_initcall(clk_mt8192_init); diff --git a/drivers/clk/mediatek/clk-mux.h b/drivers/clk/mediatek/clk-mux.h index f5625f4..afbc7df 100644 --- a/drivers/clk/mediatek/clk-mux.h +++ b/drivers/clk/mediatek/clk-mux.h @@ -77,6 +77,21 @@ struct mtk_mux { _width, _gate, _upd_ofs, _upd, \ CLK_SET_RATE_PARENT) +#define MUX_CLR_SET_UPD_FLAGS(_id, _name, _parents, _mux_ofs, \ + _mux_set_ofs, _mux_clr_ofs, _shift, _width, \ + _upd_ofs, _upd, _flags) \ + GATE_CLR_SET_UPD_FLAGS(_id, _name, _parents, _mux_ofs, \ + _mux_set_ofs, _mux_clr_ofs, _shift, _width, \ + 0, _upd_ofs, _upd, _flags, \ + mtk_mux_clr_set_upd_ops) + +#define MUX_CLR_SET_UPD(_id, _name, _parents, _mux_ofs, \ + _mux_set_ofs, _mux_clr_ofs, _shift, _width, \ + _upd_ofs, _upd) \ + MUX_CLR_SET_UPD_FLAGS(_id, _name, _parents, \ + _mux_ofs, _mux_set_ofs, _mux_clr_ofs, _shift, \ + _width, _upd_ofs, _upd, CLK_SET_RATE_PARENT) + struct clk *mtk_clk_register_mux(const struct mtk_mux *mux, struct regmap *regmap, spinlock_t *lock); -- 1.8.1.1.dirty _______________________________________________ Linux-mediatek mailing list Linux-mediatek@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-mediatek