From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pl1-f169.google.com (mail-pl1-f169.google.com [209.85.214.169]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3438F227B94 for ; Thu, 30 Apr 2026 02:29:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.169 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777516145; cv=none; b=Sjt+tmHRXXKDFjgN6DPz7PddTe+/3Lx/IZ6IVoyV25DTG0hsM45WCZkhx4CaTtu4wIcEjbZV74mQlelk9BTaqq+WOzNeVR58MJjGI4jEu6MDpCtXSL3CEc4ARmBXnMGwIPZFnwfBeUv2TIrvcmy3Lm83U8dN7a0FeZJ2r4SUj/8= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777516145; c=relaxed/simple; bh=KgPQ9MHDYUG2nGrCbUIOY5QWl7tuOKtcHaGbioCYy50=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=dlNzt3atfaDtkXDj7izB2LYSSz9ucYWuSRBNIUdd2AbnIHoq4PtY1Y3+3lKC+w9TH24MNXZgrlD5uf1IYkjGWbhAH8FlrgNh3kA6zkZO59ta4/4X2tlfCwLqJX+Yb906bxSiF5kGsC0eboBf2ASY2hMDNNsWxWZM+E7i+D2myyU= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=aX5DmHWB; arc=none smtp.client-ip=209.85.214.169 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="aX5DmHWB" Received: by mail-pl1-f169.google.com with SMTP id d9443c01a7336-2b24fdac394so3228445ad.3 for ; Wed, 29 Apr 2026 19:29:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1777516142; x=1778120942; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=De//G9K6upZ2sX81StxY7zO4fKEAXMOFhjgiUDQyzhg=; b=aX5DmHWBhBYXEvvFH+VKVdSLgYWtWetFSkJmtlyik9jZ3qz71ggbFS7f1KsZChpH6i h7mK/21zhERJk6/t3K8Kz8YvQpHYd9DvHupJgAGjnsUs4g/klJ68C+wh72+2N+qkA3EF iyOl2Y9DruUgga+3wP3Gi+rb6ArlIDl7zyobutUtli4zAtlr0GBxQqgKebMkLgcIJi1+ DKJgk2fXMW1wRCp+4NzvFLeQPlXFhSa6RHAklgcveOgxHmY322oQFymRgCRNp1lNcQBa 41VChj7P+gThOhIaVrXvrthCnPt0ps1CopgTRFt3ClP6DL/Gw9vgyv4svjMBnov8xnBx +E8Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1777516142; x=1778120942; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=De//G9K6upZ2sX81StxY7zO4fKEAXMOFhjgiUDQyzhg=; b=NvzvRnScACr2m4suPKhJ6NtQoFQrL3XO83Q1/HzgFJ0g6kELqwAPfU9mAd4yFMNAGB FPKGRLo8ok06+T3RXfdwcQTKbsbpVBu0+IWCqExMWW0dcyVzr/aYHxuhK/MyJjCREy0L YI77fjGBEMB5bQmKsKZAy6wQinu/dvjARWvUgppuF5+ZV2pdkOyPyFhSbMHE45cOykzF h3diN6Qkzt+isMoBAGqil2RNd+WqZO4fOLv1/zpuyTSMEq0mb0BoQVOOWKdgDOKhBTQo otneJvBJ1jWiHHg61s2/s7zaM0Ky1EmbXka/tsdx8Gp6wDCA5KQAaupkQiscyVxulwTo UQRg== X-Forwarded-Encrypted: i=1; AFNElJ//Td5TlAidJEQZAPaN0M8LixCZQXS3uBzCF/QOmC7aVQPdU/eLTewEM2RPDbP2ynU/R80yEf6zmyO2@vger.kernel.org X-Gm-Message-State: AOJu0YwBbZpgiGHH9iVX8DX7u9S1WVM1YGuQqXV3xreeximBTUM25lY3 N35d2Ln7liN8kHL2cbSUa3KRXncPcelljvv58R8rKov2yxRAH8oEObRf X-Gm-Gg: AeBDiet86rjHVj5v+CAmSw9x+JKHPdFU0vbiI7ChXRwPRFS2zNOtU3jdtzDTV2y8hxf CU4TjJqyMYF9pq5PUlmQK7Cg0RpqYy7nDzH2ODNnErtbDx7GvwEs9zmO3+SrzsJQkFY1dCYiCtr 6Dxqy/HKWx3SckefYDQUILEBgT9Dk9n9vTaOfzilDCUq1A7ePjuCs8p1+Dtdf3TS3sHZgN/rklG M/b2aWz5fyinw98N/77F9D1e1c406t1UczxrZIwG7zbJG/HsDMJgoXGfs/0M8YfnVKfcQLCoqC8 UJ0DtkJZAl/r2GcRzAdoW75beclOFag9GeOZXx2XAIIJJNLQMfPChY8dAJJ8CKWaMZoOyXhdK+g 0cRK9azw3N6X0Zo3YtCaXqALyj/Ly4wcrk1+OQOctRUKMIsbCEYXuP9t90dASPU625Y2cr/rhpC Yg88OKT8AGgmFkQRA/47PZyzAleKuUHH8rAg== X-Received: by 2002:a17:902:ca09:b0:2b0:a980:3687 with SMTP id d9443c01a7336-2b9a230545cmr7474495ad.3.1777516142472; Wed, 29 Apr 2026 19:29:02 -0700 (PDT) Received: from localhost ([2001:19f0:8001:1b2d:5400:5ff:fefa:a95d]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b98895c27csm35959615ad.58.2026.04.29.19.29.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 29 Apr 2026 19:29:02 -0700 (PDT) From: Inochi Amaoto To: Vinod Koul , Neil Armstrong , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Yixun Lan , Kees Cook , "Gustavo A. R. Silva" , Paul Walmsley , Palmer Dabbelt , Albert Ou , Alexandre Ghiti , Inochi Amaoto , Ze Huang , Alex Elder Cc: linux-phy@lists.infradead.org, devicetree@vger.kernel.org, linux-riscv@lists.infradead.org, spacemit@lists.linux.dev, linux-kernel@vger.kernel.org, linux-hardening@vger.kernel.org, Yixun Lan , Longbin Li Subject: [PATCH 2/2] phy: spacemit: Add USB3/PCIe comb PHY driver for Spacemit K3 Date: Thu, 30 Apr 2026 10:28:41 +0800 Message-ID: <20260430022843.1090138-3-inochiama@gmail.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260430022843.1090138-1-inochiama@gmail.com> References: <20260430022843.1090138-1-inochiama@gmail.com> Precedence: bulk X-Mailing-List: devicetree@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The comb PHY on K3 requires to configure a syscon device for the right mux configuration. And it requires calibration before any usage. Add USB3/PCIe comb PHY driver for Spacemit K3. Signed-off-by: Inochi Amaoto --- drivers/phy/spacemit/Kconfig | 16 ++ drivers/phy/spacemit/Makefile | 2 + drivers/phy/spacemit/phy-k3-combphy.c | 250 ++++++++++++++++ drivers/phy/spacemit/phy-k3-common.c | 398 ++++++++++++++++++++++++++ drivers/phy/spacemit/phy-k3-common.h | 27 ++ 5 files changed, 693 insertions(+) create mode 100644 drivers/phy/spacemit/phy-k3-combphy.c create mode 100644 drivers/phy/spacemit/phy-k3-common.c create mode 100644 drivers/phy/spacemit/phy-k3-common.h diff --git a/drivers/phy/spacemit/Kconfig b/drivers/phy/spacemit/Kconfig index 50b0005acf66..5fdf18fce499 100644 --- a/drivers/phy/spacemit/Kconfig +++ b/drivers/phy/spacemit/Kconfig @@ -23,3 +23,19 @@ config PHY_SPACEMIT_K1_USB2 help Enable this to support K1 USB 2.0 PHY driver. This driver takes care of enabling and clock setup and will be used by K1 udc/ehci/otg/xhci driver. + +config PHY_SPACEMIT_K3_COMMON_OPS + tristate + select MFD_SYSCON + select GENERIC_PHY + +config PHY_SPACEMIT_K3_COMBO_PHY + tristate "SpacemiT K3 USB3/PCIe PHY support" + depends on (ARCH_SPACEMIT || COMPILE_TEST) && OF + depends on COMMON_CLK + select PHY_SPACEMIT_K3_COMMON_OPS + help + Enable this to support K3 USB3/PCIe combo PHY driver. This + driver takes care of enabling and clock setup and will be used + by K3 dwc3 driver. + If unsure, say N. diff --git a/drivers/phy/spacemit/Makefile b/drivers/phy/spacemit/Makefile index a821a21d6142..41be7b0388da 100644 --- a/drivers/phy/spacemit/Makefile +++ b/drivers/phy/spacemit/Makefile @@ -1,3 +1,5 @@ # SPDX-License-Identifier: GPL-2.0-only obj-$(CONFIG_PHY_SPACEMIT_K1_PCIE) += phy-k1-pcie.o obj-$(CONFIG_PHY_SPACEMIT_K1_USB2) += phy-k1-usb2.o +obj-$(CONFIG_PHY_SPACEMIT_K3_COMBO_PHY) += phy-k3-combphy.o +obj-$(CONFIG_PHY_SPACEMIT_K3_COMMON_OPS) += phy-k3-common.o diff --git a/drivers/phy/spacemit/phy-k3-combphy.c b/drivers/phy/spacemit/phy-k3-combphy.c new file mode 100644 index 000000000000..66fa6330ad6e --- /dev/null +++ b/drivers/phy/spacemit/phy-k3-combphy.c @@ -0,0 +1,250 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * phy-k3-usb3.c - SpacemiT K3 Type-C Orientation Switch Driver + * + * Copyright (c) 2025 SpacemiT Technology Co. Ltd + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "phy-k3-common.h" + +/* + * The PCIE/USB Subsystem on SpacemiT K3 have 3 single lane PIPE3 PHYs + * (PHY2/3/4) shared by PCIE PortC/D and USB3 PortB/C/D. + * + * PMUA_PCIE_SUBSYS_MGMT[4:0] + * + * bit4 = 0 : PCIe A X8 mode, all 8 lanes dedicated to PCIe Port A + * 1 : PHY lanes shared between PCIe or USB according to [3:0] + * + * All PHY matrix combinations according to [4:0]: + * + * 0x0X : PCIe-A X8 + * 0x10 : PCIe-C x2 (PHY2+PHY3) + PCIe-D x1 (PHY4) + * 0x11 : PCIe-C x2 (PHY2+PHY3) + USB-D (PHY4) + * 0x12 : PCIe-C x1 (PHY2) + USB-C (PHY3) + * 0x13 : PCIe-C x1 (PHY2) + USB-C (PHY3) + USB-D (PHY4) + * 0x14 : PCIe-C x1 (PHY3) + USB-B (PHY2) + * 0x15 : PCIe-C x1 (PHY3) + USB-B (PHY2) + USB-D (PHY4) + * 0x16 : USB-B (PHY2) + USB-C (PHY3) + PCIe D x1 (PHY4) + * 0x17 : USB-B (PHY2) + USB-C (PHY3) + USB-D (PHY4) + * + * So any USB Port B/C/D operation requires PCIe A X8 mode to be disabled. + */ +#define PMUA_PCIE_SUBSYS_MGMT 0x1d8 +#define PU_MATRIX_CONF_MASK GENMASK(4, 0) + +#define COMBPHY_MAX_SUBPHYS 6 + +struct k3_comb_phy { + struct device *dev; + struct k3_lane_group groups[COMBPHY_MAX_SUBPHYS]; + void __iomem *base; + struct regmap *apb_spare; +}; + +static const struct k3_phy_lane_group_data k3_combphy_lane_group0 = { + .lanes = 2, + .config = 0x00, + .mask = 0xff, + .offsets = { + 0x0, 0x400 + }, +}; + +static const struct k3_phy_lane_group_data k3_combphy_lane_group1 = { + .lanes = 2, + .config = 0x00, + .mask = 0xff, + .offsets = { + 0x100000, 0x100400 + }, +}; + +static const struct k3_phy_lane_group_data k3_combphy_lane_group2 = { + .lanes = 1, + .config = 0x14, + .mask = 0x14, + .offsets = { + 0x200000 + }, +}; + +static const struct k3_phy_lane_group_data k3_combphy_lane_group3 = { + .lanes = 1, + .config = 0x12, + .mask = 0x12, + .offsets = { + 0x300000 + }, +}; + +static const struct k3_phy_lane_group_data k3_combphy_lane_group4 = { + .lanes = 1, + .config = 0x11, + .mask = 0x11, + .offsets = { + 0x400000 + }, +}; + +static const struct k3_phy_lane_group_data k3_combphy_lane_group5 = { + .lanes = 1, + .config = 0x00, + .mask = 0xff, + .offsets = { + 0x500000 + }, +}; + +static const struct k3_phy_lane_group_data *k3_combphy_lane_datas[] = { + &k3_combphy_lane_group0, + &k3_combphy_lane_group1, + &k3_combphy_lane_group2, + &k3_combphy_lane_group3, + &k3_combphy_lane_group4, + &k3_combphy_lane_group5, +}; + +static int k3_comb_phy_init_lanes(struct k3_comb_phy *phy, unsigned int config) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(k3_combphy_lane_datas); i++) { + const struct k3_phy_lane_group_data *data = k3_combphy_lane_datas[i]; + struct k3_lane_group *lg = &phy->groups[i]; + const struct phy_ops *ops; + bool is_usb; + + is_usb = (data->mask & config) == data->config; + if (is_usb) + ops = &k3_usb3_phy_ops; + else + ops = &k3_pcie_phy_ops; + + lg->phy = devm_phy_create(phy->dev, NULL, ops); + if (IS_ERR(lg->phy)) + return PTR_ERR(lg->phy); + + lg->is_pcie = !is_usb; + lg->data = data; + lg->base = phy->base; + phy_set_drvdata(lg->phy, lg); + } + + return 0; +} + +static int k3_comb_phy_update_config(struct regmap *apmu, unsigned int config) +{ + if (config & ~PU_MATRIX_CONF_MASK) + return -EINVAL; + + return regmap_update_bits(apmu, PMUA_PCIE_SUBSYS_MGMT, PU_MATRIX_CONF_MASK, config); +} + +static struct phy *k3_comb_phy_xlate(struct device *dev, const struct of_phandle_args *args) +{ + struct k3_comb_phy *phy = dev_get_drvdata(dev); + struct k3_lane_group *lg; + + if (args->args_count != 2) { + dev_err(dev, "Invalid number of arguments\n"); + return ERR_PTR(-EINVAL); + } + + if (args->args[0] >= ARRAY_SIZE(k3_combphy_lane_datas)) { + dev_err(dev, "Invalid PHY id\n"); + return ERR_PTR(-EINVAL); + } + + lg = &phy->groups[args->args[0]]; + + if ((lg->is_pcie && args->args[1] != PHY_TYPE_PCIE) || + (!lg->is_pcie && args->args[1] != PHY_TYPE_USB3)) { + dev_err(dev, "Invalid PHY mode\n"); + return ERR_PTR(-EINVAL); + } + + return lg->phy; +} + +static int k3_comb_phy_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + struct device_node *node = dev->of_node; + struct phy_provider *provider; + struct k3_comb_phy *phy; + struct regmap *apmu; + u32 config = 0; + int ret; + + phy = devm_kzalloc(dev, sizeof(*phy), GFP_KERNEL); + if (!phy) + return -ENOMEM; + + phy->base = devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(phy->base)) + return PTR_ERR(phy->base); + + phy->apb_spare = syscon_regmap_lookup_by_phandle(node, "spacemit,apb-spare"); + if (IS_ERR(phy->apb_spare)) + return dev_err_probe(dev, PTR_ERR(phy->apb_spare), + "Failed to fine APB SPARE syscon"); + + apmu = syscon_regmap_lookup_by_phandle_args(node, "spacemit,apmu", 1, &config); + if (IS_ERR(apmu)) + return dev_err_probe(dev, PTR_ERR(phy->apb_spare), + "Failed to fine APMU syscon"); + + ret = k3_comb_phy_update_config(apmu, config); + if (ret < 0) + return dev_err_probe(dev, ret, "Failed to set lane configuration"); + + phy->dev = dev; + platform_set_drvdata(pdev, phy); + + ret = k3_phy_calibrate(phy->apb_spare); + if (ret < 0) + return dev_err_probe(dev, ret, "Failed to calibrate phy"); + + ret = k3_comb_phy_init_lanes(phy, config); + if (ret < 0) + return dev_err_probe(dev, ret, "Failed to init lanes"); + + provider = devm_of_phy_provider_register(dev, k3_comb_phy_xlate); + if (IS_ERR(provider)) + return dev_err_probe(dev, PTR_ERR(provider), + "Failed to register provider\n"); + + return 0; +} + +static const struct of_device_id k3_comb_phy_of_match[] = { + { .compatible = "spacemit,k3-comb-phy" }, + { }, +}; +MODULE_DEVICE_TABLE(of, k3_comb_phy_of_match); + +static struct platform_driver k3_comb_phy_driver = { + .probe = k3_comb_phy_probe, + .driver = { + .name = "spacemit,k3-comb-phy", + .of_match_table = k3_comb_phy_of_match, + }, +}; +module_platform_driver(k3_comb_phy_driver); + +MODULE_DESCRIPTION("SpacemiT K3 USB3/PCIe comb PHY driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/phy/spacemit/phy-k3-common.c b/drivers/phy/spacemit/phy-k3-common.c new file mode 100644 index 000000000000..77c4b4073b96 --- /dev/null +++ b/drivers/phy/spacemit/phy-k3-common.c @@ -0,0 +1,398 @@ +// SPDX-License-Identifier: GPL-2.0-only + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "phy-k3-common.h" + +/* PHY Registers */ +#define PHY_VERSION 0x0 + +#define PHY_RESET_CFG 0x04 + +#define PHY_RESET_RXBUF_RST BIT(0) +#define PHY_RESET_SOFT_RST_PCS BIT(1) +#define PHY_RESET_SOFT_RST_AHB BIT(2) +#define PHY_RESET_EN_SD_AFTER_LOCK BIT(6) + +#define PHY_CLK_CFG 0x08 + +#define PHY_CLK_PLL_READY BIT(0) +#define PHY_CLK_TXCLK_INV BIT(2) +#define PHY_CLK_RXCLK_EN BIT(3) +#define PHY_CLK_TXCLK_EN BIT(4) +#define PHY_CLK_PCLK_EN BIT(5) +#define PHY_CLK_PIPE_PCLK_EN BIT(6) +#define PHY_CLK_REFCLK_FREQ GENMASK(10, 7) +#define PHY_CLK_REFCLK_24M 2 +#define PHY_CLK_SW_INIT_DONE BIT(11) +#define PHY_CLK_PU_SSC_OUT BIT(23) + +#define PHY_MODE_CFG 0x0C + +#define PHY_MODE_PCIE_INT_EN BIT(0) +#define PHY_MODE_LFPS_TPERIOD GENMASK(9, 8) +#define PHY_MODE_LFPS_TPERIOD_USB 3 + +#define PHY_PU_SEL 0x40 + +#define PHY_PU_CFG_STATUS BIT(9) +#define PHY_PU_OVRD_STATUS BIT(10) + +#define PHY_PU_CK_REG 0x54 + +#define PHY_PU_REFCLK_100 BIT(25) + +#define PHY_PLL_REG1 0x58 + +#define PHY_PLL_FREF_SEL GENMASK(15, 13) +#define PHY_PLL_FREF_24M 0x1 +#define PHY_PLL_SSC_DEP_SEL GENMASK(27, 24) +#define PHY_PLL_SSC_5000PPM 0xa +#define PHY_PLL_SSC_MODE GENMASK(29, 28) +#define PHY_PLL_SSC_MODE_CENTER_SPREAD 0 +#define PHY_PLL_SSC_MODE_UP_SPREAD 1 +#define PHY_PLL_SSC_MODE_DOWN_SPREAD 2 +#define PHY_PLL_SSC_MODE_DOWN_SPREAD1 3 + +#define PHY_PLL_REG2 0x5c + +#define PHY_PLL_SEL_REF100 BIT(21) + +/* PHY RX Register Definitions */ +#define PHY_RX_REG_A 0x60 + +#define PHY_RX_REG0_RLOAD BIT(4) +#define PHY_RX_REG1_RTERM GENMASK(11, 8) +#define PHY_RX_REG1_RC_CALI GENMASK(15, 12) +#define PHY_RX_REG2_CSEL GENMASK(19, 16) +#define PHY_RX_REG2_FORCE_CSEL BIT(20) +#define PHY_RX_REG2_PSEL GENMASK(23, 21) +#define PHY_RX_REG3_I_LOAD GENMASK(26, 24) +#define PHY_RX_REG3_SEL_CBOOST_CODE BIT(27) +#define PHY_RX_REG3_ADJ_BIAS GENMASK(29, 28) +#define PHY_RX_REG3_RDEG1 GENMASK(31, 30) + +#define PHY_RX_REG_B 0x64 + +#define PHY_RX_REGB_MASK GENMASK(23, 0) + +#define PHY_RX_REG4_RDEG2 GENMASK(2, 1) +#define PHY_RX_REG4_ENVOS BIT(4) +#define PHY_RX_REG4_RTERM_SEL BIT(5) +#define PHY_RX_REG4_MANUAL_CFG BIT(7) +#define PHY_RX_REG5_RCELL_VCM GENMASK(11, 8) +#define PHY_RX_REG5_RCELL_BIAS GENMASK(15, 12) +#define PHY_RX_REG6_H1_REG GENMASK(19, 16) +#define PHY_RX_REG6_ADAPT_GAIN GENMASK(21, 20) +#define PHY_RX_REG6_BYPASS_ADPT BIT(22) + +#define PHY_ADPT_CFG0 0x140 +#define PHY_ADPT_AFE_RST_OVRD_EN BIT(1) +#define PHY_ADPT_AFE_RST_OVRD_VAL BIT(4) + +#define PHY_RXEQ_TIME 0xb4 +#define PHY_RXEQ_TIME_OVRD_POST_C_SOC BIT(21) +#define PHY_RXEQ_TIME_CFG_AMP_SOC GENMASK(23, 22) +#define PHY_RXEQ_TIME_AMP_SOC_650M 0 +#define PHY_RXEQ_TIME_AMP_SOC_800M 1 +#define PHY_RXEQ_TIME_AMP_SOC_870M 2 +#define PHY_RXEQ_TIME_AMP_SOC_900M 3 +#define PHY_RXEQ_TIME_OVRD_AMP_SOC BIT(24) + +#define PCIE_PU_ADDR_CLK_CFG 0x0008 +#define PHY_CLK_PLL_READY BIT(0) +#define PCIE_INITAL_TIMER GENMASK(6, 3) +#define CFG_INTERNAL_TIMER_ADJ GENMASK(10, 7) +#define CFG_SW_PHY_INIT_DONE BIT(11) + +/* Lane RX/TX configuration (per‑lane, at lane_base) */ +#define PCIE_RX_REG1 0x050 +#define PCIE_TX_REG1 0x064 + +#define PCIE_PLL_TIMEOUT 500000 +#define PCIE_POLL_DELAY 500 + +static int k3_usb3phy_init_single(struct k3_lane_group *lg, void __iomem *base) +{ + struct phy *phy = lg->phy; + u32 val, tmp; + int ret; + + val = readl(base + PHY_PU_SEL); + val = u32_replace_bits(val, 0, PHY_PU_CFG_STATUS); + val |= PHY_PU_OVRD_STATUS; + writel(val, base + PHY_PU_SEL); + + udelay(200); + + /* Do not wait CDR lock before sampling data */ + val = readl(base + PHY_RESET_CFG); + val = u32_replace_bits(val, 0, PHY_RESET_EN_SD_AFTER_LOCK); + writel(val, base + PHY_RESET_CFG); + + /* Power down 100MHz refclk buffer */ + val = readl(base + PHY_PU_CK_REG); + val = u32_replace_bits(val, 0, PHY_PU_REFCLK_100); + writel(val, base + PHY_PU_CK_REG); + + /* Program PLL REG1 configure the SSC */ + val = FIELD_PREP(PHY_PLL_SSC_MODE, PHY_PLL_SSC_MODE_DOWN_SPREAD1) | + FIELD_PREP(PHY_PLL_SSC_DEP_SEL, PHY_PLL_SSC_5000PPM) | + FIELD_PREP(PHY_PLL_FREF_SEL, PHY_PLL_FREF_24M); + writel(val, base + PHY_PLL_REG1); + + /* Un-select 100MHz PLL reference */ + val = readl(base + PHY_PLL_REG2); + val = u32_replace_bits(val, 0, PHY_PLL_SEL_REF100); + writel(val, base + PHY_PLL_REG2); + + /* USB LFPS period configuration */ + val = readl(base + PHY_MODE_CFG); + val = u32_replace_bits(val, PHY_MODE_LFPS_TPERIOD_USB, PHY_MODE_LFPS_TPERIOD); + writel(val, base + PHY_MODE_CFG); + + /* Force AFE adaptation reset */ + val = readl(base + PHY_ADPT_CFG0); + val |= PHY_ADPT_AFE_RST_OVRD_EN | PHY_ADPT_AFE_RST_OVRD_VAL; + writel(val, base + PHY_ADPT_CFG0); + + /* Override driver amplitude value to 900m */ + val = readl(base + PHY_RXEQ_TIME); + val |= PHY_RXEQ_TIME_OVRD_AMP_SOC; + val = u32_replace_bits(val, PHY_RXEQ_TIME_AMP_SOC_900M, PHY_RXEQ_TIME_CFG_AMP_SOC); + writel(val, base + PHY_RXEQ_TIME); + + /* Configure RX parameters */ + val = PHY_RX_REG0_RLOAD | + FIELD_PREP(PHY_RX_REG1_RTERM, 0x8) | + FIELD_PREP(PHY_RX_REG1_RC_CALI, 0x7) | + FIELD_PREP(PHY_RX_REG2_CSEL, 0x8) | + PHY_RX_REG2_FORCE_CSEL | + FIELD_PREP(PHY_RX_REG2_PSEL, 0x4) | + FIELD_PREP(PHY_RX_REG3_I_LOAD, 0x7) | + PHY_RX_REG3_SEL_CBOOST_CODE | + FIELD_PREP(PHY_RX_REG3_ADJ_BIAS, 0x1) | + FIELD_PREP(PHY_RX_REG3_RDEG1, 0x3); + writel(val, base + PHY_RX_REG_A); + + val = readl(base + PHY_RX_REG_B); + tmp = FIELD_PREP(PHY_RX_REG4_RDEG2, 0x2) | + PHY_RX_REG4_ENVOS | PHY_RX_REG4_RTERM_SEL | PHY_RX_REG4_MANUAL_CFG | + FIELD_PREP(PHY_RX_REG5_RCELL_VCM, 0x8) | + FIELD_PREP(PHY_RX_REG5_RCELL_BIAS, 0x8) | + FIELD_PREP(PHY_RX_REG6_H1_REG, 0x8) | + FIELD_PREP(PHY_RX_REG6_ADAPT_GAIN, 0x2); + val = u32_replace_bits(val, tmp, PHY_RX_REGB_MASK); + writel(val, base + PHY_RX_REG_B); + + /* + * Inform PHY that all PLL-related configuration is done. + * PLL will not start locking until PHY_CLK_SW_INIT_DONE is set. + */ + val = PHY_CLK_SW_INIT_DONE | PHY_CLK_PU_SSC_OUT | + FIELD_PREP(PHY_CLK_REFCLK_FREQ, PHY_CLK_REFCLK_24M) | + PHY_CLK_RXCLK_EN | PHY_CLK_TXCLK_EN | + PHY_CLK_PCLK_EN | PHY_CLK_PIPE_PCLK_EN; + writel(val, base + PHY_CLK_CFG); + + ret = readl_poll_timeout(base + PHY_CLK_CFG, val, + (val & PHY_CLK_PLL_READY), + PCIE_POLL_DELAY, PCIE_PLL_TIMEOUT); + if (ret) { + dev_err(&phy->dev, "PHY PLL polling timeout\n"); + return ret; + } + + return 0; +} + +static int k3_usb3phy_init(struct phy *phy) +{ + struct k3_lane_group *lg = phy_get_drvdata(phy); + int ret, i; + + for (i = 0; i < lg->data->lanes; i++) { + ret = k3_usb3phy_init_single(lg, lg->base + lg->data->offsets[i]); + if (ret < 0) + return ret; + } + + return 0; +} + +static int k3_usb3phy_set_speed(struct phy *phy, int speed) +{ + struct k3_lane_group *lg = phy_get_drvdata(phy); + void __iomem *base = lg->base + lg->data->offsets[0]; + u32 val; + + if (speed == USB_SPEED_HIGH) { + val = readl(base + PHY_PU_SEL); + val = u32_replace_bits(val, 0, PHY_PU_CFG_STATUS); + val |= PHY_PU_OVRD_STATUS; + writel(val, base + PHY_PU_SEL); + + udelay(200); + } + + return 0; +} + +const struct phy_ops k3_usb3_phy_ops = { + .init = k3_usb3phy_init, + .set_speed = k3_usb3phy_set_speed, + .owner = THIS_MODULE, +}; +EXPORT_SYMBOL_GPL(k3_usb3_phy_ops); + +static int k3_pcie_phy_init(struct phy *phy) +{ + struct k3_lane_group *lg = phy_get_drvdata(phy); + void __iomem *phy_base = lg->base + lg->data->offsets[0]; + u32 val; + int ret; + int i; + + val = readl(phy_base + PHY_PLL_REG1); + val = u32_replace_bits(val, 0x2, GENMASK(15, 12)); + writel(val, phy_base + PHY_PLL_REG1); + + val = readl(phy_base + PHY_PLL_REG2); + val = u32_replace_bits(val, 0, BIT(21)); + writel(val, phy_base + PHY_PLL_REG2); + + for (i = 0; i < lg->data->lanes; i++) { + void __iomem *lane_base = lg->base + lg->data->offsets[i]; + + val = readl(lane_base + PCIE_RX_REG1); + val = u32_replace_bits(val, 0, 0x3); + writel(val, phy_base + PCIE_RX_REG1); + } + + val = readl(phy_base + PHY_PLL_REG2); + val |= BIT(20); + writel(val, phy_base + PHY_PLL_REG2); + + writel(0x00006505, phy_base + PCIE_RX_REG1); + + /* pll_reg1 of lane0, disable SSC: pll_reg4[3:0] = 0 */ + val = readl(phy_base + PHY_PLL_REG1); + val = u32_replace_bits(val, 0, GENMASK(27, 24)); + writel(val, phy_base + PHY_PLL_REG1); + + for (i = 0; i < lg->data->lanes; i++) { + void __iomem *lane_base = lg->base + lg->data->offsets[i]; + + /* set cfg_tx_send_dummy_data to be 1'b1 for disable dash data */ + val = readl(lane_base + PHY_PU_SEL); + val = u32_replace_bits(val, 1, BIT(13)); + writel(val, lane_base + PHY_PU_SEL); + + /* disable en_sample_data_after_cdr_locked */ + val = readl(lane_base + PHY_RESET_CFG); + val = u32_replace_bits(val, 0, BIT(6)); + writel(val, lane_base + PHY_RESET_CFG); + + /* Dynamic Lock */ + val = readl(lane_base + PHY_MODE_CFG); + val = u32_replace_bits(val, 1, BIT(2)); + writel(val, lane_base + PHY_MODE_CFG); + + val = FIELD_PREP(GENMASK(7, 0), 0x10) | + FIELD_PREP(GENMASK(15, 8), 0x78) | + FIELD_PREP(GENMASK(23, 16), 0x98) | + FIELD_PREP(GENMASK(31, 24), 0xdf); + writel(val, lane_base + PHY_RX_REG_A); + + val = readl(lane_base + PHY_RX_REG_B); + val &= ~PHY_RX_REGB_MASK; + val |= FIELD_PREP(GENMASK(7, 0), 0xb4) | + FIELD_PREP(GENMASK(15, 8), 0x88) | + FIELD_PREP(GENMASK(23, 16), 0x28); + writel(val, lane_base + PHY_RX_REG_B); + + /* Set init done */ + val = readl(lane_base + PCIE_PU_ADDR_CLK_CFG); + val = u32_replace_bits(val, 1, CFG_SW_PHY_INIT_DONE); + writel(val, lane_base + PCIE_PU_ADDR_CLK_CFG); + } + + ret = readl_poll_timeout(phy_base + PCIE_PU_ADDR_CLK_CFG, val, + (val & PHY_CLK_PLL_READY), PCIE_POLL_DELAY, + PCIE_PLL_TIMEOUT); + if (ret) { + dev_err(&lg->phy->dev, "PHY PLL lock timeout\n"); + return ret; + } + + return 0; +} + +const struct phy_ops k3_pcie_phy_ops = { + .init = k3_pcie_phy_init, + .owner = THIS_MODULE, +}; +EXPORT_SYMBOL_GPL(k3_pcie_phy_ops); + +/* PHY rcal init requires APB_SPARE regmap access */ + +#define APB_SPARE_PU_CAL 0x178 +#define PU_CAL BIT(17) + +#define APB_SPARE_RCAL_HSIO 0x17c +#define APB_SPARE_PU_CAL_DONE BIT(8) +#define RCAL_OVRD_PTRIM GENMASK(23, 20) +#define RCAL_OVRD_NTRIM GENMASK(27, 24) +#define RCAL_OVRD_PTRIM_EN BIT(28) +#define RCAL_OVRD_NTRIM_EN BIT(29) +#define RCAL_OVRD_STABLE_VAL BIT(30) +#define RCAL_OVRD_STABLE_EN BIT(31) + +#define RCAL_OVRD_TRIM_EN (RCAL_OVRD_NTRIM_EN | RCAL_OVRD_PTRIM_EN) +#define RCAL_OVRD_TRIM_MASK (RCAL_OVRD_NTRIM | RCAL_OVRD_PTRIM) + +#define PU_CAL_TIMEOUT 2000000 + +static DEFINE_MUTEX(calibrate_lock); + +int k3_phy_calibrate(struct regmap *apb_spare) +{ + unsigned int val; + int ret; + + guard(mutex)(&calibrate_lock); + + regmap_read(apb_spare, APB_SPARE_RCAL_HSIO, &val); + if (val & APB_SPARE_PU_CAL_DONE) + return 0; + + regmap_update_bits(apb_spare, APB_SPARE_PU_CAL, PU_CAL, + PU_CAL); + + ret = regmap_read_poll_timeout(apb_spare, APB_SPARE_RCAL_HSIO, + val, (val & APB_SPARE_PU_CAL_DONE), PCIE_POLL_DELAY, + PU_CAL_TIMEOUT); + + if (ret) + regmap_update_bits(apb_spare, APB_SPARE_RCAL_HSIO, + RCAL_OVRD_TRIM_EN | RCAL_OVRD_STABLE_VAL | + RCAL_OVRD_TRIM_MASK | RCAL_OVRD_STABLE_EN, + RCAL_OVRD_TRIM_EN | RCAL_OVRD_STABLE_VAL | + FIELD_PREP(RCAL_OVRD_NTRIM, 0x6) | + FIELD_PREP(RCAL_OVRD_PTRIM, 0xa) | + RCAL_OVRD_STABLE_EN); + + return ret; +} +EXPORT_SYMBOL_GPL(k3_phy_calibrate); + +MODULE_DESCRIPTION("SpacemiT K3 PHY common ops"); +MODULE_LICENSE("GPL"); diff --git a/drivers/phy/spacemit/phy-k3-common.h b/drivers/phy/spacemit/phy-k3-common.h new file mode 100644 index 000000000000..49009c3c313a --- /dev/null +++ b/drivers/phy/spacemit/phy-k3-common.h @@ -0,0 +1,27 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#ifndef _PHY_K3_COMMON_H +#define _PHY_K3_COMMON_H + +#include + +struct k3_phy_lane_group_data { + u32 lanes; + u8 config; + u8 mask; + u32 offsets[] __counted_by(lanes); +}; + +struct k3_lane_group { + const struct k3_phy_lane_group_data *data; + void __iomem *base; + struct phy *phy; + bool is_pcie; +}; + +extern const struct phy_ops k3_pcie_phy_ops; +extern const struct phy_ops k3_usb3_phy_ops; + +int k3_phy_calibrate(struct regmap *apb_spare); + +#endif -- 2.54.0 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 457A3FF8875 for ; Thu, 30 Apr 2026 02:29:07 +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=1VSd+XEgr0SrWW+Ycs2HoxDZiuQyPLt0ZhK+3CQxAxk=; b=JlAElJtsB40WWa UIZ2jYswQCuB/6LmEkL8N3CYWzQGiqwBHOLaONgrOa/RtDpZ0u5mxDrfDdZI8MlkURD437vwEAQ9p 1UxFipYoNxohuNKfu3tMYAMQsvkFg4sYeo3AM7NYudnEARF7v6jM47lNi2HTKuGjXG2P0h6l/276j 5bbzFK0crzsWMgwySGD1gOXuUUn3mmgwMUtufK4Z89WMr4WqoKkYabtEedO/L3EaC/BAcdN1bUzy0 lpeifpu/gQqosb63zvUiHrbGgJ/hma5BzvfDX1kO++cOYn/5tFUWBN4M8qTemY+5NHaNF3/3jQ+zD xjsKp82QEFf+wWoDJ6TQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98.2 #2 (Red Hat Linux)) id 1wIH9G-00000004SFa-2irL; Thu, 30 Apr 2026 02:29:07 +0000 Received: from mail-pl1-x636.google.com ([2607:f8b0:4864:20::636]) by bombadil.infradead.org with esmtps (Exim 4.98.2 #2 (Red Hat Linux)) id 1wIH9D-00000004SEH-210g for linux-phy@lists.infradead.org; Thu, 30 Apr 2026 02:29:04 +0000 Received: by mail-pl1-x636.google.com with SMTP id d9443c01a7336-2b2589c26e3so3234055ad.1 for ; Wed, 29 Apr 2026 19:29:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1777516142; x=1778120942; darn=lists.infradead.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=De//G9K6upZ2sX81StxY7zO4fKEAXMOFhjgiUDQyzhg=; b=Z9jcYLjKq+kTqwt0H7c+jEOY6nSyBdJ414kenK2zCaADgpJZyjomJX8MtUvw6DyKWS P7A3gJO28WQYmH5Igv4hTakGZxuEqBbZ3PBWWh5qpruhT4SCIbG7RMrfHknrjfgzOns7 MXOWdGQc0WzAjsMP4kaMiV/93MEIYTlXQvLKY9SJZM9yi4aJr0sFYjR1l3fwwo7mSfVv t8ed12qNPwXu1H7mCnjQ7RD/3voG7wS/Fqw7vs0Ocyz2NBg4hqOJ7wQFTQaHeFGyLA7K KCegYjtHY7ehqRR0IETbA+MosqWS47/epu+e3Tmt2XyJC6RhTxR19xE0I2NWgAC9snrX aeHA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1777516142; x=1778120942; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=De//G9K6upZ2sX81StxY7zO4fKEAXMOFhjgiUDQyzhg=; b=s7ObfK0smmOE+MyYE3iSPjbX6l/nD8gEtf6j5fLqtq59a8vpc0QIkzo6BT0lsvKK7k fi2jOtiP8MisIr9C1kvjTiX1caLQLHQMTCLaFywhqTZ1y41oUjQSyj272Nv+Zv2sTRve //RCXzA/c1DJFdbSnRGXRTvKYNTprsIIH5H8660PvCIxFZvajSgNnDGww30yK9FJR7nO gIOPdfTRKz8GQTyvToD+RO8IOwJDLRjpfa8bmaHdfcW8f0YHBzWEGKR/L/xkpQv2XLvp J9+xSlliCVNUEsnehKJ2vRxjKHHwGr9HqE8aB/qtpr6frb85OwfX6ySpBQIlJ4Drwgpi 8l0w== X-Gm-Message-State: AOJu0YzSw/FK42qa1ukr9jSE20HC7s8evXKajQxB7ynI/Kxq/ssCdihi EFJAFZp+qHrbSFJEPW9GpsRjRTk0eew23BlhZ1CMwJba2Y90sg2P15aq X-Gm-Gg: AeBDievu77r+RWEfbQHl5Jy1PXmcve1+zB8vaPwWac6B3w/fC4XbyvS8ac7gT5Uj31V oFQ0p4JJbrUsmNQl7yNf3chR0bRgrAVh+VhXKSVSseGRhwDI/Kupg7MYCJHWfedrsiDsP5QORwZ 5cyjHkMpy/ekV42kWNHdTBliUn1IqLGOt4v7kdibICRYc8NLYkOt68mr6NzcYGlQckF3N1VSYkE FJqPTVqhsQ+AIi5rqVfIGK4qC1kjq4DwdNiNxcDBF/vbxtL45DBHmvLacFAR6VhTgQySxY0mDuL JgGPdbbZsm91z447Vo/z4Yf47ZHgXCXheW0s3JNKcWYE0yykvelIlL7PtMGbcdl+cMQioFJsR4Z waJng9Pw+gX98Vl4frb1L0XCQ7N+31LuYNTQaPELjFdfk3FkZsa5VskZsVs7CiEPr4afCw3sxh1 aCpdpHYfV5Lfrkfu5ai3awWBMm22GyxLrGWg== X-Received: by 2002:a17:902:ca09:b0:2b0:a980:3687 with SMTP id d9443c01a7336-2b9a230545cmr7474495ad.3.1777516142472; Wed, 29 Apr 2026 19:29:02 -0700 (PDT) Received: from localhost ([2001:19f0:8001:1b2d:5400:5ff:fefa:a95d]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b98895c27csm35959615ad.58.2026.04.29.19.29.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 29 Apr 2026 19:29:02 -0700 (PDT) From: Inochi Amaoto To: Vinod Koul , Neil Armstrong , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Yixun Lan , Kees Cook , "Gustavo A. R. Silva" , Paul Walmsley , Palmer Dabbelt , Albert Ou , Alexandre Ghiti , Inochi Amaoto , Ze Huang , Alex Elder Cc: linux-phy@lists.infradead.org, devicetree@vger.kernel.org, linux-riscv@lists.infradead.org, spacemit@lists.linux.dev, linux-kernel@vger.kernel.org, linux-hardening@vger.kernel.org, Yixun Lan , Longbin Li Subject: [PATCH 2/2] phy: spacemit: Add USB3/PCIe comb PHY driver for Spacemit K3 Date: Thu, 30 Apr 2026 10:28:41 +0800 Message-ID: <20260430022843.1090138-3-inochiama@gmail.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260430022843.1090138-1-inochiama@gmail.com> References: <20260430022843.1090138-1-inochiama@gmail.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20260429_192903_562078_4B0D9ADA X-CRM114-Status: GOOD ( 25.45 ) X-BeenThere: linux-phy@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Linux Phy Mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-phy" Errors-To: linux-phy-bounces+linux-phy=archiver.kernel.org@lists.infradead.org VGhlIGNvbWIgUEhZIG9uIEszIHJlcXVpcmVzIHRvIGNvbmZpZ3VyZSBhIHN5c2NvbiBkZXZpY2Ug Zm9yIHRoZQpyaWdodCBtdXggY29uZmlndXJhdGlvbi4gQW5kIGl0IHJlcXVpcmVzIGNhbGlicmF0 aW9uIGJlZm9yZSBhbnkKdXNhZ2UuCgpBZGQgVVNCMy9QQ0llIGNvbWIgUEhZIGRyaXZlciBmb3Ig U3BhY2VtaXQgSzMuCgpTaWduZWQtb2ZmLWJ5OiBJbm9jaGkgQW1hb3RvIDxpbm9jaGlhbWFAZ21h aWwuY29tPgotLS0KIGRyaXZlcnMvcGh5L3NwYWNlbWl0L0tjb25maWcgICAgICAgICAgfCAgMTYg KysKIGRyaXZlcnMvcGh5L3NwYWNlbWl0L01ha2VmaWxlICAgICAgICAgfCAgIDIgKwogZHJpdmVy cy9waHkvc3BhY2VtaXQvcGh5LWszLWNvbWJwaHkuYyB8IDI1MCArKysrKysrKysrKysrKysrCiBk cml2ZXJzL3BoeS9zcGFjZW1pdC9waHktazMtY29tbW9uLmMgIHwgMzk4ICsrKysrKysrKysrKysr KysrKysrKysrKysrCiBkcml2ZXJzL3BoeS9zcGFjZW1pdC9waHktazMtY29tbW9uLmggIHwgIDI3 ICsrCiA1IGZpbGVzIGNoYW5nZWQsIDY5MyBpbnNlcnRpb25zKCspCiBjcmVhdGUgbW9kZSAxMDA2 NDQgZHJpdmVycy9waHkvc3BhY2VtaXQvcGh5LWszLWNvbWJwaHkuYwogY3JlYXRlIG1vZGUgMTAw NjQ0IGRyaXZlcnMvcGh5L3NwYWNlbWl0L3BoeS1rMy1jb21tb24uYwogY3JlYXRlIG1vZGUgMTAw NjQ0IGRyaXZlcnMvcGh5L3NwYWNlbWl0L3BoeS1rMy1jb21tb24uaAoKZGlmZiAtLWdpdCBhL2Ry aXZlcnMvcGh5L3NwYWNlbWl0L0tjb25maWcgYi9kcml2ZXJzL3BoeS9zcGFjZW1pdC9LY29uZmln CmluZGV4IDUwYjAwMDVhY2Y2Ni4uNWZkZjE4ZmNlNDk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bo eS9zcGFjZW1pdC9LY29uZmlnCisrKyBiL2RyaXZlcnMvcGh5L3NwYWNlbWl0L0tjb25maWcKQEAg LTIzLDMgKzIzLDE5IEBAIGNvbmZpZyBQSFlfU1BBQ0VNSVRfSzFfVVNCMgogCWhlbHAKIAkgIEVu YWJsZSB0aGlzIHRvIHN1cHBvcnQgSzEgVVNCIDIuMCBQSFkgZHJpdmVyLiBUaGlzIGRyaXZlciB0 YWtlcyBjYXJlIG9mCiAJICBlbmFibGluZyBhbmQgY2xvY2sgc2V0dXAgYW5kIHdpbGwgYmUgdXNl ZCBieSBLMSB1ZGMvZWhjaS9vdGcveGhjaSBkcml2ZXIuCisKK2NvbmZpZyBQSFlfU1BBQ0VNSVRf SzNfQ09NTU9OX09QUworCXRyaXN0YXRlCisJc2VsZWN0IE1GRF9TWVNDT04KKwlzZWxlY3QgR0VO RVJJQ19QSFkKKworY29uZmlnIFBIWV9TUEFDRU1JVF9LM19DT01CT19QSFkKKwl0cmlzdGF0ZSAi U3BhY2VtaVQgSzMgVVNCMy9QQ0llIFBIWSBzdXBwb3J0IgorCWRlcGVuZHMgb24gKEFSQ0hfU1BB Q0VNSVQgfHwgQ09NUElMRV9URVNUKSAmJiBPRgorCWRlcGVuZHMgb24gQ09NTU9OX0NMSworCXNl bGVjdCBQSFlfU1BBQ0VNSVRfSzNfQ09NTU9OX09QUworCWhlbHAKKwkgIEVuYWJsZSB0aGlzIHRv IHN1cHBvcnQgSzMgVVNCMy9QQ0llIGNvbWJvIFBIWSBkcml2ZXIuIFRoaXMKKwkgIGRyaXZlciB0 YWtlcyBjYXJlIG9mIGVuYWJsaW5nIGFuZCBjbG9jayBzZXR1cCBhbmQgd2lsbCBiZSB1c2VkCisJ ICBieSBLMyBkd2MzIGRyaXZlci4KKwkgIElmIHVuc3VyZSwgc2F5IE4uCmRpZmYgLS1naXQgYS9k cml2ZXJzL3BoeS9zcGFjZW1pdC9NYWtlZmlsZSBiL2RyaXZlcnMvcGh5L3NwYWNlbWl0L01ha2Vm aWxlCmluZGV4IGE4MjFhMjFkNjE0Mi4uNDFiZTdiMDM4OGRhIDEwMDY0NAotLS0gYS9kcml2ZXJz L3BoeS9zcGFjZW1pdC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3BoeS9zcGFjZW1pdC9NYWtlZmls ZQpAQCAtMSwzICsxLDUgQEAKICMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25s eQogb2JqLSQoQ09ORklHX1BIWV9TUEFDRU1JVF9LMV9QQ0lFKQkJKz0gcGh5LWsxLXBjaWUubwog b2JqLSQoQ09ORklHX1BIWV9TUEFDRU1JVF9LMV9VU0IyKQkJKz0gcGh5LWsxLXVzYjIubworb2Jq LSQoQ09ORklHX1BIWV9TUEFDRU1JVF9LM19DT01CT19QSFkpCQkrPSBwaHktazMtY29tYnBoeS5v CitvYmotJChDT05GSUdfUEhZX1NQQUNFTUlUX0szX0NPTU1PTl9PUFMpCSs9IHBoeS1rMy1jb21t b24ubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waHkvc3BhY2VtaXQvcGh5LWszLWNvbWJwaHkuYyBi L2RyaXZlcnMvcGh5L3NwYWNlbWl0L3BoeS1rMy1jb21icGh5LmMKbmV3IGZpbGUgbW9kZSAxMDA2 NDQKaW5kZXggMDAwMDAwMDAwMDAwLi42NmZhNjMzMGFkNmUKLS0tIC9kZXYvbnVsbAorKysgYi9k cml2ZXJzL3BoeS9zcGFjZW1pdC9waHktazMtY29tYnBoeS5jCkBAIC0wLDAgKzEsMjUwIEBACisv LyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5CisvKgorICogcGh5LWszLXVz YjMuYyAtIFNwYWNlbWlUIEszIFR5cGUtQyBPcmllbnRhdGlvbiBTd2l0Y2ggRHJpdmVyCisgKgor ICogQ29weXJpZ2h0IChjKSAyMDI1IFNwYWNlbWlUIFRlY2hub2xvZ3kgQ28uIEx0ZAorICovCisK KyNpbmNsdWRlIDxsaW51eC9iaXRmaWVsZC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5j bHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3N5c2Nvbi5oPgorI2lu Y2x1ZGUgPGxpbnV4L2lvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8 bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5j bHVkZSA8bGludXgvcGh5L3BoeS5oPgorCisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvcGh5L3BoeS5o PgorCisjaW5jbHVkZSAicGh5LWszLWNvbW1vbi5oIgorCisvKgorICogVGhlIFBDSUUvVVNCIFN1 YnN5c3RlbSBvbiBTcGFjZW1pVCBLMyBoYXZlIDMgc2luZ2xlIGxhbmUgUElQRTMgUEhZcworICog KFBIWTIvMy80KSBzaGFyZWQgYnkgUENJRSBQb3J0Qy9EIGFuZCBVU0IzIFBvcnRCL0MvRC4KKyAq CisgKiBQTVVBX1BDSUVfU1VCU1lTX01HTVRbNDowXQorICoKKyAqICAgYml0NCA9IDAgOiBQQ0ll IEEgWDggbW9kZSwgYWxsIDggbGFuZXMgZGVkaWNhdGVkIHRvIFBDSWUgUG9ydCBBCisgKiAgICAg ICAgICAxIDogUEhZIGxhbmVzIHNoYXJlZCBiZXR3ZWVuIFBDSWUgb3IgVVNCIGFjY29yZGluZyB0 byBbMzowXQorICoKKyAqIEFsbCBQSFkgbWF0cml4IGNvbWJpbmF0aW9ucyBhY2NvcmRpbmcgdG8g WzQ6MF06CisgKgorICogICAweDBYIDogUENJZS1BIFg4CisgKiAgIDB4MTAgOiBQQ0llLUMgeDIg KFBIWTIrUEhZMykgKyBQQ0llLUQgeDEgKFBIWTQpCisgKiAgIDB4MTEgOiBQQ0llLUMgeDIgKFBI WTIrUEhZMykgKyBVU0ItRCAoUEhZNCkKKyAqICAgMHgxMiA6IFBDSWUtQyB4MSAoUEhZMikgICAg ICArIFVTQi1DIChQSFkzKQorICogICAweDEzIDogUENJZS1DIHgxIChQSFkyKSAgICAgICsgVVNC LUMgKFBIWTMpICsgVVNCLUQgKFBIWTQpCisgKiAgIDB4MTQgOiBQQ0llLUMgeDEgKFBIWTMpICAg ICAgKyBVU0ItQiAoUEhZMikKKyAqICAgMHgxNSA6IFBDSWUtQyB4MSAoUEhZMykgICAgICArIFVT Qi1CIChQSFkyKSArIFVTQi1EIChQSFk0KQorICogICAweDE2IDogVVNCLUIgKFBIWTIpICsgVVNC LUMgKFBIWTMpICsgUENJZSBEIHgxIChQSFk0KQorICogICAweDE3IDogVVNCLUIgKFBIWTIpICsg VVNCLUMgKFBIWTMpICsgVVNCLUQgKFBIWTQpCisgKgorICogU28gYW55IFVTQiBQb3J0IEIvQy9E IG9wZXJhdGlvbiByZXF1aXJlcyBQQ0llIEEgWDggbW9kZSB0byBiZSBkaXNhYmxlZC4KKyAqLwor I2RlZmluZSBQTVVBX1BDSUVfU1VCU1lTX01HTVQJCTB4MWQ4CisjZGVmaW5lIFBVX01BVFJJWF9D T05GX01BU0sJCUdFTk1BU0soNCwgMCkKKworI2RlZmluZSBDT01CUEhZX01BWF9TVUJQSFlTCQk2 CisKK3N0cnVjdCBrM19jb21iX3BoeSB7CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBr M19sYW5lX2dyb3VwIGdyb3Vwc1tDT01CUEhZX01BWF9TVUJQSFlTXTsKKwl2b2lkIF9faW9tZW0g KmJhc2U7CisJc3RydWN0IHJlZ21hcCAqYXBiX3NwYXJlOworfTsKKworc3RhdGljIGNvbnN0IHN0 cnVjdCBrM19waHlfbGFuZV9ncm91cF9kYXRhIGszX2NvbWJwaHlfbGFuZV9ncm91cDAgPSB7CisJ LmxhbmVzCQk9IDIsCisJLmNvbmZpZwkJPSAweDAwLAorCS5tYXNrCQk9IDB4ZmYsCisJLm9mZnNl dHMJPSB7CisJCTB4MCwgMHg0MDAKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBrM19w aHlfbGFuZV9ncm91cF9kYXRhIGszX2NvbWJwaHlfbGFuZV9ncm91cDEgPSB7CisJLmxhbmVzCQk9 IDIsCisJLmNvbmZpZwkJPSAweDAwLAorCS5tYXNrCQk9IDB4ZmYsCisJLm9mZnNldHMJPSB7CisJ CTB4MTAwMDAwLCAweDEwMDQwMAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGszX3Bo eV9sYW5lX2dyb3VwX2RhdGEgazNfY29tYnBoeV9sYW5lX2dyb3VwMiA9IHsKKwkubGFuZXMJCT0g MSwKKwkuY29uZmlnCQk9IDB4MTQsCisJLm1hc2sJCT0gMHgxNCwKKwkub2Zmc2V0cwk9IHsKKwkJ MHgyMDAwMDAKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBrM19waHlfbGFuZV9ncm91 cF9kYXRhIGszX2NvbWJwaHlfbGFuZV9ncm91cDMgPSB7CisJLmxhbmVzCQk9IDEsCisJLmNvbmZp ZwkJPSAweDEyLAorCS5tYXNrCQk9IDB4MTIsCisJLm9mZnNldHMJPSB7CisJCTB4MzAwMDAwCisJ fSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgazNfcGh5X2xhbmVfZ3JvdXBfZGF0YSBrM19j b21icGh5X2xhbmVfZ3JvdXA0ID0geworCS5sYW5lcwkJPSAxLAorCS5jb25maWcJCT0gMHgxMSwK KwkubWFzawkJPSAweDExLAorCS5vZmZzZXRzCT0geworCQkweDQwMDAwMAorCX0sCit9OworCitz dGF0aWMgY29uc3Qgc3RydWN0IGszX3BoeV9sYW5lX2dyb3VwX2RhdGEgazNfY29tYnBoeV9sYW5l X2dyb3VwNSA9IHsKKwkubGFuZXMJCT0gMSwKKwkuY29uZmlnCQk9IDB4MDAsCisJLm1hc2sJCT0g MHhmZiwKKwkub2Zmc2V0cwk9IHsKKwkJMHg1MDAwMDAKKwl9LAorfTsKKworc3RhdGljIGNvbnN0 IHN0cnVjdCBrM19waHlfbGFuZV9ncm91cF9kYXRhICprM19jb21icGh5X2xhbmVfZGF0YXNbXSA9 IHsKKwkmazNfY29tYnBoeV9sYW5lX2dyb3VwMCwKKwkmazNfY29tYnBoeV9sYW5lX2dyb3VwMSwK KwkmazNfY29tYnBoeV9sYW5lX2dyb3VwMiwKKwkmazNfY29tYnBoeV9sYW5lX2dyb3VwMywKKwkm azNfY29tYnBoeV9sYW5lX2dyb3VwNCwKKwkmazNfY29tYnBoeV9sYW5lX2dyb3VwNSwKK307CisK K3N0YXRpYyBpbnQgazNfY29tYl9waHlfaW5pdF9sYW5lcyhzdHJ1Y3QgazNfY29tYl9waHkgKnBo eSwgdW5zaWduZWQgaW50IGNvbmZpZykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBB UlJBWV9TSVpFKGszX2NvbWJwaHlfbGFuZV9kYXRhcyk7IGkrKykgeworCQljb25zdCBzdHJ1Y3Qg azNfcGh5X2xhbmVfZ3JvdXBfZGF0YSAqZGF0YSA9IGszX2NvbWJwaHlfbGFuZV9kYXRhc1tpXTsK KwkJc3RydWN0IGszX2xhbmVfZ3JvdXAgKmxnID0gJnBoeS0+Z3JvdXBzW2ldOworCQljb25zdCBz dHJ1Y3QgcGh5X29wcyAqb3BzOworCQlib29sIGlzX3VzYjsKKworCQlpc191c2IgPSAoZGF0YS0+ bWFzayAmIGNvbmZpZykgPT0gZGF0YS0+Y29uZmlnOworCQlpZiAoaXNfdXNiKQorCQkJb3BzID0g JmszX3VzYjNfcGh5X29wczsKKwkJZWxzZQorCQkJb3BzID0gJmszX3BjaWVfcGh5X29wczsKKwor CQlsZy0+cGh5ID0gZGV2bV9waHlfY3JlYXRlKHBoeS0+ZGV2LCBOVUxMLCBvcHMpOworCQlpZiAo SVNfRVJSKGxnLT5waHkpKQorCQkJcmV0dXJuIFBUUl9FUlIobGctPnBoeSk7CisKKwkJbGctPmlz X3BjaWUgPSAhaXNfdXNiOworCQlsZy0+ZGF0YSA9IGRhdGE7CisJCWxnLT5iYXNlID0gcGh5LT5i YXNlOworCQlwaHlfc2V0X2RydmRhdGEobGctPnBoeSwgbGcpOworCX0KKworCXJldHVybiAwOwor fQorCitzdGF0aWMgaW50IGszX2NvbWJfcGh5X3VwZGF0ZV9jb25maWcoc3RydWN0IHJlZ21hcCAq YXBtdSwgdW5zaWduZWQgaW50IGNvbmZpZykKK3sKKwlpZiAoY29uZmlnICYgflBVX01BVFJJWF9D T05GX01BU0spCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0 cyhhcG11LCBQTVVBX1BDSUVfU1VCU1lTX01HTVQsIFBVX01BVFJJWF9DT05GX01BU0ssIGNvbmZp Zyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGh5ICprM19jb21iX3BoeV94bGF0ZShzdHJ1Y3QgZGV2 aWNlICpkZXYsIGNvbnN0IHN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgKmFyZ3MpCit7CisJc3RydWN0 IGszX2NvbWJfcGh5ICpwaHkgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgazNfbGFu ZV9ncm91cCAqbGc7CisKKwlpZiAoYXJncy0+YXJnc19jb3VudCAhPSAyKSB7CisJCWRldl9lcnIo ZGV2LCAiSW52YWxpZCBudW1iZXIgb2YgYXJndW1lbnRzXG4iKTsKKwkJcmV0dXJuIEVSUl9QVFIo LUVJTlZBTCk7CisJfQorCisJaWYgKGFyZ3MtPmFyZ3NbMF0gPj0gQVJSQVlfU0laRShrM19jb21i cGh5X2xhbmVfZGF0YXMpKSB7CisJCWRldl9lcnIoZGV2LCAiSW52YWxpZCBQSFkgaWRcbiIpOwor CQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwl9CisKKwlsZyA9ICZwaHktPmdyb3Vwc1thcmdz LT5hcmdzWzBdXTsKKworCWlmICgobGctPmlzX3BjaWUgJiYgYXJncy0+YXJnc1sxXSAhPSBQSFlf VFlQRV9QQ0lFKSB8fAorCSAgICAoIWxnLT5pc19wY2llICYmIGFyZ3MtPmFyZ3NbMV0gIT0gUEhZ X1RZUEVfVVNCMykpIHsKKwkJZGV2X2VycihkZXYsICJJbnZhbGlkIFBIWSBtb2RlXG4iKTsKKwkJ cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQorCisJcmV0dXJuIGxnLT5waHk7Cit9CisKK3N0 YXRpYyBpbnQgazNfY29tYl9waHlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikK K3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBkZXZpY2Vfbm9k ZSAqbm9kZSA9IGRldi0+b2Zfbm9kZTsKKwlzdHJ1Y3QgcGh5X3Byb3ZpZGVyICpwcm92aWRlcjsK KwlzdHJ1Y3QgazNfY29tYl9waHkgKnBoeTsKKwlzdHJ1Y3QgcmVnbWFwICphcG11OworCXUzMiBj b25maWcgPSAwOworCWludCByZXQ7CisKKwlwaHkgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2Yo KnBoeSksIEdGUF9LRVJORUwpOworCWlmICghcGh5KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBo eS0+YmFzZSA9IGRldm1fcGxhdGZvcm1faW9yZW1hcF9yZXNvdXJjZShwZGV2LCAwKTsKKwlpZiAo SVNfRVJSKHBoeS0+YmFzZSkpCisJCXJldHVybiBQVFJfRVJSKHBoeS0+YmFzZSk7CisKKwlwaHkt PmFwYl9zcGFyZSA9IHN5c2Nvbl9yZWdtYXBfbG9va3VwX2J5X3BoYW5kbGUobm9kZSwgInNwYWNl bWl0LGFwYi1zcGFyZSIpOworCWlmIChJU19FUlIocGh5LT5hcGJfc3BhcmUpKQorCQlyZXR1cm4g ZGV2X2Vycl9wcm9iZShkZXYsIFBUUl9FUlIocGh5LT5hcGJfc3BhcmUpLAorCQkJCSAgICAgIkZh aWxlZCB0byBmaW5lIEFQQiBTUEFSRSBzeXNjb24iKTsKKworCWFwbXUgPSBzeXNjb25fcmVnbWFw X2xvb2t1cF9ieV9waGFuZGxlX2FyZ3Mobm9kZSwgInNwYWNlbWl0LGFwbXUiLCAxLCAmY29uZmln KTsKKwlpZiAoSVNfRVJSKGFwbXUpKQorCQlyZXR1cm4gZGV2X2Vycl9wcm9iZShkZXYsIFBUUl9F UlIocGh5LT5hcGJfc3BhcmUpLAorCQkJCSAgICAgIkZhaWxlZCB0byBmaW5lIEFQTVUgc3lzY29u Iik7CisKKwlyZXQgPSBrM19jb21iX3BoeV91cGRhdGVfY29uZmlnKGFwbXUsIGNvbmZpZyk7CisJ aWYgKHJldCA8IDApCisJCXJldHVybiBkZXZfZXJyX3Byb2JlKGRldiwgcmV0LCAiRmFpbGVkIHRv IHNldCBsYW5lIGNvbmZpZ3VyYXRpb24iKTsKKworCXBoeS0+ZGV2ID0gZGV2OworCXBsYXRmb3Jt X3NldF9kcnZkYXRhKHBkZXYsIHBoeSk7CisKKwlyZXQgPSBrM19waHlfY2FsaWJyYXRlKHBoeS0+ YXBiX3NwYXJlKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIGRldl9lcnJfcHJvYmUoZGV2LCBy ZXQsICJGYWlsZWQgdG8gY2FsaWJyYXRlIHBoeSIpOworCisJcmV0ID0gazNfY29tYl9waHlfaW5p dF9sYW5lcyhwaHksIGNvbmZpZyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiBkZXZfZXJyX3By b2JlKGRldiwgcmV0LCAiRmFpbGVkIHRvIGluaXQgbGFuZXMiKTsKKworCXByb3ZpZGVyID0gZGV2 bV9vZl9waHlfcHJvdmlkZXJfcmVnaXN0ZXIoZGV2LCBrM19jb21iX3BoeV94bGF0ZSk7CisJaWYg KElTX0VSUihwcm92aWRlcikpCisJCXJldHVybiBkZXZfZXJyX3Byb2JlKGRldiwgUFRSX0VSUihw cm92aWRlciksCisJCQkJICAgICAiRmFpbGVkIHRvIHJlZ2lzdGVyIHByb3ZpZGVyXG4iKTsKKwor CXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBrM19jb21i X3BoeV9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAic3BhY2VtaXQsazMtY29tYi1w aHkiIH0sCisJeyB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGszX2NvbWJfcGh5X29m X21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgazNfY29tYl9waHlfZHJp dmVyID0geworCS5wcm9iZSA9IGszX2NvbWJfcGh5X3Byb2JlLAorCS5kcml2ZXIgPSB7CisJCS5u YW1lID0gInNwYWNlbWl0LGszLWNvbWItcGh5IiwKKwkJLm9mX21hdGNoX3RhYmxlID0gazNfY29t Yl9waHlfb2ZfbWF0Y2gsCisJfSwKK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGszX2NvbWJf cGh5X2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiU3BhY2VtaVQgSzMgVVNCMy9QQ0ll IGNvbWIgUEhZIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEv ZHJpdmVycy9waHkvc3BhY2VtaXQvcGh5LWszLWNvbW1vbi5jIGIvZHJpdmVycy9waHkvc3BhY2Vt aXQvcGh5LWszLWNvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAw MC4uNzdjNGI0MDczYjk2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9waHkvc3BhY2VtaXQv cGh5LWszLWNvbW1vbi5jCkBAIC0wLDAgKzEsMzk4IEBACisvLyBTUERYLUxpY2Vuc2UtSWRlbnRp ZmllcjogR1BMLTIuMC1vbmx5CisKKyNpbmNsdWRlIDxsaW51eC9iaXRmaWVsZC5oPgorI2luY2x1 ZGUgPGxpbnV4L2NsZWFudXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxp bnV4L2lvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4 L3JlZ21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorCisjaW5jbHVkZSA8ZHQtYmluZGlu Z3MvcGh5L3BoeS5oPgorCisjaW5jbHVkZSAicGh5LWszLWNvbW1vbi5oIgorCisvKiBQSFkgUmVn aXN0ZXJzICovCisjZGVmaW5lIFBIWV9WRVJTSU9OCQkJMHgwCisKKyNkZWZpbmUgUEhZX1JFU0VU X0NGRwkJCTB4MDQKKworI2RlZmluZSBQSFlfUkVTRVRfUlhCVUZfUlNUCQlCSVQoMCkKKyNkZWZp bmUgUEhZX1JFU0VUX1NPRlRfUlNUX1BDUwkJQklUKDEpCisjZGVmaW5lIFBIWV9SRVNFVF9TT0ZU X1JTVF9BSEIJCUJJVCgyKQorI2RlZmluZSBQSFlfUkVTRVRfRU5fU0RfQUZURVJfTE9DSwlCSVQo NikKKworI2RlZmluZSBQSFlfQ0xLX0NGRwkJCTB4MDgKKworI2RlZmluZSBQSFlfQ0xLX1BMTF9S RUFEWQkJQklUKDApCisjZGVmaW5lIFBIWV9DTEtfVFhDTEtfSU5WCQlCSVQoMikKKyNkZWZpbmUg UEhZX0NMS19SWENMS19FTgkJQklUKDMpCisjZGVmaW5lIFBIWV9DTEtfVFhDTEtfRU4JCUJJVCg0 KQorI2RlZmluZSBQSFlfQ0xLX1BDTEtfRU4JCQlCSVQoNSkKKyNkZWZpbmUgUEhZX0NMS19QSVBF X1BDTEtfRU4JCUJJVCg2KQorI2RlZmluZSBQSFlfQ0xLX1JFRkNMS19GUkVRCQlHRU5NQVNLKDEw LCA3KQorI2RlZmluZSBQSFlfQ0xLX1JFRkNMS18yNE0JCTIKKyNkZWZpbmUgUEhZX0NMS19TV19J TklUX0RPTkUJCUJJVCgxMSkKKyNkZWZpbmUgUEhZX0NMS19QVV9TU0NfT1VUCQlCSVQoMjMpCisK KyNkZWZpbmUgUEhZX01PREVfQ0ZHCQkJMHgwQworCisjZGVmaW5lIFBIWV9NT0RFX1BDSUVfSU5U X0VOCQlCSVQoMCkKKyNkZWZpbmUgUEhZX01PREVfTEZQU19UUEVSSU9ECQlHRU5NQVNLKDksIDgp CisjZGVmaW5lIFBIWV9NT0RFX0xGUFNfVFBFUklPRF9VU0IJMworCisjZGVmaW5lIFBIWV9QVV9T RUwJCQkweDQwCisKKyNkZWZpbmUgUEhZX1BVX0NGR19TVEFUVVMJCUJJVCg5KQorI2RlZmluZSBQ SFlfUFVfT1ZSRF9TVEFUVVMJCUJJVCgxMCkKKworI2RlZmluZSBQSFlfUFVfQ0tfUkVHCQkJMHg1 NAorCisjZGVmaW5lIFBIWV9QVV9SRUZDTEtfMTAwCQlCSVQoMjUpCisKKyNkZWZpbmUgUEhZX1BM TF9SRUcxCQkJMHg1OAorCisjZGVmaW5lIFBIWV9QTExfRlJFRl9TRUwJCUdFTk1BU0soMTUsIDEz KQorI2RlZmluZSBQSFlfUExMX0ZSRUZfMjRNCQkweDEKKyNkZWZpbmUgUEhZX1BMTF9TU0NfREVQ X1NFTAkJR0VOTUFTSygyNywgMjQpCisjZGVmaW5lIFBIWV9QTExfU1NDXzUwMDBQUE0JCTB4YQor I2RlZmluZSBQSFlfUExMX1NTQ19NT0RFCQlHRU5NQVNLKDI5LCAyOCkKKyNkZWZpbmUgUEhZX1BM TF9TU0NfTU9ERV9DRU5URVJfU1BSRUFECTAKKyNkZWZpbmUgUEhZX1BMTF9TU0NfTU9ERV9VUF9T UFJFQUQJMQorI2RlZmluZSBQSFlfUExMX1NTQ19NT0RFX0RPV05fU1BSRUFECTIKKyNkZWZpbmUg UEhZX1BMTF9TU0NfTU9ERV9ET1dOX1NQUkVBRDEJMworCisjZGVmaW5lIFBIWV9QTExfUkVHMgkJ CTB4NWMKKworI2RlZmluZSBQSFlfUExMX1NFTF9SRUYxMDAJCUJJVCgyMSkKKworLyogUEhZIFJY IFJlZ2lzdGVyIERlZmluaXRpb25zICovCisjZGVmaW5lIFBIWV9SWF9SRUdfQQkJCTB4NjAKKwor I2RlZmluZSBQSFlfUlhfUkVHMF9STE9BRAkJQklUKDQpCisjZGVmaW5lIFBIWV9SWF9SRUcxX1JU RVJNCQlHRU5NQVNLKDExLCA4KQorI2RlZmluZSBQSFlfUlhfUkVHMV9SQ19DQUxJCQlHRU5NQVNL KDE1LCAxMikKKyNkZWZpbmUgUEhZX1JYX1JFRzJfQ1NFTAkJR0VOTUFTSygxOSwgMTYpCisjZGVm aW5lIFBIWV9SWF9SRUcyX0ZPUkNFX0NTRUwJCUJJVCgyMCkKKyNkZWZpbmUgUEhZX1JYX1JFRzJf UFNFTAkJR0VOTUFTSygyMywgMjEpCisjZGVmaW5lIFBIWV9SWF9SRUczX0lfTE9BRAkJR0VOTUFT SygyNiwgMjQpCisjZGVmaW5lIFBIWV9SWF9SRUczX1NFTF9DQk9PU1RfQ09ERQlCSVQoMjcpCisj ZGVmaW5lIFBIWV9SWF9SRUczX0FESl9CSUFTCQlHRU5NQVNLKDI5LCAyOCkKKyNkZWZpbmUgUEhZ X1JYX1JFRzNfUkRFRzEJCUdFTk1BU0soMzEsIDMwKQorCisjZGVmaW5lIFBIWV9SWF9SRUdfQgkJ CTB4NjQKKworI2RlZmluZSBQSFlfUlhfUkVHQl9NQVNLCQlHRU5NQVNLKDIzLCAwKQorCisjZGVm aW5lIFBIWV9SWF9SRUc0X1JERUcyCQlHRU5NQVNLKDIsIDEpCisjZGVmaW5lIFBIWV9SWF9SRUc0 X0VOVk9TCQlCSVQoNCkKKyNkZWZpbmUgUEhZX1JYX1JFRzRfUlRFUk1fU0VMCQlCSVQoNSkKKyNk ZWZpbmUgUEhZX1JYX1JFRzRfTUFOVUFMX0NGRwkJQklUKDcpCisjZGVmaW5lIFBIWV9SWF9SRUc1 X1JDRUxMX1ZDTQkJR0VOTUFTSygxMSwgOCkKKyNkZWZpbmUgUEhZX1JYX1JFRzVfUkNFTExfQklB UwkJR0VOTUFTSygxNSwgMTIpCisjZGVmaW5lIFBIWV9SWF9SRUc2X0gxX1JFRwkJR0VOTUFTSygx OSwgMTYpCisjZGVmaW5lIFBIWV9SWF9SRUc2X0FEQVBUX0dBSU4JCUdFTk1BU0soMjEsIDIwKQor I2RlZmluZSBQSFlfUlhfUkVHNl9CWVBBU1NfQURQVAkJQklUKDIyKQorCisjZGVmaW5lIFBIWV9B RFBUX0NGRzAJCQkweDE0MAorI2RlZmluZSBQSFlfQURQVF9BRkVfUlNUX09WUkRfRU4JQklUKDEp CisjZGVmaW5lIFBIWV9BRFBUX0FGRV9SU1RfT1ZSRF9WQUwJQklUKDQpCisKKyNkZWZpbmUgUEhZ X1JYRVFfVElNRQkJCTB4YjQKKyNkZWZpbmUgUEhZX1JYRVFfVElNRV9PVlJEX1BPU1RfQ19TT0MJ QklUKDIxKQorI2RlZmluZSBQSFlfUlhFUV9USU1FX0NGR19BTVBfU09DCUdFTk1BU0soMjMsIDIy KQorI2RlZmluZSBQSFlfUlhFUV9USU1FX0FNUF9TT0NfNjUwTQkwCisjZGVmaW5lIFBIWV9SWEVR X1RJTUVfQU1QX1NPQ184MDBNCTEKKyNkZWZpbmUgUEhZX1JYRVFfVElNRV9BTVBfU09DXzg3ME0J MgorI2RlZmluZSBQSFlfUlhFUV9USU1FX0FNUF9TT0NfOTAwTQkzCisjZGVmaW5lIFBIWV9SWEVR X1RJTUVfT1ZSRF9BTVBfU09DCUJJVCgyNCkKKworI2RlZmluZSBQQ0lFX1BVX0FERFJfQ0xLX0NG RwkJMHgwMDA4CisjZGVmaW5lIFBIWV9DTEtfUExMX1JFQURZCQlCSVQoMCkKKyNkZWZpbmUgUENJ RV9JTklUQUxfVElNRVIJCUdFTk1BU0soNiwgMykKKyNkZWZpbmUgQ0ZHX0lOVEVSTkFMX1RJTUVS X0FESgkJR0VOTUFTSygxMCwgNykKKyNkZWZpbmUgQ0ZHX1NXX1BIWV9JTklUX0RPTkUJCUJJVCgx MSkKKworLyogTGFuZSBSWC9UWCBjb25maWd1cmF0aW9uIChwZXLigJFsYW5lLCBhdCBsYW5lX2Jh c2UpICovCisjZGVmaW5lIFBDSUVfUlhfUkVHMQkJCTB4MDUwCisjZGVmaW5lIFBDSUVfVFhfUkVH MQkJCTB4MDY0CisKKyNkZWZpbmUgUENJRV9QTExfVElNRU9VVAkJNTAwMDAwCisjZGVmaW5lIFBD SUVfUE9MTF9ERUxBWQkJCTUwMAorCitzdGF0aWMgaW50IGszX3VzYjNwaHlfaW5pdF9zaW5nbGUo c3RydWN0IGszX2xhbmVfZ3JvdXAgKmxnLCB2b2lkIF9faW9tZW0gKmJhc2UpCit7CisJc3RydWN0 IHBoeSAqcGh5ID0gbGctPnBoeTsKKwl1MzIgdmFsLCB0bXA7CisJaW50IHJldDsKKworCXZhbCA9 IHJlYWRsKGJhc2UgKyBQSFlfUFVfU0VMKTsKKwl2YWwgPSB1MzJfcmVwbGFjZV9iaXRzKHZhbCwg MCwgUEhZX1BVX0NGR19TVEFUVVMpOworCXZhbCB8PSBQSFlfUFVfT1ZSRF9TVEFUVVM7CisJd3Jp dGVsKHZhbCwgYmFzZSArIFBIWV9QVV9TRUwpOworCisJdWRlbGF5KDIwMCk7CisKKwkvKiBEbyBu b3Qgd2FpdCBDRFIgbG9jayBiZWZvcmUgc2FtcGxpbmcgZGF0YSAqLworCXZhbCA9IHJlYWRsKGJh c2UgKyBQSFlfUkVTRVRfQ0ZHKTsKKwl2YWwgPSB1MzJfcmVwbGFjZV9iaXRzKHZhbCwgMCwgUEhZ X1JFU0VUX0VOX1NEX0FGVEVSX0xPQ0spOworCXdyaXRlbCh2YWwsIGJhc2UgKyBQSFlfUkVTRVRf Q0ZHKTsKKworCS8qIFBvd2VyIGRvd24gMTAwTUh6IHJlZmNsayBidWZmZXIgKi8KKwl2YWwgPSBy ZWFkbChiYXNlICsgUEhZX1BVX0NLX1JFRyk7CisJdmFsID0gdTMyX3JlcGxhY2VfYml0cyh2YWws IDAsIFBIWV9QVV9SRUZDTEtfMTAwKTsKKwl3cml0ZWwodmFsLCBiYXNlICsgUEhZX1BVX0NLX1JF Ryk7CisKKwkvKiBQcm9ncmFtIFBMTCBSRUcxIGNvbmZpZ3VyZSB0aGUgU1NDICovCisJdmFsID0g RklFTERfUFJFUChQSFlfUExMX1NTQ19NT0RFLCBQSFlfUExMX1NTQ19NT0RFX0RPV05fU1BSRUFE MSkgfAorCSAgICAgIEZJRUxEX1BSRVAoUEhZX1BMTF9TU0NfREVQX1NFTCwgUEhZX1BMTF9TU0Nf NTAwMFBQTSkgfAorCSAgICAgIEZJRUxEX1BSRVAoUEhZX1BMTF9GUkVGX1NFTCwgUEhZX1BMTF9G UkVGXzI0TSk7CisJd3JpdGVsKHZhbCwgYmFzZSArIFBIWV9QTExfUkVHMSk7CisKKwkvKiBVbi1z ZWxlY3QgMTAwTUh6IFBMTCByZWZlcmVuY2UgKi8KKwl2YWwgPSByZWFkbChiYXNlICsgUEhZX1BM TF9SRUcyKTsKKwl2YWwgPSB1MzJfcmVwbGFjZV9iaXRzKHZhbCwgMCwgUEhZX1BMTF9TRUxfUkVG MTAwKTsKKwl3cml0ZWwodmFsLCBiYXNlICsgUEhZX1BMTF9SRUcyKTsKKworCS8qIFVTQiBMRlBT IHBlcmlvZCBjb25maWd1cmF0aW9uICovCisJdmFsID0gcmVhZGwoYmFzZSArIFBIWV9NT0RFX0NG Ryk7CisJdmFsID0gdTMyX3JlcGxhY2VfYml0cyh2YWwsIFBIWV9NT0RFX0xGUFNfVFBFUklPRF9V U0IsIFBIWV9NT0RFX0xGUFNfVFBFUklPRCk7CisJd3JpdGVsKHZhbCwgYmFzZSArIFBIWV9NT0RF X0NGRyk7CisKKwkvKiBGb3JjZSBBRkUgYWRhcHRhdGlvbiByZXNldCAqLworCXZhbCA9IHJlYWRs KGJhc2UgKyBQSFlfQURQVF9DRkcwKTsKKwl2YWwgfD0gUEhZX0FEUFRfQUZFX1JTVF9PVlJEX0VO IHwgUEhZX0FEUFRfQUZFX1JTVF9PVlJEX1ZBTDsKKwl3cml0ZWwodmFsLCBiYXNlICsgUEhZX0FE UFRfQ0ZHMCk7CisKKwkvKiBPdmVycmlkZSBkcml2ZXIgYW1wbGl0dWRlIHZhbHVlIHRvIDkwMG0g Ki8KKwl2YWwgPSByZWFkbChiYXNlICsgUEhZX1JYRVFfVElNRSk7CisJdmFsIHw9IFBIWV9SWEVR X1RJTUVfT1ZSRF9BTVBfU09DOworCXZhbCA9IHUzMl9yZXBsYWNlX2JpdHModmFsLCBQSFlfUlhF UV9USU1FX0FNUF9TT0NfOTAwTSwgUEhZX1JYRVFfVElNRV9DRkdfQU1QX1NPQyk7CisJd3JpdGVs KHZhbCwgYmFzZSArIFBIWV9SWEVRX1RJTUUpOworCisJLyogQ29uZmlndXJlIFJYIHBhcmFtZXRl cnMgKi8KKwl2YWwgPSBQSFlfUlhfUkVHMF9STE9BRCB8CisJCUZJRUxEX1BSRVAoUEhZX1JYX1JF RzFfUlRFUk0sIDB4OCkgfAorCQlGSUVMRF9QUkVQKFBIWV9SWF9SRUcxX1JDX0NBTEksIDB4Nykg fAorCQlGSUVMRF9QUkVQKFBIWV9SWF9SRUcyX0NTRUwsIDB4OCkgfAorCQlQSFlfUlhfUkVHMl9G T1JDRV9DU0VMIHwKKwkJRklFTERfUFJFUChQSFlfUlhfUkVHMl9QU0VMLCAweDQpIHwKKwkJRklF TERfUFJFUChQSFlfUlhfUkVHM19JX0xPQUQsIDB4NykgfAorCQlQSFlfUlhfUkVHM19TRUxfQ0JP T1NUX0NPREUgfAorCQlGSUVMRF9QUkVQKFBIWV9SWF9SRUczX0FESl9CSUFTLCAweDEpIHwKKwkJ RklFTERfUFJFUChQSFlfUlhfUkVHM19SREVHMSwgMHgzKTsKKwl3cml0ZWwodmFsLCBiYXNlICsg UEhZX1JYX1JFR19BKTsKKworCXZhbCA9IHJlYWRsKGJhc2UgKyBQSFlfUlhfUkVHX0IpOworCXRt cCA9IEZJRUxEX1BSRVAoUEhZX1JYX1JFRzRfUkRFRzIsIDB4MikgfAorCQlQSFlfUlhfUkVHNF9F TlZPUyB8IFBIWV9SWF9SRUc0X1JURVJNX1NFTCB8IFBIWV9SWF9SRUc0X01BTlVBTF9DRkcgfAor CQlGSUVMRF9QUkVQKFBIWV9SWF9SRUc1X1JDRUxMX1ZDTSwgMHg4KSB8CisJCUZJRUxEX1BSRVAo UEhZX1JYX1JFRzVfUkNFTExfQklBUywgMHg4KSB8CisJCUZJRUxEX1BSRVAoUEhZX1JYX1JFRzZf SDFfUkVHLCAweDgpIHwKKwkJRklFTERfUFJFUChQSFlfUlhfUkVHNl9BREFQVF9HQUlOLCAweDIp OworCXZhbCA9IHUzMl9yZXBsYWNlX2JpdHModmFsLCB0bXAsIFBIWV9SWF9SRUdCX01BU0spOwor CXdyaXRlbCh2YWwsIGJhc2UgKyBQSFlfUlhfUkVHX0IpOworCisJLyoKKwkgKiBJbmZvcm0gUEhZ IHRoYXQgYWxsIFBMTC1yZWxhdGVkIGNvbmZpZ3VyYXRpb24gaXMgZG9uZS4KKwkgKiBQTEwgd2ls bCBub3Qgc3RhcnQgbG9ja2luZyB1bnRpbCBQSFlfQ0xLX1NXX0lOSVRfRE9ORSBpcyBzZXQuCisJ ICovCisJdmFsID0gUEhZX0NMS19TV19JTklUX0RPTkUgfCBQSFlfQ0xLX1BVX1NTQ19PVVQgfAor CSAgICAgIEZJRUxEX1BSRVAoUEhZX0NMS19SRUZDTEtfRlJFUSwgUEhZX0NMS19SRUZDTEtfMjRN KSB8CisJICAgICAgUEhZX0NMS19SWENMS19FTiB8IFBIWV9DTEtfVFhDTEtfRU4gfAorCSAgICAg IFBIWV9DTEtfUENMS19FTiB8IFBIWV9DTEtfUElQRV9QQ0xLX0VOOworCXdyaXRlbCh2YWwsIGJh c2UgKyBQSFlfQ0xLX0NGRyk7CisKKwlyZXQgPSByZWFkbF9wb2xsX3RpbWVvdXQoYmFzZSArIFBI WV9DTEtfQ0ZHLCB2YWwsCisJCQkJICh2YWwgJiBQSFlfQ0xLX1BMTF9SRUFEWSksCisJCQkJIFBD SUVfUE9MTF9ERUxBWSwgUENJRV9QTExfVElNRU9VVCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJy KCZwaHktPmRldiwgIlBIWSBQTEwgcG9sbGluZyB0aW1lb3V0XG4iKTsKKwkJcmV0dXJuIHJldDsK Kwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBrM191c2IzcGh5X2luaXQoc3RydWN0 IHBoeSAqcGh5KQoreworCXN0cnVjdCBrM19sYW5lX2dyb3VwICpsZyA9IHBoeV9nZXRfZHJ2ZGF0 YShwaHkpOworCWludCByZXQsIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGctPmRhdGEtPmxhbmVz OyBpKyspIHsKKwkJcmV0ID0gazNfdXNiM3BoeV9pbml0X3NpbmdsZShsZywgbGctPmJhc2UgKyBs Zy0+ZGF0YS0+b2Zmc2V0c1tpXSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9 CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBrM191c2IzcGh5X3NldF9zcGVlZChzdHJ1 Y3QgcGh5ICpwaHksIGludCBzcGVlZCkKK3sKKwlzdHJ1Y3QgazNfbGFuZV9ncm91cCAqbGcgPSBw aHlfZ2V0X2RydmRhdGEocGh5KTsKKwl2b2lkIF9faW9tZW0gKmJhc2UgPSBsZy0+YmFzZSArIGxn LT5kYXRhLT5vZmZzZXRzWzBdOworCXUzMiB2YWw7CisKKwlpZiAoc3BlZWQgPT0gVVNCX1NQRUVE X0hJR0gpIHsKKwkJdmFsID0gcmVhZGwoYmFzZSArIFBIWV9QVV9TRUwpOworCQl2YWwgPSB1MzJf cmVwbGFjZV9iaXRzKHZhbCwgMCwgUEhZX1BVX0NGR19TVEFUVVMpOworCQl2YWwgfD0gUEhZX1BV X09WUkRfU1RBVFVTOworCQl3cml0ZWwodmFsLCBiYXNlICsgUEhZX1BVX1NFTCk7CisKKwkJdWRl bGF5KDIwMCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2NvbnN0IHN0cnVjdCBwaHlfb3BzIGsz X3VzYjNfcGh5X29wcyA9IHsKKwkuaW5pdCA9IGszX3VzYjNwaHlfaW5pdCwKKwkuc2V0X3NwZWVk ID0gazNfdXNiM3BoeV9zZXRfc3BlZWQsCisJLm93bmVyID0gVEhJU19NT0RVTEUsCit9OworRVhQ T1JUX1NZTUJPTF9HUEwoazNfdXNiM19waHlfb3BzKTsKKworc3RhdGljIGludCBrM19wY2llX3Bo eV9pbml0KHN0cnVjdCBwaHkgKnBoeSkKK3sKKwlzdHJ1Y3QgazNfbGFuZV9ncm91cCAqbGcgPSBw aHlfZ2V0X2RydmRhdGEocGh5KTsKKwl2b2lkIF9faW9tZW0gKnBoeV9iYXNlID0gbGctPmJhc2Ug KyBsZy0+ZGF0YS0+b2Zmc2V0c1swXTsKKwl1MzIgdmFsOworCWludCByZXQ7CisJaW50IGk7CisK Kwl2YWwgPSByZWFkbChwaHlfYmFzZSArIFBIWV9QTExfUkVHMSk7CisJdmFsID0gdTMyX3JlcGxh Y2VfYml0cyh2YWwsIDB4MiwgR0VOTUFTSygxNSwgMTIpKTsKKwl3cml0ZWwodmFsLCBwaHlfYmFz ZSArIFBIWV9QTExfUkVHMSk7CisKKwl2YWwgPSByZWFkbChwaHlfYmFzZSArIFBIWV9QTExfUkVH Mik7CisJdmFsID0gdTMyX3JlcGxhY2VfYml0cyh2YWwsIDAsIEJJVCgyMSkpOworCXdyaXRlbCh2 YWwsIHBoeV9iYXNlICsgUEhZX1BMTF9SRUcyKTsKKworCWZvciAoaSA9IDA7IGkgPCBsZy0+ZGF0 YS0+bGFuZXM7IGkrKykgeworCQl2b2lkIF9faW9tZW0gKmxhbmVfYmFzZSA9IGxnLT5iYXNlICsg bGctPmRhdGEtPm9mZnNldHNbaV07CisKKwkJdmFsID0gcmVhZGwobGFuZV9iYXNlICsgUENJRV9S WF9SRUcxKTsKKwkJdmFsID0gdTMyX3JlcGxhY2VfYml0cyh2YWwsIDAsIDB4Myk7CisJCXdyaXRl bCh2YWwsIHBoeV9iYXNlICsgUENJRV9SWF9SRUcxKTsKKwl9CisKKwl2YWwgPSByZWFkbChwaHlf YmFzZSArIFBIWV9QTExfUkVHMik7CisJdmFsIHw9IEJJVCgyMCk7CisJd3JpdGVsKHZhbCwgcGh5 X2Jhc2UgKyBQSFlfUExMX1JFRzIpOworCisJd3JpdGVsKDB4MDAwMDY1MDUsIHBoeV9iYXNlICsg UENJRV9SWF9SRUcxKTsKKworCS8qIHBsbF9yZWcxIG9mIGxhbmUwLCBkaXNhYmxlIFNTQzogcGxs X3JlZzRbMzowXSA9IDAgKi8KKwl2YWwgPSByZWFkbChwaHlfYmFzZSArIFBIWV9QTExfUkVHMSk7 CisJdmFsID0gdTMyX3JlcGxhY2VfYml0cyh2YWwsIDAsIEdFTk1BU0soMjcsIDI0KSk7CisJd3Jp dGVsKHZhbCwgcGh5X2Jhc2UgKyBQSFlfUExMX1JFRzEpOworCisJZm9yIChpID0gMDsgaSA8IGxn LT5kYXRhLT5sYW5lczsgaSsrKSB7CisJCXZvaWQgX19pb21lbSAqbGFuZV9iYXNlID0gbGctPmJh c2UgKyBsZy0+ZGF0YS0+b2Zmc2V0c1tpXTsKKworCQkvKiBzZXQgY2ZnX3R4X3NlbmRfZHVtbXlf ZGF0YSB0byBiZSAxJ2IxIGZvciBkaXNhYmxlIGRhc2ggZGF0YSAqLworCQl2YWwgPSByZWFkbChs YW5lX2Jhc2UgKyBQSFlfUFVfU0VMKTsKKwkJdmFsID0gdTMyX3JlcGxhY2VfYml0cyh2YWwsIDEs IEJJVCgxMykpOworCQl3cml0ZWwodmFsLCBsYW5lX2Jhc2UgKyBQSFlfUFVfU0VMKTsKKworCQkv KiBkaXNhYmxlIGVuX3NhbXBsZV9kYXRhX2FmdGVyX2Nkcl9sb2NrZWQgKi8KKwkJdmFsID0gcmVh ZGwobGFuZV9iYXNlICsgUEhZX1JFU0VUX0NGRyk7CisJCXZhbCA9IHUzMl9yZXBsYWNlX2JpdHMo dmFsLCAwLCBCSVQoNikpOworCQl3cml0ZWwodmFsLCBsYW5lX2Jhc2UgKyBQSFlfUkVTRVRfQ0ZH KTsKKworCQkvKiBEeW5hbWljIExvY2sgKi8KKwkJdmFsID0gcmVhZGwobGFuZV9iYXNlICsgUEhZ X01PREVfQ0ZHKTsKKwkJdmFsID0gdTMyX3JlcGxhY2VfYml0cyh2YWwsIDEsIEJJVCgyKSk7CisJ CXdyaXRlbCh2YWwsIGxhbmVfYmFzZSArIFBIWV9NT0RFX0NGRyk7CisKKwkJdmFsID0gRklFTERf UFJFUChHRU5NQVNLKDcsIDApLCAweDEwKSB8CisJCQlGSUVMRF9QUkVQKEdFTk1BU0soMTUsIDgp LCAweDc4KSB8CisJCQlGSUVMRF9QUkVQKEdFTk1BU0soMjMsIDE2KSwgMHg5OCkgfAorCQkJRklF TERfUFJFUChHRU5NQVNLKDMxLCAyNCksIDB4ZGYpOworCQl3cml0ZWwodmFsLCBsYW5lX2Jhc2Ug KyBQSFlfUlhfUkVHX0EpOworCisJCXZhbCA9IHJlYWRsKGxhbmVfYmFzZSArIFBIWV9SWF9SRUdf Qik7CisJCXZhbCAmPSB+UEhZX1JYX1JFR0JfTUFTSzsKKwkJdmFsIHw9IEZJRUxEX1BSRVAoR0VO TUFTSyg3LCAwKSwgMHhiNCkgfAorCQkJRklFTERfUFJFUChHRU5NQVNLKDE1LCA4KSwgMHg4OCkg fAorCQkJRklFTERfUFJFUChHRU5NQVNLKDIzLCAxNiksIDB4MjgpOworCQl3cml0ZWwodmFsLCBs YW5lX2Jhc2UgKyBQSFlfUlhfUkVHX0IpOworCisJCS8qIFNldCBpbml0IGRvbmUgKi8KKwkJdmFs ID0gcmVhZGwobGFuZV9iYXNlICsgUENJRV9QVV9BRERSX0NMS19DRkcpOworCQl2YWwgPSB1MzJf cmVwbGFjZV9iaXRzKHZhbCwgMSwgQ0ZHX1NXX1BIWV9JTklUX0RPTkUpOworCQl3cml0ZWwodmFs LCBsYW5lX2Jhc2UgKyBQQ0lFX1BVX0FERFJfQ0xLX0NGRyk7CisJfQorCisJcmV0ID0gcmVhZGxf cG9sbF90aW1lb3V0KHBoeV9iYXNlICsgUENJRV9QVV9BRERSX0NMS19DRkcsIHZhbCwKKwkJCQkg KHZhbCAmIFBIWV9DTEtfUExMX1JFQURZKSwgUENJRV9QT0xMX0RFTEFZLAorCQkJCSBQQ0lFX1BM TF9USU1FT1VUKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmxnLT5waHktPmRldiwgIlBIWSBQ TEwgbG9jayB0aW1lb3V0XG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30K KworY29uc3Qgc3RydWN0IHBoeV9vcHMgazNfcGNpZV9waHlfb3BzID0geworCS5pbml0CQk9IGsz X3BjaWVfcGh5X2luaXQsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorfTsKK0VYUE9SVF9TWU1C T0xfR1BMKGszX3BjaWVfcGh5X29wcyk7CisKKy8qIFBIWSByY2FsIGluaXQgcmVxdWlyZXMgQVBC X1NQQVJFIHJlZ21hcCBhY2Nlc3MgKi8KKworI2RlZmluZSBBUEJfU1BBUkVfUFVfQ0FMCQkweDE3 OAorI2RlZmluZSBQVV9DQUwJCQkJQklUKDE3KQorCisjZGVmaW5lIEFQQl9TUEFSRV9SQ0FMX0hT SU8JCTB4MTdjCisjZGVmaW5lIEFQQl9TUEFSRV9QVV9DQUxfRE9ORQkJQklUKDgpCisjZGVmaW5l IFJDQUxfT1ZSRF9QVFJJTQkJCUdFTk1BU0soMjMsIDIwKQorI2RlZmluZSBSQ0FMX09WUkRfTlRS SU0JCQlHRU5NQVNLKDI3LCAyNCkKKyNkZWZpbmUgUkNBTF9PVlJEX1BUUklNX0VOCQlCSVQoMjgp CisjZGVmaW5lIFJDQUxfT1ZSRF9OVFJJTV9FTgkJQklUKDI5KQorI2RlZmluZSBSQ0FMX09WUkRf U1RBQkxFX1ZBTAkJQklUKDMwKQorI2RlZmluZSBSQ0FMX09WUkRfU1RBQkxFX0VOCQlCSVQoMzEp CisKKyNkZWZpbmUgUkNBTF9PVlJEX1RSSU1fRU4JCShSQ0FMX09WUkRfTlRSSU1fRU4gfCBSQ0FM X09WUkRfUFRSSU1fRU4pCisjZGVmaW5lIFJDQUxfT1ZSRF9UUklNX01BU0sJCShSQ0FMX09WUkRf TlRSSU0gfCBSQ0FMX09WUkRfUFRSSU0pCisKKyNkZWZpbmUgUFVfQ0FMX1RJTUVPVVQgMjAwMDAw MAorCitzdGF0aWMgREVGSU5FX01VVEVYKGNhbGlicmF0ZV9sb2NrKTsKKworaW50IGszX3BoeV9j YWxpYnJhdGUoc3RydWN0IHJlZ21hcCAqYXBiX3NwYXJlKQoreworCXVuc2lnbmVkIGludCB2YWw7 CisJaW50IHJldDsKKworCWd1YXJkKG11dGV4KSgmY2FsaWJyYXRlX2xvY2spOworCisJcmVnbWFw X3JlYWQoYXBiX3NwYXJlLCBBUEJfU1BBUkVfUkNBTF9IU0lPLCAmdmFsKTsKKwlpZiAodmFsICYg QVBCX1NQQVJFX1BVX0NBTF9ET05FKQorCQlyZXR1cm4gMDsKKworCXJlZ21hcF91cGRhdGVfYml0 cyhhcGJfc3BhcmUsIEFQQl9TUEFSRV9QVV9DQUwsIFBVX0NBTCwKKwkJCSAgIFBVX0NBTCk7CisK KwlyZXQgPSByZWdtYXBfcmVhZF9wb2xsX3RpbWVvdXQoYXBiX3NwYXJlLCBBUEJfU1BBUkVfUkNB TF9IU0lPLAorCQkJCSAgICAgICB2YWwsICh2YWwgJiBBUEJfU1BBUkVfUFVfQ0FMX0RPTkUpLCBQ Q0lFX1BPTExfREVMQVksCisJCQkJICAgICAgIFBVX0NBTF9USU1FT1VUKTsKKworCWlmIChyZXQp CisJCXJlZ21hcF91cGRhdGVfYml0cyhhcGJfc3BhcmUsIEFQQl9TUEFSRV9SQ0FMX0hTSU8sCisJ CQkJICAgUkNBTF9PVlJEX1RSSU1fRU4gfCBSQ0FMX09WUkRfU1RBQkxFX1ZBTCB8CisJCQkJICAg UkNBTF9PVlJEX1RSSU1fTUFTSyB8IFJDQUxfT1ZSRF9TVEFCTEVfRU4sCisJCQkJICAgUkNBTF9P VlJEX1RSSU1fRU4gfCBSQ0FMX09WUkRfU1RBQkxFX1ZBTCB8CisJCQkJICAgRklFTERfUFJFUChS Q0FMX09WUkRfTlRSSU0sIDB4NikgfAorCQkJCSAgIEZJRUxEX1BSRVAoUkNBTF9PVlJEX1BUUklN LCAweGEpIHwKKwkJCQkgICBSQ0FMX09WUkRfU1RBQkxFX0VOKTsKKworCXJldHVybiByZXQ7Cit9 CitFWFBPUlRfU1lNQk9MX0dQTChrM19waHlfY2FsaWJyYXRlKTsKKworTU9EVUxFX0RFU0NSSVBU SU9OKCJTcGFjZW1pVCBLMyBQSFkgY29tbW9uIG9wcyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIp OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waHkvc3BhY2VtaXQvcGh5LWszLWNvbW1vbi5oIGIvZHJp dmVycy9waHkvc3BhY2VtaXQvcGh5LWszLWNvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu ZGV4IDAwMDAwMDAwMDAwMC4uNDkwMDljM2MzMTNhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVy cy9waHkvc3BhY2VtaXQvcGh5LWszLWNvbW1vbi5oCkBAIC0wLDAgKzEsMjcgQEAKKy8qIFNQRFgt TGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkgKi8KKworI2lmbmRlZiBfUEhZX0szX0NP TU1PTl9ICisjZGVmaW5lIF9QSFlfSzNfQ09NTU9OX0gKKworI2luY2x1ZGUgPGxpbnV4L3BoeS9w aHkuaD4KKworc3RydWN0IGszX3BoeV9sYW5lX2dyb3VwX2RhdGEgeworCXUzMiBsYW5lczsKKwl1 OCBjb25maWc7CisJdTggbWFzazsKKwl1MzIgb2Zmc2V0c1tdIF9fY291bnRlZF9ieShsYW5lcyk7 Cit9OworCitzdHJ1Y3QgazNfbGFuZV9ncm91cCB7CisJY29uc3Qgc3RydWN0IGszX3BoeV9sYW5l X2dyb3VwX2RhdGEgKmRhdGE7CisJdm9pZCBfX2lvbWVtICpiYXNlOworCXN0cnVjdCBwaHkgKnBo eTsKKwlib29sIGlzX3BjaWU7Cit9OworCitleHRlcm4gY29uc3Qgc3RydWN0IHBoeV9vcHMgazNf cGNpZV9waHlfb3BzOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBwaHlfb3BzIGszX3VzYjNfcGh5X29w czsKKworaW50IGszX3BoeV9jYWxpYnJhdGUoc3RydWN0IHJlZ21hcCAqYXBiX3NwYXJlKTsKKwor I2VuZGlmCi0tIAoyLjU0LjAKCgotLSAKbGludXgtcGh5IG1haWxpbmcgbGlzdApsaW51eC1waHlA bGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwczovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9s aXN0aW5mby9saW51eC1waHkK 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 A8D9CFF8875 for ; Thu, 30 Apr 2026 02:29:13 +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=dHwSP6WPoN7pl3nvD2bxp5kkXip2+YDmCq4jrVg04hM=; b=JgTj0phalRE7lv sIg85qRTybCvSM43Hw9bVkE+/0L1C9pukXw7KzfEg1glVmp6PE0WqhhWwPBeX6EIOprrY4fYFoKOJ QmYZOgW5Vbjh1oa2jKTKWIt63bpvHb9/aYaueXq1lAy5hEsZPpCr62RbO0M0pF3YQynbL5MYIA7FK c3Mwb3CqYN0daTF2QksxAP4Ggr9zpxqIOfMLptIK4YZDtdwPWL5n0/UAM12j7WrIExTPvZGaF1kFL Nri0JxdqTOWMtuj8PuUAEEpTMpLM672Rgv5OM4CMvx1tGRGTalZU3o0R3i6k+Q0DuXGuOAztOfH/y Q9cIaU0gQT7mEJtIrkyg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98.2 #2 (Red Hat Linux)) id 1wIH9H-00000004SFt-1Guu; Thu, 30 Apr 2026 02:29:07 +0000 Received: from mail-pl1-x629.google.com ([2607:f8b0:4864:20::629]) by bombadil.infradead.org with esmtps (Exim 4.98.2 #2 (Red Hat Linux)) id 1wIH9D-00000004SEI-2WL7 for linux-riscv@lists.infradead.org; Thu, 30 Apr 2026 02:29:05 +0000 Received: by mail-pl1-x629.google.com with SMTP id d9443c01a7336-2b2589c26e3so3234075ad.1 for ; Wed, 29 Apr 2026 19:29:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1777516142; x=1778120942; darn=lists.infradead.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=De//G9K6upZ2sX81StxY7zO4fKEAXMOFhjgiUDQyzhg=; b=Z9jcYLjKq+kTqwt0H7c+jEOY6nSyBdJ414kenK2zCaADgpJZyjomJX8MtUvw6DyKWS P7A3gJO28WQYmH5Igv4hTakGZxuEqBbZ3PBWWh5qpruhT4SCIbG7RMrfHknrjfgzOns7 MXOWdGQc0WzAjsMP4kaMiV/93MEIYTlXQvLKY9SJZM9yi4aJr0sFYjR1l3fwwo7mSfVv t8ed12qNPwXu1H7mCnjQ7RD/3voG7wS/Fqw7vs0Ocyz2NBg4hqOJ7wQFTQaHeFGyLA7K KCegYjtHY7ehqRR0IETbA+MosqWS47/epu+e3Tmt2XyJC6RhTxR19xE0I2NWgAC9snrX aeHA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1777516142; x=1778120942; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=De//G9K6upZ2sX81StxY7zO4fKEAXMOFhjgiUDQyzhg=; b=C5bXZP2xg4b5N7JuFs+Rzr9tEu9+W6xUv3cJ3Rj0skYVVU4T0a8jJ8k+KFYy6tJgrf mJIeXjhiZEc8G0QWqIYAsDAnv65nvo07A6e8Y9dDIEmG1Uienk1Q+vgvUs1NWHrih4a7 K5K/3ZF74lDNGlcpMQujS5qWmM1WTTXWjzCA2frPskDXjNp3UMqDmcb4nHNgNpAL4vez JUuL+W5qhn6rPKQm3HDnIkwyYNvPMTXd0hZTYuyUWFji4SHo9RuhLi09pJpUCFnNNrLB xY5PVhRfL6Mbuzg+tTBMVTKa7tvWyFHrRRxhsJ5vuu12LltJ1N4B70YZKOzR/lnv/IDd NJPg== X-Forwarded-Encrypted: i=1; AFNElJ/EMqkhPNdLyWS0KyXqwGF3SPiD8qYlJZxdieJD0ISWKlTQc411BwX9EiBFYwS2yiAFp4v9Pxxz/Np0Sg==@lists.infradead.org X-Gm-Message-State: AOJu0Yxp110QWZcliPkunrNtTdzNa7S3yAdaU5uJzlvbc4C2m8plaGeO K3uSqoaiMW6UGEV64pT4TOQDZPVD244R1J8Q9VWAHrv5p4uR6mUbOouV X-Gm-Gg: AeBDiesLkkFv5HQdzFc1fLhBmaVoLAlt09pwapswpxHFN6FsN2DY8JN6Ftx4TCSBJy5 GK+a9ZEY+aEkD9vHIAMNIkRH/1I28mHDkvsmDtdiUL9u+0XjE6rDwO5Ox9GQxRgiPmfjoJEBHMM OD99ZPHxpiB3L42ODGyGsiYShyvXV6TzNd8edOeLznAGvgV9bXChPnvDMfZUqzr6C9Q8bMkoax7 +IbOWZx/v6ZgwCZTrZwx98k0wi/xGMmO8iZZp0hJTD+5seW6G+URIpq83Pyvb5fhLCj8PNQhujf Bk+d+X1wCOtIIH6mbOXc6Pq35Uvz5rsxaktmfPWNfcXg1AEH4AH5SCMExhNvxbskT0IFzjUhL/p uz/gWL/IcTJeIJRRasLttP6+iCxfbQFQCwT8a9l9WyaK8tifOxrnZiJxfXqOn5Kr4F3GpnfZtrd 6CIOwN/V4ShGuB1G/8xbU4+y6UKs9tdAZfsQ== X-Received: by 2002:a17:902:ca09:b0:2b0:a980:3687 with SMTP id d9443c01a7336-2b9a230545cmr7474495ad.3.1777516142472; Wed, 29 Apr 2026 19:29:02 -0700 (PDT) Received: from localhost ([2001:19f0:8001:1b2d:5400:5ff:fefa:a95d]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b98895c27csm35959615ad.58.2026.04.29.19.29.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 29 Apr 2026 19:29:02 -0700 (PDT) From: Inochi Amaoto To: Vinod Koul , Neil Armstrong , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Yixun Lan , Kees Cook , "Gustavo A. R. Silva" , Paul Walmsley , Palmer Dabbelt , Albert Ou , Alexandre Ghiti , Inochi Amaoto , Ze Huang , Alex Elder Cc: linux-phy@lists.infradead.org, devicetree@vger.kernel.org, linux-riscv@lists.infradead.org, spacemit@lists.linux.dev, linux-kernel@vger.kernel.org, linux-hardening@vger.kernel.org, Yixun Lan , Longbin Li Subject: [PATCH 2/2] phy: spacemit: Add USB3/PCIe comb PHY driver for Spacemit K3 Date: Thu, 30 Apr 2026 10:28:41 +0800 Message-ID: <20260430022843.1090138-3-inochiama@gmail.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260430022843.1090138-1-inochiama@gmail.com> References: <20260430022843.1090138-1-inochiama@gmail.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20260429_192903_667758_FC2FCDC1 X-CRM114-Status: GOOD ( 25.45 ) 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 VGhlIGNvbWIgUEhZIG9uIEszIHJlcXVpcmVzIHRvIGNvbmZpZ3VyZSBhIHN5c2NvbiBkZXZpY2Ug Zm9yIHRoZQpyaWdodCBtdXggY29uZmlndXJhdGlvbi4gQW5kIGl0IHJlcXVpcmVzIGNhbGlicmF0 aW9uIGJlZm9yZSBhbnkKdXNhZ2UuCgpBZGQgVVNCMy9QQ0llIGNvbWIgUEhZIGRyaXZlciBmb3Ig U3BhY2VtaXQgSzMuCgpTaWduZWQtb2ZmLWJ5OiBJbm9jaGkgQW1hb3RvIDxpbm9jaGlhbWFAZ21h aWwuY29tPgotLS0KIGRyaXZlcnMvcGh5L3NwYWNlbWl0L0tjb25maWcgICAgICAgICAgfCAgMTYg KysKIGRyaXZlcnMvcGh5L3NwYWNlbWl0L01ha2VmaWxlICAgICAgICAgfCAgIDIgKwogZHJpdmVy cy9waHkvc3BhY2VtaXQvcGh5LWszLWNvbWJwaHkuYyB8IDI1MCArKysrKysrKysrKysrKysrCiBk cml2ZXJzL3BoeS9zcGFjZW1pdC9waHktazMtY29tbW9uLmMgIHwgMzk4ICsrKysrKysrKysrKysr KysrKysrKysrKysrCiBkcml2ZXJzL3BoeS9zcGFjZW1pdC9waHktazMtY29tbW9uLmggIHwgIDI3 ICsrCiA1IGZpbGVzIGNoYW5nZWQsIDY5MyBpbnNlcnRpb25zKCspCiBjcmVhdGUgbW9kZSAxMDA2 NDQgZHJpdmVycy9waHkvc3BhY2VtaXQvcGh5LWszLWNvbWJwaHkuYwogY3JlYXRlIG1vZGUgMTAw NjQ0IGRyaXZlcnMvcGh5L3NwYWNlbWl0L3BoeS1rMy1jb21tb24uYwogY3JlYXRlIG1vZGUgMTAw NjQ0IGRyaXZlcnMvcGh5L3NwYWNlbWl0L3BoeS1rMy1jb21tb24uaAoKZGlmZiAtLWdpdCBhL2Ry aXZlcnMvcGh5L3NwYWNlbWl0L0tjb25maWcgYi9kcml2ZXJzL3BoeS9zcGFjZW1pdC9LY29uZmln CmluZGV4IDUwYjAwMDVhY2Y2Ni4uNWZkZjE4ZmNlNDk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bo eS9zcGFjZW1pdC9LY29uZmlnCisrKyBiL2RyaXZlcnMvcGh5L3NwYWNlbWl0L0tjb25maWcKQEAg LTIzLDMgKzIzLDE5IEBAIGNvbmZpZyBQSFlfU1BBQ0VNSVRfSzFfVVNCMgogCWhlbHAKIAkgIEVu YWJsZSB0aGlzIHRvIHN1cHBvcnQgSzEgVVNCIDIuMCBQSFkgZHJpdmVyLiBUaGlzIGRyaXZlciB0 YWtlcyBjYXJlIG9mCiAJICBlbmFibGluZyBhbmQgY2xvY2sgc2V0dXAgYW5kIHdpbGwgYmUgdXNl ZCBieSBLMSB1ZGMvZWhjaS9vdGcveGhjaSBkcml2ZXIuCisKK2NvbmZpZyBQSFlfU1BBQ0VNSVRf SzNfQ09NTU9OX09QUworCXRyaXN0YXRlCisJc2VsZWN0IE1GRF9TWVNDT04KKwlzZWxlY3QgR0VO RVJJQ19QSFkKKworY29uZmlnIFBIWV9TUEFDRU1JVF9LM19DT01CT19QSFkKKwl0cmlzdGF0ZSAi U3BhY2VtaVQgSzMgVVNCMy9QQ0llIFBIWSBzdXBwb3J0IgorCWRlcGVuZHMgb24gKEFSQ0hfU1BB Q0VNSVQgfHwgQ09NUElMRV9URVNUKSAmJiBPRgorCWRlcGVuZHMgb24gQ09NTU9OX0NMSworCXNl bGVjdCBQSFlfU1BBQ0VNSVRfSzNfQ09NTU9OX09QUworCWhlbHAKKwkgIEVuYWJsZSB0aGlzIHRv IHN1cHBvcnQgSzMgVVNCMy9QQ0llIGNvbWJvIFBIWSBkcml2ZXIuIFRoaXMKKwkgIGRyaXZlciB0 YWtlcyBjYXJlIG9mIGVuYWJsaW5nIGFuZCBjbG9jayBzZXR1cCBhbmQgd2lsbCBiZSB1c2VkCisJ ICBieSBLMyBkd2MzIGRyaXZlci4KKwkgIElmIHVuc3VyZSwgc2F5IE4uCmRpZmYgLS1naXQgYS9k cml2ZXJzL3BoeS9zcGFjZW1pdC9NYWtlZmlsZSBiL2RyaXZlcnMvcGh5L3NwYWNlbWl0L01ha2Vm aWxlCmluZGV4IGE4MjFhMjFkNjE0Mi4uNDFiZTdiMDM4OGRhIDEwMDY0NAotLS0gYS9kcml2ZXJz L3BoeS9zcGFjZW1pdC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3BoeS9zcGFjZW1pdC9NYWtlZmls ZQpAQCAtMSwzICsxLDUgQEAKICMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25s eQogb2JqLSQoQ09ORklHX1BIWV9TUEFDRU1JVF9LMV9QQ0lFKQkJKz0gcGh5LWsxLXBjaWUubwog b2JqLSQoQ09ORklHX1BIWV9TUEFDRU1JVF9LMV9VU0IyKQkJKz0gcGh5LWsxLXVzYjIubworb2Jq LSQoQ09ORklHX1BIWV9TUEFDRU1JVF9LM19DT01CT19QSFkpCQkrPSBwaHktazMtY29tYnBoeS5v CitvYmotJChDT05GSUdfUEhZX1NQQUNFTUlUX0szX0NPTU1PTl9PUFMpCSs9IHBoeS1rMy1jb21t b24ubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waHkvc3BhY2VtaXQvcGh5LWszLWNvbWJwaHkuYyBi L2RyaXZlcnMvcGh5L3NwYWNlbWl0L3BoeS1rMy1jb21icGh5LmMKbmV3IGZpbGUgbW9kZSAxMDA2 NDQKaW5kZXggMDAwMDAwMDAwMDAwLi42NmZhNjMzMGFkNmUKLS0tIC9kZXYvbnVsbAorKysgYi9k cml2ZXJzL3BoeS9zcGFjZW1pdC9waHktazMtY29tYnBoeS5jCkBAIC0wLDAgKzEsMjUwIEBACisv LyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5CisvKgorICogcGh5LWszLXVz YjMuYyAtIFNwYWNlbWlUIEszIFR5cGUtQyBPcmllbnRhdGlvbiBTd2l0Y2ggRHJpdmVyCisgKgor ICogQ29weXJpZ2h0IChjKSAyMDI1IFNwYWNlbWlUIFRlY2hub2xvZ3kgQ28uIEx0ZAorICovCisK KyNpbmNsdWRlIDxsaW51eC9iaXRmaWVsZC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5j bHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3N5c2Nvbi5oPgorI2lu Y2x1ZGUgPGxpbnV4L2lvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8 bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5j bHVkZSA8bGludXgvcGh5L3BoeS5oPgorCisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvcGh5L3BoeS5o PgorCisjaW5jbHVkZSAicGh5LWszLWNvbW1vbi5oIgorCisvKgorICogVGhlIFBDSUUvVVNCIFN1 YnN5c3RlbSBvbiBTcGFjZW1pVCBLMyBoYXZlIDMgc2luZ2xlIGxhbmUgUElQRTMgUEhZcworICog KFBIWTIvMy80KSBzaGFyZWQgYnkgUENJRSBQb3J0Qy9EIGFuZCBVU0IzIFBvcnRCL0MvRC4KKyAq CisgKiBQTVVBX1BDSUVfU1VCU1lTX01HTVRbNDowXQorICoKKyAqICAgYml0NCA9IDAgOiBQQ0ll IEEgWDggbW9kZSwgYWxsIDggbGFuZXMgZGVkaWNhdGVkIHRvIFBDSWUgUG9ydCBBCisgKiAgICAg ICAgICAxIDogUEhZIGxhbmVzIHNoYXJlZCBiZXR3ZWVuIFBDSWUgb3IgVVNCIGFjY29yZGluZyB0 byBbMzowXQorICoKKyAqIEFsbCBQSFkgbWF0cml4IGNvbWJpbmF0aW9ucyBhY2NvcmRpbmcgdG8g WzQ6MF06CisgKgorICogICAweDBYIDogUENJZS1BIFg4CisgKiAgIDB4MTAgOiBQQ0llLUMgeDIg KFBIWTIrUEhZMykgKyBQQ0llLUQgeDEgKFBIWTQpCisgKiAgIDB4MTEgOiBQQ0llLUMgeDIgKFBI WTIrUEhZMykgKyBVU0ItRCAoUEhZNCkKKyAqICAgMHgxMiA6IFBDSWUtQyB4MSAoUEhZMikgICAg ICArIFVTQi1DIChQSFkzKQorICogICAweDEzIDogUENJZS1DIHgxIChQSFkyKSAgICAgICsgVVNC LUMgKFBIWTMpICsgVVNCLUQgKFBIWTQpCisgKiAgIDB4MTQgOiBQQ0llLUMgeDEgKFBIWTMpICAg ICAgKyBVU0ItQiAoUEhZMikKKyAqICAgMHgxNSA6IFBDSWUtQyB4MSAoUEhZMykgICAgICArIFVT Qi1CIChQSFkyKSArIFVTQi1EIChQSFk0KQorICogICAweDE2IDogVVNCLUIgKFBIWTIpICsgVVNC LUMgKFBIWTMpICsgUENJZSBEIHgxIChQSFk0KQorICogICAweDE3IDogVVNCLUIgKFBIWTIpICsg VVNCLUMgKFBIWTMpICsgVVNCLUQgKFBIWTQpCisgKgorICogU28gYW55IFVTQiBQb3J0IEIvQy9E IG9wZXJhdGlvbiByZXF1aXJlcyBQQ0llIEEgWDggbW9kZSB0byBiZSBkaXNhYmxlZC4KKyAqLwor I2RlZmluZSBQTVVBX1BDSUVfU1VCU1lTX01HTVQJCTB4MWQ4CisjZGVmaW5lIFBVX01BVFJJWF9D T05GX01BU0sJCUdFTk1BU0soNCwgMCkKKworI2RlZmluZSBDT01CUEhZX01BWF9TVUJQSFlTCQk2 CisKK3N0cnVjdCBrM19jb21iX3BoeSB7CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBr M19sYW5lX2dyb3VwIGdyb3Vwc1tDT01CUEhZX01BWF9TVUJQSFlTXTsKKwl2b2lkIF9faW9tZW0g KmJhc2U7CisJc3RydWN0IHJlZ21hcCAqYXBiX3NwYXJlOworfTsKKworc3RhdGljIGNvbnN0IHN0 cnVjdCBrM19waHlfbGFuZV9ncm91cF9kYXRhIGszX2NvbWJwaHlfbGFuZV9ncm91cDAgPSB7CisJ LmxhbmVzCQk9IDIsCisJLmNvbmZpZwkJPSAweDAwLAorCS5tYXNrCQk9IDB4ZmYsCisJLm9mZnNl dHMJPSB7CisJCTB4MCwgMHg0MDAKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBrM19w aHlfbGFuZV9ncm91cF9kYXRhIGszX2NvbWJwaHlfbGFuZV9ncm91cDEgPSB7CisJLmxhbmVzCQk9 IDIsCisJLmNvbmZpZwkJPSAweDAwLAorCS5tYXNrCQk9IDB4ZmYsCisJLm9mZnNldHMJPSB7CisJ CTB4MTAwMDAwLCAweDEwMDQwMAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGszX3Bo eV9sYW5lX2dyb3VwX2RhdGEgazNfY29tYnBoeV9sYW5lX2dyb3VwMiA9IHsKKwkubGFuZXMJCT0g MSwKKwkuY29uZmlnCQk9IDB4MTQsCisJLm1hc2sJCT0gMHgxNCwKKwkub2Zmc2V0cwk9IHsKKwkJ MHgyMDAwMDAKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBrM19waHlfbGFuZV9ncm91 cF9kYXRhIGszX2NvbWJwaHlfbGFuZV9ncm91cDMgPSB7CisJLmxhbmVzCQk9IDEsCisJLmNvbmZp ZwkJPSAweDEyLAorCS5tYXNrCQk9IDB4MTIsCisJLm9mZnNldHMJPSB7CisJCTB4MzAwMDAwCisJ fSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgazNfcGh5X2xhbmVfZ3JvdXBfZGF0YSBrM19j b21icGh5X2xhbmVfZ3JvdXA0ID0geworCS5sYW5lcwkJPSAxLAorCS5jb25maWcJCT0gMHgxMSwK KwkubWFzawkJPSAweDExLAorCS5vZmZzZXRzCT0geworCQkweDQwMDAwMAorCX0sCit9OworCitz dGF0aWMgY29uc3Qgc3RydWN0IGszX3BoeV9sYW5lX2dyb3VwX2RhdGEgazNfY29tYnBoeV9sYW5l X2dyb3VwNSA9IHsKKwkubGFuZXMJCT0gMSwKKwkuY29uZmlnCQk9IDB4MDAsCisJLm1hc2sJCT0g MHhmZiwKKwkub2Zmc2V0cwk9IHsKKwkJMHg1MDAwMDAKKwl9LAorfTsKKworc3RhdGljIGNvbnN0 IHN0cnVjdCBrM19waHlfbGFuZV9ncm91cF9kYXRhICprM19jb21icGh5X2xhbmVfZGF0YXNbXSA9 IHsKKwkmazNfY29tYnBoeV9sYW5lX2dyb3VwMCwKKwkmazNfY29tYnBoeV9sYW5lX2dyb3VwMSwK KwkmazNfY29tYnBoeV9sYW5lX2dyb3VwMiwKKwkmazNfY29tYnBoeV9sYW5lX2dyb3VwMywKKwkm azNfY29tYnBoeV9sYW5lX2dyb3VwNCwKKwkmazNfY29tYnBoeV9sYW5lX2dyb3VwNSwKK307CisK K3N0YXRpYyBpbnQgazNfY29tYl9waHlfaW5pdF9sYW5lcyhzdHJ1Y3QgazNfY29tYl9waHkgKnBo eSwgdW5zaWduZWQgaW50IGNvbmZpZykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBB UlJBWV9TSVpFKGszX2NvbWJwaHlfbGFuZV9kYXRhcyk7IGkrKykgeworCQljb25zdCBzdHJ1Y3Qg azNfcGh5X2xhbmVfZ3JvdXBfZGF0YSAqZGF0YSA9IGszX2NvbWJwaHlfbGFuZV9kYXRhc1tpXTsK KwkJc3RydWN0IGszX2xhbmVfZ3JvdXAgKmxnID0gJnBoeS0+Z3JvdXBzW2ldOworCQljb25zdCBz dHJ1Y3QgcGh5X29wcyAqb3BzOworCQlib29sIGlzX3VzYjsKKworCQlpc191c2IgPSAoZGF0YS0+ bWFzayAmIGNvbmZpZykgPT0gZGF0YS0+Y29uZmlnOworCQlpZiAoaXNfdXNiKQorCQkJb3BzID0g JmszX3VzYjNfcGh5X29wczsKKwkJZWxzZQorCQkJb3BzID0gJmszX3BjaWVfcGh5X29wczsKKwor CQlsZy0+cGh5ID0gZGV2bV9waHlfY3JlYXRlKHBoeS0+ZGV2LCBOVUxMLCBvcHMpOworCQlpZiAo SVNfRVJSKGxnLT5waHkpKQorCQkJcmV0dXJuIFBUUl9FUlIobGctPnBoeSk7CisKKwkJbGctPmlz X3BjaWUgPSAhaXNfdXNiOworCQlsZy0+ZGF0YSA9IGRhdGE7CisJCWxnLT5iYXNlID0gcGh5LT5i YXNlOworCQlwaHlfc2V0X2RydmRhdGEobGctPnBoeSwgbGcpOworCX0KKworCXJldHVybiAwOwor fQorCitzdGF0aWMgaW50IGszX2NvbWJfcGh5X3VwZGF0ZV9jb25maWcoc3RydWN0IHJlZ21hcCAq YXBtdSwgdW5zaWduZWQgaW50IGNvbmZpZykKK3sKKwlpZiAoY29uZmlnICYgflBVX01BVFJJWF9D T05GX01BU0spCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0 cyhhcG11LCBQTVVBX1BDSUVfU1VCU1lTX01HTVQsIFBVX01BVFJJWF9DT05GX01BU0ssIGNvbmZp Zyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGh5ICprM19jb21iX3BoeV94bGF0ZShzdHJ1Y3QgZGV2 aWNlICpkZXYsIGNvbnN0IHN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgKmFyZ3MpCit7CisJc3RydWN0 IGszX2NvbWJfcGh5ICpwaHkgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgazNfbGFu ZV9ncm91cCAqbGc7CisKKwlpZiAoYXJncy0+YXJnc19jb3VudCAhPSAyKSB7CisJCWRldl9lcnIo ZGV2LCAiSW52YWxpZCBudW1iZXIgb2YgYXJndW1lbnRzXG4iKTsKKwkJcmV0dXJuIEVSUl9QVFIo LUVJTlZBTCk7CisJfQorCisJaWYgKGFyZ3MtPmFyZ3NbMF0gPj0gQVJSQVlfU0laRShrM19jb21i cGh5X2xhbmVfZGF0YXMpKSB7CisJCWRldl9lcnIoZGV2LCAiSW52YWxpZCBQSFkgaWRcbiIpOwor CQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwl9CisKKwlsZyA9ICZwaHktPmdyb3Vwc1thcmdz LT5hcmdzWzBdXTsKKworCWlmICgobGctPmlzX3BjaWUgJiYgYXJncy0+YXJnc1sxXSAhPSBQSFlf VFlQRV9QQ0lFKSB8fAorCSAgICAoIWxnLT5pc19wY2llICYmIGFyZ3MtPmFyZ3NbMV0gIT0gUEhZ X1RZUEVfVVNCMykpIHsKKwkJZGV2X2VycihkZXYsICJJbnZhbGlkIFBIWSBtb2RlXG4iKTsKKwkJ cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQorCisJcmV0dXJuIGxnLT5waHk7Cit9CisKK3N0 YXRpYyBpbnQgazNfY29tYl9waHlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikK K3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBkZXZpY2Vfbm9k ZSAqbm9kZSA9IGRldi0+b2Zfbm9kZTsKKwlzdHJ1Y3QgcGh5X3Byb3ZpZGVyICpwcm92aWRlcjsK KwlzdHJ1Y3QgazNfY29tYl9waHkgKnBoeTsKKwlzdHJ1Y3QgcmVnbWFwICphcG11OworCXUzMiBj b25maWcgPSAwOworCWludCByZXQ7CisKKwlwaHkgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2Yo KnBoeSksIEdGUF9LRVJORUwpOworCWlmICghcGh5KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBo eS0+YmFzZSA9IGRldm1fcGxhdGZvcm1faW9yZW1hcF9yZXNvdXJjZShwZGV2LCAwKTsKKwlpZiAo SVNfRVJSKHBoeS0+YmFzZSkpCisJCXJldHVybiBQVFJfRVJSKHBoeS0+YmFzZSk7CisKKwlwaHkt PmFwYl9zcGFyZSA9IHN5c2Nvbl9yZWdtYXBfbG9va3VwX2J5X3BoYW5kbGUobm9kZSwgInNwYWNl bWl0LGFwYi1zcGFyZSIpOworCWlmIChJU19FUlIocGh5LT5hcGJfc3BhcmUpKQorCQlyZXR1cm4g ZGV2X2Vycl9wcm9iZShkZXYsIFBUUl9FUlIocGh5LT5hcGJfc3BhcmUpLAorCQkJCSAgICAgIkZh aWxlZCB0byBmaW5lIEFQQiBTUEFSRSBzeXNjb24iKTsKKworCWFwbXUgPSBzeXNjb25fcmVnbWFw X2xvb2t1cF9ieV9waGFuZGxlX2FyZ3Mobm9kZSwgInNwYWNlbWl0LGFwbXUiLCAxLCAmY29uZmln KTsKKwlpZiAoSVNfRVJSKGFwbXUpKQorCQlyZXR1cm4gZGV2X2Vycl9wcm9iZShkZXYsIFBUUl9F UlIocGh5LT5hcGJfc3BhcmUpLAorCQkJCSAgICAgIkZhaWxlZCB0byBmaW5lIEFQTVUgc3lzY29u Iik7CisKKwlyZXQgPSBrM19jb21iX3BoeV91cGRhdGVfY29uZmlnKGFwbXUsIGNvbmZpZyk7CisJ aWYgKHJldCA8IDApCisJCXJldHVybiBkZXZfZXJyX3Byb2JlKGRldiwgcmV0LCAiRmFpbGVkIHRv IHNldCBsYW5lIGNvbmZpZ3VyYXRpb24iKTsKKworCXBoeS0+ZGV2ID0gZGV2OworCXBsYXRmb3Jt X3NldF9kcnZkYXRhKHBkZXYsIHBoeSk7CisKKwlyZXQgPSBrM19waHlfY2FsaWJyYXRlKHBoeS0+ YXBiX3NwYXJlKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIGRldl9lcnJfcHJvYmUoZGV2LCBy ZXQsICJGYWlsZWQgdG8gY2FsaWJyYXRlIHBoeSIpOworCisJcmV0ID0gazNfY29tYl9waHlfaW5p dF9sYW5lcyhwaHksIGNvbmZpZyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiBkZXZfZXJyX3By b2JlKGRldiwgcmV0LCAiRmFpbGVkIHRvIGluaXQgbGFuZXMiKTsKKworCXByb3ZpZGVyID0gZGV2 bV9vZl9waHlfcHJvdmlkZXJfcmVnaXN0ZXIoZGV2LCBrM19jb21iX3BoeV94bGF0ZSk7CisJaWYg KElTX0VSUihwcm92aWRlcikpCisJCXJldHVybiBkZXZfZXJyX3Byb2JlKGRldiwgUFRSX0VSUihw cm92aWRlciksCisJCQkJICAgICAiRmFpbGVkIHRvIHJlZ2lzdGVyIHByb3ZpZGVyXG4iKTsKKwor CXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBrM19jb21i X3BoeV9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAic3BhY2VtaXQsazMtY29tYi1w aHkiIH0sCisJeyB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGszX2NvbWJfcGh5X29m X21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgazNfY29tYl9waHlfZHJp dmVyID0geworCS5wcm9iZSA9IGszX2NvbWJfcGh5X3Byb2JlLAorCS5kcml2ZXIgPSB7CisJCS5u YW1lID0gInNwYWNlbWl0LGszLWNvbWItcGh5IiwKKwkJLm9mX21hdGNoX3RhYmxlID0gazNfY29t Yl9waHlfb2ZfbWF0Y2gsCisJfSwKK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGszX2NvbWJf cGh5X2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiU3BhY2VtaVQgSzMgVVNCMy9QQ0ll IGNvbWIgUEhZIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEv ZHJpdmVycy9waHkvc3BhY2VtaXQvcGh5LWszLWNvbW1vbi5jIGIvZHJpdmVycy9waHkvc3BhY2Vt aXQvcGh5LWszLWNvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAw MC4uNzdjNGI0MDczYjk2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9waHkvc3BhY2VtaXQv cGh5LWszLWNvbW1vbi5jCkBAIC0wLDAgKzEsMzk4IEBACisvLyBTUERYLUxpY2Vuc2UtSWRlbnRp ZmllcjogR1BMLTIuMC1vbmx5CisKKyNpbmNsdWRlIDxsaW51eC9iaXRmaWVsZC5oPgorI2luY2x1 ZGUgPGxpbnV4L2NsZWFudXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxp bnV4L2lvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4 L3JlZ21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorCisjaW5jbHVkZSA8ZHQtYmluZGlu Z3MvcGh5L3BoeS5oPgorCisjaW5jbHVkZSAicGh5LWszLWNvbW1vbi5oIgorCisvKiBQSFkgUmVn aXN0ZXJzICovCisjZGVmaW5lIFBIWV9WRVJTSU9OCQkJMHgwCisKKyNkZWZpbmUgUEhZX1JFU0VU X0NGRwkJCTB4MDQKKworI2RlZmluZSBQSFlfUkVTRVRfUlhCVUZfUlNUCQlCSVQoMCkKKyNkZWZp bmUgUEhZX1JFU0VUX1NPRlRfUlNUX1BDUwkJQklUKDEpCisjZGVmaW5lIFBIWV9SRVNFVF9TT0ZU X1JTVF9BSEIJCUJJVCgyKQorI2RlZmluZSBQSFlfUkVTRVRfRU5fU0RfQUZURVJfTE9DSwlCSVQo NikKKworI2RlZmluZSBQSFlfQ0xLX0NGRwkJCTB4MDgKKworI2RlZmluZSBQSFlfQ0xLX1BMTF9S RUFEWQkJQklUKDApCisjZGVmaW5lIFBIWV9DTEtfVFhDTEtfSU5WCQlCSVQoMikKKyNkZWZpbmUg UEhZX0NMS19SWENMS19FTgkJQklUKDMpCisjZGVmaW5lIFBIWV9DTEtfVFhDTEtfRU4JCUJJVCg0 KQorI2RlZmluZSBQSFlfQ0xLX1BDTEtfRU4JCQlCSVQoNSkKKyNkZWZpbmUgUEhZX0NMS19QSVBF X1BDTEtfRU4JCUJJVCg2KQorI2RlZmluZSBQSFlfQ0xLX1JFRkNMS19GUkVRCQlHRU5NQVNLKDEw LCA3KQorI2RlZmluZSBQSFlfQ0xLX1JFRkNMS18yNE0JCTIKKyNkZWZpbmUgUEhZX0NMS19TV19J TklUX0RPTkUJCUJJVCgxMSkKKyNkZWZpbmUgUEhZX0NMS19QVV9TU0NfT1VUCQlCSVQoMjMpCisK KyNkZWZpbmUgUEhZX01PREVfQ0ZHCQkJMHgwQworCisjZGVmaW5lIFBIWV9NT0RFX1BDSUVfSU5U X0VOCQlCSVQoMCkKKyNkZWZpbmUgUEhZX01PREVfTEZQU19UUEVSSU9ECQlHRU5NQVNLKDksIDgp CisjZGVmaW5lIFBIWV9NT0RFX0xGUFNfVFBFUklPRF9VU0IJMworCisjZGVmaW5lIFBIWV9QVV9T RUwJCQkweDQwCisKKyNkZWZpbmUgUEhZX1BVX0NGR19TVEFUVVMJCUJJVCg5KQorI2RlZmluZSBQ SFlfUFVfT1ZSRF9TVEFUVVMJCUJJVCgxMCkKKworI2RlZmluZSBQSFlfUFVfQ0tfUkVHCQkJMHg1 NAorCisjZGVmaW5lIFBIWV9QVV9SRUZDTEtfMTAwCQlCSVQoMjUpCisKKyNkZWZpbmUgUEhZX1BM TF9SRUcxCQkJMHg1OAorCisjZGVmaW5lIFBIWV9QTExfRlJFRl9TRUwJCUdFTk1BU0soMTUsIDEz KQorI2RlZmluZSBQSFlfUExMX0ZSRUZfMjRNCQkweDEKKyNkZWZpbmUgUEhZX1BMTF9TU0NfREVQ X1NFTAkJR0VOTUFTSygyNywgMjQpCisjZGVmaW5lIFBIWV9QTExfU1NDXzUwMDBQUE0JCTB4YQor I2RlZmluZSBQSFlfUExMX1NTQ19NT0RFCQlHRU5NQVNLKDI5LCAyOCkKKyNkZWZpbmUgUEhZX1BM TF9TU0NfTU9ERV9DRU5URVJfU1BSRUFECTAKKyNkZWZpbmUgUEhZX1BMTF9TU0NfTU9ERV9VUF9T UFJFQUQJMQorI2RlZmluZSBQSFlfUExMX1NTQ19NT0RFX0RPV05fU1BSRUFECTIKKyNkZWZpbmUg UEhZX1BMTF9TU0NfTU9ERV9ET1dOX1NQUkVBRDEJMworCisjZGVmaW5lIFBIWV9QTExfUkVHMgkJ CTB4NWMKKworI2RlZmluZSBQSFlfUExMX1NFTF9SRUYxMDAJCUJJVCgyMSkKKworLyogUEhZIFJY IFJlZ2lzdGVyIERlZmluaXRpb25zICovCisjZGVmaW5lIFBIWV9SWF9SRUdfQQkJCTB4NjAKKwor I2RlZmluZSBQSFlfUlhfUkVHMF9STE9BRAkJQklUKDQpCisjZGVmaW5lIFBIWV9SWF9SRUcxX1JU RVJNCQlHRU5NQVNLKDExLCA4KQorI2RlZmluZSBQSFlfUlhfUkVHMV9SQ19DQUxJCQlHRU5NQVNL KDE1LCAxMikKKyNkZWZpbmUgUEhZX1JYX1JFRzJfQ1NFTAkJR0VOTUFTSygxOSwgMTYpCisjZGVm aW5lIFBIWV9SWF9SRUcyX0ZPUkNFX0NTRUwJCUJJVCgyMCkKKyNkZWZpbmUgUEhZX1JYX1JFRzJf UFNFTAkJR0VOTUFTSygyMywgMjEpCisjZGVmaW5lIFBIWV9SWF9SRUczX0lfTE9BRAkJR0VOTUFT SygyNiwgMjQpCisjZGVmaW5lIFBIWV9SWF9SRUczX1NFTF9DQk9PU1RfQ09ERQlCSVQoMjcpCisj ZGVmaW5lIFBIWV9SWF9SRUczX0FESl9CSUFTCQlHRU5NQVNLKDI5LCAyOCkKKyNkZWZpbmUgUEhZ X1JYX1JFRzNfUkRFRzEJCUdFTk1BU0soMzEsIDMwKQorCisjZGVmaW5lIFBIWV9SWF9SRUdfQgkJ CTB4NjQKKworI2RlZmluZSBQSFlfUlhfUkVHQl9NQVNLCQlHRU5NQVNLKDIzLCAwKQorCisjZGVm aW5lIFBIWV9SWF9SRUc0X1JERUcyCQlHRU5NQVNLKDIsIDEpCisjZGVmaW5lIFBIWV9SWF9SRUc0 X0VOVk9TCQlCSVQoNCkKKyNkZWZpbmUgUEhZX1JYX1JFRzRfUlRFUk1fU0VMCQlCSVQoNSkKKyNk ZWZpbmUgUEhZX1JYX1JFRzRfTUFOVUFMX0NGRwkJQklUKDcpCisjZGVmaW5lIFBIWV9SWF9SRUc1 X1JDRUxMX1ZDTQkJR0VOTUFTSygxMSwgOCkKKyNkZWZpbmUgUEhZX1JYX1JFRzVfUkNFTExfQklB UwkJR0VOTUFTSygxNSwgMTIpCisjZGVmaW5lIFBIWV9SWF9SRUc2X0gxX1JFRwkJR0VOTUFTSygx OSwgMTYpCisjZGVmaW5lIFBIWV9SWF9SRUc2X0FEQVBUX0dBSU4JCUdFTk1BU0soMjEsIDIwKQor I2RlZmluZSBQSFlfUlhfUkVHNl9CWVBBU1NfQURQVAkJQklUKDIyKQorCisjZGVmaW5lIFBIWV9B RFBUX0NGRzAJCQkweDE0MAorI2RlZmluZSBQSFlfQURQVF9BRkVfUlNUX09WUkRfRU4JQklUKDEp CisjZGVmaW5lIFBIWV9BRFBUX0FGRV9SU1RfT1ZSRF9WQUwJQklUKDQpCisKKyNkZWZpbmUgUEhZ X1JYRVFfVElNRQkJCTB4YjQKKyNkZWZpbmUgUEhZX1JYRVFfVElNRV9PVlJEX1BPU1RfQ19TT0MJ QklUKDIxKQorI2RlZmluZSBQSFlfUlhFUV9USU1FX0NGR19BTVBfU09DCUdFTk1BU0soMjMsIDIy KQorI2RlZmluZSBQSFlfUlhFUV9USU1FX0FNUF9TT0NfNjUwTQkwCisjZGVmaW5lIFBIWV9SWEVR X1RJTUVfQU1QX1NPQ184MDBNCTEKKyNkZWZpbmUgUEhZX1JYRVFfVElNRV9BTVBfU09DXzg3ME0J MgorI2RlZmluZSBQSFlfUlhFUV9USU1FX0FNUF9TT0NfOTAwTQkzCisjZGVmaW5lIFBIWV9SWEVR X1RJTUVfT1ZSRF9BTVBfU09DCUJJVCgyNCkKKworI2RlZmluZSBQQ0lFX1BVX0FERFJfQ0xLX0NG RwkJMHgwMDA4CisjZGVmaW5lIFBIWV9DTEtfUExMX1JFQURZCQlCSVQoMCkKKyNkZWZpbmUgUENJ RV9JTklUQUxfVElNRVIJCUdFTk1BU0soNiwgMykKKyNkZWZpbmUgQ0ZHX0lOVEVSTkFMX1RJTUVS X0FESgkJR0VOTUFTSygxMCwgNykKKyNkZWZpbmUgQ0ZHX1NXX1BIWV9JTklUX0RPTkUJCUJJVCgx MSkKKworLyogTGFuZSBSWC9UWCBjb25maWd1cmF0aW9uIChwZXLigJFsYW5lLCBhdCBsYW5lX2Jh c2UpICovCisjZGVmaW5lIFBDSUVfUlhfUkVHMQkJCTB4MDUwCisjZGVmaW5lIFBDSUVfVFhfUkVH MQkJCTB4MDY0CisKKyNkZWZpbmUgUENJRV9QTExfVElNRU9VVAkJNTAwMDAwCisjZGVmaW5lIFBD SUVfUE9MTF9ERUxBWQkJCTUwMAorCitzdGF0aWMgaW50IGszX3VzYjNwaHlfaW5pdF9zaW5nbGUo c3RydWN0IGszX2xhbmVfZ3JvdXAgKmxnLCB2b2lkIF9faW9tZW0gKmJhc2UpCit7CisJc3RydWN0 IHBoeSAqcGh5ID0gbGctPnBoeTsKKwl1MzIgdmFsLCB0bXA7CisJaW50IHJldDsKKworCXZhbCA9 IHJlYWRsKGJhc2UgKyBQSFlfUFVfU0VMKTsKKwl2YWwgPSB1MzJfcmVwbGFjZV9iaXRzKHZhbCwg MCwgUEhZX1BVX0NGR19TVEFUVVMpOworCXZhbCB8PSBQSFlfUFVfT1ZSRF9TVEFUVVM7CisJd3Jp dGVsKHZhbCwgYmFzZSArIFBIWV9QVV9TRUwpOworCisJdWRlbGF5KDIwMCk7CisKKwkvKiBEbyBu b3Qgd2FpdCBDRFIgbG9jayBiZWZvcmUgc2FtcGxpbmcgZGF0YSAqLworCXZhbCA9IHJlYWRsKGJh c2UgKyBQSFlfUkVTRVRfQ0ZHKTsKKwl2YWwgPSB1MzJfcmVwbGFjZV9iaXRzKHZhbCwgMCwgUEhZ X1JFU0VUX0VOX1NEX0FGVEVSX0xPQ0spOworCXdyaXRlbCh2YWwsIGJhc2UgKyBQSFlfUkVTRVRf Q0ZHKTsKKworCS8qIFBvd2VyIGRvd24gMTAwTUh6IHJlZmNsayBidWZmZXIgKi8KKwl2YWwgPSBy ZWFkbChiYXNlICsgUEhZX1BVX0NLX1JFRyk7CisJdmFsID0gdTMyX3JlcGxhY2VfYml0cyh2YWws IDAsIFBIWV9QVV9SRUZDTEtfMTAwKTsKKwl3cml0ZWwodmFsLCBiYXNlICsgUEhZX1BVX0NLX1JF Ryk7CisKKwkvKiBQcm9ncmFtIFBMTCBSRUcxIGNvbmZpZ3VyZSB0aGUgU1NDICovCisJdmFsID0g RklFTERfUFJFUChQSFlfUExMX1NTQ19NT0RFLCBQSFlfUExMX1NTQ19NT0RFX0RPV05fU1BSRUFE MSkgfAorCSAgICAgIEZJRUxEX1BSRVAoUEhZX1BMTF9TU0NfREVQX1NFTCwgUEhZX1BMTF9TU0Nf NTAwMFBQTSkgfAorCSAgICAgIEZJRUxEX1BSRVAoUEhZX1BMTF9GUkVGX1NFTCwgUEhZX1BMTF9G UkVGXzI0TSk7CisJd3JpdGVsKHZhbCwgYmFzZSArIFBIWV9QTExfUkVHMSk7CisKKwkvKiBVbi1z ZWxlY3QgMTAwTUh6IFBMTCByZWZlcmVuY2UgKi8KKwl2YWwgPSByZWFkbChiYXNlICsgUEhZX1BM TF9SRUcyKTsKKwl2YWwgPSB1MzJfcmVwbGFjZV9iaXRzKHZhbCwgMCwgUEhZX1BMTF9TRUxfUkVG MTAwKTsKKwl3cml0ZWwodmFsLCBiYXNlICsgUEhZX1BMTF9SRUcyKTsKKworCS8qIFVTQiBMRlBT IHBlcmlvZCBjb25maWd1cmF0aW9uICovCisJdmFsID0gcmVhZGwoYmFzZSArIFBIWV9NT0RFX0NG Ryk7CisJdmFsID0gdTMyX3JlcGxhY2VfYml0cyh2YWwsIFBIWV9NT0RFX0xGUFNfVFBFUklPRF9V U0IsIFBIWV9NT0RFX0xGUFNfVFBFUklPRCk7CisJd3JpdGVsKHZhbCwgYmFzZSArIFBIWV9NT0RF X0NGRyk7CisKKwkvKiBGb3JjZSBBRkUgYWRhcHRhdGlvbiByZXNldCAqLworCXZhbCA9IHJlYWRs KGJhc2UgKyBQSFlfQURQVF9DRkcwKTsKKwl2YWwgfD0gUEhZX0FEUFRfQUZFX1JTVF9PVlJEX0VO IHwgUEhZX0FEUFRfQUZFX1JTVF9PVlJEX1ZBTDsKKwl3cml0ZWwodmFsLCBiYXNlICsgUEhZX0FE UFRfQ0ZHMCk7CisKKwkvKiBPdmVycmlkZSBkcml2ZXIgYW1wbGl0dWRlIHZhbHVlIHRvIDkwMG0g Ki8KKwl2YWwgPSByZWFkbChiYXNlICsgUEhZX1JYRVFfVElNRSk7CisJdmFsIHw9IFBIWV9SWEVR X1RJTUVfT1ZSRF9BTVBfU09DOworCXZhbCA9IHUzMl9yZXBsYWNlX2JpdHModmFsLCBQSFlfUlhF UV9USU1FX0FNUF9TT0NfOTAwTSwgUEhZX1JYRVFfVElNRV9DRkdfQU1QX1NPQyk7CisJd3JpdGVs KHZhbCwgYmFzZSArIFBIWV9SWEVRX1RJTUUpOworCisJLyogQ29uZmlndXJlIFJYIHBhcmFtZXRl cnMgKi8KKwl2YWwgPSBQSFlfUlhfUkVHMF9STE9BRCB8CisJCUZJRUxEX1BSRVAoUEhZX1JYX1JF RzFfUlRFUk0sIDB4OCkgfAorCQlGSUVMRF9QUkVQKFBIWV9SWF9SRUcxX1JDX0NBTEksIDB4Nykg fAorCQlGSUVMRF9QUkVQKFBIWV9SWF9SRUcyX0NTRUwsIDB4OCkgfAorCQlQSFlfUlhfUkVHMl9G T1JDRV9DU0VMIHwKKwkJRklFTERfUFJFUChQSFlfUlhfUkVHMl9QU0VMLCAweDQpIHwKKwkJRklF TERfUFJFUChQSFlfUlhfUkVHM19JX0xPQUQsIDB4NykgfAorCQlQSFlfUlhfUkVHM19TRUxfQ0JP T1NUX0NPREUgfAorCQlGSUVMRF9QUkVQKFBIWV9SWF9SRUczX0FESl9CSUFTLCAweDEpIHwKKwkJ RklFTERfUFJFUChQSFlfUlhfUkVHM19SREVHMSwgMHgzKTsKKwl3cml0ZWwodmFsLCBiYXNlICsg UEhZX1JYX1JFR19BKTsKKworCXZhbCA9IHJlYWRsKGJhc2UgKyBQSFlfUlhfUkVHX0IpOworCXRt cCA9IEZJRUxEX1BSRVAoUEhZX1JYX1JFRzRfUkRFRzIsIDB4MikgfAorCQlQSFlfUlhfUkVHNF9F TlZPUyB8IFBIWV9SWF9SRUc0X1JURVJNX1NFTCB8IFBIWV9SWF9SRUc0X01BTlVBTF9DRkcgfAor CQlGSUVMRF9QUkVQKFBIWV9SWF9SRUc1X1JDRUxMX1ZDTSwgMHg4KSB8CisJCUZJRUxEX1BSRVAo UEhZX1JYX1JFRzVfUkNFTExfQklBUywgMHg4KSB8CisJCUZJRUxEX1BSRVAoUEhZX1JYX1JFRzZf SDFfUkVHLCAweDgpIHwKKwkJRklFTERfUFJFUChQSFlfUlhfUkVHNl9BREFQVF9HQUlOLCAweDIp OworCXZhbCA9IHUzMl9yZXBsYWNlX2JpdHModmFsLCB0bXAsIFBIWV9SWF9SRUdCX01BU0spOwor CXdyaXRlbCh2YWwsIGJhc2UgKyBQSFlfUlhfUkVHX0IpOworCisJLyoKKwkgKiBJbmZvcm0gUEhZ IHRoYXQgYWxsIFBMTC1yZWxhdGVkIGNvbmZpZ3VyYXRpb24gaXMgZG9uZS4KKwkgKiBQTEwgd2ls bCBub3Qgc3RhcnQgbG9ja2luZyB1bnRpbCBQSFlfQ0xLX1NXX0lOSVRfRE9ORSBpcyBzZXQuCisJ ICovCisJdmFsID0gUEhZX0NMS19TV19JTklUX0RPTkUgfCBQSFlfQ0xLX1BVX1NTQ19PVVQgfAor CSAgICAgIEZJRUxEX1BSRVAoUEhZX0NMS19SRUZDTEtfRlJFUSwgUEhZX0NMS19SRUZDTEtfMjRN KSB8CisJICAgICAgUEhZX0NMS19SWENMS19FTiB8IFBIWV9DTEtfVFhDTEtfRU4gfAorCSAgICAg IFBIWV9DTEtfUENMS19FTiB8IFBIWV9DTEtfUElQRV9QQ0xLX0VOOworCXdyaXRlbCh2YWwsIGJh c2UgKyBQSFlfQ0xLX0NGRyk7CisKKwlyZXQgPSByZWFkbF9wb2xsX3RpbWVvdXQoYmFzZSArIFBI WV9DTEtfQ0ZHLCB2YWwsCisJCQkJICh2YWwgJiBQSFlfQ0xLX1BMTF9SRUFEWSksCisJCQkJIFBD SUVfUE9MTF9ERUxBWSwgUENJRV9QTExfVElNRU9VVCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJy KCZwaHktPmRldiwgIlBIWSBQTEwgcG9sbGluZyB0aW1lb3V0XG4iKTsKKwkJcmV0dXJuIHJldDsK Kwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBrM191c2IzcGh5X2luaXQoc3RydWN0 IHBoeSAqcGh5KQoreworCXN0cnVjdCBrM19sYW5lX2dyb3VwICpsZyA9IHBoeV9nZXRfZHJ2ZGF0 YShwaHkpOworCWludCByZXQsIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGctPmRhdGEtPmxhbmVz OyBpKyspIHsKKwkJcmV0ID0gazNfdXNiM3BoeV9pbml0X3NpbmdsZShsZywgbGctPmJhc2UgKyBs Zy0+ZGF0YS0+b2Zmc2V0c1tpXSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9 CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBrM191c2IzcGh5X3NldF9zcGVlZChzdHJ1 Y3QgcGh5ICpwaHksIGludCBzcGVlZCkKK3sKKwlzdHJ1Y3QgazNfbGFuZV9ncm91cCAqbGcgPSBw aHlfZ2V0X2RydmRhdGEocGh5KTsKKwl2b2lkIF9faW9tZW0gKmJhc2UgPSBsZy0+YmFzZSArIGxn LT5kYXRhLT5vZmZzZXRzWzBdOworCXUzMiB2YWw7CisKKwlpZiAoc3BlZWQgPT0gVVNCX1NQRUVE X0hJR0gpIHsKKwkJdmFsID0gcmVhZGwoYmFzZSArIFBIWV9QVV9TRUwpOworCQl2YWwgPSB1MzJf cmVwbGFjZV9iaXRzKHZhbCwgMCwgUEhZX1BVX0NGR19TVEFUVVMpOworCQl2YWwgfD0gUEhZX1BV X09WUkRfU1RBVFVTOworCQl3cml0ZWwodmFsLCBiYXNlICsgUEhZX1BVX1NFTCk7CisKKwkJdWRl bGF5KDIwMCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2NvbnN0IHN0cnVjdCBwaHlfb3BzIGsz X3VzYjNfcGh5X29wcyA9IHsKKwkuaW5pdCA9IGszX3VzYjNwaHlfaW5pdCwKKwkuc2V0X3NwZWVk ID0gazNfdXNiM3BoeV9zZXRfc3BlZWQsCisJLm93bmVyID0gVEhJU19NT0RVTEUsCit9OworRVhQ T1JUX1NZTUJPTF9HUEwoazNfdXNiM19waHlfb3BzKTsKKworc3RhdGljIGludCBrM19wY2llX3Bo eV9pbml0KHN0cnVjdCBwaHkgKnBoeSkKK3sKKwlzdHJ1Y3QgazNfbGFuZV9ncm91cCAqbGcgPSBw aHlfZ2V0X2RydmRhdGEocGh5KTsKKwl2b2lkIF9faW9tZW0gKnBoeV9iYXNlID0gbGctPmJhc2Ug KyBsZy0+ZGF0YS0+b2Zmc2V0c1swXTsKKwl1MzIgdmFsOworCWludCByZXQ7CisJaW50IGk7CisK Kwl2YWwgPSByZWFkbChwaHlfYmFzZSArIFBIWV9QTExfUkVHMSk7CisJdmFsID0gdTMyX3JlcGxh Y2VfYml0cyh2YWwsIDB4MiwgR0VOTUFTSygxNSwgMTIpKTsKKwl3cml0ZWwodmFsLCBwaHlfYmFz ZSArIFBIWV9QTExfUkVHMSk7CisKKwl2YWwgPSByZWFkbChwaHlfYmFzZSArIFBIWV9QTExfUkVH Mik7CisJdmFsID0gdTMyX3JlcGxhY2VfYml0cyh2YWwsIDAsIEJJVCgyMSkpOworCXdyaXRlbCh2 YWwsIHBoeV9iYXNlICsgUEhZX1BMTF9SRUcyKTsKKworCWZvciAoaSA9IDA7IGkgPCBsZy0+ZGF0 YS0+bGFuZXM7IGkrKykgeworCQl2b2lkIF9faW9tZW0gKmxhbmVfYmFzZSA9IGxnLT5iYXNlICsg bGctPmRhdGEtPm9mZnNldHNbaV07CisKKwkJdmFsID0gcmVhZGwobGFuZV9iYXNlICsgUENJRV9S WF9SRUcxKTsKKwkJdmFsID0gdTMyX3JlcGxhY2VfYml0cyh2YWwsIDAsIDB4Myk7CisJCXdyaXRl bCh2YWwsIHBoeV9iYXNlICsgUENJRV9SWF9SRUcxKTsKKwl9CisKKwl2YWwgPSByZWFkbChwaHlf YmFzZSArIFBIWV9QTExfUkVHMik7CisJdmFsIHw9IEJJVCgyMCk7CisJd3JpdGVsKHZhbCwgcGh5 X2Jhc2UgKyBQSFlfUExMX1JFRzIpOworCisJd3JpdGVsKDB4MDAwMDY1MDUsIHBoeV9iYXNlICsg UENJRV9SWF9SRUcxKTsKKworCS8qIHBsbF9yZWcxIG9mIGxhbmUwLCBkaXNhYmxlIFNTQzogcGxs X3JlZzRbMzowXSA9IDAgKi8KKwl2YWwgPSByZWFkbChwaHlfYmFzZSArIFBIWV9QTExfUkVHMSk7 CisJdmFsID0gdTMyX3JlcGxhY2VfYml0cyh2YWwsIDAsIEdFTk1BU0soMjcsIDI0KSk7CisJd3Jp dGVsKHZhbCwgcGh5X2Jhc2UgKyBQSFlfUExMX1JFRzEpOworCisJZm9yIChpID0gMDsgaSA8IGxn LT5kYXRhLT5sYW5lczsgaSsrKSB7CisJCXZvaWQgX19pb21lbSAqbGFuZV9iYXNlID0gbGctPmJh c2UgKyBsZy0+ZGF0YS0+b2Zmc2V0c1tpXTsKKworCQkvKiBzZXQgY2ZnX3R4X3NlbmRfZHVtbXlf ZGF0YSB0byBiZSAxJ2IxIGZvciBkaXNhYmxlIGRhc2ggZGF0YSAqLworCQl2YWwgPSByZWFkbChs YW5lX2Jhc2UgKyBQSFlfUFVfU0VMKTsKKwkJdmFsID0gdTMyX3JlcGxhY2VfYml0cyh2YWwsIDEs IEJJVCgxMykpOworCQl3cml0ZWwodmFsLCBsYW5lX2Jhc2UgKyBQSFlfUFVfU0VMKTsKKworCQkv KiBkaXNhYmxlIGVuX3NhbXBsZV9kYXRhX2FmdGVyX2Nkcl9sb2NrZWQgKi8KKwkJdmFsID0gcmVh ZGwobGFuZV9iYXNlICsgUEhZX1JFU0VUX0NGRyk7CisJCXZhbCA9IHUzMl9yZXBsYWNlX2JpdHMo dmFsLCAwLCBCSVQoNikpOworCQl3cml0ZWwodmFsLCBsYW5lX2Jhc2UgKyBQSFlfUkVTRVRfQ0ZH KTsKKworCQkvKiBEeW5hbWljIExvY2sgKi8KKwkJdmFsID0gcmVhZGwobGFuZV9iYXNlICsgUEhZ X01PREVfQ0ZHKTsKKwkJdmFsID0gdTMyX3JlcGxhY2VfYml0cyh2YWwsIDEsIEJJVCgyKSk7CisJ CXdyaXRlbCh2YWwsIGxhbmVfYmFzZSArIFBIWV9NT0RFX0NGRyk7CisKKwkJdmFsID0gRklFTERf UFJFUChHRU5NQVNLKDcsIDApLCAweDEwKSB8CisJCQlGSUVMRF9QUkVQKEdFTk1BU0soMTUsIDgp LCAweDc4KSB8CisJCQlGSUVMRF9QUkVQKEdFTk1BU0soMjMsIDE2KSwgMHg5OCkgfAorCQkJRklF TERfUFJFUChHRU5NQVNLKDMxLCAyNCksIDB4ZGYpOworCQl3cml0ZWwodmFsLCBsYW5lX2Jhc2Ug KyBQSFlfUlhfUkVHX0EpOworCisJCXZhbCA9IHJlYWRsKGxhbmVfYmFzZSArIFBIWV9SWF9SRUdf Qik7CisJCXZhbCAmPSB+UEhZX1JYX1JFR0JfTUFTSzsKKwkJdmFsIHw9IEZJRUxEX1BSRVAoR0VO TUFTSyg3LCAwKSwgMHhiNCkgfAorCQkJRklFTERfUFJFUChHRU5NQVNLKDE1LCA4KSwgMHg4OCkg fAorCQkJRklFTERfUFJFUChHRU5NQVNLKDIzLCAxNiksIDB4MjgpOworCQl3cml0ZWwodmFsLCBs YW5lX2Jhc2UgKyBQSFlfUlhfUkVHX0IpOworCisJCS8qIFNldCBpbml0IGRvbmUgKi8KKwkJdmFs ID0gcmVhZGwobGFuZV9iYXNlICsgUENJRV9QVV9BRERSX0NMS19DRkcpOworCQl2YWwgPSB1MzJf cmVwbGFjZV9iaXRzKHZhbCwgMSwgQ0ZHX1NXX1BIWV9JTklUX0RPTkUpOworCQl3cml0ZWwodmFs LCBsYW5lX2Jhc2UgKyBQQ0lFX1BVX0FERFJfQ0xLX0NGRyk7CisJfQorCisJcmV0ID0gcmVhZGxf cG9sbF90aW1lb3V0KHBoeV9iYXNlICsgUENJRV9QVV9BRERSX0NMS19DRkcsIHZhbCwKKwkJCQkg KHZhbCAmIFBIWV9DTEtfUExMX1JFQURZKSwgUENJRV9QT0xMX0RFTEFZLAorCQkJCSBQQ0lFX1BM TF9USU1FT1VUKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmxnLT5waHktPmRldiwgIlBIWSBQ TEwgbG9jayB0aW1lb3V0XG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30K KworY29uc3Qgc3RydWN0IHBoeV9vcHMgazNfcGNpZV9waHlfb3BzID0geworCS5pbml0CQk9IGsz X3BjaWVfcGh5X2luaXQsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorfTsKK0VYUE9SVF9TWU1C T0xfR1BMKGszX3BjaWVfcGh5X29wcyk7CisKKy8qIFBIWSByY2FsIGluaXQgcmVxdWlyZXMgQVBC X1NQQVJFIHJlZ21hcCBhY2Nlc3MgKi8KKworI2RlZmluZSBBUEJfU1BBUkVfUFVfQ0FMCQkweDE3 OAorI2RlZmluZSBQVV9DQUwJCQkJQklUKDE3KQorCisjZGVmaW5lIEFQQl9TUEFSRV9SQ0FMX0hT SU8JCTB4MTdjCisjZGVmaW5lIEFQQl9TUEFSRV9QVV9DQUxfRE9ORQkJQklUKDgpCisjZGVmaW5l IFJDQUxfT1ZSRF9QVFJJTQkJCUdFTk1BU0soMjMsIDIwKQorI2RlZmluZSBSQ0FMX09WUkRfTlRS SU0JCQlHRU5NQVNLKDI3LCAyNCkKKyNkZWZpbmUgUkNBTF9PVlJEX1BUUklNX0VOCQlCSVQoMjgp CisjZGVmaW5lIFJDQUxfT1ZSRF9OVFJJTV9FTgkJQklUKDI5KQorI2RlZmluZSBSQ0FMX09WUkRf U1RBQkxFX1ZBTAkJQklUKDMwKQorI2RlZmluZSBSQ0FMX09WUkRfU1RBQkxFX0VOCQlCSVQoMzEp CisKKyNkZWZpbmUgUkNBTF9PVlJEX1RSSU1fRU4JCShSQ0FMX09WUkRfTlRSSU1fRU4gfCBSQ0FM X09WUkRfUFRSSU1fRU4pCisjZGVmaW5lIFJDQUxfT1ZSRF9UUklNX01BU0sJCShSQ0FMX09WUkRf TlRSSU0gfCBSQ0FMX09WUkRfUFRSSU0pCisKKyNkZWZpbmUgUFVfQ0FMX1RJTUVPVVQgMjAwMDAw MAorCitzdGF0aWMgREVGSU5FX01VVEVYKGNhbGlicmF0ZV9sb2NrKTsKKworaW50IGszX3BoeV9j YWxpYnJhdGUoc3RydWN0IHJlZ21hcCAqYXBiX3NwYXJlKQoreworCXVuc2lnbmVkIGludCB2YWw7 CisJaW50IHJldDsKKworCWd1YXJkKG11dGV4KSgmY2FsaWJyYXRlX2xvY2spOworCisJcmVnbWFw X3JlYWQoYXBiX3NwYXJlLCBBUEJfU1BBUkVfUkNBTF9IU0lPLCAmdmFsKTsKKwlpZiAodmFsICYg QVBCX1NQQVJFX1BVX0NBTF9ET05FKQorCQlyZXR1cm4gMDsKKworCXJlZ21hcF91cGRhdGVfYml0 cyhhcGJfc3BhcmUsIEFQQl9TUEFSRV9QVV9DQUwsIFBVX0NBTCwKKwkJCSAgIFBVX0NBTCk7CisK KwlyZXQgPSByZWdtYXBfcmVhZF9wb2xsX3RpbWVvdXQoYXBiX3NwYXJlLCBBUEJfU1BBUkVfUkNB TF9IU0lPLAorCQkJCSAgICAgICB2YWwsICh2YWwgJiBBUEJfU1BBUkVfUFVfQ0FMX0RPTkUpLCBQ Q0lFX1BPTExfREVMQVksCisJCQkJICAgICAgIFBVX0NBTF9USU1FT1VUKTsKKworCWlmIChyZXQp CisJCXJlZ21hcF91cGRhdGVfYml0cyhhcGJfc3BhcmUsIEFQQl9TUEFSRV9SQ0FMX0hTSU8sCisJ CQkJICAgUkNBTF9PVlJEX1RSSU1fRU4gfCBSQ0FMX09WUkRfU1RBQkxFX1ZBTCB8CisJCQkJICAg UkNBTF9PVlJEX1RSSU1fTUFTSyB8IFJDQUxfT1ZSRF9TVEFCTEVfRU4sCisJCQkJICAgUkNBTF9P VlJEX1RSSU1fRU4gfCBSQ0FMX09WUkRfU1RBQkxFX1ZBTCB8CisJCQkJICAgRklFTERfUFJFUChS Q0FMX09WUkRfTlRSSU0sIDB4NikgfAorCQkJCSAgIEZJRUxEX1BSRVAoUkNBTF9PVlJEX1BUUklN LCAweGEpIHwKKwkJCQkgICBSQ0FMX09WUkRfU1RBQkxFX0VOKTsKKworCXJldHVybiByZXQ7Cit9 CitFWFBPUlRfU1lNQk9MX0dQTChrM19waHlfY2FsaWJyYXRlKTsKKworTU9EVUxFX0RFU0NSSVBU SU9OKCJTcGFjZW1pVCBLMyBQSFkgY29tbW9uIG9wcyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIp OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waHkvc3BhY2VtaXQvcGh5LWszLWNvbW1vbi5oIGIvZHJp dmVycy9waHkvc3BhY2VtaXQvcGh5LWszLWNvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu ZGV4IDAwMDAwMDAwMDAwMC4uNDkwMDljM2MzMTNhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVy cy9waHkvc3BhY2VtaXQvcGh5LWszLWNvbW1vbi5oCkBAIC0wLDAgKzEsMjcgQEAKKy8qIFNQRFgt TGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkgKi8KKworI2lmbmRlZiBfUEhZX0szX0NP TU1PTl9ICisjZGVmaW5lIF9QSFlfSzNfQ09NTU9OX0gKKworI2luY2x1ZGUgPGxpbnV4L3BoeS9w aHkuaD4KKworc3RydWN0IGszX3BoeV9sYW5lX2dyb3VwX2RhdGEgeworCXUzMiBsYW5lczsKKwl1 OCBjb25maWc7CisJdTggbWFzazsKKwl1MzIgb2Zmc2V0c1tdIF9fY291bnRlZF9ieShsYW5lcyk7 Cit9OworCitzdHJ1Y3QgazNfbGFuZV9ncm91cCB7CisJY29uc3Qgc3RydWN0IGszX3BoeV9sYW5l X2dyb3VwX2RhdGEgKmRhdGE7CisJdm9pZCBfX2lvbWVtICpiYXNlOworCXN0cnVjdCBwaHkgKnBo eTsKKwlib29sIGlzX3BjaWU7Cit9OworCitleHRlcm4gY29uc3Qgc3RydWN0IHBoeV9vcHMgazNf cGNpZV9waHlfb3BzOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBwaHlfb3BzIGszX3VzYjNfcGh5X29w czsKKworaW50IGszX3BoeV9jYWxpYnJhdGUoc3RydWN0IHJlZ21hcCAqYXBiX3NwYXJlKTsKKwor I2VuZGlmCi0tIAoyLjU0LjAKCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fXwpsaW51eC1yaXNjdiBtYWlsaW5nIGxpc3QKbGludXgtcmlzY3ZAbGlzdHMuaW5m cmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xp bnV4LXJpc2N2Cg==