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 X-Spam-Level: X-Spam-Status: No, score=-19.7 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 83E2AC433B4 for ; Thu, 6 May 2021 15:33:05 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 552A46109E for ; Thu, 6 May 2021 15:33:05 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235272AbhEFPeA (ORCPT ); Thu, 6 May 2021 11:34:00 -0400 Received: from mail.kernel.org ([198.145.29.99]:45878 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235267AbhEFPdp (ORCPT ); Thu, 6 May 2021 11:33:45 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 2B80F61168; Thu, 6 May 2021 15:32:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1620315167; bh=Fu4/t9pMjXwvsBTR1oTGCXyaBjHyoagLyBJfrUrRITM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Tvv6Aru/o7L85xCaZOCy8rUW3aMkT6HCjU1p3R9hyH4Y06DgBjU6ma+WfLSk86O8C J2bzfs9PBV9RCicsRr7kyOh673+gkaNBfb4BPPuPefC5HZ4wDjVsJ3t3uBiV7zO57j CBr18OLYW4MkaFxwzGJMZqfO6cGgFVPUy0OvP4P6yQmLuSMdKcUPAf3y+Elp/qRwCd YVdiCiL4lqocEHxmysDM7b2qSP5Vl3YaIN+mDmSkKekQRQoIZn+3i61kooaL16Jtx0 0iqmdbmL+i8P4tcl6Vw8bx0Ge86s2T6bB0PnlCn/5rtMspqoMy2Jlpr6W3eO3A8HZm or+s1vmzqwNeg== Received: by pali.im (Postfix) id CBBC4BF9; Thu, 6 May 2021 17:32:44 +0200 (CEST) From: =?UTF-8?q?Pali=20Roh=C3=A1r?= To: Lorenzo Pieralisi , Thomas Petazzoni , Rob Herring , Bjorn Helgaas Cc: Russell King , =?UTF-8?q?Marek=20Beh=C3=BAn?= , Remi Pommarel , Xogium , Tomasz Maciej Nowak , Marc Zyngier , linux-pci@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH 03/42] PCI: aardvark: Fix checking for PIO status Date: Thu, 6 May 2021 17:31:14 +0200 Message-Id: <20210506153153.30454-4-pali@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20210506153153.30454-1-pali@kernel.org> References: <20210506153153.30454-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-kernel@vger.kernel.org From: Evan Wang There is an issue that when PCIe switch is connected to an Armada 3700 board, there will be lots of warnings about PIO errors when reading the config space. According to Aardvark PIO read and write sequence in HW specification, the current way to check PIO status has the following issues: 1) For PIO read operation, it reports the error message, which should be avoided according to HW specification. 2) For PIO read and write operations, it only checks PIO operation complete status, which is not enough, and error status should also be checked. This patch aligns the code with Aardvark PIO read and write sequence in HW specification on PIO status check and fix the warnings when reading config space. This patch also returns Completion Retry Status value when the read request timeout, to give the caller a chance to send the request again instead of failing. Signed-off-by: Evan Wang Reviewed-by: Victor Gu Tested-by: Victor Gu [pali: Return CRS also after timeout] Signed-off-by: Pali Rohár Reviewed-by: Marek Behún Cc: stable@vger.kernel.org # b1bd5714472c ("PCI: aardvark: Indicate error in 'val' when config read fails") --- drivers/pci/controller/pci-aardvark.c | 93 +++++++++++++++++++++++---- 1 file changed, 80 insertions(+), 13 deletions(-) diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c index 2f8380a1f84f..a37ba86f1b2d 100644 --- a/drivers/pci/controller/pci-aardvark.c +++ b/drivers/pci/controller/pci-aardvark.c @@ -58,6 +58,7 @@ #define PIO_COMPLETION_STATUS_CRS 2 #define PIO_COMPLETION_STATUS_CA 4 #define PIO_NON_POSTED_REQ BIT(10) +#define PIO_ERR_STATUS BIT(11) #define PIO_ADDR_LS (PIO_BASE_ADDR + 0x8) #define PIO_ADDR_MS (PIO_BASE_ADDR + 0xc) #define PIO_WR_DATA (PIO_BASE_ADDR + 0x10) @@ -176,6 +177,9 @@ #define MSI_IRQ_NUM 32 +#define CFG_RD_UR_VAL 0xffffffff +#define CFG_RD_CRS_VAL 0xffff0001 + struct advk_pcie { struct platform_device *pdev; void __iomem *base; @@ -461,7 +465,7 @@ static void advk_pcie_setup_hw(struct advk_pcie *pcie) advk_writel(pcie, reg, PCIE_CORE_CMD_STATUS_REG); } -static void advk_pcie_check_pio_status(struct advk_pcie *pcie) +static int advk_pcie_check_pio_status(struct advk_pcie *pcie, u32 *val) { struct device *dev = &pcie->pdev->dev; u32 reg; @@ -472,15 +476,50 @@ static void advk_pcie_check_pio_status(struct advk_pcie *pcie) status = (reg & PIO_COMPLETION_STATUS_MASK) >> PIO_COMPLETION_STATUS_SHIFT; - if (!status) - return; - + /* + * According to HW spec, the PIO status check sequence as below: + * 1) even if COMPLETION_STATUS(bit9:7) indicates successful, + * it still needs to check Error Status(bit11), only when this bit + * indicates no error happen, the operation is successful. + * 2) value Unsupported Request(1) of COMPLETION_STATUS(bit9:7) only + * means a PIO write error, and for PIO read it is successful with + * a read value of 0xFFFFFFFF. + * 3) value Completion Retry Status(CRS) of COMPLETION_STATUS(bit9:7) + * only means a PIO write error, and for PIO read it is successful + * with a read value of 0xFFFF0001. + * 4) value Completer Abort (CA) of COMPLETION_STATUS(bit9:7) means + * error for both PIO read and PIO write operation. + * 5) other errors are indicated as 'unknown'. + */ switch (status) { + case PIO_COMPLETION_STATUS_OK: + if (reg & PIO_ERR_STATUS) { + strcomp_status = "COMP_ERR"; + break; + } + /* Get the read result */ + if (val) + *val = advk_readl(pcie, PIO_RD_DATA); + /* No error */ + strcomp_status = NULL; + break; case PIO_COMPLETION_STATUS_UR: - strcomp_status = "UR"; + if (val) { + /* For reading, UR is not an error status */ + *val = CFG_RD_UR_VAL; + strcomp_status = NULL; + } else { + strcomp_status = "UR"; + } break; case PIO_COMPLETION_STATUS_CRS: - strcomp_status = "CRS"; + if (val) { + /* For reading, CRS is not an error status */ + *val = CFG_RD_CRS_VAL; + strcomp_status = NULL; + } else { + strcomp_status = "CRS"; + } break; case PIO_COMPLETION_STATUS_CA: strcomp_status = "CA"; @@ -490,6 +529,9 @@ static void advk_pcie_check_pio_status(struct advk_pcie *pcie) break; } + if (!strcomp_status) + return 0; + if (reg & PIO_NON_POSTED_REQ) str_posted = "Non-posted"; else @@ -497,6 +539,8 @@ static void advk_pcie_check_pio_status(struct advk_pcie *pcie) dev_err(dev, "%s PIO Response Status: %s, %#x @ %#x\n", str_posted, strcomp_status, reg, advk_readl(pcie, PIO_ADDR_LS)); + + return -EFAULT; } static int advk_pcie_wait_pio(struct advk_pcie *pcie) @@ -703,8 +747,17 @@ static int advk_pcie_rd_conf(struct pci_bus *bus, u32 devfn, size, val); if (advk_pcie_pio_is_running(pcie)) { - *val = 0xffffffff; - return PCIBIOS_SET_FAILED; + /* + * For PCI_VENDOR_ID register, return Completion Retry Status + * so caller tries to issue the request again insted of failing + */ + if (where == PCI_VENDOR_ID) { + *val = CFG_RD_CRS_VAL; + return PCIBIOS_SUCCESSFUL; + } else { + *val = 0xffffffff; + return PCIBIOS_SET_FAILED; + } } /* Program the control register */ @@ -729,15 +782,27 @@ static int advk_pcie_rd_conf(struct pci_bus *bus, u32 devfn, advk_writel(pcie, 1, PIO_START); ret = advk_pcie_wait_pio(pcie); + if (ret < 0) { + /* + * For PCI_VENDOR_ID register, return Completion Retry Status + * so caller tries to issue the request again instead of failing + */ + if (where == PCI_VENDOR_ID) { + *val = CFG_RD_CRS_VAL; + return PCIBIOS_SUCCESSFUL; + } else { + *val = 0xffffffff; + return PCIBIOS_SET_FAILED; + } + } + + /* Check PIO status and get the read result */ + ret = advk_pcie_check_pio_status(pcie, val); if (ret < 0) { *val = 0xffffffff; return PCIBIOS_SET_FAILED; } - advk_pcie_check_pio_status(pcie); - - /* Get the read result */ - *val = advk_readl(pcie, PIO_RD_DATA); if (size == 1) *val = (*val >> (8 * (where & 3))) & 0xff; else if (size == 2) @@ -801,7 +866,9 @@ static int advk_pcie_wr_conf(struct pci_bus *bus, u32 devfn, if (ret < 0) return PCIBIOS_SET_FAILED; - advk_pcie_check_pio_status(pcie); + ret = advk_pcie_check_pio_status(pcie, NULL); + if (ret < 0) + return PCIBIOS_SET_FAILED; return PCIBIOS_SUCCESSFUL; } -- 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 X-Spam-Level: X-Spam-Status: No, score=-17.7 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7EC60C43460 for ; Thu, 6 May 2021 15:35:05 +0000 (UTC) Received: from desiato.infradead.org (desiato.infradead.org [90.155.92.199]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id E5E40610C8 for ; Thu, 6 May 2021 15:35:04 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org E5E40610C8 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=kernel.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=desiato.20200630; 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=XKdJc69t4jzQv5fDH/KMQIu92JKaM4kdG1DAXBX7xTU=; b=gVR2PZTXfIellg5wiL3yLbvcJ NVkfIUdKG7Hts6HJWiwRLDLGNUjK45CW1d2+va8D3IlY3ghj8zp8/YuLv1RdsyNPMKbSbGV1VEaR6 vCMzIexGZKkbB/HYnU84i4TrkgHYbqM8NFFTYcuzCqzxJXrZdgQxNa3HGKQJLTOa1GwJYhxo4//eo qvi46rexpDICswlYCV2tw51NqtqlaenmMXtnzW1Ocuz1oCeU9qgvmIWr6BLJI5TZPnKP4vJeo2zL9 Ehv/QulVat+Y9mNGZKTS+kkDyHWq7htD25pgzipVlft+wwny66OVNEZPrVu6X2kDH032qohHBbETO N3QNjRH0w==; Received: from localhost ([::1] helo=desiato.infradead.org) by desiato.infradead.org with esmtp (Exim 4.94 #2 (Red Hat Linux)) id 1leg0N-004aIA-DP; Thu, 06 May 2021 15:33:35 +0000 Received: from bombadil.infradead.org ([2607:7c80:54:e::133]) by desiato.infradead.org with esmtps (Exim 4.94 #2 (Red Hat Linux)) id 1lefzg-004a2p-Hi for linux-arm-kernel@desiato.infradead.org; Thu, 06 May 2021 15:32:52 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20210309; h=Content-Transfer-Encoding: Content-Type:MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc: To:From:Sender:Reply-To:Content-ID:Content-Description; bh=XsPgc7bIvYP03GMTAo4H2GSsadfaTqDy1rGt8fB9ZbI=; b=miwFXIk0bIIpeI8wGXMUy5Pn1N 2g1/FqhMtgDkvJlSXTCVu3Hw/oskDCPakZz90yAVWxMsGw4sGDc1MZLx45h+oNcezleuUigtHwD6D GJxjqx03x0HMke36Z0WRCZd9iZsjPWkszJWBmVVYB7jTLpDjJnLZKkpW3F1jmxnO8l+JrJAXNUdy/ sweIH/JJTeR9YLS4EBsvbiSNlqkzvZz2AWHo0WkSDGIAD+cdk/VEbTIWBEk6htKFE2TJwfJDa1HKV 4Xh/IOS5KK+v3iO9/onFZEka5g35HRWNJKALwPi+vCFkZQXhYgQ5F3F3AkcZ/VYB49UNQqtq5xUD5 nvjqchFA==; Received: from mail.kernel.org ([198.145.29.99]) by bombadil.infradead.org with esmtps (Exim 4.94 #2 (Red Hat Linux)) id 1lefzb-0069f4-W4 for linux-arm-kernel@lists.infradead.org; Thu, 06 May 2021 15:32:51 +0000 Received: by mail.kernel.org (Postfix) with ESMTPSA id 2B80F61168; Thu, 6 May 2021 15:32:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1620315167; bh=Fu4/t9pMjXwvsBTR1oTGCXyaBjHyoagLyBJfrUrRITM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Tvv6Aru/o7L85xCaZOCy8rUW3aMkT6HCjU1p3R9hyH4Y06DgBjU6ma+WfLSk86O8C J2bzfs9PBV9RCicsRr7kyOh673+gkaNBfb4BPPuPefC5HZ4wDjVsJ3t3uBiV7zO57j CBr18OLYW4MkaFxwzGJMZqfO6cGgFVPUy0OvP4P6yQmLuSMdKcUPAf3y+Elp/qRwCd YVdiCiL4lqocEHxmysDM7b2qSP5Vl3YaIN+mDmSkKekQRQoIZn+3i61kooaL16Jtx0 0iqmdbmL+i8P4tcl6Vw8bx0Ge86s2T6bB0PnlCn/5rtMspqoMy2Jlpr6W3eO3A8HZm or+s1vmzqwNeg== Received: by pali.im (Postfix) id CBBC4BF9; Thu, 6 May 2021 17:32:44 +0200 (CEST) From: =?UTF-8?q?Pali=20Roh=C3=A1r?= To: Lorenzo Pieralisi , Thomas Petazzoni , Rob Herring , Bjorn Helgaas Cc: Russell King , =?UTF-8?q?Marek=20Beh=C3=BAn?= , Remi Pommarel , Xogium , Tomasz Maciej Nowak , Marc Zyngier , linux-pci@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH 03/42] PCI: aardvark: Fix checking for PIO status Date: Thu, 6 May 2021 17:31:14 +0200 Message-Id: <20210506153153.30454-4-pali@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20210506153153.30454-1-pali@kernel.org> References: <20210506153153.30454-1-pali@kernel.org> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210506_083248_176761_6C62D4DB X-CRM114-Status: GOOD ( 25.19 ) 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 RnJvbTogRXZhbiBXYW5nIDx4c3dhbmdAbWFydmVsbC5jb20+CgpUaGVyZSBpcyBhbiBpc3N1ZSB0 aGF0IHdoZW4gUENJZSBzd2l0Y2ggaXMgY29ubmVjdGVkIHRvIGFuIEFybWFkYSAzNzAwCmJvYXJk LCB0aGVyZSB3aWxsIGJlIGxvdHMgb2Ygd2FybmluZ3MgYWJvdXQgUElPIGVycm9ycyB3aGVuIHJl YWRpbmcgdGhlCmNvbmZpZyBzcGFjZS4gQWNjb3JkaW5nIHRvIEFhcmR2YXJrIFBJTyByZWFkIGFu ZCB3cml0ZSBzZXF1ZW5jZSBpbiBIVwpzcGVjaWZpY2F0aW9uLCB0aGUgY3VycmVudCB3YXkgdG8g Y2hlY2sgUElPIHN0YXR1cyBoYXMgdGhlIGZvbGxvd2luZwppc3N1ZXM6CgoxKSBGb3IgUElPIHJl YWQgb3BlcmF0aW9uLCBpdCByZXBvcnRzIHRoZSBlcnJvciBtZXNzYWdlLCB3aGljaCBzaG91bGQg YmUKICAgYXZvaWRlZCBhY2NvcmRpbmcgdG8gSFcgc3BlY2lmaWNhdGlvbi4KCjIpIEZvciBQSU8g cmVhZCBhbmQgd3JpdGUgb3BlcmF0aW9ucywgaXQgb25seSBjaGVja3MgUElPIG9wZXJhdGlvbiBj b21wbGV0ZQogICBzdGF0dXMsIHdoaWNoIGlzIG5vdCBlbm91Z2gsIGFuZCBlcnJvciBzdGF0dXMg c2hvdWxkIGFsc28gYmUgY2hlY2tlZC4KClRoaXMgcGF0Y2ggYWxpZ25zIHRoZSBjb2RlIHdpdGgg QWFyZHZhcmsgUElPIHJlYWQgYW5kIHdyaXRlIHNlcXVlbmNlIGluIEhXCnNwZWNpZmljYXRpb24g b24gUElPIHN0YXR1cyBjaGVjayBhbmQgZml4IHRoZSB3YXJuaW5ncyB3aGVuIHJlYWRpbmcgY29u ZmlnCnNwYWNlLgoKVGhpcyBwYXRjaCBhbHNvIHJldHVybnMgQ29tcGxldGlvbiBSZXRyeSBTdGF0 dXMgdmFsdWUgd2hlbiB0aGUgcmVhZCByZXF1ZXN0CnRpbWVvdXQsIHRvIGdpdmUgdGhlIGNhbGxl ciBhIGNoYW5jZSB0byBzZW5kIHRoZSByZXF1ZXN0IGFnYWluIGluc3RlYWQgb2YKZmFpbGluZy4K ClNpZ25lZC1vZmYtYnk6IEV2YW4gV2FuZyA8eHN3YW5nQG1hcnZlbGwuY29tPgpSZXZpZXdlZC1i eTogVmljdG9yIEd1IDx4aWd1QG1hcnZlbGwuY29tPgpUZXN0ZWQtYnk6IFZpY3RvciBHdSA8eGln dUBtYXJ2ZWxsLmNvbT4KW3BhbGk6IFJldHVybiBDUlMgYWxzbyBhZnRlciB0aW1lb3V0XQpTaWdu ZWQtb2ZmLWJ5OiBQYWxpIFJvaMOhciA8cGFsaUBrZXJuZWwub3JnPgpSZXZpZXdlZC1ieTogTWFy ZWsgQmVow7puIDxrYWJlbEBrZXJuZWwub3JnPgpDYzogc3RhYmxlQHZnZXIua2VybmVsLm9yZyAj IGIxYmQ1NzE0NDcyYyAoIlBDSTogYWFyZHZhcms6IEluZGljYXRlIGVycm9yIGluICd2YWwnIHdo ZW4gY29uZmlnIHJlYWQgZmFpbHMiKQotLS0KIGRyaXZlcnMvcGNpL2NvbnRyb2xsZXIvcGNpLWFh cmR2YXJrLmMgfCA5MyArKysrKysrKysrKysrKysrKysrKysrKy0tLS0KIDEgZmlsZSBjaGFuZ2Vk LCA4MCBpbnNlcnRpb25zKCspLCAxMyBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9kcml2ZXJz L3BjaS9jb250cm9sbGVyL3BjaS1hYXJkdmFyay5jIGIvZHJpdmVycy9wY2kvY29udHJvbGxlci9w Y2ktYWFyZHZhcmsuYwppbmRleCAyZjgzODBhMWY4NGYuLmEzN2JhODZmMWIyZCAxMDA2NDQKLS0t IGEvZHJpdmVycy9wY2kvY29udHJvbGxlci9wY2ktYWFyZHZhcmsuYworKysgYi9kcml2ZXJzL3Bj aS9jb250cm9sbGVyL3BjaS1hYXJkdmFyay5jCkBAIC01OCw2ICs1OCw3IEBACiAjZGVmaW5lICAg UElPX0NPTVBMRVRJT05fU1RBVFVTX0NSUwkJMgogI2RlZmluZSAgIFBJT19DT01QTEVUSU9OX1NU QVRVU19DQQkJNAogI2RlZmluZSAgIFBJT19OT05fUE9TVEVEX1JFUQkJCUJJVCgxMCkKKyNkZWZp bmUgICBQSU9fRVJSX1NUQVRVUwkJCUJJVCgxMSkKICNkZWZpbmUgUElPX0FERFJfTFMJCQkJKFBJ T19CQVNFX0FERFIgKyAweDgpCiAjZGVmaW5lIFBJT19BRERSX01TCQkJCShQSU9fQkFTRV9BRERS ICsgMHhjKQogI2RlZmluZSBQSU9fV1JfREFUQQkJCQkoUElPX0JBU0VfQUREUiArIDB4MTApCkBA IC0xNzYsNiArMTc3LDkgQEAKIAogI2RlZmluZSBNU0lfSVJRX05VTQkJCTMyCiAKKyNkZWZpbmUg Q0ZHX1JEX1VSX1ZBTAkJCTB4ZmZmZmZmZmYKKyNkZWZpbmUgQ0ZHX1JEX0NSU19WQUwJCQkweGZm ZmYwMDAxCisKIHN0cnVjdCBhZHZrX3BjaWUgewogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBk ZXY7CiAJdm9pZCBfX2lvbWVtICpiYXNlOwpAQCAtNDYxLDcgKzQ2NSw3IEBAIHN0YXRpYyB2b2lk IGFkdmtfcGNpZV9zZXR1cF9odyhzdHJ1Y3QgYWR2a19wY2llICpwY2llKQogCWFkdmtfd3JpdGVs KHBjaWUsIHJlZywgUENJRV9DT1JFX0NNRF9TVEFUVVNfUkVHKTsKIH0KIAotc3RhdGljIHZvaWQg YWR2a19wY2llX2NoZWNrX3Bpb19zdGF0dXMoc3RydWN0IGFkdmtfcGNpZSAqcGNpZSkKK3N0YXRp YyBpbnQgYWR2a19wY2llX2NoZWNrX3Bpb19zdGF0dXMoc3RydWN0IGFkdmtfcGNpZSAqcGNpZSwg dTMyICp2YWwpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJnBjaWUtPnBkZXYtPmRldjsKIAl1 MzIgcmVnOwpAQCAtNDcyLDE1ICs0NzYsNTAgQEAgc3RhdGljIHZvaWQgYWR2a19wY2llX2NoZWNr X3Bpb19zdGF0dXMoc3RydWN0IGFkdmtfcGNpZSAqcGNpZSkKIAlzdGF0dXMgPSAocmVnICYgUElP X0NPTVBMRVRJT05fU1RBVFVTX01BU0spID4+CiAJCVBJT19DT01QTEVUSU9OX1NUQVRVU19TSElG VDsKIAotCWlmICghc3RhdHVzKQotCQlyZXR1cm47Ci0KKwkvKgorCSAqIEFjY29yZGluZyB0byBI VyBzcGVjLCB0aGUgUElPIHN0YXR1cyBjaGVjayBzZXF1ZW5jZSBhcyBiZWxvdzoKKwkgKiAxKSBl dmVuIGlmIENPTVBMRVRJT05fU1RBVFVTKGJpdDk6NykgaW5kaWNhdGVzIHN1Y2Nlc3NmdWwsCisJ ICogICAgaXQgc3RpbGwgbmVlZHMgdG8gY2hlY2sgRXJyb3IgU3RhdHVzKGJpdDExKSwgb25seSB3 aGVuIHRoaXMgYml0CisJICogICAgaW5kaWNhdGVzIG5vIGVycm9yIGhhcHBlbiwgdGhlIG9wZXJh dGlvbiBpcyBzdWNjZXNzZnVsLgorCSAqIDIpIHZhbHVlIFVuc3VwcG9ydGVkIFJlcXVlc3QoMSkg b2YgQ09NUExFVElPTl9TVEFUVVMoYml0OTo3KSBvbmx5CisJICogICAgbWVhbnMgYSBQSU8gd3Jp dGUgZXJyb3IsIGFuZCBmb3IgUElPIHJlYWQgaXQgaXMgc3VjY2Vzc2Z1bCB3aXRoCisJICogICAg YSByZWFkIHZhbHVlIG9mIDB4RkZGRkZGRkYuCisJICogMykgdmFsdWUgQ29tcGxldGlvbiBSZXRy eSBTdGF0dXMoQ1JTKSBvZiBDT01QTEVUSU9OX1NUQVRVUyhiaXQ5OjcpCisJICogICAgb25seSBt ZWFucyBhIFBJTyB3cml0ZSBlcnJvciwgYW5kIGZvciBQSU8gcmVhZCBpdCBpcyBzdWNjZXNzZnVs CisJICogICAgd2l0aCBhIHJlYWQgdmFsdWUgb2YgMHhGRkZGMDAwMS4KKwkgKiA0KSB2YWx1ZSBD b21wbGV0ZXIgQWJvcnQgKENBKSBvZiBDT01QTEVUSU9OX1NUQVRVUyhiaXQ5OjcpIG1lYW5zCisJ ICogICAgZXJyb3IgZm9yIGJvdGggUElPIHJlYWQgYW5kIFBJTyB3cml0ZSBvcGVyYXRpb24uCisJ ICogNSkgb3RoZXIgZXJyb3JzIGFyZSBpbmRpY2F0ZWQgYXMgJ3Vua25vd24nLgorCSAqLwogCXN3 aXRjaCAoc3RhdHVzKSB7CisJY2FzZSBQSU9fQ09NUExFVElPTl9TVEFUVVNfT0s6CisJCWlmIChy ZWcgJiBQSU9fRVJSX1NUQVRVUykgeworCQkJc3RyY29tcF9zdGF0dXMgPSAiQ09NUF9FUlIiOwor CQkJYnJlYWs7CisJCX0KKwkJLyogR2V0IHRoZSByZWFkIHJlc3VsdCAqLworCQlpZiAodmFsKQor CQkJKnZhbCA9IGFkdmtfcmVhZGwocGNpZSwgUElPX1JEX0RBVEEpOworCQkvKiBObyBlcnJvciAq LworCQlzdHJjb21wX3N0YXR1cyA9IE5VTEw7CisJCWJyZWFrOwogCWNhc2UgUElPX0NPTVBMRVRJ T05fU1RBVFVTX1VSOgotCQlzdHJjb21wX3N0YXR1cyA9ICJVUiI7CisJCWlmICh2YWwpIHsKKwkJ CS8qIEZvciByZWFkaW5nLCBVUiBpcyBub3QgYW4gZXJyb3Igc3RhdHVzICovCisJCQkqdmFsID0g Q0ZHX1JEX1VSX1ZBTDsKKwkJCXN0cmNvbXBfc3RhdHVzID0gTlVMTDsKKwkJfSBlbHNlIHsKKwkJ CXN0cmNvbXBfc3RhdHVzID0gIlVSIjsKKwkJfQogCQlicmVhazsKIAljYXNlIFBJT19DT01QTEVU SU9OX1NUQVRVU19DUlM6Ci0JCXN0cmNvbXBfc3RhdHVzID0gIkNSUyI7CisJCWlmICh2YWwpIHsK KwkJCS8qIEZvciByZWFkaW5nLCBDUlMgaXMgbm90IGFuIGVycm9yIHN0YXR1cyAqLworCQkJKnZh bCA9IENGR19SRF9DUlNfVkFMOworCQkJc3RyY29tcF9zdGF0dXMgPSBOVUxMOworCQl9IGVsc2Ug eworCQkJc3RyY29tcF9zdGF0dXMgPSAiQ1JTIjsKKwkJfQogCQlicmVhazsKIAljYXNlIFBJT19D T01QTEVUSU9OX1NUQVRVU19DQToKIAkJc3RyY29tcF9zdGF0dXMgPSAiQ0EiOwpAQCAtNDkwLDYg KzUyOSw5IEBAIHN0YXRpYyB2b2lkIGFkdmtfcGNpZV9jaGVja19waW9fc3RhdHVzKHN0cnVjdCBh ZHZrX3BjaWUgKnBjaWUpCiAJCWJyZWFrOwogCX0KIAorCWlmICghc3RyY29tcF9zdGF0dXMpCisJ CXJldHVybiAwOworCiAJaWYgKHJlZyAmIFBJT19OT05fUE9TVEVEX1JFUSkKIAkJc3RyX3Bvc3Rl ZCA9ICJOb24tcG9zdGVkIjsKIAllbHNlCkBAIC00OTcsNiArNTM5LDggQEAgc3RhdGljIHZvaWQg YWR2a19wY2llX2NoZWNrX3Bpb19zdGF0dXMoc3RydWN0IGFkdmtfcGNpZSAqcGNpZSkKIAogCWRl dl9lcnIoZGV2LCAiJXMgUElPIFJlc3BvbnNlIFN0YXR1czogJXMsICUjeCBAICUjeFxuIiwKIAkJ c3RyX3Bvc3RlZCwgc3RyY29tcF9zdGF0dXMsIHJlZywgYWR2a19yZWFkbChwY2llLCBQSU9fQURE Ul9MUykpOworCisJcmV0dXJuIC1FRkFVTFQ7CiB9CiAKIHN0YXRpYyBpbnQgYWR2a19wY2llX3dh aXRfcGlvKHN0cnVjdCBhZHZrX3BjaWUgKnBjaWUpCkBAIC03MDMsOCArNzQ3LDE3IEBAIHN0YXRp YyBpbnQgYWR2a19wY2llX3JkX2NvbmYoc3RydWN0IHBjaV9idXMgKmJ1cywgdTMyIGRldmZuLAog CQkJCQkJIHNpemUsIHZhbCk7CiAKIAlpZiAoYWR2a19wY2llX3Bpb19pc19ydW5uaW5nKHBjaWUp KSB7Ci0JCSp2YWwgPSAweGZmZmZmZmZmOwotCQlyZXR1cm4gUENJQklPU19TRVRfRkFJTEVEOwor CQkvKgorCQkgKiBGb3IgUENJX1ZFTkRPUl9JRCByZWdpc3RlciwgcmV0dXJuIENvbXBsZXRpb24g UmV0cnkgU3RhdHVzCisJCSAqIHNvIGNhbGxlciB0cmllcyB0byBpc3N1ZSB0aGUgcmVxdWVzdCBh Z2FpbiBpbnN0ZWQgb2YgZmFpbGluZworCQkgKi8KKwkJaWYgKHdoZXJlID09IFBDSV9WRU5ET1Jf SUQpIHsKKwkJCSp2YWwgPSBDRkdfUkRfQ1JTX1ZBTDsKKwkJCXJldHVybiBQQ0lCSU9TX1NVQ0NF U1NGVUw7CisJCX0gZWxzZSB7CisJCQkqdmFsID0gMHhmZmZmZmZmZjsKKwkJCXJldHVybiBQQ0lC SU9TX1NFVF9GQUlMRUQ7CisJCX0KIAl9CiAKIAkvKiBQcm9ncmFtIHRoZSBjb250cm9sIHJlZ2lz dGVyICovCkBAIC03MjksMTUgKzc4MiwyNyBAQCBzdGF0aWMgaW50IGFkdmtfcGNpZV9yZF9jb25m KHN0cnVjdCBwY2lfYnVzICpidXMsIHUzMiBkZXZmbiwKIAlhZHZrX3dyaXRlbChwY2llLCAxLCBQ SU9fU1RBUlQpOwogCiAJcmV0ID0gYWR2a19wY2llX3dhaXRfcGlvKHBjaWUpOworCWlmIChyZXQg PCAwKSB7CisJCS8qCisJCSAqIEZvciBQQ0lfVkVORE9SX0lEIHJlZ2lzdGVyLCByZXR1cm4gQ29t cGxldGlvbiBSZXRyeSBTdGF0dXMKKwkJICogc28gY2FsbGVyIHRyaWVzIHRvIGlzc3VlIHRoZSBy ZXF1ZXN0IGFnYWluIGluc3RlYWQgb2YgZmFpbGluZworCQkgKi8KKwkJaWYgKHdoZXJlID09IFBD SV9WRU5ET1JfSUQpIHsKKwkJCSp2YWwgPSBDRkdfUkRfQ1JTX1ZBTDsKKwkJCXJldHVybiBQQ0lC SU9TX1NVQ0NFU1NGVUw7CisJCX0gZWxzZSB7CisJCQkqdmFsID0gMHhmZmZmZmZmZjsKKwkJCXJl dHVybiBQQ0lCSU9TX1NFVF9GQUlMRUQ7CisJCX0KKwl9CisKKwkvKiBDaGVjayBQSU8gc3RhdHVz IGFuZCBnZXQgdGhlIHJlYWQgcmVzdWx0ICovCisJcmV0ID0gYWR2a19wY2llX2NoZWNrX3Bpb19z dGF0dXMocGNpZSwgdmFsKTsKIAlpZiAocmV0IDwgMCkgewogCQkqdmFsID0gMHhmZmZmZmZmZjsK IAkJcmV0dXJuIFBDSUJJT1NfU0VUX0ZBSUxFRDsKIAl9CiAKLQlhZHZrX3BjaWVfY2hlY2tfcGlv X3N0YXR1cyhwY2llKTsKLQotCS8qIEdldCB0aGUgcmVhZCByZXN1bHQgKi8KLQkqdmFsID0gYWR2 a19yZWFkbChwY2llLCBQSU9fUkRfREFUQSk7CiAJaWYgKHNpemUgPT0gMSkKIAkJKnZhbCA9ICgq dmFsID4+ICg4ICogKHdoZXJlICYgMykpKSAmIDB4ZmY7CiAJZWxzZSBpZiAoc2l6ZSA9PSAyKQpA QCAtODAxLDcgKzg2Niw5IEBAIHN0YXRpYyBpbnQgYWR2a19wY2llX3dyX2NvbmYoc3RydWN0IHBj aV9idXMgKmJ1cywgdTMyIGRldmZuLAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gUENJQklPU19T RVRfRkFJTEVEOwogCi0JYWR2a19wY2llX2NoZWNrX3Bpb19zdGF0dXMocGNpZSk7CisJcmV0ID0g YWR2a19wY2llX2NoZWNrX3Bpb19zdGF0dXMocGNpZSwgTlVMTCk7CisJaWYgKHJldCA8IDApCisJ CXJldHVybiBQQ0lCSU9TX1NFVF9GQUlMRUQ7CiAKIAlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVM OwogfQotLSAKMi4yMC4xCgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX18KbGludXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBs aXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlz dGluZm8vbGludXgtYXJtLWtlcm5lbAo=