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 Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 69127C4167B for ; Fri, 30 Dec 2022 12:57:13 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234743AbiL3M5M (ORCPT ); Fri, 30 Dec 2022 07:57:12 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58314 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234736AbiL3M5L (ORCPT ); Fri, 30 Dec 2022 07:57:11 -0500 Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 874B01ADA8 for ; Fri, 30 Dec 2022 04:57:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1672405028; x=1703941028; h=message-id:date:mime-version:subject:to:cc:references: from:in-reply-to:content-transfer-encoding; bh=czPmX38TXrjNbvT1yr17WS7KsnbMiIVchomEQlmXN1w=; b=MZ8513hF65AQ4SrdQbSjTTGTOUULuFwYoBQxXNnj007sJjQUoYrexWfT VQnmuscR2dQ2OTuy8LQoX1F63QqTOilPff7H7Eg5XEnprl5ZzCrZydKk8 aYQBUNDDoKesu9lS1qIOtE/mOl4o3L8+cgojayAEnkkB6lOqjwOVv5Av3 5qGj6GqZt+HQuOK+Y6uHKGQJRtvA7dxxdjYbsK6/bsnsHdOZiOuwJhvpz zZh520QTE89s0OjW0+71hL/8o5HIQffSpqE+AWQ9FxpRqJxYYV6rN2Fr1 dgA3Bqa17eESTSI3S5J42ZpL0e7H/MtJqAvlxLVhDBio08aRpfbl00LQn A==; X-IronPort-AV: E=McAfee;i="6500,9779,10575"; a="319922234" X-IronPort-AV: E=Sophos;i="5.96,287,1665471600"; d="scan'208";a="319922234" Received: from orsmga004.jf.intel.com ([10.7.209.38]) by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 30 Dec 2022 04:57:08 -0800 X-IronPort-AV: E=McAfee;i="6500,9779,10575"; a="777952406" X-IronPort-AV: E=Sophos;i="5.96,287,1665471600"; d="scan'208";a="777952406" Received: from ahunter6-mobl1.ger.corp.intel.com (HELO [10.0.2.15]) ([10.252.63.216]) by orsmga004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 30 Dec 2022 04:57:05 -0800 Message-ID: <873d21fa-d9ff-ee94-40a1-3354850c8865@intel.com> Date: Fri, 30 Dec 2022 14:57:00 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0 Thunderbird/102.6.1 Subject: Re: [PATCH] mmc: sdhci-of-arasan: Override SDHCI_RETUNING_TIMER_COUNT_MASK on ZynqMP Content-Language: en-US To: Marek Vasut , linux-mmc@vger.kernel.org Cc: Michal Simek , Ulf Hansson , linux-arm-kernel@lists.infradead.org References: <20221025191500.149167-1-marex@denx.de> <2b523371-7eeb-25f2-8879-76bbf028f4bb@intel.com> <8958eb65-e873-a760-5ca4-a51b36f5e23d@denx.de> From: Adrian Hunter Organization: Intel Finland Oy, Registered Address: PL 281, 00181 Helsinki, Business Identity Code: 0357606 - 4, Domiciled in Helsinki In-Reply-To: <8958eb65-e873-a760-5ca4-a51b36f5e23d@denx.de> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-mmc@vger.kernel.org On 30/12/22 08:42, Marek Vasut wrote: > On 12/29/22 13:51, Adrian Hunter wrote: >> On 26/10/22 12:20, Marek Vasut wrote: >>> On 10/26/22 08:07, Adrian Hunter wrote: >>>> On 25/10/22 22:15, Marek Vasut wrote: >>>>> On Xilinx ZynqMP, the reg_capabilities (SDIO) Register >>>>> >>>>> https://www.xilinx.com/htmldocs/registers/ug1087/sdio___reg_capabilities.html# >>>>> Absolute Address  0x00FF160040 (SD0) >>>>> Reset Value       0x280737EC6481 >>>>> >>>>> really reads 0x200737EC6481 . The interesting part is the >>>>> top 32 bits, which are SDHCI_CAPABILITIES_1 = 0x2007. The >>>>> missing 0x800 is SDHCI_RETUNING_TIMER_COUNT_MASK=0, which >>>>> makes the SDHCI core disable retuning timer. >>>>> >>>>> Fix this up here by explicitly setting tuning_count to 8 >>>>> as it should be, otherwise an eMMC might fail in various >>>>> thermal conditions >>>>> >>>>> Note that the diff is best shown with -w option, this makes it >>>>> visible what happened with !sdhci_arasan->has_cqe conditional, >>>>> which is placed between sdhci_setup_host() and __sdhci_add_host() >>>>> calls. Since sdhci_add_host() is also a sequence of these two >>>>> calls and host->tuning_count must be overriden before calling >>>> >>>> overriden -> overridden >>> >>> Fixed >>> >>>>> __sdhci_add_host(), call the two calls separately and do all >>>>> the adjustments between them in either case. >>>>> >>>>> Signed-off-by: Marek Vasut >>>>> --- >>>>> Cc: Michal Simek >>>>> Cc: Adrian Hunter >>>>> Cc: Ulf Hansson >>>>> Cc: linux-arm-kernel@lists.infradead.org >>>>> To: linux-mmc@vger.kernel.org >>>>> --- >>>>>    drivers/mmc/host/sdhci-of-arasan.c | 57 ++++++++++++++++++++---------- >>>>>    1 file changed, 38 insertions(+), 19 deletions(-) >>>>> >>>>> diff --git a/drivers/mmc/host/sdhci-of-arasan.c b/drivers/mmc/host/sdhci-of-arasan.c >>>>> index 3997cad1f793d..465498f2a7c0f 100644 >>>>> --- a/drivers/mmc/host/sdhci-of-arasan.c >>>>> +++ b/drivers/mmc/host/sdhci-of-arasan.c >>>>> @@ -1521,37 +1521,56 @@ static int sdhci_arasan_register_sdclk(struct sdhci_arasan_data *sdhci_arasan, >>>>>        return 0; >>>>>    } >>>>>    -static int sdhci_arasan_add_host(struct sdhci_arasan_data *sdhci_arasan) >>>>> +static int sdhci_arasan_add_host(struct sdhci_arasan_data *sdhci_arasan, >>>>> +                 struct device *dev) >>>>>    { >>>>>        struct sdhci_host *host = sdhci_arasan->host; >>>>>        struct cqhci_host *cq_host; >>>>>        bool dma64; >>>>>        int ret; >>>>>    -    if (!sdhci_arasan->has_cqe) >>>>> -        return sdhci_add_host(host); >>>>> - >>>>>        ret = sdhci_setup_host(host); >>>>>        if (ret) >>>>>            return ret; >>>>>    -    cq_host = devm_kzalloc(host->mmc->parent, >>>>> -                   sizeof(*cq_host), GFP_KERNEL); >>>>> -    if (!cq_host) { >>>>> -        ret = -ENOMEM; >>>>> -        goto cleanup; >>>>> -    } >>>>> +    /* >>>>> +     * On Xilinx ZynqMP, the reg_capabilities (SDIO) Register >>>>> +     * >>>>> +     * https://www.xilinx.com/htmldocs/registers/ug1087/sdio___reg_capabilities.html# >>>>> +     * Absolute Address  0x00FF160040 (SD0) >>>>> +     * Reset Value         0x280737EC6481 >>>>> +     * >>>>> +     * really reads 0x200737EC6481 . The interesting part is the >>>>> +     * top 32 bits, which are SDHCI_CAPABILITIES_1 = 0x2007. The >>>>> +     * missing 0x800 is SDHCI_RETUNING_TIMER_COUNT_MASK=0, which >>>>> +     * makes the SDHCI core disable retuning timer. >>>> >>>> Are you aware that caps can be changed in DT via "sdhci-caps" and >>>> "sdhci-caps-mask" ? >>> >>> No, I wasn't aware of those. >>> >>> Is that the preferred approach to this fix, over handling it in the driver ? >> >> I guess ideally.  Mainline does not really need the driver >> fix because it seems it can be done by DT.  Older kernels >> are a separate issue really. >> >>> >>> I think the driver-side fix would be preferable, because it also fixes systems which use legacy DTs without the sdhci-caps properties, which would be all ZynqMP systems thus far. >> >> You could backport support of the properties "sdhci-caps" >> and "sdhci-caps-mask". > > This won't help. Vivado (the xilinx FPGA design tool) is capable of generating DTs, so you can end up with a combination of new Linux kernel and old generated DT, which is still missing the sdhci-caps/sdhci-caps-mask . That is a bit sad. You might want to push for changing that situation. Send an updated patch then. 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 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 686F4C4167B for ; Fri, 30 Dec 2022 14:03:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:From:References:Cc:To: Subject:MIME-Version:Date:Message-ID:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=28YUbEcABJPYR9PJjrVO5MYmq2UdPUPyq5qZO+9Pujw=; b=utzTvFbhN2o1vJ Y0+S32yeJlKosT9B6YQ4OOQag8E4Kn4pBvDEJeg9ZOp/45xx0bxjClZx3ZHo8qByf0heVxrV4vzU6 btpSYQLxes7MlWIFTRD81SEVdRaImXA4uSwaEmtJte0yRLiqAUrgvgUcLa7fXppJjxYYCOTnj5N1/ si7Ymp43fIKIPpb08fIjhmJaMurDpAzQbBDVRXQW2OwoqWc9U6hqjuE6kA0ABMh6H5TYaMGfY03ZY vFX0yWpPqoDgyE3regm1nVRgl6aAwE6ft58nP4acQQe8bd4fvGW2jBmqZrGgzB8UaCUuv32f7LQ/s NZkAasVD4SyD9zxav9yg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1pBFxE-009kR1-OA; Fri, 30 Dec 2022 14:01:51 +0000 Received: from mga04.intel.com ([192.55.52.120]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1pBEwg-009CXh-JR for linux-arm-kernel@lists.infradead.org; Fri, 30 Dec 2022 12:57:12 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1672405030; x=1703941030; h=message-id:date:mime-version:subject:to:cc:references: from:in-reply-to:content-transfer-encoding; bh=czPmX38TXrjNbvT1yr17WS7KsnbMiIVchomEQlmXN1w=; b=gL8jn+khswnDqcQ+wcs6KGbLwk8tyxBIogKd+5xdqmQbpI8Xh0ARqDji JBp3oRbJyRxmWxsqD+JC9DJeNUmGr1x7dOuVLvEawYdEedOX6zxGsQsxv ybOzPpRP4xGB5SgXAQK7et82KzJYVDz5eXkNhbWb0LVacty3kqPDGDK0w U2/dmGlu3LQk9KHs4mJJT508eIOauqpj3uxxYaqnKlL4xiddBD5u2LRCY ydk5xh+t/qJEzDfVDGsb7F/BQFLs3GEeQLRWF5qzGsIO8ebEAjlvplqU0 KBiBDVtS56fIU04btaRB3hVRwjz/kvLA5f+h28XOzyrTFThJcoMippKTX w==; X-IronPort-AV: E=McAfee;i="6500,9779,10575"; a="319922235" X-IronPort-AV: E=Sophos;i="5.96,287,1665471600"; d="scan'208";a="319922235" Received: from orsmga004.jf.intel.com ([10.7.209.38]) by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 30 Dec 2022 04:57:08 -0800 X-IronPort-AV: E=McAfee;i="6500,9779,10575"; a="777952406" X-IronPort-AV: E=Sophos;i="5.96,287,1665471600"; d="scan'208";a="777952406" Received: from ahunter6-mobl1.ger.corp.intel.com (HELO [10.0.2.15]) ([10.252.63.216]) by orsmga004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 30 Dec 2022 04:57:05 -0800 Message-ID: <873d21fa-d9ff-ee94-40a1-3354850c8865@intel.com> Date: Fri, 30 Dec 2022 14:57:00 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0 Thunderbird/102.6.1 Subject: Re: [PATCH] mmc: sdhci-of-arasan: Override SDHCI_RETUNING_TIMER_COUNT_MASK on ZynqMP Content-Language: en-US To: Marek Vasut , linux-mmc@vger.kernel.org Cc: Michal Simek , Ulf Hansson , linux-arm-kernel@lists.infradead.org References: <20221025191500.149167-1-marex@denx.de> <2b523371-7eeb-25f2-8879-76bbf028f4bb@intel.com> <8958eb65-e873-a760-5ca4-a51b36f5e23d@denx.de> From: Adrian Hunter Organization: Intel Finland Oy, Registered Address: PL 281, 00181 Helsinki, Business Identity Code: 0357606 - 4, Domiciled in Helsinki In-Reply-To: <8958eb65-e873-a760-5ca4-a51b36f5e23d@denx.de> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20221230_045710_700456_A5A91775 X-CRM114-Status: GOOD ( 19.25 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org T24gMzAvMTIvMjIgMDg6NDIsIE1hcmVrIFZhc3V0IHdyb3RlOgo+IE9uIDEyLzI5LzIyIDEzOjUx LCBBZHJpYW4gSHVudGVyIHdyb3RlOgo+PiBPbiAyNi8xMC8yMiAxMjoyMCwgTWFyZWsgVmFzdXQg d3JvdGU6Cj4+PiBPbiAxMC8yNi8yMiAwODowNywgQWRyaWFuIEh1bnRlciB3cm90ZToKPj4+PiBP biAyNS8xMC8yMiAyMjoxNSwgTWFyZWsgVmFzdXQgd3JvdGU6Cj4+Pj4+IE9uIFhpbGlueCBaeW5x TVAsIHRoZSByZWdfY2FwYWJpbGl0aWVzIChTRElPKSBSZWdpc3Rlcgo+Pj4+Pgo+Pj4+PiBodHRw czovL3d3dy54aWxpbnguY29tL2h0bWxkb2NzL3JlZ2lzdGVycy91ZzEwODcvc2Rpb19fX3JlZ19j YXBhYmlsaXRpZXMuaHRtbCMKPj4+Pj4gQWJzb2x1dGUgQWRkcmVzc8KgIDB4MDBGRjE2MDA0MCAo U0QwKQo+Pj4+PiBSZXNldCBWYWx1ZcKgwqDCoMKgwqDCoCAweDI4MDczN0VDNjQ4MQo+Pj4+Pgo+ Pj4+PiByZWFsbHkgcmVhZHMgMHgyMDA3MzdFQzY0ODEgLiBUaGUgaW50ZXJlc3RpbmcgcGFydCBp cyB0aGUKPj4+Pj4gdG9wIDMyIGJpdHMsIHdoaWNoIGFyZSBTREhDSV9DQVBBQklMSVRJRVNfMSA9 IDB4MjAwNy4gVGhlCj4+Pj4+IG1pc3NpbmcgMHg4MDAgaXMgU0RIQ0lfUkVUVU5JTkdfVElNRVJf Q09VTlRfTUFTSz0wLCB3aGljaAo+Pj4+PiBtYWtlcyB0aGUgU0RIQ0kgY29yZSBkaXNhYmxlIHJl dHVuaW5nIHRpbWVyLgo+Pj4+Pgo+Pj4+PiBGaXggdGhpcyB1cCBoZXJlIGJ5IGV4cGxpY2l0bHkg c2V0dGluZyB0dW5pbmdfY291bnQgdG8gOAo+Pj4+PiBhcyBpdCBzaG91bGQgYmUsIG90aGVyd2lz ZSBhbiBlTU1DIG1pZ2h0IGZhaWwgaW4gdmFyaW91cwo+Pj4+PiB0aGVybWFsIGNvbmRpdGlvbnMK Pj4+Pj4KPj4+Pj4gTm90ZSB0aGF0IHRoZSBkaWZmIGlzIGJlc3Qgc2hvd24gd2l0aCAtdyBvcHRp b24sIHRoaXMgbWFrZXMgaXQKPj4+Pj4gdmlzaWJsZSB3aGF0IGhhcHBlbmVkIHdpdGggIXNkaGNp X2FyYXNhbi0+aGFzX2NxZSBjb25kaXRpb25hbCwKPj4+Pj4gd2hpY2ggaXMgcGxhY2VkIGJldHdl ZW4gc2RoY2lfc2V0dXBfaG9zdCgpIGFuZCBfX3NkaGNpX2FkZF9ob3N0KCkKPj4+Pj4gY2FsbHMu IFNpbmNlIHNkaGNpX2FkZF9ob3N0KCkgaXMgYWxzbyBhIHNlcXVlbmNlIG9mIHRoZXNlIHR3bwo+ Pj4+PiBjYWxscyBhbmQgaG9zdC0+dHVuaW5nX2NvdW50IG11c3QgYmUgb3ZlcnJpZGVuIGJlZm9y ZSBjYWxsaW5nCj4+Pj4KPj4+PiBvdmVycmlkZW4gLT4gb3ZlcnJpZGRlbgo+Pj4KPj4+IEZpeGVk Cj4+Pgo+Pj4+PiBfX3NkaGNpX2FkZF9ob3N0KCksIGNhbGwgdGhlIHR3byBjYWxscyBzZXBhcmF0 ZWx5IGFuZCBkbyBhbGwKPj4+Pj4gdGhlIGFkanVzdG1lbnRzIGJldHdlZW4gdGhlbSBpbiBlaXRo ZXIgY2FzZS4KPj4+Pj4KPj4+Pj4gU2lnbmVkLW9mZi1ieTogTWFyZWsgVmFzdXQgPG1hcmV4QGRl bnguZGU+Cj4+Pj4+IC0tLQo+Pj4+PiBDYzogTWljaGFsIFNpbWVrIDxtaWNoYWwuc2ltZWtAeGls aW54LmNvbT4KPj4+Pj4gQ2M6IEFkcmlhbiBIdW50ZXIgPGFkcmlhbi5odW50ZXJAaW50ZWwuY29t Pgo+Pj4+PiBDYzogVWxmIEhhbnNzb24gPHVsZi5oYW5zc29uQGxpbmFyby5vcmc+Cj4+Pj4+IENj OiBsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKPj4+Pj4gVG86IGxpbnV4LW1t Y0B2Z2VyLmtlcm5lbC5vcmcKPj4+Pj4gLS0tCj4+Pj4+IMKgwqAgZHJpdmVycy9tbWMvaG9zdC9z ZGhjaS1vZi1hcmFzYW4uYyB8IDU3ICsrKysrKysrKysrKysrKysrKysrLS0tLS0tLS0tLQo+Pj4+ PiDCoMKgIDEgZmlsZSBjaGFuZ2VkLCAzOCBpbnNlcnRpb25zKCspLCAxOSBkZWxldGlvbnMoLSkK Pj4+Pj4KPj4+Pj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktb2YtYXJhc2Fu LmMgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLW9mLWFyYXNhbi5jCj4+Pj4+IGluZGV4IDM5OTdj YWQxZjc5M2QuLjQ2NTQ5OGYyYTdjMGYgMTAwNjQ0Cj4+Pj4+IC0tLSBhL2RyaXZlcnMvbW1jL2hv c3Qvc2RoY2ktb2YtYXJhc2FuLmMKPj4+Pj4gKysrIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1v Zi1hcmFzYW4uYwo+Pj4+PiBAQCAtMTUyMSwzNyArMTUyMSw1NiBAQCBzdGF0aWMgaW50IHNkaGNp X2FyYXNhbl9yZWdpc3Rlcl9zZGNsayhzdHJ1Y3Qgc2RoY2lfYXJhc2FuX2RhdGEgKnNkaGNpX2Fy YXNhbiwKPj4+Pj4gwqDCoMKgwqDCoMKgIHJldHVybiAwOwo+Pj4+PiDCoMKgIH0KPj4+Pj4gwqDC oCAtc3RhdGljIGludCBzZGhjaV9hcmFzYW5fYWRkX2hvc3Qoc3RydWN0IHNkaGNpX2FyYXNhbl9k YXRhICpzZGhjaV9hcmFzYW4pCj4+Pj4+ICtzdGF0aWMgaW50IHNkaGNpX2FyYXNhbl9hZGRfaG9z dChzdHJ1Y3Qgc2RoY2lfYXJhc2FuX2RhdGEgKnNkaGNpX2FyYXNhbiwKPj4+Pj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHN0cnVjdCBkZXZpY2UgKmRldikKPj4+Pj4gwqDCoCB7 Cj4+Pj4+IMKgwqDCoMKgwqDCoCBzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCA9IHNkaGNpX2FyYXNh bi0+aG9zdDsKPj4+Pj4gwqDCoMKgwqDCoMKgIHN0cnVjdCBjcWhjaV9ob3N0ICpjcV9ob3N0Owo+ Pj4+PiDCoMKgwqDCoMKgwqAgYm9vbCBkbWE2NDsKPj4+Pj4gwqDCoMKgwqDCoMKgIGludCByZXQ7 Cj4+Pj4+IMKgwqAgLcKgwqDCoCBpZiAoIXNkaGNpX2FyYXNhbi0+aGFzX2NxZSkKPj4+Pj4gLcKg wqDCoMKgwqDCoMKgIHJldHVybiBzZGhjaV9hZGRfaG9zdChob3N0KTsKPj4+Pj4gLQo+Pj4+PiDC oMKgwqDCoMKgwqAgcmV0ID0gc2RoY2lfc2V0dXBfaG9zdChob3N0KTsKPj4+Pj4gwqDCoMKgwqDC oMKgIGlmIChyZXQpCj4+Pj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldHVybiByZXQ7Cj4+Pj4+ IMKgwqAgLcKgwqDCoCBjcV9ob3N0ID0gZGV2bV9remFsbG9jKGhvc3QtPm1tYy0+cGFyZW50LAo+ Pj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHNpemVvZigqY3FfaG9z dCksIEdGUF9LRVJORUwpOwo+Pj4+PiAtwqDCoMKgIGlmICghY3FfaG9zdCkgewo+Pj4+PiAtwqDC oMKgwqDCoMKgwqAgcmV0ID0gLUVOT01FTTsKPj4+Pj4gLcKgwqDCoMKgwqDCoMKgIGdvdG8gY2xl YW51cDsKPj4+Pj4gLcKgwqDCoCB9Cj4+Pj4+ICvCoMKgwqAgLyoKPj4+Pj4gK8KgwqDCoMKgICog T24gWGlsaW54IFp5bnFNUCwgdGhlIHJlZ19jYXBhYmlsaXRpZXMgKFNESU8pIFJlZ2lzdGVyCj4+ Pj4+ICvCoMKgwqDCoCAqCj4+Pj4+ICvCoMKgwqDCoCAqIGh0dHBzOi8vd3d3LnhpbGlueC5jb20v aHRtbGRvY3MvcmVnaXN0ZXJzL3VnMTA4Ny9zZGlvX19fcmVnX2NhcGFiaWxpdGllcy5odG1sIwo+ Pj4+PiArwqDCoMKgwqAgKiBBYnNvbHV0ZSBBZGRyZXNzwqAgMHgwMEZGMTYwMDQwIChTRDApCj4+ Pj4+ICvCoMKgwqDCoCAqIFJlc2V0IFZhbHVlwqDCoMKgwqDCoMKgwqDCoCAweDI4MDczN0VDNjQ4 MQo+Pj4+PiArwqDCoMKgwqAgKgo+Pj4+PiArwqDCoMKgwqAgKiByZWFsbHkgcmVhZHMgMHgyMDA3 MzdFQzY0ODEgLiBUaGUgaW50ZXJlc3RpbmcgcGFydCBpcyB0aGUKPj4+Pj4gK8KgwqDCoMKgICog dG9wIDMyIGJpdHMsIHdoaWNoIGFyZSBTREhDSV9DQVBBQklMSVRJRVNfMSA9IDB4MjAwNy4gVGhl Cj4+Pj4+ICvCoMKgwqDCoCAqIG1pc3NpbmcgMHg4MDAgaXMgU0RIQ0lfUkVUVU5JTkdfVElNRVJf Q09VTlRfTUFTSz0wLCB3aGljaAo+Pj4+PiArwqDCoMKgwqAgKiBtYWtlcyB0aGUgU0RIQ0kgY29y ZSBkaXNhYmxlIHJldHVuaW5nIHRpbWVyLgo+Pj4+Cj4+Pj4gQXJlIHlvdSBhd2FyZSB0aGF0IGNh cHMgY2FuIGJlIGNoYW5nZWQgaW4gRFQgdmlhICJzZGhjaS1jYXBzIiBhbmQKPj4+PiAic2RoY2kt Y2Fwcy1tYXNrIiA/Cj4+Pgo+Pj4gTm8sIEkgd2Fzbid0IGF3YXJlIG9mIHRob3NlLgo+Pj4KPj4+ IElzIHRoYXQgdGhlIHByZWZlcnJlZCBhcHByb2FjaCB0byB0aGlzIGZpeCwgb3ZlciBoYW5kbGlu ZyBpdCBpbiB0aGUgZHJpdmVyID8KPj4KPj4gSSBndWVzcyBpZGVhbGx5LsKgIE1haW5saW5lIGRv ZXMgbm90IHJlYWxseSBuZWVkIHRoZSBkcml2ZXIKPj4gZml4IGJlY2F1c2UgaXQgc2VlbXMgaXQg Y2FuIGJlIGRvbmUgYnkgRFQuwqAgT2xkZXIga2VybmVscwo+PiBhcmUgYSBzZXBhcmF0ZSBpc3N1 ZSByZWFsbHkuCj4+Cj4+Pgo+Pj4gSSB0aGluayB0aGUgZHJpdmVyLXNpZGUgZml4IHdvdWxkIGJl IHByZWZlcmFibGUsIGJlY2F1c2UgaXQgYWxzbyBmaXhlcyBzeXN0ZW1zIHdoaWNoIHVzZSBsZWdh Y3kgRFRzIHdpdGhvdXQgdGhlIHNkaGNpLWNhcHMgcHJvcGVydGllcywgd2hpY2ggd291bGQgYmUg YWxsIFp5bnFNUCBzeXN0ZW1zIHRodXMgZmFyLgo+Pgo+PiBZb3UgY291bGQgYmFja3BvcnQgc3Vw cG9ydCBvZiB0aGUgcHJvcGVydGllcyAic2RoY2ktY2FwcyIKPj4gYW5kICJzZGhjaS1jYXBzLW1h c2siLgo+IAo+IFRoaXMgd29uJ3QgaGVscC4gVml2YWRvICh0aGUgeGlsaW54IEZQR0EgZGVzaWdu IHRvb2wpIGlzIGNhcGFibGUgb2YgZ2VuZXJhdGluZyBEVHMsIHNvIHlvdSBjYW4gZW5kIHVwIHdp dGggYSBjb21iaW5hdGlvbiBvZiBuZXcgTGludXgga2VybmVsIGFuZCBvbGQgZ2VuZXJhdGVkIERU LCB3aGljaCBpcyBzdGlsbCBtaXNzaW5nIHRoZSBzZGhjaS1jYXBzL3NkaGNpLWNhcHMtbWFzayAu CgpUaGF0IGlzIGEgYml0IHNhZC4gIFlvdSBtaWdodCB3YW50IHRvIHB1c2ggZm9yIGNoYW5naW5n IHRoYXQgc2l0dWF0aW9uLgoKU2VuZCBhbiB1cGRhdGVkIHBhdGNoIHRoZW4uCgoKX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgtYXJtLWtlcm5lbCBt YWlsaW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9s aXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAo=