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 Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id EB7ECC433F5 for ; Thu, 24 Feb 2022 10:13:46 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231250AbiBXKOP (ORCPT ); Thu, 24 Feb 2022 05:14:15 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58968 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229813AbiBXKOL (ORCPT ); Thu, 24 Feb 2022 05:14:11 -0500 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 3AC0C1A2758 for ; Thu, 24 Feb 2022 02:13:41 -0800 (PST) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 02E93ED1; Thu, 24 Feb 2022 02:13:41 -0800 (PST) Received: from lpieralisi (e121166-lin.cambridge.arm.com [10.1.196.255]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 1E56B3F70D; Thu, 24 Feb 2022 02:13:39 -0800 (PST) Date: Thu, 24 Feb 2022 10:13:33 +0000 From: Lorenzo Pieralisi To: Shameer Kolothum Cc: linux-arm-kernel@lists.infradead.org, linux-acpi@vger.kernel.org, iommu@lists.linux-foundation.org, linuxarm@huawei.com, joro@8bytes.org, robin.murphy@arm.com, will@kernel.org, wanghuiqiang@huawei.com, guohanjun@huawei.com, steven.price@arm.com, Sami.Mujawar@arm.com, jon@solid-run.com, eric.auger@redhat.com, yangyicong@huawei.com Subject: Re: [PATCH v8 03/11] ACPI/IORT: Add helper functions to parse RMR nodes Message-ID: <20220224101333.GA3178@lpieralisi> References: <20220221154344.2126-1-shameerali.kolothum.thodi@huawei.com> <20220221154344.2126-4-shameerali.kolothum.thodi@huawei.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20220221154344.2126-4-shameerali.kolothum.thodi@huawei.com> User-Agent: Mutt/1.9.4 (2018-02-28) Precedence: bulk List-ID: X-Mailing-List: linux-acpi@vger.kernel.org On Mon, Feb 21, 2022 at 03:43:36PM +0000, Shameer Kolothum wrote: > The helper functions here parse through the IORT RMR nodes and > populate a reserved region list corresponding to a given iommu > and device(optional). These also go through the ID mappings of > the RMR node and retrieves all the SIDs associated with a RMR > descriptor. > > Signed-off-by: Shameer Kolothum > --- > drivers/acpi/arm64/iort.c | 225 ++++++++++++++++++++++++++++++++++++++ > 1 file changed, 225 insertions(+) I have very minor comments - I would ask Robin to ack the updated flags management. Functions should be introduced where they are used, this patch is not bisectable: drivers/acpi/arm64/iort.c:1028:13: warning: ‘iort_find_rmrs’ defined but not used [-Wunused-function] 1028 | static void iort_find_rmrs(struct acpi_iort_node *iommu, struct device *dev, > diff --git a/drivers/acpi/arm64/iort.c b/drivers/acpi/arm64/iort.c > index 0730c4dbb700..05da9ebff50a 100644 > --- a/drivers/acpi/arm64/iort.c > +++ b/drivers/acpi/arm64/iort.c > @@ -830,6 +830,231 @@ static struct acpi_iort_node *iort_get_msi_resv_iommu(struct device *dev) > return NULL; > } > > +static void iort_rmr_desc_check_overlap(struct acpi_iort_rmr_desc *desc, u32 count) > +{ > + int i, j; > + > + for (i = 0; i < count; i++) { > + u64 end, start = desc[i].base_address, length = desc[i].length; > + > + end = start + length - 1; We could probably check for length != 0, the kernel is not there to validate firmware but this would not hurt either. > + > + /* Check for address overlap */ > + for (j = i + 1; j < count; j++) { > + u64 e_start = desc[j].base_address; > + u64 e_end = e_start + desc[j].length - 1; > + > + if (start <= e_end && end >= e_start) > + pr_err(FW_BUG "RMR descriptor[0x%llx - 0x%llx] overlaps, continue anyway\n", > + start, end); > + } > + } > +} > + > +/* > + * Please note, we will keep the already allocated RMR reserve > + * regions in case of a memory allocation failure. > + */ > +static void iort_rmr_get_resv_regions(struct acpi_iort_node *node, > + struct acpi_iort_node *smmu, > + u32 *sids, u32 num_sids, > + struct list_head *head) > +{ > + struct acpi_iort_rmr *rmr = (struct acpi_iort_rmr *)node->node_data; > + struct acpi_iort_rmr_desc *rmr_desc; > + int i; > + > + rmr_desc = ACPI_ADD_PTR(struct acpi_iort_rmr_desc, node, > + rmr->rmr_offset); > + > + iort_rmr_desc_check_overlap(rmr_desc, rmr->rmr_count); > + > + for (i = 0; i < rmr->rmr_count; i++, rmr_desc++) { > + struct iommu_resv_region *region; > + enum iommu_resv_type type; > + u32 *sids_copy; > + int prot = IOMMU_READ | IOMMU_WRITE; > + u64 addr = rmr_desc->base_address, size = rmr_desc->length; > + > + if (!IS_ALIGNED(addr, SZ_64K) || !IS_ALIGNED(size, SZ_64K)) { > + /* PAGE align base addr and size */ > + addr &= PAGE_MASK; > + size = PAGE_ALIGN(size + offset_in_page(rmr_desc->base_address)); > + > + pr_err(FW_BUG "RMR descriptor[0x%llx - 0x%llx] not aligned to 64K, continue with [0x%llx - 0x%llx]\n", > + rmr_desc->base_address, > + rmr_desc->base_address + rmr_desc->length - 1, > + addr, addr + size - 1); > + } > + > + if (rmr->flags & ACPI_IORT_RMR_REMAP_PERMITTED) > + type = IOMMU_RESV_DIRECT_RELAXABLE; > + else > + type = IOMMU_RESV_DIRECT; > + > + if (rmr->flags & ACPI_IORT_RMR_ACCESS_PRIVILEGE) > + prot |= IOMMU_PRIV; > + > + /* Attributes 0x00 - 0x03 represents device memory */ > + if (ACPI_IORT_RMR_ACCESS_ATTRIBUTES(rmr->flags) <= > + ACPI_IORT_RMR_ATTR_DEVICE_GRE) > + prot |= IOMMU_MMIO; > + else if (ACPI_IORT_RMR_ACCESS_ATTRIBUTES(rmr->flags) == > + ACPI_IORT_RMR_ATTR_NORMAL) > + prot |= IOMMU_CACHE; > + > + /* Create a copy of sids array to associate with this resv region */ > + sids_copy = kmemdup(sids, num_sids * sizeof(*sids), GFP_KERNEL); > + if (!sids_copy) > + return; > + > + region = iommu_alloc_resv_region(addr, size, prot, type); > + if (!region) { > + kfree(sids_copy); > + return; > + } > + > + region->fw_data.rmr.sids = sids_copy; > + region->fw_data.rmr.num_sids = num_sids; > + list_add_tail(®ion->list, head); > + } > +} > + > +static u32 *iort_rmr_alloc_sids(u32 *sids, u32 count, u32 id_start, > + u32 new_count) > +{ > + u32 *new_sids; > + u32 total_count = count + new_count; > + int i; > + > + new_sids = krealloc_array(sids, count + new_count, > + sizeof(*new_sids), GFP_KERNEL); > + if (!new_sids) > + return NULL; > + > + /*Update new ones */ /* Update new ones */ I'd remove the comment, or improve it, as it stands it does not help much - we can read the code. > + for (i = count; i < total_count; i++) > + new_sids[i] = id_start++; > + > + return new_sids; > +} > + > +static bool iort_rmr_has_dev(struct device *dev, u32 id_start, > + u32 id_count) > +{ > + int i; > + struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev); > + > + if (dev_is_pci(dev)) { > + struct pci_dev *pdev = to_pci_dev(dev); > + struct pci_host_bridge *host = pci_find_host_bridge(pdev->bus); > + > + if (!host->preserve_config) Please add a comment here - it helps explain the logic behind it. Thanks, Lorenzo > + return false; > + } > + > + for (i = 0; i < fwspec->num_ids; i++) { > + if (fwspec->ids[i] >= id_start && > + fwspec->ids[i] <= id_start + id_count) > + return true; > + } > + > + return false; > +} > + > +static void iort_node_get_rmr_info(struct acpi_iort_node *node, > + struct acpi_iort_node *iommu, > + struct device *dev, struct list_head *head) > +{ > + struct acpi_iort_node *smmu = NULL; > + struct acpi_iort_rmr *rmr; > + struct acpi_iort_id_mapping *map; > + u32 *sids = NULL; > + u32 num_sids = 0; > + int i; > + > + if (!node->mapping_offset || !node->mapping_count) { > + pr_err(FW_BUG "Invalid ID mapping, skipping RMR node %p\n", > + node); > + return; > + } > + > + rmr = (struct acpi_iort_rmr *)node->node_data; > + if (!rmr->rmr_offset || !rmr->rmr_count) > + return; > + > + map = ACPI_ADD_PTR(struct acpi_iort_id_mapping, node, > + node->mapping_offset); > + > + /* > + * Go through the ID mappings and see if we have a match > + * for smmu and dev(if !NULL). If found, get the sids > + * for the Node. > + * Please note, id_count is equal to the number of IDs > + * in the range minus one. > + */ > + for (i = 0; i < node->mapping_count; i++, map++) { > + struct acpi_iort_node *parent; > + > + if (!map->id_count) > + continue; > + > + parent = ACPI_ADD_PTR(struct acpi_iort_node, iort_table, > + map->output_reference); > + if (parent != iommu) > + continue; > + > + /* If dev is valid, check RMR node corresponds to the dev sid */ > + if (dev && !iort_rmr_has_dev(dev, map->output_base, > + map->id_count)) > + continue; > + > + /* Retrieve sids associated with the Node. */ > + sids = iort_rmr_alloc_sids(sids, num_sids, map->output_base, > + map->id_count + 1); > + if (!sids) > + return; > + > + num_sids += map->id_count + 1; > + } > + > + if (!sids) > + return; > + > + iort_rmr_get_resv_regions(node, smmu, sids, num_sids, head); > + kfree(sids); > +} > + > +static void iort_find_rmrs(struct acpi_iort_node *iommu, struct device *dev, > + struct list_head *head) > +{ > + struct acpi_table_iort *iort; > + struct acpi_iort_node *iort_node, *iort_end; > + int i; > + > + if (iort_table->revision < 5) > + return; > + > + iort = (struct acpi_table_iort *)iort_table; > + > + iort_node = ACPI_ADD_PTR(struct acpi_iort_node, iort, > + iort->node_offset); > + iort_end = ACPI_ADD_PTR(struct acpi_iort_node, iort, > + iort_table->length); > + > + for (i = 0; i < iort->node_count; i++) { > + if (WARN_TAINT(iort_node >= iort_end, TAINT_FIRMWARE_WORKAROUND, > + "IORT node pointer overflows, bad table!\n")) > + return; > + > + if (iort_node->type == ACPI_IORT_NODE_RMR) > + iort_node_get_rmr_info(iort_node, iommu, dev, head); > + > + iort_node = ACPI_ADD_PTR(struct acpi_iort_node, iort_node, > + iort_node->length); > + } > +} > + > /** > * iort_iommu_msi_get_resv_regions - Reserved region driver helper > * @dev: Device from iommu_get_resv_regions() > -- > 2.25.1 > 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 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 smtp.lore.kernel.org (Postfix) with ESMTPS id 625F4C433EF for ; Thu, 24 Feb 2022 10:13:46 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp4.osuosl.org (Postfix) with ESMTP id 0CA34408E3; Thu, 24 Feb 2022 10:13:46 +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 UIBXbDtf0_PK; Thu, 24 Feb 2022 10:13:45 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by smtp4.osuosl.org (Postfix) with ESMTPS id 96A59408D0; Thu, 24 Feb 2022 10:13:44 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 6C48AC001A; Thu, 24 Feb 2022 10:13:44 +0000 (UTC) Received: from smtp3.osuosl.org (smtp3.osuosl.org [IPv6:2605:bc80:3010::136]) by lists.linuxfoundation.org (Postfix) with ESMTP id 5FC6CC0011 for ; Thu, 24 Feb 2022 10:13:43 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp3.osuosl.org (Postfix) with ESMTP id 4DB8C60B2D for ; Thu, 24 Feb 2022 10:13:43 +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 18A_xZQpofm0 for ; Thu, 24 Feb 2022 10:13:42 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.8.0 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp3.osuosl.org (Postfix) with ESMTP id 2EF2C60AC0 for ; Thu, 24 Feb 2022 10:13:41 +0000 (UTC) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 02E93ED1; Thu, 24 Feb 2022 02:13:41 -0800 (PST) Received: from lpieralisi (e121166-lin.cambridge.arm.com [10.1.196.255]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 1E56B3F70D; Thu, 24 Feb 2022 02:13:39 -0800 (PST) Date: Thu, 24 Feb 2022 10:13:33 +0000 From: Lorenzo Pieralisi To: Shameer Kolothum Subject: Re: [PATCH v8 03/11] ACPI/IORT: Add helper functions to parse RMR nodes Message-ID: <20220224101333.GA3178@lpieralisi> References: <20220221154344.2126-1-shameerali.kolothum.thodi@huawei.com> <20220221154344.2126-4-shameerali.kolothum.thodi@huawei.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20220221154344.2126-4-shameerali.kolothum.thodi@huawei.com> User-Agent: Mutt/1.9.4 (2018-02-28) Cc: will@kernel.org, jon@solid-run.com, linuxarm@huawei.com, steven.price@arm.com, linux-acpi@vger.kernel.org, iommu@lists.linux-foundation.org, wanghuiqiang@huawei.com, guohanjun@huawei.com, yangyicong@huawei.com, Sami.Mujawar@arm.com, robin.murphy@arm.com, linux-arm-kernel@lists.infradead.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" T24gTW9uLCBGZWIgMjEsIDIwMjIgYXQgMDM6NDM6MzZQTSArMDAwMCwgU2hhbWVlciBLb2xvdGh1 bSB3cm90ZToKPiBUaGUgaGVscGVyIGZ1bmN0aW9ucyBoZXJlIHBhcnNlIHRocm91Z2ggdGhlIElP UlQgUk1SIG5vZGVzIGFuZAo+IHBvcHVsYXRlIGEgcmVzZXJ2ZWQgcmVnaW9uIGxpc3QgIGNvcnJl c3BvbmRpbmcgdG8gYSBnaXZlbiBpb21tdQo+IGFuZCBkZXZpY2Uob3B0aW9uYWwpLiBUaGVzZSBh bHNvIGdvIHRocm91Z2ggdGhlIElEIG1hcHBpbmdzIG9mCj4gdGhlIFJNUiBub2RlIGFuZCByZXRy aWV2ZXMgYWxsIHRoZSBTSURzIGFzc29jaWF0ZWQgd2l0aCBhIFJNUgo+IGRlc2NyaXB0b3IuCj4g Cj4gU2lnbmVkLW9mZi1ieTogU2hhbWVlciBLb2xvdGh1bSA8c2hhbWVlcmFsaS5rb2xvdGh1bS50 aG9kaUBodWF3ZWkuY29tPgo+IC0tLQo+ICBkcml2ZXJzL2FjcGkvYXJtNjQvaW9ydC5jIHwgMjI1 ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCj4gIDEgZmlsZSBjaGFuZ2Vk LCAyMjUgaW5zZXJ0aW9ucygrKQoKSSBoYXZlIHZlcnkgbWlub3IgY29tbWVudHMgLSBJIHdvdWxk IGFzayBSb2JpbiB0byBhY2sgdGhlIHVwZGF0ZWQKZmxhZ3MgbWFuYWdlbWVudC4KCkZ1bmN0aW9u cyBzaG91bGQgYmUgaW50cm9kdWNlZCB3aGVyZSB0aGV5IGFyZSB1c2VkLCB0aGlzIHBhdGNoCmlz IG5vdCBiaXNlY3RhYmxlOgoKZHJpdmVycy9hY3BpL2FybTY0L2lvcnQuYzoxMDI4OjEzOiB3YXJu aW5nOiDigJhpb3J0X2ZpbmRfcm1yc+KAmSBkZWZpbmVkIGJ1dCBub3QgdXNlZCBbLVd1bnVzZWQt ZnVuY3Rpb25dCiAxMDI4IHwgc3RhdGljIHZvaWQgaW9ydF9maW5kX3JtcnMoc3RydWN0IGFjcGlf aW9ydF9ub2RlICppb21tdSwgc3RydWN0IGRldmljZSAqZGV2LAoKPiBkaWZmIC0tZ2l0IGEvZHJp dmVycy9hY3BpL2FybTY0L2lvcnQuYyBiL2RyaXZlcnMvYWNwaS9hcm02NC9pb3J0LmMKPiBpbmRl eCAwNzMwYzRkYmI3MDAuLjA1ZGE5ZWJmZjUwYSAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2FjcGkv YXJtNjQvaW9ydC5jCj4gKysrIGIvZHJpdmVycy9hY3BpL2FybTY0L2lvcnQuYwo+IEBAIC04MzAs NiArODMwLDIzMSBAQCBzdGF0aWMgc3RydWN0IGFjcGlfaW9ydF9ub2RlICppb3J0X2dldF9tc2lf cmVzdl9pb21tdShzdHJ1Y3QgZGV2aWNlICpkZXYpCj4gIAlyZXR1cm4gTlVMTDsKPiAgfQo+ICAK PiArc3RhdGljIHZvaWQgaW9ydF9ybXJfZGVzY19jaGVja19vdmVybGFwKHN0cnVjdCBhY3BpX2lv cnRfcm1yX2Rlc2MgKmRlc2MsIHUzMiBjb3VudCkKPiArewo+ICsJaW50IGksIGo7Cj4gKwo+ICsJ Zm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKPiArCQl1NjQgZW5kLCBzdGFydCA9IGRlc2Nb aV0uYmFzZV9hZGRyZXNzLCBsZW5ndGggPSBkZXNjW2ldLmxlbmd0aDsKPiArCj4gKwkJZW5kID0g c3RhcnQgKyBsZW5ndGggLSAxOwoKV2UgY291bGQgcHJvYmFibHkgY2hlY2sgZm9yIGxlbmd0aCAh PSAwLCB0aGUga2VybmVsIGlzIG5vdCB0aGVyZSB0bwp2YWxpZGF0ZSBmaXJtd2FyZSBidXQgdGhp cyB3b3VsZCBub3QgaHVydCBlaXRoZXIuCgo+ICsKPiArCQkvKiBDaGVjayBmb3IgYWRkcmVzcyBv dmVybGFwICovCj4gKwkJZm9yIChqID0gaSArIDE7IGogPCBjb3VudDsgaisrKSB7Cj4gKwkJCXU2 NCBlX3N0YXJ0ID0gZGVzY1tqXS5iYXNlX2FkZHJlc3M7Cj4gKwkJCXU2NCBlX2VuZCA9IGVfc3Rh cnQgKyBkZXNjW2pdLmxlbmd0aCAtIDE7Cj4gKwo+ICsJCQlpZiAoc3RhcnQgPD0gZV9lbmQgJiYg ZW5kID49IGVfc3RhcnQpCj4gKwkJCQlwcl9lcnIoRldfQlVHICJSTVIgZGVzY3JpcHRvclsweCVs bHggLSAweCVsbHhdIG92ZXJsYXBzLCBjb250aW51ZSBhbnl3YXlcbiIsCj4gKwkJCQkgICAgICAg c3RhcnQsIGVuZCk7Cj4gKwkJfQo+ICsJfQo+ICt9Cj4gKwo+ICsvKgo+ICsgKiBQbGVhc2Ugbm90 ZSwgd2Ugd2lsbCBrZWVwIHRoZSBhbHJlYWR5IGFsbG9jYXRlZCBSTVIgcmVzZXJ2ZQo+ICsgKiBy ZWdpb25zIGluIGNhc2Ugb2YgYSBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlLgo+ICsgKi8KPiAr c3RhdGljIHZvaWQgaW9ydF9ybXJfZ2V0X3Jlc3ZfcmVnaW9ucyhzdHJ1Y3QgYWNwaV9pb3J0X25v ZGUgKm5vZGUsCj4gKwkJCQkgICAgICBzdHJ1Y3QgYWNwaV9pb3J0X25vZGUgKnNtbXUsCj4gKwkJ CQkgICAgICB1MzIgKnNpZHMsIHUzMiBudW1fc2lkcywKPiArCQkJCSAgICAgIHN0cnVjdCBsaXN0 X2hlYWQgKmhlYWQpCj4gK3sKPiArCXN0cnVjdCBhY3BpX2lvcnRfcm1yICpybXIgPSAoc3RydWN0 IGFjcGlfaW9ydF9ybXIgKilub2RlLT5ub2RlX2RhdGE7Cj4gKwlzdHJ1Y3QgYWNwaV9pb3J0X3Jt cl9kZXNjICpybXJfZGVzYzsKPiArCWludCBpOwo+ICsKPiArCXJtcl9kZXNjID0gQUNQSV9BRERf UFRSKHN0cnVjdCBhY3BpX2lvcnRfcm1yX2Rlc2MsIG5vZGUsCj4gKwkJCQlybXItPnJtcl9vZmZz ZXQpOwo+ICsKPiArCWlvcnRfcm1yX2Rlc2NfY2hlY2tfb3ZlcmxhcChybXJfZGVzYywgcm1yLT5y bXJfY291bnQpOwo+ICsKPiArCWZvciAoaSA9IDA7IGkgPCBybXItPnJtcl9jb3VudDsgaSsrLCBy bXJfZGVzYysrKSB7Cj4gKwkJc3RydWN0IGlvbW11X3Jlc3ZfcmVnaW9uICpyZWdpb247Cj4gKwkJ ZW51bSBpb21tdV9yZXN2X3R5cGUgdHlwZTsKPiArCQl1MzIgICpzaWRzX2NvcHk7Cj4gKwkJaW50 IHByb3QgPSBJT01NVV9SRUFEIHwgSU9NTVVfV1JJVEU7Cj4gKwkJdTY0IGFkZHIgPSBybXJfZGVz Yy0+YmFzZV9hZGRyZXNzLCBzaXplID0gcm1yX2Rlc2MtPmxlbmd0aDsKPiArCj4gKwkJaWYgKCFJ U19BTElHTkVEKGFkZHIsIFNaXzY0SykgfHwgIUlTX0FMSUdORUQoc2l6ZSwgU1pfNjRLKSkgewo+ ICsJCQkvKiBQQUdFIGFsaWduIGJhc2UgYWRkciBhbmQgc2l6ZSAqLwo+ICsJCQlhZGRyICY9IFBB R0VfTUFTSzsKPiArCQkJc2l6ZSA9IFBBR0VfQUxJR04oc2l6ZSArIG9mZnNldF9pbl9wYWdlKHJt cl9kZXNjLT5iYXNlX2FkZHJlc3MpKTsKPiArCj4gKwkJCXByX2VycihGV19CVUcgIlJNUiBkZXNj cmlwdG9yWzB4JWxseCAtIDB4JWxseF0gbm90IGFsaWduZWQgdG8gNjRLLCBjb250aW51ZSB3aXRo IFsweCVsbHggLSAweCVsbHhdXG4iLAo+ICsJCQkgICAgICAgcm1yX2Rlc2MtPmJhc2VfYWRkcmVz cywKPiArCQkJICAgICAgIHJtcl9kZXNjLT5iYXNlX2FkZHJlc3MgKyBybXJfZGVzYy0+bGVuZ3Ro IC0gMSwKPiArCQkJICAgICAgIGFkZHIsIGFkZHIgKyBzaXplIC0gMSk7Cj4gKwkJfQo+ICsKPiAr CQlpZiAocm1yLT5mbGFncyAmIEFDUElfSU9SVF9STVJfUkVNQVBfUEVSTUlUVEVEKQo+ICsJCQl0 eXBlID0gSU9NTVVfUkVTVl9ESVJFQ1RfUkVMQVhBQkxFOwo+ICsJCWVsc2UKPiArCQkJdHlwZSA9 IElPTU1VX1JFU1ZfRElSRUNUOwo+ICsKPiArCQlpZiAocm1yLT5mbGFncyAmIEFDUElfSU9SVF9S TVJfQUNDRVNTX1BSSVZJTEVHRSkKPiArCQkJcHJvdCB8PSBJT01NVV9QUklWOwo+ICsKPiArCQkv KiBBdHRyaWJ1dGVzIDB4MDAgLSAweDAzIHJlcHJlc2VudHMgZGV2aWNlIG1lbW9yeSAqLwo+ICsJ CWlmIChBQ1BJX0lPUlRfUk1SX0FDQ0VTU19BVFRSSUJVVEVTKHJtci0+ZmxhZ3MpIDw9Cj4gKwkJ CQlBQ1BJX0lPUlRfUk1SX0FUVFJfREVWSUNFX0dSRSkKPiArCQkJcHJvdCB8PSBJT01NVV9NTUlP Owo+ICsJCWVsc2UgaWYgKEFDUElfSU9SVF9STVJfQUNDRVNTX0FUVFJJQlVURVMocm1yLT5mbGFn cykgPT0KPiArCQkJCUFDUElfSU9SVF9STVJfQVRUUl9OT1JNQUwpCj4gKwkJCXByb3QgfD0gSU9N TVVfQ0FDSEU7Cj4gKwo+ICsJCS8qIENyZWF0ZSBhIGNvcHkgb2Ygc2lkcyBhcnJheSB0byBhc3Nv Y2lhdGUgd2l0aCB0aGlzIHJlc3YgcmVnaW9uICovCj4gKwkJc2lkc19jb3B5ID0ga21lbWR1cChz aWRzLCBudW1fc2lkcyAqIHNpemVvZigqc2lkcyksIEdGUF9LRVJORUwpOwo+ICsJCWlmICghc2lk c19jb3B5KQo+ICsJCQlyZXR1cm47Cj4gKwo+ICsJCXJlZ2lvbiA9IGlvbW11X2FsbG9jX3Jlc3Zf cmVnaW9uKGFkZHIsIHNpemUsIHByb3QsIHR5cGUpOwo+ICsJCWlmICghcmVnaW9uKSB7Cj4gKwkJ CWtmcmVlKHNpZHNfY29weSk7Cj4gKwkJCXJldHVybjsKPiArCQl9Cj4gKwo+ICsJCXJlZ2lvbi0+ ZndfZGF0YS5ybXIuc2lkcyA9IHNpZHNfY29weTsKPiArCQlyZWdpb24tPmZ3X2RhdGEucm1yLm51 bV9zaWRzID0gbnVtX3NpZHM7Cj4gKwkJbGlzdF9hZGRfdGFpbCgmcmVnaW9uLT5saXN0LCBoZWFk KTsKPiArCX0KPiArfQo+ICsKPiArc3RhdGljIHUzMiAqaW9ydF9ybXJfYWxsb2Nfc2lkcyh1MzIg KnNpZHMsIHUzMiBjb3VudCwgdTMyIGlkX3N0YXJ0LAo+ICsJCQkJdTMyIG5ld19jb3VudCkKPiAr ewo+ICsJdTMyICpuZXdfc2lkczsKPiArCXUzMiB0b3RhbF9jb3VudCA9IGNvdW50ICsgbmV3X2Nv dW50Owo+ICsJaW50IGk7Cj4gKwo+ICsJbmV3X3NpZHMgPSBrcmVhbGxvY19hcnJheShzaWRzLCBj b3VudCArIG5ld19jb3VudCwKPiArCQkJCSAgc2l6ZW9mKCpuZXdfc2lkcyksIEdGUF9LRVJORUwp Owo+ICsJaWYgKCFuZXdfc2lkcykKPiArCQlyZXR1cm4gTlVMTDsKPiArCj4gKwkvKlVwZGF0ZSBu ZXcgb25lcyAqLwoKLyogVXBkYXRlIG5ldyBvbmVzICovCgpJJ2QgcmVtb3ZlIHRoZSBjb21tZW50 LCBvciBpbXByb3ZlIGl0LCBhcyBpdCBzdGFuZHMgaXQgZG9lcyBub3QKaGVscCBtdWNoIC0gd2Ug Y2FuIHJlYWQgdGhlIGNvZGUuCgo+ICsJZm9yIChpID0gY291bnQ7IGkgPCB0b3RhbF9jb3VudDsg aSsrKQo+ICsJCW5ld19zaWRzW2ldID0gaWRfc3RhcnQrKzsKPiArCj4gKwlyZXR1cm4gbmV3X3Np ZHM7Cj4gK30KPiArCj4gK3N0YXRpYyBib29sIGlvcnRfcm1yX2hhc19kZXYoc3RydWN0IGRldmlj ZSAqZGV2LCB1MzIgaWRfc3RhcnQsCj4gKwkJCSAgICAgdTMyIGlkX2NvdW50KQo+ICt7Cj4gKwlp bnQgaTsKPiArCXN0cnVjdCBpb21tdV9md3NwZWMgKmZ3c3BlYyA9IGRldl9pb21tdV9md3NwZWNf Z2V0KGRldik7Cj4gKwo+ICsJaWYgKGRldl9pc19wY2koZGV2KSkgewo+ICsJCXN0cnVjdCBwY2lf ZGV2ICpwZGV2ID0gdG9fcGNpX2RldihkZXYpOwo+ICsJCXN0cnVjdCBwY2lfaG9zdF9icmlkZ2Ug Kmhvc3QgPSBwY2lfZmluZF9ob3N0X2JyaWRnZShwZGV2LT5idXMpOwo+ICsKPiArCQlpZiAoIWhv c3QtPnByZXNlcnZlX2NvbmZpZykKClBsZWFzZSBhZGQgYSBjb21tZW50IGhlcmUgLSBpdCBoZWxw cyBleHBsYWluIHRoZSBsb2dpYyBiZWhpbmQgaXQuCgpUaGFua3MsCkxvcmVuem8KCj4gKwkJCXJl dHVybiBmYWxzZTsKPiArCX0KPiArCj4gKwlmb3IgKGkgPSAwOyBpIDwgZndzcGVjLT5udW1faWRz OyBpKyspIHsKPiArCQlpZiAoZndzcGVjLT5pZHNbaV0gPj0gaWRfc3RhcnQgJiYKPiArCQkgICAg ZndzcGVjLT5pZHNbaV0gPD0gaWRfc3RhcnQgKyBpZF9jb3VudCkKPiArCQkJcmV0dXJuIHRydWU7 Cj4gKwl9Cj4gKwo+ICsJcmV0dXJuIGZhbHNlOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBpb3J0 X25vZGVfZ2V0X3Jtcl9pbmZvKHN0cnVjdCBhY3BpX2lvcnRfbm9kZSAqbm9kZSwKPiArCQkJCSAg IHN0cnVjdCBhY3BpX2lvcnRfbm9kZSAqaW9tbXUsCj4gKwkJCQkgICBzdHJ1Y3QgZGV2aWNlICpk ZXYsIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCj4gK3sKPiArCXN0cnVjdCBhY3BpX2lvcnRfbm9k ZSAqc21tdSA9IE5VTEw7Cj4gKwlzdHJ1Y3QgYWNwaV9pb3J0X3JtciAqcm1yOwo+ICsJc3RydWN0 IGFjcGlfaW9ydF9pZF9tYXBwaW5nICptYXA7Cj4gKwl1MzIgKnNpZHMgPSBOVUxMOwo+ICsJdTMy IG51bV9zaWRzID0gMDsKPiArCWludCBpOwo+ICsKPiArCWlmICghbm9kZS0+bWFwcGluZ19vZmZz ZXQgfHwgIW5vZGUtPm1hcHBpbmdfY291bnQpIHsKPiArCQlwcl9lcnIoRldfQlVHICJJbnZhbGlk IElEIG1hcHBpbmcsIHNraXBwaW5nIFJNUiBub2RlICVwXG4iLAo+ICsJCSAgICAgICBub2RlKTsK PiArCQlyZXR1cm47Cj4gKwl9Cj4gKwo+ICsJcm1yID0gKHN0cnVjdCBhY3BpX2lvcnRfcm1yICop bm9kZS0+bm9kZV9kYXRhOwo+ICsJaWYgKCFybXItPnJtcl9vZmZzZXQgfHwgIXJtci0+cm1yX2Nv dW50KQo+ICsJCXJldHVybjsKPiArCj4gKwltYXAgPSBBQ1BJX0FERF9QVFIoc3RydWN0IGFjcGlf aW9ydF9pZF9tYXBwaW5nLCBub2RlLAo+ICsJCQkgICBub2RlLT5tYXBwaW5nX29mZnNldCk7Cj4g Kwo+ICsJLyoKPiArCSAqIEdvIHRocm91Z2ggdGhlIElEIG1hcHBpbmdzIGFuZCBzZWUgaWYgd2Ug aGF2ZSBhIG1hdGNoCj4gKwkgKiBmb3Igc21tdSBhbmQgZGV2KGlmICFOVUxMKS4gSWYgZm91bmQs IGdldCB0aGUgc2lkcwo+ICsJICogZm9yIHRoZSBOb2RlLgo+ICsJICogUGxlYXNlIG5vdGUsIGlk X2NvdW50IGlzIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgSURzCj4gKwkgKiBpbiB0aGUgcmFuZ2Ug bWludXMgb25lLgo+ICsJICovCj4gKwlmb3IgKGkgPSAwOyBpIDwgbm9kZS0+bWFwcGluZ19jb3Vu dDsgaSsrLCBtYXArKykgewo+ICsJCXN0cnVjdCBhY3BpX2lvcnRfbm9kZSAqcGFyZW50Owo+ICsK PiArCQlpZiAoIW1hcC0+aWRfY291bnQpCj4gKwkJCWNvbnRpbnVlOwo+ICsKPiArCQlwYXJlbnQg PSBBQ1BJX0FERF9QVFIoc3RydWN0IGFjcGlfaW9ydF9ub2RlLCBpb3J0X3RhYmxlLAo+ICsJCQkJ ICAgICAgbWFwLT5vdXRwdXRfcmVmZXJlbmNlKTsKPiArCQlpZiAocGFyZW50ICE9IGlvbW11KQo+ ICsJCQljb250aW51ZTsKPiArCj4gKwkJLyogSWYgZGV2IGlzIHZhbGlkLCBjaGVjayBSTVIgbm9k ZSBjb3JyZXNwb25kcyB0byB0aGUgZGV2IHNpZCAqLwo+ICsJCWlmIChkZXYgJiYgIWlvcnRfcm1y X2hhc19kZXYoZGV2LCBtYXAtPm91dHB1dF9iYXNlLAo+ICsJCQkJCSAgICAgbWFwLT5pZF9jb3Vu dCkpCj4gKwkJCWNvbnRpbnVlOwo+ICsKPiArCQkvKiBSZXRyaWV2ZSBzaWRzIGFzc29jaWF0ZWQg d2l0aCB0aGUgTm9kZS4gKi8KPiArCQlzaWRzID0gaW9ydF9ybXJfYWxsb2Nfc2lkcyhzaWRzLCBu dW1fc2lkcywgbWFwLT5vdXRwdXRfYmFzZSwKPiArCQkJCQkgICBtYXAtPmlkX2NvdW50ICsgMSk7 Cj4gKwkJaWYgKCFzaWRzKQo+ICsJCQlyZXR1cm47Cj4gKwo+ICsJCW51bV9zaWRzICs9IG1hcC0+ aWRfY291bnQgKyAxOwo+ICsJfQo+ICsKPiArCWlmICghc2lkcykKPiArCQlyZXR1cm47Cj4gKwo+ ICsJaW9ydF9ybXJfZ2V0X3Jlc3ZfcmVnaW9ucyhub2RlLCBzbW11LCBzaWRzLCBudW1fc2lkcywg aGVhZCk7Cj4gKwlrZnJlZShzaWRzKTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgaW9ydF9maW5k X3JtcnMoc3RydWN0IGFjcGlfaW9ydF9ub2RlICppb21tdSwgc3RydWN0IGRldmljZSAqZGV2LAo+ ICsJCQkgICBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQo+ICt7Cj4gKwlzdHJ1Y3QgYWNwaV90YWJs ZV9pb3J0ICppb3J0Owo+ICsJc3RydWN0IGFjcGlfaW9ydF9ub2RlICppb3J0X25vZGUsICppb3J0 X2VuZDsKPiArCWludCBpOwo+ICsKPiArCWlmIChpb3J0X3RhYmxlLT5yZXZpc2lvbiA8IDUpCj4g KwkJcmV0dXJuOwo+ICsKPiArCWlvcnQgPSAoc3RydWN0IGFjcGlfdGFibGVfaW9ydCAqKWlvcnRf dGFibGU7Cj4gKwo+ICsJaW9ydF9ub2RlID0gQUNQSV9BRERfUFRSKHN0cnVjdCBhY3BpX2lvcnRf bm9kZSwgaW9ydCwKPiArCQkJCSBpb3J0LT5ub2RlX29mZnNldCk7Cj4gKwlpb3J0X2VuZCA9IEFD UElfQUREX1BUUihzdHJ1Y3QgYWNwaV9pb3J0X25vZGUsIGlvcnQsCj4gKwkJCQlpb3J0X3RhYmxl LT5sZW5ndGgpOwo+ICsKPiArCWZvciAoaSA9IDA7IGkgPCBpb3J0LT5ub2RlX2NvdW50OyBpKysp IHsKPiArCQlpZiAoV0FSTl9UQUlOVChpb3J0X25vZGUgPj0gaW9ydF9lbmQsIFRBSU5UX0ZJUk1X QVJFX1dPUktBUk9VTkQsCj4gKwkJCSAgICAgICAiSU9SVCBub2RlIHBvaW50ZXIgb3ZlcmZsb3dz LCBiYWQgdGFibGUhXG4iKSkKPiArCQkJcmV0dXJuOwo+ICsKPiArCQlpZiAoaW9ydF9ub2RlLT50 eXBlID09IEFDUElfSU9SVF9OT0RFX1JNUikKPiArCQkJaW9ydF9ub2RlX2dldF9ybXJfaW5mbyhp b3J0X25vZGUsIGlvbW11LCBkZXYsIGhlYWQpOwo+ICsKPiArCQlpb3J0X25vZGUgPSBBQ1BJX0FE RF9QVFIoc3RydWN0IGFjcGlfaW9ydF9ub2RlLCBpb3J0X25vZGUsCj4gKwkJCQkJIGlvcnRfbm9k ZS0+bGVuZ3RoKTsKPiArCX0KPiArfQo+ICsKPiAgLyoqCj4gICAqIGlvcnRfaW9tbXVfbXNpX2dl dF9yZXN2X3JlZ2lvbnMgLSBSZXNlcnZlZCByZWdpb24gZHJpdmVyIGhlbHBlcgo+ICAgKiBAZGV2 OiBEZXZpY2UgZnJvbSBpb21tdV9nZXRfcmVzdl9yZWdpb25zKCkKPiAtLSAKPiAyLjI1LjEKPiAK X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KaW9tbXUgbWFp bGluZyBsaXN0CmlvbW11QGxpc3RzLmxpbnV4LWZvdW5kYXRpb24ub3JnCmh0dHBzOi8vbGlzdHMu bGludXhmb3VuZGF0aW9uLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2lvbW11 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 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 7E154C433F5 for ; Thu, 24 Feb 2022 10:15:02 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=BYcRbwLRxx2Oli4W0smBXIg68saS/OmI7mg6kfATOzA=; b=AnqDp2+PkcESly n9Dsv7gWc1xsuEdXkxJlPGuucgW8hPzmwx8+i4swJATIbcxyUQ5J7fMAWwf3FVGxh2SVpxlN7HOxL 02hkRrKoktYYXB0X0qOwBO5fDm3oG2DzlrG1MNxDzUvN4f/YrZq5KjA+stqWabn7lskoXu/2YqBjJ 5p0vTed49+M0Rxy7qEntLfdxYNjfvpnHFumh1Fd4s6P67sz048Q4+gIkNpE1vsuEbxYJiMCWqRgCK jIX/fW6Co102/yEQcUg7QlFe4G/WHXGkAaxP5H3oJXqF1AxRTlISRtGh9Lc+dgzG0G58tciF1Tnb7 +dULuYMiO6GAb8RouhGw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1nNB87-000G9B-Ec; Thu, 24 Feb 2022 10:13:47 +0000 Received: from foss.arm.com ([217.140.110.172]) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1nNB82-000G7y-CM for linux-arm-kernel@lists.infradead.org; Thu, 24 Feb 2022 10:13:44 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 02E93ED1; Thu, 24 Feb 2022 02:13:41 -0800 (PST) Received: from lpieralisi (e121166-lin.cambridge.arm.com [10.1.196.255]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 1E56B3F70D; Thu, 24 Feb 2022 02:13:39 -0800 (PST) Date: Thu, 24 Feb 2022 10:13:33 +0000 From: Lorenzo Pieralisi To: Shameer Kolothum Cc: linux-arm-kernel@lists.infradead.org, linux-acpi@vger.kernel.org, iommu@lists.linux-foundation.org, linuxarm@huawei.com, joro@8bytes.org, robin.murphy@arm.com, will@kernel.org, wanghuiqiang@huawei.com, guohanjun@huawei.com, steven.price@arm.com, Sami.Mujawar@arm.com, jon@solid-run.com, eric.auger@redhat.com, yangyicong@huawei.com Subject: Re: [PATCH v8 03/11] ACPI/IORT: Add helper functions to parse RMR nodes Message-ID: <20220224101333.GA3178@lpieralisi> References: <20220221154344.2126-1-shameerali.kolothum.thodi@huawei.com> <20220221154344.2126-4-shameerali.kolothum.thodi@huawei.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20220221154344.2126-4-shameerali.kolothum.thodi@huawei.com> User-Agent: Mutt/1.9.4 (2018-02-28) X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220224_021342_553508_EBBF3008 X-CRM114-Status: GOOD ( 35.48 ) 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 T24gTW9uLCBGZWIgMjEsIDIwMjIgYXQgMDM6NDM6MzZQTSArMDAwMCwgU2hhbWVlciBLb2xvdGh1 bSB3cm90ZToKPiBUaGUgaGVscGVyIGZ1bmN0aW9ucyBoZXJlIHBhcnNlIHRocm91Z2ggdGhlIElP UlQgUk1SIG5vZGVzIGFuZAo+IHBvcHVsYXRlIGEgcmVzZXJ2ZWQgcmVnaW9uIGxpc3QgIGNvcnJl c3BvbmRpbmcgdG8gYSBnaXZlbiBpb21tdQo+IGFuZCBkZXZpY2Uob3B0aW9uYWwpLiBUaGVzZSBh bHNvIGdvIHRocm91Z2ggdGhlIElEIG1hcHBpbmdzIG9mCj4gdGhlIFJNUiBub2RlIGFuZCByZXRy aWV2ZXMgYWxsIHRoZSBTSURzIGFzc29jaWF0ZWQgd2l0aCBhIFJNUgo+IGRlc2NyaXB0b3IuCj4g Cj4gU2lnbmVkLW9mZi1ieTogU2hhbWVlciBLb2xvdGh1bSA8c2hhbWVlcmFsaS5rb2xvdGh1bS50 aG9kaUBodWF3ZWkuY29tPgo+IC0tLQo+ICBkcml2ZXJzL2FjcGkvYXJtNjQvaW9ydC5jIHwgMjI1 ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCj4gIDEgZmlsZSBjaGFuZ2Vk LCAyMjUgaW5zZXJ0aW9ucygrKQoKSSBoYXZlIHZlcnkgbWlub3IgY29tbWVudHMgLSBJIHdvdWxk IGFzayBSb2JpbiB0byBhY2sgdGhlIHVwZGF0ZWQKZmxhZ3MgbWFuYWdlbWVudC4KCkZ1bmN0aW9u cyBzaG91bGQgYmUgaW50cm9kdWNlZCB3aGVyZSB0aGV5IGFyZSB1c2VkLCB0aGlzIHBhdGNoCmlz IG5vdCBiaXNlY3RhYmxlOgoKZHJpdmVycy9hY3BpL2FybTY0L2lvcnQuYzoxMDI4OjEzOiB3YXJu aW5nOiDigJhpb3J0X2ZpbmRfcm1yc+KAmSBkZWZpbmVkIGJ1dCBub3QgdXNlZCBbLVd1bnVzZWQt ZnVuY3Rpb25dCiAxMDI4IHwgc3RhdGljIHZvaWQgaW9ydF9maW5kX3JtcnMoc3RydWN0IGFjcGlf aW9ydF9ub2RlICppb21tdSwgc3RydWN0IGRldmljZSAqZGV2LAoKPiBkaWZmIC0tZ2l0IGEvZHJp dmVycy9hY3BpL2FybTY0L2lvcnQuYyBiL2RyaXZlcnMvYWNwaS9hcm02NC9pb3J0LmMKPiBpbmRl eCAwNzMwYzRkYmI3MDAuLjA1ZGE5ZWJmZjUwYSAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2FjcGkv YXJtNjQvaW9ydC5jCj4gKysrIGIvZHJpdmVycy9hY3BpL2FybTY0L2lvcnQuYwo+IEBAIC04MzAs NiArODMwLDIzMSBAQCBzdGF0aWMgc3RydWN0IGFjcGlfaW9ydF9ub2RlICppb3J0X2dldF9tc2lf cmVzdl9pb21tdShzdHJ1Y3QgZGV2aWNlICpkZXYpCj4gIAlyZXR1cm4gTlVMTDsKPiAgfQo+ICAK PiArc3RhdGljIHZvaWQgaW9ydF9ybXJfZGVzY19jaGVja19vdmVybGFwKHN0cnVjdCBhY3BpX2lv cnRfcm1yX2Rlc2MgKmRlc2MsIHUzMiBjb3VudCkKPiArewo+ICsJaW50IGksIGo7Cj4gKwo+ICsJ Zm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKPiArCQl1NjQgZW5kLCBzdGFydCA9IGRlc2Nb aV0uYmFzZV9hZGRyZXNzLCBsZW5ndGggPSBkZXNjW2ldLmxlbmd0aDsKPiArCj4gKwkJZW5kID0g c3RhcnQgKyBsZW5ndGggLSAxOwoKV2UgY291bGQgcHJvYmFibHkgY2hlY2sgZm9yIGxlbmd0aCAh PSAwLCB0aGUga2VybmVsIGlzIG5vdCB0aGVyZSB0bwp2YWxpZGF0ZSBmaXJtd2FyZSBidXQgdGhp cyB3b3VsZCBub3QgaHVydCBlaXRoZXIuCgo+ICsKPiArCQkvKiBDaGVjayBmb3IgYWRkcmVzcyBv dmVybGFwICovCj4gKwkJZm9yIChqID0gaSArIDE7IGogPCBjb3VudDsgaisrKSB7Cj4gKwkJCXU2 NCBlX3N0YXJ0ID0gZGVzY1tqXS5iYXNlX2FkZHJlc3M7Cj4gKwkJCXU2NCBlX2VuZCA9IGVfc3Rh cnQgKyBkZXNjW2pdLmxlbmd0aCAtIDE7Cj4gKwo+ICsJCQlpZiAoc3RhcnQgPD0gZV9lbmQgJiYg ZW5kID49IGVfc3RhcnQpCj4gKwkJCQlwcl9lcnIoRldfQlVHICJSTVIgZGVzY3JpcHRvclsweCVs bHggLSAweCVsbHhdIG92ZXJsYXBzLCBjb250aW51ZSBhbnl3YXlcbiIsCj4gKwkJCQkgICAgICAg c3RhcnQsIGVuZCk7Cj4gKwkJfQo+ICsJfQo+ICt9Cj4gKwo+ICsvKgo+ICsgKiBQbGVhc2Ugbm90 ZSwgd2Ugd2lsbCBrZWVwIHRoZSBhbHJlYWR5IGFsbG9jYXRlZCBSTVIgcmVzZXJ2ZQo+ICsgKiBy ZWdpb25zIGluIGNhc2Ugb2YgYSBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlLgo+ICsgKi8KPiAr c3RhdGljIHZvaWQgaW9ydF9ybXJfZ2V0X3Jlc3ZfcmVnaW9ucyhzdHJ1Y3QgYWNwaV9pb3J0X25v ZGUgKm5vZGUsCj4gKwkJCQkgICAgICBzdHJ1Y3QgYWNwaV9pb3J0X25vZGUgKnNtbXUsCj4gKwkJ CQkgICAgICB1MzIgKnNpZHMsIHUzMiBudW1fc2lkcywKPiArCQkJCSAgICAgIHN0cnVjdCBsaXN0 X2hlYWQgKmhlYWQpCj4gK3sKPiArCXN0cnVjdCBhY3BpX2lvcnRfcm1yICpybXIgPSAoc3RydWN0 IGFjcGlfaW9ydF9ybXIgKilub2RlLT5ub2RlX2RhdGE7Cj4gKwlzdHJ1Y3QgYWNwaV9pb3J0X3Jt cl9kZXNjICpybXJfZGVzYzsKPiArCWludCBpOwo+ICsKPiArCXJtcl9kZXNjID0gQUNQSV9BRERf UFRSKHN0cnVjdCBhY3BpX2lvcnRfcm1yX2Rlc2MsIG5vZGUsCj4gKwkJCQlybXItPnJtcl9vZmZz ZXQpOwo+ICsKPiArCWlvcnRfcm1yX2Rlc2NfY2hlY2tfb3ZlcmxhcChybXJfZGVzYywgcm1yLT5y bXJfY291bnQpOwo+ICsKPiArCWZvciAoaSA9IDA7IGkgPCBybXItPnJtcl9jb3VudDsgaSsrLCBy bXJfZGVzYysrKSB7Cj4gKwkJc3RydWN0IGlvbW11X3Jlc3ZfcmVnaW9uICpyZWdpb247Cj4gKwkJ ZW51bSBpb21tdV9yZXN2X3R5cGUgdHlwZTsKPiArCQl1MzIgICpzaWRzX2NvcHk7Cj4gKwkJaW50 IHByb3QgPSBJT01NVV9SRUFEIHwgSU9NTVVfV1JJVEU7Cj4gKwkJdTY0IGFkZHIgPSBybXJfZGVz Yy0+YmFzZV9hZGRyZXNzLCBzaXplID0gcm1yX2Rlc2MtPmxlbmd0aDsKPiArCj4gKwkJaWYgKCFJ U19BTElHTkVEKGFkZHIsIFNaXzY0SykgfHwgIUlTX0FMSUdORUQoc2l6ZSwgU1pfNjRLKSkgewo+ ICsJCQkvKiBQQUdFIGFsaWduIGJhc2UgYWRkciBhbmQgc2l6ZSAqLwo+ICsJCQlhZGRyICY9IFBB R0VfTUFTSzsKPiArCQkJc2l6ZSA9IFBBR0VfQUxJR04oc2l6ZSArIG9mZnNldF9pbl9wYWdlKHJt cl9kZXNjLT5iYXNlX2FkZHJlc3MpKTsKPiArCj4gKwkJCXByX2VycihGV19CVUcgIlJNUiBkZXNj cmlwdG9yWzB4JWxseCAtIDB4JWxseF0gbm90IGFsaWduZWQgdG8gNjRLLCBjb250aW51ZSB3aXRo IFsweCVsbHggLSAweCVsbHhdXG4iLAo+ICsJCQkgICAgICAgcm1yX2Rlc2MtPmJhc2VfYWRkcmVz cywKPiArCQkJICAgICAgIHJtcl9kZXNjLT5iYXNlX2FkZHJlc3MgKyBybXJfZGVzYy0+bGVuZ3Ro IC0gMSwKPiArCQkJICAgICAgIGFkZHIsIGFkZHIgKyBzaXplIC0gMSk7Cj4gKwkJfQo+ICsKPiAr CQlpZiAocm1yLT5mbGFncyAmIEFDUElfSU9SVF9STVJfUkVNQVBfUEVSTUlUVEVEKQo+ICsJCQl0 eXBlID0gSU9NTVVfUkVTVl9ESVJFQ1RfUkVMQVhBQkxFOwo+ICsJCWVsc2UKPiArCQkJdHlwZSA9 IElPTU1VX1JFU1ZfRElSRUNUOwo+ICsKPiArCQlpZiAocm1yLT5mbGFncyAmIEFDUElfSU9SVF9S TVJfQUNDRVNTX1BSSVZJTEVHRSkKPiArCQkJcHJvdCB8PSBJT01NVV9QUklWOwo+ICsKPiArCQkv KiBBdHRyaWJ1dGVzIDB4MDAgLSAweDAzIHJlcHJlc2VudHMgZGV2aWNlIG1lbW9yeSAqLwo+ICsJ CWlmIChBQ1BJX0lPUlRfUk1SX0FDQ0VTU19BVFRSSUJVVEVTKHJtci0+ZmxhZ3MpIDw9Cj4gKwkJ CQlBQ1BJX0lPUlRfUk1SX0FUVFJfREVWSUNFX0dSRSkKPiArCQkJcHJvdCB8PSBJT01NVV9NTUlP Owo+ICsJCWVsc2UgaWYgKEFDUElfSU9SVF9STVJfQUNDRVNTX0FUVFJJQlVURVMocm1yLT5mbGFn cykgPT0KPiArCQkJCUFDUElfSU9SVF9STVJfQVRUUl9OT1JNQUwpCj4gKwkJCXByb3QgfD0gSU9N TVVfQ0FDSEU7Cj4gKwo+ICsJCS8qIENyZWF0ZSBhIGNvcHkgb2Ygc2lkcyBhcnJheSB0byBhc3Nv Y2lhdGUgd2l0aCB0aGlzIHJlc3YgcmVnaW9uICovCj4gKwkJc2lkc19jb3B5ID0ga21lbWR1cChz aWRzLCBudW1fc2lkcyAqIHNpemVvZigqc2lkcyksIEdGUF9LRVJORUwpOwo+ICsJCWlmICghc2lk c19jb3B5KQo+ICsJCQlyZXR1cm47Cj4gKwo+ICsJCXJlZ2lvbiA9IGlvbW11X2FsbG9jX3Jlc3Zf cmVnaW9uKGFkZHIsIHNpemUsIHByb3QsIHR5cGUpOwo+ICsJCWlmICghcmVnaW9uKSB7Cj4gKwkJ CWtmcmVlKHNpZHNfY29weSk7Cj4gKwkJCXJldHVybjsKPiArCQl9Cj4gKwo+ICsJCXJlZ2lvbi0+ ZndfZGF0YS5ybXIuc2lkcyA9IHNpZHNfY29weTsKPiArCQlyZWdpb24tPmZ3X2RhdGEucm1yLm51 bV9zaWRzID0gbnVtX3NpZHM7Cj4gKwkJbGlzdF9hZGRfdGFpbCgmcmVnaW9uLT5saXN0LCBoZWFk KTsKPiArCX0KPiArfQo+ICsKPiArc3RhdGljIHUzMiAqaW9ydF9ybXJfYWxsb2Nfc2lkcyh1MzIg KnNpZHMsIHUzMiBjb3VudCwgdTMyIGlkX3N0YXJ0LAo+ICsJCQkJdTMyIG5ld19jb3VudCkKPiAr ewo+ICsJdTMyICpuZXdfc2lkczsKPiArCXUzMiB0b3RhbF9jb3VudCA9IGNvdW50ICsgbmV3X2Nv dW50Owo+ICsJaW50IGk7Cj4gKwo+ICsJbmV3X3NpZHMgPSBrcmVhbGxvY19hcnJheShzaWRzLCBj b3VudCArIG5ld19jb3VudCwKPiArCQkJCSAgc2l6ZW9mKCpuZXdfc2lkcyksIEdGUF9LRVJORUwp Owo+ICsJaWYgKCFuZXdfc2lkcykKPiArCQlyZXR1cm4gTlVMTDsKPiArCj4gKwkvKlVwZGF0ZSBu ZXcgb25lcyAqLwoKLyogVXBkYXRlIG5ldyBvbmVzICovCgpJJ2QgcmVtb3ZlIHRoZSBjb21tZW50 LCBvciBpbXByb3ZlIGl0LCBhcyBpdCBzdGFuZHMgaXQgZG9lcyBub3QKaGVscCBtdWNoIC0gd2Ug Y2FuIHJlYWQgdGhlIGNvZGUuCgo+ICsJZm9yIChpID0gY291bnQ7IGkgPCB0b3RhbF9jb3VudDsg aSsrKQo+ICsJCW5ld19zaWRzW2ldID0gaWRfc3RhcnQrKzsKPiArCj4gKwlyZXR1cm4gbmV3X3Np ZHM7Cj4gK30KPiArCj4gK3N0YXRpYyBib29sIGlvcnRfcm1yX2hhc19kZXYoc3RydWN0IGRldmlj ZSAqZGV2LCB1MzIgaWRfc3RhcnQsCj4gKwkJCSAgICAgdTMyIGlkX2NvdW50KQo+ICt7Cj4gKwlp bnQgaTsKPiArCXN0cnVjdCBpb21tdV9md3NwZWMgKmZ3c3BlYyA9IGRldl9pb21tdV9md3NwZWNf Z2V0KGRldik7Cj4gKwo+ICsJaWYgKGRldl9pc19wY2koZGV2KSkgewo+ICsJCXN0cnVjdCBwY2lf ZGV2ICpwZGV2ID0gdG9fcGNpX2RldihkZXYpOwo+ICsJCXN0cnVjdCBwY2lfaG9zdF9icmlkZ2Ug Kmhvc3QgPSBwY2lfZmluZF9ob3N0X2JyaWRnZShwZGV2LT5idXMpOwo+ICsKPiArCQlpZiAoIWhv c3QtPnByZXNlcnZlX2NvbmZpZykKClBsZWFzZSBhZGQgYSBjb21tZW50IGhlcmUgLSBpdCBoZWxw cyBleHBsYWluIHRoZSBsb2dpYyBiZWhpbmQgaXQuCgpUaGFua3MsCkxvcmVuem8KCj4gKwkJCXJl dHVybiBmYWxzZTsKPiArCX0KPiArCj4gKwlmb3IgKGkgPSAwOyBpIDwgZndzcGVjLT5udW1faWRz OyBpKyspIHsKPiArCQlpZiAoZndzcGVjLT5pZHNbaV0gPj0gaWRfc3RhcnQgJiYKPiArCQkgICAg ZndzcGVjLT5pZHNbaV0gPD0gaWRfc3RhcnQgKyBpZF9jb3VudCkKPiArCQkJcmV0dXJuIHRydWU7 Cj4gKwl9Cj4gKwo+ICsJcmV0dXJuIGZhbHNlOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBpb3J0 X25vZGVfZ2V0X3Jtcl9pbmZvKHN0cnVjdCBhY3BpX2lvcnRfbm9kZSAqbm9kZSwKPiArCQkJCSAg IHN0cnVjdCBhY3BpX2lvcnRfbm9kZSAqaW9tbXUsCj4gKwkJCQkgICBzdHJ1Y3QgZGV2aWNlICpk ZXYsIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCj4gK3sKPiArCXN0cnVjdCBhY3BpX2lvcnRfbm9k ZSAqc21tdSA9IE5VTEw7Cj4gKwlzdHJ1Y3QgYWNwaV9pb3J0X3JtciAqcm1yOwo+ICsJc3RydWN0 IGFjcGlfaW9ydF9pZF9tYXBwaW5nICptYXA7Cj4gKwl1MzIgKnNpZHMgPSBOVUxMOwo+ICsJdTMy IG51bV9zaWRzID0gMDsKPiArCWludCBpOwo+ICsKPiArCWlmICghbm9kZS0+bWFwcGluZ19vZmZz ZXQgfHwgIW5vZGUtPm1hcHBpbmdfY291bnQpIHsKPiArCQlwcl9lcnIoRldfQlVHICJJbnZhbGlk IElEIG1hcHBpbmcsIHNraXBwaW5nIFJNUiBub2RlICVwXG4iLAo+ICsJCSAgICAgICBub2RlKTsK PiArCQlyZXR1cm47Cj4gKwl9Cj4gKwo+ICsJcm1yID0gKHN0cnVjdCBhY3BpX2lvcnRfcm1yICop bm9kZS0+bm9kZV9kYXRhOwo+ICsJaWYgKCFybXItPnJtcl9vZmZzZXQgfHwgIXJtci0+cm1yX2Nv dW50KQo+ICsJCXJldHVybjsKPiArCj4gKwltYXAgPSBBQ1BJX0FERF9QVFIoc3RydWN0IGFjcGlf aW9ydF9pZF9tYXBwaW5nLCBub2RlLAo+ICsJCQkgICBub2RlLT5tYXBwaW5nX29mZnNldCk7Cj4g Kwo+ICsJLyoKPiArCSAqIEdvIHRocm91Z2ggdGhlIElEIG1hcHBpbmdzIGFuZCBzZWUgaWYgd2Ug aGF2ZSBhIG1hdGNoCj4gKwkgKiBmb3Igc21tdSBhbmQgZGV2KGlmICFOVUxMKS4gSWYgZm91bmQs IGdldCB0aGUgc2lkcwo+ICsJICogZm9yIHRoZSBOb2RlLgo+ICsJICogUGxlYXNlIG5vdGUsIGlk X2NvdW50IGlzIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgSURzCj4gKwkgKiBpbiB0aGUgcmFuZ2Ug bWludXMgb25lLgo+ICsJICovCj4gKwlmb3IgKGkgPSAwOyBpIDwgbm9kZS0+bWFwcGluZ19jb3Vu dDsgaSsrLCBtYXArKykgewo+ICsJCXN0cnVjdCBhY3BpX2lvcnRfbm9kZSAqcGFyZW50Owo+ICsK PiArCQlpZiAoIW1hcC0+aWRfY291bnQpCj4gKwkJCWNvbnRpbnVlOwo+ICsKPiArCQlwYXJlbnQg PSBBQ1BJX0FERF9QVFIoc3RydWN0IGFjcGlfaW9ydF9ub2RlLCBpb3J0X3RhYmxlLAo+ICsJCQkJ ICAgICAgbWFwLT5vdXRwdXRfcmVmZXJlbmNlKTsKPiArCQlpZiAocGFyZW50ICE9IGlvbW11KQo+ ICsJCQljb250aW51ZTsKPiArCj4gKwkJLyogSWYgZGV2IGlzIHZhbGlkLCBjaGVjayBSTVIgbm9k ZSBjb3JyZXNwb25kcyB0byB0aGUgZGV2IHNpZCAqLwo+ICsJCWlmIChkZXYgJiYgIWlvcnRfcm1y X2hhc19kZXYoZGV2LCBtYXAtPm91dHB1dF9iYXNlLAo+ICsJCQkJCSAgICAgbWFwLT5pZF9jb3Vu dCkpCj4gKwkJCWNvbnRpbnVlOwo+ICsKPiArCQkvKiBSZXRyaWV2ZSBzaWRzIGFzc29jaWF0ZWQg d2l0aCB0aGUgTm9kZS4gKi8KPiArCQlzaWRzID0gaW9ydF9ybXJfYWxsb2Nfc2lkcyhzaWRzLCBu dW1fc2lkcywgbWFwLT5vdXRwdXRfYmFzZSwKPiArCQkJCQkgICBtYXAtPmlkX2NvdW50ICsgMSk7 Cj4gKwkJaWYgKCFzaWRzKQo+ICsJCQlyZXR1cm47Cj4gKwo+ICsJCW51bV9zaWRzICs9IG1hcC0+ aWRfY291bnQgKyAxOwo+ICsJfQo+ICsKPiArCWlmICghc2lkcykKPiArCQlyZXR1cm47Cj4gKwo+ ICsJaW9ydF9ybXJfZ2V0X3Jlc3ZfcmVnaW9ucyhub2RlLCBzbW11LCBzaWRzLCBudW1fc2lkcywg aGVhZCk7Cj4gKwlrZnJlZShzaWRzKTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgaW9ydF9maW5k X3JtcnMoc3RydWN0IGFjcGlfaW9ydF9ub2RlICppb21tdSwgc3RydWN0IGRldmljZSAqZGV2LAo+ ICsJCQkgICBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQo+ICt7Cj4gKwlzdHJ1Y3QgYWNwaV90YWJs ZV9pb3J0ICppb3J0Owo+ICsJc3RydWN0IGFjcGlfaW9ydF9ub2RlICppb3J0X25vZGUsICppb3J0 X2VuZDsKPiArCWludCBpOwo+ICsKPiArCWlmIChpb3J0X3RhYmxlLT5yZXZpc2lvbiA8IDUpCj4g KwkJcmV0dXJuOwo+ICsKPiArCWlvcnQgPSAoc3RydWN0IGFjcGlfdGFibGVfaW9ydCAqKWlvcnRf dGFibGU7Cj4gKwo+ICsJaW9ydF9ub2RlID0gQUNQSV9BRERfUFRSKHN0cnVjdCBhY3BpX2lvcnRf bm9kZSwgaW9ydCwKPiArCQkJCSBpb3J0LT5ub2RlX29mZnNldCk7Cj4gKwlpb3J0X2VuZCA9IEFD UElfQUREX1BUUihzdHJ1Y3QgYWNwaV9pb3J0X25vZGUsIGlvcnQsCj4gKwkJCQlpb3J0X3RhYmxl LT5sZW5ndGgpOwo+ICsKPiArCWZvciAoaSA9IDA7IGkgPCBpb3J0LT5ub2RlX2NvdW50OyBpKysp IHsKPiArCQlpZiAoV0FSTl9UQUlOVChpb3J0X25vZGUgPj0gaW9ydF9lbmQsIFRBSU5UX0ZJUk1X QVJFX1dPUktBUk9VTkQsCj4gKwkJCSAgICAgICAiSU9SVCBub2RlIHBvaW50ZXIgb3ZlcmZsb3dz LCBiYWQgdGFibGUhXG4iKSkKPiArCQkJcmV0dXJuOwo+ICsKPiArCQlpZiAoaW9ydF9ub2RlLT50 eXBlID09IEFDUElfSU9SVF9OT0RFX1JNUikKPiArCQkJaW9ydF9ub2RlX2dldF9ybXJfaW5mbyhp b3J0X25vZGUsIGlvbW11LCBkZXYsIGhlYWQpOwo+ICsKPiArCQlpb3J0X25vZGUgPSBBQ1BJX0FE RF9QVFIoc3RydWN0IGFjcGlfaW9ydF9ub2RlLCBpb3J0X25vZGUsCj4gKwkJCQkJIGlvcnRfbm9k ZS0+bGVuZ3RoKTsKPiArCX0KPiArfQo+ICsKPiAgLyoqCj4gICAqIGlvcnRfaW9tbXVfbXNpX2dl dF9yZXN2X3JlZ2lvbnMgLSBSZXNlcnZlZCByZWdpb24gZHJpdmVyIGhlbHBlcgo+ICAgKiBAZGV2 OiBEZXZpY2UgZnJvbSBpb21tdV9nZXRfcmVzdl9yZWdpb25zKCkKPiAtLSAKPiAyLjI1LjEKPiAK Cl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFy bS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9y ZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1r ZXJuZWwK