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 DE325C4332F for ; Tue, 22 Feb 2022 15:51:47 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233700AbiBVPwL (ORCPT ); Tue, 22 Feb 2022 10:52:11 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42674 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233693AbiBVPwJ (ORCPT ); Tue, 22 Feb 2022 10:52:09 -0500 Received: from ams.source.kernel.org (ams.source.kernel.org [IPv6:2604:1380:4601:e00::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6BF2E26556; Tue, 22 Feb 2022 07:51:40 -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 ams.source.kernel.org (Postfix) with ESMTPS id D0BC0B81B2C; Tue, 22 Feb 2022 15:51:38 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2E900C340F4; Tue, 22 Feb 2022 15:51:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1645545097; bh=7cddUZYpHlXDq113Rsd/wugdaYv8c+/WYPhY53D2cdo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=DhNAmgsdNQVXXwepI38JSbjP1gSIIpk/OI64MnULsaQJv+USclHW9Q2dnFs6wNLfW T8+SaIpJvdEMBU7nqtlOJ5WA4N4QgbcPRfwu0viVbV1/1CMJ3deZqIVZdRUxPoCpAf SQ3gHc++vEkOcV7YDLLt2ZqaXNwA138de82AjXDgfUj3JXNe9tzW0psml9fE8T8HWK HUNIF43bQ/w3LricLj5zip+P9rGBVOhLTVGCwle8LsDTqdl1oSBvIcy46w6gTRlC2U r99duOefjZJtP3GDJxGYQh87RgaTrRtt2BFJ6wCxtOt0nPaVYTOmvWpuwIvcsqLoCx ayPbGSyfXj9FQ== Received: by pali.im (Postfix) id 25DB83FAC; Tue, 22 Feb 2022 16:51:35 +0100 (CET) From: =?UTF-8?q?Pali=20Roh=C3=A1r?= To: Lorenzo Pieralisi , Bjorn Helgaas , Rob Herring , Thomas Petazzoni , =?UTF-8?q?Krzysztof=20Wilczy=C5=84ski?= , =?UTF-8?q?Marek=20Beh=C3=BAn?= , Russell King Cc: linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: [PATCH v4 02/12] PCI: pci-bridge-emul: Add support for PCIe extended capabilities Date: Tue, 22 Feb 2022 16:50:20 +0100 Message-Id: <20220222155030.988-3-pali@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20220222155030.988-1-pali@kernel.org> References: <20220222155030.988-1-pali@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: Russell King Add support for PCIe extended capabilities, which we just redirect to the emulating driver. Signed-off-by: Russell King [pali: Fix writing new value with W1C bits] Signed-off-by: Pali Rohár Signed-off-by: Marek Behún --- drivers/pci/pci-bridge-emul.c | 77 +++++++++++++++++++++++------------ drivers/pci/pci-bridge-emul.h | 15 +++++++ 2 files changed, 67 insertions(+), 25 deletions(-) diff --git a/drivers/pci/pci-bridge-emul.c b/drivers/pci/pci-bridge-emul.c index a956408834d6..c4b9837006ff 100644 --- a/drivers/pci/pci-bridge-emul.c +++ b/drivers/pci/pci-bridge-emul.c @@ -437,10 +437,16 @@ int pci_bridge_emul_conf_read(struct pci_bridge_emul *bridge, int where, read_op = bridge->ops->read_pcie; cfgspace = (__le32 *) &bridge->pcie_conf; behavior = bridge->pcie_cap_regs_behavior; - } else { - /* Beyond our PCIe space */ + } else if (reg < PCI_CFG_SPACE_SIZE) { + /* Rest of PCI space not implemented */ *value = 0; return PCIBIOS_SUCCESSFUL; + } else { + /* PCIe extended capability space */ + reg -= PCI_CFG_SPACE_SIZE; + read_op = bridge->ops->read_ext; + cfgspace = NULL; + behavior = NULL; } if (read_op) @@ -448,15 +454,20 @@ int pci_bridge_emul_conf_read(struct pci_bridge_emul *bridge, int where, else ret = PCI_BRIDGE_EMUL_NOT_HANDLED; - if (ret == PCI_BRIDGE_EMUL_NOT_HANDLED) - *value = le32_to_cpu(cfgspace[reg / 4]); + if (ret == PCI_BRIDGE_EMUL_NOT_HANDLED) { + if (cfgspace) + *value = le32_to_cpu(cfgspace[reg / 4]); + else + *value = 0; + } /* * Make sure we never return any reserved bit with a value * different from 0. */ - *value &= behavior[reg / 4].ro | behavior[reg / 4].rw | - behavior[reg / 4].w1c; + if (behavior) + *value &= behavior[reg / 4].ro | behavior[reg / 4].rw | + behavior[reg / 4].w1c; if (size == 1) *value = (*value >> (8 * (where & 3))) & 0xff; @@ -502,8 +513,15 @@ int pci_bridge_emul_conf_write(struct pci_bridge_emul *bridge, int where, write_op = bridge->ops->write_pcie; cfgspace = (__le32 *) &bridge->pcie_conf; behavior = bridge->pcie_cap_regs_behavior; - } else { + } else if (reg < PCI_CFG_SPACE_SIZE) { + /* Rest of PCI space not implemented */ return PCIBIOS_SUCCESSFUL; + } else { + /* PCIe extended capability space */ + reg -= PCI_CFG_SPACE_SIZE; + write_op = bridge->ops->write_ext; + cfgspace = NULL; + behavior = NULL; } shift = (where & 0x3) * 8; @@ -517,29 +535,38 @@ int pci_bridge_emul_conf_write(struct pci_bridge_emul *bridge, int where, else return PCIBIOS_BAD_REGISTER_NUMBER; - /* Keep all bits, except the RW bits */ - new = old & (~mask | ~behavior[reg / 4].rw); + if (behavior) { + /* Keep all bits, except the RW bits */ + new = old & (~mask | ~behavior[reg / 4].rw); - /* Update the value of the RW bits */ - new |= (value << shift) & (behavior[reg / 4].rw & mask); + /* Update the value of the RW bits */ + new |= (value << shift) & (behavior[reg / 4].rw & mask); - /* Clear the W1C bits */ - new &= ~((value << shift) & (behavior[reg / 4].w1c & mask)); + /* Clear the W1C bits */ + new &= ~((value << shift) & (behavior[reg / 4].w1c & mask)); + } else { + new = old & ~mask; + new |= (value << shift) & mask; + } - /* Save the new value with the cleared W1C bits into the cfgspace */ - cfgspace[reg / 4] = cpu_to_le32(new); + if (cfgspace) { + /* Save the new value with the cleared W1C bits into the cfgspace */ + cfgspace[reg / 4] = cpu_to_le32(new); + } - /* - * Clear the W1C bits not specified by the write mask, so that the - * write_op() does not clear them. - */ - new &= ~(behavior[reg / 4].w1c & ~mask); + if (behavior) { + /* + * Clear the W1C bits not specified by the write mask, so that the + * write_op() does not clear them. + */ + new &= ~(behavior[reg / 4].w1c & ~mask); - /* - * Set the W1C bits specified by the write mask, so that write_op() - * knows about that they are to be cleared. - */ - new |= (value << shift) & (behavior[reg / 4].w1c & mask); + /* + * Set the W1C bits specified by the write mask, so that write_op() + * knows about that they are to be cleared. + */ + new |= (value << shift) & (behavior[reg / 4].w1c & mask); + } if (write_op) write_op(bridge, reg, old, new, mask); diff --git a/drivers/pci/pci-bridge-emul.h b/drivers/pci/pci-bridge-emul.h index 4953274cac18..6b5f75b2ad02 100644 --- a/drivers/pci/pci-bridge-emul.h +++ b/drivers/pci/pci-bridge-emul.h @@ -90,6 +90,14 @@ struct pci_bridge_emul_ops { */ pci_bridge_emul_read_status_t (*read_pcie)(struct pci_bridge_emul *bridge, int reg, u32 *value); + + /* + * Same as ->read_base(), except it is for reading from the + * PCIe extended capability configuration space. + */ + pci_bridge_emul_read_status_t (*read_ext)(struct pci_bridge_emul *bridge, + int reg, u32 *value); + /* * Called when writing to the regular PCI bridge configuration * space. old is the current value, new is the new value being @@ -105,6 +113,13 @@ struct pci_bridge_emul_ops { */ void (*write_pcie)(struct pci_bridge_emul *bridge, int reg, u32 old, u32 new, u32 mask); + + /* + * Same as ->write_base(), except it is for writing from the + * PCIe extended capability configuration space. + */ + void (*write_ext)(struct pci_bridge_emul *bridge, int reg, + u32 old, u32 new, u32 mask); }; struct pci_bridge_reg_behavior; -- 2.20.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 01662C433F5 for ; Tue, 22 Feb 2022 15:53:52 +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=P9upAUAEMqFnjsAVtB4088IQa/e53pjUNygPju1dszk=; b=m42zCFdxLMAJWz 6G2NZslfU+mrTjiU6LqIov5WSoPAGBcJWeKJeqFBWLVMrDdLoekcXCJFmxTh9W8SooL50J4d56vwb Y8tZbjwiYSv8suRQ6WZV/5J6iUdv/4vhVOvx0Tnb7JzBYGTfVpolfegq9TswGn2hnLuVEmsHwmwT6 UY4A6i/M6xPrnAxFPF0Fb6dRhqAaCgONN1idKJng6/iavODgrBYDLMEfiIBETspJy9co88DbKy0vv iQtb7059gh3wtW3rn3oMWCJEKqDN8B7vi9KGgENHaWFmWveeb9tuVh3FlSQXMJj77uIPZ2GmNXiES f4uNGvGy7SbJpjU9ohPQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1nMXSs-00AQ7k-MX; Tue, 22 Feb 2022 15:52:34 +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 1nMXRy-00APcg-5w for linux-arm-kernel@lists.infradead.org; Tue, 22 Feb 2022 15:51:41 +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 A8C18616B3; Tue, 22 Feb 2022 15:51:37 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2E900C340F4; Tue, 22 Feb 2022 15:51:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1645545097; bh=7cddUZYpHlXDq113Rsd/wugdaYv8c+/WYPhY53D2cdo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=DhNAmgsdNQVXXwepI38JSbjP1gSIIpk/OI64MnULsaQJv+USclHW9Q2dnFs6wNLfW T8+SaIpJvdEMBU7nqtlOJ5WA4N4QgbcPRfwu0viVbV1/1CMJ3deZqIVZdRUxPoCpAf SQ3gHc++vEkOcV7YDLLt2ZqaXNwA138de82AjXDgfUj3JXNe9tzW0psml9fE8T8HWK HUNIF43bQ/w3LricLj5zip+P9rGBVOhLTVGCwle8LsDTqdl1oSBvIcy46w6gTRlC2U r99duOefjZJtP3GDJxGYQh87RgaTrRtt2BFJ6wCxtOt0nPaVYTOmvWpuwIvcsqLoCx ayPbGSyfXj9FQ== Received: by pali.im (Postfix) id 25DB83FAC; Tue, 22 Feb 2022 16:51:35 +0100 (CET) From: =?UTF-8?q?Pali=20Roh=C3=A1r?= To: Lorenzo Pieralisi , Bjorn Helgaas , Rob Herring , Thomas Petazzoni , =?UTF-8?q?Krzysztof=20Wilczy=C5=84ski?= , =?UTF-8?q?Marek=20Beh=C3=BAn?= , Russell King Cc: linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: [PATCH v4 02/12] PCI: pci-bridge-emul: Add support for PCIe extended capabilities Date: Tue, 22 Feb 2022 16:50:20 +0100 Message-Id: <20220222155030.988-3-pali@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20220222155030.988-1-pali@kernel.org> References: <20220222155030.988-1-pali@kernel.org> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220222_075138_409236_5B923C14 X-CRM114-Status: GOOD ( 22.70 ) 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 RnJvbTogUnVzc2VsbCBLaW5nIDxybWsra2VybmVsQGFybWxpbnV4Lm9yZy51az4KCkFkZCBzdXBw b3J0IGZvciBQQ0llIGV4dGVuZGVkIGNhcGFiaWxpdGllcywgd2hpY2ggd2UganVzdCByZWRpcmVj dCB0byB0aGUKZW11bGF0aW5nIGRyaXZlci4KClNpZ25lZC1vZmYtYnk6IFJ1c3NlbGwgS2luZyA8 cm1rK2tlcm5lbEBhcm1saW51eC5vcmcudWs+CltwYWxpOiBGaXggd3JpdGluZyBuZXcgdmFsdWUg d2l0aCBXMUMgYml0c10KU2lnbmVkLW9mZi1ieTogUGFsaSBSb2jDoXIgPHBhbGlAa2VybmVsLm9y Zz4KU2lnbmVkLW9mZi1ieTogTWFyZWsgQmVow7puIDxrYWJlbEBrZXJuZWwub3JnPgotLS0KIGRy aXZlcnMvcGNpL3BjaS1icmlkZ2UtZW11bC5jIHwgNzcgKysrKysrKysrKysrKysrKysrKysrKyst LS0tLS0tLS0tLS0KIGRyaXZlcnMvcGNpL3BjaS1icmlkZ2UtZW11bC5oIHwgMTUgKysrKysrKwog MiBmaWxlcyBjaGFuZ2VkLCA2NyBpbnNlcnRpb25zKCspLCAyNSBkZWxldGlvbnMoLSkKCmRpZmYg LS1naXQgYS9kcml2ZXJzL3BjaS9wY2ktYnJpZGdlLWVtdWwuYyBiL2RyaXZlcnMvcGNpL3BjaS1i cmlkZ2UtZW11bC5jCmluZGV4IGE5NTY0MDg4MzRkNi4uYzRiOTgzNzAwNmZmIDEwMDY0NAotLS0g YS9kcml2ZXJzL3BjaS9wY2ktYnJpZGdlLWVtdWwuYworKysgYi9kcml2ZXJzL3BjaS9wY2ktYnJp ZGdlLWVtdWwuYwpAQCAtNDM3LDEwICs0MzcsMTYgQEAgaW50IHBjaV9icmlkZ2VfZW11bF9jb25m X3JlYWQoc3RydWN0IHBjaV9icmlkZ2VfZW11bCAqYnJpZGdlLCBpbnQgd2hlcmUsCiAJCXJlYWRf b3AgPSBicmlkZ2UtPm9wcy0+cmVhZF9wY2llOwogCQljZmdzcGFjZSA9IChfX2xlMzIgKikgJmJy aWRnZS0+cGNpZV9jb25mOwogCQliZWhhdmlvciA9IGJyaWRnZS0+cGNpZV9jYXBfcmVnc19iZWhh dmlvcjsKLQl9IGVsc2UgewotCQkvKiBCZXlvbmQgb3VyIFBDSWUgc3BhY2UgKi8KKwl9IGVsc2Ug aWYgKHJlZyA8IFBDSV9DRkdfU1BBQ0VfU0laRSkgeworCQkvKiBSZXN0IG9mIFBDSSBzcGFjZSBu b3QgaW1wbGVtZW50ZWQgKi8KIAkJKnZhbHVlID0gMDsKIAkJcmV0dXJuIFBDSUJJT1NfU1VDQ0VT U0ZVTDsKKwl9IGVsc2UgeworCQkvKiBQQ0llIGV4dGVuZGVkIGNhcGFiaWxpdHkgc3BhY2UgKi8K KwkJcmVnIC09IFBDSV9DRkdfU1BBQ0VfU0laRTsKKwkJcmVhZF9vcCA9IGJyaWRnZS0+b3BzLT5y ZWFkX2V4dDsKKwkJY2Znc3BhY2UgPSBOVUxMOworCQliZWhhdmlvciA9IE5VTEw7CiAJfQogCiAJ aWYgKHJlYWRfb3ApCkBAIC00NDgsMTUgKzQ1NCwyMCBAQCBpbnQgcGNpX2JyaWRnZV9lbXVsX2Nv bmZfcmVhZChzdHJ1Y3QgcGNpX2JyaWRnZV9lbXVsICpicmlkZ2UsIGludCB3aGVyZSwKIAllbHNl CiAJCXJldCA9IFBDSV9CUklER0VfRU1VTF9OT1RfSEFORExFRDsKIAotCWlmIChyZXQgPT0gUENJ X0JSSURHRV9FTVVMX05PVF9IQU5ETEVEKQotCQkqdmFsdWUgPSBsZTMyX3RvX2NwdShjZmdzcGFj ZVtyZWcgLyA0XSk7CisJaWYgKHJldCA9PSBQQ0lfQlJJREdFX0VNVUxfTk9UX0hBTkRMRUQpIHsK KwkJaWYgKGNmZ3NwYWNlKQorCQkJKnZhbHVlID0gbGUzMl90b19jcHUoY2Znc3BhY2VbcmVnIC8g NF0pOworCQllbHNlCisJCQkqdmFsdWUgPSAwOworCX0KIAogCS8qCiAJICogTWFrZSBzdXJlIHdl IG5ldmVyIHJldHVybiBhbnkgcmVzZXJ2ZWQgYml0IHdpdGggYSB2YWx1ZQogCSAqIGRpZmZlcmVu dCBmcm9tIDAuCiAJICovCi0JKnZhbHVlICY9IGJlaGF2aW9yW3JlZyAvIDRdLnJvIHwgYmVoYXZp b3JbcmVnIC8gNF0ucncgfAotCQkgIGJlaGF2aW9yW3JlZyAvIDRdLncxYzsKKwlpZiAoYmVoYXZp b3IpCisJCSp2YWx1ZSAmPSBiZWhhdmlvcltyZWcgLyA0XS5ybyB8IGJlaGF2aW9yW3JlZyAvIDRd LnJ3IHwKKwkJCSAgYmVoYXZpb3JbcmVnIC8gNF0udzFjOwogCiAJaWYgKHNpemUgPT0gMSkKIAkJ KnZhbHVlID0gKCp2YWx1ZSA+PiAoOCAqICh3aGVyZSAmIDMpKSkgJiAweGZmOwpAQCAtNTAyLDgg KzUxMywxNSBAQCBpbnQgcGNpX2JyaWRnZV9lbXVsX2NvbmZfd3JpdGUoc3RydWN0IHBjaV9icmlk Z2VfZW11bCAqYnJpZGdlLCBpbnQgd2hlcmUsCiAJCXdyaXRlX29wID0gYnJpZGdlLT5vcHMtPndy aXRlX3BjaWU7CiAJCWNmZ3NwYWNlID0gKF9fbGUzMiAqKSAmYnJpZGdlLT5wY2llX2NvbmY7CiAJ CWJlaGF2aW9yID0gYnJpZGdlLT5wY2llX2NhcF9yZWdzX2JlaGF2aW9yOwotCX0gZWxzZSB7CisJ fSBlbHNlIGlmIChyZWcgPCBQQ0lfQ0ZHX1NQQUNFX1NJWkUpIHsKKwkJLyogUmVzdCBvZiBQQ0kg c3BhY2Ugbm90IGltcGxlbWVudGVkICovCiAJCXJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7CisJ fSBlbHNlIHsKKwkJLyogUENJZSBleHRlbmRlZCBjYXBhYmlsaXR5IHNwYWNlICovCisJCXJlZyAt PSBQQ0lfQ0ZHX1NQQUNFX1NJWkU7CisJCXdyaXRlX29wID0gYnJpZGdlLT5vcHMtPndyaXRlX2V4 dDsKKwkJY2Znc3BhY2UgPSBOVUxMOworCQliZWhhdmlvciA9IE5VTEw7CiAJfQogCiAJc2hpZnQg PSAod2hlcmUgJiAweDMpICogODsKQEAgLTUxNywyOSArNTM1LDM4IEBAIGludCBwY2lfYnJpZGdl X2VtdWxfY29uZl93cml0ZShzdHJ1Y3QgcGNpX2JyaWRnZV9lbXVsICpicmlkZ2UsIGludCB3aGVy ZSwKIAllbHNlCiAJCXJldHVybiBQQ0lCSU9TX0JBRF9SRUdJU1RFUl9OVU1CRVI7CiAKLQkvKiBL ZWVwIGFsbCBiaXRzLCBleGNlcHQgdGhlIFJXIGJpdHMgKi8KLQluZXcgPSBvbGQgJiAofm1hc2sg fCB+YmVoYXZpb3JbcmVnIC8gNF0ucncpOworCWlmIChiZWhhdmlvcikgeworCQkvKiBLZWVwIGFs bCBiaXRzLCBleGNlcHQgdGhlIFJXIGJpdHMgKi8KKwkJbmV3ID0gb2xkICYgKH5tYXNrIHwgfmJl aGF2aW9yW3JlZyAvIDRdLnJ3KTsKIAotCS8qIFVwZGF0ZSB0aGUgdmFsdWUgb2YgdGhlIFJXIGJp dHMgKi8KLQluZXcgfD0gKHZhbHVlIDw8IHNoaWZ0KSAmIChiZWhhdmlvcltyZWcgLyA0XS5ydyAm IG1hc2spOworCQkvKiBVcGRhdGUgdGhlIHZhbHVlIG9mIHRoZSBSVyBiaXRzICovCisJCW5ldyB8 PSAodmFsdWUgPDwgc2hpZnQpICYgKGJlaGF2aW9yW3JlZyAvIDRdLnJ3ICYgbWFzayk7CiAKLQkv KiBDbGVhciB0aGUgVzFDIGJpdHMgKi8KLQluZXcgJj0gfigodmFsdWUgPDwgc2hpZnQpICYgKGJl aGF2aW9yW3JlZyAvIDRdLncxYyAmIG1hc2spKTsKKwkJLyogQ2xlYXIgdGhlIFcxQyBiaXRzICov CisJCW5ldyAmPSB+KCh2YWx1ZSA8PCBzaGlmdCkgJiAoYmVoYXZpb3JbcmVnIC8gNF0udzFjICYg bWFzaykpOworCX0gZWxzZSB7CisJCW5ldyA9IG9sZCAmIH5tYXNrOworCQluZXcgfD0gKHZhbHVl IDw8IHNoaWZ0KSAmIG1hc2s7CisJfQogCi0JLyogU2F2ZSB0aGUgbmV3IHZhbHVlIHdpdGggdGhl IGNsZWFyZWQgVzFDIGJpdHMgaW50byB0aGUgY2Znc3BhY2UgKi8KLQljZmdzcGFjZVtyZWcgLyA0 XSA9IGNwdV90b19sZTMyKG5ldyk7CisJaWYgKGNmZ3NwYWNlKSB7CisJCS8qIFNhdmUgdGhlIG5l dyB2YWx1ZSB3aXRoIHRoZSBjbGVhcmVkIFcxQyBiaXRzIGludG8gdGhlIGNmZ3NwYWNlICovCisJ CWNmZ3NwYWNlW3JlZyAvIDRdID0gY3B1X3RvX2xlMzIobmV3KTsKKwl9CiAKLQkvKgotCSAqIENs ZWFyIHRoZSBXMUMgYml0cyBub3Qgc3BlY2lmaWVkIGJ5IHRoZSB3cml0ZSBtYXNrLCBzbyB0aGF0 IHRoZQotCSAqIHdyaXRlX29wKCkgZG9lcyBub3QgY2xlYXIgdGhlbS4KLQkgKi8KLQluZXcgJj0g fihiZWhhdmlvcltyZWcgLyA0XS53MWMgJiB+bWFzayk7CisJaWYgKGJlaGF2aW9yKSB7CisJCS8q CisJCSAqIENsZWFyIHRoZSBXMUMgYml0cyBub3Qgc3BlY2lmaWVkIGJ5IHRoZSB3cml0ZSBtYXNr LCBzbyB0aGF0IHRoZQorCQkgKiB3cml0ZV9vcCgpIGRvZXMgbm90IGNsZWFyIHRoZW0uCisJCSAq LworCQluZXcgJj0gfihiZWhhdmlvcltyZWcgLyA0XS53MWMgJiB+bWFzayk7CiAKLQkvKgotCSAq IFNldCB0aGUgVzFDIGJpdHMgc3BlY2lmaWVkIGJ5IHRoZSB3cml0ZSBtYXNrLCBzbyB0aGF0IHdy aXRlX29wKCkKLQkgKiBrbm93cyBhYm91dCB0aGF0IHRoZXkgYXJlIHRvIGJlIGNsZWFyZWQuCi0J ICovCi0JbmV3IHw9ICh2YWx1ZSA8PCBzaGlmdCkgJiAoYmVoYXZpb3JbcmVnIC8gNF0udzFjICYg bWFzayk7CisJCS8qCisJCSAqIFNldCB0aGUgVzFDIGJpdHMgc3BlY2lmaWVkIGJ5IHRoZSB3cml0 ZSBtYXNrLCBzbyB0aGF0IHdyaXRlX29wKCkKKwkJICoga25vd3MgYWJvdXQgdGhhdCB0aGV5IGFy ZSB0byBiZSBjbGVhcmVkLgorCQkgKi8KKwkJbmV3IHw9ICh2YWx1ZSA8PCBzaGlmdCkgJiAoYmVo YXZpb3JbcmVnIC8gNF0udzFjICYgbWFzayk7CisJfQogCiAJaWYgKHdyaXRlX29wKQogCQl3cml0 ZV9vcChicmlkZ2UsIHJlZywgb2xkLCBuZXcsIG1hc2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9w Y2kvcGNpLWJyaWRnZS1lbXVsLmggYi9kcml2ZXJzL3BjaS9wY2ktYnJpZGdlLWVtdWwuaAppbmRl eCA0OTUzMjc0Y2FjMTguLjZiNWY3NWIyYWQwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNp LWJyaWRnZS1lbXVsLmgKKysrIGIvZHJpdmVycy9wY2kvcGNpLWJyaWRnZS1lbXVsLmgKQEAgLTkw LDYgKzkwLDE0IEBAIHN0cnVjdCBwY2lfYnJpZGdlX2VtdWxfb3BzIHsKIAkgKi8KIAlwY2lfYnJp ZGdlX2VtdWxfcmVhZF9zdGF0dXNfdCAoKnJlYWRfcGNpZSkoc3RydWN0IHBjaV9icmlkZ2VfZW11 bCAqYnJpZGdlLAogCQkJCQkJICAgaW50IHJlZywgdTMyICp2YWx1ZSk7CisKKwkvKgorCSAqIFNh bWUgYXMgLT5yZWFkX2Jhc2UoKSwgZXhjZXB0IGl0IGlzIGZvciByZWFkaW5nIGZyb20gdGhlCisJ ICogUENJZSBleHRlbmRlZCBjYXBhYmlsaXR5IGNvbmZpZ3VyYXRpb24gc3BhY2UuCisJICovCisJ cGNpX2JyaWRnZV9lbXVsX3JlYWRfc3RhdHVzX3QgKCpyZWFkX2V4dCkoc3RydWN0IHBjaV9icmlk Z2VfZW11bCAqYnJpZGdlLAorCQkJCQkJICBpbnQgcmVnLCB1MzIgKnZhbHVlKTsKKwogCS8qCiAJ ICogQ2FsbGVkIHdoZW4gd3JpdGluZyB0byB0aGUgcmVndWxhciBQQ0kgYnJpZGdlIGNvbmZpZ3Vy YXRpb24KIAkgKiBzcGFjZS4gb2xkIGlzIHRoZSBjdXJyZW50IHZhbHVlLCBuZXcgaXMgdGhlIG5l dyB2YWx1ZSBiZWluZwpAQCAtMTA1LDYgKzExMywxMyBAQCBzdHJ1Y3QgcGNpX2JyaWRnZV9lbXVs X29wcyB7CiAJICovCiAJdm9pZCAoKndyaXRlX3BjaWUpKHN0cnVjdCBwY2lfYnJpZGdlX2VtdWwg KmJyaWRnZSwgaW50IHJlZywKIAkJCSAgIHUzMiBvbGQsIHUzMiBuZXcsIHUzMiBtYXNrKTsKKwor CS8qCisJICogU2FtZSBhcyAtPndyaXRlX2Jhc2UoKSwgZXhjZXB0IGl0IGlzIGZvciB3cml0aW5n IGZyb20gdGhlCisJICogUENJZSBleHRlbmRlZCBjYXBhYmlsaXR5IGNvbmZpZ3VyYXRpb24gc3Bh Y2UuCisJICovCisJdm9pZCAoKndyaXRlX2V4dCkoc3RydWN0IHBjaV9icmlkZ2VfZW11bCAqYnJp ZGdlLCBpbnQgcmVnLAorCQkJICB1MzIgb2xkLCB1MzIgbmV3LCB1MzIgbWFzayk7CiB9OwogCiBz dHJ1Y3QgcGNpX2JyaWRnZV9yZWdfYmVoYXZpb3I7Ci0tIAoyLjIwLjEKCgpfX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1haWxp bmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3Rz LmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCg==