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=-17.7 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,NICE_REPLY_A, SPF_HELO_NONE,SPF_PASS,USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3C1A3C433DB for ; Sun, 31 Jan 2021 20:32:46 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id E353A64E28 for ; Sun, 31 Jan 2021 20:32:45 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229564AbhAaUco (ORCPT ); Sun, 31 Jan 2021 15:32:44 -0500 Received: from us-smtp-delivery-124.mimecast.com ([63.128.21.124]:52138 "EHLO us-smtp-delivery-124.mimecast.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229731AbhAaUbr (ORCPT ); Sun, 31 Jan 2021 15:31:47 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1612125019; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=J/aN+VcFd0A+/O8Uby1eLbErmC7NfLDfVH8RGF6p+XM=; b=jMTAuFZvKDYz7mcces9Y0B7RiPCSzy00aTSH8ZYZhWFg81YPGO9Hb2vx6YsRmU5ru0ob+T QjNbqMvuduzflgVhw29oMAm7SwyRmApZJC2b6/FVAndte+JjoLo3/atk/zsde1kySatRno HX+yymisHZW8bSz733qfylaDEZUK7nA= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-153-AVhH2fj7OHmqo_Cz2tMkDA-1; Sun, 31 Jan 2021 13:29:23 -0500 X-MC-Unique: AVhH2fj7OHmqo_Cz2tMkDA-1 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 25356801817; Sun, 31 Jan 2021 18:29:20 +0000 (UTC) Received: from [10.36.114.62] (ovpn-114-62.ams2.redhat.com [10.36.114.62]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 41D046E405; Sun, 31 Jan 2021 18:29:12 +0000 (UTC) Subject: Re: [PATCH v12 10/10] iommu/arm-smmu-v3: Add stall support for platform devices To: Jean-Philippe Brucker , joro@8bytes.org, will@kernel.org Cc: lorenzo.pieralisi@arm.com, robh+dt@kernel.org, guohanjun@huawei.com, sudeep.holla@arm.com, rjw@rjwysocki.net, lenb@kernel.org, robin.murphy@arm.com, Jonathan.Cameron@huawei.com, iommu@lists.linux-foundation.org, devicetree@vger.kernel.org, linux-acpi@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-accelerators@lists.ozlabs.org, baolu.lu@linux.intel.com, jacob.jun.pan@linux.intel.com, kevin.tian@intel.com, vdumpa@nvidia.com, zhangfei.gao@linaro.org, shameerali.kolothum.thodi@huawei.com, vivek.gautam@arm.com References: <20210127154322.3959196-1-jean-philippe@linaro.org> <20210127154322.3959196-11-jean-philippe@linaro.org> From: Auger Eric Message-ID: <0c609eeb-00b0-7573-fed7-5bc1e6c0b0d1@redhat.com> Date: Sun, 31 Jan 2021 19:29:09 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.5.0 MIME-Version: 1.0 In-Reply-To: <20210127154322.3959196-11-jean-philippe@linaro.org> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 8bit X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 Precedence: bulk List-ID: X-Mailing-List: linux-acpi@vger.kernel.org Hi Jean, Some rather minor comments§questions below that may not justify a respin. On 1/27/21 4:43 PM, Jean-Philippe Brucker wrote: > The SMMU provides a Stall model for handling page faults in platform > devices. It is similar to PCIe PRI, but doesn't require devices to have > their own translation cache. Instead, faulting transactions are parked > and the OS is given a chance to fix the page tables and retry the > transaction. > > Enable stall for devices that support it (opt-in by firmware). When an > event corresponds to a translation error, call the IOMMU fault handler. > If the fault is recoverable, it will call us back to terminate or > continue the stall. > > To use stall device drivers need to enable IOMMU_DEV_FEAT_IOPF, which > initializes the fault queue for the device. > > Tested-by: Zhangfei Gao > Reviewed-by: Jonathan Cameron > Signed-off-by: Jean-Philippe Brucker > --- > drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h | 43 ++++ > .../iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c | 59 +++++- > drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 189 +++++++++++++++++- > 3 files changed, 276 insertions(+), 15 deletions(-) > > diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h > index 7b15b7580c6e..59af0bbd2f7b 100644 > --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h > +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h > @@ -354,6 +354,13 @@ > #define CMDQ_PRI_1_GRPID GENMASK_ULL(8, 0) > #define CMDQ_PRI_1_RESP GENMASK_ULL(13, 12) > > +#define CMDQ_RESUME_0_RESP_TERM 0UL > +#define CMDQ_RESUME_0_RESP_RETRY 1UL > +#define CMDQ_RESUME_0_RESP_ABORT 2UL > +#define CMDQ_RESUME_0_RESP GENMASK_ULL(13, 12) > +#define CMDQ_RESUME_0_SID GENMASK_ULL(63, 32) > +#define CMDQ_RESUME_1_STAG GENMASK_ULL(15, 0) > + > #define CMDQ_SYNC_0_CS GENMASK_ULL(13, 12) > #define CMDQ_SYNC_0_CS_NONE 0 > #define CMDQ_SYNC_0_CS_IRQ 1 > @@ -370,6 +377,25 @@ > > #define EVTQ_0_ID GENMASK_ULL(7, 0) > > +#define EVT_ID_TRANSLATION_FAULT 0x10 > +#define EVT_ID_ADDR_SIZE_FAULT 0x11 > +#define EVT_ID_ACCESS_FAULT 0x12 > +#define EVT_ID_PERMISSION_FAULT 0x13 > + > +#define EVTQ_0_SSV (1UL << 11) > +#define EVTQ_0_SSID GENMASK_ULL(31, 12) > +#define EVTQ_0_SID GENMASK_ULL(63, 32) > +#define EVTQ_1_STAG GENMASK_ULL(15, 0) > +#define EVTQ_1_STALL (1UL << 31) > +#define EVTQ_1_PnU (1UL << 33) > +#define EVTQ_1_InD (1UL << 34) > +#define EVTQ_1_RnW (1UL << 35) > +#define EVTQ_1_S2 (1UL << 39) > +#define EVTQ_1_CLASS GENMASK_ULL(41, 40) > +#define EVTQ_1_TT_READ (1UL << 44) > +#define EVTQ_2_ADDR GENMASK_ULL(63, 0) > +#define EVTQ_3_IPA GENMASK_ULL(51, 12) > + > /* PRI queue */ > #define PRIQ_ENT_SZ_SHIFT 4 > #define PRIQ_ENT_DWORDS ((1 << PRIQ_ENT_SZ_SHIFT) >> 3) > @@ -464,6 +490,13 @@ struct arm_smmu_cmdq_ent { > enum pri_resp resp; > } pri; > > + #define CMDQ_OP_RESUME 0x44 > + struct { > + u32 sid; > + u16 stag; > + u8 resp; > + } resume; > + > #define CMDQ_OP_CMD_SYNC 0x46 > struct { > u64 msiaddr; > @@ -522,6 +555,7 @@ struct arm_smmu_cmdq_batch { > > struct arm_smmu_evtq { > struct arm_smmu_queue q; > + struct iopf_queue *iopf; > u32 max_stalls; > }; > > @@ -659,7 +693,9 @@ struct arm_smmu_master { > struct arm_smmu_stream *streams; > unsigned int num_streams; > bool ats_enabled; > + bool stall_enabled; > bool sva_enabled; > + bool iopf_enabled; > struct list_head bonds; > unsigned int ssid_bits; > }; > @@ -678,6 +714,7 @@ struct arm_smmu_domain { > > struct io_pgtable_ops *pgtbl_ops; > bool non_strict; > + bool stall_enabled; > atomic_t nr_ats_masters; > > enum arm_smmu_domain_stage stage; > @@ -719,6 +756,7 @@ bool arm_smmu_master_sva_supported(struct arm_smmu_master *master); > bool arm_smmu_master_sva_enabled(struct arm_smmu_master *master); > int arm_smmu_master_enable_sva(struct arm_smmu_master *master); > int arm_smmu_master_disable_sva(struct arm_smmu_master *master); > +bool arm_smmu_master_iopf_supported(struct arm_smmu_master *master); > struct iommu_sva *arm_smmu_sva_bind(struct device *dev, struct mm_struct *mm, > void *drvdata); > void arm_smmu_sva_unbind(struct iommu_sva *handle); > @@ -750,6 +788,11 @@ static inline int arm_smmu_master_disable_sva(struct arm_smmu_master *master) > return -ENODEV; > } > > +static inline bool arm_smmu_master_iopf_supported(struct arm_smmu_master *master) > +{ > + return false; > +} > + > static inline struct iommu_sva * > arm_smmu_sva_bind(struct device *dev, struct mm_struct *mm, void *drvdata) > { > 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 bb251cab61f3..ee66d1f4cb81 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 > @@ -435,9 +435,13 @@ bool arm_smmu_sva_supported(struct arm_smmu_device *smmu) > return true; > } > > -static bool arm_smmu_iopf_supported(struct arm_smmu_master *master) > +bool arm_smmu_master_iopf_supported(struct arm_smmu_master *master) > { > - return false; > + /* We're not keeping track of SIDs in fault events */ shall we? [*] below > + if (master->num_streams != 1) > + return false; > + > + return master->stall_enabled; > } > > bool arm_smmu_master_sva_supported(struct arm_smmu_master *master) > @@ -445,8 +449,8 @@ bool arm_smmu_master_sva_supported(struct arm_smmu_master *master) > if (!(master->smmu->features & ARM_SMMU_FEAT_SVA)) > return false; > > - /* SSID and IOPF support are mandatory for the moment */ > - return master->ssid_bits && arm_smmu_iopf_supported(master); > + /* SSID support is mandatory for the moment */ > + return master->ssid_bits; > } > > bool arm_smmu_master_sva_enabled(struct arm_smmu_master *master) > @@ -459,13 +463,55 @@ bool arm_smmu_master_sva_enabled(struct arm_smmu_master *master) > return enabled; > } > > +static int arm_smmu_master_sva_enable_iopf(struct arm_smmu_master *master) > +{ > + int ret; > + struct device *dev = master->dev; > + > + /* > + * Drivers for devices supporting PRI or stall should enable IOPF first. > + * Others have device-specific fault handlers and don't need IOPF. > + */ > + if (!arm_smmu_master_iopf_supported(master)) > + return 0; > + > + if (!master->iopf_enabled) > + return -EINVAL; > + > + ret = iopf_queue_add_device(master->smmu->evtq.iopf, dev); > + if (ret) > + return ret; > + > + ret = iommu_register_device_fault_handler(dev, iommu_queue_iopf, dev); > + if (ret) { > + iopf_queue_remove_device(master->smmu->evtq.iopf, dev); > + return ret; > + } > + return 0; > +} > + > +static void arm_smmu_master_sva_disable_iopf(struct arm_smmu_master *master) > +{ > + struct device *dev = master->dev; > + > + if (!master->iopf_enabled) > + return; > + > + iommu_unregister_device_fault_handler(dev); > + iopf_queue_remove_device(master->smmu->evtq.iopf, dev); > +} > + > int arm_smmu_master_enable_sva(struct arm_smmu_master *master) > { > + int ret; > + > mutex_lock(&sva_lock); > - master->sva_enabled = true; > + ret = arm_smmu_master_sva_enable_iopf(master); > + if (!ret) > + master->sva_enabled = true; > mutex_unlock(&sva_lock); > > - return 0; > + return ret; > } > > int arm_smmu_master_disable_sva(struct arm_smmu_master *master) > @@ -476,6 +522,7 @@ int arm_smmu_master_disable_sva(struct arm_smmu_master *master) > mutex_unlock(&sva_lock); > return -EBUSY; > } > + arm_smmu_master_sva_disable_iopf(master); > master->sva_enabled = false; > mutex_unlock(&sva_lock); > > 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 3afec6ed8075..76b2306ddff6 100644 > --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c > +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c > @@ -32,6 +32,7 @@ > #include > > #include "arm-smmu-v3.h" > +#include "../../iommu-sva-lib.h" > > static bool disable_bypass = true; > module_param(disable_bypass, bool, 0444); > @@ -315,6 +316,11 @@ static int arm_smmu_cmdq_build_cmd(u64 *cmd, struct arm_smmu_cmdq_ent *ent) > } > cmd[1] |= FIELD_PREP(CMDQ_PRI_1_RESP, ent->pri.resp); > break; > + case CMDQ_OP_RESUME: > + cmd[0] |= FIELD_PREP(CMDQ_RESUME_0_SID, ent->resume.sid); > + cmd[0] |= FIELD_PREP(CMDQ_RESUME_0_RESP, ent->resume.resp); > + cmd[1] |= FIELD_PREP(CMDQ_RESUME_1_STAG, ent->resume.stag); > + break; > case CMDQ_OP_CMD_SYNC: > if (ent->sync.msiaddr) { > cmd[0] |= FIELD_PREP(CMDQ_SYNC_0_CS, CMDQ_SYNC_0_CS_IRQ); > @@ -878,6 +884,44 @@ static int arm_smmu_cmdq_batch_submit(struct arm_smmu_device *smmu, > return arm_smmu_cmdq_issue_cmdlist(smmu, cmds->cmds, cmds->num, true); > } > > +static int arm_smmu_page_response(struct device *dev, > + struct iommu_fault_event *unused, > + struct iommu_page_response *resp) > +{ > + struct arm_smmu_cmdq_ent cmd = {0}; > + struct arm_smmu_master *master = dev_iommu_priv_get(dev); > + int sid = master->streams[0].id; [*] > + > + if (master->stall_enabled) { > + cmd.opcode = CMDQ_OP_RESUME; > + cmd.resume.sid = sid; > + cmd.resume.stag = resp->grpid; > + switch (resp->code) { > + case IOMMU_PAGE_RESP_INVALID: add fallthrough? > + case IOMMU_PAGE_RESP_FAILURE: > + cmd.resume.resp = CMDQ_RESUME_0_RESP_ABORT; > + break; > + case IOMMU_PAGE_RESP_SUCCESS: > + cmd.resume.resp = CMDQ_RESUME_0_RESP_RETRY; > + break; > + default: > + return -EINVAL; > + } > + } else { > + return -ENODEV; > + } > + > + arm_smmu_cmdq_issue_cmd(master->smmu, &cmd); > + /* > + * Don't send a SYNC, it doesn't do anything for RESUME or PRI_RESP. > + * RESUME consumption guarantees that the stalled transaction will be > + * terminated... at some point in the future. PRI_RESP is fire and > + * forget. > + */ > + > + return 0; > +} > + > /* Context descriptor manipulation functions */ > void arm_smmu_tlb_inv_asid(struct arm_smmu_device *smmu, u16 asid) > { > @@ -988,7 +1032,6 @@ int arm_smmu_write_ctx_desc(struct arm_smmu_domain *smmu_domain, int ssid, > u64 val; > bool cd_live; > __le64 *cdptr; > - struct arm_smmu_device *smmu = smmu_domain->smmu; > > if (WARN_ON(ssid >= (1 << smmu_domain->s1_cfg.s1cdmax))) > return -E2BIG; > @@ -1033,8 +1076,7 @@ int arm_smmu_write_ctx_desc(struct arm_smmu_domain *smmu_domain, int ssid, > FIELD_PREP(CTXDESC_CD_0_ASID, cd->asid) | > CTXDESC_CD_0_V; > > - /* STALL_MODEL==0b10 && CD.S==0 is ILLEGAL */ > - if (smmu->features & ARM_SMMU_FEAT_STALL_FORCE) > + if (smmu_domain->stall_enabled) > val |= CTXDESC_CD_0_S; > } > > @@ -1278,7 +1320,7 @@ static void arm_smmu_write_strtab_ent(struct arm_smmu_master *master, u32 sid, > FIELD_PREP(STRTAB_STE_1_STRW, strw)); > > if (smmu->features & ARM_SMMU_FEAT_STALLS && > - !(smmu->features & ARM_SMMU_FEAT_STALL_FORCE)) > + !master->stall_enabled) > dst[1] |= cpu_to_le64(STRTAB_STE_1_S1STALLD); > > val |= (s1_cfg->cdcfg.cdtab_dma & STRTAB_STE_0_S1CTXPTR_MASK) | > @@ -1355,7 +1397,6 @@ static int arm_smmu_init_l2_strtab(struct arm_smmu_device *smmu, u32 sid) > return 0; > } > > -__maybe_unused > static struct arm_smmu_master * > arm_smmu_find_master(struct arm_smmu_device *smmu, u32 sid) > { > @@ -1382,9 +1423,96 @@ arm_smmu_find_master(struct arm_smmu_device *smmu, u32 sid) > } > > /* IRQ and event handlers */ > +static int arm_smmu_handle_evt(struct arm_smmu_device *smmu, u64 *evt) > +{ > + int ret; > + u32 reason; > + u32 perm = 0; > + struct arm_smmu_master *master; > + bool ssid_valid = evt[0] & EVTQ_0_SSV; > + u32 sid = FIELD_GET(EVTQ_0_SID, evt[0]); > + struct iommu_fault_event fault_evt = { }; > + struct iommu_fault *flt = &fault_evt.fault; > + > + /* Stage-2 is always pinned at the moment */ > + if (evt[1] & EVTQ_1_S2) > + return -EFAULT; > + > + master = arm_smmu_find_master(smmu, sid); > + if (!master) > + return -EINVAL; > + > + if (evt[1] & EVTQ_1_RnW) > + perm |= IOMMU_FAULT_PERM_READ; > + else > + perm |= IOMMU_FAULT_PERM_WRITE; > + > + if (evt[1] & EVTQ_1_InD) > + perm |= IOMMU_FAULT_PERM_EXEC; > + > + if (evt[1] & EVTQ_1_PnU) > + perm |= IOMMU_FAULT_PERM_PRIV; > + > + switch (FIELD_GET(EVTQ_0_ID, evt[0])) { > + case EVT_ID_TRANSLATION_FAULT: > + case EVT_ID_ADDR_SIZE_FAULT: > + case EVT_ID_ACCESS_FAULT: > + reason = IOMMU_FAULT_REASON_PTE_FETCH; Doesn't it rather map to IOMMU_FAULT_REASON_ACCESS? /* access flag check failed */" > + break; > + case EVT_ID_PERMISSION_FAULT: > + reason = IOMMU_FAULT_REASON_PERMISSION; > + break; > + default: > + return -EOPNOTSUPP; > + } > + > + if (evt[1] & EVTQ_1_STALL) { > + flt->type = IOMMU_FAULT_PAGE_REQ; > + flt->prm = (struct iommu_fault_page_request) { > + .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]); > + } > + } else { > + flt->type = IOMMU_FAULT_DMA_UNRECOV; > + flt->event = (struct iommu_fault_unrecoverable) { > + .reason = reason, > + .flags = IOMMU_FAULT_UNRECOV_ADDR_VALID | > + IOMMU_FAULT_UNRECOV_FETCH_ADDR_VALID, nit: shall IOMMU_FAULT_UNRECOV_FETCH_ADDR_VALID be set here? Supported unrecoverable faults feature the IPA field which is UNKNOWN for S1 translations. fetch_addr rather was corresponding to WALK_EABT.Fetch_addr to me. > + .perm = perm, > + .addr = FIELD_GET(EVTQ_2_ADDR, evt[2]), > + .fetch_addr = FIELD_GET(EVTQ_3_IPA, evt[3]), > + }; > + > + if (ssid_valid) { > + flt->event.flags |= IOMMU_FAULT_UNRECOV_PASID_VALID; > + flt->event.pasid = FIELD_GET(EVTQ_0_SSID, evt[0]); > + } > + } > + > + ret = iommu_report_device_fault(master->dev, &fault_evt); > + if (ret && flt->type == IOMMU_FAULT_PAGE_REQ) { > + /* Nobody cared, abort the access */ > + struct iommu_page_response resp = { > + .pasid = flt->prm.pasid, > + .grpid = flt->prm.grpid, > + .code = IOMMU_PAGE_RESP_FAILURE, > + }; > + arm_smmu_page_response(master->dev, &fault_evt, &resp); > + } > + > + return ret; > +} > + > static irqreturn_t arm_smmu_evtq_thread(int irq, void *dev) > { > - int i; > + int i, ret; > struct arm_smmu_device *smmu = dev; > struct arm_smmu_queue *q = &smmu->evtq.q; > struct arm_smmu_ll_queue *llq = &q->llq; > @@ -1394,6 +1522,10 @@ static irqreturn_t arm_smmu_evtq_thread(int irq, void *dev) > while (!queue_remove_raw(q, evt)) { > u8 id = FIELD_GET(EVTQ_0_ID, evt[0]); > > + ret = arm_smmu_handle_evt(smmu, evt); > + if (!ret) > + continue; > + > dev_info(smmu->dev, "event 0x%02x received:\n", id); > for (i = 0; i < ARRAY_SIZE(evt); ++i) > dev_info(smmu->dev, "\t0x%016llx\n", > @@ -1928,6 +2060,8 @@ static int arm_smmu_domain_finalise_s1(struct arm_smmu_domain *smmu_domain, > > cfg->s1cdmax = master->ssid_bits; > > + smmu_domain->stall_enabled = master->stall_enabled; > + > ret = arm_smmu_alloc_cd_tables(smmu_domain); > if (ret) > goto out_free_asid; > @@ -2275,6 +2409,12 @@ static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev) > smmu_domain->s1_cfg.s1cdmax, master->ssid_bits); > ret = -EINVAL; > goto out_unlock; > + } else if (smmu_domain->stage == ARM_SMMU_DOMAIN_S1 && > + smmu_domain->stall_enabled != master->stall_enabled) { > + dev_err(dev, "cannot attach to stall-%s domain\n", > + smmu_domain->stall_enabled ? "enabled" : "disabled"); > + ret = -EINVAL; > + goto out_unlock; > } > > master->domain = smmu_domain; > @@ -2510,6 +2650,11 @@ static struct iommu_device *arm_smmu_probe_device(struct device *dev) > master->ssid_bits = min_t(u8, master->ssid_bits, > CTXDESC_LINEAR_CDMAX); > > + if ((smmu->features & ARM_SMMU_FEAT_STALLS && > + device_property_read_bool(dev, "dma-can-stall")) || > + smmu->features & ARM_SMMU_FEAT_STALL_FORCE) > + master->stall_enabled = true; > + > return &smmu->iommu; > > err_free_master: > @@ -2527,7 +2672,8 @@ static void arm_smmu_release_device(struct device *dev) > return; > > master = dev_iommu_priv_get(dev); > - WARN_ON(arm_smmu_master_sva_enabled(master)); > + if (WARN_ON(arm_smmu_master_sva_enabled(master))) > + iopf_queue_remove_device(master->smmu->evtq.iopf, dev); > arm_smmu_detach_dev(master); > arm_smmu_disable_pasid(master); > arm_smmu_remove_master(master); > @@ -2655,6 +2801,8 @@ static bool arm_smmu_dev_has_feature(struct device *dev, > return false; > > switch (feat) { > + case IOMMU_DEV_FEAT_IOPF: > + return arm_smmu_master_iopf_supported(master); > case IOMMU_DEV_FEAT_SVA: > return arm_smmu_master_sva_supported(master); > default: > @@ -2671,6 +2819,8 @@ static bool arm_smmu_dev_feature_enabled(struct device *dev, > return false; > > switch (feat) { > + case IOMMU_DEV_FEAT_IOPF: > + return master->iopf_enabled; > case IOMMU_DEV_FEAT_SVA: > return arm_smmu_master_sva_enabled(master); > default: > @@ -2681,6 +2831,8 @@ static bool arm_smmu_dev_feature_enabled(struct device *dev, > static int arm_smmu_dev_enable_feature(struct device *dev, > enum iommu_dev_features feat) > { > + struct arm_smmu_master *master = dev_iommu_priv_get(dev); > + > if (!arm_smmu_dev_has_feature(dev, feat)) > return -ENODEV; > > @@ -2688,8 +2840,11 @@ static int arm_smmu_dev_enable_feature(struct device *dev, > return -EBUSY; > > switch (feat) { > + case IOMMU_DEV_FEAT_IOPF: > + master->iopf_enabled = true; > + return 0; > case IOMMU_DEV_FEAT_SVA: > - return arm_smmu_master_enable_sva(dev_iommu_priv_get(dev)); > + return arm_smmu_master_enable_sva(master); > default: > return -EINVAL; > } > @@ -2698,12 +2853,19 @@ static int arm_smmu_dev_enable_feature(struct device *dev, > static int arm_smmu_dev_disable_feature(struct device *dev, > enum iommu_dev_features feat) > { > + struct arm_smmu_master *master = dev_iommu_priv_get(dev); > + > if (!arm_smmu_dev_feature_enabled(dev, feat)) > return -EINVAL; > > switch (feat) { > + case IOMMU_DEV_FEAT_IOPF: > + if (master->sva_enabled) > + return -EBUSY; > + master->iopf_enabled = false; > + return 0; > case IOMMU_DEV_FEAT_SVA: > - return arm_smmu_master_disable_sva(dev_iommu_priv_get(dev)); > + return arm_smmu_master_disable_sva(master); > default: > return -EINVAL; > } > @@ -2734,6 +2896,7 @@ static struct iommu_ops arm_smmu_ops = { > .sva_bind = arm_smmu_sva_bind, > .sva_unbind = arm_smmu_sva_unbind, > .sva_get_pasid = arm_smmu_sva_get_pasid, > + .page_response = arm_smmu_page_response, > .pgsize_bitmap = -1UL, /* Restricted during device attach */ > }; > > @@ -2831,6 +2994,13 @@ static int arm_smmu_init_queues(struct arm_smmu_device *smmu) > if (ret) > return ret; > > + if ((smmu->features & ARM_SMMU_FEAT_SVA) && > + (smmu->features & ARM_SMMU_FEAT_STALLS)) { > + smmu->evtq.iopf = iopf_queue_alloc(dev_name(smmu->dev)); > + if (!smmu->evtq.iopf) > + return -ENOMEM; > + } > + > /* priq */ > if (!(smmu->features & ARM_SMMU_FEAT_PRI)) > return 0; > @@ -3746,6 +3916,7 @@ static int arm_smmu_device_remove(struct platform_device *pdev) > iommu_device_unregister(&smmu->iommu); > iommu_device_sysfs_remove(&smmu->iommu); > arm_smmu_device_disable(smmu); > + iopf_queue_free(smmu->evtq.iopf); > > return 0; > } > Thanks Eric 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.1 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS,URIBL_RED, 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 69070C433DB for ; Sun, 31 Jan 2021 18:29:37 +0000 (UTC) Received: from silver.osuosl.org (smtp3.osuosl.org [140.211.166.136]) (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 D10E964E4D for ; Sun, 31 Jan 2021 18:29:36 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org D10E964E4D Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.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 silver.osuosl.org (Postfix) with ESMTP id 8666F203AA; Sun, 31 Jan 2021 18:29:36 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from silver.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 9n9De1cypYIx; Sun, 31 Jan 2021 18:29:34 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by silver.osuosl.org (Postfix) with ESMTP id EABF22034F; Sun, 31 Jan 2021 18:29:33 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id B87F2C0FA7; Sun, 31 Jan 2021 18:29:33 +0000 (UTC) Received: from fraxinus.osuosl.org (smtp4.osuosl.org [140.211.166.137]) by lists.linuxfoundation.org (Postfix) with ESMTP id CE9DFC013A for ; Sun, 31 Jan 2021 18:29:31 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by fraxinus.osuosl.org (Postfix) with ESMTP id C1D22840BF for ; Sun, 31 Jan 2021 18:29:31 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from fraxinus.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id f2O9geGBFnCd for ; Sun, 31 Jan 2021 18:29:30 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by fraxinus.osuosl.org (Postfix) with ESMTPS id B3A9983742 for ; Sun, 31 Jan 2021 18:29:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1612117768; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=J/aN+VcFd0A+/O8Uby1eLbErmC7NfLDfVH8RGF6p+XM=; b=Ibg1OOyebU6DWiUbEjfGHGMXI9JfXy9INOi3RsKlhpH/Kf9zOD9auhkZjXKqvHxIPnpX1a pjnmIeTtA+X0ZvkSW17va2kAq9B2yTri9nXUBgC5QASYhY/MFnYvZc2G/bt7pryKJqCOjP ok6PWIwoXt9eeIxSVwJFq5wLAqPpAEs= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-153-AVhH2fj7OHmqo_Cz2tMkDA-1; Sun, 31 Jan 2021 13:29:23 -0500 X-MC-Unique: AVhH2fj7OHmqo_Cz2tMkDA-1 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 25356801817; Sun, 31 Jan 2021 18:29:20 +0000 (UTC) Received: from [10.36.114.62] (ovpn-114-62.ams2.redhat.com [10.36.114.62]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 41D046E405; Sun, 31 Jan 2021 18:29:12 +0000 (UTC) Subject: Re: [PATCH v12 10/10] iommu/arm-smmu-v3: Add stall support for platform devices To: Jean-Philippe Brucker , joro@8bytes.org, will@kernel.org References: <20210127154322.3959196-1-jean-philippe@linaro.org> <20210127154322.3959196-11-jean-philippe@linaro.org> From: Auger Eric Message-ID: <0c609eeb-00b0-7573-fed7-5bc1e6c0b0d1@redhat.com> Date: Sun, 31 Jan 2021 19:29:09 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.5.0 MIME-Version: 1.0 In-Reply-To: <20210127154322.3959196-11-jean-philippe@linaro.org> Content-Language: en-US X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 Cc: devicetree@vger.kernel.org, kevin.tian@intel.com, vivek.gautam@arm.com, guohanjun@huawei.com, rjw@rjwysocki.net, linux-acpi@vger.kernel.org, iommu@lists.linux-foundation.org, robh+dt@kernel.org, linux-accelerators@lists.ozlabs.org, sudeep.holla@arm.com, zhangfei.gao@linaro.org, robin.murphy@arm.com, linux-arm-kernel@lists.infradead.org, lenb@kernel.org 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" SGkgSmVhbiwKClNvbWUgcmF0aGVyIG1pbm9yIGNvbW1lbnRzwqdxdWVzdGlvbnMgYmVsb3cgdGhh dCBtYXkgbm90IGp1c3RpZnkgYSByZXNwaW4uCgpPbiAxLzI3LzIxIDQ6NDMgUE0sIEplYW4tUGhp bGlwcGUgQnJ1Y2tlciB3cm90ZToKPiBUaGUgU01NVSBwcm92aWRlcyBhIFN0YWxsIG1vZGVsIGZv ciBoYW5kbGluZyBwYWdlIGZhdWx0cyBpbiBwbGF0Zm9ybQo+IGRldmljZXMuIEl0IGlzIHNpbWls YXIgdG8gUENJZSBQUkksIGJ1dCBkb2Vzbid0IHJlcXVpcmUgZGV2aWNlcyB0byBoYXZlCj4gdGhl aXIgb3duIHRyYW5zbGF0aW9uIGNhY2hlLiBJbnN0ZWFkLCBmYXVsdGluZyB0cmFuc2FjdGlvbnMg YXJlIHBhcmtlZAo+IGFuZCB0aGUgT1MgaXMgZ2l2ZW4gYSBjaGFuY2UgdG8gZml4IHRoZSBwYWdl IHRhYmxlcyBhbmQgcmV0cnkgdGhlCj4gdHJhbnNhY3Rpb24uCj4gCj4gRW5hYmxlIHN0YWxsIGZv ciBkZXZpY2VzIHRoYXQgc3VwcG9ydCBpdCAob3B0LWluIGJ5IGZpcm13YXJlKS4gV2hlbiBhbgo+ IGV2ZW50IGNvcnJlc3BvbmRzIHRvIGEgdHJhbnNsYXRpb24gZXJyb3IsIGNhbGwgdGhlIElPTU1V IGZhdWx0IGhhbmRsZXIuCj4gSWYgdGhlIGZhdWx0IGlzIHJlY292ZXJhYmxlLCBpdCB3aWxsIGNh bGwgdXMgYmFjayB0byB0ZXJtaW5hdGUgb3IKPiBjb250aW51ZSB0aGUgc3RhbGwuCj4gCj4gVG8g dXNlIHN0YWxsIGRldmljZSBkcml2ZXJzIG5lZWQgdG8gZW5hYmxlIElPTU1VX0RFVl9GRUFUX0lP UEYsIHdoaWNoCj4gaW5pdGlhbGl6ZXMgdGhlIGZhdWx0IHF1ZXVlIGZvciB0aGUgZGV2aWNlLgo+ IAo+IFRlc3RlZC1ieTogWmhhbmdmZWkgR2FvIDx6aGFuZ2ZlaS5nYW9AbGluYXJvLm9yZz4KPiBS ZXZpZXdlZC1ieTogSm9uYXRoYW4gQ2FtZXJvbiA8Sm9uYXRoYW4uQ2FtZXJvbkBodWF3ZWkuY29t Pgo+IFNpZ25lZC1vZmYtYnk6IEplYW4tUGhpbGlwcGUgQnJ1Y2tlciA8amVhbi1waGlsaXBwZUBs aW5hcm8ub3JnPgo+IC0tLQo+ICBkcml2ZXJzL2lvbW11L2FybS9hcm0tc21tdS12My9hcm0tc21t dS12My5oICAgfCAgNDMgKysrKwo+ICAuLi4vaW9tbXUvYXJtL2FybS1zbW11LXYzL2FybS1zbW11 LXYzLXN2YS5jICAgfCAgNTkgKysrKystCj4gIGRyaXZlcnMvaW9tbXUvYXJtL2FybS1zbW11LXYz L2FybS1zbW11LXYzLmMgICB8IDE4OSArKysrKysrKysrKysrKysrKy0KPiAgMyBmaWxlcyBjaGFu Z2VkLCAyNzYgaW5zZXJ0aW9ucygrKSwgMTUgZGVsZXRpb25zKC0pCj4gCj4gZGlmZiAtLWdpdCBh L2RyaXZlcnMvaW9tbXUvYXJtL2FybS1zbW11LXYzL2FybS1zbW11LXYzLmggYi9kcml2ZXJzL2lv bW11L2FybS9hcm0tc21tdS12My9hcm0tc21tdS12My5oCj4gaW5kZXggN2IxNWI3NTgwYzZlLi41 OWFmMGJiZDJmN2IgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9pb21tdS9hcm0vYXJtLXNtbXUtdjMv YXJtLXNtbXUtdjMuaAo+ICsrKyBiL2RyaXZlcnMvaW9tbXUvYXJtL2FybS1zbW11LXYzL2FybS1z bW11LXYzLmgKPiBAQCAtMzU0LDYgKzM1NCwxMyBAQAo+ICAjZGVmaW5lIENNRFFfUFJJXzFfR1JQ SUQJCUdFTk1BU0tfVUxMKDgsIDApCj4gICNkZWZpbmUgQ01EUV9QUklfMV9SRVNQCQkJR0VOTUFT S19VTEwoMTMsIDEyKQo+ICAKPiArI2RlZmluZSBDTURRX1JFU1VNRV8wX1JFU1BfVEVSTQkJMFVM Cj4gKyNkZWZpbmUgQ01EUV9SRVNVTUVfMF9SRVNQX1JFVFJZCTFVTAo+ICsjZGVmaW5lIENNRFFf UkVTVU1FXzBfUkVTUF9BQk9SVAkyVUwKPiArI2RlZmluZSBDTURRX1JFU1VNRV8wX1JFU1AJCUdF Tk1BU0tfVUxMKDEzLCAxMikKPiArI2RlZmluZSBDTURRX1JFU1VNRV8wX1NJRAkJR0VOTUFTS19V TEwoNjMsIDMyKQo+ICsjZGVmaW5lIENNRFFfUkVTVU1FXzFfU1RBRwkJR0VOTUFTS19VTEwoMTUs IDApCj4gKwo+ICAjZGVmaW5lIENNRFFfU1lOQ18wX0NTCQkJR0VOTUFTS19VTEwoMTMsIDEyKQo+ ICAjZGVmaW5lIENNRFFfU1lOQ18wX0NTX05PTkUJCTAKPiAgI2RlZmluZSBDTURRX1NZTkNfMF9D U19JUlEJCTEKPiBAQCAtMzcwLDYgKzM3NywyNSBAQAo+ICAKPiAgI2RlZmluZSBFVlRRXzBfSUQJ CQlHRU5NQVNLX1VMTCg3LCAwKQo+ICAKPiArI2RlZmluZSBFVlRfSURfVFJBTlNMQVRJT05fRkFV TFQJMHgxMAo+ICsjZGVmaW5lIEVWVF9JRF9BRERSX1NJWkVfRkFVTFQJCTB4MTEKPiArI2RlZmlu ZSBFVlRfSURfQUNDRVNTX0ZBVUxUCQkweDEyCj4gKyNkZWZpbmUgRVZUX0lEX1BFUk1JU1NJT05f RkFVTFQJCTB4MTMKPiArCj4gKyNkZWZpbmUgRVZUUV8wX1NTVgkJCSgxVUwgPDwgMTEpCj4gKyNk ZWZpbmUgRVZUUV8wX1NTSUQJCQlHRU5NQVNLX1VMTCgzMSwgMTIpCj4gKyNkZWZpbmUgRVZUUV8w X1NJRAkJCUdFTk1BU0tfVUxMKDYzLCAzMikKPiArI2RlZmluZSBFVlRRXzFfU1RBRwkJCUdFTk1B U0tfVUxMKDE1LCAwKQo+ICsjZGVmaW5lIEVWVFFfMV9TVEFMTAkJCSgxVUwgPDwgMzEpCj4gKyNk ZWZpbmUgRVZUUV8xX1BuVQkJCSgxVUwgPDwgMzMpCj4gKyNkZWZpbmUgRVZUUV8xX0luRAkJCSgx VUwgPDwgMzQpCj4gKyNkZWZpbmUgRVZUUV8xX1JuVwkJCSgxVUwgPDwgMzUpCj4gKyNkZWZpbmUg RVZUUV8xX1MyCQkJKDFVTCA8PCAzOSkKPiArI2RlZmluZSBFVlRRXzFfQ0xBU1MJCQlHRU5NQVNL X1VMTCg0MSwgNDApCj4gKyNkZWZpbmUgRVZUUV8xX1RUX1JFQUQJCQkoMVVMIDw8IDQ0KQo+ICsj ZGVmaW5lIEVWVFFfMl9BRERSCQkJR0VOTUFTS19VTEwoNjMsIDApCj4gKyNkZWZpbmUgRVZUUV8z X0lQQQkJCUdFTk1BU0tfVUxMKDUxLCAxMikKPiArCj4gIC8qIFBSSSBxdWV1ZSAqLwo+ICAjZGVm aW5lIFBSSVFfRU5UX1NaX1NISUZUCQk0Cj4gICNkZWZpbmUgUFJJUV9FTlRfRFdPUkRTCQkJKCgx IDw8IFBSSVFfRU5UX1NaX1NISUZUKSA+PiAzKQo+IEBAIC00NjQsNiArNDkwLDEzIEBAIHN0cnVj dCBhcm1fc21tdV9jbWRxX2VudCB7Cj4gIAkJCWVudW0gcHJpX3Jlc3AJCXJlc3A7Cj4gIAkJfSBw cmk7Cj4gIAo+ICsJCSNkZWZpbmUgQ01EUV9PUF9SRVNVTUUJCTB4NDQKPiArCQlzdHJ1Y3Qgewo+ ICsJCQl1MzIJCQlzaWQ7Cj4gKwkJCXUxNgkJCXN0YWc7Cj4gKwkJCXU4CQkJcmVzcDsKPiArCQl9 IHJlc3VtZTsKPiArCj4gIAkJI2RlZmluZSBDTURRX09QX0NNRF9TWU5DCTB4NDYKPiAgCQlzdHJ1 Y3Qgewo+ICAJCQl1NjQJCQltc2lhZGRyOwo+IEBAIC01MjIsNiArNTU1LDcgQEAgc3RydWN0IGFy bV9zbW11X2NtZHFfYmF0Y2ggewo+ICAKPiAgc3RydWN0IGFybV9zbW11X2V2dHEgewo+ICAJc3Ry dWN0IGFybV9zbW11X3F1ZXVlCQlxOwo+ICsJc3RydWN0IGlvcGZfcXVldWUJCSppb3BmOwo+ICAJ dTMyCQkJCW1heF9zdGFsbHM7Cj4gIH07Cj4gIAo+IEBAIC02NTksNyArNjkzLDkgQEAgc3RydWN0 IGFybV9zbW11X21hc3RlciB7Cj4gIAlzdHJ1Y3QgYXJtX3NtbXVfc3RyZWFtCQkqc3RyZWFtczsK PiAgCXVuc2lnbmVkIGludAkJCW51bV9zdHJlYW1zOwo+ICAJYm9vbAkJCQlhdHNfZW5hYmxlZDsK PiArCWJvb2wJCQkJc3RhbGxfZW5hYmxlZDsKPiAgCWJvb2wJCQkJc3ZhX2VuYWJsZWQ7Cj4gKwli b29sCQkJCWlvcGZfZW5hYmxlZDsKPiAgCXN0cnVjdCBsaXN0X2hlYWQJCWJvbmRzOwo+ICAJdW5z aWduZWQgaW50CQkJc3NpZF9iaXRzOwo+ICB9Owo+IEBAIC02NzgsNiArNzE0LDcgQEAgc3RydWN0 IGFybV9zbW11X2RvbWFpbiB7Cj4gIAo+ICAJc3RydWN0IGlvX3BndGFibGVfb3BzCQkqcGd0Ymxf b3BzOwo+ICAJYm9vbAkJCQlub25fc3RyaWN0Owo+ICsJYm9vbAkJCQlzdGFsbF9lbmFibGVkOwo+ ICAJYXRvbWljX3QJCQlucl9hdHNfbWFzdGVyczsKPiAgCj4gIAllbnVtIGFybV9zbW11X2RvbWFp bl9zdGFnZQlzdGFnZTsKPiBAQCAtNzE5LDYgKzc1Niw3IEBAIGJvb2wgYXJtX3NtbXVfbWFzdGVy X3N2YV9zdXBwb3J0ZWQoc3RydWN0IGFybV9zbW11X21hc3RlciAqbWFzdGVyKTsKPiAgYm9vbCBh cm1fc21tdV9tYXN0ZXJfc3ZhX2VuYWJsZWQoc3RydWN0IGFybV9zbW11X21hc3RlciAqbWFzdGVy KTsKPiAgaW50IGFybV9zbW11X21hc3Rlcl9lbmFibGVfc3ZhKHN0cnVjdCBhcm1fc21tdV9tYXN0 ZXIgKm1hc3Rlcik7Cj4gIGludCBhcm1fc21tdV9tYXN0ZXJfZGlzYWJsZV9zdmEoc3RydWN0IGFy bV9zbW11X21hc3RlciAqbWFzdGVyKTsKPiArYm9vbCBhcm1fc21tdV9tYXN0ZXJfaW9wZl9zdXBw b3J0ZWQoc3RydWN0IGFybV9zbW11X21hc3RlciAqbWFzdGVyKTsKPiAgc3RydWN0IGlvbW11X3N2 YSAqYXJtX3NtbXVfc3ZhX2JpbmQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgbW1fc3RydWN0 ICptbSwKPiAgCQkJCSAgICB2b2lkICpkcnZkYXRhKTsKPiAgdm9pZCBhcm1fc21tdV9zdmFfdW5i aW5kKHN0cnVjdCBpb21tdV9zdmEgKmhhbmRsZSk7Cj4gQEAgLTc1MCw2ICs3ODgsMTEgQEAgc3Rh dGljIGlubGluZSBpbnQgYXJtX3NtbXVfbWFzdGVyX2Rpc2FibGVfc3ZhKHN0cnVjdCBhcm1fc21t dV9tYXN0ZXIgKm1hc3RlcikKPiAgCXJldHVybiAtRU5PREVWOwo+ICB9Cj4gIAo+ICtzdGF0aWMg aW5saW5lIGJvb2wgYXJtX3NtbXVfbWFzdGVyX2lvcGZfc3VwcG9ydGVkKHN0cnVjdCBhcm1fc21t dV9tYXN0ZXIgKm1hc3RlcikKPiArewo+ICsJcmV0dXJuIGZhbHNlOwo+ICt9Cj4gKwo+ICBzdGF0 aWMgaW5saW5lIHN0cnVjdCBpb21tdV9zdmEgKgo+ICBhcm1fc21tdV9zdmFfYmluZChzdHJ1Y3Qg ZGV2aWNlICpkZXYsIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB2b2lkICpkcnZkYXRhKQo+ICB7Cj4g ZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW9tbXUvYXJtL2FybS1zbW11LXYzL2FybS1zbW11LXYzLXN2 YS5jIGIvZHJpdmVycy9pb21tdS9hcm0vYXJtLXNtbXUtdjMvYXJtLXNtbXUtdjMtc3ZhLmMKPiBp bmRleCBiYjI1MWNhYjYxZjMuLmVlNjZkMWY0Y2I4MSAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2lv bW11L2FybS9hcm0tc21tdS12My9hcm0tc21tdS12My1zdmEuYwo+ICsrKyBiL2RyaXZlcnMvaW9t bXUvYXJtL2FybS1zbW11LXYzL2FybS1zbW11LXYzLXN2YS5jCj4gQEAgLTQzNSw5ICs0MzUsMTMg QEAgYm9vbCBhcm1fc21tdV9zdmFfc3VwcG9ydGVkKHN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNt bXUpCj4gIAlyZXR1cm4gdHJ1ZTsKPiAgfQo+ICAKPiAtc3RhdGljIGJvb2wgYXJtX3NtbXVfaW9w Zl9zdXBwb3J0ZWQoc3RydWN0IGFybV9zbW11X21hc3RlciAqbWFzdGVyKQo+ICtib29sIGFybV9z bW11X21hc3Rlcl9pb3BmX3N1cHBvcnRlZChzdHJ1Y3QgYXJtX3NtbXVfbWFzdGVyICptYXN0ZXIp Cj4gIHsKPiAtCXJldHVybiBmYWxzZTsKPiArCS8qIFdlJ3JlIG5vdCBrZWVwaW5nIHRyYWNrIG9m IFNJRHMgaW4gZmF1bHQgZXZlbnRzICovCnNoYWxsIHdlPyBbKl0gYmVsb3cKPiArCWlmIChtYXN0 ZXItPm51bV9zdHJlYW1zICE9IDEpCj4gKwkJcmV0dXJuIGZhbHNlOwo+ICsKPiArCXJldHVybiBt YXN0ZXItPnN0YWxsX2VuYWJsZWQ7Cj4gIH0KPiAgCj4gIGJvb2wgYXJtX3NtbXVfbWFzdGVyX3N2 YV9zdXBwb3J0ZWQoc3RydWN0IGFybV9zbW11X21hc3RlciAqbWFzdGVyKQo+IEBAIC00NDUsOCAr NDQ5LDggQEAgYm9vbCBhcm1fc21tdV9tYXN0ZXJfc3ZhX3N1cHBvcnRlZChzdHJ1Y3QgYXJtX3Nt bXVfbWFzdGVyICptYXN0ZXIpCj4gIAlpZiAoIShtYXN0ZXItPnNtbXUtPmZlYXR1cmVzICYgQVJN X1NNTVVfRkVBVF9TVkEpKQo+ICAJCXJldHVybiBmYWxzZTsKPiAgCj4gLQkvKiBTU0lEIGFuZCBJ T1BGIHN1cHBvcnQgYXJlIG1hbmRhdG9yeSBmb3IgdGhlIG1vbWVudCAqLwo+IC0JcmV0dXJuIG1h c3Rlci0+c3NpZF9iaXRzICYmIGFybV9zbW11X2lvcGZfc3VwcG9ydGVkKG1hc3Rlcik7Cj4gKwkv KiBTU0lEIHN1cHBvcnQgaXMgbWFuZGF0b3J5IGZvciB0aGUgbW9tZW50ICovCj4gKwlyZXR1cm4g bWFzdGVyLT5zc2lkX2JpdHM7Cj4gIH0KPiAgCj4gIGJvb2wgYXJtX3NtbXVfbWFzdGVyX3N2YV9l bmFibGVkKHN0cnVjdCBhcm1fc21tdV9tYXN0ZXIgKm1hc3RlcikKPiBAQCAtNDU5LDEzICs0NjMs NTUgQEAgYm9vbCBhcm1fc21tdV9tYXN0ZXJfc3ZhX2VuYWJsZWQoc3RydWN0IGFybV9zbW11X21h c3RlciAqbWFzdGVyKQo+ICAJcmV0dXJuIGVuYWJsZWQ7Cj4gIH0KPiAgCj4gK3N0YXRpYyBpbnQg YXJtX3NtbXVfbWFzdGVyX3N2YV9lbmFibGVfaW9wZihzdHJ1Y3QgYXJtX3NtbXVfbWFzdGVyICpt YXN0ZXIpCj4gK3sKPiArCWludCByZXQ7Cj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBtYXN0ZXIt PmRldjsKPiArCj4gKwkvKgo+ICsJICogRHJpdmVycyBmb3IgZGV2aWNlcyBzdXBwb3J0aW5nIFBS SSBvciBzdGFsbCBzaG91bGQgZW5hYmxlIElPUEYgZmlyc3QuCj4gKwkgKiBPdGhlcnMgaGF2ZSBk ZXZpY2Utc3BlY2lmaWMgZmF1bHQgaGFuZGxlcnMgYW5kIGRvbid0IG5lZWQgSU9QRi4KPiArCSAq Lwo+ICsJaWYgKCFhcm1fc21tdV9tYXN0ZXJfaW9wZl9zdXBwb3J0ZWQobWFzdGVyKSkKPiArCQly ZXR1cm4gMDsKPiArCj4gKwlpZiAoIW1hc3Rlci0+aW9wZl9lbmFibGVkKQo+ICsJCXJldHVybiAt RUlOVkFMOwo+ICsKPiArCXJldCA9IGlvcGZfcXVldWVfYWRkX2RldmljZShtYXN0ZXItPnNtbXUt PmV2dHEuaW9wZiwgZGV2KTsKPiArCWlmIChyZXQpCj4gKwkJcmV0dXJuIHJldDsKPiArCj4gKwly ZXQgPSBpb21tdV9yZWdpc3Rlcl9kZXZpY2VfZmF1bHRfaGFuZGxlcihkZXYsIGlvbW11X3F1ZXVl X2lvcGYsIGRldik7Cj4gKwlpZiAocmV0KSB7Cj4gKwkJaW9wZl9xdWV1ZV9yZW1vdmVfZGV2aWNl KG1hc3Rlci0+c21tdS0+ZXZ0cS5pb3BmLCBkZXYpOwo+ICsJCXJldHVybiByZXQ7Cj4gKwl9Cj4g KwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgYXJtX3NtbXVfbWFzdGVyX3N2YV9k aXNhYmxlX2lvcGYoc3RydWN0IGFybV9zbW11X21hc3RlciAqbWFzdGVyKQo+ICt7Cj4gKwlzdHJ1 Y3QgZGV2aWNlICpkZXYgPSBtYXN0ZXItPmRldjsKPiArCj4gKwlpZiAoIW1hc3Rlci0+aW9wZl9l bmFibGVkKQo+ICsJCXJldHVybjsKPiArCj4gKwlpb21tdV91bnJlZ2lzdGVyX2RldmljZV9mYXVs dF9oYW5kbGVyKGRldik7Cj4gKwlpb3BmX3F1ZXVlX3JlbW92ZV9kZXZpY2UobWFzdGVyLT5zbW11 LT5ldnRxLmlvcGYsIGRldik7Cj4gK30KPiArCj4gIGludCBhcm1fc21tdV9tYXN0ZXJfZW5hYmxl X3N2YShzdHJ1Y3QgYXJtX3NtbXVfbWFzdGVyICptYXN0ZXIpCj4gIHsKPiArCWludCByZXQ7Cj4g Kwo+ICAJbXV0ZXhfbG9jaygmc3ZhX2xvY2spOwo+IC0JbWFzdGVyLT5zdmFfZW5hYmxlZCA9IHRy dWU7Cj4gKwlyZXQgPSBhcm1fc21tdV9tYXN0ZXJfc3ZhX2VuYWJsZV9pb3BmKG1hc3Rlcik7Cj4g KwlpZiAoIXJldCkKPiArCQltYXN0ZXItPnN2YV9lbmFibGVkID0gdHJ1ZTsKPiAgCW11dGV4X3Vu bG9jaygmc3ZhX2xvY2spOwo+ICAKPiAtCXJldHVybiAwOwo+ICsJcmV0dXJuIHJldDsKPiAgfQo+ ICAKPiAgaW50IGFybV9zbW11X21hc3Rlcl9kaXNhYmxlX3N2YShzdHJ1Y3QgYXJtX3NtbXVfbWFz dGVyICptYXN0ZXIpCj4gQEAgLTQ3Niw2ICs1MjIsNyBAQCBpbnQgYXJtX3NtbXVfbWFzdGVyX2Rp c2FibGVfc3ZhKHN0cnVjdCBhcm1fc21tdV9tYXN0ZXIgKm1hc3RlcikKPiAgCQltdXRleF91bmxv Y2soJnN2YV9sb2NrKTsKPiAgCQlyZXR1cm4gLUVCVVNZOwo+ICAJfQo+ICsJYXJtX3NtbXVfbWFz dGVyX3N2YV9kaXNhYmxlX2lvcGYobWFzdGVyKTsKPiAgCW1hc3Rlci0+c3ZhX2VuYWJsZWQgPSBm YWxzZTsKPiAgCW11dGV4X3VubG9jaygmc3ZhX2xvY2spOwo+ICAKPiBkaWZmIC0tZ2l0IGEvZHJp dmVycy9pb21tdS9hcm0vYXJtLXNtbXUtdjMvYXJtLXNtbXUtdjMuYyBiL2RyaXZlcnMvaW9tbXUv YXJtL2FybS1zbW11LXYzL2FybS1zbW11LXYzLmMKPiBpbmRleCAzYWZlYzZlZDgwNzUuLjc2YjIz MDZkZGZmNiAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2lvbW11L2FybS9hcm0tc21tdS12My9hcm0t c21tdS12My5jCj4gKysrIGIvZHJpdmVycy9pb21tdS9hcm0vYXJtLXNtbXUtdjMvYXJtLXNtbXUt djMuYwo+IEBAIC0zMiw2ICszMiw3IEBACj4gICNpbmNsdWRlIDxsaW51eC9hbWJhL2J1cy5oPgo+ ICAKPiAgI2luY2x1ZGUgImFybS1zbW11LXYzLmgiCj4gKyNpbmNsdWRlICIuLi8uLi9pb21tdS1z dmEtbGliLmgiCj4gIAo+ICBzdGF0aWMgYm9vbCBkaXNhYmxlX2J5cGFzcyA9IHRydWU7Cj4gIG1v ZHVsZV9wYXJhbShkaXNhYmxlX2J5cGFzcywgYm9vbCwgMDQ0NCk7Cj4gQEAgLTMxNSw2ICszMTYs MTEgQEAgc3RhdGljIGludCBhcm1fc21tdV9jbWRxX2J1aWxkX2NtZCh1NjQgKmNtZCwgc3RydWN0 IGFybV9zbW11X2NtZHFfZW50ICplbnQpCj4gIAkJfQo+ICAJCWNtZFsxXSB8PSBGSUVMRF9QUkVQ KENNRFFfUFJJXzFfUkVTUCwgZW50LT5wcmkucmVzcCk7Cj4gIAkJYnJlYWs7Cj4gKwljYXNlIENN RFFfT1BfUkVTVU1FOgo+ICsJCWNtZFswXSB8PSBGSUVMRF9QUkVQKENNRFFfUkVTVU1FXzBfU0lE LCBlbnQtPnJlc3VtZS5zaWQpOwo+ICsJCWNtZFswXSB8PSBGSUVMRF9QUkVQKENNRFFfUkVTVU1F XzBfUkVTUCwgZW50LT5yZXN1bWUucmVzcCk7Cj4gKwkJY21kWzFdIHw9IEZJRUxEX1BSRVAoQ01E UV9SRVNVTUVfMV9TVEFHLCBlbnQtPnJlc3VtZS5zdGFnKTsKPiArCQlicmVhazsKPiAgCWNhc2Ug Q01EUV9PUF9DTURfU1lOQzoKPiAgCQlpZiAoZW50LT5zeW5jLm1zaWFkZHIpIHsKPiAgCQkJY21k WzBdIHw9IEZJRUxEX1BSRVAoQ01EUV9TWU5DXzBfQ1MsIENNRFFfU1lOQ18wX0NTX0lSUSk7Cj4g QEAgLTg3OCw2ICs4ODQsNDQgQEAgc3RhdGljIGludCBhcm1fc21tdV9jbWRxX2JhdGNoX3N1Ym1p dChzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11LAo+ICAJcmV0dXJuIGFybV9zbW11X2NtZHFf aXNzdWVfY21kbGlzdChzbW11LCBjbWRzLT5jbWRzLCBjbWRzLT5udW0sIHRydWUpOwo+ICB9Cj4g IAo+ICtzdGF0aWMgaW50IGFybV9zbW11X3BhZ2VfcmVzcG9uc2Uoc3RydWN0IGRldmljZSAqZGV2 LAo+ICsJCQkJICBzdHJ1Y3QgaW9tbXVfZmF1bHRfZXZlbnQgKnVudXNlZCwKPiArCQkJCSAgc3Ry dWN0IGlvbW11X3BhZ2VfcmVzcG9uc2UgKnJlc3ApCj4gK3sKPiArCXN0cnVjdCBhcm1fc21tdV9j bWRxX2VudCBjbWQgPSB7MH07Cj4gKwlzdHJ1Y3QgYXJtX3NtbXVfbWFzdGVyICptYXN0ZXIgPSBk ZXZfaW9tbXVfcHJpdl9nZXQoZGV2KTsKPiArCWludCBzaWQgPSBtYXN0ZXItPnN0cmVhbXNbMF0u aWQ7ClsqXQo+ICsKPiArCWlmIChtYXN0ZXItPnN0YWxsX2VuYWJsZWQpIHsKPiArCQljbWQub3Bj b2RlCQk9IENNRFFfT1BfUkVTVU1FOwo+ICsJCWNtZC5yZXN1bWUuc2lkCQk9IHNpZDsKPiArCQlj bWQucmVzdW1lLnN0YWcJCT0gcmVzcC0+Z3JwaWQ7Cj4gKwkJc3dpdGNoIChyZXNwLT5jb2RlKSB7 Cj4gKwkJY2FzZSBJT01NVV9QQUdFX1JFU1BfSU5WQUxJRDoKYWRkIGZhbGx0aHJvdWdoPwo+ICsJ CWNhc2UgSU9NTVVfUEFHRV9SRVNQX0ZBSUxVUkU6Cj4gKwkJCWNtZC5yZXN1bWUucmVzcCA9IENN RFFfUkVTVU1FXzBfUkVTUF9BQk9SVDsKPiArCQkJYnJlYWs7Cj4gKwkJY2FzZSBJT01NVV9QQUdF X1JFU1BfU1VDQ0VTUzoKPiArCQkJY21kLnJlc3VtZS5yZXNwID0gQ01EUV9SRVNVTUVfMF9SRVNQ X1JFVFJZOwo+ICsJCQlicmVhazsKPiArCQlkZWZhdWx0Ogo+ICsJCQlyZXR1cm4gLUVJTlZBTDsK PiArCQl9Cj4gKwl9IGVsc2Ugewo+ICsJCXJldHVybiAtRU5PREVWOwo+ICsJfQo+ICsKPiArCWFy bV9zbW11X2NtZHFfaXNzdWVfY21kKG1hc3Rlci0+c21tdSwgJmNtZCk7Cj4gKwkvKgo+ICsJICog RG9uJ3Qgc2VuZCBhIFNZTkMsIGl0IGRvZXNuJ3QgZG8gYW55dGhpbmcgZm9yIFJFU1VNRSBvciBQ UklfUkVTUC4KPiArCSAqIFJFU1VNRSBjb25zdW1wdGlvbiBndWFyYW50ZWVzIHRoYXQgdGhlIHN0 YWxsZWQgdHJhbnNhY3Rpb24gd2lsbCBiZQo+ICsJICogdGVybWluYXRlZC4uLiBhdCBzb21lIHBv aW50IGluIHRoZSBmdXR1cmUuIFBSSV9SRVNQIGlzIGZpcmUgYW5kCj4gKwkgKiBmb3JnZXQuCj4g KwkgKi8KPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiAgLyogQ29udGV4dCBkZXNjcmlwdG9y IG1hbmlwdWxhdGlvbiBmdW5jdGlvbnMgKi8KPiAgdm9pZCBhcm1fc21tdV90bGJfaW52X2FzaWQo c3RydWN0IGFybV9zbW11X2RldmljZSAqc21tdSwgdTE2IGFzaWQpCj4gIHsKPiBAQCAtOTg4LDcg KzEwMzIsNiBAQCBpbnQgYXJtX3NtbXVfd3JpdGVfY3R4X2Rlc2Moc3RydWN0IGFybV9zbW11X2Rv bWFpbiAqc21tdV9kb21haW4sIGludCBzc2lkLAo+ICAJdTY0IHZhbDsKPiAgCWJvb2wgY2RfbGl2 ZTsKPiAgCV9fbGU2NCAqY2RwdHI7Cj4gLQlzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11ID0g c21tdV9kb21haW4tPnNtbXU7Cj4gIAo+ICAJaWYgKFdBUk5fT04oc3NpZCA+PSAoMSA8PCBzbW11 X2RvbWFpbi0+czFfY2ZnLnMxY2RtYXgpKSkKPiAgCQlyZXR1cm4gLUUyQklHOwo+IEBAIC0xMDMz LDggKzEwNzYsNyBAQCBpbnQgYXJtX3NtbXVfd3JpdGVfY3R4X2Rlc2Moc3RydWN0IGFybV9zbW11 X2RvbWFpbiAqc21tdV9kb21haW4sIGludCBzc2lkLAo+ICAJCQlGSUVMRF9QUkVQKENUWERFU0Nf Q0RfMF9BU0lELCBjZC0+YXNpZCkgfAo+ICAJCQlDVFhERVNDX0NEXzBfVjsKPiAgCj4gLQkJLyog U1RBTExfTU9ERUw9PTBiMTAgJiYgQ0QuUz09MCBpcyBJTExFR0FMICovCj4gLQkJaWYgKHNtbXUt PmZlYXR1cmVzICYgQVJNX1NNTVVfRkVBVF9TVEFMTF9GT1JDRSkKPiArCQlpZiAoc21tdV9kb21h aW4tPnN0YWxsX2VuYWJsZWQpCj4gIAkJCXZhbCB8PSBDVFhERVNDX0NEXzBfUzsKPiAgCX0KPiAg Cj4gQEAgLTEyNzgsNyArMTMyMCw3IEBAIHN0YXRpYyB2b2lkIGFybV9zbW11X3dyaXRlX3N0cnRh Yl9lbnQoc3RydWN0IGFybV9zbW11X21hc3RlciAqbWFzdGVyLCB1MzIgc2lkLAo+ICAJCQkgRklF TERfUFJFUChTVFJUQUJfU1RFXzFfU1RSVywgc3RydykpOwo+ICAKPiAgCQlpZiAoc21tdS0+ZmVh dHVyZXMgJiBBUk1fU01NVV9GRUFUX1NUQUxMUyAmJgo+IC0JCSAgICEoc21tdS0+ZmVhdHVyZXMg JiBBUk1fU01NVV9GRUFUX1NUQUxMX0ZPUkNFKSkKPiArCQkgICAgIW1hc3Rlci0+c3RhbGxfZW5h YmxlZCkKPiAgCQkJZHN0WzFdIHw9IGNwdV90b19sZTY0KFNUUlRBQl9TVEVfMV9TMVNUQUxMRCk7 Cj4gIAo+ICAJCXZhbCB8PSAoczFfY2ZnLT5jZGNmZy5jZHRhYl9kbWEgJiBTVFJUQUJfU1RFXzBf UzFDVFhQVFJfTUFTSykgfAo+IEBAIC0xMzU1LDcgKzEzOTcsNiBAQCBzdGF0aWMgaW50IGFybV9z bW11X2luaXRfbDJfc3RydGFiKHN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNtbXUsIHUzMiBzaWQp Cj4gIAlyZXR1cm4gMDsKPiAgfQo+ICAKPiAtX19tYXliZV91bnVzZWQKPiAgc3RhdGljIHN0cnVj dCBhcm1fc21tdV9tYXN0ZXIgKgo+ICBhcm1fc21tdV9maW5kX21hc3RlcihzdHJ1Y3QgYXJtX3Nt bXVfZGV2aWNlICpzbW11LCB1MzIgc2lkKQo+ICB7Cj4gQEAgLTEzODIsOSArMTQyMyw5NiBAQCBh cm1fc21tdV9maW5kX21hc3RlcihzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11LCB1MzIgc2lk KQo+ICB9Cj4gIAo+ICAvKiBJUlEgYW5kIGV2ZW50IGhhbmRsZXJzICovCj4gK3N0YXRpYyBpbnQg YXJtX3NtbXVfaGFuZGxlX2V2dChzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11LCB1NjQgKmV2 dCkKPiArewo+ICsJaW50IHJldDsKPiArCXUzMiByZWFzb247Cj4gKwl1MzIgcGVybSA9IDA7Cj4g KwlzdHJ1Y3QgYXJtX3NtbXVfbWFzdGVyICptYXN0ZXI7Cj4gKwlib29sIHNzaWRfdmFsaWQgPSBl dnRbMF0gJiBFVlRRXzBfU1NWOwo+ICsJdTMyIHNpZCA9IEZJRUxEX0dFVChFVlRRXzBfU0lELCBl dnRbMF0pOwo+ICsJc3RydWN0IGlvbW11X2ZhdWx0X2V2ZW50IGZhdWx0X2V2dCA9IHsgfTsKPiAr CXN0cnVjdCBpb21tdV9mYXVsdCAqZmx0ID0gJmZhdWx0X2V2dC5mYXVsdDsKPiArCj4gKwkvKiBT dGFnZS0yIGlzIGFsd2F5cyBwaW5uZWQgYXQgdGhlIG1vbWVudCAqLwo+ICsJaWYgKGV2dFsxXSAm IEVWVFFfMV9TMikKPiArCQlyZXR1cm4gLUVGQVVMVDsKPiArCj4gKwltYXN0ZXIgPSBhcm1fc21t dV9maW5kX21hc3RlcihzbW11LCBzaWQpOwo+ICsJaWYgKCFtYXN0ZXIpCj4gKwkJcmV0dXJuIC1F SU5WQUw7Cj4gKwo+ICsJaWYgKGV2dFsxXSAmIEVWVFFfMV9SblcpCj4gKwkJcGVybSB8PSBJT01N VV9GQVVMVF9QRVJNX1JFQUQ7Cj4gKwllbHNlCj4gKwkJcGVybSB8PSBJT01NVV9GQVVMVF9QRVJN X1dSSVRFOwo+ICsKPiArCWlmIChldnRbMV0gJiBFVlRRXzFfSW5EKQo+ICsJCXBlcm0gfD0gSU9N TVVfRkFVTFRfUEVSTV9FWEVDOwo+ICsKPiArCWlmIChldnRbMV0gJiBFVlRRXzFfUG5VKQo+ICsJ CXBlcm0gfD0gSU9NTVVfRkFVTFRfUEVSTV9QUklWOwo+ICsKPiArCXN3aXRjaCAoRklFTERfR0VU KEVWVFFfMF9JRCwgZXZ0WzBdKSkgewo+ICsJY2FzZSBFVlRfSURfVFJBTlNMQVRJT05fRkFVTFQ6 Cj4gKwljYXNlIEVWVF9JRF9BRERSX1NJWkVfRkFVTFQ6Cj4gKwljYXNlIEVWVF9JRF9BQ0NFU1Nf RkFVTFQ6Cj4gKwkJcmVhc29uID0gSU9NTVVfRkFVTFRfUkVBU09OX1BURV9GRVRDSDsKRG9lc24n dCBpdCByYXRoZXIgbWFwIHRvIElPTU1VX0ZBVUxUX1JFQVNPTl9BQ0NFU1M/Ci8qIGFjY2VzcyBm bGFnIGNoZWNrIGZhaWxlZCAqLyIKPiArCQlicmVhazsKPiArCWNhc2UgRVZUX0lEX1BFUk1JU1NJ T05fRkFVTFQ6Cj4gKwkJcmVhc29uID0gSU9NTVVfRkFVTFRfUkVBU09OX1BFUk1JU1NJT047Cj4g KwkJYnJlYWs7Cj4gKwlkZWZhdWx0Ogo+ICsJCXJldHVybiAtRU9QTk9UU1VQUDsKPiArCX0KPiAr Cj4gKwlpZiAoZXZ0WzFdICYgRVZUUV8xX1NUQUxMKSB7Cj4gKwkJZmx0LT50eXBlID0gSU9NTVVf RkFVTFRfUEFHRV9SRVE7Cj4gKwkJZmx0LT5wcm0gPSAoc3RydWN0IGlvbW11X2ZhdWx0X3BhZ2Vf cmVxdWVzdCkgewo+ICsJCQkuZmxhZ3MgPSBJT01NVV9GQVVMVF9QQUdFX1JFUVVFU1RfTEFTVF9Q QUdFLAo+ICsJCQkuZ3JwaWQgPSBGSUVMRF9HRVQoRVZUUV8xX1NUQUcsIGV2dFsxXSksCj4gKwkJ CS5wZXJtID0gcGVybSwKPiArCQkJLmFkZHIgPSBGSUVMRF9HRVQoRVZUUV8yX0FERFIsIGV2dFsy XSksCj4gKwkJfTsKPiArCj4gKwkJaWYgKHNzaWRfdmFsaWQpIHsKPiArCQkJZmx0LT5wcm0uZmxh Z3MgfD0gSU9NTVVfRkFVTFRfUEFHRV9SRVFVRVNUX1BBU0lEX1ZBTElEOwo+ICsJCQlmbHQtPnBy bS5wYXNpZCA9IEZJRUxEX0dFVChFVlRRXzBfU1NJRCwgZXZ0WzBdKTsKPiArCQl9Cj4gKwl9IGVs c2Ugewo+ICsJCWZsdC0+dHlwZSA9IElPTU1VX0ZBVUxUX0RNQV9VTlJFQ09WOwo+ICsJCWZsdC0+ ZXZlbnQgPSAoc3RydWN0IGlvbW11X2ZhdWx0X3VucmVjb3ZlcmFibGUpIHsKPiArCQkJLnJlYXNv biA9IHJlYXNvbiwKPiArCQkJLmZsYWdzID0gSU9NTVVfRkFVTFRfVU5SRUNPVl9BRERSX1ZBTElE IHwKPiArCQkJCSBJT01NVV9GQVVMVF9VTlJFQ09WX0ZFVENIX0FERFJfVkFMSUQsCm5pdDogc2hh bGwgSU9NTVVfRkFVTFRfVU5SRUNPVl9GRVRDSF9BRERSX1ZBTElEIGJlIHNldCBoZXJlPyBTdXBw b3J0ZWQKdW5yZWNvdmVyYWJsZSBmYXVsdHMgZmVhdHVyZSB0aGUgSVBBIGZpZWxkIHdoaWNoIGlz IFVOS05PV04gZm9yIFMxCnRyYW5zbGF0aW9ucy4gZmV0Y2hfYWRkciByYXRoZXIgd2FzCmNvcnJl c3BvbmRpbmcgdG8gV0FMS19FQUJULkZldGNoX2FkZHIgdG8gbWUuCgo+ICsJCQkucGVybSA9IHBl cm0sCj4gKwkJCS5hZGRyID0gRklFTERfR0VUKEVWVFFfMl9BRERSLCBldnRbMl0pLAo+ICsJCQku ZmV0Y2hfYWRkciA9IEZJRUxEX0dFVChFVlRRXzNfSVBBLCBldnRbM10pLAo+ICsJCX07Cj4gKwo+ ICsJCWlmIChzc2lkX3ZhbGlkKSB7Cj4gKwkJCWZsdC0+ZXZlbnQuZmxhZ3MgfD0gSU9NTVVfRkFV TFRfVU5SRUNPVl9QQVNJRF9WQUxJRDsKPiArCQkJZmx0LT5ldmVudC5wYXNpZCA9IEZJRUxEX0dF VChFVlRRXzBfU1NJRCwgZXZ0WzBdKTsKPiArCQl9Cj4gKwl9Cj4gKwo+ICsJcmV0ID0gaW9tbXVf cmVwb3J0X2RldmljZV9mYXVsdChtYXN0ZXItPmRldiwgJmZhdWx0X2V2dCk7Cj4gKwlpZiAocmV0 ICYmIGZsdC0+dHlwZSA9PSBJT01NVV9GQVVMVF9QQUdFX1JFUSkgewo+ICsJCS8qIE5vYm9keSBj YXJlZCwgYWJvcnQgdGhlIGFjY2VzcyAqLwo+ICsJCXN0cnVjdCBpb21tdV9wYWdlX3Jlc3BvbnNl IHJlc3AgPSB7Cj4gKwkJCS5wYXNpZAkJPSBmbHQtPnBybS5wYXNpZCwKPiArCQkJLmdycGlkCQk9 IGZsdC0+cHJtLmdycGlkLAo+ICsJCQkuY29kZQkJPSBJT01NVV9QQUdFX1JFU1BfRkFJTFVSRSwK PiArCQl9Owo+ICsJCWFybV9zbW11X3BhZ2VfcmVzcG9uc2UobWFzdGVyLT5kZXYsICZmYXVsdF9l dnQsICZyZXNwKTsKPiArCX0KPiArCj4gKwlyZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICBzdGF0aWMg aXJxcmV0dXJuX3QgYXJtX3NtbXVfZXZ0cV90aHJlYWQoaW50IGlycSwgdm9pZCAqZGV2KQo+ICB7 Cj4gLQlpbnQgaTsKPiArCWludCBpLCByZXQ7Cj4gIAlzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpz bW11ID0gZGV2Owo+ICAJc3RydWN0IGFybV9zbW11X3F1ZXVlICpxID0gJnNtbXUtPmV2dHEucTsK PiAgCXN0cnVjdCBhcm1fc21tdV9sbF9xdWV1ZSAqbGxxID0gJnEtPmxscTsKPiBAQCAtMTM5NCw2 ICsxNTIyLDEwIEBAIHN0YXRpYyBpcnFyZXR1cm5fdCBhcm1fc21tdV9ldnRxX3RocmVhZChpbnQg aXJxLCB2b2lkICpkZXYpCj4gIAkJd2hpbGUgKCFxdWV1ZV9yZW1vdmVfcmF3KHEsIGV2dCkpIHsK PiAgCQkJdTggaWQgPSBGSUVMRF9HRVQoRVZUUV8wX0lELCBldnRbMF0pOwo+ICAKPiArCQkJcmV0 ID0gYXJtX3NtbXVfaGFuZGxlX2V2dChzbW11LCBldnQpOwo+ICsJCQlpZiAoIXJldCkKPiArCQkJ CWNvbnRpbnVlOwo+ICsKPiAgCQkJZGV2X2luZm8oc21tdS0+ZGV2LCAiZXZlbnQgMHglMDJ4IHJl Y2VpdmVkOlxuIiwgaWQpOwo+ICAJCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShldnQpOyAr K2kpCj4gIAkJCQlkZXZfaW5mbyhzbW11LT5kZXYsICJcdDB4JTAxNmxseFxuIiwKPiBAQCAtMTky OCw2ICsyMDYwLDggQEAgc3RhdGljIGludCBhcm1fc21tdV9kb21haW5fZmluYWxpc2VfczEoc3Ry dWN0IGFybV9zbW11X2RvbWFpbiAqc21tdV9kb21haW4sCj4gIAo+ICAJY2ZnLT5zMWNkbWF4ID0g bWFzdGVyLT5zc2lkX2JpdHM7Cj4gIAo+ICsJc21tdV9kb21haW4tPnN0YWxsX2VuYWJsZWQgPSBt YXN0ZXItPnN0YWxsX2VuYWJsZWQ7Cj4gKwo+ICAJcmV0ID0gYXJtX3NtbXVfYWxsb2NfY2RfdGFi bGVzKHNtbXVfZG9tYWluKTsKPiAgCWlmIChyZXQpCj4gIAkJZ290byBvdXRfZnJlZV9hc2lkOwo+ IEBAIC0yMjc1LDYgKzI0MDksMTIgQEAgc3RhdGljIGludCBhcm1fc21tdV9hdHRhY2hfZGV2KHN0 cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbiwgc3RydWN0IGRldmljZSAqZGV2KQo+ICAJCQlzbW11 X2RvbWFpbi0+czFfY2ZnLnMxY2RtYXgsIG1hc3Rlci0+c3NpZF9iaXRzKTsKPiAgCQlyZXQgPSAt RUlOVkFMOwo+ICAJCWdvdG8gb3V0X3VubG9jazsKPiArCX0gZWxzZSBpZiAoc21tdV9kb21haW4t PnN0YWdlID09IEFSTV9TTU1VX0RPTUFJTl9TMSAmJgo+ICsJCSAgIHNtbXVfZG9tYWluLT5zdGFs bF9lbmFibGVkICE9IG1hc3Rlci0+c3RhbGxfZW5hYmxlZCkgewo+ICsJCWRldl9lcnIoZGV2LCAi Y2Fubm90IGF0dGFjaCB0byBzdGFsbC0lcyBkb21haW5cbiIsCj4gKwkJCXNtbXVfZG9tYWluLT5z dGFsbF9lbmFibGVkID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7Cj4gKwkJcmV0ID0gLUVJTlZB TDsKPiArCQlnb3RvIG91dF91bmxvY2s7Cj4gIAl9Cj4gIAo+ICAJbWFzdGVyLT5kb21haW4gPSBz bW11X2RvbWFpbjsKPiBAQCAtMjUxMCw2ICsyNjUwLDExIEBAIHN0YXRpYyBzdHJ1Y3QgaW9tbXVf ZGV2aWNlICphcm1fc21tdV9wcm9iZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQo+ICAJCW1h c3Rlci0+c3NpZF9iaXRzID0gbWluX3QodTgsIG1hc3Rlci0+c3NpZF9iaXRzLAo+ICAJCQkJCSAg Q1RYREVTQ19MSU5FQVJfQ0RNQVgpOwo+ICAKPiArCWlmICgoc21tdS0+ZmVhdHVyZXMgJiBBUk1f U01NVV9GRUFUX1NUQUxMUyAmJgo+ICsJICAgICBkZXZpY2VfcHJvcGVydHlfcmVhZF9ib29sKGRl diwgImRtYS1jYW4tc3RhbGwiKSkgfHwKPiArCSAgICBzbW11LT5mZWF0dXJlcyAmIEFSTV9TTU1V X0ZFQVRfU1RBTExfRk9SQ0UpCj4gKwkJbWFzdGVyLT5zdGFsbF9lbmFibGVkID0gdHJ1ZTsKPiAr Cj4gIAlyZXR1cm4gJnNtbXUtPmlvbW11Owo+ICAKPiAgZXJyX2ZyZWVfbWFzdGVyOgo+IEBAIC0y NTI3LDcgKzI2NzIsOCBAQCBzdGF0aWMgdm9pZCBhcm1fc21tdV9yZWxlYXNlX2RldmljZShzdHJ1 Y3QgZGV2aWNlICpkZXYpCj4gIAkJcmV0dXJuOwo+ICAKPiAgCW1hc3RlciA9IGRldl9pb21tdV9w cml2X2dldChkZXYpOwo+IC0JV0FSTl9PTihhcm1fc21tdV9tYXN0ZXJfc3ZhX2VuYWJsZWQobWFz dGVyKSk7Cj4gKwlpZiAoV0FSTl9PTihhcm1fc21tdV9tYXN0ZXJfc3ZhX2VuYWJsZWQobWFzdGVy KSkpCj4gKwkJaW9wZl9xdWV1ZV9yZW1vdmVfZGV2aWNlKG1hc3Rlci0+c21tdS0+ZXZ0cS5pb3Bm LCBkZXYpOwo+ICAJYXJtX3NtbXVfZGV0YWNoX2RldihtYXN0ZXIpOwo+ICAJYXJtX3NtbXVfZGlz YWJsZV9wYXNpZChtYXN0ZXIpOwo+ICAJYXJtX3NtbXVfcmVtb3ZlX21hc3RlcihtYXN0ZXIpOwo+ IEBAIC0yNjU1LDYgKzI4MDEsOCBAQCBzdGF0aWMgYm9vbCBhcm1fc21tdV9kZXZfaGFzX2ZlYXR1 cmUoc3RydWN0IGRldmljZSAqZGV2LAo+ICAJCXJldHVybiBmYWxzZTsKPiAgCj4gIAlzd2l0Y2gg KGZlYXQpIHsKPiArCWNhc2UgSU9NTVVfREVWX0ZFQVRfSU9QRjoKPiArCQlyZXR1cm4gYXJtX3Nt bXVfbWFzdGVyX2lvcGZfc3VwcG9ydGVkKG1hc3Rlcik7Cj4gIAljYXNlIElPTU1VX0RFVl9GRUFU X1NWQToKPiAgCQlyZXR1cm4gYXJtX3NtbXVfbWFzdGVyX3N2YV9zdXBwb3J0ZWQobWFzdGVyKTsK PiAgCWRlZmF1bHQ6Cj4gQEAgLTI2NzEsNiArMjgxOSw4IEBAIHN0YXRpYyBib29sIGFybV9zbW11 X2Rldl9mZWF0dXJlX2VuYWJsZWQoc3RydWN0IGRldmljZSAqZGV2LAo+ICAJCXJldHVybiBmYWxz ZTsKPiAgCj4gIAlzd2l0Y2ggKGZlYXQpIHsKPiArCWNhc2UgSU9NTVVfREVWX0ZFQVRfSU9QRjoK PiArCQlyZXR1cm4gbWFzdGVyLT5pb3BmX2VuYWJsZWQ7Cj4gIAljYXNlIElPTU1VX0RFVl9GRUFU X1NWQToKPiAgCQlyZXR1cm4gYXJtX3NtbXVfbWFzdGVyX3N2YV9lbmFibGVkKG1hc3Rlcik7Cj4g IAlkZWZhdWx0Ogo+IEBAIC0yNjgxLDYgKzI4MzEsOCBAQCBzdGF0aWMgYm9vbCBhcm1fc21tdV9k ZXZfZmVhdHVyZV9lbmFibGVkKHN0cnVjdCBkZXZpY2UgKmRldiwKPiAgc3RhdGljIGludCBhcm1f c21tdV9kZXZfZW5hYmxlX2ZlYXR1cmUoc3RydWN0IGRldmljZSAqZGV2LAo+ICAJCQkJICAgICAg IGVudW0gaW9tbXVfZGV2X2ZlYXR1cmVzIGZlYXQpCj4gIHsKPiArCXN0cnVjdCBhcm1fc21tdV9t YXN0ZXIgKm1hc3RlciA9IGRldl9pb21tdV9wcml2X2dldChkZXYpOwo+ICsKPiAgCWlmICghYXJt X3NtbXVfZGV2X2hhc19mZWF0dXJlKGRldiwgZmVhdCkpCj4gIAkJcmV0dXJuIC1FTk9ERVY7Cj4g IAo+IEBAIC0yNjg4LDggKzI4NDAsMTEgQEAgc3RhdGljIGludCBhcm1fc21tdV9kZXZfZW5hYmxl X2ZlYXR1cmUoc3RydWN0IGRldmljZSAqZGV2LAo+ICAJCXJldHVybiAtRUJVU1k7Cj4gIAo+ICAJ c3dpdGNoIChmZWF0KSB7Cj4gKwljYXNlIElPTU1VX0RFVl9GRUFUX0lPUEY6Cj4gKwkJbWFzdGVy LT5pb3BmX2VuYWJsZWQgPSB0cnVlOwo+ICsJCXJldHVybiAwOwo+ICAJY2FzZSBJT01NVV9ERVZf RkVBVF9TVkE6Cj4gLQkJcmV0dXJuIGFybV9zbW11X21hc3Rlcl9lbmFibGVfc3ZhKGRldl9pb21t dV9wcml2X2dldChkZXYpKTsKPiArCQlyZXR1cm4gYXJtX3NtbXVfbWFzdGVyX2VuYWJsZV9zdmEo bWFzdGVyKTsKPiAgCWRlZmF1bHQ6Cj4gIAkJcmV0dXJuIC1FSU5WQUw7Cj4gIAl9Cj4gQEAgLTI2 OTgsMTIgKzI4NTMsMTkgQEAgc3RhdGljIGludCBhcm1fc21tdV9kZXZfZW5hYmxlX2ZlYXR1cmUo c3RydWN0IGRldmljZSAqZGV2LAo+ICBzdGF0aWMgaW50IGFybV9zbW11X2Rldl9kaXNhYmxlX2Zl YXR1cmUoc3RydWN0IGRldmljZSAqZGV2LAo+ICAJCQkJCWVudW0gaW9tbXVfZGV2X2ZlYXR1cmVz IGZlYXQpCj4gIHsKPiArCXN0cnVjdCBhcm1fc21tdV9tYXN0ZXIgKm1hc3RlciA9IGRldl9pb21t dV9wcml2X2dldChkZXYpOwo+ICsKPiAgCWlmICghYXJtX3NtbXVfZGV2X2ZlYXR1cmVfZW5hYmxl ZChkZXYsIGZlYXQpKQo+ICAJCXJldHVybiAtRUlOVkFMOwo+ICAKPiAgCXN3aXRjaCAoZmVhdCkg ewo+ICsJY2FzZSBJT01NVV9ERVZfRkVBVF9JT1BGOgo+ICsJCWlmIChtYXN0ZXItPnN2YV9lbmFi bGVkKQo+ICsJCQlyZXR1cm4gLUVCVVNZOwo+ICsJCW1hc3Rlci0+aW9wZl9lbmFibGVkID0gZmFs c2U7Cj4gKwkJcmV0dXJuIDA7Cj4gIAljYXNlIElPTU1VX0RFVl9GRUFUX1NWQToKPiAtCQlyZXR1 cm4gYXJtX3NtbXVfbWFzdGVyX2Rpc2FibGVfc3ZhKGRldl9pb21tdV9wcml2X2dldChkZXYpKTsK PiArCQlyZXR1cm4gYXJtX3NtbXVfbWFzdGVyX2Rpc2FibGVfc3ZhKG1hc3Rlcik7Cj4gIAlkZWZh dWx0Ogo+ICAJCXJldHVybiAtRUlOVkFMOwo+ICAJfQo+IEBAIC0yNzM0LDYgKzI4OTYsNyBAQCBz dGF0aWMgc3RydWN0IGlvbW11X29wcyBhcm1fc21tdV9vcHMgPSB7Cj4gIAkuc3ZhX2JpbmQJCT0g YXJtX3NtbXVfc3ZhX2JpbmQsCj4gIAkuc3ZhX3VuYmluZAkJPSBhcm1fc21tdV9zdmFfdW5iaW5k LAo+ICAJLnN2YV9nZXRfcGFzaWQJCT0gYXJtX3NtbXVfc3ZhX2dldF9wYXNpZCwKPiArCS5wYWdl X3Jlc3BvbnNlCQk9IGFybV9zbW11X3BhZ2VfcmVzcG9uc2UsCj4gIAkucGdzaXplX2JpdG1hcAkJ PSAtMVVMLCAvKiBSZXN0cmljdGVkIGR1cmluZyBkZXZpY2UgYXR0YWNoICovCj4gIH07Cj4gIAo+ IEBAIC0yODMxLDYgKzI5OTQsMTMgQEAgc3RhdGljIGludCBhcm1fc21tdV9pbml0X3F1ZXVlcyhz dHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11KQo+ICAJaWYgKHJldCkKPiAgCQlyZXR1cm4gcmV0 Owo+ICAKPiArCWlmICgoc21tdS0+ZmVhdHVyZXMgJiBBUk1fU01NVV9GRUFUX1NWQSkgJiYKPiAr CSAgICAoc21tdS0+ZmVhdHVyZXMgJiBBUk1fU01NVV9GRUFUX1NUQUxMUykpIHsKPiArCQlzbW11 LT5ldnRxLmlvcGYgPSBpb3BmX3F1ZXVlX2FsbG9jKGRldl9uYW1lKHNtbXUtPmRldikpOwo+ICsJ CWlmICghc21tdS0+ZXZ0cS5pb3BmKQo+ICsJCQlyZXR1cm4gLUVOT01FTTsKPiArCX0KPiArCj4g IAkvKiBwcmlxICovCj4gIAlpZiAoIShzbW11LT5mZWF0dXJlcyAmIEFSTV9TTU1VX0ZFQVRfUFJJ KSkKPiAgCQlyZXR1cm4gMDsKPiBAQCAtMzc0Niw2ICszOTE2LDcgQEAgc3RhdGljIGludCBhcm1f c21tdV9kZXZpY2VfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4gIAlpb21t dV9kZXZpY2VfdW5yZWdpc3Rlcigmc21tdS0+aW9tbXUpOwo+ICAJaW9tbXVfZGV2aWNlX3N5c2Zz X3JlbW92ZSgmc21tdS0+aW9tbXUpOwo+ICAJYXJtX3NtbXVfZGV2aWNlX2Rpc2FibGUoc21tdSk7 Cj4gKwlpb3BmX3F1ZXVlX2ZyZWUoc21tdS0+ZXZ0cS5pb3BmKTsKPiAgCj4gIAlyZXR1cm4gMDsK PiAgfQo+IApUaGFua3MKCkVyaWMKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fCmlvbW11IG1haWxpbmcgbGlzdAppb21tdUBsaXN0cy5saW51eC1mb3VuZGF0 aW9uLm9yZwpodHRwczovL2xpc3RzLmxpbnV4Zm91bmRhdGlvbi5vcmcvbWFpbG1hbi9saXN0aW5m by9pb21tdQ== 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.7 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, 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 B152AC433E0 for ; Sun, 31 Jan 2021 18:31:14 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (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 609AB64E4B for ; Sun, 31 Jan 2021 18:31:14 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 609AB64E4B Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.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=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:Date:Message-ID:From: References:To:Subject:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=xKMIxVpR0+49A1/CUUvfft51xaHQMcizoVC4S1BJiuA=; b=LLFAKPvGLTpabmt9wtFYpzoKH vuwNOoerpk0+yKswbvusS9scnJFFKTnY1MZbAeIBXtxHe6DG/jjuDiwGwd1UV2B8dmndCtZbIfnmN Cb7mzAksYgcs5OpE1GbXDgtPGOKamkdyRzVjgwSmMnR7KqC669ZDAS/IctNF6oW9TEGanc0XkPe1x NEr5N0bHNhdW8ud2J/OW8NqEf3m/W9dz06u8l0aj1tpLnJ5m56Ty7aDdGkQmCnN5v4UjB2tKteWmL L2FOsPKXYLF50OB9Ft6FafXQkdVEo6Ky4snFQE/ZCrxXZd3eWWYevmfpT2KygGu7Fyk1tiCXYR+LI XbxfbRl3Q==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1l6HTc-0006VJ-8r; Sun, 31 Jan 2021 18:29:36 +0000 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1l6HTX-0006UT-60 for linux-arm-kernel@lists.infradead.org; Sun, 31 Jan 2021 18:29:33 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1612117768; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=J/aN+VcFd0A+/O8Uby1eLbErmC7NfLDfVH8RGF6p+XM=; b=Ibg1OOyebU6DWiUbEjfGHGMXI9JfXy9INOi3RsKlhpH/Kf9zOD9auhkZjXKqvHxIPnpX1a pjnmIeTtA+X0ZvkSW17va2kAq9B2yTri9nXUBgC5QASYhY/MFnYvZc2G/bt7pryKJqCOjP ok6PWIwoXt9eeIxSVwJFq5wLAqPpAEs= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-153-AVhH2fj7OHmqo_Cz2tMkDA-1; Sun, 31 Jan 2021 13:29:23 -0500 X-MC-Unique: AVhH2fj7OHmqo_Cz2tMkDA-1 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 25356801817; Sun, 31 Jan 2021 18:29:20 +0000 (UTC) Received: from [10.36.114.62] (ovpn-114-62.ams2.redhat.com [10.36.114.62]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 41D046E405; Sun, 31 Jan 2021 18:29:12 +0000 (UTC) Subject: Re: [PATCH v12 10/10] iommu/arm-smmu-v3: Add stall support for platform devices To: Jean-Philippe Brucker , joro@8bytes.org, will@kernel.org References: <20210127154322.3959196-1-jean-philippe@linaro.org> <20210127154322.3959196-11-jean-philippe@linaro.org> From: Auger Eric Message-ID: <0c609eeb-00b0-7573-fed7-5bc1e6c0b0d1@redhat.com> Date: Sun, 31 Jan 2021 19:29:09 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.5.0 MIME-Version: 1.0 In-Reply-To: <20210127154322.3959196-11-jean-philippe@linaro.org> Content-Language: en-US X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210131_132931_612872_4F6E2B6B X-CRM114-Status: GOOD ( 37.44 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: devicetree@vger.kernel.org, kevin.tian@intel.com, lorenzo.pieralisi@arm.com, vivek.gautam@arm.com, jacob.jun.pan@linux.intel.com, guohanjun@huawei.com, rjw@rjwysocki.net, shameerali.kolothum.thodi@huawei.com, linux-acpi@vger.kernel.org, iommu@lists.linux-foundation.org, robh+dt@kernel.org, linux-accelerators@lists.ozlabs.org, Jonathan.Cameron@huawei.com, sudeep.holla@arm.com, zhangfei.gao@linaro.org, baolu.lu@linux.intel.com, robin.murphy@arm.com, linux-arm-kernel@lists.infradead.org, lenb@kernel.org 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 SGkgSmVhbiwKClNvbWUgcmF0aGVyIG1pbm9yIGNvbW1lbnRzwqdxdWVzdGlvbnMgYmVsb3cgdGhh dCBtYXkgbm90IGp1c3RpZnkgYSByZXNwaW4uCgpPbiAxLzI3LzIxIDQ6NDMgUE0sIEplYW4tUGhp bGlwcGUgQnJ1Y2tlciB3cm90ZToKPiBUaGUgU01NVSBwcm92aWRlcyBhIFN0YWxsIG1vZGVsIGZv ciBoYW5kbGluZyBwYWdlIGZhdWx0cyBpbiBwbGF0Zm9ybQo+IGRldmljZXMuIEl0IGlzIHNpbWls YXIgdG8gUENJZSBQUkksIGJ1dCBkb2Vzbid0IHJlcXVpcmUgZGV2aWNlcyB0byBoYXZlCj4gdGhl aXIgb3duIHRyYW5zbGF0aW9uIGNhY2hlLiBJbnN0ZWFkLCBmYXVsdGluZyB0cmFuc2FjdGlvbnMg YXJlIHBhcmtlZAo+IGFuZCB0aGUgT1MgaXMgZ2l2ZW4gYSBjaGFuY2UgdG8gZml4IHRoZSBwYWdl IHRhYmxlcyBhbmQgcmV0cnkgdGhlCj4gdHJhbnNhY3Rpb24uCj4gCj4gRW5hYmxlIHN0YWxsIGZv ciBkZXZpY2VzIHRoYXQgc3VwcG9ydCBpdCAob3B0LWluIGJ5IGZpcm13YXJlKS4gV2hlbiBhbgo+ IGV2ZW50IGNvcnJlc3BvbmRzIHRvIGEgdHJhbnNsYXRpb24gZXJyb3IsIGNhbGwgdGhlIElPTU1V IGZhdWx0IGhhbmRsZXIuCj4gSWYgdGhlIGZhdWx0IGlzIHJlY292ZXJhYmxlLCBpdCB3aWxsIGNh bGwgdXMgYmFjayB0byB0ZXJtaW5hdGUgb3IKPiBjb250aW51ZSB0aGUgc3RhbGwuCj4gCj4gVG8g dXNlIHN0YWxsIGRldmljZSBkcml2ZXJzIG5lZWQgdG8gZW5hYmxlIElPTU1VX0RFVl9GRUFUX0lP UEYsIHdoaWNoCj4gaW5pdGlhbGl6ZXMgdGhlIGZhdWx0IHF1ZXVlIGZvciB0aGUgZGV2aWNlLgo+ IAo+IFRlc3RlZC1ieTogWmhhbmdmZWkgR2FvIDx6aGFuZ2ZlaS5nYW9AbGluYXJvLm9yZz4KPiBS ZXZpZXdlZC1ieTogSm9uYXRoYW4gQ2FtZXJvbiA8Sm9uYXRoYW4uQ2FtZXJvbkBodWF3ZWkuY29t Pgo+IFNpZ25lZC1vZmYtYnk6IEplYW4tUGhpbGlwcGUgQnJ1Y2tlciA8amVhbi1waGlsaXBwZUBs aW5hcm8ub3JnPgo+IC0tLQo+ICBkcml2ZXJzL2lvbW11L2FybS9hcm0tc21tdS12My9hcm0tc21t dS12My5oICAgfCAgNDMgKysrKwo+ICAuLi4vaW9tbXUvYXJtL2FybS1zbW11LXYzL2FybS1zbW11 LXYzLXN2YS5jICAgfCAgNTkgKysrKystCj4gIGRyaXZlcnMvaW9tbXUvYXJtL2FybS1zbW11LXYz L2FybS1zbW11LXYzLmMgICB8IDE4OSArKysrKysrKysrKysrKysrKy0KPiAgMyBmaWxlcyBjaGFu Z2VkLCAyNzYgaW5zZXJ0aW9ucygrKSwgMTUgZGVsZXRpb25zKC0pCj4gCj4gZGlmZiAtLWdpdCBh L2RyaXZlcnMvaW9tbXUvYXJtL2FybS1zbW11LXYzL2FybS1zbW11LXYzLmggYi9kcml2ZXJzL2lv bW11L2FybS9hcm0tc21tdS12My9hcm0tc21tdS12My5oCj4gaW5kZXggN2IxNWI3NTgwYzZlLi41 OWFmMGJiZDJmN2IgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9pb21tdS9hcm0vYXJtLXNtbXUtdjMv YXJtLXNtbXUtdjMuaAo+ICsrKyBiL2RyaXZlcnMvaW9tbXUvYXJtL2FybS1zbW11LXYzL2FybS1z bW11LXYzLmgKPiBAQCAtMzU0LDYgKzM1NCwxMyBAQAo+ICAjZGVmaW5lIENNRFFfUFJJXzFfR1JQ SUQJCUdFTk1BU0tfVUxMKDgsIDApCj4gICNkZWZpbmUgQ01EUV9QUklfMV9SRVNQCQkJR0VOTUFT S19VTEwoMTMsIDEyKQo+ICAKPiArI2RlZmluZSBDTURRX1JFU1VNRV8wX1JFU1BfVEVSTQkJMFVM Cj4gKyNkZWZpbmUgQ01EUV9SRVNVTUVfMF9SRVNQX1JFVFJZCTFVTAo+ICsjZGVmaW5lIENNRFFf UkVTVU1FXzBfUkVTUF9BQk9SVAkyVUwKPiArI2RlZmluZSBDTURRX1JFU1VNRV8wX1JFU1AJCUdF Tk1BU0tfVUxMKDEzLCAxMikKPiArI2RlZmluZSBDTURRX1JFU1VNRV8wX1NJRAkJR0VOTUFTS19V TEwoNjMsIDMyKQo+ICsjZGVmaW5lIENNRFFfUkVTVU1FXzFfU1RBRwkJR0VOTUFTS19VTEwoMTUs IDApCj4gKwo+ICAjZGVmaW5lIENNRFFfU1lOQ18wX0NTCQkJR0VOTUFTS19VTEwoMTMsIDEyKQo+ ICAjZGVmaW5lIENNRFFfU1lOQ18wX0NTX05PTkUJCTAKPiAgI2RlZmluZSBDTURRX1NZTkNfMF9D U19JUlEJCTEKPiBAQCAtMzcwLDYgKzM3NywyNSBAQAo+ICAKPiAgI2RlZmluZSBFVlRRXzBfSUQJ CQlHRU5NQVNLX1VMTCg3LCAwKQo+ICAKPiArI2RlZmluZSBFVlRfSURfVFJBTlNMQVRJT05fRkFV TFQJMHgxMAo+ICsjZGVmaW5lIEVWVF9JRF9BRERSX1NJWkVfRkFVTFQJCTB4MTEKPiArI2RlZmlu ZSBFVlRfSURfQUNDRVNTX0ZBVUxUCQkweDEyCj4gKyNkZWZpbmUgRVZUX0lEX1BFUk1JU1NJT05f RkFVTFQJCTB4MTMKPiArCj4gKyNkZWZpbmUgRVZUUV8wX1NTVgkJCSgxVUwgPDwgMTEpCj4gKyNk ZWZpbmUgRVZUUV8wX1NTSUQJCQlHRU5NQVNLX1VMTCgzMSwgMTIpCj4gKyNkZWZpbmUgRVZUUV8w X1NJRAkJCUdFTk1BU0tfVUxMKDYzLCAzMikKPiArI2RlZmluZSBFVlRRXzFfU1RBRwkJCUdFTk1B U0tfVUxMKDE1LCAwKQo+ICsjZGVmaW5lIEVWVFFfMV9TVEFMTAkJCSgxVUwgPDwgMzEpCj4gKyNk ZWZpbmUgRVZUUV8xX1BuVQkJCSgxVUwgPDwgMzMpCj4gKyNkZWZpbmUgRVZUUV8xX0luRAkJCSgx VUwgPDwgMzQpCj4gKyNkZWZpbmUgRVZUUV8xX1JuVwkJCSgxVUwgPDwgMzUpCj4gKyNkZWZpbmUg RVZUUV8xX1MyCQkJKDFVTCA8PCAzOSkKPiArI2RlZmluZSBFVlRRXzFfQ0xBU1MJCQlHRU5NQVNL X1VMTCg0MSwgNDApCj4gKyNkZWZpbmUgRVZUUV8xX1RUX1JFQUQJCQkoMVVMIDw8IDQ0KQo+ICsj ZGVmaW5lIEVWVFFfMl9BRERSCQkJR0VOTUFTS19VTEwoNjMsIDApCj4gKyNkZWZpbmUgRVZUUV8z X0lQQQkJCUdFTk1BU0tfVUxMKDUxLCAxMikKPiArCj4gIC8qIFBSSSBxdWV1ZSAqLwo+ICAjZGVm aW5lIFBSSVFfRU5UX1NaX1NISUZUCQk0Cj4gICNkZWZpbmUgUFJJUV9FTlRfRFdPUkRTCQkJKCgx IDw8IFBSSVFfRU5UX1NaX1NISUZUKSA+PiAzKQo+IEBAIC00NjQsNiArNDkwLDEzIEBAIHN0cnVj dCBhcm1fc21tdV9jbWRxX2VudCB7Cj4gIAkJCWVudW0gcHJpX3Jlc3AJCXJlc3A7Cj4gIAkJfSBw cmk7Cj4gIAo+ICsJCSNkZWZpbmUgQ01EUV9PUF9SRVNVTUUJCTB4NDQKPiArCQlzdHJ1Y3Qgewo+ ICsJCQl1MzIJCQlzaWQ7Cj4gKwkJCXUxNgkJCXN0YWc7Cj4gKwkJCXU4CQkJcmVzcDsKPiArCQl9 IHJlc3VtZTsKPiArCj4gIAkJI2RlZmluZSBDTURRX09QX0NNRF9TWU5DCTB4NDYKPiAgCQlzdHJ1 Y3Qgewo+ICAJCQl1NjQJCQltc2lhZGRyOwo+IEBAIC01MjIsNiArNTU1LDcgQEAgc3RydWN0IGFy bV9zbW11X2NtZHFfYmF0Y2ggewo+ICAKPiAgc3RydWN0IGFybV9zbW11X2V2dHEgewo+ICAJc3Ry dWN0IGFybV9zbW11X3F1ZXVlCQlxOwo+ICsJc3RydWN0IGlvcGZfcXVldWUJCSppb3BmOwo+ICAJ dTMyCQkJCW1heF9zdGFsbHM7Cj4gIH07Cj4gIAo+IEBAIC02NTksNyArNjkzLDkgQEAgc3RydWN0 IGFybV9zbW11X21hc3RlciB7Cj4gIAlzdHJ1Y3QgYXJtX3NtbXVfc3RyZWFtCQkqc3RyZWFtczsK PiAgCXVuc2lnbmVkIGludAkJCW51bV9zdHJlYW1zOwo+ICAJYm9vbAkJCQlhdHNfZW5hYmxlZDsK PiArCWJvb2wJCQkJc3RhbGxfZW5hYmxlZDsKPiAgCWJvb2wJCQkJc3ZhX2VuYWJsZWQ7Cj4gKwli b29sCQkJCWlvcGZfZW5hYmxlZDsKPiAgCXN0cnVjdCBsaXN0X2hlYWQJCWJvbmRzOwo+ICAJdW5z aWduZWQgaW50CQkJc3NpZF9iaXRzOwo+ICB9Owo+IEBAIC02NzgsNiArNzE0LDcgQEAgc3RydWN0 IGFybV9zbW11X2RvbWFpbiB7Cj4gIAo+ICAJc3RydWN0IGlvX3BndGFibGVfb3BzCQkqcGd0Ymxf b3BzOwo+ICAJYm9vbAkJCQlub25fc3RyaWN0Owo+ICsJYm9vbAkJCQlzdGFsbF9lbmFibGVkOwo+ ICAJYXRvbWljX3QJCQlucl9hdHNfbWFzdGVyczsKPiAgCj4gIAllbnVtIGFybV9zbW11X2RvbWFp bl9zdGFnZQlzdGFnZTsKPiBAQCAtNzE5LDYgKzc1Niw3IEBAIGJvb2wgYXJtX3NtbXVfbWFzdGVy X3N2YV9zdXBwb3J0ZWQoc3RydWN0IGFybV9zbW11X21hc3RlciAqbWFzdGVyKTsKPiAgYm9vbCBh cm1fc21tdV9tYXN0ZXJfc3ZhX2VuYWJsZWQoc3RydWN0IGFybV9zbW11X21hc3RlciAqbWFzdGVy KTsKPiAgaW50IGFybV9zbW11X21hc3Rlcl9lbmFibGVfc3ZhKHN0cnVjdCBhcm1fc21tdV9tYXN0 ZXIgKm1hc3Rlcik7Cj4gIGludCBhcm1fc21tdV9tYXN0ZXJfZGlzYWJsZV9zdmEoc3RydWN0IGFy bV9zbW11X21hc3RlciAqbWFzdGVyKTsKPiArYm9vbCBhcm1fc21tdV9tYXN0ZXJfaW9wZl9zdXBw b3J0ZWQoc3RydWN0IGFybV9zbW11X21hc3RlciAqbWFzdGVyKTsKPiAgc3RydWN0IGlvbW11X3N2 YSAqYXJtX3NtbXVfc3ZhX2JpbmQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgbW1fc3RydWN0 ICptbSwKPiAgCQkJCSAgICB2b2lkICpkcnZkYXRhKTsKPiAgdm9pZCBhcm1fc21tdV9zdmFfdW5i aW5kKHN0cnVjdCBpb21tdV9zdmEgKmhhbmRsZSk7Cj4gQEAgLTc1MCw2ICs3ODgsMTEgQEAgc3Rh dGljIGlubGluZSBpbnQgYXJtX3NtbXVfbWFzdGVyX2Rpc2FibGVfc3ZhKHN0cnVjdCBhcm1fc21t dV9tYXN0ZXIgKm1hc3RlcikKPiAgCXJldHVybiAtRU5PREVWOwo+ICB9Cj4gIAo+ICtzdGF0aWMg aW5saW5lIGJvb2wgYXJtX3NtbXVfbWFzdGVyX2lvcGZfc3VwcG9ydGVkKHN0cnVjdCBhcm1fc21t dV9tYXN0ZXIgKm1hc3RlcikKPiArewo+ICsJcmV0dXJuIGZhbHNlOwo+ICt9Cj4gKwo+ICBzdGF0 aWMgaW5saW5lIHN0cnVjdCBpb21tdV9zdmEgKgo+ICBhcm1fc21tdV9zdmFfYmluZChzdHJ1Y3Qg ZGV2aWNlICpkZXYsIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB2b2lkICpkcnZkYXRhKQo+ICB7Cj4g ZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW9tbXUvYXJtL2FybS1zbW11LXYzL2FybS1zbW11LXYzLXN2 YS5jIGIvZHJpdmVycy9pb21tdS9hcm0vYXJtLXNtbXUtdjMvYXJtLXNtbXUtdjMtc3ZhLmMKPiBp bmRleCBiYjI1MWNhYjYxZjMuLmVlNjZkMWY0Y2I4MSAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2lv bW11L2FybS9hcm0tc21tdS12My9hcm0tc21tdS12My1zdmEuYwo+ICsrKyBiL2RyaXZlcnMvaW9t bXUvYXJtL2FybS1zbW11LXYzL2FybS1zbW11LXYzLXN2YS5jCj4gQEAgLTQzNSw5ICs0MzUsMTMg QEAgYm9vbCBhcm1fc21tdV9zdmFfc3VwcG9ydGVkKHN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNt bXUpCj4gIAlyZXR1cm4gdHJ1ZTsKPiAgfQo+ICAKPiAtc3RhdGljIGJvb2wgYXJtX3NtbXVfaW9w Zl9zdXBwb3J0ZWQoc3RydWN0IGFybV9zbW11X21hc3RlciAqbWFzdGVyKQo+ICtib29sIGFybV9z bW11X21hc3Rlcl9pb3BmX3N1cHBvcnRlZChzdHJ1Y3QgYXJtX3NtbXVfbWFzdGVyICptYXN0ZXIp Cj4gIHsKPiAtCXJldHVybiBmYWxzZTsKPiArCS8qIFdlJ3JlIG5vdCBrZWVwaW5nIHRyYWNrIG9m IFNJRHMgaW4gZmF1bHQgZXZlbnRzICovCnNoYWxsIHdlPyBbKl0gYmVsb3cKPiArCWlmIChtYXN0 ZXItPm51bV9zdHJlYW1zICE9IDEpCj4gKwkJcmV0dXJuIGZhbHNlOwo+ICsKPiArCXJldHVybiBt YXN0ZXItPnN0YWxsX2VuYWJsZWQ7Cj4gIH0KPiAgCj4gIGJvb2wgYXJtX3NtbXVfbWFzdGVyX3N2 YV9zdXBwb3J0ZWQoc3RydWN0IGFybV9zbW11X21hc3RlciAqbWFzdGVyKQo+IEBAIC00NDUsOCAr NDQ5LDggQEAgYm9vbCBhcm1fc21tdV9tYXN0ZXJfc3ZhX3N1cHBvcnRlZChzdHJ1Y3QgYXJtX3Nt bXVfbWFzdGVyICptYXN0ZXIpCj4gIAlpZiAoIShtYXN0ZXItPnNtbXUtPmZlYXR1cmVzICYgQVJN X1NNTVVfRkVBVF9TVkEpKQo+ICAJCXJldHVybiBmYWxzZTsKPiAgCj4gLQkvKiBTU0lEIGFuZCBJ T1BGIHN1cHBvcnQgYXJlIG1hbmRhdG9yeSBmb3IgdGhlIG1vbWVudCAqLwo+IC0JcmV0dXJuIG1h c3Rlci0+c3NpZF9iaXRzICYmIGFybV9zbW11X2lvcGZfc3VwcG9ydGVkKG1hc3Rlcik7Cj4gKwkv KiBTU0lEIHN1cHBvcnQgaXMgbWFuZGF0b3J5IGZvciB0aGUgbW9tZW50ICovCj4gKwlyZXR1cm4g bWFzdGVyLT5zc2lkX2JpdHM7Cj4gIH0KPiAgCj4gIGJvb2wgYXJtX3NtbXVfbWFzdGVyX3N2YV9l bmFibGVkKHN0cnVjdCBhcm1fc21tdV9tYXN0ZXIgKm1hc3RlcikKPiBAQCAtNDU5LDEzICs0NjMs NTUgQEAgYm9vbCBhcm1fc21tdV9tYXN0ZXJfc3ZhX2VuYWJsZWQoc3RydWN0IGFybV9zbW11X21h c3RlciAqbWFzdGVyKQo+ICAJcmV0dXJuIGVuYWJsZWQ7Cj4gIH0KPiAgCj4gK3N0YXRpYyBpbnQg YXJtX3NtbXVfbWFzdGVyX3N2YV9lbmFibGVfaW9wZihzdHJ1Y3QgYXJtX3NtbXVfbWFzdGVyICpt YXN0ZXIpCj4gK3sKPiArCWludCByZXQ7Cj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBtYXN0ZXIt PmRldjsKPiArCj4gKwkvKgo+ICsJICogRHJpdmVycyBmb3IgZGV2aWNlcyBzdXBwb3J0aW5nIFBS SSBvciBzdGFsbCBzaG91bGQgZW5hYmxlIElPUEYgZmlyc3QuCj4gKwkgKiBPdGhlcnMgaGF2ZSBk ZXZpY2Utc3BlY2lmaWMgZmF1bHQgaGFuZGxlcnMgYW5kIGRvbid0IG5lZWQgSU9QRi4KPiArCSAq Lwo+ICsJaWYgKCFhcm1fc21tdV9tYXN0ZXJfaW9wZl9zdXBwb3J0ZWQobWFzdGVyKSkKPiArCQly ZXR1cm4gMDsKPiArCj4gKwlpZiAoIW1hc3Rlci0+aW9wZl9lbmFibGVkKQo+ICsJCXJldHVybiAt RUlOVkFMOwo+ICsKPiArCXJldCA9IGlvcGZfcXVldWVfYWRkX2RldmljZShtYXN0ZXItPnNtbXUt PmV2dHEuaW9wZiwgZGV2KTsKPiArCWlmIChyZXQpCj4gKwkJcmV0dXJuIHJldDsKPiArCj4gKwly ZXQgPSBpb21tdV9yZWdpc3Rlcl9kZXZpY2VfZmF1bHRfaGFuZGxlcihkZXYsIGlvbW11X3F1ZXVl X2lvcGYsIGRldik7Cj4gKwlpZiAocmV0KSB7Cj4gKwkJaW9wZl9xdWV1ZV9yZW1vdmVfZGV2aWNl KG1hc3Rlci0+c21tdS0+ZXZ0cS5pb3BmLCBkZXYpOwo+ICsJCXJldHVybiByZXQ7Cj4gKwl9Cj4g KwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgYXJtX3NtbXVfbWFzdGVyX3N2YV9k aXNhYmxlX2lvcGYoc3RydWN0IGFybV9zbW11X21hc3RlciAqbWFzdGVyKQo+ICt7Cj4gKwlzdHJ1 Y3QgZGV2aWNlICpkZXYgPSBtYXN0ZXItPmRldjsKPiArCj4gKwlpZiAoIW1hc3Rlci0+aW9wZl9l bmFibGVkKQo+ICsJCXJldHVybjsKPiArCj4gKwlpb21tdV91bnJlZ2lzdGVyX2RldmljZV9mYXVs dF9oYW5kbGVyKGRldik7Cj4gKwlpb3BmX3F1ZXVlX3JlbW92ZV9kZXZpY2UobWFzdGVyLT5zbW11 LT5ldnRxLmlvcGYsIGRldik7Cj4gK30KPiArCj4gIGludCBhcm1fc21tdV9tYXN0ZXJfZW5hYmxl X3N2YShzdHJ1Y3QgYXJtX3NtbXVfbWFzdGVyICptYXN0ZXIpCj4gIHsKPiArCWludCByZXQ7Cj4g Kwo+ICAJbXV0ZXhfbG9jaygmc3ZhX2xvY2spOwo+IC0JbWFzdGVyLT5zdmFfZW5hYmxlZCA9IHRy dWU7Cj4gKwlyZXQgPSBhcm1fc21tdV9tYXN0ZXJfc3ZhX2VuYWJsZV9pb3BmKG1hc3Rlcik7Cj4g KwlpZiAoIXJldCkKPiArCQltYXN0ZXItPnN2YV9lbmFibGVkID0gdHJ1ZTsKPiAgCW11dGV4X3Vu bG9jaygmc3ZhX2xvY2spOwo+ICAKPiAtCXJldHVybiAwOwo+ICsJcmV0dXJuIHJldDsKPiAgfQo+ ICAKPiAgaW50IGFybV9zbW11X21hc3Rlcl9kaXNhYmxlX3N2YShzdHJ1Y3QgYXJtX3NtbXVfbWFz dGVyICptYXN0ZXIpCj4gQEAgLTQ3Niw2ICs1MjIsNyBAQCBpbnQgYXJtX3NtbXVfbWFzdGVyX2Rp c2FibGVfc3ZhKHN0cnVjdCBhcm1fc21tdV9tYXN0ZXIgKm1hc3RlcikKPiAgCQltdXRleF91bmxv Y2soJnN2YV9sb2NrKTsKPiAgCQlyZXR1cm4gLUVCVVNZOwo+ICAJfQo+ICsJYXJtX3NtbXVfbWFz dGVyX3N2YV9kaXNhYmxlX2lvcGYobWFzdGVyKTsKPiAgCW1hc3Rlci0+c3ZhX2VuYWJsZWQgPSBm YWxzZTsKPiAgCW11dGV4X3VubG9jaygmc3ZhX2xvY2spOwo+ICAKPiBkaWZmIC0tZ2l0IGEvZHJp dmVycy9pb21tdS9hcm0vYXJtLXNtbXUtdjMvYXJtLXNtbXUtdjMuYyBiL2RyaXZlcnMvaW9tbXUv YXJtL2FybS1zbW11LXYzL2FybS1zbW11LXYzLmMKPiBpbmRleCAzYWZlYzZlZDgwNzUuLjc2YjIz MDZkZGZmNiAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2lvbW11L2FybS9hcm0tc21tdS12My9hcm0t c21tdS12My5jCj4gKysrIGIvZHJpdmVycy9pb21tdS9hcm0vYXJtLXNtbXUtdjMvYXJtLXNtbXUt djMuYwo+IEBAIC0zMiw2ICszMiw3IEBACj4gICNpbmNsdWRlIDxsaW51eC9hbWJhL2J1cy5oPgo+ ICAKPiAgI2luY2x1ZGUgImFybS1zbW11LXYzLmgiCj4gKyNpbmNsdWRlICIuLi8uLi9pb21tdS1z dmEtbGliLmgiCj4gIAo+ICBzdGF0aWMgYm9vbCBkaXNhYmxlX2J5cGFzcyA9IHRydWU7Cj4gIG1v ZHVsZV9wYXJhbShkaXNhYmxlX2J5cGFzcywgYm9vbCwgMDQ0NCk7Cj4gQEAgLTMxNSw2ICszMTYs MTEgQEAgc3RhdGljIGludCBhcm1fc21tdV9jbWRxX2J1aWxkX2NtZCh1NjQgKmNtZCwgc3RydWN0 IGFybV9zbW11X2NtZHFfZW50ICplbnQpCj4gIAkJfQo+ICAJCWNtZFsxXSB8PSBGSUVMRF9QUkVQ KENNRFFfUFJJXzFfUkVTUCwgZW50LT5wcmkucmVzcCk7Cj4gIAkJYnJlYWs7Cj4gKwljYXNlIENN RFFfT1BfUkVTVU1FOgo+ICsJCWNtZFswXSB8PSBGSUVMRF9QUkVQKENNRFFfUkVTVU1FXzBfU0lE LCBlbnQtPnJlc3VtZS5zaWQpOwo+ICsJCWNtZFswXSB8PSBGSUVMRF9QUkVQKENNRFFfUkVTVU1F XzBfUkVTUCwgZW50LT5yZXN1bWUucmVzcCk7Cj4gKwkJY21kWzFdIHw9IEZJRUxEX1BSRVAoQ01E UV9SRVNVTUVfMV9TVEFHLCBlbnQtPnJlc3VtZS5zdGFnKTsKPiArCQlicmVhazsKPiAgCWNhc2Ug Q01EUV9PUF9DTURfU1lOQzoKPiAgCQlpZiAoZW50LT5zeW5jLm1zaWFkZHIpIHsKPiAgCQkJY21k WzBdIHw9IEZJRUxEX1BSRVAoQ01EUV9TWU5DXzBfQ1MsIENNRFFfU1lOQ18wX0NTX0lSUSk7Cj4g QEAgLTg3OCw2ICs4ODQsNDQgQEAgc3RhdGljIGludCBhcm1fc21tdV9jbWRxX2JhdGNoX3N1Ym1p dChzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11LAo+ICAJcmV0dXJuIGFybV9zbW11X2NtZHFf aXNzdWVfY21kbGlzdChzbW11LCBjbWRzLT5jbWRzLCBjbWRzLT5udW0sIHRydWUpOwo+ICB9Cj4g IAo+ICtzdGF0aWMgaW50IGFybV9zbW11X3BhZ2VfcmVzcG9uc2Uoc3RydWN0IGRldmljZSAqZGV2 LAo+ICsJCQkJICBzdHJ1Y3QgaW9tbXVfZmF1bHRfZXZlbnQgKnVudXNlZCwKPiArCQkJCSAgc3Ry dWN0IGlvbW11X3BhZ2VfcmVzcG9uc2UgKnJlc3ApCj4gK3sKPiArCXN0cnVjdCBhcm1fc21tdV9j bWRxX2VudCBjbWQgPSB7MH07Cj4gKwlzdHJ1Y3QgYXJtX3NtbXVfbWFzdGVyICptYXN0ZXIgPSBk ZXZfaW9tbXVfcHJpdl9nZXQoZGV2KTsKPiArCWludCBzaWQgPSBtYXN0ZXItPnN0cmVhbXNbMF0u aWQ7ClsqXQo+ICsKPiArCWlmIChtYXN0ZXItPnN0YWxsX2VuYWJsZWQpIHsKPiArCQljbWQub3Bj b2RlCQk9IENNRFFfT1BfUkVTVU1FOwo+ICsJCWNtZC5yZXN1bWUuc2lkCQk9IHNpZDsKPiArCQlj bWQucmVzdW1lLnN0YWcJCT0gcmVzcC0+Z3JwaWQ7Cj4gKwkJc3dpdGNoIChyZXNwLT5jb2RlKSB7 Cj4gKwkJY2FzZSBJT01NVV9QQUdFX1JFU1BfSU5WQUxJRDoKYWRkIGZhbGx0aHJvdWdoPwo+ICsJ CWNhc2UgSU9NTVVfUEFHRV9SRVNQX0ZBSUxVUkU6Cj4gKwkJCWNtZC5yZXN1bWUucmVzcCA9IENN RFFfUkVTVU1FXzBfUkVTUF9BQk9SVDsKPiArCQkJYnJlYWs7Cj4gKwkJY2FzZSBJT01NVV9QQUdF X1JFU1BfU1VDQ0VTUzoKPiArCQkJY21kLnJlc3VtZS5yZXNwID0gQ01EUV9SRVNVTUVfMF9SRVNQ X1JFVFJZOwo+ICsJCQlicmVhazsKPiArCQlkZWZhdWx0Ogo+ICsJCQlyZXR1cm4gLUVJTlZBTDsK PiArCQl9Cj4gKwl9IGVsc2Ugewo+ICsJCXJldHVybiAtRU5PREVWOwo+ICsJfQo+ICsKPiArCWFy bV9zbW11X2NtZHFfaXNzdWVfY21kKG1hc3Rlci0+c21tdSwgJmNtZCk7Cj4gKwkvKgo+ICsJICog RG9uJ3Qgc2VuZCBhIFNZTkMsIGl0IGRvZXNuJ3QgZG8gYW55dGhpbmcgZm9yIFJFU1VNRSBvciBQ UklfUkVTUC4KPiArCSAqIFJFU1VNRSBjb25zdW1wdGlvbiBndWFyYW50ZWVzIHRoYXQgdGhlIHN0 YWxsZWQgdHJhbnNhY3Rpb24gd2lsbCBiZQo+ICsJICogdGVybWluYXRlZC4uLiBhdCBzb21lIHBv aW50IGluIHRoZSBmdXR1cmUuIFBSSV9SRVNQIGlzIGZpcmUgYW5kCj4gKwkgKiBmb3JnZXQuCj4g KwkgKi8KPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiAgLyogQ29udGV4dCBkZXNjcmlwdG9y IG1hbmlwdWxhdGlvbiBmdW5jdGlvbnMgKi8KPiAgdm9pZCBhcm1fc21tdV90bGJfaW52X2FzaWQo c3RydWN0IGFybV9zbW11X2RldmljZSAqc21tdSwgdTE2IGFzaWQpCj4gIHsKPiBAQCAtOTg4LDcg KzEwMzIsNiBAQCBpbnQgYXJtX3NtbXVfd3JpdGVfY3R4X2Rlc2Moc3RydWN0IGFybV9zbW11X2Rv bWFpbiAqc21tdV9kb21haW4sIGludCBzc2lkLAo+ICAJdTY0IHZhbDsKPiAgCWJvb2wgY2RfbGl2 ZTsKPiAgCV9fbGU2NCAqY2RwdHI7Cj4gLQlzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11ID0g c21tdV9kb21haW4tPnNtbXU7Cj4gIAo+ICAJaWYgKFdBUk5fT04oc3NpZCA+PSAoMSA8PCBzbW11 X2RvbWFpbi0+czFfY2ZnLnMxY2RtYXgpKSkKPiAgCQlyZXR1cm4gLUUyQklHOwo+IEBAIC0xMDMz LDggKzEwNzYsNyBAQCBpbnQgYXJtX3NtbXVfd3JpdGVfY3R4X2Rlc2Moc3RydWN0IGFybV9zbW11 X2RvbWFpbiAqc21tdV9kb21haW4sIGludCBzc2lkLAo+ICAJCQlGSUVMRF9QUkVQKENUWERFU0Nf Q0RfMF9BU0lELCBjZC0+YXNpZCkgfAo+ICAJCQlDVFhERVNDX0NEXzBfVjsKPiAgCj4gLQkJLyog U1RBTExfTU9ERUw9PTBiMTAgJiYgQ0QuUz09MCBpcyBJTExFR0FMICovCj4gLQkJaWYgKHNtbXUt PmZlYXR1cmVzICYgQVJNX1NNTVVfRkVBVF9TVEFMTF9GT1JDRSkKPiArCQlpZiAoc21tdV9kb21h aW4tPnN0YWxsX2VuYWJsZWQpCj4gIAkJCXZhbCB8PSBDVFhERVNDX0NEXzBfUzsKPiAgCX0KPiAg Cj4gQEAgLTEyNzgsNyArMTMyMCw3IEBAIHN0YXRpYyB2b2lkIGFybV9zbW11X3dyaXRlX3N0cnRh Yl9lbnQoc3RydWN0IGFybV9zbW11X21hc3RlciAqbWFzdGVyLCB1MzIgc2lkLAo+ICAJCQkgRklF TERfUFJFUChTVFJUQUJfU1RFXzFfU1RSVywgc3RydykpOwo+ICAKPiAgCQlpZiAoc21tdS0+ZmVh dHVyZXMgJiBBUk1fU01NVV9GRUFUX1NUQUxMUyAmJgo+IC0JCSAgICEoc21tdS0+ZmVhdHVyZXMg JiBBUk1fU01NVV9GRUFUX1NUQUxMX0ZPUkNFKSkKPiArCQkgICAgIW1hc3Rlci0+c3RhbGxfZW5h YmxlZCkKPiAgCQkJZHN0WzFdIHw9IGNwdV90b19sZTY0KFNUUlRBQl9TVEVfMV9TMVNUQUxMRCk7 Cj4gIAo+ICAJCXZhbCB8PSAoczFfY2ZnLT5jZGNmZy5jZHRhYl9kbWEgJiBTVFJUQUJfU1RFXzBf UzFDVFhQVFJfTUFTSykgfAo+IEBAIC0xMzU1LDcgKzEzOTcsNiBAQCBzdGF0aWMgaW50IGFybV9z bW11X2luaXRfbDJfc3RydGFiKHN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNtbXUsIHUzMiBzaWQp Cj4gIAlyZXR1cm4gMDsKPiAgfQo+ICAKPiAtX19tYXliZV91bnVzZWQKPiAgc3RhdGljIHN0cnVj dCBhcm1fc21tdV9tYXN0ZXIgKgo+ICBhcm1fc21tdV9maW5kX21hc3RlcihzdHJ1Y3QgYXJtX3Nt bXVfZGV2aWNlICpzbW11LCB1MzIgc2lkKQo+ICB7Cj4gQEAgLTEzODIsOSArMTQyMyw5NiBAQCBh cm1fc21tdV9maW5kX21hc3RlcihzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11LCB1MzIgc2lk KQo+ICB9Cj4gIAo+ICAvKiBJUlEgYW5kIGV2ZW50IGhhbmRsZXJzICovCj4gK3N0YXRpYyBpbnQg YXJtX3NtbXVfaGFuZGxlX2V2dChzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11LCB1NjQgKmV2 dCkKPiArewo+ICsJaW50IHJldDsKPiArCXUzMiByZWFzb247Cj4gKwl1MzIgcGVybSA9IDA7Cj4g KwlzdHJ1Y3QgYXJtX3NtbXVfbWFzdGVyICptYXN0ZXI7Cj4gKwlib29sIHNzaWRfdmFsaWQgPSBl dnRbMF0gJiBFVlRRXzBfU1NWOwo+ICsJdTMyIHNpZCA9IEZJRUxEX0dFVChFVlRRXzBfU0lELCBl dnRbMF0pOwo+ICsJc3RydWN0IGlvbW11X2ZhdWx0X2V2ZW50IGZhdWx0X2V2dCA9IHsgfTsKPiAr CXN0cnVjdCBpb21tdV9mYXVsdCAqZmx0ID0gJmZhdWx0X2V2dC5mYXVsdDsKPiArCj4gKwkvKiBT dGFnZS0yIGlzIGFsd2F5cyBwaW5uZWQgYXQgdGhlIG1vbWVudCAqLwo+ICsJaWYgKGV2dFsxXSAm IEVWVFFfMV9TMikKPiArCQlyZXR1cm4gLUVGQVVMVDsKPiArCj4gKwltYXN0ZXIgPSBhcm1fc21t dV9maW5kX21hc3RlcihzbW11LCBzaWQpOwo+ICsJaWYgKCFtYXN0ZXIpCj4gKwkJcmV0dXJuIC1F SU5WQUw7Cj4gKwo+ICsJaWYgKGV2dFsxXSAmIEVWVFFfMV9SblcpCj4gKwkJcGVybSB8PSBJT01N VV9GQVVMVF9QRVJNX1JFQUQ7Cj4gKwllbHNlCj4gKwkJcGVybSB8PSBJT01NVV9GQVVMVF9QRVJN X1dSSVRFOwo+ICsKPiArCWlmIChldnRbMV0gJiBFVlRRXzFfSW5EKQo+ICsJCXBlcm0gfD0gSU9N TVVfRkFVTFRfUEVSTV9FWEVDOwo+ICsKPiArCWlmIChldnRbMV0gJiBFVlRRXzFfUG5VKQo+ICsJ CXBlcm0gfD0gSU9NTVVfRkFVTFRfUEVSTV9QUklWOwo+ICsKPiArCXN3aXRjaCAoRklFTERfR0VU KEVWVFFfMF9JRCwgZXZ0WzBdKSkgewo+ICsJY2FzZSBFVlRfSURfVFJBTlNMQVRJT05fRkFVTFQ6 Cj4gKwljYXNlIEVWVF9JRF9BRERSX1NJWkVfRkFVTFQ6Cj4gKwljYXNlIEVWVF9JRF9BQ0NFU1Nf RkFVTFQ6Cj4gKwkJcmVhc29uID0gSU9NTVVfRkFVTFRfUkVBU09OX1BURV9GRVRDSDsKRG9lc24n dCBpdCByYXRoZXIgbWFwIHRvIElPTU1VX0ZBVUxUX1JFQVNPTl9BQ0NFU1M/Ci8qIGFjY2VzcyBm bGFnIGNoZWNrIGZhaWxlZCAqLyIKPiArCQlicmVhazsKPiArCWNhc2UgRVZUX0lEX1BFUk1JU1NJ T05fRkFVTFQ6Cj4gKwkJcmVhc29uID0gSU9NTVVfRkFVTFRfUkVBU09OX1BFUk1JU1NJT047Cj4g KwkJYnJlYWs7Cj4gKwlkZWZhdWx0Ogo+ICsJCXJldHVybiAtRU9QTk9UU1VQUDsKPiArCX0KPiAr Cj4gKwlpZiAoZXZ0WzFdICYgRVZUUV8xX1NUQUxMKSB7Cj4gKwkJZmx0LT50eXBlID0gSU9NTVVf RkFVTFRfUEFHRV9SRVE7Cj4gKwkJZmx0LT5wcm0gPSAoc3RydWN0IGlvbW11X2ZhdWx0X3BhZ2Vf cmVxdWVzdCkgewo+ICsJCQkuZmxhZ3MgPSBJT01NVV9GQVVMVF9QQUdFX1JFUVVFU1RfTEFTVF9Q QUdFLAo+ICsJCQkuZ3JwaWQgPSBGSUVMRF9HRVQoRVZUUV8xX1NUQUcsIGV2dFsxXSksCj4gKwkJ CS5wZXJtID0gcGVybSwKPiArCQkJLmFkZHIgPSBGSUVMRF9HRVQoRVZUUV8yX0FERFIsIGV2dFsy XSksCj4gKwkJfTsKPiArCj4gKwkJaWYgKHNzaWRfdmFsaWQpIHsKPiArCQkJZmx0LT5wcm0uZmxh Z3MgfD0gSU9NTVVfRkFVTFRfUEFHRV9SRVFVRVNUX1BBU0lEX1ZBTElEOwo+ICsJCQlmbHQtPnBy bS5wYXNpZCA9IEZJRUxEX0dFVChFVlRRXzBfU1NJRCwgZXZ0WzBdKTsKPiArCQl9Cj4gKwl9IGVs c2Ugewo+ICsJCWZsdC0+dHlwZSA9IElPTU1VX0ZBVUxUX0RNQV9VTlJFQ09WOwo+ICsJCWZsdC0+ ZXZlbnQgPSAoc3RydWN0IGlvbW11X2ZhdWx0X3VucmVjb3ZlcmFibGUpIHsKPiArCQkJLnJlYXNv biA9IHJlYXNvbiwKPiArCQkJLmZsYWdzID0gSU9NTVVfRkFVTFRfVU5SRUNPVl9BRERSX1ZBTElE IHwKPiArCQkJCSBJT01NVV9GQVVMVF9VTlJFQ09WX0ZFVENIX0FERFJfVkFMSUQsCm5pdDogc2hh bGwgSU9NTVVfRkFVTFRfVU5SRUNPVl9GRVRDSF9BRERSX1ZBTElEIGJlIHNldCBoZXJlPyBTdXBw b3J0ZWQKdW5yZWNvdmVyYWJsZSBmYXVsdHMgZmVhdHVyZSB0aGUgSVBBIGZpZWxkIHdoaWNoIGlz IFVOS05PV04gZm9yIFMxCnRyYW5zbGF0aW9ucy4gZmV0Y2hfYWRkciByYXRoZXIgd2FzCmNvcnJl c3BvbmRpbmcgdG8gV0FMS19FQUJULkZldGNoX2FkZHIgdG8gbWUuCgo+ICsJCQkucGVybSA9IHBl cm0sCj4gKwkJCS5hZGRyID0gRklFTERfR0VUKEVWVFFfMl9BRERSLCBldnRbMl0pLAo+ICsJCQku ZmV0Y2hfYWRkciA9IEZJRUxEX0dFVChFVlRRXzNfSVBBLCBldnRbM10pLAo+ICsJCX07Cj4gKwo+ ICsJCWlmIChzc2lkX3ZhbGlkKSB7Cj4gKwkJCWZsdC0+ZXZlbnQuZmxhZ3MgfD0gSU9NTVVfRkFV TFRfVU5SRUNPVl9QQVNJRF9WQUxJRDsKPiArCQkJZmx0LT5ldmVudC5wYXNpZCA9IEZJRUxEX0dF VChFVlRRXzBfU1NJRCwgZXZ0WzBdKTsKPiArCQl9Cj4gKwl9Cj4gKwo+ICsJcmV0ID0gaW9tbXVf cmVwb3J0X2RldmljZV9mYXVsdChtYXN0ZXItPmRldiwgJmZhdWx0X2V2dCk7Cj4gKwlpZiAocmV0 ICYmIGZsdC0+dHlwZSA9PSBJT01NVV9GQVVMVF9QQUdFX1JFUSkgewo+ICsJCS8qIE5vYm9keSBj YXJlZCwgYWJvcnQgdGhlIGFjY2VzcyAqLwo+ICsJCXN0cnVjdCBpb21tdV9wYWdlX3Jlc3BvbnNl IHJlc3AgPSB7Cj4gKwkJCS5wYXNpZAkJPSBmbHQtPnBybS5wYXNpZCwKPiArCQkJLmdycGlkCQk9 IGZsdC0+cHJtLmdycGlkLAo+ICsJCQkuY29kZQkJPSBJT01NVV9QQUdFX1JFU1BfRkFJTFVSRSwK PiArCQl9Owo+ICsJCWFybV9zbW11X3BhZ2VfcmVzcG9uc2UobWFzdGVyLT5kZXYsICZmYXVsdF9l dnQsICZyZXNwKTsKPiArCX0KPiArCj4gKwlyZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICBzdGF0aWMg aXJxcmV0dXJuX3QgYXJtX3NtbXVfZXZ0cV90aHJlYWQoaW50IGlycSwgdm9pZCAqZGV2KQo+ICB7 Cj4gLQlpbnQgaTsKPiArCWludCBpLCByZXQ7Cj4gIAlzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpz bW11ID0gZGV2Owo+ICAJc3RydWN0IGFybV9zbW11X3F1ZXVlICpxID0gJnNtbXUtPmV2dHEucTsK PiAgCXN0cnVjdCBhcm1fc21tdV9sbF9xdWV1ZSAqbGxxID0gJnEtPmxscTsKPiBAQCAtMTM5NCw2 ICsxNTIyLDEwIEBAIHN0YXRpYyBpcnFyZXR1cm5fdCBhcm1fc21tdV9ldnRxX3RocmVhZChpbnQg aXJxLCB2b2lkICpkZXYpCj4gIAkJd2hpbGUgKCFxdWV1ZV9yZW1vdmVfcmF3KHEsIGV2dCkpIHsK PiAgCQkJdTggaWQgPSBGSUVMRF9HRVQoRVZUUV8wX0lELCBldnRbMF0pOwo+ICAKPiArCQkJcmV0 ID0gYXJtX3NtbXVfaGFuZGxlX2V2dChzbW11LCBldnQpOwo+ICsJCQlpZiAoIXJldCkKPiArCQkJ CWNvbnRpbnVlOwo+ICsKPiAgCQkJZGV2X2luZm8oc21tdS0+ZGV2LCAiZXZlbnQgMHglMDJ4IHJl Y2VpdmVkOlxuIiwgaWQpOwo+ICAJCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShldnQpOyAr K2kpCj4gIAkJCQlkZXZfaW5mbyhzbW11LT5kZXYsICJcdDB4JTAxNmxseFxuIiwKPiBAQCAtMTky OCw2ICsyMDYwLDggQEAgc3RhdGljIGludCBhcm1fc21tdV9kb21haW5fZmluYWxpc2VfczEoc3Ry dWN0IGFybV9zbW11X2RvbWFpbiAqc21tdV9kb21haW4sCj4gIAo+ICAJY2ZnLT5zMWNkbWF4ID0g bWFzdGVyLT5zc2lkX2JpdHM7Cj4gIAo+ICsJc21tdV9kb21haW4tPnN0YWxsX2VuYWJsZWQgPSBt YXN0ZXItPnN0YWxsX2VuYWJsZWQ7Cj4gKwo+ICAJcmV0ID0gYXJtX3NtbXVfYWxsb2NfY2RfdGFi bGVzKHNtbXVfZG9tYWluKTsKPiAgCWlmIChyZXQpCj4gIAkJZ290byBvdXRfZnJlZV9hc2lkOwo+ IEBAIC0yMjc1LDYgKzI0MDksMTIgQEAgc3RhdGljIGludCBhcm1fc21tdV9hdHRhY2hfZGV2KHN0 cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbiwgc3RydWN0IGRldmljZSAqZGV2KQo+ICAJCQlzbW11 X2RvbWFpbi0+czFfY2ZnLnMxY2RtYXgsIG1hc3Rlci0+c3NpZF9iaXRzKTsKPiAgCQlyZXQgPSAt RUlOVkFMOwo+ICAJCWdvdG8gb3V0X3VubG9jazsKPiArCX0gZWxzZSBpZiAoc21tdV9kb21haW4t PnN0YWdlID09IEFSTV9TTU1VX0RPTUFJTl9TMSAmJgo+ICsJCSAgIHNtbXVfZG9tYWluLT5zdGFs bF9lbmFibGVkICE9IG1hc3Rlci0+c3RhbGxfZW5hYmxlZCkgewo+ICsJCWRldl9lcnIoZGV2LCAi Y2Fubm90IGF0dGFjaCB0byBzdGFsbC0lcyBkb21haW5cbiIsCj4gKwkJCXNtbXVfZG9tYWluLT5z dGFsbF9lbmFibGVkID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7Cj4gKwkJcmV0ID0gLUVJTlZB TDsKPiArCQlnb3RvIG91dF91bmxvY2s7Cj4gIAl9Cj4gIAo+ICAJbWFzdGVyLT5kb21haW4gPSBz bW11X2RvbWFpbjsKPiBAQCAtMjUxMCw2ICsyNjUwLDExIEBAIHN0YXRpYyBzdHJ1Y3QgaW9tbXVf ZGV2aWNlICphcm1fc21tdV9wcm9iZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQo+ICAJCW1h c3Rlci0+c3NpZF9iaXRzID0gbWluX3QodTgsIG1hc3Rlci0+c3NpZF9iaXRzLAo+ICAJCQkJCSAg Q1RYREVTQ19MSU5FQVJfQ0RNQVgpOwo+ICAKPiArCWlmICgoc21tdS0+ZmVhdHVyZXMgJiBBUk1f U01NVV9GRUFUX1NUQUxMUyAmJgo+ICsJICAgICBkZXZpY2VfcHJvcGVydHlfcmVhZF9ib29sKGRl diwgImRtYS1jYW4tc3RhbGwiKSkgfHwKPiArCSAgICBzbW11LT5mZWF0dXJlcyAmIEFSTV9TTU1V X0ZFQVRfU1RBTExfRk9SQ0UpCj4gKwkJbWFzdGVyLT5zdGFsbF9lbmFibGVkID0gdHJ1ZTsKPiAr Cj4gIAlyZXR1cm4gJnNtbXUtPmlvbW11Owo+ICAKPiAgZXJyX2ZyZWVfbWFzdGVyOgo+IEBAIC0y NTI3LDcgKzI2NzIsOCBAQCBzdGF0aWMgdm9pZCBhcm1fc21tdV9yZWxlYXNlX2RldmljZShzdHJ1 Y3QgZGV2aWNlICpkZXYpCj4gIAkJcmV0dXJuOwo+ICAKPiAgCW1hc3RlciA9IGRldl9pb21tdV9w cml2X2dldChkZXYpOwo+IC0JV0FSTl9PTihhcm1fc21tdV9tYXN0ZXJfc3ZhX2VuYWJsZWQobWFz dGVyKSk7Cj4gKwlpZiAoV0FSTl9PTihhcm1fc21tdV9tYXN0ZXJfc3ZhX2VuYWJsZWQobWFzdGVy KSkpCj4gKwkJaW9wZl9xdWV1ZV9yZW1vdmVfZGV2aWNlKG1hc3Rlci0+c21tdS0+ZXZ0cS5pb3Bm LCBkZXYpOwo+ICAJYXJtX3NtbXVfZGV0YWNoX2RldihtYXN0ZXIpOwo+ICAJYXJtX3NtbXVfZGlz YWJsZV9wYXNpZChtYXN0ZXIpOwo+ICAJYXJtX3NtbXVfcmVtb3ZlX21hc3RlcihtYXN0ZXIpOwo+ IEBAIC0yNjU1LDYgKzI4MDEsOCBAQCBzdGF0aWMgYm9vbCBhcm1fc21tdV9kZXZfaGFzX2ZlYXR1 cmUoc3RydWN0IGRldmljZSAqZGV2LAo+ICAJCXJldHVybiBmYWxzZTsKPiAgCj4gIAlzd2l0Y2gg KGZlYXQpIHsKPiArCWNhc2UgSU9NTVVfREVWX0ZFQVRfSU9QRjoKPiArCQlyZXR1cm4gYXJtX3Nt bXVfbWFzdGVyX2lvcGZfc3VwcG9ydGVkKG1hc3Rlcik7Cj4gIAljYXNlIElPTU1VX0RFVl9GRUFU X1NWQToKPiAgCQlyZXR1cm4gYXJtX3NtbXVfbWFzdGVyX3N2YV9zdXBwb3J0ZWQobWFzdGVyKTsK PiAgCWRlZmF1bHQ6Cj4gQEAgLTI2NzEsNiArMjgxOSw4IEBAIHN0YXRpYyBib29sIGFybV9zbW11 X2Rldl9mZWF0dXJlX2VuYWJsZWQoc3RydWN0IGRldmljZSAqZGV2LAo+ICAJCXJldHVybiBmYWxz ZTsKPiAgCj4gIAlzd2l0Y2ggKGZlYXQpIHsKPiArCWNhc2UgSU9NTVVfREVWX0ZFQVRfSU9QRjoK PiArCQlyZXR1cm4gbWFzdGVyLT5pb3BmX2VuYWJsZWQ7Cj4gIAljYXNlIElPTU1VX0RFVl9GRUFU X1NWQToKPiAgCQlyZXR1cm4gYXJtX3NtbXVfbWFzdGVyX3N2YV9lbmFibGVkKG1hc3Rlcik7Cj4g IAlkZWZhdWx0Ogo+IEBAIC0yNjgxLDYgKzI4MzEsOCBAQCBzdGF0aWMgYm9vbCBhcm1fc21tdV9k ZXZfZmVhdHVyZV9lbmFibGVkKHN0cnVjdCBkZXZpY2UgKmRldiwKPiAgc3RhdGljIGludCBhcm1f c21tdV9kZXZfZW5hYmxlX2ZlYXR1cmUoc3RydWN0IGRldmljZSAqZGV2LAo+ICAJCQkJICAgICAg IGVudW0gaW9tbXVfZGV2X2ZlYXR1cmVzIGZlYXQpCj4gIHsKPiArCXN0cnVjdCBhcm1fc21tdV9t YXN0ZXIgKm1hc3RlciA9IGRldl9pb21tdV9wcml2X2dldChkZXYpOwo+ICsKPiAgCWlmICghYXJt X3NtbXVfZGV2X2hhc19mZWF0dXJlKGRldiwgZmVhdCkpCj4gIAkJcmV0dXJuIC1FTk9ERVY7Cj4g IAo+IEBAIC0yNjg4LDggKzI4NDAsMTEgQEAgc3RhdGljIGludCBhcm1fc21tdV9kZXZfZW5hYmxl X2ZlYXR1cmUoc3RydWN0IGRldmljZSAqZGV2LAo+ICAJCXJldHVybiAtRUJVU1k7Cj4gIAo+ICAJ c3dpdGNoIChmZWF0KSB7Cj4gKwljYXNlIElPTU1VX0RFVl9GRUFUX0lPUEY6Cj4gKwkJbWFzdGVy LT5pb3BmX2VuYWJsZWQgPSB0cnVlOwo+ICsJCXJldHVybiAwOwo+ICAJY2FzZSBJT01NVV9ERVZf RkVBVF9TVkE6Cj4gLQkJcmV0dXJuIGFybV9zbW11X21hc3Rlcl9lbmFibGVfc3ZhKGRldl9pb21t dV9wcml2X2dldChkZXYpKTsKPiArCQlyZXR1cm4gYXJtX3NtbXVfbWFzdGVyX2VuYWJsZV9zdmEo bWFzdGVyKTsKPiAgCWRlZmF1bHQ6Cj4gIAkJcmV0dXJuIC1FSU5WQUw7Cj4gIAl9Cj4gQEAgLTI2 OTgsMTIgKzI4NTMsMTkgQEAgc3RhdGljIGludCBhcm1fc21tdV9kZXZfZW5hYmxlX2ZlYXR1cmUo c3RydWN0IGRldmljZSAqZGV2LAo+ICBzdGF0aWMgaW50IGFybV9zbW11X2Rldl9kaXNhYmxlX2Zl YXR1cmUoc3RydWN0IGRldmljZSAqZGV2LAo+ICAJCQkJCWVudW0gaW9tbXVfZGV2X2ZlYXR1cmVz IGZlYXQpCj4gIHsKPiArCXN0cnVjdCBhcm1fc21tdV9tYXN0ZXIgKm1hc3RlciA9IGRldl9pb21t dV9wcml2X2dldChkZXYpOwo+ICsKPiAgCWlmICghYXJtX3NtbXVfZGV2X2ZlYXR1cmVfZW5hYmxl ZChkZXYsIGZlYXQpKQo+ICAJCXJldHVybiAtRUlOVkFMOwo+ICAKPiAgCXN3aXRjaCAoZmVhdCkg ewo+ICsJY2FzZSBJT01NVV9ERVZfRkVBVF9JT1BGOgo+ICsJCWlmIChtYXN0ZXItPnN2YV9lbmFi bGVkKQo+ICsJCQlyZXR1cm4gLUVCVVNZOwo+ICsJCW1hc3Rlci0+aW9wZl9lbmFibGVkID0gZmFs c2U7Cj4gKwkJcmV0dXJuIDA7Cj4gIAljYXNlIElPTU1VX0RFVl9GRUFUX1NWQToKPiAtCQlyZXR1 cm4gYXJtX3NtbXVfbWFzdGVyX2Rpc2FibGVfc3ZhKGRldl9pb21tdV9wcml2X2dldChkZXYpKTsK PiArCQlyZXR1cm4gYXJtX3NtbXVfbWFzdGVyX2Rpc2FibGVfc3ZhKG1hc3Rlcik7Cj4gIAlkZWZh dWx0Ogo+ICAJCXJldHVybiAtRUlOVkFMOwo+ICAJfQo+IEBAIC0yNzM0LDYgKzI4OTYsNyBAQCBz dGF0aWMgc3RydWN0IGlvbW11X29wcyBhcm1fc21tdV9vcHMgPSB7Cj4gIAkuc3ZhX2JpbmQJCT0g YXJtX3NtbXVfc3ZhX2JpbmQsCj4gIAkuc3ZhX3VuYmluZAkJPSBhcm1fc21tdV9zdmFfdW5iaW5k LAo+ICAJLnN2YV9nZXRfcGFzaWQJCT0gYXJtX3NtbXVfc3ZhX2dldF9wYXNpZCwKPiArCS5wYWdl X3Jlc3BvbnNlCQk9IGFybV9zbW11X3BhZ2VfcmVzcG9uc2UsCj4gIAkucGdzaXplX2JpdG1hcAkJ PSAtMVVMLCAvKiBSZXN0cmljdGVkIGR1cmluZyBkZXZpY2UgYXR0YWNoICovCj4gIH07Cj4gIAo+ IEBAIC0yODMxLDYgKzI5OTQsMTMgQEAgc3RhdGljIGludCBhcm1fc21tdV9pbml0X3F1ZXVlcyhz dHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11KQo+ICAJaWYgKHJldCkKPiAgCQlyZXR1cm4gcmV0 Owo+ICAKPiArCWlmICgoc21tdS0+ZmVhdHVyZXMgJiBBUk1fU01NVV9GRUFUX1NWQSkgJiYKPiAr CSAgICAoc21tdS0+ZmVhdHVyZXMgJiBBUk1fU01NVV9GRUFUX1NUQUxMUykpIHsKPiArCQlzbW11 LT5ldnRxLmlvcGYgPSBpb3BmX3F1ZXVlX2FsbG9jKGRldl9uYW1lKHNtbXUtPmRldikpOwo+ICsJ CWlmICghc21tdS0+ZXZ0cS5pb3BmKQo+ICsJCQlyZXR1cm4gLUVOT01FTTsKPiArCX0KPiArCj4g IAkvKiBwcmlxICovCj4gIAlpZiAoIShzbW11LT5mZWF0dXJlcyAmIEFSTV9TTU1VX0ZFQVRfUFJJ KSkKPiAgCQlyZXR1cm4gMDsKPiBAQCAtMzc0Niw2ICszOTE2LDcgQEAgc3RhdGljIGludCBhcm1f c21tdV9kZXZpY2VfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4gIAlpb21t dV9kZXZpY2VfdW5yZWdpc3Rlcigmc21tdS0+aW9tbXUpOwo+ICAJaW9tbXVfZGV2aWNlX3N5c2Zz X3JlbW92ZSgmc21tdS0+aW9tbXUpOwo+ICAJYXJtX3NtbXVfZGV2aWNlX2Rpc2FibGUoc21tdSk7 Cj4gKwlpb3BmX3F1ZXVlX2ZyZWUoc21tdS0+ZXZ0cS5pb3BmKTsKPiAgCj4gIAlyZXR1cm4gMDsK PiAgfQo+IApUaGFua3MKCkVyaWMKCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdApsaW51eC1hcm0ta2Vy bmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1h bi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCg==