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 03CF5C4360C for ; Thu, 26 Sep 2019 16:04:51 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id B278221D6C for ; Thu, 26 Sep 2019 16:04:50 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="NUd98sVK" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727273AbfIZQEu (ORCPT ); Thu, 26 Sep 2019 12:04:50 -0400 Received: from mail-pf1-f196.google.com ([209.85.210.196]:33957 "EHLO mail-pf1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727209AbfIZQEu (ORCPT ); Thu, 26 Sep 2019 12:04:50 -0400 Received: by mail-pf1-f196.google.com with SMTP id b128so2120821pfa.1 for ; Thu, 26 Sep 2019 09:04:49 -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=AmlgghEnTm4dlVlgTgUfs9dm9WGzckYupWFhC473QLY=; b=NUd98sVKEBebrSrEUX6zXgBO6NqeAisKf1qd3pvsND7SbWcWaOHSxsDSNnPdHaHjH+ jz/D1wTcPti3AgAEbzATrC5izl5qOQn7oaaHF8GhMxV3DQoYiiQHlWbQsTKcfxw8PLOE q4E6k903iudy6saT/z1afr2/JGIjFxeHmQyWo= 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=AmlgghEnTm4dlVlgTgUfs9dm9WGzckYupWFhC473QLY=; b=b4+7e+wjj57hL+PRgZclSO8pYLTj7IGMMucTCeBG7WuE1QtezoS6HbT2vKP6V3chk7 STj+47UR6M47yE7dRVDFCXGapYTVPwucyBgZK1X5ZGrKr2yOScjq11A67vXQNz3wpkzt b0uOJdDjq+ujoVdR0ggckFHxlTIaFtLBNA7qdKUPOYRo077apwHPygUoeD/ZH8mZs0rN 5OX2hvaFFnpoXNsm/xXkU2BO9oVAO3ilT0aUTSQ4BeWcJnVD4a+kRtMEhEgruAZQfMOS sJ56ycdul1L+s4zhh0W5EKZXJV6I8N1CB6GuXWp5+lY2+RjBnJA6zMY2+l2O1vsPVAZj 8vAg== X-Gm-Message-State: APjAAAXFetwWYxrt8/9tCZhoo6LS1pIeBsoP/CcO3VAgP+vyFdLmgAIY xlmcJgeEdvLhHpCy/SQn8dU3jQ== X-Google-Smtp-Source: APXvYqyAZNrFd8SjZlx9W6Dxxyobn/6DZ89tVcEKUx4YfR45nbD0lm89VWtDJBDZOdx/OrTPy3kcCA== X-Received: by 2002:a62:8647:: with SMTP id x68mr4630322pfd.44.1569513889264; Thu, 26 Sep 2019 09:04:49 -0700 (PDT) Received: from localhost ([2620:15c:202:1:75a:3f6e:21d:9374]) by smtp.gmail.com with ESMTPSA id q13sm2938026pjq.0.2019.09.26.09.04.47 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 26 Sep 2019 09:04:48 -0700 (PDT) Date: Thu, 26 Sep 2019 09:04:45 -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: <20190926160445.GO133864@google.com> References: <3eb8a1d1e7d738f7599d54348d6b474196581693.1569319738.git.leonard.crestez@nxp.com> <20190925164513.GM133864@google.com> <81b136fc-0613-08f8-cb26-6243e7be621b@samsung.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <81b136fc-0613-08f8-cb26-6243e7be621b@samsung.com> 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 Thu, Sep 26, 2019 at 10:25:41AM +0900, Chanwoo Choi wrote: > On 19. 9. 26. 오전 1:45, Matthias Kaehlcke wrote: > > 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? > > Actually, I think that is not critical error but need to print the error > So, I think that dev_err() is enough. If this thing is critical, > better to use dev_warn. We agree that this is not critical, but not when to use dev_err() and dev_warn(). You seem to imply that dev_warn() is more severe than dev_err(), however it's the other way around: #define KERN_ERR KERN_SOH "3" /* error conditions */ #define KERN_WARNING KERN_SOH "4" /* warning conditions */ #define KERN_NOTICE KERN_SOH "5" /* normal but significant condition */ I think in this case you can go either way, it's certainly an error, but the driver continues with the normal execution path. > > > > I think the message would be better with a slight change: > > > > "failed to remove DEV_PM_QOS_MAX_FREQUENCY request\n" > > OK. > > > > >> > >>> + 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. > > Good. > > > > >> * 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'. > > I agree to use 'convert' instead of 'round down' > if some expression indicates the correct meaning. > > > > >>> + 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. > > Agree. I expect that Leonard will mention that. > > > > >> */ > >> > >> > >>> + 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 > > > > > > > -- > 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 7A058C4360C for ; Thu, 26 Sep 2019 16:05:07 +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 43CCB222CB for ; Thu, 26 Sep 2019 16:05:07 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="lBIQ/Y4i"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="NUd98sVK" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 43CCB222CB 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=9cFZzG8oGP//q2rEYO9Bu5pzbZ+ww96i2jdZgexHzJc=; b=lBIQ/Y4iMFoDcN n1EQ1kSslPCL5jpRKomhYH6xn3wI1E7F67CSF9YMKlfsBgTFOs1wJmbOizS8dRMz1nKGSTfk/kEmp RowSKh3xNkvVvNv0QNFnM2bpue+QeSrfMpD02tp3rvJDokvn0bWGdOrwJZoBWs2zlAvJrrWeGfSTB AcNUGmQvz/GMr4hlZiCsuvM/95wnr/pifBYw4LUMtwPS/iFHDsb07fA6tSTciXV2n33gMmgtgPQER UA+xqcs5KQ53VCBGbj5pHCDk97SxUf9PgmI4i8VMFlPTVrWiFIXCs6bLuRgeY+NzQ3Use262HMz22 DEDGBQqzTDDxuKF1im6g==; 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 1iDWGF-0000vD-8C; Thu, 26 Sep 2019 16:04:55 +0000 Received: from mail-pf1-x444.google.com ([2607:f8b0:4864:20::444]) by bombadil.infradead.org with esmtps (Exim 4.92.2 #3 (Red Hat Linux)) id 1iDWGB-0000uE-4J for linux-arm-kernel@lists.infradead.org; Thu, 26 Sep 2019 16:04:53 +0000 Received: by mail-pf1-x444.google.com with SMTP id q5so2063721pfg.13 for ; Thu, 26 Sep 2019 09:04:49 -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=AmlgghEnTm4dlVlgTgUfs9dm9WGzckYupWFhC473QLY=; b=NUd98sVKEBebrSrEUX6zXgBO6NqeAisKf1qd3pvsND7SbWcWaOHSxsDSNnPdHaHjH+ jz/D1wTcPti3AgAEbzATrC5izl5qOQn7oaaHF8GhMxV3DQoYiiQHlWbQsTKcfxw8PLOE q4E6k903iudy6saT/z1afr2/JGIjFxeHmQyWo= 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=AmlgghEnTm4dlVlgTgUfs9dm9WGzckYupWFhC473QLY=; b=rdIG9nhLpts2QKuI63QvTikYpZxRKzTtggWok6O39dxbf5xg96md0+v/Jh3PikOt2I q6eCAzShhbe0D5TM+CU42Xe275q+tt8L9w3raXEFbjtVLForDj/v3a5aSofWYXl+ldPq JFMtWORurqq95shbP9esiQ9TsyD/FifbSMz+Z1Hy6Vy52x2/bLzItnIKHQXFhgCfwVGV mW1oZZaH1U2LvxCh9yLHdqmwHoClPJNm5n+YFoGXiMt4GMN8scNkY8lREU8O/yWWxWcW kZmIbr1AKOKw/goGn678053xhbex3guvJt+MNAllNzNZwLBdE/KHjW0zqQaffWPhYrgI VExg== X-Gm-Message-State: APjAAAXgTGUHbf7IVwhxwF8m79JvfGnWTi+ydP8IFx5O42zMvk/Beqrf W3HOU/JJq4j/WwYvdUO0MYo7EA== X-Google-Smtp-Source: APXvYqyAZNrFd8SjZlx9W6Dxxyobn/6DZ89tVcEKUx4YfR45nbD0lm89VWtDJBDZOdx/OrTPy3kcCA== X-Received: by 2002:a62:8647:: with SMTP id x68mr4630322pfd.44.1569513889264; Thu, 26 Sep 2019 09:04:49 -0700 (PDT) Received: from localhost ([2620:15c:202:1:75a:3f6e:21d:9374]) by smtp.gmail.com with ESMTPSA id q13sm2938026pjq.0.2019.09.26.09.04.47 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 26 Sep 2019 09:04:48 -0700 (PDT) Date: Thu, 26 Sep 2019 09:04:45 -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: <20190926160445.GO133864@google.com> References: <3eb8a1d1e7d738f7599d54348d6b474196581693.1569319738.git.leonard.crestez@nxp.com> <20190925164513.GM133864@google.com> <81b136fc-0613-08f8-cb26-6243e7be621b@samsung.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <81b136fc-0613-08f8-cb26-6243e7be621b@samsung.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-20190926_090451_200790_7CAD9F7D X-CRM114-Status: GOOD ( 33.53 ) 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 T24gVGh1LCBTZXAgMjYsIDIwMTkgYXQgMTA6MjU6NDFBTSArMDkwMCwgQ2hhbndvbyBDaG9pIHdy b3RlOgo+IE9uIDE5LiA5LiAyNi4g7Jik7KCEIDE6NDUsIE1hdHRoaWFzIEthZWhsY2tlIHdyb3Rl Ogo+ID4gT24gV2VkLCBTZXAgMjUsIDIwMTkgYXQgMTE6NDE6MDdBTSArMDkwMCwgQ2hhbndvbyBD aG9pIHdyb3RlOgo+ID4+IE9uIDE5LiA5LiAyNC4g7Jik7ZuEIDc6MTEsIExlb25hcmQgQ3Jlc3Rl eiB3cm90ZToKPiA+Pj4gU3dpdGNoIHRoZSBoYW5kbGluZyBvZiBtaW5fZnJlcSBhbmQgbWF4X2Zy ZXEgZnJvbSBzeXNmcyB0byB1c2UgdGhlCj4gPj4+IGRldl9wbV9xb3NfcmVxdWVzdCBpbnRlcmZh Y2UuCj4gPj4+Cj4gPj4+IFNpbmNlIFBNIFFvUyBoYW5kbGVzIGZyZXF1ZW5jaWVzIGFzIGtIeiB0 aGlzIGNoYW5nZSByZWR1Y2VzIHRoZQo+ID4+PiBwcmVjaXNpb24gb2YgbWluX2ZyZXEgYW5kIG1h eF9mcmVxLiBUaGlzIHNob3VsZG4ndCBpbnRyb2R1Y2UgcHJvYmxlbXMKPiA+Pj4gYmVjYXVzZSBm cmVxdWVuY2llcyB3aGljaCBhcmUgbm90IGFuIGludGVnZXIgbnVtYmVyIG9mIGtIeiBhcmUgbGlr ZWx5Cj4gPj4+IG5vdCBhbiBpbnRlZ2VyIG51bWJlciBvZiBIeiBlaXRoZXIuCj4gPj4+Cj4gPj4+ IFRyeSB0byBlbnN1cmUgY29tcGF0aWJpbGl0eSBieSByb3VuZGluZyBtaW4gdmFsdWVzIGRvd24g YW5kIHJvdW5kaW5nCj4gPj4+IG1heCB2YWx1ZXMgdXAuCj4gPj4+Cj4gPj4+IFNpZ25lZC1vZmYt Ynk6IExlb25hcmQgQ3Jlc3RleiA8bGVvbmFyZC5jcmVzdGV6QG54cC5jb20+Cj4gPj4+IFJldmll d2VkLWJ5OiBNYXR0aGlhcyBLYWVobGNrZSA8bWthQGNocm9taXVtLm9yZz4KPiA+Pj4gLS0tCj4g Pj4+ICBkcml2ZXJzL2RldmZyZXEvZGV2ZnJlcS5jIHwgNDYgKysrKysrKysrKysrKysrKysrKysr KysrLS0tLS0tLS0tLS0tLS0tCj4gPj4+ICBpbmNsdWRlL2xpbnV4L2RldmZyZXEuaCAgIHwgIDkg KysrKy0tLS0KPiA+Pj4gIDIgZmlsZXMgY2hhbmdlZCwgMzMgaW5zZXJ0aW9ucygrKSwgMjIgZGVs ZXRpb25zKC0pCj4gPj4+Cj4gPj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2RldmZyZXEvZGV2ZnJl cS5jIGIvZHJpdmVycy9kZXZmcmVxL2RldmZyZXEuYwo+ID4+PiBpbmRleCA3ODRmM2U0MDUzNmEu LjhiYjdlZmQ4MjFhYiAxMDA2NDQKPiA+Pj4gLS0tIGEvZHJpdmVycy9kZXZmcmVxL2RldmZyZXEu Ywo+ID4+PiArKysgYi9kcml2ZXJzL2RldmZyZXEvZGV2ZnJlcS5jCj4gPj4+IEBAIC0xMzcsMTQg KzEzNywxMCBAQCBzdGF0aWMgdm9pZCBnZXRfZnJlcV9yYW5nZShzdHJ1Y3QgZGV2ZnJlcSAqZGV2 ZnJlcSwKPiA+Pj4gIAlxb3NfbWF4X2ZyZXEgPSBkZXZfcG1fcW9zX3JlYWRfdmFsdWUoZGV2ZnJl cS0+ZGV2LnBhcmVudCwKPiA+Pj4gIAkJCQkJICAgICBERVZfUE1fUU9TX01JTl9GUkVRVUVOQ1kp Owo+ID4+PiAgCSptaW5fZnJlcSA9IG1heCgqbWluX2ZyZXEsIEhaX1BFUl9LSFogKiBxb3NfbWlu X2ZyZXEpOwo+ID4+PiAgCSptYXhfZnJlcSA9IG1pbigqbWF4X2ZyZXEsIEhaX1BFUl9LSFogKiBx b3NfbWF4X2ZyZXEpOwo+ID4+PiAgCj4gPj4+IC0JLyogY29uc3RyYWludHMgZnJvbSBzeXNmcyAq Lwo+ID4+PiAtCSptaW5fZnJlcSA9IG1heCgqbWluX2ZyZXEsIGRldmZyZXEtPm1pbl9mcmVxKTsK PiA+Pj4gLQkqbWF4X2ZyZXEgPSBtaW4oKm1heF9mcmVxLCBkZXZmcmVxLT5tYXhfZnJlcSk7Cj4g Pj4+IC0KPiA+Pj4gIAkvKiBjb25zdHJhaW50cyBmcm9tIE9QUCBpbnRlcmZhY2UgKi8KPiA+Pj4g IAkqbWluX2ZyZXEgPSBtYXgoKm1pbl9mcmVxLCBkZXZmcmVxLT5zY2FsaW5nX21pbl9mcmVxKTsK PiA+Pj4gIAkvKiBzY2FsaW5nX21heF9mcmVxIGNhbiBiZSB6ZXJvIG9uIGVycm9yICovCj4gPj4+ ICAJaWYgKGRldmZyZXEtPnNjYWxpbmdfbWF4X2ZyZXEpCj4gPj4+ICAJCSptYXhfZnJlcSA9IG1p bigqbWF4X2ZyZXEsIGRldmZyZXEtPnNjYWxpbmdfbWF4X2ZyZXEpOwo+ID4+PiBAQCAtNjc5LDEw ICs2NzUsMTIgQEAgc3RhdGljIHZvaWQgZGV2ZnJlcV9kZXZfcmVsZWFzZShzdHJ1Y3QgZGV2aWNl ICpkZXYpCj4gPj4+ICAJCQlERVZfUE1fUU9TX01JTl9GUkVRVUVOQ1kpOwo+ID4+PiAgCj4gPj4+ ICAJaWYgKGRldmZyZXEtPnByb2ZpbGUtPmV4aXQpCj4gPj4+ICAJCWRldmZyZXEtPnByb2ZpbGUt PmV4aXQoZGV2ZnJlcS0+ZGV2LnBhcmVudCk7Cj4gPj4+ICAKPiA+Pj4gKwlkZXZfcG1fcW9zX3Jl bW92ZV9yZXF1ZXN0KCZkZXZmcmVxLT51c2VyX21heF9mcmVxX3JlcSk7Cj4gPj4+ICsJZGV2X3Bt X3Fvc19yZW1vdmVfcmVxdWVzdCgmZGV2ZnJlcS0+dXNlcl9taW5fZnJlcV9yZXEpOwo+ID4+Cj4g Pj4gUGxlYXNlIGNoZWNrIHRoZSByZXR1cm4gdmFsdWUgaWYgZXJyb3IgaGFwcGVuLCBqdXN0IHBy aW50IHRoZSBlcnIgd2l0aCBkZXZfZXJyKCkKPiA+PiB3aXRob3V0IHN0b3BwaW5nIHRoZSByZWxl YXNlIHN0ZXBzLgo+ID4gCj4gPiBJIHdvbmRlciBpZiBkZXZfd2FybigpIHdvdWxkIGJlIG1vcmUg YXBwcm9wcmlhdGUsIHNpbmNlIHRoZSBjdXJyZW50IG9wZXJhdGlvbgo+ID4gaXMgbm90IGFib3J0 ZWQuCj4gPiAKPiA+Pj4gIAlrZnJlZShkZXZmcmVxLT50aW1lX2luX3N0YXRlKTsKPiA+Pj4gIAlr ZnJlZShkZXZmcmVxLT50cmFuc190YWJsZSk7Cj4gPj4+ICAJbXV0ZXhfZGVzdHJveSgmZGV2ZnJl cS0+bG9jayk7Cj4gPj4+ICAJa2ZyZWUoZGV2ZnJlcSk7Cj4gPj4+ICB9Cj4gPj4+IEBAIC03NDcs MTggKzc0NSwyNSBAQCBzdHJ1Y3QgZGV2ZnJlcSAqZGV2ZnJlcV9hZGRfZGV2aWNlKHN0cnVjdCBk ZXZpY2UgKmRldiwKPiA+Pj4gIAlkZXZmcmVxLT5zY2FsaW5nX21pbl9mcmVxID0gZmluZF9hdmFp bGFibGVfbWluX2ZyZXEoZGV2ZnJlcSk7Cj4gPj4+ICAJaWYgKCFkZXZmcmVxLT5zY2FsaW5nX21p bl9mcmVxKSB7Cj4gPj4+ICAJCWVyciA9IC1FSU5WQUw7Cj4gPj4+ICAJCWdvdG8gZXJyX2RldjsK PiA+Pj4gIAl9Cj4gPj4+IC0JZGV2ZnJlcS0+bWluX2ZyZXEgPSBkZXZmcmVxLT5zY2FsaW5nX21p bl9mcmVxOwo+ID4+PiAgCj4gPj4+ICAJZGV2ZnJlcS0+c2NhbGluZ19tYXhfZnJlcSA9IGZpbmRf YXZhaWxhYmxlX21heF9mcmVxKGRldmZyZXEpOwo+ID4+PiAgCWlmICghZGV2ZnJlcS0+c2NhbGlu Z19tYXhfZnJlcSkgewo+ID4+PiAgCQllcnIgPSAtRUlOVkFMOwo+ID4+PiAgCQlnb3RvIGVycl9k ZXY7Cj4gPj4+ICAJfQo+ID4+PiAtCWRldmZyZXEtPm1heF9mcmVxID0gZGV2ZnJlcS0+c2NhbGlu Z19tYXhfZnJlcTsKPiA+Pj4gKwo+ID4+PiArCWVyciA9IGRldl9wbV9xb3NfYWRkX3JlcXVlc3Qo ZGV2LCAmZGV2ZnJlcS0+dXNlcl9taW5fZnJlcV9yZXEsCj4gPj4+ICsJCQkJICAgICBERVZfUE1f UU9TX01JTl9GUkVRVUVOQ1ksIDApOwo+ID4+PiArCWlmIChlcnIgPCAwKQo+ID4+PiArCQlnb3Rv IGVycl9kZXY7Cj4gPj4+ICsJZXJyID0gZGV2X3BtX3Fvc19hZGRfcmVxdWVzdChkZXYsICZkZXZm cmVxLT51c2VyX21heF9mcmVxX3JlcSwKPiA+Pj4gKwkJCQkgICAgIERFVl9QTV9RT1NfTUFYX0ZS RVFVRU5DWSwgUzMyX01BWCk7Cj4gPj4+ICsJaWYgKGVyciA8IDApCj4gPj4+ICsJCWdvdG8gZXJy X2RldjsKPiA+Pj4gIAo+ID4+PiAgCWRldmZyZXEtPnN1c3BlbmRfZnJlcSA9IGRldl9wbV9vcHBf Z2V0X3N1c3BlbmRfb3BwX2ZyZXEoZGV2KTsKPiA+Pj4gIAlhdG9taWNfc2V0KCZkZXZmcmVxLT5z dXNwZW5kX2NvdW50LCAwKTsKPiA+Pj4gIAo+ID4+PiAgCWRldmZyZXEtPnRyYW5zX3RhYmxlID0g a3phbGxvYygKPiA+Pj4gQEAgLTg0MywxMCArODQ4LDE0IEBAIHN0cnVjdCBkZXZmcmVxICpkZXZm cmVxX2FkZF9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2LAo+ID4+PiAgZXJyX2RldjoKPiA+Pj4g IAkvKgo+ID4+PiAgCSAqIENsZWFudXAgcGF0aCBmb3IgZXJyb3JzIHRoYXQgaGFwcGVuIGJlZm9y ZSByZWdpc3RyYXRpb24uCj4gPj4+ICAJICogT3RoZXJ3aXNlIHdlIHJlbHkgb24gZGV2ZnJlcV9k ZXZfcmVsZWFzZS4KPiA+Pj4gIAkgKi8KPiA+Pj4gKwlpZiAoZGV2X3BtX3Fvc19yZXF1ZXN0X2Fj dGl2ZSgmZGV2ZnJlcS0+dXNlcl9tYXhfZnJlcV9yZXEpKQo+ID4+PiArCQlkZXZfcG1fcW9zX3Jl bW92ZV9yZXF1ZXN0KCZkZXZmcmVxLT51c2VyX21heF9mcmVxX3JlcSk7Cj4gPj4KPiA+PiBQbGVh c2UgY2hlY2sgdGhlIHJldHVybiB2YWx1ZSBpZiBlcnJvciBoYXBwZW4sIGp1c3QgcHJpbnQgdGhl IGVyciB3aXRoIGRldl9lcnIoKQo+ID4+IHdpdGhvdXQgc3RvcHBpbmcgdGhlIHJlbGVhc2Ugc3Rl cHMuCj4gPj4KPiA+PiAJZGV2X2VyciguLi4gImZhaWxlZCB0byByZW1vdmUgcmVxdWVzdCBvZiBE RVZfUE1fUU9TX01BWF9GUkVRVUVOQ1lcbiIpOwo+ID4gCj4gPiBkZXZfd2FybigpIGZvciB0aGUg c2FtZSByZWFzb24gYXMgYWJvdmU/Cj4gCj4gQWN0dWFsbHksIEkgdGhpbmsgdGhhdCBpcyBub3Qg Y3JpdGljYWwgZXJyb3IgYnV0IG5lZWQgdG8gcHJpbnQgdGhlIGVycm9yCj4gU28sIEkgdGhpbmsg dGhhdCBkZXZfZXJyKCkgaXMgZW5vdWdoLiBJZiB0aGlzIHRoaW5nIGlzIGNyaXRpY2FsLAo+IGJl dHRlciB0byB1c2UgZGV2X3dhcm4uCgpXZSBhZ3JlZSB0aGF0IHRoaXMgaXMgbm90IGNyaXRpY2Fs LCBidXQgbm90IHdoZW4gdG8gdXNlIGRldl9lcnIoKQphbmQgZGV2X3dhcm4oKS4gWW91IHNlZW0g dG8gaW1wbHkgdGhhdCBkZXZfd2FybigpIGlzIG1vcmUgc2V2ZXJlCnRoYW4gZGV2X2VycigpLCBo b3dldmVyIGl0J3MgdGhlIG90aGVyIHdheSBhcm91bmQ6CgojZGVmaW5lIEtFUk5fRVJSICAgICAg ICBLRVJOX1NPSCAiMyIgICAgLyogZXJyb3IgY29uZGl0aW9ucyAqLwojZGVmaW5lIEtFUk5fV0FS TklORyAgICBLRVJOX1NPSCAiNCIgICAgLyogd2FybmluZyBjb25kaXRpb25zICovCiNkZWZpbmUg S0VSTl9OT1RJQ0UgICAgIEtFUk5fU09IICI1IiAgICAvKiBub3JtYWwgYnV0IHNpZ25pZmljYW50 IGNvbmRpdGlvbiAqLwoKSSB0aGluayBpbiB0aGlzIGNhc2UgeW91IGNhbiBnbyBlaXRoZXIgd2F5 LCBpdCdzIGNlcnRhaW5seSBhbiBlcnJvciwKYnV0IHRoZSBkcml2ZXIgY29udGludWVzIHdpdGgg dGhlIG5vcm1hbCBleGVjdXRpb24gcGF0aC4KCj4gPiAKPiA+IEkgdGhpbmsgdGhlIG1lc3NhZ2Ug d291bGQgYmUgYmV0dGVyIHdpdGggYSBzbGlnaHQgY2hhbmdlOgo+ID4gCj4gPiAiZmFpbGVkIHRv IHJlbW92ZSBERVZfUE1fUU9TX01BWF9GUkVRVUVOQ1kgcmVxdWVzdFxuIgo+IAo+IE9LLgo+IAo+ ID4gCj4gPj4KPiA+Pj4gKwlpZiAoZGV2X3BtX3Fvc19yZXF1ZXN0X2FjdGl2ZSgmZGV2ZnJlcS0+ dXNlcl9taW5fZnJlcV9yZXEpKQo+ID4+PiArCQlkZXZfcG1fcW9zX3JlbW92ZV9yZXF1ZXN0KCZk ZXZmcmVxLT51c2VyX21pbl9mcmVxX3JlcSk7Cj4gPj4gCQo+ID4+IAlkZXZfZXJyKC4uLiAiZmFp bGVkIHRvIHJlbW92ZSByZXF1ZXN0IG9mIERFVl9QTV9RT1NfTUlOX0ZSRVFVRU5DWVxuIik7Cj4g PiAKPiA+IGRpdHRvCj4gPiAKPiA+Pj4gIAlrZnJlZShkZXZmcmVxLT50aW1lX2luX3N0YXRlKTsK PiA+Pj4gIAlrZnJlZShkZXZmcmVxLT50cmFuc190YWJsZSk7Cj4gPj4+ICAJa2ZyZWUoZGV2ZnJl cSk7Cj4gPj4+ICBlcnJfb3V0Ogo+ID4+PiAgCXJldHVybiBFUlJfUFRSKGVycik7Cj4gPj4+IEBA IC0xNDA3LDE0ICsxNDE2LDE1IEBAIHN0YXRpYyBzc2l6ZV90IG1pbl9mcmVxX3N0b3JlKHN0cnVj dCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCj4gPj4+ICAKPiA+ Pj4gIAlyZXQgPSBzc2NhbmYoYnVmLCAiJWx1IiwgJnZhbHVlKTsKPiA+Pj4gIAlpZiAocmV0ICE9 IDEpCj4gPj4+ICAJCXJldHVybiAtRUlOVkFMOwo+ID4+PiAgCj4gPj4+IC0JbXV0ZXhfbG9jaygm ZGYtPmxvY2spOwo+ID4+PiAtCWRmLT5taW5fZnJlcSA9IHZhbHVlOwo+ID4+PiAtCXVwZGF0ZV9k ZXZmcmVxKGRmKTsKPiA+Pj4gLQltdXRleF91bmxvY2soJmRmLT5sb2NrKTsKPiA+Pj4gKwkvKiBy b3VuZCBkb3duIHRvIGtIeiBmb3IgUE0gUW9TICovCj4gPj4KPiA+PiBJIHByZWZlciBtb3JlIGRl dGFpbGVkIGRlc2NyaXB0aW9uIGFzIGZvbGxvd2luZzoKPiA+Pgo+ID4+IAkvKgo+ID4+IAkgKiBS b3VuZCBkb3duIHRvIEtIeiB0byBkZWNpZGUgdGhlIHByb3BlciBtaW5pbXVtIGZyZXF1ZW5jeQo+ ID4gCj4gPiBpdCBzaG91bGQgYmUga0h6LCB3aXRoIGEgbG93ZXItY2FzZSAnaycsIGFzIGluIHRo ZSBvcmlnaW5hbCBjb21tZW50Lgo+IAo+IEdvb2QuCj4gCj4gPiAKPiA+PiAJICogd2hpY2ggaXMg Y2xvc2VkIHRvIHVzZXIgcmVxdWVzdC4KPiA+PiAgCSAqLwo+ID4gCj4gPiBUaGUgY29tbWVudCB5 b3Ugc3VnZ2VzdCBkb2Vzbid0IHByb3ZpZGUgYW55IGluZm9ybWF0aW9uIGFib3V0IHdoeSB0aGUK PiA+IGNvbnZlcnNpb24gdG8ga0h6IGlzIGRvbmUsIGluIHRoaXMgc2Vuc2UgdGhlIG9yaWdpbmFs IGNvbW1lbnQgdGhhdAo+ID4gbWVudGlvbnMgUE0gUW9TIHByb3ZpZGVzIG1vcmUgdmFsdWUuCj4g PiAKPiA+IFdpdGggd2hhdGV2ZXIgd2UgZW5kIHVwLCBJIHN1Z2dlc3QgdG8gdXNlICdjb252ZXJ0 JyBpbnN0ZWFkIG9mCj4gPiAncm91bmQgZG93bicuCj4gCj4gSSBhZ3JlZSB0byB1c2UgJ2NvbnZl cnQnIGluc3RlYWQgb2YgJ3JvdW5kIGRvd24nCj4gaWYgc29tZSBleHByZXNzaW9uIGluZGljYXRl cyB0aGUgY29ycmVjdCBtZWFuaW5nLgo+IAo+ID4gCj4gPj4+ICsJcmV0ID0gZGV2X3BtX3Fvc191 cGRhdGVfcmVxdWVzdCgmZGYtPnVzZXJfbWluX2ZyZXFfcmVxLAo+ID4+PiArCQkJCQl2YWx1ZSAv IEhaX1BFUl9LSFopOwo+ID4+PiArCWlmIChyZXQgPCAwKQo+ID4+PiArCQlyZXR1cm4gcmV0Owo+ ID4+PiAgCj4gPj4+ICAJcmV0dXJuIGNvdW50Owo+ID4+PiAgfQo+ID4+PiAgCj4gPj4+ICBzdGF0 aWMgc3NpemVfdCBtaW5fZnJlcV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmlj ZV9hdHRyaWJ1dGUgKmF0dHIsCj4gPj4+IEBAIC0xNDM5LDE5ICsxNDQ5LDE5IEBAIHN0YXRpYyBz c2l6ZV90IG1heF9mcmVxX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9h dHRyaWJ1dGUgKmF0dHIsCj4gPj4+ICAKPiA+Pj4gIAlyZXQgPSBzc2NhbmYoYnVmLCAiJWx1Iiwg JnZhbHVlKTsKPiA+Pj4gIAlpZiAocmV0ICE9IDEpCj4gPj4+ICAJCXJldHVybiAtRUlOVkFMOwo+ ID4+PiAgCj4gPj4+IC0JbXV0ZXhfbG9jaygmZGYtPmxvY2spOwo+ID4+PiAtCj4gPj4+IC0JLyog SW50ZXJwcmV0IHplcm8gYXMgImRvbid0IGNhcmUiICovCj4gPj4+IC0JaWYgKCF2YWx1ZSkKPiA+ Pj4gLQkJdmFsdWUgPSBVTE9OR19NQVg7Cj4gPj4+ICsJLyogcm91bmQgdXAgdG8ga0h6IGZvciBQ TSBRb1MgYW5kIGludGVycHJldCB6ZXJvIGFzICJkb24ndCBjYXJlIiAqLwo+ID4+Cj4gPj4gSSB0 aGluayB0aGF0ICJkb24ndCBjYXJlIiBjb21tZW50IHN0eWxlIGlzIG5vdCBnb29kLgo+ID4+Cj4g Pj4gSSByZWZlcnJlZCB0byB0aGUgRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1jbGFz cy1kZXZmcmVxIGZpbGUuCj4gPj4gSSBwcmVmZXIgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBh cyBmb2xsb3dpbmc6Cj4gPj4gCS8qCj4gPj4gCSAqIFJvdW5kIHVwIHRvIEtIeiB0byBkZWNpZGUg dGhlIHByb3BlciBtYXhpbXVtIGZyZXF1ZW5jeQo+ID4gCj4gPiBrSHoKPiA+IAo+ID4+IAkgKiB3 aGljaCBpcyBjbG9zZWQgdG8gdXNlciByZXF1ZXN0LiBJZiB2YWx1ZSBpcyB6ZXJvLAo+ID4+IAkg KiB0aGUgdXNlciBkb2VzIG5vdCBjYXJlLgo+ID4gCj4gPiAidGhlIHVzZXIgZG9lcyBub3QgY2Fy ZSIgaXMgc3RpbGwgdmVyeSBjYXN1YWwgeW91IGRpZG4ndCBsaWtlIGluaXRpYWxseS4KPiA+IEhv dyBhYm91dCAiQSB2YWx1ZSBvZiB6ZXJvIGlzIGludGVycHJldGVkIGFzICdubyBsaW1pdCcuIj8K PiA+IAo+ID4gQXMgZm9yIHRoZSBtaW4gZnJlcSwgSSB0aGluayBQTSBRb1Mgc2hvdWxkIGJlIG1l bnRpb25lZCB0byBtYWtlIGNsZWFyIHdoeQo+ID4gdGhlIGNvbnZlcnNpb24gdG8ga0h6IGlzIG5l ZWRlZC4KPiAKPiBBZ3JlZS4gSSBleHBlY3QgdGhhdCBMZW9uYXJkIHdpbGwgbWVudGlvbiB0aGF0 Lgo+IAo+ID4gCj4gPj4gIAkgKi8KPiA+Pgo+ID4+Cj4gPj4+ICsJaWYgKHZhbHVlKQo+ID4+PiAr CQl2YWx1ZSA9IERJVl9ST1VORF9VUCh2YWx1ZSwgSFpfUEVSX0tIWik7Cj4gPj4+ICsJZWxzZQo+ ID4+PiArCQl2YWx1ZSA9IFMzMl9NQVg7Cj4gPj4+ICAKPiA+Pj4gLQlkZi0+bWF4X2ZyZXEgPSB2 YWx1ZTsKPiA+Pj4gLQl1cGRhdGVfZGV2ZnJlcShkZik7Cj4gPj4+IC0JbXV0ZXhfdW5sb2NrKCZk Zi0+bG9jayk7Cj4gPj4+ICsJcmV0ID0gZGV2X3BtX3Fvc191cGRhdGVfcmVxdWVzdCgmZGYtPnVz ZXJfbWF4X2ZyZXFfcmVxLCB2YWx1ZSk7Cj4gPj4+ICsJaWYgKHJldCA8IDApCj4gPj4+ICsJCXJl dHVybiByZXQ7Cj4gPj4+ICAKPiA+Pj4gIAlyZXR1cm4gY291bnQ7Cj4gPj4+ICB9Cj4gPj4+ICBz dGF0aWMgREVWSUNFX0FUVFJfUlcobWluX2ZyZXEpOwo+ID4+PiAgCj4gPj4+IGRpZmYgLS1naXQg YS9pbmNsdWRlL2xpbnV4L2RldmZyZXEuaCBiL2luY2x1ZGUvbGludXgvZGV2ZnJlcS5oCj4gPj4+ IGluZGV4IGRhYzBkZmZlYWJiNC4uNzg0OWZlNGM2NjZkIDEwMDY0NAo+ID4+PiAtLS0gYS9pbmNs dWRlL2xpbnV4L2RldmZyZXEuaAo+ID4+PiArKysgYi9pbmNsdWRlL2xpbnV4L2RldmZyZXEuaAo+ ID4+PiBAQCAtMTEsMTAgKzExLDExIEBACj4gPj4+ICAjZGVmaW5lIF9fTElOVVhfREVWRlJFUV9I X18KPiA+Pj4gIAo+ID4+PiAgI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgo+ID4+PiAgI2luY2x1 ZGUgPGxpbnV4L25vdGlmaWVyLmg+Cj4gPj4+ICAjaW5jbHVkZSA8bGludXgvcG1fb3BwLmg+Cj4g Pj4+ICsjaW5jbHVkZSA8bGludXgvcG1fcW9zLmg+Cj4gPj4+ICAKPiA+Pj4gICNkZWZpbmUgREVW RlJFUV9OQU1FX0xFTiAxNgo+ID4+PiAgCj4gPj4+ICAvKiBERVZGUkVRIGdvdmVybm9yIG5hbWUg Ki8KPiA+Pj4gICNkZWZpbmUgREVWRlJFUV9HT1ZfU0lNUExFX09OREVNQU5ECSJzaW1wbGVfb25k ZW1hbmQiCj4gPj4+IEBAIC0xMjEsMTIgKzEyMiwxMiBAQCBzdHJ1Y3QgZGV2ZnJlcV9kZXZfcHJv ZmlsZSB7Cj4gPj4+ICAgKgkJZGV2ZnJlcS5uYiB0byB0aGUgY29ycmVzcG9uZGluZyByZWdpc3Rl ciBub3RpZmllciBjYWxsIGNoYWluLgo+ID4+PiAgICogQHdvcms6CWRlbGF5ZWQgd29yayBmb3Ig bG9hZCBtb25pdG9yaW5nLgo+ID4+PiAgICogQHByZXZpb3VzX2ZyZXE6CXByZXZpb3VzbHkgY29u ZmlndXJlZCBmcmVxdWVuY3kgdmFsdWUuCj4gPj4+ICAgKiBAZGF0YToJUHJpdmF0ZSBkYXRhIG9m IHRoZSBnb3Zlcm5vci4gVGhlIGRldmZyZXEgZnJhbWV3b3JrIGRvZXMgbm90Cj4gPj4+ICAgKgkJ dG91Y2ggdGhpcy4KPiA+Pj4gLSAqIEBtaW5fZnJlcToJTGltaXQgbWluaW11bSBmcmVxdWVuY3kg cmVxdWVzdGVkIGJ5IHVzZXIgKDA6IG5vbmUpCj4gPj4+IC0gKiBAbWF4X2ZyZXE6CUxpbWl0IG1h eGltdW0gZnJlcXVlbmN5IHJlcXVlc3RlZCBieSB1c2VyICgwOiBub25lKQo+ID4+PiArICogQHVz ZXJfbWluX2ZyZXFfcmVxOglQTSBRb1MgbWluIGZyZXF1ZW5jeSByZXF1ZXN0IGZyb20gdXNlciAo dmlhIHN5c2ZzKQo+ID4+Cj4gPj4gbWluIC0+IG1pbmltdW0gYW5kIHRoZW4gcmVtb3ZlIHBhcmVu dGhlc2lzIGFzIGZvbGxvd2luZzoKPiA+PiAJUE0gUW9TIG1pbmltdW0gZnJlcXVlbmN5IHJlcXVl c3QgYnkgdXNlciB2aWEgc3lzZnMKPiA+Pgo+ID4+PiArICogQHVzZXJfbWF4X2ZyZXFfcmVxOglQ TSBRb1MgbWF4IGZyZXF1ZW5jeSByZXF1ZXN0IGZyb20gdXNlciAodmlhIHN5c2ZzKQo+ID4+Cj4g Pj4gZGl0dG8uIG1heCAtPiBtYXhpbXVtCj4gPj4gCVBNIFFvUyBtYXhpbXVtIGZyZXF1ZW5jeSBy ZXF1ZXN0IGJ5IHVzZXIgdmlhIHN5c2ZzCj4gPj4KPiA+Pj4gICAqIEBzY2FsaW5nX21pbl9mcmVx OglMaW1pdCBtaW5pbXVtIGZyZXF1ZW5jeSByZXF1ZXN0ZWQgYnkgT1BQIGludGVyZmFjZQo+ID4+ PiAgICogQHNjYWxpbmdfbWF4X2ZyZXE6CUxpbWl0IG1heGltdW0gZnJlcXVlbmN5IHJlcXVlc3Rl ZCBieSBPUFAgaW50ZXJmYWNlCj4gPj4+ICAgKiBAc3RvcF9wb2xsaW5nOgkgZGV2ZnJlcSBwb2xs aW5nIHN0YXR1cyBvZiBhIGRldmljZS4KPiA+Pj4gICAqIEBzdXNwZW5kX2ZyZXE6CSBmcmVxdWVu Y3kgb2YgYSBkZXZpY2Ugc2V0IGR1cmluZyBzdXNwZW5kIHBoYXNlLgo+ID4+PiAgICogQHJlc3Vt ZV9mcmVxOgkgZnJlcXVlbmN5IG9mIGEgZGV2aWNlIHNldCBpbiByZXN1bWUgcGhhc2UuCj4gPj4+ IEBAIC0xNjEsMTIgKzE2MiwxMiBAQCBzdHJ1Y3QgZGV2ZnJlcSB7Cj4gPj4+ICAJdW5zaWduZWQg bG9uZyBwcmV2aW91c19mcmVxOwo+ID4+PiAgCXN0cnVjdCBkZXZmcmVxX2Rldl9zdGF0dXMgbGFz dF9zdGF0dXM7Cj4gPj4+ICAKPiA+Pj4gIAl2b2lkICpkYXRhOyAvKiBwcml2YXRlIGRhdGEgZm9y IGdvdmVybm9ycyAqLwo+ID4+PiAgCj4gPj4+IC0JdW5zaWduZWQgbG9uZyBtaW5fZnJlcTsKPiA+ Pj4gLQl1bnNpZ25lZCBsb25nIG1heF9mcmVxOwo+ID4+PiArCXN0cnVjdCBkZXZfcG1fcW9zX3Jl cXVlc3QgdXNlcl9taW5fZnJlcV9yZXE7Cj4gPj4+ICsJc3RydWN0IGRldl9wbV9xb3NfcmVxdWVz dCB1c2VyX21heF9mcmVxX3JlcTsKPiA+Pj4gIAl1bnNpZ25lZCBsb25nIHNjYWxpbmdfbWluX2Zy ZXE7Cj4gPj4+ICAJdW5zaWduZWQgbG9uZyBzY2FsaW5nX21heF9mcmVxOwo+ID4+PiAgCWJvb2wg c3RvcF9wb2xsaW5nOwo+ID4+PiAgCj4gPj4+ICAJdW5zaWduZWQgbG9uZyBzdXNwZW5kX2ZyZXE7 Cj4gPj4+Cj4gPj4KPiA+Pgo+ID4+IC0tIAo+ID4+IEJlc3QgUmVnYXJkcywKPiA+PiBDaGFud29v IENob2kKPiA+PiBTYW1zdW5nIEVsZWN0cm9uaWNzCj4gPiAKPiA+IAo+IAo+IAo+IC0tIAo+IEJl c3QgUmVnYXJkcywKPiBDaGFud29vIENob2kKPiBTYW1zdW5nIEVsZWN0cm9uaWNzCgpfX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1hcm0ta2VybmVs IG1haWxpbmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDov L2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCg==