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 4D357C4167B for ; Wed, 6 Dec 2023 07:55:04 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:In-Reply-To: Content-Transfer-Encoding:Content-Type: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=P2Qwl9NKzya6qz6fWxNXnyy+ZTdnl615fvfuvq8hUII=; b=CY/z1veAJYyGPanBfNyEYlGo9Z h/asXT9m+Soju1jDh/E/7OydRJzSEOzeFj5P0j/cNsQtn3u5N7RzYsyymu6yLSafXHb7+s2/2jHd8 sv5WyUKlNfBhSNmcR47lpO0NJOpP8pESFwcb/awEBBHbuAgQVQVCSG9zE2g0KUnVSE9ChJd202Ltb bHUVAbgJnbGlO2Zp+9fVpVUx4UW7qk1PtaTfJ1pdKaWoGFkuXpKZAejeboYH0QFqxXYJyG0E6dEqG hwn3DhkCBJ9X3xqeo5HTccTeKNXjEF+PnncOkF5KVmlJep9zrC3Cf3FCunF6ylmgWr7gjxY386LGY XOb3+D2A==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1rAmkI-009LM1-08; Wed, 06 Dec 2023 07:55:02 +0000 Received: from dfw.source.kernel.org ([2604:1380:4641:c500::1]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1rAmkE-009LL3-07; Wed, 06 Dec 2023 07:54:59 +0000 Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by dfw.source.kernel.org (Postfix) with ESMTP id CBA1A61A0A; Wed, 6 Dec 2023 07:54:56 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id D2B30C433C8; Wed, 6 Dec 2023 07:54:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1701849296; bh=oypg8H92xfnc19tAPThmY81NoTSyU3vjeSxmhkrunYI=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=n9365YMCtQ4i08AM5A8FU6ypnRi/Hv8bTvXegw3gf0f5PeYEtUNfLUbi0PiaaR0Ch itRumrtGztqFge/s6pc3DQgK8LPlntURUaS/UHiCam7qR4Z1znpqnPRhS7bqeOzCwJ P3FlUAvWOHF12D+d3a+yP53LS3wH7rluw4TMoDEXmpQoYActcXHQQ1ihdCTQCc+Otu NLVktWCpZNjjwI02XrzHDBoqFEkRbfmil2AtfA0aW/3ZNbx7eHfnnKljsKwBKTkehw q1aKKFsUvuWnWLvgkRx51EzBe50SNekCt8b8CTIGaZwzRcaR66hDeRM/qP7NvaYhaw avHxLR5jFOssA== Date: Wed, 6 Dec 2023 13:24:47 +0530 From: Manivannan Sadhasivam To: Nitin Rawat Cc: "James E.J. Bottomley" , "Martin K. Petersen" , Matthias Brugger , AngeloGioacchino Del Regno , Krzysztof Kozlowski , Manivannan Sadhasivam , linux-scsi@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org, quic_cang@quicinc.com, Manish Pandey Subject: Re: [PATCH V1] scsi: ufs: core: store min and max clk freq from OPP table Message-ID: <20231206075447.GA4954@thinkpad> References: <20231206053628.32169-1-quic_nitirawa@quicinc.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20231206053628.32169-1-quic_nitirawa@quicinc.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20231205_235458_183615_6548A3D5 X-CRM114-Status: GOOD ( 30.55 ) X-BeenThere: linux-mediatek@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "Linux-mediatek" Errors-To: linux-mediatek-bounces+linux-mediatek=archiver.kernel.org@lists.infradead.org On Wed, Dec 06, 2023 at 11:06:28AM +0530, Nitin Rawat wrote: > OPP support will make use of OPP table in device tree and removes > freq-table-hz property from device tree. > > With OPP enabled in devicetree, clki->min_freq and clki->maxfreq > currently is not getting updated and the value is set to 0. > > Soc vendors like qcom, mediatek uses clki->minfreq and clki->maxfreq > in vendor specific file. These frequencies values are used to update > vendor specific configurations. Since the value is 0, it is causing > functional issue. How about, "OPP support added by commit 72208ebe181e ("scsi: ufs: core: Add support for parsing OPP") doesn't update the min_freq and max_freq of each clocks in 'struct ufs_clk_info'. But these values are used by the vendor host drivers internally for controller configuration. When the OPP support is enabled in devicetree, these values will be 0, causing boot issues on the respective platforms. So let's parse the min_freq and max_freq of all clocks while parsing the OPP table." > > Add code to store the min and max ufs clk frequency from OPP table. > > Fixes: 72208ebe181e ("scsi: ufs: core: Add support for parsing OPP") > Co-developed-by: Manish Pandey > Signed-off-by: Manish Pandey > Signed-off-by: Nitin Rawat > --- > drivers/ufs/host/ufshcd-pltfrm.c | 56 ++++++++++++++++++++++++++++++++ > 1 file changed, 56 insertions(+) > > diff --git a/drivers/ufs/host/ufshcd-pltfrm.c b/drivers/ufs/host/ufshcd-pltfrm.c > index da2558e274b4..12fa6f7d6a97 100644 > --- a/drivers/ufs/host/ufshcd-pltfrm.c > +++ b/drivers/ufs/host/ufshcd-pltfrm.c > @@ -13,6 +13,7 @@ > #include > #include > #include > +#include Sort includes alphabetically. > > #include > #include "ufshcd-pltfrm.h" > @@ -213,6 +214,55 @@ static void ufshcd_init_lanes_per_dir(struct ufs_hba *hba) > } > } > > +/** > + * ufshcd_config_min_max_clk_freq - update min and max freq "ufshcd_parse_clock_min_max_freq - Parse MIN and MAX frequencies of clocks" > + * @hba: per adapter instance > + * > + * This function store min and max freq for all the clocks. > + * "This function parses MIN and MAX frequencies of all clocks required by the vendor host drivers." > + * Returns 0 for success and non-zero for failure > + */ > +static int ufshcd_config_min_max_clk_freq(struct ufs_hba *hba) > +{ > + struct list_head *head = &hba->clk_list_head; > + struct dev_pm_opp *opp; > + struct ufs_clk_info *clki; Please maintain reverse Xmas tree order. It's not a rule for this driver, but my own preference. > + unsigned long freq; > + u8 idx = 0; > + int ret; This won't be needed if all the return values are directly returned as I shared below. > + > + list_for_each_entry(clki, head, list) { > + if (!clki->name) > + continue; > + > + clki->clk = devm_clk_get(hba->dev, clki->name); > + if (!IS_ERR_OR_NULL(clki->clk)) { This function won't return NULL, so IS_ERR() is sufficient. > + /* Find Max Freq */ > + freq = ULONG_MAX; > + opp = dev_pm_opp_find_freq_floor_indexed(hba->dev, &freq, idx); Use idx++ and get rid of the increment at the end of the 'if' condition. > + if (IS_ERR(opp)) { > + dev_err(hba->dev, "failed to find dev_pm_opp\n"); "Failed to find OPP for MAX frequency" > + ret = PTR_ERR(opp); return PTR_ERR(opp); > + return ret; > + } > + clki->max_freq = dev_pm_opp_get_freq_indexed(opp, idx); > + Missing dev_pm_opp_put() > + /* Find Min Freq */ > + freq = 0; > + opp = dev_pm_opp_find_freq_ceil_indexed(hba->dev, &freq, idx); > + if (IS_ERR(opp)) { > + dev_err(hba->dev, "failed to find dev_pm_opp\n"); "Failed to find OPP for MIN frequency" > + ret = PTR_ERR(opp); return PTR_ERR(opp); > + return ret; > + } > + clki->min_freq = dev_pm_opp_get_freq_indexed(opp, idx); Missing dev_pm_opp_put() > + idx++; > + } > + } > + > + return 0; > +} > + > static int ufshcd_parse_operating_points(struct ufs_hba *hba) > { > struct device *dev = hba->dev; > @@ -279,6 +329,12 @@ static int ufshcd_parse_operating_points(struct ufs_hba *hba) > return ret; > } > > + ret = ufshcd_config_min_max_clk_freq(hba); > + if (ret) { > + dev_err(dev, "Failed to get min max freq: %d\n", ret); Since we already print error message inside the function, no need to do the same here. - Mani > + return ret; > + } > + > hba->use_pm_opp = true; > > return 0; > -- > 2.17.1 > -- மணிவண்ணன் சதாசிவம் 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 8DEBEC4167B for ; Wed, 6 Dec 2023 07:55:25 +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=zg6Ljd1h1bF801NcXU5+yD9D1tE0cl0a/Yfbyk9GZCA=; b=NpqNmaZ+70oyuT BaKVcSyFRG/aHuF+hqPHtPgbtMUu+pP49kq0zXU/CEV8zVUr+SjmeLvo1eewb7FXudi+k48az5foy FZjXyo4q1A5wr6VVbjUsVqafI7iyV8rTWSSl82VZbZOkxgUKuFrBtMH+ztIX4TIjCdaFWP1xQnIOW sZAbzKMWAjozoXKlMT8rOSm2aKku9U30AHZPoIuVhHxpegh65npjYcroDSW9ajfapLyzsu+as2vTT K3Kcssg/8od30NaJ7XpHNkIQmlui3Cw6BrksT2zjtuxK9M7uR5EhHNCxAol2RJkyRohiSgSOhQbk3 26IREcSe+tYW7XaigK6g==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1rAmkH-009LLV-1f; Wed, 06 Dec 2023 07:55:01 +0000 Received: from dfw.source.kernel.org ([2604:1380:4641:c500::1]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1rAmkE-009LL3-07; Wed, 06 Dec 2023 07:54:59 +0000 Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by dfw.source.kernel.org (Postfix) with ESMTP id CBA1A61A0A; Wed, 6 Dec 2023 07:54:56 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id D2B30C433C8; Wed, 6 Dec 2023 07:54:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1701849296; bh=oypg8H92xfnc19tAPThmY81NoTSyU3vjeSxmhkrunYI=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=n9365YMCtQ4i08AM5A8FU6ypnRi/Hv8bTvXegw3gf0f5PeYEtUNfLUbi0PiaaR0Ch itRumrtGztqFge/s6pc3DQgK8LPlntURUaS/UHiCam7qR4Z1znpqnPRhS7bqeOzCwJ P3FlUAvWOHF12D+d3a+yP53LS3wH7rluw4TMoDEXmpQoYActcXHQQ1ihdCTQCc+Otu NLVktWCpZNjjwI02XrzHDBoqFEkRbfmil2AtfA0aW/3ZNbx7eHfnnKljsKwBKTkehw q1aKKFsUvuWnWLvgkRx51EzBe50SNekCt8b8CTIGaZwzRcaR66hDeRM/qP7NvaYhaw avHxLR5jFOssA== Date: Wed, 6 Dec 2023 13:24:47 +0530 From: Manivannan Sadhasivam To: Nitin Rawat Cc: "James E.J. Bottomley" , "Martin K. Petersen" , Matthias Brugger , AngeloGioacchino Del Regno , Krzysztof Kozlowski , Manivannan Sadhasivam , linux-scsi@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org, quic_cang@quicinc.com, Manish Pandey Subject: Re: [PATCH V1] scsi: ufs: core: store min and max clk freq from OPP table Message-ID: <20231206075447.GA4954@thinkpad> References: <20231206053628.32169-1-quic_nitirawa@quicinc.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20231206053628.32169-1-quic_nitirawa@quicinc.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20231205_235458_183615_6548A3D5 X-CRM114-Status: GOOD ( 30.55 ) 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 T24gV2VkLCBEZWMgMDYsIDIwMjMgYXQgMTE6MDY6MjhBTSArMDUzMCwgTml0aW4gUmF3YXQgd3Jv dGU6Cj4gT1BQIHN1cHBvcnQgd2lsbCBtYWtlIHVzZSBvZiBPUFAgdGFibGUgaW4gZGV2aWNlIHRy ZWUgYW5kIHJlbW92ZXMKPiBmcmVxLXRhYmxlLWh6IHByb3BlcnR5IGZyb20gZGV2aWNlIHRyZWUu Cj4gCj4gV2l0aCBPUFAgZW5hYmxlZCBpbiBkZXZpY2V0cmVlLCBjbGtpLT5taW5fZnJlcSBhbmQg Y2xraS0+bWF4ZnJlcQo+IGN1cnJlbnRseSBpcyBub3QgZ2V0dGluZyB1cGRhdGVkIGFuZCB0aGUg dmFsdWUgaXMgc2V0IHRvIDAuCj4gCj4gU29jIHZlbmRvcnMgbGlrZSBxY29tLCBtZWRpYXRlayB1 c2VzIGNsa2ktPm1pbmZyZXEgYW5kIGNsa2ktPm1heGZyZXEKPiBpbiB2ZW5kb3Igc3BlY2lmaWMg ZmlsZS4gVGhlc2UgZnJlcXVlbmNpZXMgdmFsdWVzIGFyZSB1c2VkIHRvIHVwZGF0ZQo+IHZlbmRv ciBzcGVjaWZpYyBjb25maWd1cmF0aW9ucy4gU2luY2UgdGhlIHZhbHVlIGlzIDAsIGl0IGlzIGNh dXNpbmcKPiBmdW5jdGlvbmFsIGlzc3VlLgoKSG93IGFib3V0LAoKIk9QUCBzdXBwb3J0IGFkZGVk IGJ5IGNvbW1pdCA3MjIwOGViZTE4MWUgKCJzY3NpOiB1ZnM6IGNvcmU6IEFkZCBzdXBwb3J0CmZv ciBwYXJzaW5nIE9QUCIpIGRvZXNuJ3QgdXBkYXRlIHRoZSBtaW5fZnJlcSBhbmQgbWF4X2ZyZXEg b2YgZWFjaCBjbG9ja3MKaW4gJ3N0cnVjdCB1ZnNfY2xrX2luZm8nLgoKQnV0IHRoZXNlIHZhbHVl cyBhcmUgdXNlZCBieSB0aGUgdmVuZG9yIGhvc3QgZHJpdmVycyBpbnRlcm5hbGx5IGZvciBjb250 cm9sbGVyCmNvbmZpZ3VyYXRpb24uIFdoZW4gdGhlIE9QUCBzdXBwb3J0IGlzIGVuYWJsZWQgaW4g ZGV2aWNldHJlZSwgdGhlc2UgdmFsdWVzIHdpbGwKYmUgMCwgY2F1c2luZyBib290IGlzc3VlcyBv biB0aGUgcmVzcGVjdGl2ZSBwbGF0Zm9ybXMuCgpTbyBsZXQncyBwYXJzZSB0aGUgbWluX2ZyZXEg YW5kIG1heF9mcmVxIG9mIGFsbCBjbG9ja3Mgd2hpbGUgcGFyc2luZyB0aGUgT1BQCnRhYmxlLiIK Cj4gCj4gQWRkIGNvZGUgdG8gc3RvcmUgdGhlIG1pbiBhbmQgbWF4IHVmcyBjbGsgZnJlcXVlbmN5 IGZyb20gT1BQIHRhYmxlLgo+IAo+IEZpeGVzOiA3MjIwOGViZTE4MWUgKCJzY3NpOiB1ZnM6IGNv cmU6IEFkZCBzdXBwb3J0IGZvciBwYXJzaW5nIE9QUCIpCj4gQ28tZGV2ZWxvcGVkLWJ5OiBNYW5p c2ggUGFuZGV5IDxxdWljX21hcGFAcXVpY2luYy5jb20+Cj4gU2lnbmVkLW9mZi1ieTogTWFuaXNo IFBhbmRleSA8cXVpY19tYXBhQHF1aWNpbmMuY29tPgo+IFNpZ25lZC1vZmYtYnk6IE5pdGluIFJh d2F0IDxxdWljX25pdGlyYXdhQHF1aWNpbmMuY29tPgo+IC0tLQo+ICBkcml2ZXJzL3Vmcy9ob3N0 L3Vmc2hjZC1wbHRmcm0uYyB8IDU2ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCj4g IDEgZmlsZSBjaGFuZ2VkLCA1NiBpbnNlcnRpb25zKCspCj4gCj4gZGlmZiAtLWdpdCBhL2RyaXZl cnMvdWZzL2hvc3QvdWZzaGNkLXBsdGZybS5jIGIvZHJpdmVycy91ZnMvaG9zdC91ZnNoY2QtcGx0 ZnJtLmMKPiBpbmRleCBkYTI1NThlMjc0YjQuLjEyZmE2ZjdkNmE5NyAxMDA2NDQKPiAtLS0gYS9k cml2ZXJzL3Vmcy9ob3N0L3Vmc2hjZC1wbHRmcm0uYwo+ICsrKyBiL2RyaXZlcnMvdWZzL2hvc3Qv dWZzaGNkLXBsdGZybS5jCj4gQEAgLTEzLDYgKzEzLDcgQEAKPiAgI2luY2x1ZGUgPGxpbnV4L3Bt X29wcC5oPgo+ICAjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgo+ICAjaW5jbHVkZSA8bGlu dXgvb2YuaD4KPiArI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgoKU29ydCBpbmNsdWRlcyBhbHBoYWJl dGljYWxseS4KCj4gCj4gICNpbmNsdWRlIDx1ZnMvdWZzaGNkLmg+Cj4gICNpbmNsdWRlICJ1ZnNo Y2QtcGx0ZnJtLmgiCj4gQEAgLTIxMyw2ICsyMTQsNTUgQEAgc3RhdGljIHZvaWQgdWZzaGNkX2lu aXRfbGFuZXNfcGVyX2RpcihzdHJ1Y3QgdWZzX2hiYSAqaGJhKQo+ICAJfQo+ICB9Cj4gCj4gKy8q Kgo+ICsgKiB1ZnNoY2RfY29uZmlnX21pbl9tYXhfY2xrX2ZyZXEgLSB1cGRhdGUgbWluIGFuZCBt YXggZnJlcQoKInVmc2hjZF9wYXJzZV9jbG9ja19taW5fbWF4X2ZyZXEgLSBQYXJzZSBNSU4gYW5k IE1BWCBmcmVxdWVuY2llcyBvZiBjbG9ja3MiCgo+ICsgKiBAaGJhOiBwZXIgYWRhcHRlciBpbnN0 YW5jZQo+ICsgKgo+ICsgKiBUaGlzIGZ1bmN0aW9uIHN0b3JlIG1pbiBhbmQgbWF4IGZyZXEgZm9y IGFsbCB0aGUgY2xvY2tzLgo+ICsgKgoKIlRoaXMgZnVuY3Rpb24gcGFyc2VzIE1JTiBhbmQgTUFY IGZyZXF1ZW5jaWVzIG9mIGFsbCBjbG9ja3MgcmVxdWlyZWQgYnkgdGhlCnZlbmRvciBob3N0IGRy aXZlcnMuIgoKPiArICogUmV0dXJucyAwIGZvciBzdWNjZXNzIGFuZCBub24temVybyBmb3IgZmFp bHVyZQo+ICsgKi8KPiArc3RhdGljIGludCB1ZnNoY2RfY29uZmlnX21pbl9tYXhfY2xrX2ZyZXEo c3RydWN0IHVmc19oYmEgKmhiYSkKPiArewo+ICsJc3RydWN0IGxpc3RfaGVhZCAqaGVhZCA9ICZo YmEtPmNsa19saXN0X2hlYWQ7Cj4gKwlzdHJ1Y3QgZGV2X3BtX29wcCAqb3BwOwo+ICsJc3RydWN0 IHVmc19jbGtfaW5mbyAqY2xraTsKClBsZWFzZSBtYWludGFpbiByZXZlcnNlIFhtYXMgdHJlZSBv cmRlci4gSXQncyBub3QgYSBydWxlIGZvciB0aGlzIGRyaXZlciwgYnV0IG15Cm93biBwcmVmZXJl bmNlLgoKPiArCXVuc2lnbmVkIGxvbmcgZnJlcTsKPiArCXU4IGlkeCA9IDA7Cj4gKwlpbnQgcmV0 OwoKVGhpcyB3b24ndCBiZSBuZWVkZWQgaWYgYWxsIHRoZSByZXR1cm4gdmFsdWVzIGFyZSBkaXJl Y3RseSByZXR1cm5lZCBhcyBJIHNoYXJlZApiZWxvdy4KCj4gKwo+ICsJbGlzdF9mb3JfZWFjaF9l bnRyeShjbGtpLCBoZWFkLCBsaXN0KSB7Cj4gKwkJaWYgKCFjbGtpLT5uYW1lKQo+ICsJCQljb250 aW51ZTsKPiArCj4gKwkJY2xraS0+Y2xrID0gZGV2bV9jbGtfZ2V0KGhiYS0+ZGV2LCBjbGtpLT5u YW1lKTsKPiArCQlpZiAoIUlTX0VSUl9PUl9OVUxMKGNsa2ktPmNsaykpIHsKClRoaXMgZnVuY3Rp b24gd29uJ3QgcmV0dXJuIE5VTEwsIHNvIElTX0VSUigpIGlzIHN1ZmZpY2llbnQuCgo+ICsJCQkv KiBGaW5kIE1heCBGcmVxICovCj4gKwkJCWZyZXEgPSBVTE9OR19NQVg7Cj4gKwkJCW9wcCA9IGRl dl9wbV9vcHBfZmluZF9mcmVxX2Zsb29yX2luZGV4ZWQoaGJhLT5kZXYsICZmcmVxLCBpZHgpOwoK VXNlIGlkeCsrIGFuZCBnZXQgcmlkIG9mIHRoZSBpbmNyZW1lbnQgYXQgdGhlIGVuZCBvZiB0aGUg J2lmJyBjb25kaXRpb24uCgo+ICsJCQlpZiAoSVNfRVJSKG9wcCkpIHsKPiArCQkJCWRldl9lcnIo aGJhLT5kZXYsICJmYWlsZWQgdG8gZmluZCBkZXZfcG1fb3BwXG4iKTsKCiJGYWlsZWQgdG8gZmlu ZCBPUFAgZm9yIE1BWCBmcmVxdWVuY3kiCgo+ICsJCQkJcmV0ID0gUFRSX0VSUihvcHApOwoKcmV0 dXJuIFBUUl9FUlIob3BwKTsKCj4gKwkJCQlyZXR1cm4gcmV0Owo+ICsJCQl9Cj4gKwkJCWNsa2kt Pm1heF9mcmVxID0gZGV2X3BtX29wcF9nZXRfZnJlcV9pbmRleGVkKG9wcCwgaWR4KTsKPiArCgpN aXNzaW5nIGRldl9wbV9vcHBfcHV0KCkKCj4gKwkJCS8qIEZpbmQgTWluIEZyZXEgKi8KPiArCQkJ ZnJlcSA9IDA7Cj4gKwkJCW9wcCA9IGRldl9wbV9vcHBfZmluZF9mcmVxX2NlaWxfaW5kZXhlZCho YmEtPmRldiwgJmZyZXEsIGlkeCk7Cj4gKwkJCWlmIChJU19FUlIob3BwKSkgewo+ICsJCQkJZGV2 X2VycihoYmEtPmRldiwgImZhaWxlZCB0byBmaW5kIGRldl9wbV9vcHBcbiIpOwoKIkZhaWxlZCB0 byBmaW5kIE9QUCBmb3IgTUlOIGZyZXF1ZW5jeSIKCj4gKwkJCQlyZXQgPSBQVFJfRVJSKG9wcCk7 CgpyZXR1cm4gUFRSX0VSUihvcHApOwoKPiArCQkJCXJldHVybiByZXQ7Cj4gKwkJCX0KPiArCQkJ Y2xraS0+bWluX2ZyZXEgPSBkZXZfcG1fb3BwX2dldF9mcmVxX2luZGV4ZWQob3BwLCBpZHgpOwoK TWlzc2luZyBkZXZfcG1fb3BwX3B1dCgpCgo+ICsJCQlpZHgrKzsKPiArCQl9Cj4gKwl9Cj4gKwo+ ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gIHN0YXRpYyBpbnQgdWZzaGNkX3BhcnNlX29wZXJhdGlu Z19wb2ludHMoc3RydWN0IHVmc19oYmEgKmhiYSkKPiAgewo+ICAJc3RydWN0IGRldmljZSAqZGV2 ID0gaGJhLT5kZXY7Cj4gQEAgLTI3OSw2ICszMjksMTIgQEAgc3RhdGljIGludCB1ZnNoY2RfcGFy c2Vfb3BlcmF0aW5nX3BvaW50cyhzdHJ1Y3QgdWZzX2hiYSAqaGJhKQo+ICAJCXJldHVybiByZXQ7 Cj4gIAl9Cj4gCj4gKwlyZXQgPSB1ZnNoY2RfY29uZmlnX21pbl9tYXhfY2xrX2ZyZXEoaGJhKTsK PiArCWlmIChyZXQpIHsKPiArCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBnZXQgbWluIG1heCBm cmVxOiAlZFxuIiwgcmV0KTsKClNpbmNlIHdlIGFscmVhZHkgcHJpbnQgZXJyb3IgbWVzc2FnZSBp bnNpZGUgdGhlIGZ1bmN0aW9uLCBubyBuZWVkIHRvIGRvIHRoZSBzYW1lCmhlcmUuCgotIE1hbmkK Cj4gKwkJcmV0dXJuIHJldDsKPiArCX0KPiArCj4gIAloYmEtPnVzZV9wbV9vcHAgPSB0cnVlOwo+ IAo+ICAJcmV0dXJuIDA7Cj4gLS0KPiAyLjE3LjEKPiAKCi0tIArgrq7grqPgrr/grrXgrqPgr43g rqPgrqngr40g4K6a4K6k4K6+4K6a4K6/4K614K6u4K+NCgpfX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdAps aW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVh ZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCg==