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=-5.3 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,NICE_REPLY_A, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_1 autolearn=no 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 4CC9FC433E9 for ; Tue, 16 Mar 2021 20:36:47 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 2482C64F7B for ; Tue, 16 Mar 2021 20:36:47 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229632AbhCPUgQ (ORCPT ); Tue, 16 Mar 2021 16:36:16 -0400 Received: from z11.mailgun.us ([104.130.96.11]:44707 "EHLO z11.mailgun.us" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231346AbhCPUfs (ORCPT ); Tue, 16 Mar 2021 16:35:48 -0400 DKIM-Signature: a=rsa-sha256; v=1; c=relaxed/relaxed; d=mg.codeaurora.org; q=dns/txt; s=smtp; t=1615926948; h=Content-Transfer-Encoding: Content-Type: In-Reply-To: MIME-Version: Date: Message-ID: From: References: Cc: To: Subject: Sender; bh=N4Hz6uBUkKf8smNohwwvtSXuWNFF6/smD+q/fi6b+7w=; b=Ok+cXYTl74i7NT5AgKQKtfd9sgXb0KM/R0rPv5JJH0pqIomrrov37fgCY//LBZlfNGCPws7C FZV922U0NMUwQ+2hlDBH1WMNSr20Dn9v+1Aw4n/1ceZem7W6Zmg0ssAk+tVVZAP4MeAelaZA T9/F4Pg+mMnEkrLSbhrGRpYtTrg= X-Mailgun-Sending-Ip: 104.130.96.11 X-Mailgun-Sid: WyI1MzIzYiIsICJsaW51eC1hcm0tbXNtQHZnZXIua2VybmVsLm9yZyIsICJiZTllNGEiXQ== Received: from smtp.codeaurora.org (ec2-35-166-182-171.us-west-2.compute.amazonaws.com [35.166.182.171]) by smtp-out-n05.prod.us-west-2.postgun.com with SMTP id 60511695c32ceb3a919faafc (version=TLS1.2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256); Tue, 16 Mar 2021 20:35:33 GMT Sender: asutoshd=codeaurora.org@mg.codeaurora.org Received: by smtp.codeaurora.org (Postfix, from userid 1001) id DF09FC43468; Tue, 16 Mar 2021 20:35:33 +0000 (UTC) Received: from [192.168.8.168] (cpe-70-95-149-85.san.res.rr.com [70.95.149.85]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: asutoshd) by smtp.codeaurora.org (Postfix) with ESMTPSA id C0288C433CA; Tue, 16 Mar 2021 20:35:26 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org C0288C433CA Authentication-Results: aws-us-west-2-caf-mail-1.web.codeaurora.org; dmarc=none (p=none dis=none) header.from=codeaurora.org Authentication-Results: aws-us-west-2-caf-mail-1.web.codeaurora.org; spf=fail smtp.mailfrom=asutoshd@codeaurora.org Subject: Re: [PATCH v10 1/2] scsi: ufs: Enable power management for wlun To: Adrian Hunter , Alan Stern , Bart Van Assche Cc: "Rafael J. Wysocki" , cang@codeaurora.org, "Martin K. Petersen" , "open list:TARGET SUBSYSTEM" , linux-arm-msm , Alim Akhtar , Avri Altman , "James E.J. Bottomley" , Krzysztof Kozlowski , Stanley Chu , Andy Gross , Bjorn Andersson , Steven Rostedt , Ingo Molnar , Matthias Brugger , Kiwoong Kim , Bean Huo , Lee Jones , Wei Yongjun , Dinghao Liu , "Gustavo A. R. Silva" , Tomas Winkler , Jaegeuk Kim , Satya Tangirala , open list , "moderated list:ARM/SAMSUNG S3C, S5P AND EXYNOS ARM ARCHITECTURES" , "open list:ARM/SAMSUNG S3C, S5P AND EXYNOS ARM ARCHITECTURES" , "moderated list:UNIVERSAL FLASH STORAGE HOST CONTROLLER DRIVER..." , Linux-PM mailing list References: <0576d6eae15486740c25767e2d8805f7e94eb79d.1614725302.git.asutoshd@codeaurora.org> <85086647-7292-b0a2-d842-290818bd2858@intel.com> <6e98724d-2e75-d1fe-188f-a7010f86c509@codeaurora.org> <20210306161616.GC74411@rowland.harvard.edu> <2bd90336-18a9-9acd-5abb-5b52b27fc535@codeaurora.org> <20cbd52d-7254-3e1c-06a3-712326c99f75@codeaurora.org> From: "Asutosh Das (asd)" Message-ID: Date: Tue, 16 Mar 2021 13:35:26 -0700 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Thunderbird/78.7.1 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-arm-msm@vger.kernel.org On 3/16/2021 12:48 AM, Adrian Hunter wrote: > On 16/03/21 12:22 am, Asutosh Das (asd) wrote: >> On 3/14/2021 1:11 AM, Adrian Hunter wrote: >>> On 10/03/21 5:04 am, Asutosh Das (asd) wrote: >>>> On 3/9/2021 7:56 AM, Asutosh Das (asd) wrote: >>>>> On 3/8/2021 9:17 AM, Rafael J. Wysocki wrote: >>>>>> On Mon, Mar 8, 2021 at 5:21 PM Rafael J. Wysocki wrote: >>>>>>> >>>>>>> On Sat, Mar 6, 2021 at 5:17 PM Alan Stern wrote: >>>>>>>> >>>>>>>> On Fri, Mar 05, 2021 at 06:54:24PM -0800, Asutosh Das (asd) wrote: >>>>>>>> >>>>>>>>> Now during my testing I see a weird issue sometimes (1 in 7). >>>>>>>>> Scenario - bootups >>>>>>>>> >>>>>>>>> Issue: >>>>>>>>> The supplier 'ufs_device_wlun 0:0:0:49488' goes into runtime suspend even >>>>>>>>> when one/more of its consumers are in RPM_ACTIVE state. >>>>>>>>> >>>>>>>>> *Log: >>>>>>>>> [   10.056379][  T206] sd 0:0:0:1: [sdb] Synchronizing SCSI cache >>>>>>>>> [   10.062497][  T113] sd 0:0:0:5: [sdf] Synchronizing SCSI cache >>>>>>>>> [   10.356600][   T32] sd 0:0:0:7: [sdh] Synchronizing SCSI cache >>>>>>>>> [   10.362944][  T174] sd 0:0:0:3: [sdd] Synchronizing SCSI cache >>>>>>>>> [   10.696627][   T83] sd 0:0:0:2: [sdc] Synchronizing SCSI cache >>>>>>>>> [   10.704562][  T170] sd 0:0:0:6: [sdg] Synchronizing SCSI cache >>>>>>>>> [   10.980602][    T5] sd 0:0:0:0: [sda] Synchronizing SCSI cache >>>>>>>>> >>>>>>>>> /** Printing all the consumer nodes of supplier **/ >>>>>>>>> [   10.987327][    T5] ufs_device_wlun 0:0:0:49488: usage-count @ suspend: 0 >>>>>>>>> <-- this is the usage_count >>>>>>>>> [   10.994440][    T5] ufs_rpmb_wlun 0:0:0:49476: PM state - 2 >>>>>>>>> [   11.000402][    T5] scsi 0:0:0:49456: PM state - 2 >>>>>>>>> [   11.005453][    T5] sd 0:0:0:0: PM state - 2 >>>>>>>>> [   11.009958][    T5] sd 0:0:0:1: PM state - 2 >>>>>>>>> [   11.014469][    T5] sd 0:0:0:2: PM state - 2 >>>>>>>>> [   11.019072][    T5] sd 0:0:0:3: PM state - 2 >>>>>>>>> [   11.023595][    T5] sd 0:0:0:4: PM state - 0 << RPM_ACTIVE >>>>>>>>> [   11.353298][    T5] sd 0:0:0:5: PM state - 2 >>>>>>>>> [   11.357726][    T5] sd 0:0:0:6: PM state - 2 >>>>>>>>> [   11.362155][    T5] sd 0:0:0:7: PM state - 2 >>>>>>>>> [   11.366584][    T5] ufshcd-qcom 1d84000.ufshc: __ufshcd_wl_suspend - 8709 >>>>>>>>> [   11.374366][    T5] ufs_device_wlun 0:0:0:49488: __ufshcd_wl_suspend - >>>>>>>>> (0) has rpm_active flags >>>>>>> >>>>>>> Do you mean that rpm_active of the link between the consumer and the >>>>>>> supplier is greater than 0 at this point and the consumer is >>>>>> >>>>>> I mean is rpm_active of the link greater than 1 (because 1 means "no >>>>>> active references to the supplier")? >>>>> Hi Rafael: >>>>> No - it is not greater than 1. >>>>> >>>>> I'm trying to understand what's going on in it; will update when I've something. >>>>> >>>>>> >>>>>>> RPM_ACTIVE, but the supplier suspends successfully nevertheless? >>>>>>> >>>>>>>>> [   11.383376][    T5] ufs_device_wlun 0:0:0:49488: >>>>>>>>> ufshcd_wl_runtime_suspend <-- Supplier suspends fine. >>>>>>>>> [   12.977318][  T174] sd 0:0:0:4: [sde] Synchronizing SCSI cache >>>>>>>>> >>>>>>>>> And the the suspend of sde is stuck now: >>>>>>>>> schedule+0x9c/0xe0 >>>>>>>>> schedule_timeout+0x40/0x128 >>>>>>>>> io_schedule_timeout+0x44/0x68 >>>>>>>>> wait_for_common_io+0x7c/0x100 >>>>>>>>> wait_for_completion_io+0x14/0x20 >>>>>>>>> blk_execute_rq+0x90/0xcc >>>>>>>>> __scsi_execute+0x104/0x1c4 >>>>>>>>> sd_sync_cache+0xf8/0x2a0 >>>>>>>>> sd_suspend_common+0x74/0x11c >>>>>>>>> sd_suspend_runtime+0x14/0x20 >>>>>>>>> scsi_runtime_suspend+0x64/0x94 >>>>>>>>> __rpm_callback+0x80/0x2a4 >>>>>>>>> rpm_suspend+0x308/0x614 >>>>>>>>> pm_runtime_work+0x98/0xa8 >>>>>>>>> >>>>>>>>> I added 'DL_FLAG_RPM_ACTIVE' while creating links. >>>>>>>>>         if (hba->sdev_ufs_device) { >>>>>>>>>                 link = device_link_add(&sdev->sdev_gendev, >>>>>>>>>                                     &hba->sdev_ufs_device->sdev_gendev, >>>>>>>>>                                    DL_FLAG_PM_RUNTIME|DL_FLAG_RPM_ACTIVE); >>>>>>>>> I didn't expect this to resolve the issue anyway and it didn't. >>>>>>>>> >>>>>>>>> Another interesting point here is when I resume any of the above suspended >>>>>>>>> consumers, it all goes back to normal, which is kind of expected. I tried >>>>>>>>> resuming the consumer and the supplier is resumed and the supplier is >>>>>>>>> suspended when all the consumers are suspended. >>>>>>>>> >>>>>>>>> Any pointers on this issue please? >>>>>>>>> >>>>>>>>> @Bart/@Alan - Do you've any pointers please? >>>>>>>> >>>>>>>> It's very noticeable that although you seem to have isolated a bug in >>>>>>>> the power management subsystem (supplier goes into runtime suspend >>>>>>>> even when one of its consumers is still active), you did not CC the >>>>>>>> power management maintainer or mailing list. >>>>>>>> >>>>>>>> I have added the appropriate CC's. >>>>>>> >>>>>>> Thanks Alan! >>>>> >>>>> >>>> >>>> Hello >>>> I & Can (thanks CanG) debugged this further: >>>> >>>> Looks like this issue can occur if the sd probe is asynchronous. >>>> >>>> Essentially, the sd_probe() is done asynchronously and driver_probe_device() invokes pm_runtime_get_suppliers() before invoking sd_probe(). >>>> >>>> But scsi_probe_and_add_lun() runs in a separate context. >>>> So the scsi_autopm_put_device() invoked from scsi_scan_host() context reduces the link->rpm_active to 1. And sd_probe() invokes scsi_autopm_put_device() and starts a timer. And then driver_probe_device() invoked from __device_attach_async_helper context reduces the link->rpm_active to 1 thus enabling the supplier to suspend before the consumer suspends. >>>> >>>> So if: >>>> Context T1: >>>> [1] scsi_probe_and_add_lun() >>>> [2]    |- scsi_autopm_put_device() - reduce the link->rpm_active to 1 >>>> >>>> Context T2: >>>> __device_attach_async_helper() >>>>      |- driver_probe_device() >>>>          |- sd_probe() >>>> In between [1] and [2] say, driver_probe_device() -> sd_probe() is invoked in a separate context from __device_attach_async_helper(). >>>> The driver_probe_device() -> pm_runtime_get_suppliers() but [2] would reduce link->rpm_active to 1. >>>> Then sd_probe() would invoke rpm_resume() and proceed as is. >>>> When sd_probe() invokes scsi_autopm_put_device() it'd start a timer, dev->power.timer_autosuspends = 1. >>>> >>>> Now then, pm_runtime_put_suppliers() is invoked from driver_probe_device() and that makes the link->rpm_active = 1. >>>> But by now, the corresponding 'sd dev' (consumer) usage_count = 0, state = RPM_ACTIVE and link->rpm_active = 1. >>>> At this point of time, all other 'sd dev' (consumers) _may_ be suspended or active but would have the link->rpm_active = 1. >>> >>> Is this with DL_FLAG_RPM_ACTIVE?  In that case, wouldn't active >>> consumers have link->rpm_active = 2 and also have incremented >>> the supplier's usage_count? Yes this is with DL_FLAG_RPM_ACTIVE. Please let me share a log here: BEF means - Before, AFT means After. [ 6.843445][ T7] scsi 0:0:0:4: [UFSDBG]: ufshcd_setup_links:4779: supp: usage_cnt: 3 Link - 0:0:0:49488 link-rpm_active: 2 avail_luns: 5 [ 6.892545][ T7] scsi 0:0:0:4: pm_runtime_get_suppliers: (0:0:0:49488): supp: usage_count: 5 rpm_active: 4 In the above log, T7 is the context in which this scsi device is being added - scsi_sysfs_add_sdev() [ 6.931846][ T7] ufs_rpmb_wlun 0:0:0:4: [UFSDBG]: ufshcd_rpmb_probe:9692: invoked [ 6.941246][ T7] scsi 0:0:0:4: pm_runtime_put_suppliers: rpm_active: 4 [ 6.941246][ T7] scsi 0:0:0:4: pm_runtime_put_suppliers: (0:0:0:49488) [BEF] usage_count: 5 [ 6.941247][ T7] scsi 0:0:0:4: pm_runtime_put_suppliers: (0:0:0:49488) [AFT] usage_count: 4 rpm_active: 3 [ 6.941267][ T7] scsi 0:0:0:4: rpm_put_suppliers: [BEF] Supp (0:0:0:49488) usage_count: 4 rpm_active: 3 ------ T196 Context comes in while T7 is running ---------- [ 6.941466][ T196] scsi 0:0:0:4: pm_runtime_get_suppliers: (0:0:0:49488): supp: usage_count: 5 rpm_active: 4 -------------------------------------------------------------- [ 7.788397][ T7] scsi 0:0:0:4: rpm_put_suppliers: [AFT] Supp (0:0:0:49488) usage_count: 2 rpm_active: 1 -- T196 is the context in which sd_probe() is invoked for this scsi device. [ 7.974410][ T196] sd 0:0:0:4: [sde] Attached SCSI disk [ 7.984188][ T196] sd 0:0:0:4: pm_runtime_put_suppliers: rpm_active: 2 [ 7.998424][ T196] sd 0:0:0:4: pm_runtime_put_suppliers: (0:0:0:49488) [BEF] usage_count: 4 [ 8.017320][ T196] sd 0:0:0:4: pm_runtime_put_suppliers: (0:0:0:49488) [AFT] usage_count: 1 rpm_active: 1 The reference to the link is released after sd_probe() is completed. At this point, the rpm_active should be 2. And the rpm_active should become 1 when sd 0:0:0:4 actually suspends. But at the end of sd_probe() the suspend is only scheduled. However the supplier is now free to suspend. In this log, the usage_count of supplier becomes 0 here: [ 11.963885][ T117] sd 0:0:0:7: rpm_put_suppliers: [BEF] Supp (0:0:0:49488) usage_count: 1 rpm_active: 2 [ 11.973821][ T117] sd 0:0:0:7: rpm_put_suppliers: [AFT] Supp (0:0:0:49488) usage_count: 0 rpm_active: 1 However, the consumer sd 0:0:0:4 is still active but has released the reference to the supplier: [ 12.002792][ T117] scsi 0:0:0:49456: rpm_status - 2 [ 12.002806][ T117] sd 0:0:0:0: rpm_status - 2 [ 12.002834][ T117] sd 0:0:0:1: rpm_status - 2 [ 12.017730][ T117] sd 0:0:0:2: rpm_status - 2 [ 12.041317][ T117] sd 0:0:0:3: rpm_status - 2 [ 12.045953][ T117] sd 0:0:0:4: rpm_status - 0 And sd 0:0:0:4 tries to suspend here: [ 15.465914][ T117] sd 0:0:0:4: [sde] Synchronizing SCSI cache >>> >>> Another outstanding issue that comes to mind, is to ensure >>> hba->sdev_ufs_device does not runtime suspend before it is probed. >>> I suggest changing ufshcd_slave_configure() so it does not set >>> sdev->rpm_autosuspend for hba->sdev_ufs_device, and instead do >>> pm_runtime_allow / pm_runtime_forbid() in ufshcd_wl_probe() / >>> ufshcd_wl_remove() respectively. >>> If pm_runtime_allow() is invoked from ufshcd_wl_probe() it'd invoke runtime_suspend on hba->sdev_ufs_device before exiting scsi_sysfs_add_sdev(). So I think pm_runtime_allow() should be invoked in ufshcd_scsi_add_wlus(). >>> However we still want to stop hba->sdev_ufs_device runtime >>> suspending while consumers are being added.  With that in mind, >>> I would expect pm_runtime_get_noresume(&hba->sdev_ufs_device->sdev_gendev) >>> in ufshcd_scsi_add_wlus() to come *before* >>> ufshcd_blk_pm_runtime_init(hba->sdev_ufs_device).  In fact, it would >>> be more logical to make it, pm_runtime_get_sync() since we require >>> hba->sdev_ufs_device to be active at that point. >>> Correct, scsi_autopm_get_device(hba->sdev_ufs_device) should be invoked before ufshcd_blk_pm_runtime_init(hba->sdev_ufs_device). Now a corresponding scsi_autopm_put_device(hba->sdev_ufs_device) is invoked after the consumers are added in ufshcd_setup_links(). Even then I think this issue would still pop up. >>> >> >> Hi Adrian, >> I think the v11 that I pushed can handle this. >> runtime-suspend is forbidden at probe and is re-enabled after probe is done. Please take a look and let me know if I'm missing something. > > If the PM APIs are being used correctly, the usage and active > counts should never be wrong. If they were, then that would > be an issue for the PM framework. >It is more likely that I'm using it incorrectly :). > However, it is hard to tell what the issues are until all the > UFS driver changes have been completed, such as the ones I > suggested above above. > Ok, understood. > v11 could be hiding issues rather than fixing them. > Based on the logs, in v11, I tried to forbid any runtime-suspend until sd_probe() is done. I could be misunderstanding the whole thing though. Having said that, I will make the changes as per your suggestions and push a v12. I will test with v12 as well and see if this issue is seen. >> >>>> >>>> Since the supplier has 0 auto-suspend delay, it now suspends! >>>> >>>> >>>> Context [T1] >>>> Call trace: >>>> dump_backtrace+0x0/0x1d4 >>>> show_stack+0x18/0x24 >>>> dump_stack+0xc4/0x144 >>>> __pm_runtime_idle+0xb4/0x184 >>>> scsi_autopm_put_device+0x18/0x24 >>>> scsi_sysfs_add_sdev+0x26c/0x278 >>>> scsi_probe_and_add_lun+0xbac/0xd48 >>>> __scsi_scan_target+0x38c/0x510 >>>> scsi_scan_host_selected+0x14c/0x1e4 >>>> scsi_scan_host+0x1e0/0x228 >>>> ufshcd_async_scan+0x39c/0x408 >>>> async_run_entry_fn+0x48/0x128 >>>> process_one_work+0x1f0/0x470 >>>> worker_thread+0x26c/0x4c8 >>>> kthread+0x13c/0x320 >>>> ret_from_fork+0x10/0x18 >>>> >>>> >>>> Context [T2] >>>> Call trace: >>>> dump_backtrace+0x0/0x1d4 >>>> show_stack+0x18/0x24 >>>> dump_stack+0xc4/0x144 >>>> rpm_get_suppliers+0x48/0x1ac >>>> __rpm_callback+0x58/0x12c >>>> rpm_resume+0x3a4/0x618 >>>> __pm_runtime_resume+0x50/0x80 >>>> scsi_autopm_get_device+0x20/0x54 >>>> sd_probe+0x40/0x3d0 >>>> really_probe+0x1bc/0x4a0 >>>> driver_probe_device+0x84/0xf0 >>>> __device_attach_driver+0x114/0x138 >>>> bus_for_each_drv+0x84/0xd0 >>>> __device_attach_async_helper+0x7c/0xf0 >>>> async_run_entry_fn+0x48/0x128 >>>> process_one_work+0x1f0/0x470 >>>> worker_thread+0x26c/0x4c8 >>>> kthread+0x13c/0x320 >>>> ret_from_fork+0x10/0x18 >>>> >>>> Below prints show how link->rpm_active becomes 1 for sd 0:0:0:4 >>>> [    7.574654][  T212] Call trace: >>>> [    7.574657][  T212]  dump_backtrace+0x0/0x1d4 >>>> [    7.574661][  T212]  show_stack+0x18/0x24 >>>> [    7.574665][  T212]  dump_stack+0xc4/0x144 >>>> [    7.574668][  T212]  __pm_runtime_idle+0xb4/0x184 >>>> [    7.574671][  T212]  scsi_autopm_put_device+0x18/0x24 >>>> [    7.574675][  T212]  sd_probe+0x314/0x3d0 >>>> [    7.574677][  T212]  really_probe+0x1bc/0x4a0 >>>> [    7.574680][  T212]  driver_probe_device+0x84/0xf0 >>>> [    7.574683][  T212]  __device_attach_driver+0x114/0x138 >>>> [    7.574686][  T212]  bus_for_each_drv+0x84/0xd0 >>>> [    7.574689][  T212]  __device_attach_async_helper+0x7c/0xf0 >>>> [    7.574692][  T212]  async_run_entry_fn+0x48/0x128 >>>> [    7.574695][  T212]  process_one_work+0x1f0/0x470 >>>> [    7.574698][  T212]  worker_thread+0x26c/0x4c8 >>>> [    7.574700][  T212]  kthread+0x13c/0x320 >>>> [    7.574703][  T212]  ret_from_fork+0x10/0x18 >>>> [    7.574706][  T212] sd 0:0:0:4: scsi_runtime_idle >>>> [    7.574712][  T212] sd 0:0:0:4: __pm_runtime_idle: aft: [UFSDBG]: pwr.timer_autosuspends: 1 pwr.request_pending: 0 retval: -16 pwr.request: 0 usage_count: 0 rpm_status: 0 link-rpm_active:2 >>>> [    7.574715][  T212] sd 0:0:0:4: sd_probe: [UFSDBG]: Exit >>>> [    7.574738][  T212] sd 0:0:0:4: __pm_runtime_idle: b4: [UFSDBG]: pwr.request: 0 usage_count: 0 rpm_status: 0 link-rpm_active:2 >>>> >>>> [    7.574752][  T212] Workqueue: events_unbound async_run_entry_fn >>>> [    7.574754][  T212] Call trace: >>>> [    7.574758][  T212]  dump_backtrace+0x0/0x1d4 >>>> [    7.574761][  T212]  show_stack+0x18/0x24 >>>> [    7.574765][  T212]  dump_stack+0xc4/0x144 >>>> [    7.574767][  T212]  __pm_runtime_idle+0xb4/0x184 >>>> [    7.574770][  T212]  driver_probe_device+0x94/0xf0 >>>> [    7.574773][  T212]  __device_attach_driver+0x114/0x138 >>>> [    7.574775][  T212]  bus_for_each_drv+0x84/0xd0 >>>> [    7.574778][  T212]  __device_attach_async_helper+0x7c/0xf0 >>>> [    7.574781][  T212]  async_run_entry_fn+0x48/0x128 >>>> [    7.574783][  T212]  process_one_work+0x1f0/0x470 >>>> [    7.574786][  T212]  worker_thread+0x26c/0x4c8 >>>> [    7.574788][  T212]  kthread+0x13c/0x320 >>>> [    7.574791][  T212]  ret_from_fork+0x10/0x18 >>>> [    7.574848][   T80] sd 0:0:0:4: scsi_runtime_idle >>>> [    7.574858][  T212] sd 0:0:0:4: __pm_runtime_idle: aft: [UFSDBG]: pwr.timer_autosuspends: 1 pwr.request_pending: 0 retval: 0 pwr.request: 0 usage_count: 0 rpm_status: 0 link-rpm_active:2 >>>> [    7.574863][  T212] sd 0:0:0:4: pm_runtime_put_suppliers: [UFSDBG]: rpm_status: 0 link-rpm_active:1 >>>> [    7.574866][  T212] sd 0:0:0:4: async probe completed >>>> [    7.574870][  T212] sd 0:0:0:4: __pm_runtime_idle: b4: [UFSDBG]: pwr.request: 0 usage_count: 0 rpm_status: 0 link-rpm_active:1 >>>> >>>> >>>> So, from the above it looks like when async probe is enabled this is a possibility. >>>> >>>> I don't see a way around this. Please let me know if you (@Alan/@Bart/@Adrian) have any thoughts on this. >>>> >>>> Thanks, >>>> -asd >>>> >>> >> >> > -- The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, Linux Foundation Collaborative Project 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=-5.5 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI, NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_1 autolearn=no 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 C4DCAC433DB for ; Tue, 16 Mar 2021 20:35:59 +0000 (UTC) Received: from desiato.infradead.org (desiato.infradead.org [90.155.92.199]) (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 413C064F7B for ; Tue, 16 Mar 2021 20:35:59 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 413C064F7B Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=codeaurora.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-mediatek-bounces+linux-mediatek=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=desiato.20200630; h=Sender:Content-Type: Content-Transfer-Encoding:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:Date:Message-ID:From: References:Cc:To:Subject:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=dDFJaUx3dpvAiFzbHS8nT+GDqkLZD1Ls0nlizd85Sgs=; b=IRHsDJ2J6GXi+yCEdXiN4z8i/ 5+Edn1IRO5j5DuOFCEKoUwt4lMJkF47jPhE00Yozn94zgVz95f6lbibqjK0dvksWKyjFQv6rMJbp2 cJV8AiIl6+x0LwNqecu3Vtp0ftPOpsr6NnnvinWrHnVa0nG2kggj8NWktDHmmr/QjUVHJA/tbq3Qg 1IMnYQSqjM4Zwzq8a/+3HmC1SK9YcgdYWIBHx0rNItuP57oI3TtfjL2tqdwD9QgP9f0BC6tPDao5O 1nS4NapEU6C7hvsCrnDnogXT8xJ9vKnwazygIj58glWN0TvG6GWzvoPPrMfx+CHlYmZ0a69wcrn1/ /HulTdf9Q==; Received: from localhost ([::1] helo=desiato.infradead.org) by desiato.infradead.org with esmtp (Exim 4.94 #2 (Red Hat Linux)) id 1lMGPn-001oyJ-1B; Tue, 16 Mar 2021 20:35:45 +0000 Received: from m42-2.mailgun.net ([69.72.42.2]) by desiato.infradead.org with esmtps (Exim 4.94 #2 (Red Hat Linux)) id 1lMGPg-001ows-WC for linux-mediatek@lists.infradead.org; Tue, 16 Mar 2021 20:35:39 +0000 DKIM-Signature: a=rsa-sha256; v=1; c=relaxed/relaxed; d=mg.codeaurora.org; q=dns/txt; s=smtp; t=1615926937; h=Content-Transfer-Encoding: Content-Type: In-Reply-To: MIME-Version: Date: Message-ID: From: References: Cc: To: Subject: Sender; bh=N4Hz6uBUkKf8smNohwwvtSXuWNFF6/smD+q/fi6b+7w=; b=DP+z0gAs3XrDxHNIMeYp/U4KMqTtucnpyIj/Rrw4hpWpz1JdFD+wJg09CmFf9vIatCsZQ4YT cBK3KJOYzYOXGiicB9hyE2MJw4igqvPB+cppaG5FPwFVo2RP1vvMTIS9rDbeOD/ZOJD4HKMc W4dPXi1+J0Pf08cUboFdH0RvJvs= X-Mailgun-Sending-Ip: 69.72.42.2 X-Mailgun-Sid: WyI0ZDIyMyIsICJsaW51eC1tZWRpYXRla0BsaXN0cy5pbmZyYWRlYWQub3JnIiwgImJlOWU0YSJd Received: from smtp.codeaurora.org (ec2-35-166-182-171.us-west-2.compute.amazonaws.com [35.166.182.171]) by smtp-out-n03.prod.us-west-2.postgun.com with SMTP id 605116955d70193f889bac92 (version=TLS1.2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256); Tue, 16 Mar 2021 20:35:33 GMT Received: by smtp.codeaurora.org (Postfix, from userid 1001) id B6F30C43464; Tue, 16 Mar 2021 20:35:33 +0000 (UTC) Received: from [192.168.8.168] (cpe-70-95-149-85.san.res.rr.com [70.95.149.85]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: asutoshd) by smtp.codeaurora.org (Postfix) with ESMTPSA id C0288C433CA; Tue, 16 Mar 2021 20:35:26 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org C0288C433CA Authentication-Results: aws-us-west-2-caf-mail-1.web.codeaurora.org; dmarc=none (p=none dis=none) header.from=codeaurora.org Authentication-Results: aws-us-west-2-caf-mail-1.web.codeaurora.org; spf=fail smtp.mailfrom=asutoshd@codeaurora.org Subject: Re: [PATCH v10 1/2] scsi: ufs: Enable power management for wlun To: Adrian Hunter , Alan Stern , Bart Van Assche Cc: "Rafael J. Wysocki" , cang@codeaurora.org, "Martin K. Petersen" , "open list:TARGET SUBSYSTEM" , linux-arm-msm , Alim Akhtar , Avri Altman , "James E.J. Bottomley" , Krzysztof Kozlowski , Stanley Chu , Andy Gross , Bjorn Andersson , Steven Rostedt , Ingo Molnar , Matthias Brugger , Kiwoong Kim , Bean Huo , Lee Jones , Wei Yongjun , Dinghao Liu , "Gustavo A. R. Silva" , Tomas Winkler , Jaegeuk Kim , Satya Tangirala , open list , "moderated list:ARM/SAMSUNG S3C, S5P AND EXYNOS ARM ARCHITECTURES" , "open list:ARM/SAMSUNG S3C, S5P AND EXYNOS ARM ARCHITECTURES" , "moderated list:UNIVERSAL FLASH STORAGE HOST CONTROLLER DRIVER..." , Linux-PM mailing list References: <0576d6eae15486740c25767e2d8805f7e94eb79d.1614725302.git.asutoshd@codeaurora.org> <85086647-7292-b0a2-d842-290818bd2858@intel.com> <6e98724d-2e75-d1fe-188f-a7010f86c509@codeaurora.org> <20210306161616.GC74411@rowland.harvard.edu> <2bd90336-18a9-9acd-5abb-5b52b27fc535@codeaurora.org> <20cbd52d-7254-3e1c-06a3-712326c99f75@codeaurora.org> From: "Asutosh Das (asd)" Message-ID: Date: Tue, 16 Mar 2021 13:35:26 -0700 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Thunderbird/78.7.1 MIME-Version: 1.0 In-Reply-To: Content-Language: en-US X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210316_203537_668954_279A1215 X-CRM114-Status: GOOD ( 24.62 ) X-BeenThere: linux-mediatek@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Sender: "Linux-mediatek" Errors-To: linux-mediatek-bounces+linux-mediatek=archiver.kernel.org@lists.infradead.org T24gMy8xNi8yMDIxIDEyOjQ4IEFNLCBBZHJpYW4gSHVudGVyIHdyb3RlOgo+IE9uIDE2LzAzLzIx IDEyOjIyIGFtLCBBc3V0b3NoIERhcyAoYXNkKSB3cm90ZToKPj4gT24gMy8xNC8yMDIxIDE6MTEg QU0sIEFkcmlhbiBIdW50ZXIgd3JvdGU6Cj4+PiBPbiAxMC8wMy8yMSA1OjA0IGFtLCBBc3V0b3No IERhcyAoYXNkKSB3cm90ZToKPj4+PiBPbiAzLzkvMjAyMSA3OjU2IEFNLCBBc3V0b3NoIERhcyAo YXNkKSB3cm90ZToKPj4+Pj4gT24gMy84LzIwMjEgOToxNyBBTSwgUmFmYWVsIEouIFd5c29ja2kg d3JvdGU6Cj4+Pj4+PiBPbiBNb24sIE1hciA4LCAyMDIxIGF0IDU6MjEgUE0gUmFmYWVsIEouIFd5 c29ja2kgPHJhZmFlbEBrZXJuZWwub3JnPiB3cm90ZToKPj4+Pj4+Pgo+Pj4+Pj4+IE9uIFNhdCwg TWFyIDYsIDIwMjEgYXQgNToxNyBQTSBBbGFuIFN0ZXJuIDxzdGVybkByb3dsYW5kLmhhcnZhcmQu ZWR1PiB3cm90ZToKPj4+Pj4+Pj4KPj4+Pj4+Pj4gT24gRnJpLCBNYXIgMDUsIDIwMjEgYXQgMDY6 NTQ6MjRQTSAtMDgwMCwgQXN1dG9zaCBEYXMgKGFzZCkgd3JvdGU6Cj4+Pj4+Pj4+Cj4+Pj4+Pj4+ PiBOb3cgZHVyaW5nIG15IHRlc3RpbmcgSSBzZWUgYSB3ZWlyZCBpc3N1ZSBzb21ldGltZXMgKDEg aW4gNykuCj4+Pj4+Pj4+PiBTY2VuYXJpbyAtIGJvb3R1cHMKPj4+Pj4+Pj4+Cj4+Pj4+Pj4+PiBJ c3N1ZToKPj4+Pj4+Pj4+IFRoZSBzdXBwbGllciAndWZzX2RldmljZV93bHVuIDA6MDowOjQ5NDg4 JyBnb2VzIGludG8gcnVudGltZSBzdXNwZW5kIGV2ZW4KPj4+Pj4+Pj4+IHdoZW4gb25lL21vcmUg b2YgaXRzIGNvbnN1bWVycyBhcmUgaW4gUlBNX0FDVElWRSBzdGF0ZS4KPj4+Pj4+Pj4+Cj4+Pj4+ Pj4+PiAqTG9nOgo+Pj4+Pj4+Pj4gW8KgwqAgMTAuMDU2Mzc5XVvCoCBUMjA2XSBzZCAwOjA6MDox OiBbc2RiXSBTeW5jaHJvbml6aW5nIFNDU0kgY2FjaGUKPj4+Pj4+Pj4+IFvCoMKgIDEwLjA2MjQ5 N11bwqAgVDExM10gc2QgMDowOjA6NTogW3NkZl0gU3luY2hyb25pemluZyBTQ1NJIGNhY2hlCj4+ Pj4+Pj4+PiBbwqDCoCAxMC4zNTY2MDBdW8KgwqAgVDMyXSBzZCAwOjA6MDo3OiBbc2RoXSBTeW5j aHJvbml6aW5nIFNDU0kgY2FjaGUKPj4+Pj4+Pj4+IFvCoMKgIDEwLjM2Mjk0NF1bwqAgVDE3NF0g c2QgMDowOjA6MzogW3NkZF0gU3luY2hyb25pemluZyBTQ1NJIGNhY2hlCj4+Pj4+Pj4+PiBbwqDC oCAxMC42OTY2MjddW8KgwqAgVDgzXSBzZCAwOjA6MDoyOiBbc2RjXSBTeW5jaHJvbml6aW5nIFND U0kgY2FjaGUKPj4+Pj4+Pj4+IFvCoMKgIDEwLjcwNDU2Ml1bwqAgVDE3MF0gc2QgMDowOjA6Njog W3NkZ10gU3luY2hyb25pemluZyBTQ1NJIGNhY2hlCj4+Pj4+Pj4+PiBbwqDCoCAxMC45ODA2MDJd W8KgwqDCoCBUNV0gc2QgMDowOjA6MDogW3NkYV0gU3luY2hyb25pemluZyBTQ1NJIGNhY2hlCj4+ Pj4+Pj4+Pgo+Pj4+Pj4+Pj4gLyoqIFByaW50aW5nIGFsbCB0aGUgY29uc3VtZXIgbm9kZXMgb2Yg c3VwcGxpZXIgKiovCj4+Pj4+Pj4+PiBbwqDCoCAxMC45ODczMjddW8KgwqDCoCBUNV0gdWZzX2Rl dmljZV93bHVuIDA6MDowOjQ5NDg4OiB1c2FnZS1jb3VudCBAIHN1c3BlbmQ6IDAKPj4+Pj4+Pj4+ IDwtLSB0aGlzIGlzIHRoZSB1c2FnZV9jb3VudAo+Pj4+Pj4+Pj4gW8KgwqAgMTAuOTk0NDQwXVvC oMKgwqAgVDVdIHVmc19ycG1iX3dsdW4gMDowOjA6NDk0NzY6IFBNIHN0YXRlIC0gMgo+Pj4+Pj4+ Pj4gW8KgwqAgMTEuMDAwNDAyXVvCoMKgwqAgVDVdIHNjc2kgMDowOjA6NDk0NTY6IFBNIHN0YXRl IC0gMgo+Pj4+Pj4+Pj4gW8KgwqAgMTEuMDA1NDUzXVvCoMKgwqAgVDVdIHNkIDA6MDowOjA6IFBN IHN0YXRlIC0gMgo+Pj4+Pj4+Pj4gW8KgwqAgMTEuMDA5OTU4XVvCoMKgwqAgVDVdIHNkIDA6MDow OjE6IFBNIHN0YXRlIC0gMgo+Pj4+Pj4+Pj4gW8KgwqAgMTEuMDE0NDY5XVvCoMKgwqAgVDVdIHNk IDA6MDowOjI6IFBNIHN0YXRlIC0gMgo+Pj4+Pj4+Pj4gW8KgwqAgMTEuMDE5MDcyXVvCoMKgwqAg VDVdIHNkIDA6MDowOjM6IFBNIHN0YXRlIC0gMgo+Pj4+Pj4+Pj4gW8KgwqAgMTEuMDIzNTk1XVvC oMKgwqAgVDVdIHNkIDA6MDowOjQ6IFBNIHN0YXRlIC0gMCA8PCBSUE1fQUNUSVZFCj4+Pj4+Pj4+ PiBbwqDCoCAxMS4zNTMyOThdW8KgwqDCoCBUNV0gc2QgMDowOjA6NTogUE0gc3RhdGUgLSAyCj4+ Pj4+Pj4+PiBbwqDCoCAxMS4zNTc3MjZdW8KgwqDCoCBUNV0gc2QgMDowOjA6NjogUE0gc3RhdGUg LSAyCj4+Pj4+Pj4+PiBbwqDCoCAxMS4zNjIxNTVdW8KgwqDCoCBUNV0gc2QgMDowOjA6NzogUE0g c3RhdGUgLSAyCj4+Pj4+Pj4+PiBbwqDCoCAxMS4zNjY1ODRdW8KgwqDCoCBUNV0gdWZzaGNkLXFj b20gMWQ4NDAwMC51ZnNoYzogX191ZnNoY2Rfd2xfc3VzcGVuZCAtIDg3MDkKPj4+Pj4+Pj4+IFvC oMKgIDExLjM3NDM2Nl1bwqDCoMKgIFQ1XSB1ZnNfZGV2aWNlX3dsdW4gMDowOjA6NDk0ODg6IF9f dWZzaGNkX3dsX3N1c3BlbmQgLQo+Pj4+Pj4+Pj4gKDApIGhhcyBycG1fYWN0aXZlIGZsYWdzCj4+ Pj4+Pj4KPj4+Pj4+PiBEbyB5b3UgbWVhbiB0aGF0IHJwbV9hY3RpdmUgb2YgdGhlIGxpbmsgYmV0 d2VlbiB0aGUgY29uc3VtZXIgYW5kIHRoZQo+Pj4+Pj4+IHN1cHBsaWVyIGlzIGdyZWF0ZXIgdGhh biAwIGF0IHRoaXMgcG9pbnQgYW5kIHRoZSBjb25zdW1lciBpcwo+Pj4+Pj4KPj4+Pj4+IEkgbWVh biBpcyBycG1fYWN0aXZlIG9mIHRoZSBsaW5rIGdyZWF0ZXIgdGhhbiAxIChiZWNhdXNlIDEgbWVh bnMgIm5vCj4+Pj4+PiBhY3RpdmUgcmVmZXJlbmNlcyB0byB0aGUgc3VwcGxpZXIiKT8KPj4+Pj4g SGkgUmFmYWVsOgo+Pj4+PiBObyAtIGl0IGlzIG5vdCBncmVhdGVyIHRoYW4gMS4KPj4+Pj4KPj4+ Pj4gSSdtIHRyeWluZyB0byB1bmRlcnN0YW5kIHdoYXQncyBnb2luZyBvbiBpbiBpdDsgd2lsbCB1 cGRhdGUgd2hlbiBJJ3ZlIHNvbWV0aGluZy4KPj4+Pj4KPj4+Pj4+Cj4+Pj4+Pj4gUlBNX0FDVElW RSwgYnV0IHRoZSBzdXBwbGllciBzdXNwZW5kcyBzdWNjZXNzZnVsbHkgbmV2ZXJ0aGVsZXNzPwo+ Pj4+Pj4+Cj4+Pj4+Pj4+PiBbwqDCoCAxMS4zODMzNzZdW8KgwqDCoCBUNV0gdWZzX2RldmljZV93 bHVuIDA6MDowOjQ5NDg4Ogo+Pj4+Pj4+Pj4gdWZzaGNkX3dsX3J1bnRpbWVfc3VzcGVuZCA8LS0g U3VwcGxpZXIgc3VzcGVuZHMgZmluZS4KPj4+Pj4+Pj4+IFvCoMKgIDEyLjk3NzMxOF1bwqAgVDE3 NF0gc2QgMDowOjA6NDogW3NkZV0gU3luY2hyb25pemluZyBTQ1NJIGNhY2hlCj4+Pj4+Pj4+Pgo+ Pj4+Pj4+Pj4gQW5kIHRoZSB0aGUgc3VzcGVuZCBvZiBzZGUgaXMgc3R1Y2sgbm93Ogo+Pj4+Pj4+ Pj4gc2NoZWR1bGUrMHg5Yy8weGUwCj4+Pj4+Pj4+PiBzY2hlZHVsZV90aW1lb3V0KzB4NDAvMHgx MjgKPj4+Pj4+Pj4+IGlvX3NjaGVkdWxlX3RpbWVvdXQrMHg0NC8weDY4Cj4+Pj4+Pj4+PiB3YWl0 X2Zvcl9jb21tb25faW8rMHg3Yy8weDEwMAo+Pj4+Pj4+Pj4gd2FpdF9mb3JfY29tcGxldGlvbl9p bysweDE0LzB4MjAKPj4+Pj4+Pj4+IGJsa19leGVjdXRlX3JxKzB4OTAvMHhjYwo+Pj4+Pj4+Pj4g X19zY3NpX2V4ZWN1dGUrMHgxMDQvMHgxYzQKPj4+Pj4+Pj4+IHNkX3N5bmNfY2FjaGUrMHhmOC8w eDJhMAo+Pj4+Pj4+Pj4gc2Rfc3VzcGVuZF9jb21tb24rMHg3NC8weDExYwo+Pj4+Pj4+Pj4gc2Rf c3VzcGVuZF9ydW50aW1lKzB4MTQvMHgyMAo+Pj4+Pj4+Pj4gc2NzaV9ydW50aW1lX3N1c3BlbmQr MHg2NC8weDk0Cj4+Pj4+Pj4+PiBfX3JwbV9jYWxsYmFjaysweDgwLzB4MmE0Cj4+Pj4+Pj4+PiBy cG1fc3VzcGVuZCsweDMwOC8weDYxNAo+Pj4+Pj4+Pj4gcG1fcnVudGltZV93b3JrKzB4OTgvMHhh OAo+Pj4+Pj4+Pj4KPj4+Pj4+Pj4+IEkgYWRkZWQgJ0RMX0ZMQUdfUlBNX0FDVElWRScgd2hpbGUg Y3JlYXRpbmcgbGlua3MuCj4+Pj4+Pj4+PiAgwqDCoMKgwqDCoMKgwqAgaWYgKGhiYS0+c2Rldl91 ZnNfZGV2aWNlKSB7Cj4+Pj4+Pj4+PiAgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGxp bmsgPSBkZXZpY2VfbGlua19hZGQoJnNkZXYtPnNkZXZfZ2VuZGV2LAo+Pj4+Pj4+Pj4gIMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgJmhiYS0+c2Rldl91ZnNfZGV2aWNlLT5zZGV2X2dlbmRldiwKPj4+Pj4+Pj4+ICDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCBETF9GTEFHX1BNX1JVTlRJTUV8RExfRkxBR19SUE1fQUNUSVZFKTsKPj4+Pj4+ Pj4+IEkgZGlkbid0IGV4cGVjdCB0aGlzIHRvIHJlc29sdmUgdGhlIGlzc3VlIGFueXdheSBhbmQg aXQgZGlkbid0Lgo+Pj4+Pj4+Pj4KPj4+Pj4+Pj4+IEFub3RoZXIgaW50ZXJlc3RpbmcgcG9pbnQg aGVyZSBpcyB3aGVuIEkgcmVzdW1lIGFueSBvZiB0aGUgYWJvdmUgc3VzcGVuZGVkCj4+Pj4+Pj4+ PiBjb25zdW1lcnMsIGl0IGFsbCBnb2VzIGJhY2sgdG8gbm9ybWFsLCB3aGljaCBpcyBraW5kIG9m IGV4cGVjdGVkLiBJIHRyaWVkCj4+Pj4+Pj4+PiByZXN1bWluZyB0aGUgY29uc3VtZXIgYW5kIHRo ZSBzdXBwbGllciBpcyByZXN1bWVkIGFuZCB0aGUgc3VwcGxpZXIgaXMKPj4+Pj4+Pj4+IHN1c3Bl bmRlZCB3aGVuIGFsbCB0aGUgY29uc3VtZXJzIGFyZSBzdXNwZW5kZWQuCj4+Pj4+Pj4+Pgo+Pj4+ Pj4+Pj4gQW55IHBvaW50ZXJzIG9uIHRoaXMgaXNzdWUgcGxlYXNlPwo+Pj4+Pj4+Pj4KPj4+Pj4+ Pj4+IEBCYXJ0L0BBbGFuIC0gRG8geW91J3ZlIGFueSBwb2ludGVycyBwbGVhc2U/Cj4+Pj4+Pj4+ Cj4+Pj4+Pj4+IEl0J3MgdmVyeSBub3RpY2VhYmxlIHRoYXQgYWx0aG91Z2ggeW91IHNlZW0gdG8g aGF2ZSBpc29sYXRlZCBhIGJ1ZyBpbgo+Pj4+Pj4+PiB0aGUgcG93ZXIgbWFuYWdlbWVudCBzdWJz eXN0ZW0gKHN1cHBsaWVyIGdvZXMgaW50byBydW50aW1lIHN1c3BlbmQKPj4+Pj4+Pj4gZXZlbiB3 aGVuIG9uZSBvZiBpdHMgY29uc3VtZXJzIGlzIHN0aWxsIGFjdGl2ZSksIHlvdSBkaWQgbm90IEND IHRoZQo+Pj4+Pj4+PiBwb3dlciBtYW5hZ2VtZW50IG1haW50YWluZXIgb3IgbWFpbGluZyBsaXN0 Lgo+Pj4+Pj4+Pgo+Pj4+Pj4+PiBJIGhhdmUgYWRkZWQgdGhlIGFwcHJvcHJpYXRlIENDJ3MuCj4+ Pj4+Pj4KPj4+Pj4+PiBUaGFua3MgQWxhbiEKPj4+Pj4KPj4+Pj4KPj4+Pgo+Pj4+IEhlbGxvCj4+ Pj4gSSAmIENhbiAodGhhbmtzIENhbkcpIGRlYnVnZ2VkIHRoaXMgZnVydGhlcjoKPj4+Pgo+Pj4+ IExvb2tzIGxpa2UgdGhpcyBpc3N1ZSBjYW4gb2NjdXIgaWYgdGhlIHNkIHByb2JlIGlzIGFzeW5j aHJvbm91cy4KPj4+Pgo+Pj4+IEVzc2VudGlhbGx5LCB0aGUgc2RfcHJvYmUoKSBpcyBkb25lIGFz eW5jaHJvbm91c2x5IGFuZCBkcml2ZXJfcHJvYmVfZGV2aWNlKCkgaW52b2tlcyBwbV9ydW50aW1l X2dldF9zdXBwbGllcnMoKSBiZWZvcmUgaW52b2tpbmcgc2RfcHJvYmUoKS4KPj4+Pgo+Pj4+IEJ1 dCBzY3NpX3Byb2JlX2FuZF9hZGRfbHVuKCkgcnVucyBpbiBhIHNlcGFyYXRlIGNvbnRleHQuCj4+ Pj4gU28gdGhlIHNjc2lfYXV0b3BtX3B1dF9kZXZpY2UoKSBpbnZva2VkIGZyb20gc2NzaV9zY2Fu X2hvc3QoKSBjb250ZXh0IHJlZHVjZXMgdGhlIGxpbmstPnJwbV9hY3RpdmUgdG8gMS4gQW5kIHNk X3Byb2JlKCkgaW52b2tlcyBzY3NpX2F1dG9wbV9wdXRfZGV2aWNlKCkgYW5kIHN0YXJ0cyBhIHRp bWVyLiBBbmQgdGhlbiBkcml2ZXJfcHJvYmVfZGV2aWNlKCkgaW52b2tlZCBmcm9tIF9fZGV2aWNl X2F0dGFjaF9hc3luY19oZWxwZXIgY29udGV4dCByZWR1Y2VzIHRoZSBsaW5rLT5ycG1fYWN0aXZl IHRvIDEgdGh1cyBlbmFibGluZyB0aGUgc3VwcGxpZXIgdG8gc3VzcGVuZCBiZWZvcmUgdGhlIGNv bnN1bWVyIHN1c3BlbmRzLgo+Pj4+Cj4+Pj4gU28gaWY6Cj4+Pj4gQ29udGV4dCBUMToKPj4+PiBb MV0gc2NzaV9wcm9iZV9hbmRfYWRkX2x1bigpCj4+Pj4gWzJdwqDCoMKgIHwtIHNjc2lfYXV0b3Bt X3B1dF9kZXZpY2UoKSAtIHJlZHVjZSB0aGUgbGluay0+cnBtX2FjdGl2ZSB0byAxCj4+Pj4KPj4+ PiBDb250ZXh0IFQyOgo+Pj4+IF9fZGV2aWNlX2F0dGFjaF9hc3luY19oZWxwZXIoKQo+Pj4+ICDC oMKgwqDCoMKgfC0gZHJpdmVyX3Byb2JlX2RldmljZSgpCj4+Pj4gIMKgwqDCoMKgwqDCoMKgwqAg fC0gc2RfcHJvYmUoKQo+Pj4+IEluIGJldHdlZW4gWzFdIGFuZCBbMl0gc2F5LCBkcml2ZXJfcHJv YmVfZGV2aWNlKCkgLT4gc2RfcHJvYmUoKSBpcyBpbnZva2VkIGluIGEgc2VwYXJhdGUgY29udGV4 dCBmcm9tIF9fZGV2aWNlX2F0dGFjaF9hc3luY19oZWxwZXIoKS4KPj4+PiBUaGUgZHJpdmVyX3By b2JlX2RldmljZSgpIC0+IHBtX3J1bnRpbWVfZ2V0X3N1cHBsaWVycygpIGJ1dCBbMl0gd291bGQg cmVkdWNlIGxpbmstPnJwbV9hY3RpdmUgdG8gMS4KPj4+PiBUaGVuIHNkX3Byb2JlKCkgd291bGQg aW52b2tlIHJwbV9yZXN1bWUoKSBhbmQgcHJvY2VlZCBhcyBpcy4KPj4+PiBXaGVuIHNkX3Byb2Jl KCkgaW52b2tlcyBzY3NpX2F1dG9wbV9wdXRfZGV2aWNlKCkgaXQnZCBzdGFydCBhIHRpbWVyLCBk ZXYtPnBvd2VyLnRpbWVyX2F1dG9zdXNwZW5kcyA9IDEuCj4+Pj4KPj4+PiBOb3cgdGhlbiwgcG1f cnVudGltZV9wdXRfc3VwcGxpZXJzKCkgaXMgaW52b2tlZCBmcm9tIGRyaXZlcl9wcm9iZV9kZXZp Y2UoKSBhbmQgdGhhdCBtYWtlcyB0aGUgbGluay0+cnBtX2FjdGl2ZSA9IDEuCj4+Pj4gQnV0IGJ5 IG5vdywgdGhlIGNvcnJlc3BvbmRpbmcgJ3NkIGRldicgKGNvbnN1bWVyKSB1c2FnZV9jb3VudCA9 IDAsIHN0YXRlID0gUlBNX0FDVElWRSBhbmQgbGluay0+cnBtX2FjdGl2ZSA9IDEuCj4+Pj4gQXQg dGhpcyBwb2ludCBvZiB0aW1lLCBhbGwgb3RoZXIgJ3NkIGRldicgKGNvbnN1bWVycykgX21heV8g YmUgc3VzcGVuZGVkIG9yIGFjdGl2ZSBidXQgd291bGQgaGF2ZSB0aGUgbGluay0+cnBtX2FjdGl2 ZSA9IDEuCj4+Pgo+Pj4gSXMgdGhpcyB3aXRoIERMX0ZMQUdfUlBNX0FDVElWRT/CoCBJbiB0aGF0 IGNhc2UsIHdvdWxkbid0IGFjdGl2ZQo+Pj4gY29uc3VtZXJzIGhhdmUgbGluay0+cnBtX2FjdGl2 ZSA9IDIgYW5kIGFsc28gaGF2ZSBpbmNyZW1lbnRlZAo+Pj4gdGhlIHN1cHBsaWVyJ3MgdXNhZ2Vf Y291bnQ/CgpZZXMgdGhpcyBpcyB3aXRoIERMX0ZMQUdfUlBNX0FDVElWRS4KClBsZWFzZSBsZXQg bWUgc2hhcmUgYSBsb2cgaGVyZToKQkVGIG1lYW5zIC0gQmVmb3JlLCBBRlQgbWVhbnMgQWZ0ZXIu CgpbICAgIDYuODQzNDQ1XVsgICAgVDddIHNjc2kgMDowOjA6NDogW1VGU0RCR106IHVmc2hjZF9z ZXR1cF9saW5rczo0Nzc5OiAKICBzdXBwOiB1c2FnZV9jbnQ6IDMgTGluayAtIDA6MDowOjQ5NDg4 IGxpbmstcnBtX2FjdGl2ZTogMiBhdmFpbF9sdW5zOiA1ClsgICAgNi44OTI1NDVdWyAgICBUN10g c2NzaSAwOjA6MDo0OiBwbV9ydW50aW1lX2dldF9zdXBwbGllcnM6IAooMDowOjA6NDk0ODgpOiBz dXBwOiB1c2FnZV9jb3VudDogNSBycG1fYWN0aXZlOiA0CgpJbiB0aGUgYWJvdmUgbG9nLCBUNyBp cyB0aGUgY29udGV4dCBpbiB3aGljaCB0aGlzIHNjc2kgZGV2aWNlIGlzIGJlaW5nIAphZGRlZCAt IHNjc2lfc3lzZnNfYWRkX3NkZXYoKQoKWyAgICA2LjkzMTg0Nl1bICAgIFQ3XSB1ZnNfcnBtYl93 bHVuIDA6MDowOjQ6IFtVRlNEQkddOiAKdWZzaGNkX3JwbWJfcHJvYmU6OTY5MjogaW52b2tlZApb ICAgIDYuOTQxMjQ2XVsgICAgVDddIHNjc2kgMDowOjA6NDogcG1fcnVudGltZV9wdXRfc3VwcGxp ZXJzOiBycG1fYWN0aXZlOiA0CgpbICAgIDYuOTQxMjQ2XVsgICAgVDddIHNjc2kgMDowOjA6NDog cG1fcnVudGltZV9wdXRfc3VwcGxpZXJzOiAKKDA6MDowOjQ5NDg4KSBbQkVGXSB1c2FnZV9jb3Vu dDogNQpbICAgIDYuOTQxMjQ3XVsgICAgVDddIHNjc2kgMDowOjA6NDogcG1fcnVudGltZV9wdXRf c3VwcGxpZXJzOiAKKDA6MDowOjQ5NDg4KSBbQUZUXSB1c2FnZV9jb3VudDogNCBycG1fYWN0aXZl OiAzCgpbICAgIDYuOTQxMjY3XVsgICAgVDddIHNjc2kgMDowOjA6NDogcnBtX3B1dF9zdXBwbGll cnM6IFtCRUZdIFN1cHAgCigwOjA6MDo0OTQ4OCkgdXNhZ2VfY291bnQ6IDQgcnBtX2FjdGl2ZTog MwoKLS0tLS0tIFQxOTYgQ29udGV4dCBjb21lcyBpbiB3aGlsZSBUNyBpcyBydW5uaW5nIC0tLS0t LS0tLS0KWyAgICA2Ljk0MTQ2Nl1bICBUMTk2XSBzY3NpIDA6MDowOjQ6IHBtX3J1bnRpbWVfZ2V0 X3N1cHBsaWVyczogCigwOjA6MDo0OTQ4OCk6IHN1cHA6IHVzYWdlX2NvdW50OiA1IHJwbV9hY3Rp dmU6IDQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0KClsgICAgNy43ODgzOTddWyAgICBUN10gc2NzaSAwOjA6MDo0OiBycG1fcHV0 X3N1cHBsaWVyczogW0FGVF0gU3VwcCAKKDA6MDowOjQ5NDg4KSB1c2FnZV9jb3VudDogMiBycG1f YWN0aXZlOiAxCgotLSAKClQxOTYgaXMgdGhlIGNvbnRleHQgaW4gd2hpY2ggc2RfcHJvYmUoKSBp cyBpbnZva2VkIGZvciB0aGlzIHNjc2kgZGV2aWNlLgoKWyAgICA3Ljk3NDQxMF1bICBUMTk2XSBz ZCAwOjA6MDo0OiBbc2RlXSBBdHRhY2hlZCBTQ1NJIGRpc2sKWyAgICA3Ljk4NDE4OF1bICBUMTk2 XSBzZCAwOjA6MDo0OiBwbV9ydW50aW1lX3B1dF9zdXBwbGllcnM6IHJwbV9hY3RpdmU6IDIKWyAg ICA3Ljk5ODQyNF1bICBUMTk2XSBzZCAwOjA6MDo0OiBwbV9ydW50aW1lX3B1dF9zdXBwbGllcnM6 IAooMDowOjA6NDk0ODgpIFtCRUZdIHVzYWdlX2NvdW50OiA0ClsgICAgOC4wMTczMjBdWyAgVDE5 Nl0gc2QgMDowOjA6NDogcG1fcnVudGltZV9wdXRfc3VwcGxpZXJzOiAKKDA6MDowOjQ5NDg4KSBb QUZUXSB1c2FnZV9jb3VudDogMSBycG1fYWN0aXZlOiAxCgpUaGUgcmVmZXJlbmNlIHRvIHRoZSBs aW5rIGlzIHJlbGVhc2VkIGFmdGVyIHNkX3Byb2JlKCkgaXMgY29tcGxldGVkLgpBdCB0aGlzIHBv aW50LCB0aGUgcnBtX2FjdGl2ZSBzaG91bGQgYmUgMi4gQW5kIHRoZSBycG1fYWN0aXZlIHNob3Vs ZCAKYmVjb21lIDEgd2hlbiBzZCAwOjA6MDo0IGFjdHVhbGx5IHN1c3BlbmRzLiBCdXQgYXQgdGhl IGVuZCBvZiBzZF9wcm9iZSgpIAp0aGUgc3VzcGVuZCBpcyBvbmx5IHNjaGVkdWxlZC4gSG93ZXZl ciB0aGUgc3VwcGxpZXIgaXMgbm93IGZyZWUgdG8gc3VzcGVuZC4KCkluIHRoaXMgbG9nLCB0aGUg dXNhZ2VfY291bnQgb2Ygc3VwcGxpZXIgYmVjb21lcyAwIGhlcmU6ClsgICAxMS45NjM4ODVdWyAg VDExN10gc2QgMDowOjA6NzogcnBtX3B1dF9zdXBwbGllcnM6IFtCRUZdIFN1cHAgCigwOjA6MDo0 OTQ4OCkgdXNhZ2VfY291bnQ6IDEgcnBtX2FjdGl2ZTogMgpbICAgMTEuOTczODIxXVsgIFQxMTdd IHNkIDA6MDowOjc6IHJwbV9wdXRfc3VwcGxpZXJzOiBbQUZUXSBTdXBwIAooMDowOjA6NDk0ODgp IHVzYWdlX2NvdW50OiAwIHJwbV9hY3RpdmU6IDEKCkhvd2V2ZXIsIHRoZSBjb25zdW1lciBzZCAw OjA6MDo0IGlzIHN0aWxsIGFjdGl2ZSBidXQgaGFzIHJlbGVhc2VkIHRoZSAKcmVmZXJlbmNlIHRv IHRoZSBzdXBwbGllcjoKWyAgIDEyLjAwMjc5Ml1bICBUMTE3XSBzY3NpIDA6MDowOjQ5NDU2OiBy cG1fc3RhdHVzIC0gMgpbICAgMTIuMDAyODA2XVsgIFQxMTddIHNkIDA6MDowOjA6IHJwbV9zdGF0 dXMgLSAyClsgICAxMi4wMDI4MzRdWyAgVDExN10gc2QgMDowOjA6MTogcnBtX3N0YXR1cyAtIDIK WyAgIDEyLjAxNzczMF1bICBUMTE3XSBzZCAwOjA6MDoyOiBycG1fc3RhdHVzIC0gMgpbICAgMTIu MDQxMzE3XVsgIFQxMTddIHNkIDA6MDowOjM6IHJwbV9zdGF0dXMgLSAyClsgICAxMi4wNDU5NTNd WyAgVDExN10gc2QgMDowOjA6NDogcnBtX3N0YXR1cyAtIDAKCkFuZCBzZCAwOjA6MDo0IHRyaWVz IHRvIHN1c3BlbmQgaGVyZToKWyAgIDE1LjQ2NTkxNF1bICBUMTE3XSBzZCAwOjA6MDo0OiBbc2Rl XSBTeW5jaHJvbml6aW5nIFNDU0kgY2FjaGUKCj4+Pgo+Pj4gQW5vdGhlciBvdXRzdGFuZGluZyBp c3N1ZSB0aGF0IGNvbWVzIHRvIG1pbmQsIGlzIHRvIGVuc3VyZQo+Pj4gaGJhLT5zZGV2X3Vmc19k ZXZpY2UgZG9lcyBub3QgcnVudGltZSBzdXNwZW5kIGJlZm9yZSBpdCBpcyBwcm9iZWQuCj4+PiBJ IHN1Z2dlc3QgY2hhbmdpbmcgdWZzaGNkX3NsYXZlX2NvbmZpZ3VyZSgpIHNvIGl0IGRvZXMgbm90 IHNldAo+Pj4gc2Rldi0+cnBtX2F1dG9zdXNwZW5kIGZvciBoYmEtPnNkZXZfdWZzX2RldmljZSwg YW5kIGluc3RlYWQgZG8KPj4+IHBtX3J1bnRpbWVfYWxsb3cgLyBwbV9ydW50aW1lX2ZvcmJpZCgp IGluIHVmc2hjZF93bF9wcm9iZSgpIC8KPj4+IHVmc2hjZF93bF9yZW1vdmUoKSByZXNwZWN0aXZl bHkuCj4+PgpJZiBwbV9ydW50aW1lX2FsbG93KCkgaXMgaW52b2tlZCBmcm9tIHVmc2hjZF93bF9w cm9iZSgpIGl0J2QgaW52b2tlIApydW50aW1lX3N1c3BlbmQgb24gaGJhLT5zZGV2X3Vmc19kZXZp Y2UgYmVmb3JlIGV4aXRpbmcgCnNjc2lfc3lzZnNfYWRkX3NkZXYoKS4gU28gSSB0aGluayBwbV9y dW50aW1lX2FsbG93KCkgc2hvdWxkIGJlIGludm9rZWQgCmluIHVmc2hjZF9zY3NpX2FkZF93bHVz KCkuCgo+Pj4gSG93ZXZlciB3ZSBzdGlsbCB3YW50IHRvIHN0b3AgaGJhLT5zZGV2X3Vmc19kZXZp Y2UgcnVudGltZQo+Pj4gc3VzcGVuZGluZyB3aGlsZSBjb25zdW1lcnMgYXJlIGJlaW5nIGFkZGVk LsKgIFdpdGggdGhhdCBpbiBtaW5kLAo+Pj4gSSB3b3VsZCBleHBlY3QgcG1fcnVudGltZV9nZXRf bm9yZXN1bWUoJmhiYS0+c2Rldl91ZnNfZGV2aWNlLT5zZGV2X2dlbmRldikKPj4+IGluIHVmc2hj ZF9zY3NpX2FkZF93bHVzKCkgdG8gY29tZSAqYmVmb3JlKgo+Pj4gdWZzaGNkX2Jsa19wbV9ydW50 aW1lX2luaXQoaGJhLT5zZGV2X3Vmc19kZXZpY2UpLsKgIEluIGZhY3QsIGl0IHdvdWxkCj4+PiBi ZSBtb3JlIGxvZ2ljYWwgdG8gbWFrZSBpdCwgcG1fcnVudGltZV9nZXRfc3luYygpIHNpbmNlIHdl IHJlcXVpcmUKPj4+IGhiYS0+c2Rldl91ZnNfZGV2aWNlIHRvIGJlIGFjdGl2ZSBhdCB0aGF0IHBv aW50Lgo+Pj4KQ29ycmVjdCwgc2NzaV9hdXRvcG1fZ2V0X2RldmljZShoYmEtPnNkZXZfdWZzX2Rl dmljZSkgc2hvdWxkIGJlIGludm9rZWQgCmJlZm9yZSB1ZnNoY2RfYmxrX3BtX3J1bnRpbWVfaW5p dChoYmEtPnNkZXZfdWZzX2RldmljZSkuCk5vdyBhIGNvcnJlc3BvbmRpbmcgc2NzaV9hdXRvcG1f cHV0X2RldmljZShoYmEtPnNkZXZfdWZzX2RldmljZSkgaXMgCmludm9rZWQgYWZ0ZXIgdGhlIGNv bnN1bWVycyBhcmUgYWRkZWQgaW4gdWZzaGNkX3NldHVwX2xpbmtzKCkuCkV2ZW4gdGhlbiBJIHRo aW5rIHRoaXMgaXNzdWUgd291bGQgc3RpbGwgcG9wIHVwLgoKPj4+Cj4+Cj4+IEhpIEFkcmlhbiwK Pj4gSSB0aGluayB0aGUgdjExIHRoYXQgSSBwdXNoZWQgY2FuIGhhbmRsZSB0aGlzLgo+PiBydW50 aW1lLXN1c3BlbmQgaXMgZm9yYmlkZGVuIGF0IHByb2JlIGFuZCBpcyByZS1lbmFibGVkIGFmdGVy IHByb2JlIGlzIGRvbmUuIFBsZWFzZSB0YWtlIGEgbG9vayBhbmQgbGV0IG1lIGtub3cgaWYgSSdt IG1pc3Npbmcgc29tZXRoaW5nLgo+IAo+IElmIHRoZSBQTSBBUElzIGFyZSBiZWluZyB1c2VkIGNv cnJlY3RseSwgdGhlIHVzYWdlIGFuZCBhY3RpdmUKPiBjb3VudHMgc2hvdWxkIG5ldmVyIGJlIHdy b25nLiAgSWYgdGhleSB3ZXJlLCB0aGVuIHRoYXQgd291bGQKPiBiZSBhbiBpc3N1ZSBmb3IgdGhl IFBNIGZyYW1ld29yay4KPkl0IGlzIG1vcmUgbGlrZWx5IHRoYXQgSSdtIHVzaW5nIGl0IGluY29y cmVjdGx5IDopLgoKPiBIb3dldmVyLCBpdCBpcyBoYXJkIHRvIHRlbGwgd2hhdCB0aGUgaXNzdWVz IGFyZSB1bnRpbCBhbGwgdGhlCj4gVUZTIGRyaXZlciBjaGFuZ2VzIGhhdmUgYmVlbiBjb21wbGV0 ZWQsIHN1Y2ggYXMgdGhlIG9uZXMgSQo+IHN1Z2dlc3RlZCBhYm92ZSBhYm92ZS4KPiAKT2ssIHVu ZGVyc3Rvb2QuCgo+IHYxMSBjb3VsZCBiZSBoaWRpbmcgaXNzdWVzIHJhdGhlciB0aGFuIGZpeGlu ZyB0aGVtLgo+IApCYXNlZCBvbiB0aGUgbG9ncywgaW4gdjExLCBJIHRyaWVkIHRvIGZvcmJpZCBh bnkgcnVudGltZS1zdXNwZW5kIHVudGlsIApzZF9wcm9iZSgpIGlzIGRvbmUuCkkgY291bGQgYmUg bWlzdW5kZXJzdGFuZGluZyB0aGUgd2hvbGUgdGhpbmcgdGhvdWdoLgoKSGF2aW5nIHNhaWQgdGhh dCwgSSB3aWxsIG1ha2UgdGhlIGNoYW5nZXMgYXMgcGVyIHlvdXIgc3VnZ2VzdGlvbnMgYW5kIApw dXNoIGEgdjEyLiBJIHdpbGwgdGVzdCB3aXRoIHYxMiBhcyB3ZWxsIGFuZCBzZWUgaWYgdGhpcyBp c3N1ZSBpcyBzZWVuLgoKPj4KPj4+Pgo+Pj4+IFNpbmNlIHRoZSBzdXBwbGllciBoYXMgMCBhdXRv LXN1c3BlbmQgZGVsYXksIGl0IG5vdyBzdXNwZW5kcyEKPj4+Pgo+Pj4+Cj4+Pj4gQ29udGV4dCBb VDFdCj4+Pj4gQ2FsbCB0cmFjZToKPj4+PiBkdW1wX2JhY2t0cmFjZSsweDAvMHgxZDQKPj4+PiBz aG93X3N0YWNrKzB4MTgvMHgyNAo+Pj4+IGR1bXBfc3RhY2srMHhjNC8weDE0NAo+Pj4+IF9fcG1f cnVudGltZV9pZGxlKzB4YjQvMHgxODQKPj4+PiBzY3NpX2F1dG9wbV9wdXRfZGV2aWNlKzB4MTgv MHgyNAo+Pj4+IHNjc2lfc3lzZnNfYWRkX3NkZXYrMHgyNmMvMHgyNzgKPj4+PiBzY3NpX3Byb2Jl X2FuZF9hZGRfbHVuKzB4YmFjLzB4ZDQ4Cj4+Pj4gX19zY3NpX3NjYW5fdGFyZ2V0KzB4MzhjLzB4 NTEwCj4+Pj4gc2NzaV9zY2FuX2hvc3Rfc2VsZWN0ZWQrMHgxNGMvMHgxZTQKPj4+PiBzY3NpX3Nj YW5faG9zdCsweDFlMC8weDIyOAo+Pj4+IHVmc2hjZF9hc3luY19zY2FuKzB4MzljLzB4NDA4Cj4+ Pj4gYXN5bmNfcnVuX2VudHJ5X2ZuKzB4NDgvMHgxMjgKPj4+PiBwcm9jZXNzX29uZV93b3JrKzB4 MWYwLzB4NDcwCj4+Pj4gd29ya2VyX3RocmVhZCsweDI2Yy8weDRjOAo+Pj4+IGt0aHJlYWQrMHgx M2MvMHgzMjAKPj4+PiByZXRfZnJvbV9mb3JrKzB4MTAvMHgxOAo+Pj4+Cj4+Pj4KPj4+PiBDb250 ZXh0IFtUMl0KPj4+PiBDYWxsIHRyYWNlOgo+Pj4+IGR1bXBfYmFja3RyYWNlKzB4MC8weDFkNAo+ Pj4+IHNob3dfc3RhY2srMHgxOC8weDI0Cj4+Pj4gZHVtcF9zdGFjaysweGM0LzB4MTQ0Cj4+Pj4g cnBtX2dldF9zdXBwbGllcnMrMHg0OC8weDFhYwo+Pj4+IF9fcnBtX2NhbGxiYWNrKzB4NTgvMHgx MmMKPj4+PiBycG1fcmVzdW1lKzB4M2E0LzB4NjE4Cj4+Pj4gX19wbV9ydW50aW1lX3Jlc3VtZSsw eDUwLzB4ODAKPj4+PiBzY3NpX2F1dG9wbV9nZXRfZGV2aWNlKzB4MjAvMHg1NAo+Pj4+IHNkX3By b2JlKzB4NDAvMHgzZDAKPj4+PiByZWFsbHlfcHJvYmUrMHgxYmMvMHg0YTAKPj4+PiBkcml2ZXJf cHJvYmVfZGV2aWNlKzB4ODQvMHhmMAo+Pj4+IF9fZGV2aWNlX2F0dGFjaF9kcml2ZXIrMHgxMTQv MHgxMzgKPj4+PiBidXNfZm9yX2VhY2hfZHJ2KzB4ODQvMHhkMAo+Pj4+IF9fZGV2aWNlX2F0dGFj aF9hc3luY19oZWxwZXIrMHg3Yy8weGYwCj4+Pj4gYXN5bmNfcnVuX2VudHJ5X2ZuKzB4NDgvMHgx MjgKPj4+PiBwcm9jZXNzX29uZV93b3JrKzB4MWYwLzB4NDcwCj4+Pj4gd29ya2VyX3RocmVhZCsw eDI2Yy8weDRjOAo+Pj4+IGt0aHJlYWQrMHgxM2MvMHgzMjAKPj4+PiByZXRfZnJvbV9mb3JrKzB4 MTAvMHgxOAo+Pj4+Cj4+Pj4gQmVsb3cgcHJpbnRzIHNob3cgaG93IGxpbmstPnJwbV9hY3RpdmUg YmVjb21lcyAxIGZvciBzZCAwOjA6MDo0Cj4+Pj4gW8KgwqDCoCA3LjU3NDY1NF1bwqAgVDIxMl0g Q2FsbCB0cmFjZToKPj4+PiBbwqDCoMKgIDcuNTc0NjU3XVvCoCBUMjEyXcKgIGR1bXBfYmFja3Ry YWNlKzB4MC8weDFkNAo+Pj4+IFvCoMKgwqAgNy41NzQ2NjFdW8KgIFQyMTJdwqAgc2hvd19zdGFj aysweDE4LzB4MjQKPj4+PiBbwqDCoMKgIDcuNTc0NjY1XVvCoCBUMjEyXcKgIGR1bXBfc3RhY2sr MHhjNC8weDE0NAo+Pj4+IFvCoMKgwqAgNy41NzQ2NjhdW8KgIFQyMTJdwqAgX19wbV9ydW50aW1l X2lkbGUrMHhiNC8weDE4NAo+Pj4+IFvCoMKgwqAgNy41NzQ2NzFdW8KgIFQyMTJdwqAgc2NzaV9h dXRvcG1fcHV0X2RldmljZSsweDE4LzB4MjQKPj4+PiBbwqDCoMKgIDcuNTc0Njc1XVvCoCBUMjEy XcKgIHNkX3Byb2JlKzB4MzE0LzB4M2QwCj4+Pj4gW8KgwqDCoCA3LjU3NDY3N11bwqAgVDIxMl3C oCByZWFsbHlfcHJvYmUrMHgxYmMvMHg0YTAKPj4+PiBbwqDCoMKgIDcuNTc0NjgwXVvCoCBUMjEy XcKgIGRyaXZlcl9wcm9iZV9kZXZpY2UrMHg4NC8weGYwCj4+Pj4gW8KgwqDCoCA3LjU3NDY4M11b wqAgVDIxMl3CoCBfX2RldmljZV9hdHRhY2hfZHJpdmVyKzB4MTE0LzB4MTM4Cj4+Pj4gW8KgwqDC oCA3LjU3NDY4Nl1bwqAgVDIxMl3CoCBidXNfZm9yX2VhY2hfZHJ2KzB4ODQvMHhkMAo+Pj4+IFvC oMKgwqAgNy41NzQ2ODldW8KgIFQyMTJdwqAgX19kZXZpY2VfYXR0YWNoX2FzeW5jX2hlbHBlcisw eDdjLzB4ZjAKPj4+PiBbwqDCoMKgIDcuNTc0NjkyXVvCoCBUMjEyXcKgIGFzeW5jX3J1bl9lbnRy eV9mbisweDQ4LzB4MTI4Cj4+Pj4gW8KgwqDCoCA3LjU3NDY5NV1bwqAgVDIxMl3CoCBwcm9jZXNz X29uZV93b3JrKzB4MWYwLzB4NDcwCj4+Pj4gW8KgwqDCoCA3LjU3NDY5OF1bwqAgVDIxMl3CoCB3 b3JrZXJfdGhyZWFkKzB4MjZjLzB4NGM4Cj4+Pj4gW8KgwqDCoCA3LjU3NDcwMF1bwqAgVDIxMl3C oCBrdGhyZWFkKzB4MTNjLzB4MzIwCj4+Pj4gW8KgwqDCoCA3LjU3NDcwM11bwqAgVDIxMl3CoCBy ZXRfZnJvbV9mb3JrKzB4MTAvMHgxOAo+Pj4+IFvCoMKgwqAgNy41NzQ3MDZdW8KgIFQyMTJdIHNk IDA6MDowOjQ6IHNjc2lfcnVudGltZV9pZGxlCj4+Pj4gW8KgwqDCoCA3LjU3NDcxMl1bwqAgVDIx Ml0gc2QgMDowOjA6NDogX19wbV9ydW50aW1lX2lkbGU6IGFmdDogW1VGU0RCR106IHB3ci50aW1l cl9hdXRvc3VzcGVuZHM6IDEgcHdyLnJlcXVlc3RfcGVuZGluZzogMCByZXR2YWw6IC0xNiBwd3Iu cmVxdWVzdDogMCB1c2FnZV9jb3VudDogMCBycG1fc3RhdHVzOiAwIGxpbmstcnBtX2FjdGl2ZToy Cj4+Pj4gW8KgwqDCoCA3LjU3NDcxNV1bwqAgVDIxMl0gc2QgMDowOjA6NDogc2RfcHJvYmU6IFtV RlNEQkddOiBFeGl0Cj4+Pj4gW8KgwqDCoCA3LjU3NDczOF1bwqAgVDIxMl0gc2QgMDowOjA6NDog X19wbV9ydW50aW1lX2lkbGU6IGI0OiBbVUZTREJHXTogcHdyLnJlcXVlc3Q6IDAgdXNhZ2VfY291 bnQ6IDAgcnBtX3N0YXR1czogMCBsaW5rLXJwbV9hY3RpdmU6Mgo+Pj4+Cj4+Pj4gW8KgwqDCoCA3 LjU3NDc1Ml1bwqAgVDIxMl0gV29ya3F1ZXVlOiBldmVudHNfdW5ib3VuZCBhc3luY19ydW5fZW50 cnlfZm4KPj4+PiBbwqDCoMKgIDcuNTc0NzU0XVvCoCBUMjEyXSBDYWxsIHRyYWNlOgo+Pj4+IFvC oMKgwqAgNy41NzQ3NThdW8KgIFQyMTJdwqAgZHVtcF9iYWNrdHJhY2UrMHgwLzB4MWQ0Cj4+Pj4g W8KgwqDCoCA3LjU3NDc2MV1bwqAgVDIxMl3CoCBzaG93X3N0YWNrKzB4MTgvMHgyNAo+Pj4+IFvC oMKgwqAgNy41NzQ3NjVdW8KgIFQyMTJdwqAgZHVtcF9zdGFjaysweGM0LzB4MTQ0Cj4+Pj4gW8Kg wqDCoCA3LjU3NDc2N11bwqAgVDIxMl3CoCBfX3BtX3J1bnRpbWVfaWRsZSsweGI0LzB4MTg0Cj4+ Pj4gW8KgwqDCoCA3LjU3NDc3MF1bwqAgVDIxMl3CoCBkcml2ZXJfcHJvYmVfZGV2aWNlKzB4OTQv MHhmMAo+Pj4+IFvCoMKgwqAgNy41NzQ3NzNdW8KgIFQyMTJdwqAgX19kZXZpY2VfYXR0YWNoX2Ry aXZlcisweDExNC8weDEzOAo+Pj4+IFvCoMKgwqAgNy41NzQ3NzVdW8KgIFQyMTJdwqAgYnVzX2Zv cl9lYWNoX2RydisweDg0LzB4ZDAKPj4+PiBbwqDCoMKgIDcuNTc0Nzc4XVvCoCBUMjEyXcKgIF9f ZGV2aWNlX2F0dGFjaF9hc3luY19oZWxwZXIrMHg3Yy8weGYwCj4+Pj4gW8KgwqDCoCA3LjU3NDc4 MV1bwqAgVDIxMl3CoCBhc3luY19ydW5fZW50cnlfZm4rMHg0OC8weDEyOAo+Pj4+IFvCoMKgwqAg Ny41NzQ3ODNdW8KgIFQyMTJdwqAgcHJvY2Vzc19vbmVfd29yaysweDFmMC8weDQ3MAo+Pj4+IFvC oMKgwqAgNy41NzQ3ODZdW8KgIFQyMTJdwqAgd29ya2VyX3RocmVhZCsweDI2Yy8weDRjOAo+Pj4+ IFvCoMKgwqAgNy41NzQ3ODhdW8KgIFQyMTJdwqAga3RocmVhZCsweDEzYy8weDMyMAo+Pj4+IFvC oMKgwqAgNy41NzQ3OTFdW8KgIFQyMTJdwqAgcmV0X2Zyb21fZm9yaysweDEwLzB4MTgKPj4+PiBb wqDCoMKgIDcuNTc0ODQ4XVvCoMKgIFQ4MF0gc2QgMDowOjA6NDogc2NzaV9ydW50aW1lX2lkbGUK Pj4+PiBbwqDCoMKgIDcuNTc0ODU4XVvCoCBUMjEyXSBzZCAwOjA6MDo0OiBfX3BtX3J1bnRpbWVf aWRsZTogYWZ0OiBbVUZTREJHXTogcHdyLnRpbWVyX2F1dG9zdXNwZW5kczogMSBwd3IucmVxdWVz dF9wZW5kaW5nOiAwIHJldHZhbDogMCBwd3IucmVxdWVzdDogMCB1c2FnZV9jb3VudDogMCBycG1f c3RhdHVzOiAwIGxpbmstcnBtX2FjdGl2ZToyCj4+Pj4gW8KgwqDCoCA3LjU3NDg2M11bwqAgVDIx Ml0gc2QgMDowOjA6NDogcG1fcnVudGltZV9wdXRfc3VwcGxpZXJzOiBbVUZTREJHXTogcnBtX3N0 YXR1czogMCBsaW5rLXJwbV9hY3RpdmU6MQo+Pj4+IFvCoMKgwqAgNy41NzQ4NjZdW8KgIFQyMTJd IHNkIDA6MDowOjQ6IGFzeW5jIHByb2JlIGNvbXBsZXRlZAo+Pj4+IFvCoMKgwqAgNy41NzQ4NzBd W8KgIFQyMTJdIHNkIDA6MDowOjQ6IF9fcG1fcnVudGltZV9pZGxlOiBiNDogW1VGU0RCR106IHB3 ci5yZXF1ZXN0OiAwIHVzYWdlX2NvdW50OiAwIHJwbV9zdGF0dXM6IDAgbGluay1ycG1fYWN0aXZl OjEKPj4+Pgo+Pj4+Cj4+Pj4gU28sIGZyb20gdGhlIGFib3ZlIGl0IGxvb2tzIGxpa2Ugd2hlbiBh c3luYyBwcm9iZSBpcyBlbmFibGVkIHRoaXMgaXMgYSBwb3NzaWJpbGl0eS4KPj4+Pgo+Pj4+IEkg ZG9uJ3Qgc2VlIGEgd2F5IGFyb3VuZCB0aGlzLiBQbGVhc2UgbGV0IG1lIGtub3cgaWYgeW91IChA QWxhbi9AQmFydC9AQWRyaWFuKSBoYXZlIGFueSB0aG91Z2h0cyBvbiB0aGlzLgo+Pj4+Cj4+Pj4g VGhhbmtzLAo+Pj4+IC1hc2QKPj4+Pgo+Pj4KPj4KPj4KPiAKCgotLSAKVGhlIFF1YWxjb21tIElu bm92YXRpb24gQ2VudGVyLCBJbmMuIGlzIGEgbWVtYmVyIG9mIHRoZSBDb2RlIEF1cm9yYSBGb3J1 bSwKTGludXggRm91bmRhdGlvbiBDb2xsYWJvcmF0aXZlIFByb2plY3QKCl9fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkxpbnV4LW1lZGlhdGVrIG1haWxpbmcg bGlzdApMaW51eC1tZWRpYXRla0BsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZy YWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtbWVkaWF0ZWsK