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=-10.1 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,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 995F6C433DF for ; Thu, 18 Jun 2020 02:39:50 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 7054220720 for ; Thu, 18 Jun 2020 02:39:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1592447990; bh=kxqYAnNo0yfJL0M5VhwLgRuBA7I/XIp6kxVkT84dpAs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:List-ID:From; b=lg74H6eagUwa5uS66NpINnKp44CkyCco7wEj+367XltYlKC8AQD9tirNLUZcKFo1d my1ajTvVBGOtwkoOXPkNETC6DauyR5y0SAk0oygt4+NRbq0P7BtIIMM8CjWpyHrnHB vXlORM0v8WDM3jATV6BXcoD4fVBBz1eFFFOwVLho= Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728078AbgFRBM5 (ORCPT ); Wed, 17 Jun 2020 21:12:57 -0400 Received: from mail.kernel.org ([198.145.29.99]:41804 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729013AbgFRBM4 (ORCPT ); Wed, 17 Jun 2020 21:12:56 -0400 Received: from sasha-vm.mshome.net (c-73-47-72-35.hsd1.nh.comcast.net [73.47.72.35]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id AD6D520EDD; Thu, 18 Jun 2020 01:12:54 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1592442775; bh=kxqYAnNo0yfJL0M5VhwLgRuBA7I/XIp6kxVkT84dpAs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=YiWnTlLwtNZhH/fHnK3OFgSviK/nUa/xs0ojD8qXfiwKSNlIgzZMOHstq1YStG/VS 4D4jPfxo4IVbUIRcrhE2sdipb/jm+CKRwQesH2U5X+YGLNM6XuxYI0d4DSeHzsL6CN WVnzUl09YEWQeIudKBvW28BCC2yZUWkuNY1O3nBQ= From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: =?UTF-8?q?Marek=20Beh=C3=BAn?= , Tomasz Maciej Nowak , =?UTF-8?q?Pali=20Roh=C3=A1r?= , Lorenzo Pieralisi , Rob Herring , Thomas Petazzoni , Sasha Levin , linux-pci@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: [PATCH AUTOSEL 5.7 222/388] PCI: aardvark: Improve link training Date: Wed, 17 Jun 2020 21:05:19 -0400 Message-Id: <20200618010805.600873-222-sashal@kernel.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200618010805.600873-1-sashal@kernel.org> References: <20200618010805.600873-1-sashal@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: 8bit Sender: linux-pci-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org From: Marek Behún [ Upstream commit 43fc679ced18006b12d918d7a8a4af392b7fbfe7 ] Currently the aardvark driver trains link in PCIe gen2 mode. This may cause some buggy gen1 cards (such as Compex WLE900VX) to be unstable or even not detected. Moreover when ASPM code tries to retrain link second time, these cards may stop responding and link goes down. If gen1 is used this does not happen. Unconditionally forcing gen1 is not a good solution since it may have performance impact on gen2 cards. To overcome this, read 'max-link-speed' property (as defined in PCI device tree bindings) and use this as max gen mode. Then iteratively try link training at this mode or lower until successful. After successful link training choose final controller gen based on Negotiated Link Speed from Link Status register, which should match card speed. Link: https://lore.kernel.org/r/20200430080625.26070-5-pali@kernel.org Tested-by: Tomasz Maciej Nowak Signed-off-by: Pali Rohár Signed-off-by: Marek Behún Signed-off-by: Lorenzo Pieralisi Reviewed-by: Rob Herring Acked-by: Thomas Petazzoni Signed-off-by: Sasha Levin --- drivers/pci/controller/pci-aardvark.c | 114 ++++++++++++++++++++------ 1 file changed, 89 insertions(+), 25 deletions(-) diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c index 74b90940a9d4..e202f954eb84 100644 --- a/drivers/pci/controller/pci-aardvark.c +++ b/drivers/pci/controller/pci-aardvark.c @@ -40,6 +40,7 @@ #define PCIE_CORE_LINK_CTRL_STAT_REG 0xd0 #define PCIE_CORE_LINK_L0S_ENTRY BIT(0) #define PCIE_CORE_LINK_TRAINING BIT(5) +#define PCIE_CORE_LINK_SPEED_SHIFT 16 #define PCIE_CORE_LINK_WIDTH_SHIFT 20 #define PCIE_CORE_ERR_CAPCTL_REG 0x118 #define PCIE_CORE_ERR_CAPCTL_ECRC_CHK_TX BIT(5) @@ -201,6 +202,7 @@ struct advk_pcie { struct mutex msi_used_lock; u16 msi_msg; int root_bus_nr; + int link_gen; struct pci_bridge_emul bridge; }; @@ -225,20 +227,16 @@ static int advk_pcie_link_up(struct advk_pcie *pcie) static int advk_pcie_wait_for_link(struct advk_pcie *pcie) { - struct device *dev = &pcie->pdev->dev; int retries; /* check if the link is up or not */ for (retries = 0; retries < LINK_WAIT_MAX_RETRIES; retries++) { - if (advk_pcie_link_up(pcie)) { - dev_info(dev, "link up\n"); + if (advk_pcie_link_up(pcie)) return 0; - } usleep_range(LINK_WAIT_USLEEP_MIN, LINK_WAIT_USLEEP_MAX); } - dev_err(dev, "link never came up\n"); return -ETIMEDOUT; } @@ -253,6 +251,85 @@ static void advk_pcie_wait_for_retrain(struct advk_pcie *pcie) } } +static int advk_pcie_train_at_gen(struct advk_pcie *pcie, int gen) +{ + int ret, neg_gen; + u32 reg; + + /* Setup link speed */ + reg = advk_readl(pcie, PCIE_CORE_CTRL0_REG); + reg &= ~PCIE_GEN_SEL_MSK; + if (gen == 3) + reg |= SPEED_GEN_3; + else if (gen == 2) + reg |= SPEED_GEN_2; + else + reg |= SPEED_GEN_1; + advk_writel(pcie, reg, PCIE_CORE_CTRL0_REG); + + /* + * Enable link training. This is not needed in every call to this + * function, just once suffices, but it does not break anything either. + */ + reg = advk_readl(pcie, PCIE_CORE_CTRL0_REG); + reg |= LINK_TRAINING_EN; + advk_writel(pcie, reg, PCIE_CORE_CTRL0_REG); + + /* + * Start link training immediately after enabling it. + * This solves problems for some buggy cards. + */ + reg = advk_readl(pcie, PCIE_CORE_LINK_CTRL_STAT_REG); + reg |= PCIE_CORE_LINK_TRAINING; + advk_writel(pcie, reg, PCIE_CORE_LINK_CTRL_STAT_REG); + + ret = advk_pcie_wait_for_link(pcie); + if (ret) + return ret; + + reg = advk_readl(pcie, PCIE_CORE_LINK_CTRL_STAT_REG); + neg_gen = (reg >> PCIE_CORE_LINK_SPEED_SHIFT) & 0xf; + + return neg_gen; +} + +static void advk_pcie_train_link(struct advk_pcie *pcie) +{ + struct device *dev = &pcie->pdev->dev; + int neg_gen = -1, gen; + + /* + * Try link training at link gen specified by device tree property + * 'max-link-speed'. If this fails, iteratively train at lower gen. + */ + for (gen = pcie->link_gen; gen > 0; --gen) { + neg_gen = advk_pcie_train_at_gen(pcie, gen); + if (neg_gen > 0) + break; + } + + if (neg_gen < 0) + goto err; + + /* + * After successful training if negotiated gen is lower than requested, + * train again on negotiated gen. This solves some stability issues for + * some buggy gen1 cards. + */ + if (neg_gen < gen) { + gen = neg_gen; + neg_gen = advk_pcie_train_at_gen(pcie, gen); + } + + if (neg_gen == gen) { + dev_info(dev, "link up at gen %i\n", gen); + return; + } + +err: + dev_err(dev, "link never came up\n"); +} + static void advk_pcie_setup_hw(struct advk_pcie *pcie) { u32 reg; @@ -288,12 +365,6 @@ static void advk_pcie_setup_hw(struct advk_pcie *pcie) PCIE_CORE_CTRL2_TD_ENABLE; advk_writel(pcie, reg, PCIE_CORE_CTRL2_REG); - /* Set GEN2 */ - reg = advk_readl(pcie, PCIE_CORE_CTRL0_REG); - reg &= ~PCIE_GEN_SEL_MSK; - reg |= SPEED_GEN_2; - advk_writel(pcie, reg, PCIE_CORE_CTRL0_REG); - /* Set lane X1 */ reg = advk_readl(pcie, PCIE_CORE_CTRL0_REG); reg &= ~LANE_CNT_MSK; @@ -341,20 +412,7 @@ static void advk_pcie_setup_hw(struct advk_pcie *pcie) */ msleep(PCI_PM_D3COLD_WAIT); - /* Enable link training */ - reg = advk_readl(pcie, PCIE_CORE_CTRL0_REG); - reg |= LINK_TRAINING_EN; - advk_writel(pcie, reg, PCIE_CORE_CTRL0_REG); - - /* - * Start link training immediately after enabling it. - * This solves problems for some buggy cards. - */ - reg = advk_readl(pcie, PCIE_CORE_LINK_CTRL_STAT_REG); - reg |= PCIE_CORE_LINK_TRAINING; - advk_writel(pcie, reg, PCIE_CORE_LINK_CTRL_STAT_REG); - - advk_pcie_wait_for_link(pcie); + advk_pcie_train_link(pcie); reg = advk_readl(pcie, PCIE_CORE_CMD_STATUS_REG); reg |= PCIE_CORE_CMD_MEM_ACCESS_EN | @@ -988,6 +1046,12 @@ static int advk_pcie_probe(struct platform_device *pdev) } pcie->root_bus_nr = bus->start; + ret = of_pci_get_max_link_speed(dev->of_node); + if (ret <= 0 || ret > 3) + pcie->link_gen = 3; + else + pcie->link_gen = ret; + advk_pcie_setup_hw(pcie); advk_sw_pci_bridge_init(pcie); -- 2.25.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=-10.0 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE, SPF_PASS,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 E5ADEC433DF for ; Thu, 18 Jun 2020 01:24:42 +0000 (UTC) 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 mail.kernel.org (Postfix) with ESMTPS id B64F621974 for ; Thu, 18 Jun 2020 01:24:42 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="k6QrAfU9"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=kernel.org header.i=@kernel.org header.b="YiWnTlLw" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org B64F621974 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+infradead-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=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=h5wl3Ez3o7iyrzl0HS7gGoPwkdYJQxdg0LMswVQcFQg=; b=k6QrAfU94hlbck xSM1LFeWxnrOtCR3rvN+Rtp0RX8IjPj7Hw90E5jxEJuU5g/Pr9JCihQpryG2UX7CX9khfb4LVUaSS wnxEpR7ihXRXU/ni0n/JHcUrs1v75hIxoWUunLOPdOIwugXLPG6uicbKbluYLJtRMJQUdJPMOESsC 3Xbu3SU8mCkVTb9HYnNnQzXKnZDY6/zt5hMW7ojHSH0gbFlEKPahlwF2oJ/CTev9ksB9ozrTUSA5B KZwLtr91TVKxD2njrRvi4v6NRhvPTDDGgAkDesW/1PVCwO1zPogaeptMCbGwm2Ws3u4sdAL+E8IE7 y8Vv+SrQ/8ADKmmiAPKg==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1jljIB-0007hu-CS; Thu, 18 Jun 2020 01:24:35 +0000 Received: from mail.kernel.org ([198.145.29.99]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jlj6u-0002SY-A1 for linux-arm-kernel@lists.infradead.org; Thu, 18 Jun 2020 01:12:58 +0000 Received: from sasha-vm.mshome.net (c-73-47-72-35.hsd1.nh.comcast.net [73.47.72.35]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id AD6D520EDD; Thu, 18 Jun 2020 01:12:54 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1592442775; bh=kxqYAnNo0yfJL0M5VhwLgRuBA7I/XIp6kxVkT84dpAs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=YiWnTlLwtNZhH/fHnK3OFgSviK/nUa/xs0ojD8qXfiwKSNlIgzZMOHstq1YStG/VS 4D4jPfxo4IVbUIRcrhE2sdipb/jm+CKRwQesH2U5X+YGLNM6XuxYI0d4DSeHzsL6CN WVnzUl09YEWQeIudKBvW28BCC2yZUWkuNY1O3nBQ= From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Subject: [PATCH AUTOSEL 5.7 222/388] PCI: aardvark: Improve link training Date: Wed, 17 Jun 2020 21:05:19 -0400 Message-Id: <20200618010805.600873-222-sashal@kernel.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200618010805.600873-1-sashal@kernel.org> References: <20200618010805.600873-1-sashal@kernel.org> MIME-Version: 1.0 X-stable: review X-Patchwork-Hint: Ignore X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200617_181256_394212_74C008A2 X-CRM114-Status: GOOD ( 18.59 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Tomasz Maciej Nowak , Rob Herring , Lorenzo Pieralisi , Sasha Levin , linux-pci@vger.kernel.org, =?UTF-8?q?Marek=20Beh=C3=BAn?= , Thomas Petazzoni , =?UTF-8?q?Pali=20Roh=C3=A1r?= , linux-arm-kernel@lists.infradead.org Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org RnJvbTogTWFyZWsgQmVow7puIDxtYXJlay5iZWh1bkBuaWMuY3o+CgpbIFVwc3RyZWFtIGNvbW1p dCA0M2ZjNjc5Y2VkMTgwMDZiMTJkOTE4ZDdhOGE0YWYzOTJiN2ZiZmU3IF0KCkN1cnJlbnRseSB0 aGUgYWFyZHZhcmsgZHJpdmVyIHRyYWlucyBsaW5rIGluIFBDSWUgZ2VuMiBtb2RlLiBUaGlzIG1h eQpjYXVzZSBzb21lIGJ1Z2d5IGdlbjEgY2FyZHMgKHN1Y2ggYXMgQ29tcGV4IFdMRTkwMFZYKSB0 byBiZSB1bnN0YWJsZSBvcgpldmVuIG5vdCBkZXRlY3RlZC4gTW9yZW92ZXIgd2hlbiBBU1BNIGNv ZGUgdHJpZXMgdG8gcmV0cmFpbiBsaW5rIHNlY29uZAp0aW1lLCB0aGVzZSBjYXJkcyBtYXkgc3Rv cCByZXNwb25kaW5nIGFuZCBsaW5rIGdvZXMgZG93bi4gSWYgZ2VuMSBpcwp1c2VkIHRoaXMgZG9l cyBub3QgaGFwcGVuLgoKVW5jb25kaXRpb25hbGx5IGZvcmNpbmcgZ2VuMSBpcyBub3QgYSBnb29k IHNvbHV0aW9uIHNpbmNlIGl0IG1heSBoYXZlCnBlcmZvcm1hbmNlIGltcGFjdCBvbiBnZW4yIGNh cmRzLgoKVG8gb3ZlcmNvbWUgdGhpcywgcmVhZCAnbWF4LWxpbmstc3BlZWQnIHByb3BlcnR5IChh cyBkZWZpbmVkIGluIFBDSQpkZXZpY2UgdHJlZSBiaW5kaW5ncykgYW5kIHVzZSB0aGlzIGFzIG1h eCBnZW4gbW9kZS4gVGhlbiBpdGVyYXRpdmVseSB0cnkKbGluayB0cmFpbmluZyBhdCB0aGlzIG1v ZGUgb3IgbG93ZXIgdW50aWwgc3VjY2Vzc2Z1bC4gQWZ0ZXIgc3VjY2Vzc2Z1bApsaW5rIHRyYWlu aW5nIGNob29zZSBmaW5hbCBjb250cm9sbGVyIGdlbiBiYXNlZCBvbiBOZWdvdGlhdGVkIExpbmsg U3BlZWQKZnJvbSBMaW5rIFN0YXR1cyByZWdpc3Rlciwgd2hpY2ggc2hvdWxkIG1hdGNoIGNhcmQg c3BlZWQuCgpMaW5rOiBodHRwczovL2xvcmUua2VybmVsLm9yZy9yLzIwMjAwNDMwMDgwNjI1LjI2 MDcwLTUtcGFsaUBrZXJuZWwub3JnClRlc3RlZC1ieTogVG9tYXN6IE1hY2llaiBOb3dhayA8dG1u NTA1QGdtYWlsLmNvbT4KU2lnbmVkLW9mZi1ieTogUGFsaSBSb2jDoXIgPHBhbGlAa2VybmVsLm9y Zz4KU2lnbmVkLW9mZi1ieTogTWFyZWsgQmVow7puIDxtYXJlay5iZWh1bkBuaWMuY3o+ClNpZ25l ZC1vZmYtYnk6IExvcmVuem8gUGllcmFsaXNpIDxsb3JlbnpvLnBpZXJhbGlzaUBhcm0uY29tPgpS ZXZpZXdlZC1ieTogUm9iIEhlcnJpbmcgPHJvYmhAa2VybmVsLm9yZz4KQWNrZWQtYnk6IFRob21h cyBQZXRhenpvbmkgPHRob21hcy5wZXRhenpvbmlAYm9vdGxpbi5jb20+ClNpZ25lZC1vZmYtYnk6 IFNhc2hhIExldmluIDxzYXNoYWxAa2VybmVsLm9yZz4KLS0tCiBkcml2ZXJzL3BjaS9jb250cm9s bGVyL3BjaS1hYXJkdmFyay5jIHwgMTE0ICsrKysrKysrKysrKysrKysrKysrLS0tLS0tCiAxIGZp bGUgY2hhbmdlZCwgODkgaW5zZXJ0aW9ucygrKSwgMjUgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0 IGEvZHJpdmVycy9wY2kvY29udHJvbGxlci9wY2ktYWFyZHZhcmsuYyBiL2RyaXZlcnMvcGNpL2Nv bnRyb2xsZXIvcGNpLWFhcmR2YXJrLmMKaW5kZXggNzRiOTA5NDBhOWQ0Li5lMjAyZjk1NGViODQg MTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIvcGNpLWFhcmR2YXJrLmMKKysrIGIv ZHJpdmVycy9wY2kvY29udHJvbGxlci9wY2ktYWFyZHZhcmsuYwpAQCAtNDAsNiArNDAsNyBAQAog I2RlZmluZSBQQ0lFX0NPUkVfTElOS19DVFJMX1NUQVRfUkVHCQkJCTB4ZDAKICNkZWZpbmUgICAg IFBDSUVfQ09SRV9MSU5LX0wwU19FTlRSWQkJCQlCSVQoMCkKICNkZWZpbmUgICAgIFBDSUVfQ09S RV9MSU5LX1RSQUlOSU5HCQkJCUJJVCg1KQorI2RlZmluZSAgICAgUENJRV9DT1JFX0xJTktfU1BF RURfU0hJRlQJCQkJMTYKICNkZWZpbmUgICAgIFBDSUVfQ09SRV9MSU5LX1dJRFRIX1NISUZUCQkJ CTIwCiAjZGVmaW5lIFBDSUVfQ09SRV9FUlJfQ0FQQ1RMX1JFRwkJCQkweDExOAogI2RlZmluZSAg ICAgUENJRV9DT1JFX0VSUl9DQVBDVExfRUNSQ19DSEtfVFgJCQlCSVQoNSkKQEAgLTIwMSw2ICsy MDIsNyBAQCBzdHJ1Y3QgYWR2a19wY2llIHsKIAlzdHJ1Y3QgbXV0ZXggbXNpX3VzZWRfbG9jazsK IAl1MTYgbXNpX21zZzsKIAlpbnQgcm9vdF9idXNfbnI7CisJaW50IGxpbmtfZ2VuOwogCXN0cnVj dCBwY2lfYnJpZGdlX2VtdWwgYnJpZGdlOwogfTsKIApAQCAtMjI1LDIwICsyMjcsMTYgQEAgc3Rh dGljIGludCBhZHZrX3BjaWVfbGlua191cChzdHJ1Y3QgYWR2a19wY2llICpwY2llKQogCiBzdGF0 aWMgaW50IGFkdmtfcGNpZV93YWl0X2Zvcl9saW5rKHN0cnVjdCBhZHZrX3BjaWUgKnBjaWUpCiB7 Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gJnBjaWUtPnBkZXYtPmRldjsKIAlpbnQgcmV0cmllczsK IAogCS8qIGNoZWNrIGlmIHRoZSBsaW5rIGlzIHVwIG9yIG5vdCAqLwogCWZvciAocmV0cmllcyA9 IDA7IHJldHJpZXMgPCBMSU5LX1dBSVRfTUFYX1JFVFJJRVM7IHJldHJpZXMrKykgewotCQlpZiAo YWR2a19wY2llX2xpbmtfdXAocGNpZSkpIHsKLQkJCWRldl9pbmZvKGRldiwgImxpbmsgdXBcbiIp OworCQlpZiAoYWR2a19wY2llX2xpbmtfdXAocGNpZSkpCiAJCQlyZXR1cm4gMDsKLQkJfQogCiAJ CXVzbGVlcF9yYW5nZShMSU5LX1dBSVRfVVNMRUVQX01JTiwgTElOS19XQUlUX1VTTEVFUF9NQVgp OwogCX0KIAotCWRldl9lcnIoZGV2LCAibGluayBuZXZlciBjYW1lIHVwXG4iKTsKIAlyZXR1cm4g LUVUSU1FRE9VVDsKIH0KIApAQCAtMjUzLDYgKzI1MSw4NSBAQCBzdGF0aWMgdm9pZCBhZHZrX3Bj aWVfd2FpdF9mb3JfcmV0cmFpbihzdHJ1Y3QgYWR2a19wY2llICpwY2llKQogCX0KIH0KIAorc3Rh dGljIGludCBhZHZrX3BjaWVfdHJhaW5fYXRfZ2VuKHN0cnVjdCBhZHZrX3BjaWUgKnBjaWUsIGlu dCBnZW4pCit7CisJaW50IHJldCwgbmVnX2dlbjsKKwl1MzIgcmVnOworCisJLyogU2V0dXAgbGlu ayBzcGVlZCAqLworCXJlZyA9IGFkdmtfcmVhZGwocGNpZSwgUENJRV9DT1JFX0NUUkwwX1JFRyk7 CisJcmVnICY9IH5QQ0lFX0dFTl9TRUxfTVNLOworCWlmIChnZW4gPT0gMykKKwkJcmVnIHw9IFNQ RUVEX0dFTl8zOworCWVsc2UgaWYgKGdlbiA9PSAyKQorCQlyZWcgfD0gU1BFRURfR0VOXzI7CisJ ZWxzZQorCQlyZWcgfD0gU1BFRURfR0VOXzE7CisJYWR2a193cml0ZWwocGNpZSwgcmVnLCBQQ0lF X0NPUkVfQ1RSTDBfUkVHKTsKKworCS8qCisJICogRW5hYmxlIGxpbmsgdHJhaW5pbmcuIFRoaXMg aXMgbm90IG5lZWRlZCBpbiBldmVyeSBjYWxsIHRvIHRoaXMKKwkgKiBmdW5jdGlvbiwganVzdCBv bmNlIHN1ZmZpY2VzLCBidXQgaXQgZG9lcyBub3QgYnJlYWsgYW55dGhpbmcgZWl0aGVyLgorCSAq LworCXJlZyA9IGFkdmtfcmVhZGwocGNpZSwgUENJRV9DT1JFX0NUUkwwX1JFRyk7CisJcmVnIHw9 IExJTktfVFJBSU5JTkdfRU47CisJYWR2a193cml0ZWwocGNpZSwgcmVnLCBQQ0lFX0NPUkVfQ1RS TDBfUkVHKTsKKworCS8qCisJICogU3RhcnQgbGluayB0cmFpbmluZyBpbW1lZGlhdGVseSBhZnRl ciBlbmFibGluZyBpdC4KKwkgKiBUaGlzIHNvbHZlcyBwcm9ibGVtcyBmb3Igc29tZSBidWdneSBj YXJkcy4KKwkgKi8KKwlyZWcgPSBhZHZrX3JlYWRsKHBjaWUsIFBDSUVfQ09SRV9MSU5LX0NUUkxf U1RBVF9SRUcpOworCXJlZyB8PSBQQ0lFX0NPUkVfTElOS19UUkFJTklORzsKKwlhZHZrX3dyaXRl bChwY2llLCByZWcsIFBDSUVfQ09SRV9MSU5LX0NUUkxfU1RBVF9SRUcpOworCisJcmV0ID0gYWR2 a19wY2llX3dhaXRfZm9yX2xpbmsocGNpZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwor CXJlZyA9IGFkdmtfcmVhZGwocGNpZSwgUENJRV9DT1JFX0xJTktfQ1RSTF9TVEFUX1JFRyk7CisJ bmVnX2dlbiA9IChyZWcgPj4gUENJRV9DT1JFX0xJTktfU1BFRURfU0hJRlQpICYgMHhmOworCisJ cmV0dXJuIG5lZ19nZW47Cit9CisKK3N0YXRpYyB2b2lkIGFkdmtfcGNpZV90cmFpbl9saW5rKHN0 cnVjdCBhZHZrX3BjaWUgKnBjaWUpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBjaWUtPnBk ZXYtPmRldjsKKwlpbnQgbmVnX2dlbiA9IC0xLCBnZW47CisKKwkvKgorCSAqIFRyeSBsaW5rIHRy YWluaW5nIGF0IGxpbmsgZ2VuIHNwZWNpZmllZCBieSBkZXZpY2UgdHJlZSBwcm9wZXJ0eQorCSAq ICdtYXgtbGluay1zcGVlZCcuIElmIHRoaXMgZmFpbHMsIGl0ZXJhdGl2ZWx5IHRyYWluIGF0IGxv d2VyIGdlbi4KKwkgKi8KKwlmb3IgKGdlbiA9IHBjaWUtPmxpbmtfZ2VuOyBnZW4gPiAwOyAtLWdl bikgeworCQluZWdfZ2VuID0gYWR2a19wY2llX3RyYWluX2F0X2dlbihwY2llLCBnZW4pOworCQlp ZiAobmVnX2dlbiA+IDApCisJCQlicmVhazsKKwl9CisKKwlpZiAobmVnX2dlbiA8IDApCisJCWdv dG8gZXJyOworCisJLyoKKwkgKiBBZnRlciBzdWNjZXNzZnVsIHRyYWluaW5nIGlmIG5lZ290aWF0 ZWQgZ2VuIGlzIGxvd2VyIHRoYW4gcmVxdWVzdGVkLAorCSAqIHRyYWluIGFnYWluIG9uIG5lZ290 aWF0ZWQgZ2VuLiBUaGlzIHNvbHZlcyBzb21lIHN0YWJpbGl0eSBpc3N1ZXMgZm9yCisJICogc29t ZSBidWdneSBnZW4xIGNhcmRzLgorCSAqLworCWlmIChuZWdfZ2VuIDwgZ2VuKSB7CisJCWdlbiA9 IG5lZ19nZW47CisJCW5lZ19nZW4gPSBhZHZrX3BjaWVfdHJhaW5fYXRfZ2VuKHBjaWUsIGdlbik7 CisJfQorCisJaWYgKG5lZ19nZW4gPT0gZ2VuKSB7CisJCWRldl9pbmZvKGRldiwgImxpbmsgdXAg YXQgZ2VuICVpXG4iLCBnZW4pOworCQlyZXR1cm47CisJfQorCitlcnI6CisJZGV2X2VycihkZXYs ICJsaW5rIG5ldmVyIGNhbWUgdXBcbiIpOworfQorCiBzdGF0aWMgdm9pZCBhZHZrX3BjaWVfc2V0 dXBfaHcoc3RydWN0IGFkdmtfcGNpZSAqcGNpZSkKIHsKIAl1MzIgcmVnOwpAQCAtMjg4LDEyICsz NjUsNiBAQCBzdGF0aWMgdm9pZCBhZHZrX3BjaWVfc2V0dXBfaHcoc3RydWN0IGFkdmtfcGNpZSAq cGNpZSkKIAkJUENJRV9DT1JFX0NUUkwyX1REX0VOQUJMRTsKIAlhZHZrX3dyaXRlbChwY2llLCBy ZWcsIFBDSUVfQ09SRV9DVFJMMl9SRUcpOwogCi0JLyogU2V0IEdFTjIgKi8KLQlyZWcgPSBhZHZr X3JlYWRsKHBjaWUsIFBDSUVfQ09SRV9DVFJMMF9SRUcpOwotCXJlZyAmPSB+UENJRV9HRU5fU0VM X01TSzsKLQlyZWcgfD0gU1BFRURfR0VOXzI7Ci0JYWR2a193cml0ZWwocGNpZSwgcmVnLCBQQ0lF X0NPUkVfQ1RSTDBfUkVHKTsKLQogCS8qIFNldCBsYW5lIFgxICovCiAJcmVnID0gYWR2a19yZWFk bChwY2llLCBQQ0lFX0NPUkVfQ1RSTDBfUkVHKTsKIAlyZWcgJj0gfkxBTkVfQ05UX01TSzsKQEAg LTM0MSwyMCArNDEyLDcgQEAgc3RhdGljIHZvaWQgYWR2a19wY2llX3NldHVwX2h3KHN0cnVjdCBh ZHZrX3BjaWUgKnBjaWUpCiAJICovCiAJbXNsZWVwKFBDSV9QTV9EM0NPTERfV0FJVCk7CiAKLQkv KiBFbmFibGUgbGluayB0cmFpbmluZyAqLwotCXJlZyA9IGFkdmtfcmVhZGwocGNpZSwgUENJRV9D T1JFX0NUUkwwX1JFRyk7Ci0JcmVnIHw9IExJTktfVFJBSU5JTkdfRU47Ci0JYWR2a193cml0ZWwo cGNpZSwgcmVnLCBQQ0lFX0NPUkVfQ1RSTDBfUkVHKTsKLQotCS8qCi0JICogU3RhcnQgbGluayB0 cmFpbmluZyBpbW1lZGlhdGVseSBhZnRlciBlbmFibGluZyBpdC4KLQkgKiBUaGlzIHNvbHZlcyBw cm9ibGVtcyBmb3Igc29tZSBidWdneSBjYXJkcy4KLQkgKi8KLQlyZWcgPSBhZHZrX3JlYWRsKHBj aWUsIFBDSUVfQ09SRV9MSU5LX0NUUkxfU1RBVF9SRUcpOwotCXJlZyB8PSBQQ0lFX0NPUkVfTElO S19UUkFJTklORzsKLQlhZHZrX3dyaXRlbChwY2llLCByZWcsIFBDSUVfQ09SRV9MSU5LX0NUUkxf U1RBVF9SRUcpOwotCi0JYWR2a19wY2llX3dhaXRfZm9yX2xpbmsocGNpZSk7CisJYWR2a19wY2ll X3RyYWluX2xpbmsocGNpZSk7CiAKIAlyZWcgPSBhZHZrX3JlYWRsKHBjaWUsIFBDSUVfQ09SRV9D TURfU1RBVFVTX1JFRyk7CiAJcmVnIHw9IFBDSUVfQ09SRV9DTURfTUVNX0FDQ0VTU19FTiB8CkBA IC05ODgsNiArMTA0NiwxMiBAQCBzdGF0aWMgaW50IGFkdmtfcGNpZV9wcm9iZShzdHJ1Y3QgcGxh dGZvcm1fZGV2aWNlICpwZGV2KQogCX0KIAlwY2llLT5yb290X2J1c19uciA9IGJ1cy0+c3RhcnQ7 CiAKKwlyZXQgPSBvZl9wY2lfZ2V0X21heF9saW5rX3NwZWVkKGRldi0+b2Zfbm9kZSk7CisJaWYg KHJldCA8PSAwIHx8IHJldCA+IDMpCisJCXBjaWUtPmxpbmtfZ2VuID0gMzsKKwllbHNlCisJCXBj aWUtPmxpbmtfZ2VuID0gcmV0OworCiAJYWR2a19wY2llX3NldHVwX2h3KHBjaWUpOwogCiAJYWR2 a19zd19wY2lfYnJpZGdlX2luaXQocGNpZSk7Ci0tIAoyLjI1LjEKCgpfX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1haWxpbmcg bGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmlu ZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCg==