From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id A9145C433FE for ; Fri, 25 Feb 2022 15:52:02 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242374AbiBYPwd (ORCPT ); Fri, 25 Feb 2022 10:52:33 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59390 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232662AbiBYPwb (ORCPT ); Fri, 25 Feb 2022 10:52:31 -0500 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DC3771CFA3E; Fri, 25 Feb 2022 07:51:58 -0800 (PST) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 6677C61A25; Fri, 25 Feb 2022 15:51:58 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 9ADA1C340E7; Fri, 25 Feb 2022 15:51:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1645804317; bh=V9gJHhPgPqYllsqDsYnBl3rnZBElaZYYZJ2q/xpB/No=; h=Date:From:To:Cc:Subject:In-Reply-To:From; b=WEk/mxCcR8c9X+m2Z4durgNFf+0qvvd7AG/+ROPJjpBFyRpabW4dABD2ySstG3j2f jp9uhnRdKazS/n26oWz5/7btI+Xb6yWKKZzIOjdkNLt64TevZXygM1x11kpG92VMIP IA1PzDrWJ52Kko8oOADOn7d5mFE0Jmvl/+AZTnUsQRlOAqBf3EKzYs/xojzLoTpXFc UCrvm3Hvtes2eV7qCmFvQe/pZED2IZhJBpYWicqUog3dmSSD11bq0GJLtlt1Xb57Gs 3DJ9csSRP3wIqHNIHgw+Kiorj0wIJJa3xUaQ0oaSEy/+bxTtSpxe4pxkIDty2zjFRz m5IbU0fG9Jg4Q== Date: Fri, 25 Feb 2022 09:51:56 -0600 From: Bjorn Helgaas To: Pali =?iso-8859-1?Q?Roh=E1r?= Cc: Lorenzo Pieralisi , Bjorn Helgaas , Rob Herring , Andrew Lunn , Thomas Petazzoni , Krzysztof =?utf-8?Q?Wilczy=C5=84ski?= , Marek =?iso-8859-1?Q?Beh=FAn?= , Russell King , Gregory Clement , linux-pci@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH 4/6] PCI: Add function for parsing 'slot-power-limit-milliwatt' DT property Message-ID: <20220225155156.GA358965@bhelgaas> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20220225123051.xlsv7fkesdf5upeh@pali> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, Feb 25, 2022 at 01:30:51PM +0100, Pali Rohár wrote: > On Thursday 24 February 2022 14:47:15 Bjorn Helgaas wrote: > > On Tue, Feb 22, 2022 at 05:31:56PM +0100, Pali Rohár wrote: > > > Add function of_pci_get_slot_power_limit(), which parses the > > > 'slot-power-limit-milliwatt' DT property, returning the value in > > > milliwatts and in format ready for the PCIe Slot Capabilities Register. > > > > > > Signed-off-by: Pali Rohár > > > Signed-off-by: Marek Behún > > > Reviewed-by: Rob Herring > > > Acked-by: Bjorn Helgaas > > > --- > > > drivers/pci/of.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++ > > > drivers/pci/pci.h | 15 +++++++++++ > > > 2 files changed, 79 insertions(+) > > > > > > diff --git a/drivers/pci/of.c b/drivers/pci/of.c > > > index cb2e8351c2cc..2b0c0a3641a8 100644 > > > --- a/drivers/pci/of.c > > > +++ b/drivers/pci/of.c > > > @@ -633,3 +633,67 @@ int of_pci_get_max_link_speed(struct device_node *node) > > > return max_link_speed; > > > } > > > EXPORT_SYMBOL_GPL(of_pci_get_max_link_speed); > > > + > > > +/** > > > + * of_pci_get_slot_power_limit - Parses the "slot-power-limit-milliwatt" > > > + * property. > > > + * > > > + * @node: device tree node with the slot power limit information > > > + * @slot_power_limit_value: pointer where the value should be stored in PCIe > > > + * Slot Capabilities Register format > > > + * @slot_power_limit_scale: pointer where the scale should be stored in PCIe > > > + * Slot Capabilities Register format > > > + * > > > + * Returns the slot power limit in milliwatts and if @slot_power_limit_value > > > + * and @slot_power_limit_scale pointers are non-NULL, fills in the value and > > > + * scale in format used by PCIe Slot Capabilities Register. > > > + * > > > + * If the property is not found or is invalid, returns 0. > > > + */ > > > +u32 of_pci_get_slot_power_limit(struct device_node *node, > > > + u8 *slot_power_limit_value, > > > + u8 *slot_power_limit_scale) > > > +{ > > > + u32 slot_power_limit; > > > > Including "mw" or similar reference to the units would give a hint of > > how to relate the code to the spec. > > > > > + u8 value, scale; > > > + > > > + if (of_property_read_u32(node, "slot-power-limit-milliwatt", > > > + &slot_power_limit)) > > > + slot_power_limit = 0; > > > + > > > + /* Calculate Slot Power Limit Value and Slot Power Limit Scale */ > > > > Add a spec reference to PCIe r6.0, sec 7.5.3.9. IIUC, this supports > > up to 300W, which was what r5.0 defined, but r6.0 added values up to > > 0xfe (600W). > > I did not know about it and I have not seen/read r6.0. > > It would be nice if somebody with access to r6.0 send a patch to lspci > utility, so we could write support for 600W based on lspci parser. Of course, sorry! Obviously you would have implemented them all if you had the spec! Here's the info from r6.0, sec 7.5.3.9: Slot Power Limit Value - In combination with the Slot Power Limit Scale value, specifies the upper limit on power supplied by the slot (see § Section 6.9) or by other means to the adapter. Power limit (in Watts) is calculated by multiplying the value in this field by the value in the Slot Power Limit Scale field except when the Slot Power Limit Scale field equals 00b (1.0x) and Slot Power Limit Value exceeds EFh, the following alternative encodings are used: F0h > 239 W and ≤ 250 W Slot Power Limit F1h > 250 W and ≤ 275 W Slot Power Limit F2h > 275 W and ≤ 300 W Slot Power Limit F3h > 300 W and ≤ 325 W Slot Power Limit F4h > 325 W and ≤ 350 W Slot Power Limit F5h > 350 W and ≤ 375 W Slot Power Limit F6h > 375 W and ≤ 400 W Slot Power Limit F7h > 400 W and ≤ 425 W Slot Power Limit F8h > 425 W and ≤ 450 W Slot Power Limit F9h > 450 W and ≤ 475 W Slot Power Limit FAh > 475 W and ≤ 500 W Slot Power Limit FBh > 500 W and ≤ 525 W Slot Power Limit FCh > 525 W and ≤ 550 W Slot Power Limit FDh > 550 W and ≤ 575 W Slot Power Limit FEh > 575 W and ≤ 600 W Slot Power Limit FFh Reserved for Slot Power Limit Values above 600 W This register must be implemented if the Slot Implemented bit is Set. Writes to this register also cause the Port to send the Set_Slot_Power_Limit Message. > > > + if (slot_power_limit == 0) { > > > + value = 0x00; > > > + scale = 0; > > > + } else if (slot_power_limit <= 255) { > > > + value = slot_power_limit; > > > + scale = 3; > > > + } else if (slot_power_limit <= 255*10) { > > > + value = slot_power_limit / 10; > > > + scale = 2; > > > + } else if (slot_power_limit <= 255*100) { > > > + value = slot_power_limit / 100; > > > + scale = 1; > > > + } else if (slot_power_limit <= 239*1000) { > > > + value = slot_power_limit / 1000; > > > + scale = 0; > > > + } else if (slot_power_limit <= 250*1000) { > > > + value = 0xF0; > > > + scale = 0; > > > + } else if (slot_power_limit <= 275*1000) { > > > + value = 0xF1; > > > + scale = 0; > > > + } else { > > > + value = 0xF2; > > > + scale = 0; > > > + } > > > + > > > + if (slot_power_limit_value) > > > + *slot_power_limit_value = value; > > > + > > > + if (slot_power_limit_scale) > > > + *slot_power_limit_scale = scale; > > > + > > > + return slot_power_limit; > > > > If "slot-power-limit-milliwatt" contains a value larger than can be > > represented in "value" and "scale", the return value will not agree > > with value/scale, will it? > > In previous version 0xF2 was reserved for values above 275 W. So for me > it looked like a correct solution. > > > Currently you only use the return value for a log message, so no real > > harm yet, other than the fact that we might print "Slot power limit > > 1000.0W" when the hardware will only advertise 600W available. > > > > Also, if "slot-power-limit-milliwatt" contains something like > > 260000 mW (260 W), we'll return 0xF1/0, so the hardware will > > advertise 275 W available. > > There is no way how to encode 260 W. It is possible only 250 W or 275 W, > and nothing between. I chose to round value to upper limit. What do you > prefer in these cases? Upper or lower limit? I think rounding down is better. If we round up, the slot will advertise more power than it can deliver, and if the device tries to consume the amount of power advertised, it may not work reliably. So I think we should return encoded values that are no higher than what the slot can actually deliver, and the return value should match what Slot Capabilities advertises. Bjorn From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 996E5C433F5 for ; Fri, 25 Feb 2022 15:55:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version: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:References: List-Owner; bh=tGVv0IfiIiOcAA+b8Nn9bIRlnI8vgAtIrboKgj0sSpE=; b=vRS8GPVPoH//fU CPD/TroS1q4LBU1ixSKSajvMXECOgTrYU6kC6QwVl3iap9AYFtfw3N5yl3TKLgqiqdTTcLqBXIXFf 6FuWPlOQNZkBRXboxCzzlsTAX6mEoiad+Nt537lia8RoNZ4uq6HfRPCx/KfNv39KQb6qvmUdJG0WV f2pOr9LkLoijQXTskZA57gZ4KtXKyH/6zwF4Y0xx1wqJVqzdjs1mR+WXOsbVd2GbTLeW4OozunWLr ZrmzcdPg1ILskuMVt44CcHYtGtKBRuSyanIgTtJCRSguCoYX49xrqKgeOrrrqthWyhjpEz/R7V+sw OhZevirQrOLUwq17ZOOQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1nNcv5-005j33-Ls; Fri, 25 Feb 2022 15:54:12 +0000 Received: from dfw.source.kernel.org ([139.178.84.217]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1nNcsx-005iAw-8M for linux-arm-kernel@lists.infradead.org; Fri, 25 Feb 2022 15:52:01 +0000 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id B89A061A30; Fri, 25 Feb 2022 15:51:58 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 9ADA1C340E7; Fri, 25 Feb 2022 15:51:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1645804317; bh=V9gJHhPgPqYllsqDsYnBl3rnZBElaZYYZJ2q/xpB/No=; h=Date:From:To:Cc:Subject:In-Reply-To:From; b=WEk/mxCcR8c9X+m2Z4durgNFf+0qvvd7AG/+ROPJjpBFyRpabW4dABD2ySstG3j2f jp9uhnRdKazS/n26oWz5/7btI+Xb6yWKKZzIOjdkNLt64TevZXygM1x11kpG92VMIP IA1PzDrWJ52Kko8oOADOn7d5mFE0Jmvl/+AZTnUsQRlOAqBf3EKzYs/xojzLoTpXFc UCrvm3Hvtes2eV7qCmFvQe/pZED2IZhJBpYWicqUog3dmSSD11bq0GJLtlt1Xb57Gs 3DJ9csSRP3wIqHNIHgw+Kiorj0wIJJa3xUaQ0oaSEy/+bxTtSpxe4pxkIDty2zjFRz m5IbU0fG9Jg4Q== Date: Fri, 25 Feb 2022 09:51:56 -0600 From: Bjorn Helgaas To: Pali =?iso-8859-1?Q?Roh=E1r?= Cc: Lorenzo Pieralisi , Bjorn Helgaas , Rob Herring , Andrew Lunn , Thomas Petazzoni , Krzysztof =?utf-8?Q?Wilczy=C5=84ski?= , Marek =?iso-8859-1?Q?Beh=FAn?= , Russell King , Gregory Clement , linux-pci@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH 4/6] PCI: Add function for parsing 'slot-power-limit-milliwatt' DT property Message-ID: <20220225155156.GA358965@bhelgaas> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20220225123051.xlsv7fkesdf5upeh@pali> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220225_075159_424292_071E6D0D X-CRM114-Status: GOOD ( 44.18 ) 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 T24gRnJpLCBGZWIgMjUsIDIwMjIgYXQgMDE6MzA6NTFQTSArMDEwMCwgUGFsaSBSb2jDoXIgd3Jv dGU6Cj4gT24gVGh1cnNkYXkgMjQgRmVicnVhcnkgMjAyMiAxNDo0NzoxNSBCam9ybiBIZWxnYWFz IHdyb3RlOgo+ID4gT24gVHVlLCBGZWIgMjIsIDIwMjIgYXQgMDU6MzE6NTZQTSArMDEwMCwgUGFs aSBSb2jDoXIgd3JvdGU6Cj4gPiA+IEFkZCBmdW5jdGlvbiBvZl9wY2lfZ2V0X3Nsb3RfcG93ZXJf bGltaXQoKSwgd2hpY2ggcGFyc2VzIHRoZQo+ID4gPiAnc2xvdC1wb3dlci1saW1pdC1taWxsaXdh dHQnIERUIHByb3BlcnR5LCByZXR1cm5pbmcgdGhlIHZhbHVlIGluCj4gPiA+IG1pbGxpd2F0dHMg YW5kIGluIGZvcm1hdCByZWFkeSBmb3IgdGhlIFBDSWUgU2xvdCBDYXBhYmlsaXRpZXMgUmVnaXN0 ZXIuCj4gPiA+IAo+ID4gPiBTaWduZWQtb2ZmLWJ5OiBQYWxpIFJvaMOhciA8cGFsaUBrZXJuZWwu b3JnPgo+ID4gPiBTaWduZWQtb2ZmLWJ5OiBNYXJlayBCZWjDum4gPGthYmVsQGtlcm5lbC5vcmc+ Cj4gPiA+IFJldmlld2VkLWJ5OiBSb2IgSGVycmluZyA8cm9iaEBrZXJuZWwub3JnPgo+ID4gPiBB Y2tlZC1ieTogQmpvcm4gSGVsZ2FhcyA8YmhlbGdhYXNAZ29vZ2xlLmNvbT4KPiA+ID4gLS0tCj4g PiA+ICBkcml2ZXJzL3BjaS9vZi5jICB8IDY0ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrCj4gPiA+ICBkcml2ZXJzL3BjaS9wY2kuaCB8IDE1ICsrKysrKysr KysrCj4gPiA+ICAyIGZpbGVzIGNoYW5nZWQsIDc5IGluc2VydGlvbnMoKykKPiA+ID4gCj4gPiA+ IGRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9vZi5jIGIvZHJpdmVycy9wY2kvb2YuYwo+ID4gPiBp bmRleCBjYjJlODM1MWMyY2MuLjJiMGMwYTM2NDFhOCAxMDA2NDQKPiA+ID4gLS0tIGEvZHJpdmVy cy9wY2kvb2YuYwo+ID4gPiArKysgYi9kcml2ZXJzL3BjaS9vZi5jCj4gPiA+IEBAIC02MzMsMyAr NjMzLDY3IEBAIGludCBvZl9wY2lfZ2V0X21heF9saW5rX3NwZWVkKHN0cnVjdCBkZXZpY2Vfbm9k ZSAqbm9kZSkKPiA+ID4gIAlyZXR1cm4gbWF4X2xpbmtfc3BlZWQ7Cj4gPiA+ICB9Cj4gPiA+ICBF WFBPUlRfU1lNQk9MX0dQTChvZl9wY2lfZ2V0X21heF9saW5rX3NwZWVkKTsKPiA+ID4gKwo+ID4g PiArLyoqCj4gPiA+ICsgKiBvZl9wY2lfZ2V0X3Nsb3RfcG93ZXJfbGltaXQgLSBQYXJzZXMgdGhl ICJzbG90LXBvd2VyLWxpbWl0LW1pbGxpd2F0dCIKPiA+ID4gKyAqCQkJCSBwcm9wZXJ0eS4KPiA+ ID4gKyAqCj4gPiA+ICsgKiBAbm9kZTogZGV2aWNlIHRyZWUgbm9kZSB3aXRoIHRoZSBzbG90IHBv d2VyIGxpbWl0IGluZm9ybWF0aW9uCj4gPiA+ICsgKiBAc2xvdF9wb3dlcl9saW1pdF92YWx1ZTog cG9pbnRlciB3aGVyZSB0aGUgdmFsdWUgc2hvdWxkIGJlIHN0b3JlZCBpbiBQQ0llCj4gPiA+ICsg KgkJCSAgICBTbG90IENhcGFiaWxpdGllcyBSZWdpc3RlciBmb3JtYXQKPiA+ID4gKyAqIEBzbG90 X3Bvd2VyX2xpbWl0X3NjYWxlOiBwb2ludGVyIHdoZXJlIHRoZSBzY2FsZSBzaG91bGQgYmUgc3Rv cmVkIGluIFBDSWUKPiA+ID4gKyAqCQkJICAgIFNsb3QgQ2FwYWJpbGl0aWVzIFJlZ2lzdGVyIGZv cm1hdAo+ID4gPiArICoKPiA+ID4gKyAqIFJldHVybnMgdGhlIHNsb3QgcG93ZXIgbGltaXQgaW4g bWlsbGl3YXR0cyBhbmQgaWYgQHNsb3RfcG93ZXJfbGltaXRfdmFsdWUKPiA+ID4gKyAqIGFuZCBA c2xvdF9wb3dlcl9saW1pdF9zY2FsZSBwb2ludGVycyBhcmUgbm9uLU5VTEwsIGZpbGxzIGluIHRo ZSB2YWx1ZSBhbmQKPiA+ID4gKyAqIHNjYWxlIGluIGZvcm1hdCB1c2VkIGJ5IFBDSWUgU2xvdCBD YXBhYmlsaXRpZXMgUmVnaXN0ZXIuCj4gPiA+ICsgKgo+ID4gPiArICogSWYgdGhlIHByb3BlcnR5 IGlzIG5vdCBmb3VuZCBvciBpcyBpbnZhbGlkLCByZXR1cm5zIDAuCj4gPiA+ICsgKi8KPiA+ID4g K3UzMiBvZl9wY2lfZ2V0X3Nsb3RfcG93ZXJfbGltaXQoc3RydWN0IGRldmljZV9ub2RlICpub2Rl LAo+ID4gPiArCQkJCXU4ICpzbG90X3Bvd2VyX2xpbWl0X3ZhbHVlLAo+ID4gPiArCQkJCXU4ICpz bG90X3Bvd2VyX2xpbWl0X3NjYWxlKQo+ID4gPiArewo+ID4gPiArCXUzMiBzbG90X3Bvd2VyX2xp bWl0Owo+ID4gCj4gPiBJbmNsdWRpbmcgIm13IiBvciBzaW1pbGFyIHJlZmVyZW5jZSB0byB0aGUg dW5pdHMgd291bGQgZ2l2ZSBhIGhpbnQgb2YKPiA+IGhvdyB0byByZWxhdGUgdGhlIGNvZGUgdG8g dGhlIHNwZWMuCj4gPiAKPiA+ID4gKwl1OCB2YWx1ZSwgc2NhbGU7Cj4gPiA+ICsKPiA+ID4gKwlp ZiAob2ZfcHJvcGVydHlfcmVhZF91MzIobm9kZSwgInNsb3QtcG93ZXItbGltaXQtbWlsbGl3YXR0 IiwKPiA+ID4gKwkJCQkgJnNsb3RfcG93ZXJfbGltaXQpKQo+ID4gPiArCQlzbG90X3Bvd2VyX2xp bWl0ID0gMDsKPiA+ID4gKwo+ID4gPiArCS8qIENhbGN1bGF0ZSBTbG90IFBvd2VyIExpbWl0IFZh bHVlIGFuZCBTbG90IFBvd2VyIExpbWl0IFNjYWxlICovCj4gPiAKPiA+IEFkZCBhIHNwZWMgcmVm ZXJlbmNlIHRvIFBDSWUgcjYuMCwgc2VjIDcuNS4zLjkuICBJSVVDLCB0aGlzIHN1cHBvcnRzCj4g PiB1cCB0byAzMDBXLCB3aGljaCB3YXMgd2hhdCByNS4wIGRlZmluZWQsIGJ1dCByNi4wIGFkZGVk IHZhbHVlcyB1cCB0bwo+ID4gMHhmZSAoNjAwVykuCj4gCj4gSSBkaWQgbm90IGtub3cgYWJvdXQg aXQgYW5kIEkgaGF2ZSBub3Qgc2Vlbi9yZWFkIHI2LjAuCj4gCj4gSXQgd291bGQgYmUgbmljZSBp ZiBzb21lYm9keSB3aXRoIGFjY2VzcyB0byByNi4wIHNlbmQgYSBwYXRjaCB0byBsc3BjaQo+IHV0 aWxpdHksIHNvIHdlIGNvdWxkIHdyaXRlIHN1cHBvcnQgZm9yIDYwMFcgYmFzZWQgb24gbHNwY2kg cGFyc2VyLgoKT2YgY291cnNlLCBzb3JyeSEgIE9idmlvdXNseSB5b3Ugd291bGQgaGF2ZSBpbXBs ZW1lbnRlZCB0aGVtIGFsbCBpZgp5b3UgaGFkIHRoZSBzcGVjIQoKSGVyZSdzIHRoZSBpbmZvIGZy b20gcjYuMCwgc2VjIDcuNS4zLjk6CgogIFNsb3QgUG93ZXIgTGltaXQgVmFsdWUgLSBJbiBjb21i aW5hdGlvbiB3aXRoIHRoZSBTbG90IFBvd2VyIExpbWl0CiAgU2NhbGUgdmFsdWUsIHNwZWNpZmll cyB0aGUgdXBwZXIgbGltaXQgb24gcG93ZXIgc3VwcGxpZWQgYnkgdGhlIHNsb3QKICAoc2VlIMKn IFNlY3Rpb24gNi45KSBvciBieSBvdGhlciBtZWFucyB0byB0aGUgYWRhcHRlci4KCiAgUG93ZXIg bGltaXQgKGluIFdhdHRzKSBpcyBjYWxjdWxhdGVkIGJ5IG11bHRpcGx5aW5nIHRoZSB2YWx1ZSBp bgogIHRoaXMgZmllbGQgYnkgdGhlIHZhbHVlIGluIHRoZSBTbG90IFBvd2VyIExpbWl0IFNjYWxl IGZpZWxkIGV4Y2VwdAogIHdoZW4gdGhlIFNsb3QgUG93ZXIgTGltaXQgU2NhbGUgZmllbGQgZXF1 YWxzIDAwYiAoMS4weCkgYW5kIFNsb3QKICBQb3dlciBMaW1pdCBWYWx1ZSBleGNlZWRzIEVGaCwg dGhlIGZvbGxvd2luZyBhbHRlcm5hdGl2ZSBlbmNvZGluZ3MKICBhcmUgdXNlZDoKCiAgICBGMGgg ICA+IDIzOSBXIGFuZCDiiaQgMjUwIFcgU2xvdCBQb3dlciBMaW1pdAogICAgRjFoICAgPiAyNTAg VyBhbmQg4omkIDI3NSBXIFNsb3QgUG93ZXIgTGltaXQKICAgIEYyaCAgID4gMjc1IFcgYW5kIOKJ pCAzMDAgVyBTbG90IFBvd2VyIExpbWl0CiAgICBGM2ggICA+IDMwMCBXIGFuZCDiiaQgMzI1IFcg U2xvdCBQb3dlciBMaW1pdAogICAgRjRoICAgPiAzMjUgVyBhbmQg4omkIDM1MCBXIFNsb3QgUG93 ZXIgTGltaXQKICAgIEY1aCAgID4gMzUwIFcgYW5kIOKJpCAzNzUgVyBTbG90IFBvd2VyIExpbWl0 CiAgICBGNmggICA+IDM3NSBXIGFuZCDiiaQgNDAwIFcgU2xvdCBQb3dlciBMaW1pdAogICAgRjdo ICAgPiA0MDAgVyBhbmQg4omkIDQyNSBXIFNsb3QgUG93ZXIgTGltaXQKICAgIEY4aCAgID4gNDI1 IFcgYW5kIOKJpCA0NTAgVyBTbG90IFBvd2VyIExpbWl0CiAgICBGOWggICA+IDQ1MCBXIGFuZCDi iaQgNDc1IFcgU2xvdCBQb3dlciBMaW1pdAogICAgRkFoICAgPiA0NzUgVyBhbmQg4omkIDUwMCBX IFNsb3QgUG93ZXIgTGltaXQKICAgIEZCaCAgID4gNTAwIFcgYW5kIOKJpCA1MjUgVyBTbG90IFBv d2VyIExpbWl0CiAgICBGQ2ggICA+IDUyNSBXIGFuZCDiiaQgNTUwIFcgU2xvdCBQb3dlciBMaW1p dAogICAgRkRoICAgPiA1NTAgVyBhbmQg4omkIDU3NSBXIFNsb3QgUG93ZXIgTGltaXQKICAgIEZF aCAgID4gNTc1IFcgYW5kIOKJpCA2MDAgVyBTbG90IFBvd2VyIExpbWl0CiAgICBGRmggICBSZXNl cnZlZCBmb3IgU2xvdCBQb3dlciBMaW1pdCBWYWx1ZXMgYWJvdmUgNjAwIFcKCiAgVGhpcyByZWdp c3RlciBtdXN0IGJlIGltcGxlbWVudGVkIGlmIHRoZSBTbG90IEltcGxlbWVudGVkIGJpdCBpcyBT ZXQuCgogIFdyaXRlcyB0byB0aGlzIHJlZ2lzdGVyIGFsc28gY2F1c2UgdGhlIFBvcnQgdG8gc2Vu ZCB0aGUKICBTZXRfU2xvdF9Qb3dlcl9MaW1pdCBNZXNzYWdlLgoKPiA+ID4gKwlpZiAoc2xvdF9w b3dlcl9saW1pdCA9PSAwKSB7Cj4gPiA+ICsJCXZhbHVlID0gMHgwMDsKPiA+ID4gKwkJc2NhbGUg PSAwOwo+ID4gPiArCX0gZWxzZSBpZiAoc2xvdF9wb3dlcl9saW1pdCA8PSAyNTUpIHsKPiA+ID4g KwkJdmFsdWUgPSBzbG90X3Bvd2VyX2xpbWl0Owo+ID4gPiArCQlzY2FsZSA9IDM7Cj4gPiA+ICsJ fSBlbHNlIGlmIChzbG90X3Bvd2VyX2xpbWl0IDw9IDI1NSoxMCkgewo+ID4gPiArCQl2YWx1ZSA9 IHNsb3RfcG93ZXJfbGltaXQgLyAxMDsKPiA+ID4gKwkJc2NhbGUgPSAyOwo+ID4gPiArCX0gZWxz ZSBpZiAoc2xvdF9wb3dlcl9saW1pdCA8PSAyNTUqMTAwKSB7Cj4gPiA+ICsJCXZhbHVlID0gc2xv dF9wb3dlcl9saW1pdCAvIDEwMDsKPiA+ID4gKwkJc2NhbGUgPSAxOwo+ID4gPiArCX0gZWxzZSBp ZiAoc2xvdF9wb3dlcl9saW1pdCA8PSAyMzkqMTAwMCkgewo+ID4gPiArCQl2YWx1ZSA9IHNsb3Rf cG93ZXJfbGltaXQgLyAxMDAwOwo+ID4gPiArCQlzY2FsZSA9IDA7Cj4gPiA+ICsJfSBlbHNlIGlm IChzbG90X3Bvd2VyX2xpbWl0IDw9IDI1MCoxMDAwKSB7Cj4gPiA+ICsJCXZhbHVlID0gMHhGMDsK PiA+ID4gKwkJc2NhbGUgPSAwOwo+ID4gPiArCX0gZWxzZSBpZiAoc2xvdF9wb3dlcl9saW1pdCA8 PSAyNzUqMTAwMCkgewo+ID4gPiArCQl2YWx1ZSA9IDB4RjE7Cj4gPiA+ICsJCXNjYWxlID0gMDsK PiA+ID4gKwl9IGVsc2Ugewo+ID4gPiArCQl2YWx1ZSA9IDB4RjI7Cj4gPiA+ICsJCXNjYWxlID0g MDsKPiA+ID4gKwl9Cj4gPiA+ICsKPiA+ID4gKwlpZiAoc2xvdF9wb3dlcl9saW1pdF92YWx1ZSkK PiA+ID4gKwkJKnNsb3RfcG93ZXJfbGltaXRfdmFsdWUgPSB2YWx1ZTsKPiA+ID4gKwo+ID4gPiAr CWlmIChzbG90X3Bvd2VyX2xpbWl0X3NjYWxlKQo+ID4gPiArCQkqc2xvdF9wb3dlcl9saW1pdF9z Y2FsZSA9IHNjYWxlOwo+ID4gPiArCj4gPiA+ICsJcmV0dXJuIHNsb3RfcG93ZXJfbGltaXQ7Cj4g PiAKPiA+IElmICJzbG90LXBvd2VyLWxpbWl0LW1pbGxpd2F0dCIgY29udGFpbnMgYSB2YWx1ZSBs YXJnZXIgdGhhbiBjYW4gYmUKPiA+IHJlcHJlc2VudGVkIGluICJ2YWx1ZSIgYW5kICJzY2FsZSIs IHRoZSByZXR1cm4gdmFsdWUgd2lsbCBub3QgYWdyZWUKPiA+IHdpdGggdmFsdWUvc2NhbGUsIHdp bGwgaXQ/Cj4gCj4gSW4gcHJldmlvdXMgdmVyc2lvbiAweEYyIHdhcyByZXNlcnZlZCBmb3IgdmFs dWVzIGFib3ZlIDI3NSBXLiBTbyBmb3IgbWUKPiBpdCBsb29rZWQgbGlrZSBhIGNvcnJlY3Qgc29s dXRpb24uCj4gCj4gPiBDdXJyZW50bHkgeW91IG9ubHkgdXNlIHRoZSByZXR1cm4gdmFsdWUgZm9y IGEgbG9nIG1lc3NhZ2UsIHNvIG5vIHJlYWwKPiA+IGhhcm0geWV0LCBvdGhlciB0aGFuIHRoZSBm YWN0IHRoYXQgd2UgbWlnaHQgcHJpbnQgIlNsb3QgcG93ZXIgbGltaXQKPiA+IDEwMDAuMFciIHdo ZW4gdGhlIGhhcmR3YXJlIHdpbGwgb25seSBhZHZlcnRpc2UgNjAwVyBhdmFpbGFibGUuCj4gPiAK PiA+IEFsc28sIGlmICJzbG90LXBvd2VyLWxpbWl0LW1pbGxpd2F0dCIgY29udGFpbnMgc29tZXRo aW5nIGxpa2UKPiA+IDI2MDAwMCBtVyAoMjYwIFcpLCB3ZSdsbCByZXR1cm4gMHhGMS8wLCBzbyB0 aGUgaGFyZHdhcmUgd2lsbAo+ID4gYWR2ZXJ0aXNlIDI3NSBXIGF2YWlsYWJsZS4KPiAKPiBUaGVy ZSBpcyBubyB3YXkgaG93IHRvIGVuY29kZSAyNjAgVy4gSXQgaXMgcG9zc2libGUgb25seSAyNTAg VyBvciAyNzUgVywKPiBhbmQgbm90aGluZyBiZXR3ZWVuLiBJIGNob3NlIHRvIHJvdW5kIHZhbHVl IHRvIHVwcGVyIGxpbWl0LiBXaGF0IGRvIHlvdQo+IHByZWZlciBpbiB0aGVzZSBjYXNlcz8gVXBw ZXIgb3IgbG93ZXIgbGltaXQ/CgpJIHRoaW5rIHJvdW5kaW5nIGRvd24gaXMgYmV0dGVyLiAgSWYg d2Ugcm91bmQgdXAsIHRoZSBzbG90IHdpbGwKYWR2ZXJ0aXNlIG1vcmUgcG93ZXIgdGhhbiBpdCBj YW4gZGVsaXZlciwgYW5kIGlmIHRoZSBkZXZpY2UgdHJpZXMgdG8KY29uc3VtZSB0aGUgYW1vdW50 IG9mIHBvd2VyIGFkdmVydGlzZWQsIGl0IG1heSBub3Qgd29yayByZWxpYWJseS4KClNvIEkgdGhp bmsgd2Ugc2hvdWxkIHJldHVybiBlbmNvZGVkIHZhbHVlcyB0aGF0IGFyZSBubyBoaWdoZXIgdGhh bgp3aGF0IHRoZSBzbG90IGNhbiBhY3R1YWxseSBkZWxpdmVyLCBhbmQgdGhlIHJldHVybiB2YWx1 ZSBzaG91bGQgbWF0Y2gKd2hhdCBTbG90IENhcGFiaWxpdGllcyBhZHZlcnRpc2VzLgoKQmpvcm4K Cl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFy bS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9y ZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1r ZXJuZWwK