From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.4 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id C05ADC33CB1 for ; Wed, 15 Jan 2020 11:50:38 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 7D6A1207E0 for ; Wed, 15 Jan 2020 11:50:38 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=ti.com header.i=@ti.com header.b="tkB6FfFj" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730133AbgAOLuh (ORCPT ); Wed, 15 Jan 2020 06:50:37 -0500 Received: from fllv0015.ext.ti.com ([198.47.19.141]:39800 "EHLO fllv0015.ext.ti.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729892AbgAOLuh (ORCPT ); Wed, 15 Jan 2020 06:50:37 -0500 Received: from lelv0266.itg.ti.com ([10.180.67.225]) by fllv0015.ext.ti.com (8.15.2/8.15.2) with ESMTP id 00FBo7ac036940; Wed, 15 Jan 2020 05:50:07 -0600 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ti.com; s=ti-com-17Q1; t=1579089007; bh=tmzYkT94bb3dzh3tdif/e0kQpanc2ZK+pZA1Vabt8ig=; h=Subject:To:CC:References:From:Date:In-Reply-To; b=tkB6FfFjxmnXfUrH48qyy+Hahes3CdWqdDJugNsksBb2y35Ae7A4U3TdHszMxZXaW NtT67l2mqJCYw5M4QquEDncn/7xKjhhszPV67vHtTefI8rICrrVeppS1f826ws8IA4 docuBswYL/BVm0JevSVEOmFxnOawLrlkh0UjQftQ= Received: from DLEE109.ent.ti.com (dlee109.ent.ti.com [157.170.170.41]) by lelv0266.itg.ti.com (8.15.2/8.15.2) with ESMTPS id 00FBo7fF015271 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=FAIL); Wed, 15 Jan 2020 05:50:07 -0600 Received: from DLEE111.ent.ti.com (157.170.170.22) by DLEE109.ent.ti.com (157.170.170.41) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1847.3; Wed, 15 Jan 2020 05:50:07 -0600 Received: from fllv0040.itg.ti.com (10.64.41.20) by DLEE111.ent.ti.com (157.170.170.22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1847.3 via Frontend Transport; Wed, 15 Jan 2020 05:50:07 -0600 Received: from [192.168.2.6] (ileax41-snat.itg.ti.com [10.172.224.153]) by fllv0040.itg.ti.com (8.15.2/8.15.2) with ESMTP id 00FBo4wl060858; Wed, 15 Jan 2020 05:50:05 -0600 Subject: Re: [PoC] arm: dma-mapping: direct: Apply dma_pfn_offset only when it is valid To: Robin Murphy , CC: , , , , , , , References: <8eb68140-97b2-62ce-3e06-3761984aa5b1@ti.com> <20200114164332.3164-1-peter.ujfalusi@ti.com> From: Peter Ujfalusi Message-ID: <28ee3395-baed-8d59-8546-ab7765829cc8@ti.com> Date: Wed, 15 Jan 2020 13:50:41 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.9.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset="utf-8" Content-Language: en-US Content-Transfer-Encoding: 8bit X-EXCLAIMER-MD-CONFIG: e1e8a2fd-e40a-4ac6-ac9b-f7e9cc9ee180 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 14/01/2020 20.19, Robin Murphy wrote: > On 14/01/2020 4:43 pm, Peter Ujfalusi wrote: >> The dma_pfn_offset should only be applied to an address which is >> within the >> dma-ranges range. Any address outside should have offset as 0. > > No, that's wrong. If a non-empty dma-ranges is present, then addresses > which do not fall within any specified range are invalid altogether. It is not explicitly stated by the specification, but can be interpreted like that and from a pow it does make sense to treat things like that. > The current long-term plan is indeed to try to move to some sort of > internal "DMA range descriptor" in order to properly cope with the kind > of esoteric integrations which have multiple disjoint windows, > potentially even with different offsets, but as you point out there are > still many hurdles between now and that becoming reality. So although > this patch does represent the "right" thing, it's for entirely the wrong > reason. AFAICT for your case it basically just works out as a very > baroque way to hack dma_direct_supported() again - we shouldn't need a > special case to map a bogus physical address to valid DMA address, we > should be fixing the source of the bogus PA in the first place. DMA_BIT_MASK(32) is pretty clear: The DMA can handle addresses within 32bit space. DMA_BIT_MASK(24) is also clear: The DMA can handle addresses within 24bit space. dma-ranges does not change that. The DMA can still address the same space. What dma-ranges will tell is that a physical address range 'X' can be accessed on the bus under range 'Y'. For the DMA within the bus the physical address within 'X' does not matter. What matters is the matching address within 'Y' We should do dma_pfn_offset conversion _only_ for the range it applies to. Outside of it is not valid to apply it. The dma API will check (without applying dma_pfn_offset) addresses outside of any range (only one currently in Linux) and if it is not OK for the mask then it will fail. > >> This is a proof of concept patch which works on k2g where we have >> dma-ranges = <0x80000000 0x8 0x00000000 0x80000000>; >> for the SoC. > > TBH it's probably extra-confusing that you're on Keystone 2, where > technically this ends up closer-to-OK than most, since IIRC the 0-2GB > MMIO region is the same on all 3(?) interconnect maps. Thus the 100% > honest description would really be: > > dma-ranges = <0x0 0x0 0x0 0x80000000>, >          <0x80000000 0x8 0x00000000 0x80000000>; > > but yeah, that would just go horribly wrong with Linux today. It does ;) This was the first thing I have tried. > The > subtelty that dma_map_resource() ignores the pfn_offset happens to be a > "feature" in this regard ;) Right, but Keystone 2 is broken since 5.3-rc3 by commit ad3c7b18c5b362be5dbd0f2c0bcf1fd5fd659315. Can you propose a fix which we can use until things get sorted out? Thanks, - Péter > > Robin. > >> Without this patch everything which tries to set DMA_BIT_MASK(32) or less >> fails -> DMA and peripherals with built in DMA (SD with ADMA) will not >> probe or fall back to PIO mode. >> >> With this patch EDMA probes, SD's ADMA is working. >> Audio and dma-test is working just fine with EDMA, mmc accesses with ADMA >> also operational. >> >> The patch does not tried to address the incomplete handling of dma-ranges >> from DT and it is not fixing/updating arch code or drivers which uses >> dma_pfn_offset. >> Neither provides fallback support for kernel setting only >> dma_pfn_offset to >> arbitrary number without paddr/dma_addr/size. >> >> Signed-off-by: Peter Ujfalusi >> --- >> Hi Christoph, Robin, >> >> I know it is a bit more complicated, but with this patch k2g is >> working fine... >> >> I wanted to test the concept I was describing and a patch speaks >> better than >> words. >> >> Kind regards, >> Peter >> >>   arch/arm/include/asm/dma-mapping.h | 25 ++++++++++++++++++++-- >>   drivers/of/device.c                |  7 ++++++- >>   include/linux/device.h             |  8 ++++++++ >>   include/linux/dma-direct.h         | 33 ++++++++++++++++++++++++++++-- >>   kernel/dma/coherent.c              |  9 +++++--- >>   5 files changed, 74 insertions(+), 8 deletions(-) >> >> diff --git a/arch/arm/include/asm/dma-mapping.h >> b/arch/arm/include/asm/dma-mapping.h >> index bdd80ddbca34..9bff6ad2d8c8 100644 >> --- a/arch/arm/include/asm/dma-mapping.h >> +++ b/arch/arm/include/asm/dma-mapping.h >> @@ -33,10 +33,31 @@ static inline const struct dma_map_ops >> *get_arch_dma_ops(struct bus_type *bus) >>    * addresses. They must not be used by drivers. >>    */ >>   #ifndef __arch_pfn_to_dma >> + >> +static inline unsigned long __phys_to_dma_pfn_offset(struct device *dev, >> +                             phys_addr_t paddr) >> +{ >> +    if (paddr >= dev->dma_ranges.paddr && >> +        paddr <= (dev->dma_ranges.paddr + dev->dma_ranges.size)) >> +        return dev->dma_ranges.pfn_offset; >> + >> +    return 0; >> +} >> + >> +static inline unsigned long __dma_to_phys_pfn_offset(struct device *dev, >> +                             dma_addr_t dma_addr) >> +{ >> +    if (dma_addr >= dev->dma_ranges.dma_addr && >> +        dma_addr <= (dev->dma_ranges.dma_addr + dev->dma_ranges.size)) >> +        return dev->dma_ranges.pfn_offset; >> + >> +    return 0; >> +} >> + >>   static inline dma_addr_t pfn_to_dma(struct device *dev, unsigned >> long pfn) >>   { >>       if (dev) >> -        pfn -= dev->dma_pfn_offset; >> +        pfn -= __phys_to_dma_pfn_offset(dev, __pfn_to_phys(pfn)); >>       return (dma_addr_t)__pfn_to_bus(pfn); >>   } >>   @@ -45,7 +66,7 @@ static inline unsigned long dma_to_pfn(struct >> device *dev, dma_addr_t addr) >>       unsigned long pfn = __bus_to_pfn(addr); >>         if (dev) >> -        pfn += dev->dma_pfn_offset; >> +        pfn += __dma_to_phys_pfn_offset(dev, addr); >>         return pfn; >>   } >> diff --git a/drivers/of/device.c b/drivers/of/device.c >> index 27203bfd0b22..07a8cc1a7d7f 100644 >> --- a/drivers/of/device.c >> +++ b/drivers/of/device.c >> @@ -105,7 +105,7 @@ int of_dma_configure(struct device *dev, struct >> device_node *np, bool force_dma) >>           if (!force_dma) >>               return ret == -ENODEV ? 0 : ret; >>   -        dma_addr = offset = 0; >> +        dma_addr = offset = paddr = 0; >>       } else { >>           offset = PFN_DOWN(paddr - dma_addr); >>   @@ -144,6 +144,11 @@ int of_dma_configure(struct device *dev, struct >> device_node *np, bool force_dma) >>         dev->dma_pfn_offset = offset; >>   +    dev->dma_ranges.paddr = paddr; >> +    dev->dma_ranges.dma_addr = dma_addr; >> +    dev->dma_ranges.size = size; >> +    dev->dma_ranges.pfn_offset = offset; >> + >>       /* >>        * Limit coherent and dma mask based on size and default mask >>        * set by the driver. >> diff --git a/include/linux/device.h b/include/linux/device.h >> index ce6db68c3f29..57006b51a989 100644 >> --- a/include/linux/device.h >> +++ b/include/linux/device.h >> @@ -293,6 +293,13 @@ struct device_dma_parameters { >>       unsigned long segment_boundary_mask; >>   }; >>   +struct dma_ranges { >> +    u64 paddr; >> +    u64 dma_addr; >> +    u64 size; >> +    unsigned long pfn_offset; >> +}; >> + >>   /** >>    * struct device_connection - Device Connection Descriptor >>    * @fwnode: The device node of the connected device >> @@ -581,6 +588,7 @@ struct device { >>                            allocations such descriptors. */ >>       u64        bus_dma_limit;    /* upstream dma constraint */ >>       unsigned long    dma_pfn_offset; >> +    struct dma_ranges dma_ranges; >>         struct device_dma_parameters *dma_parms; >>   diff --git a/include/linux/dma-direct.h b/include/linux/dma-direct.h >> index 24b8684aa21d..4a46a15945ea 100644 >> --- a/include/linux/dma-direct.h >> +++ b/include/linux/dma-direct.h >> @@ -11,18 +11,47 @@ extern unsigned int zone_dma_bits; >>   #ifdef CONFIG_ARCH_HAS_PHYS_TO_DMA >>   #include >>   #else >> + >> +static inline unsigned long __phys_to_dma_pfn_offset(struct device *dev, >> +                             phys_addr_t paddr) >> +{ >> +    if (!dev) >> +        return 0; >> + >> +    if (paddr >= dev->dma_ranges.paddr && >> +        paddr <= (dev->dma_ranges.paddr + dev->dma_ranges.size)) >> +        return dev->dma_ranges.pfn_offset >> + >> +    return 0; >> +} >> + >> +static inline unsigned long __dma_to_phys_pfn_offset(struct device *dev, >> +                             dma_addr_t dma_addr) >> +{ >> +    if (!dev) >> +        return 0; >> + >> +    if (dma_addr >= dev->dma_ranges.dma_addr && >> +        dma_addr <= (dev->dma_ranges.dma_addr + dev->dma_ranges.size)) >> +        return dev->dma_ranges.pfn_offset >> + >> +    return 0; >> +} >> + >>   static inline dma_addr_t __phys_to_dma(struct device *dev, >> phys_addr_t paddr) >>   { >>       dma_addr_t dev_addr = (dma_addr_t)paddr; >> +    unsigned long offset = __phys_to_dma_pfn_offset(dev, paddr); >>   -    return dev_addr - ((dma_addr_t)dev->dma_pfn_offset << PAGE_SHIFT); >> +    return dev_addr - ((dma_addr_t)offset << PAGE_SHIFT); >>   } >>     static inline phys_addr_t __dma_to_phys(struct device *dev, >> dma_addr_t dev_addr) >>   { >>       phys_addr_t paddr = (phys_addr_t)dev_addr; >> +    unsigned long offset = __dma_to_phys_pfn_offset(dev, dev_addr); >>   -    return paddr + ((phys_addr_t)dev->dma_pfn_offset << PAGE_SHIFT); >> +    return paddr + ((phys_addr_t)offset << PAGE_SHIFT); >>   } >>   #endif /* !CONFIG_ARCH_HAS_PHYS_TO_DMA */ >>   diff --git a/kernel/dma/coherent.c b/kernel/dma/coherent.c >> index 551b0eb7028a..7a68fd09f5d0 100644 >> --- a/kernel/dma/coherent.c >> +++ b/kernel/dma/coherent.c >> @@ -31,10 +31,13 @@ static inline struct dma_coherent_mem >> *dev_get_coherent_memory(struct device *de >>   static inline dma_addr_t dma_get_device_base(struct device *dev, >>                            struct dma_coherent_mem * mem) >>   { >> -    if (mem->use_dev_dma_pfn_offset) >> -        return (mem->pfn_base - dev->dma_pfn_offset) << PAGE_SHIFT; >> -    else >> +    if (mem->use_dev_dma_pfn_offset) { >> +        unsigned long offset = __phys_to_dma_pfn_offset(dev, >> +                        __pfn_to_phys(mem->pfn_base)); >> +        return (mem->pfn_base - offset) << PAGE_SHIFT; >> +    } else { >>           return mem->device_base; >> +    } >>   } >>     static int dma_init_coherent_memory(phys_addr_t phys_addr, >> Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki. Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.1 required=3.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, 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 02C26C33CB1 for ; Wed, 15 Jan 2020 11:50:43 +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 B80DB207E0 for ; Wed, 15 Jan 2020 11:50:42 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=ti.com header.i=@ti.com header.b="tkB6FfFj" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org B80DB207E0 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=lists.linux-foundation.org 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 8A7D81FFFF; Wed, 15 Jan 2020 11:50:42 +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 DQOQgtXSRhRR; Wed, 15 Jan 2020 11:50:38 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by silver.osuosl.org (Postfix) with ESMTP id B20AC20515; Wed, 15 Jan 2020 11:50:36 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 96969C1D83; Wed, 15 Jan 2020 11:50:36 +0000 (UTC) Received: from fraxinus.osuosl.org (smtp4.osuosl.org [140.211.166.137]) by lists.linuxfoundation.org (Postfix) with ESMTP id A0BA5C077D for ; Wed, 15 Jan 2020 11:50:35 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by fraxinus.osuosl.org (Postfix) with ESMTP id 893DE85F43 for ; Wed, 15 Jan 2020 11:50:35 +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 UpMpUJPeIgsG for ; Wed, 15 Jan 2020 11:50:31 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from fllv0015.ext.ti.com (fllv0015.ext.ti.com [198.47.19.141]) by fraxinus.osuosl.org (Postfix) with ESMTPS id E17E58459B for ; Wed, 15 Jan 2020 11:50:30 +0000 (UTC) Received: from lelv0266.itg.ti.com ([10.180.67.225]) by fllv0015.ext.ti.com (8.15.2/8.15.2) with ESMTP id 00FBo7ac036940; Wed, 15 Jan 2020 05:50:07 -0600 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ti.com; s=ti-com-17Q1; t=1579089007; bh=tmzYkT94bb3dzh3tdif/e0kQpanc2ZK+pZA1Vabt8ig=; h=Subject:To:CC:References:From:Date:In-Reply-To; b=tkB6FfFjxmnXfUrH48qyy+Hahes3CdWqdDJugNsksBb2y35Ae7A4U3TdHszMxZXaW NtT67l2mqJCYw5M4QquEDncn/7xKjhhszPV67vHtTefI8rICrrVeppS1f826ws8IA4 docuBswYL/BVm0JevSVEOmFxnOawLrlkh0UjQftQ= Received: from DLEE109.ent.ti.com (dlee109.ent.ti.com [157.170.170.41]) by lelv0266.itg.ti.com (8.15.2/8.15.2) with ESMTPS id 00FBo7fF015271 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=FAIL); Wed, 15 Jan 2020 05:50:07 -0600 Received: from DLEE111.ent.ti.com (157.170.170.22) by DLEE109.ent.ti.com (157.170.170.41) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1847.3; Wed, 15 Jan 2020 05:50:07 -0600 Received: from fllv0040.itg.ti.com (10.64.41.20) by DLEE111.ent.ti.com (157.170.170.22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1847.3 via Frontend Transport; Wed, 15 Jan 2020 05:50:07 -0600 Received: from [192.168.2.6] (ileax41-snat.itg.ti.com [10.172.224.153]) by fllv0040.itg.ti.com (8.15.2/8.15.2) with ESMTP id 00FBo4wl060858; Wed, 15 Jan 2020 05:50:05 -0600 Subject: Re: [PoC] arm: dma-mapping: direct: Apply dma_pfn_offset only when it is valid To: Robin Murphy , References: <8eb68140-97b2-62ce-3e06-3761984aa5b1@ti.com> <20200114164332.3164-1-peter.ujfalusi@ti.com> Message-ID: <28ee3395-baed-8d59-8546-ab7765829cc8@ti.com> Date: Wed, 15 Jan 2020 13:50:41 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.9.0 MIME-Version: 1.0 In-Reply-To: Content-Language: en-US X-EXCLAIMER-MD-CONFIG: e1e8a2fd-e40a-4ac6-ac9b-f7e9cc9ee180 Cc: robh@kernel.org, vigneshr@ti.com, konrad.wilk@oracle.com, linux@armlinux.org.uk, linux-kernel@vger.kernel.org, iommu@lists.linux-foundation.org, linux-arm-kernel@lists.infradead.org, rogerq@ti.com X-BeenThere: iommu@lists.linux-foundation.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: Development issues for Linux IOMMU support List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , From: Peter Ujfalusi via iommu Reply-To: Peter Ujfalusi Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: iommu-bounces@lists.linux-foundation.org Sender: "iommu" CgpPbiAxNC8wMS8yMDIwIDIwLjE5LCBSb2JpbiBNdXJwaHkgd3JvdGU6Cj4gT24gMTQvMDEvMjAy MCA0OjQzIHBtLCBQZXRlciBVamZhbHVzaSB3cm90ZToKPj4gVGhlIGRtYV9wZm5fb2Zmc2V0IHNo b3VsZCBvbmx5IGJlIGFwcGxpZWQgdG8gYW4gYWRkcmVzcyB3aGljaCBpcwo+PiB3aXRoaW4gdGhl Cj4+IGRtYS1yYW5nZXMgcmFuZ2UuIEFueSBhZGRyZXNzIG91dHNpZGUgc2hvdWxkIGhhdmUgb2Zm c2V0IGFzIDAuCj4gCj4gTm8sIHRoYXQncyB3cm9uZy4gSWYgYSBub24tZW1wdHkgZG1hLXJhbmdl cyBpcyBwcmVzZW50LCB0aGVuIGFkZHJlc3Nlcwo+IHdoaWNoIGRvIG5vdCBmYWxsIHdpdGhpbiBh bnkgc3BlY2lmaWVkIHJhbmdlIGFyZSBpbnZhbGlkIGFsdG9nZXRoZXIuCgpJdCBpcyBub3QgZXhw bGljaXRseSBzdGF0ZWQgYnkgdGhlIHNwZWNpZmljYXRpb24sIGJ1dCBjYW4gYmUgaW50ZXJwcmV0 ZWQKbGlrZSB0aGF0IGFuZCBmcm9tIGEgcG93IGl0IGRvZXMgbWFrZSBzZW5zZSB0byB0cmVhdCB0 aGluZ3MgbGlrZSB0aGF0LgoKPiBUaGUgY3VycmVudCBsb25nLXRlcm0gcGxhbiBpcyBpbmRlZWQg dG8gdHJ5IHRvIG1vdmUgdG8gc29tZSBzb3J0IG9mCj4gaW50ZXJuYWwgIkRNQSByYW5nZSBkZXNj cmlwdG9yIiBpbiBvcmRlciB0byBwcm9wZXJseSBjb3BlIHdpdGggdGhlIGtpbmQKPiBvZiBlc290 ZXJpYyBpbnRlZ3JhdGlvbnMgd2hpY2ggaGF2ZSBtdWx0aXBsZSBkaXNqb2ludCB3aW5kb3dzLAo+ IHBvdGVudGlhbGx5IGV2ZW4gd2l0aCBkaWZmZXJlbnQgb2Zmc2V0cywgYnV0IGFzIHlvdSBwb2lu dCBvdXQgdGhlcmUgYXJlCj4gc3RpbGwgbWFueSBodXJkbGVzIGJldHdlZW4gbm93IGFuZCB0aGF0 IGJlY29taW5nIHJlYWxpdHkuIFNvIGFsdGhvdWdoCj4gdGhpcyBwYXRjaCBkb2VzIHJlcHJlc2Vu dCB0aGUgInJpZ2h0IiB0aGluZywgaXQncyBmb3IgZW50aXJlbHkgdGhlIHdyb25nCj4gcmVhc29u LiBBRkFJQ1QgZm9yIHlvdXIgY2FzZSBpdCBiYXNpY2FsbHkganVzdCB3b3JrcyBvdXQgYXMgYSB2 ZXJ5Cj4gYmFyb3F1ZSB3YXkgdG8gaGFjayBkbWFfZGlyZWN0X3N1cHBvcnRlZCgpIGFnYWluIC0g d2Ugc2hvdWxkbid0IG5lZWQgYQo+IHNwZWNpYWwgY2FzZSB0byBtYXAgYSBib2d1cyBwaHlzaWNh bCBhZGRyZXNzIHRvIHZhbGlkIERNQSBhZGRyZXNzLCB3ZQo+IHNob3VsZCBiZSBmaXhpbmcgdGhl IHNvdXJjZSBvZiB0aGUgYm9ndXMgUEEgaW4gdGhlIGZpcnN0IHBsYWNlLgoKRE1BX0JJVF9NQVNL KDMyKSBpcyBwcmV0dHkgY2xlYXI6IFRoZSBETUEgY2FuIGhhbmRsZSBhZGRyZXNzZXMgd2l0aGlu CjMyYml0IHNwYWNlLiBETUFfQklUX01BU0soMjQpIGlzIGFsc28gY2xlYXI6IFRoZSBETUEgY2Fu IGhhbmRsZQphZGRyZXNzZXMgd2l0aGluIDI0Yml0IHNwYWNlLgoKZG1hLXJhbmdlcyBkb2VzIG5v dCBjaGFuZ2UgdGhhdC4gVGhlIERNQSBjYW4gc3RpbGwgYWRkcmVzcyB0aGUgc2FtZQpzcGFjZS4g V2hhdCBkbWEtcmFuZ2VzIHdpbGwgdGVsbCBpcyB0aGF0IGEgcGh5c2ljYWwgYWRkcmVzcyByYW5n ZSAnWCcKY2FuIGJlIGFjY2Vzc2VkIG9uIHRoZSBidXMgdW5kZXIgcmFuZ2UgJ1knLgpGb3IgdGhl IERNQSB3aXRoaW4gdGhlIGJ1cyB0aGUgcGh5c2ljYWwgYWRkcmVzcyB3aXRoaW4gJ1gnIGRvZXMg bm90Cm1hdHRlci4gV2hhdCBtYXR0ZXJzIGlzIHRoZSBtYXRjaGluZyBhZGRyZXNzIHdpdGhpbiAn WScKCldlIHNob3VsZCBkbyBkbWFfcGZuX29mZnNldCBjb252ZXJzaW9uIF9vbmx5XyBmb3IgdGhl IHJhbmdlIGl0IGFwcGxpZXMKdG8uIE91dHNpZGUgb2YgaXQgaXMgbm90IHZhbGlkIHRvIGFwcGx5 IGl0LiBUaGUgZG1hIEFQSSB3aWxsIGNoZWNrCih3aXRob3V0IGFwcGx5aW5nIGRtYV9wZm5fb2Zm c2V0KSBhZGRyZXNzZXMgb3V0c2lkZSBvZiBhbnkgcmFuZ2UgKG9ubHkKb25lIGN1cnJlbnRseSBp biBMaW51eCkgYW5kIGlmIGl0IGlzIG5vdCBPSyBmb3IgdGhlIG1hc2sgdGhlbiBpdCB3aWxsIGZh aWwuCgo+IAo+PiBUaGlzIGlzIGEgcHJvb2Ygb2YgY29uY2VwdCBwYXRjaCB3aGljaCB3b3JrcyBv biBrMmcgd2hlcmUgd2UgaGF2ZQo+PiBkbWEtcmFuZ2VzID0gPDB4ODAwMDAwMDAgMHg4IDB4MDAw MDAwMDAgMHg4MDAwMDAwMD47Cj4+IGZvciB0aGUgU29DLgo+IAo+IFRCSCBpdCdzIHByb2JhYmx5 IGV4dHJhLWNvbmZ1c2luZyB0aGF0IHlvdSdyZSBvbiBLZXlzdG9uZSAyLCB3aGVyZQo+IHRlY2hu aWNhbGx5IHRoaXMgZW5kcyB1cCBjbG9zZXItdG8tT0sgdGhhbiBtb3N0LCBzaW5jZSBJSVJDIHRo ZSAwLTJHQgo+IE1NSU8gcmVnaW9uIGlzIHRoZSBzYW1lIG9uIGFsbCAzKD8pIGludGVyY29ubmVj dCBtYXBzLiBUaHVzIHRoZSAxMDAlCj4gaG9uZXN0IGRlc2NyaXB0aW9uIHdvdWxkIHJlYWxseSBi ZToKPiAKPiBkbWEtcmFuZ2VzID0gPDB4MCAweDAgMHgwIDB4ODAwMDAwMDA+LAo+IMKgwqDCoMKg wqDCoMKgwqAgPDB4ODAwMDAwMDAgMHg4IDB4MDAwMDAwMDAgMHg4MDAwMDAwMD47Cj4gCj4gYnV0 IHllYWgsIHRoYXQgd291bGQganVzdCBnbyBob3JyaWJseSB3cm9uZyB3aXRoIExpbnV4IHRvZGF5 LgoKSXQgZG9lcyA7KSBUaGlzIHdhcyB0aGUgZmlyc3QgdGhpbmcgSSBoYXZlIHRyaWVkLgoKPiBU aGUKPiBzdWJ0ZWx0eSB0aGF0IGRtYV9tYXBfcmVzb3VyY2UoKSBpZ25vcmVzIHRoZSBwZm5fb2Zm c2V0IGhhcHBlbnMgdG8gYmUgYQo+ICJmZWF0dXJlIiBpbiB0aGlzIHJlZ2FyZCA7KQoKUmlnaHQs IGJ1dCBLZXlzdG9uZSAyIGlzIGJyb2tlbiBzaW5jZSA1LjMtcmMzIGJ5IGNvbW1pdAphZDNjN2Ix OGM1YjM2MmJlNWRiZDBmMmMwYmNmMWZkNWZkNjU5MzE1LgoKQ2FuIHlvdSBwcm9wb3NlIGEgZml4 IHdoaWNoIHdlIGNhbiB1c2UgdW50aWwgdGhpbmdzIGdldCBzb3J0ZWQgb3V0PwoKVGhhbmtzLAot IFDDqXRlcgoKPiAKPiBSb2Jpbi4KPiAKPj4gV2l0aG91dCB0aGlzIHBhdGNoIGV2ZXJ5dGhpbmcg d2hpY2ggdHJpZXMgdG8gc2V0IERNQV9CSVRfTUFTSygzMikgb3IgbGVzcwo+PiBmYWlscyAtPiBE TUEgYW5kIHBlcmlwaGVyYWxzIHdpdGggYnVpbHQgaW4gRE1BIChTRCB3aXRoIEFETUEpIHdpbGwg bm90Cj4+IHByb2JlIG9yIGZhbGwgYmFjayB0byBQSU8gbW9kZS4KPj4KPj4gV2l0aCB0aGlzIHBh dGNoIEVETUEgcHJvYmVzLCBTRCdzIEFETUEgaXMgd29ya2luZy4KPj4gQXVkaW8gYW5kIGRtYS10 ZXN0IGlzIHdvcmtpbmcganVzdCBmaW5lIHdpdGggRURNQSwgbW1jIGFjY2Vzc2VzIHdpdGggQURN QQo+PiBhbHNvIG9wZXJhdGlvbmFsLgo+Pgo+PiBUaGUgcGF0Y2ggZG9lcyBub3QgdHJpZWQgdG8g YWRkcmVzcyB0aGUgaW5jb21wbGV0ZSBoYW5kbGluZyBvZiBkbWEtcmFuZ2VzCj4+IGZyb20gRFQg YW5kIGl0IGlzIG5vdCBmaXhpbmcvdXBkYXRpbmcgYXJjaCBjb2RlIG9yIGRyaXZlcnMgd2hpY2gg dXNlcwo+PiBkbWFfcGZuX29mZnNldC4KPj4gTmVpdGhlciBwcm92aWRlcyBmYWxsYmFjayBzdXBw b3J0IGZvciBrZXJuZWwgc2V0dGluZyBvbmx5Cj4+IGRtYV9wZm5fb2Zmc2V0IHRvCj4+IGFyYml0 cmFyeSBudW1iZXIgd2l0aG91dCBwYWRkci9kbWFfYWRkci9zaXplLgo+Pgo+PiBTaWduZWQtb2Zm LWJ5OiBQZXRlciBVamZhbHVzaSA8cGV0ZXIudWpmYWx1c2lAdGkuY29tPgo+PiAtLS0KPj4gSGkg Q2hyaXN0b3BoLCBSb2JpbiwKPj4KPj4gSSBrbm93IGl0IGlzIGEgYml0IG1vcmUgY29tcGxpY2F0 ZWQsIGJ1dCB3aXRoIHRoaXMgcGF0Y2ggazJnIGlzCj4+IHdvcmtpbmcgZmluZS4uLgo+Pgo+PiBJ IHdhbnRlZCB0byB0ZXN0IHRoZSBjb25jZXB0IEkgd2FzIGRlc2NyaWJpbmcgYW5kIGEgcGF0Y2gg c3BlYWtzCj4+IGJldHRlciB0aGFuCj4+IHdvcmRzLgo+Pgo+PiBLaW5kIHJlZ2FyZHMsCj4+IFBl dGVyCj4+Cj4+IMKgIGFyY2gvYXJtL2luY2x1ZGUvYXNtL2RtYS1tYXBwaW5nLmggfCAyNSArKysr KysrKysrKysrKysrKysrKy0tCj4+IMKgIGRyaXZlcnMvb2YvZGV2aWNlLmPCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgfMKgIDcgKysrKysrLQo+PiDCoCBpbmNsdWRlL2xpbnV4L2Rldmlj ZS5owqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHzCoCA4ICsrKysrKysrCj4+IMKgIGluY2x1ZGUv bGludXgvZG1hLWRpcmVjdC5owqDCoMKgwqDCoMKgwqDCoCB8IDMzICsrKysrKysrKysrKysrKysr KysrKysrKysrKystLQo+PiDCoCBrZXJuZWwvZG1hL2NvaGVyZW50LmPCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCB8wqAgOSArKysrKy0tLQo+PiDCoCA1IGZpbGVzIGNoYW5nZWQsIDc0IGluc2Vy dGlvbnMoKyksIDggZGVsZXRpb25zKC0pCj4+Cj4+IGRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNs dWRlL2FzbS9kbWEtbWFwcGluZy5oCj4+IGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vZG1hLW1hcHBp bmcuaAo+PiBpbmRleCBiZGQ4MGRkYmNhMzQuLjliZmY2YWQyZDhjOCAxMDA2NDQKPj4gLS0tIGEv YXJjaC9hcm0vaW5jbHVkZS9hc20vZG1hLW1hcHBpbmcuaAo+PiArKysgYi9hcmNoL2FybS9pbmNs dWRlL2FzbS9kbWEtbWFwcGluZy5oCj4+IEBAIC0zMywxMCArMzMsMzEgQEAgc3RhdGljIGlubGlu ZSBjb25zdCBzdHJ1Y3QgZG1hX21hcF9vcHMKPj4gKmdldF9hcmNoX2RtYV9vcHMoc3RydWN0IGJ1 c190eXBlICpidXMpCj4+IMKgwqAgKiBhZGRyZXNzZXMuIFRoZXkgbXVzdCBub3QgYmUgdXNlZCBi eSBkcml2ZXJzLgo+PiDCoMKgICovCj4+IMKgICNpZm5kZWYgX19hcmNoX3Bmbl90b19kbWEKPj4g Kwo+PiArc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fcGh5c190b19kbWFfcGZuX29mZnNl dChzdHJ1Y3QgZGV2aWNlICpkZXYsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBwaHlzX2FkZHJfdCBwYWRkcikKPj4gK3sKPj4gK8Kg wqDCoCBpZiAocGFkZHIgPj0gZGV2LT5kbWFfcmFuZ2VzLnBhZGRyICYmCj4+ICvCoMKgwqDCoMKg wqDCoCBwYWRkciA8PSAoZGV2LT5kbWFfcmFuZ2VzLnBhZGRyICsgZGV2LT5kbWFfcmFuZ2VzLnNp emUpKQo+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIGRldi0+ZG1hX3Jhbmdlcy5wZm5fb2Zmc2V0 Owo+PiArCj4+ICvCoMKgwqAgcmV0dXJuIDA7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBpbmxpbmUg dW5zaWduZWQgbG9uZyBfX2RtYV90b19waHlzX3Bmbl9vZmZzZXQoc3RydWN0IGRldmljZSAqZGV2 LAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgZG1hX2FkZHJfdCBkbWFfYWRkcikKPj4gK3sKPj4gK8KgwqDCoCBpZiAoZG1hX2FkZHIg Pj0gZGV2LT5kbWFfcmFuZ2VzLmRtYV9hZGRyICYmCj4+ICvCoMKgwqDCoMKgwqDCoCBkbWFfYWRk ciA8PSAoZGV2LT5kbWFfcmFuZ2VzLmRtYV9hZGRyICsgZGV2LT5kbWFfcmFuZ2VzLnNpemUpKQo+ PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIGRldi0+ZG1hX3Jhbmdlcy5wZm5fb2Zmc2V0Owo+PiAr Cj4+ICvCoMKgwqAgcmV0dXJuIDA7Cj4+ICt9Cj4+ICsKPj4gwqAgc3RhdGljIGlubGluZSBkbWFf YWRkcl90IHBmbl90b19kbWEoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZAo+PiBsb25nIHBm bikKPj4gwqAgewo+PiDCoMKgwqDCoMKgIGlmIChkZXYpCj4+IC3CoMKgwqDCoMKgwqDCoCBwZm4g LT0gZGV2LT5kbWFfcGZuX29mZnNldDsKPj4gK8KgwqDCoMKgwqDCoMKgIHBmbiAtPSBfX3BoeXNf dG9fZG1hX3Bmbl9vZmZzZXQoZGV2LCBfX3Bmbl90b19waHlzKHBmbikpOwo+PiDCoMKgwqDCoMKg IHJldHVybiAoZG1hX2FkZHJfdClfX3Bmbl90b19idXMocGZuKTsKPj4gwqAgfQo+PiDCoCBAQCAt NDUsNyArNjYsNyBAQCBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZG1hX3RvX3BmbihzdHJ1 Y3QKPj4gZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgYWRkcikKPj4gwqDCoMKgwqDCoCB1bnNpZ25l ZCBsb25nIHBmbiA9IF9fYnVzX3RvX3BmbihhZGRyKTsKPj4gwqAgwqDCoMKgwqDCoCBpZiAoZGV2 KQo+PiAtwqDCoMKgwqDCoMKgwqAgcGZuICs9IGRldi0+ZG1hX3Bmbl9vZmZzZXQ7Cj4+ICvCoMKg wqDCoMKgwqDCoCBwZm4gKz0gX19kbWFfdG9fcGh5c19wZm5fb2Zmc2V0KGRldiwgYWRkcik7Cj4+ IMKgIMKgwqDCoMKgwqAgcmV0dXJuIHBmbjsKPj4gwqAgfQo+PiBkaWZmIC0tZ2l0IGEvZHJpdmVy cy9vZi9kZXZpY2UuYyBiL2RyaXZlcnMvb2YvZGV2aWNlLmMKPj4gaW5kZXggMjcyMDNiZmQwYjIy Li4wN2E4Y2MxYTdkN2YgMTAwNjQ0Cj4+IC0tLSBhL2RyaXZlcnMvb2YvZGV2aWNlLmMKPj4gKysr IGIvZHJpdmVycy9vZi9kZXZpY2UuYwo+PiBAQCAtMTA1LDcgKzEwNSw3IEBAIGludCBvZl9kbWFf Y29uZmlndXJlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0Cj4+IGRldmljZV9ub2RlICpucCwg Ym9vbCBmb3JjZV9kbWEpCj4+IMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAoIWZvcmNlX2RtYSkKPj4g wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0dXJuIHJldCA9PSAtRU5PREVWID8gMCA6IHJl dDsKPj4gwqAgLcKgwqDCoMKgwqDCoMKgIGRtYV9hZGRyID0gb2Zmc2V0ID0gMDsKPj4gK8KgwqDC oMKgwqDCoMKgIGRtYV9hZGRyID0gb2Zmc2V0ID0gcGFkZHIgPSAwOwo+PiDCoMKgwqDCoMKgIH0g ZWxzZSB7Cj4+IMKgwqDCoMKgwqDCoMKgwqDCoCBvZmZzZXQgPSBQRk5fRE9XTihwYWRkciAtIGRt YV9hZGRyKTsKPj4gwqAgQEAgLTE0NCw2ICsxNDQsMTEgQEAgaW50IG9mX2RtYV9jb25maWd1cmUo c3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QKPj4gZGV2aWNlX25vZGUgKm5wLCBib29sIGZvcmNl X2RtYSkKPj4gwqAgwqDCoMKgwqDCoCBkZXYtPmRtYV9wZm5fb2Zmc2V0ID0gb2Zmc2V0Owo+PiDC oCArwqDCoMKgIGRldi0+ZG1hX3Jhbmdlcy5wYWRkciA9IHBhZGRyOwo+PiArwqDCoMKgIGRldi0+ ZG1hX3Jhbmdlcy5kbWFfYWRkciA9IGRtYV9hZGRyOwo+PiArwqDCoMKgIGRldi0+ZG1hX3Jhbmdl cy5zaXplID0gc2l6ZTsKPj4gK8KgwqDCoCBkZXYtPmRtYV9yYW5nZXMucGZuX29mZnNldCA9IG9m ZnNldDsKPj4gKwo+PiDCoMKgwqDCoMKgIC8qCj4+IMKgwqDCoMKgwqDCoCAqIExpbWl0IGNvaGVy ZW50IGFuZCBkbWEgbWFzayBiYXNlZCBvbiBzaXplIGFuZCBkZWZhdWx0IG1hc2sKPj4gwqDCoMKg wqDCoMKgICogc2V0IGJ5IHRoZSBkcml2ZXIuCj4+IGRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4 L2RldmljZS5oIGIvaW5jbHVkZS9saW51eC9kZXZpY2UuaAo+PiBpbmRleCBjZTZkYjY4YzNmMjku LjU3MDA2YjUxYTk4OSAxMDA2NDQKPj4gLS0tIGEvaW5jbHVkZS9saW51eC9kZXZpY2UuaAo+PiAr KysgYi9pbmNsdWRlL2xpbnV4L2RldmljZS5oCj4+IEBAIC0yOTMsNiArMjkzLDEzIEBAIHN0cnVj dCBkZXZpY2VfZG1hX3BhcmFtZXRlcnMgewo+PiDCoMKgwqDCoMKgIHVuc2lnbmVkIGxvbmcgc2Vn bWVudF9ib3VuZGFyeV9tYXNrOwo+PiDCoCB9Owo+PiDCoCArc3RydWN0IGRtYV9yYW5nZXMgewo+ PiArwqDCoMKgIHU2NCBwYWRkcjsKPj4gK8KgwqDCoCB1NjQgZG1hX2FkZHI7Cj4+ICvCoMKgwqAg dTY0IHNpemU7Cj4+ICvCoMKgwqAgdW5zaWduZWQgbG9uZyBwZm5fb2Zmc2V0Owo+PiArfTsKPj4g Kwo+PiDCoCAvKioKPj4gwqDCoCAqIHN0cnVjdCBkZXZpY2VfY29ubmVjdGlvbiAtIERldmljZSBD b25uZWN0aW9uIERlc2NyaXB0b3IKPj4gwqDCoCAqIEBmd25vZGU6IFRoZSBkZXZpY2Ugbm9kZSBv ZiB0aGUgY29ubmVjdGVkIGRldmljZQo+PiBAQCAtNTgxLDYgKzU4OCw3IEBAIHN0cnVjdCBkZXZp Y2Ugewo+PiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIGFsbG9jYXRpb25zIHN1Y2ggZGVzY3JpcHRvcnMuICovCj4+IMKgwqDCoMKgwqAgdTY0wqDC oMKgwqDCoMKgwqAgYnVzX2RtYV9saW1pdDvCoMKgwqAgLyogdXBzdHJlYW0gZG1hIGNvbnN0cmFp bnQgKi8KPj4gwqDCoMKgwqDCoCB1bnNpZ25lZCBsb25nwqDCoMKgIGRtYV9wZm5fb2Zmc2V0Owo+ PiArwqDCoMKgIHN0cnVjdCBkbWFfcmFuZ2VzIGRtYV9yYW5nZXM7Cj4+IMKgIMKgwqDCoMKgwqAg c3RydWN0IGRldmljZV9kbWFfcGFyYW1ldGVycyAqZG1hX3Bhcm1zOwo+PiDCoCBkaWZmIC0tZ2l0 IGEvaW5jbHVkZS9saW51eC9kbWEtZGlyZWN0LmggYi9pbmNsdWRlL2xpbnV4L2RtYS1kaXJlY3Qu aAo+PiBpbmRleCAyNGI4Njg0YWEyMWQuLjRhNDZhMTU5NDVlYSAxMDA2NDQKPj4gLS0tIGEvaW5j bHVkZS9saW51eC9kbWEtZGlyZWN0LmgKPj4gKysrIGIvaW5jbHVkZS9saW51eC9kbWEtZGlyZWN0 LmgKPj4gQEAgLTExLDE4ICsxMSw0NyBAQCBleHRlcm4gdW5zaWduZWQgaW50IHpvbmVfZG1hX2Jp dHM7Cj4+IMKgICNpZmRlZiBDT05GSUdfQVJDSF9IQVNfUEhZU19UT19ETUEKPj4gwqAgI2luY2x1 ZGUgPGFzbS9kbWEtZGlyZWN0Lmg+Cj4+IMKgICNlbHNlCj4+ICsKPj4gK3N0YXRpYyBpbmxpbmUg dW5zaWduZWQgbG9uZyBfX3BoeXNfdG9fZG1hX3Bmbl9vZmZzZXQoc3RydWN0IGRldmljZSAqZGV2 LAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgcGh5c19hZGRyX3QgcGFkZHIpCj4+ICt7Cj4+ICvCoMKgwqAgaWYgKCFkZXYpCj4+ICvC oMKgwqDCoMKgwqDCoCByZXR1cm4gMDsKPj4gKwo+PiArwqDCoMKgIGlmIChwYWRkciA+PSBkZXYt PmRtYV9yYW5nZXMucGFkZHIgJiYKPj4gK8KgwqDCoMKgwqDCoMKgIHBhZGRyIDw9IChkZXYtPmRt YV9yYW5nZXMucGFkZHIgKyBkZXYtPmRtYV9yYW5nZXMuc2l6ZSkpCj4+ICvCoMKgwqDCoMKgwqDC oCByZXR1cm4gZGV2LT5kbWFfcmFuZ2VzLnBmbl9vZmZzZXQKPj4gKwo+PiArwqDCoMKgIHJldHVy biAwOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19kbWFfdG9f cGh5c19wZm5fb2Zmc2V0KHN0cnVjdCBkZXZpY2UgKmRldiwKPj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGRtYV9hZGRyX3QgZG1hX2Fk ZHIpCj4+ICt7Cj4+ICvCoMKgwqAgaWYgKCFkZXYpCj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4g MDsKPj4gKwo+PiArwqDCoMKgIGlmIChkbWFfYWRkciA+PSBkZXYtPmRtYV9yYW5nZXMuZG1hX2Fk ZHIgJiYKPj4gK8KgwqDCoMKgwqDCoMKgIGRtYV9hZGRyIDw9IChkZXYtPmRtYV9yYW5nZXMuZG1h X2FkZHIgKyBkZXYtPmRtYV9yYW5nZXMuc2l6ZSkpCj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4g ZGV2LT5kbWFfcmFuZ2VzLnBmbl9vZmZzZXQKPj4gKwo+PiArwqDCoMKgIHJldHVybiAwOwo+PiAr fQo+PiArCj4+IMKgIHN0YXRpYyBpbmxpbmUgZG1hX2FkZHJfdCBfX3BoeXNfdG9fZG1hKHN0cnVj dCBkZXZpY2UgKmRldiwKPj4gcGh5c19hZGRyX3QgcGFkZHIpCj4+IMKgIHsKPj4gwqDCoMKgwqDC oCBkbWFfYWRkcl90IGRldl9hZGRyID0gKGRtYV9hZGRyX3QpcGFkZHI7Cj4+ICvCoMKgwqAgdW5z aWduZWQgbG9uZyBvZmZzZXQgPSBfX3BoeXNfdG9fZG1hX3Bmbl9vZmZzZXQoZGV2LCBwYWRkcik7 Cj4+IMKgIC3CoMKgwqAgcmV0dXJuIGRldl9hZGRyIC0gKChkbWFfYWRkcl90KWRldi0+ZG1hX3Bm bl9vZmZzZXQgPDwgUEFHRV9TSElGVCk7Cj4+ICvCoMKgwqAgcmV0dXJuIGRldl9hZGRyIC0gKChk bWFfYWRkcl90KW9mZnNldCA8PCBQQUdFX1NISUZUKTsKPj4gwqAgfQo+PiDCoCDCoCBzdGF0aWMg aW5saW5lIHBoeXNfYWRkcl90IF9fZG1hX3RvX3BoeXMoc3RydWN0IGRldmljZSAqZGV2LAo+PiBk bWFfYWRkcl90IGRldl9hZGRyKQo+PiDCoCB7Cj4+IMKgwqDCoMKgwqAgcGh5c19hZGRyX3QgcGFk ZHIgPSAocGh5c19hZGRyX3QpZGV2X2FkZHI7Cj4+ICvCoMKgwqAgdW5zaWduZWQgbG9uZyBvZmZz ZXQgPSBfX2RtYV90b19waHlzX3Bmbl9vZmZzZXQoZGV2LCBkZXZfYWRkcik7Cj4+IMKgIC3CoMKg wqAgcmV0dXJuIHBhZGRyICsgKChwaHlzX2FkZHJfdClkZXYtPmRtYV9wZm5fb2Zmc2V0IDw8IFBB R0VfU0hJRlQpOwo+PiArwqDCoMKgIHJldHVybiBwYWRkciArICgocGh5c19hZGRyX3Qpb2Zmc2V0 IDw8IFBBR0VfU0hJRlQpOwo+PiDCoCB9Cj4+IMKgICNlbmRpZiAvKiAhQ09ORklHX0FSQ0hfSEFT X1BIWVNfVE9fRE1BICovCj4+IMKgIGRpZmYgLS1naXQgYS9rZXJuZWwvZG1hL2NvaGVyZW50LmMg Yi9rZXJuZWwvZG1hL2NvaGVyZW50LmMKPj4gaW5kZXggNTUxYjBlYjcwMjhhLi43YTY4ZmQwOWY1 ZDAgMTAwNjQ0Cj4+IC0tLSBhL2tlcm5lbC9kbWEvY29oZXJlbnQuYwo+PiArKysgYi9rZXJuZWwv ZG1hL2NvaGVyZW50LmMKPj4gQEAgLTMxLDEwICszMSwxMyBAQCBzdGF0aWMgaW5saW5lIHN0cnVj dCBkbWFfY29oZXJlbnRfbWVtCj4+ICpkZXZfZ2V0X2NvaGVyZW50X21lbW9yeShzdHJ1Y3QgZGV2 aWNlICpkZQo+PiDCoCBzdGF0aWMgaW5saW5lIGRtYV9hZGRyX3QgZG1hX2dldF9kZXZpY2VfYmFz ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgc3RydWN0IGRtYV9jb2hlcmVudF9tZW0gKiBtZW0pCj4+IMKg IHsKPj4gLcKgwqDCoCBpZiAobWVtLT51c2VfZGV2X2RtYV9wZm5fb2Zmc2V0KQo+PiAtwqDCoMKg wqDCoMKgwqAgcmV0dXJuIChtZW0tPnBmbl9iYXNlIC0gZGV2LT5kbWFfcGZuX29mZnNldCkgPDwg UEFHRV9TSElGVDsKPj4gLcKgwqDCoCBlbHNlCj4+ICvCoMKgwqAgaWYgKG1lbS0+dXNlX2Rldl9k bWFfcGZuX29mZnNldCkgewo+PiArwqDCoMKgwqDCoMKgwqAgdW5zaWduZWQgbG9uZyBvZmZzZXQg PSBfX3BoeXNfdG9fZG1hX3Bmbl9vZmZzZXQoZGV2LAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBfX3Bmbl90b19waHlzKG1lbS0+cGZuX2Jhc2UpKTsK Pj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiAobWVtLT5wZm5fYmFzZSAtIG9mZnNldCkgPDwgUEFH RV9TSElGVDsKPj4gK8KgwqDCoCB9IGVsc2Ugewo+PiDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0dXJu IG1lbS0+ZGV2aWNlX2Jhc2U7Cj4+ICvCoMKgwqAgfQo+PiDCoCB9Cj4+IMKgIMKgIHN0YXRpYyBp bnQgZG1hX2luaXRfY29oZXJlbnRfbWVtb3J5KHBoeXNfYWRkcl90IHBoeXNfYWRkciwKPj4KClRl eGFzIEluc3RydW1lbnRzIEZpbmxhbmQgT3ksIFBvcmtrYWxhbmthdHUgMjIsIDAwMTgwIEhlbHNp bmtpLgpZLXR1bm51cy9CdXNpbmVzcyBJRDogMDYxNTUyMS00LiBLb3RpcGFpa2thL0RvbWljaWxl OiBIZWxzaW5raQpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f Xwppb21tdSBtYWlsaW5nIGxpc3QKaW9tbXVAbGlzdHMubGludXgtZm91bmRhdGlvbi5vcmcKaHR0 cHM6Ly9saXN0cy5saW51eGZvdW5kYXRpb24ub3JnL21haWxtYW4vbGlzdGluZm8vaW9tbXU= From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.3 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3A3D9C33CB1 for ; Wed, 15 Jan 2020 11:50:35 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id DAA6E207E0 for ; Wed, 15 Jan 2020 11:50:34 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="kiD6gOLR"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=ti.com header.i=@ti.com header.b="tkB6FfFj" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org DAA6E207E0 Authentication-Results: mail.kernel.org; dmarc=fail (p=quarantine dis=none) header.from=ti.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id: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=jUadBfLzol9E5sOQ9hdB6K6hapEjdan88VVrL+OdONI=; b=kiD6gOLRJ/OTQx f/yjytZ4BeRxZUi2EsTBLtBcwfZXR8KE49ZJgj28+ZUEbpL4rltpB0Gms+YKSLjP8l5toXP5fOuqa 0qyNl9X4IOLXwlBUfa/vcSWqmVO6oXaGshVk10hz8pVsBoB8vJp+rRs1b6BdYIYujFAgPpH1r+Yst EX034QXlNrZlKI9zew7wRvD2fdW3vpT1b8iTrQDMQTAOlLERk/Z+lJDkfebs33aNTNK4k9M6ah8Hu B4r4np7jV3IsnA3VfeNXvLLUcwqg2Q/cMP9NT4Frs5J6sZcuW6hG/XLzZhP6u7u1zbQYJaI+zZssn R/nBnf2o11byCLfXeZFA==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1irhBu-0003Pp-IN; Wed, 15 Jan 2020 11:50:30 +0000 Received: from fllv0015.ext.ti.com ([198.47.19.141]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1irhBp-0003PJ-Hb for linux-arm-kernel@lists.infradead.org; Wed, 15 Jan 2020 11:50:29 +0000 Received: from lelv0266.itg.ti.com ([10.180.67.225]) by fllv0015.ext.ti.com (8.15.2/8.15.2) with ESMTP id 00FBo7ac036940; Wed, 15 Jan 2020 05:50:07 -0600 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ti.com; s=ti-com-17Q1; t=1579089007; bh=tmzYkT94bb3dzh3tdif/e0kQpanc2ZK+pZA1Vabt8ig=; h=Subject:To:CC:References:From:Date:In-Reply-To; b=tkB6FfFjxmnXfUrH48qyy+Hahes3CdWqdDJugNsksBb2y35Ae7A4U3TdHszMxZXaW NtT67l2mqJCYw5M4QquEDncn/7xKjhhszPV67vHtTefI8rICrrVeppS1f826ws8IA4 docuBswYL/BVm0JevSVEOmFxnOawLrlkh0UjQftQ= Received: from DLEE109.ent.ti.com (dlee109.ent.ti.com [157.170.170.41]) by lelv0266.itg.ti.com (8.15.2/8.15.2) with ESMTPS id 00FBo7fF015271 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=FAIL); Wed, 15 Jan 2020 05:50:07 -0600 Received: from DLEE111.ent.ti.com (157.170.170.22) by DLEE109.ent.ti.com (157.170.170.41) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1847.3; Wed, 15 Jan 2020 05:50:07 -0600 Received: from fllv0040.itg.ti.com (10.64.41.20) by DLEE111.ent.ti.com (157.170.170.22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1847.3 via Frontend Transport; Wed, 15 Jan 2020 05:50:07 -0600 Received: from [192.168.2.6] (ileax41-snat.itg.ti.com [10.172.224.153]) by fllv0040.itg.ti.com (8.15.2/8.15.2) with ESMTP id 00FBo4wl060858; Wed, 15 Jan 2020 05:50:05 -0600 Subject: Re: [PoC] arm: dma-mapping: direct: Apply dma_pfn_offset only when it is valid To: Robin Murphy , References: <8eb68140-97b2-62ce-3e06-3761984aa5b1@ti.com> <20200114164332.3164-1-peter.ujfalusi@ti.com> From: Peter Ujfalusi Message-ID: <28ee3395-baed-8d59-8546-ab7765829cc8@ti.com> Date: Wed, 15 Jan 2020 13:50:41 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.9.0 MIME-Version: 1.0 In-Reply-To: Content-Language: en-US X-EXCLAIMER-MD-CONFIG: e1e8a2fd-e40a-4ac6-ac9b-f7e9cc9ee180 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200115_035025_691567_2EDD17D0 X-CRM114-Status: GOOD ( 33.72 ) 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: robh@kernel.org, vigneshr@ti.com, konrad.wilk@oracle.com, linux@armlinux.org.uk, linux-kernel@vger.kernel.org, iommu@lists.linux-foundation.org, linux-arm-kernel@lists.infradead.org, rogerq@ti.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org CgpPbiAxNC8wMS8yMDIwIDIwLjE5LCBSb2JpbiBNdXJwaHkgd3JvdGU6Cj4gT24gMTQvMDEvMjAy MCA0OjQzIHBtLCBQZXRlciBVamZhbHVzaSB3cm90ZToKPj4gVGhlIGRtYV9wZm5fb2Zmc2V0IHNo b3VsZCBvbmx5IGJlIGFwcGxpZWQgdG8gYW4gYWRkcmVzcyB3aGljaCBpcwo+PiB3aXRoaW4gdGhl Cj4+IGRtYS1yYW5nZXMgcmFuZ2UuIEFueSBhZGRyZXNzIG91dHNpZGUgc2hvdWxkIGhhdmUgb2Zm c2V0IGFzIDAuCj4gCj4gTm8sIHRoYXQncyB3cm9uZy4gSWYgYSBub24tZW1wdHkgZG1hLXJhbmdl cyBpcyBwcmVzZW50LCB0aGVuIGFkZHJlc3Nlcwo+IHdoaWNoIGRvIG5vdCBmYWxsIHdpdGhpbiBh bnkgc3BlY2lmaWVkIHJhbmdlIGFyZSBpbnZhbGlkIGFsdG9nZXRoZXIuCgpJdCBpcyBub3QgZXhw bGljaXRseSBzdGF0ZWQgYnkgdGhlIHNwZWNpZmljYXRpb24sIGJ1dCBjYW4gYmUgaW50ZXJwcmV0 ZWQKbGlrZSB0aGF0IGFuZCBmcm9tIGEgcG93IGl0IGRvZXMgbWFrZSBzZW5zZSB0byB0cmVhdCB0 aGluZ3MgbGlrZSB0aGF0LgoKPiBUaGUgY3VycmVudCBsb25nLXRlcm0gcGxhbiBpcyBpbmRlZWQg dG8gdHJ5IHRvIG1vdmUgdG8gc29tZSBzb3J0IG9mCj4gaW50ZXJuYWwgIkRNQSByYW5nZSBkZXNj cmlwdG9yIiBpbiBvcmRlciB0byBwcm9wZXJseSBjb3BlIHdpdGggdGhlIGtpbmQKPiBvZiBlc290 ZXJpYyBpbnRlZ3JhdGlvbnMgd2hpY2ggaGF2ZSBtdWx0aXBsZSBkaXNqb2ludCB3aW5kb3dzLAo+ IHBvdGVudGlhbGx5IGV2ZW4gd2l0aCBkaWZmZXJlbnQgb2Zmc2V0cywgYnV0IGFzIHlvdSBwb2lu dCBvdXQgdGhlcmUgYXJlCj4gc3RpbGwgbWFueSBodXJkbGVzIGJldHdlZW4gbm93IGFuZCB0aGF0 IGJlY29taW5nIHJlYWxpdHkuIFNvIGFsdGhvdWdoCj4gdGhpcyBwYXRjaCBkb2VzIHJlcHJlc2Vu dCB0aGUgInJpZ2h0IiB0aGluZywgaXQncyBmb3IgZW50aXJlbHkgdGhlIHdyb25nCj4gcmVhc29u LiBBRkFJQ1QgZm9yIHlvdXIgY2FzZSBpdCBiYXNpY2FsbHkganVzdCB3b3JrcyBvdXQgYXMgYSB2 ZXJ5Cj4gYmFyb3F1ZSB3YXkgdG8gaGFjayBkbWFfZGlyZWN0X3N1cHBvcnRlZCgpIGFnYWluIC0g d2Ugc2hvdWxkbid0IG5lZWQgYQo+IHNwZWNpYWwgY2FzZSB0byBtYXAgYSBib2d1cyBwaHlzaWNh bCBhZGRyZXNzIHRvIHZhbGlkIERNQSBhZGRyZXNzLCB3ZQo+IHNob3VsZCBiZSBmaXhpbmcgdGhl IHNvdXJjZSBvZiB0aGUgYm9ndXMgUEEgaW4gdGhlIGZpcnN0IHBsYWNlLgoKRE1BX0JJVF9NQVNL KDMyKSBpcyBwcmV0dHkgY2xlYXI6IFRoZSBETUEgY2FuIGhhbmRsZSBhZGRyZXNzZXMgd2l0aGlu CjMyYml0IHNwYWNlLiBETUFfQklUX01BU0soMjQpIGlzIGFsc28gY2xlYXI6IFRoZSBETUEgY2Fu IGhhbmRsZQphZGRyZXNzZXMgd2l0aGluIDI0Yml0IHNwYWNlLgoKZG1hLXJhbmdlcyBkb2VzIG5v dCBjaGFuZ2UgdGhhdC4gVGhlIERNQSBjYW4gc3RpbGwgYWRkcmVzcyB0aGUgc2FtZQpzcGFjZS4g V2hhdCBkbWEtcmFuZ2VzIHdpbGwgdGVsbCBpcyB0aGF0IGEgcGh5c2ljYWwgYWRkcmVzcyByYW5n ZSAnWCcKY2FuIGJlIGFjY2Vzc2VkIG9uIHRoZSBidXMgdW5kZXIgcmFuZ2UgJ1knLgpGb3IgdGhl IERNQSB3aXRoaW4gdGhlIGJ1cyB0aGUgcGh5c2ljYWwgYWRkcmVzcyB3aXRoaW4gJ1gnIGRvZXMg bm90Cm1hdHRlci4gV2hhdCBtYXR0ZXJzIGlzIHRoZSBtYXRjaGluZyBhZGRyZXNzIHdpdGhpbiAn WScKCldlIHNob3VsZCBkbyBkbWFfcGZuX29mZnNldCBjb252ZXJzaW9uIF9vbmx5XyBmb3IgdGhl IHJhbmdlIGl0IGFwcGxpZXMKdG8uIE91dHNpZGUgb2YgaXQgaXMgbm90IHZhbGlkIHRvIGFwcGx5 IGl0LiBUaGUgZG1hIEFQSSB3aWxsIGNoZWNrCih3aXRob3V0IGFwcGx5aW5nIGRtYV9wZm5fb2Zm c2V0KSBhZGRyZXNzZXMgb3V0c2lkZSBvZiBhbnkgcmFuZ2UgKG9ubHkKb25lIGN1cnJlbnRseSBp biBMaW51eCkgYW5kIGlmIGl0IGlzIG5vdCBPSyBmb3IgdGhlIG1hc2sgdGhlbiBpdCB3aWxsIGZh aWwuCgo+IAo+PiBUaGlzIGlzIGEgcHJvb2Ygb2YgY29uY2VwdCBwYXRjaCB3aGljaCB3b3JrcyBv biBrMmcgd2hlcmUgd2UgaGF2ZQo+PiBkbWEtcmFuZ2VzID0gPDB4ODAwMDAwMDAgMHg4IDB4MDAw MDAwMDAgMHg4MDAwMDAwMD47Cj4+IGZvciB0aGUgU29DLgo+IAo+IFRCSCBpdCdzIHByb2JhYmx5 IGV4dHJhLWNvbmZ1c2luZyB0aGF0IHlvdSdyZSBvbiBLZXlzdG9uZSAyLCB3aGVyZQo+IHRlY2hu aWNhbGx5IHRoaXMgZW5kcyB1cCBjbG9zZXItdG8tT0sgdGhhbiBtb3N0LCBzaW5jZSBJSVJDIHRo ZSAwLTJHQgo+IE1NSU8gcmVnaW9uIGlzIHRoZSBzYW1lIG9uIGFsbCAzKD8pIGludGVyY29ubmVj dCBtYXBzLiBUaHVzIHRoZSAxMDAlCj4gaG9uZXN0IGRlc2NyaXB0aW9uIHdvdWxkIHJlYWxseSBi ZToKPiAKPiBkbWEtcmFuZ2VzID0gPDB4MCAweDAgMHgwIDB4ODAwMDAwMDA+LAo+IMKgwqDCoMKg wqDCoMKgwqAgPDB4ODAwMDAwMDAgMHg4IDB4MDAwMDAwMDAgMHg4MDAwMDAwMD47Cj4gCj4gYnV0 IHllYWgsIHRoYXQgd291bGQganVzdCBnbyBob3JyaWJseSB3cm9uZyB3aXRoIExpbnV4IHRvZGF5 LgoKSXQgZG9lcyA7KSBUaGlzIHdhcyB0aGUgZmlyc3QgdGhpbmcgSSBoYXZlIHRyaWVkLgoKPiBU aGUKPiBzdWJ0ZWx0eSB0aGF0IGRtYV9tYXBfcmVzb3VyY2UoKSBpZ25vcmVzIHRoZSBwZm5fb2Zm c2V0IGhhcHBlbnMgdG8gYmUgYQo+ICJmZWF0dXJlIiBpbiB0aGlzIHJlZ2FyZCA7KQoKUmlnaHQs IGJ1dCBLZXlzdG9uZSAyIGlzIGJyb2tlbiBzaW5jZSA1LjMtcmMzIGJ5IGNvbW1pdAphZDNjN2Ix OGM1YjM2MmJlNWRiZDBmMmMwYmNmMWZkNWZkNjU5MzE1LgoKQ2FuIHlvdSBwcm9wb3NlIGEgZml4 IHdoaWNoIHdlIGNhbiB1c2UgdW50aWwgdGhpbmdzIGdldCBzb3J0ZWQgb3V0PwoKVGhhbmtzLAot IFDDqXRlcgoKPiAKPiBSb2Jpbi4KPiAKPj4gV2l0aG91dCB0aGlzIHBhdGNoIGV2ZXJ5dGhpbmcg d2hpY2ggdHJpZXMgdG8gc2V0IERNQV9CSVRfTUFTSygzMikgb3IgbGVzcwo+PiBmYWlscyAtPiBE TUEgYW5kIHBlcmlwaGVyYWxzIHdpdGggYnVpbHQgaW4gRE1BIChTRCB3aXRoIEFETUEpIHdpbGwg bm90Cj4+IHByb2JlIG9yIGZhbGwgYmFjayB0byBQSU8gbW9kZS4KPj4KPj4gV2l0aCB0aGlzIHBh dGNoIEVETUEgcHJvYmVzLCBTRCdzIEFETUEgaXMgd29ya2luZy4KPj4gQXVkaW8gYW5kIGRtYS10 ZXN0IGlzIHdvcmtpbmcganVzdCBmaW5lIHdpdGggRURNQSwgbW1jIGFjY2Vzc2VzIHdpdGggQURN QQo+PiBhbHNvIG9wZXJhdGlvbmFsLgo+Pgo+PiBUaGUgcGF0Y2ggZG9lcyBub3QgdHJpZWQgdG8g YWRkcmVzcyB0aGUgaW5jb21wbGV0ZSBoYW5kbGluZyBvZiBkbWEtcmFuZ2VzCj4+IGZyb20gRFQg YW5kIGl0IGlzIG5vdCBmaXhpbmcvdXBkYXRpbmcgYXJjaCBjb2RlIG9yIGRyaXZlcnMgd2hpY2gg dXNlcwo+PiBkbWFfcGZuX29mZnNldC4KPj4gTmVpdGhlciBwcm92aWRlcyBmYWxsYmFjayBzdXBw b3J0IGZvciBrZXJuZWwgc2V0dGluZyBvbmx5Cj4+IGRtYV9wZm5fb2Zmc2V0IHRvCj4+IGFyYml0 cmFyeSBudW1iZXIgd2l0aG91dCBwYWRkci9kbWFfYWRkci9zaXplLgo+Pgo+PiBTaWduZWQtb2Zm LWJ5OiBQZXRlciBVamZhbHVzaSA8cGV0ZXIudWpmYWx1c2lAdGkuY29tPgo+PiAtLS0KPj4gSGkg Q2hyaXN0b3BoLCBSb2JpbiwKPj4KPj4gSSBrbm93IGl0IGlzIGEgYml0IG1vcmUgY29tcGxpY2F0 ZWQsIGJ1dCB3aXRoIHRoaXMgcGF0Y2ggazJnIGlzCj4+IHdvcmtpbmcgZmluZS4uLgo+Pgo+PiBJ IHdhbnRlZCB0byB0ZXN0IHRoZSBjb25jZXB0IEkgd2FzIGRlc2NyaWJpbmcgYW5kIGEgcGF0Y2gg c3BlYWtzCj4+IGJldHRlciB0aGFuCj4+IHdvcmRzLgo+Pgo+PiBLaW5kIHJlZ2FyZHMsCj4+IFBl dGVyCj4+Cj4+IMKgIGFyY2gvYXJtL2luY2x1ZGUvYXNtL2RtYS1tYXBwaW5nLmggfCAyNSArKysr KysrKysrKysrKysrKysrKy0tCj4+IMKgIGRyaXZlcnMvb2YvZGV2aWNlLmPCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgfMKgIDcgKysrKysrLQo+PiDCoCBpbmNsdWRlL2xpbnV4L2Rldmlj ZS5owqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHzCoCA4ICsrKysrKysrCj4+IMKgIGluY2x1ZGUv bGludXgvZG1hLWRpcmVjdC5owqDCoMKgwqDCoMKgwqDCoCB8IDMzICsrKysrKysrKysrKysrKysr KysrKysrKysrKystLQo+PiDCoCBrZXJuZWwvZG1hL2NvaGVyZW50LmPCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCB8wqAgOSArKysrKy0tLQo+PiDCoCA1IGZpbGVzIGNoYW5nZWQsIDc0IGluc2Vy dGlvbnMoKyksIDggZGVsZXRpb25zKC0pCj4+Cj4+IGRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNs dWRlL2FzbS9kbWEtbWFwcGluZy5oCj4+IGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vZG1hLW1hcHBp bmcuaAo+PiBpbmRleCBiZGQ4MGRkYmNhMzQuLjliZmY2YWQyZDhjOCAxMDA2NDQKPj4gLS0tIGEv YXJjaC9hcm0vaW5jbHVkZS9hc20vZG1hLW1hcHBpbmcuaAo+PiArKysgYi9hcmNoL2FybS9pbmNs dWRlL2FzbS9kbWEtbWFwcGluZy5oCj4+IEBAIC0zMywxMCArMzMsMzEgQEAgc3RhdGljIGlubGlu ZSBjb25zdCBzdHJ1Y3QgZG1hX21hcF9vcHMKPj4gKmdldF9hcmNoX2RtYV9vcHMoc3RydWN0IGJ1 c190eXBlICpidXMpCj4+IMKgwqAgKiBhZGRyZXNzZXMuIFRoZXkgbXVzdCBub3QgYmUgdXNlZCBi eSBkcml2ZXJzLgo+PiDCoMKgICovCj4+IMKgICNpZm5kZWYgX19hcmNoX3Bmbl90b19kbWEKPj4g Kwo+PiArc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fcGh5c190b19kbWFfcGZuX29mZnNl dChzdHJ1Y3QgZGV2aWNlICpkZXYsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBwaHlzX2FkZHJfdCBwYWRkcikKPj4gK3sKPj4gK8Kg wqDCoCBpZiAocGFkZHIgPj0gZGV2LT5kbWFfcmFuZ2VzLnBhZGRyICYmCj4+ICvCoMKgwqDCoMKg wqDCoCBwYWRkciA8PSAoZGV2LT5kbWFfcmFuZ2VzLnBhZGRyICsgZGV2LT5kbWFfcmFuZ2VzLnNp emUpKQo+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIGRldi0+ZG1hX3Jhbmdlcy5wZm5fb2Zmc2V0 Owo+PiArCj4+ICvCoMKgwqAgcmV0dXJuIDA7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBpbmxpbmUg dW5zaWduZWQgbG9uZyBfX2RtYV90b19waHlzX3Bmbl9vZmZzZXQoc3RydWN0IGRldmljZSAqZGV2 LAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgZG1hX2FkZHJfdCBkbWFfYWRkcikKPj4gK3sKPj4gK8KgwqDCoCBpZiAoZG1hX2FkZHIg Pj0gZGV2LT5kbWFfcmFuZ2VzLmRtYV9hZGRyICYmCj4+ICvCoMKgwqDCoMKgwqDCoCBkbWFfYWRk ciA8PSAoZGV2LT5kbWFfcmFuZ2VzLmRtYV9hZGRyICsgZGV2LT5kbWFfcmFuZ2VzLnNpemUpKQo+ PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIGRldi0+ZG1hX3Jhbmdlcy5wZm5fb2Zmc2V0Owo+PiAr Cj4+ICvCoMKgwqAgcmV0dXJuIDA7Cj4+ICt9Cj4+ICsKPj4gwqAgc3RhdGljIGlubGluZSBkbWFf YWRkcl90IHBmbl90b19kbWEoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZAo+PiBsb25nIHBm bikKPj4gwqAgewo+PiDCoMKgwqDCoMKgIGlmIChkZXYpCj4+IC3CoMKgwqDCoMKgwqDCoCBwZm4g LT0gZGV2LT5kbWFfcGZuX29mZnNldDsKPj4gK8KgwqDCoMKgwqDCoMKgIHBmbiAtPSBfX3BoeXNf dG9fZG1hX3Bmbl9vZmZzZXQoZGV2LCBfX3Bmbl90b19waHlzKHBmbikpOwo+PiDCoMKgwqDCoMKg IHJldHVybiAoZG1hX2FkZHJfdClfX3Bmbl90b19idXMocGZuKTsKPj4gwqAgfQo+PiDCoCBAQCAt NDUsNyArNjYsNyBAQCBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZG1hX3RvX3BmbihzdHJ1 Y3QKPj4gZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgYWRkcikKPj4gwqDCoMKgwqDCoCB1bnNpZ25l ZCBsb25nIHBmbiA9IF9fYnVzX3RvX3BmbihhZGRyKTsKPj4gwqAgwqDCoMKgwqDCoCBpZiAoZGV2 KQo+PiAtwqDCoMKgwqDCoMKgwqAgcGZuICs9IGRldi0+ZG1hX3Bmbl9vZmZzZXQ7Cj4+ICvCoMKg wqDCoMKgwqDCoCBwZm4gKz0gX19kbWFfdG9fcGh5c19wZm5fb2Zmc2V0KGRldiwgYWRkcik7Cj4+ IMKgIMKgwqDCoMKgwqAgcmV0dXJuIHBmbjsKPj4gwqAgfQo+PiBkaWZmIC0tZ2l0IGEvZHJpdmVy cy9vZi9kZXZpY2UuYyBiL2RyaXZlcnMvb2YvZGV2aWNlLmMKPj4gaW5kZXggMjcyMDNiZmQwYjIy Li4wN2E4Y2MxYTdkN2YgMTAwNjQ0Cj4+IC0tLSBhL2RyaXZlcnMvb2YvZGV2aWNlLmMKPj4gKysr IGIvZHJpdmVycy9vZi9kZXZpY2UuYwo+PiBAQCAtMTA1LDcgKzEwNSw3IEBAIGludCBvZl9kbWFf Y29uZmlndXJlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0Cj4+IGRldmljZV9ub2RlICpucCwg Ym9vbCBmb3JjZV9kbWEpCj4+IMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAoIWZvcmNlX2RtYSkKPj4g wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0dXJuIHJldCA9PSAtRU5PREVWID8gMCA6IHJl dDsKPj4gwqAgLcKgwqDCoMKgwqDCoMKgIGRtYV9hZGRyID0gb2Zmc2V0ID0gMDsKPj4gK8KgwqDC oMKgwqDCoMKgIGRtYV9hZGRyID0gb2Zmc2V0ID0gcGFkZHIgPSAwOwo+PiDCoMKgwqDCoMKgIH0g ZWxzZSB7Cj4+IMKgwqDCoMKgwqDCoMKgwqDCoCBvZmZzZXQgPSBQRk5fRE9XTihwYWRkciAtIGRt YV9hZGRyKTsKPj4gwqAgQEAgLTE0NCw2ICsxNDQsMTEgQEAgaW50IG9mX2RtYV9jb25maWd1cmUo c3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QKPj4gZGV2aWNlX25vZGUgKm5wLCBib29sIGZvcmNl X2RtYSkKPj4gwqAgwqDCoMKgwqDCoCBkZXYtPmRtYV9wZm5fb2Zmc2V0ID0gb2Zmc2V0Owo+PiDC oCArwqDCoMKgIGRldi0+ZG1hX3Jhbmdlcy5wYWRkciA9IHBhZGRyOwo+PiArwqDCoMKgIGRldi0+ ZG1hX3Jhbmdlcy5kbWFfYWRkciA9IGRtYV9hZGRyOwo+PiArwqDCoMKgIGRldi0+ZG1hX3Jhbmdl cy5zaXplID0gc2l6ZTsKPj4gK8KgwqDCoCBkZXYtPmRtYV9yYW5nZXMucGZuX29mZnNldCA9IG9m ZnNldDsKPj4gKwo+PiDCoMKgwqDCoMKgIC8qCj4+IMKgwqDCoMKgwqDCoCAqIExpbWl0IGNvaGVy ZW50IGFuZCBkbWEgbWFzayBiYXNlZCBvbiBzaXplIGFuZCBkZWZhdWx0IG1hc2sKPj4gwqDCoMKg wqDCoMKgICogc2V0IGJ5IHRoZSBkcml2ZXIuCj4+IGRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4 L2RldmljZS5oIGIvaW5jbHVkZS9saW51eC9kZXZpY2UuaAo+PiBpbmRleCBjZTZkYjY4YzNmMjku LjU3MDA2YjUxYTk4OSAxMDA2NDQKPj4gLS0tIGEvaW5jbHVkZS9saW51eC9kZXZpY2UuaAo+PiAr KysgYi9pbmNsdWRlL2xpbnV4L2RldmljZS5oCj4+IEBAIC0yOTMsNiArMjkzLDEzIEBAIHN0cnVj dCBkZXZpY2VfZG1hX3BhcmFtZXRlcnMgewo+PiDCoMKgwqDCoMKgIHVuc2lnbmVkIGxvbmcgc2Vn bWVudF9ib3VuZGFyeV9tYXNrOwo+PiDCoCB9Owo+PiDCoCArc3RydWN0IGRtYV9yYW5nZXMgewo+ PiArwqDCoMKgIHU2NCBwYWRkcjsKPj4gK8KgwqDCoCB1NjQgZG1hX2FkZHI7Cj4+ICvCoMKgwqAg dTY0IHNpemU7Cj4+ICvCoMKgwqAgdW5zaWduZWQgbG9uZyBwZm5fb2Zmc2V0Owo+PiArfTsKPj4g Kwo+PiDCoCAvKioKPj4gwqDCoCAqIHN0cnVjdCBkZXZpY2VfY29ubmVjdGlvbiAtIERldmljZSBD b25uZWN0aW9uIERlc2NyaXB0b3IKPj4gwqDCoCAqIEBmd25vZGU6IFRoZSBkZXZpY2Ugbm9kZSBv ZiB0aGUgY29ubmVjdGVkIGRldmljZQo+PiBAQCAtNTgxLDYgKzU4OCw3IEBAIHN0cnVjdCBkZXZp Y2Ugewo+PiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIGFsbG9jYXRpb25zIHN1Y2ggZGVzY3JpcHRvcnMuICovCj4+IMKgwqDCoMKgwqAgdTY0wqDC oMKgwqDCoMKgwqAgYnVzX2RtYV9saW1pdDvCoMKgwqAgLyogdXBzdHJlYW0gZG1hIGNvbnN0cmFp bnQgKi8KPj4gwqDCoMKgwqDCoCB1bnNpZ25lZCBsb25nwqDCoMKgIGRtYV9wZm5fb2Zmc2V0Owo+ PiArwqDCoMKgIHN0cnVjdCBkbWFfcmFuZ2VzIGRtYV9yYW5nZXM7Cj4+IMKgIMKgwqDCoMKgwqAg c3RydWN0IGRldmljZV9kbWFfcGFyYW1ldGVycyAqZG1hX3Bhcm1zOwo+PiDCoCBkaWZmIC0tZ2l0 IGEvaW5jbHVkZS9saW51eC9kbWEtZGlyZWN0LmggYi9pbmNsdWRlL2xpbnV4L2RtYS1kaXJlY3Qu aAo+PiBpbmRleCAyNGI4Njg0YWEyMWQuLjRhNDZhMTU5NDVlYSAxMDA2NDQKPj4gLS0tIGEvaW5j bHVkZS9saW51eC9kbWEtZGlyZWN0LmgKPj4gKysrIGIvaW5jbHVkZS9saW51eC9kbWEtZGlyZWN0 LmgKPj4gQEAgLTExLDE4ICsxMSw0NyBAQCBleHRlcm4gdW5zaWduZWQgaW50IHpvbmVfZG1hX2Jp dHM7Cj4+IMKgICNpZmRlZiBDT05GSUdfQVJDSF9IQVNfUEhZU19UT19ETUEKPj4gwqAgI2luY2x1 ZGUgPGFzbS9kbWEtZGlyZWN0Lmg+Cj4+IMKgICNlbHNlCj4+ICsKPj4gK3N0YXRpYyBpbmxpbmUg dW5zaWduZWQgbG9uZyBfX3BoeXNfdG9fZG1hX3Bmbl9vZmZzZXQoc3RydWN0IGRldmljZSAqZGV2 LAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgcGh5c19hZGRyX3QgcGFkZHIpCj4+ICt7Cj4+ICvCoMKgwqAgaWYgKCFkZXYpCj4+ICvC oMKgwqDCoMKgwqDCoCByZXR1cm4gMDsKPj4gKwo+PiArwqDCoMKgIGlmIChwYWRkciA+PSBkZXYt PmRtYV9yYW5nZXMucGFkZHIgJiYKPj4gK8KgwqDCoMKgwqDCoMKgIHBhZGRyIDw9IChkZXYtPmRt YV9yYW5nZXMucGFkZHIgKyBkZXYtPmRtYV9yYW5nZXMuc2l6ZSkpCj4+ICvCoMKgwqDCoMKgwqDC oCByZXR1cm4gZGV2LT5kbWFfcmFuZ2VzLnBmbl9vZmZzZXQKPj4gKwo+PiArwqDCoMKgIHJldHVy biAwOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19kbWFfdG9f cGh5c19wZm5fb2Zmc2V0KHN0cnVjdCBkZXZpY2UgKmRldiwKPj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGRtYV9hZGRyX3QgZG1hX2Fk ZHIpCj4+ICt7Cj4+ICvCoMKgwqAgaWYgKCFkZXYpCj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4g MDsKPj4gKwo+PiArwqDCoMKgIGlmIChkbWFfYWRkciA+PSBkZXYtPmRtYV9yYW5nZXMuZG1hX2Fk ZHIgJiYKPj4gK8KgwqDCoMKgwqDCoMKgIGRtYV9hZGRyIDw9IChkZXYtPmRtYV9yYW5nZXMuZG1h X2FkZHIgKyBkZXYtPmRtYV9yYW5nZXMuc2l6ZSkpCj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4g ZGV2LT5kbWFfcmFuZ2VzLnBmbl9vZmZzZXQKPj4gKwo+PiArwqDCoMKgIHJldHVybiAwOwo+PiAr fQo+PiArCj4+IMKgIHN0YXRpYyBpbmxpbmUgZG1hX2FkZHJfdCBfX3BoeXNfdG9fZG1hKHN0cnVj dCBkZXZpY2UgKmRldiwKPj4gcGh5c19hZGRyX3QgcGFkZHIpCj4+IMKgIHsKPj4gwqDCoMKgwqDC oCBkbWFfYWRkcl90IGRldl9hZGRyID0gKGRtYV9hZGRyX3QpcGFkZHI7Cj4+ICvCoMKgwqAgdW5z aWduZWQgbG9uZyBvZmZzZXQgPSBfX3BoeXNfdG9fZG1hX3Bmbl9vZmZzZXQoZGV2LCBwYWRkcik7 Cj4+IMKgIC3CoMKgwqAgcmV0dXJuIGRldl9hZGRyIC0gKChkbWFfYWRkcl90KWRldi0+ZG1hX3Bm bl9vZmZzZXQgPDwgUEFHRV9TSElGVCk7Cj4+ICvCoMKgwqAgcmV0dXJuIGRldl9hZGRyIC0gKChk bWFfYWRkcl90KW9mZnNldCA8PCBQQUdFX1NISUZUKTsKPj4gwqAgfQo+PiDCoCDCoCBzdGF0aWMg aW5saW5lIHBoeXNfYWRkcl90IF9fZG1hX3RvX3BoeXMoc3RydWN0IGRldmljZSAqZGV2LAo+PiBk bWFfYWRkcl90IGRldl9hZGRyKQo+PiDCoCB7Cj4+IMKgwqDCoMKgwqAgcGh5c19hZGRyX3QgcGFk ZHIgPSAocGh5c19hZGRyX3QpZGV2X2FkZHI7Cj4+ICvCoMKgwqAgdW5zaWduZWQgbG9uZyBvZmZz ZXQgPSBfX2RtYV90b19waHlzX3Bmbl9vZmZzZXQoZGV2LCBkZXZfYWRkcik7Cj4+IMKgIC3CoMKg wqAgcmV0dXJuIHBhZGRyICsgKChwaHlzX2FkZHJfdClkZXYtPmRtYV9wZm5fb2Zmc2V0IDw8IFBB R0VfU0hJRlQpOwo+PiArwqDCoMKgIHJldHVybiBwYWRkciArICgocGh5c19hZGRyX3Qpb2Zmc2V0 IDw8IFBBR0VfU0hJRlQpOwo+PiDCoCB9Cj4+IMKgICNlbmRpZiAvKiAhQ09ORklHX0FSQ0hfSEFT X1BIWVNfVE9fRE1BICovCj4+IMKgIGRpZmYgLS1naXQgYS9rZXJuZWwvZG1hL2NvaGVyZW50LmMg Yi9rZXJuZWwvZG1hL2NvaGVyZW50LmMKPj4gaW5kZXggNTUxYjBlYjcwMjhhLi43YTY4ZmQwOWY1 ZDAgMTAwNjQ0Cj4+IC0tLSBhL2tlcm5lbC9kbWEvY29oZXJlbnQuYwo+PiArKysgYi9rZXJuZWwv ZG1hL2NvaGVyZW50LmMKPj4gQEAgLTMxLDEwICszMSwxMyBAQCBzdGF0aWMgaW5saW5lIHN0cnVj dCBkbWFfY29oZXJlbnRfbWVtCj4+ICpkZXZfZ2V0X2NvaGVyZW50X21lbW9yeShzdHJ1Y3QgZGV2 aWNlICpkZQo+PiDCoCBzdGF0aWMgaW5saW5lIGRtYV9hZGRyX3QgZG1hX2dldF9kZXZpY2VfYmFz ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgc3RydWN0IGRtYV9jb2hlcmVudF9tZW0gKiBtZW0pCj4+IMKg IHsKPj4gLcKgwqDCoCBpZiAobWVtLT51c2VfZGV2X2RtYV9wZm5fb2Zmc2V0KQo+PiAtwqDCoMKg wqDCoMKgwqAgcmV0dXJuIChtZW0tPnBmbl9iYXNlIC0gZGV2LT5kbWFfcGZuX29mZnNldCkgPDwg UEFHRV9TSElGVDsKPj4gLcKgwqDCoCBlbHNlCj4+ICvCoMKgwqAgaWYgKG1lbS0+dXNlX2Rldl9k bWFfcGZuX29mZnNldCkgewo+PiArwqDCoMKgwqDCoMKgwqAgdW5zaWduZWQgbG9uZyBvZmZzZXQg PSBfX3BoeXNfdG9fZG1hX3Bmbl9vZmZzZXQoZGV2LAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBfX3Bmbl90b19waHlzKG1lbS0+cGZuX2Jhc2UpKTsK Pj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiAobWVtLT5wZm5fYmFzZSAtIG9mZnNldCkgPDwgUEFH RV9TSElGVDsKPj4gK8KgwqDCoCB9IGVsc2Ugewo+PiDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0dXJu IG1lbS0+ZGV2aWNlX2Jhc2U7Cj4+ICvCoMKgwqAgfQo+PiDCoCB9Cj4+IMKgIMKgIHN0YXRpYyBp bnQgZG1hX2luaXRfY29oZXJlbnRfbWVtb3J5KHBoeXNfYWRkcl90IHBoeXNfYWRkciwKPj4KClRl eGFzIEluc3RydW1lbnRzIEZpbmxhbmQgT3ksIFBvcmtrYWxhbmthdHUgMjIsIDAwMTgwIEhlbHNp bmtpLgpZLXR1bm51cy9CdXNpbmVzcyBJRDogMDYxNTUyMS00LiBLb3RpcGFpa2thL0RvbWljaWxl OiBIZWxzaW5raQoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X18KbGludXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBsaXN0cy5p bmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8v bGludXgtYXJtLWtlcm5lbAo=