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=-15.3 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_SANE_1 autolearn=unavailable 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 7DD84C433E6 for ; Wed, 10 Mar 2021 06:35:51 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 3EBB764FFC for ; Wed, 10 Mar 2021 06:35:51 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230371AbhCJGfG (ORCPT ); Wed, 10 Mar 2021 01:35:06 -0500 Received: from szxga06-in.huawei.com ([45.249.212.32]:13900 "EHLO szxga06-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229803AbhCJGeq (ORCPT ); Wed, 10 Mar 2021 01:34:46 -0500 Received: from DGGEMS413-HUB.china.huawei.com (unknown [172.30.72.58]) by szxga06-in.huawei.com (SkyGuard) with ESMTP id 4DwMhb3RfczjWpQ; Wed, 10 Mar 2021 14:33:03 +0800 (CST) Received: from [10.174.184.135] (10.174.184.135) by DGGEMS413-HUB.china.huawei.com (10.3.19.213) with Microsoft SMTP Server id 14.3.498.0; Wed, 10 Mar 2021 14:34:20 +0800 Subject: Re: [RFC PATCH v2 1/6] iommu: Evolve to support more scenarios of using IOPF To: Lu Baolu , Alex Williamson , Cornelia Huck , Will Deacon , Robin Murphy , Joerg Roedel , Jean-Philippe Brucker , "Eric Auger" , , , , , CC: Kevin Tian , , Christoph Hellwig , Jonathan Cameron , "Barry Song" , , , References: <20210309062207.505-1-lushenming@huawei.com> <20210309062207.505-2-lushenming@huawei.com> <7f8daef9-36db-f67c-a3e2-b96b5fa70291@linux.intel.com> From: Shenming Lu Message-ID: <7479e543-1598-459d-4838-50a6f1c3770b@huawei.com> Date: Wed, 10 Mar 2021 14:34:19 +0800 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Thunderbird/78.2.2 MIME-Version: 1.0 In-Reply-To: <7f8daef9-36db-f67c-a3e2-b96b5fa70291@linux.intel.com> Content-Type: text/plain; charset="utf-8" Content-Language: en-US Content-Transfer-Encoding: 8bit X-Originating-IP: [10.174.184.135] X-CFilter-Loop: Reflected Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Baolu, On 2021/3/10 10:09, Lu Baolu wrote: > Hi Shenming, > > On 3/9/21 2:22 PM, Shenming Lu wrote: >> This patch follows the discussion here: >> >> https://lore.kernel.org/linux-acpi/YAaxjmJW+ZMvrhac@myrica/ >> >> In order to support more scenarios of using IOPF (mainly consider >> the nested extension), besides keeping IOMMU_DEV_FEAT_IOPF as a >> general capability for whether delivering faults through the IOMMU, >> we extend iommu_register_fault_handler() with flags and introduce >> IOPF_REPORT_FLAT and IOPF_REPORT_NESTED to describe the page fault >> reporting capability under a specific configuration. >> IOPF_REPORT_NESTED needs additional info to indicate which level/stage >> is concerned since the fault client may be interested in only one >> level. >> >> Signed-off-by: Shenming Lu >> --- >>   .../iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c   |  3 +- >>   drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c   | 11 ++-- >>   drivers/iommu/io-pgfault.c                    |  4 -- >>   drivers/iommu/iommu.c                         | 56 ++++++++++++++++++- >>   include/linux/iommu.h                         | 21 ++++++- >>   include/uapi/linux/iommu.h                    |  3 + >>   6 files changed, 85 insertions(+), 13 deletions(-) >> >> diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c >> index ee66d1f4cb81..5de9432349d4 100644 >> --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c >> +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c >> @@ -482,7 +482,8 @@ static int arm_smmu_master_sva_enable_iopf(struct arm_smmu_master *master) >>       if (ret) >>           return ret; >>   -    ret = iommu_register_device_fault_handler(dev, iommu_queue_iopf, dev); >> +    ret = iommu_register_device_fault_handler(dev, iommu_queue_iopf, >> +                          IOPF_REPORT_FLAT, dev); >>       if (ret) { >>           iopf_queue_remove_device(master->smmu->evtq.iopf, dev); >>           return ret; >> diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c >> index 363744df8d51..f40529d0075d 100644 >> --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c >> +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c >> @@ -1447,10 +1447,6 @@ static int arm_smmu_handle_evt(struct arm_smmu_device *smmu, u64 *evt) >>           return -EOPNOTSUPP; >>       } >>   -    /* Stage-2 is always pinned at the moment */ >> -    if (evt[1] & EVTQ_1_S2) >> -        return -EFAULT; >> - >>       if (evt[1] & EVTQ_1_RnW) >>           perm |= IOMMU_FAULT_PERM_READ; >>       else >> @@ -1468,13 +1464,18 @@ static int arm_smmu_handle_evt(struct arm_smmu_device *smmu, u64 *evt) >>               .flags = IOMMU_FAULT_PAGE_REQUEST_LAST_PAGE, >>               .grpid = FIELD_GET(EVTQ_1_STAG, evt[1]), >>               .perm = perm, >> -            .addr = FIELD_GET(EVTQ_2_ADDR, evt[2]), >>           }; >>             if (ssid_valid) { >>               flt->prm.flags |= IOMMU_FAULT_PAGE_REQUEST_PASID_VALID; >>               flt->prm.pasid = FIELD_GET(EVTQ_0_SSID, evt[0]); >>           } >> + >> +        if (evt[1] & EVTQ_1_S2) { >> +            flt->prm.flags |= IOMMU_FAULT_PAGE_REQUEST_L2; >> +            flt->prm.addr = FIELD_GET(EVTQ_3_IPA, evt[3]); >> +        } else >> +            flt->prm.addr = FIELD_GET(EVTQ_2_ADDR, evt[2]); >>       } else { >>           flt->type = IOMMU_FAULT_DMA_UNRECOV; >>           flt->event = (struct iommu_fault_unrecoverable) { >> diff --git a/drivers/iommu/io-pgfault.c b/drivers/iommu/io-pgfault.c >> index 1df8c1dcae77..abf16e06bcf5 100644 >> --- a/drivers/iommu/io-pgfault.c >> +++ b/drivers/iommu/io-pgfault.c >> @@ -195,10 +195,6 @@ int iommu_queue_iopf(struct iommu_fault *fault, void *cookie) >>         lockdep_assert_held(¶m->lock); >>   -    if (fault->type != IOMMU_FAULT_PAGE_REQ) >> -        /* Not a recoverable page fault */ >> -        return -EOPNOTSUPP; >> - > > Any reasons why do you want to remove this check? My thought was to make the reporting cap more detailed: IOPF_REPORT_ is only for recoverable page faults (IOMMU_FAULT_PAGE_REQ), and we may add UNRECOV_FAULT_REPORT_ later for unrecoverable faults (IOMMU_FAULT_DMA_UNRECOV)... > >>       /* >>        * As long as we're holding param->lock, the queue can't be unlinked >>        * from the device and therefore cannot disappear. >> diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c >> index d0b0a15dba84..cb1d93b00f7d 100644 >> --- a/drivers/iommu/iommu.c >> +++ b/drivers/iommu/iommu.c >> @@ -1056,6 +1056,40 @@ int iommu_group_unregister_notifier(struct iommu_group *group, >>   } >>   EXPORT_SYMBOL_GPL(iommu_group_unregister_notifier); >>   +/* >> + * iommu_update_device_fault_handler - Update the device fault handler via flags >> + * @dev: the device >> + * @mask: bits(not set) to clear >> + * @set: bits to set >> + * >> + * Update the device fault handler installed by >> + * iommu_register_device_fault_handler(). >> + * >> + * Return 0 on success, or an error. >> + */ >> +int iommu_update_device_fault_handler(struct device *dev, u32 mask, u32 set) >> +{ >> +    struct dev_iommu *param = dev->iommu; >> +    int ret = 0; >> + >> +    if (!param) >> +        return -EINVAL; >> + >> +    mutex_lock(¶m->lock); >> + >> +    if (param->fault_param) { >> +        ret = -EINVAL; >> +        goto out_unlock; >> +    } >> + >> +    param->fault_param->flags = (param->fault_param->flags & mask) | set; >> + >> +out_unlock: >> +    mutex_unlock(¶m->lock); >> +    return ret; >> +} >> +EXPORT_SYMBOL_GPL(iommu_update_device_fault_handler); > > When and why will this API be used? Why not registering the fault > handling capabilities of a device driver only once during probe()? In VFIO, stage 2 IOPF might be enabled via an ioctl from the userspace (in this series), while stage 1 IOPF is enabled from vfio_pci_enable() [1] for nested mode, they are configured separately, and currently each device can only have one iommu dev fault handler. So I choose to add a update interface for the second one. [1] https://patchwork.kernel.org/project/kvm/patch/20210223210625.604517-6-eric.auger@redhat.com/ > >> + >>   /** >>    * iommu_register_device_fault_handler() - Register a device fault handler >>    * @dev: the device >> @@ -1076,11 +1110,14 @@ EXPORT_SYMBOL_GPL(iommu_group_unregister_notifier); >>    */ >>   int iommu_register_device_fault_handler(struct device *dev, >>                       iommu_dev_fault_handler_t handler, >> -                    void *data) >> +                    u32 flags, void *data) >>   { >>       struct dev_iommu *param = dev->iommu; >>       int ret = 0; >>   +    if (flags & IOPF_REPORT_FLAT && flags & IOPF_REPORT_NESTED) >> +        return -EINVAL; >> + >>       if (!param) >>           return -EINVAL; >>   @@ -1099,6 +1136,7 @@ int iommu_register_device_fault_handler(struct device *dev, >>           goto done_unlock; >>       } >>       param->fault_param->handler = handler; >> +    param->fault_param->flags = flags; >>       param->fault_param->data = data; >>       mutex_init(¶m->fault_param->lock); >>       INIT_LIST_HEAD(¶m->fault_param->faults); >> @@ -1177,6 +1215,22 @@ int iommu_report_device_fault(struct device *dev, struct iommu_fault_event *evt) >>           goto done_unlock; >>       } >>   +    /* The unrecoverable fault reporting is not supported at the moment. */ >> +    if (evt->fault.type != IOMMU_FAULT_PAGE_REQ) >> +        return -EOPNOTSUPP; > > Any reasons why do you want to disable reporting an unrecoverable fault? When I add UNRECOV_FAULT_REPORT_ (mentioned above), I will enable the unrecoverable fault reporting if the fault client concerns it. Sorry for this. :-) > >> + >> +    if (evt->fault.type == IOMMU_FAULT_PAGE_REQ) { >> +        if (fparam->flags & IOPF_REPORT_NESTED) { >> +            if (evt->fault.prm.flags & IOMMU_FAULT_PAGE_REQUEST_L2 && >> +                !(fparam->flags & IOPF_REPORT_NESTED_L2_CONCERNED)) >> +                return -EOPNOTSUPP; >> +            if (!(evt->fault.prm.flags & IOMMU_FAULT_PAGE_REQUEST_L2) && >> +                !(fparam->flags & IOPF_REPORT_NESTED_L1_CONCERNED)) >> +                return -EOPNOTSUPP; >> +        } else if (!(fparam->flags & IOPF_REPORT_FLAT)) >> +            return -EOPNOTSUPP; >> +    } >> + >>       if (evt->fault.type == IOMMU_FAULT_PAGE_REQ && >>           (evt->fault.prm.flags & IOMMU_FAULT_PAGE_REQUEST_LAST_PAGE)) { >>           evt_pending = kmemdup(evt, sizeof(struct iommu_fault_event), >> diff --git a/include/linux/iommu.h b/include/linux/iommu.h >> index 86d688c4418f..f03d761e8310 100644 >> --- a/include/linux/iommu.h >> +++ b/include/linux/iommu.h >> @@ -352,12 +352,21 @@ struct iommu_fault_event { >>   /** >>    * struct iommu_fault_param - per-device IOMMU fault data >>    * @handler: Callback function to handle IOMMU faults at device level >> + * @flags: Indicates whether the fault reporting is available under a >> + *       specific configuration (1st/2nd-level-only(FLAT), or nested). >> + *       IOPF_REPORT_NESTED needs to additionally know which level/stage >> + *       is concerned. > > If IOPF_REPORT_NESTED only is not valid why do you want to define it? Yeah, it seems that IOPF_REPORT_NESTED is unnecessary, IOPF_REPORT_NESTED_L1 + IOPF_REPORT_NESTED_L2 is enough... Thanks for your comments! Shenming > >>    * @data: handler private data >>    * @faults: holds the pending faults which needs response >>    * @lock: protect pending faults list >>    */ >>   struct iommu_fault_param { >>       iommu_dev_fault_handler_t handler; >> +#define IOPF_REPORT_FLAT            (1 << 0) >> +#define IOPF_REPORT_NESTED            (1 << 1) >> +#define IOPF_REPORT_NESTED_L1_CONCERNED        (1 << 2) >> +#define IOPF_REPORT_NESTED_L2_CONCERNED        (1 << 3) >> +    u32 flags; >>       void *data; >>       struct list_head faults; >>       struct mutex lock; >> @@ -509,9 +518,11 @@ extern int iommu_group_register_notifier(struct iommu_group *group, >>                        struct notifier_block *nb); >>   extern int iommu_group_unregister_notifier(struct iommu_group *group, >>                          struct notifier_block *nb); >> +extern int iommu_update_device_fault_handler(struct device *dev, >> +                         u32 mask, u32 set); >>   extern int iommu_register_device_fault_handler(struct device *dev, >>                       iommu_dev_fault_handler_t handler, >> -                    void *data); >> +                    u32 flags, void *data); >>     extern int iommu_unregister_device_fault_handler(struct device *dev); >>   @@ -873,10 +884,16 @@ static inline int iommu_group_unregister_notifier(struct iommu_group *group, >>       return 0; >>   } >>   +static inline int iommu_update_device_fault_handler(struct device *dev, >> +                            u32 mask, u32 set) >> +{ >> +    return -ENODEV; >> +} >> + >>   static inline >>   int iommu_register_device_fault_handler(struct device *dev, >>                       iommu_dev_fault_handler_t handler, >> -                    void *data) >> +                    u32 flags, void *data) >>   { >>       return -ENODEV; >>   } >> diff --git a/include/uapi/linux/iommu.h b/include/uapi/linux/iommu.h >> index e1d9e75f2c94..0ce0dfb7713e 100644 >> --- a/include/uapi/linux/iommu.h >> +++ b/include/uapi/linux/iommu.h >> @@ -85,6 +85,8 @@ struct iommu_fault_unrecoverable { >>    *         When IOMMU_FAULT_PAGE_RESPONSE_NEEDS_PASID is set, the page response >>    *         must have the same PASID value as the page request. When it is clear, >>    *         the page response should not have a PASID. >> + *         If IOMMU_FAULT_PAGE_REQUEST_L2 is set, the fault occurred at the >> + *         second level/stage, otherwise, occurred at the first level. >>    * @pasid: Process Address Space ID >>    * @grpid: Page Request Group Index >>    * @perm: requested page permissions (IOMMU_FAULT_PERM_* values) >> @@ -96,6 +98,7 @@ struct iommu_fault_page_request { >>   #define IOMMU_FAULT_PAGE_REQUEST_LAST_PAGE    (1 << 1) >>   #define IOMMU_FAULT_PAGE_REQUEST_PRIV_DATA    (1 << 2) >>   #define IOMMU_FAULT_PAGE_RESPONSE_NEEDS_PASID    (1 << 3) >> +#define IOMMU_FAULT_PAGE_REQUEST_L2        (1 << 4) >>       __u32    flags; >>       __u32    pasid; >>       __u32    grpid; >> > > Best regards, > baolu > . 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=-15.3 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0C31BC433DB for ; Wed, 10 Mar 2021 06:34:45 +0000 (UTC) Received: from smtp4.osuosl.org (smtp4.osuosl.org [140.211.166.137]) (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 52D7D64FE8 for ; Wed, 10 Mar 2021 06:34:44 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 52D7D64FE8 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=huawei.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=iommu-bounces@lists.linux-foundation.org Received: from localhost (localhost [127.0.0.1]) by smtp4.osuosl.org (Postfix) with ESMTP id EA0904EC45; Wed, 10 Mar 2021 06:34:43 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp4.osuosl.org ([127.0.0.1]) by localhost (smtp4.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id xLRmDnaNS6Qs; Wed, 10 Mar 2021 06:34:42 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [IPv6:2605:bc80:3010:104::8cd3:938]) by smtp4.osuosl.org (Postfix) with ESMTP id 1FEC745BE9; Wed, 10 Mar 2021 06:34:42 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id E4244C000A; Wed, 10 Mar 2021 06:34:41 +0000 (UTC) Received: from smtp3.osuosl.org (smtp3.osuosl.org [140.211.166.136]) by lists.linuxfoundation.org (Postfix) with ESMTP id 84CBBC0001 for ; Wed, 10 Mar 2021 06:34:40 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp3.osuosl.org (Postfix) with ESMTP id 660E46F62C for ; Wed, 10 Mar 2021 06:34:40 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp3.osuosl.org ([127.0.0.1]) by localhost (smtp3.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id oR17l01kPsBW for ; Wed, 10 Mar 2021 06:34:38 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.8.0 Received: from szxga06-in.huawei.com (szxga06-in.huawei.com [45.249.212.32]) by smtp3.osuosl.org (Postfix) with ESMTPS id 8D4EB6F6A3 for ; Wed, 10 Mar 2021 06:34:37 +0000 (UTC) Received: from DGGEMS413-HUB.china.huawei.com (unknown [172.30.72.58]) by szxga06-in.huawei.com (SkyGuard) with ESMTP id 4DwMhb3RfczjWpQ; Wed, 10 Mar 2021 14:33:03 +0800 (CST) Received: from [10.174.184.135] (10.174.184.135) by DGGEMS413-HUB.china.huawei.com (10.3.19.213) with Microsoft SMTP Server id 14.3.498.0; Wed, 10 Mar 2021 14:34:20 +0800 Subject: Re: [RFC PATCH v2 1/6] iommu: Evolve to support more scenarios of using IOPF To: Lu Baolu , Alex Williamson , Cornelia Huck , Will Deacon , Robin Murphy , Joerg Roedel , Jean-Philippe Brucker , "Eric Auger" , , , , , References: <20210309062207.505-1-lushenming@huawei.com> <20210309062207.505-2-lushenming@huawei.com> <7f8daef9-36db-f67c-a3e2-b96b5fa70291@linux.intel.com> From: Shenming Lu Message-ID: <7479e543-1598-459d-4838-50a6f1c3770b@huawei.com> Date: Wed, 10 Mar 2021 14:34:19 +0800 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Thunderbird/78.2.2 MIME-Version: 1.0 In-Reply-To: <7f8daef9-36db-f67c-a3e2-b96b5fa70291@linux.intel.com> Content-Language: en-US X-Originating-IP: [10.174.184.135] X-CFilter-Loop: Reflected Cc: Kevin Tian , Christoph Hellwig , wanghaibin.wang@huawei.com X-BeenThere: iommu@lists.linux-foundation.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: Development issues for Linux IOMMU support List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: iommu-bounces@lists.linux-foundation.org Sender: "iommu" SGkgQmFvbHUsCgpPbiAyMDIxLzMvMTAgMTA6MDksIEx1IEJhb2x1IHdyb3RlOgo+IEhpIFNoZW5t aW5nLAo+IAo+IE9uIDMvOS8yMSAyOjIyIFBNLCBTaGVubWluZyBMdSB3cm90ZToKPj4gVGhpcyBw YXRjaCBmb2xsb3dzIHRoZSBkaXNjdXNzaW9uIGhlcmU6Cj4+Cj4+IGh0dHBzOi8vbG9yZS5rZXJu ZWwub3JnL2xpbnV4LWFjcGkvWUFheGptSlcrWk12cmhhY0BteXJpY2EvCj4+Cj4+IEluIG9yZGVy IHRvIHN1cHBvcnQgbW9yZSBzY2VuYXJpb3Mgb2YgdXNpbmcgSU9QRiAobWFpbmx5IGNvbnNpZGVy Cj4+IHRoZSBuZXN0ZWQgZXh0ZW5zaW9uKSwgYmVzaWRlcyBrZWVwaW5nIElPTU1VX0RFVl9GRUFU X0lPUEYgYXMgYQo+PiBnZW5lcmFsIGNhcGFiaWxpdHkgZm9yIHdoZXRoZXIgZGVsaXZlcmluZyBm YXVsdHMgdGhyb3VnaCB0aGUgSU9NTVUsCj4+IHdlIGV4dGVuZCBpb21tdV9yZWdpc3Rlcl9mYXVs dF9oYW5kbGVyKCkgd2l0aCBmbGFncyBhbmQgaW50cm9kdWNlCj4+IElPUEZfUkVQT1JUX0ZMQVQg YW5kIElPUEZfUkVQT1JUX05FU1RFRCB0byBkZXNjcmliZSB0aGUgcGFnZSBmYXVsdAo+PiByZXBv cnRpbmcgY2FwYWJpbGl0eSB1bmRlciBhIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24uCj4+IElPUEZf UkVQT1JUX05FU1RFRCBuZWVkcyBhZGRpdGlvbmFsIGluZm8gdG8gaW5kaWNhdGUgd2hpY2ggbGV2 ZWwvc3RhZ2UKPj4gaXMgY29uY2VybmVkIHNpbmNlIHRoZSBmYXVsdCBjbGllbnQgbWF5IGJlIGlu dGVyZXN0ZWQgaW4gb25seSBvbmUKPj4gbGV2ZWwuCj4+Cj4+IFNpZ25lZC1vZmYtYnk6IFNoZW5t aW5nIEx1IDxsdXNoZW5taW5nQGh1YXdlaS5jb20+Cj4+IC0tLQo+PiDCoCAuLi4vaW9tbXUvYXJt L2FybS1zbW11LXYzL2FybS1zbW11LXYzLXN2YS5jwqDCoCB8wqAgMyArLQo+PiDCoCBkcml2ZXJz L2lvbW11L2FybS9hcm0tc21tdS12My9hcm0tc21tdS12My5jwqDCoCB8IDExICsrLS0KPj4gwqAg ZHJpdmVycy9pb21tdS9pby1wZ2ZhdWx0LmPCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCB8wqAgNCAtLQo+PiDCoCBkcml2ZXJzL2lvbW11L2lvbW11LmPCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfCA1NiArKysrKysrKysrKysrKysr KystCj4+IMKgIGluY2x1ZGUvbGludXgvaW9tbXUuaMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB8IDIxICsrKysrKy0KPj4gwqAgaW5jbHVkZS91YXBpL2xp bnV4L2lvbW11LmjCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB8wqAgMyAr Cj4+IMKgIDYgZmlsZXMgY2hhbmdlZCwgODUgaW5zZXJ0aW9ucygrKSwgMTMgZGVsZXRpb25zKC0p Cj4+Cj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2lvbW11L2FybS9hcm0tc21tdS12My9hcm0tc21t dS12My1zdmEuYyBiL2RyaXZlcnMvaW9tbXUvYXJtL2FybS1zbW11LXYzL2FybS1zbW11LXYzLXN2 YS5jCj4+IGluZGV4IGVlNjZkMWY0Y2I4MS4uNWRlOTQzMjM0OWQ0IDEwMDY0NAo+PiAtLS0gYS9k cml2ZXJzL2lvbW11L2FybS9hcm0tc21tdS12My9hcm0tc21tdS12My1zdmEuYwo+PiArKysgYi9k cml2ZXJzL2lvbW11L2FybS9hcm0tc21tdS12My9hcm0tc21tdS12My1zdmEuYwo+PiBAQCAtNDgy LDcgKzQ4Miw4IEBAIHN0YXRpYyBpbnQgYXJtX3NtbXVfbWFzdGVyX3N2YV9lbmFibGVfaW9wZihz dHJ1Y3QgYXJtX3NtbXVfbWFzdGVyICptYXN0ZXIpCj4+IMKgwqDCoMKgwqAgaWYgKHJldCkKPj4g wqDCoMKgwqDCoMKgwqDCoMKgIHJldHVybiByZXQ7Cj4+IMKgIC3CoMKgwqAgcmV0ID0gaW9tbXVf cmVnaXN0ZXJfZGV2aWNlX2ZhdWx0X2hhbmRsZXIoZGV2LCBpb21tdV9xdWV1ZV9pb3BmLCBkZXYp Owo+PiArwqDCoMKgIHJldCA9IGlvbW11X3JlZ2lzdGVyX2RldmljZV9mYXVsdF9oYW5kbGVyKGRl diwgaW9tbXVfcXVldWVfaW9wZiwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIElPUEZfUkVQT1JUX0ZMQVQsIGRldik7Cj4+IMKgwqDCoMKgwqAg aWYgKHJldCkgewo+PiDCoMKgwqDCoMKgwqDCoMKgwqAgaW9wZl9xdWV1ZV9yZW1vdmVfZGV2aWNl KG1hc3Rlci0+c21tdS0+ZXZ0cS5pb3BmLCBkZXYpOwo+PiDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0 dXJuIHJldDsKPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW9tbXUvYXJtL2FybS1zbW11LXYzL2Fy bS1zbW11LXYzLmMgYi9kcml2ZXJzL2lvbW11L2FybS9hcm0tc21tdS12My9hcm0tc21tdS12My5j Cj4+IGluZGV4IDM2Mzc0NGRmOGQ1MS4uZjQwNTI5ZDAwNzVkIDEwMDY0NAo+PiAtLS0gYS9kcml2 ZXJzL2lvbW11L2FybS9hcm0tc21tdS12My9hcm0tc21tdS12My5jCj4+ICsrKyBiL2RyaXZlcnMv aW9tbXUvYXJtL2FybS1zbW11LXYzL2FybS1zbW11LXYzLmMKPj4gQEAgLTE0NDcsMTAgKzE0NDcs NiBAQCBzdGF0aWMgaW50IGFybV9zbW11X2hhbmRsZV9ldnQoc3RydWN0IGFybV9zbW11X2Rldmlj ZSAqc21tdSwgdTY0ICpldnQpCj4+IMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm4gLUVPUE5PVFNV UFA7Cj4+IMKgwqDCoMKgwqAgfQo+PiDCoCAtwqDCoMKgIC8qIFN0YWdlLTIgaXMgYWx3YXlzIHBp bm5lZCBhdCB0aGUgbW9tZW50ICovCj4+IC3CoMKgwqAgaWYgKGV2dFsxXSAmIEVWVFFfMV9TMikK Pj4gLcKgwqDCoMKgwqDCoMKgIHJldHVybiAtRUZBVUxUOwo+PiAtCj4+IMKgwqDCoMKgwqAgaWYg KGV2dFsxXSAmIEVWVFFfMV9SblcpCj4+IMKgwqDCoMKgwqDCoMKgwqDCoCBwZXJtIHw9IElPTU1V X0ZBVUxUX1BFUk1fUkVBRDsKPj4gwqDCoMKgwqDCoCBlbHNlCj4+IEBAIC0xNDY4LDEzICsxNDY0 LDE4IEBAIHN0YXRpYyBpbnQgYXJtX3NtbXVfaGFuZGxlX2V2dChzdHJ1Y3QgYXJtX3NtbXVfZGV2 aWNlICpzbW11LCB1NjQgKmV2dCkKPj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgLmZsYWdz ID0gSU9NTVVfRkFVTFRfUEFHRV9SRVFVRVNUX0xBU1RfUEFHRSwKPj4gwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgLmdycGlkID0gRklFTERfR0VUKEVWVFFfMV9TVEFHLCBldnRbMV0pLAo+PiDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAucGVybSA9IHBlcm0sCj4+IC3CoMKgwqDCoMKgwqDC oMKgwqDCoMKgIC5hZGRyID0gRklFTERfR0VUKEVWVFFfMl9BRERSLCBldnRbMl0pLAo+PiDCoMKg wqDCoMKgwqDCoMKgwqAgfTsKPj4gwqAgwqDCoMKgwqDCoMKgwqDCoMKgIGlmIChzc2lkX3ZhbGlk KSB7Cj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGZsdC0+cHJtLmZsYWdzIHw9IElPTU1V X0ZBVUxUX1BBR0VfUkVRVUVTVF9QQVNJRF9WQUxJRDsKPj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgZmx0LT5wcm0ucGFzaWQgPSBGSUVMRF9HRVQoRVZUUV8wX1NTSUQsIGV2dFswXSk7Cj4+ IMKgwqDCoMKgwqDCoMKgwqDCoCB9Cj4+ICsKPj4gK8KgwqDCoMKgwqDCoMKgIGlmIChldnRbMV0g JiBFVlRRXzFfUzIpIHsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZmx0LT5wcm0uZmxhZ3Mg fD0gSU9NTVVfRkFVTFRfUEFHRV9SRVFVRVNUX0wyOwo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCBmbHQtPnBybS5hZGRyID0gRklFTERfR0VUKEVWVFFfM19JUEEsIGV2dFszXSk7Cj4+ICvCoMKg wqDCoMKgwqDCoCB9IGVsc2UKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZmx0LT5wcm0uYWRk ciA9IEZJRUxEX0dFVChFVlRRXzJfQUREUiwgZXZ0WzJdKTsKPj4gwqDCoMKgwqDCoCB9IGVsc2Ug ewo+PiDCoMKgwqDCoMKgwqDCoMKgwqAgZmx0LT50eXBlID0gSU9NTVVfRkFVTFRfRE1BX1VOUkVD T1Y7Cj4+IMKgwqDCoMKgwqDCoMKgwqDCoCBmbHQtPmV2ZW50ID0gKHN0cnVjdCBpb21tdV9mYXVs dF91bnJlY292ZXJhYmxlKSB7Cj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2lvbW11L2lvLXBnZmF1 bHQuYyBiL2RyaXZlcnMvaW9tbXUvaW8tcGdmYXVsdC5jCj4+IGluZGV4IDFkZjhjMWRjYWU3Ny4u YWJmMTZlMDZiY2Y1IDEwMDY0NAo+PiAtLS0gYS9kcml2ZXJzL2lvbW11L2lvLXBnZmF1bHQuYwo+ PiArKysgYi9kcml2ZXJzL2lvbW11L2lvLXBnZmF1bHQuYwo+PiBAQCAtMTk1LDEwICsxOTUsNiBA QCBpbnQgaW9tbXVfcXVldWVfaW9wZihzdHJ1Y3QgaW9tbXVfZmF1bHQgKmZhdWx0LCB2b2lkICpj b29raWUpCj4+IMKgIMKgwqDCoMKgwqAgbG9ja2RlcF9hc3NlcnRfaGVsZCgmcGFyYW0tPmxvY2sp Owo+PiDCoCAtwqDCoMKgIGlmIChmYXVsdC0+dHlwZSAhPSBJT01NVV9GQVVMVF9QQUdFX1JFUSkK Pj4gLcKgwqDCoMKgwqDCoMKgIC8qIE5vdCBhIHJlY292ZXJhYmxlIHBhZ2UgZmF1bHQgKi8KPj4g LcKgwqDCoMKgwqDCoMKgIHJldHVybiAtRU9QTk9UU1VQUDsKPj4gLQo+IAo+IEFueSByZWFzb25z IHdoeSBkbyB5b3Ugd2FudCB0byByZW1vdmUgdGhpcyBjaGVjaz8KCk15IHRob3VnaHQgd2FzIHRv IG1ha2UgdGhlIHJlcG9ydGluZyBjYXAgbW9yZSBkZXRhaWxlZDogSU9QRl9SRVBPUlRfIGlzIG9u bHkgZm9yIHJlY292ZXJhYmxlCnBhZ2UgZmF1bHRzIChJT01NVV9GQVVMVF9QQUdFX1JFUSksIGFu ZCB3ZSBtYXkgYWRkIFVOUkVDT1ZfRkFVTFRfUkVQT1JUXyBsYXRlciBmb3IgdW5yZWNvdmVyYWJs ZQpmYXVsdHMgKElPTU1VX0ZBVUxUX0RNQV9VTlJFQ09WKS4uLgoKPiAKPj4gwqDCoMKgwqDCoCAv Kgo+PiDCoMKgwqDCoMKgwqAgKiBBcyBsb25nIGFzIHdlJ3JlIGhvbGRpbmcgcGFyYW0tPmxvY2ss IHRoZSBxdWV1ZSBjYW4ndCBiZSB1bmxpbmtlZAo+PiDCoMKgwqDCoMKgwqAgKiBmcm9tIHRoZSBk ZXZpY2UgYW5kIHRoZXJlZm9yZSBjYW5ub3QgZGlzYXBwZWFyLgo+PiBkaWZmIC0tZ2l0IGEvZHJp dmVycy9pb21tdS9pb21tdS5jIGIvZHJpdmVycy9pb21tdS9pb21tdS5jCj4+IGluZGV4IGQwYjBh MTVkYmE4NC4uY2IxZDkzYjAwZjdkIDEwMDY0NAo+PiAtLS0gYS9kcml2ZXJzL2lvbW11L2lvbW11 LmMKPj4gKysrIGIvZHJpdmVycy9pb21tdS9pb21tdS5jCj4+IEBAIC0xMDU2LDYgKzEwNTYsNDAg QEAgaW50IGlvbW11X2dyb3VwX3VucmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IGlvbW11X2dyb3Vw ICpncm91cCwKPj4gwqAgfQo+PiDCoCBFWFBPUlRfU1lNQk9MX0dQTChpb21tdV9ncm91cF91bnJl Z2lzdGVyX25vdGlmaWVyKTsKPj4gwqAgKy8qCj4+ICsgKiBpb21tdV91cGRhdGVfZGV2aWNlX2Zh dWx0X2hhbmRsZXIgLSBVcGRhdGUgdGhlIGRldmljZSBmYXVsdCBoYW5kbGVyIHZpYSBmbGFncwo+ PiArICogQGRldjogdGhlIGRldmljZQo+PiArICogQG1hc2s6IGJpdHMobm90IHNldCkgdG8gY2xl YXIKPj4gKyAqIEBzZXQ6IGJpdHMgdG8gc2V0Cj4+ICsgKgo+PiArICogVXBkYXRlIHRoZSBkZXZp Y2UgZmF1bHQgaGFuZGxlciBpbnN0YWxsZWQgYnkKPj4gKyAqIGlvbW11X3JlZ2lzdGVyX2Rldmlj ZV9mYXVsdF9oYW5kbGVyKCkuCj4+ICsgKgo+PiArICogUmV0dXJuIDAgb24gc3VjY2Vzcywgb3Ig YW4gZXJyb3IuCj4+ICsgKi8KPj4gK2ludCBpb21tdV91cGRhdGVfZGV2aWNlX2ZhdWx0X2hhbmRs ZXIoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgbWFzaywgdTMyIHNldCkKPj4gK3sKPj4gK8KgwqDC oCBzdHJ1Y3QgZGV2X2lvbW11ICpwYXJhbSA9IGRldi0+aW9tbXU7Cj4+ICvCoMKgwqAgaW50IHJl dCA9IDA7Cj4+ICsKPj4gK8KgwqDCoCBpZiAoIXBhcmFtKQo+PiArwqDCoMKgwqDCoMKgwqAgcmV0 dXJuIC1FSU5WQUw7Cj4+ICsKPj4gK8KgwqDCoCBtdXRleF9sb2NrKCZwYXJhbS0+bG9jayk7Cj4+ ICsKPj4gK8KgwqDCoCBpZiAocGFyYW0tPmZhdWx0X3BhcmFtKSB7Cj4+ICvCoMKgwqDCoMKgwqDC oCByZXQgPSAtRUlOVkFMOwo+PiArwqDCoMKgwqDCoMKgwqAgZ290byBvdXRfdW5sb2NrOwo+PiAr wqDCoMKgIH0KPj4gKwo+PiArwqDCoMKgIHBhcmFtLT5mYXVsdF9wYXJhbS0+ZmxhZ3MgPSAocGFy YW0tPmZhdWx0X3BhcmFtLT5mbGFncyAmIG1hc2spIHwgc2V0Owo+PiArCj4+ICtvdXRfdW5sb2Nr Ogo+PiArwqDCoMKgIG11dGV4X3VubG9jaygmcGFyYW0tPmxvY2spOwo+PiArwqDCoMKgIHJldHVy biByZXQ7Cj4+ICt9Cj4+ICtFWFBPUlRfU1lNQk9MX0dQTChpb21tdV91cGRhdGVfZGV2aWNlX2Zh dWx0X2hhbmRsZXIpOwo+IAo+IFdoZW4gYW5kIHdoeSB3aWxsIHRoaXMgQVBJIGJlIHVzZWQ/IFdo eSBub3QgcmVnaXN0ZXJpbmcgdGhlIGZhdWx0Cj4gaGFuZGxpbmcgY2FwYWJpbGl0aWVzIG9mIGEg ZGV2aWNlIGRyaXZlciBvbmx5IG9uY2UgZHVyaW5nIHByb2JlKCk/CgpJbiBWRklPLCBzdGFnZSAy IElPUEYgbWlnaHQgYmUgZW5hYmxlZCB2aWEgYW4gaW9jdGwgZnJvbSB0aGUgdXNlcnNwYWNlIChp biB0aGlzIHNlcmllcyksCndoaWxlIHN0YWdlIDEgSU9QRiBpcyBlbmFibGVkIGZyb20gdmZpb19w Y2lfZW5hYmxlKCkgWzFdIGZvciBuZXN0ZWQgbW9kZSwgdGhleSBhcmUKY29uZmlndXJlZCBzZXBh cmF0ZWx5LCBhbmQgY3VycmVudGx5IGVhY2ggZGV2aWNlIGNhbiBvbmx5IGhhdmUgb25lIGlvbW11 IGRldiBmYXVsdApoYW5kbGVyLiBTbyBJIGNob29zZSB0byBhZGQgYSB1cGRhdGUgaW50ZXJmYWNl IGZvciB0aGUgc2Vjb25kIG9uZS4KClsxXSBodHRwczovL3BhdGNod29yay5rZXJuZWwub3JnL3By b2plY3Qva3ZtL3BhdGNoLzIwMjEwMjIzMjEwNjI1LjYwNDUxNy02LWVyaWMuYXVnZXJAcmVkaGF0 LmNvbS8KCj4gCj4+ICsKPj4gwqAgLyoqCj4+IMKgwqAgKiBpb21tdV9yZWdpc3Rlcl9kZXZpY2Vf ZmF1bHRfaGFuZGxlcigpIC0gUmVnaXN0ZXIgYSBkZXZpY2UgZmF1bHQgaGFuZGxlcgo+PiDCoMKg ICogQGRldjogdGhlIGRldmljZQo+PiBAQCAtMTA3NiwxMSArMTExMCwxNCBAQCBFWFBPUlRfU1lN Qk9MX0dQTChpb21tdV9ncm91cF91bnJlZ2lzdGVyX25vdGlmaWVyKTsKPj4gwqDCoCAqLwo+PiDC oCBpbnQgaW9tbXVfcmVnaXN0ZXJfZGV2aWNlX2ZhdWx0X2hhbmRsZXIoc3RydWN0IGRldmljZSAq ZGV2LAo+PiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaW9tbXVf ZGV2X2ZhdWx0X2hhbmRsZXJfdCBoYW5kbGVyLAo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgdm9pZCAqZGF0YSkKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIHUzMiBmbGFncywgdm9pZCAqZGF0YSkKPj4gwqAgewo+PiDCoMKgwqDCoMKg IHN0cnVjdCBkZXZfaW9tbXUgKnBhcmFtID0gZGV2LT5pb21tdTsKPj4gwqDCoMKgwqDCoCBpbnQg cmV0ID0gMDsKPj4gwqAgK8KgwqDCoCBpZiAoZmxhZ3MgJiBJT1BGX1JFUE9SVF9GTEFUICYmIGZs YWdzICYgSU9QRl9SRVBPUlRfTkVTVEVEKQo+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIC1FSU5W QUw7Cj4+ICsKPj4gwqDCoMKgwqDCoCBpZiAoIXBhcmFtKQo+PiDCoMKgwqDCoMKgwqDCoMKgwqAg cmV0dXJuIC1FSU5WQUw7Cj4+IMKgIEBAIC0xMDk5LDYgKzExMzYsNyBAQCBpbnQgaW9tbXVfcmVn aXN0ZXJfZGV2aWNlX2ZhdWx0X2hhbmRsZXIoc3RydWN0IGRldmljZSAqZGV2LAo+PiDCoMKgwqDC oMKgwqDCoMKgwqAgZ290byBkb25lX3VubG9jazsKPj4gwqDCoMKgwqDCoCB9Cj4+IMKgwqDCoMKg wqAgcGFyYW0tPmZhdWx0X3BhcmFtLT5oYW5kbGVyID0gaGFuZGxlcjsKPj4gK8KgwqDCoCBwYXJh bS0+ZmF1bHRfcGFyYW0tPmZsYWdzID0gZmxhZ3M7Cj4+IMKgwqDCoMKgwqAgcGFyYW0tPmZhdWx0 X3BhcmFtLT5kYXRhID0gZGF0YTsKPj4gwqDCoMKgwqDCoCBtdXRleF9pbml0KCZwYXJhbS0+ZmF1 bHRfcGFyYW0tPmxvY2spOwo+PiDCoMKgwqDCoMKgIElOSVRfTElTVF9IRUFEKCZwYXJhbS0+ZmF1 bHRfcGFyYW0tPmZhdWx0cyk7Cj4+IEBAIC0xMTc3LDYgKzEyMTUsMjIgQEAgaW50IGlvbW11X3Jl cG9ydF9kZXZpY2VfZmF1bHQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgaW9tbXVfZmF1bHRf ZXZlbnQgKmV2dCkKPj4gwqDCoMKgwqDCoMKgwqDCoMKgIGdvdG8gZG9uZV91bmxvY2s7Cj4+IMKg wqDCoMKgwqAgfQo+PiDCoCArwqDCoMKgIC8qIFRoZSB1bnJlY292ZXJhYmxlIGZhdWx0IHJlcG9y dGluZyBpcyBub3Qgc3VwcG9ydGVkIGF0IHRoZSBtb21lbnQuICovCj4+ICvCoMKgwqAgaWYgKGV2 dC0+ZmF1bHQudHlwZSAhPSBJT01NVV9GQVVMVF9QQUdFX1JFUSkKPj4gK8KgwqDCoMKgwqDCoMKg IHJldHVybiAtRU9QTk9UU1VQUDsKPiAKPiBBbnkgcmVhc29ucyB3aHkgZG8geW91IHdhbnQgdG8g ZGlzYWJsZSByZXBvcnRpbmcgYW4gdW5yZWNvdmVyYWJsZSBmYXVsdD8KCldoZW4gSSBhZGQgVU5S RUNPVl9GQVVMVF9SRVBPUlRfIChtZW50aW9uZWQgYWJvdmUpLCBJIHdpbGwgZW5hYmxlIHRoZSB1 bnJlY292ZXJhYmxlIGZhdWx0CnJlcG9ydGluZyBpZiB0aGUgZmF1bHQgY2xpZW50IGNvbmNlcm5z IGl0LiBTb3JyeSBmb3IgdGhpcy4gOi0pCgo+IAo+PiArCj4+ICvCoMKgwqAgaWYgKGV2dC0+ZmF1 bHQudHlwZSA9PSBJT01NVV9GQVVMVF9QQUdFX1JFUSkgewo+PiArwqDCoMKgwqDCoMKgwqAgaWYg KGZwYXJhbS0+ZmxhZ3MgJiBJT1BGX1JFUE9SVF9ORVNURUQpIHsKPj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqAgaWYgKGV2dC0+ZmF1bHQucHJtLmZsYWdzICYgSU9NTVVfRkFVTFRfUEFHRV9SRVFV RVNUX0wyICYmCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgIShmcGFyYW0tPmZs YWdzICYgSU9QRl9SRVBPUlRfTkVTVEVEX0wyX0NPTkNFUk5FRCkpCj4+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgcmV0dXJuIC1FT1BOT1RTVVBQOwo+PiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBpZiAoIShldnQtPmZhdWx0LnBybS5mbGFncyAmIElPTU1VX0ZBVUxUX1BBR0VfUkVR VUVTVF9MMikgJiYKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAhKGZwYXJhbS0+ ZmxhZ3MgJiBJT1BGX1JFUE9SVF9ORVNURURfTDFfQ09OQ0VSTkVEKSkKPj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm4gLUVPUE5PVFNVUFA7Cj4+ICvCoMKgwqDCoMKgwqDC oCB9IGVsc2UgaWYgKCEoZnBhcmFtLT5mbGFncyAmIElPUEZfUkVQT1JUX0ZMQVQpKQo+PiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm4gLUVPUE5PVFNVUFA7Cj4+ICvCoMKgwqAgfQo+PiAr Cj4+IMKgwqDCoMKgwqAgaWYgKGV2dC0+ZmF1bHQudHlwZSA9PSBJT01NVV9GQVVMVF9QQUdFX1JF USAmJgo+PiDCoMKgwqDCoMKgwqDCoMKgwqAgKGV2dC0+ZmF1bHQucHJtLmZsYWdzICYgSU9NTVVf RkFVTFRfUEFHRV9SRVFVRVNUX0xBU1RfUEFHRSkpIHsKPj4gwqDCoMKgwqDCoMKgwqDCoMKgIGV2 dF9wZW5kaW5nID0ga21lbWR1cChldnQsIHNpemVvZihzdHJ1Y3QgaW9tbXVfZmF1bHRfZXZlbnQp LAo+PiBkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pb21tdS5oIGIvaW5jbHVkZS9saW51eC9p b21tdS5oCj4+IGluZGV4IDg2ZDY4OGM0NDE4Zi4uZjAzZDc2MWU4MzEwIDEwMDY0NAo+PiAtLS0g YS9pbmNsdWRlL2xpbnV4L2lvbW11LmgKPj4gKysrIGIvaW5jbHVkZS9saW51eC9pb21tdS5oCj4+ IEBAIC0zNTIsMTIgKzM1MiwyMSBAQCBzdHJ1Y3QgaW9tbXVfZmF1bHRfZXZlbnQgewo+PiDCoCAv KioKPj4gwqDCoCAqIHN0cnVjdCBpb21tdV9mYXVsdF9wYXJhbSAtIHBlci1kZXZpY2UgSU9NTVUg ZmF1bHQgZGF0YQo+PiDCoMKgICogQGhhbmRsZXI6IENhbGxiYWNrIGZ1bmN0aW9uIHRvIGhhbmRs ZSBJT01NVSBmYXVsdHMgYXQgZGV2aWNlIGxldmVsCj4+ICsgKiBAZmxhZ3M6IEluZGljYXRlcyB3 aGV0aGVyIHRoZSBmYXVsdCByZXBvcnRpbmcgaXMgYXZhaWxhYmxlIHVuZGVyIGEKPj4gKyAqwqDC oMKgwqDCoMKgIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gKDFzdC8ybmQtbGV2ZWwtb25seShGTEFU KSwgb3IgbmVzdGVkKS4KPj4gKyAqwqDCoMKgwqDCoMKgIElPUEZfUkVQT1JUX05FU1RFRCBuZWVk cyB0byBhZGRpdGlvbmFsbHkga25vdyB3aGljaCBsZXZlbC9zdGFnZQo+PiArICrCoMKgwqDCoMKg wqAgaXMgY29uY2VybmVkLgo+IAo+IElmIElPUEZfUkVQT1JUX05FU1RFRCBvbmx5IGlzIG5vdCB2 YWxpZCB3aHkgZG8geW91IHdhbnQgdG8gZGVmaW5lIGl0PwoKWWVhaCwgaXQgc2VlbXMgdGhhdCBJ T1BGX1JFUE9SVF9ORVNURUQgaXMgdW5uZWNlc3NhcnksIElPUEZfUkVQT1JUX05FU1RFRF9MMSAr IElPUEZfUkVQT1JUX05FU1RFRF9MMgppcyBlbm91Z2guLi4KClRoYW5rcyBmb3IgeW91ciBjb21t ZW50cyEKU2hlbm1pbmcKCj4gCj4+IMKgwqAgKiBAZGF0YTogaGFuZGxlciBwcml2YXRlIGRhdGEK Pj4gwqDCoCAqIEBmYXVsdHM6IGhvbGRzIHRoZSBwZW5kaW5nIGZhdWx0cyB3aGljaCBuZWVkcyBy ZXNwb25zZQo+PiDCoMKgICogQGxvY2s6IHByb3RlY3QgcGVuZGluZyBmYXVsdHMgbGlzdAo+PiDC oMKgICovCj4+IMKgIHN0cnVjdCBpb21tdV9mYXVsdF9wYXJhbSB7Cj4+IMKgwqDCoMKgwqAgaW9t bXVfZGV2X2ZhdWx0X2hhbmRsZXJfdCBoYW5kbGVyOwo+PiArI2RlZmluZSBJT1BGX1JFUE9SVF9G TEFUwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAoMSA8PCAwKQo+PiArI2RlZmluZSBJT1BGX1JFUE9S VF9ORVNURUTCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICgxIDw8IDEpCj4+ICsjZGVmaW5lIElPUEZf UkVQT1JUX05FU1RFRF9MMV9DT05DRVJORUTCoMKgwqDCoMKgwqDCoCAoMSA8PCAyKQo+PiArI2Rl ZmluZSBJT1BGX1JFUE9SVF9ORVNURURfTDJfQ09OQ0VSTkVEwqDCoMKgwqDCoMKgwqAgKDEgPDwg MykKPj4gK8KgwqDCoCB1MzIgZmxhZ3M7Cj4+IMKgwqDCoMKgwqAgdm9pZCAqZGF0YTsKPj4gwqDC oMKgwqDCoCBzdHJ1Y3QgbGlzdF9oZWFkIGZhdWx0czsKPj4gwqDCoMKgwqDCoCBzdHJ1Y3QgbXV0 ZXggbG9jazsKPj4gQEAgLTUwOSw5ICs1MTgsMTEgQEAgZXh0ZXJuIGludCBpb21tdV9ncm91cF9y ZWdpc3Rlcl9ub3RpZmllcihzdHJ1Y3QgaW9tbXVfZ3JvdXAgKmdyb3VwLAo+PiDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sg Km5iKTsKPj4gwqAgZXh0ZXJuIGludCBpb21tdV9ncm91cF91bnJlZ2lzdGVyX25vdGlmaWVyKHN0 cnVjdCBpb21tdV9ncm91cCAqZ3JvdXAsCj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKTsKPj4gK2V4dGVy biBpbnQgaW9tbXVfdXBkYXRlX2RldmljZV9mYXVsdF9oYW5kbGVyKHN0cnVjdCBkZXZpY2UgKmRl diwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1 MzIgbWFzaywgdTMyIHNldCk7Cj4+IMKgIGV4dGVybiBpbnQgaW9tbXVfcmVnaXN0ZXJfZGV2aWNl X2ZhdWx0X2hhbmRsZXIoc3RydWN0IGRldmljZSAqZGV2LAo+PiDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaW9tbXVfZGV2X2ZhdWx0X2hhbmRsZXJfdCBoYW5kbGVy LAo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdm9pZCAqZGF0YSk7 Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1MzIgZmxhZ3MsIHZv aWQgKmRhdGEpOwo+PiDCoCDCoCBleHRlcm4gaW50IGlvbW11X3VucmVnaXN0ZXJfZGV2aWNlX2Zh dWx0X2hhbmRsZXIoc3RydWN0IGRldmljZSAqZGV2KTsKPj4gwqAgQEAgLTg3MywxMCArODg0LDE2 IEBAIHN0YXRpYyBpbmxpbmUgaW50IGlvbW11X2dyb3VwX3VucmVnaXN0ZXJfbm90aWZpZXIoc3Ry dWN0IGlvbW11X2dyb3VwICpncm91cCwKPj4gwqDCoMKgwqDCoCByZXR1cm4gMDsKPj4gwqAgfQo+ PiDCoCArc3RhdGljIGlubGluZSBpbnQgaW9tbXVfdXBkYXRlX2RldmljZV9mYXVsdF9oYW5kbGVy KHN0cnVjdCBkZXZpY2UgKmRldiwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1MzIgbWFzaywgdTMyIHNldCkKPj4gK3sKPj4gK8KgwqDC oCByZXR1cm4gLUVOT0RFVjsKPj4gK30KPj4gKwo+PiDCoCBzdGF0aWMgaW5saW5lCj4+IMKgIGlu dCBpb21tdV9yZWdpc3Rlcl9kZXZpY2VfZmF1bHRfaGFuZGxlcihzdHJ1Y3QgZGV2aWNlICpkZXYs Cj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpb21tdV9kZXZf ZmF1bHRfaGFuZGxlcl90IGhhbmRsZXIsCj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCB2b2lkICpkYXRhKQo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgdTMyIGZsYWdzLCB2b2lkICpkYXRhKQo+PiDCoCB7Cj4+IMKgwqDCoMKgwqAgcmV0 dXJuIC1FTk9ERVY7Cj4+IMKgIH0KPj4gZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9p b21tdS5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2lvbW11LmgKPj4gaW5kZXggZTFkOWU3NWYyYzk0 Li4wY2UwZGZiNzcxM2UgMTAwNjQ0Cj4+IC0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9pb21tdS5o Cj4+ICsrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9pb21tdS5oCj4+IEBAIC04NSw2ICs4NSw4IEBA IHN0cnVjdCBpb21tdV9mYXVsdF91bnJlY292ZXJhYmxlIHsKPj4gwqDCoCAqwqDCoMKgwqDCoMKg wqDCoCBXaGVuIElPTU1VX0ZBVUxUX1BBR0VfUkVTUE9OU0VfTkVFRFNfUEFTSUQgaXMgc2V0LCB0 aGUgcGFnZSByZXNwb25zZQo+PiDCoMKgICrCoMKgwqDCoMKgwqDCoMKgIG11c3QgaGF2ZSB0aGUg c2FtZSBQQVNJRCB2YWx1ZSBhcyB0aGUgcGFnZSByZXF1ZXN0LiBXaGVuIGl0IGlzIGNsZWFyLAo+ PiDCoMKgICrCoMKgwqDCoMKgwqDCoMKgIHRoZSBwYWdlIHJlc3BvbnNlIHNob3VsZCBub3QgaGF2 ZSBhIFBBU0lELgo+PiArICrCoMKgwqDCoMKgwqDCoMKgIElmIElPTU1VX0ZBVUxUX1BBR0VfUkVR VUVTVF9MMiBpcyBzZXQsIHRoZSBmYXVsdCBvY2N1cnJlZCBhdCB0aGUKPj4gKyAqwqDCoMKgwqDC oMKgwqDCoCBzZWNvbmQgbGV2ZWwvc3RhZ2UsIG90aGVyd2lzZSwgb2NjdXJyZWQgYXQgdGhlIGZp cnN0IGxldmVsLgo+PiDCoMKgICogQHBhc2lkOiBQcm9jZXNzIEFkZHJlc3MgU3BhY2UgSUQKPj4g wqDCoCAqIEBncnBpZDogUGFnZSBSZXF1ZXN0IEdyb3VwIEluZGV4Cj4+IMKgwqAgKiBAcGVybTog cmVxdWVzdGVkIHBhZ2UgcGVybWlzc2lvbnMgKElPTU1VX0ZBVUxUX1BFUk1fKiB2YWx1ZXMpCj4+ IEBAIC05Niw2ICs5OCw3IEBAIHN0cnVjdCBpb21tdV9mYXVsdF9wYWdlX3JlcXVlc3Qgewo+PiDC oCAjZGVmaW5lIElPTU1VX0ZBVUxUX1BBR0VfUkVRVUVTVF9MQVNUX1BBR0XCoMKgwqAgKDEgPDwg MSkKPj4gwqAgI2RlZmluZSBJT01NVV9GQVVMVF9QQUdFX1JFUVVFU1RfUFJJVl9EQVRBwqDCoMKg ICgxIDw8IDIpCj4+IMKgICNkZWZpbmUgSU9NTVVfRkFVTFRfUEFHRV9SRVNQT05TRV9ORUVEU19Q QVNJRMKgwqDCoCAoMSA8PCAzKQo+PiArI2RlZmluZSBJT01NVV9GQVVMVF9QQUdFX1JFUVVFU1Rf TDLCoMKgwqDCoMKgwqDCoCAoMSA8PCA0KQo+PiDCoMKgwqDCoMKgIF9fdTMywqDCoMKgIGZsYWdz Owo+PiDCoMKgwqDCoMKgIF9fdTMywqDCoMKgIHBhc2lkOwo+PiDCoMKgwqDCoMKgIF9fdTMywqDC oMKgIGdycGlkOwo+Pgo+IAo+IEJlc3QgcmVnYXJkcywKPiBiYW9sdQo+IC4KX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KaW9tbXUgbWFpbGluZyBsaXN0Cmlv bW11QGxpc3RzLmxpbnV4LWZvdW5kYXRpb24ub3JnCmh0dHBzOi8vbGlzdHMubGludXhmb3VuZGF0 aW9uLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2lvbW11 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=-15.5 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_SANE_1 autolearn=unavailable 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 6339EC433E0 for ; Wed, 10 Mar 2021 06:37:57 +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 B476361554 for ; Wed, 10 Mar 2021 06:37:56 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org B476361554 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=huawei.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+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=desiato.20200630; h=Sender:Content-Transfer-Encoding :Content-Type: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=Et+EcqKFWDXPvOIoOibyKJplswUKnAcMw+u6qvN2aSs=; b=rBfVDv1a443WaMyqS4c1snhb/ isOlsCoA1el4+msEgQh6SW6n8TaVsjDf87umbhI2JbN/DEeHdFvXLJIZLyCn+XJX6ZcGZ1HJH3xwp ShggJyMg5QBw5+tsj4AjzYVDpNs01pZXtLgielEnEYVIuHklaTOCTgnLo7uUxEFO2mFg+JapZooZG wplAiMK1VkH9Ey1ILtaypx/mpMa5ufNobN+pR9RfjdBXzWZZLzLkPrxzRN2GcOQRGEL6y210tGkpV YeJZENIDdKw/iwaeo2c9otUlJfkRSocInxtW18dNxm7pm1GU4r51SmEa9KcVQondHX6k3mYRzRKzx LVXJJXOpw==; Received: from localhost ([::1] helo=desiato.infradead.org) by desiato.infradead.org with esmtp (Exim 4.94 #2 (Red Hat Linux)) id 1lJsRi-0068DR-6n; Wed, 10 Mar 2021 06:35:56 +0000 Received: from szxga06-in.huawei.com ([45.249.212.32]) by desiato.infradead.org with esmtps (Exim 4.94 #2 (Red Hat Linux)) id 1lJsQz-00689s-1T for linux-arm-kernel@lists.infradead.org; Wed, 10 Mar 2021 06:35:13 +0000 Received: from DGGEMS413-HUB.china.huawei.com (unknown [172.30.72.58]) by szxga06-in.huawei.com (SkyGuard) with ESMTP id 4DwMhb3RfczjWpQ; Wed, 10 Mar 2021 14:33:03 +0800 (CST) Received: from [10.174.184.135] (10.174.184.135) by DGGEMS413-HUB.china.huawei.com (10.3.19.213) with Microsoft SMTP Server id 14.3.498.0; Wed, 10 Mar 2021 14:34:20 +0800 Subject: Re: [RFC PATCH v2 1/6] iommu: Evolve to support more scenarios of using IOPF To: Lu Baolu , Alex Williamson , Cornelia Huck , Will Deacon , Robin Murphy , Joerg Roedel , Jean-Philippe Brucker , "Eric Auger" , , , , , CC: Kevin Tian , , Christoph Hellwig , Jonathan Cameron , "Barry Song" , , , References: <20210309062207.505-1-lushenming@huawei.com> <20210309062207.505-2-lushenming@huawei.com> <7f8daef9-36db-f67c-a3e2-b96b5fa70291@linux.intel.com> From: Shenming Lu Message-ID: <7479e543-1598-459d-4838-50a6f1c3770b@huawei.com> Date: Wed, 10 Mar 2021 14:34:19 +0800 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Thunderbird/78.2.2 MIME-Version: 1.0 In-Reply-To: <7f8daef9-36db-f67c-a3e2-b96b5fa70291@linux.intel.com> Content-Language: en-US X-Originating-IP: [10.174.184.135] X-CFilter-Loop: Reflected X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210310_063510_093045_C9C33719 X-CRM114-Status: GOOD ( 37.06 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org SGkgQmFvbHUsCgpPbiAyMDIxLzMvMTAgMTA6MDksIEx1IEJhb2x1IHdyb3RlOgo+IEhpIFNoZW5t aW5nLAo+IAo+IE9uIDMvOS8yMSAyOjIyIFBNLCBTaGVubWluZyBMdSB3cm90ZToKPj4gVGhpcyBw YXRjaCBmb2xsb3dzIHRoZSBkaXNjdXNzaW9uIGhlcmU6Cj4+Cj4+IGh0dHBzOi8vbG9yZS5rZXJu ZWwub3JnL2xpbnV4LWFjcGkvWUFheGptSlcrWk12cmhhY0BteXJpY2EvCj4+Cj4+IEluIG9yZGVy IHRvIHN1cHBvcnQgbW9yZSBzY2VuYXJpb3Mgb2YgdXNpbmcgSU9QRiAobWFpbmx5IGNvbnNpZGVy Cj4+IHRoZSBuZXN0ZWQgZXh0ZW5zaW9uKSwgYmVzaWRlcyBrZWVwaW5nIElPTU1VX0RFVl9GRUFU X0lPUEYgYXMgYQo+PiBnZW5lcmFsIGNhcGFiaWxpdHkgZm9yIHdoZXRoZXIgZGVsaXZlcmluZyBm YXVsdHMgdGhyb3VnaCB0aGUgSU9NTVUsCj4+IHdlIGV4dGVuZCBpb21tdV9yZWdpc3Rlcl9mYXVs dF9oYW5kbGVyKCkgd2l0aCBmbGFncyBhbmQgaW50cm9kdWNlCj4+IElPUEZfUkVQT1JUX0ZMQVQg YW5kIElPUEZfUkVQT1JUX05FU1RFRCB0byBkZXNjcmliZSB0aGUgcGFnZSBmYXVsdAo+PiByZXBv cnRpbmcgY2FwYWJpbGl0eSB1bmRlciBhIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24uCj4+IElPUEZf UkVQT1JUX05FU1RFRCBuZWVkcyBhZGRpdGlvbmFsIGluZm8gdG8gaW5kaWNhdGUgd2hpY2ggbGV2 ZWwvc3RhZ2UKPj4gaXMgY29uY2VybmVkIHNpbmNlIHRoZSBmYXVsdCBjbGllbnQgbWF5IGJlIGlu dGVyZXN0ZWQgaW4gb25seSBvbmUKPj4gbGV2ZWwuCj4+Cj4+IFNpZ25lZC1vZmYtYnk6IFNoZW5t aW5nIEx1IDxsdXNoZW5taW5nQGh1YXdlaS5jb20+Cj4+IC0tLQo+PiDCoCAuLi4vaW9tbXUvYXJt L2FybS1zbW11LXYzL2FybS1zbW11LXYzLXN2YS5jwqDCoCB8wqAgMyArLQo+PiDCoCBkcml2ZXJz L2lvbW11L2FybS9hcm0tc21tdS12My9hcm0tc21tdS12My5jwqDCoCB8IDExICsrLS0KPj4gwqAg ZHJpdmVycy9pb21tdS9pby1wZ2ZhdWx0LmPCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCB8wqAgNCAtLQo+PiDCoCBkcml2ZXJzL2lvbW11L2lvbW11LmPCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfCA1NiArKysrKysrKysrKysrKysr KystCj4+IMKgIGluY2x1ZGUvbGludXgvaW9tbXUuaMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB8IDIxICsrKysrKy0KPj4gwqAgaW5jbHVkZS91YXBpL2xp bnV4L2lvbW11LmjCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB8wqAgMyAr Cj4+IMKgIDYgZmlsZXMgY2hhbmdlZCwgODUgaW5zZXJ0aW9ucygrKSwgMTMgZGVsZXRpb25zKC0p Cj4+Cj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2lvbW11L2FybS9hcm0tc21tdS12My9hcm0tc21t dS12My1zdmEuYyBiL2RyaXZlcnMvaW9tbXUvYXJtL2FybS1zbW11LXYzL2FybS1zbW11LXYzLXN2 YS5jCj4+IGluZGV4IGVlNjZkMWY0Y2I4MS4uNWRlOTQzMjM0OWQ0IDEwMDY0NAo+PiAtLS0gYS9k cml2ZXJzL2lvbW11L2FybS9hcm0tc21tdS12My9hcm0tc21tdS12My1zdmEuYwo+PiArKysgYi9k cml2ZXJzL2lvbW11L2FybS9hcm0tc21tdS12My9hcm0tc21tdS12My1zdmEuYwo+PiBAQCAtNDgy LDcgKzQ4Miw4IEBAIHN0YXRpYyBpbnQgYXJtX3NtbXVfbWFzdGVyX3N2YV9lbmFibGVfaW9wZihz dHJ1Y3QgYXJtX3NtbXVfbWFzdGVyICptYXN0ZXIpCj4+IMKgwqDCoMKgwqAgaWYgKHJldCkKPj4g wqDCoMKgwqDCoMKgwqDCoMKgIHJldHVybiByZXQ7Cj4+IMKgIC3CoMKgwqAgcmV0ID0gaW9tbXVf cmVnaXN0ZXJfZGV2aWNlX2ZhdWx0X2hhbmRsZXIoZGV2LCBpb21tdV9xdWV1ZV9pb3BmLCBkZXYp Owo+PiArwqDCoMKgIHJldCA9IGlvbW11X3JlZ2lzdGVyX2RldmljZV9mYXVsdF9oYW5kbGVyKGRl diwgaW9tbXVfcXVldWVfaW9wZiwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIElPUEZfUkVQT1JUX0ZMQVQsIGRldik7Cj4+IMKgwqDCoMKgwqAg aWYgKHJldCkgewo+PiDCoMKgwqDCoMKgwqDCoMKgwqAgaW9wZl9xdWV1ZV9yZW1vdmVfZGV2aWNl KG1hc3Rlci0+c21tdS0+ZXZ0cS5pb3BmLCBkZXYpOwo+PiDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0 dXJuIHJldDsKPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW9tbXUvYXJtL2FybS1zbW11LXYzL2Fy bS1zbW11LXYzLmMgYi9kcml2ZXJzL2lvbW11L2FybS9hcm0tc21tdS12My9hcm0tc21tdS12My5j Cj4+IGluZGV4IDM2Mzc0NGRmOGQ1MS4uZjQwNTI5ZDAwNzVkIDEwMDY0NAo+PiAtLS0gYS9kcml2 ZXJzL2lvbW11L2FybS9hcm0tc21tdS12My9hcm0tc21tdS12My5jCj4+ICsrKyBiL2RyaXZlcnMv aW9tbXUvYXJtL2FybS1zbW11LXYzL2FybS1zbW11LXYzLmMKPj4gQEAgLTE0NDcsMTAgKzE0NDcs NiBAQCBzdGF0aWMgaW50IGFybV9zbW11X2hhbmRsZV9ldnQoc3RydWN0IGFybV9zbW11X2Rldmlj ZSAqc21tdSwgdTY0ICpldnQpCj4+IMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm4gLUVPUE5PVFNV UFA7Cj4+IMKgwqDCoMKgwqAgfQo+PiDCoCAtwqDCoMKgIC8qIFN0YWdlLTIgaXMgYWx3YXlzIHBp bm5lZCBhdCB0aGUgbW9tZW50ICovCj4+IC3CoMKgwqAgaWYgKGV2dFsxXSAmIEVWVFFfMV9TMikK Pj4gLcKgwqDCoMKgwqDCoMKgIHJldHVybiAtRUZBVUxUOwo+PiAtCj4+IMKgwqDCoMKgwqAgaWYg KGV2dFsxXSAmIEVWVFFfMV9SblcpCj4+IMKgwqDCoMKgwqDCoMKgwqDCoCBwZXJtIHw9IElPTU1V X0ZBVUxUX1BFUk1fUkVBRDsKPj4gwqDCoMKgwqDCoCBlbHNlCj4+IEBAIC0xNDY4LDEzICsxNDY0 LDE4IEBAIHN0YXRpYyBpbnQgYXJtX3NtbXVfaGFuZGxlX2V2dChzdHJ1Y3QgYXJtX3NtbXVfZGV2 aWNlICpzbW11LCB1NjQgKmV2dCkKPj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgLmZsYWdz ID0gSU9NTVVfRkFVTFRfUEFHRV9SRVFVRVNUX0xBU1RfUEFHRSwKPj4gwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgLmdycGlkID0gRklFTERfR0VUKEVWVFFfMV9TVEFHLCBldnRbMV0pLAo+PiDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAucGVybSA9IHBlcm0sCj4+IC3CoMKgwqDCoMKgwqDC oMKgwqDCoMKgIC5hZGRyID0gRklFTERfR0VUKEVWVFFfMl9BRERSLCBldnRbMl0pLAo+PiDCoMKg wqDCoMKgwqDCoMKgwqAgfTsKPj4gwqAgwqDCoMKgwqDCoMKgwqDCoMKgIGlmIChzc2lkX3ZhbGlk KSB7Cj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGZsdC0+cHJtLmZsYWdzIHw9IElPTU1V X0ZBVUxUX1BBR0VfUkVRVUVTVF9QQVNJRF9WQUxJRDsKPj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgZmx0LT5wcm0ucGFzaWQgPSBGSUVMRF9HRVQoRVZUUV8wX1NTSUQsIGV2dFswXSk7Cj4+ IMKgwqDCoMKgwqDCoMKgwqDCoCB9Cj4+ICsKPj4gK8KgwqDCoMKgwqDCoMKgIGlmIChldnRbMV0g JiBFVlRRXzFfUzIpIHsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZmx0LT5wcm0uZmxhZ3Mg fD0gSU9NTVVfRkFVTFRfUEFHRV9SRVFVRVNUX0wyOwo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCBmbHQtPnBybS5hZGRyID0gRklFTERfR0VUKEVWVFFfM19JUEEsIGV2dFszXSk7Cj4+ICvCoMKg wqDCoMKgwqDCoCB9IGVsc2UKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZmx0LT5wcm0uYWRk ciA9IEZJRUxEX0dFVChFVlRRXzJfQUREUiwgZXZ0WzJdKTsKPj4gwqDCoMKgwqDCoCB9IGVsc2Ug ewo+PiDCoMKgwqDCoMKgwqDCoMKgwqAgZmx0LT50eXBlID0gSU9NTVVfRkFVTFRfRE1BX1VOUkVD T1Y7Cj4+IMKgwqDCoMKgwqDCoMKgwqDCoCBmbHQtPmV2ZW50ID0gKHN0cnVjdCBpb21tdV9mYXVs dF91bnJlY292ZXJhYmxlKSB7Cj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2lvbW11L2lvLXBnZmF1 bHQuYyBiL2RyaXZlcnMvaW9tbXUvaW8tcGdmYXVsdC5jCj4+IGluZGV4IDFkZjhjMWRjYWU3Ny4u YWJmMTZlMDZiY2Y1IDEwMDY0NAo+PiAtLS0gYS9kcml2ZXJzL2lvbW11L2lvLXBnZmF1bHQuYwo+ PiArKysgYi9kcml2ZXJzL2lvbW11L2lvLXBnZmF1bHQuYwo+PiBAQCAtMTk1LDEwICsxOTUsNiBA QCBpbnQgaW9tbXVfcXVldWVfaW9wZihzdHJ1Y3QgaW9tbXVfZmF1bHQgKmZhdWx0LCB2b2lkICpj b29raWUpCj4+IMKgIMKgwqDCoMKgwqAgbG9ja2RlcF9hc3NlcnRfaGVsZCgmcGFyYW0tPmxvY2sp Owo+PiDCoCAtwqDCoMKgIGlmIChmYXVsdC0+dHlwZSAhPSBJT01NVV9GQVVMVF9QQUdFX1JFUSkK Pj4gLcKgwqDCoMKgwqDCoMKgIC8qIE5vdCBhIHJlY292ZXJhYmxlIHBhZ2UgZmF1bHQgKi8KPj4g LcKgwqDCoMKgwqDCoMKgIHJldHVybiAtRU9QTk9UU1VQUDsKPj4gLQo+IAo+IEFueSByZWFzb25z IHdoeSBkbyB5b3Ugd2FudCB0byByZW1vdmUgdGhpcyBjaGVjaz8KCk15IHRob3VnaHQgd2FzIHRv IG1ha2UgdGhlIHJlcG9ydGluZyBjYXAgbW9yZSBkZXRhaWxlZDogSU9QRl9SRVBPUlRfIGlzIG9u bHkgZm9yIHJlY292ZXJhYmxlCnBhZ2UgZmF1bHRzIChJT01NVV9GQVVMVF9QQUdFX1JFUSksIGFu ZCB3ZSBtYXkgYWRkIFVOUkVDT1ZfRkFVTFRfUkVQT1JUXyBsYXRlciBmb3IgdW5yZWNvdmVyYWJs ZQpmYXVsdHMgKElPTU1VX0ZBVUxUX0RNQV9VTlJFQ09WKS4uLgoKPiAKPj4gwqDCoMKgwqDCoCAv Kgo+PiDCoMKgwqDCoMKgwqAgKiBBcyBsb25nIGFzIHdlJ3JlIGhvbGRpbmcgcGFyYW0tPmxvY2ss IHRoZSBxdWV1ZSBjYW4ndCBiZSB1bmxpbmtlZAo+PiDCoMKgwqDCoMKgwqAgKiBmcm9tIHRoZSBk ZXZpY2UgYW5kIHRoZXJlZm9yZSBjYW5ub3QgZGlzYXBwZWFyLgo+PiBkaWZmIC0tZ2l0IGEvZHJp dmVycy9pb21tdS9pb21tdS5jIGIvZHJpdmVycy9pb21tdS9pb21tdS5jCj4+IGluZGV4IGQwYjBh MTVkYmE4NC4uY2IxZDkzYjAwZjdkIDEwMDY0NAo+PiAtLS0gYS9kcml2ZXJzL2lvbW11L2lvbW11 LmMKPj4gKysrIGIvZHJpdmVycy9pb21tdS9pb21tdS5jCj4+IEBAIC0xMDU2LDYgKzEwNTYsNDAg QEAgaW50IGlvbW11X2dyb3VwX3VucmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IGlvbW11X2dyb3Vw ICpncm91cCwKPj4gwqAgfQo+PiDCoCBFWFBPUlRfU1lNQk9MX0dQTChpb21tdV9ncm91cF91bnJl Z2lzdGVyX25vdGlmaWVyKTsKPj4gwqAgKy8qCj4+ICsgKiBpb21tdV91cGRhdGVfZGV2aWNlX2Zh dWx0X2hhbmRsZXIgLSBVcGRhdGUgdGhlIGRldmljZSBmYXVsdCBoYW5kbGVyIHZpYSBmbGFncwo+ PiArICogQGRldjogdGhlIGRldmljZQo+PiArICogQG1hc2s6IGJpdHMobm90IHNldCkgdG8gY2xl YXIKPj4gKyAqIEBzZXQ6IGJpdHMgdG8gc2V0Cj4+ICsgKgo+PiArICogVXBkYXRlIHRoZSBkZXZp Y2UgZmF1bHQgaGFuZGxlciBpbnN0YWxsZWQgYnkKPj4gKyAqIGlvbW11X3JlZ2lzdGVyX2Rldmlj ZV9mYXVsdF9oYW5kbGVyKCkuCj4+ICsgKgo+PiArICogUmV0dXJuIDAgb24gc3VjY2Vzcywgb3Ig YW4gZXJyb3IuCj4+ICsgKi8KPj4gK2ludCBpb21tdV91cGRhdGVfZGV2aWNlX2ZhdWx0X2hhbmRs ZXIoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgbWFzaywgdTMyIHNldCkKPj4gK3sKPj4gK8KgwqDC oCBzdHJ1Y3QgZGV2X2lvbW11ICpwYXJhbSA9IGRldi0+aW9tbXU7Cj4+ICvCoMKgwqAgaW50IHJl dCA9IDA7Cj4+ICsKPj4gK8KgwqDCoCBpZiAoIXBhcmFtKQo+PiArwqDCoMKgwqDCoMKgwqAgcmV0 dXJuIC1FSU5WQUw7Cj4+ICsKPj4gK8KgwqDCoCBtdXRleF9sb2NrKCZwYXJhbS0+bG9jayk7Cj4+ ICsKPj4gK8KgwqDCoCBpZiAocGFyYW0tPmZhdWx0X3BhcmFtKSB7Cj4+ICvCoMKgwqDCoMKgwqDC oCByZXQgPSAtRUlOVkFMOwo+PiArwqDCoMKgwqDCoMKgwqAgZ290byBvdXRfdW5sb2NrOwo+PiAr wqDCoMKgIH0KPj4gKwo+PiArwqDCoMKgIHBhcmFtLT5mYXVsdF9wYXJhbS0+ZmxhZ3MgPSAocGFy YW0tPmZhdWx0X3BhcmFtLT5mbGFncyAmIG1hc2spIHwgc2V0Owo+PiArCj4+ICtvdXRfdW5sb2Nr Ogo+PiArwqDCoMKgIG11dGV4X3VubG9jaygmcGFyYW0tPmxvY2spOwo+PiArwqDCoMKgIHJldHVy biByZXQ7Cj4+ICt9Cj4+ICtFWFBPUlRfU1lNQk9MX0dQTChpb21tdV91cGRhdGVfZGV2aWNlX2Zh dWx0X2hhbmRsZXIpOwo+IAo+IFdoZW4gYW5kIHdoeSB3aWxsIHRoaXMgQVBJIGJlIHVzZWQ/IFdo eSBub3QgcmVnaXN0ZXJpbmcgdGhlIGZhdWx0Cj4gaGFuZGxpbmcgY2FwYWJpbGl0aWVzIG9mIGEg ZGV2aWNlIGRyaXZlciBvbmx5IG9uY2UgZHVyaW5nIHByb2JlKCk/CgpJbiBWRklPLCBzdGFnZSAy IElPUEYgbWlnaHQgYmUgZW5hYmxlZCB2aWEgYW4gaW9jdGwgZnJvbSB0aGUgdXNlcnNwYWNlIChp biB0aGlzIHNlcmllcyksCndoaWxlIHN0YWdlIDEgSU9QRiBpcyBlbmFibGVkIGZyb20gdmZpb19w Y2lfZW5hYmxlKCkgWzFdIGZvciBuZXN0ZWQgbW9kZSwgdGhleSBhcmUKY29uZmlndXJlZCBzZXBh cmF0ZWx5LCBhbmQgY3VycmVudGx5IGVhY2ggZGV2aWNlIGNhbiBvbmx5IGhhdmUgb25lIGlvbW11 IGRldiBmYXVsdApoYW5kbGVyLiBTbyBJIGNob29zZSB0byBhZGQgYSB1cGRhdGUgaW50ZXJmYWNl IGZvciB0aGUgc2Vjb25kIG9uZS4KClsxXSBodHRwczovL3BhdGNod29yay5rZXJuZWwub3JnL3By b2plY3Qva3ZtL3BhdGNoLzIwMjEwMjIzMjEwNjI1LjYwNDUxNy02LWVyaWMuYXVnZXJAcmVkaGF0 LmNvbS8KCj4gCj4+ICsKPj4gwqAgLyoqCj4+IMKgwqAgKiBpb21tdV9yZWdpc3Rlcl9kZXZpY2Vf ZmF1bHRfaGFuZGxlcigpIC0gUmVnaXN0ZXIgYSBkZXZpY2UgZmF1bHQgaGFuZGxlcgo+PiDCoMKg ICogQGRldjogdGhlIGRldmljZQo+PiBAQCAtMTA3NiwxMSArMTExMCwxNCBAQCBFWFBPUlRfU1lN Qk9MX0dQTChpb21tdV9ncm91cF91bnJlZ2lzdGVyX25vdGlmaWVyKTsKPj4gwqDCoCAqLwo+PiDC oCBpbnQgaW9tbXVfcmVnaXN0ZXJfZGV2aWNlX2ZhdWx0X2hhbmRsZXIoc3RydWN0IGRldmljZSAq ZGV2LAo+PiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaW9tbXVf ZGV2X2ZhdWx0X2hhbmRsZXJfdCBoYW5kbGVyLAo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgdm9pZCAqZGF0YSkKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIHUzMiBmbGFncywgdm9pZCAqZGF0YSkKPj4gwqAgewo+PiDCoMKgwqDCoMKg IHN0cnVjdCBkZXZfaW9tbXUgKnBhcmFtID0gZGV2LT5pb21tdTsKPj4gwqDCoMKgwqDCoCBpbnQg cmV0ID0gMDsKPj4gwqAgK8KgwqDCoCBpZiAoZmxhZ3MgJiBJT1BGX1JFUE9SVF9GTEFUICYmIGZs YWdzICYgSU9QRl9SRVBPUlRfTkVTVEVEKQo+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIC1FSU5W QUw7Cj4+ICsKPj4gwqDCoMKgwqDCoCBpZiAoIXBhcmFtKQo+PiDCoMKgwqDCoMKgwqDCoMKgwqAg cmV0dXJuIC1FSU5WQUw7Cj4+IMKgIEBAIC0xMDk5LDYgKzExMzYsNyBAQCBpbnQgaW9tbXVfcmVn aXN0ZXJfZGV2aWNlX2ZhdWx0X2hhbmRsZXIoc3RydWN0IGRldmljZSAqZGV2LAo+PiDCoMKgwqDC oMKgwqDCoMKgwqAgZ290byBkb25lX3VubG9jazsKPj4gwqDCoMKgwqDCoCB9Cj4+IMKgwqDCoMKg wqAgcGFyYW0tPmZhdWx0X3BhcmFtLT5oYW5kbGVyID0gaGFuZGxlcjsKPj4gK8KgwqDCoCBwYXJh bS0+ZmF1bHRfcGFyYW0tPmZsYWdzID0gZmxhZ3M7Cj4+IMKgwqDCoMKgwqAgcGFyYW0tPmZhdWx0 X3BhcmFtLT5kYXRhID0gZGF0YTsKPj4gwqDCoMKgwqDCoCBtdXRleF9pbml0KCZwYXJhbS0+ZmF1 bHRfcGFyYW0tPmxvY2spOwo+PiDCoMKgwqDCoMKgIElOSVRfTElTVF9IRUFEKCZwYXJhbS0+ZmF1 bHRfcGFyYW0tPmZhdWx0cyk7Cj4+IEBAIC0xMTc3LDYgKzEyMTUsMjIgQEAgaW50IGlvbW11X3Jl cG9ydF9kZXZpY2VfZmF1bHQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgaW9tbXVfZmF1bHRf ZXZlbnQgKmV2dCkKPj4gwqDCoMKgwqDCoMKgwqDCoMKgIGdvdG8gZG9uZV91bmxvY2s7Cj4+IMKg wqDCoMKgwqAgfQo+PiDCoCArwqDCoMKgIC8qIFRoZSB1bnJlY292ZXJhYmxlIGZhdWx0IHJlcG9y dGluZyBpcyBub3Qgc3VwcG9ydGVkIGF0IHRoZSBtb21lbnQuICovCj4+ICvCoMKgwqAgaWYgKGV2 dC0+ZmF1bHQudHlwZSAhPSBJT01NVV9GQVVMVF9QQUdFX1JFUSkKPj4gK8KgwqDCoMKgwqDCoMKg IHJldHVybiAtRU9QTk9UU1VQUDsKPiAKPiBBbnkgcmVhc29ucyB3aHkgZG8geW91IHdhbnQgdG8g ZGlzYWJsZSByZXBvcnRpbmcgYW4gdW5yZWNvdmVyYWJsZSBmYXVsdD8KCldoZW4gSSBhZGQgVU5S RUNPVl9GQVVMVF9SRVBPUlRfIChtZW50aW9uZWQgYWJvdmUpLCBJIHdpbGwgZW5hYmxlIHRoZSB1 bnJlY292ZXJhYmxlIGZhdWx0CnJlcG9ydGluZyBpZiB0aGUgZmF1bHQgY2xpZW50IGNvbmNlcm5z IGl0LiBTb3JyeSBmb3IgdGhpcy4gOi0pCgo+IAo+PiArCj4+ICvCoMKgwqAgaWYgKGV2dC0+ZmF1 bHQudHlwZSA9PSBJT01NVV9GQVVMVF9QQUdFX1JFUSkgewo+PiArwqDCoMKgwqDCoMKgwqAgaWYg KGZwYXJhbS0+ZmxhZ3MgJiBJT1BGX1JFUE9SVF9ORVNURUQpIHsKPj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqAgaWYgKGV2dC0+ZmF1bHQucHJtLmZsYWdzICYgSU9NTVVfRkFVTFRfUEFHRV9SRVFV RVNUX0wyICYmCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgIShmcGFyYW0tPmZs YWdzICYgSU9QRl9SRVBPUlRfTkVTVEVEX0wyX0NPTkNFUk5FRCkpCj4+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgcmV0dXJuIC1FT1BOT1RTVVBQOwo+PiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBpZiAoIShldnQtPmZhdWx0LnBybS5mbGFncyAmIElPTU1VX0ZBVUxUX1BBR0VfUkVR VUVTVF9MMikgJiYKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAhKGZwYXJhbS0+ ZmxhZ3MgJiBJT1BGX1JFUE9SVF9ORVNURURfTDFfQ09OQ0VSTkVEKSkKPj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm4gLUVPUE5PVFNVUFA7Cj4+ICvCoMKgwqDCoMKgwqDC oCB9IGVsc2UgaWYgKCEoZnBhcmFtLT5mbGFncyAmIElPUEZfUkVQT1JUX0ZMQVQpKQo+PiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm4gLUVPUE5PVFNVUFA7Cj4+ICvCoMKgwqAgfQo+PiAr Cj4+IMKgwqDCoMKgwqAgaWYgKGV2dC0+ZmF1bHQudHlwZSA9PSBJT01NVV9GQVVMVF9QQUdFX1JF USAmJgo+PiDCoMKgwqDCoMKgwqDCoMKgwqAgKGV2dC0+ZmF1bHQucHJtLmZsYWdzICYgSU9NTVVf RkFVTFRfUEFHRV9SRVFVRVNUX0xBU1RfUEFHRSkpIHsKPj4gwqDCoMKgwqDCoMKgwqDCoMKgIGV2 dF9wZW5kaW5nID0ga21lbWR1cChldnQsIHNpemVvZihzdHJ1Y3QgaW9tbXVfZmF1bHRfZXZlbnQp LAo+PiBkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pb21tdS5oIGIvaW5jbHVkZS9saW51eC9p b21tdS5oCj4+IGluZGV4IDg2ZDY4OGM0NDE4Zi4uZjAzZDc2MWU4MzEwIDEwMDY0NAo+PiAtLS0g YS9pbmNsdWRlL2xpbnV4L2lvbW11LmgKPj4gKysrIGIvaW5jbHVkZS9saW51eC9pb21tdS5oCj4+ IEBAIC0zNTIsMTIgKzM1MiwyMSBAQCBzdHJ1Y3QgaW9tbXVfZmF1bHRfZXZlbnQgewo+PiDCoCAv KioKPj4gwqDCoCAqIHN0cnVjdCBpb21tdV9mYXVsdF9wYXJhbSAtIHBlci1kZXZpY2UgSU9NTVUg ZmF1bHQgZGF0YQo+PiDCoMKgICogQGhhbmRsZXI6IENhbGxiYWNrIGZ1bmN0aW9uIHRvIGhhbmRs ZSBJT01NVSBmYXVsdHMgYXQgZGV2aWNlIGxldmVsCj4+ICsgKiBAZmxhZ3M6IEluZGljYXRlcyB3 aGV0aGVyIHRoZSBmYXVsdCByZXBvcnRpbmcgaXMgYXZhaWxhYmxlIHVuZGVyIGEKPj4gKyAqwqDC oMKgwqDCoMKgIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gKDFzdC8ybmQtbGV2ZWwtb25seShGTEFU KSwgb3IgbmVzdGVkKS4KPj4gKyAqwqDCoMKgwqDCoMKgIElPUEZfUkVQT1JUX05FU1RFRCBuZWVk cyB0byBhZGRpdGlvbmFsbHkga25vdyB3aGljaCBsZXZlbC9zdGFnZQo+PiArICrCoMKgwqDCoMKg wqAgaXMgY29uY2VybmVkLgo+IAo+IElmIElPUEZfUkVQT1JUX05FU1RFRCBvbmx5IGlzIG5vdCB2 YWxpZCB3aHkgZG8geW91IHdhbnQgdG8gZGVmaW5lIGl0PwoKWWVhaCwgaXQgc2VlbXMgdGhhdCBJ T1BGX1JFUE9SVF9ORVNURUQgaXMgdW5uZWNlc3NhcnksIElPUEZfUkVQT1JUX05FU1RFRF9MMSAr IElPUEZfUkVQT1JUX05FU1RFRF9MMgppcyBlbm91Z2guLi4KClRoYW5rcyBmb3IgeW91ciBjb21t ZW50cyEKU2hlbm1pbmcKCj4gCj4+IMKgwqAgKiBAZGF0YTogaGFuZGxlciBwcml2YXRlIGRhdGEK Pj4gwqDCoCAqIEBmYXVsdHM6IGhvbGRzIHRoZSBwZW5kaW5nIGZhdWx0cyB3aGljaCBuZWVkcyBy ZXNwb25zZQo+PiDCoMKgICogQGxvY2s6IHByb3RlY3QgcGVuZGluZyBmYXVsdHMgbGlzdAo+PiDC oMKgICovCj4+IMKgIHN0cnVjdCBpb21tdV9mYXVsdF9wYXJhbSB7Cj4+IMKgwqDCoMKgwqAgaW9t bXVfZGV2X2ZhdWx0X2hhbmRsZXJfdCBoYW5kbGVyOwo+PiArI2RlZmluZSBJT1BGX1JFUE9SVF9G TEFUwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAoMSA8PCAwKQo+PiArI2RlZmluZSBJT1BGX1JFUE9S VF9ORVNURUTCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICgxIDw8IDEpCj4+ICsjZGVmaW5lIElPUEZf UkVQT1JUX05FU1RFRF9MMV9DT05DRVJORUTCoMKgwqDCoMKgwqDCoCAoMSA8PCAyKQo+PiArI2Rl ZmluZSBJT1BGX1JFUE9SVF9ORVNURURfTDJfQ09OQ0VSTkVEwqDCoMKgwqDCoMKgwqAgKDEgPDwg MykKPj4gK8KgwqDCoCB1MzIgZmxhZ3M7Cj4+IMKgwqDCoMKgwqAgdm9pZCAqZGF0YTsKPj4gwqDC oMKgwqDCoCBzdHJ1Y3QgbGlzdF9oZWFkIGZhdWx0czsKPj4gwqDCoMKgwqDCoCBzdHJ1Y3QgbXV0 ZXggbG9jazsKPj4gQEAgLTUwOSw5ICs1MTgsMTEgQEAgZXh0ZXJuIGludCBpb21tdV9ncm91cF9y ZWdpc3Rlcl9ub3RpZmllcihzdHJ1Y3QgaW9tbXVfZ3JvdXAgKmdyb3VwLAo+PiDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sg Km5iKTsKPj4gwqAgZXh0ZXJuIGludCBpb21tdV9ncm91cF91bnJlZ2lzdGVyX25vdGlmaWVyKHN0 cnVjdCBpb21tdV9ncm91cCAqZ3JvdXAsCj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKTsKPj4gK2V4dGVy biBpbnQgaW9tbXVfdXBkYXRlX2RldmljZV9mYXVsdF9oYW5kbGVyKHN0cnVjdCBkZXZpY2UgKmRl diwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1 MzIgbWFzaywgdTMyIHNldCk7Cj4+IMKgIGV4dGVybiBpbnQgaW9tbXVfcmVnaXN0ZXJfZGV2aWNl X2ZhdWx0X2hhbmRsZXIoc3RydWN0IGRldmljZSAqZGV2LAo+PiDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaW9tbXVfZGV2X2ZhdWx0X2hhbmRsZXJfdCBoYW5kbGVy LAo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdm9pZCAqZGF0YSk7 Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1MzIgZmxhZ3MsIHZv aWQgKmRhdGEpOwo+PiDCoCDCoCBleHRlcm4gaW50IGlvbW11X3VucmVnaXN0ZXJfZGV2aWNlX2Zh dWx0X2hhbmRsZXIoc3RydWN0IGRldmljZSAqZGV2KTsKPj4gwqAgQEAgLTg3MywxMCArODg0LDE2 IEBAIHN0YXRpYyBpbmxpbmUgaW50IGlvbW11X2dyb3VwX3VucmVnaXN0ZXJfbm90aWZpZXIoc3Ry dWN0IGlvbW11X2dyb3VwICpncm91cCwKPj4gwqDCoMKgwqDCoCByZXR1cm4gMDsKPj4gwqAgfQo+ PiDCoCArc3RhdGljIGlubGluZSBpbnQgaW9tbXVfdXBkYXRlX2RldmljZV9mYXVsdF9oYW5kbGVy KHN0cnVjdCBkZXZpY2UgKmRldiwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1MzIgbWFzaywgdTMyIHNldCkKPj4gK3sKPj4gK8KgwqDC oCByZXR1cm4gLUVOT0RFVjsKPj4gK30KPj4gKwo+PiDCoCBzdGF0aWMgaW5saW5lCj4+IMKgIGlu dCBpb21tdV9yZWdpc3Rlcl9kZXZpY2VfZmF1bHRfaGFuZGxlcihzdHJ1Y3QgZGV2aWNlICpkZXYs Cj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpb21tdV9kZXZf ZmF1bHRfaGFuZGxlcl90IGhhbmRsZXIsCj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCB2b2lkICpkYXRhKQo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgdTMyIGZsYWdzLCB2b2lkICpkYXRhKQo+PiDCoCB7Cj4+IMKgwqDCoMKgwqAgcmV0 dXJuIC1FTk9ERVY7Cj4+IMKgIH0KPj4gZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9p b21tdS5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2lvbW11LmgKPj4gaW5kZXggZTFkOWU3NWYyYzk0 Li4wY2UwZGZiNzcxM2UgMTAwNjQ0Cj4+IC0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9pb21tdS5o Cj4+ICsrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9pb21tdS5oCj4+IEBAIC04NSw2ICs4NSw4IEBA IHN0cnVjdCBpb21tdV9mYXVsdF91bnJlY292ZXJhYmxlIHsKPj4gwqDCoCAqwqDCoMKgwqDCoMKg wqDCoCBXaGVuIElPTU1VX0ZBVUxUX1BBR0VfUkVTUE9OU0VfTkVFRFNfUEFTSUQgaXMgc2V0LCB0 aGUgcGFnZSByZXNwb25zZQo+PiDCoMKgICrCoMKgwqDCoMKgwqDCoMKgIG11c3QgaGF2ZSB0aGUg c2FtZSBQQVNJRCB2YWx1ZSBhcyB0aGUgcGFnZSByZXF1ZXN0LiBXaGVuIGl0IGlzIGNsZWFyLAo+ PiDCoMKgICrCoMKgwqDCoMKgwqDCoMKgIHRoZSBwYWdlIHJlc3BvbnNlIHNob3VsZCBub3QgaGF2 ZSBhIFBBU0lELgo+PiArICrCoMKgwqDCoMKgwqDCoMKgIElmIElPTU1VX0ZBVUxUX1BBR0VfUkVR VUVTVF9MMiBpcyBzZXQsIHRoZSBmYXVsdCBvY2N1cnJlZCBhdCB0aGUKPj4gKyAqwqDCoMKgwqDC oMKgwqDCoCBzZWNvbmQgbGV2ZWwvc3RhZ2UsIG90aGVyd2lzZSwgb2NjdXJyZWQgYXQgdGhlIGZp cnN0IGxldmVsLgo+PiDCoMKgICogQHBhc2lkOiBQcm9jZXNzIEFkZHJlc3MgU3BhY2UgSUQKPj4g wqDCoCAqIEBncnBpZDogUGFnZSBSZXF1ZXN0IEdyb3VwIEluZGV4Cj4+IMKgwqAgKiBAcGVybTog cmVxdWVzdGVkIHBhZ2UgcGVybWlzc2lvbnMgKElPTU1VX0ZBVUxUX1BFUk1fKiB2YWx1ZXMpCj4+ IEBAIC05Niw2ICs5OCw3IEBAIHN0cnVjdCBpb21tdV9mYXVsdF9wYWdlX3JlcXVlc3Qgewo+PiDC oCAjZGVmaW5lIElPTU1VX0ZBVUxUX1BBR0VfUkVRVUVTVF9MQVNUX1BBR0XCoMKgwqAgKDEgPDwg MSkKPj4gwqAgI2RlZmluZSBJT01NVV9GQVVMVF9QQUdFX1JFUVVFU1RfUFJJVl9EQVRBwqDCoMKg ICgxIDw8IDIpCj4+IMKgICNkZWZpbmUgSU9NTVVfRkFVTFRfUEFHRV9SRVNQT05TRV9ORUVEU19Q QVNJRMKgwqDCoCAoMSA8PCAzKQo+PiArI2RlZmluZSBJT01NVV9GQVVMVF9QQUdFX1JFUVVFU1Rf TDLCoMKgwqDCoMKgwqDCoCAoMSA8PCA0KQo+PiDCoMKgwqDCoMKgIF9fdTMywqDCoMKgIGZsYWdz Owo+PiDCoMKgwqDCoMKgIF9fdTMywqDCoMKgIHBhc2lkOwo+PiDCoMKgwqDCoMKgIF9fdTMywqDC oMKgIGdycGlkOwo+Pgo+IAo+IEJlc3QgcmVnYXJkcywKPiBiYW9sdQo+IC4KCl9fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFp bGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlz dHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK