From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Date: Tue, 9 Apr 2019 08:54:59 -0700 From: Moritz Fischer Subject: Re: [PATCH v4 1/3] firmware: xilinx: Add fpga API's Message-ID: <20190409155459.GA7617@archbook> References: <20190402123123.915-1-nava.manne@xilinx.com> <20190402123123.915-2-nava.manne@xilinx.com> <20190408171456.GA4293@archbook> <9ab8f7fb-0936-3635-60fe-164402780429@xilinx.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: To: Nava kishore Manne Cc: Michal Simek , Moritz Fischer , "atull@kernel.org" , "robh+dt@kernel.org" , "mark.rutland@arm.com" , Rajan Vaja , Jolly Shah , "linux-fpga@vger.kernel.org" , "devicetree@vger.kernel.org" , "linux-arm-kernel@lists.infradead.org" , "linux-kernel@vger.kernel.org" , "chinnikishore369@gmail.com" List-ID: Hi Nava, On Tue, Apr 09, 2019 at 08:54:34AM +0000, Nava kishore Manne wrote: > Hi Moritz, > > Thanks for the quick response. > Please find my response inline > > > -----Original Message----- > > From: Michal Simek [mailto:michal.simek@xilinx.com] > > Sent: Tuesday, April 9, 2019 12:04 PM > > To: Moritz Fischer ; Nava kishore Manne > > > > Cc: atull@kernel.org; robh+dt@kernel.org; mark.rutland@arm.com; Michal > > Simek ; Rajan Vaja ; Jolly Shah > > ; linux-fpga@vger.kernel.org; devicetree@vger.kernel.org; > > linux-arm-kernel@lists.infradead.org; linux-kernel@vger.kernel.org; > > chinnikishore369@gmail.com > > Subject: Re: [PATCH v4 1/3] firmware: xilinx: Add fpga API's > > > > On 08. 04. 19 19:14, Moritz Fischer wrote: > > > Hi Nava, > > > > > > On Tue, Apr 02, 2019 at 06:01:21PM +0530, Nava kishore Manne wrote: > > >> This Patch Adds fpga API's to support the Bitstream loading by using > > >> firmware interface. > > >> > > >> Signed-off-by: Nava kishore Manne > > >> --- > > >> Changes for v4: > > >> -None. > > >> > > >> Chnages for v3: > > >> -Created patches on top of 5.0-rc5. > > >> No functional changes. > > >> > > >> Changes for v2: > > >> -Added Firmware FPGA Manager flags As suggested by > > >> Moritz. > > >> > > >> Changes for v1: > > >> -None. > > >> > > >> Changes for RFC-V2: > > >> -New Patch > > >> > > >> drivers/firmware/xilinx/zynqmp.c | 46 ++++++++++++++++++++++++++++ > > >> include/linux/firmware/xlnx-zynqmp.h | 10 ++++++ > > >> 2 files changed, 56 insertions(+) > > >> > > >> diff --git a/drivers/firmware/xilinx/zynqmp.c > > >> b/drivers/firmware/xilinx/zynqmp.c > > >> index 98f936125643..7159a90abc44 100644 > > >> --- a/drivers/firmware/xilinx/zynqmp.c > > >> +++ b/drivers/firmware/xilinx/zynqmp.c > > >> @@ -537,6 +537,50 @@ static int zynqmp_pm_reset_get_status(const enum > > zynqmp_pm_reset reset, > > >> return ret; > > >> } > > >> > > >> +/* > > >> + * zynqmp_pm_fpga_load - Perform the fpga load > > >> + * @address: Address to write to > > >> + * @size: pl bitstream size > > >> + * @flags: > > >> + * BIT(0) - Bit-stream type. > > >> + * 0 - Full Bitstream. > > >> + * 1 - Partial Bitstream. Don't you wanna call out the defines instead here that you defined in include/linux/firmware/xlnx-zynqmp.h? > > >> + * > > >> + * This function provides access to pmufw. To transfer > > >> + * the required bitstream into PL. > > >> + * > > >> + * Return: Returns status, either success or error+reason */ static > > >> +int zynqmp_pm_fpga_load(const u64 address, const u32 size, > > >> + const u32 flags) > > >> +{ > > >> + return zynqmp_pm_invoke_fn(PM_FPGA_LOAD, lower_32_bits(address), > > >> + upper_32_bits(address), size, flags, NULL); } > > >> + > > >> +/** > > >> + * zynqmp_pm_fpga_get_status - Read value from PCAP status register > > >> + * @value: Value to read > > >> + * > > >> + * This function provides access to the xilfpga library to get > > > > > > xilfpga? Is that PMU firmware you're talking about? > > Xilfpga is a library and it’s a part of PMUFW BSP. > It will follow the below flow to configure the PL from Linux environment. > Linux -Fpga Manager framework <--> Linux-Firmware Driver <- -smc call-->ATF <--IPI call--> PMUFW<--> Xilfpga library. Fair enough. Was wondering if we could simplify/clarify the comment, but also don't have a good suggestion :) > > > > > > >> + * the PCAP status > > >> + * > > >> + * Return: Returns status, either success or error+reason */ static > > >> +int zynqmp_pm_fpga_get_status(u32 *value) { > > >> + u32 ret_payload[PAYLOAD_ARG_CNT]; > > >> + int ret; > > >> + > > >> + if (!value) > > >> + return -EINVAL; > > >> + > > >> + ret = zynqmp_pm_invoke_fn(PM_FPGA_GET_STATUS, 0, 0, 0, 0, > > ret_payload); > > >> + *value = ret_payload[1]; > > >> + > > >> + return ret; > > >> +} > > >> + > > >> /** > > >> * zynqmp_pm_init_finalize() - PM call to inform firmware that the caller > > >> * master has initialized its own power management > > >> @@ -640,6 +684,8 @@ static const struct zynqmp_eemi_ops eemi_ops = { > > >> .request_node = zynqmp_pm_request_node, > > >> .release_node = zynqmp_pm_release_node, > > >> .set_requirement = zynqmp_pm_set_requirement, > > >> + .fpga_load = zynqmp_pm_fpga_load, > > >> + .fpga_get_status = zynqmp_pm_fpga_get_status, > > >> }; > > >> > > >> /** > > >> diff --git a/include/linux/firmware/xlnx-zynqmp.h > > >> b/include/linux/firmware/xlnx-zynqmp.h > > >> index 642dab10f65d..4df226b6ab0f 100644 > > >> --- a/include/linux/firmware/xlnx-zynqmp.h > > >> +++ b/include/linux/firmware/xlnx-zynqmp.h > > >> @@ -48,6 +48,12 @@ > > >> #define ZYNQMP_PM_CAPABILITY_WAKEUP 0x4U > > >> #define ZYNQMP_PM_CAPABILITY_POWER 0x8U > > >> > > >> +/* > > >> + * Firmware FPGA Manager flags > > >> + * XILINX_ZYNQMP_PM_FPGA_PARTIAL: FPGA partial reconfiguration */ > > >> +#define XILINX_ZYNQMP_PM_FPGA_PARTIAL BIT(0) > > >> + > > >> enum pm_api_id { > > >> PM_GET_API_VERSION = 1, > > >> PM_REQUEST_NODE = 13, > > >> @@ -56,6 +62,8 @@ enum pm_api_id { > > >> PM_RESET_ASSERT = 17, > > >> PM_RESET_GET_STATUS, > > >> PM_PM_INIT_FINALIZE = 21, > > >> + PM_FPGA_LOAD = 22, > > >> + PM_FPGA_GET_STATUS, > > > > > > Any reason you can't do 'PM_FPGA_GET_STATUS = 23' here? Trying to > > > understand your reasoning. Are you planning to move them around? > > > > It is 23 by design. In xilinx repo there was only the first value which is > > recommended practice. But upstreaming is not done in the same order that's > > why if there is a gap you need to assign values there. > > Even that 22 can be removed in this case but it is just nit. > > > As Michal said here Assigning value of 22 is not needed. Will fix this issue in the next version. Ok, I didn't check the Xilinx repos :) Makes sense, though. With nits above addressed: Reviewed-by: Moritz Fischer Thanks, Moritz 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.5 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_PASS, URIBL_BLOCKED,USER_AGENT_MUTT 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 348BDC10F0E for ; Tue, 9 Apr 2019 15:55:07 +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 027932084C for ; Tue, 9 Apr 2019 15:55:07 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="j5jLfnSN" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 027932084C 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+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:References: Message-ID:Subject: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=wRIkm8a8hMowjdiGGGFRkOCmbsXED7rKsYese2BPhUY=; b=j5jLfnSNRq4eSW saJLhL8tAZpZAI58HO7pfVfcVUuTi7bmqxGY7ueamLiSk4QqrNHgsEzGqS00K248CuqB0yun7GCMa 21R7Wo3uZq30vRBLtguLEhwmVLRpUt8CPOhsDBru4gK7j8JjyM5nvM22KEA3DOEtRJJTqd1g+wQLL uejc41k8JthyTL8+qcXpdflAlkn/mad8DL54fL06lQ5w4NnR5X2SPsvUM+m3593o1ZxEW1b7rxeHl WF3Qy+HerHsJnO6p3p1EswED+HRWa7HJ7uEqlYoC/1MdGoPt0W2pHsU+O1jyCer50Av8krYArIHZ9 tQJ6AqFSlR0Dlosjbdng==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1hDt5V-0005ze-Pr; Tue, 09 Apr 2019 15:55:05 +0000 Received: from mail-pg1-f193.google.com ([209.85.215.193]) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1hDt5S-0005Rb-MK for linux-arm-kernel@lists.infradead.org; Tue, 09 Apr 2019 15:55:04 +0000 Received: by mail-pg1-f193.google.com with SMTP id z9so6604719pgu.10 for ; Tue, 09 Apr 2019 08:55:02 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:content-transfer-encoding :in-reply-to:user-agent; bh=r43mAVZxYKG/YWvrUrXD7JBBbZT0Kp4TL+GPMx0nxBg=; b=T0akCzgw5V4JqwUouCoVKYh+GcJnREFHbMHKLyGXMCYkEp1K/IUKLF8pIB6cOJXmab oEN+hGl+MNg9RMyhMGmSCtgTP3EuQPZBqkTrN3sGediZHHTGE6MhYJ7cZXRm7XOod/5D cLtEUv8XLpDaGJEjCH7n7EXlIq/V0qbNW2O7ZtobGpcRgro9T1dbCJkbXxarf/KvwvvU IOLb9+WiR9C/jLootT6+kwKrfdIjgt4YZxys9+urnhM96FJL+RUOK06bQ0HjhBaDLOsU TmuADuVnJq0MPwk8lNlCH2B5rRkaVBzdzusrSU6TmocIsDYpgR/pBwomrxDEFelIeiLS sp+A== X-Gm-Message-State: APjAAAX7SRxRF6JExz9KKyohPvwlWhy1RKXie8t9r04j6Y/doP8GX684 W9qk//cZ92ksuSB3476HSQM= X-Google-Smtp-Source: APXvYqynw1dHRrvGc5Kkd7VVXAJ4UlxWn3MvmqcEp1CUJExNe2P7140Jgxq8aVfp7sw3YFvfCUqtDw== X-Received: by 2002:a63:6907:: with SMTP id e7mr28224535pgc.209.1554825301625; Tue, 09 Apr 2019 08:55:01 -0700 (PDT) Received: from localhost ([207.114.172.147]) by smtp.gmail.com with ESMTPSA id w68sm45735950pfb.176.2019.04.09.08.55.00 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Tue, 09 Apr 2019 08:55:00 -0700 (PDT) Date: Tue, 9 Apr 2019 08:54:59 -0700 From: Moritz Fischer To: Nava kishore Manne Subject: Re: [PATCH v4 1/3] firmware: xilinx: Add fpga API's Message-ID: <20190409155459.GA7617@archbook> References: <20190402123123.915-1-nava.manne@xilinx.com> <20190402123123.915-2-nava.manne@xilinx.com> <20190408171456.GA4293@archbook> <9ab8f7fb-0936-3635-60fe-164402780429@xilinx.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.11.4 (2019-03-13) X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20190409_085502_738732_75EA56E0 X-CRM114-Status: GOOD ( 27.71 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: "mark.rutland@arm.com" , "devicetree@vger.kernel.org" , "atull@kernel.org" , "linux-fpga@vger.kernel.org" , "linux-kernel@vger.kernel.org" , Jolly Shah , Rajan Vaja , "robh+dt@kernel.org" , Moritz Fischer , Michal Simek , "linux-arm-kernel@lists.infradead.org" , "chinnikishore369@gmail.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 SGkgTmF2YSwKCk9uIFR1ZSwgQXByIDA5LCAyMDE5IGF0IDA4OjU0OjM0QU0gKzAwMDAsIE5hdmEg a2lzaG9yZSBNYW5uZSB3cm90ZToKPiBIaSBNb3JpdHosCj4gCj4gVGhhbmtzIGZvciB0aGUgcXVp Y2sgcmVzcG9uc2UuCj4gUGxlYXNlIGZpbmQgbXkgcmVzcG9uc2UgaW5saW5lCj4gCj4gPiAtLS0t LU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQo+ID4gRnJvbTogTWljaGFsIFNpbWVrIFttYWlsdG86bWlj aGFsLnNpbWVrQHhpbGlueC5jb21dCj4gPiBTZW50OiBUdWVzZGF5LCBBcHJpbCA5LCAyMDE5IDEy OjA0IFBNCj4gPiBUbzogTW9yaXR6IEZpc2NoZXIgPG1kZkBrZXJuZWwub3JnPjsgTmF2YSBraXNo b3JlIE1hbm5lCj4gPiA8bmF2YW1AeGlsaW54LmNvbT4KPiA+IENjOiBhdHVsbEBrZXJuZWwub3Jn OyByb2JoK2R0QGtlcm5lbC5vcmc7IG1hcmsucnV0bGFuZEBhcm0uY29tOyBNaWNoYWwKPiA+IFNp bWVrIDxtaWNoYWxzQHhpbGlueC5jb20+OyBSYWphbiBWYWphIDxSQUpBTlZAeGlsaW54LmNvbT47 IEpvbGx5IFNoYWgKPiA+IDxKT0xMWVNAeGlsaW54LmNvbT47IGxpbnV4LWZwZ2FAdmdlci5rZXJu ZWwub3JnOyBkZXZpY2V0cmVlQHZnZXIua2VybmVsLm9yZzsKPiA+IGxpbnV4LWFybS1rZXJuZWxA bGlzdHMuaW5mcmFkZWFkLm9yZzsgbGludXgta2VybmVsQHZnZXIua2VybmVsLm9yZzsKPiA+IGNo aW5uaWtpc2hvcmUzNjlAZ21haWwuY29tCj4gPiBTdWJqZWN0OiBSZTogW1BBVENIIHY0IDEvM10g ZmlybXdhcmU6IHhpbGlueDogQWRkIGZwZ2EgQVBJJ3MKPiA+IAo+ID4gT24gMDguIDA0LiAxOSAx OToxNCwgTW9yaXR6IEZpc2NoZXIgd3JvdGU6Cj4gPiA+IEhpIE5hdmEsCj4gPiA+Cj4gPiA+IE9u IFR1ZSwgQXByIDAyLCAyMDE5IGF0IDA2OjAxOjIxUE0gKzA1MzAsIE5hdmEga2lzaG9yZSBNYW5u ZSB3cm90ZToKPiA+ID4+IFRoaXMgUGF0Y2ggQWRkcyBmcGdhIEFQSSdzIHRvIHN1cHBvcnQgdGhl IEJpdHN0cmVhbSBsb2FkaW5nIGJ5IHVzaW5nCj4gPiA+PiBmaXJtd2FyZSBpbnRlcmZhY2UuCj4g PiA+Pgo+ID4gPj4gU2lnbmVkLW9mZi1ieTogTmF2YSBraXNob3JlIE1hbm5lIDxuYXZhLm1hbm5l QHhpbGlueC5jb20+Cj4gPiA+PiAtLS0KPiA+ID4+IENoYW5nZXMgZm9yIHY0Ogo+ID4gPj4gCQkt Tm9uZS4KPiA+ID4+Cj4gPiA+PiBDaG5hZ2VzIGZvciB2MzoKPiA+ID4+IAkJLUNyZWF0ZWQgcGF0 Y2hlcyBvbiB0b3Agb2YgNS4wLXJjNS4KPiA+ID4+IAkJIE5vIGZ1bmN0aW9uYWwgY2hhbmdlcy4K PiA+ID4+Cj4gPiA+PiBDaGFuZ2VzIGZvciB2MjoKPiA+ID4+IAkJLUFkZGVkIEZpcm13YXJlIEZQ R0EgTWFuYWdlciBmbGFncyBBcyBzdWdnZXN0ZWQgYnkKPiA+ID4+IAkJIE1vcml0ei4KPiA+ID4+ Cj4gPiA+PiBDaGFuZ2VzIGZvciB2MToKPiA+ID4+IAkJLU5vbmUuCj4gPiA+Pgo+ID4gPj4gQ2hh bmdlcyBmb3IgUkZDLVYyOgo+ID4gPj4gCQktTmV3IFBhdGNoCj4gPiA+Pgo+ID4gPj4gIGRyaXZl cnMvZmlybXdhcmUveGlsaW54L3p5bnFtcC5jICAgICB8IDQ2ICsrKysrKysrKysrKysrKysrKysr KysrKysrKysKPiA+ID4+ICBpbmNsdWRlL2xpbnV4L2Zpcm13YXJlL3hsbngtenlucW1wLmggfCAx MCArKysrKysKPiA+ID4+ICAyIGZpbGVzIGNoYW5nZWQsIDU2IGluc2VydGlvbnMoKykKPiA+ID4+ Cj4gPiA+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS94aWxpbngvenlucW1wLmMKPiA+ ID4+IGIvZHJpdmVycy9maXJtd2FyZS94aWxpbngvenlucW1wLmMKPiA+ID4+IGluZGV4IDk4Zjkz NjEyNTY0My4uNzE1OWE5MGFiYzQ0IDEwMDY0NAo+ID4gPj4gLS0tIGEvZHJpdmVycy9maXJtd2Fy ZS94aWxpbngvenlucW1wLmMKPiA+ID4+ICsrKyBiL2RyaXZlcnMvZmlybXdhcmUveGlsaW54L3p5 bnFtcC5jCj4gPiA+PiBAQCAtNTM3LDYgKzUzNyw1MCBAQCBzdGF0aWMgaW50IHp5bnFtcF9wbV9y ZXNldF9nZXRfc3RhdHVzKGNvbnN0IGVudW0KPiA+IHp5bnFtcF9wbV9yZXNldCByZXNldCwKPiA+ ID4+ICAJcmV0dXJuIHJldDsKPiA+ID4+ICB9Cj4gPiA+Pgo+ID4gPj4gKy8qCj4gPiA+PiArICog enlucW1wX3BtX2ZwZ2FfbG9hZCAtIFBlcmZvcm0gdGhlIGZwZ2EgbG9hZAo+ID4gPj4gKyAqIEBh ZGRyZXNzOglBZGRyZXNzIHRvIHdyaXRlIHRvCj4gPiA+PiArICogQHNpemU6CXBsIGJpdHN0cmVh bSBzaXplCj4gPiA+PiArICogQGZsYWdzOgo+ID4gPj4gKyAqCUJJVCgwKSAtIEJpdC1zdHJlYW0g dHlwZS4KPiA+ID4+ICsgKgkJIDAgLSBGdWxsIEJpdHN0cmVhbS4KPiA+ID4+ICsgKgkJIDEgLSBQ YXJ0aWFsIEJpdHN0cmVhbS4KCkRvbid0IHlvdSB3YW5uYSBjYWxsIG91dCB0aGUgZGVmaW5lcyBp bnN0ZWFkIGhlcmUgdGhhdCB5b3UgZGVmaW5lZCBpbgppbmNsdWRlL2xpbnV4L2Zpcm13YXJlL3hs bngtenlucW1wLmg/Cgo+ID4gPj4gKyAqCj4gPiA+PiArICogVGhpcyBmdW5jdGlvbiBwcm92aWRl cyBhY2Nlc3MgdG8gcG11ZncuIFRvIHRyYW5zZmVyCj4gPiA+PiArICogdGhlIHJlcXVpcmVkIGJp dHN0cmVhbSBpbnRvIFBMLgo+ID4gPj4gKyAqCj4gPiA+PiArICogUmV0dXJuOiBSZXR1cm5zIHN0 YXR1cywgZWl0aGVyIHN1Y2Nlc3Mgb3IgZXJyb3IrcmVhc29uICAqLyBzdGF0aWMKPiA+ID4+ICtp bnQgenlucW1wX3BtX2ZwZ2FfbG9hZChjb25zdCB1NjQgYWRkcmVzcywgY29uc3QgdTMyIHNpemUs Cj4gPiA+PiArCQkJICAgICAgIGNvbnN0IHUzMiBmbGFncykKPiA+ID4+ICt7Cj4gPiA+PiArCXJl dHVybiB6eW5xbXBfcG1faW52b2tlX2ZuKFBNX0ZQR0FfTE9BRCwgbG93ZXJfMzJfYml0cyhhZGRy ZXNzKSwKPiA+ID4+ICsJCQkJICAgdXBwZXJfMzJfYml0cyhhZGRyZXNzKSwgc2l6ZSwgZmxhZ3Ms IE5VTEwpOyB9Cj4gPiA+PiArCj4gPiA+PiArLyoqCj4gPiA+PiArICogenlucW1wX3BtX2ZwZ2Ff Z2V0X3N0YXR1cyAtIFJlYWQgdmFsdWUgZnJvbSBQQ0FQIHN0YXR1cyByZWdpc3Rlcgo+ID4gPj4g KyAqIEB2YWx1ZTogVmFsdWUgdG8gcmVhZAo+ID4gPj4gKyAqCj4gPiA+PiArICogVGhpcyBmdW5j dGlvbiBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIHhpbGZwZ2EgbGlicmFyeSB0byBnZXQKPiA+ID4K PiA+ID4geGlsZnBnYT8gSXMgdGhhdCBQTVUgZmlybXdhcmUgeW91J3JlIHRhbGtpbmcgYWJvdXQ/ Cj4gCj4gWGlsZnBnYSBpcyBhIGxpYnJhcnkgYW5kIGl04oCZcyBhIHBhcnQgb2YgUE1VRlcgQlNQ Lgo+IEl0IHdpbGwgZm9sbG93IHRoZSBiZWxvdyBmbG93IHRvIGNvbmZpZ3VyZSB0aGUgUEwgZnJv bSBMaW51eCBlbnZpcm9ubWVudC4KPiBMaW51eCAtRnBnYSBNYW5hZ2VyIGZyYW1ld29yayA8LS0+ IExpbnV4LUZpcm13YXJlIERyaXZlciA8LSAtc21jIGNhbGwtLT5BVEYgPC0tSVBJIGNhbGwtLT4g UE1VRlc8LS0+IFhpbGZwZ2EgbGlicmFyeS4KCkZhaXIgZW5vdWdoLiBXYXMgd29uZGVyaW5nIGlm IHdlIGNvdWxkIHNpbXBsaWZ5L2NsYXJpZnkgdGhlIGNvbW1lbnQsIGJ1dAphbHNvIGRvbid0IGhh dmUgYSBnb29kIHN1Z2dlc3Rpb24gOikKPiAKPiA+ID4KPiA+ID4+ICsgKiB0aGUgUENBUCBzdGF0 dXMKPiA+ID4+ICsgKgo+ID4gPj4gKyAqIFJldHVybjogUmV0dXJucyBzdGF0dXMsIGVpdGhlciBz dWNjZXNzIG9yIGVycm9yK3JlYXNvbiAgKi8gc3RhdGljCj4gPiA+PiAraW50IHp5bnFtcF9wbV9m cGdhX2dldF9zdGF0dXModTMyICp2YWx1ZSkgewo+ID4gPj4gKwl1MzIgcmV0X3BheWxvYWRbUEFZ TE9BRF9BUkdfQ05UXTsKPiA+ID4+ICsJaW50IHJldDsKPiA+ID4+ICsKPiA+ID4+ICsJaWYgKCF2 YWx1ZSkKPiA+ID4+ICsJCXJldHVybiAtRUlOVkFMOwo+ID4gPj4gKwo+ID4gPj4gKwlyZXQgPSB6 eW5xbXBfcG1faW52b2tlX2ZuKFBNX0ZQR0FfR0VUX1NUQVRVUywgMCwgMCwgMCwgMCwKPiA+IHJl dF9wYXlsb2FkKTsKPiA+ID4+ICsJKnZhbHVlID0gcmV0X3BheWxvYWRbMV07Cj4gPiA+PiArCj4g PiA+PiArCXJldHVybiByZXQ7Cj4gPiA+PiArfQo+ID4gPj4gKwo+ID4gPj4gIC8qKgo+ID4gPj4g ICAqIHp5bnFtcF9wbV9pbml0X2ZpbmFsaXplKCkgLSBQTSBjYWxsIHRvIGluZm9ybSBmaXJtd2Fy ZSB0aGF0IHRoZSBjYWxsZXIKPiA+ID4+ICAgKgkJCSAgICAgICBtYXN0ZXIgaGFzIGluaXRpYWxp emVkIGl0cyBvd24gcG93ZXIgbWFuYWdlbWVudAo+ID4gPj4gQEAgLTY0MCw2ICs2ODQsOCBAQCBz dGF0aWMgY29uc3Qgc3RydWN0IHp5bnFtcF9lZW1pX29wcyBlZW1pX29wcyA9IHsKPiA+ID4+ICAJ LnJlcXVlc3Rfbm9kZSA9IHp5bnFtcF9wbV9yZXF1ZXN0X25vZGUsCj4gPiA+PiAgCS5yZWxlYXNl X25vZGUgPSB6eW5xbXBfcG1fcmVsZWFzZV9ub2RlLAo+ID4gPj4gIAkuc2V0X3JlcXVpcmVtZW50 ID0genlucW1wX3BtX3NldF9yZXF1aXJlbWVudCwKPiA+ID4+ICsJLmZwZ2FfbG9hZCA9IHp5bnFt cF9wbV9mcGdhX2xvYWQsCj4gPiA+PiArCS5mcGdhX2dldF9zdGF0dXMgPSB6eW5xbXBfcG1fZnBn YV9nZXRfc3RhdHVzLAo+ID4gPj4gIH07Cj4gPiA+Pgo+ID4gPj4gIC8qKgo+ID4gPj4gZGlmZiAt LWdpdCBhL2luY2x1ZGUvbGludXgvZmlybXdhcmUveGxueC16eW5xbXAuaAo+ID4gPj4gYi9pbmNs dWRlL2xpbnV4L2Zpcm13YXJlL3hsbngtenlucW1wLmgKPiA+ID4+IGluZGV4IDY0MmRhYjEwZjY1 ZC4uNGRmMjI2YjZhYjBmIDEwMDY0NAo+ID4gPj4gLS0tIGEvaW5jbHVkZS9saW51eC9maXJtd2Fy ZS94bG54LXp5bnFtcC5oCj4gPiA+PiArKysgYi9pbmNsdWRlL2xpbnV4L2Zpcm13YXJlL3hsbngt enlucW1wLmgKPiA+ID4+IEBAIC00OCw2ICs0OCwxMiBAQAo+ID4gPj4gICNkZWZpbmUJWllOUU1Q X1BNX0NBUEFCSUxJVFlfV0FLRVVQCTB4NFUKPiA+ID4+ICAjZGVmaW5lCVpZTlFNUF9QTV9DQVBB QklMSVRZX1BPV0VSCTB4OFUKPiA+ID4+Cj4gPiA+PiArLyoKPiA+ID4+ICsgKiBGaXJtd2FyZSBG UEdBIE1hbmFnZXIgZmxhZ3MKPiA+ID4+ICsgKiBYSUxJTlhfWllOUU1QX1BNX0ZQR0FfUEFSVElB TDogRlBHQSBwYXJ0aWFsIHJlY29uZmlndXJhdGlvbiAgKi8KPiA+ID4+ICsjZGVmaW5lIFhJTElO WF9aWU5RTVBfUE1fRlBHQV9QQVJUSUFMCUJJVCgwKQo+ID4gPj4gKwo+ID4gPj4gIGVudW0gcG1f YXBpX2lkIHsKPiA+ID4+ICAJUE1fR0VUX0FQSV9WRVJTSU9OID0gMSwKPiA+ID4+ICAJUE1fUkVR VUVTVF9OT0RFID0gMTMsCj4gPiA+PiBAQCAtNTYsNiArNjIsOCBAQCBlbnVtIHBtX2FwaV9pZCB7 Cj4gPiA+PiAgCVBNX1JFU0VUX0FTU0VSVCA9IDE3LAo+ID4gPj4gIAlQTV9SRVNFVF9HRVRfU1RB VFVTLAo+ID4gPj4gIAlQTV9QTV9JTklUX0ZJTkFMSVpFID0gMjEsCj4gPiA+PiArCVBNX0ZQR0Ff TE9BRCA9IDIyLAo+ID4gPj4gKwlQTV9GUEdBX0dFVF9TVEFUVVMsCj4gPiA+Cj4gPiA+IEFueSBy ZWFzb24geW91IGNhbid0IGRvICdQTV9GUEdBX0dFVF9TVEFUVVMgPSAyMycgaGVyZT8gVHJ5aW5n IHRvCj4gPiA+IHVuZGVyc3RhbmQgeW91ciByZWFzb25pbmcuIEFyZSB5b3UgcGxhbm5pbmcgdG8g bW92ZSB0aGVtIGFyb3VuZD8KPiA+IAo+ID4gSXQgaXMgMjMgYnkgZGVzaWduLiBJbiB4aWxpbngg cmVwbyB0aGVyZSB3YXMgb25seSB0aGUgZmlyc3QgdmFsdWUgd2hpY2ggaXMKPiA+IHJlY29tbWVu ZGVkIHByYWN0aWNlLiBCdXQgdXBzdHJlYW1pbmcgaXMgbm90IGRvbmUgaW4gdGhlIHNhbWUgb3Jk ZXIgdGhhdCdzCj4gPiB3aHkgaWYgdGhlcmUgaXMgYSBnYXAgeW91IG5lZWQgdG8gYXNzaWduIHZh bHVlcyB0aGVyZS4KPiA+IEV2ZW4gdGhhdCAyMiBjYW4gYmUgcmVtb3ZlZCBpbiB0aGlzIGNhc2Ug YnV0IGl0IGlzIGp1c3Qgbml0Lgo+ID4gCj4gIEFzIE1pY2hhbCBzYWlkIGhlcmUgQXNzaWduaW5n IHZhbHVlIG9mIDIyIGlzIG5vdCBuZWVkZWQuIFdpbGwgZml4IHRoaXMgaXNzdWUgaW4gdGhlIG5l eHQgdmVyc2lvbi4KCk9rLCBJIGRpZG4ndCBjaGVjayB0aGUgWGlsaW54IHJlcG9zIDopIE1ha2Vz IHNlbnNlLCB0aG91Z2guCgpXaXRoIG5pdHMgYWJvdmUgYWRkcmVzc2VkOgpSZXZpZXdlZC1ieTog TW9yaXR6IEZpc2NoZXIgPG1kZkBrZXJuZWwub3JnPgoKVGhhbmtzLApNb3JpdHoKCl9fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwg bWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8v bGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK