From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on archive.lwn.net X-Spam-Level: X-Spam-Status: No, score=-6.0 required=5.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham autolearn_force=no version=3.4.2 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by archive.lwn.net (Postfix) with ESMTP id 38A737D04D for ; Thu, 10 Jan 2019 14:20:22 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728157AbfAJOUV (ORCPT ); Thu, 10 Jan 2019 09:20:21 -0500 Received: from mga18.intel.com ([134.134.136.126]:42504 "EHLO mga18.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727839AbfAJOUV (ORCPT ); Thu, 10 Jan 2019 09:20:21 -0500 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by orsmga106.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 10 Jan 2019 06:20:20 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.56,461,1539673200"; d="scan'208";a="310736479" Received: from wliu29-mobl3.ccr.corp.intel.com ([10.249.174.142]) by fmsmga005.fm.intel.com with ESMTP; 10 Jan 2019 06:20:16 -0800 Message-ID: <1547130015.10666.17.camel@intel.com> Subject: Re: [PATCH v2 02/11] thermal: add irq-mode configuration for trip point From: Zhang Rui To: Lukasz Luba , devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org Cc: edubezval@gmail.com, daniel.lezcano@linaro.org, robh+dt@kernel.org, mark.rutland@arm.com, corbet@lwn.net, b.zolnierkie@samsung.com, krzk@kernel.org Date: Thu, 10 Jan 2019 22:20:15 +0800 In-Reply-To: <3314da31-1b8b-ec19-4aee-38d98aa8adbf@partner.samsung.com> References: <1541610593-28542-1-git-send-email-l.luba@partner.samsung.com> <1541610593-28542-3-git-send-email-l.luba@partner.samsung.com> <1544022595.2841.45.camel@intel.com> <2ac425fc-7c32-6e2f-7086-c14f85b0bbfd@partner.samsung.com> <3314da31-1b8b-ec19-4aee-38d98aa8adbf@partner.samsung.com> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.18.5.2-0ubuntu3.2 Mime-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-doc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-doc@vger.kernel.org Hi, Lukasz, On 四, 2018-12-06 at 20:55 +0100, Lukasz Luba wrote: > > On 12/6/18 8:18 PM, Lukasz Luba wrote: > > > > Hi Rui, > > > > On 12/5/18 4:09 PM, Zhang Rui wrote: > > > > > > On 三, 2018-11-07 at 18:09 +0100, Lukasz Luba wrote: > > > > > > > > This patch adds support irq mode in trip point. > > > > When that flag is set in DT, there is no need for polling > > > > in thermal framework. Crossing the trip point will rise an IRQ. > > > > The naming convention for tip point 'type' can be confussing > > > > and 'passive' (whic is passive cooling) might be interpretted > > > > wrongly. > > > > > > > > This mechanism prevents from missue and adds explicit setting > > > > for hardware which support interrupts for pre-configured > > > > temperature > > > > threshold. > > > > > > > > Cc: Zhang Rui > > > > Cc: Eduardo Valentin > > > > Cc: Daniel Lezcano > > > > Signed-off-by: Lukasz Luba > > > > --- > > > >   drivers/thermal/of-thermal.c   | 17 +++++++++++++++++ > > > >   drivers/thermal/thermal_core.c | 10 ++++++++-- > > > >   include/linux/thermal.h        |  5 +++++ > > > >   3 files changed, 30 insertions(+), 2 deletions(-) > > > > > > > > diff --git a/drivers/thermal/of-thermal.c b/drivers/thermal/of- > > > > thermal.c > > > > index 4bfdb4a..1a75946a 100644 > > > > --- a/drivers/thermal/of-thermal.c > > > > +++ b/drivers/thermal/of-thermal.c > > > > @@ -312,6 +312,20 @@ static int of_thermal_get_trip_type(struct > > > > thermal_zone_device *tz, int trip, > > > >       return 0; > > > >   } > > > > +static int > > > > +of_thermal_get_trip_irq_mode(struct thermal_zone_device *tz, > > > > int > > > > trip, > > > > +                 bool *mode) > > > > +{ > > > > +    struct __thermal_zone *data = tz->devdata; > > > > + > > > > +    if (trip >= data->ntrips || trip < 0) > > > > +        return -EDOM; > > > > + > > > > +    *mode = data->trips[trip].irq_mode; > > > > + > > > > +    return 0; > > > > +} > > > > + > > > >   static int of_thermal_get_trip_temp(struct > > > > thermal_zone_device *tz, > > > > int trip, > > > >                       int *temp) > > > >   { > > > > @@ -394,6 +408,7 @@ static struct thermal_zone_device_ops > > > > of_thermal_ops = { > > > >       .set_mode = of_thermal_set_mode, > > > >       .get_trip_type = of_thermal_get_trip_type, > > > > +    .get_trip_irq_mode = of_thermal_get_trip_irq_mode, > > > >       .get_trip_temp = of_thermal_get_trip_temp, > > > >       .set_trip_temp = of_thermal_set_trip_temp, > > > >       .get_trip_hyst = of_thermal_get_trip_hyst, > > > > @@ -827,6 +842,8 @@ static int thermal_of_populate_trip(struct > > > > device_node *np, > > > >           return ret; > > > >       } > > > > +    trip->irq_mode = of_property_read_bool(np, "irq-mode"); > > > > + > > > >       /* Required for cooling map matching */ > > > >       trip->np = np; > > > >       of_node_get(np); > > > > diff --git a/drivers/thermal/thermal_core.c > > > > b/drivers/thermal/thermal_core.c > > > > index 39fc812..6d41e08 100644 > > > > --- a/drivers/thermal/thermal_core.c > > > > +++ b/drivers/thermal/thermal_core.c > > > > @@ -406,6 +406,7 @@ static void handle_critical_trips(struct > > > > thermal_zone_device *tz, > > > >   static void handle_thermal_trip(struct thermal_zone_device > > > > *tz, int > > > > trip) > > > >   { > > > >       enum thermal_trip_type type; > > > > +    bool irq_mode = false; > > > >       /* Ignore disabled trip points */ > > > >       if (test_bit(trip, &tz->trips_disabled)) > > > > @@ -419,9 +420,14 @@ static void handle_thermal_trip(struct > > > > thermal_zone_device *tz, int trip) > > > >           handle_non_critical_trips(tz, trip); > > > >       /* > > > >        * Alright, we handled this trip successfully. > > > > -     * So, start monitoring again. > > > > +     * So, start monitoring in polling mode if > > > > +     * trip is not using irq HW support. > > > >        */ > > > > -    monitor_thermal_zone(tz); > > > > +    if (tz->ops->get_trip_irq_mode) > > > > +        tz->ops->get_trip_irq_mode(tz, trip, &irq_mode); > > > > + > > > > +    if (!irq_mode) > > > > +        monitor_thermal_zone(tz); > > > >   } > > > handle_thermal_trip() is called from > > > thermal_zone_device_update(), and > > > it is invoked for every trip points. > > > say, you have a passive trip point 1 that supports irq_mode, and > > > another passive trip point 2 that does not support irq_mode, > > > monitor_thermal_zone() is still called in handle_thermal_trip(tz, > > > 2), > > > and the passive timer will be activated anyway, do I miss > > > something? sorry that I missed this thread. > > Yes, the passive timer will be activated in your example. It is > > correct > > behavior and does not break anything. > > case 1: there is 'k' passive trip points which have irq_mode and 1 > > additional which does not have 'irq_mode', the framework will start > > polling but skip check for those 'k' trip points. > > case 2: all of the passive trip points have irq_mode set, the > > framework > > will not register 'scheduled_work' because it will not call  > > 'monitor_thermal_zone()'. > > This is the case of most Exynos platforms, but there is one > > exception  > > which has 'case 1' with 2 trip points not supporting irq_mode. > Do you suggest to cover the 'case 1'? So this solution does not cover case 1. And for case 2, why not set passive_delay to 0? are they sharing the same DT file? > It would be possible after adding a new enum THERMAL_FRAMEWORK_POLL,  > then function: hmmm, I think we can 1. use tz->passive to count the passive trip points that need passive polling. 2. count tz->passive properly in the governors 3. always do passive polling when tz->passive > 0. This will cover both cases, right? some sample code to handle this in step_wise governor attached below, what do you think? thanks, rui diff --git a/drivers/thermal/step_wise.c b/drivers/thermal/step_wise.c index ee047ca..59d9a1d 100644 --- a/drivers/thermal/step_wise.c +++ b/drivers/thermal/step_wise.c @@ -121,8 +121,15 @@ static void update_passive_instance(struct thermal_zone_device *tz,          * If value is +1, activate a passive instance.          * If value is -1, deactivate a passive instance.          */ -       if (type == THERMAL_TRIP_PASSIVE || type == THERMAL_TRIPS_NONE) -               tz->passive += value; +       if (type != THERMAL_TRIP_PASSIVE && type != THERMAL_TRIPS_NONE) +               return; +       if (tz->ops->get_trip_irq_mode) { +               if (tz->ops->get_trip_irq_mode(tz, trip, &irq_mode)) +                               return; +               if (irq_mode) +                               return; +       } +       tz->passive += value;  } > thermal_zone_device_check() will call > thermal_zone_device_update(tz, THERMAL_FRAMEWORK_POLL) > and in handle_thermal_trip() implement something like: > --------------8<---------------- > static void handle_thermal_trip(struct thermal_zone_device *tz, int > trip) > { > enum thermal_trip_type type; > bool irq_mode = false; > > /* Ignore disabled trip points */ > if (test_bit(trip, &tz->trips_disabled)) > return; > > if (tz->ops->get_trip_irq_mode) > tz->ops->get_trip_irq_mode(tz, trip, &irq_mode) > > if (tz->notify_event == THERMAL_FRAMEWORK_POLL && irq_mode) > return; > ... > > if (!irq_mode) > monitor_thermal_zone(tz); > } > > ---------->8----------------------- > > I could implement it in v3 if you don't see that it add too much of > mess  > and agree for this approach. > > Regards, > Lukasz > > > > > > > Regards, > > Lukasz > > > > > > > > > > > thanks, > > > rui > > > > > > > > > > >   static void update_temperature(struct thermal_zone_device > > > > *tz) > > > > diff --git a/include/linux/thermal.h b/include/linux/thermal.h > > > > index 5f4705f..b064565 100644 > > > > --- a/include/linux/thermal.h > > > > +++ b/include/linux/thermal.h > > > > @@ -103,6 +103,7 @@ struct thermal_zone_device_ops { > > > >           enum thermal_device_mode); > > > >       int (*get_trip_type) (struct thermal_zone_device *, int, > > > >           enum thermal_trip_type *); > > > > +    int (*get_trip_irq_mode) (struct thermal_zone_device *, > > > > int, > > > > bool *); > > > >       int (*get_trip_temp) (struct thermal_zone_device *, int, > > > > int > > > > *); > > > >       int (*set_trip_temp) (struct thermal_zone_device *, int, > > > > int); > > > >       int (*get_trip_hyst) (struct thermal_zone_device *, int, > > > > int > > > > *); > > > > @@ -196,6 +197,7 @@ struct thermal_zone_device { > > > >       struct thermal_attr *trip_temp_attrs; > > > >       struct thermal_attr *trip_type_attrs; > > > >       struct thermal_attr *trip_hyst_attrs; > > > > +    struct thermal_attr *trip_irq_mode_attrs; > > > >       void *devdata; > > > >       int trips; > > > >       unsigned long trips_disabled;    /* bitmap for disabled > > > > trips */ > > > > @@ -364,6 +366,8 @@ struct thermal_zone_of_device_ops { > > > >    * @temperature: temperature value in miliCelsius > > > >    * @hysteresis: relative hysteresis in miliCelsius > > > >    * @type: trip point type > > > > + * @irq_mode: to not use polling in framework set support of > > > > HW irq > > > > (which will > > > > + *          be triggered when temperature reaches this level). > > > >    */ > > > >   struct thermal_trip { > > > > @@ -371,6 +375,7 @@ struct thermal_trip { > > > >       int temperature; > > > >       int hysteresis; > > > >       enum thermal_trip_type type; > > > > +    bool irq_mode; > > > >   }; > > > >   /* Function declarations */ > > > 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=-11.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,URIBL_BLOCKED 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 20088C43387 for ; Thu, 10 Jan 2019 14:20:45 +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 DC08D214C6 for ; Thu, 10 Jan 2019 14:20:44 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="cs776E0l" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org DC08D214C6 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=intel.com 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:Mime-Version:References:In-Reply-To: Date:To:From:Subject:Message-ID:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=bBtUs7DrNGDxux139AsB/RVFG6Io08XHPkT2jZRKols=; b=cs776E0luVGdkJ Zf21NneFh6ry5Bp26udVXqHRiat/EU568cCpsiJde4PqGo3pAsWPp0v39h6MwbpCYrnl62s4Q48gT dkcT3sZAspjQ+zXYCtpnKWYL2kW76zbDK0qrda5+yBnBMDodlrydfkOb72ypDwNisRaSYQslI2sVQ KRBKmoMf4/BSAEPXciawTSX/L+TTTrBaQiLOk7k5BiKKJzAGt/Rsn7UUlu+u9qiqt/SEYRgfRahF/ RtPxc25JKzPLUAEVbi11RBKYNRMLtoD8+wSTJgJXSdJvGwDusPiq7eLUazeZx5OMLmw/O7yO4JHCZ L11tvWoSIUJIkNr+4l1A==; 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 1ghbCN-0005f5-MC; Thu, 10 Jan 2019 14:20:43 +0000 Received: from mga03.intel.com ([134.134.136.65]) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1ghbC1-0005Rd-Vy for linux-arm-kernel@lists.infradead.org; Thu, 10 Jan 2019 14:20:42 +0000 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by orsmga103.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 10 Jan 2019 06:20:20 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.56,461,1539673200"; d="scan'208";a="310736479" Received: from wliu29-mobl3.ccr.corp.intel.com ([10.249.174.142]) by fmsmga005.fm.intel.com with ESMTP; 10 Jan 2019 06:20:16 -0800 Message-ID: <1547130015.10666.17.camel@intel.com> Subject: Re: [PATCH v2 02/11] thermal: add irq-mode configuration for trip point From: Zhang Rui To: Lukasz Luba , devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org Date: Thu, 10 Jan 2019 22:20:15 +0800 In-Reply-To: <3314da31-1b8b-ec19-4aee-38d98aa8adbf@partner.samsung.com> References: <1541610593-28542-1-git-send-email-l.luba@partner.samsung.com> <1541610593-28542-3-git-send-email-l.luba@partner.samsung.com> <1544022595.2841.45.camel@intel.com> <2ac425fc-7c32-6e2f-7086-c14f85b0bbfd@partner.samsung.com> <3314da31-1b8b-ec19-4aee-38d98aa8adbf@partner.samsung.com> X-Mailer: Evolution 3.18.5.2-0ubuntu3.2 Mime-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20190110_062022_189998_4BB0A699 X-CRM114-Status: GOOD ( 38.25 ) 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@arm.com, corbet@lwn.net, b.zolnierkie@samsung.com, daniel.lezcano@linaro.org, krzk@kernel.org, edubezval@gmail.com, robh+dt@kernel.org 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 SGksIEx1a2FzeiwKCk9uIOWbmywgMjAxOC0xMi0wNiBhdCAyMDo1NSArMDEwMCwgTHVrYXN6IEx1 YmEgd3JvdGU6Cj4gCj4gT24gMTIvNi8xOCA4OjE4IFBNLCBMdWthc3ogTHViYSB3cm90ZToKPiA+ IAo+ID4gSGkgUnVpLAo+ID4gCj4gPiBPbiAxMi81LzE4IDQ6MDkgUE0sIFpoYW5nIFJ1aSB3cm90 ZToKPiA+ID4gCj4gPiA+IE9uIOS4iSwgMjAxOC0xMS0wNyBhdCAxODowOSArMDEwMCwgTHVrYXN6 IEx1YmEgd3JvdGU6Cj4gPiA+ID4gCj4gPiA+ID4gVGhpcyBwYXRjaCBhZGRzIHN1cHBvcnQgaXJx IG1vZGUgaW4gdHJpcCBwb2ludC4KPiA+ID4gPiBXaGVuIHRoYXQgZmxhZyBpcyBzZXQgaW4gRFQs IHRoZXJlIGlzIG5vIG5lZWQgZm9yIHBvbGxpbmcKPiA+ID4gPiBpbiB0aGVybWFsIGZyYW1ld29y ay4gQ3Jvc3NpbmcgdGhlIHRyaXAgcG9pbnQgd2lsbCByaXNlIGFuIElSUS4KPiA+ID4gPiBUaGUg bmFtaW5nIGNvbnZlbnRpb24gZm9yIHRpcCBwb2ludCAndHlwZScgY2FuIGJlIGNvbmZ1c3NpbmcK PiA+ID4gPiBhbmQgJ3Bhc3NpdmUnICh3aGljIGlzIHBhc3NpdmUgY29vbGluZykgbWlnaHQgYmUg aW50ZXJwcmV0dGVkCj4gPiA+ID4gd3JvbmdseS4KPiA+ID4gPiAKPiA+ID4gPiBUaGlzIG1lY2hh bmlzbSBwcmV2ZW50cyBmcm9tIG1pc3N1ZSBhbmQgYWRkcyBleHBsaWNpdCBzZXR0aW5nCj4gPiA+ ID4gZm9yIGhhcmR3YXJlIHdoaWNoIHN1cHBvcnQgaW50ZXJydXB0cyBmb3IgcHJlLWNvbmZpZ3Vy ZWQKPiA+ID4gPiB0ZW1wZXJhdHVyZQo+ID4gPiA+IHRocmVzaG9sZC4KPiA+ID4gPiAKPiA+ID4g PiBDYzogWmhhbmcgUnVpIDxydWkuemhhbmdAaW50ZWwuY29tPgo+ID4gPiA+IENjOiBFZHVhcmRv IFZhbGVudGluIDxlZHViZXp2YWxAZ21haWwuY29tPgo+ID4gPiA+IENjOiBEYW5pZWwgTGV6Y2Fu byA8ZGFuaWVsLmxlemNhbm9AbGluYXJvLm9yZz4KPiA+ID4gPiBTaWduZWQtb2ZmLWJ5OiBMdWth c3ogTHViYSA8bC5sdWJhQHBhcnRuZXIuc2Ftc3VuZy5jb20+Cj4gPiA+ID4gLS0tCj4gPiA+ID4g wqDCoGRyaXZlcnMvdGhlcm1hbC9vZi10aGVybWFsLmPCoMKgwqB8IDE3ICsrKysrKysrKysrKysr KysrCj4gPiA+ID4gwqDCoGRyaXZlcnMvdGhlcm1hbC90aGVybWFsX2NvcmUuYyB8IDEwICsrKysr KysrLS0KPiA+ID4gPiDCoMKgaW5jbHVkZS9saW51eC90aGVybWFsLmjCoMKgwqDCoMKgwqDCoMKg fMKgwqA1ICsrKysrCj4gPiA+ID4gwqDCoDMgZmlsZXMgY2hhbmdlZCwgMzAgaW5zZXJ0aW9ucygr KSwgMiBkZWxldGlvbnMoLSkKPiA+ID4gPiAKPiA+ID4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy90 aGVybWFsL29mLXRoZXJtYWwuYyBiL2RyaXZlcnMvdGhlcm1hbC9vZi0KPiA+ID4gPiB0aGVybWFs LmMKPiA+ID4gPiBpbmRleCA0YmZkYjRhLi4xYTc1OTQ2YSAxMDA2NDQKPiA+ID4gPiAtLS0gYS9k cml2ZXJzL3RoZXJtYWwvb2YtdGhlcm1hbC5jCj4gPiA+ID4gKysrIGIvZHJpdmVycy90aGVybWFs L29mLXRoZXJtYWwuYwo+ID4gPiA+IEBAIC0zMTIsNiArMzEyLDIwIEBAIHN0YXRpYyBpbnQgb2Zf dGhlcm1hbF9nZXRfdHJpcF90eXBlKHN0cnVjdAo+ID4gPiA+IHRoZXJtYWxfem9uZV9kZXZpY2Ug KnR6LCBpbnQgdHJpcCwKPiA+ID4gPiDCoMKgwqDCoMKgIHJldHVybiAwOwo+ID4gPiA+IMKgwqB9 Cj4gPiA+ID4gK3N0YXRpYyBpbnQKPiA+ID4gPiArb2ZfdGhlcm1hbF9nZXRfdHJpcF9pcnFfbW9k ZShzdHJ1Y3QgdGhlcm1hbF96b25lX2RldmljZSAqdHosCj4gPiA+ID4gaW50Cj4gPiA+ID4gdHJp cCwKPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCDCoMKgwqDCoMKgYm9vbCAqbW9kZSkK PiA+ID4gPiArewo+ID4gPiA+ICvCoMKgwqAgc3RydWN0IF9fdGhlcm1hbF96b25lICpkYXRhID0g dHotPmRldmRhdGE7Cj4gPiA+ID4gKwo+ID4gPiA+ICvCoMKgwqAgaWYgKHRyaXAgPj0gZGF0YS0+ bnRyaXBzIHx8IHRyaXAgPCAwKQo+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gLUVET007 Cj4gPiA+ID4gKwo+ID4gPiA+ICvCoMKgwqAgKm1vZGUgPSBkYXRhLT50cmlwc1t0cmlwXS5pcnFf bW9kZTsKPiA+ID4gPiArCj4gPiA+ID4gK8KgwqDCoCByZXR1cm4gMDsKPiA+ID4gPiArfQo+ID4g PiA+ICsKPiA+ID4gPiDCoMKgc3RhdGljIGludCBvZl90aGVybWFsX2dldF90cmlwX3RlbXAoc3Ry dWN0Cj4gPiA+ID4gdGhlcm1hbF96b25lX2RldmljZSAqdHosCj4gPiA+ID4gaW50IHRyaXAsCj4g PiA+ID4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCDCoMKgwqDCoGludCAqdGVt cCkKPiA+ID4gPiDCoMKgewo+ID4gPiA+IEBAIC0zOTQsNiArNDA4LDcgQEAgc3RhdGljIHN0cnVj dCB0aGVybWFsX3pvbmVfZGV2aWNlX29wcwo+ID4gPiA+IG9mX3RoZXJtYWxfb3BzID0gewo+ID4g PiA+IMKgwqDCoMKgwqAgLnNldF9tb2RlID0gb2ZfdGhlcm1hbF9zZXRfbW9kZSwKPiA+ID4gPiDC oMKgwqDCoMKgIC5nZXRfdHJpcF90eXBlID0gb2ZfdGhlcm1hbF9nZXRfdHJpcF90eXBlLAo+ID4g PiA+ICvCoMKgwqAgLmdldF90cmlwX2lycV9tb2RlID0gb2ZfdGhlcm1hbF9nZXRfdHJpcF9pcnFf bW9kZSwKPiA+ID4gPiDCoMKgwqDCoMKgIC5nZXRfdHJpcF90ZW1wID0gb2ZfdGhlcm1hbF9nZXRf dHJpcF90ZW1wLAo+ID4gPiA+IMKgwqDCoMKgwqAgLnNldF90cmlwX3RlbXAgPSBvZl90aGVybWFs X3NldF90cmlwX3RlbXAsCj4gPiA+ID4gwqDCoMKgwqDCoCAuZ2V0X3RyaXBfaHlzdCA9IG9mX3Ro ZXJtYWxfZ2V0X3RyaXBfaHlzdCwKPiA+ID4gPiBAQCAtODI3LDYgKzg0Miw4IEBAIHN0YXRpYyBp bnQgdGhlcm1hbF9vZl9wb3B1bGF0ZV90cmlwKHN0cnVjdAo+ID4gPiA+IGRldmljZV9ub2RlICpu cCwKPiA+ID4gPiDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0dXJuIHJldDsKPiA+ID4gPiDCoMKgwqDC oMKgIH0KPiA+ID4gPiArwqDCoMKgIHRyaXAtPmlycV9tb2RlID0gb2ZfcHJvcGVydHlfcmVhZF9i b29sKG5wLCAiaXJxLW1vZGUiKTsKPiA+ID4gPiArCj4gPiA+ID4gwqDCoMKgwqDCoCAvKiBSZXF1 aXJlZCBmb3IgY29vbGluZyBtYXAgbWF0Y2hpbmcgKi8KPiA+ID4gPiDCoMKgwqDCoMKgIHRyaXAt Pm5wID0gbnA7Cj4gPiA+ID4gwqDCoMKgwqDCoCBvZl9ub2RlX2dldChucCk7Cj4gPiA+ID4gZGlm ZiAtLWdpdCBhL2RyaXZlcnMvdGhlcm1hbC90aGVybWFsX2NvcmUuYwo+ID4gPiA+IGIvZHJpdmVy cy90aGVybWFsL3RoZXJtYWxfY29yZS5jCj4gPiA+ID4gaW5kZXggMzlmYzgxMi4uNmQ0MWUwOCAx MDA2NDQKPiA+ID4gPiAtLS0gYS9kcml2ZXJzL3RoZXJtYWwvdGhlcm1hbF9jb3JlLmMKPiA+ID4g PiArKysgYi9kcml2ZXJzL3RoZXJtYWwvdGhlcm1hbF9jb3JlLmMKPiA+ID4gPiBAQCAtNDA2LDYg KzQwNiw3IEBAIHN0YXRpYyB2b2lkIGhhbmRsZV9jcml0aWNhbF90cmlwcyhzdHJ1Y3QKPiA+ID4g PiB0aGVybWFsX3pvbmVfZGV2aWNlICp0eiwKPiA+ID4gPiDCoMKgc3RhdGljIHZvaWQgaGFuZGxl X3RoZXJtYWxfdHJpcChzdHJ1Y3QgdGhlcm1hbF96b25lX2RldmljZQo+ID4gPiA+ICp0eiwgaW50 Cj4gPiA+ID4gdHJpcCkKPiA+ID4gPiDCoMKgewo+ID4gPiA+IMKgwqDCoMKgwqAgZW51bSB0aGVy bWFsX3RyaXBfdHlwZSB0eXBlOwo+ID4gPiA+ICvCoMKgwqAgYm9vbCBpcnFfbW9kZSA9IGZhbHNl Owo+ID4gPiA+IMKgwqDCoMKgwqAgLyogSWdub3JlIGRpc2FibGVkIHRyaXAgcG9pbnRzICovCj4g PiA+ID4gwqDCoMKgwqDCoCBpZiAodGVzdF9iaXQodHJpcCwgJnR6LT50cmlwc19kaXNhYmxlZCkp Cj4gPiA+ID4gQEAgLTQxOSw5ICs0MjAsMTQgQEAgc3RhdGljIHZvaWQgaGFuZGxlX3RoZXJtYWxf dHJpcChzdHJ1Y3QKPiA+ID4gPiB0aGVybWFsX3pvbmVfZGV2aWNlICp0eiwgaW50IHRyaXApCj4g PiA+ID4gwqDCoMKgwqDCoMKgwqDCoMKgIGhhbmRsZV9ub25fY3JpdGljYWxfdHJpcHModHosIHRy aXApOwo+ID4gPiA+IMKgwqDCoMKgwqAgLyoKPiA+ID4gPiDCoMKgwqDCoMKgIMKgKiBBbHJpZ2h0 LCB3ZSBoYW5kbGVkIHRoaXMgdHJpcCBzdWNjZXNzZnVsbHkuCj4gPiA+ID4gLcKgwqDCoCDCoCog U28sIHN0YXJ0IG1vbml0b3JpbmcgYWdhaW4uCj4gPiA+ID4gK8KgwqDCoCDCoCogU28sIHN0YXJ0 IG1vbml0b3JpbmcgaW4gcG9sbGluZyBtb2RlIGlmCj4gPiA+ID4gK8KgwqDCoCDCoCogdHJpcCBp cyBub3QgdXNpbmcgaXJxIEhXIHN1cHBvcnQuCj4gPiA+ID4gwqDCoMKgwqDCoCDCoCovCj4gPiA+ ID4gLcKgwqDCoCBtb25pdG9yX3RoZXJtYWxfem9uZSh0eik7Cj4gPiA+ID4gK8KgwqDCoCBpZiAo dHotPm9wcy0+Z2V0X3RyaXBfaXJxX21vZGUpCj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgIHR6LT5v cHMtPmdldF90cmlwX2lycV9tb2RlKHR6LCB0cmlwLCAmaXJxX21vZGUpOwo+ID4gPiA+ICsKPiA+ ID4gPiArwqDCoMKgIGlmICghaXJxX21vZGUpCj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgIG1vbml0 b3JfdGhlcm1hbF96b25lKHR6KTsKPiA+ID4gPiDCoMKgfQo+ID4gPiBoYW5kbGVfdGhlcm1hbF90 cmlwKCkgaXMgY2FsbGVkIGZyb20KPiA+ID4gdGhlcm1hbF96b25lX2RldmljZV91cGRhdGUoKSwg YW5kCj4gPiA+IGl0IGlzIGludm9rZWQgZm9yIGV2ZXJ5IHRyaXAgcG9pbnRzLgo+ID4gPiBzYXks IHlvdSBoYXZlIGEgcGFzc2l2ZSB0cmlwIHBvaW50IDEgdGhhdCBzdXBwb3J0cyBpcnFfbW9kZSwg YW5kCj4gPiA+IGFub3RoZXIgcGFzc2l2ZSB0cmlwIHBvaW50IDIgdGhhdCBkb2VzIG5vdCBzdXBw b3J0IGlycV9tb2RlLAo+ID4gPiBtb25pdG9yX3RoZXJtYWxfem9uZSgpIGlzIHN0aWxsIGNhbGxl ZCBpbiBoYW5kbGVfdGhlcm1hbF90cmlwKHR6LAo+ID4gPiAyKSwKPiA+ID4gYW5kIHRoZSBwYXNz aXZlIHRpbWVyIHdpbGwgYmUgYWN0aXZhdGVkIGFueXdheSwgZG8gSSBtaXNzCj4gPiA+IHNvbWV0 aGluZz8KCnNvcnJ5IHRoYXQgSSBtaXNzZWQgdGhpcyB0aHJlYWQuCgo+ID4gWWVzLCB0aGUgcGFz c2l2ZSB0aW1lciB3aWxsIGJlIGFjdGl2YXRlZCBpbiB5b3VyIGV4YW1wbGUuIEl0IGlzCj4gPiBj b3JyZWN0Cj4gPiBiZWhhdmlvciBhbmQgZG9lcyBub3QgYnJlYWsgYW55dGhpbmcuCj4gPiBjYXNl IDE6IHRoZXJlIGlzICdrJyBwYXNzaXZlIHRyaXAgcG9pbnRzIHdoaWNoIGhhdmUgaXJxX21vZGUg YW5kIDEKPiA+IGFkZGl0aW9uYWwgd2hpY2ggZG9lcyBub3QgaGF2ZSAnaXJxX21vZGUnLCB0aGUg ZnJhbWV3b3JrIHdpbGwgc3RhcnQKPiA+IHBvbGxpbmcgYnV0IHNraXAgY2hlY2sgZm9yIHRob3Nl ICdrJyB0cmlwIHBvaW50cy4KPiA+IGNhc2UgMjogYWxsIG9mIHRoZSBwYXNzaXZlIHRyaXAgcG9p bnRzIGhhdmUgaXJxX21vZGUgc2V0LCB0aGUKPiA+IGZyYW1ld29yawo+ID4gd2lsbCBub3QgcmVn aXN0ZXIgJ3NjaGVkdWxlZF93b3JrJyBiZWNhdXNlIGl0IHdpbGwgbm90IGNhbGzCoAo+ID4gJ21v bml0b3JfdGhlcm1hbF96b25lKCknLgo+ID4gVGhpcyBpcyB0aGUgY2FzZSBvZiBtb3N0IEV4eW5v cyBwbGF0Zm9ybXMsIGJ1dCB0aGVyZSBpcyBvbmUKPiA+IGV4Y2VwdGlvbsKgCj4gPiB3aGljaCBo YXMgJ2Nhc2UgMScgd2l0aCAyIHRyaXAgcG9pbnRzIG5vdCBzdXBwb3J0aW5nIGlycV9tb2RlLgo+ IERvIHlvdSBzdWdnZXN0IHRvIGNvdmVyIHRoZSAnY2FzZSAxJz8KClNvIHRoaXMgc29sdXRpb24g ZG9lcyBub3QgY292ZXIgY2FzZSAxLgpBbmQgZm9yIGNhc2UgMiwgd2h5IG5vdCBzZXQgcGFzc2l2 ZV9kZWxheSB0byAwPyBhcmUgdGhleSBzaGFyaW5nIHRoZQpzYW1lIERUIGZpbGU/Cgo+IEl0IHdv dWxkIGJlIHBvc3NpYmxlIGFmdGVyIGFkZGluZyBhIG5ldyBlbnVtIFRIRVJNQUxfRlJBTUVXT1JL X1BPTEwswqAKPiB0aGVuIGZ1bmN0aW9uOgoKaG1tbSwgSSB0aGluayB3ZSBjYW4KMS4gdXNlIHR6 LT5wYXNzaXZlIHRvIGNvdW50IHRoZSBwYXNzaXZlIHRyaXAgcG9pbnRzIHRoYXQgbmVlZCBwYXNz aXZlCnBvbGxpbmcuCjIuIGNvdW50IHR6LT5wYXNzaXZlIHByb3Blcmx5IGluIHRoZSBnb3Zlcm5v cnMKMy4gYWx3YXlzIGRvIHBhc3NpdmUgcG9sbGluZyB3aGVuIHR6LT5wYXNzaXZlID4gMC4KClRo aXMgd2lsbCBjb3ZlciBib3RoIGNhc2VzLCByaWdodD8KCnNvbWUgc2FtcGxlIGNvZGUgdG8gaGFu ZGxlIHRoaXMgaW4gc3RlcF93aXNlIGdvdmVybm9yIGF0dGFjaGVkIGJlbG93LAoKd2hhdCBkbyB5 b3UgdGhpbms/Cgp0aGFua3MsCnJ1aQoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGhlcm1hbC9zdGVw X3dpc2UuYyBiL2RyaXZlcnMvdGhlcm1hbC9zdGVwX3dpc2UuYwppbmRleCBlZTA0N2NhLi41OWQ5 YTFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RoZXJtYWwvc3RlcF93aXNlLmMKKysrIGIvZHJpdmVy cy90aGVybWFsL3N0ZXBfd2lzZS5jCkBAIC0xMjEsOCArMTIxLDE1IEBAIHN0YXRpYyB2b2lkIHVw ZGF0ZV9wYXNzaXZlX2luc3RhbmNlKHN0cnVjdAp0aGVybWFsX3pvbmVfZGV2aWNlICp0eiwKwqDC oMKgwqDCoMKgwqDCoMKgKiBJZiB2YWx1ZSBpcyArMSwgYWN0aXZhdGUgYSBwYXNzaXZlIGluc3Rh bmNlLgrCoMKgwqDCoMKgwqDCoMKgwqAqIElmIHZhbHVlIGlzIC0xLCBkZWFjdGl2YXRlIGEgcGFz c2l2ZSBpbnN0YW5jZS4KwqDCoMKgwqDCoMKgwqDCoMKgKi8KLcKgwqDCoMKgwqDCoMKgaWYgKHR5 cGUgPT0gVEhFUk1BTF9UUklQX1BBU1NJVkUgfHwgdHlwZSA9PSBUSEVSTUFMX1RSSVBTX05PTkUp Ci3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB0ei0+cGFzc2l2ZSArPSB2YWx1ZTsKK8Kg wqDCoMKgwqDCoMKgaWYgKHR5cGUgIT0gVEhFUk1BTF9UUklQX1BBU1NJVkUgJiYgdHlwZSAhPSBU SEVSTUFMX1RSSVBTX05PTkUpCivCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm47 CivCoMKgwqDCoMKgwqDCoGlmICh0ei0+b3BzLT5nZXRfdHJpcF9pcnFfbW9kZSkgeworwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgKHR6LT5vcHMtPmdldF90cmlwX2lycV9tb2RlKHR6 LCB0cmlwLCAmaXJxX21vZGUpKQorwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm47CivCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBpZiAoaXJxX21vZGUpCivCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybjsKK8KgwqDCoMKgwqDCoMKgfQorwqDC oMKgwqDCoMKgwqB0ei0+cGFzc2l2ZSArPSB2YWx1ZTsKwqB9CgoKPiB0aGVybWFsX3pvbmVfZGV2 aWNlX2NoZWNrKCkgd2lsbCBjYWxsCj4gdGhlcm1hbF96b25lX2RldmljZV91cGRhdGUodHosIFRI RVJNQUxfRlJBTUVXT1JLX1BPTEwpCj4gYW5kIGluIGhhbmRsZV90aGVybWFsX3RyaXAoKSBpbXBs ZW1lbnQgc29tZXRoaW5nIGxpa2U6Cj4gLS0tLS0tLS0tLS0tLS04PC0tLS0tLS0tLS0tLS0tLS0K PiBzdGF0aWMgdm9pZCBoYW5kbGVfdGhlcm1hbF90cmlwKHN0cnVjdCB0aGVybWFsX3pvbmVfZGV2 aWNlICp0eiwgaW50Cj4gdHJpcCkKPiB7Cj4gCWVudW0gdGhlcm1hbF90cmlwX3R5cGUgdHlwZTsK PiAJYm9vbCBpcnFfbW9kZSA9IGZhbHNlOwo+IAo+IAkvKiBJZ25vcmUgZGlzYWJsZWQgdHJpcCBw b2ludHMgKi8KPiAJaWYgKHRlc3RfYml0KHRyaXAsICZ0ei0+dHJpcHNfZGlzYWJsZWQpKQo+IAkJ cmV0dXJuOwo+IAo+IAlpZiAodHotPm9wcy0+Z2V0X3RyaXBfaXJxX21vZGUpCj4gCQl0ei0+b3Bz LT5nZXRfdHJpcF9pcnFfbW9kZSh0eiwgdHJpcCwgJmlycV9tb2RlKQo+IAo+IAlpZiAodHotPm5v dGlmeV9ldmVudCA9PSBUSEVSTUFMX0ZSQU1FV09SS19QT0xMICYmIGlycV9tb2RlKQo+IAkJcmV0 dXJuOwo+IC4uLgo+IAo+IAlpZiAoIWlycV9tb2RlKQo+IAkJbW9uaXRvcl90aGVybWFsX3pvbmUo dHopOwo+IH0KPiAKPiAtLS0tLS0tLS0tPjgtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+IAo+IEkg Y291bGQgaW1wbGVtZW50IGl0IGluIHYzIGlmIHlvdSBkb24ndCBzZWUgdGhhdCBpdCBhZGQgdG9v IG11Y2ggb2YKPiBtZXNzwqAKPiBhbmQgYWdyZWUgZm9yIHRoaXMgYXBwcm9hY2guCj4gCj4gUmVn YXJkcywKPiBMdWthc3oKPiAKPiA+IAo+ID4gCj4gPiBSZWdhcmRzLAo+ID4gTHVrYXN6Cj4gPiAK PiA+ID4gCj4gPiA+IAo+ID4gPiB0aGFua3MsCj4gPiA+IHJ1aQo+ID4gPiAKPiA+ID4gPiAKPiA+ ID4gPiDCoMKgc3RhdGljIHZvaWQgdXBkYXRlX3RlbXBlcmF0dXJlKHN0cnVjdCB0aGVybWFsX3pv bmVfZGV2aWNlCj4gPiA+ID4gKnR6KQo+ID4gPiA+IGRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4 L3RoZXJtYWwuaCBiL2luY2x1ZGUvbGludXgvdGhlcm1hbC5oCj4gPiA+ID4gaW5kZXggNWY0NzA1 Zi4uYjA2NDU2NSAxMDA2NDQKPiA+ID4gPiAtLS0gYS9pbmNsdWRlL2xpbnV4L3RoZXJtYWwuaAo+ ID4gPiA+ICsrKyBiL2luY2x1ZGUvbGludXgvdGhlcm1hbC5oCj4gPiA+ID4gQEAgLTEwMyw2ICsx MDMsNyBAQCBzdHJ1Y3QgdGhlcm1hbF96b25lX2RldmljZV9vcHMgewo+ID4gPiA+IMKgwqDCoMKg wqDCoMKgwqDCoCBlbnVtIHRoZXJtYWxfZGV2aWNlX21vZGUpOwo+ID4gPiA+IMKgwqDCoMKgwqAg aW50ICgqZ2V0X3RyaXBfdHlwZSkgKHN0cnVjdCB0aGVybWFsX3pvbmVfZGV2aWNlICosIGludCwK PiA+ID4gPiDCoMKgwqDCoMKgwqDCoMKgwqAgZW51bSB0aGVybWFsX3RyaXBfdHlwZSAqKTsKPiA+ ID4gPiArwqDCoMKgIGludCAoKmdldF90cmlwX2lycV9tb2RlKSAoc3RydWN0IHRoZXJtYWxfem9u ZV9kZXZpY2UgKiwKPiA+ID4gPiBpbnQsCj4gPiA+ID4gYm9vbCAqKTsKPiA+ID4gPiDCoMKgwqDC oMKgIGludCAoKmdldF90cmlwX3RlbXApIChzdHJ1Y3QgdGhlcm1hbF96b25lX2RldmljZSAqLCBp bnQsCj4gPiA+ID4gaW50Cj4gPiA+ID4gKik7Cj4gPiA+ID4gwqDCoMKgwqDCoCBpbnQgKCpzZXRf dHJpcF90ZW1wKSAoc3RydWN0IHRoZXJtYWxfem9uZV9kZXZpY2UgKiwgaW50LAo+ID4gPiA+IGlu dCk7Cj4gPiA+ID4gwqDCoMKgwqDCoCBpbnQgKCpnZXRfdHJpcF9oeXN0KSAoc3RydWN0IHRoZXJt YWxfem9uZV9kZXZpY2UgKiwgaW50LAo+ID4gPiA+IGludAo+ID4gPiA+ICopOwo+ID4gPiA+IEBA IC0xOTYsNiArMTk3LDcgQEAgc3RydWN0IHRoZXJtYWxfem9uZV9kZXZpY2Ugewo+ID4gPiA+IMKg wqDCoMKgwqAgc3RydWN0IHRoZXJtYWxfYXR0ciAqdHJpcF90ZW1wX2F0dHJzOwo+ID4gPiA+IMKg wqDCoMKgwqAgc3RydWN0IHRoZXJtYWxfYXR0ciAqdHJpcF90eXBlX2F0dHJzOwo+ID4gPiA+IMKg wqDCoMKgwqAgc3RydWN0IHRoZXJtYWxfYXR0ciAqdHJpcF9oeXN0X2F0dHJzOwo+ID4gPiA+ICvC oMKgwqAgc3RydWN0IHRoZXJtYWxfYXR0ciAqdHJpcF9pcnFfbW9kZV9hdHRyczsKPiA+ID4gPiDC oMKgwqDCoMKgIHZvaWQgKmRldmRhdGE7Cj4gPiA+ID4gwqDCoMKgwqDCoCBpbnQgdHJpcHM7Cj4g PiA+ID4gwqDCoMKgwqDCoCB1bnNpZ25lZCBsb25nIHRyaXBzX2Rpc2FibGVkO8KgwqDCoCAvKiBi aXRtYXAgZm9yIGRpc2FibGVkCj4gPiA+ID4gdHJpcHMgKi8KPiA+ID4gPiBAQCAtMzY0LDYgKzM2 Niw4IEBAIHN0cnVjdCB0aGVybWFsX3pvbmVfb2ZfZGV2aWNlX29wcyB7Cj4gPiA+ID4gwqDCoCAq IEB0ZW1wZXJhdHVyZTogdGVtcGVyYXR1cmUgdmFsdWUgaW4gbWlsaUNlbHNpdXMKPiA+ID4gPiDC oMKgICogQGh5c3RlcmVzaXM6IHJlbGF0aXZlIGh5c3RlcmVzaXMgaW4gbWlsaUNlbHNpdXMKPiA+ ID4gPiDCoMKgICogQHR5cGU6IHRyaXAgcG9pbnQgdHlwZQo+ID4gPiA+ICsgKiBAaXJxX21vZGU6 IHRvIG5vdCB1c2UgcG9sbGluZyBpbiBmcmFtZXdvcmsgc2V0IHN1cHBvcnQgb2YKPiA+ID4gPiBI VyBpcnEKPiA+ID4gPiAod2hpY2ggd2lsbAo+ID4gPiA+ICsgKsKgwqDCoCDCoMKgwqDCoMKgwqBi ZSB0cmlnZ2VyZWQgd2hlbiB0ZW1wZXJhdHVyZSByZWFjaGVzIHRoaXMgbGV2ZWwpLgo+ID4gPiA+ IMKgwqAgKi8KPiA+ID4gPiDCoMKgc3RydWN0IHRoZXJtYWxfdHJpcCB7Cj4gPiA+ID4gQEAgLTM3 MSw2ICszNzUsNyBAQCBzdHJ1Y3QgdGhlcm1hbF90cmlwIHsKPiA+ID4gPiDCoMKgwqDCoMKgIGlu dCB0ZW1wZXJhdHVyZTsKPiA+ID4gPiDCoMKgwqDCoMKgIGludCBoeXN0ZXJlc2lzOwo+ID4gPiA+ IMKgwqDCoMKgwqAgZW51bSB0aGVybWFsX3RyaXBfdHlwZSB0eXBlOwo+ID4gPiA+ICvCoMKgwqAg Ym9vbCBpcnFfbW9kZTsKPiA+ID4gPiDCoMKgfTsKPiA+ID4gPiDCoMKgLyogRnVuY3Rpb24gZGVj bGFyYXRpb25zICovCj4gPiA+IAoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX18KbGludXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxpc3QKbGludXgtYXJtLWtlcm5l bEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4v bGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAo=