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=-12.7 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,INCLUDES_PATCH,MAILING_LIST_MULTI, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id C633DC433E6 for ; Tue, 16 Mar 2021 09:26:42 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 896B265012 for ; Tue, 16 Mar 2021 09:26:42 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229907AbhCPJ0K (ORCPT ); Tue, 16 Mar 2021 05:26:10 -0400 Received: from mail.kernel.org ([198.145.29.99]:39936 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236185AbhCPJZi (ORCPT ); Tue, 16 Mar 2021 05:25:38 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 5B3A765010; Tue, 16 Mar 2021 09:25:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1615886737; bh=cPRh0AnJFdDuP/GrmLFAknhKy0SFLeLdbWnb+/Fs4Hg=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=ERF4XyphMq1DeTNQIGubIx/p0SVwEWBO/whqQwrxuod3SjHk4l4ggQW/d55kvtJ1M 2VLUemN4JfhlENuYKzOxmNnPPL0luNsqCFeLib0NFPVrg1zpaRjgTSRYAcBidJ5ggS yvO/lUCAlu4A6lkV3z3KFczCOtYOLYJtfYtoSc2A7McTsnLW8uMqU/7bNrite3CHE7 ybYTtQDeLBRZ9v3zu6T1gy3GCQETQzZonnaktvtEDZediP5GT4Y7C/TRk4HVX5tAyc 2ZwB9LYx9JhIvwhaQO64iDVPoQJExMCLprZhEMIU7+PdOIQgrG51PQLZlB3KtgDGOH RpoqLIFDCeIRQ== Received: by pali.im (Postfix) id A555284B; Tue, 16 Mar 2021 10:25:34 +0100 (CET) Date: Tue, 16 Mar 2021 10:25:34 +0100 From: Pali =?utf-8?B?Um9ow6Fy?= To: Toke =?utf-8?Q?H=C3=B8iland-J=C3=B8rgensen?= Cc: vtolkm@gmail.com, Bjorn Helgaas , linux-pci@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Rob Herring , Ilias Apalodimas , Marek =?utf-8?B?QmVow7pu?= , Thomas Petazzoni , Jason Cooper Subject: Re: PCI trouble on mvebu (Turris Omnia) Message-ID: <20210316092534.czuondwbg3tqjs6w@pali> References: <2fb69e2a-4423-2b04-cd0f-ca819092bc5f@gmail.com> <20201028231626.GA344207@bjorn-Precision-5520> <20201030112331.meqg6lvultyn6v54@pali> <87k0v7n9y9.fsf@toke.dk> <20201030142337.yushrdcuecycfhcu@pali> <87zh42lfv6.fsf@toke.dk> <20201102152403.4jlmcaqkqeivuypm@pali> <877dr3lpok.fsf@toke.dk> <20210315195806.iqdt5wvvkvpmnep7@pali> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20210315195806.iqdt5wvvkvpmnep7@pali> User-Agent: NeoMutt/20180716 Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org On Monday 15 March 2021 20:58:06 Pali Rohár wrote: > On Monday 02 November 2020 16:54:35 Toke Høiland-Jørgensen wrote: > > Pali Rohár writes: > > > > > On Saturday 31 October 2020 13:49:49 Toke Høiland-Jørgensen wrote: > > >> "™֟☻̭҇ Ѽ ҉ ®" writes: > > >> > > >> > On 30/10/2020 15:23, Pali Rohár wrote: > > >> >> On Friday 30 October 2020 14:02:22 Toke Høiland-Jørgensen wrote: > > >> >>> Pali Rohár writes: > > >> >>>> My experience with that WLE900VX card, aardvark driver and aspm code: > > >> >>>> > > >> >>>> Link training in GEN2 mode for this card succeed only once after reset. > > >> >>>> Repeated link retraining fails and it fails even when aardvark is > > >> >>>> reconfigured to GEN1 mode. Reset via PERST# signal is required to have > > >> >>>> working link training. > > >> >>>> > > >> >>>> What I did in aardvark driver: Set mode to GEN2, do link training. If > > >> >>>> success read "negotiated link speed" from "Link Control Status Register" > > >> >>>> (for WLE900VX it is 0x1 - GEN1) and set it into aardvark. And then > > >> >>>> retrain link again (for WLE900VX now it would be at GEN1). After that > > >> >>>> card is stable and all future retraining (e.g. from aspm.c) also passes. > > >> >>>> > > >> >>>> If I do not change aardvark mode from GEN2 to GEN1 the second link > > >> >>>> training fails. And if I change mode to GEN1 after this failed link > > >> >>>> training then nothing happen, link training do not success. > > >> >>>> > > >> >>>> So just speculation now... In current setup initialization of card does > > >> >>>> one link training at GEN2. Then aspm.c is called which is doing second > > >> >>>> link retraining at GEN2. And if it fails then below patch issue third > > >> >>>> link retraining at GEN1. If A38x/pci-mvebu has same problem as aardvark > > >> >>>> then second link retraining must be at GEN1 (not GEN2) to workaround > > >> >>>> this issue. > > >> >>>> > > >> >>>> Bjorn, Toke: what about trying to hack aspm.c code to never do link > > >> >>>> retraining at GEN2 speed? And always force GEN1 speed prior link > > >> >>>> training? > > >> >>> Sounds like a plan. I poked around in aspm.c and must confess to being a > > >> >>> bit lost in the soup of registers ;) > > >> >>> > > >> >>> So if one of you can cook up a patch, that would be most helpful! > > >> >> I modified Bjorn's patch, explicitly set tls to 1 and added debug info > > >> >> about cls (current link speed, that what is used by aardvark). It is > > >> >> untested, I just tried to compile it. > > >> >> > > >> >> Can try it? > > >> >> > > >> >> diff --git a/drivers/pci/pcie/aspm.c b/drivers/pci/pcie/aspm.c > > >> >> index 253c30cc1967..f934c0b52f41 100644 > > >> >> --- a/drivers/pci/pcie/aspm.c > > >> >> +++ b/drivers/pci/pcie/aspm.c > > >> >> @@ -206,6 +206,27 @@ static bool pcie_retrain_link(struct pcie_link_state *link) > > >> >> unsigned long end_jiffies; > > >> >> u16 reg16; > > >> >> > > >> >> + u32 lnkcap2; > > >> >> + u16 lnksta, lnkctl2, cls, tls; > > >> >> + > > >> >> + pcie_capability_read_dword(parent, PCI_EXP_LNKCAP2, &lnkcap2); > > >> >> + pcie_capability_read_word(parent, PCI_EXP_LNKSTA, &lnksta); > > >> >> + pcie_capability_read_word(parent, PCI_EXP_LNKCTL2, &lnkctl2); > > >> >> + cls = lnksta & PCI_EXP_LNKSTA_CLS; > > >> >> + tls = lnkctl2 & PCI_EXP_LNKCTL2_TLS; > > >> >> + > > >> >> + pci_info(parent, "lnkcap2 %#010x sls %#04x lnksta %#06x cls %#03x lnkctl2 %#06x tls %#03x\n", > > >> >> + lnkcap2, (lnkcap2 & 0x3F) >> 1, > > >> >> + lnksta, cls, > > >> >> + lnkctl2, tls); > > >> >> + > > >> >> + tls = 1; > > >> >> + pcie_capability_clear_and_set_word(parent, PCI_EXP_LNKCTL2, > > >> >> + PCI_EXP_LNKCTL2_TLS, tls); > > >> >> + pcie_capability_read_word(parent, PCI_EXP_LNKCTL2, &lnkctl2); > > >> >> + pci_info(parent, "lnkctl2 %#010x new tls %#03x\n", > > >> >> + lnkctl2, tls); > > >> >> + > > >> >> pcie_capability_read_word(parent, PCI_EXP_LNKCTL, ®16); > > >> >> reg16 |= PCI_EXP_LNKCTL_RL; > > >> >> pcie_capability_write_word(parent, PCI_EXP_LNKCTL, reg16); > > >> >> @@ -227,6 +248,8 @@ static bool pcie_retrain_link(struct pcie_link_state *link) > > >> >> break; > > >> >> msleep(1); > > >> >> } while (time_before(jiffies, end_jiffies)); > > >> >> + pci_info(parent, "lnksta %#06x new cls %#03x\n", > > >> >> + lnksta, (cls & PCI_EXP_LNKSTA_CLS)); > > >> >> return !(reg16 & PCI_EXP_LNKSTA_LT); > > >> >> } > > >> >> > > >> > > > >> > Still exhibiting the BAR update error, run tested with next--20201030 > > >> > > >> Yup, same for me :( > > I'm answering my own question. This code does not work on Omnia because > A38x pci-mvebu.c driver is using emulator for PCIe root bridge and it > does not implement PCI_EXP_LNKCTL2 and PCI_EXP_LNKCTL2 registers. So > code for forcing link speed has no effect on Omnia... Toke, on A38x PCIe controller it is possible to access PCI_EXP_LNKCTL2 register. Just access is not exported via emulated root bridge. Documentation for this PCIe controller is public, so anybody can look at register description. See page 571, A.7 PCI Express 2.0 Port 0 Registers http://web.archive.org/web/20200420191927/https://www.marvell.com/content/dam/marvell/en/public-collateral/embedded-processors/marvell-embedded-processors-armada-38x-functional-specifications-2015-11.pdf In drivers/pci/controller/pci-mvebu.c you can set a new value for this register via function call: mvebu_writel(port, val, PCIE_CAP_PCIEXP + PCI_EXP_LNKCTL2); So, could you try to set PCI_EXP_LNKCTL2_TLS bits to gen1 in some hw init function, e.g. mvebu_pcie_setup_hw()? u32 val = mvebu_readl(port, PCIE_CAP_PCIEXP + PCI_EXP_LNKCTL2); val &= ~PCI_EXP_LNKCTL2_TLS; val |= PCI_EXP_LNKCTL2_TLS_2_5GT; mvebu_writel(port, val, PCIE_CAP_PCIEXP + PCI_EXP_LNKCTL2); > > > So then it is different issue and not similar to aardvark one. > > ... and therefore it can be still same issue which I have debugged on > aardvark. > > > > Anyway, was ASPM working on some previous kernel version? Or was it > > > always broken on Turris Omnia? > > > > I tried bisecting and couldn't find a commit that worked. And OpenWrt by > > default builds with ASPM off, so my best guess is that it was always > > broken. > > I see and it makes sense that it does not work in any version. > > > However, the two other PCI slots *do* work with ASPM on, as long as > > they're both occupied when booting. If I only have one card installed > > apart from the dodge WLE900, both of them fail... > > > > > And has somebody other Armada 385 device with mPCIe slots to test if > > > ASPM is working? Or any other 32bit Marvell Armada SOC? > > > > > > I would like to know if this is issue only on Turris Omnia or also on > > > other Armada 385 SOC device or even on any other device which uses > > > pci-mvebu.c driver. > > > > See above: It does partly work on my Omnia. Is it possible to define a > > quirk to just disable it on a per-slot basis for the WLE900 card? Maybe > > just doing that and calling it a day would be enough... > > > > -Toke > > > > Toke, can you try to put this WLE900 card into some x86 computer and > check if this card works? With ASPM enabled and also with ASPM disabled? > Or into any other device which does not have Marvell PCIe controller? > > I need to know if problem is with this WLE900 card or with Marvell's > PCIe controllers. And based on it I can prepare quirk / hook for either > WLE900 card or for Marvell PCIe drivers (or both, based on how it is > broken). > > > PS for all: Please do not put fancy unicode characters into email From: > header as such email would be marked as spam and automatically filtered. 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=-10.7 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE, SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7D516C433E0 for ; Tue, 16 Mar 2021 09:27:48 +0000 (UTC) Received: from desiato.infradead.org (desiato.infradead.org [90.155.92.199]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id CC17664FB3 for ; Tue, 16 Mar 2021 09:27:47 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org CC17664FB3 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=kernel.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=desiato.20200630; h=Sender:Content-Transfer-Encoding :Content-Type:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:In-Reply-To:MIME-Version: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=j/FvWg1FxwI2DwXg4jYLWrECQ3cnO+SW/1i3GPDzaBo=; b=RIv1viJZ4j9x7C4fm/nldcBJB Lb62Nb6XZdbrN2+YnyMwcUJYh5r4MpKNmTL5Xud6qMK0NMHjmFQBQgZFFKMMaSFGhl5ugsHkn9DO9 JMhSq6Wi2YSsAk/4wo4/48syRSTo/ZKX6plGZLEZvXUMWr1Xl386oi+Hv60gLRJXITVOIOsCCvvW1 V4Eoc+zPwTHknnugRdQUxzWsXFgHumyv7ngbgZSpW2Xxv+w/U1bC9aCQSDsoIzdmSGrRsufo/rrKU fA8+szHatbq0MGmTv4hAqGA6o8/Dq3/lasvp1XMYved4hcUVlK1CjdeGZIutvQoUvt40NFJf+OaqX tTWo3Gc5Q==; Received: from localhost ([::1] helo=desiato.infradead.org) by desiato.infradead.org with esmtp (Exim 4.94 #2 (Red Hat Linux)) id 1lM5xk-000GKI-Ju; Tue, 16 Mar 2021 09:26:04 +0000 Received: from mail.kernel.org ([198.145.29.99]) by desiato.infradead.org with esmtps (Exim 4.94 #2 (Red Hat Linux)) id 1lM5xL-000G6A-A2 for linux-arm-kernel@lists.infradead.org; Tue, 16 Mar 2021 09:25:48 +0000 Received: by mail.kernel.org (Postfix) with ESMTPSA id 5B3A765010; Tue, 16 Mar 2021 09:25:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1615886737; bh=cPRh0AnJFdDuP/GrmLFAknhKy0SFLeLdbWnb+/Fs4Hg=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=ERF4XyphMq1DeTNQIGubIx/p0SVwEWBO/whqQwrxuod3SjHk4l4ggQW/d55kvtJ1M 2VLUemN4JfhlENuYKzOxmNnPPL0luNsqCFeLib0NFPVrg1zpaRjgTSRYAcBidJ5ggS yvO/lUCAlu4A6lkV3z3KFczCOtYOLYJtfYtoSc2A7McTsnLW8uMqU/7bNrite3CHE7 ybYTtQDeLBRZ9v3zu6T1gy3GCQETQzZonnaktvtEDZediP5GT4Y7C/TRk4HVX5tAyc 2ZwB9LYx9JhIvwhaQO64iDVPoQJExMCLprZhEMIU7+PdOIQgrG51PQLZlB3KtgDGOH RpoqLIFDCeIRQ== Received: by pali.im (Postfix) id A555284B; Tue, 16 Mar 2021 10:25:34 +0100 (CET) Date: Tue, 16 Mar 2021 10:25:34 +0100 From: Pali =?utf-8?B?Um9ow6Fy?= To: Toke =?utf-8?Q?H=C3=B8iland-J=C3=B8rgensen?= Cc: vtolkm@gmail.com, Bjorn Helgaas , linux-pci@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Rob Herring , Ilias Apalodimas , Marek =?utf-8?B?QmVow7pu?= , Thomas Petazzoni , Jason Cooper Subject: Re: PCI trouble on mvebu (Turris Omnia) Message-ID: <20210316092534.czuondwbg3tqjs6w@pali> References: <2fb69e2a-4423-2b04-cd0f-ca819092bc5f@gmail.com> <20201028231626.GA344207@bjorn-Precision-5520> <20201030112331.meqg6lvultyn6v54@pali> <87k0v7n9y9.fsf@toke.dk> <20201030142337.yushrdcuecycfhcu@pali> <87zh42lfv6.fsf@toke.dk> <20201102152403.4jlmcaqkqeivuypm@pali> <877dr3lpok.fsf@toke.dk> <20210315195806.iqdt5wvvkvpmnep7@pali> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20210315195806.iqdt5wvvkvpmnep7@pali> User-Agent: NeoMutt/20180716 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210316_092539_946587_AE472939 X-CRM114-Status: GOOD ( 53.80 ) 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 T24gTW9uZGF5IDE1IE1hcmNoIDIwMjEgMjA6NTg6MDYgUGFsaSBSb2jDoXIgd3JvdGU6Cj4gT24g TW9uZGF5IDAyIE5vdmVtYmVyIDIwMjAgMTY6NTQ6MzUgVG9rZSBIw7hpbGFuZC1Kw7hyZ2Vuc2Vu IHdyb3RlOgo+ID4gUGFsaSBSb2jDoXIgPHBhbGlAa2VybmVsLm9yZz4gd3JpdGVzOgo+ID4gCj4g PiA+IE9uIFNhdHVyZGF5IDMxIE9jdG9iZXIgMjAyMCAxMzo0OTo0OSBUb2tlIEjDuGlsYW5kLUrD uHJnZW5zZW4gd3JvdGU6Cj4gPiA+PiAi4oSi1p/imLvSh8ytING8INKJIMKuIiA8dnRvbGttQGdv b2dsZW1haWwuY29tPiB3cml0ZXM6Cj4gPiA+PiAKPiA+ID4+ID4gT24gMzAvMTAvMjAyMCAxNToy MywgUGFsaSBSb2jDoXIgd3JvdGU6Cj4gPiA+PiA+PiBPbiBGcmlkYXkgMzAgT2N0b2JlciAyMDIw IDE0OjAyOjIyIFRva2UgSMO4aWxhbmQtSsO4cmdlbnNlbiB3cm90ZToKPiA+ID4+ID4+PiBQYWxp IFJvaMOhciA8cGFsaUBrZXJuZWwub3JnPiB3cml0ZXM6Cj4gPiA+PiA+Pj4+IE15IGV4cGVyaWVu Y2Ugd2l0aCB0aGF0IFdMRTkwMFZYIGNhcmQsIGFhcmR2YXJrIGRyaXZlciBhbmQgYXNwbSBjb2Rl Ogo+ID4gPj4gPj4+Pgo+ID4gPj4gPj4+PiBMaW5rIHRyYWluaW5nIGluIEdFTjIgbW9kZSBmb3Ig dGhpcyBjYXJkIHN1Y2NlZWQgb25seSBvbmNlIGFmdGVyIHJlc2V0Lgo+ID4gPj4gPj4+PiBSZXBl YXRlZCBsaW5rIHJldHJhaW5pbmcgZmFpbHMgYW5kIGl0IGZhaWxzIGV2ZW4gd2hlbiBhYXJkdmFy ayBpcwo+ID4gPj4gPj4+PiByZWNvbmZpZ3VyZWQgdG8gR0VOMSBtb2RlLiBSZXNldCB2aWEgUEVS U1QjIHNpZ25hbCBpcyByZXF1aXJlZCB0byBoYXZlCj4gPiA+PiA+Pj4+IHdvcmtpbmcgbGluayB0 cmFpbmluZy4KPiA+ID4+ID4+Pj4KPiA+ID4+ID4+Pj4gV2hhdCBJIGRpZCBpbiBhYXJkdmFyayBk cml2ZXI6IFNldCBtb2RlIHRvIEdFTjIsIGRvIGxpbmsgdHJhaW5pbmcuIElmCj4gPiA+PiA+Pj4+ IHN1Y2Nlc3MgcmVhZCAibmVnb3RpYXRlZCBsaW5rIHNwZWVkIiBmcm9tICJMaW5rIENvbnRyb2wg U3RhdHVzIFJlZ2lzdGVyIgo+ID4gPj4gPj4+PiAoZm9yIFdMRTkwMFZYIGl0IGlzIDB4MSAtIEdF TjEpIGFuZCBzZXQgaXQgaW50byBhYXJkdmFyay4gQW5kIHRoZW4KPiA+ID4+ID4+Pj4gcmV0cmFp biBsaW5rIGFnYWluIChmb3IgV0xFOTAwVlggbm93IGl0IHdvdWxkIGJlIGF0IEdFTjEpLiBBZnRl ciB0aGF0Cj4gPiA+PiA+Pj4+IGNhcmQgaXMgc3RhYmxlIGFuZCBhbGwgZnV0dXJlIHJldHJhaW5p bmcgKGUuZy4gZnJvbSBhc3BtLmMpIGFsc28gcGFzc2VzLgo+ID4gPj4gPj4+Pgo+ID4gPj4gPj4+ PiBJZiBJIGRvIG5vdCBjaGFuZ2UgYWFyZHZhcmsgbW9kZSBmcm9tIEdFTjIgdG8gR0VOMSB0aGUg c2Vjb25kIGxpbmsKPiA+ID4+ID4+Pj4gdHJhaW5pbmcgZmFpbHMuIEFuZCBpZiBJIGNoYW5nZSBt b2RlIHRvIEdFTjEgYWZ0ZXIgdGhpcyBmYWlsZWQgbGluawo+ID4gPj4gPj4+PiB0cmFpbmluZyB0 aGVuIG5vdGhpbmcgaGFwcGVuLCBsaW5rIHRyYWluaW5nIGRvIG5vdCBzdWNjZXNzLgo+ID4gPj4g Pj4+Pgo+ID4gPj4gPj4+PiBTbyBqdXN0IHNwZWN1bGF0aW9uIG5vdy4uLiBJbiBjdXJyZW50IHNl dHVwIGluaXRpYWxpemF0aW9uIG9mIGNhcmQgZG9lcwo+ID4gPj4gPj4+PiBvbmUgbGluayB0cmFp bmluZyBhdCBHRU4yLiBUaGVuIGFzcG0uYyBpcyBjYWxsZWQgd2hpY2ggaXMgZG9pbmcgc2Vjb25k Cj4gPiA+PiA+Pj4+IGxpbmsgcmV0cmFpbmluZyBhdCBHRU4yLiBBbmQgaWYgaXQgZmFpbHMgdGhl biBiZWxvdyBwYXRjaCBpc3N1ZSB0aGlyZAo+ID4gPj4gPj4+PiBsaW5rIHJldHJhaW5pbmcgYXQg R0VOMS4gSWYgQTM4eC9wY2ktbXZlYnUgaGFzIHNhbWUgcHJvYmxlbSBhcyBhYXJkdmFyawo+ID4g Pj4gPj4+PiB0aGVuIHNlY29uZCBsaW5rIHJldHJhaW5pbmcgbXVzdCBiZSBhdCBHRU4xIChub3Qg R0VOMikgdG8gd29ya2Fyb3VuZAo+ID4gPj4gPj4+PiB0aGlzIGlzc3VlLgo+ID4gPj4gPj4+Pgo+ ID4gPj4gPj4+PiBCam9ybiwgVG9rZTogd2hhdCBhYm91dCB0cnlpbmcgdG8gaGFjayBhc3BtLmMg Y29kZSB0byBuZXZlciBkbyBsaW5rCj4gPiA+PiA+Pj4+IHJldHJhaW5pbmcgYXQgR0VOMiBzcGVl ZD8gQW5kIGFsd2F5cyBmb3JjZSBHRU4xIHNwZWVkIHByaW9yIGxpbmsKPiA+ID4+ID4+Pj4gdHJh aW5pbmc/Cj4gPiA+PiA+Pj4gU291bmRzIGxpa2UgYSBwbGFuLiBJIHBva2VkIGFyb3VuZCBpbiBh c3BtLmMgYW5kIG11c3QgY29uZmVzcyB0byBiZWluZyBhCj4gPiA+PiA+Pj4gYml0IGxvc3QgaW4g dGhlIHNvdXAgb2YgcmVnaXN0ZXJzIDspCj4gPiA+PiA+Pj4KPiA+ID4+ID4+PiBTbyBpZiBvbmUg b2YgeW91IGNhbiBjb29rIHVwIGEgcGF0Y2gsIHRoYXQgd291bGQgYmUgbW9zdCBoZWxwZnVsIQo+ ID4gPj4gPj4gSSBtb2RpZmllZCBCam9ybidzIHBhdGNoLCBleHBsaWNpdGx5IHNldCB0bHMgdG8g MSBhbmQgYWRkZWQgZGVidWcgaW5mbwo+ID4gPj4gPj4gYWJvdXQgY2xzIChjdXJyZW50IGxpbmsg c3BlZWQsIHRoYXQgd2hhdCBpcyB1c2VkIGJ5IGFhcmR2YXJrKS4gSXQgaXMKPiA+ID4+ID4+IHVu dGVzdGVkLCBJIGp1c3QgdHJpZWQgdG8gY29tcGlsZSBpdC4KPiA+ID4+ID4+Cj4gPiA+PiA+PiBD YW4gdHJ5IGl0Pwo+ID4gPj4gPj4KPiA+ID4+ID4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9w Y2llL2FzcG0uYyBiL2RyaXZlcnMvcGNpL3BjaWUvYXNwbS5jCj4gPiA+PiA+PiBpbmRleCAyNTNj MzBjYzE5NjcuLmY5MzRjMGI1MmY0MSAxMDA2NDQKPiA+ID4+ID4+IC0tLSBhL2RyaXZlcnMvcGNp L3BjaWUvYXNwbS5jCj4gPiA+PiA+PiArKysgYi9kcml2ZXJzL3BjaS9wY2llL2FzcG0uYwo+ID4g Pj4gPj4gQEAgLTIwNiw2ICsyMDYsMjcgQEAgc3RhdGljIGJvb2wgcGNpZV9yZXRyYWluX2xpbmso c3RydWN0IHBjaWVfbGlua19zdGF0ZSAqbGluaykKPiA+ID4+ID4+ICAgCXVuc2lnbmVkIGxvbmcg ZW5kX2ppZmZpZXM7Cj4gPiA+PiA+PiAgIAl1MTYgcmVnMTY7Cj4gPiA+PiA+PiAgIAo+ID4gPj4g Pj4gKwl1MzIgbG5rY2FwMjsKPiA+ID4+ID4+ICsJdTE2IGxua3N0YSwgbG5rY3RsMiwgY2xzLCB0 bHM7Cj4gPiA+PiA+PiArCj4gPiA+PiA+PiArCXBjaWVfY2FwYWJpbGl0eV9yZWFkX2R3b3JkKHBh cmVudCwgUENJX0VYUF9MTktDQVAyLCAmbG5rY2FwMik7Cj4gPiA+PiA+PiArCXBjaWVfY2FwYWJp bGl0eV9yZWFkX3dvcmQocGFyZW50LCBQQ0lfRVhQX0xOS1NUQSwgJmxua3N0YSk7Cj4gPiA+PiA+ PiArCXBjaWVfY2FwYWJpbGl0eV9yZWFkX3dvcmQocGFyZW50LCBQQ0lfRVhQX0xOS0NUTDIsICZs bmtjdGwyKTsKPiA+ID4+ID4+ICsJY2xzID0gbG5rc3RhICYgUENJX0VYUF9MTktTVEFfQ0xTOwo+ ID4gPj4gPj4gKwl0bHMgPSBsbmtjdGwyICYgUENJX0VYUF9MTktDVEwyX1RMUzsKPiA+ID4+ID4+ ICsKPiA+ID4+ID4+ICsJcGNpX2luZm8ocGFyZW50LCAibG5rY2FwMiAlIzAxMHggc2xzICUjMDR4 IGxua3N0YSAlIzA2eCBjbHMgJSMwM3ggbG5rY3RsMiAlIzA2eCB0bHMgJSMwM3hcbiIsCj4gPiA+ PiA+PiArCQlsbmtjYXAyLCAobG5rY2FwMiAmIDB4M0YpID4+IDEsCj4gPiA+PiA+PiArCQlsbmtz dGEsIGNscywKPiA+ID4+ID4+ICsJCWxua2N0bDIsIHRscyk7Cj4gPiA+PiA+PiArCj4gPiA+PiA+ PiArCXRscyA9IDE7Cj4gPiA+PiA+PiArCXBjaWVfY2FwYWJpbGl0eV9jbGVhcl9hbmRfc2V0X3dv cmQocGFyZW50LCBQQ0lfRVhQX0xOS0NUTDIsCj4gPiA+PiA+PiArCQkJCQlQQ0lfRVhQX0xOS0NU TDJfVExTLCB0bHMpOwo+ID4gPj4gPj4gKwlwY2llX2NhcGFiaWxpdHlfcmVhZF93b3JkKHBhcmVu dCwgUENJX0VYUF9MTktDVEwyLCAmbG5rY3RsMik7Cj4gPiA+PiA+PiArCXBjaV9pbmZvKHBhcmVu dCwgImxua2N0bDIgJSMwMTB4IG5ldyB0bHMgJSMwM3hcbiIsCj4gPiA+PiA+PiArCQlsbmtjdGwy LCB0bHMpOwo+ID4gPj4gPj4gKwo+ID4gPj4gPj4gICAJcGNpZV9jYXBhYmlsaXR5X3JlYWRfd29y ZChwYXJlbnQsIFBDSV9FWFBfTE5LQ1RMLCAmcmVnMTYpOwo+ID4gPj4gPj4gICAJcmVnMTYgfD0g UENJX0VYUF9MTktDVExfUkw7Cj4gPiA+PiA+PiAgIAlwY2llX2NhcGFiaWxpdHlfd3JpdGVfd29y ZChwYXJlbnQsIFBDSV9FWFBfTE5LQ1RMLCByZWcxNik7Cj4gPiA+PiA+PiBAQCAtMjI3LDYgKzI0 OCw4IEBAIHN0YXRpYyBib29sIHBjaWVfcmV0cmFpbl9saW5rKHN0cnVjdCBwY2llX2xpbmtfc3Rh dGUgKmxpbmspCj4gPiA+PiA+PiAgIAkJCWJyZWFrOwo+ID4gPj4gPj4gICAJCW1zbGVlcCgxKTsK PiA+ID4+ID4+ICAgCX0gd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGVuZF9qaWZmaWVzKSk7 Cj4gPiA+PiA+PiArCXBjaV9pbmZvKHBhcmVudCwgImxua3N0YSAlIzA2eCBuZXcgY2xzICUjMDN4 XG4iLAo+ID4gPj4gPj4gKwkJbG5rc3RhLCAoY2xzICYgUENJX0VYUF9MTktTVEFfQ0xTKSk7Cj4g PiA+PiA+PiAgIAlyZXR1cm4gIShyZWcxNiAmIFBDSV9FWFBfTE5LU1RBX0xUKTsKPiA+ID4+ID4+ ICAgfQo+ID4gPj4gPj4gICAKPiA+ID4+ID4KPiA+ID4+ID4gU3RpbGwgZXhoaWJpdGluZyB0aGUg QkFSIHVwZGF0ZSBlcnJvciwgcnVuIHRlc3RlZCB3aXRoIG5leHQtLTIwMjAxMDMwCj4gPiA+PiAK PiA+ID4+IFl1cCwgc2FtZSBmb3IgbWUgOigKPiAKPiBJJ20gYW5zd2VyaW5nIG15IG93biBxdWVz dGlvbi4gVGhpcyBjb2RlIGRvZXMgbm90IHdvcmsgb24gT21uaWEgYmVjYXVzZQo+IEEzOHggcGNp LW12ZWJ1LmMgZHJpdmVyIGlzIHVzaW5nIGVtdWxhdG9yIGZvciBQQ0llIHJvb3QgYnJpZGdlIGFu ZCBpdAo+IGRvZXMgbm90IGltcGxlbWVudCBQQ0lfRVhQX0xOS0NUTDIgYW5kIFBDSV9FWFBfTE5L Q1RMMiByZWdpc3RlcnMuIFNvCj4gY29kZSBmb3IgZm9yY2luZyBsaW5rIHNwZWVkIGhhcyBubyBl ZmZlY3Qgb24gT21uaWEuLi4KClRva2UsIG9uIEEzOHggUENJZSBjb250cm9sbGVyIGl0IGlzIHBv c3NpYmxlIHRvIGFjY2VzcyBQQ0lfRVhQX0xOS0NUTDIKcmVnaXN0ZXIuIEp1c3QgYWNjZXNzIGlz IG5vdCBleHBvcnRlZCB2aWEgZW11bGF0ZWQgcm9vdCBicmlkZ2UuCgpEb2N1bWVudGF0aW9uIGZv ciB0aGlzIFBDSWUgY29udHJvbGxlciBpcyBwdWJsaWMsIHNvIGFueWJvZHkgY2FuIGxvb2sgYXQK cmVnaXN0ZXIgZGVzY3JpcHRpb24uIFNlZSBwYWdlIDU3MSwgQS43IFBDSSBFeHByZXNzIDIuMCBQ b3J0IDAgUmVnaXN0ZXJzCgpodHRwOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDIwMDQyMDE5MTky Ny9odHRwczovL3d3dy5tYXJ2ZWxsLmNvbS9jb250ZW50L2RhbS9tYXJ2ZWxsL2VuL3B1YmxpYy1j b2xsYXRlcmFsL2VtYmVkZGVkLXByb2Nlc3NvcnMvbWFydmVsbC1lbWJlZGRlZC1wcm9jZXNzb3Jz LWFybWFkYS0zOHgtZnVuY3Rpb25hbC1zcGVjaWZpY2F0aW9ucy0yMDE1LTExLnBkZgoKSW4gZHJp dmVycy9wY2kvY29udHJvbGxlci9wY2ktbXZlYnUuYyB5b3UgY2FuIHNldCBhIG5ldyB2YWx1ZSBm b3IgdGhpcwpyZWdpc3RlciB2aWEgZnVuY3Rpb24gY2FsbDoKCiAgICBtdmVidV93cml0ZWwocG9y dCwgdmFsLCBQQ0lFX0NBUF9QQ0lFWFAgKyBQQ0lfRVhQX0xOS0NUTDIpOwoKU28sIGNvdWxkIHlv dSB0cnkgdG8gc2V0IFBDSV9FWFBfTE5LQ1RMMl9UTFMgYml0cyB0byBnZW4xIGluIHNvbWUgaHcK aW5pdCBmdW5jdGlvbiwgZS5nLiBtdmVidV9wY2llX3NldHVwX2h3KCk/CgogICAgdTMyIHZhbCA9 IG12ZWJ1X3JlYWRsKHBvcnQsIFBDSUVfQ0FQX1BDSUVYUCArIFBDSV9FWFBfTE5LQ1RMMik7CiAg ICB2YWwgJj0gflBDSV9FWFBfTE5LQ1RMMl9UTFM7CiAgICB2YWwgfD0gUENJX0VYUF9MTktDVEwy X1RMU18yXzVHVDsKICAgIG12ZWJ1X3dyaXRlbChwb3J0LCB2YWwsIFBDSUVfQ0FQX1BDSUVYUCAr IFBDSV9FWFBfTE5LQ1RMMik7Cgo+ID4gPiBTbyB0aGVuIGl0IGlzIGRpZmZlcmVudCBpc3N1ZSBh bmQgbm90IHNpbWlsYXIgdG8gYWFyZHZhcmsgb25lLgo+IAo+IC4uLiBhbmQgdGhlcmVmb3JlIGl0 IGNhbiBiZSBzdGlsbCBzYW1lIGlzc3VlIHdoaWNoIEkgaGF2ZSBkZWJ1Z2dlZCBvbgo+IGFhcmR2 YXJrLgo+IAo+ID4gPiBBbnl3YXksIHdhcyBBU1BNIHdvcmtpbmcgb24gc29tZSBwcmV2aW91cyBr ZXJuZWwgdmVyc2lvbj8gT3Igd2FzIGl0Cj4gPiA+IGFsd2F5cyBicm9rZW4gb24gVHVycmlzIE9t bmlhPwo+ID4gCj4gPiBJIHRyaWVkIGJpc2VjdGluZyBhbmQgY291bGRuJ3QgZmluZCBhIGNvbW1p dCB0aGF0IHdvcmtlZC4gQW5kIE9wZW5XcnQgYnkKPiA+IGRlZmF1bHQgYnVpbGRzIHdpdGggQVNQ TSBvZmYsIHNvIG15IGJlc3QgZ3Vlc3MgaXMgdGhhdCBpdCB3YXMgYWx3YXlzCj4gPiBicm9rZW4u Cj4gCj4gSSBzZWUgYW5kIGl0IG1ha2VzIHNlbnNlIHRoYXQgaXQgZG9lcyBub3Qgd29yayBpbiBh bnkgdmVyc2lvbi4KPiAKPiA+IEhvd2V2ZXIsIHRoZSB0d28gb3RoZXIgUENJIHNsb3RzICpkbyog d29yayB3aXRoIEFTUE0gb24sIGFzIGxvbmcgYXMKPiA+IHRoZXkncmUgYm90aCBvY2N1cGllZCB3 aGVuIGJvb3RpbmcuIElmIEkgb25seSBoYXZlIG9uZSBjYXJkIGluc3RhbGxlZAo+ID4gYXBhcnQg ZnJvbSB0aGUgZG9kZ2UgV0xFOTAwLCBib3RoIG9mIHRoZW0gZmFpbC4uLgo+ID4gCj4gPiA+IEFu ZCBoYXMgc29tZWJvZHkgb3RoZXIgQXJtYWRhIDM4NSBkZXZpY2Ugd2l0aCBtUENJZSBzbG90cyB0 byB0ZXN0IGlmCj4gPiA+IEFTUE0gaXMgd29ya2luZz8gT3IgYW55IG90aGVyIDMyYml0IE1hcnZl bGwgQXJtYWRhIFNPQz8KPiA+ID4KPiA+ID4gSSB3b3VsZCBsaWtlIHRvIGtub3cgaWYgdGhpcyBp cyBpc3N1ZSBvbmx5IG9uIFR1cnJpcyBPbW5pYSBvciBhbHNvIG9uCj4gPiA+IG90aGVyIEFybWFk YSAzODUgU09DIGRldmljZSBvciBldmVuIG9uIGFueSBvdGhlciBkZXZpY2Ugd2hpY2ggdXNlcwo+ ID4gPiBwY2ktbXZlYnUuYyBkcml2ZXIuCj4gPiAKPiA+IFNlZSBhYm92ZTogSXQgZG9lcyBwYXJ0 bHkgd29yayBvbiBteSBPbW5pYS4gSXMgaXQgcG9zc2libGUgdG8gZGVmaW5lIGEKPiA+IHF1aXJr IHRvIGp1c3QgZGlzYWJsZSBpdCBvbiBhIHBlci1zbG90IGJhc2lzIGZvciB0aGUgV0xFOTAwIGNh cmQ/IE1heWJlCj4gPiBqdXN0IGRvaW5nIHRoYXQgYW5kIGNhbGxpbmcgaXQgYSBkYXkgd291bGQg YmUgZW5vdWdoLi4uCj4gPiAKPiA+IC1Ub2tlCj4gPiAKPiAKPiBUb2tlLCBjYW4geW91IHRyeSB0 byBwdXQgdGhpcyBXTEU5MDAgY2FyZCBpbnRvIHNvbWUgeDg2IGNvbXB1dGVyIGFuZAo+IGNoZWNr IGlmIHRoaXMgY2FyZCB3b3Jrcz8gV2l0aCBBU1BNIGVuYWJsZWQgYW5kIGFsc28gd2l0aCBBU1BN IGRpc2FibGVkPwo+IE9yIGludG8gYW55IG90aGVyIGRldmljZSB3aGljaCBkb2VzIG5vdCBoYXZl IE1hcnZlbGwgUENJZSBjb250cm9sbGVyPwo+IAo+IEkgbmVlZCB0byBrbm93IGlmIHByb2JsZW0g aXMgd2l0aCB0aGlzIFdMRTkwMCBjYXJkIG9yIHdpdGggTWFydmVsbCdzCj4gUENJZSBjb250cm9s bGVycy4gQW5kIGJhc2VkIG9uIGl0IEkgY2FuIHByZXBhcmUgcXVpcmsgLyBob29rIGZvciBlaXRo ZXIKPiBXTEU5MDAgY2FyZCBvciBmb3IgTWFydmVsbCBQQ0llIGRyaXZlcnMgKG9yIGJvdGgsIGJh c2VkIG9uIGhvdyBpdCBpcwo+IGJyb2tlbikuCj4gCj4gCj4gUFMgZm9yIGFsbDogUGxlYXNlIGRv IG5vdCBwdXQgZmFuY3kgdW5pY29kZSBjaGFyYWN0ZXJzIGludG8gZW1haWwgRnJvbToKPiBoZWFk ZXIgYXMgc3VjaCBlbWFpbCB3b3VsZCBiZSBtYXJrZWQgYXMgc3BhbSBhbmQgYXV0b21hdGljYWxs eSBmaWx0ZXJlZC4KCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMu aW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZv L2xpbnV4LWFybS1rZXJuZWwK