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 79CB9C433F5 for ; Sun, 20 Feb 2022 19:34:02 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S244633AbiBTTeV (ORCPT ); Sun, 20 Feb 2022 14:34:21 -0500 Received: from mxb-00190b01.gslb.pphosted.com ([23.128.96.19]:43222 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234790AbiBTTeU (ORCPT ); Sun, 20 Feb 2022 14:34:20 -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 EE0C84506A for ; Sun, 20 Feb 2022 11:33: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 ams.source.kernel.org (Postfix) with ESMTPS id 6935DB80DB6 for ; Sun, 20 Feb 2022 19:33:57 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 275CFC340F0; Sun, 20 Feb 2022 19:33:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1645385636; bh=PP7Ql8/VpGtPQcfuYduzBLTZ6cm6JTEe+hO4/pxzghk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=nC0QNVX4tEKKwAFRtbXCCRNiYnrfDi0VrFF3YtWSqolLV1VSp8QoKoPa4jy9y49Am 0uzTyvjgdLOArfJUlDQijNn5WYoTg0qLE4jsanlJ41toX2GD43pyZhf9RoC/py4ar4 SnZgeyk2KgnOGxf7HzGDpBr+Va6iyxs0zQCeJLVvevIUW/6cfsfncBzKhUcTI7WcW1 ucH0f/W4tlto5D9kylm+nELLveJVhBBGjGQHuZIfyaTK3Pj1amy+fmPPMtvuCuWO6s ek4hQB+5+YMt567IgV9AmrKiryibbxuMlUBE+t+FYt92l39R22ieaqE7viajZDH+sf ZJ7itjbZfc/mg== 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 , Russell King , =?UTF-8?q?Marek=20Beh=C3=BAn?= Subject: [PATCH 02/18] PCI: pci-bridge-emul: Add support for PCIe extended capabilities Date: Sun, 20 Feb 2022 20:33:30 +0100 Message-Id: <20220220193346.23789-3-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: 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.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 6BDA9C433EF for ; Sun, 20 Feb 2022 19:36:12 +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=PeZw8MiKzxvLwHd77sNhaSPL6nUFfV4Xi9wU9IeXvNs=; b=XpVxrJ60F2YyVs Wo7e6fur1awECAPjjBIzTQGUe7tJNeF0udEufw7i99oLncipD4v+dCzJByFY5gaY6+tbgbxVifUo5 WZxXdkXf/nrgLoGJU4f1JWvUGZ45++xWnTckpsJ1V0EXttY8GpW60D2OKGJsC8IPlbGa0yeQXlwCh rWstNI/LHzxb7OAB1mIc3t4tOZ3gU+l1Bbyyfl1scV9dF9ofM8DqjoNoE/gdEXcphx3MV5NNxYo7U KWP/WlaLvKyNurmDRtK6DB1tneHr5/g+zMZrTs96pj/iPjAmKGQAJ1RbZs+DhDypCt5djkKN2bDAA 1YdPcc2OZzOD/5TzfW8g==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1nLryO-002BHX-8n; Sun, 20 Feb 2022 19:34:20 +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 1nLry1-002B77-Af for linux-arm-kernel@lists.infradead.org; Sun, 20 Feb 2022 19:33:59 +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 C8C9A60EEE; Sun, 20 Feb 2022 19:33:56 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 275CFC340F0; Sun, 20 Feb 2022 19:33:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1645385636; bh=PP7Ql8/VpGtPQcfuYduzBLTZ6cm6JTEe+hO4/pxzghk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=nC0QNVX4tEKKwAFRtbXCCRNiYnrfDi0VrFF3YtWSqolLV1VSp8QoKoPa4jy9y49Am 0uzTyvjgdLOArfJUlDQijNn5WYoTg0qLE4jsanlJ41toX2GD43pyZhf9RoC/py4ar4 SnZgeyk2KgnOGxf7HzGDpBr+Va6iyxs0zQCeJLVvevIUW/6cfsfncBzKhUcTI7WcW1 ucH0f/W4tlto5D9kylm+nELLveJVhBBGjGQHuZIfyaTK3Pj1amy+fmPPMtvuCuWO6s ek4hQB+5+YMt567IgV9AmrKiryibbxuMlUBE+t+FYt92l39R22ieaqE7viajZDH+sf ZJ7itjbZfc/mg== 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 , Russell King , =?UTF-8?q?Marek=20Beh=C3=BAn?= Subject: [PATCH 02/18] PCI: pci-bridge-emul: Add support for PCIe extended capabilities Date: Sun, 20 Feb 2022 20:33:30 +0100 Message-Id: <20220220193346.23789-3-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_113357_477501_F4A9098C X-CRM114-Status: GOOD ( 21.02 ) 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 dHJ1Y3QgcGNpX2JyaWRnZV9yZWdfYmVoYXZpb3I7Ci0tIAoyLjM0LjEKCgpfX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1haWxp bmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3Rz LmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCg==