From mboxrd@z Thu Jan 1 00:00:00 1970 From: Matthias Kaehlcke Subject: Re: [PATCH v2 3/5] devfreq: rk3399_dmc: Pass ODT and auto power down parameters to TF-A. Date: Tue, 19 Mar 2019 17:33:52 -0700 Message-ID: <20190320003352.GN112750@google.com> References: <20190319181323.22804-1-gael.portay@collabora.com> <20190319181323.22804-4-gael.portay@collabora.com> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Return-path: Content-Disposition: inline In-Reply-To: <20190319181323.22804-4-gael.portay@collabora.com> Sender: linux-kernel-owner@vger.kernel.org To: =?utf-8?B?R2HDq2w=?= PORTAY Cc: MyungJoo Ham , Kyungmin Park , Chanwoo Choi , Rob Herring , Heiko Stuebner , Enric Balletbo i Serra , Lin Huang , Brian Norris , Douglas Anderson , Klaus Goger , Derek Basehore , Randy Li , linux-pm@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, Mark Rutland , kernel@collabora.com List-Id: linux-pm@vger.kernel.org Hi Gaël, On Tue, Mar 19, 2019 at 02:13:21PM -0400, Gaël PORTAY wrote: > From: Enric Balletbo i Serra > > Trusted Firmware-A (TF-A) for rk3399 implements a SiP call to get the > on-die termination (ODT) and auto power down parameters from kernel, > this patch adds the functionality to do this. Also, if DDR clock > frequency is lower than the on-die termination (ODT) disable frequency > this driver should disable the DDR ODT. > > Signed-off-by: Enric Balletbo i Serra > Reviewed-by: Chanwoo Choi > --- > > Changes in v2: None > > Changes in v1: > - [RFC 3/10] Add an explanation for platform SIP calls. > - [RFC 3/10] Change if statement for a switch. > - [RFC 3/10] Rename ddr_flag to odt_enable to be more clear. > > drivers/devfreq/rk3399_dmc.c | 74 ++++++++++++++++++++++++++++- > include/soc/rockchip/rockchip_sip.h | 1 + > 2 files changed, 74 insertions(+), 1 deletion(-) > > diff --git a/drivers/devfreq/rk3399_dmc.c b/drivers/devfreq/rk3399_dmc.c > ... > static int rk3399_dmcfreq_target(struct device *dev, unsigned long *freq, > @@ -80,6 +86,8 @@ static int rk3399_dmcfreq_target(struct device *dev, unsigned long *freq, > struct dev_pm_opp *opp; > unsigned long old_clk_rate = dmcfreq->rate; > unsigned long target_volt, target_rate; > + struct arm_smccc_res res; > + bool odt_enable = false; > int err; > > opp = devfreq_recommended_opp(dev, freq, flags); > @@ -95,6 +103,19 @@ static int rk3399_dmcfreq_target(struct device *dev, unsigned long *freq, > > mutex_lock(&dmcfreq->lock); > > + if (target_rate >= dmcfreq->odt_dis_freq) > + odt_enable = true; > + > + /* > + * This makes a SMC call to the TF-A to set the DDR PD (power-down) > + * timings and to enable or disable the ODT (on-die termination) > + * resistors. > + */ > + arm_smccc_smc(ROCKCHIP_SIP_DRAM_FREQ, dmcfreq->odt_pd_arg0, > + dmcfreq->odt_pd_arg1, > + ROCKCHIP_SIP_CONFIG_DRAM_SET_ODT_PD, > + odt_enable, 0, 0, 0, &res); Is it necessary/desirable to make this call for every frequency change? IIUC it should be only needed when odt_enable changes and the driver could track the state. If the DDR frequency doesn't change too often and the overhead of the call is small it shouldn't be really important though. > @@ -294,11 +315,13 @@ static int rk3399_dmcfreq_probe(struct platform_device *pdev) > { > struct arm_smccc_res res; > struct device *dev = &pdev->dev; > - struct device_node *np = pdev->dev.of_node; > + struct device_node *np = pdev->dev.of_node, *node; > struct rk3399_dmcfreq *data; > int ret, index, size; > uint32_t *timing; > struct dev_pm_opp *opp; > + u32 ddr_type; > + u32 val; > > data = devm_kzalloc(dev, sizeof(struct rk3399_dmcfreq), GFP_KERNEL); > if (!data) > @@ -334,6 +357,34 @@ static int rk3399_dmcfreq_probe(struct platform_device *pdev) > return ret; > } > > + /* Try to find the optional reference to the pmu syscon */ > + node = of_parse_phandle(np, "rockchip,pmu", 0); > + if (node) { The 'optional' part doesn't seem to be accurate: according to the binding (https://lore.kernel.org/patchwork/patch/1052322/) the property is required and the code below assumes that data->regmap_pmu is set. > + data->regmap_pmu = syscon_node_to_regmap(node); > + if (IS_ERR(data->regmap_pmu)) > + return PTR_ERR(data->regmap_pmu); > + } > + > + /* Get DDR type */ nit: the comment doesn't add much value, thanks to good variable naming this is evident from the code. > + regmap_read(data->regmap_pmu, RK3399_PMUGRF_OS_REG2, &val); > + ddr_type = (val >> RK3399_PMUGRF_DDRTYPE_SHIFT) & > + RK3399_PMUGRF_DDRTYPE_MASK; > + > + /* Get the odt_dis_freq parameter in function of the DDR type */ nit: ditto (if you prefer to keep these comments I'm not opposed to keeping them, but I don't think they are needed) Cheers Matthias 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=-8.5 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_PASS,USER_AGENT_MUTT autolearn=ham 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 7C07EC43381 for ; Wed, 20 Mar 2019 00:34:04 +0000 (UTC) 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 mail.kernel.org (Postfix) with ESMTPS id 490F820828 for ; Wed, 20 Mar 2019 00:34:04 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="gypdRAAF"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="OixlN/PX" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 490F820828 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=chromium.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject: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=ZaJq5zz2kBxi3xDXmw6Q6uqCptRKA3tdkko84i3UYG8=; b=gypdRAAFkvhSKf 5SgZW+pIfv7KUUqeGzvZA5DTuvF+exWVAOJQBa3Kx7TH3k4izM9b7S/Xy8hMFxJ29RkNTexcr6DIl L60Fde3yu30Nar8f/tXCQxm5JZEvQiDWFB26htweETCk/jAISRP7Pnpp18Tp5NcvfJSKZeyjCTGZ+ OtNV7SUCvwIuux6r/jJHHWYy7+kiGM1Rf0oN/qCn+UqMJ77tsAxBHWHT6DFVL1RSm8ITJVZIaX0dx pHT6penf/hYBsy4d94NfbIjw7S+4tqKCVMxK2B9f9aTTQ0ZwHpXWveWiuw+HdrIig3/gswcDrtafF UBPbqTyTt0869w7eI0Dw==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1h6PB9-00042n-Dv; Wed, 20 Mar 2019 00:33:59 +0000 Received: from mail-pf1-x444.google.com ([2607:f8b0:4864:20::444]) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1h6PB5-00040t-2W for linux-arm-kernel@lists.infradead.org; Wed, 20 Mar 2019 00:33:56 +0000 Received: by mail-pf1-x444.google.com with SMTP id r15so560281pfn.9 for ; Tue, 19 Mar 2019 17:33:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:content-transfer-encoding:in-reply-to :user-agent; bh=pIAmozdrbTOLwLNGIyetO2St2qeMD1RsIRur82uuJek=; b=OixlN/PXRwQFCJpfng9mAz+ykI8+BrgxciXQKA2qqI40KgUxB1ta/9IYGKVJVgmgVj bRt5LIhFdpdZJsHlRJTNEBBT4zf+7FyYP5kr7bZsuY28b3xh9NDZxw81XTHaTnnG5tlc wpMQwz+nxJdj7dTo+kiMxK/FQaKjOdZmx0R2k= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:content-transfer-encoding :in-reply-to:user-agent; bh=pIAmozdrbTOLwLNGIyetO2St2qeMD1RsIRur82uuJek=; b=uDsPjme1uYWbuP49RXpeTDf+sN2AZ7boZXGKh+/Ja1RYZCi4o/Y6V9ZY1zFFfpiShS sMvz2Jyna6g1mrF4h//vMkTzcJ5jcYzA6qNC6yF5v3EOo/Cc7hMrDe64eqj8UwgMVC2i Zwe4jyCbIAdb1IIHMSq5ryxr2H+T4vSQA9yO/ODR8vBXUiy1ILvTrNeaqSCmD7eH5yD0 kCisEZD8rUvefhaGdeYwYJoyVmpavKs1lYQg10c9HPo3aJ2L4qWbLHOCzmlJmiBqRAN0 eENAD8b9GXogxIj8iBI4bzz8JMWsSx2FtMwzRjgWr9Mo67JgCcNCREA7jhrTnVV6SFNg BVyQ== X-Gm-Message-State: APjAAAW10qvXPZV4Y7xQZ67XpatT0TDp5yVbi12r+lj299f0Wckm0BWV NmVpPmatRRzNL3quaejHfqydvw== X-Google-Smtp-Source: APXvYqzbgiE7aJ+ThgbRlljjuMjnoZuOAv0b7hZqNDkCC+iqTxIpTIQ/lgi4xeLM/4yfWMSOPjH/+A== X-Received: by 2002:a17:902:6949:: with SMTP id k9mr4679354plt.275.1553042033947; Tue, 19 Mar 2019 17:33:53 -0700 (PDT) Received: from localhost ([2620:15c:202:1:75a:3f6e:21d:9374]) by smtp.gmail.com with ESMTPSA id p14sm216333pgn.34.2019.03.19.17.33.53 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Tue, 19 Mar 2019 17:33:53 -0700 (PDT) Date: Tue, 19 Mar 2019 17:33:52 -0700 From: Matthias Kaehlcke To: =?utf-8?B?R2HDq2w=?= PORTAY Subject: Re: [PATCH v2 3/5] devfreq: rk3399_dmc: Pass ODT and auto power down parameters to TF-A. Message-ID: <20190320003352.GN112750@google.com> References: <20190319181323.22804-1-gael.portay@collabora.com> <20190319181323.22804-4-gael.portay@collabora.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20190319181323.22804-4-gael.portay@collabora.com> User-Agent: Mutt/1.10.1 (2018-07-13) X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20190319_173355_133779_55BE6D2E X-CRM114-Status: GOOD ( 25.14 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Mark Rutland , devicetree@vger.kernel.org, Derek Basehore , Heiko Stuebner , linux-pm@vger.kernel.org, Brian Norris , Douglas Anderson , Rob Herring , linux-kernel@vger.kernel.org, Chanwoo Choi , Kyungmin Park , MyungJoo Ham , Klaus Goger , Enric Balletbo i Serra , linux-rockchip@lists.infradead.org, Randy Li , kernel@collabora.com, linux-arm-kernel@lists.infradead.org, Lin Huang Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org SGkgR2HDq2wsCgpPbiBUdWUsIE1hciAxOSwgMjAxOSBhdCAwMjoxMzoyMVBNIC0wNDAwLCBHYcOr bCBQT1JUQVkgd3JvdGU6Cj4gRnJvbTogRW5yaWMgQmFsbGV0Ym8gaSBTZXJyYSA8ZW5yaWMuYmFs bGV0Ym9AY29sbGFib3JhLmNvbT4KPiAKPiBUcnVzdGVkIEZpcm13YXJlLUEgKFRGLUEpIGZvciBy azMzOTkgaW1wbGVtZW50cyBhIFNpUCBjYWxsIHRvIGdldCB0aGUKPiBvbi1kaWUgdGVybWluYXRp b24gKE9EVCkgYW5kIGF1dG8gcG93ZXIgZG93biBwYXJhbWV0ZXJzIGZyb20ga2VybmVsLAo+IHRo aXMgcGF0Y2ggYWRkcyB0aGUgZnVuY3Rpb25hbGl0eSB0byBkbyB0aGlzLiBBbHNvLCBpZiBERFIg Y2xvY2sKPiBmcmVxdWVuY3kgaXMgbG93ZXIgdGhhbiB0aGUgb24tZGllIHRlcm1pbmF0aW9uIChP RFQpIGRpc2FibGUgZnJlcXVlbmN5Cj4gdGhpcyBkcml2ZXIgc2hvdWxkIGRpc2FibGUgdGhlIERE UiBPRFQuCj4gCj4gU2lnbmVkLW9mZi1ieTogRW5yaWMgQmFsbGV0Ym8gaSBTZXJyYSA8ZW5yaWMu YmFsbGV0Ym9AY29sbGFib3JhLmNvbT4KPiBSZXZpZXdlZC1ieTogQ2hhbndvbyBDaG9pIDxjdzAw LmNob2lAc2Ftc3VuZy5jb20+Cj4gLS0tCj4gCj4gQ2hhbmdlcyBpbiB2MjogTm9uZQo+IAo+IENo YW5nZXMgaW4gdjE6Cj4gLSBbUkZDIDMvMTBdIEFkZCBhbiBleHBsYW5hdGlvbiBmb3IgcGxhdGZv cm0gU0lQIGNhbGxzLgo+IC0gW1JGQyAzLzEwXSBDaGFuZ2UgaWYgc3RhdGVtZW50IGZvciBhIHN3 aXRjaC4KPiAtIFtSRkMgMy8xMF0gUmVuYW1lIGRkcl9mbGFnIHRvIG9kdF9lbmFibGUgdG8gYmUg bW9yZSBjbGVhci4KPiAKPiAgZHJpdmVycy9kZXZmcmVxL3JrMzM5OV9kbWMuYyAgICAgICAgfCA3 NCArKysrKysrKysrKysrKysrKysrKysrKysrKysrLQo+ICBpbmNsdWRlL3NvYy9yb2NrY2hpcC9y b2NrY2hpcF9zaXAuaCB8ICAxICsKPiAgMiBmaWxlcyBjaGFuZ2VkLCA3NCBpbnNlcnRpb25zKCsp LCAxIGRlbGV0aW9uKC0pCj4gCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZGV2ZnJlcS9yazMzOTlf ZG1jLmMgYi9kcml2ZXJzL2RldmZyZXEvcmszMzk5X2RtYy5jCj4gLi4uCj4gIHN0YXRpYyBpbnQg cmszMzk5X2RtY2ZyZXFfdGFyZ2V0KHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyAq ZnJlcSwKPiBAQCAtODAsNiArODYsOCBAQCBzdGF0aWMgaW50IHJrMzM5OV9kbWNmcmVxX3Rhcmdl dChzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgKmZyZXEsCj4gIAlzdHJ1Y3QgZGV2 X3BtX29wcCAqb3BwOwo+ICAJdW5zaWduZWQgbG9uZyBvbGRfY2xrX3JhdGUgPSBkbWNmcmVxLT5y YXRlOwo+ICAJdW5zaWduZWQgbG9uZyB0YXJnZXRfdm9sdCwgdGFyZ2V0X3JhdGU7Cj4gKwlzdHJ1 Y3QgYXJtX3NtY2NjX3JlcyByZXM7Cj4gKwlib29sIG9kdF9lbmFibGUgPSBmYWxzZTsKPiAgCWlu dCBlcnI7Cj4gIAo+ICAJb3BwID0gZGV2ZnJlcV9yZWNvbW1lbmRlZF9vcHAoZGV2LCBmcmVxLCBm bGFncyk7Cj4gQEAgLTk1LDYgKzEwMywxOSBAQCBzdGF0aWMgaW50IHJrMzM5OV9kbWNmcmVxX3Rh cmdldChzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgKmZyZXEsCj4gIAo+ICAJbXV0 ZXhfbG9jaygmZG1jZnJlcS0+bG9jayk7Cj4gIAo+ICsJaWYgKHRhcmdldF9yYXRlID49IGRtY2Zy ZXEtPm9kdF9kaXNfZnJlcSkKPiArCQlvZHRfZW5hYmxlID0gdHJ1ZTsKPiArCj4gKwkvKgo+ICsJ ICogVGhpcyBtYWtlcyBhIFNNQyBjYWxsIHRvIHRoZSBURi1BIHRvIHNldCB0aGUgRERSIFBEIChw b3dlci1kb3duKQo+ICsJICogdGltaW5ncyBhbmQgdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhlIE9E VCAob24tZGllIHRlcm1pbmF0aW9uKQo+ICsJICogcmVzaXN0b3JzLgo+ICsJICovCj4gKwlhcm1f c21jY2Nfc21jKFJPQ0tDSElQX1NJUF9EUkFNX0ZSRVEsIGRtY2ZyZXEtPm9kdF9wZF9hcmcwLAo+ ICsJCSAgICAgIGRtY2ZyZXEtPm9kdF9wZF9hcmcxLAo+ICsJCSAgICAgIFJPQ0tDSElQX1NJUF9D T05GSUdfRFJBTV9TRVRfT0RUX1BELAo+ICsJCSAgICAgIG9kdF9lbmFibGUsIDAsIDAsIDAsICZy ZXMpOwoKSXMgaXQgbmVjZXNzYXJ5L2Rlc2lyYWJsZSB0byBtYWtlIHRoaXMgY2FsbCBmb3IgZXZl cnkgZnJlcXVlbmN5CmNoYW5nZT8gSUlVQyBpdCBzaG91bGQgYmUgb25seSBuZWVkZWQgd2hlbiBv ZHRfZW5hYmxlIGNoYW5nZXMgYW5kIHRoZQpkcml2ZXIgY291bGQgdHJhY2sgdGhlIHN0YXRlLiBJ ZiB0aGUgRERSIGZyZXF1ZW5jeSBkb2Vzbid0IGNoYW5nZSB0b28Kb2Z0ZW4gYW5kIHRoZSBvdmVy aGVhZCBvZiB0aGUgY2FsbCBpcyBzbWFsbCBpdCBzaG91bGRuJ3QgYmUgcmVhbGx5CmltcG9ydGFu dCB0aG91Z2guCgo+IEBAIC0yOTQsMTEgKzMxNSwxMyBAQCBzdGF0aWMgaW50IHJrMzM5OV9kbWNm cmVxX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4gIHsKPiAgCXN0cnVjdCBh cm1fc21jY2NfcmVzIHJlczsKPiAgCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7Cj4g LQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7Cj4gKwlzdHJ1Y3Qg ZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGUsICpub2RlOwo+ICAJc3RydWN0IHJr MzM5OV9kbWNmcmVxICpkYXRhOwo+ICAJaW50IHJldCwgaW5kZXgsIHNpemU7Cj4gIAl1aW50MzJf dCAqdGltaW5nOwo+ICAJc3RydWN0IGRldl9wbV9vcHAgKm9wcDsKPiArCXUzMiBkZHJfdHlwZTsK PiArCXUzMiB2YWw7Cj4gIAo+ICAJZGF0YSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZihzdHJ1 Y3QgcmszMzk5X2RtY2ZyZXEpLCBHRlBfS0VSTkVMKTsKPiAgCWlmICghZGF0YSkKPiBAQCAtMzM0 LDYgKzM1NywzNCBAQCBzdGF0aWMgaW50IHJrMzM5OV9kbWNmcmVxX3Byb2JlKHN0cnVjdCBwbGF0 Zm9ybV9kZXZpY2UgKnBkZXYpCj4gIAkJcmV0dXJuIHJldDsKPiAgCX0KPiAgCj4gKwkvKiBUcnkg dG8gZmluZCB0aGUgb3B0aW9uYWwgcmVmZXJlbmNlIHRvIHRoZSBwbXUgc3lzY29uICovCj4gKwlu b2RlID0gb2ZfcGFyc2VfcGhhbmRsZShucCwgInJvY2tjaGlwLHBtdSIsIDApOwo+ICsJaWYgKG5v ZGUpIHsKClRoZSAnb3B0aW9uYWwnIHBhcnQgZG9lc24ndCBzZWVtIHRvIGJlIGFjY3VyYXRlOiBh Y2NvcmRpbmcgdG8gdGhlCmJpbmRpbmcgKGh0dHBzOi8vbG9yZS5rZXJuZWwub3JnL3BhdGNod29y ay9wYXRjaC8xMDUyMzIyLykgdGhlCnByb3BlcnR5IGlzIHJlcXVpcmVkIGFuZCB0aGUgY29kZSBi ZWxvdyBhc3N1bWVzIHRoYXQgZGF0YS0+cmVnbWFwX3BtdQppcyBzZXQuCgo+ICsJCWRhdGEtPnJl Z21hcF9wbXUgPSBzeXNjb25fbm9kZV90b19yZWdtYXAobm9kZSk7Cj4gKwkJaWYgKElTX0VSUihk YXRhLT5yZWdtYXBfcG11KSkKPiArCQkJcmV0dXJuIFBUUl9FUlIoZGF0YS0+cmVnbWFwX3BtdSk7 Cj4gKwl9Cj4gKwo+ICsJLyogR2V0IEREUiB0eXBlICovCgpuaXQ6IHRoZSBjb21tZW50IGRvZXNu J3QgYWRkIG11Y2ggdmFsdWUsIHRoYW5rcyB0byBnb29kIHZhcmlhYmxlCm5hbWluZyB0aGlzIGlz IGV2aWRlbnQgZnJvbSB0aGUgY29kZS4KCj4gKwlyZWdtYXBfcmVhZChkYXRhLT5yZWdtYXBfcG11 LCBSSzMzOTlfUE1VR1JGX09TX1JFRzIsICZ2YWwpOwo+ICsJZGRyX3R5cGUgPSAodmFsID4+IFJL MzM5OV9QTVVHUkZfRERSVFlQRV9TSElGVCkgJgo+ICsJCSAgICBSSzMzOTlfUE1VR1JGX0REUlRZ UEVfTUFTSzsKPiArCj4gKwkvKiBHZXQgdGhlIG9kdF9kaXNfZnJlcSBwYXJhbWV0ZXIgaW4gZnVu Y3Rpb24gb2YgdGhlIEREUiB0eXBlICovCgpuaXQ6IGRpdHRvCgooaWYgeW91IHByZWZlciB0byBr ZWVwIHRoZXNlIGNvbW1lbnRzIEknbSBub3Qgb3Bwb3NlZCB0byBrZWVwaW5nIHRoZW0sCmJ1dCBJ IGRvbid0IHRoaW5rIHRoZXkgYXJlIG5lZWRlZCkKCkNoZWVycwoKTWF0dGhpYXMKCl9fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwg bWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8v bGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK