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 00C38E67A69 for ; Tue, 3 Mar 2026 06:17:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Content-Transfer-Encoding: Content-Type: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=1biYoOEIdP6BgW/a1ol11TFpH8fsY5YK9rZVHP7fU1Y=; b=lG1vx56j/8FpRkbMMAxFJefcKO VZXe7L1exqi45JC0usGBa73NELg45KJtGCy/nUBYAE+j40Wx41BRJzjxOY0NRzUcDj9iE70HlJCZ6 yu+PZDdx0LN9QVLZynMgDRZWkaB1m6394OlTtogR8W7XoefpmgMYfStg8YKUa5iNP2I71vTzKJZPD CA4SZpPOLMZsWKnvx6RMVQrIGhvjq4U2NF12lr4i+tjUIAt3YyYFGhfWaAcHhgqdWEK9rXZUQ/S1s myS8VKM8PEfz4wPbC8TdPc6UWv1UyTuWeh16Qv6fBD8qAZPltXPsh8tuGtRP/Pkd5eR99SY2NALey ufEa7CJQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98.2 #2 (Red Hat Linux)) id 1vxJ4R-0000000Eb0V-1bap; Tue, 03 Mar 2026 06:17:27 +0000 Received: from azure-sdnproxy.icoremail.net ([52.237.72.81]) by bombadil.infradead.org with esmtp (Exim 4.98.2 #2 (Red Hat Linux)) id 1vxJ4O-0000000Eaz5-2NaF; Tue, 03 Mar 2026 06:17:25 +0000 Received: from E0004057DT.eswin.cn (unknown [10.11.96.26]) by app1 (Coremail) with SMTP id TAJkCgAnyXLpfKZpiDoFAA--.23439S2; Tue, 03 Mar 2026 14:17:14 +0800 (CST) From: lizhi2@eswincomputing.com To: devicetree@vger.kernel.org, andrew+netdev@lunn.ch, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org, netdev@vger.kernel.org, pabeni@redhat.com, mcoquelin.stm32@gmail.com, alexandre.torgue@foss.st.com, rmk+kernel@armlinux.org.uk, wens@kernel.org, pjw@kernel.org, palmer@dabbelt.com, aou@eecs.berkeley.edu, alex@ghiti.fr, linux-riscv@lists.infradead.org, linux-stm32@st-md-mailman.stormreply.com, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Cc: ningyu@eswincomputing.com, linmin@eswincomputing.com, pinkesh.vaghela@einfochips.com, pritesh.patel@einfochips.com, weishangjuan@eswincomputing.com, Zhi Li Subject: [PATCH net-next v3 2/3] net: stmmac: eic7700: enable clocks before syscon access and correct RX sampling timing Date: Tue, 3 Mar 2026 14:17:08 +0800 Message-ID: <20260303061711.895-1-lizhi2@eswincomputing.com> X-Mailer: git-send-email 2.52.0.windows.1 In-Reply-To: <20260303061525.846-1-lizhi2@eswincomputing.com> References: <20260303061525.846-1-lizhi2@eswincomputing.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-CM-TRANSID: TAJkCgAnyXLpfKZpiDoFAA--.23439S2 X-Coremail-Antispam: 1UD129KBjvPXoW5Cw47JFWxAFW3GFW8uFW3p5X_trWUGoWfKF 13Xw1UJ34Uurs5K3WxKwnxWa1kArW7WF1ruw42y3Waq3Wjqr93J3ZIqa1aqrW5AFyDZrn5 Jr13CFW7Aayrn29KB7ZKAUJUUUU8529EdanIXcx71UUUUU7v73VFW2AGmfu7bjvjm3AaLa J3UjIYCTnIWjp_UUUYN7AC8VAFwI0_Wr0E3s1l1xkIjI8I6I8E6xAIw20EY4v20xvaj40_ Wr0E3s1l1IIY67AEw4v_Jr0_Jr4l8cAvFVAK0II2c7xJM28CjxkF64kEwVA0rcxSw2x7M2 8EF7xvwVC0I7IYx2IY67AKxVW7JVWDJwA2z4x0Y4vE2Ix0cI8IcVCY1x0267AKxVW8Jr0_ Cr1UM28EF7xvwVC2z280aVAFwI0_GcCE3s1l84ACjcxK6I8E87Iv6xkF7I0E14v26rxl6s 0DM2AIxVAIcxkEcVAq07x20xvEncxIr21l5I8CrVACY4xI64kE6c02F40Ex7xfMcIj6xII jxv20xvE14v26r1Y6r17McIj6I8E87Iv67AKxVWUJVW8JwAm72CE4IkC6x0Yz7v_Jr0_Gr 1lF7xvr2IYc2Ij64vIr41lF7I21c0EjII2zVCS5cI20VAGYxC7M4IIrI8v6xkF7I0E8cxa n2IY04v7M4kE6xkIj40Ew7xC0wCY1x0262kKe7AKxVW8ZVWrXwCY02Avz4vE-syl42xK82 IYc2Ij64vIr41l4I8I3I0E4IkC6x0Yz7v_Jr0_Gr1lx2IqxVAqx4xG67AKxVWUJVWUGwC2 0s026x8GjcxK67AKxVWUGVWUWwC2zVAF1VAY17CE14v26r4a6rW5MIIYrxkI7VAKI48JMI IF0xvE2Ix0cI8IcVAFwI0_Jr0_JF4lIxAIcVC0I7IYx2IY6xkF7I0E14v26F4j6r4UJwCI 42IY6xAIw20EY4v20xvaj40_Jr0_JF4lIxAIcVC2z280aVAFwI0_Jr0_Gr1lIxAIcVC2z2 80aVCY1x0267AKxVW8JVW8JrUvcSsGvfC2KfnxnUUI43ZEXa7sRiWrW5UUUUU== X-CM-SenderInfo: xol2xx2s6h245lqf0zpsxwx03jof0z/ X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20260302_221724_775534_D31AF873 X-CRM114-Status: GOOD ( 17.25 ) 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: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org From: Zhi Li The second Ethernet controller (eth1) on the Eswin EIC7700 SoC may fail to sample RX data correctly at Gigabit speed due to EIC7700-specific receive clock to data skew at the MAC input in the silicon. The existing internal delay configuration does not provide sufficient adjustment range to compensate for this condition at 1000Mbps. Update the EIC7700 DWMAC glue driver to apply EIC7700-specific clock sampling inversion only during Gigabit operation on MAC instances that require it. TXD and RXD delay registers are explicitly cleared during initialization to override any residual configuration left by the bootloader. All HSP CSR register accesses are performed only after the required clocks are enabled. Fixes: ea77dbbdbc4e ("net: stmmac: add Eswin EIC7700 glue driver") Signed-off-by: Zhi Li --- .../ethernet/stmicro/stmmac/dwmac-eic7700.c | 180 +++++++++++++----- 1 file changed, 137 insertions(+), 43 deletions(-) diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-eic7700.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-eic7700.c index bcb8e000e720..acddea58cc6b 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-eic7700.c +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-eic7700.c @@ -28,20 +28,40 @@ /* * TX/RX Clock Delay Bit Masks: - * - TX Delay: bits [14:8] — TX_CLK delay (unit: 0.1ns per bit) - * - RX Delay: bits [30:24] — RX_CLK delay (unit: 0.1ns per bit) + * - TX Delay: bits [14:8] — TX_CLK delay (unit: 0.02ns per bit) + * - TX Invert : bit [15] + * - RX Delay: bits [30:24] — RX_CLK delay (unit: 0.02ns per bit) + * - RX Invert : bit [31] */ #define EIC7700_ETH_TX_ADJ_DELAY GENMASK(14, 8) #define EIC7700_ETH_RX_ADJ_DELAY GENMASK(30, 24) +#define EIC7700_ETH_TX_INV_DELAY BIT(15) +#define EIC7700_ETH_RX_INV_DELAY BIT(31) -#define EIC7700_MAX_DELAY_UNIT 0x7F +#define EIC7700_MAX_DELAY_STEPS 0x7F +#define EIC7700_DELAY_STEP_PS 20 +#define EIC7700_MAX_DELAY_PS \ + (EIC7700_MAX_DELAY_STEPS * EIC7700_DELAY_STEP_PS) static const char * const eic7700_clk_names[] = { "tx", "axi", "cfg", }; +struct eic7700_dwmac_data { + bool rgmii_rx_clk_invert; +}; + struct eic7700_qos_priv { + struct device *dev; struct plat_stmmacenet_data *plat_dat; + struct regmap *eic7700_hsp_regmap; + u32 eth_axi_lp_ctrl_offset; + u32 eth_phy_ctrl_offset; + u32 eth_txd_offset; + u32 eth_clk_offset; + u32 eth_rxd_offset; + u32 eth_clk_dly_param; + bool eth_rx_clk_inv; }; static int eic7700_clks_config(void *priv, bool enabled) @@ -61,8 +81,26 @@ static int eic7700_clks_config(void *priv, bool enabled) static int eic7700_dwmac_init(struct device *dev, void *priv) { struct eic7700_qos_priv *dwc = priv; + int ret; + + ret = eic7700_clks_config(dwc, true); + if (ret) + return ret; + + ret = regmap_set_bits(dwc->eic7700_hsp_regmap, + dwc->eth_phy_ctrl_offset, + EIC7700_ETH_TX_CLK_SEL | + EIC7700_ETH_PHY_INTF_SELI); + if (ret) + return ret; + + regmap_write(dwc->eic7700_hsp_regmap, dwc->eth_axi_lp_ctrl_offset, + EIC7700_ETH_CSYSREQ_VAL); - return eic7700_clks_config(dwc, true); + regmap_write(dwc->eic7700_hsp_regmap, dwc->eth_txd_offset, 0); + regmap_write(dwc->eic7700_hsp_regmap, dwc->eth_rxd_offset, 0); + + return 0; } static void eic7700_dwmac_exit(struct device *dev, void *priv) @@ -88,18 +126,34 @@ static int eic7700_dwmac_resume(struct device *dev, void *priv) return ret; } +static void eic7700_dwmac_fix_speed(void *priv, int speed, unsigned int mode) +{ + struct eic7700_qos_priv *dwc = (struct eic7700_qos_priv *)priv; + u32 dly_param = dwc->eth_clk_dly_param; + + switch (speed) { + case SPEED_1000: + if (dwc->eth_rx_clk_inv) + dly_param |= EIC7700_ETH_RX_INV_DELAY; + break; + case SPEED_100: + case SPEED_10: + break; + default: + dev_err(dwc->dev, "invalid speed %u\n", speed); + break; + } + + regmap_write(dwc->eic7700_hsp_regmap, dwc->eth_clk_offset, dly_param); +} + static int eic7700_dwmac_probe(struct platform_device *pdev) { + const struct eic7700_dwmac_data *data; struct plat_stmmacenet_data *plat_dat; struct stmmac_resources stmmac_res; struct eic7700_qos_priv *dwc_priv; - struct regmap *eic7700_hsp_regmap; - u32 eth_axi_lp_ctrl_offset; - u32 eth_phy_ctrl_offset; - u32 eth_phy_ctrl_regset; - u32 eth_rxd_dly_offset; - u32 eth_dly_param = 0; - u32 delay_ps; + u32 delay_ps, val; int i, ret; ret = stmmac_get_platform_resources(pdev, &stmmac_res); @@ -116,70 +170,95 @@ static int eic7700_dwmac_probe(struct platform_device *pdev) if (!dwc_priv) return -ENOMEM; + dwc_priv->dev = &pdev->dev; + + data = device_get_match_data(&pdev->dev); + if (!data) + return dev_err_probe(&pdev->dev, + -EINVAL, "no match data found\n"); + + dwc_priv->eth_rx_clk_inv = data->rgmii_rx_clk_invert; + /* Read rx-internal-delay-ps and update rx_clk delay */ if (!of_property_read_u32(pdev->dev.of_node, "rx-internal-delay-ps", &delay_ps)) { - u32 val = min(delay_ps / 100, EIC7700_MAX_DELAY_UNIT); + if (delay_ps % EIC7700_DELAY_STEP_PS) + return dev_err_probe(&pdev->dev, -EINVAL, + "rx delay must be multiple of %dps\n", + EIC7700_DELAY_STEP_PS); - eth_dly_param &= ~EIC7700_ETH_RX_ADJ_DELAY; - eth_dly_param |= FIELD_PREP(EIC7700_ETH_RX_ADJ_DELAY, val); - } else { - return dev_err_probe(&pdev->dev, -EINVAL, - "missing required property rx-internal-delay-ps\n"); + if (delay_ps > EIC7700_MAX_DELAY_PS) + return dev_err_probe(&pdev->dev, -EINVAL, + "rx delay out of range\n"); + + val = delay_ps / EIC7700_DELAY_STEP_PS; + + dwc_priv->eth_clk_dly_param &= ~EIC7700_ETH_RX_ADJ_DELAY; + dwc_priv->eth_clk_dly_param |= + FIELD_PREP(EIC7700_ETH_RX_ADJ_DELAY, val); } /* Read tx-internal-delay-ps and update tx_clk delay */ if (!of_property_read_u32(pdev->dev.of_node, "tx-internal-delay-ps", &delay_ps)) { - u32 val = min(delay_ps / 100, EIC7700_MAX_DELAY_UNIT); + if (delay_ps % EIC7700_DELAY_STEP_PS) + return dev_err_probe(&pdev->dev, -EINVAL, + "tx delay must be multiple of %dps\n", + EIC7700_DELAY_STEP_PS); + + if (delay_ps > EIC7700_MAX_DELAY_PS) + return dev_err_probe(&pdev->dev, -EINVAL, + "tx delay out of range\n"); - eth_dly_param &= ~EIC7700_ETH_TX_ADJ_DELAY; - eth_dly_param |= FIELD_PREP(EIC7700_ETH_TX_ADJ_DELAY, val); - } else { - return dev_err_probe(&pdev->dev, -EINVAL, - "missing required property tx-internal-delay-ps\n"); + val = delay_ps / EIC7700_DELAY_STEP_PS; + + dwc_priv->eth_clk_dly_param &= ~EIC7700_ETH_TX_ADJ_DELAY; + dwc_priv->eth_clk_dly_param |= + FIELD_PREP(EIC7700_ETH_TX_ADJ_DELAY, val); } - eic7700_hsp_regmap = syscon_regmap_lookup_by_phandle(pdev->dev.of_node, - "eswin,hsp-sp-csr"); - if (IS_ERR(eic7700_hsp_regmap)) + dwc_priv->eic7700_hsp_regmap = + syscon_regmap_lookup_by_phandle(pdev->dev.of_node, + "eswin,hsp-sp-csr"); + if (IS_ERR(dwc_priv->eic7700_hsp_regmap)) return dev_err_probe(&pdev->dev, - PTR_ERR(eic7700_hsp_regmap), + PTR_ERR(dwc_priv->eic7700_hsp_regmap), "Failed to get hsp-sp-csr regmap\n"); ret = of_property_read_u32_index(pdev->dev.of_node, "eswin,hsp-sp-csr", - 1, ð_phy_ctrl_offset); + 1, &dwc_priv->eth_phy_ctrl_offset); if (ret) return dev_err_probe(&pdev->dev, ret, "can't get eth_phy_ctrl_offset\n"); - regmap_read(eic7700_hsp_regmap, eth_phy_ctrl_offset, - ð_phy_ctrl_regset); - eth_phy_ctrl_regset |= - (EIC7700_ETH_TX_CLK_SEL | EIC7700_ETH_PHY_INTF_SELI); - regmap_write(eic7700_hsp_regmap, eth_phy_ctrl_offset, - eth_phy_ctrl_regset); - ret = of_property_read_u32_index(pdev->dev.of_node, "eswin,hsp-sp-csr", - 2, ð_axi_lp_ctrl_offset); + 2, &dwc_priv->eth_axi_lp_ctrl_offset); if (ret) return dev_err_probe(&pdev->dev, ret, "can't get eth_axi_lp_ctrl_offset\n"); - regmap_write(eic7700_hsp_regmap, eth_axi_lp_ctrl_offset, - EIC7700_ETH_CSYSREQ_VAL); + ret = of_property_read_u32_index(pdev->dev.of_node, + "eswin,hsp-sp-csr", + 3, &dwc_priv->eth_txd_offset); + if (ret) + return dev_err_probe(&pdev->dev, ret, + "can't get eth_txd_offset\n"); ret = of_property_read_u32_index(pdev->dev.of_node, "eswin,hsp-sp-csr", - 3, ð_rxd_dly_offset); + 4, &dwc_priv->eth_clk_offset); if (ret) return dev_err_probe(&pdev->dev, ret, - "can't get eth_rxd_dly_offset\n"); + "can't get eth_clk_offset\n"); - regmap_write(eic7700_hsp_regmap, eth_rxd_dly_offset, - eth_dly_param); + ret = of_property_read_u32_index(pdev->dev.of_node, + "eswin,hsp-sp-csr", + 5, &dwc_priv->eth_rxd_offset); + if (ret) + return dev_err_probe(&pdev->dev, ret, + "can't get eth_rxd_offset\n"); plat_dat->num_clks = ARRAY_SIZE(eic7700_clk_names); plat_dat->clks = devm_kcalloc(&pdev->dev, @@ -208,12 +287,27 @@ static int eic7700_dwmac_probe(struct platform_device *pdev) plat_dat->exit = eic7700_dwmac_exit; plat_dat->suspend = eic7700_dwmac_suspend; plat_dat->resume = eic7700_dwmac_resume; + plat_dat->fix_mac_speed = eic7700_dwmac_fix_speed; return devm_stmmac_pltfr_probe(pdev, plat_dat, &stmmac_res); } +static const struct eic7700_dwmac_data eic7700_dwmac_data = { + .rgmii_rx_clk_invert = false, +}; + +static const struct eic7700_dwmac_data eic7700_dwmac_data_clk_inversion = { + .rgmii_rx_clk_invert = true, +}; + static const struct of_device_id eic7700_dwmac_match[] = { - { .compatible = "eswin,eic7700-qos-eth" }, + { .compatible = "eswin,eic7700-qos-eth", + .data = &eic7700_dwmac_data, + }, + { + .compatible = "eswin,eic7700-qos-eth-clk-inversion", + .data = &eic7700_dwmac_data_clk_inversion, + }, { } }; MODULE_DEVICE_TABLE(of, eic7700_dwmac_match); -- 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 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 570DBE67A6D for ; Tue, 3 Mar 2026 06:17:36 +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=1uMR7Ji4volGRPTKobHU3Odao7ZZ+ypO53w/r0ngggE=; b=svtqOWct8TOwv7 4exsxCSs5aNC002vBu456t0TfH62k98hwhlfSWvicRvD4lQS2w6RjHhPvPAiBl/0jSifrMVwPD1pM EQCokOqEbZ8vJ3XfMO0Xbb3Hlu0xYE34kBdG7nUq4Q488tqlWW0R7i4IU8/Hn7dLTf0q6RScOoFoa 0MrhxO6vUC3kD6JkkXKfQ4w9oUA8d0h+3jc9VEyUMXUK4XkDpKz2IDu7QLdeW7bDO3z0xseU0ED6p DDc9xUf2V0o3lB8pRGZ32A9UuDywGv3t2FuVzTacM0lwZhUcCw/kNlg27xi7gd34hp4B6SuycmyEa uwOgDybv8xtT3fLcOuHQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98.2 #2 (Red Hat Linux)) id 1vxJ4R-0000000Eb0A-0KX1; Tue, 03 Mar 2026 06:17:27 +0000 Received: from azure-sdnproxy.icoremail.net ([52.237.72.81]) by bombadil.infradead.org with esmtp (Exim 4.98.2 #2 (Red Hat Linux)) id 1vxJ4O-0000000Eaz5-2NaF; Tue, 03 Mar 2026 06:17:25 +0000 Received: from E0004057DT.eswin.cn (unknown [10.11.96.26]) by app1 (Coremail) with SMTP id TAJkCgAnyXLpfKZpiDoFAA--.23439S2; Tue, 03 Mar 2026 14:17:14 +0800 (CST) From: lizhi2@eswincomputing.com To: devicetree@vger.kernel.org, andrew+netdev@lunn.ch, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org, netdev@vger.kernel.org, pabeni@redhat.com, mcoquelin.stm32@gmail.com, alexandre.torgue@foss.st.com, rmk+kernel@armlinux.org.uk, wens@kernel.org, pjw@kernel.org, palmer@dabbelt.com, aou@eecs.berkeley.edu, alex@ghiti.fr, linux-riscv@lists.infradead.org, linux-stm32@st-md-mailman.stormreply.com, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Cc: ningyu@eswincomputing.com, linmin@eswincomputing.com, pinkesh.vaghela@einfochips.com, pritesh.patel@einfochips.com, weishangjuan@eswincomputing.com, Zhi Li Subject: [PATCH net-next v3 2/3] net: stmmac: eic7700: enable clocks before syscon access and correct RX sampling timing Date: Tue, 3 Mar 2026 14:17:08 +0800 Message-ID: <20260303061711.895-1-lizhi2@eswincomputing.com> X-Mailer: git-send-email 2.52.0.windows.1 In-Reply-To: <20260303061525.846-1-lizhi2@eswincomputing.com> References: <20260303061525.846-1-lizhi2@eswincomputing.com> MIME-Version: 1.0 X-CM-TRANSID: TAJkCgAnyXLpfKZpiDoFAA--.23439S2 X-Coremail-Antispam: 1UD129KBjvPXoW5Cw47JFWxAFW3GFW8uFW3p5X_trWUGoWfKF 13Xw1UJ34Uurs5K3WxKwnxWa1kArW7WF1ruw42y3Waq3Wjqr93J3ZIqa1aqrW5AFyDZrn5 Jr13CFW7Aayrn29KB7ZKAUJUUUU8529EdanIXcx71UUUUU7v73VFW2AGmfu7bjvjm3AaLa J3UjIYCTnIWjp_UUUYN7AC8VAFwI0_Wr0E3s1l1xkIjI8I6I8E6xAIw20EY4v20xvaj40_ Wr0E3s1l1IIY67AEw4v_Jr0_Jr4l8cAvFVAK0II2c7xJM28CjxkF64kEwVA0rcxSw2x7M2 8EF7xvwVC0I7IYx2IY67AKxVW7JVWDJwA2z4x0Y4vE2Ix0cI8IcVCY1x0267AKxVW8Jr0_ Cr1UM28EF7xvwVC2z280aVAFwI0_GcCE3s1l84ACjcxK6I8E87Iv6xkF7I0E14v26rxl6s 0DM2AIxVAIcxkEcVAq07x20xvEncxIr21l5I8CrVACY4xI64kE6c02F40Ex7xfMcIj6xII jxv20xvE14v26r1Y6r17McIj6I8E87Iv67AKxVWUJVW8JwAm72CE4IkC6x0Yz7v_Jr0_Gr 1lF7xvr2IYc2Ij64vIr41lF7I21c0EjII2zVCS5cI20VAGYxC7M4IIrI8v6xkF7I0E8cxa n2IY04v7M4kE6xkIj40Ew7xC0wCY1x0262kKe7AKxVW8ZVWrXwCY02Avz4vE-syl42xK82 IYc2Ij64vIr41l4I8I3I0E4IkC6x0Yz7v_Jr0_Gr1lx2IqxVAqx4xG67AKxVWUJVWUGwC2 0s026x8GjcxK67AKxVWUGVWUWwC2zVAF1VAY17CE14v26r4a6rW5MIIYrxkI7VAKI48JMI IF0xvE2Ix0cI8IcVAFwI0_Jr0_JF4lIxAIcVC0I7IYx2IY6xkF7I0E14v26F4j6r4UJwCI 42IY6xAIw20EY4v20xvaj40_Jr0_JF4lIxAIcVC2z280aVAFwI0_Jr0_Gr1lIxAIcVC2z2 80aVCY1x0267AKxVW8JVW8JrUvcSsGvfC2KfnxnUUI43ZEXa7sRiWrW5UUUUU== X-CM-SenderInfo: xol2xx2s6h245lqf0zpsxwx03jof0z/ X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20260302_221724_775534_D31AF873 X-CRM114-Status: GOOD ( 17.25 ) X-BeenThere: linux-riscv@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-riscv" Errors-To: linux-riscv-bounces+linux-riscv=archiver.kernel.org@lists.infradead.org RnJvbTogWmhpIExpIDxsaXpoaTJAZXN3aW5jb21wdXRpbmcuY29tPgoKVGhlIHNlY29uZCBFdGhl cm5ldCBjb250cm9sbGVyIChldGgxKSBvbiB0aGUgRXN3aW4gRUlDNzcwMCBTb0MgbWF5IGZhaWwK dG8gc2FtcGxlIFJYIGRhdGEgY29ycmVjdGx5IGF0IEdpZ2FiaXQgc3BlZWQgZHVlIHRvIEVJQzc3 MDAtc3BlY2lmaWMKcmVjZWl2ZSBjbG9jayB0byBkYXRhIHNrZXcgYXQgdGhlIE1BQyBpbnB1dCBp biB0aGUgc2lsaWNvbi4KClRoZSBleGlzdGluZyBpbnRlcm5hbCBkZWxheSBjb25maWd1cmF0aW9u IGRvZXMgbm90IHByb3ZpZGUgc3VmZmljaWVudAphZGp1c3RtZW50IHJhbmdlIHRvIGNvbXBlbnNh dGUgZm9yIHRoaXMgY29uZGl0aW9uIGF0IDEwMDBNYnBzLgpVcGRhdGUgdGhlIEVJQzc3MDAgRFdN QUMgZ2x1ZSBkcml2ZXIgdG8gYXBwbHkgRUlDNzcwMC1zcGVjaWZpYyBjbG9jawpzYW1wbGluZyBp bnZlcnNpb24gb25seSBkdXJpbmcgR2lnYWJpdCBvcGVyYXRpb24gb24gTUFDIGluc3RhbmNlcwp0 aGF0IHJlcXVpcmUgaXQuCgpUWEQgYW5kIFJYRCBkZWxheSByZWdpc3RlcnMgYXJlIGV4cGxpY2l0 bHkgY2xlYXJlZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24KdG8gb3ZlcnJpZGUgYW55IHJlc2lkdWFs IGNvbmZpZ3VyYXRpb24gbGVmdCBieSB0aGUgYm9vdGxvYWRlci4gQWxsIEhTUApDU1IgcmVnaXN0 ZXIgYWNjZXNzZXMgYXJlIHBlcmZvcm1lZCBvbmx5IGFmdGVyIHRoZSByZXF1aXJlZCBjbG9ja3Mg YXJlCmVuYWJsZWQuCgpGaXhlczogZWE3N2RiYmRiYzRlICgibmV0OiBzdG1tYWM6IGFkZCBFc3dp biBFSUM3NzAwIGdsdWUgZHJpdmVyIikKU2lnbmVkLW9mZi1ieTogWmhpIExpIDxsaXpoaTJAZXN3 aW5jb21wdXRpbmcuY29tPgotLS0KIC4uLi9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9kd21hYy1l aWM3NzAwLmMgICB8IDE4MCArKysrKysrKysrKysrLS0tLS0KIDEgZmlsZSBjaGFuZ2VkLCAxMzcg aW5zZXJ0aW9ucygrKSwgNDMgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQv ZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvZHdtYWMtZWljNzcwMC5jIGIvZHJpdmVycy9uZXQvZXRo ZXJuZXQvc3RtaWNyby9zdG1tYWMvZHdtYWMtZWljNzcwMC5jCmluZGV4IGJjYjhlMDAwZTcyMC4u YWNkZGVhNThjYzZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0 bW1hYy9kd21hYy1laWM3NzAwLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9z dG1tYWMvZHdtYWMtZWljNzcwMC5jCkBAIC0yOCwyMCArMjgsNDAgQEAKIAogLyoKICAqIFRYL1JY IENsb2NrIERlbGF5IEJpdCBNYXNrczoKLSAqIC0gVFggRGVsYXk6IGJpdHMgWzE0OjhdIOKAlCBU WF9DTEsgZGVsYXkgKHVuaXQ6IDAuMW5zIHBlciBiaXQpCi0gKiAtIFJYIERlbGF5OiBiaXRzIFsz MDoyNF0g4oCUIFJYX0NMSyBkZWxheSAodW5pdDogMC4xbnMgcGVyIGJpdCkKKyAqIC0gVFggRGVs YXk6IGJpdHMgWzE0OjhdIOKAlCBUWF9DTEsgZGVsYXkgKHVuaXQ6IDAuMDJucyBwZXIgYml0KQor ICogLSBUWCBJbnZlcnQgOiBiaXQgIFsxNV0KKyAqIC0gUlggRGVsYXk6IGJpdHMgWzMwOjI0XSDi gJQgUlhfQ0xLIGRlbGF5ICh1bml0OiAwLjAybnMgcGVyIGJpdCkKKyAqIC0gUlggSW52ZXJ0IDog Yml0ICBbMzFdCiAgKi8KICNkZWZpbmUgRUlDNzcwMF9FVEhfVFhfQURKX0RFTEFZCUdFTk1BU0so MTQsIDgpCiAjZGVmaW5lIEVJQzc3MDBfRVRIX1JYX0FESl9ERUxBWQlHRU5NQVNLKDMwLCAyNCkK KyNkZWZpbmUgRUlDNzcwMF9FVEhfVFhfSU5WX0RFTEFZCUJJVCgxNSkKKyNkZWZpbmUgRUlDNzcw MF9FVEhfUlhfSU5WX0RFTEFZCUJJVCgzMSkKIAotI2RlZmluZSBFSUM3NzAwX01BWF9ERUxBWV9V TklUIDB4N0YKKyNkZWZpbmUgRUlDNzcwMF9NQVhfREVMQVlfU1RFUFMJCTB4N0YKKyNkZWZpbmUg RUlDNzcwMF9ERUxBWV9TVEVQX1BTCQkyMAorI2RlZmluZSBFSUM3NzAwX01BWF9ERUxBWV9QUwlc CisJKEVJQzc3MDBfTUFYX0RFTEFZX1NURVBTICogRUlDNzcwMF9ERUxBWV9TVEVQX1BTKQogCiBz dGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGVpYzc3MDBfY2xrX25hbWVzW10gPSB7CiAJInR4Iiwg ImF4aSIsICJjZmciLAogfTsKIAorc3RydWN0IGVpYzc3MDBfZHdtYWNfZGF0YSB7CisJYm9vbCBy Z21paV9yeF9jbGtfaW52ZXJ0OworfTsKKwogc3RydWN0IGVpYzc3MDBfcW9zX3ByaXYgeworCXN0 cnVjdCBkZXZpY2UgKmRldjsKIAlzdHJ1Y3QgcGxhdF9zdG1tYWNlbmV0X2RhdGEgKnBsYXRfZGF0 OworCXN0cnVjdCByZWdtYXAgKmVpYzc3MDBfaHNwX3JlZ21hcDsKKwl1MzIgZXRoX2F4aV9scF9j dHJsX29mZnNldDsKKwl1MzIgZXRoX3BoeV9jdHJsX29mZnNldDsKKwl1MzIgZXRoX3R4ZF9vZmZz ZXQ7CisJdTMyIGV0aF9jbGtfb2Zmc2V0OworCXUzMiBldGhfcnhkX29mZnNldDsKKwl1MzIgZXRo X2Nsa19kbHlfcGFyYW07CisJYm9vbCBldGhfcnhfY2xrX2ludjsKIH07CiAKIHN0YXRpYyBpbnQg ZWljNzcwMF9jbGtzX2NvbmZpZyh2b2lkICpwcml2LCBib29sIGVuYWJsZWQpCkBAIC02MSw4ICs4 MSwyNiBAQCBzdGF0aWMgaW50IGVpYzc3MDBfY2xrc19jb25maWcodm9pZCAqcHJpdiwgYm9vbCBl bmFibGVkKQogc3RhdGljIGludCBlaWM3NzAwX2R3bWFjX2luaXQoc3RydWN0IGRldmljZSAqZGV2 LCB2b2lkICpwcml2KQogewogCXN0cnVjdCBlaWM3NzAwX3Fvc19wcml2ICpkd2MgPSBwcml2Owor CWludCByZXQ7CisKKwlyZXQgPSBlaWM3NzAwX2Nsa3NfY29uZmlnKGR3YywgdHJ1ZSk7CisJaWYg KHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHJlZ21hcF9zZXRfYml0cyhkd2MtPmVpYzc3 MDBfaHNwX3JlZ21hcCwKKwkJCSAgICAgIGR3Yy0+ZXRoX3BoeV9jdHJsX29mZnNldCwKKwkJCSAg ICAgIEVJQzc3MDBfRVRIX1RYX0NMS19TRUwgfAorCQkJICAgICAgRUlDNzcwMF9FVEhfUEhZX0lO VEZfU0VMSSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJlZ21hcF93cml0ZShkd2Mt PmVpYzc3MDBfaHNwX3JlZ21hcCwgZHdjLT5ldGhfYXhpX2xwX2N0cmxfb2Zmc2V0LAorCQkgICAg IEVJQzc3MDBfRVRIX0NTWVNSRVFfVkFMKTsKIAotCXJldHVybiBlaWM3NzAwX2Nsa3NfY29uZmln KGR3YywgdHJ1ZSk7CisJcmVnbWFwX3dyaXRlKGR3Yy0+ZWljNzcwMF9oc3BfcmVnbWFwLCBkd2Mt PmV0aF90eGRfb2Zmc2V0LCAwKTsKKwlyZWdtYXBfd3JpdGUoZHdjLT5laWM3NzAwX2hzcF9yZWdt YXAsIGR3Yy0+ZXRoX3J4ZF9vZmZzZXQsIDApOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2 b2lkIGVpYzc3MDBfZHdtYWNfZXhpdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKnByaXYpCkBA IC04OCwxOCArMTI2LDM0IEBAIHN0YXRpYyBpbnQgZWljNzcwMF9kd21hY19yZXN1bWUoc3RydWN0 IGRldmljZSAqZGV2LCB2b2lkICpwcml2KQogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyB2b2lk IGVpYzc3MDBfZHdtYWNfZml4X3NwZWVkKHZvaWQgKnByaXYsIGludCBzcGVlZCwgdW5zaWduZWQg aW50IG1vZGUpCit7CisJc3RydWN0IGVpYzc3MDBfcW9zX3ByaXYgKmR3YyA9IChzdHJ1Y3QgZWlj NzcwMF9xb3NfcHJpdiAqKXByaXY7CisJdTMyIGRseV9wYXJhbSA9IGR3Yy0+ZXRoX2Nsa19kbHlf cGFyYW07CisKKwlzd2l0Y2ggKHNwZWVkKSB7CisJY2FzZSBTUEVFRF8xMDAwOgorCQlpZiAoZHdj LT5ldGhfcnhfY2xrX2ludikKKwkJCWRseV9wYXJhbSB8PSBFSUM3NzAwX0VUSF9SWF9JTlZfREVM QVk7CisJCWJyZWFrOworCWNhc2UgU1BFRURfMTAwOgorCWNhc2UgU1BFRURfMTA6CisJCWJyZWFr OworCWRlZmF1bHQ6CisJCWRldl9lcnIoZHdjLT5kZXYsICJpbnZhbGlkIHNwZWVkICV1XG4iLCBz cGVlZCk7CisJCWJyZWFrOworCX0KKworCXJlZ21hcF93cml0ZShkd2MtPmVpYzc3MDBfaHNwX3Jl Z21hcCwgZHdjLT5ldGhfY2xrX29mZnNldCwgZGx5X3BhcmFtKTsKK30KKwogc3RhdGljIGludCBl aWM3NzAwX2R3bWFjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CisJY29u c3Qgc3RydWN0IGVpYzc3MDBfZHdtYWNfZGF0YSAqZGF0YTsKIAlzdHJ1Y3QgcGxhdF9zdG1tYWNl bmV0X2RhdGEgKnBsYXRfZGF0OwogCXN0cnVjdCBzdG1tYWNfcmVzb3VyY2VzIHN0bW1hY19yZXM7 CiAJc3RydWN0IGVpYzc3MDBfcW9zX3ByaXYgKmR3Y19wcml2OwotCXN0cnVjdCByZWdtYXAgKmVp Yzc3MDBfaHNwX3JlZ21hcDsKLQl1MzIgZXRoX2F4aV9scF9jdHJsX29mZnNldDsKLQl1MzIgZXRo X3BoeV9jdHJsX29mZnNldDsKLQl1MzIgZXRoX3BoeV9jdHJsX3JlZ3NldDsKLQl1MzIgZXRoX3J4 ZF9kbHlfb2Zmc2V0OwotCXUzMiBldGhfZGx5X3BhcmFtID0gMDsKLQl1MzIgZGVsYXlfcHM7CisJ dTMyIGRlbGF5X3BzLCB2YWw7CiAJaW50IGksIHJldDsKIAogCXJldCA9IHN0bW1hY19nZXRfcGxh dGZvcm1fcmVzb3VyY2VzKHBkZXYsICZzdG1tYWNfcmVzKTsKQEAgLTExNiw3MCArMTcwLDk1IEBA IHN0YXRpYyBpbnQgZWljNzcwMF9kd21hY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpw ZGV2KQogCWlmICghZHdjX3ByaXYpCiAJCXJldHVybiAtRU5PTUVNOwogCisJZHdjX3ByaXYtPmRl diA9ICZwZGV2LT5kZXY7CisKKwlkYXRhID0gZGV2aWNlX2dldF9tYXRjaF9kYXRhKCZwZGV2LT5k ZXYpOworCWlmICghZGF0YSkKKwkJcmV0dXJuIGRldl9lcnJfcHJvYmUoJnBkZXYtPmRldiwKKwkJ CQkgICAgIC1FSU5WQUwsICJubyBtYXRjaCBkYXRhIGZvdW5kXG4iKTsKKworCWR3Y19wcml2LT5l dGhfcnhfY2xrX2ludiA9IGRhdGEtPnJnbWlpX3J4X2Nsa19pbnZlcnQ7CisKIAkvKiBSZWFkIHJ4 LWludGVybmFsLWRlbGF5LXBzIGFuZCB1cGRhdGUgcnhfY2xrIGRlbGF5ICovCiAJaWYgKCFvZl9w cm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9kZSwKIAkJCQkgICJyeC1pbnRlcm5hbC1k ZWxheS1wcyIsICZkZWxheV9wcykpIHsKLQkJdTMyIHZhbCA9IG1pbihkZWxheV9wcyAvIDEwMCwg RUlDNzcwMF9NQVhfREVMQVlfVU5JVCk7CisJCWlmIChkZWxheV9wcyAlIEVJQzc3MDBfREVMQVlf U1RFUF9QUykKKwkJCXJldHVybiBkZXZfZXJyX3Byb2JlKCZwZGV2LT5kZXYsIC1FSU5WQUwsCisJ CQkJInJ4IGRlbGF5IG11c3QgYmUgbXVsdGlwbGUgb2YgJWRwc1xuIiwKKwkJCQlFSUM3NzAwX0RF TEFZX1NURVBfUFMpOwogCi0JCWV0aF9kbHlfcGFyYW0gJj0gfkVJQzc3MDBfRVRIX1JYX0FESl9E RUxBWTsKLQkJZXRoX2RseV9wYXJhbSB8PSBGSUVMRF9QUkVQKEVJQzc3MDBfRVRIX1JYX0FESl9E RUxBWSwgdmFsKTsKLQl9IGVsc2UgewotCQlyZXR1cm4gZGV2X2Vycl9wcm9iZSgmcGRldi0+ZGV2 LCAtRUlOVkFMLAotCQkJIm1pc3NpbmcgcmVxdWlyZWQgcHJvcGVydHkgcngtaW50ZXJuYWwtZGVs YXktcHNcbiIpOworCQlpZiAoZGVsYXlfcHMgPiBFSUM3NzAwX01BWF9ERUxBWV9QUykKKwkJCXJl dHVybiBkZXZfZXJyX3Byb2JlKCZwZGV2LT5kZXYsIC1FSU5WQUwsCisJCQkJInJ4IGRlbGF5IG91 dCBvZiByYW5nZVxuIik7CisKKwkJdmFsID0gZGVsYXlfcHMgLyBFSUM3NzAwX0RFTEFZX1NURVBf UFM7CisKKwkJZHdjX3ByaXYtPmV0aF9jbGtfZGx5X3BhcmFtICY9IH5FSUM3NzAwX0VUSF9SWF9B REpfREVMQVk7CisJCWR3Y19wcml2LT5ldGhfY2xrX2RseV9wYXJhbSB8PQorCQkJCSBGSUVMRF9Q UkVQKEVJQzc3MDBfRVRIX1JYX0FESl9ERUxBWSwgdmFsKTsKIAl9CiAKIAkvKiBSZWFkIHR4LWlu dGVybmFsLWRlbGF5LXBzIGFuZCB1cGRhdGUgdHhfY2xrIGRlbGF5ICovCiAJaWYgKCFvZl9wcm9w ZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9kZSwKIAkJCQkgICJ0eC1pbnRlcm5hbC1kZWxh eS1wcyIsICZkZWxheV9wcykpIHsKLQkJdTMyIHZhbCA9IG1pbihkZWxheV9wcyAvIDEwMCwgRUlD NzcwMF9NQVhfREVMQVlfVU5JVCk7CisJCWlmIChkZWxheV9wcyAlIEVJQzc3MDBfREVMQVlfU1RF UF9QUykKKwkJCXJldHVybiBkZXZfZXJyX3Byb2JlKCZwZGV2LT5kZXYsIC1FSU5WQUwsCisJCQkJ InR4IGRlbGF5IG11c3QgYmUgbXVsdGlwbGUgb2YgJWRwc1xuIiwKKwkJCQlFSUM3NzAwX0RFTEFZ X1NURVBfUFMpOworCisJCWlmIChkZWxheV9wcyA+IEVJQzc3MDBfTUFYX0RFTEFZX1BTKQorCQkJ cmV0dXJuIGRldl9lcnJfcHJvYmUoJnBkZXYtPmRldiwgLUVJTlZBTCwKKwkJCQkidHggZGVsYXkg b3V0IG9mIHJhbmdlXG4iKTsKIAotCQlldGhfZGx5X3BhcmFtICY9IH5FSUM3NzAwX0VUSF9UWF9B REpfREVMQVk7Ci0JCWV0aF9kbHlfcGFyYW0gfD0gRklFTERfUFJFUChFSUM3NzAwX0VUSF9UWF9B REpfREVMQVksIHZhbCk7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIGRldl9lcnJfcHJvYmUoJnBkZXYt PmRldiwgLUVJTlZBTCwKLQkJCSJtaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5IHR4LWludGVybmFs LWRlbGF5LXBzXG4iKTsKKwkJdmFsID0gZGVsYXlfcHMgLyBFSUM3NzAwX0RFTEFZX1NURVBfUFM7 CisKKwkJZHdjX3ByaXYtPmV0aF9jbGtfZGx5X3BhcmFtICY9IH5FSUM3NzAwX0VUSF9UWF9BREpf REVMQVk7CisJCWR3Y19wcml2LT5ldGhfY2xrX2RseV9wYXJhbSB8PQorCQkJCSBGSUVMRF9QUkVQ KEVJQzc3MDBfRVRIX1RYX0FESl9ERUxBWSwgdmFsKTsKIAl9CiAKLQllaWM3NzAwX2hzcF9yZWdt YXAgPSBzeXNjb25fcmVnbWFwX2xvb2t1cF9ieV9waGFuZGxlKHBkZXYtPmRldi5vZl9ub2RlLAot CQkJCQkJCSAgICAgImVzd2luLGhzcC1zcC1jc3IiKTsKLQlpZiAoSVNfRVJSKGVpYzc3MDBfaHNw X3JlZ21hcCkpCisJZHdjX3ByaXYtPmVpYzc3MDBfaHNwX3JlZ21hcCA9CisJCQlzeXNjb25fcmVn bWFwX2xvb2t1cF9ieV9waGFuZGxlKHBkZXYtPmRldi5vZl9ub2RlLAorCQkJCQkJCSJlc3dpbixo c3Atc3AtY3NyIik7CisJaWYgKElTX0VSUihkd2NfcHJpdi0+ZWljNzcwMF9oc3BfcmVnbWFwKSkK IAkJcmV0dXJuIGRldl9lcnJfcHJvYmUoJnBkZXYtPmRldiwKLQkJCQlQVFJfRVJSKGVpYzc3MDBf aHNwX3JlZ21hcCksCisJCQkJUFRSX0VSUihkd2NfcHJpdi0+ZWljNzcwMF9oc3BfcmVnbWFwKSwK IAkJCQkiRmFpbGVkIHRvIGdldCBoc3Atc3AtY3NyIHJlZ21hcFxuIik7CiAKIAlyZXQgPSBvZl9w cm9wZXJ0eV9yZWFkX3UzMl9pbmRleChwZGV2LT5kZXYub2Zfbm9kZSwKIAkJCQkJICJlc3dpbixo c3Atc3AtY3NyIiwKLQkJCQkJIDEsICZldGhfcGh5X2N0cmxfb2Zmc2V0KTsKKwkJCQkJIDEsICZk d2NfcHJpdi0+ZXRoX3BoeV9jdHJsX29mZnNldCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIGRldl9l cnJfcHJvYmUoJnBkZXYtPmRldiwgcmV0LAogCQkJCSAgICAgImNhbid0IGdldCBldGhfcGh5X2N0 cmxfb2Zmc2V0XG4iKTsKIAotCXJlZ21hcF9yZWFkKGVpYzc3MDBfaHNwX3JlZ21hcCwgZXRoX3Bo eV9jdHJsX29mZnNldCwKLQkJICAgICZldGhfcGh5X2N0cmxfcmVnc2V0KTsKLQlldGhfcGh5X2N0 cmxfcmVnc2V0IHw9Ci0JCShFSUM3NzAwX0VUSF9UWF9DTEtfU0VMIHwgRUlDNzcwMF9FVEhfUEhZ X0lOVEZfU0VMSSk7Ci0JcmVnbWFwX3dyaXRlKGVpYzc3MDBfaHNwX3JlZ21hcCwgZXRoX3BoeV9j dHJsX29mZnNldCwKLQkJICAgICBldGhfcGh5X2N0cmxfcmVnc2V0KTsKLQogCXJldCA9IG9mX3By b3BlcnR5X3JlYWRfdTMyX2luZGV4KHBkZXYtPmRldi5vZl9ub2RlLAogCQkJCQkgImVzd2luLGhz cC1zcC1jc3IiLAotCQkJCQkgMiwgJmV0aF9heGlfbHBfY3RybF9vZmZzZXQpOworCQkJCQkgMiwg JmR3Y19wcml2LT5ldGhfYXhpX2xwX2N0cmxfb2Zmc2V0KTsKIAlpZiAocmV0KQogCQlyZXR1cm4g ZGV2X2Vycl9wcm9iZSgmcGRldi0+ZGV2LCByZXQsCiAJCQkJICAgICAiY2FuJ3QgZ2V0IGV0aF9h eGlfbHBfY3RybF9vZmZzZXRcbiIpOwogCi0JcmVnbWFwX3dyaXRlKGVpYzc3MDBfaHNwX3JlZ21h cCwgZXRoX2F4aV9scF9jdHJsX29mZnNldCwKLQkJICAgICBFSUM3NzAwX0VUSF9DU1lTUkVRX1ZB TCk7CisJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzJfaW5kZXgocGRldi0+ZGV2Lm9mX25vZGUs CisJCQkJCSAiZXN3aW4saHNwLXNwLWNzciIsCisJCQkJCSAzLCAmZHdjX3ByaXYtPmV0aF90eGRf b2Zmc2V0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gZGV2X2Vycl9wcm9iZSgmcGRldi0+ZGV2LCBy ZXQsCisJCQkJICAgICAiY2FuJ3QgZ2V0IGV0aF90eGRfb2Zmc2V0XG4iKTsKIAogCXJldCA9IG9m X3Byb3BlcnR5X3JlYWRfdTMyX2luZGV4KHBkZXYtPmRldi5vZl9ub2RlLAogCQkJCQkgImVzd2lu LGhzcC1zcC1jc3IiLAotCQkJCQkgMywgJmV0aF9yeGRfZGx5X29mZnNldCk7CisJCQkJCSA0LCAm ZHdjX3ByaXYtPmV0aF9jbGtfb2Zmc2V0KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gZGV2X2Vycl9w cm9iZSgmcGRldi0+ZGV2LCByZXQsCi0JCQkJICAgICAiY2FuJ3QgZ2V0IGV0aF9yeGRfZGx5X29m ZnNldFxuIik7CisJCQkJICAgICAiY2FuJ3QgZ2V0IGV0aF9jbGtfb2Zmc2V0XG4iKTsKIAotCXJl Z21hcF93cml0ZShlaWM3NzAwX2hzcF9yZWdtYXAsIGV0aF9yeGRfZGx5X29mZnNldCwKLQkJICAg ICBldGhfZGx5X3BhcmFtKTsKKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMl9pbmRleChwZGV2 LT5kZXYub2Zfbm9kZSwKKwkJCQkJICJlc3dpbixoc3Atc3AtY3NyIiwKKwkJCQkJIDUsICZkd2Nf cHJpdi0+ZXRoX3J4ZF9vZmZzZXQpOworCWlmIChyZXQpCisJCXJldHVybiBkZXZfZXJyX3Byb2Jl KCZwZGV2LT5kZXYsIHJldCwKKwkJCQkgICAgICJjYW4ndCBnZXQgZXRoX3J4ZF9vZmZzZXRcbiIp OwogCiAJcGxhdF9kYXQtPm51bV9jbGtzID0gQVJSQVlfU0laRShlaWM3NzAwX2Nsa19uYW1lcyk7 CiAJcGxhdF9kYXQtPmNsa3MgPSBkZXZtX2tjYWxsb2MoJnBkZXYtPmRldiwKQEAgLTIwOCwxMiAr Mjg3LDI3IEBAIHN0YXRpYyBpbnQgZWljNzcwMF9kd21hY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1f ZGV2aWNlICpwZGV2KQogCXBsYXRfZGF0LT5leGl0ID0gZWljNzcwMF9kd21hY19leGl0OwogCXBs YXRfZGF0LT5zdXNwZW5kID0gZWljNzcwMF9kd21hY19zdXNwZW5kOwogCXBsYXRfZGF0LT5yZXN1 bWUgPSBlaWM3NzAwX2R3bWFjX3Jlc3VtZTsKKwlwbGF0X2RhdC0+Zml4X21hY19zcGVlZCA9IGVp Yzc3MDBfZHdtYWNfZml4X3NwZWVkOwogCiAJcmV0dXJuIGRldm1fc3RtbWFjX3BsdGZyX3Byb2Jl KHBkZXYsIHBsYXRfZGF0LCAmc3RtbWFjX3Jlcyk7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qg ZWljNzcwMF9kd21hY19kYXRhIGVpYzc3MDBfZHdtYWNfZGF0YSA9IHsKKwkucmdtaWlfcnhfY2xr X2ludmVydCA9IGZhbHNlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBlaWM3NzAwX2R3bWFj X2RhdGEgZWljNzcwMF9kd21hY19kYXRhX2Nsa19pbnZlcnNpb24gPSB7CisJLnJnbWlpX3J4X2Ns a19pbnZlcnQgPSB0cnVlLAorfTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQg ZWljNzcwMF9kd21hY19tYXRjaFtdID0gewotCXsgLmNvbXBhdGlibGUgPSAiZXN3aW4sZWljNzcw MC1xb3MtZXRoIiB9LAorCXsJLmNvbXBhdGlibGUgPSAiZXN3aW4sZWljNzcwMC1xb3MtZXRoIiwK KwkJLmRhdGEgPSAmZWljNzcwMF9kd21hY19kYXRhLAorCX0sCisJeworCQkuY29tcGF0aWJsZSA9 ICJlc3dpbixlaWM3NzAwLXFvcy1ldGgtY2xrLWludmVyc2lvbiIsCisJCS5kYXRhID0gJmVpYzc3 MDBfZHdtYWNfZGF0YV9jbGtfaW52ZXJzaW9uLAorCX0sCiAJeyB9CiB9OwogTU9EVUxFX0RFVklD RV9UQUJMRShvZiwgZWljNzcwMF9kd21hY19tYXRjaCk7Ci0tIAoyLjI1LjEKCgpfX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1yaXNjdiBtYWlsaW5n IGxpc3QKbGludXgtcmlzY3ZAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFk ZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LXJpc2N2Cg==