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 B2A5AC7EE25 for ; Wed, 7 Jun 2023 17:43:01 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230178AbjFGRnA (ORCPT ); Wed, 7 Jun 2023 13:43:00 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42404 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231562AbjFGRm7 (ORCPT ); Wed, 7 Jun 2023 13:42:59 -0400 Received: from comms.puri.sm (comms.puri.sm [159.203.221.185]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5A1591BF7; Wed, 7 Jun 2023 10:42:58 -0700 (PDT) Received: from localhost (localhost [127.0.0.1]) by comms.puri.sm (Postfix) with ESMTP id EEF9DED298; Wed, 7 Jun 2023 10:42:27 -0700 (PDT) Received: from comms.puri.sm ([127.0.0.1]) by localhost (comms.puri.sm [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id VSwjU-ZNeK2n; Wed, 7 Jun 2023 10:42:27 -0700 (PDT) From: Sebastian Krzyszkowiak DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=puri.sm; s=comms; t=1686159746; bh=yzcHza535Knz3sPmrJrUUFyPYQOMzuWWt47W0zm0kPk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Kxr8ZpRVXotS3CvCC+tJXoqIVRX3KtkDEAyOIvqB3BEUe5oAqNMbfSPc+gZeIkKs5 2z+eY/0LOgjRWsZkQRU70x9bEh2K7hVNCM67+knFWNwm5ioR1Z3yoT/9qdX6GXw3ZL E3WVUirXuI/Yuf1SCXnluJwn4q/8rAUcs0bIK3xYPo/Ui4pd4y2fFZ7BUpYC6mR4lc DWWvqCChO13B8MFIVm92Rp5NH1WFLMAsmzp30B9tGqsyclUzvP8fE7NYfbkzUbKJZE +OXcXIuvQSji97zy9WGJPvgDs7LOHrykgygdptTHNqDAxm7QS3HC8uP07klRSJt6xq ufrQT8FokmmbA== To: Peng Fan , "Peng Fan (OSS)" , "rafael@kernel.org" , "shawnguo@kernel.org" , "s.hauer@pengutronix.de" , Daniel Lezcano Cc: "amitk@kernel.org" , "rui.zhang@intel.com" , "andrew.smirnov@gmail.com" , "linux-pm@vger.kernel.org" , "linux-kernel@vger.kernel.org" , "kernel@pengutronix.de" , "festevam@gmail.com" , dl-linux-imx , "linux-arm-kernel@lists.infradead.org" , Alice Guo Subject: Re: [PATCH 2/3] thermal: qoriq_thermal: only enable supported sensors Date: Wed, 07 Jun 2023 19:42:12 +0200 Message-ID: <1966575.usQuhbGJ8B@pliszka> In-Reply-To: <3120c2d5-4473-5b72-29bf-d841e806878f@linaro.org> References: <20230516083746.63436-1-peng.fan@oss.nxp.com> <21914890.EfDdHjke4D@pliszka> <3120c2d5-4473-5b72-29bf-d841e806878f@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="UTF-8" Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org On =C5=9Broda, 7 czerwca 2023 10:28:59 CEST Daniel Lezcano wrote: > On 07/06/2023 08:01, Sebastian Krzyszkowiak wrote: > > On pi=C4=85tek, 2 czerwca 2023 15:11:37 CEST Daniel Lezcano wrote: > >> On 01/06/2023 11:52, Peng Fan wrote: > >>> Hi Daniel, > >>>=20 > >>>> Subject: RE: [PATCH 2/3] thermal: qoriq_thermal: only enable support= ed > >>>> sensors > >>>>=20 > >>>>> Subject: Re: [PATCH 2/3] thermal: qoriq_thermal: only enable suppor= ted > >>>>> sensors > >>>>>=20 > >>>>> On 31/05/2023 14:05, Peng Fan wrote: > >>>>>>> Subject: Re: [PATCH 2/3] thermal: qoriq_thermal: only enable > >>>>>>> supported sensors > >>>>>>>=20 > >>>>>>> On 16/05/2023 10:37, Peng Fan (OSS) wrote: > >>>>>>>> From: Peng Fan > >>>>>>>>=20 > >>>>>>>> There are MAX 16 sensors, but not all of them supported. Such as > >>>>>>>> i.MX8MQ, there are only 3 sensors. Enabling all 16 sensors will > >>>>>>>> touch reserved bits from i.MX8MQ reference mannual, and TMU will > >>>>>>>> stuck, temperature will not update anymore. > >>>>>>>>=20 > >>>>>>>> Fixes: 45038e03d633 ("thermal: qoriq: Enable all sensors before > >>>>>>>> registering them") > >>>>>>>> Signed-off-by: Peng Fan > >>>>>>>> --- > >>>>>>>>=20 > >>>>>>>> drivers/thermal/qoriq_thermal.c | 30 > >>>>>>>> +++++++++++++++++++---------- > >>>>=20 > >>>> - > >>>>=20 > >>>>>>>> 1 file changed, 19 insertions(+), 11 deletions(-) > >>>>>>>>=20 > >>>>>>>> diff --git a/drivers/thermal/qoriq_thermal.c > >>>>>>>> b/drivers/thermal/qoriq_thermal.c index > >>>>=20 > >>>> b806a0929459..53748c4a5be1 > >>>>=20 > >>>>>>>> 100644 > >>>>>>>> --- a/drivers/thermal/qoriq_thermal.c > >>>>>>>> +++ b/drivers/thermal/qoriq_thermal.c > >>>>>>>> @@ -31,7 +31,6 @@ > >>>>>>>>=20 > >>>>>>>> #define TMR_DISABLE 0x0 > >>>>>>>> #define TMR_ME 0x80000000 > >>>>>>>> #define TMR_ALPF 0x0c000000 > >>>>>>>>=20 > >>>>>>>> -#define TMR_MSITE_ALL GENMASK(15, 0) > >>>>>>>>=20 > >>>>>>>> #define REGS_TMTMIR 0x008 /* Temperature measurement > >>>>>>>=20 > >>>>>>> interval Register */ > >>>>>>>=20 > >>>>>>>> #define TMTMIR_DEFAULT 0x0000000f > >>>>>>>>=20 > >>>>>>>> @@ -105,6 +104,11 @@ static int tmu_get_temp(struct > >>>>>>>=20 > >>>>>>> thermal_zone_device *tz, int *temp) > >>>>>>>=20 > >>>>>>>> * within sensor range. TEMP is an 9 bit value=20 representing > >>>>>>>> * temperature in KelVin. > >>>>>>>> */ > >>>>>>>>=20 > >>>>>>>> + > >>>>>>>> + regmap_read(qdata->regmap, REGS_TMR, &val); > >>>>>>>> + if (!(val & TMR_ME)) > >>>>>>>> + return -EAGAIN; > >>>>>>>=20 > >>>>>>> How is this change related to what is described in the changelog? > >>>>>>=20 > >>>>>> devm_thermal_zone_of_sensor_register will invoke get temp, since we > >>>>>> reverted the 45038e03d633 did, we need to check TMR_ME to avoid > >>>>>=20 > >>>>> return > >>>>>=20 > >>>>>> invalid temperature. > >>>>>>=20 > >>>>> From a higher perspective if the sensor won't be enabled, then t= he > >>>>>=20 > >>>>> thermal zone should not be registered, the get_temp won't happen on= a > >>>>> disabled sensor and this test won't be necessary, no ? > >>>=20 > >>> After thinking more, I'd prefer current logic. > >>>=20 > >>> We rely on devm_thermal_of_zone_register's return value to know > >>> whether there is a valid zone, then set sites bit, and after collected > >>> all site bits, we enable the thermal IP. > >>>=20 > >>> If move the enabling thermal IP before devm_thermal_of_zone_register, > >>> We need check dtb thermal zone, to know which zone is valid for curre= nt > >>> thermal IP. This would complicate the design. > >>>=20 > >>> So just checking the enabling bit in get temperature would be much > >>> simpler, and there just a small window before enabling thermal IP. > >>=20 > >> If the thermal zone is not described, then the thermal zone won't be > >> created as it fails with -ENODEV and thus get_temp won't be called on a > >> disabled site, right? > >=20 > > That's not what the problem is. It's about zones that *will* be created= - > > since the driver only knows that a thermal zone isn't described in the > > device tree after it fails registering, it can't enable the site *befor= e* > > the zone gets registered - so it happens afterwards. That's why it needs > > this check to not return a bogus initial value before the site gets > > actually enabled later in qoriq_tmu_register_tmu_zone. >=20 > Sorry, I get the point but I don't see how that can happen: >=20 > qoriq_tmu_register_tmu_zone() calls devm_thermal_of_zone_register() for > *all* sites regardless if they really exists or not. >=20 > Under the hood, the function devm_thermal_of_zone_register() calls > thermal_of_zone_register(). This one fails when calling > of_thermal_zone_find() because it does not exist and returns -ENODEV. >=20 > Hence, the thermal_zone_device_register_with_trips() is not called, the > thermal zone is not created neither updated. Again - that's not the case the check is there for. It's there for zones th= at=20 do exist and that do get registered, because REGS_TMR only gets set *after*= =20 all the zones are already registered (the driver as it is right now does no= t=20 know which sites it should enable before registering the zones). Because of= =20 that, the first value a zone gets after being registered is always bogus,=20 because no monitoring site has been enabled yet at all. > So I don't understand why the test: >=20 > + regmap_read(qdata->regmap, REGS_TMR, &val); > + if (!(val & TMR_ME)) > + return -EAGAIN; >=20 > is needed in the get_temp() ops as the thermal zone for this disabled > site should not exist. >=20 > I'm not putting in question the series, just wanting to avoid a > potential pointless check in an ops. It's definitely not pointless (it does workaround a real issue). Is it eleg= ant?=20 IMO bringing thermal_zone_of_get_sensor_id back (or doing something=20 equivalent) instead would be much cleaner:) Cheers, Sebastian 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 8D7F3C7EE2F for ; Wed, 7 Jun 2023 17:43:31 +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:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=siKtbLVQp926pdQsEiTr3mrMJHn99mwujG5150abrVk=; b=lgmKuUoO9R7n1D tjpoFM7X5iQPlTy+YyIhfnn1nu+dRgEijY1B32BCd++h0STF1g04gqEqnPsr4rTRM4oUXhbLRsbb7 LhGAhkAe12/Uh6xzht0aDcy7NXoLvcpzS6qmpxZ+hvWG7ebf9Cpb04dqsSuRXxZ5yjk3jy2ReUYJb +8r/5LCzD3BxNx9/MmSSX1v+RbEFiOk78pcC2fHMlv9NYs6dafzgHThzwbztK8GS0zX9uN9kMXjRz eouNQkr2JlkMlOAOYCslvHOczC7YHpTvH4cwKHgDPuesPc07OF0frLMxGwP4hKbWiuccvKaQ8pw51 0HjedwYJYc99LOumYR9A==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1q6xBZ-006jsJ-0m; Wed, 07 Jun 2023 17:43:05 +0000 Received: from comms.puri.sm ([159.203.221.185]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1q6xBW-006jrA-1x for linux-arm-kernel@lists.infradead.org; Wed, 07 Jun 2023 17:43:04 +0000 Received: from localhost (localhost [127.0.0.1]) by comms.puri.sm (Postfix) with ESMTP id EEF9DED298; Wed, 7 Jun 2023 10:42:27 -0700 (PDT) Received: from comms.puri.sm ([127.0.0.1]) by localhost (comms.puri.sm [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id VSwjU-ZNeK2n; Wed, 7 Jun 2023 10:42:27 -0700 (PDT) From: Sebastian Krzyszkowiak DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=puri.sm; s=comms; t=1686159746; bh=yzcHza535Knz3sPmrJrUUFyPYQOMzuWWt47W0zm0kPk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Kxr8ZpRVXotS3CvCC+tJXoqIVRX3KtkDEAyOIvqB3BEUe5oAqNMbfSPc+gZeIkKs5 2z+eY/0LOgjRWsZkQRU70x9bEh2K7hVNCM67+knFWNwm5ioR1Z3yoT/9qdX6GXw3ZL E3WVUirXuI/Yuf1SCXnluJwn4q/8rAUcs0bIK3xYPo/Ui4pd4y2fFZ7BUpYC6mR4lc DWWvqCChO13B8MFIVm92Rp5NH1WFLMAsmzp30B9tGqsyclUzvP8fE7NYfbkzUbKJZE +OXcXIuvQSji97zy9WGJPvgDs7LOHrykgygdptTHNqDAxm7QS3HC8uP07klRSJt6xq ufrQT8FokmmbA== To: Peng Fan , "Peng Fan (OSS)" , "rafael@kernel.org" , "shawnguo@kernel.org" , "s.hauer@pengutronix.de" , Daniel Lezcano Cc: "amitk@kernel.org" , "rui.zhang@intel.com" , "andrew.smirnov@gmail.com" , "linux-pm@vger.kernel.org" , "linux-kernel@vger.kernel.org" , "kernel@pengutronix.de" , "festevam@gmail.com" , dl-linux-imx , "linux-arm-kernel@lists.infradead.org" , Alice Guo Subject: Re: [PATCH 2/3] thermal: qoriq_thermal: only enable supported sensors Date: Wed, 07 Jun 2023 19:42:12 +0200 Message-ID: <1966575.usQuhbGJ8B@pliszka> In-Reply-To: <3120c2d5-4473-5b72-29bf-d841e806878f@linaro.org> References: <20230516083746.63436-1-peng.fan@oss.nxp.com> <21914890.EfDdHjke4D@pliszka> <3120c2d5-4473-5b72-29bf-d841e806878f@linaro.org> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230607_104302_647898_6E2C8A65 X-CRM114-Status: GOOD ( 38.84 ) 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 T24gxZtyb2RhLCA3IGN6ZXJ3Y2EgMjAyMyAxMDoyODo1OSBDRVNUIERhbmllbCBMZXpjYW5vIHdy b3RlOgo+IE9uIDA3LzA2LzIwMjMgMDg6MDEsIFNlYmFzdGlhbiBLcnp5c3prb3dpYWsgd3JvdGU6 Cj4gPiBPbiBwacSFdGVrLCAyIGN6ZXJ3Y2EgMjAyMyAxNToxMTozNyBDRVNUIERhbmllbCBMZXpj YW5vIHdyb3RlOgo+ID4+IE9uIDAxLzA2LzIwMjMgMTE6NTIsIFBlbmcgRmFuIHdyb3RlOgo+ID4+ PiBIaSBEYW5pZWwsCj4gPj4+IAo+ID4+Pj4gU3ViamVjdDogUkU6IFtQQVRDSCAyLzNdIHRoZXJt YWw6IHFvcmlxX3RoZXJtYWw6IG9ubHkgZW5hYmxlIHN1cHBvcnRlZAo+ID4+Pj4gc2Vuc29ycwo+ ID4+Pj4gCj4gPj4+Pj4gU3ViamVjdDogUmU6IFtQQVRDSCAyLzNdIHRoZXJtYWw6IHFvcmlxX3Ro ZXJtYWw6IG9ubHkgZW5hYmxlIHN1cHBvcnRlZAo+ID4+Pj4+IHNlbnNvcnMKPiA+Pj4+PiAKPiA+ Pj4+PiBPbiAzMS8wNS8yMDIzIDE0OjA1LCBQZW5nIEZhbiB3cm90ZToKPiA+Pj4+Pj4+IFN1Ympl Y3Q6IFJlOiBbUEFUQ0ggMi8zXSB0aGVybWFsOiBxb3JpcV90aGVybWFsOiBvbmx5IGVuYWJsZQo+ ID4+Pj4+Pj4gc3VwcG9ydGVkIHNlbnNvcnMKPiA+Pj4+Pj4+IAo+ID4+Pj4+Pj4gT24gMTYvMDUv MjAyMyAxMDozNywgUGVuZyBGYW4gKE9TUykgd3JvdGU6Cj4gPj4+Pj4+Pj4gRnJvbTogUGVuZyBG YW4gPHBlbmcuZmFuQG54cC5jb20+Cj4gPj4+Pj4+Pj4gCj4gPj4+Pj4+Pj4gVGhlcmUgYXJlIE1B WCAxNiBzZW5zb3JzLCBidXQgbm90IGFsbCBvZiB0aGVtIHN1cHBvcnRlZC4gU3VjaCBhcwo+ID4+ Pj4+Pj4+IGkuTVg4TVEsIHRoZXJlIGFyZSBvbmx5IDMgc2Vuc29ycy4gRW5hYmxpbmcgYWxsIDE2 IHNlbnNvcnMgd2lsbAo+ID4+Pj4+Pj4+IHRvdWNoIHJlc2VydmVkIGJpdHMgZnJvbSBpLk1YOE1R IHJlZmVyZW5jZSBtYW5udWFsLCBhbmQgVE1VIHdpbGwKPiA+Pj4+Pj4+PiBzdHVjaywgdGVtcGVy YXR1cmUgd2lsbCBub3QgdXBkYXRlIGFueW1vcmUuCj4gPj4+Pj4+Pj4gCj4gPj4+Pj4+Pj4gRml4 ZXM6IDQ1MDM4ZTAzZDYzMyAoInRoZXJtYWw6IHFvcmlxOiBFbmFibGUgYWxsIHNlbnNvcnMgYmVm b3JlCj4gPj4+Pj4+Pj4gcmVnaXN0ZXJpbmcgdGhlbSIpCj4gPj4+Pj4+Pj4gU2lnbmVkLW9mZi1i eTogUGVuZyBGYW4gPHBlbmcuZmFuQG54cC5jb20+Cj4gPj4+Pj4+Pj4gLS0tCj4gPj4+Pj4+Pj4g Cj4gPj4+Pj4+Pj4gICAgICBkcml2ZXJzL3RoZXJtYWwvcW9yaXFfdGhlcm1hbC5jIHwgMzAKPiA+ Pj4+Pj4+PiAgICAgICsrKysrKysrKysrKysrKysrKystLS0tLS0tLS0tCj4gPj4+PiAKPiA+Pj4+ IC0KPiA+Pj4+IAo+ID4+Pj4+Pj4+ICAgICAgMSBmaWxlIGNoYW5nZWQsIDE5IGluc2VydGlvbnMo KyksIDExIGRlbGV0aW9ucygtKQo+ID4+Pj4+Pj4+IAo+ID4+Pj4+Pj4+IGRpZmYgLS1naXQgYS9k cml2ZXJzL3RoZXJtYWwvcW9yaXFfdGhlcm1hbC5jCj4gPj4+Pj4+Pj4gYi9kcml2ZXJzL3RoZXJt YWwvcW9yaXFfdGhlcm1hbC5jIGluZGV4Cj4gPj4+PiAKPiA+Pj4+IGI4MDZhMDkyOTQ1OS4uNTM3 NDhjNGE1YmUxCj4gPj4+PiAKPiA+Pj4+Pj4+PiAxMDA2NDQKPiA+Pj4+Pj4+PiAtLS0gYS9kcml2 ZXJzL3RoZXJtYWwvcW9yaXFfdGhlcm1hbC5jCj4gPj4+Pj4+Pj4gKysrIGIvZHJpdmVycy90aGVy bWFsL3FvcmlxX3RoZXJtYWwuYwo+ID4+Pj4+Pj4+IEBAIC0zMSw3ICszMSw2IEBACj4gPj4+Pj4+ Pj4gCj4gPj4+Pj4+Pj4gICAgICAjZGVmaW5lIFRNUl9ESVNBQkxFCTB4MAo+ID4+Pj4+Pj4+ICAg ICAgI2RlZmluZSBUTVJfTUUJCTB4ODAwMDAwMDAKPiA+Pj4+Pj4+PiAgICAgICNkZWZpbmUgVE1S X0FMUEYJMHgwYzAwMDAwMAo+ID4+Pj4+Pj4+IAo+ID4+Pj4+Pj4+IC0jZGVmaW5lIFRNUl9NU0lU RV9BTEwJR0VOTUFTSygxNSwgMCkKPiA+Pj4+Pj4+PiAKPiA+Pj4+Pj4+PiAgICAgICNkZWZpbmUg UkVHU19UTVRNSVIJMHgwMDgJLyogVGVtcGVyYXR1cmUgbWVhc3VyZW1lbnQKPiA+Pj4+Pj4+IAo+ ID4+Pj4+Pj4gaW50ZXJ2YWwgUmVnaXN0ZXIgKi8KPiA+Pj4+Pj4+IAo+ID4+Pj4+Pj4+ICAgICAg I2RlZmluZSBUTVRNSVJfREVGQVVMVAkweDAwMDAwMDBmCj4gPj4+Pj4+Pj4gCj4gPj4+Pj4+Pj4g QEAgLTEwNSw2ICsxMDQsMTEgQEAgc3RhdGljIGludCB0bXVfZ2V0X3RlbXAoc3RydWN0Cj4gPj4+ Pj4+PiAKPiA+Pj4+Pj4+IHRoZXJtYWxfem9uZV9kZXZpY2UgKnR6LCBpbnQgKnRlbXApCj4gPj4+ Pj4+PiAKPiA+Pj4+Pj4+PiAgICAgIAkgKiB3aXRoaW4gc2Vuc29yIHJhbmdlLiBURU1QIGlzIGFu IDkgYml0IHZhbHVlIApyZXByZXNlbnRpbmcKPiA+Pj4+Pj4+PiAgICAgIAkgKiB0ZW1wZXJhdHVy ZSBpbiBLZWxWaW4uCj4gPj4+Pj4+Pj4gICAgICAJICovCj4gPj4+Pj4+Pj4gCj4gPj4+Pj4+Pj4g Kwo+ID4+Pj4+Pj4+ICsJcmVnbWFwX3JlYWQocWRhdGEtPnJlZ21hcCwgUkVHU19UTVIsICZ2YWwp Owo+ID4+Pj4+Pj4+ICsJaWYgKCEodmFsICYgVE1SX01FKSkKPiA+Pj4+Pj4+PiArCQlyZXR1cm4g LUVBR0FJTjsKPiA+Pj4+Pj4+IAo+ID4+Pj4+Pj4gSG93IGlzIHRoaXMgY2hhbmdlIHJlbGF0ZWQg dG8gd2hhdCBpcyBkZXNjcmliZWQgaW4gdGhlIGNoYW5nZWxvZz8KPiA+Pj4+Pj4gCj4gPj4+Pj4+ IGRldm1fdGhlcm1hbF96b25lX29mX3NlbnNvcl9yZWdpc3RlciB3aWxsIGludm9rZSBnZXQgdGVt cCwgc2luY2Ugd2UKPiA+Pj4+Pj4gcmV2ZXJ0ZWQgdGhlIDQ1MDM4ZTAzZDYzMyBkaWQsIHdlIG5l ZWQgdG8gY2hlY2sgVE1SX01FIHRvIGF2b2lkCj4gPj4+Pj4gCj4gPj4+Pj4gcmV0dXJuCj4gPj4+ Pj4gCj4gPj4+Pj4+IGludmFsaWQgdGVtcGVyYXR1cmUuCj4gPj4+Pj4+IAo+ID4+Pj4+ICAgIEZy b20gYSBoaWdoZXIgcGVyc3BlY3RpdmUgaWYgdGhlIHNlbnNvciB3b24ndCBiZSBlbmFibGVkLCB0 aGVuIHRoZQo+ID4+Pj4+IAo+ID4+Pj4+IHRoZXJtYWwgem9uZSBzaG91bGQgbm90IGJlIHJlZ2lz dGVyZWQsIHRoZSBnZXRfdGVtcCB3b24ndCBoYXBwZW4gb24gYQo+ID4+Pj4+IGRpc2FibGVkIHNl bnNvciBhbmQgdGhpcyB0ZXN0IHdvbid0IGJlIG5lY2Vzc2FyeSwgbm8gPwo+ID4+PiAKPiA+Pj4g QWZ0ZXIgdGhpbmtpbmcgbW9yZSwgSSdkIHByZWZlciBjdXJyZW50IGxvZ2ljLgo+ID4+PiAKPiA+ Pj4gV2UgcmVseSBvbiBkZXZtX3RoZXJtYWxfb2Zfem9uZV9yZWdpc3RlcidzIHJldHVybiB2YWx1 ZSB0byBrbm93Cj4gPj4+IHdoZXRoZXIgdGhlcmUgaXMgYSB2YWxpZCB6b25lLCB0aGVuIHNldCBz aXRlcyBiaXQsIGFuZCBhZnRlciBjb2xsZWN0ZWQKPiA+Pj4gYWxsIHNpdGUgYml0cywgd2UgZW5h YmxlIHRoZSB0aGVybWFsIElQLgo+ID4+PiAKPiA+Pj4gSWYgbW92ZSB0aGUgZW5hYmxpbmcgdGhl cm1hbCBJUCBiZWZvcmUgZGV2bV90aGVybWFsX29mX3pvbmVfcmVnaXN0ZXIsCj4gPj4+IFdlIG5l ZWQgY2hlY2sgZHRiIHRoZXJtYWwgem9uZSwgdG8ga25vdyB3aGljaCB6b25lIGlzIHZhbGlkIGZv ciBjdXJyZW50Cj4gPj4+IHRoZXJtYWwgSVAuIFRoaXMgd291bGQgY29tcGxpY2F0ZSB0aGUgZGVz aWduLgo+ID4+PiAKPiA+Pj4gU28ganVzdCBjaGVja2luZyB0aGUgZW5hYmxpbmcgYml0IGluIGdl dCB0ZW1wZXJhdHVyZSB3b3VsZCBiZSBtdWNoCj4gPj4+IHNpbXBsZXIsIGFuZCB0aGVyZSBqdXN0 IGEgc21hbGwgd2luZG93IGJlZm9yZSBlbmFibGluZyB0aGVybWFsIElQLgo+ID4+IAo+ID4+IElm IHRoZSB0aGVybWFsIHpvbmUgaXMgbm90IGRlc2NyaWJlZCwgdGhlbiB0aGUgdGhlcm1hbCB6b25l IHdvbid0IGJlCj4gPj4gY3JlYXRlZCBhcyBpdCBmYWlscyB3aXRoIC1FTk9ERVYgYW5kIHRodXMg Z2V0X3RlbXAgd29uJ3QgYmUgY2FsbGVkIG9uIGEKPiA+PiBkaXNhYmxlZCBzaXRlLCByaWdodD8K PiA+IAo+ID4gVGhhdCdzIG5vdCB3aGF0IHRoZSBwcm9ibGVtIGlzLiBJdCdzIGFib3V0IHpvbmVz IHRoYXQgKndpbGwqIGJlIGNyZWF0ZWQgLQo+ID4gc2luY2UgdGhlIGRyaXZlciBvbmx5IGtub3dz IHRoYXQgYSB0aGVybWFsIHpvbmUgaXNuJ3QgZGVzY3JpYmVkIGluIHRoZQo+ID4gZGV2aWNlIHRy ZWUgYWZ0ZXIgaXQgZmFpbHMgcmVnaXN0ZXJpbmcsIGl0IGNhbid0IGVuYWJsZSB0aGUgc2l0ZSAq YmVmb3JlKgo+ID4gdGhlIHpvbmUgZ2V0cyByZWdpc3RlcmVkIC0gc28gaXQgaGFwcGVucyBhZnRl cndhcmRzLiBUaGF0J3Mgd2h5IGl0IG5lZWRzCj4gPiB0aGlzIGNoZWNrIHRvIG5vdCByZXR1cm4g YSBib2d1cyBpbml0aWFsIHZhbHVlIGJlZm9yZSB0aGUgc2l0ZSBnZXRzCj4gPiBhY3R1YWxseSBl bmFibGVkIGxhdGVyIGluIHFvcmlxX3RtdV9yZWdpc3Rlcl90bXVfem9uZS4KPiAKPiBTb3JyeSwg SSBnZXQgdGhlIHBvaW50IGJ1dCBJIGRvbid0IHNlZSBob3cgdGhhdCBjYW4gaGFwcGVuOgo+IAo+ IHFvcmlxX3RtdV9yZWdpc3Rlcl90bXVfem9uZSgpIGNhbGxzIGRldm1fdGhlcm1hbF9vZl96b25l X3JlZ2lzdGVyKCkgZm9yCj4gKmFsbCogc2l0ZXMgcmVnYXJkbGVzcyBpZiB0aGV5IHJlYWxseSBl eGlzdHMgb3Igbm90Lgo+IAo+IFVuZGVyIHRoZSBob29kLCB0aGUgZnVuY3Rpb24gZGV2bV90aGVy bWFsX29mX3pvbmVfcmVnaXN0ZXIoKSBjYWxscwo+IHRoZXJtYWxfb2Zfem9uZV9yZWdpc3Rlcigp LiBUaGlzIG9uZSBmYWlscyB3aGVuIGNhbGxpbmcKPiBvZl90aGVybWFsX3pvbmVfZmluZCgpIGJl Y2F1c2UgaXQgZG9lcyBub3QgZXhpc3QgYW5kIHJldHVybnMgLUVOT0RFVi4KPiAKPiBIZW5jZSwg dGhlIHRoZXJtYWxfem9uZV9kZXZpY2VfcmVnaXN0ZXJfd2l0aF90cmlwcygpIGlzIG5vdCBjYWxs ZWQsIHRoZQo+IHRoZXJtYWwgem9uZSBpcyBub3QgY3JlYXRlZCBuZWl0aGVyIHVwZGF0ZWQuCgpB Z2FpbiAtIHRoYXQncyBub3QgdGhlIGNhc2UgdGhlIGNoZWNrIGlzIHRoZXJlIGZvci4gSXQncyB0 aGVyZSBmb3Igem9uZXMgdGhhdCAKZG8gZXhpc3QgYW5kIHRoYXQgZG8gZ2V0IHJlZ2lzdGVyZWQs IGJlY2F1c2UgUkVHU19UTVIgb25seSBnZXRzIHNldCAqYWZ0ZXIqIAphbGwgdGhlIHpvbmVzIGFy ZSBhbHJlYWR5IHJlZ2lzdGVyZWQgKHRoZSBkcml2ZXIgYXMgaXQgaXMgcmlnaHQgbm93IGRvZXMg bm90IAprbm93IHdoaWNoIHNpdGVzIGl0IHNob3VsZCBlbmFibGUgYmVmb3JlIHJlZ2lzdGVyaW5n IHRoZSB6b25lcykuIEJlY2F1c2Ugb2YgCnRoYXQsIHRoZSBmaXJzdCB2YWx1ZSBhIHpvbmUgZ2V0 cyBhZnRlciBiZWluZyByZWdpc3RlcmVkIGlzIGFsd2F5cyBib2d1cywgCmJlY2F1c2Ugbm8gbW9u aXRvcmluZyBzaXRlIGhhcyBiZWVuIGVuYWJsZWQgeWV0IGF0IGFsbC4KCj4gU28gSSBkb24ndCB1 bmRlcnN0YW5kIHdoeSB0aGUgdGVzdDoKPiAKPiArCXJlZ21hcF9yZWFkKHFkYXRhLT5yZWdtYXAs IFJFR1NfVE1SLCAmdmFsKTsKPiArCWlmICghKHZhbCAmIFRNUl9NRSkpCj4gKwkJcmV0dXJuIC1F QUdBSU47Cj4gCj4gaXMgbmVlZGVkIGluIHRoZSBnZXRfdGVtcCgpIG9wcyBhcyB0aGUgdGhlcm1h bCB6b25lIGZvciB0aGlzIGRpc2FibGVkCj4gc2l0ZSBzaG91bGQgbm90IGV4aXN0Lgo+IAo+IEkn bSBub3QgcHV0dGluZyBpbiBxdWVzdGlvbiB0aGUgc2VyaWVzLCBqdXN0IHdhbnRpbmcgdG8gYXZv aWQgYQo+IHBvdGVudGlhbCBwb2ludGxlc3MgY2hlY2sgaW4gYW4gb3BzLgoKSXQncyBkZWZpbml0 ZWx5IG5vdCBwb2ludGxlc3MgKGl0IGRvZXMgd29ya2Fyb3VuZCBhIHJlYWwgaXNzdWUpLiBJcyBp dCBlbGVnYW50PyAKSU1PIGJyaW5naW5nIHRoZXJtYWxfem9uZV9vZl9nZXRfc2Vuc29yX2lkIGJh Y2sgKG9yIGRvaW5nIHNvbWV0aGluZyAKZXF1aXZhbGVudCkgaW5zdGVhZCB3b3VsZCBiZSBtdWNo IGNsZWFuZXI6KQoKQ2hlZXJzLApTZWJhc3RpYW4KCgoKX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX18KbGludXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxpc3QKbGlu dXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQu b3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAo=