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 A67A4C3DA7D for ; Tue, 3 Jan 2023 20:36:04 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234372AbjACUgD (ORCPT ); Tue, 3 Jan 2023 15:36:03 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57308 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230388AbjACUgC (ORCPT ); Tue, 3 Jan 2023 15:36:02 -0500 Received: from phobos.denx.de (phobos.denx.de [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2ACD9BF76 for ; Tue, 3 Jan 2023 12:35:59 -0800 (PST) Received: from [127.0.0.1] (p578adb1c.dip0.t-ipconnect.de [87.138.219.28]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: marex@denx.de) by phobos.denx.de (Postfix) with ESMTPSA id 6FE15835AE; Tue, 3 Jan 2023 21:35:56 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=denx.de; s=phobos-20191101; t=1672778156; bh=HWmbjuz9MxA7HnCiGwfiep5OFanSixfe4jG6+AadOg4=; h=Date:Subject:To:Cc:References:From:In-Reply-To:From; b=Yn4HoRTxt78dSuw9snazj7nlw3kvKCbVpABju7yW1Bfldz4whA8ghNwbzIwMX4XmB baibjPZ0zZHKnQ10HOE3jxQ9Sx+LcaMk1DlXGi60/iy630iop+ZxMYnkVcp1uV0koZ G6ejeupVQR/HhriztgQopLWhyityKXIzQP0wajgB7IxlBp0wBNlN4FtPRwUD3PGqMx pNkT6jmWtvD17jvW80IJU61P21sycYA1vOSrcG7I1kJ7EQFWgR+Ymes9nDGXvgy+NJ zhu0FXyh7PT0Zeuby4TIFc9xUA6Mi6MT15F3UG56ieDitQXYN7hLMtlXarRGUR4cX6 034Q7ZYIqMlIg== Message-ID: <2138356e-f101-0ca2-faae-b3bda5539f05@denx.de> Date: Tue, 3 Jan 2023 21:35:55 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.6.0 Subject: Re: [PATCH] mmc: sdhci-of-arasan: Override SDHCI_RETUNING_TIMER_COUNT_MASK on ZynqMP To: Michal Simek , Adrian Hunter , 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> <873d21fa-d9ff-ee94-40a1-3354850c8865@intel.com> <2db4c424-74fa-24a6-852d-10d7a18a0541@amd.com> Content-Language: en-US From: Marek Vasut In-Reply-To: <2db4c424-74fa-24a6-852d-10d7a18a0541@amd.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-Virus-Scanned: clamav-milter 0.103.6 at phobos.denx.de X-Virus-Status: Clean Precedence: bulk List-ID: X-Mailing-List: linux-mmc@vger.kernel.org On 1/2/23 09:24, Michal Simek wrote: > > > On 12/30/22 13:57, Adrian Hunter wrote: >> 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. >> > > Xilinx Device Tree Generator, which is the tool for DT generation, was > never designed to be directly used without any change. It was designed > to help you to describe the system as much as possible. It means you get > the base and you need to change things which are not properly described. > That's why just do it. I am under the impression that petalinux does pull the XSA from Vivado and directly builds U-Boot and Linux with DT somehow derived from the XSA, maybe using DTG ? (note that I am not using petalinux) 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 016FBC3DA7D for ; Tue, 3 Jan 2023 20:38:02 +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-Type: Content-Transfer-Encoding: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=Y7R+8ejaNdXGKnnKJZ6CQcTAChi+MqwdclRE3DwbRPc=; b=a9GaB36GI01OpN tRkLlDfezIEPBWqic6MPKqb7zoem39bGG/7lcCZJCXb3UOe65cmiO8/I4+/Nzej1Ut9NlLGFWPI6g 5lLk2+ldiepv4QVc0yh4xb1RBumzqaAjL/qJCKQqSQsP6uSqyubFPchYMz4UAQRbQV6oP5G6InNRz SfgttLP2Ht1AKem13Z8bL82L2wh/4pHEgyF0H2SHUUTmixAPn4wswqsS5s1VI9NutdjtLmkRft60k NLn1e6TY4nO/Cjuf/YYc6M6g4kudRBe6M8IxD5ZmzTxhPt4Qmd7ciWPVkzOKcOVD4Tp4VdCeh4/B5 IG9F5won/9dfLtaLFhKA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1pCo1f-004nE3-LO; Tue, 03 Jan 2023 20:36:48 +0000 Received: from phobos.denx.de ([85.214.62.61]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1pCo0s-004mrj-5H for linux-arm-kernel@lists.infradead.org; Tue, 03 Jan 2023 20:36:01 +0000 Received: from [127.0.0.1] (p578adb1c.dip0.t-ipconnect.de [87.138.219.28]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: marex@denx.de) by phobos.denx.de (Postfix) with ESMTPSA id 6FE15835AE; Tue, 3 Jan 2023 21:35:56 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=denx.de; s=phobos-20191101; t=1672778156; bh=HWmbjuz9MxA7HnCiGwfiep5OFanSixfe4jG6+AadOg4=; h=Date:Subject:To:Cc:References:From:In-Reply-To:From; b=Yn4HoRTxt78dSuw9snazj7nlw3kvKCbVpABju7yW1Bfldz4whA8ghNwbzIwMX4XmB baibjPZ0zZHKnQ10HOE3jxQ9Sx+LcaMk1DlXGi60/iy630iop+ZxMYnkVcp1uV0koZ G6ejeupVQR/HhriztgQopLWhyityKXIzQP0wajgB7IxlBp0wBNlN4FtPRwUD3PGqMx pNkT6jmWtvD17jvW80IJU61P21sycYA1vOSrcG7I1kJ7EQFWgR+Ymes9nDGXvgy+NJ zhu0FXyh7PT0Zeuby4TIFc9xUA6Mi6MT15F3UG56ieDitQXYN7hLMtlXarRGUR4cX6 034Q7ZYIqMlIg== Message-ID: <2138356e-f101-0ca2-faae-b3bda5539f05@denx.de> Date: Tue, 3 Jan 2023 21:35:55 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.6.0 Subject: Re: [PATCH] mmc: sdhci-of-arasan: Override SDHCI_RETUNING_TIMER_COUNT_MASK on ZynqMP To: Michal Simek , Adrian Hunter , 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> <873d21fa-d9ff-ee94-40a1-3354850c8865@intel.com> <2db4c424-74fa-24a6-852d-10d7a18a0541@amd.com> Content-Language: en-US From: Marek Vasut In-Reply-To: <2db4c424-74fa-24a6-852d-10d7a18a0541@amd.com> X-Virus-Scanned: clamav-milter 0.103.6 at phobos.denx.de X-Virus-Status: Clean X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230103_123558_869593_B091E106 X-CRM114-Status: GOOD ( 24.36 ) 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-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org T24gMS8yLzIzIDA5OjI0LCBNaWNoYWwgU2ltZWsgd3JvdGU6Cj4gCj4gCj4gT24gMTIvMzAvMjIg MTM6NTcsIEFkcmlhbiBIdW50ZXIgd3JvdGU6Cj4+IE9uIDMwLzEyLzIyIDA4OjQyLCBNYXJlayBW YXN1dCB3cm90ZToKPj4+IE9uIDEyLzI5LzIyIDEzOjUxLCBBZHJpYW4gSHVudGVyIHdyb3RlOgo+ Pj4+IE9uIDI2LzEwLzIyIDEyOjIwLCBNYXJlayBWYXN1dCB3cm90ZToKPj4+Pj4gT24gMTAvMjYv MjIgMDg6MDcsIEFkcmlhbiBIdW50ZXIgd3JvdGU6Cj4+Pj4+PiBPbiAyNS8xMC8yMiAyMjoxNSwg TWFyZWsgVmFzdXQgd3JvdGU6Cj4+Pj4+Pj4gT24gWGlsaW54IFp5bnFNUCwgdGhlIHJlZ19jYXBh YmlsaXRpZXMgKFNESU8pIFJlZ2lzdGVyCj4+Pj4+Pj4KPj4+Pj4+PiBodHRwczovL3d3dy54aWxp bnguY29tL2h0bWxkb2NzL3JlZ2lzdGVycy91ZzEwODcvc2Rpb19fX3JlZ19jYXBhYmlsaXRpZXMu aHRtbCMKPj4+Pj4+PiBBYnNvbHV0ZSBBZGRyZXNzwqAgMHgwMEZGMTYwMDQwIChTRDApCj4+Pj4+ Pj4gUmVzZXQgVmFsdWXCoMKgwqDCoMKgwqAgMHgyODA3MzdFQzY0ODEKPj4+Pj4+Pgo+Pj4+Pj4+ IHJlYWxseSByZWFkcyAweDIwMDczN0VDNjQ4MSAuIFRoZSBpbnRlcmVzdGluZyBwYXJ0IGlzIHRo ZQo+Pj4+Pj4+IHRvcCAzMiBiaXRzLCB3aGljaCBhcmUgU0RIQ0lfQ0FQQUJJTElUSUVTXzEgPSAw eDIwMDcuIFRoZQo+Pj4+Pj4+IG1pc3NpbmcgMHg4MDAgaXMgU0RIQ0lfUkVUVU5JTkdfVElNRVJf Q09VTlRfTUFTSz0wLCB3aGljaAo+Pj4+Pj4+IG1ha2VzIHRoZSBTREhDSSBjb3JlIGRpc2FibGUg cmV0dW5pbmcgdGltZXIuCj4+Pj4+Pj4KPj4+Pj4+PiBGaXggdGhpcyB1cCBoZXJlIGJ5IGV4cGxp Y2l0bHkgc2V0dGluZyB0dW5pbmdfY291bnQgdG8gOAo+Pj4+Pj4+IGFzIGl0IHNob3VsZCBiZSwg b3RoZXJ3aXNlIGFuIGVNTUMgbWlnaHQgZmFpbCBpbiB2YXJpb3VzCj4+Pj4+Pj4gdGhlcm1hbCBj b25kaXRpb25zCj4+Pj4+Pj4KPj4+Pj4+PiBOb3RlIHRoYXQgdGhlIGRpZmYgaXMgYmVzdCBzaG93 biB3aXRoIC13IG9wdGlvbiwgdGhpcyBtYWtlcyBpdAo+Pj4+Pj4+IHZpc2libGUgd2hhdCBoYXBw ZW5lZCB3aXRoICFzZGhjaV9hcmFzYW4tPmhhc19jcWUgY29uZGl0aW9uYWwsCj4+Pj4+Pj4gd2hp Y2ggaXMgcGxhY2VkIGJldHdlZW4gc2RoY2lfc2V0dXBfaG9zdCgpIGFuZCBfX3NkaGNpX2FkZF9o b3N0KCkKPj4+Pj4+PiBjYWxscy4gU2luY2Ugc2RoY2lfYWRkX2hvc3QoKSBpcyBhbHNvIGEgc2Vx dWVuY2Ugb2YgdGhlc2UgdHdvCj4+Pj4+Pj4gY2FsbHMgYW5kIGhvc3QtPnR1bmluZ19jb3VudCBt dXN0IGJlIG92ZXJyaWRlbiBiZWZvcmUgY2FsbGluZwo+Pj4+Pj4KPj4+Pj4+IG92ZXJyaWRlbiAt PiBvdmVycmlkZGVuCj4+Pj4+Cj4+Pj4+IEZpeGVkCj4+Pj4+Cj4+Pj4+Pj4gX19zZGhjaV9hZGRf aG9zdCgpLCBjYWxsIHRoZSB0d28gY2FsbHMgc2VwYXJhdGVseSBhbmQgZG8gYWxsCj4+Pj4+Pj4g dGhlIGFkanVzdG1lbnRzIGJldHdlZW4gdGhlbSBpbiBlaXRoZXIgY2FzZS4KPj4+Pj4+Pgo+Pj4+ Pj4+IFNpZ25lZC1vZmYtYnk6IE1hcmVrIFZhc3V0IDxtYXJleEBkZW54LmRlPgo+Pj4+Pj4+IC0t LQo+Pj4+Pj4+IENjOiBNaWNoYWwgU2ltZWsgPG1pY2hhbC5zaW1la0B4aWxpbnguY29tPgo+Pj4+ Pj4+IENjOiBBZHJpYW4gSHVudGVyIDxhZHJpYW4uaHVudGVyQGludGVsLmNvbT4KPj4+Pj4+PiBD YzogVWxmIEhhbnNzb24gPHVsZi5oYW5zc29uQGxpbmFyby5vcmc+Cj4+Pj4+Pj4gQ2M6IGxpbnV4 LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwo+Pj4+Pj4+IFRvOiBsaW51eC1tbWNAdmdl ci5rZXJuZWwub3JnCj4+Pj4+Pj4gLS0tCj4+Pj4+Pj4gwqDCoMKgIGRyaXZlcnMvbW1jL2hvc3Qv c2RoY2ktb2YtYXJhc2FuLmMgfCA1NyAKPj4+Pj4+PiArKysrKysrKysrKysrKysrKysrKy0tLS0t LS0tLS0KPj4+Pj4+PiDCoMKgwqAgMSBmaWxlIGNoYW5nZWQsIDM4IGluc2VydGlvbnMoKyksIDE5 IGRlbGV0aW9ucygtKQo+Pj4+Pj4+Cj4+Pj4+Pj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hv c3Qvc2RoY2ktb2YtYXJhc2FuLmMgCj4+Pj4+Pj4gYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLW9m LWFyYXNhbi5jCj4+Pj4+Pj4gaW5kZXggMzk5N2NhZDFmNzkzZC4uNDY1NDk4ZjJhN2MwZiAxMDA2 NDQKPj4+Pj4+PiAtLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLW9mLWFyYXNhbi5jCj4+Pj4+ Pj4gKysrIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1vZi1hcmFzYW4uYwo+Pj4+Pj4+IEBAIC0x NTIxLDM3ICsxNTIxLDU2IEBAIHN0YXRpYyBpbnQgCj4+Pj4+Pj4gc2RoY2lfYXJhc2FuX3JlZ2lz dGVyX3NkY2xrKHN0cnVjdCBzZGhjaV9hcmFzYW5fZGF0YSAqc2RoY2lfYXJhc2FuLAo+Pj4+Pj4+ IMKgwqDCoMKgwqDCoMKgIHJldHVybiAwOwo+Pj4+Pj4+IMKgwqDCoCB9Cj4+Pj4+Pj4gwqDCoMKg IC1zdGF0aWMgaW50IHNkaGNpX2FyYXNhbl9hZGRfaG9zdChzdHJ1Y3Qgc2RoY2lfYXJhc2FuX2Rh dGEgCj4+Pj4+Pj4gKnNkaGNpX2FyYXNhbikKPj4+Pj4+PiArc3RhdGljIGludCBzZGhjaV9hcmFz YW5fYWRkX2hvc3Qoc3RydWN0IHNkaGNpX2FyYXNhbl9kYXRhIAo+Pj4+Pj4+ICpzZGhjaV9hcmFz YW4sCj4+Pj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHN0cnVjdCBkZXZp Y2UgKmRldikKPj4+Pj4+PiDCoMKgwqAgewo+Pj4+Pj4+IMKgwqDCoMKgwqDCoMKgIHN0cnVjdCBz ZGhjaV9ob3N0ICpob3N0ID0gc2RoY2lfYXJhc2FuLT5ob3N0Owo+Pj4+Pj4+IMKgwqDCoMKgwqDC oMKgIHN0cnVjdCBjcWhjaV9ob3N0ICpjcV9ob3N0Owo+Pj4+Pj4+IMKgwqDCoMKgwqDCoMKgIGJv b2wgZG1hNjQ7Cj4+Pj4+Pj4gwqDCoMKgwqDCoMKgwqAgaW50IHJldDsKPj4+Pj4+PiDCoMKgwqAg LcKgwqDCoCBpZiAoIXNkaGNpX2FyYXNhbi0+aGFzX2NxZSkKPj4+Pj4+PiAtwqDCoMKgwqDCoMKg wqAgcmV0dXJuIHNkaGNpX2FkZF9ob3N0KGhvc3QpOwo+Pj4+Pj4+IC0KPj4+Pj4+PiDCoMKgwqDC oMKgwqDCoCByZXQgPSBzZGhjaV9zZXR1cF9ob3N0KGhvc3QpOwo+Pj4+Pj4+IMKgwqDCoMKgwqDC oMKgIGlmIChyZXQpCj4+Pj4+Pj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm4gcmV0Owo+ Pj4+Pj4+IMKgwqDCoCAtwqDCoMKgIGNxX2hvc3QgPSBkZXZtX2t6YWxsb2MoaG9zdC0+bW1jLT5w YXJlbnQsCj4+Pj4+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzaXpl b2YoKmNxX2hvc3QpLCBHRlBfS0VSTkVMKTsKPj4+Pj4+PiAtwqDCoMKgIGlmICghY3FfaG9zdCkg ewo+Pj4+Pj4+IC3CoMKgwqDCoMKgwqDCoCByZXQgPSAtRU5PTUVNOwo+Pj4+Pj4+IC3CoMKgwqDC oMKgwqDCoCBnb3RvIGNsZWFudXA7Cj4+Pj4+Pj4gLcKgwqDCoCB9Cj4+Pj4+Pj4gK8KgwqDCoCAv Kgo+Pj4+Pj4+ICvCoMKgwqDCoCAqIE9uIFhpbGlueCBaeW5xTVAsIHRoZSByZWdfY2FwYWJpbGl0 aWVzIChTRElPKSBSZWdpc3Rlcgo+Pj4+Pj4+ICvCoMKgwqDCoCAqCj4+Pj4+Pj4gK8KgwqDCoMKg ICogCj4+Pj4+Pj4gaHR0cHM6Ly93d3cueGlsaW54LmNvbS9odG1sZG9jcy9yZWdpc3RlcnMvdWcx MDg3L3NkaW9fX19yZWdfY2FwYWJpbGl0aWVzLmh0bWwjCj4+Pj4+Pj4gK8KgwqDCoMKgICogQWJz b2x1dGUgQWRkcmVzc8KgIDB4MDBGRjE2MDA0MCAoU0QwKQo+Pj4+Pj4+ICvCoMKgwqDCoCAqIFJl c2V0IFZhbHVlwqDCoMKgwqDCoMKgwqDCoCAweDI4MDczN0VDNjQ4MQo+Pj4+Pj4+ICvCoMKgwqDC oCAqCj4+Pj4+Pj4gK8KgwqDCoMKgICogcmVhbGx5IHJlYWRzIDB4MjAwNzM3RUM2NDgxIC4gVGhl IGludGVyZXN0aW5nIHBhcnQgaXMgdGhlCj4+Pj4+Pj4gK8KgwqDCoMKgICogdG9wIDMyIGJpdHMs IHdoaWNoIGFyZSBTREhDSV9DQVBBQklMSVRJRVNfMSA9IDB4MjAwNy4gVGhlCj4+Pj4+Pj4gK8Kg wqDCoMKgICogbWlzc2luZyAweDgwMCBpcyBTREhDSV9SRVRVTklOR19USU1FUl9DT1VOVF9NQVNL PTAsIHdoaWNoCj4+Pj4+Pj4gK8KgwqDCoMKgICogbWFrZXMgdGhlIFNESENJIGNvcmUgZGlzYWJs ZSByZXR1bmluZyB0aW1lci4KPj4+Pj4+Cj4+Pj4+PiBBcmUgeW91IGF3YXJlIHRoYXQgY2FwcyBj YW4gYmUgY2hhbmdlZCBpbiBEVCB2aWEgInNkaGNpLWNhcHMiIGFuZAo+Pj4+Pj4gInNkaGNpLWNh cHMtbWFzayIgPwo+Pj4+Pgo+Pj4+PiBObywgSSB3YXNuJ3QgYXdhcmUgb2YgdGhvc2UuCj4+Pj4+ Cj4+Pj4+IElzIHRoYXQgdGhlIHByZWZlcnJlZCBhcHByb2FjaCB0byB0aGlzIGZpeCwgb3ZlciBo YW5kbGluZyBpdCBpbiB0aGUgCj4+Pj4+IGRyaXZlciA/Cj4+Pj4KPj4+PiBJIGd1ZXNzIGlkZWFs bHkuwqAgTWFpbmxpbmUgZG9lcyBub3QgcmVhbGx5IG5lZWQgdGhlIGRyaXZlcgo+Pj4+IGZpeCBi ZWNhdXNlIGl0IHNlZW1zIGl0IGNhbiBiZSBkb25lIGJ5IERULsKgIE9sZGVyIGtlcm5lbHMKPj4+ PiBhcmUgYSBzZXBhcmF0ZSBpc3N1ZSByZWFsbHkuCj4+Pj4KPj4+Pj4KPj4+Pj4gSSB0aGluayB0 aGUgZHJpdmVyLXNpZGUgZml4IHdvdWxkIGJlIHByZWZlcmFibGUsIGJlY2F1c2UgaXQgYWxzbyAK Pj4+Pj4gZml4ZXMgc3lzdGVtcyB3aGljaCB1c2UgbGVnYWN5IERUcyB3aXRob3V0IHRoZSBzZGhj aS1jYXBzIAo+Pj4+PiBwcm9wZXJ0aWVzLCB3aGljaCB3b3VsZCBiZSBhbGwgWnlucU1QIHN5c3Rl bXMgdGh1cyBmYXIuCj4+Pj4KPj4+PiBZb3UgY291bGQgYmFja3BvcnQgc3VwcG9ydCBvZiB0aGUg cHJvcGVydGllcyAic2RoY2ktY2FwcyIKPj4+PiBhbmQgInNkaGNpLWNhcHMtbWFzayIuCj4+Pgo+ Pj4gVGhpcyB3b24ndCBoZWxwLiBWaXZhZG8gKHRoZSB4aWxpbnggRlBHQSBkZXNpZ24gdG9vbCkg aXMgY2FwYWJsZSBvZiAKPj4+IGdlbmVyYXRpbmcgRFRzLCBzbyB5b3UgY2FuIGVuZCB1cCB3aXRo IGEgY29tYmluYXRpb24gb2YgbmV3IExpbnV4IAo+Pj4ga2VybmVsIGFuZCBvbGQgZ2VuZXJhdGVk IERULCB3aGljaCBpcyBzdGlsbCBtaXNzaW5nIHRoZSAKPj4+IHNkaGNpLWNhcHMvc2RoY2ktY2Fw cy1tYXNrIC4KPj4KPj4gVGhhdCBpcyBhIGJpdCBzYWQuwqAgWW91IG1pZ2h0IHdhbnQgdG8gcHVz aCBmb3IgY2hhbmdpbmcgdGhhdCBzaXR1YXRpb24uCj4+Cj4+IFNlbmQgYW4gdXBkYXRlZCBwYXRj aCB0aGVuLgo+Pgo+IAo+IFhpbGlueCBEZXZpY2UgVHJlZSBHZW5lcmF0b3IsIHdoaWNoIGlzIHRo ZSB0b29sIGZvciBEVCBnZW5lcmF0aW9uLCB3YXMgCj4gbmV2ZXIgZGVzaWduZWQgdG8gYmUgZGly ZWN0bHkgdXNlZCB3aXRob3V0IGFueSBjaGFuZ2UuIEl0IHdhcyBkZXNpZ25lZCAKPiB0byBoZWxw IHlvdSB0byBkZXNjcmliZSB0aGUgc3lzdGVtIGFzIG11Y2ggYXMgcG9zc2libGUuIEl0IG1lYW5z IHlvdSBnZXQgCj4gdGhlIGJhc2UgYW5kIHlvdSBuZWVkIHRvIGNoYW5nZSB0aGluZ3Mgd2hpY2gg YXJlIG5vdCBwcm9wZXJseSBkZXNjcmliZWQuIAo+IFRoYXQncyB3aHkganVzdCBkbyBpdC4KCkkg YW0gdW5kZXIgdGhlIGltcHJlc3Npb24gdGhhdCBwZXRhbGludXggZG9lcyBwdWxsIHRoZSBYU0Eg ZnJvbSBWaXZhZG8gCmFuZCBkaXJlY3RseSBidWlsZHMgVS1Cb290IGFuZCBMaW51eCB3aXRoIERU IHNvbWVob3cgZGVyaXZlZCBmcm9tIHRoZSAKWFNBLCBtYXliZSB1c2luZyBEVEcgPwoKKG5vdGUg dGhhdCBJIGFtIG5vdCB1c2luZyBwZXRhbGludXgpCgpfX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdApsaW51 eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5v cmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCg==