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=-16.8 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,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 193ADC433B4 for ; Wed, 14 Apr 2021 07:04:24 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id E2BDB613C4 for ; Wed, 14 Apr 2021 07:04:23 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1346953AbhDNHEn (ORCPT ); Wed, 14 Apr 2021 03:04:43 -0400 Received: from regular1.263xmail.com ([211.150.70.198]:46626 "EHLO regular1.263xmail.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1349670AbhDNHEg (ORCPT ); Wed, 14 Apr 2021 03:04:36 -0400 Received: from localhost (unknown [192.168.167.70]) by regular1.263xmail.com (Postfix) with ESMTP id E7F47755; Wed, 14 Apr 2021 15:03:34 +0800 (CST) X-MAIL-GRAY: 0 X-MAIL-DELIVERY: 1 X-ADDR-CHECKED4: 1 X-ANTISPAM-LEVEL: 2 X-SKE-CHECKED: 1 X-ABS-CHECKED: 1 Received: from xxm-vm.localdomain (unknown [58.22.7.114]) by smtp.263.net (postfix) whith ESMTP id P27466T139676331525888S1618383809810426_; Wed, 14 Apr 2021 15:03:33 +0800 (CST) X-IP-DOMAINF: 1 X-UNIQUE-TAG: X-RL-SENDER: xxm@rock-chips.com X-SENDER: xxm@rock-chips.com X-LOGIN-NAME: xxm@rock-chips.com X-FST-TO: bhelgaas@google.com X-SENDER-IP: 58.22.7.114 X-ATTACHMENT-NUM: 0 X-System-Flag: 0 From: Simon Xue To: Bjorn Helgaas , Lorenzo Pieralisi Cc: linux-pci@vger.kernel.org, linux-rockchip@lists.infradead.org, devicetree@vger.kernel.org, robh+dt@kernel.org, Johan Jonker , Heiko Stuebner , Simon Xue , Shawn Lin Subject: [PATCH v7] PCI: rockchip: Add Rockchip RK356X host controller driver Date: Wed, 14 Apr 2021 15:03:25 +0800 Message-Id: <20210414070325.924789-1-xxm@rock-chips.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org Add a driver for the DesignWare-based PCIe controller found on RK356X. The existing pcie-rockchip-host driver is only used for the Rockchip-designed IP found on RK3399. Signed-off-by: Simon Xue Signed-off-by: Shawn Lin --- drivers/pci/controller/dwc/Kconfig | 10 + drivers/pci/controller/dwc/Makefile | 1 + drivers/pci/controller/dwc/pcie-dw-rockchip.c | 277 ++++++++++++++++++ 3 files changed, 288 insertions(+) create mode 100644 drivers/pci/controller/dwc/pcie-dw-rockchip.c diff --git a/drivers/pci/controller/dwc/Kconfig b/drivers/pci/controller/dwc/Kconfig index 423d35872ce4..8ab027ba8c04 100644 --- a/drivers/pci/controller/dwc/Kconfig +++ b/drivers/pci/controller/dwc/Kconfig @@ -214,6 +214,16 @@ config PCIE_ARTPEC6_EP Enables support for the PCIe controller in the ARTPEC-6 SoC to work in endpoint mode. This uses the DesignWare core. +config PCIE_ROCKCHIP_DW_HOST + bool "Rockchip DesignWare PCIe controller" + select PCIE_DW + select PCIE_DW_HOST + depends on ARCH_ROCKCHIP || COMPILE_TEST + depends on OF + help + Enables support for the DesignWare PCIe controller in the + Rockchip SoC except RK3399. + config PCIE_INTEL_GW bool "Intel Gateway PCIe host controller support" depends on OF && (X86 || COMPILE_TEST) diff --git a/drivers/pci/controller/dwc/Makefile b/drivers/pci/controller/dwc/Makefile index 952d01941f23..0104659dfe88 100644 --- a/drivers/pci/controller/dwc/Makefile +++ b/drivers/pci/controller/dwc/Makefile @@ -14,6 +14,7 @@ obj-$(CONFIG_PCI_LAYERSCAPE_EP) += pci-layerscape-ep.o obj-$(CONFIG_PCIE_QCOM) += pcie-qcom.o obj-$(CONFIG_PCIE_ARMADA_8K) += pcie-armada8k.o obj-$(CONFIG_PCIE_ARTPEC6) += pcie-artpec6.o +obj-$(CONFIG_PCIE_ROCKCHIP_DW_HOST) += pcie-dw-rockchip.o obj-$(CONFIG_PCIE_INTEL_GW) += pcie-intel-gw.o obj-$(CONFIG_PCIE_KIRIN) += pcie-kirin.o obj-$(CONFIG_PCIE_HISI_STB) += pcie-histb.o diff --git a/drivers/pci/controller/dwc/pcie-dw-rockchip.c b/drivers/pci/controller/dwc/pcie-dw-rockchip.c new file mode 100644 index 000000000000..3f060144eeab --- /dev/null +++ b/drivers/pci/controller/dwc/pcie-dw-rockchip.c @@ -0,0 +1,277 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * PCIe host controller driver for Rockchip SoCs. + * + * Copyright (C) 2021 Rockchip Electronics Co., Ltd. + * http://www.rock-chips.com + * + * Author: Simon Xue + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "pcie-designware.h" + +/* + * The upper 16 bits of PCIE_CLIENT_CONFIG are a write + * mask for the lower 16 bits. + */ +#define HIWORD_UPDATE(mask, val) (((mask) << 16) | (val)) +#define HIWORD_UPDATE_BIT(val) HIWORD_UPDATE(val, val) + +#define to_rockchip_pcie(x) dev_get_drvdata((x)->dev) + +#define PCIE_CLIENT_RC_MODE HIWORD_UPDATE_BIT(0x40) +#define PCIE_CLIENT_ENABLE_LTSSM HIWORD_UPDATE_BIT(0xc) +#define PCIE_SMLH_LINKUP BIT(16) +#define PCIE_RDLH_LINKUP BIT(17) +#define PCIE_LINKUP (PCIE_SMLH_LINKUP | PCIE_RDLH_LINKUP) +#define PCIE_L0S_ENTRY 0x11 +#define PCIE_CLIENT_GENERAL_CONTROL 0x0 +#define PCIE_CLIENT_GENERAL_DEBUG 0x104 +#define PCIE_CLIENT_HOT_RESET_CTRL 0x180 +#define PCIE_CLIENT_LTSSM_STATUS 0x300 +#define PCIE_LTSSM_ENABLE_ENHANCE BIT(4) + +struct rockchip_pcie { + struct dw_pcie pci; + void __iomem *apb_base; + struct phy *phy; + struct clk_bulk_data *clks; + unsigned int clk_cnt; + struct reset_control *rst; + struct gpio_desc *rst_gpio; + struct regulator *vpcie3v3; +}; + +static int rockchip_pcie_readl_apb(struct rockchip_pcie *rockchip, + u32 reg) +{ + return readl(rockchip->apb_base + reg); +} + +static void rockchip_pcie_writel_apb(struct rockchip_pcie *rockchip, + u32 val, u32 reg) +{ + writel(val, rockchip->apb_base + reg); +} + +static void rockchip_pcie_enable_ltssm(struct rockchip_pcie *rockchip) +{ + rockchip_pcie_writel_apb(rockchip, PCIE_CLIENT_ENABLE_LTSSM, + PCIE_CLIENT_GENERAL_CONTROL); +} + +static int rockchip_pcie_link_up(struct dw_pcie *pci) +{ + struct rockchip_pcie *rockchip = to_rockchip_pcie(pci); + u32 val = rockchip_pcie_readl_apb(rockchip, PCIE_CLIENT_LTSSM_STATUS); + + if ((val & (PCIE_RDLH_LINKUP | PCIE_SMLH_LINKUP)) == PCIE_LINKUP && + (val & GENMASK(5, 0)) == PCIE_L0S_ENTRY) + return 1; + + return 0; +} + +static int rockchip_pcie_start_link(struct dw_pcie *pci) +{ + struct rockchip_pcie *rockchip = to_rockchip_pcie(pci); + + /* Reset device */ + gpiod_set_value_cansleep(rockchip->rst_gpio, 0); + + rockchip_pcie_enable_ltssm(rockchip); + + /* + * PCIe requires the refclk to be stable for 100µs prior to releasing + * PERST. See table 2-4 in section 2.6.2 AC Specifications of the PCI + * Express Card Electromechanical Specification, 1.1. However, we don't + * know if the refclk is coming from RC's PHY or external OSC. If it's + * from RC, so enabling LTSSM is the just right place to release #PERST. + * We need more extra time as before, rather than setting just + * 100us as we don't know how long should the device need to reset. + */ + msleep(100); + gpiod_set_value_cansleep(rockchip->rst_gpio, 1); + + return 0; +} + +static int rockchip_pcie_host_init(struct pcie_port *pp) +{ + struct dw_pcie *pci = to_dw_pcie_from_pp(pp); + struct rockchip_pcie *rockchip = to_rockchip_pcie(pci); + u32 val; + + /* LTSSM enable control mode */ + val = rockchip_pcie_readl_apb(rockchip, PCIE_CLIENT_HOT_RESET_CTRL); + val |= PCIE_LTSSM_ENABLE_ENHANCE | (PCIE_LTSSM_ENABLE_ENHANCE << 16); + rockchip_pcie_writel_apb(rockchip, val, PCIE_CLIENT_HOT_RESET_CTRL); + + rockchip_pcie_writel_apb(rockchip, PCIE_CLIENT_RC_MODE, + PCIE_CLIENT_GENERAL_CONTROL); + + return 0; +} + +static const struct dw_pcie_host_ops rockchip_pcie_host_ops = { + .host_init = rockchip_pcie_host_init, +}; + +static int rockchip_pcie_clk_init(struct rockchip_pcie *rockchip) +{ + struct device *dev = rockchip->pci.dev; + int ret; + + ret = devm_clk_bulk_get_all(dev, &rockchip->clks); + if (ret < 0) + return ret; + + rockchip->clk_cnt = ret; + + return clk_bulk_prepare_enable(rockchip->clk_cnt, rockchip->clks); +} + +static int rockchip_pcie_resource_get(struct platform_device *pdev, + struct rockchip_pcie *rockchip) +{ + rockchip->apb_base = devm_platform_ioremap_resource_byname(pdev, "apb"); + if (IS_ERR(rockchip->apb_base)) + return PTR_ERR(rockchip->apb_base); + + rockchip->rst_gpio = devm_gpiod_get_optional(&pdev->dev, "reset", + GPIOD_OUT_HIGH); + if (IS_ERR(rockchip->rst_gpio)) + return PTR_ERR(rockchip->rst_gpio); + + return 0; +} + +static int rockchip_pcie_phy_init(struct rockchip_pcie *rockchip) +{ + struct device *dev = rockchip->pci.dev; + int ret; + + rockchip->phy = devm_phy_get(dev, "pcie-phy"); + if (IS_ERR(rockchip->phy)) + return dev_err_probe(dev, PTR_ERR(rockchip->phy), + "missing PHY\n"); + + ret = phy_init(rockchip->phy); + if (ret < 0) + return ret; + + ret = phy_power_on(rockchip->phy); + if (ret) + phy_exit(rockchip->phy); + + return ret; +} + +static void rockchip_pcie_phy_deinit(struct rockchip_pcie *rockchip) +{ + phy_exit(rockchip->phy); + phy_power_off(rockchip->phy); +} + +static int rockchip_pcie_reset_control_release(struct rockchip_pcie *rockchip) +{ + struct device *dev = rockchip->pci.dev; + + rockchip->rst = devm_reset_control_array_get_exclusive(dev); + if (IS_ERR(rockchip->rst)) + return dev_err_probe(dev, PTR_ERR(rockchip->rst), + "failed to get reset lines\n"); + + return reset_control_deassert(rockchip->rst); +} + +static const struct dw_pcie_ops dw_pcie_ops = { + .link_up = rockchip_pcie_link_up, + .start_link = rockchip_pcie_start_link, +}; + +static int rockchip_pcie_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + struct rockchip_pcie *rockchip; + struct pcie_port *pp; + int ret; + + rockchip = devm_kzalloc(dev, sizeof(*rockchip), GFP_KERNEL); + if (!rockchip) + return -ENOMEM; + + platform_set_drvdata(pdev, rockchip); + + rockchip->pci.dev = dev; + rockchip->pci.ops = &dw_pcie_ops; + + pp = &rockchip->pci.pp; + pp->ops = &rockchip_pcie_host_ops; + + ret = rockchip_pcie_resource_get(pdev, rockchip); + if (ret) + return ret; + + /* DON'T MOVE ME: must be enable before PHY init */ + rockchip->vpcie3v3 = devm_regulator_get_optional(dev, "vpcie3v3"); + if (IS_ERR(rockchip->vpcie3v3)) + if (PTR_ERR(rockchip->vpcie3v3) != -ENODEV) + return dev_err_probe(dev, PTR_ERR(rockchip->vpcie3v3), + "failed to get vpcie3v3 regulator\n"); + + ret = regulator_enable(rockchip->vpcie3v3); + if (ret) { + dev_err(dev, "failed to enable vpcie3v3 regulator\n"); + return ret; + } + + ret = rockchip_pcie_phy_init(rockchip); + if (ret) + goto disable_regulator; + + ret = rockchip_pcie_reset_control_release(rockchip); + if (ret) + goto deinit_phy; + + ret = rockchip_pcie_clk_init(rockchip); + if (ret) + goto deinit_phy; + + ret = dw_pcie_host_init(pp); + if (!ret) + return 0; + + clk_bulk_disable_unprepare(rockchip->clk_cnt, rockchip->clks); +deinit_phy: + rockchip_pcie_phy_deinit(rockchip); +disable_regulator: + regulator_disable(rockchip->vpcie3v3); + + return ret; +} + +static const struct of_device_id rockchip_pcie_of_match[] = { + { .compatible = "rockchip,rk3568-pcie", }, + {}, +}; + +static struct platform_driver rockchip_pcie_driver = { + .driver = { + .name = "rockchip-dw-pcie", + .of_match_table = rockchip_pcie_of_match, + .suppress_bind_attrs = true, + }, + .probe = rockchip_pcie_probe, +}; +builtin_platform_driver(rockchip_pcie_driver); -- 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=-16.8 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,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 DE8B6C433B4 for ; Wed, 14 Apr 2021 07:04:03 +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 19553613CC for ; Wed, 14 Apr 2021 07:04:03 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 19553613CC Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=rock-chips.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-rockchip-bounces+linux-rockchip=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: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:In-Reply-To:References:List-Owner; bh=0KlMOvdb3bkZ2FJxeZ+C3gWFdi2laCV5RvS9hXqPB9k=; b=ZGTmnDlN0XKzST7my62qceksNp AdLrMiYybse5hEp+m6Aq+zp4gsMJ6P+Wa/+SrJ+fxtOvMYCuxJNk9gHxIK0yV8nOzKO6Sm0QfFOQu vRq5GuMjlh06W9EINvf87Y/c+kCWBJ2pA3pl+P2xm0ZG0WeIGqh7u1XbI9BQEZOgdtlAsU6yU2F8Z 3AVFg9WB2oavA3PUYrzcrk7evOd6FGYaUQjho6EphqaPzWdftOxCaEd9hjX/u9dxtXboFGl29A2TA TPqXZM+azzDuFRNXu6QtZeDTYaHgEE75rlYymMq2EdpgeJLUsPj4I3uR98nzfNomR70p9MnbsXyfW O2FWya+w==; Received: from localhost ([::1] helo=desiato.infradead.org) by desiato.infradead.org with esmtp (Exim 4.94 #2 (Red Hat Linux)) id 1lWZZ4-00BmA4-HD; Wed, 14 Apr 2021 07:03:54 +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 1lWZZ1-00Bm9l-5q for linux-rockchip@desiato.infradead.org; Wed, 14 Apr 2021 07:03:51 +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:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To: Content-ID:Content-Description:In-Reply-To:References; bh=keH+UcW2PMkqmTzVj25ESlw1Q63+G+MNa8BGhgIFycs=; b=eTiYq/SEBzuokyU6Fgq5xXIDCv wGgJJKkr8ujCwtWnRAuoBYNuYvn6ZAP4kl0/y3A6JSfkWRH4Bq0xfaDqzks7LZdYHo2fwP1UR3nIo giy76jDvaD1K+NXVRea8YH7ycNCO2sCyd2X9p+u/ZYFu31Pvgf4ZMy51YgcsL3SLjv/vgBoaCttgU +KpRrXvSSTVGhBUTU1+ReUBvg2SxyZVNxJIh4FRIMJkY29AYSciyWmOgZfOWZpxhwJt2lW6L+NtAz jxPQYER2GyoHMcBYg6WuJ+hDUPWZFrYeRqilJXME30Cq44wqQ9rfMVyXmFl41LkjJfIkxkzLLcJDY AHOshxbw==; Received: from regular1.263xmail.com ([211.150.70.198]) by bombadil.infradead.org with esmtps (Exim 4.94 #2 (Red Hat Linux)) id 1lWZYx-007YYr-75 for linux-rockchip@lists.infradead.org; Wed, 14 Apr 2021 07:03:49 +0000 Received: from localhost (unknown [192.168.167.70]) by regular1.263xmail.com (Postfix) with ESMTP id E7F47755; Wed, 14 Apr 2021 15:03:34 +0800 (CST) X-MAIL-GRAY: 0 X-MAIL-DELIVERY: 1 X-ADDR-CHECKED4: 1 X-ANTISPAM-LEVEL: 2 X-SKE-CHECKED: 1 X-ABS-CHECKED: 1 Received: from xxm-vm.localdomain (unknown [58.22.7.114]) by smtp.263.net (postfix) whith ESMTP id P27466T139676331525888S1618383809810426_; Wed, 14 Apr 2021 15:03:33 +0800 (CST) X-IP-DOMAINF: 1 X-UNIQUE-TAG: X-RL-SENDER: xxm@rock-chips.com X-SENDER: xxm@rock-chips.com X-LOGIN-NAME: xxm@rock-chips.com X-FST-TO: bhelgaas@google.com X-SENDER-IP: 58.22.7.114 X-ATTACHMENT-NUM: 0 X-System-Flag: 0 From: Simon Xue To: Bjorn Helgaas , Lorenzo Pieralisi Cc: linux-pci@vger.kernel.org, linux-rockchip@lists.infradead.org, devicetree@vger.kernel.org, robh+dt@kernel.org, Johan Jonker , Heiko Stuebner , Simon Xue , Shawn Lin Subject: [PATCH v7] PCI: rockchip: Add Rockchip RK356X host controller driver Date: Wed, 14 Apr 2021 15:03:25 +0800 Message-Id: <20210414070325.924789-1-xxm@rock-chips.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210414_000347_743095_C0648AC0 X-CRM114-Status: GOOD ( 26.50 ) X-BeenThere: linux-rockchip@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Upstream kernel work for Rockchip platforms List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "Linux-rockchip" Errors-To: linux-rockchip-bounces+linux-rockchip=archiver.kernel.org@lists.infradead.org QWRkIGEgZHJpdmVyIGZvciB0aGUgRGVzaWduV2FyZS1iYXNlZCBQQ0llIGNvbnRyb2xsZXIgZm91 bmQgb24KUkszNTZYLiBUaGUgZXhpc3RpbmcgcGNpZS1yb2NrY2hpcC1ob3N0IGRyaXZlciBpcyBv bmx5IHVzZWQgZm9yCnRoZSBSb2NrY2hpcC1kZXNpZ25lZCBJUCBmb3VuZCBvbiBSSzMzOTkuCgpT aWduZWQtb2ZmLWJ5OiBTaW1vbiBYdWUgPHh4bUByb2NrLWNoaXBzLmNvbT4KU2lnbmVkLW9mZi1i eTogU2hhd24gTGluIDxzaGF3bi5saW5Acm9jay1jaGlwcy5jb20+Ci0tLQogZHJpdmVycy9wY2kv Y29udHJvbGxlci9kd2MvS2NvbmZpZyAgICAgICAgICAgIHwgIDEwICsKIGRyaXZlcnMvcGNpL2Nv bnRyb2xsZXIvZHdjL01ha2VmaWxlICAgICAgICAgICB8ICAgMSArCiBkcml2ZXJzL3BjaS9jb250 cm9sbGVyL2R3Yy9wY2llLWR3LXJvY2tjaGlwLmMgfCAyNzcgKysrKysrKysrKysrKysrKysrCiAz IGZpbGVzIGNoYW5nZWQsIDI4OCBpbnNlcnRpb25zKCspCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJp dmVycy9wY2kvY29udHJvbGxlci9kd2MvcGNpZS1kdy1yb2NrY2hpcC5jCgpkaWZmIC0tZ2l0IGEv ZHJpdmVycy9wY2kvY29udHJvbGxlci9kd2MvS2NvbmZpZyBiL2RyaXZlcnMvcGNpL2NvbnRyb2xs ZXIvZHdjL0tjb25maWcKaW5kZXggNDIzZDM1ODcyY2U0Li44YWIwMjdiYThjMDQgMTAwNjQ0Ci0t LSBhL2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIvZHdjL0tjb25maWcKKysrIGIvZHJpdmVycy9wY2kv Y29udHJvbGxlci9kd2MvS2NvbmZpZwpAQCAtMjE0LDYgKzIxNCwxNiBAQCBjb25maWcgUENJRV9B UlRQRUM2X0VQCiAJICBFbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBQQ0llIGNvbnRyb2xsZXIgaW4g dGhlIEFSVFBFQy02IFNvQyB0byB3b3JrIGluCiAJICBlbmRwb2ludCBtb2RlLiBUaGlzIHVzZXMg dGhlIERlc2lnbldhcmUgY29yZS4KIAorY29uZmlnIFBDSUVfUk9DS0NISVBfRFdfSE9TVAorCWJv b2wgIlJvY2tjaGlwIERlc2lnbldhcmUgUENJZSBjb250cm9sbGVyIgorCXNlbGVjdCBQQ0lFX0RX CisJc2VsZWN0IFBDSUVfRFdfSE9TVAorCWRlcGVuZHMgb24gQVJDSF9ST0NLQ0hJUCB8fCBDT01Q SUxFX1RFU1QKKwlkZXBlbmRzIG9uIE9GCisJaGVscAorCSAgRW5hYmxlcyBzdXBwb3J0IGZvciB0 aGUgRGVzaWduV2FyZSBQQ0llIGNvbnRyb2xsZXIgaW4gdGhlCisJICBSb2NrY2hpcCBTb0MgZXhj ZXB0IFJLMzM5OS4KKwogY29uZmlnIFBDSUVfSU5URUxfR1cKIAlib29sICJJbnRlbCBHYXRld2F5 IFBDSWUgaG9zdCBjb250cm9sbGVyIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBPRiAmJiAoWDg2IHx8 IENPTVBJTEVfVEVTVCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIvZHdjL01h a2VmaWxlIGIvZHJpdmVycy9wY2kvY29udHJvbGxlci9kd2MvTWFrZWZpbGUKaW5kZXggOTUyZDAx OTQxZjIzLi4wMTA0NjU5ZGZlODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIv ZHdjL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIvZHdjL01ha2VmaWxlCkBA IC0xNCw2ICsxNCw3IEBAIG9iai0kKENPTkZJR19QQ0lfTEFZRVJTQ0FQRV9FUCkgKz0gcGNpLWxh eWVyc2NhcGUtZXAubwogb2JqLSQoQ09ORklHX1BDSUVfUUNPTSkgKz0gcGNpZS1xY29tLm8KIG9i ai0kKENPTkZJR19QQ0lFX0FSTUFEQV84SykgKz0gcGNpZS1hcm1hZGE4ay5vCiBvYmotJChDT05G SUdfUENJRV9BUlRQRUM2KSArPSBwY2llLWFydHBlYzYubworb2JqLSQoQ09ORklHX1BDSUVfUk9D S0NISVBfRFdfSE9TVCkgKz0gcGNpZS1kdy1yb2NrY2hpcC5vCiBvYmotJChDT05GSUdfUENJRV9J TlRFTF9HVykgKz0gcGNpZS1pbnRlbC1ndy5vCiBvYmotJChDT05GSUdfUENJRV9LSVJJTikgKz0g cGNpZS1raXJpbi5vCiBvYmotJChDT05GSUdfUENJRV9ISVNJX1NUQikgKz0gcGNpZS1oaXN0Yi5v CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9jb250cm9sbGVyL2R3Yy9wY2llLWR3LXJvY2tjaGlw LmMgYi9kcml2ZXJzL3BjaS9jb250cm9sbGVyL2R3Yy9wY2llLWR3LXJvY2tjaGlwLmMKbmV3IGZp bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwLi4zZjA2MDE0NGVlYWIKLS0tIC9kZXYv bnVsbAorKysgYi9kcml2ZXJzL3BjaS9jb250cm9sbGVyL2R3Yy9wY2llLWR3LXJvY2tjaGlwLmMK QEAgLTAsMCArMSwyNzcgQEAKKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCisv KgorICogUENJZSBob3N0IGNvbnRyb2xsZXIgZHJpdmVyIGZvciBSb2NrY2hpcCBTb0NzLgorICoK KyAqIENvcHlyaWdodCAoQykgMjAyMSBSb2NrY2hpcCBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAq CQlodHRwOi8vd3d3LnJvY2stY2hpcHMuY29tCisgKgorICogQXV0aG9yOiBTaW1vbiBYdWUgPHh4 bUByb2NrLWNoaXBzLmNvbT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVk ZSA8bGludXgvZ3Bpby9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9zeXNjb24uaD4K KyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4K KyNpbmNsdWRlIDxsaW51eC9waHkvcGh5Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2 aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvcmVzZXQu aD4KKworI2luY2x1ZGUgInBjaWUtZGVzaWdud2FyZS5oIgorCisvKgorICogVGhlIHVwcGVyIDE2 IGJpdHMgb2YgUENJRV9DTElFTlRfQ09ORklHIGFyZSBhIHdyaXRlCisgKiBtYXNrIGZvciB0aGUg bG93ZXIgMTYgYml0cy4KKyAqLworI2RlZmluZSBISVdPUkRfVVBEQVRFKG1hc2ssIHZhbCkgKCgo bWFzaykgPDwgMTYpIHwgKHZhbCkpCisjZGVmaW5lIEhJV09SRF9VUERBVEVfQklUKHZhbCkJSElX T1JEX1VQREFURSh2YWwsIHZhbCkKKworI2RlZmluZSB0b19yb2NrY2hpcF9wY2llKHgpIGRldl9n ZXRfZHJ2ZGF0YSgoeCktPmRldikKKworI2RlZmluZSBQQ0lFX0NMSUVOVF9SQ19NT0RFCQlISVdP UkRfVVBEQVRFX0JJVCgweDQwKQorI2RlZmluZSBQQ0lFX0NMSUVOVF9FTkFCTEVfTFRTU00JSElX T1JEX1VQREFURV9CSVQoMHhjKQorI2RlZmluZSBQQ0lFX1NNTEhfTElOS1VQCQlCSVQoMTYpCisj ZGVmaW5lIFBDSUVfUkRMSF9MSU5LVVAJCUJJVCgxNykKKyNkZWZpbmUgUENJRV9MSU5LVVAJCQko UENJRV9TTUxIX0xJTktVUCB8IFBDSUVfUkRMSF9MSU5LVVApCisjZGVmaW5lIFBDSUVfTDBTX0VO VFJZCQkJMHgxMQorI2RlZmluZSBQQ0lFX0NMSUVOVF9HRU5FUkFMX0NPTlRST0wJMHgwCisjZGVm aW5lIFBDSUVfQ0xJRU5UX0dFTkVSQUxfREVCVUcJMHgxMDQKKyNkZWZpbmUgUENJRV9DTElFTlRf SE9UX1JFU0VUX0NUUkwgICAgICAweDE4MAorI2RlZmluZSBQQ0lFX0NMSUVOVF9MVFNTTV9TVEFU VVMJMHgzMDAKKyNkZWZpbmUgUENJRV9MVFNTTV9FTkFCTEVfRU5IQU5DRSAgICAgICBCSVQoNCkK Kworc3RydWN0IHJvY2tjaGlwX3BjaWUgeworCXN0cnVjdCBkd19wY2llCQkJcGNpOworCXZvaWQg X19pb21lbQkJCSphcGJfYmFzZTsKKwlzdHJ1Y3QgcGh5CQkJKnBoeTsKKwlzdHJ1Y3QgY2xrX2J1 bGtfZGF0YQkJKmNsa3M7CisJdW5zaWduZWQgaW50CQkJY2xrX2NudDsKKwlzdHJ1Y3QgcmVzZXRf Y29udHJvbAkJKnJzdDsKKwlzdHJ1Y3QgZ3Bpb19kZXNjCQkqcnN0X2dwaW87CisJc3RydWN0IHJl Z3VsYXRvciAgICAgICAgICAgICAgICAqdnBjaWUzdjM7Cit9OworCitzdGF0aWMgaW50IHJvY2tj aGlwX3BjaWVfcmVhZGxfYXBiKHN0cnVjdCByb2NrY2hpcF9wY2llICpyb2NrY2hpcCwKKwkJCQkJ ICAgICB1MzIgcmVnKQoreworCXJldHVybiByZWFkbChyb2NrY2hpcC0+YXBiX2Jhc2UgKyByZWcp OworfQorCitzdGF0aWMgdm9pZCByb2NrY2hpcF9wY2llX3dyaXRlbF9hcGIoc3RydWN0IHJvY2tj aGlwX3BjaWUgKnJvY2tjaGlwLAorCQkJCQkJdTMyIHZhbCwgdTMyIHJlZykKK3sKKwl3cml0ZWwo dmFsLCByb2NrY2hpcC0+YXBiX2Jhc2UgKyByZWcpOworfQorCitzdGF0aWMgdm9pZCByb2NrY2hp cF9wY2llX2VuYWJsZV9sdHNzbShzdHJ1Y3Qgcm9ja2NoaXBfcGNpZSAqcm9ja2NoaXApCit7CisJ cm9ja2NoaXBfcGNpZV93cml0ZWxfYXBiKHJvY2tjaGlwLCBQQ0lFX0NMSUVOVF9FTkFCTEVfTFRT U00sCisJCQkJIFBDSUVfQ0xJRU5UX0dFTkVSQUxfQ09OVFJPTCk7Cit9CisKK3N0YXRpYyBpbnQg cm9ja2NoaXBfcGNpZV9saW5rX3VwKHN0cnVjdCBkd19wY2llICpwY2kpCit7CisJc3RydWN0IHJv Y2tjaGlwX3BjaWUgKnJvY2tjaGlwID0gdG9fcm9ja2NoaXBfcGNpZShwY2kpOworCXUzMiB2YWwg PSByb2NrY2hpcF9wY2llX3JlYWRsX2FwYihyb2NrY2hpcCwgUENJRV9DTElFTlRfTFRTU01fU1RB VFVTKTsKKworCWlmICgodmFsICYgKFBDSUVfUkRMSF9MSU5LVVAgfCBQQ0lFX1NNTEhfTElOS1VQ KSkgPT0gUENJRV9MSU5LVVAgJiYKKwkgICAgKHZhbCAmIEdFTk1BU0soNSwgMCkpID09IFBDSUVf TDBTX0VOVFJZKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJv Y2tjaGlwX3BjaWVfc3RhcnRfbGluayhzdHJ1Y3QgZHdfcGNpZSAqcGNpKQoreworCXN0cnVjdCBy b2NrY2hpcF9wY2llICpyb2NrY2hpcCA9IHRvX3JvY2tjaGlwX3BjaWUocGNpKTsKKworCS8qIFJl c2V0IGRldmljZSAqLworCWdwaW9kX3NldF92YWx1ZV9jYW5zbGVlcChyb2NrY2hpcC0+cnN0X2dw aW8sIDApOworCisJcm9ja2NoaXBfcGNpZV9lbmFibGVfbHRzc20ocm9ja2NoaXApOworCisJLyoK KwkgKiBQQ0llIHJlcXVpcmVzIHRoZSByZWZjbGsgdG8gYmUgc3RhYmxlIGZvciAxMDDCtXMgcHJp b3IgdG8gcmVsZWFzaW5nCisJICogUEVSU1QuIFNlZSB0YWJsZSAyLTQgaW4gc2VjdGlvbiAyLjYu MiBBQyBTcGVjaWZpY2F0aW9ucyBvZiB0aGUgUENJCisJICogRXhwcmVzcyBDYXJkIEVsZWN0cm9t ZWNoYW5pY2FsIFNwZWNpZmljYXRpb24sIDEuMS4gSG93ZXZlciwgd2UgZG9uJ3QKKwkgKiBrbm93 IGlmIHRoZSByZWZjbGsgaXMgY29taW5nIGZyb20gUkMncyBQSFkgb3IgZXh0ZXJuYWwgT1NDLiBJ ZiBpdCdzCisJICogZnJvbSBSQywgc28gZW5hYmxpbmcgTFRTU00gaXMgdGhlIGp1c3QgcmlnaHQg cGxhY2UgdG8gcmVsZWFzZSAjUEVSU1QuCisJICogV2UgbmVlZCBtb3JlIGV4dHJhIHRpbWUgYXMg YmVmb3JlLCByYXRoZXIgdGhhbiBzZXR0aW5nIGp1c3QKKwkgKiAxMDB1cyBhcyB3ZSBkb24ndCBr bm93IGhvdyBsb25nIHNob3VsZCB0aGUgZGV2aWNlIG5lZWQgdG8gcmVzZXQuCisJICovCisJbXNs ZWVwKDEwMCk7CisJZ3Bpb2Rfc2V0X3ZhbHVlX2NhbnNsZWVwKHJvY2tjaGlwLT5yc3RfZ3Bpbywg MSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByb2NrY2hpcF9wY2llX2hvc3RfaW5p dChzdHJ1Y3QgcGNpZV9wb3J0ICpwcCkKK3sKKwlzdHJ1Y3QgZHdfcGNpZSAqcGNpID0gdG9fZHdf cGNpZV9mcm9tX3BwKHBwKTsKKwlzdHJ1Y3Qgcm9ja2NoaXBfcGNpZSAqcm9ja2NoaXAgPSB0b19y b2NrY2hpcF9wY2llKHBjaSk7CisJdTMyIHZhbDsKKworCS8qIExUU1NNIGVuYWJsZSBjb250cm9s IG1vZGUgKi8KKwl2YWwgPSByb2NrY2hpcF9wY2llX3JlYWRsX2FwYihyb2NrY2hpcCwgUENJRV9D TElFTlRfSE9UX1JFU0VUX0NUUkwpOworCXZhbCB8PSBQQ0lFX0xUU1NNX0VOQUJMRV9FTkhBTkNF IHwgKFBDSUVfTFRTU01fRU5BQkxFX0VOSEFOQ0UgPDwgMTYpOworCXJvY2tjaGlwX3BjaWVfd3Jp dGVsX2FwYihyb2NrY2hpcCwgdmFsLCBQQ0lFX0NMSUVOVF9IT1RfUkVTRVRfQ1RSTCk7CisKKwly b2NrY2hpcF9wY2llX3dyaXRlbF9hcGIocm9ja2NoaXAsIFBDSUVfQ0xJRU5UX1JDX01PREUsCisJ CQkJIFBDSUVfQ0xJRU5UX0dFTkVSQUxfQ09OVFJPTCk7CisKKwlyZXR1cm4gMDsKK30KKworc3Rh dGljIGNvbnN0IHN0cnVjdCBkd19wY2llX2hvc3Rfb3BzIHJvY2tjaGlwX3BjaWVfaG9zdF9vcHMg PSB7CisJLmhvc3RfaW5pdCA9IHJvY2tjaGlwX3BjaWVfaG9zdF9pbml0LAorfTsKKworc3RhdGlj IGludCByb2NrY2hpcF9wY2llX2Nsa19pbml0KHN0cnVjdCByb2NrY2hpcF9wY2llICpyb2NrY2hp cCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSByb2NrY2hpcC0+cGNpLmRldjsKKwlpbnQgcmV0 OworCisJcmV0ID0gZGV2bV9jbGtfYnVsa19nZXRfYWxsKGRldiwgJnJvY2tjaGlwLT5jbGtzKTsK KwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJvY2tjaGlwLT5jbGtfY250ID0gcmV0 OworCisJcmV0dXJuIGNsa19idWxrX3ByZXBhcmVfZW5hYmxlKHJvY2tjaGlwLT5jbGtfY250LCBy b2NrY2hpcC0+Y2xrcyk7Cit9CisKK3N0YXRpYyBpbnQgcm9ja2NoaXBfcGNpZV9yZXNvdXJjZV9n ZXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCQkgICAgICBzdHJ1Y3Qgcm9ja2No aXBfcGNpZSAqcm9ja2NoaXApCit7CisJcm9ja2NoaXAtPmFwYl9iYXNlID0gZGV2bV9wbGF0Zm9y bV9pb3JlbWFwX3Jlc291cmNlX2J5bmFtZShwZGV2LCAiYXBiIik7CisJaWYgKElTX0VSUihyb2Nr Y2hpcC0+YXBiX2Jhc2UpKQorCQlyZXR1cm4gUFRSX0VSUihyb2NrY2hpcC0+YXBiX2Jhc2UpOwor CisJcm9ja2NoaXAtPnJzdF9ncGlvID0gZGV2bV9ncGlvZF9nZXRfb3B0aW9uYWwoJnBkZXYtPmRl diwgInJlc2V0IiwKKwkJCQkJCSAgICAgR1BJT0RfT1VUX0hJR0gpOworCWlmIChJU19FUlIocm9j a2NoaXAtPnJzdF9ncGlvKSkKKwkJcmV0dXJuIFBUUl9FUlIocm9ja2NoaXAtPnJzdF9ncGlvKTsK KworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJvY2tjaGlwX3BjaWVfcGh5X2luaXQoc3Ry dWN0IHJvY2tjaGlwX3BjaWUgKnJvY2tjaGlwKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHJv Y2tjaGlwLT5wY2kuZGV2OworCWludCByZXQ7CisKKwlyb2NrY2hpcC0+cGh5ID0gZGV2bV9waHlf Z2V0KGRldiwgInBjaWUtcGh5Iik7CisJaWYgKElTX0VSUihyb2NrY2hpcC0+cGh5KSkKKwkJcmV0 dXJuIGRldl9lcnJfcHJvYmUoZGV2LCBQVFJfRVJSKHJvY2tjaGlwLT5waHkpLAorCQkJCSAgICAg Im1pc3NpbmcgUEhZXG4iKTsKKworCXJldCA9IHBoeV9pbml0KHJvY2tjaGlwLT5waHkpOworCWlm IChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gcGh5X3Bvd2VyX29uKHJvY2tjaGlw LT5waHkpOworCWlmIChyZXQpCisJCXBoeV9leGl0KHJvY2tjaGlwLT5waHkpOworCisJcmV0dXJu IHJldDsKK30KKworc3RhdGljIHZvaWQgcm9ja2NoaXBfcGNpZV9waHlfZGVpbml0KHN0cnVjdCBy b2NrY2hpcF9wY2llICpyb2NrY2hpcCkKK3sKKwlwaHlfZXhpdChyb2NrY2hpcC0+cGh5KTsKKwlw aHlfcG93ZXJfb2ZmKHJvY2tjaGlwLT5waHkpOworfQorCitzdGF0aWMgaW50IHJvY2tjaGlwX3Bj aWVfcmVzZXRfY29udHJvbF9yZWxlYXNlKHN0cnVjdCByb2NrY2hpcF9wY2llICpyb2NrY2hpcCkK K3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSByb2NrY2hpcC0+cGNpLmRldjsKKworCXJvY2tjaGlw LT5yc3QgPSBkZXZtX3Jlc2V0X2NvbnRyb2xfYXJyYXlfZ2V0X2V4Y2x1c2l2ZShkZXYpOworCWlm IChJU19FUlIocm9ja2NoaXAtPnJzdCkpCisJCXJldHVybiBkZXZfZXJyX3Byb2JlKGRldiwgUFRS X0VSUihyb2NrY2hpcC0+cnN0KSwKKwkJCQkgICAgICJmYWlsZWQgdG8gZ2V0IHJlc2V0IGxpbmVz XG4iKTsKKworCXJldHVybiByZXNldF9jb250cm9sX2RlYXNzZXJ0KHJvY2tjaGlwLT5yc3QpOwor fQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGR3X3BjaWVfb3BzIGR3X3BjaWVfb3BzID0geworCS5s aW5rX3VwID0gcm9ja2NoaXBfcGNpZV9saW5rX3VwLAorCS5zdGFydF9saW5rID0gcm9ja2NoaXBf cGNpZV9zdGFydF9saW5rLAorfTsKKworc3RhdGljIGludCByb2NrY2hpcF9wY2llX3Byb2JlKHN0 cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBk ZXYtPmRldjsKKwlzdHJ1Y3Qgcm9ja2NoaXBfcGNpZSAqcm9ja2NoaXA7CisJc3RydWN0IHBjaWVf cG9ydCAqcHA7CisJaW50IHJldDsKKworCXJvY2tjaGlwID0gZGV2bV9remFsbG9jKGRldiwgc2l6 ZW9mKCpyb2NrY2hpcCksIEdGUF9LRVJORUwpOworCWlmICghcm9ja2NoaXApCisJCXJldHVybiAt RU5PTUVNOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcm9ja2NoaXApOworCisJcm9j a2NoaXAtPnBjaS5kZXYgPSBkZXY7CisJcm9ja2NoaXAtPnBjaS5vcHMgPSAmZHdfcGNpZV9vcHM7 CisKKwlwcCA9ICZyb2NrY2hpcC0+cGNpLnBwOworCXBwLT5vcHMgPSAmcm9ja2NoaXBfcGNpZV9o b3N0X29wczsKKworCXJldCA9IHJvY2tjaGlwX3BjaWVfcmVzb3VyY2VfZ2V0KHBkZXYsIHJvY2tj aGlwKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogRE9OJ1QgTU9WRSBNRTogbXVz dCBiZSBlbmFibGUgYmVmb3JlIFBIWSBpbml0ICovCisJcm9ja2NoaXAtPnZwY2llM3YzID0gZGV2 bV9yZWd1bGF0b3JfZ2V0X29wdGlvbmFsKGRldiwgInZwY2llM3YzIik7CisJaWYgKElTX0VSUihy b2NrY2hpcC0+dnBjaWUzdjMpKQorCQlpZiAoUFRSX0VSUihyb2NrY2hpcC0+dnBjaWUzdjMpICE9 IC1FTk9ERVYpCisJCQlyZXR1cm4gZGV2X2Vycl9wcm9iZShkZXYsIFBUUl9FUlIocm9ja2NoaXAt PnZwY2llM3YzKSwKKwkJCQkJImZhaWxlZCB0byBnZXQgdnBjaWUzdjMgcmVndWxhdG9yXG4iKTsK KworCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUocm9ja2NoaXAtPnZwY2llM3YzKTsKKwlpZiAocmV0 KSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGVuYWJsZSB2cGNpZTN2MyByZWd1bGF0b3Jc biIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IHJvY2tjaGlwX3BjaWVfcGh5X2luaXQo cm9ja2NoaXApOworCWlmIChyZXQpCisJCWdvdG8gZGlzYWJsZV9yZWd1bGF0b3I7CisKKwlyZXQg PSByb2NrY2hpcF9wY2llX3Jlc2V0X2NvbnRyb2xfcmVsZWFzZShyb2NrY2hpcCk7CisJaWYgKHJl dCkKKwkJZ290byBkZWluaXRfcGh5OworCisJcmV0ID0gcm9ja2NoaXBfcGNpZV9jbGtfaW5pdChy b2NrY2hpcCk7CisJaWYgKHJldCkKKwkJZ290byBkZWluaXRfcGh5OworCisJcmV0ID0gZHdfcGNp ZV9ob3N0X2luaXQocHApOworCWlmICghcmV0KQorCQlyZXR1cm4gMDsKKworCWNsa19idWxrX2Rp c2FibGVfdW5wcmVwYXJlKHJvY2tjaGlwLT5jbGtfY250LCByb2NrY2hpcC0+Y2xrcyk7CitkZWlu aXRfcGh5OgorCXJvY2tjaGlwX3BjaWVfcGh5X2RlaW5pdChyb2NrY2hpcCk7CitkaXNhYmxlX3Jl Z3VsYXRvcjoKKwlyZWd1bGF0b3JfZGlzYWJsZShyb2NrY2hpcC0+dnBjaWUzdjMpOworCisJcmV0 dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgcm9ja2NoaXBf cGNpZV9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAicm9ja2NoaXAscmszNTY4LXBj aWUiLCB9LAorCXt9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcm9ja2No aXBfcGNpZV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPSAicm9ja2NoaXAtZHct cGNpZSIsCisJCS5vZl9tYXRjaF90YWJsZSA9IHJvY2tjaGlwX3BjaWVfb2ZfbWF0Y2gsCisJCS5z dXBwcmVzc19iaW5kX2F0dHJzID0gdHJ1ZSwKKwl9LAorCS5wcm9iZSA9IHJvY2tjaGlwX3BjaWVf cHJvYmUsCit9OworYnVpbHRpbl9wbGF0Zm9ybV9kcml2ZXIocm9ja2NoaXBfcGNpZV9kcml2ZXIp OwotLSAKMi4yNS4xCgoKCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fXwpMaW51eC1yb2NrY2hpcCBtYWlsaW5nIGxpc3QKTGludXgtcm9ja2NoaXBAbGlzdHMu aW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZv L2xpbnV4LXJvY2tjaGlwCg==