From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from sender4-op-o15.zoho.com (sender4-op-o15.zoho.com [136.143.188.15]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E9C22219301; Fri, 13 Mar 2026 14:15:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=136.143.188.15 ARC-Seal:i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773411359; cv=pass; b=Hg/NBkIdl2FKoVRwWuCiqR9jV4bDkfnUBspR998k/JFtYnJAxq98Uyf716TQeCOWrgL92+qP7nAphsv23gQdwEgbzMSxCUp9Liubovj5w7j+yqv5r/B/ePaXga5Go2A7AsEgbW0BrB2EIdmzla/HGlCFCOrBLyfsJRSL2MRDpYM= ARC-Message-Signature:i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773411359; c=relaxed/simple; bh=BMYkIJzGNQB9BqQChyeP4jCteSWxKiciV5+aVqAqd4Q=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=diwhuc4ne7abQ/OQTZVQX1L7g1aNu0PFuO/69C2gv3rvM2zJCUWD7i88CmRNq3ZlSEtGlKuKRlO2Y9bvkrZlYB9zoMBwu4xT96bZe2rMxHdsEoVcjf8S4oLEJacl6dJPcpqiPHN+qHgrLa8rI61IeSkOBMpDoAJPJHRRpcqUaYE= ARC-Authentication-Results:i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=ziyao.cc; spf=pass smtp.mailfrom=ziyao.cc; dkim=pass (1024-bit key) header.d=ziyao.cc header.i=me@ziyao.cc header.b=Q1t8PKGP; arc=pass smtp.client-ip=136.143.188.15 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=ziyao.cc Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ziyao.cc Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=ziyao.cc header.i=me@ziyao.cc header.b="Q1t8PKGP" ARC-Seal: i=1; a=rsa-sha256; t=1773411339; cv=none; d=zohomail.com; s=zohoarc; b=iFEA9eJzcAmnXms33ePjSGqMxaL+zBVtJIHp5wTUqGcKOK/vQCZc9LRLYf3ptCfO0LRjJxNhs2fS593oDD8gT0P4nhnfTauaqFDGV/aum6sQh7Zh6L69Hzi3Rr4XhYDZpR9jC3AkQvIKGfwRD91H1DtO79+zGk5uvv6Mqfimoyc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1773411339; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:Subject:To:To:Message-Id:Reply-To; bh=4yyd8XotYjZZYwF11KV/R0g/vISzO4FDRU2zkUZnLvI=; b=EcitN7t3/g9tEqt9dilvFyN2RE2BieCKIUtrN41+2pT53dpsXQ0sDA6o728iupzIAcUMjyYdQxZ1FbvRdL6sLjOGSx5hVvkZnkFsinCb+tK8y2MWaE2cTvQn/ekxNPv77D89vr2qESmnkGD1VORZe4eEbjPXVRHCUumSe7UF6BE= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=ziyao.cc; spf=pass smtp.mailfrom=me@ziyao.cc; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1773411339; s=zmail; d=ziyao.cc; i=me@ziyao.cc; h=Date:Date:From:From:To:To:Cc:Cc:Subject:Subject:Message-ID:References:MIME-Version:Content-Type:Content-Transfer-Encoding:In-Reply-To:Message-Id:Reply-To; bh=4yyd8XotYjZZYwF11KV/R0g/vISzO4FDRU2zkUZnLvI=; b=Q1t8PKGPX7yPTCBA5zsq9dyX3ZFA0WTh6X92KgdUQzZVpWU92R3u3cpG/0AGjPJB JF9sGc0Xm0rAw46Fr4aHcxIFxS/m6IUsk/R8NDiXpCKWKw/YfuvlZ8rdX1sUH+apGVz Vc7H7Yc9sXVvE3Pd6A8rLH+qCRsmd7ko2v1irjak= Received: by mx.zohomail.com with SMTPS id 1773411336146483.83149193111865; Fri, 13 Mar 2026 07:15:36 -0700 (PDT) Date: Fri, 13 Mar 2026 14:15:23 +0000 From: Yao Zi To: Iker Pedrosa , Ulf Hansson , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Adrian Hunter , Paul Walmsley , Palmer Dabbelt , Albert Ou , Alexandre Ghiti , Yixun Lan Cc: Michael Opdenacker , Javier Martinez Canillas , linux-mmc@vger.kernel.org, devicetree@vger.kernel.org, linux-riscv@lists.infradead.org, spacemit@lists.linux.dev, linux-kernel@vger.kernel.org Subject: Re: [PATCH v2 4/7] mmc: sdhci-of-k1: add comprehensive SDR tuning support Message-ID: References: <20260309-orangepi-sd-card-uhs-v2-0-5bb2b574df5d@gmail.com> <20260309-orangepi-sd-card-uhs-v2-4-5bb2b574df5d@gmail.com> Precedence: bulk X-Mailing-List: linux-mmc@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20260309-orangepi-sd-card-uhs-v2-4-5bb2b574df5d@gmail.com> X-ZohoMailClient: External On Mon, Mar 09, 2026 at 12:40:14PM +0100, Iker Pedrosa wrote: > Implement software tuning algorithm to enable UHS-I SDR modes for SD > card operation. This adds both TX and RX delay line tuning based on the > SpacemiT K1 controller capabilities. > > Key features: > - Conditional tuning: only tune when SD card is present and for > high-speed modes (≥100MHz) > - TX tuning: configure transmit delay line with default values > (dline_reg=0, delaycode=127) to ensure optimal signal output timing > - RX tuning: test full delay range (0-255) with window detection > algorithm to find optimal receive timing > - Retry mechanism: multiple fallback delays within optimal window for > improved reliability > - Complete register support: add delay line control and configuration > register definitions for fine-grained timing control > > Signed-off-by: Iker Pedrosa Sorry for raising this late: I think PATCH 3 and PATCH 4 (this one) should also be squashed together to form a complete functionality, I also doubt otherwise whether compilers complain about unused static functions with only PATCH 3 applied. > --- > drivers/mmc/host/sdhci-of-k1.c | 119 +++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 119 insertions(+) > > diff --git a/drivers/mmc/host/sdhci-of-k1.c b/drivers/mmc/host/sdhci-of-k1.c > index 79cb7c8d0b6d9c4206bf01721651c8efe8a173c9..d903851b9be0e1d21a2b30636f5e63a52cad0dc2 100644 > --- a/drivers/mmc/host/sdhci-of-k1.c > +++ b/drivers/mmc/host/sdhci-of-k1.c > @@ -84,6 +84,12 @@ > #define SDHC_TX_DLINE_REG_MASK GENMASK(23, 16) > > #define SPACEMIT_RX_DLINE_REG 9 > +#define SPACEMIT_RX_TUNE_DELAY_MIN 0x0 > +#define SPACEMIT_RX_TUNE_DELAY_MAX 0xFF > +#define SPACEMIT_RX_TUNE_DELAY_STEP 0x1 I think the STEP constant isn't very helpful, to me its purpose is quite obvious in spacemit_sdhci_execute_tuning(), and you could simplify the tuning function without adding confusing magic numbers -- since the constant is literally one. > +#define SPACEMIT_TX_TUNING_DLINE_REG 0x00 > +#define SPACEMIT_TX_TUNING_DELAYCODE 127 ... > +static int spacemit_sdhci_execute_tuning(struct sdhci_host *host, u32 opcode) > +{ > + int ret = 0; > + int i; > + bool pass_window[SPACEMIT_RX_TUNE_DELAY_MAX + 1] = {false}; > + int pass_len = 0, pass_start = 0, max_pass_len = 0, max_pass_start = 0; > + u8 final_delay; > + struct mmc_host *mmc = host->mmc; > + struct mmc_ios ios = mmc->ios; > + > + /* > + * Tuning is required for SDR50/SDR104, HS200/HS400 cards and > + * if clock frequency is greater than 100MHz in these modes. > + */ > + if (host->clock < 100 * 1000 * 1000 || > + !(ios.timing == MMC_TIMING_MMC_HS200 || > + ios.timing == MMC_TIMING_UHS_SDR50 || > + ios.timing == MMC_TIMING_UHS_SDR104)) > + return 0; > + > + if (!(mmc->caps2 & MMC_CAP2_NO_SD) && !mmc->ops->get_cd(mmc)) > + return 0; Is this check really necessary? Shouldn't this be handled in MMC core instead? > + if (mmc->caps2 & MMC_CAP2_NO_MMC) { > + spacemit_sdhci_set_tx_dline_reg(host, SPACEMIT_TX_TUNING_DLINE_REG); > + spacemit_sdhci_set_tx_delay(host, SPACEMIT_TX_TUNING_DELAYCODE); > + spacemit_sdhci_tx_tuning_prepare(host); > + > + dev_dbg(mmc_dev(host->mmc), "TX tuning: dline_reg=%d, delaycode=%d\n", > + SPACEMIT_TX_TUNING_DLINE_REG, SPACEMIT_TX_TUNING_DELAYCODE); > + } > + > + spacemit_sdhci_prepare_tuning(host); > + > + for (i = SPACEMIT_RX_TUNE_DELAY_MIN; i <= SPACEMIT_RX_TUNE_DELAY_MAX; > + i += SPACEMIT_RX_TUNE_DELAY_STEP) { The last expression could be simply i++ if you drop SPACEMIT_RX_TUNE_DELAY_STEP, this is still quite readable. Same for the loop below. > + spacemit_sdhci_set_rx_delay(host, i); > + > + ret = mmc_send_tuning(host->mmc, opcode, NULL); > + pass_window[i] = (ret == 0); > + > + dev_dbg(mmc_dev(host->mmc), "RX delay %d: %s\n", > + i, pass_window[i] ? "pass" : "fail"); > + } > + > + for (i = SPACEMIT_RX_TUNE_DELAY_MIN; i <= SPACEMIT_RX_TUNE_DELAY_MAX; > + i += SPACEMIT_RX_TUNE_DELAY_STEP) { > + if (pass_window[i]) { > + if (pass_len == 0) > + pass_start = i; > + pass_len++; > + } else { > + if (pass_len > max_pass_len) { > + max_pass_len = pass_len; > + max_pass_start = pass_start; > + } > + pass_len = 0; > + } > + } It seems pass_window is only used once in the later loop, why not calculate and maintain the best window and its size on the fly? Then you could get avoid of the pass_window buffer, and refactor a loop away. Something like, int current_size, max_window, max_size; current_size = 0; max_size = 0; for (i = SPACEMIT_RX_TUNE_DELAY_MIN; i < SPACEMIT_RX_TUNE_DELAY_MAX; i++) { ret = /* try tuning ... */ if (ret) { if (max_size < current_size) { max_window = i - current_size; max_size = current_size; } current_size = 0; } else { current_size++; } } if (current_size > max_size) { max_window = i - current_size; max_size = current_size; current_size = 0; } should work, too, and is simpler. Regards, Yao Zi 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 25EB9105F7AE for ; Fri, 13 Mar 2026 14:15:55 +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:MIME-Version:References: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=fxZO6QzVpzQKMgdaDMMo0KxAOcpT92b/rx1aNHVba9s=; b=Lh6hK2edVeLc7C N4L0T+7rIC3OHOKyT5AIoTIL6IR9N80lt0WlH91+wyO1Qqq+KHhNlUwiiSH9mTm7kv1i14erw+NWU uVNwS4VM7uwI+i+mDnESLMQgKoinycwhuMYT1k+4PBOcYKU5oafvF93vAAruJVl2AXxuI1BBzyM5K nFCqwL5IoYWRS2ViUjV1ebqujhqRhNXP6QlJJQf7rFtufb+YL2ikOXblAKJTXMykxjxqIc2AWvM08 auErKmaQJQtH+yT+98qG5q3/CXdpeT9StAO6/t+SiytaxQqooMzlwYGqDY0aYjMMEtcmrxosL1kYx tr/mVRtjkB0iO75/Ld7w==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98.2 #2 (Red Hat Linux)) id 1w13Io-00000000Lwt-3otO; Fri, 13 Mar 2026 14:15:46 +0000 Received: from sender4-op-o15.zoho.com ([136.143.188.15]) by bombadil.infradead.org with esmtps (Exim 4.98.2 #2 (Red Hat Linux)) id 1w13Im-00000000Lvd-29Rm for linux-riscv@lists.infradead.org; Fri, 13 Mar 2026 14:15:46 +0000 ARC-Seal: i=1; a=rsa-sha256; t=1773411339; cv=none; d=zohomail.com; s=zohoarc; b=iFEA9eJzcAmnXms33ePjSGqMxaL+zBVtJIHp5wTUqGcKOK/vQCZc9LRLYf3ptCfO0LRjJxNhs2fS593oDD8gT0P4nhnfTauaqFDGV/aum6sQh7Zh6L69Hzi3Rr4XhYDZpR9jC3AkQvIKGfwRD91H1DtO79+zGk5uvv6Mqfimoyc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1773411339; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:Subject:To:To:Message-Id:Reply-To; bh=4yyd8XotYjZZYwF11KV/R0g/vISzO4FDRU2zkUZnLvI=; b=EcitN7t3/g9tEqt9dilvFyN2RE2BieCKIUtrN41+2pT53dpsXQ0sDA6o728iupzIAcUMjyYdQxZ1FbvRdL6sLjOGSx5hVvkZnkFsinCb+tK8y2MWaE2cTvQn/ekxNPv77D89vr2qESmnkGD1VORZe4eEbjPXVRHCUumSe7UF6BE= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=ziyao.cc; spf=pass smtp.mailfrom=me@ziyao.cc; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1773411339; s=zmail; d=ziyao.cc; i=me@ziyao.cc; h=Date:Date:From:From:To:To:Cc:Cc:Subject:Subject:Message-ID:References:MIME-Version:Content-Type:Content-Transfer-Encoding:In-Reply-To:Message-Id:Reply-To; bh=4yyd8XotYjZZYwF11KV/R0g/vISzO4FDRU2zkUZnLvI=; b=Q1t8PKGPX7yPTCBA5zsq9dyX3ZFA0WTh6X92KgdUQzZVpWU92R3u3cpG/0AGjPJB JF9sGc0Xm0rAw46Fr4aHcxIFxS/m6IUsk/R8NDiXpCKWKw/YfuvlZ8rdX1sUH+apGVz Vc7H7Yc9sXVvE3Pd6A8rLH+qCRsmd7ko2v1irjak= Received: by mx.zohomail.com with SMTPS id 1773411336146483.83149193111865; Fri, 13 Mar 2026 07:15:36 -0700 (PDT) Date: Fri, 13 Mar 2026 14:15:23 +0000 From: Yao Zi To: Iker Pedrosa , Ulf Hansson , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Adrian Hunter , Paul Walmsley , Palmer Dabbelt , Albert Ou , Alexandre Ghiti , Yixun Lan Cc: Michael Opdenacker , Javier Martinez Canillas , linux-mmc@vger.kernel.org, devicetree@vger.kernel.org, linux-riscv@lists.infradead.org, spacemit@lists.linux.dev, linux-kernel@vger.kernel.org Subject: Re: [PATCH v2 4/7] mmc: sdhci-of-k1: add comprehensive SDR tuning support Message-ID: References: <20260309-orangepi-sd-card-uhs-v2-0-5bb2b574df5d@gmail.com> <20260309-orangepi-sd-card-uhs-v2-4-5bb2b574df5d@gmail.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20260309-orangepi-sd-card-uhs-v2-4-5bb2b574df5d@gmail.com> X-ZohoMailClient: External X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20260313_071544_597607_BFB5C567 X-CRM114-Status: GOOD ( 27.87 ) X-BeenThere: linux-riscv@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-riscv" Errors-To: linux-riscv-bounces+linux-riscv=archiver.kernel.org@lists.infradead.org T24gTW9uLCBNYXIgMDksIDIwMjYgYXQgMTI6NDA6MTRQTSArMDEwMCwgSWtlciBQZWRyb3NhIHdy b3RlOgo+IEltcGxlbWVudCBzb2Z0d2FyZSB0dW5pbmcgYWxnb3JpdGhtIHRvIGVuYWJsZSBVSFMt SSBTRFIgbW9kZXMgZm9yIFNECj4gY2FyZCBvcGVyYXRpb24uIFRoaXMgYWRkcyBib3RoIFRYIGFu ZCBSWCBkZWxheSBsaW5lIHR1bmluZyBiYXNlZCBvbiB0aGUKPiBTcGFjZW1pVCBLMSBjb250cm9s bGVyIGNhcGFiaWxpdGllcy4KPiAKPiBLZXkgZmVhdHVyZXM6Cj4gLSBDb25kaXRpb25hbCB0dW5p bmc6IG9ubHkgdHVuZSB3aGVuIFNEIGNhcmQgaXMgcHJlc2VudCBhbmQgZm9yCj4gICBoaWdoLXNw ZWVkIG1vZGVzICjiiaUxMDBNSHopCj4gLSBUWCB0dW5pbmc6IGNvbmZpZ3VyZSB0cmFuc21pdCBk ZWxheSBsaW5lIHdpdGggZGVmYXVsdCB2YWx1ZXMKPiAgIChkbGluZV9yZWc9MCwgZGVsYXljb2Rl PTEyNykgdG8gZW5zdXJlIG9wdGltYWwgc2lnbmFsIG91dHB1dCB0aW1pbmcKPiAtIFJYIHR1bmlu ZzogdGVzdCBmdWxsIGRlbGF5IHJhbmdlICgwLTI1NSkgd2l0aCB3aW5kb3cgZGV0ZWN0aW9uCj4g ICBhbGdvcml0aG0gdG8gZmluZCBvcHRpbWFsIHJlY2VpdmUgdGltaW5nCj4gLSBSZXRyeSBtZWNo YW5pc206IG11bHRpcGxlIGZhbGxiYWNrIGRlbGF5cyB3aXRoaW4gb3B0aW1hbCB3aW5kb3cgZm9y Cj4gICBpbXByb3ZlZCByZWxpYWJpbGl0eQo+IC0gQ29tcGxldGUgcmVnaXN0ZXIgc3VwcG9ydDog YWRkIGRlbGF5IGxpbmUgY29udHJvbCBhbmQgY29uZmlndXJhdGlvbgo+ICAgcmVnaXN0ZXIgZGVm aW5pdGlvbnMgZm9yIGZpbmUtZ3JhaW5lZCB0aW1pbmcgY29udHJvbAo+IAo+IFNpZ25lZC1vZmYt Ynk6IElrZXIgUGVkcm9zYSA8aWtlcnBlZHJvc2FtQGdtYWlsLmNvbT4KClNvcnJ5IGZvciByYWlz aW5nIHRoaXMgbGF0ZTogSSB0aGluayBQQVRDSCAzIGFuZCBQQVRDSCA0ICh0aGlzIG9uZSkKc2hv dWxkIGFsc28gYmUgc3F1YXNoZWQgdG9nZXRoZXIgdG8gZm9ybSBhIGNvbXBsZXRlIGZ1bmN0aW9u YWxpdHksIEkKYWxzbyBkb3VidCBvdGhlcndpc2Ugd2hldGhlciBjb21waWxlcnMgY29tcGxhaW4g YWJvdXQgdW51c2VkIHN0YXRpYwpmdW5jdGlvbnMgd2l0aCBvbmx5IFBBVENIIDMgYXBwbGllZC4K Cj4gLS0tCj4gIGRyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktb2YtazEuYyB8IDExOSArKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwo+ICAxIGZpbGUgY2hhbmdlZCwgMTE5IGlu c2VydGlvbnMoKykKPiAKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1vZi1r MS5jIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1vZi1rMS5jCj4gaW5kZXggNzljYjdjOGQwYjZk OWM0MjA2YmYwMTcyMTY1MWM4ZWZlOGExNzNjOS4uZDkwMzg1MWI5YmUwZTFkMjFhMmIzMDYzNmY1 ZTYzYTUyY2FkMGRjMiAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLW9mLWsx LmMKPiArKysgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLW9mLWsxLmMKPiBAQCAtODQsNiArODQs MTIgQEAKPiAgI2RlZmluZSAgU0RIQ19UWF9ETElORV9SRUdfTUFTSyAgICAgICAgIEdFTk1BU0so MjMsIDE2KQo+ICAKPiAgI2RlZmluZSBTUEFDRU1JVF9SWF9ETElORV9SRUcJCTkKPiArI2RlZmlu ZSBTUEFDRU1JVF9SWF9UVU5FX0RFTEFZX01JTgkweDAKPiArI2RlZmluZSBTUEFDRU1JVF9SWF9U VU5FX0RFTEFZX01BWAkweEZGCj4gKyNkZWZpbmUgU1BBQ0VNSVRfUlhfVFVORV9ERUxBWV9TVEVQ CTB4MQoKSSB0aGluayB0aGUgU1RFUCBjb25zdGFudCBpc24ndCB2ZXJ5IGhlbHBmdWwsIHRvIG1l IGl0cyBwdXJwb3NlIGlzCnF1aXRlIG9idmlvdXMgaW4gc3BhY2VtaXRfc2RoY2lfZXhlY3V0ZV90 dW5pbmcoKSwgYW5kIHlvdSBjb3VsZCBzaW1wbGlmeQp0aGUgdHVuaW5nIGZ1bmN0aW9uIHdpdGhv dXQgYWRkaW5nIGNvbmZ1c2luZyBtYWdpYyBudW1iZXJzIC0tIHNpbmNlIHRoZQpjb25zdGFudCBp cyBsaXRlcmFsbHkgb25lLgoKPiArI2RlZmluZSBTUEFDRU1JVF9UWF9UVU5JTkdfRExJTkVfUkVH CTB4MDAKPiArI2RlZmluZSBTUEFDRU1JVF9UWF9UVU5JTkdfREVMQVlDT0RFCTEyNwoKLi4uCgo+ ICtzdGF0aWMgaW50IHNwYWNlbWl0X3NkaGNpX2V4ZWN1dGVfdHVuaW5nKHN0cnVjdCBzZGhjaV9o b3N0ICpob3N0LCB1MzIgb3Bjb2RlKQo+ICt7Cj4gKwlpbnQgcmV0ID0gMDsKPiArCWludCBpOwo+ ICsJYm9vbCBwYXNzX3dpbmRvd1tTUEFDRU1JVF9SWF9UVU5FX0RFTEFZX01BWCArIDFdID0ge2Zh bHNlfTsKPiArCWludCBwYXNzX2xlbiA9IDAsIHBhc3Nfc3RhcnQgPSAwLCBtYXhfcGFzc19sZW4g PSAwLCBtYXhfcGFzc19zdGFydCA9IDA7Cj4gKwl1OCBmaW5hbF9kZWxheTsKPiArCXN0cnVjdCBt bWNfaG9zdCAqbW1jID0gaG9zdC0+bW1jOwo+ICsJc3RydWN0IG1tY19pb3MgaW9zID0gbW1jLT5p b3M7Cj4gKwo+ICsJLyoKPiArCSAqIFR1bmluZyBpcyByZXF1aXJlZCBmb3IgU0RSNTAvU0RSMTA0 LCBIUzIwMC9IUzQwMCBjYXJkcyBhbmQKPiArCSAqIGlmIGNsb2NrIGZyZXF1ZW5jeSBpcyBncmVh dGVyIHRoYW4gMTAwTUh6IGluIHRoZXNlIG1vZGVzLgo+ICsJICovCj4gKwlpZiAoaG9zdC0+Y2xv Y2sgPCAxMDAgKiAxMDAwICogMTAwMCB8fAo+ICsJICAgICEoaW9zLnRpbWluZyA9PSBNTUNfVElN SU5HX01NQ19IUzIwMCB8fAo+ICsJICAgICAgaW9zLnRpbWluZyA9PSBNTUNfVElNSU5HX1VIU19T RFI1MCB8fAo+ICsJICAgICAgaW9zLnRpbWluZyA9PSBNTUNfVElNSU5HX1VIU19TRFIxMDQpKQo+ ICsJCXJldHVybiAwOwo+ICsKPiArCWlmICghKG1tYy0+Y2FwczIgJiBNTUNfQ0FQMl9OT19TRCkg JiYgIW1tYy0+b3BzLT5nZXRfY2QobW1jKSkKPiArCQlyZXR1cm4gMDsKCklzIHRoaXMgY2hlY2sg cmVhbGx5IG5lY2Vzc2FyeT8gU2hvdWxkbid0IHRoaXMgYmUgaGFuZGxlZCBpbiBNTUMgY29yZQpp bnN0ZWFkPwoKPiArCWlmIChtbWMtPmNhcHMyICYgTU1DX0NBUDJfTk9fTU1DKSB7Cj4gKwkJc3Bh Y2VtaXRfc2RoY2lfc2V0X3R4X2RsaW5lX3JlZyhob3N0LCBTUEFDRU1JVF9UWF9UVU5JTkdfRExJ TkVfUkVHKTsKPiArCQlzcGFjZW1pdF9zZGhjaV9zZXRfdHhfZGVsYXkoaG9zdCwgU1BBQ0VNSVRf VFhfVFVOSU5HX0RFTEFZQ09ERSk7Cj4gKwkJc3BhY2VtaXRfc2RoY2lfdHhfdHVuaW5nX3ByZXBh cmUoaG9zdCk7Cj4gKwo+ICsJCWRldl9kYmcobW1jX2Rldihob3N0LT5tbWMpLCAiVFggdHVuaW5n OiBkbGluZV9yZWc9JWQsIGRlbGF5Y29kZT0lZFxuIiwKPiArCQkJU1BBQ0VNSVRfVFhfVFVOSU5H X0RMSU5FX1JFRywgU1BBQ0VNSVRfVFhfVFVOSU5HX0RFTEFZQ09ERSk7Cj4gKwl9Cj4gKwo+ICsJ c3BhY2VtaXRfc2RoY2lfcHJlcGFyZV90dW5pbmcoaG9zdCk7Cj4gKwo+ICsJZm9yIChpID0gU1BB Q0VNSVRfUlhfVFVORV9ERUxBWV9NSU47IGkgPD0gU1BBQ0VNSVRfUlhfVFVORV9ERUxBWV9NQVg7 Cj4gKwkgICAgIGkgKz0gU1BBQ0VNSVRfUlhfVFVORV9ERUxBWV9TVEVQKSB7CgpUaGUgbGFzdCBl eHByZXNzaW9uIGNvdWxkIGJlIHNpbXBseSBpKysgaWYgeW91IGRyb3AKU1BBQ0VNSVRfUlhfVFVO RV9ERUxBWV9TVEVQLCB0aGlzIGlzIHN0aWxsIHF1aXRlIHJlYWRhYmxlLiBTYW1lIGZvciB0aGUK bG9vcCBiZWxvdy4KCj4gKwkJc3BhY2VtaXRfc2RoY2lfc2V0X3J4X2RlbGF5KGhvc3QsIGkpOwo+ ICsKPiArCQlyZXQgPSBtbWNfc2VuZF90dW5pbmcoaG9zdC0+bW1jLCBvcGNvZGUsIE5VTEwpOwo+ ICsJCXBhc3Nfd2luZG93W2ldID0gKHJldCA9PSAwKTsKPiArCj4gKwkJZGV2X2RiZyhtbWNfZGV2 KGhvc3QtPm1tYyksICJSWCBkZWxheSAlZDogJXNcbiIsCj4gKwkJCWksIHBhc3Nfd2luZG93W2ld ID8gInBhc3MiIDogImZhaWwiKTsKPiArCX0KPiArCj4gKwlmb3IgKGkgPSBTUEFDRU1JVF9SWF9U VU5FX0RFTEFZX01JTjsgaSA8PSBTUEFDRU1JVF9SWF9UVU5FX0RFTEFZX01BWDsKPiArCSAgICAg aSArPSBTUEFDRU1JVF9SWF9UVU5FX0RFTEFZX1NURVApIHsKPiArCQlpZiAocGFzc193aW5kb3db aV0pIHsKPiArCQkJaWYgKHBhc3NfbGVuID09IDApCj4gKwkJCQlwYXNzX3N0YXJ0ID0gaTsKPiAr CQkJcGFzc19sZW4rKzsKPiArCQl9IGVsc2Ugewo+ICsJCQlpZiAocGFzc19sZW4gPiBtYXhfcGFz c19sZW4pIHsKPiArCQkJCW1heF9wYXNzX2xlbiA9IHBhc3NfbGVuOwo+ICsJCQkJbWF4X3Bhc3Nf c3RhcnQgPSBwYXNzX3N0YXJ0Owo+ICsJCQl9Cj4gKwkJCXBhc3NfbGVuID0gMDsKPiArCQl9Cj4g Kwl9CgpJdCBzZWVtcyBwYXNzX3dpbmRvdyBpcyBvbmx5IHVzZWQgb25jZSBpbiB0aGUgbGF0ZXIg bG9vcCwgd2h5IG5vdApjYWxjdWxhdGUgYW5kIG1haW50YWluIHRoZSBiZXN0IHdpbmRvdyBhbmQg aXRzIHNpemUgb24gdGhlIGZseT8gVGhlbiB5b3UKY291bGQgZ2V0IGF2b2lkIG9mIHRoZSBwYXNz X3dpbmRvdyBidWZmZXIsIGFuZCByZWZhY3RvciBhIGxvb3AgYXdheS4KU29tZXRoaW5nIGxpa2Us CgoJaW50IGN1cnJlbnRfc2l6ZSwgbWF4X3dpbmRvdywgbWF4X3NpemU7CgoJY3VycmVudF9zaXpl ID0gMDsKCW1heF9zaXplID0gMDsKCWZvciAoaSA9IFNQQUNFTUlUX1JYX1RVTkVfREVMQVlfTUlO OyBpIDwgU1BBQ0VNSVRfUlhfVFVORV9ERUxBWV9NQVg7CgkgICAgIGkrKykgewoJCXJldCA9IC8q IHRyeSB0dW5pbmcgLi4uICovCgoJCWlmIChyZXQpIHsKCQkJaWYgKG1heF9zaXplIDwgY3VycmVu dF9zaXplKSB7CgkJCQltYXhfd2luZG93ID0gaSAtIGN1cnJlbnRfc2l6ZTsKCQkJCW1heF9zaXpl ID0gY3VycmVudF9zaXplOwoJCQl9CgoJCQljdXJyZW50X3NpemUgPSAwOwoJCX0gZWxzZSB7CgkJ CWN1cnJlbnRfc2l6ZSsrOwoJCX0KCX0KCglpZiAoY3VycmVudF9zaXplID4gbWF4X3NpemUpIHsK CQltYXhfd2luZG93ID0gaSAtIGN1cnJlbnRfc2l6ZTsKCQltYXhfc2l6ZSA9IGN1cnJlbnRfc2l6 ZTsKCQljdXJyZW50X3NpemUgPSAwOwoJfQoKc2hvdWxkIHdvcmssIHRvbywgYW5kIGlzIHNpbXBs ZXIuCgpSZWdhcmRzLApZYW8gWmkKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fCmxpbnV4LXJpc2N2IG1haWxpbmcgbGlzdApsaW51eC1yaXNjdkBsaXN0cy5p bmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8v bGludXgtcmlzY3YK