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.4 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,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 6B93EECE587 for ; Tue, 1 Oct 2019 21:50:53 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 237FB21A4A for ; Tue, 1 Oct 2019 21:50:53 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=samsung.com header.i=@samsung.com header.b="G4oIy0ZE" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727401AbfJAVuw (ORCPT ); Tue, 1 Oct 2019 17:50:52 -0400 Received: from mailout2.samsung.com ([203.254.224.25]:20585 "EHLO mailout2.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726681AbfJAVuv (ORCPT ); Tue, 1 Oct 2019 17:50:51 -0400 Received: from epcas1p4.samsung.com (unknown [182.195.41.48]) by mailout2.samsung.com (KnoxPortal) with ESMTP id 20191001215046epoutp023cf4fbdb5f8bc8ba3879214471caf807~JpFjtlQDv0986409864epoutp02O for ; Tue, 1 Oct 2019 21:50:46 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout2.samsung.com 20191001215046epoutp023cf4fbdb5f8bc8ba3879214471caf807~JpFjtlQDv0986409864epoutp02O DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1569966647; bh=ssPXOm9Za62an3KBa6ca/tmeSetWaQ7nq92aRkL8xvQ=; h=Subject:To:Cc:From:Date:In-Reply-To:References:From; b=G4oIy0ZEhtg3UZPbmn3nBzR8FbM3jjWdNC/2t4p+Iodrgg0qAFUTO7x9n8v5TOKbm Mr4A12TMn/XU/i6RnQz307O3eQoWKvImd3f63/teDcPq6oNJzVSVd//yh8Bq5U8tn3 9DuJB5ckDeCJKITy7ZQqQxODbUR6Athd4+Dg2HBw= Received: from epsnrtp1.localdomain (unknown [182.195.42.162]) by epcas1p3.samsung.com (KnoxPortal) with ESMTP id 20191001215046epcas1p34c255de0bad8c71375fba926c7171ce2~JpFjCmIDG3209032090epcas1p3D; Tue, 1 Oct 2019 21:50:46 +0000 (GMT) Received: from epsmges1p1.samsung.com (unknown [182.195.40.154]) by epsnrtp1.localdomain (Postfix) with ESMTP id 46jXyD0VGKzMqYll; Tue, 1 Oct 2019 21:50:44 +0000 (GMT) Received: from epcas1p2.samsung.com ( [182.195.41.46]) by epsmges1p1.samsung.com (Symantec Messaging Gateway) with SMTP id 0E.E0.04144.33AC39D5; Wed, 2 Oct 2019 06:50:43 +0900 (KST) Received: from epsmtrp1.samsung.com (unknown [182.195.40.13]) by epcas1p2.samsung.com (KnoxPortal) with ESMTPA id 20191001215043epcas1p272c6545368f976bb22ae753343a64cfe~JpFgZM2mU2044620446epcas1p2R; Tue, 1 Oct 2019 21:50:43 +0000 (GMT) Received: from epsmgms1p1new.samsung.com (unknown [182.195.42.41]) by epsmtrp1.samsung.com (KnoxPortal) with ESMTP id 20191001215043epsmtrp16e0b5a77b5e1a3d795ba79be4b0e2f87~JpFgV_UZE0564805648epsmtrp1N; Tue, 1 Oct 2019 21:50:43 +0000 (GMT) X-AuditID: b6c32a35-2c7ff70000001030-50-5d93ca33800c Received: from epsmtip2.samsung.com ( [182.195.34.31]) by epsmgms1p1new.samsung.com (Symantec Messaging Gateway) with SMTP id 34.20.04081.33AC39D5; Wed, 2 Oct 2019 06:50:43 +0900 (KST) Received: from [10.113.221.102] (unknown [10.113.221.102]) by epsmtip2.samsung.com (KnoxPortal) with ESMTPA id 20191001215042epsmtip2ed04c306e3e9f835eea137605827f4ba~JpFgBNwEc1636616366epsmtip2P; Tue, 1 Oct 2019 21:50:42 +0000 (GMT) Subject: Re: [PATCH v8 5/6] PM / devfreq: Add PM QoS support To: Leonard Crestez , Matthias Kaehlcke Cc: MyungJoo Ham , Kyungmin Park , =?UTF-8?B?QXJ0dXIgxZp3aWdvxYQ=?= , Saravana Kannan , Krzysztof Kozlowski , Alexandre Bailon , Georgi Djakov , Abel Vesa , Jacky Bai , Viresh Kumar , Lukasz Luba , dl-linux-imx , "linux-pm@vger.kernel.org" , "linux-arm-kernel@lists.infradead.org" From: Chanwoo Choi Organization: Samsung Electronics Message-ID: <99758b12-5917-ee53-cbcd-4df8cf69d98d@samsung.com> Date: Wed, 2 Oct 2019 06:55:30 +0900 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.8.0 MIME-Version: 1.0 In-Reply-To: Content-Language: en-US Content-Transfer-Encoding: 8bit X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrBJsWRmVeSWpSXmKPExsWy7bCmnq7xqcmxBhMeWVocOraV3eLr6VOM FssuHWW0mL53E5vF+fMb2C3ONr1ht7jVIGOx4u5HVotNj6+xWnT9Wsls8bn3CKPF5w2PGS1u N65gs1h97iCbRdehv2wWG796OAh4vL/Ryu4xu+Eii8eCTaUem1Z1snncubaHzWPzknqPje92 MHkcfLeHyaNvyypGj8+b5AK4orJtMlITU1KLFFLzkvNTMvPSbZW8g+Od403NDAx1DS0tzJUU 8hJzU22VXHwCdN0yc4AeUVIoS8wpBQoFJBYXK+nb2RTll5akKmTkF5fYKqUWpOQUWBboFSfm Fpfmpesl5+daGRoYGJkCFSZkZzzc9Jqt4Gp9xbeFp5kaGDvTuxg5OSQETCTOndjI0sXIxSEk sINRYvqDW2wQzidGicsnLzNCON8YJSZvX8MK0/Lt4Aqolr2MEic/TGGCcN4zSizetJ4dpEpY wEbi/9WPbCC2iECoxJenl5hBbGaBJlaJT0fKQGw2AS2J/S9ugNXwCyhKXP3xmBHE5hWwk7j+ 7AwLiM0ioCJx8/pjMFtUIELi04PDrBA1ghInZz4Bi3MKxEpMmPudFWK+uMStJ/OZIGx5ieat s5lBjpMQuMQu8enLJTaIF1wk5v7/xgRhC0u8Or6FHcKWknjZ3wZlV0usPHmEDaK5g1Fiy/4L UP8bS+xfOhmomQNog6bE+l36EGFFiZ2/5zJCLOaTePe1hxWkREKAV6KjTQiiRFni8oO7UGsl JRa3d7JNYFSaheSdWUhemIXkhVkIyxYwsqxiFEstKM5NTy02LDBEju5NjOBUrmW6g3HKOZ9D jAIcjEo8vDdCJscKsSaWFVfmHmKU4GBWEuG1+TMpVog3JbGyKrUoP76oNCe1+BCjKTC0JzJL iSbnA/NMXkm8oamRsbGxhYmhmamhoZI4r0d6Q6yQQHpiSWp2ampBahFMHxMHp1QDo37LtXU7 3F4+3VjPv9pW5nMe77Ir6ho/HuofXPI6/E6Fy5kL/QxBh86LLLiwckPa26VCi0JOb7WeG+1m U//25Yf/M1ebL3l4pFZ59k7GhS+eawTa5s3UtDUpd1JU7n0tym8lwPRjOf86J8Nd+1lfPyla Lupe8+eR1TlNm6WFEnn729KOx1S/mKnEUpyRaKjFXFScCABhZ2sy+wMAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrMIsWRmVeSWpSXmKPExsWy7bCSvK7xqcmxBgcuClgcOraV3eLr6VOM FssuHWW0mL53E5vF+fMb2C3ONr1ht7jVIGOx4u5HVotNj6+xWnT9Wsls8bn3CKPF5w2PGS1u N65gs1h97iCbRdehv2wWG796OAh4vL/Ryu4xu+Eii8eCTaUem1Z1snncubaHzWPzknqPje92 MHkcfLeHyaNvyypGj8+b5AK4orhsUlJzMstSi/TtErgyHm56zVZwtb7i28LTTA2MneldjJwc EgImEt8OrmDpYuTiEBLYzShx69EmdoiEpMS0i0eZuxg5gGxhicOHiyFq3jJKPJ7WxAZSIyxg I/H/6kcwW0QgVOJP53JWkCJmgSZWia7v1xkhOprYJE7sv8MCUsUmoCWx/8UNsA5+AUWJqz8e M4LYvAJ2EtefnQGrYRFQkbh5/TGYLSoQIXF4xyyoGkGJkzOfgMU5BWIlJsz9zgpiMwuoS/yZ d4kZwhaXuPVkPhOELS/RvHU28wRG4VlI2mchaZmFpGUWkpYFjCyrGCVTC4pz03OLDQsM81LL 9YoTc4tL89L1kvNzNzGCo1pLcwfj5SXxhxgFOBiVeHgbgibHCrEmlhVX5h5ilOBgVhLhtfkz KVaINyWxsiq1KD++qDQntfgQozQHi5I479O8Y5FCAumJJanZqakFqUUwWSYOTqkGxqwnW6cc 1M62ZlfIKPSr/PbhburEVbcX77gXttvHimmOb9+5Mj+drIvMe6YulGW9peK2R94tIOvoqy27 Hi6I14rVNp1xeZPTQaszdfZB/3dFfDVNd8veH33ao4j1yawp3ZKqPvrB2uy7T1fP0NXp2PeO /f76O9Kva94JMpbf15Q09T2TwBafocRSnJFoqMVcVJwIACWQ27rmAgAA X-CMS-MailID: 20191001215043epcas1p272c6545368f976bb22ae753343a64cfe X-Msg-Generator: CA Content-Type: text/plain; charset="utf-8" X-Sendblock-Type: SVC_REQ_APPROVE CMS-TYPE: 101P DLP-Filter: Pass X-CFilter-Loop: Reflected X-CMS-RootMailID: 20190924101145epcas4p37f7d25b8743c25520b33fa392cd80d45 References: <58fdd2c226a4e76a3d9427baab7dd5c23af842ab.1569319738.git.leonard.crestez@nxp.com> <40885624-8f11-4eea-d5bf-d6bb50fa44dd@samsung.com> <5f12931b-92f8-15d8-8498-f02a7c2e999f@samsung.com> <2c0f7b6f-97df-9548-dde5-dda95f6a447c@samsung.com> Sender: linux-pm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org On 19. 10. 1. 오후 6:39, Leonard Crestez wrote: > On 2019-10-01 12:37 AM, Chanwoo Choi wrote: >> Hi, >> >> On 19. 9. 30. 오후 10:16, Leonard Crestez wrote: >>> On 2019-09-27 4:45 AM, Chanwoo Choi wrote: >>>> On 19. 9. 26. 오후 10:43, Leonard Crestez wrote: >>>>> On 2019-09-26 4:07 AM, Chanwoo Choi wrote: >>>>>> On 19. 9. 26. 오전 6:18, Leonard Crestez wrote: >>>>>>> On 25.09.2019 05:11, Chanwoo Choi wrote: >>>>>>>> On 19. 9. 24. 오후 7:11, Leonard Crestez wrote: >>>>>>>>> Register notifiers with the PM QoS framework in order to respond to >>>>>>>>> requests for DEV_PM_QOS_MIN_FREQUENCY and DEV_PM_QOS_MAX_FREQUENCY. >>>>>>>>> >>>>>>>>> No notifiers are added by this patch but PM QoS constraints can be >>>>>>>>> imposed externally (for example from other devices). >>>>>>>>> >>>>>>>>> Signed-off-by: Leonard Crestez >>>>>>>>> Reviewed-by: Matthias Kaehlcke >>>>>>>>> --- >>>>>>>>> drivers/devfreq/devfreq.c | 75 +++++++++++++++++++++++++++++++++++++++ >>>>>>>>> include/linux/devfreq.h | 5 +++ >>>>>>>>> 2 files changed, 80 insertions(+) >>>>>>>>> >>>>>>>>> diff --git a/drivers/devfreq/devfreq.c b/drivers/devfreq/devfreq.c >>>>>>>>> index eee403e70c84..784f3e40536a 100644 >>>>>>>>> --- a/drivers/devfreq/devfreq.c >>>>>>>>> +++ b/drivers/devfreq/devfreq.c >>>>>>>>> @@ -22,15 +22,18 @@ >>>>>>>>> #include >>>>>>>>> #include >>>>>>>>> #include >>>>>>>>> #include >>>>>>>>> #include >>>>>>>>> +#include >>>>>>>>> #include "governor.h" >>>>>>>>> >>>>>>>>> #define CREATE_TRACE_POINTS >>>>>>>>> #include >>>>>>>>> >>>>>>>>> +#define HZ_PER_KHZ 1000 >>>>>>>>> + >>>>>>>>> static struct class *devfreq_class; >>>>>>>>> >>>>>>>>> /* >>>>>>>>> * devfreq core provides delayed work based load monitoring helper >>>>>>>>> * functions. Governors can use these or can implement their own >>>>>>>>> @@ -109,10 +112,11 @@ static unsigned long find_available_max_freq(struct devfreq *devfreq) >>>>>>>>> static void get_freq_range(struct devfreq *devfreq, >>>>>>>>> unsigned long *min_freq, >>>>>>>>> unsigned long *max_freq) >>>>>>>>> { >>>>>>>>> unsigned long *freq_table = devfreq->profile->freq_table; >>>>>>>>> + unsigned long qos_min_freq, qos_max_freq; >>>>>>>>> >>>>>>>>> lockdep_assert_held(&devfreq->lock); >>>>>>>>> >>>>>>>>> /* >>>>>>>>> * Init min/max frequency from freq table. >>>>>>>>> @@ -125,10 +129,18 @@ static void get_freq_range(struct devfreq *devfreq, >>>>>>>>> } else { >>>>>>>>> *min_freq = freq_table[devfreq->profile->max_state - 1]; >>>>>>>>> *max_freq = freq_table[0]; >>>>>>>>> } >>>>>>>>> >>>>>>>>> + /* constraints from PM QoS */ >>>>>>>> >>>>>>>> As I commented on patch4, >>>>>>>> 'constraints' -> 'Constraint' because first verb have to be used >>>>>>>> as the sigular verbs. >>>>>>> >>>>>>> Already discussed for another patch; I will modify to "Apply constraints >>>>>>> from PM QoS" instead. >>>>>> >>>>>> I agree the new comment with 'Apply constraints ... '. >>>>>> >>>>>>> >>>>>>>> I prefer to use following comments: >>>>>>>> >>>>>>>> /* Constraint minimum/maximum frequency from PM QoS constraints */ >>>>>>>> >>>>>>>>> + qos_min_freq = dev_pm_qos_read_value(devfreq->dev.parent, >>>>>>>>> + DEV_PM_QOS_MIN_FREQUENCY); >>>>>>>>> + 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 */ >>>>>>>>> @@ -606,10 +618,49 @@ static int devfreq_notifier_call(struct notifier_block *nb, unsigned long type, >>>>>>>>> mutex_unlock(&devfreq->lock); >>>>>>>>> >>>>>>>>> return ret; >>>>>>>>> } >>>>>>>>> >>>>>>>>> +/** >>>>>>>>> + * qos_notifier_call() - Common handler for QoS constraints. >>>>>>>>> + * @devfreq: the devfreq instance. >>>>>>>>> + */ >>>>>>>>> +static int qos_notifier_call(struct devfreq *devfreq) >>>>>>>>> +{ >>>>>>>>> + int err; >>>>>>>>> + >>>>>>>>> + mutex_lock(&devfreq->lock); >>>>>>>>> + err = update_devfreq(devfreq); >>>>>>>>> + mutex_unlock(&devfreq->lock); >>>>>>>>> + if (err) >>>>>>>>> + dev_err(devfreq->dev.parent, >>>>>>>>> + "failed to update frequency for PM QoS constraints (%d)\n", >>>>>>>> >>>>>>>> Is it not over 80 char? >>>>>>> >>>>>>> Yes but coding style explicitly forbids breaking strings. >>>>>>> >>>>>>>>> + err); >>>>>>>>> + >>>>>>>>> + return NOTIFY_OK; >>>>>>>>> +} >>>>>>>>> + >>>>>>>>> +/** >>>>>>>>> + * qos_min_notifier_call() - Callback for QoS min_freq changes. >>>>>>>>> + * @nb: Should be devfreq->nb_min >>>>>>>>> + */ >>>>>>>>> +static int qos_min_notifier_call(struct notifier_block *nb, >>>>>>>>> + unsigned long val, void *ptr) >>>>>>>>> +{ >>>>>>>>> + return qos_notifier_call(container_of(nb, struct devfreq, nb_min)); >>>>>>>>> +} >>>>>>>>> + >>>>>>>>> +/** >>>>>>>>> + * qos_max_notifier_call() - Callback for QoS max_freq changes. >>>>>>>>> + * @nb: Should be devfreq->nb_max >>>>>>>>> + */ >>>>>>>>> +static int qos_max_notifier_call(struct notifier_block *nb, >>>>>>>>> + unsigned long val, void *ptr) >>>>>>>>> +{ >>>>>>>>> + return qos_notifier_call(container_of(nb, struct devfreq, nb_max)); >>>>>>>>> +} >>>>>>>>> + >>>>>>>>> /** >>>>>>>>> * devfreq_dev_release() - Callback for struct device to release the device. >>>>>>>>> * @dev: the devfreq device >>>>>>>>> * >>>>>>>>> * Remove devfreq from the list and release its resources. >>>>>>>>> @@ -620,10 +671,15 @@ static void devfreq_dev_release(struct device *dev) >>>>>>>>> >>>>>>>>> mutex_lock(&devfreq_list_lock); >>>>>>>>> list_del(&devfreq->node); >>>>>>>>> mutex_unlock(&devfreq_list_lock); >>>>>>>>> >>>>>>>>> + dev_pm_qos_remove_notifier(devfreq->dev.parent, &devfreq->nb_max, >>>>>>>>> + DEV_PM_QOS_MAX_FREQUENCY); >>>>>>>>> + dev_pm_qos_remove_notifier(devfreq->dev.parent, &devfreq->nb_min, >>>>>>>>> + DEV_PM_QOS_MIN_FREQUENCY); >>>>>>>>> + >>>>>>>> >>>>>>>> Just print error with dev_err() without stopping the release step. >>>>>>>> >>>>>>>> I prefer to handle the return value if kernel API provides >>>>>>>> the error code. >>>>>> >>>>>> How about? >>>>> >>>>> Modified to dev_warn. This also applies to PATCH 6 so I replied there. >>>>> >>>>>>>>> if (devfreq->profile->exit) >>>>>>>>> devfreq->profile->exit(devfreq->dev.parent); >>>>>>>>> >>>>>>>>> kfree(devfreq->time_in_state); >>>>>>>>> kfree(devfreq->trans_table); >>>>>>>>> @@ -733,10 +789,28 @@ struct devfreq *devfreq_add_device(struct device *dev, >>>>>>>>> if (err) { >>>>>>>>> put_device(&devfreq->dev); >>>>>>>>> goto err_out; >>>>>>>>> } >>>>>>>>> >>>>>>>>> + /* >>>>>>>>> + * Register notifiers for updates to min/max_freq after device is >>>>>>>>> + * initialized (and we can handle notifications) but before the >>>>>>>>> + * governor is started (which should do an initial enforcement of >>>>>>>>> + * constraints). >>>>>>>>> + */ >>>>>>>> >>>>>>>> My previous comment is not enough why I prefer to remove it. Sorry. >>>>>>>> Actually, until now, the devfreq_add_device() don't have the detailed >>>>>>>> comments because the line code is not too long. But, at the present time, >>>>>>>> devfreq_add_device() is too long. It means that the detailed comment >>>>>>>> are necessary. >>>>>>>> >>>>>>>> So, I'll add the detailed comment for each step of devfreq_add_device() >>>>>>>> on separate patch to keep the same style. I'll send the patch to you >>>>>>>> for the review. >>>>>>> >>>>>>> This is very likely to result in merge conflicts, maybe wait for my >>>>>>> series to go in first? >>>>>> >>>>>> I'll send the separate patch after finished the review of these patches. >>>>>> So, if you agree, please remove this comment on this patch. >>>>>> >>>>>> You can review the detailed comments on separate patch when I send. >>>>> This patch already contains comments and they explain the code being >>>>> added. Doesn't it make more sense for comments and code to go in together? >>>>> >>>>> I think the comment is a resonable explanation as to why notifiers are >>>>> registered at that specific step in the initialization sequence. >>>> >>>> If you add this comment on this patch, OK. just I have some comments. >>>> >>>> /* >>>> * Register notifiers for updates to min/max_freq after device is >>>> * initialized (and we can handle notifications) but before the >>>> >>>> I think that 'device is initialized' is not needed. >>>> It is always true, it don't need to add the additional comments. >>>> because dev_pm_qos_add_notifier() must need the 'devfreq->dev'. >>>> The this code prove the call sequence between them. >>> >>> In theory if a notifier is registered too soon then it could crash on a >>> NULL pointer. But looking at the code it first checks that "governor != >>> NULL) so it would be harmless. >>> >>>> >>>> About 'us', don't use 'we'. The subject is 'devfreq' or other device instead of us. >>>> >>>> * governor is started (which should do an initial enforcement of >>>> * constraints). >>>> */ >>>> >>>> Actually, it doesn't matter the initialization step between governor >>>> and PM_QOS registration. >>> >>> In theory PM QoS constraints could be modified between governor startup >>> and notifier registration and that update would be lost (until the next >>> one). >> >> Don't lose the any of PM QoS request. User can request the any frequency >> through PMQoS at the any time and then devfreq consider the constraints >> from PM QoS. >> >> Also, after finished the registration of devfreq device, >> the user (other device driver required the min/max freq) >> can request the PM QoS on real use-case. >> >> It is impossible to get the devfreq instance before finished >> the devfreq_add_device() because the user can access the devfreq instance >> devfreq_get_devfreq_by_phandle() which use 'devfreq_list'. >> >> If devfreq_add_device() is not finished, the user cannot get >> the any devfreq device from 'devfreq_list'. > > PM QoS constraints are not on devfreq->dev but on the parent so in > theory it's possible to add constraints during devfreq initialization. > > Making PM QoS requests doesn't require fetching devfreq instances, I > think you could call of_find_device_by_node with a phandle and register > constraints that way. You're right. My comment was not enough. I mean that PM QoS depends on the devfreq->dev.parent. If probe() of devfreq device requires the PMQoS request, it is possible to register PM QoS. On the other hand, the other device device regardless the devfreq device driver, they can request PM QoS constraints after registering the parent device (devfreq->dev.parent). Your patch already registered the PM QoS notifier before governor start. It is enough to show the your intention. I don't any objection of this code. Just, the too more detailed comment make the devfreq core complicated. As I commented, I think t hat the simple comment is enough for devfreq user. Thanks for your explanation. > >>>> If start governor and then register PM_QOS, >>>> the governor can decide the new frequency. And then PM_QOS request >>>> the new constraints for min/max frequency. On request time of PM_QOS, >>>> devfreq can detect this time and then apply the constraints from PM_QOS. >>>> The user of devfreq's PM_QOS must need the phandle or device instance >>>> of devfreq deivce. It means that user of devfreq's PM_QOS can request >>>> the any constraints of PM_QOS_MIN/MAX through PM_QOS interface. >>>> >>>> So, it doesn't need to add the following comments >>>> because following comment is not always mandatory. >>>> " governor is started (which should do an initial enforcement of constraints)." >>>> >>>> Also, you don't need to use parentheses on comments. >>>> >>>> Actually, I think that following comments are enough. >>>> >>>> /* Register PM QoS notifiers for updating to min/max freq */ >>> >>> I thought that explaning why it's done at this particular step but I'll >>> just remove it, devfreq_add_device can get more comments later. >> >> OK. Thanks. >> I think that if the comment contains what is meaning of the code, >> it is enough. >> >> Although change the sequence between dev_pm_qos_add_notifier() and >> try_then_request_governor(), in the real-case, the any issue >> would not happen. Because as I commented above, the other device-driver >> cannot get the devfreq instance before finished the devfreq_add_device. >> It means that the user device driver cannot request the any PM QoS >> constraints. >> >>> >>>>>>>>> + devfreq->nb_min.notifier_call = qos_min_notifier_call; >>>>>>>>> + err = dev_pm_qos_add_notifier(devfreq->dev.parent, &devfreq->nb_min, >>>>>>>>> + DEV_PM_QOS_MIN_FREQUENCY); >>>>>>>>> + if (err) >>>>>>>>> + goto err_devfreq; >>>>>>>>> + >>>>>>>>> + devfreq->nb_max.notifier_call = qos_max_notifier_call; >>>>>>>>> + err = dev_pm_qos_add_notifier(devfreq->dev.parent, &devfreq->nb_max, >>>>>>>>> + DEV_PM_QOS_MAX_FREQUENCY); >>>>>>>>> + if (err) >>>>>>>>> + goto err_devfreq; >>>>>>>>> + >>>>>>>>> mutex_lock(&devfreq_list_lock); >>>>>>>>> >>>>>>>>> governor = try_then_request_governor(devfreq->governor_name); >>>>>>>>> if (IS_ERR(governor)) { >>>>>>>>> dev_err(dev, "%s: Unable to find governor for the device\n", >>>>>>>>> @@ -760,10 +834,11 @@ struct devfreq *devfreq_add_device(struct device *dev, >>>>>>>>> >>>>>>>>> return devfreq; >>>>>>>>> >>>>>>>>> err_init: >>>>>>>>> mutex_unlock(&devfreq_list_lock); >>>>>>>>> +err_devfreq: >>>>>>>>> devfreq_remove_device(devfreq); >>>>>>>>> return ERR_PTR(err); >>>>>>>>> >>>>>>>>> err_dev: >>>>>>>>> /* >>>>>>>>> diff --git a/include/linux/devfreq.h b/include/linux/devfreq.h >>>>>>>>> index c3cbc15fdf08..dac0dffeabb4 100644 >>>>>>>>> --- a/include/linux/devfreq.h >>>>>>>>> +++ b/include/linux/devfreq.h >>>>>>>>> @@ -134,10 +134,12 @@ struct devfreq_dev_profile { >>>>>>>>> * @total_trans: Number of devfreq transitions >>>>>>>>> * @trans_table: Statistics of devfreq transitions >>>>>>>>> * @time_in_state: Statistics of devfreq states >>>>>>>>> * @last_stat_updated: The last time stat updated >>>>>>>>> * @transition_notifier_list: list head of DEVFREQ_TRANSITION_NOTIFIER notifier >>>>>>>>> + * @nb_min: Notifier block for DEV_PM_QOS_MIN_FREQUENCY >>>>>>>>> + * @nb_max: Notifier block for DEV_PM_QOS_MAX_FREQUENCY >>>>>>>>> * >>>>>>>>> * This structure stores the devfreq information for a give device. >>>>>>>>> * >>>>>>>>> * Note that when a governor accesses entries in struct devfreq in its >>>>>>>>> * functions except for the context of callbacks defined in struct >>>>>>>>> @@ -176,10 +178,13 @@ struct devfreq { >>>>>>>>> unsigned int *trans_table; >>>>>>>>> unsigned long *time_in_state; >>>>>>>>> unsigned long last_stat_updated; >>>>>>>>> >>>>>>>>> struct srcu_notifier_head transition_notifier_list; >>>>>>>>> + >>>>>>>>> + struct notifier_block nb_min; >>>>>>>>> + struct notifier_block nb_max; >>>>>>>>> }; >>>>>>>>> >>>>>>>>> struct devfreq_freqs { >>>>>>>>> unsigned long old; >>>>>>>>> unsigned long new; >>>> >>>> >>> >> >> > -- 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.3 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,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 9C08FECE587 for ; Tue, 1 Oct 2019 21:51:16 +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 3A5042133F for ; Tue, 1 Oct 2019 21:51:16 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="RUoLxMu4"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=samsung.com header.i=@samsung.com header.b="kqzUH9of" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 3A5042133F Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=samsung.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:References:In-Reply-To:MIME-Version: Date:Message-ID:From:To:Subject:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=o/C0vLmp/WSbkPUYHopCE1KrdQK87JbwR6Vu4N6pz1U=; b=RUoLxMu4pF4AnO Sj/PY5NJNN8bwvlTCwh8r8zL6TuTw/xZPNf1x4VUrKIarDWqrU17EYTMOXBZxuaMXFKOKsexKMrN7 iUN1h9k3rQgH/uodzr3lL1jJ6mr+u5s1/+hiXbXNnrg2c3VM4vQzdrWBYjEvIGIXCi3MXUUHaw0WG myg6iRWFh5nOITCVB5TSoSPevLpT7J8RextiEaLPjomS0uXt4P/HXLcrfIbOHRS8oSRYTU5shPrtg ugMEcrYJa50XyQF1vxcYmj2N3L8stEQ77QA8KdOUSOd591HtMIt1WdDlc5e2Q+PFbqG+UYYiLyKKW E1XXp2hCHJ9nvclfVpMw==; 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 1iFQ34-0002t7-0z; Tue, 01 Oct 2019 21:51:10 +0000 Received: from mailout4.samsung.com ([203.254.224.34]) by bombadil.infradead.org with esmtps (Exim 4.92.2 #3 (Red Hat Linux)) id 1iFQ2s-0002mI-LQ for linux-arm-kernel@lists.infradead.org; Tue, 01 Oct 2019 21:51:02 +0000 Received: from epcas1p4.samsung.com (unknown [182.195.41.48]) by mailout4.samsung.com (KnoxPortal) with ESMTP id 20191001215046epoutp0422a958e53f183e5df8324c5147155acb~JpFjqCSrM0832208322epoutp04b for ; Tue, 1 Oct 2019 21:50:46 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout4.samsung.com 20191001215046epoutp0422a958e53f183e5df8324c5147155acb~JpFjqCSrM0832208322epoutp04b DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1569966646; bh=ssPXOm9Za62an3KBa6ca/tmeSetWaQ7nq92aRkL8xvQ=; h=Subject:To:Cc:From:Date:In-Reply-To:References:From; b=kqzUH9ofJHZz/JC/o0jAUxreVeZimThX3qTj2eNVvfgOxglGwac+RX1oe+/KHJVOv KRv5nmzOVs5K4cJtLJMFtoSjNaDcxDJgmKrGCpjJBLJjj3CVkM+EPgzVkulp5n6v44 4ieWBQaz4jFrh8MUxMHzvQ+7N3WZ1uOyqFgbhvBM= Received: from epsnrtp1.localdomain (unknown [182.195.42.162]) by epcas1p3.samsung.com (KnoxPortal) with ESMTP id 20191001215046epcas1p34c255de0bad8c71375fba926c7171ce2~JpFjCmIDG3209032090epcas1p3D; Tue, 1 Oct 2019 21:50:46 +0000 (GMT) Received: from epsmges1p1.samsung.com (unknown [182.195.40.154]) by epsnrtp1.localdomain (Postfix) with ESMTP id 46jXyD0VGKzMqYll; Tue, 1 Oct 2019 21:50:44 +0000 (GMT) Received: from epcas1p2.samsung.com ( [182.195.41.46]) by epsmges1p1.samsung.com (Symantec Messaging Gateway) with SMTP id 0E.E0.04144.33AC39D5; Wed, 2 Oct 2019 06:50:43 +0900 (KST) Received: from epsmtrp1.samsung.com (unknown [182.195.40.13]) by epcas1p2.samsung.com (KnoxPortal) with ESMTPA id 20191001215043epcas1p272c6545368f976bb22ae753343a64cfe~JpFgZM2mU2044620446epcas1p2R; Tue, 1 Oct 2019 21:50:43 +0000 (GMT) Received: from epsmgms1p1new.samsung.com (unknown [182.195.42.41]) by epsmtrp1.samsung.com (KnoxPortal) with ESMTP id 20191001215043epsmtrp16e0b5a77b5e1a3d795ba79be4b0e2f87~JpFgV_UZE0564805648epsmtrp1N; Tue, 1 Oct 2019 21:50:43 +0000 (GMT) X-AuditID: b6c32a35-2c7ff70000001030-50-5d93ca33800c Received: from epsmtip2.samsung.com ( [182.195.34.31]) by epsmgms1p1new.samsung.com (Symantec Messaging Gateway) with SMTP id 34.20.04081.33AC39D5; Wed, 2 Oct 2019 06:50:43 +0900 (KST) Received: from [10.113.221.102] (unknown [10.113.221.102]) by epsmtip2.samsung.com (KnoxPortal) with ESMTPA id 20191001215042epsmtip2ed04c306e3e9f835eea137605827f4ba~JpFgBNwEc1636616366epsmtip2P; Tue, 1 Oct 2019 21:50:42 +0000 (GMT) Subject: Re: [PATCH v8 5/6] PM / devfreq: Add PM QoS support To: Leonard Crestez , Matthias Kaehlcke From: Chanwoo Choi Organization: Samsung Electronics Message-ID: <99758b12-5917-ee53-cbcd-4df8cf69d98d@samsung.com> Date: Wed, 2 Oct 2019 06:55:30 +0900 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.8.0 MIME-Version: 1.0 In-Reply-To: Content-Language: en-US X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrBJsWRmVeSWpSXmKPExsWy7bCmnq7xqcmxBhMeWVocOraV3eLr6VOM FssuHWW0mL53E5vF+fMb2C3ONr1ht7jVIGOx4u5HVotNj6+xWnT9Wsls8bn3CKPF5w2PGS1u N65gs1h97iCbRdehv2wWG796OAh4vL/Ryu4xu+Eii8eCTaUem1Z1snncubaHzWPzknqPje92 MHkcfLeHyaNvyypGj8+b5AK4orJtMlITU1KLFFLzkvNTMvPSbZW8g+Od403NDAx1DS0tzJUU 8hJzU22VXHwCdN0yc4AeUVIoS8wpBQoFJBYXK+nb2RTll5akKmTkF5fYKqUWpOQUWBboFSfm Fpfmpesl5+daGRoYGJkCFSZkZzzc9Jqt4Gp9xbeFp5kaGDvTuxg5OSQETCTOndjI0sXIxSEk sINRYvqDW2wQzidGicsnLzNCON8YJSZvX8MK0/Lt4Aqolr2MEic/TGGCcN4zSizetJ4dpEpY wEbi/9WPbCC2iECoxJenl5hBbGaBJlaJT0fKQGw2AS2J/S9ugNXwCyhKXP3xmBHE5hWwk7j+ 7AwLiM0ioCJx8/pjMFtUIELi04PDrBA1ghInZz4Bi3MKxEpMmPudFWK+uMStJ/OZIGx5ieat s5lBjpMQuMQu8enLJTaIF1wk5v7/xgRhC0u8Or6FHcKWknjZ3wZlV0usPHmEDaK5g1Fiy/4L UP8bS+xfOhmomQNog6bE+l36EGFFiZ2/5zJCLOaTePe1hxWkREKAV6KjTQiiRFni8oO7UGsl JRa3d7JNYFSaheSdWUhemIXkhVkIyxYwsqxiFEstKM5NTy02LDBEju5NjOBUrmW6g3HKOZ9D jAIcjEo8vDdCJscKsSaWFVfmHmKU4GBWEuG1+TMpVog3JbGyKrUoP76oNCe1+BCjKTC0JzJL iSbnA/NMXkm8oamRsbGxhYmhmamhoZI4r0d6Q6yQQHpiSWp2ampBahFMHxMHp1QDo37LtXU7 3F4+3VjPv9pW5nMe77Ir6ho/HuofXPI6/E6Fy5kL/QxBh86LLLiwckPa26VCi0JOb7WeG+1m U//25Yf/M1ebL3l4pFZ59k7GhS+eawTa5s3UtDUpd1JU7n0tym8lwPRjOf86J8Nd+1lfPyla Lupe8+eR1TlNm6WFEnn729KOx1S/mKnEUpyRaKjFXFScCABhZ2sy+wMAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrMIsWRmVeSWpSXmKPExsWy7bCSvK7xqcmxBgcuClgcOraV3eLr6VOM FssuHWW0mL53E5vF+fMb2C3ONr1ht7jVIGOx4u5HVotNj6+xWnT9Wsls8bn3CKPF5w2PGS1u N65gs1h97iCbRdehv2wWG796OAh4vL/Ryu4xu+Eii8eCTaUem1Z1snncubaHzWPzknqPje92 MHkcfLeHyaNvyypGj8+b5AK4orhsUlJzMstSi/TtErgyHm56zVZwtb7i28LTTA2MneldjJwc EgImEt8OrmDpYuTiEBLYzShx69EmdoiEpMS0i0eZuxg5gGxhicOHiyFq3jJKPJ7WxAZSIyxg I/H/6kcwW0QgVOJP53JWkCJmgSZWia7v1xkhOprYJE7sv8MCUsUmoCWx/8UNsA5+AUWJqz8e M4LYvAJ2EtefnQGrYRFQkbh5/TGYLSoQIXF4xyyoGkGJkzOfgMU5BWIlJsz9zgpiMwuoS/yZ d4kZwhaXuPVkPhOELS/RvHU28wRG4VlI2mchaZmFpGUWkpYFjCyrGCVTC4pz03OLDQsM81LL 9YoTc4tL89L1kvNzNzGCo1pLcwfj5SXxhxgFOBiVeHgbgibHCrEmlhVX5h5ilOBgVhLhtfkz KVaINyWxsiq1KD++qDQntfgQozQHi5I479O8Y5FCAumJJanZqakFqUUwWSYOTqkGxqwnW6cc 1M62ZlfIKPSr/PbhburEVbcX77gXttvHimmOb9+5Mj+drIvMe6YulGW9peK2R94tIOvoqy27 Hi6I14rVNp1xeZPTQaszdfZB/3dFfDVNd8veH33ao4j1yawp3ZKqPvrB2uy7T1fP0NXp2PeO /f76O9Kva94JMpbf15Q09T2TwBafocRSnJFoqMVcVJwIACWQ27rmAgAA X-CMS-MailID: 20191001215043epcas1p272c6545368f976bb22ae753343a64cfe X-Msg-Generator: CA X-Sendblock-Type: SVC_REQ_APPROVE CMS-TYPE: 101P DLP-Filter: Pass X-CFilter-Loop: Reflected X-CMS-RootMailID: 20190924101145epcas4p37f7d25b8743c25520b33fa392cd80d45 References: <58fdd2c226a4e76a3d9427baab7dd5c23af842ab.1569319738.git.leonard.crestez@nxp.com> <40885624-8f11-4eea-d5bf-d6bb50fa44dd@samsung.com> <5f12931b-92f8-15d8-8498-f02a7c2e999f@samsung.com> <2c0f7b6f-97df-9548-dde5-dda95f6a447c@samsung.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20191001_145059_303615_2B8E1BB8 X-CRM114-Status: GOOD ( 25.73 ) 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: =?UTF-8?B?QXJ0dXIgxZp3aWdvxYQ=?= , Abel Vesa , Saravana Kannan , "linux-pm@vger.kernel.org" , Viresh Kumar , dl-linux-imx , Krzysztof Kozlowski , Lukasz Luba , Kyungmin Park , MyungJoo Ham , Alexandre Bailon , 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 T24gMTkuIDEwLiAxLiDsmKTtm4QgNjozOSwgTGVvbmFyZCBDcmVzdGV6IHdyb3RlOgo+IE9uIDIw MTktMTAtMDEgMTI6MzcgQU0sIENoYW53b28gQ2hvaSB3cm90ZToKPj4gSGksCj4+Cj4+IE9uIDE5 LiA5LiAzMC4g7Jik7ZuEIDEwOjE2LCBMZW9uYXJkIENyZXN0ZXogd3JvdGU6Cj4+PiBPbiAyMDE5 LTA5LTI3IDQ6NDUgQU0sIENoYW53b28gQ2hvaSB3cm90ZToKPj4+PiBPbiAxOS4gOS4gMjYuIOyY pO2bhCAxMDo0MywgTGVvbmFyZCBDcmVzdGV6IHdyb3RlOgo+Pj4+PiBPbiAyMDE5LTA5LTI2IDQ6 MDcgQU0sIENoYW53b28gQ2hvaSB3cm90ZToKPj4+Pj4+IE9uIDE5LiA5LiAyNi4g7Jik7KCEIDY6 MTgsIExlb25hcmQgQ3Jlc3RleiB3cm90ZToKPj4+Pj4+PiBPbiAyNS4wOS4yMDE5IDA1OjExLCBD aGFud29vIENob2kgd3JvdGU6Cj4+Pj4+Pj4+IE9uIDE5LiA5LiAyNC4g7Jik7ZuEIDc6MTEsIExl b25hcmQgQ3Jlc3RleiB3cm90ZToKPj4+Pj4+Pj4+IFJlZ2lzdGVyIG5vdGlmaWVycyB3aXRoIHRo ZSBQTSBRb1MgZnJhbWV3b3JrIGluIG9yZGVyIHRvIHJlc3BvbmQgdG8KPj4+Pj4+Pj4+IHJlcXVl c3RzIGZvciBERVZfUE1fUU9TX01JTl9GUkVRVUVOQ1kgYW5kIERFVl9QTV9RT1NfTUFYX0ZSRVFV RU5DWS4KPj4+Pj4+Pj4+Cj4+Pj4+Pj4+PiBObyBub3RpZmllcnMgYXJlIGFkZGVkIGJ5IHRoaXMg cGF0Y2ggYnV0IFBNIFFvUyBjb25zdHJhaW50cyBjYW4gYmUKPj4+Pj4+Pj4+IGltcG9zZWQgZXh0 ZXJuYWxseSAoZm9yIGV4YW1wbGUgZnJvbSBvdGhlciBkZXZpY2VzKS4KPj4+Pj4+Pj4+Cj4+Pj4+ Pj4+PiBTaWduZWQtb2ZmLWJ5OiBMZW9uYXJkIENyZXN0ZXogPGxlb25hcmQuY3Jlc3RlekBueHAu Y29tPgo+Pj4+Pj4+Pj4gUmV2aWV3ZWQtYnk6IE1hdHRoaWFzIEthZWhsY2tlIDxta2FAY2hyb21p dW0ub3JnPgo+Pj4+Pj4+Pj4gLS0tCj4+Pj4+Pj4+PiAgICAgIGRyaXZlcnMvZGV2ZnJlcS9kZXZm cmVxLmMgfCA3NSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKPj4+Pj4+ Pj4+ICAgICAgaW5jbHVkZS9saW51eC9kZXZmcmVxLmggICB8ICA1ICsrKwo+Pj4+Pj4+Pj4gICAg ICAyIGZpbGVzIGNoYW5nZWQsIDgwIGluc2VydGlvbnMoKykKPj4+Pj4+Pj4+Cj4+Pj4+Pj4+PiBk aWZmIC0tZ2l0IGEvZHJpdmVycy9kZXZmcmVxL2RldmZyZXEuYyBiL2RyaXZlcnMvZGV2ZnJlcS9k ZXZmcmVxLmMKPj4+Pj4+Pj4+IGluZGV4IGVlZTQwM2U3MGM4NC4uNzg0ZjNlNDA1MzZhIDEwMDY0 NAo+Pj4+Pj4+Pj4gLS0tIGEvZHJpdmVycy9kZXZmcmVxL2RldmZyZXEuYwo+Pj4+Pj4+Pj4gKysr IGIvZHJpdmVycy9kZXZmcmVxL2RldmZyZXEuYwo+Pj4+Pj4+Pj4gQEAgLTIyLDE1ICsyMiwxOCBA QAo+Pj4+Pj4+Pj4gICAgICAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Cj4+Pj4+ Pj4+PiAgICAgICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Cj4+Pj4+Pj4+PiAgICAgICNpbmNsdWRl IDxsaW51eC9wcmludGsuaD4KPj4+Pj4+Pj4+ICAgICAgI2luY2x1ZGUgPGxpbnV4L2hydGltZXIu aD4KPj4+Pj4+Pj4+ICAgICAgI2luY2x1ZGUgPGxpbnV4L29mLmg+Cj4+Pj4+Pj4+PiArI2luY2x1 ZGUgPGxpbnV4L3BtX3Fvcy5oPgo+Pj4+Pj4+Pj4gICAgICAjaW5jbHVkZSAiZ292ZXJub3IuaCIK Pj4+Pj4+Pj4+ICAgICAgCj4+Pj4+Pj4+PiAgICAgICNkZWZpbmUgQ1JFQVRFX1RSQUNFX1BPSU5U Uwo+Pj4+Pj4+Pj4gICAgICAjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL2RldmZyZXEuaD4KPj4+Pj4+ Pj4+ICAgICAgCj4+Pj4+Pj4+PiArI2RlZmluZSBIWl9QRVJfS0haCTEwMDAKPj4+Pj4+Pj4+ICsK Pj4+Pj4+Pj4+ICAgICAgc3RhdGljIHN0cnVjdCBjbGFzcyAqZGV2ZnJlcV9jbGFzczsKPj4+Pj4+ Pj4+ICAgICAgCj4+Pj4+Pj4+PiAgICAgIC8qCj4+Pj4+Pj4+PiAgICAgICAqIGRldmZyZXEgY29y ZSBwcm92aWRlcyBkZWxheWVkIHdvcmsgYmFzZWQgbG9hZCBtb25pdG9yaW5nIGhlbHBlcgo+Pj4+ Pj4+Pj4gICAgICAgKiBmdW5jdGlvbnMuIEdvdmVybm9ycyBjYW4gdXNlIHRoZXNlIG9yIGNhbiBp bXBsZW1lbnQgdGhlaXIgb3duCj4+Pj4+Pj4+PiBAQCAtMTA5LDEwICsxMTIsMTEgQEAgc3RhdGlj IHVuc2lnbmVkIGxvbmcgZmluZF9hdmFpbGFibGVfbWF4X2ZyZXEoc3RydWN0IGRldmZyZXEgKmRl dmZyZXEpCj4+Pj4+Pj4+PiAgICAgIHN0YXRpYyB2b2lkIGdldF9mcmVxX3JhbmdlKHN0cnVjdCBk ZXZmcmVxICpkZXZmcmVxLAo+Pj4+Pj4+Pj4gICAgICAJCQkgICB1bnNpZ25lZCBsb25nICptaW5f ZnJlcSwKPj4+Pj4+Pj4+ICAgICAgCQkJICAgdW5zaWduZWQgbG9uZyAqbWF4X2ZyZXEpCj4+Pj4+ Pj4+PiAgICAgIHsKPj4+Pj4+Pj4+ICAgICAgCXVuc2lnbmVkIGxvbmcgKmZyZXFfdGFibGUgPSBk ZXZmcmVxLT5wcm9maWxlLT5mcmVxX3RhYmxlOwo+Pj4+Pj4+Pj4gKwl1bnNpZ25lZCBsb25nIHFv c19taW5fZnJlcSwgcW9zX21heF9mcmVxOwo+Pj4+Pj4+Pj4gICAgICAKPj4+Pj4+Pj4+ICAgICAg CWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmRldmZyZXEtPmxvY2spOwo+Pj4+Pj4+Pj4gICAgICAKPj4+ Pj4+Pj4+ICAgICAgCS8qCj4+Pj4+Pj4+PiAgICAgIAkgKiBJbml0IG1pbi9tYXggZnJlcXVlbmN5 IGZyb20gZnJlcSB0YWJsZS4KPj4+Pj4+Pj4+IEBAIC0xMjUsMTAgKzEyOSwxOCBAQCBzdGF0aWMg dm9pZCBnZXRfZnJlcV9yYW5nZShzdHJ1Y3QgZGV2ZnJlcSAqZGV2ZnJlcSwKPj4+Pj4+Pj4+ICAg ICAgCX0gZWxzZSB7Cj4+Pj4+Pj4+PiAgICAgIAkJKm1pbl9mcmVxID0gZnJlcV90YWJsZVtkZXZm cmVxLT5wcm9maWxlLT5tYXhfc3RhdGUgLSAxXTsKPj4+Pj4+Pj4+ICAgICAgCQkqbWF4X2ZyZXEg PSBmcmVxX3RhYmxlWzBdOwo+Pj4+Pj4+Pj4gICAgICAJfQo+Pj4+Pj4+Pj4gICAgICAKPj4+Pj4+ Pj4+ICsJLyogY29uc3RyYWludHMgZnJvbSBQTSBRb1MgKi8KPj4+Pj4+Pj4KPj4+Pj4+Pj4gQXMg SSBjb21tZW50ZWQgb24gcGF0Y2g0LAo+Pj4+Pj4+PiAnY29uc3RyYWludHMnIC0+ICdDb25zdHJh aW50JyBiZWNhdXNlIGZpcnN0IHZlcmIgaGF2ZSB0byBiZSB1c2VkCj4+Pj4+Pj4+IGFzIHRoZSBz aWd1bGFyIHZlcmJzLgo+Pj4+Pj4+Cj4+Pj4+Pj4gQWxyZWFkeSBkaXNjdXNzZWQgZm9yIGFub3Ro ZXIgcGF0Y2g7IEkgd2lsbCBtb2RpZnkgdG8gIkFwcGx5IGNvbnN0cmFpbnRzCj4+Pj4+Pj4gZnJv bSBQTSBRb1MiIGluc3RlYWQuCj4+Pj4+Pgo+Pj4+Pj4gSSBhZ3JlZSB0aGUgbmV3IGNvbW1lbnQg d2l0aCAnQXBwbHkgY29uc3RyYWludHMgLi4uICcuCj4+Pj4+Pgo+Pj4+Pj4+Cj4+Pj4+Pj4+IEkg cHJlZmVyIHRvIHVzZSBmb2xsb3dpbmcgY29tbWVudHM6Cj4+Pj4+Pj4+Cj4+Pj4+Pj4+IAkvKiBD b25zdHJhaW50IG1pbmltdW0vbWF4aW11bSBmcmVxdWVuY3kgZnJvbSBQTSBRb1MgY29uc3RyYWlu dHMgKi8KPj4+Pj4+Pj4KPj4+Pj4+Pj4+ICsJcW9zX21pbl9mcmVxID0gZGV2X3BtX3Fvc19yZWFk X3ZhbHVlKGRldmZyZXEtPmRldi5wYXJlbnQsCj4+Pj4+Pj4+PiArCQkJCQkgICAgIERFVl9QTV9R T1NfTUlOX0ZSRVFVRU5DWSk7Cj4+Pj4+Pj4+PiArCXFvc19tYXhfZnJlcSA9IGRldl9wbV9xb3Nf cmVhZF92YWx1ZShkZXZmcmVxLT5kZXYucGFyZW50LAo+Pj4+Pj4+Pj4gKwkJCQkJICAgICBERVZf UE1fUU9TX01JTl9GUkVRVUVOQ1kpOwo+Pj4+Pj4+Pj4gKwkqbWluX2ZyZXEgPSBtYXgoKm1pbl9m cmVxLCBIWl9QRVJfS0haICogcW9zX21pbl9mcmVxKTsKPj4+Pj4+Pj4+ICsJKm1heF9mcmVxID0g bWluKCptYXhfZnJlcSwgSFpfUEVSX0tIWiAqIHFvc19tYXhfZnJlcSk7Cj4+Pj4+Pj4+PiArCj4+ Pj4+Pj4+PiAgICAgIAkvKiBjb25zdHJhaW50cyBmcm9tIHN5c2ZzICovCj4+Pj4+Pj4+PiAgICAg IAkqbWluX2ZyZXEgPSBtYXgoKm1pbl9mcmVxLCBkZXZmcmVxLT5taW5fZnJlcSk7Cj4+Pj4+Pj4+ PiAgICAgIAkqbWF4X2ZyZXEgPSBtaW4oKm1heF9mcmVxLCBkZXZmcmVxLT5tYXhfZnJlcSk7Cj4+ Pj4+Pj4+PiAgICAgIAo+Pj4+Pj4+Pj4gICAgICAJLyogY29uc3RyYWludHMgZnJvbSBPUFAgaW50 ZXJmYWNlICovCj4+Pj4+Pj4+PiBAQCAtNjA2LDEwICs2MTgsNDkgQEAgc3RhdGljIGludCBkZXZm cmVxX25vdGlmaWVyX2NhbGwoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwgdW5zaWduZWQgbG9u ZyB0eXBlLAo+Pj4+Pj4+Pj4gICAgICAJbXV0ZXhfdW5sb2NrKCZkZXZmcmVxLT5sb2NrKTsKPj4+ Pj4+Pj4+ICAgICAgCj4+Pj4+Pj4+PiAgICAgIAlyZXR1cm4gcmV0Owo+Pj4+Pj4+Pj4gICAgICB9 Cj4+Pj4+Pj4+PiAgICAgIAo+Pj4+Pj4+Pj4gKy8qKgo+Pj4+Pj4+Pj4gKyAqIHFvc19ub3RpZmll cl9jYWxsKCkgLSBDb21tb24gaGFuZGxlciBmb3IgUW9TIGNvbnN0cmFpbnRzLgo+Pj4+Pj4+Pj4g KyAqIEBkZXZmcmVxOiAgICB0aGUgZGV2ZnJlcSBpbnN0YW5jZS4KPj4+Pj4+Pj4+ICsgKi8KPj4+ Pj4+Pj4+ICtzdGF0aWMgaW50IHFvc19ub3RpZmllcl9jYWxsKHN0cnVjdCBkZXZmcmVxICpkZXZm cmVxKQo+Pj4+Pj4+Pj4gK3sKPj4+Pj4+Pj4+ICsJaW50IGVycjsKPj4+Pj4+Pj4+ICsKPj4+Pj4+ Pj4+ICsJbXV0ZXhfbG9jaygmZGV2ZnJlcS0+bG9jayk7Cj4+Pj4+Pj4+PiArCWVyciA9IHVwZGF0 ZV9kZXZmcmVxKGRldmZyZXEpOwo+Pj4+Pj4+Pj4gKwltdXRleF91bmxvY2soJmRldmZyZXEtPmxv Y2spOwo+Pj4+Pj4+Pj4gKwlpZiAoZXJyKQo+Pj4+Pj4+Pj4gKwkJZGV2X2VycihkZXZmcmVxLT5k ZXYucGFyZW50LAo+Pj4+Pj4+Pj4gKwkJCQkiZmFpbGVkIHRvIHVwZGF0ZSBmcmVxdWVuY3kgZm9y IFBNIFFvUyBjb25zdHJhaW50cyAoJWQpXG4iLAo+Pj4+Pj4+Pgo+Pj4+Pj4+PiBJcyBpdCBub3Qg b3ZlciA4MCBjaGFyPwo+Pj4+Pj4+Cj4+Pj4+Pj4gWWVzIGJ1dCBjb2Rpbmcgc3R5bGUgZXhwbGlj aXRseSBmb3JiaWRzIGJyZWFraW5nIHN0cmluZ3MuCj4+Pj4+Pj4KPj4+Pj4+Pj4+ICsJCQkJZXJy KTsKPj4+Pj4+Pj4+ICsKPj4+Pj4+Pj4+ICsJcmV0dXJuIE5PVElGWV9PSzsKPj4+Pj4+Pj4+ICt9 Cj4+Pj4+Pj4+PiArCj4+Pj4+Pj4+PiArLyoqCj4+Pj4+Pj4+PiArICogcW9zX21pbl9ub3RpZmll cl9jYWxsKCkgLSBDYWxsYmFjayBmb3IgUW9TIG1pbl9mcmVxIGNoYW5nZXMuCj4+Pj4+Pj4+PiAr ICogQG5iOgkJU2hvdWxkIGJlIGRldmZyZXEtPm5iX21pbgo+Pj4+Pj4+Pj4gKyAqLwo+Pj4+Pj4+ Pj4gK3N0YXRpYyBpbnQgcW9zX21pbl9ub3RpZmllcl9jYWxsKHN0cnVjdCBub3RpZmllcl9ibG9j ayAqbmIsCj4+Pj4+Pj4+PiArCQkJCQkgdW5zaWduZWQgbG9uZyB2YWwsIHZvaWQgKnB0cikKPj4+ Pj4+Pj4+ICt7Cj4+Pj4+Pj4+PiArCXJldHVybiBxb3Nfbm90aWZpZXJfY2FsbChjb250YWluZXJf b2YobmIsIHN0cnVjdCBkZXZmcmVxLCBuYl9taW4pKTsKPj4+Pj4+Pj4+ICt9Cj4+Pj4+Pj4+PiAr Cj4+Pj4+Pj4+PiArLyoqCj4+Pj4+Pj4+PiArICogcW9zX21heF9ub3RpZmllcl9jYWxsKCkgLSBD YWxsYmFjayBmb3IgUW9TIG1heF9mcmVxIGNoYW5nZXMuCj4+Pj4+Pj4+PiArICogQG5iOgkJU2hv dWxkIGJlIGRldmZyZXEtPm5iX21heAo+Pj4+Pj4+Pj4gKyAqLwo+Pj4+Pj4+Pj4gK3N0YXRpYyBp bnQgcW9zX21heF9ub3RpZmllcl9jYWxsKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCj4+Pj4+ Pj4+PiArCQkJCQkgdW5zaWduZWQgbG9uZyB2YWwsIHZvaWQgKnB0cikKPj4+Pj4+Pj4+ICt7Cj4+ Pj4+Pj4+PiArCXJldHVybiBxb3Nfbm90aWZpZXJfY2FsbChjb250YWluZXJfb2YobmIsIHN0cnVj dCBkZXZmcmVxLCBuYl9tYXgpKTsKPj4+Pj4+Pj4+ICt9Cj4+Pj4+Pj4+PiArCj4+Pj4+Pj4+PiAg ICAgIC8qKgo+Pj4+Pj4+Pj4gICAgICAgKiBkZXZmcmVxX2Rldl9yZWxlYXNlKCkgLSBDYWxsYmFj ayBmb3Igc3RydWN0IGRldmljZSB0byByZWxlYXNlIHRoZSBkZXZpY2UuCj4+Pj4+Pj4+PiAgICAg ICAqIEBkZXY6CXRoZSBkZXZmcmVxIGRldmljZQo+Pj4+Pj4+Pj4gICAgICAgKgo+Pj4+Pj4+Pj4g ICAgICAgKiBSZW1vdmUgZGV2ZnJlcSBmcm9tIHRoZSBsaXN0IGFuZCByZWxlYXNlIGl0cyByZXNv dXJjZXMuCj4+Pj4+Pj4+PiBAQCAtNjIwLDEwICs2NzEsMTUgQEAgc3RhdGljIHZvaWQgZGV2ZnJl cV9kZXZfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCj4+Pj4+Pj4+PiAgICAgIAo+Pj4+Pj4+ Pj4gICAgICAJbXV0ZXhfbG9jaygmZGV2ZnJlcV9saXN0X2xvY2spOwo+Pj4+Pj4+Pj4gICAgICAJ bGlzdF9kZWwoJmRldmZyZXEtPm5vZGUpOwo+Pj4+Pj4+Pj4gICAgICAJbXV0ZXhfdW5sb2NrKCZk ZXZmcmVxX2xpc3RfbG9jayk7Cj4+Pj4+Pj4+PiAgICAgIAo+Pj4+Pj4+Pj4gKwlkZXZfcG1fcW9z X3JlbW92ZV9ub3RpZmllcihkZXZmcmVxLT5kZXYucGFyZW50LCAmZGV2ZnJlcS0+bmJfbWF4LAo+ Pj4+Pj4+Pj4gKwkJCURFVl9QTV9RT1NfTUFYX0ZSRVFVRU5DWSk7Cj4+Pj4+Pj4+PiArCWRldl9w bV9xb3NfcmVtb3ZlX25vdGlmaWVyKGRldmZyZXEtPmRldi5wYXJlbnQsICZkZXZmcmVxLT5uYl9t aW4sCj4+Pj4+Pj4+PiArCQkJREVWX1BNX1FPU19NSU5fRlJFUVVFTkNZKTsKPj4+Pj4+Pj4+ICsK Pj4+Pj4+Pj4KPj4+Pj4+Pj4gSnVzdCBwcmludCBlcnJvciB3aXRoIGRldl9lcnIoKSB3aXRob3V0 IHN0b3BwaW5nIHRoZSByZWxlYXNlIHN0ZXAuCj4+Pj4+Pj4+Cj4+Pj4+Pj4+IEkgcHJlZmVyIHRv IGhhbmRsZSB0aGUgcmV0dXJuIHZhbHVlIGlmIGtlcm5lbCBBUEkgcHJvdmlkZXMKPj4+Pj4+Pj4g dGhlIGVycm9yIGNvZGUuCj4+Pj4+Pgo+Pj4+Pj4gSG93IGFib3V0Pwo+Pj4+Pgo+Pj4+PiBNb2Rp ZmllZCB0byBkZXZfd2Fybi4gVGhpcyBhbHNvIGFwcGxpZXMgdG8gUEFUQ0ggNiBzbyBJIHJlcGxp ZWQgdGhlcmUuCj4+Pj4+Cj4+Pj4+Pj4+PiAgICAgIAlpZiAoZGV2ZnJlcS0+cHJvZmlsZS0+ZXhp dCkKPj4+Pj4+Pj4+ICAgICAgCQlkZXZmcmVxLT5wcm9maWxlLT5leGl0KGRldmZyZXEtPmRldi5w YXJlbnQpOwo+Pj4+Pj4+Pj4gICAgICAKPj4+Pj4+Pj4+ICAgICAgCWtmcmVlKGRldmZyZXEtPnRp bWVfaW5fc3RhdGUpOwo+Pj4+Pj4+Pj4gICAgICAJa2ZyZWUoZGV2ZnJlcS0+dHJhbnNfdGFibGUp Owo+Pj4+Pj4+Pj4gQEAgLTczMywxMCArNzg5LDI4IEBAIHN0cnVjdCBkZXZmcmVxICpkZXZmcmVx X2FkZF9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2LAo+Pj4+Pj4+Pj4gICAgICAJaWYgKGVycikg ewo+Pj4+Pj4+Pj4gICAgICAJCXB1dF9kZXZpY2UoJmRldmZyZXEtPmRldik7Cj4+Pj4+Pj4+PiAg ICAgIAkJZ290byBlcnJfb3V0Owo+Pj4+Pj4+Pj4gICAgICAJfQo+Pj4+Pj4+Pj4gICAgICAKPj4+ Pj4+Pj4+ICsJLyoKPj4+Pj4+Pj4+ICsJICogUmVnaXN0ZXIgbm90aWZpZXJzIGZvciB1cGRhdGVz IHRvIG1pbi9tYXhfZnJlcSBhZnRlciBkZXZpY2UgaXMKPj4+Pj4+Pj4+ICsJICogaW5pdGlhbGl6 ZWQgKGFuZCB3ZSBjYW4gaGFuZGxlIG5vdGlmaWNhdGlvbnMpIGJ1dCBiZWZvcmUgdGhlCj4+Pj4+ Pj4+PiArCSAqIGdvdmVybm9yIGlzIHN0YXJ0ZWQgKHdoaWNoIHNob3VsZCBkbyBhbiBpbml0aWFs IGVuZm9yY2VtZW50IG9mCj4+Pj4+Pj4+PiArCSAqIGNvbnN0cmFpbnRzKS4KPj4+Pj4+Pj4+ICsJ ICovCj4+Pj4+Pj4+Cj4+Pj4+Pj4+IE15IHByZXZpb3VzIGNvbW1lbnQgaXMgbm90IGVub3VnaCB3 aHkgSSBwcmVmZXIgdG8gcmVtb3ZlIGl0LiBTb3JyeS4KPj4+Pj4+Pj4gQWN0dWFsbHksIHVudGls IG5vdywgdGhlIGRldmZyZXFfYWRkX2RldmljZSgpIGRvbid0IGhhdmUgdGhlIGRldGFpbGVkCj4+ Pj4+Pj4+IGNvbW1lbnRzIGJlY2F1c2UgdGhlIGxpbmUgY29kZSBpcyBub3QgdG9vIGxvbmcuIEJ1 dCwgYXQgdGhlIHByZXNlbnQgdGltZSwKPj4+Pj4+Pj4gZGV2ZnJlcV9hZGRfZGV2aWNlKCkgaXMg dG9vIGxvbmcuIEl0IG1lYW5zIHRoYXQgdGhlIGRldGFpbGVkIGNvbW1lbnQKPj4+Pj4+Pj4gYXJl IG5lY2Vzc2FyeS4KPj4+Pj4+Pj4KPj4+Pj4+Pj4gU28sIEknbGwgYWRkIHRoZSBkZXRhaWxlZCBj b21tZW50IGZvciBlYWNoIHN0ZXAgb2YgZGV2ZnJlcV9hZGRfZGV2aWNlKCkKPj4+Pj4+Pj4gb24g c2VwYXJhdGUgcGF0Y2ggdG8ga2VlcCB0aGUgc2FtZSBzdHlsZS4gSSdsbCBzZW5kIHRoZSBwYXRj aCB0byB5b3UKPj4+Pj4+Pj4gZm9yIHRoZSByZXZpZXcuCj4+Pj4+Pj4KPj4+Pj4+PiBUaGlzIGlz IHZlcnkgbGlrZWx5IHRvIHJlc3VsdCBpbiBtZXJnZSBjb25mbGljdHMsIG1heWJlIHdhaXQgZm9y IG15Cj4+Pj4+Pj4gc2VyaWVzIHRvIGdvIGluIGZpcnN0Pwo+Pj4+Pj4KPj4+Pj4+IEknbGwgc2Vu ZCB0aGUgc2VwYXJhdGUgcGF0Y2ggYWZ0ZXIgZmluaXNoZWQgdGhlIHJldmlldyBvZiB0aGVzZSBw YXRjaGVzLgo+Pj4+Pj4gU28sIGlmIHlvdSBhZ3JlZSwgcGxlYXNlIHJlbW92ZSB0aGlzIGNvbW1l bnQgb24gdGhpcyBwYXRjaC4KPj4+Pj4+Cj4+Pj4+PiBZb3UgY2FuIHJldmlldyB0aGUgZGV0YWls ZWQgY29tbWVudHMgb24gc2VwYXJhdGUgcGF0Y2ggd2hlbiBJIHNlbmQuCj4+Pj4+IFRoaXMgcGF0 Y2ggYWxyZWFkeSBjb250YWlucyBjb21tZW50cyBhbmQgdGhleSBleHBsYWluIHRoZSBjb2RlIGJl aW5nCj4+Pj4+IGFkZGVkLiBEb2Vzbid0IGl0IG1ha2UgbW9yZSBzZW5zZSBmb3IgY29tbWVudHMg YW5kIGNvZGUgdG8gZ28gaW4gdG9nZXRoZXI/Cj4+Pj4+Cj4+Pj4+IEkgdGhpbmsgdGhlIGNvbW1l bnQgaXMgYSByZXNvbmFibGUgZXhwbGFuYXRpb24gYXMgdG8gd2h5IG5vdGlmaWVycyBhcmUKPj4+ Pj4gcmVnaXN0ZXJlZCBhdCB0aGF0IHNwZWNpZmljIHN0ZXAgaW4gdGhlIGluaXRpYWxpemF0aW9u IHNlcXVlbmNlLgo+Pj4+Cj4+Pj4gSWYgeW91IGFkZCB0aGlzIGNvbW1lbnQgb24gdGhpcyBwYXRj aCwgT0suIGp1c3QgSSBoYXZlIHNvbWUgY29tbWVudHMuCj4+Pj4KPj4+PiAJLyoKPj4+PiAJICog UmVnaXN0ZXIgbm90aWZpZXJzIGZvciB1cGRhdGVzIHRvIG1pbi9tYXhfZnJlcSBhZnRlciBkZXZp Y2UgaXMKPj4+PiAJICogaW5pdGlhbGl6ZWQgKGFuZCB3ZSBjYW4gaGFuZGxlIG5vdGlmaWNhdGlv bnMpIGJ1dCBiZWZvcmUgdGhlCj4+Pj4KPj4+PiBJIHRoaW5rIHRoYXQgJ2RldmljZSBpcyBpbml0 aWFsaXplZCcgaXMgbm90IG5lZWRlZC4KPj4+PiBJdCBpcyBhbHdheXMgdHJ1ZSwgaXQgZG9uJ3Qg bmVlZCB0byBhZGQgdGhlIGFkZGl0aW9uYWwgY29tbWVudHMuCj4+Pj4gYmVjYXVzZSBkZXZfcG1f cW9zX2FkZF9ub3RpZmllcigpIG11c3QgbmVlZCB0aGUgJ2RldmZyZXEtPmRldicuCj4+Pj4gVGhl IHRoaXMgY29kZSBwcm92ZSB0aGUgY2FsbCBzZXF1ZW5jZSBiZXR3ZWVuIHRoZW0uCj4+Pgo+Pj4g SW4gdGhlb3J5IGlmIGEgbm90aWZpZXIgaXMgcmVnaXN0ZXJlZCB0b28gc29vbiB0aGVuIGl0IGNv dWxkIGNyYXNoIG9uIGEKPj4+IE5VTEwgcG9pbnRlci4gQnV0IGxvb2tpbmcgYXQgdGhlIGNvZGUg aXQgZmlyc3QgY2hlY2tzIHRoYXQgImdvdmVybm9yICE9Cj4+PiBOVUxMKSBzbyBpdCB3b3VsZCBi ZSBoYXJtbGVzcy4KPj4+Cj4+Pj4KPj4+PiBBYm91dCAndXMnLCBkb24ndCB1c2UgJ3dlJy4gVGhl IHN1YmplY3QgaXMgJ2RldmZyZXEnIG9yIG90aGVyIGRldmljZSBpbnN0ZWFkIG9mIHVzLgo+Pj4+ Cj4+Pj4gCSAqIGdvdmVybm9yIGlzIHN0YXJ0ZWQgKHdoaWNoIHNob3VsZCBkbyBhbiBpbml0aWFs IGVuZm9yY2VtZW50IG9mCj4+Pj4gCSAqIGNvbnN0cmFpbnRzKS4KPj4+PiAgICAJICovCj4+Pj4K Pj4+PiBBY3R1YWxseSwgaXQgZG9lc24ndCBtYXR0ZXIgdGhlIGluaXRpYWxpemF0aW9uIHN0ZXAg YmV0d2VlbiBnb3Zlcm5vcgo+Pj4+IGFuZCBQTV9RT1MgcmVnaXN0cmF0aW9uLgo+Pj4KPj4+IElu IHRoZW9yeSBQTSBRb1MgY29uc3RyYWludHMgY291bGQgYmUgbW9kaWZpZWQgYmV0d2VlbiBnb3Zl cm5vciBzdGFydHVwCj4+PiBhbmQgbm90aWZpZXIgcmVnaXN0cmF0aW9uIGFuZCB0aGF0IHVwZGF0 ZSB3b3VsZCBiZSBsb3N0ICh1bnRpbCB0aGUgbmV4dAo+Pj4gb25lKS4KPj4KPj4gRG9uJ3QgbG9z ZSB0aGUgYW55IG9mIFBNIFFvUyByZXF1ZXN0LiBVc2VyIGNhbiByZXF1ZXN0IHRoZSBhbnkgZnJl cXVlbmN5Cj4+IHRocm91Z2ggUE1Rb1MgYXQgdGhlIGFueSB0aW1lIGFuZCB0aGVuIGRldmZyZXEg Y29uc2lkZXIgdGhlIGNvbnN0cmFpbnRzCj4+IGZyb20gUE0gUW9TLgo+Pgo+PiBBbHNvLCBhZnRl ciBmaW5pc2hlZCB0aGUgcmVnaXN0cmF0aW9uIG9mIGRldmZyZXEgZGV2aWNlLAo+PiB0aGUgdXNl ciAob3RoZXIgZGV2aWNlIGRyaXZlciByZXF1aXJlZCB0aGUgbWluL21heCBmcmVxKQo+PiBjYW4g cmVxdWVzdCB0aGUgUE0gUW9TIG9uIHJlYWwgdXNlLWNhc2UuCj4+Cj4+IEl0IGlzIGltcG9zc2li bGUgdG8gZ2V0IHRoZSBkZXZmcmVxIGluc3RhbmNlIGJlZm9yZSBmaW5pc2hlZAo+PiB0aGUgZGV2 ZnJlcV9hZGRfZGV2aWNlKCkgYmVjYXVzZSB0aGUgdXNlciBjYW4gYWNjZXNzIHRoZSBkZXZmcmVx IGluc3RhbmNlCj4+IGRldmZyZXFfZ2V0X2RldmZyZXFfYnlfcGhhbmRsZSgpIHdoaWNoIHVzZSAn ZGV2ZnJlcV9saXN0Jy4KPj4KPj4gSWYgZGV2ZnJlcV9hZGRfZGV2aWNlKCkgaXMgbm90IGZpbmlz aGVkLCB0aGUgdXNlciBjYW5ub3QgZ2V0Cj4+IHRoZSBhbnkgZGV2ZnJlcSBkZXZpY2UgZnJvbSAn ZGV2ZnJlcV9saXN0Jy4KPiAKPiBQTSBRb1MgY29uc3RyYWludHMgYXJlIG5vdCBvbiBkZXZmcmVx LT5kZXYgYnV0IG9uIHRoZSBwYXJlbnQgc28gaW4gCj4gdGhlb3J5IGl0J3MgcG9zc2libGUgdG8g YWRkIGNvbnN0cmFpbnRzIGR1cmluZyBkZXZmcmVxIGluaXRpYWxpemF0aW9uLgo+IAo+IE1ha2lu ZyBQTSBRb1MgcmVxdWVzdHMgZG9lc24ndCByZXF1aXJlIGZldGNoaW5nIGRldmZyZXEgaW5zdGFu Y2VzLCBJIAo+IHRoaW5rIHlvdSBjb3VsZCBjYWxsIG9mX2ZpbmRfZGV2aWNlX2J5X25vZGUgd2l0 aCBhIHBoYW5kbGUgYW5kIHJlZ2lzdGVyIAo+IGNvbnN0cmFpbnRzIHRoYXQgd2F5LgoKWW91J3Jl IHJpZ2h0LgoKTXkgY29tbWVudCB3YXMgbm90IGVub3VnaC4gSSBtZWFuIHRoYXQgUE0gUW9TIGRl cGVuZHMgb24gdGhlIGRldmZyZXEtPmRldi5wYXJlbnQuCklmIHByb2JlKCkgb2YgZGV2ZnJlcSBk ZXZpY2UgcmVxdWlyZXMgdGhlIFBNUW9TIHJlcXVlc3QsIGl0IGlzIHBvc3NpYmxlIHRvCnJlZ2lz dGVyIFBNIFFvUy4gT24gdGhlIG90aGVyIGhhbmQsIHRoZSBvdGhlciBkZXZpY2UgZGV2aWNlIHJl Z2FyZGxlc3MKdGhlIGRldmZyZXEgZGV2aWNlIGRyaXZlciwgdGhleSBjYW4gcmVxdWVzdCBQTSBR b1MgY29uc3RyYWludHMKYWZ0ZXIgcmVnaXN0ZXJpbmcgdGhlIHBhcmVudCBkZXZpY2UgKGRldmZy ZXEtPmRldi5wYXJlbnQpLiAKCllvdXIgcGF0Y2ggYWxyZWFkeSByZWdpc3RlcmVkIHRoZSBQTSBR b1Mgbm90aWZpZXIgYmVmb3JlIGdvdmVybm9yIHN0YXJ0LgpJdCBpcyBlbm91Z2ggdG8gc2hvdyB0 aGUgeW91ciBpbnRlbnRpb24uIEkgZG9uJ3QgYW55IG9iamVjdGlvbiBvZiB0aGlzIGNvZGUuCkp1 c3QsIHRoZSB0b28gbW9yZSBkZXRhaWxlZCBjb21tZW50IG1ha2UgdGhlIGRldmZyZXEgY29yZSBj b21wbGljYXRlZC4KQXMgSSBjb21tZW50ZWQsIEkgdGhpbmsgdCBoYXQgdGhlIHNpbXBsZSBjb21t ZW50IGlzIGVub3VnaCBmb3IgZGV2ZnJlcSB1c2VyLgoKVGhhbmtzIGZvciB5b3VyIGV4cGxhbmF0 aW9uLgoKPiAKPj4+PiBJZiBzdGFydCBnb3Zlcm5vciBhbmQgdGhlbiByZWdpc3RlciBQTV9RT1Ms Cj4+Pj4gdGhlIGdvdmVybm9yIGNhbiBkZWNpZGUgdGhlIG5ldyBmcmVxdWVuY3kuIEFuZCB0aGVu IFBNX1FPUyByZXF1ZXN0Cj4+Pj4gdGhlIG5ldyBjb25zdHJhaW50cyBmb3IgbWluL21heCBmcmVx dWVuY3kuIE9uIHJlcXVlc3QgdGltZSBvZiBQTV9RT1MsCj4+Pj4gZGV2ZnJlcSBjYW4gZGV0ZWN0 IHRoaXMgdGltZSBhbmQgdGhlbiBhcHBseSB0aGUgY29uc3RyYWludHMgZnJvbSBQTV9RT1MuCj4+ Pj4gVGhlIHVzZXIgb2YgZGV2ZnJlcSdzIFBNX1FPUyBtdXN0IG5lZWQgdGhlIHBoYW5kbGUgb3Ig ZGV2aWNlIGluc3RhbmNlCj4+Pj4gb2YgZGV2ZnJlcSBkZWl2Y2UuIEl0IG1lYW5zIHRoYXQgdXNl ciBvZiBkZXZmcmVxJ3MgUE1fUU9TIGNhbiByZXF1ZXN0Cj4+Pj4gdGhlIGFueSBjb25zdHJhaW50 cyBvZiBQTV9RT1NfTUlOL01BWCB0aHJvdWdoIFBNX1FPUyBpbnRlcmZhY2UuCj4+Pj4KPj4+PiBT bywgaXQgZG9lc24ndCBuZWVkIHRvIGFkZCB0aGUgZm9sbG93aW5nIGNvbW1lbnRzCj4+Pj4gYmVj YXVzZSBmb2xsb3dpbmcgY29tbWVudCBpcyBub3QgYWx3YXlzIG1hbmRhdG9yeS4KPj4+PiAiIGdv dmVybm9yIGlzIHN0YXJ0ZWQgKHdoaWNoIHNob3VsZCBkbyBhbiBpbml0aWFsIGVuZm9yY2VtZW50 IG9mIGNvbnN0cmFpbnRzKS4iCj4+Pj4KPj4+PiBBbHNvLCB5b3UgZG9uJ3QgbmVlZCB0byB1c2Ug cGFyZW50aGVzZXMgb24gY29tbWVudHMuCj4+Pj4KPj4+PiBBY3R1YWxseSwgSSB0aGluayB0aGF0 IGZvbGxvd2luZyBjb21tZW50cyBhcmUgZW5vdWdoLgo+Pj4+Cj4+Pj4gCS8qIFJlZ2lzdGVyIFBN IFFvUyBub3RpZmllcnMgZm9yIHVwZGF0aW5nIHRvIG1pbi9tYXggZnJlcSAqLwo+Pj4KPj4+IEkg dGhvdWdodCB0aGF0IGV4cGxhbmluZyB3aHkgaXQncyBkb25lIGF0IHRoaXMgcGFydGljdWxhciBz dGVwIGJ1dCBJJ2xsCj4+PiBqdXN0IHJlbW92ZSBpdCwgZGV2ZnJlcV9hZGRfZGV2aWNlIGNhbiBn ZXQgbW9yZSBjb21tZW50cyBsYXRlci4KPj4KPj4gT0suIFRoYW5rcy4KPj4gSSB0aGluayB0aGF0 IGlmIHRoZSBjb21tZW50IGNvbnRhaW5zIHdoYXQgaXMgbWVhbmluZyBvZiB0aGUgY29kZSwKPj4g aXQgaXMgZW5vdWdoLgo+Pgo+PiBBbHRob3VnaCBjaGFuZ2UgdGhlIHNlcXVlbmNlIGJldHdlZW4g ZGV2X3BtX3Fvc19hZGRfbm90aWZpZXIoKSBhbmQKPj4gdHJ5X3RoZW5fcmVxdWVzdF9nb3Zlcm5v cigpLCBpbiB0aGUgcmVhbC1jYXNlLCB0aGUgYW55IGlzc3VlCj4+IHdvdWxkIG5vdCBoYXBwZW4u IEJlY2F1c2UgYXMgSSBjb21tZW50ZWQgYWJvdmUsIHRoZSBvdGhlciBkZXZpY2UtZHJpdmVyCj4+ IGNhbm5vdCBnZXQgdGhlIGRldmZyZXEgaW5zdGFuY2UgYmVmb3JlIGZpbmlzaGVkIHRoZSBkZXZm cmVxX2FkZF9kZXZpY2UuCj4+IEl0IG1lYW5zIHRoYXQgdGhlIHVzZXIgZGV2aWNlIGRyaXZlciBj YW5ub3QgcmVxdWVzdCB0aGUgYW55IFBNIFFvUwo+PiBjb25zdHJhaW50cy4KPj4KPj4+Cj4+Pj4+ Pj4+PiArCWRldmZyZXEtPm5iX21pbi5ub3RpZmllcl9jYWxsID0gcW9zX21pbl9ub3RpZmllcl9j YWxsOwo+Pj4+Pj4+Pj4gKwllcnIgPSBkZXZfcG1fcW9zX2FkZF9ub3RpZmllcihkZXZmcmVxLT5k ZXYucGFyZW50LCAmZGV2ZnJlcS0+bmJfbWluLAo+Pj4+Pj4+Pj4gKwkJCQkgICAgICBERVZfUE1f UU9TX01JTl9GUkVRVUVOQ1kpOwo+Pj4+Pj4+Pj4gKwlpZiAoZXJyKQo+Pj4+Pj4+Pj4gKwkJZ290 byBlcnJfZGV2ZnJlcTsKPj4+Pj4+Pj4+ICsKPj4+Pj4+Pj4+ICsJZGV2ZnJlcS0+bmJfbWF4Lm5v dGlmaWVyX2NhbGwgPSBxb3NfbWF4X25vdGlmaWVyX2NhbGw7Cj4+Pj4+Pj4+PiArCWVyciA9IGRl dl9wbV9xb3NfYWRkX25vdGlmaWVyKGRldmZyZXEtPmRldi5wYXJlbnQsICZkZXZmcmVxLT5uYl9t YXgsCj4+Pj4+Pj4+PiArCQkJCSAgICAgIERFVl9QTV9RT1NfTUFYX0ZSRVFVRU5DWSk7Cj4+Pj4+ Pj4+PiArCWlmIChlcnIpCj4+Pj4+Pj4+PiArCQlnb3RvIGVycl9kZXZmcmVxOwo+Pj4+Pj4+Pj4g Kwo+Pj4+Pj4+Pj4gICAgICAJbXV0ZXhfbG9jaygmZGV2ZnJlcV9saXN0X2xvY2spOwo+Pj4+Pj4+ Pj4gICAgICAKPj4+Pj4+Pj4+ICAgICAgCWdvdmVybm9yID0gdHJ5X3RoZW5fcmVxdWVzdF9nb3Zl cm5vcihkZXZmcmVxLT5nb3Zlcm5vcl9uYW1lKTsKPj4+Pj4+Pj4+ICAgICAgCWlmIChJU19FUlIo Z292ZXJub3IpKSB7Cj4+Pj4+Pj4+PiAgICAgIAkJZGV2X2VycihkZXYsICIlczogVW5hYmxlIHRv IGZpbmQgZ292ZXJub3IgZm9yIHRoZSBkZXZpY2VcbiIsCj4+Pj4+Pj4+PiBAQCAtNzYwLDEwICs4 MzQsMTEgQEAgc3RydWN0IGRldmZyZXEgKmRldmZyZXFfYWRkX2RldmljZShzdHJ1Y3QgZGV2aWNl ICpkZXYsCj4+Pj4+Pj4+PiAgICAgIAo+Pj4+Pj4+Pj4gICAgICAJcmV0dXJuIGRldmZyZXE7Cj4+ Pj4+Pj4+PiAgICAgIAo+Pj4+Pj4+Pj4gICAgICBlcnJfaW5pdDoKPj4+Pj4+Pj4+ICAgICAgCW11 dGV4X3VubG9jaygmZGV2ZnJlcV9saXN0X2xvY2spOwo+Pj4+Pj4+Pj4gK2Vycl9kZXZmcmVxOgo+ Pj4+Pj4+Pj4gICAgICAJZGV2ZnJlcV9yZW1vdmVfZGV2aWNlKGRldmZyZXEpOwo+Pj4+Pj4+Pj4g ICAgICAJcmV0dXJuIEVSUl9QVFIoZXJyKTsKPj4+Pj4+Pj4+ICAgICAgCj4+Pj4+Pj4+PiAgICAg IGVycl9kZXY6Cj4+Pj4+Pj4+PiAgICAgIAkvKgo+Pj4+Pj4+Pj4gZGlmZiAtLWdpdCBhL2luY2x1 ZGUvbGludXgvZGV2ZnJlcS5oIGIvaW5jbHVkZS9saW51eC9kZXZmcmVxLmgKPj4+Pj4+Pj4+IGlu ZGV4IGMzY2JjMTVmZGYwOC4uZGFjMGRmZmVhYmI0IDEwMDY0NAo+Pj4+Pj4+Pj4gLS0tIGEvaW5j bHVkZS9saW51eC9kZXZmcmVxLmgKPj4+Pj4+Pj4+ICsrKyBiL2luY2x1ZGUvbGludXgvZGV2ZnJl cS5oCj4+Pj4+Pj4+PiBAQCAtMTM0LDEwICsxMzQsMTIgQEAgc3RydWN0IGRldmZyZXFfZGV2X3By b2ZpbGUgewo+Pj4+Pj4+Pj4gICAgICAgKiBAdG90YWxfdHJhbnM6CU51bWJlciBvZiBkZXZmcmVx IHRyYW5zaXRpb25zCj4+Pj4+Pj4+PiAgICAgICAqIEB0cmFuc190YWJsZToJU3RhdGlzdGljcyBv ZiBkZXZmcmVxIHRyYW5zaXRpb25zCj4+Pj4+Pj4+PiAgICAgICAqIEB0aW1lX2luX3N0YXRlOglT dGF0aXN0aWNzIG9mIGRldmZyZXEgc3RhdGVzCj4+Pj4+Pj4+PiAgICAgICAqIEBsYXN0X3N0YXRf dXBkYXRlZDoJVGhlIGxhc3QgdGltZSBzdGF0IHVwZGF0ZWQKPj4+Pj4+Pj4+ICAgICAgICogQHRy YW5zaXRpb25fbm90aWZpZXJfbGlzdDogbGlzdCBoZWFkIG9mIERFVkZSRVFfVFJBTlNJVElPTl9O T1RJRklFUiBub3RpZmllcgo+Pj4+Pj4+Pj4gKyAqIEBuYl9taW46CQlOb3RpZmllciBibG9jayBm b3IgREVWX1BNX1FPU19NSU5fRlJFUVVFTkNZCj4+Pj4+Pj4+PiArICogQG5iX21heDoJCU5vdGlm aWVyIGJsb2NrIGZvciBERVZfUE1fUU9TX01BWF9GUkVRVUVOQ1kKPj4+Pj4+Pj4+ICAgICAgICoK Pj4+Pj4+Pj4+ICAgICAgICogVGhpcyBzdHJ1Y3R1cmUgc3RvcmVzIHRoZSBkZXZmcmVxIGluZm9y bWF0aW9uIGZvciBhIGdpdmUgZGV2aWNlLgo+Pj4+Pj4+Pj4gICAgICAgKgo+Pj4+Pj4+Pj4gICAg ICAgKiBOb3RlIHRoYXQgd2hlbiBhIGdvdmVybm9yIGFjY2Vzc2VzIGVudHJpZXMgaW4gc3RydWN0 IGRldmZyZXEgaW4gaXRzCj4+Pj4+Pj4+PiAgICAgICAqIGZ1bmN0aW9ucyBleGNlcHQgZm9yIHRo ZSBjb250ZXh0IG9mIGNhbGxiYWNrcyBkZWZpbmVkIGluIHN0cnVjdAo+Pj4+Pj4+Pj4gQEAgLTE3 NiwxMCArMTc4LDEzIEBAIHN0cnVjdCBkZXZmcmVxIHsKPj4+Pj4+Pj4+ICAgICAgCXVuc2lnbmVk IGludCAqdHJhbnNfdGFibGU7Cj4+Pj4+Pj4+PiAgICAgIAl1bnNpZ25lZCBsb25nICp0aW1lX2lu X3N0YXRlOwo+Pj4+Pj4+Pj4gICAgICAJdW5zaWduZWQgbG9uZyBsYXN0X3N0YXRfdXBkYXRlZDsK Pj4+Pj4+Pj4+ICAgICAgCj4+Pj4+Pj4+PiAgICAgIAlzdHJ1Y3Qgc3JjdV9ub3RpZmllcl9oZWFk IHRyYW5zaXRpb25fbm90aWZpZXJfbGlzdDsKPj4+Pj4+Pj4+ICsKPj4+Pj4+Pj4+ICsJc3RydWN0 IG5vdGlmaWVyX2Jsb2NrIG5iX21pbjsKPj4+Pj4+Pj4+ICsJc3RydWN0IG5vdGlmaWVyX2Jsb2Nr IG5iX21heDsKPj4+Pj4+Pj4+ICAgICAgfTsKPj4+Pj4+Pj4+ICAgICAgCj4+Pj4+Pj4+PiAgICAg IHN0cnVjdCBkZXZmcmVxX2ZyZXFzIHsKPj4+Pj4+Pj4+ICAgICAgCXVuc2lnbmVkIGxvbmcgb2xk Owo+Pj4+Pj4+Pj4gICAgICAJdW5zaWduZWQgbG9uZyBuZXc7Cj4+Pj4KPj4+Pgo+Pj4KPj4KPj4K PiAKCgotLSAKQmVzdCBSZWdhcmRzLApDaGFud29vIENob2kKU2Ftc3VuZyBFbGVjdHJvbmljcwoK X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgtYXJt LWtlcm5lbCBtYWlsaW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3Jn Cmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtl cm5lbAo=