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.3 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_SANE_1 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 BA606C432C2 for ; Wed, 25 Sep 2019 16:45:17 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 7578F21D7B for ; Wed, 25 Sep 2019 16:45:17 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="X6/ClZmA" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2390958AbfIYQpQ (ORCPT ); Wed, 25 Sep 2019 12:45:16 -0400 Received: from mail-pf1-f193.google.com ([209.85.210.193]:42877 "EHLO mail-pf1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732730AbfIYQpQ (ORCPT ); Wed, 25 Sep 2019 12:45:16 -0400 Received: by mail-pf1-f193.google.com with SMTP id q12so3844175pff.9 for ; Wed, 25 Sep 2019 09:45:15 -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=bCV7ZWWp1O30dSnj5CtR75PrMsLMhsTR+j2NmEPiFx8=; b=X6/ClZmAcFODy21ry2SkgXnJujiVQBMakdVb21H0L4pa3GFPX/h2jo85MYKd1qWo4x +xlGQkJjUgHsnXBhX4M2QV5xSoHOebwAsIuzUSxQor2coGquUgLngU03uKRRiKWiOBz5 roJQY8NGZeQB0x+zn9aDugURehf1uQzKg8wdY= 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=bCV7ZWWp1O30dSnj5CtR75PrMsLMhsTR+j2NmEPiFx8=; b=g5l8RvzeGpWB8J/wil1zQI7+HV8LadR5qbdvqyRp/1cywYZN23s/ypupKnX5+HpM1M mSyo0LEb4gAxogx7b7h94Nnxc3H2WTyRlF50V7JvwP85BC/Nw4wJHsqVhyMYmQHcC8aX VzEhsrzmITCLaX7nEdv/2sevx2f5eUHePTycsdJxml2yW8+WzH1deihRJCDfC4r8Hpd6 ohHy37a56WZ8JQA0Z5pxg/BughMKKF9a+OArO7/tn86oWoY21uCpYZ/H0fFvzKfBLQRe JDQB2mgKRIxzEplu6hh6Czou9W3hDl9GMKZOBUWpPkSd/AEUfmG+c2cZOpLX+BKyAjNE wqjA== X-Gm-Message-State: APjAAAX9QtdK0RPLg7cH+xepGSJf25oUp6QjIomVahW26yUygI3rm6ZR 6tOxUDwTg7WHpKkTdTZpJYPaRw== X-Google-Smtp-Source: APXvYqyQngmZwEMiV50jPJnMbKoThh06pNgZsnzzBHaqTx6Pi+eTv6+RLAEWklHxWNAH9mCzL/IUjw== X-Received: by 2002:a17:90a:890c:: with SMTP id u12mr7501590pjn.121.1569429915470; Wed, 25 Sep 2019 09:45:15 -0700 (PDT) Received: from localhost ([2620:15c:202:1:75a:3f6e:21d:9374]) by smtp.gmail.com with ESMTPSA id j128sm10149114pfg.51.2019.09.25.09.45.14 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 25 Sep 2019 09:45:14 -0700 (PDT) Date: Wed, 25 Sep 2019 09:45:13 -0700 From: Matthias Kaehlcke To: Chanwoo Choi Cc: Leonard Crestez , MyungJoo Ham , Kyungmin Park , Artur =?utf-8?B?xZp3aWdvxYQ=?= , Saravana Kannan , Krzysztof Kozlowski , Alexandre Bailon , Georgi Djakov , Abel Vesa , Jacky Bai , Viresh Kumar , Lukasz Luba , NXP Linux Team , linux-pm@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: Re: [PATCH v8 6/6] PM / devfreq: Use PM QoS for sysfs min/max_freq Message-ID: <20190925164513.GM133864@google.com> References: <3eb8a1d1e7d738f7599d54348d6b474196581693.1569319738.git.leonard.crestez@nxp.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.10.1 (2018-07-13) Sender: linux-pm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org On Wed, Sep 25, 2019 at 11:41:07AM +0900, Chanwoo Choi wrote: > On 19. 9. 24. 오후 7:11, Leonard Crestez wrote: > > Switch the handling of min_freq and max_freq from sysfs to use the > > dev_pm_qos_request interface. > > > > Since PM QoS handles frequencies as kHz this change reduces the > > precision of min_freq and max_freq. This shouldn't introduce problems > > because frequencies which are not an integer number of kHz are likely > > not an integer number of Hz either. > > > > Try to ensure compatibility by rounding min values down and rounding > > max values up. > > > > Signed-off-by: Leonard Crestez > > Reviewed-by: Matthias Kaehlcke > > --- > > drivers/devfreq/devfreq.c | 46 ++++++++++++++++++++++++--------------- > > include/linux/devfreq.h | 9 ++++---- > > 2 files changed, 33 insertions(+), 22 deletions(-) > > > > diff --git a/drivers/devfreq/devfreq.c b/drivers/devfreq/devfreq.c > > index 784f3e40536a..8bb7efd821ab 100644 > > --- a/drivers/devfreq/devfreq.c > > +++ b/drivers/devfreq/devfreq.c > > @@ -137,14 +137,10 @@ static void get_freq_range(struct devfreq *devfreq, > > qos_max_freq = dev_pm_qos_read_value(devfreq->dev.parent, > > DEV_PM_QOS_MIN_FREQUENCY); > > *min_freq = max(*min_freq, HZ_PER_KHZ * qos_min_freq); > > *max_freq = min(*max_freq, HZ_PER_KHZ * qos_max_freq); > > > > - /* constraints from sysfs */ > > - *min_freq = max(*min_freq, devfreq->min_freq); > > - *max_freq = min(*max_freq, devfreq->max_freq); > > - > > /* constraints from OPP interface */ > > *min_freq = max(*min_freq, devfreq->scaling_min_freq); > > /* scaling_max_freq can be zero on error */ > > if (devfreq->scaling_max_freq) > > *max_freq = min(*max_freq, devfreq->scaling_max_freq); > > @@ -679,10 +675,12 @@ static void devfreq_dev_release(struct device *dev) > > DEV_PM_QOS_MIN_FREQUENCY); > > > > if (devfreq->profile->exit) > > devfreq->profile->exit(devfreq->dev.parent); > > > > + dev_pm_qos_remove_request(&devfreq->user_max_freq_req); > > + dev_pm_qos_remove_request(&devfreq->user_min_freq_req); > > Please check the return value if error happen, just print the err with dev_err() > without stopping the release steps. I wonder if dev_warn() would be more appropriate, since the current operation is not aborted. > > kfree(devfreq->time_in_state); > > kfree(devfreq->trans_table); > > mutex_destroy(&devfreq->lock); > > kfree(devfreq); > > } > > @@ -747,18 +745,25 @@ struct devfreq *devfreq_add_device(struct device *dev, > > devfreq->scaling_min_freq = find_available_min_freq(devfreq); > > if (!devfreq->scaling_min_freq) { > > err = -EINVAL; > > goto err_dev; > > } > > - devfreq->min_freq = devfreq->scaling_min_freq; > > > > devfreq->scaling_max_freq = find_available_max_freq(devfreq); > > if (!devfreq->scaling_max_freq) { > > err = -EINVAL; > > goto err_dev; > > } > > - devfreq->max_freq = devfreq->scaling_max_freq; > > + > > + err = dev_pm_qos_add_request(dev, &devfreq->user_min_freq_req, > > + DEV_PM_QOS_MIN_FREQUENCY, 0); > > + if (err < 0) > > + goto err_dev; > > + err = dev_pm_qos_add_request(dev, &devfreq->user_max_freq_req, > > + DEV_PM_QOS_MAX_FREQUENCY, S32_MAX); > > + if (err < 0) > > + goto err_dev; > > > > devfreq->suspend_freq = dev_pm_opp_get_suspend_opp_freq(dev); > > atomic_set(&devfreq->suspend_count, 0); > > > > devfreq->trans_table = kzalloc( > > @@ -843,10 +848,14 @@ struct devfreq *devfreq_add_device(struct device *dev, > > err_dev: > > /* > > * Cleanup path for errors that happen before registration. > > * Otherwise we rely on devfreq_dev_release. > > */ > > + if (dev_pm_qos_request_active(&devfreq->user_max_freq_req)) > > + dev_pm_qos_remove_request(&devfreq->user_max_freq_req); > > Please check the return value if error happen, just print the err with dev_err() > without stopping the release steps. > > dev_err(... "failed to remove request of DEV_PM_QOS_MAX_FREQUENCY\n"); dev_warn() for the same reason as above? I think the message would be better with a slight change: "failed to remove DEV_PM_QOS_MAX_FREQUENCY request\n" > > > + if (dev_pm_qos_request_active(&devfreq->user_min_freq_req)) > > + dev_pm_qos_remove_request(&devfreq->user_min_freq_req); > > dev_err(... "failed to remove request of DEV_PM_QOS_MIN_FREQUENCY\n"); ditto > > kfree(devfreq->time_in_state); > > kfree(devfreq->trans_table); > > kfree(devfreq); > > err_out: > > return ERR_PTR(err); > > @@ -1407,14 +1416,15 @@ static ssize_t min_freq_store(struct device *dev, struct device_attribute *attr, > > > > ret = sscanf(buf, "%lu", &value); > > if (ret != 1) > > return -EINVAL; > > > > - mutex_lock(&df->lock); > > - df->min_freq = value; > > - update_devfreq(df); > > - mutex_unlock(&df->lock); > > + /* round down to kHz for PM QoS */ > > I prefer more detailed description as following: > > /* > * Round down to KHz to decide the proper minimum frequency it should be kHz, with a lower-case 'k', as in the original comment. > * which is closed to user request. > */ The comment you suggest doesn't provide any information about why the conversion to kHz is done, in this sense the original comment that mentions PM QoS provides more value. With whatever we end up, I suggest to use 'convert' instead of 'round down'. > > + ret = dev_pm_qos_update_request(&df->user_min_freq_req, > > + value / HZ_PER_KHZ); > > + if (ret < 0) > > + return ret; > > > > return count; > > } > > > > static ssize_t min_freq_show(struct device *dev, struct device_attribute *attr, > > @@ -1439,19 +1449,19 @@ static ssize_t max_freq_store(struct device *dev, struct device_attribute *attr, > > > > ret = sscanf(buf, "%lu", &value); > > if (ret != 1) > > return -EINVAL; > > > > - mutex_lock(&df->lock); > > - > > - /* Interpret zero as "don't care" */ > > - if (!value) > > - value = ULONG_MAX; > > + /* round up to kHz for PM QoS and interpret zero as "don't care" */ > > I think that "don't care" comment style is not good. > > I referred to the Documentation/ABI/testing/sysfs-class-devfreq file. > I prefer more detailed description as following: > /* > * Round up to KHz to decide the proper maximum frequency kHz > * which is closed to user request. If value is zero, > * the user does not care. "the user does not care" is still very casual you didn't like initially. How about "A value of zero is interpreted as 'no limit'."? As for the min freq, I think PM QoS should be mentioned to make clear why the conversion to kHz is needed. > */ > > > > + if (value) > > + value = DIV_ROUND_UP(value, HZ_PER_KHZ); > > + else > > + value = S32_MAX; > > > > - df->max_freq = value; > > - update_devfreq(df); > > - mutex_unlock(&df->lock); > > + ret = dev_pm_qos_update_request(&df->user_max_freq_req, value); > > + if (ret < 0) > > + return ret; > > > > return count; > > } > > static DEVICE_ATTR_RW(min_freq); > > > > diff --git a/include/linux/devfreq.h b/include/linux/devfreq.h > > index dac0dffeabb4..7849fe4c666d 100644 > > --- a/include/linux/devfreq.h > > +++ b/include/linux/devfreq.h > > @@ -11,10 +11,11 @@ > > #define __LINUX_DEVFREQ_H__ > > > > #include > > #include > > #include > > +#include > > > > #define DEVFREQ_NAME_LEN 16 > > > > /* DEVFREQ governor name */ > > #define DEVFREQ_GOV_SIMPLE_ONDEMAND "simple_ondemand" > > @@ -121,12 +122,12 @@ struct devfreq_dev_profile { > > * devfreq.nb to the corresponding register notifier call chain. > > * @work: delayed work for load monitoring. > > * @previous_freq: previously configured frequency value. > > * @data: Private data of the governor. The devfreq framework does not > > * touch this. > > - * @min_freq: Limit minimum frequency requested by user (0: none) > > - * @max_freq: Limit maximum frequency requested by user (0: none) > > + * @user_min_freq_req: PM QoS min frequency request from user (via sysfs) > > min -> minimum and then remove parenthesis as following: > PM QoS minimum frequency request by user via sysfs > > > + * @user_max_freq_req: PM QoS max frequency request from user (via sysfs) > > ditto. max -> maximum > PM QoS maximum frequency request by user via sysfs > > > * @scaling_min_freq: Limit minimum frequency requested by OPP interface > > * @scaling_max_freq: Limit maximum frequency requested by OPP interface > > * @stop_polling: devfreq polling status of a device. > > * @suspend_freq: frequency of a device set during suspend phase. > > * @resume_freq: frequency of a device set in resume phase. > > @@ -161,12 +162,12 @@ struct devfreq { > > unsigned long previous_freq; > > struct devfreq_dev_status last_status; > > > > void *data; /* private data for governors */ > > > > - unsigned long min_freq; > > - unsigned long max_freq; > > + struct dev_pm_qos_request user_min_freq_req; > > + struct dev_pm_qos_request user_max_freq_req; > > unsigned long scaling_min_freq; > > unsigned long scaling_max_freq; > > bool stop_polling; > > > > unsigned long suspend_freq; > > > > > -- > Best Regards, > Chanwoo Choi > Samsung Electronics 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.2 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_1 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 082DAC432C2 for ; Wed, 25 Sep 2019 16:45:28 +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 D021A21D79 for ; Wed, 25 Sep 2019 16:45:27 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="U6r2vPg0"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="X6/ClZmA" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org D021A21D79 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=c7TwROCpZ6ow1oDcwSVlaRmXir5L55JFvMg03FKzmKs=; b=U6r2vPg0uEvoKO 7cwNPX6CFol0JH8Kut5w++HxyI8poNEOLQ5zbQsdGF/JoOYu2xZsXKUdpIq3RXG9CWgtJh5D8cm6c h8Dj3bjB5rLlsUlxpbEbb2E8PDYvQHYpOOqr0qaLtsqvlPdnPAmYV5rE8IWA0556ivJgyL7SgyfgU GEaSQDbrNvO/+m5gTKQo+Iz4XV2qD0cssJ3YB5ucWI1H9ROyeeRWIET1OmQY1EXJwdZ8CHFNkyQ5r jcw7mRNyDSLEL/SqxpU/SCQlf0ebXT5PgaseWdY9Z1KnyKVamD0P+JUqoMAyx/7aYuchlSsVAri6m E0trzAxYwwDZmQKyjmLA==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.2 #3 (Red Hat Linux)) id 1iDAPp-00031C-3e; Wed, 25 Sep 2019 16:45:21 +0000 Received: from mail-pg1-x544.google.com ([2607:f8b0:4864:20::544]) by bombadil.infradead.org with esmtps (Exim 4.92.2 #3 (Red Hat Linux)) id 1iDAPk-00030P-DB for linux-arm-kernel@lists.infradead.org; Wed, 25 Sep 2019 16:45:18 +0000 Received: by mail-pg1-x544.google.com with SMTP id s1so105396pgv.8 for ; Wed, 25 Sep 2019 09:45:16 -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=bCV7ZWWp1O30dSnj5CtR75PrMsLMhsTR+j2NmEPiFx8=; b=X6/ClZmAcFODy21ry2SkgXnJujiVQBMakdVb21H0L4pa3GFPX/h2jo85MYKd1qWo4x +xlGQkJjUgHsnXBhX4M2QV5xSoHOebwAsIuzUSxQor2coGquUgLngU03uKRRiKWiOBz5 roJQY8NGZeQB0x+zn9aDugURehf1uQzKg8wdY= 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=bCV7ZWWp1O30dSnj5CtR75PrMsLMhsTR+j2NmEPiFx8=; b=GxWGi4/Yd2Bc+zg7iPra7dVV2/5kipq55+yNa15DJVsu5Qt7UmReYobyOi54OaJcQu cTod4kH2vehSlIkM3yp/gPvZmaBznVkuoFoF/rZEnlkln+fCcaOk3qJuDHZdRDB+5euq oWwk5e2jQE6HHCvFMQkZPNa8WcLhevDELMkz98N0mIbQA64pdcfMPWEMXTxTmMe3jhMF jKxB2PJ/WFH+D2G92uhwDN77eI2JY3ZBc5N1m+VM7Z1dsRbGyWzPCJa3fDDibtB3DsAM CmClavU4Lzc40hPazpWdxlEy8ACZ6rdZGOX8c05ODem6qAy6ER3bPsI2kUZ9gNMf468e dhyw== X-Gm-Message-State: APjAAAUi6Fe7n1dBQDZUUWHNkTKPl7zjRmzL4Fu3dSmcRuZVRYV5xsSX 1WUthbcNeCQewHV7eedvG+3SBA== X-Google-Smtp-Source: APXvYqyQngmZwEMiV50jPJnMbKoThh06pNgZsnzzBHaqTx6Pi+eTv6+RLAEWklHxWNAH9mCzL/IUjw== X-Received: by 2002:a17:90a:890c:: with SMTP id u12mr7501590pjn.121.1569429915470; Wed, 25 Sep 2019 09:45:15 -0700 (PDT) Received: from localhost ([2620:15c:202:1:75a:3f6e:21d:9374]) by smtp.gmail.com with ESMTPSA id j128sm10149114pfg.51.2019.09.25.09.45.14 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 25 Sep 2019 09:45:14 -0700 (PDT) Date: Wed, 25 Sep 2019 09:45:13 -0700 From: Matthias Kaehlcke To: Chanwoo Choi Subject: Re: [PATCH v8 6/6] PM / devfreq: Use PM QoS for sysfs min/max_freq Message-ID: <20190925164513.GM133864@google.com> References: <3eb8a1d1e7d738f7599d54348d6b474196581693.1569319738.git.leonard.crestez@nxp.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: 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-20190925_094516_476236_1CC941A1 X-CRM114-Status: GOOD ( 29.19 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Artur =?utf-8?B?xZp3aWdvxYQ=?= , Abel Vesa , Saravana Kannan , linux-pm@vger.kernel.org, Viresh Kumar , NXP Linux Team , Krzysztof Kozlowski , Lukasz Luba , Kyungmin Park , MyungJoo Ham , Alexandre Bailon , Leonard Crestez , Georgi Djakov , linux-arm-kernel@lists.infradead.org, Jacky Bai 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 T24gV2VkLCBTZXAgMjUsIDIwMTkgYXQgMTE6NDE6MDdBTSArMDkwMCwgQ2hhbndvbyBDaG9pIHdy b3RlOgo+IE9uIDE5LiA5LiAyNC4g7Jik7ZuEIDc6MTEsIExlb25hcmQgQ3Jlc3RleiB3cm90ZToK PiA+IFN3aXRjaCB0aGUgaGFuZGxpbmcgb2YgbWluX2ZyZXEgYW5kIG1heF9mcmVxIGZyb20gc3lz ZnMgdG8gdXNlIHRoZQo+ID4gZGV2X3BtX3Fvc19yZXF1ZXN0IGludGVyZmFjZS4KPiA+IAo+ID4g U2luY2UgUE0gUW9TIGhhbmRsZXMgZnJlcXVlbmNpZXMgYXMga0h6IHRoaXMgY2hhbmdlIHJlZHVj ZXMgdGhlCj4gPiBwcmVjaXNpb24gb2YgbWluX2ZyZXEgYW5kIG1heF9mcmVxLiBUaGlzIHNob3Vs ZG4ndCBpbnRyb2R1Y2UgcHJvYmxlbXMKPiA+IGJlY2F1c2UgZnJlcXVlbmNpZXMgd2hpY2ggYXJl IG5vdCBhbiBpbnRlZ2VyIG51bWJlciBvZiBrSHogYXJlIGxpa2VseQo+ID4gbm90IGFuIGludGVn ZXIgbnVtYmVyIG9mIEh6IGVpdGhlci4KPiA+IAo+ID4gVHJ5IHRvIGVuc3VyZSBjb21wYXRpYmls aXR5IGJ5IHJvdW5kaW5nIG1pbiB2YWx1ZXMgZG93biBhbmQgcm91bmRpbmcKPiA+IG1heCB2YWx1 ZXMgdXAuCj4gPiAKPiA+IFNpZ25lZC1vZmYtYnk6IExlb25hcmQgQ3Jlc3RleiA8bGVvbmFyZC5j cmVzdGV6QG54cC5jb20+Cj4gPiBSZXZpZXdlZC1ieTogTWF0dGhpYXMgS2FlaGxja2UgPG1rYUBj aHJvbWl1bS5vcmc+Cj4gPiAtLS0KPiA+ICBkcml2ZXJzL2RldmZyZXEvZGV2ZnJlcS5jIHwgNDYg KysrKysrKysrKysrKysrKysrKysrKysrLS0tLS0tLS0tLS0tLS0tCj4gPiAgaW5jbHVkZS9saW51 eC9kZXZmcmVxLmggICB8ICA5ICsrKystLS0tCj4gPiAgMiBmaWxlcyBjaGFuZ2VkLCAzMyBpbnNl cnRpb25zKCspLCAyMiBkZWxldGlvbnMoLSkKPiA+IAo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMv ZGV2ZnJlcS9kZXZmcmVxLmMgYi9kcml2ZXJzL2RldmZyZXEvZGV2ZnJlcS5jCj4gPiBpbmRleCA3 ODRmM2U0MDUzNmEuLjhiYjdlZmQ4MjFhYiAxMDA2NDQKPiA+IC0tLSBhL2RyaXZlcnMvZGV2ZnJl cS9kZXZmcmVxLmMKPiA+ICsrKyBiL2RyaXZlcnMvZGV2ZnJlcS9kZXZmcmVxLmMKPiA+IEBAIC0x MzcsMTQgKzEzNywxMCBAQCBzdGF0aWMgdm9pZCBnZXRfZnJlcV9yYW5nZShzdHJ1Y3QgZGV2ZnJl cSAqZGV2ZnJlcSwKPiA+ICAJcW9zX21heF9mcmVxID0gZGV2X3BtX3Fvc19yZWFkX3ZhbHVlKGRl dmZyZXEtPmRldi5wYXJlbnQsCj4gPiAgCQkJCQkgICAgIERFVl9QTV9RT1NfTUlOX0ZSRVFVRU5D WSk7Cj4gPiAgCSptaW5fZnJlcSA9IG1heCgqbWluX2ZyZXEsIEhaX1BFUl9LSFogKiBxb3NfbWlu X2ZyZXEpOwo+ID4gIAkqbWF4X2ZyZXEgPSBtaW4oKm1heF9mcmVxLCBIWl9QRVJfS0haICogcW9z X21heF9mcmVxKTsKPiA+ICAKPiA+IC0JLyogY29uc3RyYWludHMgZnJvbSBzeXNmcyAqLwo+ID4g LQkqbWluX2ZyZXEgPSBtYXgoKm1pbl9mcmVxLCBkZXZmcmVxLT5taW5fZnJlcSk7Cj4gPiAtCSpt YXhfZnJlcSA9IG1pbigqbWF4X2ZyZXEsIGRldmZyZXEtPm1heF9mcmVxKTsKPiA+IC0KPiA+ICAJ LyogY29uc3RyYWludHMgZnJvbSBPUFAgaW50ZXJmYWNlICovCj4gPiAgCSptaW5fZnJlcSA9IG1h eCgqbWluX2ZyZXEsIGRldmZyZXEtPnNjYWxpbmdfbWluX2ZyZXEpOwo+ID4gIAkvKiBzY2FsaW5n X21heF9mcmVxIGNhbiBiZSB6ZXJvIG9uIGVycm9yICovCj4gPiAgCWlmIChkZXZmcmVxLT5zY2Fs aW5nX21heF9mcmVxKQo+ID4gIAkJKm1heF9mcmVxID0gbWluKCptYXhfZnJlcSwgZGV2ZnJlcS0+ c2NhbGluZ19tYXhfZnJlcSk7Cj4gPiBAQCAtNjc5LDEwICs2NzUsMTIgQEAgc3RhdGljIHZvaWQg ZGV2ZnJlcV9kZXZfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCj4gPiAgCQkJREVWX1BNX1FP U19NSU5fRlJFUVVFTkNZKTsKPiA+ICAKPiA+ICAJaWYgKGRldmZyZXEtPnByb2ZpbGUtPmV4aXQp Cj4gPiAgCQlkZXZmcmVxLT5wcm9maWxlLT5leGl0KGRldmZyZXEtPmRldi5wYXJlbnQpOwo+ID4g IAo+ID4gKwlkZXZfcG1fcW9zX3JlbW92ZV9yZXF1ZXN0KCZkZXZmcmVxLT51c2VyX21heF9mcmVx X3JlcSk7Cj4gPiArCWRldl9wbV9xb3NfcmVtb3ZlX3JlcXVlc3QoJmRldmZyZXEtPnVzZXJfbWlu X2ZyZXFfcmVxKTsKPiAKPiBQbGVhc2UgY2hlY2sgdGhlIHJldHVybiB2YWx1ZSBpZiBlcnJvciBo YXBwZW4sIGp1c3QgcHJpbnQgdGhlIGVyciB3aXRoIGRldl9lcnIoKQo+IHdpdGhvdXQgc3RvcHBp bmcgdGhlIHJlbGVhc2Ugc3RlcHMuCgpJIHdvbmRlciBpZiBkZXZfd2FybigpIHdvdWxkIGJlIG1v cmUgYXBwcm9wcmlhdGUsIHNpbmNlIHRoZSBjdXJyZW50IG9wZXJhdGlvbgppcyBub3QgYWJvcnRl ZC4KCj4gPiAgCWtmcmVlKGRldmZyZXEtPnRpbWVfaW5fc3RhdGUpOwo+ID4gIAlrZnJlZShkZXZm cmVxLT50cmFuc190YWJsZSk7Cj4gPiAgCW11dGV4X2Rlc3Ryb3koJmRldmZyZXEtPmxvY2spOwo+ ID4gIAlrZnJlZShkZXZmcmVxKTsKPiA+ICB9Cj4gPiBAQCAtNzQ3LDE4ICs3NDUsMjUgQEAgc3Ry dWN0IGRldmZyZXEgKmRldmZyZXFfYWRkX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYsCj4gPiAg CWRldmZyZXEtPnNjYWxpbmdfbWluX2ZyZXEgPSBmaW5kX2F2YWlsYWJsZV9taW5fZnJlcShkZXZm cmVxKTsKPiA+ICAJaWYgKCFkZXZmcmVxLT5zY2FsaW5nX21pbl9mcmVxKSB7Cj4gPiAgCQllcnIg PSAtRUlOVkFMOwo+ID4gIAkJZ290byBlcnJfZGV2Owo+ID4gIAl9Cj4gPiAtCWRldmZyZXEtPm1p bl9mcmVxID0gZGV2ZnJlcS0+c2NhbGluZ19taW5fZnJlcTsKPiA+ICAKPiA+ICAJZGV2ZnJlcS0+ c2NhbGluZ19tYXhfZnJlcSA9IGZpbmRfYXZhaWxhYmxlX21heF9mcmVxKGRldmZyZXEpOwo+ID4g IAlpZiAoIWRldmZyZXEtPnNjYWxpbmdfbWF4X2ZyZXEpIHsKPiA+ICAJCWVyciA9IC1FSU5WQUw7 Cj4gPiAgCQlnb3RvIGVycl9kZXY7Cj4gPiAgCX0KPiA+IC0JZGV2ZnJlcS0+bWF4X2ZyZXEgPSBk ZXZmcmVxLT5zY2FsaW5nX21heF9mcmVxOwo+ID4gKwo+ID4gKwllcnIgPSBkZXZfcG1fcW9zX2Fk ZF9yZXF1ZXN0KGRldiwgJmRldmZyZXEtPnVzZXJfbWluX2ZyZXFfcmVxLAo+ID4gKwkJCQkgICAg IERFVl9QTV9RT1NfTUlOX0ZSRVFVRU5DWSwgMCk7Cj4gPiArCWlmIChlcnIgPCAwKQo+ID4gKwkJ Z290byBlcnJfZGV2Owo+ID4gKwllcnIgPSBkZXZfcG1fcW9zX2FkZF9yZXF1ZXN0KGRldiwgJmRl dmZyZXEtPnVzZXJfbWF4X2ZyZXFfcmVxLAo+ID4gKwkJCQkgICAgIERFVl9QTV9RT1NfTUFYX0ZS RVFVRU5DWSwgUzMyX01BWCk7Cj4gPiArCWlmIChlcnIgPCAwKQo+ID4gKwkJZ290byBlcnJfZGV2 Owo+ID4gIAo+ID4gIAlkZXZmcmVxLT5zdXNwZW5kX2ZyZXEgPSBkZXZfcG1fb3BwX2dldF9zdXNw ZW5kX29wcF9mcmVxKGRldik7Cj4gPiAgCWF0b21pY19zZXQoJmRldmZyZXEtPnN1c3BlbmRfY291 bnQsIDApOwo+ID4gIAo+ID4gIAlkZXZmcmVxLT50cmFuc190YWJsZSA9IGt6YWxsb2MoCj4gPiBA QCAtODQzLDEwICs4NDgsMTQgQEAgc3RydWN0IGRldmZyZXEgKmRldmZyZXFfYWRkX2RldmljZShz dHJ1Y3QgZGV2aWNlICpkZXYsCj4gPiAgZXJyX2RldjoKPiA+ICAJLyoKPiA+ICAJICogQ2xlYW51 cCBwYXRoIGZvciBlcnJvcnMgdGhhdCBoYXBwZW4gYmVmb3JlIHJlZ2lzdHJhdGlvbi4KPiA+ICAJ ICogT3RoZXJ3aXNlIHdlIHJlbHkgb24gZGV2ZnJlcV9kZXZfcmVsZWFzZS4KPiA+ICAJICovCj4g PiArCWlmIChkZXZfcG1fcW9zX3JlcXVlc3RfYWN0aXZlKCZkZXZmcmVxLT51c2VyX21heF9mcmVx X3JlcSkpCj4gPiArCQlkZXZfcG1fcW9zX3JlbW92ZV9yZXF1ZXN0KCZkZXZmcmVxLT51c2VyX21h eF9mcmVxX3JlcSk7Cj4gCj4gUGxlYXNlIGNoZWNrIHRoZSByZXR1cm4gdmFsdWUgaWYgZXJyb3Ig aGFwcGVuLCBqdXN0IHByaW50IHRoZSBlcnIgd2l0aCBkZXZfZXJyKCkKPiB3aXRob3V0IHN0b3Bw aW5nIHRoZSByZWxlYXNlIHN0ZXBzLgo+IAo+IAlkZXZfZXJyKC4uLiAiZmFpbGVkIHRvIHJlbW92 ZSByZXF1ZXN0IG9mIERFVl9QTV9RT1NfTUFYX0ZSRVFVRU5DWVxuIik7CgpkZXZfd2FybigpIGZv ciB0aGUgc2FtZSByZWFzb24gYXMgYWJvdmU/CgpJIHRoaW5rIHRoZSBtZXNzYWdlIHdvdWxkIGJl IGJldHRlciB3aXRoIGEgc2xpZ2h0IGNoYW5nZToKCiJmYWlsZWQgdG8gcmVtb3ZlIERFVl9QTV9R T1NfTUFYX0ZSRVFVRU5DWSByZXF1ZXN0XG4iCgo+IAo+ID4gKwlpZiAoZGV2X3BtX3Fvc19yZXF1 ZXN0X2FjdGl2ZSgmZGV2ZnJlcS0+dXNlcl9taW5fZnJlcV9yZXEpKQo+ID4gKwkJZGV2X3BtX3Fv c19yZW1vdmVfcmVxdWVzdCgmZGV2ZnJlcS0+dXNlcl9taW5fZnJlcV9yZXEpOwo+IAkKPiAJZGV2 X2VyciguLi4gImZhaWxlZCB0byByZW1vdmUgcmVxdWVzdCBvZiBERVZfUE1fUU9TX01JTl9GUkVR VUVOQ1lcbiIpOwoKZGl0dG8KCj4gPiAgCWtmcmVlKGRldmZyZXEtPnRpbWVfaW5fc3RhdGUpOwo+ ID4gIAlrZnJlZShkZXZmcmVxLT50cmFuc190YWJsZSk7Cj4gPiAgCWtmcmVlKGRldmZyZXEpOwo+ ID4gIGVycl9vdXQ6Cj4gPiAgCXJldHVybiBFUlJfUFRSKGVycik7Cj4gPiBAQCAtMTQwNywxNCAr MTQxNiwxNSBAQCBzdGF0aWMgc3NpemVfdCBtaW5fZnJlcV9zdG9yZShzdHJ1Y3QgZGV2aWNlICpk ZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAo+ID4gIAo+ID4gIAlyZXQgPSBzc2Nh bmYoYnVmLCAiJWx1IiwgJnZhbHVlKTsKPiA+ICAJaWYgKHJldCAhPSAxKQo+ID4gIAkJcmV0dXJu IC1FSU5WQUw7Cj4gPiAgCj4gPiAtCW11dGV4X2xvY2soJmRmLT5sb2NrKTsKPiA+IC0JZGYtPm1p bl9mcmVxID0gdmFsdWU7Cj4gPiAtCXVwZGF0ZV9kZXZmcmVxKGRmKTsKPiA+IC0JbXV0ZXhfdW5s b2NrKCZkZi0+bG9jayk7Cj4gPiArCS8qIHJvdW5kIGRvd24gdG8ga0h6IGZvciBQTSBRb1MgKi8K PiAKPiBJIHByZWZlciBtb3JlIGRldGFpbGVkIGRlc2NyaXB0aW9uIGFzIGZvbGxvd2luZzoKPiAK PiAJLyoKPiAJICogUm91bmQgZG93biB0byBLSHogdG8gZGVjaWRlIHRoZSBwcm9wZXIgbWluaW11 bSBmcmVxdWVuY3kKCml0IHNob3VsZCBiZSBrSHosIHdpdGggYSBsb3dlci1jYXNlICdrJywgYXMg aW4gdGhlIG9yaWdpbmFsIGNvbW1lbnQuCgo+IAkgKiB3aGljaCBpcyBjbG9zZWQgdG8gdXNlciBy ZXF1ZXN0Lgo+ICAJICovCgpUaGUgY29tbWVudCB5b3Ugc3VnZ2VzdCBkb2Vzbid0IHByb3ZpZGUg YW55IGluZm9ybWF0aW9uIGFib3V0IHdoeSB0aGUKY29udmVyc2lvbiB0byBrSHogaXMgZG9uZSwg aW4gdGhpcyBzZW5zZSB0aGUgb3JpZ2luYWwgY29tbWVudCB0aGF0Cm1lbnRpb25zIFBNIFFvUyBw cm92aWRlcyBtb3JlIHZhbHVlLgoKV2l0aCB3aGF0ZXZlciB3ZSBlbmQgdXAsIEkgc3VnZ2VzdCB0 byB1c2UgJ2NvbnZlcnQnIGluc3RlYWQgb2YKJ3JvdW5kIGRvd24nLgoKPiA+ICsJcmV0ID0gZGV2 X3BtX3Fvc191cGRhdGVfcmVxdWVzdCgmZGYtPnVzZXJfbWluX2ZyZXFfcmVxLAo+ID4gKwkJCQkJ dmFsdWUgLyBIWl9QRVJfS0haKTsKPiA+ICsJaWYgKHJldCA8IDApCj4gPiArCQlyZXR1cm4gcmV0 Owo+ID4gIAo+ID4gIAlyZXR1cm4gY291bnQ7Cj4gPiAgfQo+ID4gIAo+ID4gIHN0YXRpYyBzc2l6 ZV90IG1pbl9mcmVxX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJp YnV0ZSAqYXR0ciwKPiA+IEBAIC0xNDM5LDE5ICsxNDQ5LDE5IEBAIHN0YXRpYyBzc2l6ZV90IG1h eF9mcmVxX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUg KmF0dHIsCj4gPiAgCj4gPiAgCXJldCA9IHNzY2FuZihidWYsICIlbHUiLCAmdmFsdWUpOwo+ID4g IAlpZiAocmV0ICE9IDEpCj4gPiAgCQlyZXR1cm4gLUVJTlZBTDsKPiA+ICAKPiA+IC0JbXV0ZXhf bG9jaygmZGYtPmxvY2spOwo+ID4gLQo+ID4gLQkvKiBJbnRlcnByZXQgemVybyBhcyAiZG9uJ3Qg Y2FyZSIgKi8KPiA+IC0JaWYgKCF2YWx1ZSkKPiA+IC0JCXZhbHVlID0gVUxPTkdfTUFYOwo+ID4g KwkvKiByb3VuZCB1cCB0byBrSHogZm9yIFBNIFFvUyBhbmQgaW50ZXJwcmV0IHplcm8gYXMgImRv bid0IGNhcmUiICovCj4gCj4gSSB0aGluayB0aGF0ICJkb24ndCBjYXJlIiBjb21tZW50IHN0eWxl IGlzIG5vdCBnb29kLgo+IAo+IEkgcmVmZXJyZWQgdG8gdGhlIERvY3VtZW50YXRpb24vQUJJL3Rl c3Rpbmcvc3lzZnMtY2xhc3MtZGV2ZnJlcSBmaWxlLgo+IEkgcHJlZmVyIG1vcmUgZGV0YWlsZWQg ZGVzY3JpcHRpb24gYXMgZm9sbG93aW5nOgo+IAkvKgo+IAkgKiBSb3VuZCB1cCB0byBLSHogdG8g ZGVjaWRlIHRoZSBwcm9wZXIgbWF4aW11bSBmcmVxdWVuY3kKCmtIegoKPiAJICogd2hpY2ggaXMg Y2xvc2VkIHRvIHVzZXIgcmVxdWVzdC4gSWYgdmFsdWUgaXMgemVybywKPiAJICogdGhlIHVzZXIg ZG9lcyBub3QgY2FyZS4KCiJ0aGUgdXNlciBkb2VzIG5vdCBjYXJlIiBpcyBzdGlsbCB2ZXJ5IGNh c3VhbCB5b3UgZGlkbid0IGxpa2UgaW5pdGlhbGx5LgpIb3cgYWJvdXQgIkEgdmFsdWUgb2YgemVy byBpcyBpbnRlcnByZXRlZCBhcyAnbm8gbGltaXQnLiI/CgpBcyBmb3IgdGhlIG1pbiBmcmVxLCBJ IHRoaW5rIFBNIFFvUyBzaG91bGQgYmUgbWVudGlvbmVkIHRvIG1ha2UgY2xlYXIgd2h5CnRoZSBj b252ZXJzaW9uIHRvIGtIeiBpcyBuZWVkZWQuCgo+ICAJICovCj4gCj4gCj4gPiArCWlmICh2YWx1 ZSkKPiA+ICsJCXZhbHVlID0gRElWX1JPVU5EX1VQKHZhbHVlLCBIWl9QRVJfS0haKTsKPiA+ICsJ ZWxzZQo+ID4gKwkJdmFsdWUgPSBTMzJfTUFYOwo+ID4gIAo+ID4gLQlkZi0+bWF4X2ZyZXEgPSB2 YWx1ZTsKPiA+IC0JdXBkYXRlX2RldmZyZXEoZGYpOwo+ID4gLQltdXRleF91bmxvY2soJmRmLT5s b2NrKTsKPiA+ICsJcmV0ID0gZGV2X3BtX3Fvc191cGRhdGVfcmVxdWVzdCgmZGYtPnVzZXJfbWF4 X2ZyZXFfcmVxLCB2YWx1ZSk7Cj4gPiArCWlmIChyZXQgPCAwKQo+ID4gKwkJcmV0dXJuIHJldDsK PiA+ICAKPiA+ICAJcmV0dXJuIGNvdW50Owo+ID4gIH0KPiA+ICBzdGF0aWMgREVWSUNFX0FUVFJf UlcobWluX2ZyZXEpOwo+ID4gIAo+ID4gZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZGV2ZnJl cS5oIGIvaW5jbHVkZS9saW51eC9kZXZmcmVxLmgKPiA+IGluZGV4IGRhYzBkZmZlYWJiNC4uNzg0 OWZlNGM2NjZkIDEwMDY0NAo+ID4gLS0tIGEvaW5jbHVkZS9saW51eC9kZXZmcmVxLmgKPiA+ICsr KyBiL2luY2x1ZGUvbGludXgvZGV2ZnJlcS5oCj4gPiBAQCAtMTEsMTAgKzExLDExIEBACj4gPiAg I2RlZmluZSBfX0xJTlVYX0RFVkZSRVFfSF9fCj4gPiAgCj4gPiAgI2luY2x1ZGUgPGxpbnV4L2Rl dmljZS5oPgo+ID4gICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgo+ID4gICNpbmNsdWRlIDxs aW51eC9wbV9vcHAuaD4KPiA+ICsjaW5jbHVkZSA8bGludXgvcG1fcW9zLmg+Cj4gPiAgCj4gPiAg I2RlZmluZSBERVZGUkVRX05BTUVfTEVOIDE2Cj4gPiAgCj4gPiAgLyogREVWRlJFUSBnb3Zlcm5v ciBuYW1lICovCj4gPiAgI2RlZmluZSBERVZGUkVRX0dPVl9TSU1QTEVfT05ERU1BTkQJInNpbXBs ZV9vbmRlbWFuZCIKPiA+IEBAIC0xMjEsMTIgKzEyMiwxMiBAQCBzdHJ1Y3QgZGV2ZnJlcV9kZXZf cHJvZmlsZSB7Cj4gPiAgICoJCWRldmZyZXEubmIgdG8gdGhlIGNvcnJlc3BvbmRpbmcgcmVnaXN0 ZXIgbm90aWZpZXIgY2FsbCBjaGFpbi4KPiA+ICAgKiBAd29yazoJZGVsYXllZCB3b3JrIGZvciBs b2FkIG1vbml0b3JpbmcuCj4gPiAgICogQHByZXZpb3VzX2ZyZXE6CXByZXZpb3VzbHkgY29uZmln dXJlZCBmcmVxdWVuY3kgdmFsdWUuCj4gPiAgICogQGRhdGE6CVByaXZhdGUgZGF0YSBvZiB0aGUg Z292ZXJub3IuIFRoZSBkZXZmcmVxIGZyYW1ld29yayBkb2VzIG5vdAo+ID4gICAqCQl0b3VjaCB0 aGlzLgo+ID4gLSAqIEBtaW5fZnJlcToJTGltaXQgbWluaW11bSBmcmVxdWVuY3kgcmVxdWVzdGVk IGJ5IHVzZXIgKDA6IG5vbmUpCj4gPiAtICogQG1heF9mcmVxOglMaW1pdCBtYXhpbXVtIGZyZXF1 ZW5jeSByZXF1ZXN0ZWQgYnkgdXNlciAoMDogbm9uZSkKPiA+ICsgKiBAdXNlcl9taW5fZnJlcV9y ZXE6CVBNIFFvUyBtaW4gZnJlcXVlbmN5IHJlcXVlc3QgZnJvbSB1c2VyICh2aWEgc3lzZnMpCj4g Cj4gbWluIC0+IG1pbmltdW0gYW5kIHRoZW4gcmVtb3ZlIHBhcmVudGhlc2lzIGFzIGZvbGxvd2lu ZzoKPiAJUE0gUW9TIG1pbmltdW0gZnJlcXVlbmN5IHJlcXVlc3QgYnkgdXNlciB2aWEgc3lzZnMK PiAKPiA+ICsgKiBAdXNlcl9tYXhfZnJlcV9yZXE6CVBNIFFvUyBtYXggZnJlcXVlbmN5IHJlcXVl c3QgZnJvbSB1c2VyICh2aWEgc3lzZnMpCj4gCj4gZGl0dG8uIG1heCAtPiBtYXhpbXVtCj4gCVBN IFFvUyBtYXhpbXVtIGZyZXF1ZW5jeSByZXF1ZXN0IGJ5IHVzZXIgdmlhIHN5c2ZzCj4gCj4gPiAg ICogQHNjYWxpbmdfbWluX2ZyZXE6CUxpbWl0IG1pbmltdW0gZnJlcXVlbmN5IHJlcXVlc3RlZCBi eSBPUFAgaW50ZXJmYWNlCj4gPiAgICogQHNjYWxpbmdfbWF4X2ZyZXE6CUxpbWl0IG1heGltdW0g ZnJlcXVlbmN5IHJlcXVlc3RlZCBieSBPUFAgaW50ZXJmYWNlCj4gPiAgICogQHN0b3BfcG9sbGlu ZzoJIGRldmZyZXEgcG9sbGluZyBzdGF0dXMgb2YgYSBkZXZpY2UuCj4gPiAgICogQHN1c3BlbmRf ZnJlcToJIGZyZXF1ZW5jeSBvZiBhIGRldmljZSBzZXQgZHVyaW5nIHN1c3BlbmQgcGhhc2UuCj4g PiAgICogQHJlc3VtZV9mcmVxOgkgZnJlcXVlbmN5IG9mIGEgZGV2aWNlIHNldCBpbiByZXN1bWUg cGhhc2UuCj4gPiBAQCAtMTYxLDEyICsxNjIsMTIgQEAgc3RydWN0IGRldmZyZXEgewo+ID4gIAl1 bnNpZ25lZCBsb25nIHByZXZpb3VzX2ZyZXE7Cj4gPiAgCXN0cnVjdCBkZXZmcmVxX2Rldl9zdGF0 dXMgbGFzdF9zdGF0dXM7Cj4gPiAgCj4gPiAgCXZvaWQgKmRhdGE7IC8qIHByaXZhdGUgZGF0YSBm b3IgZ292ZXJub3JzICovCj4gPiAgCj4gPiAtCXVuc2lnbmVkIGxvbmcgbWluX2ZyZXE7Cj4gPiAt CXVuc2lnbmVkIGxvbmcgbWF4X2ZyZXE7Cj4gPiArCXN0cnVjdCBkZXZfcG1fcW9zX3JlcXVlc3Qg dXNlcl9taW5fZnJlcV9yZXE7Cj4gPiArCXN0cnVjdCBkZXZfcG1fcW9zX3JlcXVlc3QgdXNlcl9t YXhfZnJlcV9yZXE7Cj4gPiAgCXVuc2lnbmVkIGxvbmcgc2NhbGluZ19taW5fZnJlcTsKPiA+ICAJ dW5zaWduZWQgbG9uZyBzY2FsaW5nX21heF9mcmVxOwo+ID4gIAlib29sIHN0b3BfcG9sbGluZzsK PiA+ICAKPiA+ICAJdW5zaWduZWQgbG9uZyBzdXNwZW5kX2ZyZXE7Cj4gPiAKPiAKPiAKPiAtLSAK PiBCZXN0IFJlZ2FyZHMsCj4gQ2hhbndvbyBDaG9pCj4gU2Ftc3VuZyBFbGVjdHJvbmljcwoKX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgtYXJtLWtl cm5lbCBtYWlsaW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0 dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5l bAo=