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 C04F8C43217 for ; Mon, 10 Jan 2022 01:51:05 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238007AbiAJBvF (ORCPT ); Sun, 9 Jan 2022 20:51:05 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59642 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S238019AbiAJBvA (ORCPT ); Sun, 9 Jan 2022 20:51:00 -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 DC189C06173F for ; Sun, 9 Jan 2022 17:50:59 -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 75DAD60F5F for ; Mon, 10 Jan 2022 01:50:59 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2F254C36AF4; Mon, 10 Jan 2022 01:50:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1641779458; bh=dE37zSYYTtSHHbU6xtrTBq/WpoIvFy7wpM+oq4PNQNI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=DI1b+QxE4fnyt8T81FkzruG9iAnVEikq9tEEK3Tza2BHeNFXyxm6UDvi6JMyjHoG7 SlQPDfPNcyQAc/+QEaDzT3IL9AJSJAvU62mrSgbWNI9B9KgEhGT9z72yldLXgETSEL PForSYbT3LQidbg/SlhDgeU/NOj2HZDSN0eTsJXo6VoMIBBVq0y57eMUTz/stxOQ2r RXRj0crDGCYfy+GDj3lj+1z4kYJQPmJyztVgvGAoousAfh65OafT5s+rvATkcddeE4 CWdn0hbI5NVK+5a3fZPU2lH5CTo0e3dSDwm6RR2QCs4DldR+rEOttqHiYxnNItYA3I OsJDr1o+FnBtw== From: =?UTF-8?q?Marek=20Beh=C3=BAn?= To: Marc Zyngier , Lorenzo Pieralisi , Bjorn Helgaas Cc: pali@kernel.org, linux-pci@vger.kernel.org, linux-arm-kernel@lists.infradead.org, =?UTF-8?q?Marek=20Beh=C3=BAn?= Subject: [PATCH v2 17/23] PCI: aardvark: Fix support for PME requester on emulated bridge Date: Mon, 10 Jan 2022 02:50:12 +0100 Message-Id: <20220110015018.26359-18-kabel@kernel.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220110015018.26359-1-kabel@kernel.org> References: <20220110015018.26359-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 Enable aardvark PME interrupt unconditionally by unmasking it and read PME requester ID to emulated bridge config space immediately after receiving interrupt. PME requester ID is stored in the PCIE_MSG_LOG_REG register, which contains the last inbound message. So when new inbound message is received by HW (including non-PM), the content in PCIE_MSG_LOG_REG register is replaced by a new value. PCIe specification mandates that subsequent PMEs are kept pending until the PME Status Register bit is cleared by software by writing a 1b. Support for masking/unmasking PME interrupt on emulated bridge via PCI_EXP_RTCTL_PMEIE bit is now implemented only in emulated bridge config space, to ensure that we do not miss any aardvark PME interrupt. Reading of PCI_EXP_RTCAP and PCI_EXP_RTSTA registers is simplified as final value is now always stored into emulated bridge config space by the interrupt handler, so there is no need to implement support for these registers in read_pcie callback. Clearing of W1C bit PCI_EXP_RTSTA_PME is now also simplified as it is done by pci-bridge-emul.c code for emulated bridge config space. So there is no need to implement support for clearing this bit in write_pcie callback. Signed-off-by: Pali Rohár Signed-off-by: Marek Behún --- drivers/pci/controller/pci-aardvark.c | 91 +++++++++++++++------------ 1 file changed, 50 insertions(+), 41 deletions(-) diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c index 3f2d570bfbb5..730ff1ffc952 100644 --- a/drivers/pci/controller/pci-aardvark.c +++ b/drivers/pci/controller/pci-aardvark.c @@ -591,6 +591,11 @@ static void advk_pcie_setup_hw(struct advk_pcie *pcie) reg &= ~PCIE_ISR0_MSI_INT_PENDING; advk_writel(pcie, reg, PCIE_ISR0_MASK_REG); + /* Unmask PME interrupt for processing of PME requester */ + reg = advk_readl(pcie, PCIE_ISR0_MASK_REG); + reg &= ~PCIE_MSG_PM_PME_MASK; + advk_writel(pcie, reg, PCIE_ISR0_MASK_REG); + /* Enable summary interrupt for GIC SPI source */ reg = PCIE_IRQ_ALL_MASK & (~PCIE_IRQ_ENABLE_INTS_MASK); advk_writel(pcie, reg, HOST_CTRL_INT_MASK_REG); @@ -865,22 +870,11 @@ advk_pci_bridge_emul_pcie_conf_read(struct pci_bridge_emul *bridge, *value = PCI_EXP_SLTSTA_PDS << 16; return PCI_BRIDGE_EMUL_HANDLED; - case PCI_EXP_RTCTL: { - u32 val = advk_readl(pcie, PCIE_ISR0_MASK_REG); - *value = (val & PCIE_MSG_PM_PME_MASK) ? 0 : PCI_EXP_RTCTL_PMEIE; - *value |= le16_to_cpu(bridge->pcie_conf.rootctl) & PCI_EXP_RTCTL_CRSSVE; - *value |= PCI_EXP_RTCAP_CRSVIS << 16; - return PCI_BRIDGE_EMUL_HANDLED; - } - - case PCI_EXP_RTSTA: { - u32 isr0 = advk_readl(pcie, PCIE_ISR0_REG); - u32 msglog = advk_readl(pcie, PCIE_MSG_LOG_REG); - *value = msglog >> 16; - if (isr0 & PCIE_MSG_PM_PME_MASK) - *value |= PCI_EXP_RTSTA_PME; - return PCI_BRIDGE_EMUL_HANDLED; - } + /* + * PCI_EXP_RTCTL and PCI_EXP_RTSTA are also supported, but do not need + * to be handled here, because their values are stored in emulated + * config space buffer, and we read them from there when needed. + */ case PCI_EXP_LNKCAP: { u32 val = advk_readl(pcie, PCIE_CORE_PCIEXP_CAP + reg); @@ -934,22 +928,19 @@ advk_pci_bridge_emul_pcie_conf_write(struct pci_bridge_emul *bridge, advk_pcie_wait_for_retrain(pcie); break; - case PCI_EXP_RTCTL: - /* Only mask/unmask PME interrupt */ - if (mask & PCI_EXP_RTCTL_PMEIE) { - u32 val = advk_readl(pcie, PCIE_ISR0_MASK_REG); - if (new & PCI_EXP_RTCTL_PMEIE) - val &= ~PCIE_MSG_PM_PME_MASK; - else - val |= PCIE_MSG_PM_PME_MASK; - advk_writel(pcie, val, PCIE_ISR0_MASK_REG); - } + case PCI_EXP_RTCTL: { + u16 rootctl = le16_to_cpu(bridge->pcie_conf.rootctl); + /* Only emulation of PMEIE and CRSSVE bits is provided */ + rootctl &= PCI_EXP_RTCTL_PMEIE | PCI_EXP_RTCTL_CRSSVE; + bridge->pcie_conf.rootctl = cpu_to_le16(rootctl); break; + } - case PCI_EXP_RTSTA: - if (new & PCI_EXP_RTSTA_PME) - advk_writel(pcie, PCIE_MSG_PM_PME_MASK, PCIE_ISR0_REG); - break; + /* + * PCI_EXP_RTSTA is also supported, but does not need to be handled + * here, because its value is stored in emulated config space buffer, + * and we write it there when needed. + */ case PCI_EXP_DEVCTL: case PCI_EXP_DEVCTL2: @@ -1452,6 +1443,32 @@ static void advk_pcie_remove_irq_domain(struct advk_pcie *pcie) irq_domain_remove(pcie->irq_domain); } +static void advk_pcie_handle_pme(struct advk_pcie *pcie) +{ + u32 requester = advk_readl(pcie, PCIE_MSG_LOG_REG) >> 16; + + advk_writel(pcie, PCIE_MSG_PM_PME_MASK, PCIE_ISR0_REG); + + /* + * PCIE_MSG_LOG_REG contains the last inbound message, so store + * the requester ID only when PME was not asserted yet. + * Also do not trigger PME interrupt when PME is still asserted. + */ + if (!(le32_to_cpu(pcie->bridge.pcie_conf.rootsta) & PCI_EXP_RTSTA_PME)) { + pcie->bridge.pcie_conf.rootsta = cpu_to_le32(requester | PCI_EXP_RTSTA_PME); + + /* + * Trigger PME interrupt only if PMEIE bit in Root Control is set. + * Aardvark HW returns zero for PCI_EXP_FLAGS_IRQ, so use PCIe interrupt 0. + */ + if (!(le16_to_cpu(pcie->bridge.pcie_conf.rootctl) & PCI_EXP_RTCTL_PMEIE)) + return; + + if (generic_handle_domain_irq(pcie->irq_domain, 0) == -EINVAL) + dev_err_ratelimited(&pcie->pdev->dev, "unhandled PME IRQ\n"); + } +} + static void advk_pcie_handle_msi(struct advk_pcie *pcie) { u32 msi_val, msi_mask, msi_status, msi_idx; @@ -1487,17 +1504,9 @@ static void advk_pcie_handle_int(struct advk_pcie *pcie) isr1_mask = advk_readl(pcie, PCIE_ISR1_MASK_REG); isr1_status = isr1_val & ((~isr1_mask) & PCIE_ISR1_ALL_MASK); - /* Process PME interrupt */ - if (isr0_status & PCIE_MSG_PM_PME_MASK) { - /* - * Do not clear PME interrupt bit in ISR0, it is cleared by IRQ - * receiver by writing to the PCI_EXP_RTSTA register of emulated - * root bridge. Aardvark HW returns zero for PCI_EXP_FLAGS_IRQ, - * so use PCIe interrupt 0. - */ - if (generic_handle_domain_irq(pcie->irq_domain, 0) == -EINVAL) - dev_err_ratelimited(&pcie->pdev->dev, "unhandled PME IRQ\n"); - } + /* Process PME interrupt as the first one to do not miss PME requester id */ + if (isr0_status & PCIE_MSG_PM_PME_MASK) + advk_pcie_handle_pme(pcie); /* Process ERR interrupt */ if (isr0_status & PCIE_ISR0_ERR_MASK) { -- 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 80377C433F5 for ; Mon, 10 Jan 2022 02:00:47 +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=63DcPiygxVOLa5glETPV+0O65cHrFb9kKtMp/DCWW7k=; b=JGP4UCyH2SIWEy l4lt3++bg5VGMD6lI3blIHi0vgih3hIu8MDE5hbnPc0jfOaEw3wfTgd7DQz6bwxZootoI4tPfnf28 cI+iDNo8DWrIVZZrAarfWO6+8UK5hj77a2b+7pt9bMiFp4xDAnD1vytmcl73faYgjEFuRkmceVH2B gzTyQ5cZAv0LzWqp5KHxxOBbgdbna5v6+TMJczHpzOOmuRDF91SKwId/Uwk70sK5K2o1pAO5Kd+Sa 8kdDwCxStrH/U8mEqUBFIrmRRbI7GjBAmUBtimNsP/7IsgLIdet+YtLhOV9cF+EiCqZOE4edvxV8Q U3+cUU5BG2iJSApjL+VQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1n6jxg-008qUx-W9; Mon, 10 Jan 2022 01:59:07 +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 1n6jpr-008lmN-Uz for linux-arm-kernel@lists.infradead.org; Mon, 10 Jan 2022 01:51: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 6E1EA60EC8; Mon, 10 Jan 2022 01:50:59 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2F254C36AF4; Mon, 10 Jan 2022 01:50:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1641779458; bh=dE37zSYYTtSHHbU6xtrTBq/WpoIvFy7wpM+oq4PNQNI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=DI1b+QxE4fnyt8T81FkzruG9iAnVEikq9tEEK3Tza2BHeNFXyxm6UDvi6JMyjHoG7 SlQPDfPNcyQAc/+QEaDzT3IL9AJSJAvU62mrSgbWNI9B9KgEhGT9z72yldLXgETSEL PForSYbT3LQidbg/SlhDgeU/NOj2HZDSN0eTsJXo6VoMIBBVq0y57eMUTz/stxOQ2r RXRj0crDGCYfy+GDj3lj+1z4kYJQPmJyztVgvGAoousAfh65OafT5s+rvATkcddeE4 CWdn0hbI5NVK+5a3fZPU2lH5CTo0e3dSDwm6RR2QCs4DldR+rEOttqHiYxnNItYA3I OsJDr1o+FnBtw== From: =?UTF-8?q?Marek=20Beh=C3=BAn?= To: Marc Zyngier , Lorenzo Pieralisi , Bjorn Helgaas Cc: pali@kernel.org, linux-pci@vger.kernel.org, linux-arm-kernel@lists.infradead.org, =?UTF-8?q?Marek=20Beh=C3=BAn?= Subject: [PATCH v2 17/23] PCI: aardvark: Fix support for PME requester on emulated bridge Date: Mon, 10 Jan 2022 02:50:12 +0100 Message-Id: <20220110015018.26359-18-kabel@kernel.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220110015018.26359-1-kabel@kernel.org> References: <20220110015018.26359-1-kabel@kernel.org> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220109_175100_125253_BD151CFC X-CRM114-Status: GOOD ( 22.34 ) 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 RnJvbTogUGFsaSBSb2jDoXIgPHBhbGlAa2VybmVsLm9yZz4KCkVuYWJsZSBhYXJkdmFyayBQTUUg aW50ZXJydXB0IHVuY29uZGl0aW9uYWxseSBieSB1bm1hc2tpbmcgaXQgYW5kIHJlYWQgUE1FCnJl cXVlc3RlciBJRCB0byBlbXVsYXRlZCBicmlkZ2UgY29uZmlnIHNwYWNlIGltbWVkaWF0ZWx5IGFm dGVyIHJlY2VpdmluZwppbnRlcnJ1cHQuCgpQTUUgcmVxdWVzdGVyIElEIGlzIHN0b3JlZCBpbiB0 aGUgUENJRV9NU0dfTE9HX1JFRyByZWdpc3Rlciwgd2hpY2ggY29udGFpbnMKdGhlIGxhc3QgaW5i b3VuZCBtZXNzYWdlLiBTbyB3aGVuIG5ldyBpbmJvdW5kIG1lc3NhZ2UgaXMgcmVjZWl2ZWQgYnkg SFcKKGluY2x1ZGluZyBub24tUE0pLCB0aGUgY29udGVudCBpbiBQQ0lFX01TR19MT0dfUkVHIHJl Z2lzdGVyIGlzIHJlcGxhY2VkIGJ5CmEgbmV3IHZhbHVlLgoKUENJZSBzcGVjaWZpY2F0aW9uIG1h bmRhdGVzIHRoYXQgc3Vic2VxdWVudCBQTUVzIGFyZSBrZXB0IHBlbmRpbmcgdW50aWwgdGhlClBN RSBTdGF0dXMgUmVnaXN0ZXIgYml0IGlzIGNsZWFyZWQgYnkgc29mdHdhcmUgYnkgd3JpdGluZyBh IDFiLgoKU3VwcG9ydCBmb3IgbWFza2luZy91bm1hc2tpbmcgUE1FIGludGVycnVwdCBvbiBlbXVs YXRlZCBicmlkZ2UgdmlhClBDSV9FWFBfUlRDVExfUE1FSUUgYml0IGlzIG5vdyBpbXBsZW1lbnRl ZCBvbmx5IGluIGVtdWxhdGVkIGJyaWRnZSBjb25maWcKc3BhY2UsIHRvIGVuc3VyZSB0aGF0IHdl IGRvIG5vdCBtaXNzIGFueSBhYXJkdmFyayBQTUUgaW50ZXJydXB0LgoKUmVhZGluZyBvZiBQQ0lf RVhQX1JUQ0FQIGFuZCBQQ0lfRVhQX1JUU1RBIHJlZ2lzdGVycyBpcyBzaW1wbGlmaWVkIGFzIGZp bmFsCnZhbHVlIGlzIG5vdyBhbHdheXMgc3RvcmVkIGludG8gZW11bGF0ZWQgYnJpZGdlIGNvbmZp ZyBzcGFjZSBieSB0aGUKaW50ZXJydXB0IGhhbmRsZXIsIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8g aW1wbGVtZW50IHN1cHBvcnQgZm9yIHRoZXNlCnJlZ2lzdGVycyBpbiByZWFkX3BjaWUgY2FsbGJh Y2suCgpDbGVhcmluZyBvZiBXMUMgYml0IFBDSV9FWFBfUlRTVEFfUE1FIGlzIG5vdyBhbHNvIHNp bXBsaWZpZWQgYXMgaXQgaXMgZG9uZQpieSBwY2ktYnJpZGdlLWVtdWwuYyBjb2RlIGZvciBlbXVs YXRlZCBicmlkZ2UgY29uZmlnIHNwYWNlLiBTbyB0aGVyZSBpcyBubwpuZWVkIHRvIGltcGxlbWVu dCBzdXBwb3J0IGZvciBjbGVhcmluZyB0aGlzIGJpdCBpbiB3cml0ZV9wY2llIGNhbGxiYWNrLgoK U2lnbmVkLW9mZi1ieTogUGFsaSBSb2jDoXIgPHBhbGlAa2VybmVsLm9yZz4KU2lnbmVkLW9mZi1i eTogTWFyZWsgQmVow7puIDxrYWJlbEBrZXJuZWwub3JnPgotLS0KIGRyaXZlcnMvcGNpL2NvbnRy b2xsZXIvcGNpLWFhcmR2YXJrLmMgfCA5MSArKysrKysrKysrKysrKystLS0tLS0tLS0tLS0KIDEg ZmlsZSBjaGFuZ2VkLCA1MCBpbnNlcnRpb25zKCspLCA0MSBkZWxldGlvbnMoLSkKCmRpZmYgLS1n aXQgYS9kcml2ZXJzL3BjaS9jb250cm9sbGVyL3BjaS1hYXJkdmFyay5jIGIvZHJpdmVycy9wY2kv Y29udHJvbGxlci9wY2ktYWFyZHZhcmsuYwppbmRleCAzZjJkNTcwYmZiYjUuLjczMGZmMWZmYzk1 MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvY29udHJvbGxlci9wY2ktYWFyZHZhcmsuYworKysg Yi9kcml2ZXJzL3BjaS9jb250cm9sbGVyL3BjaS1hYXJkdmFyay5jCkBAIC01OTEsNiArNTkxLDEx IEBAIHN0YXRpYyB2b2lkIGFkdmtfcGNpZV9zZXR1cF9odyhzdHJ1Y3QgYWR2a19wY2llICpwY2ll KQogCXJlZyAmPSB+UENJRV9JU1IwX01TSV9JTlRfUEVORElORzsKIAlhZHZrX3dyaXRlbChwY2ll LCByZWcsIFBDSUVfSVNSMF9NQVNLX1JFRyk7CiAKKwkvKiBVbm1hc2sgUE1FIGludGVycnVwdCBm b3IgcHJvY2Vzc2luZyBvZiBQTUUgcmVxdWVzdGVyICovCisJcmVnID0gYWR2a19yZWFkbChwY2ll LCBQQ0lFX0lTUjBfTUFTS19SRUcpOworCXJlZyAmPSB+UENJRV9NU0dfUE1fUE1FX01BU0s7CisJ YWR2a193cml0ZWwocGNpZSwgcmVnLCBQQ0lFX0lTUjBfTUFTS19SRUcpOworCiAJLyogRW5hYmxl IHN1bW1hcnkgaW50ZXJydXB0IGZvciBHSUMgU1BJIHNvdXJjZSAqLwogCXJlZyA9IFBDSUVfSVJR X0FMTF9NQVNLICYgKH5QQ0lFX0lSUV9FTkFCTEVfSU5UU19NQVNLKTsKIAlhZHZrX3dyaXRlbChw Y2llLCByZWcsIEhPU1RfQ1RSTF9JTlRfTUFTS19SRUcpOwpAQCAtODY1LDIyICs4NzAsMTEgQEAg YWR2a19wY2lfYnJpZGdlX2VtdWxfcGNpZV9jb25mX3JlYWQoc3RydWN0IHBjaV9icmlkZ2VfZW11 bCAqYnJpZGdlLAogCQkqdmFsdWUgPSBQQ0lfRVhQX1NMVFNUQV9QRFMgPDwgMTY7CiAJCXJldHVy biBQQ0lfQlJJREdFX0VNVUxfSEFORExFRDsKIAotCWNhc2UgUENJX0VYUF9SVENUTDogewotCQl1 MzIgdmFsID0gYWR2a19yZWFkbChwY2llLCBQQ0lFX0lTUjBfTUFTS19SRUcpOwotCQkqdmFsdWUg PSAodmFsICYgUENJRV9NU0dfUE1fUE1FX01BU0spID8gMCA6IFBDSV9FWFBfUlRDVExfUE1FSUU7 Ci0JCSp2YWx1ZSB8PSBsZTE2X3RvX2NwdShicmlkZ2UtPnBjaWVfY29uZi5yb290Y3RsKSAmIFBD SV9FWFBfUlRDVExfQ1JTU1ZFOwotCQkqdmFsdWUgfD0gUENJX0VYUF9SVENBUF9DUlNWSVMgPDwg MTY7Ci0JCXJldHVybiBQQ0lfQlJJREdFX0VNVUxfSEFORExFRDsKLQl9Ci0KLQljYXNlIFBDSV9F WFBfUlRTVEE6IHsKLQkJdTMyIGlzcjAgPSBhZHZrX3JlYWRsKHBjaWUsIFBDSUVfSVNSMF9SRUcp OwotCQl1MzIgbXNnbG9nID0gYWR2a19yZWFkbChwY2llLCBQQ0lFX01TR19MT0dfUkVHKTsKLQkJ KnZhbHVlID0gbXNnbG9nID4+IDE2OwotCQlpZiAoaXNyMCAmIFBDSUVfTVNHX1BNX1BNRV9NQVNL KQotCQkJKnZhbHVlIHw9IFBDSV9FWFBfUlRTVEFfUE1FOwotCQlyZXR1cm4gUENJX0JSSURHRV9F TVVMX0hBTkRMRUQ7Ci0JfQorCS8qCisJICogUENJX0VYUF9SVENUTCBhbmQgUENJX0VYUF9SVFNU QSBhcmUgYWxzbyBzdXBwb3J0ZWQsIGJ1dCBkbyBub3QgbmVlZAorCSAqIHRvIGJlIGhhbmRsZWQg aGVyZSwgYmVjYXVzZSB0aGVpciB2YWx1ZXMgYXJlIHN0b3JlZCBpbiBlbXVsYXRlZAorCSAqIGNv bmZpZyBzcGFjZSBidWZmZXIsIGFuZCB3ZSByZWFkIHRoZW0gZnJvbSB0aGVyZSB3aGVuIG5lZWRl ZC4KKwkgKi8KIAogCWNhc2UgUENJX0VYUF9MTktDQVA6IHsKIAkJdTMyIHZhbCA9IGFkdmtfcmVh ZGwocGNpZSwgUENJRV9DT1JFX1BDSUVYUF9DQVAgKyByZWcpOwpAQCAtOTM0LDIyICs5MjgsMTkg QEAgYWR2a19wY2lfYnJpZGdlX2VtdWxfcGNpZV9jb25mX3dyaXRlKHN0cnVjdCBwY2lfYnJpZGdl X2VtdWwgKmJyaWRnZSwKIAkJCWFkdmtfcGNpZV93YWl0X2Zvcl9yZXRyYWluKHBjaWUpOwogCQli cmVhazsKIAotCWNhc2UgUENJX0VYUF9SVENUTDoKLQkJLyogT25seSBtYXNrL3VubWFzayBQTUUg aW50ZXJydXB0ICovCi0JCWlmIChtYXNrICYgUENJX0VYUF9SVENUTF9QTUVJRSkgewotCQkJdTMy IHZhbCA9IGFkdmtfcmVhZGwocGNpZSwgUENJRV9JU1IwX01BU0tfUkVHKTsKLQkJCWlmIChuZXcg JiBQQ0lfRVhQX1JUQ1RMX1BNRUlFKQotCQkJCXZhbCAmPSB+UENJRV9NU0dfUE1fUE1FX01BU0s7 Ci0JCQllbHNlCi0JCQkJdmFsIHw9IFBDSUVfTVNHX1BNX1BNRV9NQVNLOwotCQkJYWR2a193cml0 ZWwocGNpZSwgdmFsLCBQQ0lFX0lTUjBfTUFTS19SRUcpOwotCQl9CisJY2FzZSBQQ0lfRVhQX1JU Q1RMOiB7CisJCXUxNiByb290Y3RsID0gbGUxNl90b19jcHUoYnJpZGdlLT5wY2llX2NvbmYucm9v dGN0bCk7CisJCS8qIE9ubHkgZW11bGF0aW9uIG9mIFBNRUlFIGFuZCBDUlNTVkUgYml0cyBpcyBw cm92aWRlZCAqLworCQlyb290Y3RsICY9IFBDSV9FWFBfUlRDVExfUE1FSUUgfCBQQ0lfRVhQX1JU Q1RMX0NSU1NWRTsKKwkJYnJpZGdlLT5wY2llX2NvbmYucm9vdGN0bCA9IGNwdV90b19sZTE2KHJv b3RjdGwpOwogCQlicmVhazsKKwl9CiAKLQljYXNlIFBDSV9FWFBfUlRTVEE6Ci0JCWlmIChuZXcg JiBQQ0lfRVhQX1JUU1RBX1BNRSkKLQkJCWFkdmtfd3JpdGVsKHBjaWUsIFBDSUVfTVNHX1BNX1BN RV9NQVNLLCBQQ0lFX0lTUjBfUkVHKTsKLQkJYnJlYWs7CisJLyoKKwkgKiBQQ0lfRVhQX1JUU1RB IGlzIGFsc28gc3VwcG9ydGVkLCBidXQgZG9lcyBub3QgbmVlZCB0byBiZSBoYW5kbGVkCisJICog aGVyZSwgYmVjYXVzZSBpdHMgdmFsdWUgaXMgc3RvcmVkIGluIGVtdWxhdGVkIGNvbmZpZyBzcGFj ZSBidWZmZXIsCisJICogYW5kIHdlIHdyaXRlIGl0IHRoZXJlIHdoZW4gbmVlZGVkLgorCSAqLwog CiAJY2FzZSBQQ0lfRVhQX0RFVkNUTDoKIAljYXNlIFBDSV9FWFBfREVWQ1RMMjoKQEAgLTE0NTIs NiArMTQ0MywzMiBAQCBzdGF0aWMgdm9pZCBhZHZrX3BjaWVfcmVtb3ZlX2lycV9kb21haW4oc3Ry dWN0IGFkdmtfcGNpZSAqcGNpZSkKIAlpcnFfZG9tYWluX3JlbW92ZShwY2llLT5pcnFfZG9tYWlu KTsKIH0KIAorc3RhdGljIHZvaWQgYWR2a19wY2llX2hhbmRsZV9wbWUoc3RydWN0IGFkdmtfcGNp ZSAqcGNpZSkKK3sKKwl1MzIgcmVxdWVzdGVyID0gYWR2a19yZWFkbChwY2llLCBQQ0lFX01TR19M T0dfUkVHKSA+PiAxNjsKKworCWFkdmtfd3JpdGVsKHBjaWUsIFBDSUVfTVNHX1BNX1BNRV9NQVNL LCBQQ0lFX0lTUjBfUkVHKTsKKworCS8qCisJICogUENJRV9NU0dfTE9HX1JFRyBjb250YWlucyB0 aGUgbGFzdCBpbmJvdW5kIG1lc3NhZ2UsIHNvIHN0b3JlCisJICogdGhlIHJlcXVlc3RlciBJRCBv bmx5IHdoZW4gUE1FIHdhcyBub3QgYXNzZXJ0ZWQgeWV0LgorCSAqIEFsc28gZG8gbm90IHRyaWdn ZXIgUE1FIGludGVycnVwdCB3aGVuIFBNRSBpcyBzdGlsbCBhc3NlcnRlZC4KKwkgKi8KKwlpZiAo IShsZTMyX3RvX2NwdShwY2llLT5icmlkZ2UucGNpZV9jb25mLnJvb3RzdGEpICYgUENJX0VYUF9S VFNUQV9QTUUpKSB7CisJCXBjaWUtPmJyaWRnZS5wY2llX2NvbmYucm9vdHN0YSA9IGNwdV90b19s ZTMyKHJlcXVlc3RlciB8IFBDSV9FWFBfUlRTVEFfUE1FKTsKKworCQkvKgorCQkgKiBUcmlnZ2Vy IFBNRSBpbnRlcnJ1cHQgb25seSBpZiBQTUVJRSBiaXQgaW4gUm9vdCBDb250cm9sIGlzIHNldC4K KwkJICogQWFyZHZhcmsgSFcgcmV0dXJucyB6ZXJvIGZvciBQQ0lfRVhQX0ZMQUdTX0lSUSwgc28g dXNlIFBDSWUgaW50ZXJydXB0IDAuCisJCSAqLworCQlpZiAoIShsZTE2X3RvX2NwdShwY2llLT5i cmlkZ2UucGNpZV9jb25mLnJvb3RjdGwpICYgUENJX0VYUF9SVENUTF9QTUVJRSkpCisJCQlyZXR1 cm47CisKKwkJaWYgKGdlbmVyaWNfaGFuZGxlX2RvbWFpbl9pcnEocGNpZS0+aXJxX2RvbWFpbiwg MCkgPT0gLUVJTlZBTCkKKwkJCWRldl9lcnJfcmF0ZWxpbWl0ZWQoJnBjaWUtPnBkZXYtPmRldiwg InVuaGFuZGxlZCBQTUUgSVJRXG4iKTsKKwl9Cit9CisKIHN0YXRpYyB2b2lkIGFkdmtfcGNpZV9o YW5kbGVfbXNpKHN0cnVjdCBhZHZrX3BjaWUgKnBjaWUpCiB7CiAJdTMyIG1zaV92YWwsIG1zaV9t YXNrLCBtc2lfc3RhdHVzLCBtc2lfaWR4OwpAQCAtMTQ4NywxNyArMTUwNCw5IEBAIHN0YXRpYyB2 b2lkIGFkdmtfcGNpZV9oYW5kbGVfaW50KHN0cnVjdCBhZHZrX3BjaWUgKnBjaWUpCiAJaXNyMV9t YXNrID0gYWR2a19yZWFkbChwY2llLCBQQ0lFX0lTUjFfTUFTS19SRUcpOwogCWlzcjFfc3RhdHVz ID0gaXNyMV92YWwgJiAoKH5pc3IxX21hc2spICYgUENJRV9JU1IxX0FMTF9NQVNLKTsKIAotCS8q IFByb2Nlc3MgUE1FIGludGVycnVwdCAqLwotCWlmIChpc3IwX3N0YXR1cyAmIFBDSUVfTVNHX1BN X1BNRV9NQVNLKSB7Ci0JCS8qCi0JCSAqIERvIG5vdCBjbGVhciBQTUUgaW50ZXJydXB0IGJpdCBp biBJU1IwLCBpdCBpcyBjbGVhcmVkIGJ5IElSUQotCQkgKiByZWNlaXZlciBieSB3cml0aW5nIHRv IHRoZSBQQ0lfRVhQX1JUU1RBIHJlZ2lzdGVyIG9mIGVtdWxhdGVkCi0JCSAqIHJvb3QgYnJpZGdl LiBBYXJkdmFyayBIVyByZXR1cm5zIHplcm8gZm9yIFBDSV9FWFBfRkxBR1NfSVJRLAotCQkgKiBz byB1c2UgUENJZSBpbnRlcnJ1cHQgMC4KLQkJICovCi0JCWlmIChnZW5lcmljX2hhbmRsZV9kb21h aW5faXJxKHBjaWUtPmlycV9kb21haW4sIDApID09IC1FSU5WQUwpCi0JCQlkZXZfZXJyX3JhdGVs aW1pdGVkKCZwY2llLT5wZGV2LT5kZXYsICJ1bmhhbmRsZWQgUE1FIElSUVxuIik7Ci0JfQorCS8q IFByb2Nlc3MgUE1FIGludGVycnVwdCBhcyB0aGUgZmlyc3Qgb25lIHRvIGRvIG5vdCBtaXNzIFBN RSByZXF1ZXN0ZXIgaWQgKi8KKwlpZiAoaXNyMF9zdGF0dXMgJiBQQ0lFX01TR19QTV9QTUVfTUFT SykKKwkJYWR2a19wY2llX2hhbmRsZV9wbWUocGNpZSk7CiAKIAkvKiBQcm9jZXNzIEVSUiBpbnRl cnJ1cHQgKi8KIAlpZiAoaXNyMF9zdGF0dXMgJiBQQ0lFX0lTUjBfRVJSX01BU0spIHsKLS0gCjIu MzQuMQoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxp bnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFk ZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4 LWFybS1rZXJuZWwK