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 BE36AC433F5 for ; Sun, 20 Feb 2022 19:34:17 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S244641AbiBTTeh (ORCPT ); Sun, 20 Feb 2022 14:34:37 -0500 Received: from mxb-00190b01.gslb.pphosted.com ([23.128.96.19]:43430 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S244643AbiBTTeh (ORCPT ); Sun, 20 Feb 2022 14:34:37 -0500 Received: from dfw.source.kernel.org (dfw.source.kernel.org [IPv6:2604:1380:4641:c500::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E50CF4506C for ; Sun, 20 Feb 2022 11:34:15 -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 83ACE60EEA for ; Sun, 20 Feb 2022 19:34:15 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 0CF3BC340E8; Sun, 20 Feb 2022 19:34:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1645385654; bh=7h3W9B9eLxBn5b74pDBdseC44aHli3LklZPHMN+oRG0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=j1MCRfp1HRv+2shtk2BkDavzpiTbUKLMnRIllOKpIemDcDy9IXmpXXVBY9VTzTXrO SVxhai23gxMKh7iNz6MxL4H3VcNNABjXA/Sf4Nw1KsJ6BNXxYVNkl5PPhxJVxuy1/q DzMbb5TUK7xRJphYqRV5SFyJUzlyrEekPutGlUDIxoNa2L8TDqvzKq3Hr0pRxAllc3 v/Ox+4oCRK2BgFdKjZLMvXUvXYpvqqArX/zzgP8cGgOs4bmf6Zca1M5/m8hxl98a3Z TvQyT3wGOmzQ36ztMgjg3J9oaka5jfP9b2fqVr7m0rMw1JblAhk7yXqbyvyrjQD0t9 E8CaeZEwRiiKQ== From: =?UTF-8?q?Marek=20Beh=C3=BAn?= To: Lorenzo Pieralisi , Bjorn Helgaas Cc: =?UTF-8?q?Krzysztof=20Wilczy=C5=84ski?= , Marc Zyngier , pali@kernel.org, linux-pci@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Gregory CLEMENT , =?UTF-8?q?Marek=20Beh=C3=BAn?= Subject: [PATCH 10/18] PCI: Add function for parsing `slot-power-limit-milliwatt` DT property Date: Sun, 20 Feb 2022 20:33:38 +0100 Message-Id: <20220220193346.23789-11-kabel@kernel.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220220193346.23789-1-kabel@kernel.org> References: <20220220193346.23789-1-kabel@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org From: Pali Rohár 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; + 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 */ + 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; +} +EXPORT_SYMBOL_GPL(of_pci_get_slot_power_limit); diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h index 3d60cabde1a1..e10cdec6c56e 100644 --- a/drivers/pci/pci.h +++ b/drivers/pci/pci.h @@ -627,6 +627,9 @@ struct device_node; int of_pci_parse_bus_range(struct device_node *node, struct resource *res); int of_get_pci_domain_nr(struct device_node *node); int of_pci_get_max_link_speed(struct device_node *node); +u32 of_pci_get_slot_power_limit(struct device_node *node, + u8 *slot_power_limit_value, + u8 *slot_power_limit_scale); void pci_set_of_node(struct pci_dev *dev); void pci_release_of_node(struct pci_dev *dev); void pci_set_bus_of_node(struct pci_bus *bus); @@ -653,6 +656,18 @@ of_pci_get_max_link_speed(struct device_node *node) return -EINVAL; } +static inline u32 +of_pci_get_slot_power_limit(struct device_node *node, + u8 *slot_power_limit_value, + u8 *slot_power_limit_scale) +{ + if (slot_power_limit_value) + *slot_power_limit_value = 0; + if (slot_power_limit_scale) + *slot_power_limit_scale = 0; + return 0; +} + static inline void pci_set_of_node(struct pci_dev *dev) { } static inline void pci_release_of_node(struct pci_dev *dev) { } static inline void pci_set_bus_of_node(struct pci_bus *bus) { } -- 2.34.1 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from 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 6B27BC433F5 for ; Sun, 20 Feb 2022 19:38:39 +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:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=dOSQtFqteTMc4BvKIQe7JHPqTpEcw4sTGrq3TbwAYtk=; b=1958ukqeOfBpIg sK97XViAGDic1IRNDci1myp2W0nphBZExBOvy7LxIePvrMAQ2AH7Wc0gOFJq3IN/ZarrSn6dcQcYf m9oFYX/NQ/ssA4ukmbQ/vpLA3s2aYSmyPNeOCbjApH2T+cxTwDNn4lEOmbz9Ar8TgL+qmFu50BiCs Rv/IT6E3zUkuSyLp0YLCrm44Icf3aIwoVu025FxhNktuz84Ep2Dx6DFj2/z7pa/AmMc34np7CketL AdPPWOH4U8RbOqS6u+TKrhoos73o+E3TD5p+6KVi48GsPgT+CzXfaofnJjuuuy3//QHDURiftpscE IZTr6z3br6ibpwASvmGA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1nLs17-002CfZ-Ld; Sun, 20 Feb 2022 19:37:11 +0000 Received: from ams.source.kernel.org ([2604:1380:4601:e00::1]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1nLryK-002BFS-Gd for linux-arm-kernel@lists.infradead.org; Sun, 20 Feb 2022 19:34:18 +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 ams.source.kernel.org (Postfix) with ESMTPS id 3E04BB80DC3; Sun, 20 Feb 2022 19:34:15 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 0CF3BC340E8; Sun, 20 Feb 2022 19:34:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1645385654; bh=7h3W9B9eLxBn5b74pDBdseC44aHli3LklZPHMN+oRG0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=j1MCRfp1HRv+2shtk2BkDavzpiTbUKLMnRIllOKpIemDcDy9IXmpXXVBY9VTzTXrO SVxhai23gxMKh7iNz6MxL4H3VcNNABjXA/Sf4Nw1KsJ6BNXxYVNkl5PPhxJVxuy1/q DzMbb5TUK7xRJphYqRV5SFyJUzlyrEekPutGlUDIxoNa2L8TDqvzKq3Hr0pRxAllc3 v/Ox+4oCRK2BgFdKjZLMvXUvXYpvqqArX/zzgP8cGgOs4bmf6Zca1M5/m8hxl98a3Z TvQyT3wGOmzQ36ztMgjg3J9oaka5jfP9b2fqVr7m0rMw1JblAhk7yXqbyvyrjQD0t9 E8CaeZEwRiiKQ== From: =?UTF-8?q?Marek=20Beh=C3=BAn?= To: Lorenzo Pieralisi , Bjorn Helgaas Cc: =?UTF-8?q?Krzysztof=20Wilczy=C5=84ski?= , Marc Zyngier , pali@kernel.org, linux-pci@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Gregory CLEMENT , =?UTF-8?q?Marek=20Beh=C3=BAn?= Subject: [PATCH 10/18] PCI: Add function for parsing `slot-power-limit-milliwatt` DT property Date: Sun, 20 Feb 2022 20:33:38 +0100 Message-Id: <20220220193346.23789-11-kabel@kernel.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220220193346.23789-1-kabel@kernel.org> References: <20220220193346.23789-1-kabel@kernel.org> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220220_113416_891322_BBF9576A X-CRM114-Status: GOOD ( 16.04 ) 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 RnJvbTogUGFsaSBSb2jDoXIgPHBhbGlAa2VybmVsLm9yZz4KCkFkZCBmdW5jdGlvbiBvZl9wY2lf Z2V0X3Nsb3RfcG93ZXJfbGltaXQoKSwgd2hpY2ggcGFyc2VzIHRoZQpgc2xvdC1wb3dlci1saW1p dC1taWxsaXdhdHRgIERUIHByb3BlcnR5LCByZXR1cm5pbmcgdGhlIHZhbHVlIGluCm1pbGxpd2F0 dHMgYW5kIGluIGZvcm1hdCByZWFkeSBmb3IgdGhlIFBDSWUgU2xvdCBDYXBhYmlsaXRpZXMgUmVn aXN0ZXIuCgpTaWduZWQtb2ZmLWJ5OiBQYWxpIFJvaMOhciA8cGFsaUBrZXJuZWwub3JnPgpTaWdu ZWQtb2ZmLWJ5OiBNYXJlayBCZWjDum4gPGthYmVsQGtlcm5lbC5vcmc+ClJldmlld2VkLWJ5OiBS b2IgSGVycmluZyA8cm9iaEBrZXJuZWwub3JnPgpBY2tlZC1ieTogQmpvcm4gSGVsZ2FhcyA8Ymhl bGdhYXNAZ29vZ2xlLmNvbT4KLS0tCiBkcml2ZXJzL3BjaS9vZi5jICB8IDY0ICsrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiBkcml2ZXJzL3BjaS9wY2kuaCB8 IDE1ICsrKysrKysrKysrCiAyIGZpbGVzIGNoYW5nZWQsIDc5IGluc2VydGlvbnMoKykKCmRpZmYg LS1naXQgYS9kcml2ZXJzL3BjaS9vZi5jIGIvZHJpdmVycy9wY2kvb2YuYwppbmRleCBjYjJlODM1 MWMyY2MuLjJiMGMwYTM2NDFhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvb2YuYworKysgYi9k cml2ZXJzL3BjaS9vZi5jCkBAIC02MzMsMyArNjMzLDY3IEBAIGludCBvZl9wY2lfZ2V0X21heF9s aW5rX3NwZWVkKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKIAlyZXR1cm4gbWF4X2xpbmtfc3Bl ZWQ7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChvZl9wY2lfZ2V0X21heF9saW5rX3NwZWVkKTsKKwor LyoqCisgKiBvZl9wY2lfZ2V0X3Nsb3RfcG93ZXJfbGltaXQgLSBQYXJzZXMgdGhlICJzbG90LXBv d2VyLWxpbWl0LW1pbGxpd2F0dCIKKyAqCQkJCSBwcm9wZXJ0eS4KKyAqCisgKiBAbm9kZTogZGV2 aWNlIHRyZWUgbm9kZSB3aXRoIHRoZSBzbG90IHBvd2VyIGxpbWl0IGluZm9ybWF0aW9uCisgKiBA c2xvdF9wb3dlcl9saW1pdF92YWx1ZTogcG9pbnRlciB3aGVyZSB0aGUgdmFsdWUgc2hvdWxkIGJl IHN0b3JlZCBpbiBQQ0llCisgKgkJCSAgICBTbG90IENhcGFiaWxpdGllcyBSZWdpc3RlciBmb3Jt YXQKKyAqIEBzbG90X3Bvd2VyX2xpbWl0X3NjYWxlOiBwb2ludGVyIHdoZXJlIHRoZSBzY2FsZSBz aG91bGQgYmUgc3RvcmVkIGluIFBDSWUKKyAqCQkJICAgIFNsb3QgQ2FwYWJpbGl0aWVzIFJlZ2lz dGVyIGZvcm1hdAorICoKKyAqIFJldHVybnMgdGhlIHNsb3QgcG93ZXIgbGltaXQgaW4gbWlsbGl3 YXR0cyBhbmQgaWYgQHNsb3RfcG93ZXJfbGltaXRfdmFsdWUKKyAqIGFuZCBAc2xvdF9wb3dlcl9s aW1pdF9zY2FsZSBwb2ludGVycyBhcmUgbm9uLU5VTEwsIGZpbGxzIGluIHRoZSB2YWx1ZSBhbmQK KyAqIHNjYWxlIGluIGZvcm1hdCB1c2VkIGJ5IFBDSWUgU2xvdCBDYXBhYmlsaXRpZXMgUmVnaXN0 ZXIuCisgKgorICogSWYgdGhlIHByb3BlcnR5IGlzIG5vdCBmb3VuZCBvciBpcyBpbnZhbGlkLCBy ZXR1cm5zIDAuCisgKi8KK3UzMiBvZl9wY2lfZ2V0X3Nsb3RfcG93ZXJfbGltaXQoc3RydWN0IGRl dmljZV9ub2RlICpub2RlLAorCQkJCXU4ICpzbG90X3Bvd2VyX2xpbWl0X3ZhbHVlLAorCQkJCXU4 ICpzbG90X3Bvd2VyX2xpbWl0X3NjYWxlKQoreworCXUzMiBzbG90X3Bvd2VyX2xpbWl0OworCXU4 IHZhbHVlLCBzY2FsZTsKKworCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihub2RlLCAic2xvdC1w b3dlci1saW1pdC1taWxsaXdhdHQiLAorCQkJCSAmc2xvdF9wb3dlcl9saW1pdCkpCisJCXNsb3Rf cG93ZXJfbGltaXQgPSAwOworCisJLyogQ2FsY3VsYXRlIFNsb3QgUG93ZXIgTGltaXQgVmFsdWUg YW5kIFNsb3QgUG93ZXIgTGltaXQgU2NhbGUgKi8KKwlpZiAoc2xvdF9wb3dlcl9saW1pdCA9PSAw KSB7CisJCXZhbHVlID0gMHgwMDsKKwkJc2NhbGUgPSAwOworCX0gZWxzZSBpZiAoc2xvdF9wb3dl cl9saW1pdCA8PSAyNTUpIHsKKwkJdmFsdWUgPSBzbG90X3Bvd2VyX2xpbWl0OworCQlzY2FsZSA9 IDM7CisJfSBlbHNlIGlmIChzbG90X3Bvd2VyX2xpbWl0IDw9IDI1NSoxMCkgeworCQl2YWx1ZSA9 IHNsb3RfcG93ZXJfbGltaXQgLyAxMDsKKwkJc2NhbGUgPSAyOworCX0gZWxzZSBpZiAoc2xvdF9w b3dlcl9saW1pdCA8PSAyNTUqMTAwKSB7CisJCXZhbHVlID0gc2xvdF9wb3dlcl9saW1pdCAvIDEw MDsKKwkJc2NhbGUgPSAxOworCX0gZWxzZSBpZiAoc2xvdF9wb3dlcl9saW1pdCA8PSAyMzkqMTAw MCkgeworCQl2YWx1ZSA9IHNsb3RfcG93ZXJfbGltaXQgLyAxMDAwOworCQlzY2FsZSA9IDA7CisJ fSBlbHNlIGlmIChzbG90X3Bvd2VyX2xpbWl0IDw9IDI1MCoxMDAwKSB7CisJCXZhbHVlID0gMHhG MDsKKwkJc2NhbGUgPSAwOworCX0gZWxzZSBpZiAoc2xvdF9wb3dlcl9saW1pdCA8PSAyNzUqMTAw MCkgeworCQl2YWx1ZSA9IDB4RjE7CisJCXNjYWxlID0gMDsKKwl9IGVsc2UgeworCQl2YWx1ZSA9 IDB4RjI7CisJCXNjYWxlID0gMDsKKwl9CisKKwlpZiAoc2xvdF9wb3dlcl9saW1pdF92YWx1ZSkK KwkJKnNsb3RfcG93ZXJfbGltaXRfdmFsdWUgPSB2YWx1ZTsKKworCWlmIChzbG90X3Bvd2VyX2xp bWl0X3NjYWxlKQorCQkqc2xvdF9wb3dlcl9saW1pdF9zY2FsZSA9IHNjYWxlOworCisJcmV0dXJu IHNsb3RfcG93ZXJfbGltaXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChvZl9wY2lfZ2V0X3Nsb3Rf cG93ZXJfbGltaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpLmggYi9kcml2ZXJzL3Bj aS9wY2kuaAppbmRleCAzZDYwY2FiZGUxYTEuLmUxMGNkZWM2YzU2ZSAxMDA2NDQKLS0tIGEvZHJp dmVycy9wY2kvcGNpLmgKKysrIGIvZHJpdmVycy9wY2kvcGNpLmgKQEAgLTYyNyw2ICs2MjcsOSBA QCBzdHJ1Y3QgZGV2aWNlX25vZGU7CiBpbnQgb2ZfcGNpX3BhcnNlX2J1c19yYW5nZShzdHJ1Y3Qg ZGV2aWNlX25vZGUgKm5vZGUsIHN0cnVjdCByZXNvdXJjZSAqcmVzKTsKIGludCBvZl9nZXRfcGNp X2RvbWFpbl9ucihzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpOwogaW50IG9mX3BjaV9nZXRfbWF4 X2xpbmtfc3BlZWQoc3RydWN0IGRldmljZV9ub2RlICpub2RlKTsKK3UzMiBvZl9wY2lfZ2V0X3Ns b3RfcG93ZXJfbGltaXQoc3RydWN0IGRldmljZV9ub2RlICpub2RlLAorCQkJCXU4ICpzbG90X3Bv d2VyX2xpbWl0X3ZhbHVlLAorCQkJCXU4ICpzbG90X3Bvd2VyX2xpbWl0X3NjYWxlKTsKIHZvaWQg cGNpX3NldF9vZl9ub2RlKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogdm9pZCBwY2lfcmVsZWFzZV9v Zl9ub2RlKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogdm9pZCBwY2lfc2V0X2J1c19vZl9ub2RlKHN0 cnVjdCBwY2lfYnVzICpidXMpOwpAQCAtNjUzLDYgKzY1NiwxOCBAQCBvZl9wY2lfZ2V0X21heF9s aW5rX3NwZWVkKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKIAlyZXR1cm4gLUVJTlZBTDsKIH0K IAorc3RhdGljIGlubGluZSB1MzIKK29mX3BjaV9nZXRfc2xvdF9wb3dlcl9saW1pdChzdHJ1Y3Qg ZGV2aWNlX25vZGUgKm5vZGUsCisJCQkgICAgdTggKnNsb3RfcG93ZXJfbGltaXRfdmFsdWUsCisJ CQkgICAgdTggKnNsb3RfcG93ZXJfbGltaXRfc2NhbGUpCit7CisJaWYgKHNsb3RfcG93ZXJfbGlt aXRfdmFsdWUpCisJCSpzbG90X3Bvd2VyX2xpbWl0X3ZhbHVlID0gMDsKKwlpZiAoc2xvdF9wb3dl cl9saW1pdF9zY2FsZSkKKwkJKnNsb3RfcG93ZXJfbGltaXRfc2NhbGUgPSAwOworCXJldHVybiAw OworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgcGNpX3NldF9vZl9ub2RlKHN0cnVjdCBwY2lfZGV2 ICpkZXYpIHsgfQogc3RhdGljIGlubGluZSB2b2lkIHBjaV9yZWxlYXNlX29mX25vZGUoc3RydWN0 IHBjaV9kZXYgKmRldikgeyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgcGNpX3NldF9idXNfb2Zfbm9k ZShzdHJ1Y3QgcGNpX2J1cyAqYnVzKSB7IH0KLS0gCjIuMzQuMQoKCl9fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBs aXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5m cmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK