From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-13.8 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id CDFAFC433B4 for ; Wed, 14 Apr 2021 08:15:59 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id A3F0F613C3 for ; Wed, 14 Apr 2021 08:15:59 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1350018AbhDNIQT convert rfc822-to-8bit (ORCPT ); Wed, 14 Apr 2021 04:16:19 -0400 Received: from aposti.net ([89.234.176.197]:38908 "EHLO aposti.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1349970AbhDNIQQ (ORCPT ); Wed, 14 Apr 2021 04:16:16 -0400 Date: Wed, 14 Apr 2021 09:15:35 +0100 From: Paul Cercueil Subject: Re: [PATCH v3 2/3] drm: bridge: add it66121 driver To: Neil Armstrong Cc: a.hajda@samsung.com, Laurent.pinchart@ideasonboard.com, robert.foss@linaro.org, jonas@kwiboo.se, jernej.skrabec@siol.net, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Phong LE Message-Id: In-Reply-To: <1d963840-cb96-399b-7f27-ce3eb9ad6083@baylibre.com> References: <20210412154648.3719153-1-narmstrong@baylibre.com> <20210412154648.3719153-3-narmstrong@baylibre.com> <1d963840-cb96-399b-7f27-ce3eb9ad6083@baylibre.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8BIT Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Le mer. 14 avril 2021 à 8:17, Neil Armstrong a écrit : > Hi, > > Le 13/04/2021 à 22:56, Paul Cercueil a écrit : >> Hi Neil, >> >> I get build failures locally: >> >> drivers/gpu/drm/bridge/ite-it66121.c: In function >> ‘it66121_hw_reset’: >> drivers/gpu/drm/bridge/ite-it66121.c:242:2: error: implicit >> declaration of function ‘gpiod_set_value’ >> [-Werror=implicit-function-declaration] >> 242 | gpiod_set_value(ctx->gpio_reset, 1); >> | ^~~~~~~~~~~~~~~ >> drivers/gpu/drm/bridge/ite-it66121.c: In function >> ‘it66121_probe’: >> drivers/gpu/drm/bridge/ite-it66121.c:1016:16: error: implicit >> declaration of function ‘FIELD_GET’; did you mean >> ‘FOLL_GET’? [-Werror=implicit-function-declaration] >> 1016 | revision_id = FIELD_GET(IT66121_REVISION_MASK, >> device_ids[1]); >> | ^~~~~~~~~ >> | FOLL_GET >> >> Nothing difficult to fix, but the includes should be added >> nonetheless. > > Exact, I got the CI build failures, I'll fix these for v4. > > Were you able to test on your setup ? > The v2 always forced DDR mode, with this v3, I also switch to normal > 24input mode, but totally untested. I will try to find some time today to test after work. -Paul > Thanks, > Neil > >> >> Cheers, >> -Paul >> >> >> Le lun. 12 avril 2021 à 17:46, Neil Armstrong >> a écrit : >>> From: Phong LE >>> >>> This commit is a simple driver for bridge HMDI it66121. >>> The input format is RBG and there is no color conversion. >>> Audio, HDCP and CEC are not supported yet. >>> >>> Signed-off-by: Phong LE >>> Signed-off-by: Neil Armstrong >>> --- >>> drivers/gpu/drm/bridge/Kconfig | 8 + >>> drivers/gpu/drm/bridge/Makefile | 1 + >>> drivers/gpu/drm/bridge/ite-it66121.c | 1081 >>> ++++++++++++++++++++++++++ >>> 3 files changed, 1090 insertions(+) >>> create mode 100644 drivers/gpu/drm/bridge/ite-it66121.c >>> >>> diff --git a/drivers/gpu/drm/bridge/Kconfig >>> b/drivers/gpu/drm/bridge/Kconfig >>> index e4110d6ca7b3..6915c38fa459 100644 >>> --- a/drivers/gpu/drm/bridge/Kconfig >>> +++ b/drivers/gpu/drm/bridge/Kconfig >>> @@ -74,6 +74,14 @@ config DRM_LONTIUM_LT9611UXC >>> HDMI signals >>> Please say Y if you have such hardware. >>> >>> +config DRM_ITE_IT66121 >>> + tristate "ITE IT66121 HDMI bridge" >>> + depends on OF >>> + select DRM_KMS_HELPER >>> + select REGMAP_I2C >>> + help >>> + Support for ITE IT66121 HDMI bridge. >>> + >>> config DRM_LVDS_CODEC >>> tristate "Transparent LVDS encoders and decoders support" >>> depends on OF >>> diff --git a/drivers/gpu/drm/bridge/Makefile >>> b/drivers/gpu/drm/bridge/Makefile >>> index 86e7acc76f8d..4f725753117c 100644 >>> --- a/drivers/gpu/drm/bridge/Makefile >>> +++ b/drivers/gpu/drm/bridge/Makefile >>> @@ -24,6 +24,7 @@ obj-$(CONFIG_DRM_TI_SN65DSI86) += ti-sn65dsi86.o >>> obj-$(CONFIG_DRM_TI_TFP410) += ti-tfp410.o >>> obj-$(CONFIG_DRM_TI_TPD12S015) += ti-tpd12s015.o >>> obj-$(CONFIG_DRM_NWL_MIPI_DSI) += nwl-dsi.o >>> +obj-$(CONFIG_DRM_ITE_IT66121) += ite-it66121.o >>> >>> obj-y += analogix/ >>> obj-y += cadence/ >>> diff --git a/drivers/gpu/drm/bridge/ite-it66121.c >>> b/drivers/gpu/drm/bridge/ite-it66121.c >>> new file mode 100644 >>> index 000000000000..73af49b29dfa >>> --- /dev/null >>> +++ b/drivers/gpu/drm/bridge/ite-it66121.c >>> @@ -0,0 +1,1081 @@ >>> +// SPDX-License-Identifier: GPL-2.0-only >>> +/* >>> + * Copyright (C) 2020 BayLibre, SAS >>> + * Author: Phong LE >>> + * Copyright (C) 2018-2019, Artem Mygaiev >>> + * Copyright (C) 2017, Fresco Logic, Incorporated. >>> + * >>> + */ >>> + >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> + >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> +#include >>> + >>> +#define IT66121_VENDOR_ID0_REG 0x00 >>> +#define IT66121_VENDOR_ID1_REG 0x01 >>> +#define IT66121_DEVICE_ID0_REG 0x02 >>> +#define IT66121_DEVICE_ID1_REG 0x03 >>> + >>> +#define IT66121_VENDOR_ID0 0x54 >>> +#define IT66121_VENDOR_ID1 0x49 >>> +#define IT66121_DEVICE_ID0 0x12 >>> +#define IT66121_DEVICE_ID1 0x06 >>> +#define IT66121_REVISION_MASK GENMASK(7, 4) >>> +#define IT66121_DEVICE_ID1_MASK GENMASK(3, 0) >>> + >>> +#define IT66121_MASTER_SEL_REG 0x10 >>> +#define IT66121_MASTER_SEL_HOST BIT(0) >>> + >>> +#define IT66121_AFE_DRV_REG 0x61 >>> +#define IT66121_AFE_DRV_RST BIT(4) >>> +#define IT66121_AFE_DRV_PWD BIT(5) >>> + >>> +#define IT66121_INPUT_MODE_REG 0x70 >>> +#define IT66121_INPUT_MODE_RGB (0 << 6) >>> +#define IT66121_INPUT_MODE_YUV422 BIT(6) >>> +#define IT66121_INPUT_MODE_YUV444 (2 << 6) >>> +#define IT66121_INPUT_MODE_CCIR656 BIT(4) >>> +#define IT66121_INPUT_MODE_SYNCEMB BIT(3) >>> +#define IT66121_INPUT_MODE_DDR BIT(2) >>> + >>> +#define IT66121_INPUT_CSC_REG 0x72 >>> +#define IT66121_INPUT_CSC_ENDITHER BIT(7) >>> +#define IT66121_INPUT_CSC_ENUDFILTER BIT(6) >>> +#define IT66121_INPUT_CSC_DNFREE_GO BIT(5) >>> +#define IT66121_INPUT_CSC_RGB_TO_YUV 0x02 >>> +#define IT66121_INPUT_CSC_YUV_TO_RGB 0x03 >>> +#define IT66121_INPUT_CSC_NO_CONV 0x00 >>> + >>> +#define IT66121_AFE_XP_REG 0x62 >>> +#define IT66121_AFE_XP_GAINBIT BIT(7) >>> +#define IT66121_AFE_XP_PWDPLL BIT(6) >>> +#define IT66121_AFE_XP_ENI BIT(5) >>> +#define IT66121_AFE_XP_ENO BIT(4) >>> +#define IT66121_AFE_XP_RESETB BIT(3) >>> +#define IT66121_AFE_XP_PWDI BIT(2) >>> + >>> +#define IT66121_AFE_IP_REG 0x64 >>> +#define IT66121_AFE_IP_GAINBIT BIT(7) >>> +#define IT66121_AFE_IP_PWDPLL BIT(6) >>> +#define IT66121_AFE_IP_CKSEL_05 (0 << 4) >>> +#define IT66121_AFE_IP_CKSEL_1 BIT(4) >>> +#define IT66121_AFE_IP_CKSEL_2 (2 << 4) >>> +#define IT66121_AFE_IP_CKSEL_2OR4 (3 << 4) >>> +#define IT66121_AFE_IP_ER0 BIT(3) >>> +#define IT66121_AFE_IP_RESETB BIT(2) >>> +#define IT66121_AFE_IP_ENC BIT(1) >>> +#define IT66121_AFE_IP_EC1 BIT(0) >>> + >>> +#define IT66121_AFE_XP_EC1_REG 0x68 >>> +#define IT66121_AFE_XP_EC1_LOWCLK BIT(4) >>> + >>> +#define IT66121_SW_RST_REG 0x04 >>> +#define IT66121_SW_RST_REF BIT(5) >>> +#define IT66121_SW_RST_AREF BIT(4) >>> +#define IT66121_SW_RST_VID BIT(3) >>> +#define IT66121_SW_RST_AUD BIT(2) >>> +#define IT66121_SW_RST_HDCP BIT(0) >>> + >>> +#define IT66121_DDC_COMMAND_REG 0x15 >>> +#define IT66121_DDC_COMMAND_BURST_READ 0x0 >>> +#define IT66121_DDC_COMMAND_EDID_READ 0x3 >>> +#define IT66121_DDC_COMMAND_FIFO_CLR 0x9 >>> +#define IT66121_DDC_COMMAND_SCL_PULSE 0xA >>> +#define IT66121_DDC_COMMAND_ABORT 0xF >>> + >>> +#define IT66121_HDCP_REG 0x20 >>> +#define IT66121_HDCP_CPDESIRED BIT(0) >>> +#define IT66121_HDCP_EN1P1FEAT BIT(1) >>> + >>> +#define IT66121_INT_STATUS1_REG 0x06 >>> +#define IT66121_INT_STATUS1_AUD_OVF BIT(7) >>> +#define IT66121_INT_STATUS1_DDC_NOACK BIT(5) >>> +#define IT66121_INT_STATUS1_DDC_FIFOERR BIT(4) >>> +#define IT66121_INT_STATUS1_DDC_BUSHANG BIT(2) >>> +#define IT66121_INT_STATUS1_RX_SENS_STATUS BIT(1) >>> +#define IT66121_INT_STATUS1_HPD_STATUS BIT(0) >>> + >>> +#define IT66121_DDC_HEADER_REG 0x11 >>> +#define IT66121_DDC_HEADER_HDCP 0x74 >>> +#define IT66121_DDC_HEADER_EDID 0xA0 >>> + >>> +#define IT66121_DDC_OFFSET_REG 0x12 >>> +#define IT66121_DDC_BYTE_REG 0x13 >>> +#define IT66121_DDC_SEGMENT_REG 0x14 >>> +#define IT66121_DDC_RD_FIFO_REG 0x17 >>> + >>> +#define IT66121_CLK_BANK_REG 0x0F >>> +#define IT66121_CLK_BANK_PWROFF_RCLK BIT(6) >>> +#define IT66121_CLK_BANK_PWROFF_ACLK BIT(5) >>> +#define IT66121_CLK_BANK_PWROFF_TXCLK BIT(4) >>> +#define IT66121_CLK_BANK_PWROFF_CRCLK BIT(3) >>> +#define IT66121_CLK_BANK_0 0 >>> +#define IT66121_CLK_BANK_1 1 >>> + >>> +#define IT66121_INT_REG 0x05 >>> +#define IT66121_INT_ACTIVE_HIGH BIT(7) >>> +#define IT66121_INT_OPEN_DRAIN BIT(6) >>> +#define IT66121_INT_TX_CLK_OFF BIT(0) >>> + >>> +#define IT66121_INT_MASK1_REG 0x09 >>> +#define IT66121_INT_MASK1_AUD_OVF BIT(7) >>> +#define IT66121_INT_MASK1_DDC_NOACK BIT(5) >>> +#define IT66121_INT_MASK1_DDC_FIFOERR BIT(4) >>> +#define IT66121_INT_MASK1_DDC_BUSHANG BIT(2) >>> +#define IT66121_INT_MASK1_RX_SENS BIT(1) >>> +#define IT66121_INT_MASK1_HPD BIT(0) >>> + >>> +#define IT66121_INT_CLR1_REG 0x0C >>> +#define IT66121_INT_CLR1_PKTACP BIT(7) >>> +#define IT66121_INT_CLR1_PKTNULL BIT(6) >>> +#define IT66121_INT_CLR1_PKTGEN BIT(5) >>> +#define IT66121_INT_CLR1_KSVLISTCHK BIT(4) >>> +#define IT66121_INT_CLR1_AUTHDONE BIT(3) >>> +#define IT66121_INT_CLR1_AUTHFAIL BIT(2) >>> +#define IT66121_INT_CLR1_RX_SENS BIT(1) >>> +#define IT66121_INT_CLR1_HPD BIT(0) >>> + >>> +#define IT66121_AV_MUTE_REG 0xC1 >>> +#define IT66121_AV_MUTE_ON BIT(0) >>> +#define IT66121_AV_MUTE_BLUESCR BIT(1) >>> + >>> +#define IT66121_PKT_GEN_CTRL_REG 0xC6 >>> +#define IT66121_PKT_GEN_CTRL_ON BIT(0) >>> +#define IT66121_PKT_GEN_CTRL_RPT BIT(1) >>> + >>> +#define IT66121_AVIINFO_DB1_REG 0x158 >>> +#define IT66121_AVIINFO_DB2_REG 0x159 >>> +#define IT66121_AVIINFO_DB3_REG 0x15A >>> +#define IT66121_AVIINFO_DB4_REG 0x15B >>> +#define IT66121_AVIINFO_DB5_REG 0x15C >>> +#define IT66121_AVIINFO_CSUM_REG 0x15D >>> +#define IT66121_AVIINFO_DB6_REG 0x15E >>> +#define IT66121_AVIINFO_DB7_REG 0x15F >>> +#define IT66121_AVIINFO_DB8_REG 0x160 >>> +#define IT66121_AVIINFO_DB9_REG 0x161 >>> +#define IT66121_AVIINFO_DB10_REG 0x162 >>> +#define IT66121_AVIINFO_DB11_REG 0x163 >>> +#define IT66121_AVIINFO_DB12_REG 0x164 >>> +#define IT66121_AVIINFO_DB13_REG 0x165 >>> + >>> +#define IT66121_AVI_INFO_PKT_REG 0xCD >>> +#define IT66121_AVI_INFO_PKT_ON BIT(0) >>> +#define IT66121_AVI_INFO_PKT_RPT BIT(1) >>> + >>> +#define IT66121_HDMI_MODE_REG 0xC0 >>> +#define IT66121_HDMI_MODE_HDMI BIT(0) >>> + >>> +#define IT66121_SYS_STATUS_REG 0x0E >>> +#define IT66121_SYS_STATUS_ACTIVE_IRQ BIT(7) >>> +#define IT66121_SYS_STATUS_HPDETECT BIT(6) >>> +#define IT66121_SYS_STATUS_SENDECTECT BIT(5) >>> +#define IT66121_SYS_STATUS_VID_STABLE BIT(4) >>> +#define IT66121_SYS_STATUS_AUD_CTS_CLR BIT(1) >>> +#define IT66121_SYS_STATUS_CLEAR_IRQ BIT(0) >>> + >>> +#define IT66121_DDC_STATUS_REG 0x16 >>> +#define IT66121_DDC_STATUS_TX_DONE BIT(7) >>> +#define IT66121_DDC_STATUS_ACTIVE BIT(6) >>> +#define IT66121_DDC_STATUS_NOACK BIT(5) >>> +#define IT66121_DDC_STATUS_WAIT_BUS BIT(4) >>> +#define IT66121_DDC_STATUS_ARBI_LOSE BIT(3) >>> +#define IT66121_DDC_STATUS_FIFO_FULL BIT(2) >>> +#define IT66121_DDC_STATUS_FIFO_EMPTY BIT(1) >>> +#define IT66121_DDC_STATUS_FIFO_VALID BIT(0) >>> + >>> +#define IT66121_EDID_SLEEP_US 20000 >>> +#define IT66121_EDID_TIMEOUT_US 200000 >>> +#define IT66121_EDID_FIFO_SIZE 32 >>> +#define IT66121_AFE_CLK_HIGH 80000 /* Khz */ >>> + >>> +struct it66121_ctx { >>> + struct regmap *regmap; >>> + struct drm_bridge bridge; >>> + struct drm_connector connector; >>> + struct device *dev; >>> + struct gpio_desc *gpio_reset; >>> + struct i2c_client *client; >>> + struct regulator_bulk_data supplies[3]; >>> + u32 bus_width; >>> + struct mutex lock; /* Protects fields below and device >>> registers */ >>> + struct edid *edid; >>> + struct hdmi_avi_infoframe hdmi_avi_infoframe; >>> +}; >>> + >>> +static const struct regmap_range_cfg it66121_regmap_banks[] = { >>> + { >>> + .name = "it66121", >>> + .range_min = 0x00, >>> + .range_max = 0x1FF, >>> + .selector_reg = IT66121_CLK_BANK_REG, >>> + .selector_mask = 0x1, >>> + .selector_shift = 0, >>> + .window_start = 0x00, >>> + .window_len = 0x130, >>> + }, >>> +}; >>> + >>> +static const struct regmap_config it66121_regmap_config = { >>> + .val_bits = 8, >>> + .reg_bits = 8, >>> + .max_register = 0x1FF, >>> + .ranges = it66121_regmap_banks, >>> + .num_ranges = ARRAY_SIZE(it66121_regmap_banks), >>> +}; >>> + >>> +static void it66121_hw_reset(struct it66121_ctx *ctx) >>> +{ >>> + gpiod_set_value(ctx->gpio_reset, 1); >>> + msleep(20); >>> + gpiod_set_value(ctx->gpio_reset, 0); >>> +} >>> + >>> +static int ite66121_power_on(struct it66121_ctx *ctx) >>> +{ >>> + return regulator_bulk_enable(ARRAY_SIZE(ctx->supplies), >>> ctx->supplies); >>> +} >>> + >>> +static int ite66121_power_off(struct it66121_ctx *ctx) >>> +{ >>> + return regulator_bulk_disable(ARRAY_SIZE(ctx->supplies), >>> ctx->supplies); >>> +} >>> + >>> +static int it66121_preamble_ddc(struct it66121_ctx *ctx) >>> +{ >>> + return regmap_write(ctx->regmap, IT66121_MASTER_SEL_REG, >>> + IT66121_MASTER_SEL_HOST); >>> +} >>> + >>> +static int it66121_fire_afe(struct it66121_ctx *ctx) >>> +{ >>> + return regmap_write(ctx->regmap, IT66121_AFE_DRV_REG, 0); >>> +} >>> + >>> +/* TOFIX: Handle YCbCr Input & Output */ >>> +static int it66121_configure_input(struct it66121_ctx *ctx) >>> +{ >>> + int ret; >>> + u8 mode = IT66121_INPUT_MODE_RGB; >>> + >>> + if (ctx->bus_width == 12) >>> + mode |= IT66121_INPUT_MODE_DDR; >>> + >>> + ret = regmap_write(ctx->regmap, IT66121_INPUT_MODE_REG, mode); >>> + if (ret) >>> + return ret; >>> + >>> + return regmap_write(ctx->regmap, IT66121_INPUT_CSC_REG, >>> IT66121_INPUT_CSC_NO_CONV); >>> +} >>> + >>> +/** >>> + * it66121_configure_afe() - Configure the analog front end >>> + * @ctx: it66121_ctx object >>> + * @mode: mode to configure >>> + * >>> + * RETURNS: >>> + * zero if success, a negative error code otherwise. >>> + */ >>> +static int it66121_configure_afe(struct it66121_ctx *ctx, >>> + const struct drm_display_mode *mode) >>> +{ >>> + int ret; >>> + >>> + ret = regmap_write(ctx->regmap, IT66121_AFE_DRV_REG, >>> + IT66121_AFE_DRV_RST); >>> + if (ret) >>> + return ret; >>> + >>> + if (mode->clock > IT66121_AFE_CLK_HIGH) { >>> + ret = regmap_write_bits(ctx->regmap, IT66121_AFE_XP_REG, >>> + IT66121_AFE_XP_GAINBIT | >>> + IT66121_AFE_XP_ENO, >>> + IT66121_AFE_XP_GAINBIT); >>> + if (ret) >>> + return ret; >>> + >>> + ret = regmap_write_bits(ctx->regmap, IT66121_AFE_IP_REG, >>> + IT66121_AFE_IP_GAINBIT | >>> + IT66121_AFE_IP_ER0 | >>> + IT66121_AFE_IP_EC1, >>> + IT66121_AFE_IP_GAINBIT); >>> + if (ret) >>> + return ret; >>> + >>> + ret = regmap_write_bits(ctx->regmap, >>> IT66121_AFE_XP_EC1_REG, >>> + IT66121_AFE_XP_EC1_LOWCLK, 0x80); >>> + if (ret) >>> + return ret; >>> + } else { >>> + ret = regmap_write_bits(ctx->regmap, IT66121_AFE_XP_REG, >>> + IT66121_AFE_XP_GAINBIT | >>> + IT66121_AFE_XP_ENO, >>> + IT66121_AFE_XP_ENO); >>> + if (ret) >>> + return ret; >>> + >>> + ret = regmap_write_bits(ctx->regmap, IT66121_AFE_IP_REG, >>> + IT66121_AFE_IP_GAINBIT | >>> + IT66121_AFE_IP_ER0 | >>> + IT66121_AFE_IP_EC1, IT66121_AFE_IP_ER0 | >>> + IT66121_AFE_IP_EC1); >>> + if (ret) >>> + return ret; >>> + >>> + ret = regmap_write_bits(ctx->regmap, >>> IT66121_AFE_XP_EC1_REG, >>> + IT66121_AFE_XP_EC1_LOWCLK, >>> + IT66121_AFE_XP_EC1_LOWCLK); >>> + if (ret) >>> + return ret; >>> + } >>> + >>> + /* Clear reset flags */ >>> + ret = regmap_write_bits(ctx->regmap, IT66121_SW_RST_REG, >>> + IT66121_SW_RST_REF | IT66121_SW_RST_VID, >>> + ~(IT66121_SW_RST_REF | IT66121_SW_RST_VID) & >>> + 0xFF); >>> + if (ret) >>> + return ret; >>> + >>> + return it66121_fire_afe(ctx); >>> +} >>> + >>> +static inline int it66121_wait_ddc_ready(struct it66121_ctx *ctx) >>> +{ >>> + int ret, val; >>> + u32 busy = IT66121_DDC_STATUS_NOACK | >>> IT66121_DDC_STATUS_WAIT_BUS | >>> + IT66121_DDC_STATUS_ARBI_LOSE; >>> + >>> + ret = regmap_read_poll_timeout(ctx->regmap, >>> IT66121_DDC_STATUS_REG, val, true, >>> + IT66121_EDID_SLEEP_US, >>> IT66121_EDID_TIMEOUT_US); >>> + if (ret) >>> + return ret; >>> + >>> + if (val & busy) >>> + return -EAGAIN; >>> + >>> + return 0; >>> +} >>> + >>> +static int it66121_clear_ddc_fifo(struct it66121_ctx *ctx) >>> +{ >>> + int ret; >>> + >>> + ret = it66121_preamble_ddc(ctx); >>> + if (ret) >>> + return ret; >>> + >>> + return regmap_write(ctx->regmap, IT66121_DDC_COMMAND_REG, >>> + IT66121_DDC_COMMAND_FIFO_CLR); >>> +} >>> + >>> +static int it66121_abort_ddc_ops(struct it66121_ctx *ctx) >>> +{ >>> + int ret; >>> + unsigned int swreset, cpdesire; >>> + >>> + ret = regmap_read(ctx->regmap, IT66121_SW_RST_REG, &swreset); >>> + if (ret) >>> + return ret; >>> + >>> + ret = regmap_read(ctx->regmap, IT66121_HDCP_REG, &cpdesire); >>> + if (ret) >>> + return ret; >>> + >>> + ret = regmap_write(ctx->regmap, IT66121_HDCP_REG, >>> + cpdesire & (~IT66121_HDCP_CPDESIRED & 0xFF)); >>> + if (ret) >>> + return ret; >>> + >>> + ret = regmap_write(ctx->regmap, IT66121_SW_RST_REG, >>> + (swreset | IT66121_SW_RST_HDCP)); >>> + if (ret) >>> + return ret; >>> + >>> + ret = it66121_preamble_ddc(ctx); >>> + if (ret) >>> + return ret; >>> + >>> + ret = regmap_write(ctx->regmap, IT66121_DDC_COMMAND_REG, >>> + IT66121_DDC_COMMAND_ABORT); >>> + if (ret) >>> + return ret; >>> + >>> + return it66121_wait_ddc_ready(ctx); >>> +} >>> + >>> +static int it66121_get_edid_block(void *context, u8 *buf, >>> + unsigned int block, size_t len) >>> +{ >>> + struct it66121_ctx *ctx = context; >>> + unsigned int val; >>> + int remain = len; >>> + int offset = 0; >>> + int ret, cnt; >>> + >>> + offset = (block % 2) * len; >>> + block = block / 2; >>> + >>> + ret = regmap_read(ctx->regmap, IT66121_INT_STATUS1_REG, &val); >>> + if (ret) >>> + return ret; >>> + >>> + if (val & IT66121_INT_STATUS1_DDC_BUSHANG) { >>> + ret = it66121_abort_ddc_ops(ctx); >>> + if (ret) >>> + return ret; >>> + } >>> + >>> + ret = it66121_clear_ddc_fifo(ctx); >>> + if (ret) >>> + return ret; >>> + >>> + while (remain > 0) { >>> + cnt = (remain > IT66121_EDID_FIFO_SIZE) ? >>> + IT66121_EDID_FIFO_SIZE : remain; >>> + ret = it66121_preamble_ddc(ctx); >>> + if (ret) >>> + return ret; >>> + >>> + ret = regmap_write(ctx->regmap, IT66121_DDC_COMMAND_REG, >>> + IT66121_DDC_COMMAND_FIFO_CLR); >>> + if (ret) >>> + return ret; >>> + >>> + ret = it66121_wait_ddc_ready(ctx); >>> + if (ret) >>> + return ret; >>> + >>> + ret = regmap_read(ctx->regmap, IT66121_INT_STATUS1_REG, >>> &val); >>> + if (ret) >>> + return ret; >>> + >>> + if (val & IT66121_INT_STATUS1_DDC_BUSHANG) { >>> + ret = it66121_abort_ddc_ops(ctx); >>> + if (ret) >>> + return ret; >>> + } >>> + >>> + ret = it66121_preamble_ddc(ctx); >>> + if (ret) >>> + return ret; >>> + >>> + ret = regmap_write(ctx->regmap, IT66121_DDC_HEADER_REG, >>> + IT66121_DDC_HEADER_EDID); >>> + if (ret) >>> + return ret; >>> + >>> + ret = regmap_write(ctx->regmap, IT66121_DDC_OFFSET_REG, >>> offset); >>> + if (ret) >>> + return ret; >>> + >>> + ret = regmap_write(ctx->regmap, IT66121_DDC_BYTE_REG, >>> cnt); >>> + if (ret) >>> + return ret; >>> + >>> + ret = regmap_write(ctx->regmap, IT66121_DDC_SEGMENT_REG, >>> block); >>> + if (ret) >>> + return ret; >>> + >>> + ret = regmap_write(ctx->regmap, IT66121_DDC_COMMAND_REG, >>> + IT66121_DDC_COMMAND_EDID_READ); >>> + if (ret) >>> + return ret; >>> + >>> + offset += cnt; >>> + remain -= cnt; >>> + >>> + /* Per programming manual, sleep here before emptying the >>> FIFO */ >>> + msleep(20); >>> + >>> + ret = it66121_wait_ddc_ready(ctx); >>> + if (ret) >>> + return ret; >>> + >>> + do { >>> + ret = regmap_read(ctx->regmap, >>> IT66121_DDC_RD_FIFO_REG, &val); >>> + if (ret) >>> + return ret; >>> + *(buf++) = val; >>> + cnt--; >>> + } while (cnt > 0); >>> + } >>> + >>> + return 0; >>> +} >>> + >>> +static int it66121_connector_get_modes(struct drm_connector >>> *connector) >>> +{ >>> + int ret, num_modes = 0; >>> + struct it66121_ctx *ctx = container_of(connector, struct >>> it66121_ctx, >>> + connector); >>> + >>> + if (ctx->edid) >>> + return drm_add_edid_modes(connector, ctx->edid); >>> + >>> + mutex_lock(&ctx->lock); >>> + >>> + ctx->edid = drm_do_get_edid(connector, >>> it66121_get_edid_block, ctx); >>> + if (!ctx->edid) { >>> + DRM_ERROR("Failed to read EDID\n"); >>> + goto unlock; >>> + } >>> + >>> + ret = drm_connector_update_edid_property(connector, >>> ctx->edid); >>> + if (ret) { >>> + DRM_ERROR("Failed to update EDID property: %d\n", ret); >>> + goto unlock; >>> + } >>> + >>> + num_modes = drm_add_edid_modes(connector, ctx->edid); >>> + >>> +unlock: >>> + mutex_unlock(&ctx->lock); >>> + >>> + return num_modes; >>> +} >>> + >>> +static bool it66121_is_hpd_detect(struct it66121_ctx *ctx) >>> +{ >>> + int val; >>> + >>> + if (regmap_read(ctx->regmap, IT66121_SYS_STATUS_REG, &val)) >>> + return false; >>> + >>> + return val & IT66121_SYS_STATUS_HPDETECT; >>> +} >>> + >>> +static int it66121_connector_detect_ctx(struct drm_connector >>> *connector, >>> + struct drm_modeset_acquire_ctx *c, >>> + bool force) >>> +{ >>> + struct it66121_ctx *ctx = container_of(connector, struct >>> it66121_ctx, >>> + connector); >>> + >>> + return it66121_is_hpd_detect(ctx) ? connector_status_connected >>> + : connector_status_disconnected; >>> +} >>> + >>> +static enum drm_mode_status it66121_mode_valid(struct it66121_ctx >>> *ctx, >>> + const struct drm_display_mode *mode) >>> +{ >>> + unsigned long max_clock; >>> + >>> + max_clock = (ctx->bus_width == 12) ? 74250 : 148500; >>> + >>> + if (mode->clock > max_clock) >>> + return MODE_CLOCK_HIGH; >>> + >>> + if (mode->clock < 25000) >>> + return MODE_CLOCK_LOW; >>> + >>> + return MODE_OK; >>> +} >>> + >>> +static enum drm_mode_status it66121_connector_mode_valid(struct >>> drm_connector *connector, >>> + struct drm_display_mode *mode) >>> +{ >>> + struct it66121_ctx *ctx = container_of(connector, struct >>> it66121_ctx, >>> + connector); >>> + >>> + return it66121_mode_valid(ctx, mode); >>> +} >>> + >>> +static struct drm_connector_helper_funcs >>> it66121_connector_helper_funcs = { >>> + .get_modes = it66121_connector_get_modes, >>> + .detect_ctx = it66121_connector_detect_ctx, >>> + .mode_valid = it66121_connector_mode_valid, >>> +}; >>> + >>> +static const struct drm_connector_funcs it66121_connector_funcs = >>> { >>> + .reset = drm_atomic_helper_connector_reset, >>> + .fill_modes = drm_helper_probe_single_connector_modes, >>> + .destroy = drm_connector_cleanup, >>> + .atomic_duplicate_state = >>> drm_atomic_helper_connector_duplicate_state, >>> + .atomic_destroy_state = >>> drm_atomic_helper_connector_destroy_state, >>> +}; >>> + >>> +static int it66121_bridge_attach(struct drm_bridge *bridge, >>> + enum drm_bridge_attach_flags flags) >>> +{ >>> + int ret; >>> + struct it66121_ctx *ctx = container_of(bridge, struct >>> it66121_ctx, >>> + bridge); >>> + >>> + if (!bridge->encoder) { >>> + DRM_ERROR("Parent encoder object not found"); >>> + return -ENODEV; >>> + } >>> + >>> + ret = regmap_write_bits(ctx->regmap, IT66121_CLK_BANK_REG, >>> + IT66121_CLK_BANK_PWROFF_RCLK, 0); >>> + if (ret) >>> + return ret; >>> + >>> + ret = regmap_write_bits(ctx->regmap, IT66121_INT_REG, >>> + IT66121_INT_TX_CLK_OFF, 0); >>> + if (ret) >>> + return ret; >>> + >>> + ret = regmap_write_bits(ctx->regmap, IT66121_AFE_DRV_REG, >>> + IT66121_AFE_DRV_PWD, 0); >>> + if (ret) >>> + return ret; >>> + >>> + ret = regmap_write_bits(ctx->regmap, IT66121_AFE_XP_REG, >>> + IT66121_AFE_XP_PWDI | IT66121_AFE_XP_PWDPLL, 0); >>> + if (ret) >>> + return ret; >>> + >>> + ret = regmap_write_bits(ctx->regmap, IT66121_AFE_IP_REG, >>> + IT66121_AFE_IP_PWDPLL, 0); >>> + if (ret) >>> + return ret; >>> + >>> + ret = regmap_write_bits(ctx->regmap, IT66121_AFE_DRV_REG, >>> + IT66121_AFE_DRV_RST, 0); >>> + if (ret) >>> + return ret; >>> + >>> + ret = regmap_write_bits(ctx->regmap, IT66121_AFE_XP_REG, >>> + IT66121_AFE_XP_RESETB, IT66121_AFE_XP_RESETB); >>> + if (ret) >>> + return ret; >>> + >>> + ret = regmap_write_bits(ctx->regmap, IT66121_AFE_IP_REG, >>> + IT66121_AFE_IP_RESETB, IT66121_AFE_IP_RESETB); >>> + if (ret) >>> + return ret; >>> + >>> + ret = regmap_write_bits(ctx->regmap, IT66121_SW_RST_REG, >>> + IT66121_SW_RST_REF, >>> + IT66121_SW_RST_REF); >>> + if (ret) >>> + return ret; >>> + >>> + /* Per programming manual, sleep here for bridge to settle */ >>> + msleep(50); >>> + >>> + /* Start interrupts */ >>> + ret = regmap_write_bits(ctx->regmap, IT66121_INT_MASK1_REG, >>> + IT66121_INT_MASK1_DDC_NOACK | >>> + IT66121_INT_MASK1_HPD | >>> + IT66121_INT_MASK1_DDC_FIFOERR | >>> + IT66121_INT_MASK1_DDC_BUSHANG, >>> + ~(IT66121_INT_MASK1_DDC_NOACK | >>> + IT66121_INT_MASK1_HPD | >>> + IT66121_INT_MASK1_DDC_FIFOERR | >>> + IT66121_INT_MASK1_DDC_BUSHANG) & 0xFF); >>> + if (ret) >>> + return ret; >>> + >>> + if (flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR) >>> + return 0; >>> + >>> + ret = drm_connector_init(bridge->dev, &ctx->connector, >>> + &it66121_connector_funcs, >>> + DRM_MODE_CONNECTOR_HDMIA); >>> + if (ret) >>> + return ret; >>> + >>> + ctx->connector.polled = DRM_CONNECTOR_POLL_HPD; >>> + drm_connector_helper_add(&ctx->connector, >>> + &it66121_connector_helper_funcs); >>> + >>> + ret = drm_connector_attach_encoder(&ctx->connector, >>> bridge->encoder); >>> + if (ret) >>> + return ret; >>> + >>> + return drm_connector_register(&ctx->connector); >>> +} >>> + >>> +static int it66121_set_mute(struct it66121_ctx *ctx, bool mute) >>> +{ >>> + int ret; >>> + unsigned int val = 0; >>> + >>> + if (mute) >>> + val = IT66121_AV_MUTE_ON; >>> + >>> + ret = regmap_write_bits(ctx->regmap, IT66121_AV_MUTE_REG, >>> IT66121_AV_MUTE_ON, val); >>> + if (ret) >>> + return ret; >>> + >>> + return regmap_write(ctx->regmap, IT66121_PKT_GEN_CTRL_REG, >>> + IT66121_PKT_GEN_CTRL_ON | >>> IT66121_PKT_GEN_CTRL_RPT); >>> +} >>> + >>> +#define MAX_OUTPUT_SEL_FORMATS 1 >>> + >>> +static u32 *it66121_bridge_atomic_get_output_bus_fmts(struct >>> drm_bridge *bridge, >>> + struct drm_bridge_state >>> *bridge_state, >>> + struct drm_crtc_state *crtc_state, >>> + struct drm_connector_state >>> *conn_state, >>> + unsigned int *num_output_fmts) >>> +{ >>> + u32 *output_fmts; >>> + >>> + output_fmts = kcalloc(MAX_OUTPUT_SEL_FORMATS, >>> sizeof(*output_fmts), >>> + GFP_KERNEL); >>> + if (!output_fmts) >>> + return NULL; >>> + >>> + /* TOFIX handle more than MEDIA_BUS_FMT_RGB888_1X24 as output >>> format */ >>> + output_fmts[0] = MEDIA_BUS_FMT_RGB888_1X24; >>> + *num_output_fmts = 1; >>> + >>> + return output_fmts; >>> +} >>> + >>> +#define MAX_INPUT_SEL_FORMATS 1 >>> + >>> +static u32 *it66121_bridge_atomic_get_input_bus_fmts(struct >>> drm_bridge *bridge, >>> + struct drm_bridge_state >>> *bridge_state, >>> + struct drm_crtc_state *crtc_state, >>> + struct drm_connector_state >>> *conn_state, >>> + u32 output_fmt, >>> + unsigned int *num_input_fmts) >>> +{ >>> + struct it66121_ctx *ctx = container_of(bridge, struct >>> it66121_ctx, bridge); >>> + u32 *input_fmts; >>> + >>> + *num_input_fmts = 0; >>> + >>> + input_fmts = kcalloc(MAX_INPUT_SEL_FORMATS, >>> sizeof(*input_fmts), >>> + GFP_KERNEL); >>> + if (!input_fmts) >>> + return NULL; >>> + >>> + if (ctx->bus_width == 12) >>> + /* IT66121FN Datasheet specifies Little-Endian ordering */ >>> + input_fmts[0] = MEDIA_BUS_FMT_RGB888_2X12_LE; >>> + else >>> + /* TOFIX support more input bus formats in 24bit width */ >>> + input_fmts[0] = MEDIA_BUS_FMT_RGB888_1X24; >>> + *num_input_fmts = 1; >>> + >>> + return input_fmts; >>> +} >>> + >>> +static void it66121_bridge_enable(struct drm_bridge *bridge) >>> +{ >>> + struct it66121_ctx *ctx = container_of(bridge, struct >>> it66121_ctx, bridge); >>> + >>> + it66121_set_mute(ctx, false); >>> +} >>> + >>> +static void it66121_bridge_disable(struct drm_bridge *bridge) >>> +{ >>> + struct it66121_ctx *ctx = container_of(bridge, struct >>> it66121_ctx, bridge); >>> + >>> + it66121_set_mute(ctx, true); >>> +} >>> + >>> +static >>> +void it66121_bridge_mode_set(struct drm_bridge *bridge, >>> + const struct drm_display_mode *mode, >>> + const struct drm_display_mode *adjusted_mode) >>> +{ >>> + int ret, i; >>> + u8 buf[HDMI_INFOFRAME_SIZE(AVI)]; >>> + struct it66121_ctx *ctx = container_of(bridge, struct >>> it66121_ctx, bridge); >>> + const u16 aviinfo_reg[HDMI_AVI_INFOFRAME_SIZE] = { >>> + IT66121_AVIINFO_DB1_REG, >>> + IT66121_AVIINFO_DB2_REG, >>> + IT66121_AVIINFO_DB3_REG, >>> + IT66121_AVIINFO_DB4_REG, >>> + IT66121_AVIINFO_DB5_REG, >>> + IT66121_AVIINFO_DB6_REG, >>> + IT66121_AVIINFO_DB7_REG, >>> + IT66121_AVIINFO_DB8_REG, >>> + IT66121_AVIINFO_DB9_REG, >>> + IT66121_AVIINFO_DB10_REG, >>> + IT66121_AVIINFO_DB11_REG, >>> + IT66121_AVIINFO_DB12_REG, >>> + IT66121_AVIINFO_DB13_REG >>> + }; >>> + >>> + mutex_lock(&ctx->lock); >>> + >>> + hdmi_avi_infoframe_init(&ctx->hdmi_avi_infoframe); >>> + >>> + ret = >>> drm_hdmi_avi_infoframe_from_display_mode(&ctx->hdmi_avi_infoframe, >>> &ctx->connector, >>> + adjusted_mode); >>> + if (ret) { >>> + DRM_ERROR("Failed to setup AVI infoframe: %d\n", ret); >>> + goto unlock; >>> + } >>> + >>> + ret = hdmi_avi_infoframe_pack(&ctx->hdmi_avi_infoframe, buf, >>> sizeof(buf)); >>> + if (ret < 0) { >>> + DRM_ERROR("Failed to pack infoframe: %d\n", ret); >>> + goto unlock; >>> + } >>> + >>> + /* Write new AVI infoframe packet */ >>> + for (i = 0; i < HDMI_AVI_INFOFRAME_SIZE; i++) { >>> + if (regmap_write(ctx->regmap, aviinfo_reg[i], buf[i + >>> HDMI_INFOFRAME_HEADER_SIZE])) >>> + goto unlock; >>> + } >>> + if (regmap_write(ctx->regmap, IT66121_AVIINFO_CSUM_REG, >>> buf[3])) >>> + goto unlock; >>> + >>> + /* Enable AVI infoframe */ >>> + if (regmap_write(ctx->regmap, IT66121_AVI_INFO_PKT_REG, >>> + IT66121_AVI_INFO_PKT_ON | IT66121_AVI_INFO_PKT_RPT)) >>> + goto unlock; >>> + >>> + /* Set TX mode to HDMI */ >>> + if (regmap_write(ctx->regmap, IT66121_HDMI_MODE_REG, >>> IT66121_HDMI_MODE_HDMI)) >>> + goto unlock; >>> + >>> + if (regmap_write_bits(ctx->regmap, IT66121_CLK_BANK_REG, >>> + IT66121_CLK_BANK_PWROFF_TXCLK, >>> IT66121_CLK_BANK_PWROFF_TXCLK)) >>> + goto unlock; >>> + >>> + if (it66121_configure_input(ctx)) >>> + goto unlock; >>> + >>> + if (it66121_configure_afe(ctx, adjusted_mode)) >>> + goto unlock; >>> + >>> + regmap_write_bits(ctx->regmap, IT66121_CLK_BANK_REG, >>> IT66121_CLK_BANK_PWROFF_TXCLK, 0); >>> + >>> +unlock: >>> + mutex_unlock(&ctx->lock); >>> +} >>> + >>> +static enum drm_mode_status it66121_bridge_mode_valid(struct >>> drm_bridge *bridge, >>> + const struct drm_display_info *info, >>> + const struct drm_display_mode *mode) >>> +{ >>> + struct it66121_ctx *ctx = container_of(bridge, struct >>> it66121_ctx, bridge); >>> + >>> + return it66121_mode_valid(ctx, mode); >>> +} >>> + >>> +static enum drm_connector_status it66121_bridge_detect(struct >>> drm_bridge *bridge) >>> +{ >>> + struct it66121_ctx *ctx = container_of(bridge, struct >>> it66121_ctx, bridge); >>> + >>> + return it66121_is_hpd_detect(ctx) ? connector_status_connected >>> + : connector_status_disconnected; >>> +} >>> + >>> +static struct edid *it66121_bridge_get_edid(struct drm_bridge >>> *bridge, >>> + struct drm_connector *connector) >>> +{ >>> + struct it66121_ctx *ctx = container_of(bridge, struct >>> it66121_ctx, bridge); >>> + struct edid *edid; >>> + >>> + mutex_lock(&ctx->lock); >>> + edid = drm_do_get_edid(connector, it66121_get_edid_block, >>> ctx); >>> + mutex_unlock(&ctx->lock); >>> + >>> + return edid; >>> +} >>> + >>> +static const struct drm_bridge_funcs it66121_bridge_funcs = { >>> + .attach = it66121_bridge_attach, >>> + .enable = it66121_bridge_enable, >>> + .disable = it66121_bridge_disable, >>> + .mode_set = it66121_bridge_mode_set, >>> + .mode_valid = it66121_bridge_mode_valid, >>> + .detect = it66121_bridge_detect, >>> + .get_edid = it66121_bridge_get_edid, >>> + .atomic_get_output_bus_fmts = >>> it66121_bridge_atomic_get_output_bus_fmts, >>> + .atomic_get_input_bus_fmts = >>> it66121_bridge_atomic_get_input_bus_fmts, >>> +}; >>> + >>> +static irqreturn_t it66121_irq_threaded_handler(int irq, void >>> *dev_id) >>> +{ >>> + int ret; >>> + unsigned int val; >>> + struct it66121_ctx *ctx = dev_id; >>> + struct device *dev = ctx->dev; >>> + bool event = false; >>> + >>> + mutex_lock(&ctx->lock); >>> + >>> + ret = regmap_read(ctx->regmap, IT66121_SYS_STATUS_REG, &val); >>> + if (ret) >>> + goto unlock; >>> + >>> + if (!(val & IT66121_SYS_STATUS_ACTIVE_IRQ)) >>> + goto unlock; >>> + >>> + ret = regmap_read(ctx->regmap, IT66121_INT_STATUS1_REG, &val); >>> + if (ret) { >>> + dev_err(dev, "Cannot read STATUS1_REG %d\n", ret); >>> + } else { >>> + if (val & IT66121_INT_STATUS1_DDC_FIFOERR) >>> + it66121_clear_ddc_fifo(ctx); >>> + if (val & (IT66121_INT_STATUS1_DDC_BUSHANG | >>> + IT66121_INT_STATUS1_DDC_NOACK)) >>> + it66121_abort_ddc_ops(ctx); >>> + if (val & IT66121_INT_STATUS1_HPD_STATUS) { >>> + regmap_write_bits(ctx->regmap, IT66121_INT_CLR1_REG, >>> + IT66121_INT_CLR1_HPD, IT66121_INT_CLR1_HPD); >>> + >>> + if (!it66121_is_hpd_detect(ctx)) { >>> + kfree(ctx->edid); >>> + ctx->edid = NULL; >>> + } >>> + >>> + event = true; >>> + } >>> + } >>> + >>> + regmap_write_bits(ctx->regmap, IT66121_SYS_STATUS_REG, >>> + IT66121_SYS_STATUS_CLEAR_IRQ, >>> + IT66121_SYS_STATUS_CLEAR_IRQ); >>> + >>> +unlock: >>> + mutex_unlock(&ctx->lock); >>> + >>> + if (event) >>> + drm_helper_hpd_irq_event(ctx->bridge.dev); >>> + >>> + return IRQ_HANDLED; >>> +} >>> + >>> +static int it66121_probe(struct i2c_client *client, >>> + const struct i2c_device_id *id) >>> +{ >>> + u32 vendor_ids[2], device_ids[2], revision_id; >>> + struct device_node *ep; >>> + int ret; >>> + struct it66121_ctx *ctx; >>> + struct device *dev = &client->dev; >>> + >>> + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { >>> + dev_err(dev, "I2C check functionality failed.\n"); >>> + return -ENXIO; >>> + } >>> + >>> + ep = of_graph_get_endpoint_by_regs(dev->of_node, 0, 0); >>> + if (!ep) >>> + return -EINVAL; >>> + >>> + ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL); >>> + if (!ctx) >>> + return -ENOMEM; >>> + >>> + ctx->dev = dev; >>> + ctx->client = client; >>> + >>> + of_property_read_u32(ep, "bus-width", &ctx->bus_width); >>> + of_node_put(ep); >>> + >>> + if (ctx->bus_width != 12 && ctx->bus_width != 24) >>> + return -EINVAL; >>> + >>> + i2c_set_clientdata(client, ctx); >>> + mutex_init(&ctx->lock); >>> + >>> + ctx->supplies[0].supply = "vcn33"; >>> + ctx->supplies[1].supply = "vcn18"; >>> + ctx->supplies[2].supply = "vrf12"; >>> + ret = devm_regulator_bulk_get(ctx->dev, 3, ctx->supplies); >>> + if (ret) { >>> + dev_err(ctx->dev, "regulator_bulk failed\n"); >>> + return ret; >>> + } >>> + >>> + ret = ite66121_power_on(ctx); >>> + if (ret) >>> + return ret; >>> + >>> + it66121_hw_reset(ctx); >>> + >>> + ctx->regmap = devm_regmap_init_i2c(client, >>> &it66121_regmap_config); >>> + if (IS_ERR(ctx->regmap)) { >>> + ite66121_power_off(ctx); >>> + return PTR_ERR(ctx); >>> + } >>> + >>> + regmap_read(ctx->regmap, IT66121_VENDOR_ID0_REG, >>> &vendor_ids[0]); >>> + regmap_read(ctx->regmap, IT66121_VENDOR_ID1_REG, >>> &vendor_ids[1]); >>> + regmap_read(ctx->regmap, IT66121_DEVICE_ID0_REG, >>> &device_ids[0]); >>> + regmap_read(ctx->regmap, IT66121_DEVICE_ID1_REG, >>> &device_ids[1]); >>> + >>> + /* Revision is shared with DEVICE_ID1 */ >>> + revision_id = FIELD_GET(IT66121_REVISION_MASK, device_ids[1]); >>> + device_ids[1] &= IT66121_DEVICE_ID1_MASK; >>> + >>> + if (vendor_ids[0] != IT66121_VENDOR_ID0 || vendor_ids[1] != >>> IT66121_VENDOR_ID1 || >>> + device_ids[0] != IT66121_DEVICE_ID0 || device_ids[1] != >>> IT66121_DEVICE_ID1) { >>> + ite66121_power_off(ctx); >>> + return -ENODEV; >>> + } >>> + >>> + ctx->bridge.funcs = &it66121_bridge_funcs; >>> + ctx->bridge.of_node = dev->of_node; >>> + >>> + ret = devm_request_threaded_irq(dev, client->irq, NULL, >>> it66121_irq_threaded_handler, >>> + IRQF_SHARED | IRQF_ONESHOT, dev_name(dev), >>> ctx); >>> + if (ret < 0) { >>> + dev_err(dev, "Failed to request irq %d:%d\n", >>> client->irq, ret); >>> + ite66121_power_off(ctx); >>> + return ret; >>> + } >>> + >>> + drm_bridge_add(&ctx->bridge); >>> + >>> + dev_info(ctx->dev, "IT66121 revision %d probed\n", >>> revision_id); >>> + >>> + return 0; >>> +} >>> + >>> +static int it66121_remove(struct i2c_client *client) >>> +{ >>> + struct it66121_ctx *ctx = i2c_get_clientdata(client); >>> + >>> + ite66121_power_off(ctx); >>> + drm_bridge_remove(&ctx->bridge); >>> + kfree(ctx->edid); >>> + mutex_destroy(&ctx->lock); >>> + >>> + return 0; >>> +} >>> + >>> +static const struct of_device_id it66121_dt_match[] = { >>> + { .compatible = "ite,it66121" }, >>> + { } >>> +}; >>> +MODULE_DEVICE_TABLE(of, it66121_dt_match); >>> + >>> +static const struct i2c_device_id it66121_id[] = { >>> + { "it66121", 0 }, >>> + { } >>> +}; >>> +MODULE_DEVICE_TABLE(i2c, it66121_id); >>> + >>> +static struct i2c_driver it66121_driver = { >>> + .driver = { >>> + .name = "it66121", >>> + .of_match_table = it66121_dt_match, >>> + }, >>> + .probe = it66121_probe, >>> + .remove = it66121_remove, >>> + .id_table = it66121_id, >>> +}; >>> + >>> +module_i2c_driver(it66121_driver); >>> + >>> +MODULE_AUTHOR("Phong LE"); >>> +MODULE_DESCRIPTION("IT66121 HDMI transmitter driver"); >>> +MODULE_LICENSE("GPL v2"); >>> -- >>> 2.25.1 >>> >> >> From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-13.8 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id CA00DC433ED for ; Wed, 14 Apr 2021 08:15:55 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 730766128E for ; Wed, 14 Apr 2021 08:15:55 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 730766128E Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=crapouillou.net Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id DDE556E8F3; Wed, 14 Apr 2021 08:15:54 +0000 (UTC) Received: from aposti.net (aposti.net [89.234.176.197]) by gabe.freedesktop.org (Postfix) with ESMTPS id 38B696E8F1 for ; Wed, 14 Apr 2021 08:15:53 +0000 (UTC) Date: Wed, 14 Apr 2021 09:15:35 +0100 From: Paul Cercueil Subject: Re: [PATCH v3 2/3] drm: bridge: add it66121 driver To: Neil Armstrong Message-Id: In-Reply-To: <1d963840-cb96-399b-7f27-ce3eb9ad6083@baylibre.com> References: <20210412154648.3719153-1-narmstrong@baylibre.com> <20210412154648.3719153-3-narmstrong@baylibre.com> <1d963840-cb96-399b-7f27-ce3eb9ad6083@baylibre.com> MIME-Version: 1.0 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: jernej.skrabec@siol.net, jonas@kwiboo.se, robert.foss@linaro.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, Phong LE , a.hajda@samsung.com, Laurent.pinchart@ideasonboard.com Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" CgpMZSBtZXIuIDE0IGF2cmlsIDIwMjEgw6AgODoxNywgTmVpbCBBcm1zdHJvbmcgPG5hcm1zdHJv bmdAYmF5bGlicmUuY29tPiAKYSDDqWNyaXQgOgo+IEhpLAo+IAo+IExlIDEzLzA0LzIwMjEgw6Ag MjI6NTYsIFBhdWwgQ2VyY3VlaWwgYSDDqWNyaXQgOgo+PiAgSGkgTmVpbCwKPj4gCj4+ICBJIGdl dCBidWlsZCBmYWlsdXJlcyBsb2NhbGx5Ogo+PiAKPj4gIGRyaXZlcnMvZ3B1L2RybS9icmlkZ2Uv aXRlLWl0NjYxMjEuYzogSW4gZnVuY3Rpb24gCj4+IOKAmGl0NjYxMjFfaHdfcmVzZXTigJk6Cj4+ ICBkcml2ZXJzL2dwdS9kcm0vYnJpZGdlL2l0ZS1pdDY2MTIxLmM6MjQyOjI6IGVycm9yOiBpbXBs aWNpdCAKPj4gZGVjbGFyYXRpb24gb2YgZnVuY3Rpb24g4oCYZ3Bpb2Rfc2V0X3ZhbHVl4oCZIAo+ PiBbLVdlcnJvcj1pbXBsaWNpdC1mdW5jdGlvbi1kZWNsYXJhdGlvbl0KPj4gIDI0MiB8IGdwaW9k X3NldF92YWx1ZShjdHgtPmdwaW9fcmVzZXQsIDEpOwo+PiAgICAgIHwgXn5+fn5+fn5+fn5+fn5+ Cj4+ICBkcml2ZXJzL2dwdS9kcm0vYnJpZGdlL2l0ZS1pdDY2MTIxLmM6IEluIGZ1bmN0aW9uIAo+ PiDigJhpdDY2MTIxX3Byb2Jl4oCZOgo+PiAgZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9pdGUtaXQ2 NjEyMS5jOjEwMTY6MTY6IGVycm9yOiBpbXBsaWNpdCAKPj4gZGVjbGFyYXRpb24gb2YgZnVuY3Rp b24g4oCYRklFTERfR0VU4oCZOyBkaWQgeW91IG1lYW4gCj4+IOKAmEZPTExfR0VU4oCZPyBbLVdl cnJvcj1pbXBsaWNpdC1mdW5jdGlvbi1kZWNsYXJhdGlvbl0KPj4gIDEwMTYgfCByZXZpc2lvbl9p ZCA9IEZJRUxEX0dFVChJVDY2MTIxX1JFVklTSU9OX01BU0ssIAo+PiBkZXZpY2VfaWRzWzFdKTsK Pj4gICAgICB8IF5+fn5+fn5+fgo+PiAgICAgIHwgRk9MTF9HRVQKPj4gCj4+ICBOb3RoaW5nIGRp ZmZpY3VsdCB0byBmaXgsIGJ1dCB0aGUgaW5jbHVkZXMgc2hvdWxkIGJlIGFkZGVkIAo+PiBub25l dGhlbGVzcy4KPiAKPiBFeGFjdCwgSSBnb3QgdGhlIENJIGJ1aWxkIGZhaWx1cmVzLCBJJ2xsIGZp eCB0aGVzZSBmb3IgdjQuCj4gCj4gV2VyZSB5b3UgYWJsZSB0byB0ZXN0IG9uIHlvdXIgc2V0dXAg Pwo+IFRoZSB2MiBhbHdheXMgZm9yY2VkIEREUiBtb2RlLCB3aXRoIHRoaXMgdjMsIEkgYWxzbyBz d2l0Y2ggdG8gbm9ybWFsIAo+IDI0aW5wdXQgbW9kZSwgYnV0IHRvdGFsbHkgdW50ZXN0ZWQuCgpJ IHdpbGwgdHJ5IHRvIGZpbmQgc29tZSB0aW1lIHRvZGF5IHRvIHRlc3QgYWZ0ZXIgd29yay4KCi1Q YXVsCgoKPiBUaGFua3MsCj4gTmVpbAo+IAo+PiAKPj4gIENoZWVycywKPj4gIC1QYXVsCj4+IAo+ PiAKPj4gIExlIGx1bi4gMTIgYXZyaWwgMjAyMSDDoCAxNzo0NiwgTmVpbCBBcm1zdHJvbmcgCj4+ IDxuYXJtc3Ryb25nQGJheWxpYnJlLmNvbT4gYSDDqWNyaXQgOgo+Pj4gIEZyb206IFBob25nIExF IDxwbGVAYmF5bGlicmUuY29tPgo+Pj4gCj4+PiAgVGhpcyBjb21taXQgaXMgYSBzaW1wbGUgZHJp dmVyIGZvciBicmlkZ2UgSE1ESSBpdDY2MTIxLgo+Pj4gIFRoZSBpbnB1dCBmb3JtYXQgaXMgUkJH IGFuZCB0aGVyZSBpcyBubyBjb2xvciBjb252ZXJzaW9uLgo+Pj4gIEF1ZGlvLCBIRENQIGFuZCBD RUMgYXJlIG5vdCBzdXBwb3J0ZWQgeWV0Lgo+Pj4gCj4+PiAgU2lnbmVkLW9mZi1ieTogUGhvbmcg TEUgPHBsZUBiYXlsaWJyZS5jb20+Cj4+PiAgU2lnbmVkLW9mZi1ieTogTmVpbCBBcm1zdHJvbmcg PG5hcm1zdHJvbmdAYmF5bGlicmUuY29tPgo+Pj4gIC0tLQo+Pj4gICBkcml2ZXJzL2dwdS9kcm0v YnJpZGdlL0tjb25maWcgICAgICAgfCAgICA4ICsKPj4+ICAgZHJpdmVycy9ncHUvZHJtL2JyaWRn ZS9NYWtlZmlsZSAgICAgIHwgICAgMSArCj4+PiAgIGRyaXZlcnMvZ3B1L2RybS9icmlkZ2UvaXRl LWl0NjYxMjEuYyB8IDEwODEgCj4+PiArKysrKysrKysrKysrKysrKysrKysrKysrKwo+Pj4gICAz IGZpbGVzIGNoYW5nZWQsIDEwOTAgaW5zZXJ0aW9ucygrKQo+Pj4gICBjcmVhdGUgbW9kZSAxMDA2 NDQgZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9pdGUtaXQ2NjEyMS5jCj4+PiAKPj4+ICBkaWZmIC0t Z2l0IGEvZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9LY29uZmlnIAo+Pj4gYi9kcml2ZXJzL2dwdS9k cm0vYnJpZGdlL0tjb25maWcKPj4+ICBpbmRleCBlNDExMGQ2Y2E3YjMuLjY5MTVjMzhmYTQ1OSAx MDA2NDQKPj4+ICAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL0tjb25maWcKPj4+ICArKysg Yi9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL0tjb25maWcKPj4+ICBAQCAtNzQsNiArNzQsMTQgQEAg Y29uZmlnIERSTV9MT05USVVNX0xUOTYxMVVYQwo+Pj4gICAgICAgICBIRE1JIHNpZ25hbHMKPj4+ ICAgICAgICAgUGxlYXNlIHNheSBZIGlmIHlvdSBoYXZlIHN1Y2ggaGFyZHdhcmUuCj4+PiAKPj4+ ICArY29uZmlnIERSTV9JVEVfSVQ2NjEyMQo+Pj4gICsgICAgdHJpc3RhdGUgIklURSBJVDY2MTIx IEhETUkgYnJpZGdlIgo+Pj4gICsgICAgZGVwZW5kcyBvbiBPRgo+Pj4gICsgICAgc2VsZWN0IERS TV9LTVNfSEVMUEVSCj4+PiAgKyAgICBzZWxlY3QgUkVHTUFQX0kyQwo+Pj4gICsgICAgaGVscAo+ Pj4gICsgICAgICBTdXBwb3J0IGZvciBJVEUgSVQ2NjEyMSBIRE1JIGJyaWRnZS4KPj4+ICArCj4+ PiAgIGNvbmZpZyBEUk1fTFZEU19DT0RFQwo+Pj4gICAgICAgdHJpc3RhdGUgIlRyYW5zcGFyZW50 IExWRFMgZW5jb2RlcnMgYW5kIGRlY29kZXJzIHN1cHBvcnQiCj4+PiAgICAgICBkZXBlbmRzIG9u IE9GCj4+PiAgZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9icmlkZ2UvTWFrZWZpbGUgCj4+ PiBiL2RyaXZlcnMvZ3B1L2RybS9icmlkZ2UvTWFrZWZpbGUKPj4+ICBpbmRleCA4NmU3YWNjNzZm OGQuLjRmNzI1NzUzMTE3YyAxMDA2NDQKPj4+ICAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vYnJpZGdl L01ha2VmaWxlCj4+PiAgKysrIGIvZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9NYWtlZmlsZQo+Pj4g IEBAIC0yNCw2ICsyNCw3IEBAIG9iai0kKENPTkZJR19EUk1fVElfU042NURTSTg2KSArPSB0aS1z bjY1ZHNpODYubwo+Pj4gICBvYmotJChDT05GSUdfRFJNX1RJX1RGUDQxMCkgKz0gdGktdGZwNDEw Lm8KPj4+ICAgb2JqLSQoQ09ORklHX0RSTV9USV9UUEQxMlMwMTUpICs9IHRpLXRwZDEyczAxNS5v Cj4+PiAgIG9iai0kKENPTkZJR19EUk1fTldMX01JUElfRFNJKSArPSBud2wtZHNpLm8KPj4+ICAr b2JqLSQoQ09ORklHX0RSTV9JVEVfSVQ2NjEyMSkgKz0gaXRlLWl0NjYxMjEubwo+Pj4gCj4+PiAg IG9iai15ICs9IGFuYWxvZ2l4Lwo+Pj4gICBvYmoteSArPSBjYWRlbmNlLwo+Pj4gIGRpZmYgLS1n aXQgYS9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL2l0ZS1pdDY2MTIxLmMgCj4+PiBiL2RyaXZlcnMv Z3B1L2RybS9icmlkZ2UvaXRlLWl0NjYxMjEuYwo+Pj4gIG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4+ PiAgaW5kZXggMDAwMDAwMDAwMDAwLi43M2FmNDliMjlkZmEKPj4+ICAtLS0gL2Rldi9udWxsCj4+ PiAgKysrIGIvZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9pdGUtaXQ2NjEyMS5jCj4+PiAgQEAgLTAs MCArMSwxMDgxIEBACj4+PiAgKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9u bHkKPj4+ICArLyoKPj4+ICArICogQ29weXJpZ2h0IChDKSAyMDIwIEJheUxpYnJlLCBTQVMKPj4+ ICArICogQXV0aG9yOiBQaG9uZyBMRSA8cGxlQGJheWxpYnJlLmNvbT4KPj4+ICArICogQ29weXJp Z2h0IChDKSAyMDE4LTIwMTksIEFydGVtIE15Z2FpZXYKPj4+ICArICogQ29weXJpZ2h0IChDKSAy MDE3LCBGcmVzY28gTG9naWMsIEluY29ycG9yYXRlZC4KPj4+ICArICoKPj4+ICArICovCj4+PiAg Kwo+Pj4gICsjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Cj4+PiAgKyNpbmNsdWRlIDxsaW51eC9p MmMuaD4KPj4+ICArI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgo+Pj4gICsjaW5jbHVkZSA8 bGludXgvbW9kdWxlLmg+Cj4+PiAgKyNpbmNsdWRlIDxsaW51eC9wcm9wZXJ0eS5oPgo+Pj4gICsj aW5jbHVkZSA8bGludXgvb2ZfZ3JhcGguaD4KPj4+ICArI2luY2x1ZGUgPGxpbnV4L3BpbmN0cmwv Y29uc3VtZXIuaD4KPj4+ICArI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgo+Pj4gICsjaW5jbHVk ZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+Cj4+PiAgKwo+Pj4gICsjaW5jbHVkZSA8ZHJt L2RybV9hdG9taWNfaGVscGVyLmg+Cj4+PiAgKyNpbmNsdWRlIDxkcm0vZHJtX2JyaWRnZS5oPgo+ Pj4gICsjaW5jbHVkZSA8ZHJtL2RybV9jcnRjX2hlbHBlci5oPgo+Pj4gICsjaW5jbHVkZSA8ZHJt L2RybV9lZGlkLmg+Cj4+PiAgKyNpbmNsdWRlIDxkcm0vZHJtX21vZGVzLmg+Cj4+PiAgKyNpbmNs dWRlIDxkcm0vZHJtX3ByaW50Lmg+Cj4+PiAgKyNpbmNsdWRlIDxkcm0vZHJtX3Byb2JlX2hlbHBl ci5oPgo+Pj4gICsKPj4+ICArI2RlZmluZSBJVDY2MTIxX1ZFTkRPUl9JRDBfUkVHICAgICAgICAg ICAgMHgwMAo+Pj4gICsjZGVmaW5lIElUNjYxMjFfVkVORE9SX0lEMV9SRUcgICAgICAgICAgICAw eDAxCj4+PiAgKyNkZWZpbmUgSVQ2NjEyMV9ERVZJQ0VfSUQwX1JFRyAgICAgICAgICAgIDB4MDIK Pj4+ICArI2RlZmluZSBJVDY2MTIxX0RFVklDRV9JRDFfUkVHICAgICAgICAgICAgMHgwMwo+Pj4g ICsKPj4+ICArI2RlZmluZSBJVDY2MTIxX1ZFTkRPUl9JRDAgICAgICAgICAgICAweDU0Cj4+PiAg KyNkZWZpbmUgSVQ2NjEyMV9WRU5ET1JfSUQxICAgICAgICAgICAgMHg0OQo+Pj4gICsjZGVmaW5l IElUNjYxMjFfREVWSUNFX0lEMCAgICAgICAgICAgIDB4MTIKPj4+ICArI2RlZmluZSBJVDY2MTIx X0RFVklDRV9JRDEgICAgICAgICAgICAweDA2Cj4+PiAgKyNkZWZpbmUgSVQ2NjEyMV9SRVZJU0lP Tl9NQVNLICAgICAgICAgICAgR0VOTUFTSyg3LCA0KQo+Pj4gICsjZGVmaW5lIElUNjYxMjFfREVW SUNFX0lEMV9NQVNLICAgICAgICAgICAgR0VOTUFTSygzLCAwKQo+Pj4gICsKPj4+ICArI2RlZmlu ZSBJVDY2MTIxX01BU1RFUl9TRUxfUkVHICAgICAgICAgICAgMHgxMAo+Pj4gICsjZGVmaW5lIElU NjYxMjFfTUFTVEVSX1NFTF9IT1NUICAgICAgICAgICAgQklUKDApCj4+PiAgKwo+Pj4gICsjZGVm aW5lIElUNjYxMjFfQUZFX0RSVl9SRUcgICAgICAgICAgICAweDYxCj4+PiAgKyNkZWZpbmUgSVQ2 NjEyMV9BRkVfRFJWX1JTVCAgICAgICAgICAgIEJJVCg0KQo+Pj4gICsjZGVmaW5lIElUNjYxMjFf QUZFX0RSVl9QV0QgICAgICAgICAgICBCSVQoNSkKPj4+ICArCj4+PiAgKyNkZWZpbmUgSVQ2NjEy MV9JTlBVVF9NT0RFX1JFRyAgICAgICAgICAgIDB4NzAKPj4+ICArI2RlZmluZSBJVDY2MTIxX0lO UFVUX01PREVfUkdCICAgICAgICAgICAgKDAgPDwgNikKPj4+ICArI2RlZmluZSBJVDY2MTIxX0lO UFVUX01PREVfWVVWNDIyICAgICAgICBCSVQoNikKPj4+ICArI2RlZmluZSBJVDY2MTIxX0lOUFVU X01PREVfWVVWNDQ0ICAgICAgICAoMiA8PCA2KQo+Pj4gICsjZGVmaW5lIElUNjYxMjFfSU5QVVRf TU9ERV9DQ0lSNjU2ICAgICAgICBCSVQoNCkKPj4+ICArI2RlZmluZSBJVDY2MTIxX0lOUFVUX01P REVfU1lOQ0VNQiAgICAgICAgQklUKDMpCj4+PiAgKyNkZWZpbmUgSVQ2NjEyMV9JTlBVVF9NT0RF X0REUiAgICAgICAgICAgIEJJVCgyKQo+Pj4gICsKPj4+ICArI2RlZmluZSBJVDY2MTIxX0lOUFVU X0NTQ19SRUcgICAgICAgICAgICAweDcyCj4+PiAgKyNkZWZpbmUgSVQ2NjEyMV9JTlBVVF9DU0Nf RU5ESVRIRVIgICAgICAgIEJJVCg3KQo+Pj4gICsjZGVmaW5lIElUNjYxMjFfSU5QVVRfQ1NDX0VO VURGSUxURVIgICAgICAgIEJJVCg2KQo+Pj4gICsjZGVmaW5lIElUNjYxMjFfSU5QVVRfQ1NDX0RO RlJFRV9HTyAgICAgICAgQklUKDUpCj4+PiAgKyNkZWZpbmUgSVQ2NjEyMV9JTlBVVF9DU0NfUkdC X1RPX1lVViAgICAgICAgMHgwMgo+Pj4gICsjZGVmaW5lIElUNjYxMjFfSU5QVVRfQ1NDX1lVVl9U T19SR0IgICAgICAgIDB4MDMKPj4+ICArI2RlZmluZSBJVDY2MTIxX0lOUFVUX0NTQ19OT19DT05W ICAgICAgICAweDAwCj4+PiAgKwo+Pj4gICsjZGVmaW5lIElUNjYxMjFfQUZFX1hQX1JFRyAgICAg ICAgICAgIDB4NjIKPj4+ICArI2RlZmluZSBJVDY2MTIxX0FGRV9YUF9HQUlOQklUICAgICAgICAg ICAgQklUKDcpCj4+PiAgKyNkZWZpbmUgSVQ2NjEyMV9BRkVfWFBfUFdEUExMICAgICAgICAgICAg QklUKDYpCj4+PiAgKyNkZWZpbmUgSVQ2NjEyMV9BRkVfWFBfRU5JICAgICAgICAgICAgQklUKDUp Cj4+PiAgKyNkZWZpbmUgSVQ2NjEyMV9BRkVfWFBfRU5PICAgICAgICAgICAgQklUKDQpCj4+PiAg KyNkZWZpbmUgSVQ2NjEyMV9BRkVfWFBfUkVTRVRCICAgICAgICAgICAgQklUKDMpCj4+PiAgKyNk ZWZpbmUgSVQ2NjEyMV9BRkVfWFBfUFdESSAgICAgICAgICAgIEJJVCgyKQo+Pj4gICsKPj4+ICAr I2RlZmluZSBJVDY2MTIxX0FGRV9JUF9SRUcgICAgICAgICAgICAweDY0Cj4+PiAgKyNkZWZpbmUg SVQ2NjEyMV9BRkVfSVBfR0FJTkJJVCAgICAgICAgICAgIEJJVCg3KQo+Pj4gICsjZGVmaW5lIElU NjYxMjFfQUZFX0lQX1BXRFBMTCAgICAgICAgICAgIEJJVCg2KQo+Pj4gICsjZGVmaW5lIElUNjYx MjFfQUZFX0lQX0NLU0VMXzA1ICAgICAgICAgICAgKDAgPDwgNCkKPj4+ICArI2RlZmluZSBJVDY2 MTIxX0FGRV9JUF9DS1NFTF8xICAgICAgICAgICAgQklUKDQpCj4+PiAgKyNkZWZpbmUgSVQ2NjEy MV9BRkVfSVBfQ0tTRUxfMiAgICAgICAgICAgICgyIDw8IDQpCj4+PiAgKyNkZWZpbmUgSVQ2NjEy MV9BRkVfSVBfQ0tTRUxfMk9SNCAgICAgICAgKDMgPDwgNCkKPj4+ICArI2RlZmluZSBJVDY2MTIx X0FGRV9JUF9FUjAgICAgICAgICAgICBCSVQoMykKPj4+ICArI2RlZmluZSBJVDY2MTIxX0FGRV9J UF9SRVNFVEIgICAgICAgICAgICBCSVQoMikKPj4+ICArI2RlZmluZSBJVDY2MTIxX0FGRV9JUF9F TkMgICAgICAgICAgICBCSVQoMSkKPj4+ICArI2RlZmluZSBJVDY2MTIxX0FGRV9JUF9FQzEgICAg ICAgICAgICBCSVQoMCkKPj4+ICArCj4+PiAgKyNkZWZpbmUgSVQ2NjEyMV9BRkVfWFBfRUMxX1JF RyAgICAgICAgICAgIDB4NjgKPj4+ICArI2RlZmluZSBJVDY2MTIxX0FGRV9YUF9FQzFfTE9XQ0xL ICAgICAgICBCSVQoNCkKPj4+ICArCj4+PiAgKyNkZWZpbmUgSVQ2NjEyMV9TV19SU1RfUkVHICAg ICAgICAgICAgMHgwNAo+Pj4gICsjZGVmaW5lIElUNjYxMjFfU1dfUlNUX1JFRiAgICAgICAgICAg IEJJVCg1KQo+Pj4gICsjZGVmaW5lIElUNjYxMjFfU1dfUlNUX0FSRUYgICAgICAgICAgICBCSVQo NCkKPj4+ICArI2RlZmluZSBJVDY2MTIxX1NXX1JTVF9WSUQgICAgICAgICAgICBCSVQoMykKPj4+ ICArI2RlZmluZSBJVDY2MTIxX1NXX1JTVF9BVUQgICAgICAgICAgICBCSVQoMikKPj4+ICArI2Rl ZmluZSBJVDY2MTIxX1NXX1JTVF9IRENQICAgICAgICAgICAgQklUKDApCj4+PiAgKwo+Pj4gICsj ZGVmaW5lIElUNjYxMjFfRERDX0NPTU1BTkRfUkVHICAgICAgICAgICAgMHgxNQo+Pj4gICsjZGVm aW5lIElUNjYxMjFfRERDX0NPTU1BTkRfQlVSU1RfUkVBRCAgICAgICAgMHgwCj4+PiAgKyNkZWZp bmUgSVQ2NjEyMV9ERENfQ09NTUFORF9FRElEX1JFQUQgICAgICAgIDB4Mwo+Pj4gICsjZGVmaW5l IElUNjYxMjFfRERDX0NPTU1BTkRfRklGT19DTFIgICAgICAgIDB4OQo+Pj4gICsjZGVmaW5lIElU NjYxMjFfRERDX0NPTU1BTkRfU0NMX1BVTFNFICAgICAgICAweEEKPj4+ICArI2RlZmluZSBJVDY2 MTIxX0REQ19DT01NQU5EX0FCT1JUICAgICAgICAweEYKPj4+ICArCj4+PiAgKyNkZWZpbmUgSVQ2 NjEyMV9IRENQX1JFRyAgICAgICAgICAgIDB4MjAKPj4+ICArI2RlZmluZSBJVDY2MTIxX0hEQ1Bf Q1BERVNJUkVEICAgICAgICAgICAgQklUKDApCj4+PiAgKyNkZWZpbmUgSVQ2NjEyMV9IRENQX0VO MVAxRkVBVCAgICAgICAgICAgIEJJVCgxKQo+Pj4gICsKPj4+ICArI2RlZmluZSBJVDY2MTIxX0lO VF9TVEFUVVMxX1JFRyAgICAgICAgICAgIDB4MDYKPj4+ICArI2RlZmluZSBJVDY2MTIxX0lOVF9T VEFUVVMxX0FVRF9PVkYgICAgICAgIEJJVCg3KQo+Pj4gICsjZGVmaW5lIElUNjYxMjFfSU5UX1NU QVRVUzFfRERDX05PQUNLICAgICAgICBCSVQoNSkKPj4+ICArI2RlZmluZSBJVDY2MTIxX0lOVF9T VEFUVVMxX0REQ19GSUZPRVJSICAgICAgICBCSVQoNCkKPj4+ICArI2RlZmluZSBJVDY2MTIxX0lO VF9TVEFUVVMxX0REQ19CVVNIQU5HICAgICAgICBCSVQoMikKPj4+ICArI2RlZmluZSBJVDY2MTIx X0lOVF9TVEFUVVMxX1JYX1NFTlNfU1RBVFVTICAgIEJJVCgxKQo+Pj4gICsjZGVmaW5lIElUNjYx MjFfSU5UX1NUQVRVUzFfSFBEX1NUQVRVUyAgICAgICAgQklUKDApCj4+PiAgKwo+Pj4gICsjZGVm aW5lIElUNjYxMjFfRERDX0hFQURFUl9SRUcgICAgICAgICAgICAweDExCj4+PiAgKyNkZWZpbmUg SVQ2NjEyMV9ERENfSEVBREVSX0hEQ1AgICAgICAgICAgICAweDc0Cj4+PiAgKyNkZWZpbmUgSVQ2 NjEyMV9ERENfSEVBREVSX0VESUQgICAgICAgICAgICAweEEwCj4+PiAgKwo+Pj4gICsjZGVmaW5l IElUNjYxMjFfRERDX09GRlNFVF9SRUcgICAgICAgICAgICAweDEyCj4+PiAgKyNkZWZpbmUgSVQ2 NjEyMV9ERENfQllURV9SRUcgICAgICAgICAgICAweDEzCj4+PiAgKyNkZWZpbmUgSVQ2NjEyMV9E RENfU0VHTUVOVF9SRUcgICAgICAgICAgICAweDE0Cj4+PiAgKyNkZWZpbmUgSVQ2NjEyMV9ERENf UkRfRklGT19SRUcgICAgICAgICAgICAweDE3Cj4+PiAgKwo+Pj4gICsjZGVmaW5lIElUNjYxMjFf Q0xLX0JBTktfUkVHICAgICAgICAgICAgMHgwRgo+Pj4gICsjZGVmaW5lIElUNjYxMjFfQ0xLX0JB TktfUFdST0ZGX1JDTEsgICAgICAgIEJJVCg2KQo+Pj4gICsjZGVmaW5lIElUNjYxMjFfQ0xLX0JB TktfUFdST0ZGX0FDTEsgICAgICAgIEJJVCg1KQo+Pj4gICsjZGVmaW5lIElUNjYxMjFfQ0xLX0JB TktfUFdST0ZGX1RYQ0xLICAgICAgICBCSVQoNCkKPj4+ICArI2RlZmluZSBJVDY2MTIxX0NMS19C QU5LX1BXUk9GRl9DUkNMSyAgICAgICAgQklUKDMpCj4+PiAgKyNkZWZpbmUgSVQ2NjEyMV9DTEtf QkFOS18wICAgICAgICAgICAgMAo+Pj4gICsjZGVmaW5lIElUNjYxMjFfQ0xLX0JBTktfMSAgICAg ICAgICAgIDEKPj4+ICArCj4+PiAgKyNkZWZpbmUgSVQ2NjEyMV9JTlRfUkVHICAgICAgICAgICAg ICAgIDB4MDUKPj4+ICArI2RlZmluZSBJVDY2MTIxX0lOVF9BQ1RJVkVfSElHSCAgICAgICAgICAg IEJJVCg3KQo+Pj4gICsjZGVmaW5lIElUNjYxMjFfSU5UX09QRU5fRFJBSU4gICAgICAgICAgICBC SVQoNikKPj4+ICArI2RlZmluZSBJVDY2MTIxX0lOVF9UWF9DTEtfT0ZGICAgICAgICAgICAgQklU KDApCj4+PiAgKwo+Pj4gICsjZGVmaW5lIElUNjYxMjFfSU5UX01BU0sxX1JFRyAgICAgICAgICAg IDB4MDkKPj4+ICArI2RlZmluZSBJVDY2MTIxX0lOVF9NQVNLMV9BVURfT1ZGICAgICAgICBCSVQo NykKPj4+ICArI2RlZmluZSBJVDY2MTIxX0lOVF9NQVNLMV9ERENfTk9BQ0sgICAgICAgIEJJVCg1 KQo+Pj4gICsjZGVmaW5lIElUNjYxMjFfSU5UX01BU0sxX0REQ19GSUZPRVJSICAgICAgICBCSVQo NCkKPj4+ICArI2RlZmluZSBJVDY2MTIxX0lOVF9NQVNLMV9ERENfQlVTSEFORyAgICAgICAgQklU KDIpCj4+PiAgKyNkZWZpbmUgSVQ2NjEyMV9JTlRfTUFTSzFfUlhfU0VOUyAgICAgICAgQklUKDEp Cj4+PiAgKyNkZWZpbmUgSVQ2NjEyMV9JTlRfTUFTSzFfSFBEICAgICAgICAgICAgQklUKDApCj4+ PiAgKwo+Pj4gICsjZGVmaW5lIElUNjYxMjFfSU5UX0NMUjFfUkVHICAgICAgICAgICAgMHgwQwo+ Pj4gICsjZGVmaW5lIElUNjYxMjFfSU5UX0NMUjFfUEtUQUNQICAgICAgICAgICAgQklUKDcpCj4+ PiAgKyNkZWZpbmUgSVQ2NjEyMV9JTlRfQ0xSMV9QS1ROVUxMICAgICAgICBCSVQoNikKPj4+ICAr I2RlZmluZSBJVDY2MTIxX0lOVF9DTFIxX1BLVEdFTiAgICAgICAgICAgIEJJVCg1KQo+Pj4gICsj ZGVmaW5lIElUNjYxMjFfSU5UX0NMUjFfS1NWTElTVENISyAgICAgICAgQklUKDQpCj4+PiAgKyNk ZWZpbmUgSVQ2NjEyMV9JTlRfQ0xSMV9BVVRIRE9ORSAgICAgICAgQklUKDMpCj4+PiAgKyNkZWZp bmUgSVQ2NjEyMV9JTlRfQ0xSMV9BVVRIRkFJTCAgICAgICAgQklUKDIpCj4+PiAgKyNkZWZpbmUg SVQ2NjEyMV9JTlRfQ0xSMV9SWF9TRU5TICAgICAgICBCSVQoMSkKPj4+ICArI2RlZmluZSBJVDY2 MTIxX0lOVF9DTFIxX0hQRCAgICAgICAgICAgIEJJVCgwKQo+Pj4gICsKPj4+ICArI2RlZmluZSBJ VDY2MTIxX0FWX01VVEVfUkVHICAgICAgICAgICAgMHhDMQo+Pj4gICsjZGVmaW5lIElUNjYxMjFf QVZfTVVURV9PTiAgICAgICAgICAgIEJJVCgwKQo+Pj4gICsjZGVmaW5lIElUNjYxMjFfQVZfTVVU RV9CTFVFU0NSICAgICAgICAgICAgQklUKDEpCj4+PiAgKwo+Pj4gICsjZGVmaW5lIElUNjYxMjFf UEtUX0dFTl9DVFJMX1JFRyAgICAgICAgMHhDNgo+Pj4gICsjZGVmaW5lIElUNjYxMjFfUEtUX0dF Tl9DVFJMX09OICAgICAgICAgICAgQklUKDApCj4+PiAgKyNkZWZpbmUgSVQ2NjEyMV9QS1RfR0VO X0NUUkxfUlBUICAgICAgICBCSVQoMSkKPj4+ICArCj4+PiAgKyNkZWZpbmUgSVQ2NjEyMV9BVklJ TkZPX0RCMV9SRUcgICAgICAgICAgICAweDE1OAo+Pj4gICsjZGVmaW5lIElUNjYxMjFfQVZJSU5G T19EQjJfUkVHICAgICAgICAgICAgMHgxNTkKPj4+ICArI2RlZmluZSBJVDY2MTIxX0FWSUlORk9f REIzX1JFRyAgICAgICAgICAgIDB4MTVBCj4+PiAgKyNkZWZpbmUgSVQ2NjEyMV9BVklJTkZPX0RC NF9SRUcgICAgICAgICAgICAweDE1Qgo+Pj4gICsjZGVmaW5lIElUNjYxMjFfQVZJSU5GT19EQjVf UkVHICAgICAgICAgICAgMHgxNUMKPj4+ICArI2RlZmluZSBJVDY2MTIxX0FWSUlORk9fQ1NVTV9S RUcgICAgICAgIDB4MTVECj4+PiAgKyNkZWZpbmUgSVQ2NjEyMV9BVklJTkZPX0RCNl9SRUcgICAg ICAgICAgICAweDE1RQo+Pj4gICsjZGVmaW5lIElUNjYxMjFfQVZJSU5GT19EQjdfUkVHICAgICAg ICAgICAgMHgxNUYKPj4+ICArI2RlZmluZSBJVDY2MTIxX0FWSUlORk9fREI4X1JFRyAgICAgICAg ICAgIDB4MTYwCj4+PiAgKyNkZWZpbmUgSVQ2NjEyMV9BVklJTkZPX0RCOV9SRUcgICAgICAgICAg ICAweDE2MQo+Pj4gICsjZGVmaW5lIElUNjYxMjFfQVZJSU5GT19EQjEwX1JFRyAgICAgICAgMHgx NjIKPj4+ICArI2RlZmluZSBJVDY2MTIxX0FWSUlORk9fREIxMV9SRUcgICAgICAgIDB4MTYzCj4+ PiAgKyNkZWZpbmUgSVQ2NjEyMV9BVklJTkZPX0RCMTJfUkVHICAgICAgICAweDE2NAo+Pj4gICsj ZGVmaW5lIElUNjYxMjFfQVZJSU5GT19EQjEzX1JFRyAgICAgICAgMHgxNjUKPj4+ICArCj4+PiAg KyNkZWZpbmUgSVQ2NjEyMV9BVklfSU5GT19QS1RfUkVHICAgICAgICAweENECj4+PiAgKyNkZWZp bmUgSVQ2NjEyMV9BVklfSU5GT19QS1RfT04gICAgICAgICAgICBCSVQoMCkKPj4+ICArI2RlZmlu ZSBJVDY2MTIxX0FWSV9JTkZPX1BLVF9SUFQgICAgICAgIEJJVCgxKQo+Pj4gICsKPj4+ICArI2Rl ZmluZSBJVDY2MTIxX0hETUlfTU9ERV9SRUcgICAgICAgICAgICAweEMwCj4+PiAgKyNkZWZpbmUg SVQ2NjEyMV9IRE1JX01PREVfSERNSSAgICAgICAgICAgIEJJVCgwKQo+Pj4gICsKPj4+ICArI2Rl ZmluZSBJVDY2MTIxX1NZU19TVEFUVVNfUkVHICAgICAgICAgICAgMHgwRQo+Pj4gICsjZGVmaW5l IElUNjYxMjFfU1lTX1NUQVRVU19BQ1RJVkVfSVJRICAgICAgICBCSVQoNykKPj4+ICArI2RlZmlu ZSBJVDY2MTIxX1NZU19TVEFUVVNfSFBERVRFQ1QgICAgICAgIEJJVCg2KQo+Pj4gICsjZGVmaW5l IElUNjYxMjFfU1lTX1NUQVRVU19TRU5ERUNURUNUICAgICAgICBCSVQoNSkKPj4+ICArI2RlZmlu ZSBJVDY2MTIxX1NZU19TVEFUVVNfVklEX1NUQUJMRSAgICAgICAgQklUKDQpCj4+PiAgKyNkZWZp bmUgSVQ2NjEyMV9TWVNfU1RBVFVTX0FVRF9DVFNfQ0xSICAgICAgICBCSVQoMSkKPj4+ICArI2Rl ZmluZSBJVDY2MTIxX1NZU19TVEFUVVNfQ0xFQVJfSVJRICAgICAgICBCSVQoMCkKPj4+ICArCj4+ PiAgKyNkZWZpbmUgSVQ2NjEyMV9ERENfU1RBVFVTX1JFRyAgICAgICAgICAgIDB4MTYKPj4+ICAr I2RlZmluZSBJVDY2MTIxX0REQ19TVEFUVVNfVFhfRE9ORSAgICAgICAgQklUKDcpCj4+PiAgKyNk ZWZpbmUgSVQ2NjEyMV9ERENfU1RBVFVTX0FDVElWRSAgICAgICAgQklUKDYpCj4+PiAgKyNkZWZp bmUgSVQ2NjEyMV9ERENfU1RBVFVTX05PQUNLICAgICAgICBCSVQoNSkKPj4+ICArI2RlZmluZSBJ VDY2MTIxX0REQ19TVEFUVVNfV0FJVF9CVVMgICAgICAgIEJJVCg0KQo+Pj4gICsjZGVmaW5lIElU NjYxMjFfRERDX1NUQVRVU19BUkJJX0xPU0UgICAgICAgIEJJVCgzKQo+Pj4gICsjZGVmaW5lIElU NjYxMjFfRERDX1NUQVRVU19GSUZPX0ZVTEwgICAgICAgIEJJVCgyKQo+Pj4gICsjZGVmaW5lIElU NjYxMjFfRERDX1NUQVRVU19GSUZPX0VNUFRZICAgICAgICBCSVQoMSkKPj4+ICArI2RlZmluZSBJ VDY2MTIxX0REQ19TVEFUVVNfRklGT19WQUxJRCAgICAgICAgQklUKDApCj4+PiAgKwo+Pj4gICsj ZGVmaW5lIElUNjYxMjFfRURJRF9TTEVFUF9VUyAgICAgICAgICAgIDIwMDAwCj4+PiAgKyNkZWZp bmUgSVQ2NjEyMV9FRElEX1RJTUVPVVRfVVMgICAgICAgICAgICAyMDAwMDAKPj4+ICArI2RlZmlu ZSBJVDY2MTIxX0VESURfRklGT19TSVpFICAgICAgICAgICAgMzIKPj4+ICArI2RlZmluZSBJVDY2 MTIxX0FGRV9DTEtfSElHSCAgICAgICAgICAgIDgwMDAwIC8qIEtoeiAqLwo+Pj4gICsKPj4+ICAr c3RydWN0IGl0NjYxMjFfY3R4IHsKPj4+ICArICAgIHN0cnVjdCByZWdtYXAgKnJlZ21hcDsKPj4+ ICArICAgIHN0cnVjdCBkcm1fYnJpZGdlIGJyaWRnZTsKPj4+ICArICAgIHN0cnVjdCBkcm1fY29u bmVjdG9yIGNvbm5lY3RvcjsKPj4+ICArICAgIHN0cnVjdCBkZXZpY2UgKmRldjsKPj4+ICArICAg IHN0cnVjdCBncGlvX2Rlc2MgKmdwaW9fcmVzZXQ7Cj4+PiAgKyAgICBzdHJ1Y3QgaTJjX2NsaWVu dCAqY2xpZW50Owo+Pj4gICsgICAgc3RydWN0IHJlZ3VsYXRvcl9idWxrX2RhdGEgc3VwcGxpZXNb M107Cj4+PiAgKyAgICB1MzIgYnVzX3dpZHRoOwo+Pj4gICsgICAgc3RydWN0IG11dGV4IGxvY2s7 IC8qIFByb3RlY3RzIGZpZWxkcyBiZWxvdyBhbmQgZGV2aWNlIAo+Pj4gcmVnaXN0ZXJzICovCj4+ PiAgKyAgICBzdHJ1Y3QgZWRpZCAqZWRpZDsKPj4+ICArICAgIHN0cnVjdCBoZG1pX2F2aV9pbmZv ZnJhbWUgaGRtaV9hdmlfaW5mb2ZyYW1lOwo+Pj4gICt9Owo+Pj4gICsKPj4+ICArc3RhdGljIGNv bnN0IHN0cnVjdCByZWdtYXBfcmFuZ2VfY2ZnIGl0NjYxMjFfcmVnbWFwX2JhbmtzW10gPSB7Cj4+ PiAgKyAgICB7Cj4+PiAgKyAgICAgICAgLm5hbWUgPSAiaXQ2NjEyMSIsCj4+PiAgKyAgICAgICAg LnJhbmdlX21pbiA9IDB4MDAsCj4+PiAgKyAgICAgICAgLnJhbmdlX21heCA9IDB4MUZGLAo+Pj4g ICsgICAgICAgIC5zZWxlY3Rvcl9yZWcgPSBJVDY2MTIxX0NMS19CQU5LX1JFRywKPj4+ICArICAg ICAgICAuc2VsZWN0b3JfbWFzayA9IDB4MSwKPj4+ICArICAgICAgICAuc2VsZWN0b3Jfc2hpZnQg PSAwLAo+Pj4gICsgICAgICAgIC53aW5kb3dfc3RhcnQgPSAweDAwLAo+Pj4gICsgICAgICAgIC53 aW5kb3dfbGVuID0gMHgxMzAsCj4+PiAgKyAgICB9LAo+Pj4gICt9Owo+Pj4gICsKPj4+ICArc3Rh dGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIGl0NjYxMjFfcmVnbWFwX2NvbmZpZyA9IHsK Pj4+ICArICAgIC52YWxfYml0cyA9IDgsCj4+PiAgKyAgICAucmVnX2JpdHMgPSA4LAo+Pj4gICsg ICAgLm1heF9yZWdpc3RlciA9IDB4MUZGLAo+Pj4gICsgICAgLnJhbmdlcyA9IGl0NjYxMjFfcmVn bWFwX2JhbmtzLAo+Pj4gICsgICAgLm51bV9yYW5nZXMgPSBBUlJBWV9TSVpFKGl0NjYxMjFfcmVn bWFwX2JhbmtzKSwKPj4+ICArfTsKPj4+ICArCj4+PiAgK3N0YXRpYyB2b2lkIGl0NjYxMjFfaHdf cmVzZXQoc3RydWN0IGl0NjYxMjFfY3R4ICpjdHgpCj4+PiAgK3sKPj4+ICArICAgIGdwaW9kX3Nl dF92YWx1ZShjdHgtPmdwaW9fcmVzZXQsIDEpOwo+Pj4gICsgICAgbXNsZWVwKDIwKTsKPj4+ICAr ICAgIGdwaW9kX3NldF92YWx1ZShjdHgtPmdwaW9fcmVzZXQsIDApOwo+Pj4gICt9Cj4+PiAgKwo+ Pj4gICtzdGF0aWMgaW50IGl0ZTY2MTIxX3Bvd2VyX29uKHN0cnVjdCBpdDY2MTIxX2N0eCAqY3R4 KQo+Pj4gICt7Cj4+PiAgKyAgICByZXR1cm4gcmVndWxhdG9yX2J1bGtfZW5hYmxlKEFSUkFZX1NJ WkUoY3R4LT5zdXBwbGllcyksIAo+Pj4gY3R4LT5zdXBwbGllcyk7Cj4+PiAgK30KPj4+ICArCj4+ PiAgK3N0YXRpYyBpbnQgaXRlNjYxMjFfcG93ZXJfb2ZmKHN0cnVjdCBpdDY2MTIxX2N0eCAqY3R4 KQo+Pj4gICt7Cj4+PiAgKyAgICByZXR1cm4gcmVndWxhdG9yX2J1bGtfZGlzYWJsZShBUlJBWV9T SVpFKGN0eC0+c3VwcGxpZXMpLCAKPj4+IGN0eC0+c3VwcGxpZXMpOwo+Pj4gICt9Cj4+PiAgKwo+ Pj4gICtzdGF0aWMgaW50IGl0NjYxMjFfcHJlYW1ibGVfZGRjKHN0cnVjdCBpdDY2MTIxX2N0eCAq Y3R4KQo+Pj4gICt7Cj4+PiAgKyAgICByZXR1cm4gcmVnbWFwX3dyaXRlKGN0eC0+cmVnbWFwLCBJ VDY2MTIxX01BU1RFUl9TRUxfUkVHLAo+Pj4gICsgICAgICAgICAgICAgICAgSVQ2NjEyMV9NQVNU RVJfU0VMX0hPU1QpOwo+Pj4gICt9Cj4+PiAgKwo+Pj4gICtzdGF0aWMgaW50IGl0NjYxMjFfZmly ZV9hZmUoc3RydWN0IGl0NjYxMjFfY3R4ICpjdHgpCj4+PiAgK3sKPj4+ICArICAgIHJldHVybiBy ZWdtYXBfd3JpdGUoY3R4LT5yZWdtYXAsIElUNjYxMjFfQUZFX0RSVl9SRUcsIDApOwo+Pj4gICt9 Cj4+PiAgKwo+Pj4gICsvKiBUT0ZJWDogSGFuZGxlIFlDYkNyIElucHV0ICYgT3V0cHV0ICovCj4+ PiAgK3N0YXRpYyBpbnQgaXQ2NjEyMV9jb25maWd1cmVfaW5wdXQoc3RydWN0IGl0NjYxMjFfY3R4 ICpjdHgpCj4+PiAgK3sKPj4+ICArICAgIGludCByZXQ7Cj4+PiAgKyAgICB1OCBtb2RlID0gSVQ2 NjEyMV9JTlBVVF9NT0RFX1JHQjsKPj4+ICArCj4+PiAgKyAgICBpZiAoY3R4LT5idXNfd2lkdGgg PT0gMTIpCj4+PiAgKyAgICAgICAgbW9kZSB8PSBJVDY2MTIxX0lOUFVUX01PREVfRERSOwo+Pj4g ICsKPj4+ICArICAgIHJldCA9IHJlZ21hcF93cml0ZShjdHgtPnJlZ21hcCwgSVQ2NjEyMV9JTlBV VF9NT0RFX1JFRywgbW9kZSk7Cj4+PiAgKyAgICBpZiAocmV0KQo+Pj4gICsgICAgICAgIHJldHVy biByZXQ7Cj4+PiAgKwo+Pj4gICsgICAgcmV0dXJuIHJlZ21hcF93cml0ZShjdHgtPnJlZ21hcCwg SVQ2NjEyMV9JTlBVVF9DU0NfUkVHLCAKPj4+IElUNjYxMjFfSU5QVVRfQ1NDX05PX0NPTlYpOwo+ Pj4gICt9Cj4+PiAgKwo+Pj4gICsvKioKPj4+ICArICogaXQ2NjEyMV9jb25maWd1cmVfYWZlKCkg LSBDb25maWd1cmUgdGhlIGFuYWxvZyBmcm9udCBlbmQKPj4+ICArICogQGN0eDogaXQ2NjEyMV9j dHggb2JqZWN0Cj4+PiAgKyAqIEBtb2RlOiBtb2RlIHRvIGNvbmZpZ3VyZQo+Pj4gICsgKgo+Pj4g ICsgKiBSRVRVUk5TOgo+Pj4gICsgKiB6ZXJvIGlmIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgZXJyb3Ig Y29kZSBvdGhlcndpc2UuCj4+PiAgKyAqLwo+Pj4gICtzdGF0aWMgaW50IGl0NjYxMjFfY29uZmln dXJlX2FmZShzdHJ1Y3QgaXQ2NjEyMV9jdHggKmN0eCwKPj4+ICArICAgICAgICAgICAgICAgICBj b25zdCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkKPj4+ICArewo+Pj4gICsgICAgaW50 IHJldDsKPj4+ICArCj4+PiAgKyAgICByZXQgPSByZWdtYXBfd3JpdGUoY3R4LT5yZWdtYXAsIElU NjYxMjFfQUZFX0RSVl9SRUcsCj4+PiAgKyAgICAgICAgICAgICAgIElUNjYxMjFfQUZFX0RSVl9S U1QpOwo+Pj4gICsgICAgaWYgKHJldCkKPj4+ICArICAgICAgICByZXR1cm4gcmV0Owo+Pj4gICsK Pj4+ICArICAgIGlmIChtb2RlLT5jbG9jayA+IElUNjYxMjFfQUZFX0NMS19ISUdIKSB7Cj4+PiAg KyAgICAgICAgcmV0ID0gcmVnbWFwX3dyaXRlX2JpdHMoY3R4LT5yZWdtYXAsIElUNjYxMjFfQUZF X1hQX1JFRywKPj4+ICArICAgICAgICAgICAgICAgICAgICBJVDY2MTIxX0FGRV9YUF9HQUlOQklU IHwKPj4+ICArICAgICAgICAgICAgICAgICAgICBJVDY2MTIxX0FGRV9YUF9FTk8sCj4+PiAgKyAg ICAgICAgICAgICAgICAgICAgSVQ2NjEyMV9BRkVfWFBfR0FJTkJJVCk7Cj4+PiAgKyAgICAgICAg aWYgKHJldCkKPj4+ICArICAgICAgICAgICAgcmV0dXJuIHJldDsKPj4+ICArCj4+PiAgKyAgICAg ICAgcmV0ID0gcmVnbWFwX3dyaXRlX2JpdHMoY3R4LT5yZWdtYXAsIElUNjYxMjFfQUZFX0lQX1JF RywKPj4+ICArICAgICAgICAgICAgICAgICAgICBJVDY2MTIxX0FGRV9JUF9HQUlOQklUIHwKPj4+ ICArICAgICAgICAgICAgICAgICAgICBJVDY2MTIxX0FGRV9JUF9FUjAgfAo+Pj4gICsgICAgICAg ICAgICAgICAgICAgIElUNjYxMjFfQUZFX0lQX0VDMSwKPj4+ICArICAgICAgICAgICAgICAgICAg ICBJVDY2MTIxX0FGRV9JUF9HQUlOQklUKTsKPj4+ICArICAgICAgICBpZiAocmV0KQo+Pj4gICsg ICAgICAgICAgICByZXR1cm4gcmV0Owo+Pj4gICsKPj4+ICArICAgICAgICByZXQgPSByZWdtYXBf d3JpdGVfYml0cyhjdHgtPnJlZ21hcCwgCj4+PiBJVDY2MTIxX0FGRV9YUF9FQzFfUkVHLAo+Pj4g ICsgICAgICAgICAgICAgICAgICAgIElUNjYxMjFfQUZFX1hQX0VDMV9MT1dDTEssIDB4ODApOwo+ Pj4gICsgICAgICAgIGlmIChyZXQpCj4+PiAgKyAgICAgICAgICAgIHJldHVybiByZXQ7Cj4+PiAg KyAgICB9IGVsc2Ugewo+Pj4gICsgICAgICAgIHJldCA9IHJlZ21hcF93cml0ZV9iaXRzKGN0eC0+ cmVnbWFwLCBJVDY2MTIxX0FGRV9YUF9SRUcsCj4+PiAgKyAgICAgICAgICAgICAgICAgICAgSVQ2 NjEyMV9BRkVfWFBfR0FJTkJJVCB8Cj4+PiAgKyAgICAgICAgICAgICAgICAgICAgSVQ2NjEyMV9B RkVfWFBfRU5PLAo+Pj4gICsgICAgICAgICAgICAgICAgICAgIElUNjYxMjFfQUZFX1hQX0VOTyk7 Cj4+PiAgKyAgICAgICAgaWYgKHJldCkKPj4+ICArICAgICAgICAgICAgcmV0dXJuIHJldDsKPj4+ ICArCj4+PiAgKyAgICAgICAgcmV0ID0gcmVnbWFwX3dyaXRlX2JpdHMoY3R4LT5yZWdtYXAsIElU NjYxMjFfQUZFX0lQX1JFRywKPj4+ICArICAgICAgICAgICAgICAgICAgICBJVDY2MTIxX0FGRV9J UF9HQUlOQklUIHwKPj4+ICArICAgICAgICAgICAgICAgICAgICBJVDY2MTIxX0FGRV9JUF9FUjAg fAo+Pj4gICsgICAgICAgICAgICAgICAgICAgIElUNjYxMjFfQUZFX0lQX0VDMSwgSVQ2NjEyMV9B RkVfSVBfRVIwIHwKPj4+ICArICAgICAgICAgICAgICAgICAgICBJVDY2MTIxX0FGRV9JUF9FQzEp Owo+Pj4gICsgICAgICAgIGlmIChyZXQpCj4+PiAgKyAgICAgICAgICAgIHJldHVybiByZXQ7Cj4+ PiAgKwo+Pj4gICsgICAgICAgIHJldCA9IHJlZ21hcF93cml0ZV9iaXRzKGN0eC0+cmVnbWFwLCAK Pj4+IElUNjYxMjFfQUZFX1hQX0VDMV9SRUcsCj4+PiAgKyAgICAgICAgICAgICAgICAgICAgSVQ2 NjEyMV9BRkVfWFBfRUMxX0xPV0NMSywKPj4+ICArICAgICAgICAgICAgICAgICAgICBJVDY2MTIx X0FGRV9YUF9FQzFfTE9XQ0xLKTsKPj4+ICArICAgICAgICBpZiAocmV0KQo+Pj4gICsgICAgICAg ICAgICByZXR1cm4gcmV0Owo+Pj4gICsgICAgfQo+Pj4gICsKPj4+ICArICAgIC8qIENsZWFyIHJl c2V0IGZsYWdzICovCj4+PiAgKyAgICByZXQgPSByZWdtYXBfd3JpdGVfYml0cyhjdHgtPnJlZ21h cCwgSVQ2NjEyMV9TV19SU1RfUkVHLAo+Pj4gICsgICAgICAgICAgICAgICAgSVQ2NjEyMV9TV19S U1RfUkVGIHwgSVQ2NjEyMV9TV19SU1RfVklELAo+Pj4gICsgICAgICAgICAgICAgICAgfihJVDY2 MTIxX1NXX1JTVF9SRUYgfCBJVDY2MTIxX1NXX1JTVF9WSUQpICYKPj4+ICArICAgICAgICAgICAg ICAgIDB4RkYpOwo+Pj4gICsgICAgaWYgKHJldCkKPj4+ICArICAgICAgICByZXR1cm4gcmV0Owo+ Pj4gICsKPj4+ICArICAgIHJldHVybiBpdDY2MTIxX2ZpcmVfYWZlKGN0eCk7Cj4+PiAgK30KPj4+ ICArCj4+PiAgK3N0YXRpYyBpbmxpbmUgaW50IGl0NjYxMjFfd2FpdF9kZGNfcmVhZHkoc3RydWN0 IGl0NjYxMjFfY3R4ICpjdHgpCj4+PiAgK3sKPj4+ICArICAgIGludCByZXQsIHZhbDsKPj4+ICAr ICAgIHUzMiBidXN5ID0gSVQ2NjEyMV9ERENfU1RBVFVTX05PQUNLIHwgCj4+PiBJVDY2MTIxX0RE Q19TVEFUVVNfV0FJVF9CVVMgfAo+Pj4gICsgICAgICAgICAgIElUNjYxMjFfRERDX1NUQVRVU19B UkJJX0xPU0U7Cj4+PiAgKwo+Pj4gICsgICAgcmV0ID0gcmVnbWFwX3JlYWRfcG9sbF90aW1lb3V0 KGN0eC0+cmVnbWFwLCAKPj4+IElUNjYxMjFfRERDX1NUQVRVU19SRUcsIHZhbCwgdHJ1ZSwKPj4+ ICArICAgICAgICAgICAgICAgICAgICAgICBJVDY2MTIxX0VESURfU0xFRVBfVVMsIAo+Pj4gSVQ2 NjEyMV9FRElEX1RJTUVPVVRfVVMpOwo+Pj4gICsgICAgaWYgKHJldCkKPj4+ICArICAgICAgICBy ZXR1cm4gcmV0Owo+Pj4gICsKPj4+ICArICAgIGlmICh2YWwgJiBidXN5KQo+Pj4gICsgICAgICAg IHJldHVybiAtRUFHQUlOOwo+Pj4gICsKPj4+ICArICAgIHJldHVybiAwOwo+Pj4gICt9Cj4+PiAg Kwo+Pj4gICtzdGF0aWMgaW50IGl0NjYxMjFfY2xlYXJfZGRjX2ZpZm8oc3RydWN0IGl0NjYxMjFf Y3R4ICpjdHgpCj4+PiAgK3sKPj4+ICArICAgIGludCByZXQ7Cj4+PiAgKwo+Pj4gICsgICAgcmV0 ID0gaXQ2NjEyMV9wcmVhbWJsZV9kZGMoY3R4KTsKPj4+ICArICAgIGlmIChyZXQpCj4+PiAgKyAg ICAgICAgcmV0dXJuIHJldDsKPj4+ICArCj4+PiAgKyAgICByZXR1cm4gcmVnbWFwX3dyaXRlKGN0 eC0+cmVnbWFwLCBJVDY2MTIxX0REQ19DT01NQU5EX1JFRywKPj4+ICArICAgICAgICAgICAgICAg IElUNjYxMjFfRERDX0NPTU1BTkRfRklGT19DTFIpOwo+Pj4gICt9Cj4+PiAgKwo+Pj4gICtzdGF0 aWMgaW50IGl0NjYxMjFfYWJvcnRfZGRjX29wcyhzdHJ1Y3QgaXQ2NjEyMV9jdHggKmN0eCkKPj4+ ICArewo+Pj4gICsgICAgaW50IHJldDsKPj4+ICArICAgIHVuc2lnbmVkIGludCBzd3Jlc2V0LCBj cGRlc2lyZTsKPj4+ICArCj4+PiAgKyAgICByZXQgPSByZWdtYXBfcmVhZChjdHgtPnJlZ21hcCwg SVQ2NjEyMV9TV19SU1RfUkVHLCAmc3dyZXNldCk7Cj4+PiAgKyAgICBpZiAocmV0KQo+Pj4gICsg ICAgICAgIHJldHVybiByZXQ7Cj4+PiAgKwo+Pj4gICsgICAgcmV0ID0gcmVnbWFwX3JlYWQoY3R4 LT5yZWdtYXAsIElUNjYxMjFfSERDUF9SRUcsICZjcGRlc2lyZSk7Cj4+PiAgKyAgICBpZiAocmV0 KQo+Pj4gICsgICAgICAgIHJldHVybiByZXQ7Cj4+PiAgKwo+Pj4gICsgICAgcmV0ID0gcmVnbWFw X3dyaXRlKGN0eC0+cmVnbWFwLCBJVDY2MTIxX0hEQ1BfUkVHLAo+Pj4gICsgICAgICAgICAgICAg ICBjcGRlc2lyZSAmICh+SVQ2NjEyMV9IRENQX0NQREVTSVJFRCAmIDB4RkYpKTsKPj4+ICArICAg IGlmIChyZXQpCj4+PiAgKyAgICAgICAgcmV0dXJuIHJldDsKPj4+ICArCj4+PiAgKyAgICByZXQg PSByZWdtYXBfd3JpdGUoY3R4LT5yZWdtYXAsIElUNjYxMjFfU1dfUlNUX1JFRywKPj4+ICArICAg ICAgICAgICAgICAgKHN3cmVzZXQgfCBJVDY2MTIxX1NXX1JTVF9IRENQKSk7Cj4+PiAgKyAgICBp ZiAocmV0KQo+Pj4gICsgICAgICAgIHJldHVybiByZXQ7Cj4+PiAgKwo+Pj4gICsgICAgcmV0ID0g aXQ2NjEyMV9wcmVhbWJsZV9kZGMoY3R4KTsKPj4+ICArICAgIGlmIChyZXQpCj4+PiAgKyAgICAg ICAgcmV0dXJuIHJldDsKPj4+ICArCj4+PiAgKyAgICByZXQgPSByZWdtYXBfd3JpdGUoY3R4LT5y ZWdtYXAsIElUNjYxMjFfRERDX0NPTU1BTkRfUkVHLAo+Pj4gICsgICAgICAgICAgICAgICBJVDY2 MTIxX0REQ19DT01NQU5EX0FCT1JUKTsKPj4+ICArICAgIGlmIChyZXQpCj4+PiAgKyAgICAgICAg cmV0dXJuIHJldDsKPj4+ICArCj4+PiAgKyAgICByZXR1cm4gaXQ2NjEyMV93YWl0X2RkY19yZWFk eShjdHgpOwo+Pj4gICt9Cj4+PiAgKwo+Pj4gICtzdGF0aWMgaW50IGl0NjYxMjFfZ2V0X2VkaWRf YmxvY2sodm9pZCAqY29udGV4dCwgdTggKmJ1ZiwKPj4+ICArICAgICAgICAgICAgICAgICAgdW5z aWduZWQgaW50IGJsb2NrLCBzaXplX3QgbGVuKQo+Pj4gICt7Cj4+PiAgKyAgICBzdHJ1Y3QgaXQ2 NjEyMV9jdHggKmN0eCA9IGNvbnRleHQ7Cj4+PiAgKyAgICB1bnNpZ25lZCBpbnQgdmFsOwo+Pj4g ICsgICAgaW50IHJlbWFpbiA9IGxlbjsKPj4+ICArICAgIGludCBvZmZzZXQgPSAwOwo+Pj4gICsg ICAgaW50IHJldCwgY250Owo+Pj4gICsKPj4+ICArICAgIG9mZnNldCA9IChibG9jayAlIDIpICog bGVuOwo+Pj4gICsgICAgYmxvY2sgPSBibG9jayAvIDI7Cj4+PiAgKwo+Pj4gICsgICAgcmV0ID0g cmVnbWFwX3JlYWQoY3R4LT5yZWdtYXAsIElUNjYxMjFfSU5UX1NUQVRVUzFfUkVHLCAmdmFsKTsK Pj4+ICArICAgIGlmIChyZXQpCj4+PiAgKyAgICAgICAgcmV0dXJuIHJldDsKPj4+ICArCj4+PiAg KyAgICBpZiAodmFsICYgSVQ2NjEyMV9JTlRfU1RBVFVTMV9ERENfQlVTSEFORykgewo+Pj4gICsg ICAgICAgIHJldCA9IGl0NjYxMjFfYWJvcnRfZGRjX29wcyhjdHgpOwo+Pj4gICsgICAgICAgIGlm IChyZXQpCj4+PiAgKyAgICAgICAgICAgIHJldHVybiByZXQ7Cj4+PiAgKyAgICB9Cj4+PiAgKwo+ Pj4gICsgICAgcmV0ID0gaXQ2NjEyMV9jbGVhcl9kZGNfZmlmbyhjdHgpOwo+Pj4gICsgICAgaWYg KHJldCkKPj4+ICArICAgICAgICByZXR1cm4gcmV0Owo+Pj4gICsKPj4+ICArICAgIHdoaWxlIChy ZW1haW4gPiAwKSB7Cj4+PiAgKyAgICAgICAgY250ID0gKHJlbWFpbiA+IElUNjYxMjFfRURJRF9G SUZPX1NJWkUpID8KPj4+ICArICAgICAgICAgICAgICAgIElUNjYxMjFfRURJRF9GSUZPX1NJWkUg OiByZW1haW47Cj4+PiAgKyAgICAgICAgcmV0ID0gaXQ2NjEyMV9wcmVhbWJsZV9kZGMoY3R4KTsK Pj4+ICArICAgICAgICBpZiAocmV0KQo+Pj4gICsgICAgICAgICAgICByZXR1cm4gcmV0Owo+Pj4g ICsKPj4+ICArICAgICAgICByZXQgPSByZWdtYXBfd3JpdGUoY3R4LT5yZWdtYXAsIElUNjYxMjFf RERDX0NPTU1BTkRfUkVHLAo+Pj4gICsgICAgICAgICAgICAgICAgICAgSVQ2NjEyMV9ERENfQ09N TUFORF9GSUZPX0NMUik7Cj4+PiAgKyAgICAgICAgaWYgKHJldCkKPj4+ICArICAgICAgICAgICAg cmV0dXJuIHJldDsKPj4+ICArCj4+PiAgKyAgICAgICAgcmV0ID0gaXQ2NjEyMV93YWl0X2RkY19y ZWFkeShjdHgpOwo+Pj4gICsgICAgICAgIGlmIChyZXQpCj4+PiAgKyAgICAgICAgICAgIHJldHVy biByZXQ7Cj4+PiAgKwo+Pj4gICsgICAgICAgIHJldCA9IHJlZ21hcF9yZWFkKGN0eC0+cmVnbWFw LCBJVDY2MTIxX0lOVF9TVEFUVVMxX1JFRywgCj4+PiAmdmFsKTsKPj4+ICArICAgICAgICBpZiAo cmV0KQo+Pj4gICsgICAgICAgICAgICByZXR1cm4gcmV0Owo+Pj4gICsKPj4+ICArICAgICAgICBp ZiAodmFsICYgSVQ2NjEyMV9JTlRfU1RBVFVTMV9ERENfQlVTSEFORykgewo+Pj4gICsgICAgICAg ICAgICByZXQgPSBpdDY2MTIxX2Fib3J0X2RkY19vcHMoY3R4KTsKPj4+ICArICAgICAgICAgICAg aWYgKHJldCkKPj4+ICArICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Cj4+PiAgKyAgICAgICAg fQo+Pj4gICsKPj4+ICArICAgICAgICByZXQgPSBpdDY2MTIxX3ByZWFtYmxlX2RkYyhjdHgpOwo+ Pj4gICsgICAgICAgIGlmIChyZXQpCj4+PiAgKyAgICAgICAgICAgIHJldHVybiByZXQ7Cj4+PiAg Kwo+Pj4gICsgICAgICAgIHJldCA9IHJlZ21hcF93cml0ZShjdHgtPnJlZ21hcCwgSVQ2NjEyMV9E RENfSEVBREVSX1JFRywKPj4+ICArICAgICAgICAgICAgICAgICAgIElUNjYxMjFfRERDX0hFQURF Ul9FRElEKTsKPj4+ICArICAgICAgICBpZiAocmV0KQo+Pj4gICsgICAgICAgICAgICByZXR1cm4g cmV0Owo+Pj4gICsKPj4+ICArICAgICAgICByZXQgPSByZWdtYXBfd3JpdGUoY3R4LT5yZWdtYXAs IElUNjYxMjFfRERDX09GRlNFVF9SRUcsIAo+Pj4gb2Zmc2V0KTsKPj4+ICArICAgICAgICBpZiAo cmV0KQo+Pj4gICsgICAgICAgICAgICByZXR1cm4gcmV0Owo+Pj4gICsKPj4+ICArICAgICAgICBy ZXQgPSByZWdtYXBfd3JpdGUoY3R4LT5yZWdtYXAsIElUNjYxMjFfRERDX0JZVEVfUkVHLCAKPj4+ IGNudCk7Cj4+PiAgKyAgICAgICAgaWYgKHJldCkKPj4+ICArICAgICAgICAgICAgcmV0dXJuIHJl dDsKPj4+ICArCj4+PiAgKyAgICAgICAgcmV0ID0gcmVnbWFwX3dyaXRlKGN0eC0+cmVnbWFwLCBJ VDY2MTIxX0REQ19TRUdNRU5UX1JFRywgCj4+PiBibG9jayk7Cj4+PiAgKyAgICAgICAgaWYgKHJl dCkKPj4+ICArICAgICAgICAgICAgcmV0dXJuIHJldDsKPj4+ICArCj4+PiAgKyAgICAgICAgcmV0 ID0gcmVnbWFwX3dyaXRlKGN0eC0+cmVnbWFwLCBJVDY2MTIxX0REQ19DT01NQU5EX1JFRywKPj4+ ICArICAgICAgICAgICAgICAgICAgIElUNjYxMjFfRERDX0NPTU1BTkRfRURJRF9SRUFEKTsKPj4+ ICArICAgICAgICBpZiAocmV0KQo+Pj4gICsgICAgICAgICAgICByZXR1cm4gcmV0Owo+Pj4gICsK Pj4+ICArICAgICAgICBvZmZzZXQgKz0gY250Owo+Pj4gICsgICAgICAgIHJlbWFpbiAtPSBjbnQ7 Cj4+PiAgKwo+Pj4gICsgICAgICAgIC8qIFBlciBwcm9ncmFtbWluZyBtYW51YWwsIHNsZWVwIGhl cmUgYmVmb3JlIGVtcHR5aW5nIHRoZSAKPj4+IEZJRk8gKi8KPj4+ICArICAgICAgICBtc2xlZXAo MjApOwo+Pj4gICsKPj4+ICArICAgICAgICByZXQgPSBpdDY2MTIxX3dhaXRfZGRjX3JlYWR5KGN0 eCk7Cj4+PiAgKyAgICAgICAgaWYgKHJldCkKPj4+ICArICAgICAgICAgICAgcmV0dXJuIHJldDsK Pj4+ICArCj4+PiAgKyAgICAgICAgZG8gewo+Pj4gICsgICAgICAgICAgICByZXQgPSByZWdtYXBf cmVhZChjdHgtPnJlZ21hcCwgCj4+PiBJVDY2MTIxX0REQ19SRF9GSUZPX1JFRywgJnZhbCk7Cj4+ PiAgKyAgICAgICAgICAgIGlmIChyZXQpCj4+PiAgKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0 Owo+Pj4gICsgICAgICAgICAgICAqKGJ1ZisrKSA9IHZhbDsKPj4+ICArICAgICAgICAgICAgY250 LS07Cj4+PiAgKyAgICAgICAgfSB3aGlsZSAoY250ID4gMCk7Cj4+PiAgKyAgICB9Cj4+PiAgKwo+ Pj4gICsgICAgcmV0dXJuIDA7Cj4+PiAgK30KPj4+ICArCj4+PiAgK3N0YXRpYyBpbnQgaXQ2NjEy MV9jb25uZWN0b3JfZ2V0X21vZGVzKHN0cnVjdCBkcm1fY29ubmVjdG9yIAo+Pj4gKmNvbm5lY3Rv cikKPj4+ICArewo+Pj4gICsgICAgaW50IHJldCwgbnVtX21vZGVzID0gMDsKPj4+ICArICAgIHN0 cnVjdCBpdDY2MTIxX2N0eCAqY3R4ID0gY29udGFpbmVyX29mKGNvbm5lY3Rvciwgc3RydWN0IAo+ Pj4gaXQ2NjEyMV9jdHgsCj4+PiAgKyAgICAgICAgICAgIGNvbm5lY3Rvcik7Cj4+PiAgKwo+Pj4g ICsgICAgaWYgKGN0eC0+ZWRpZCkKPj4+ICArICAgICAgICByZXR1cm4gZHJtX2FkZF9lZGlkX21v ZGVzKGNvbm5lY3RvciwgY3R4LT5lZGlkKTsKPj4+ICArCj4+PiAgKyAgICBtdXRleF9sb2NrKCZj dHgtPmxvY2spOwo+Pj4gICsKPj4+ICArICAgIGN0eC0+ZWRpZCA9IGRybV9kb19nZXRfZWRpZChj b25uZWN0b3IsIAo+Pj4gaXQ2NjEyMV9nZXRfZWRpZF9ibG9jaywgY3R4KTsKPj4+ICArICAgIGlm ICghY3R4LT5lZGlkKSB7Cj4+PiAgKyAgICAgICAgRFJNX0VSUk9SKCJGYWlsZWQgdG8gcmVhZCBF RElEXG4iKTsKPj4+ICArICAgICAgICBnb3RvIHVubG9jazsKPj4+ICArICAgIH0KPj4+ICArCj4+ PiAgKyAgICByZXQgPSBkcm1fY29ubmVjdG9yX3VwZGF0ZV9lZGlkX3Byb3BlcnR5KGNvbm5lY3Rv ciwgCj4+PiBjdHgtPmVkaWQpOwo+Pj4gICsgICAgaWYgKHJldCkgewo+Pj4gICsgICAgICAgIERS TV9FUlJPUigiRmFpbGVkIHRvIHVwZGF0ZSBFRElEIHByb3BlcnR5OiAlZFxuIiwgcmV0KTsKPj4+ ICArICAgICAgICBnb3RvIHVubG9jazsKPj4+ICArICAgIH0KPj4+ICArCj4+PiAgKyAgICBudW1f bW9kZXMgPSBkcm1fYWRkX2VkaWRfbW9kZXMoY29ubmVjdG9yLCBjdHgtPmVkaWQpOwo+Pj4gICsK Pj4+ICArdW5sb2NrOgo+Pj4gICsgICAgbXV0ZXhfdW5sb2NrKCZjdHgtPmxvY2spOwo+Pj4gICsK Pj4+ICArICAgIHJldHVybiBudW1fbW9kZXM7Cj4+PiAgK30KPj4+ICArCj4+PiAgK3N0YXRpYyBi b29sIGl0NjYxMjFfaXNfaHBkX2RldGVjdChzdHJ1Y3QgaXQ2NjEyMV9jdHggKmN0eCkKPj4+ICAr ewo+Pj4gICsgICAgaW50IHZhbDsKPj4+ICArCj4+PiAgKyAgICBpZiAocmVnbWFwX3JlYWQoY3R4 LT5yZWdtYXAsIElUNjYxMjFfU1lTX1NUQVRVU19SRUcsICZ2YWwpKQo+Pj4gICsgICAgICAgIHJl dHVybiBmYWxzZTsKPj4+ICArCj4+PiAgKyAgICByZXR1cm4gdmFsICYgSVQ2NjEyMV9TWVNfU1RB VFVTX0hQREVURUNUOwo+Pj4gICt9Cj4+PiAgKwo+Pj4gICtzdGF0aWMgaW50IGl0NjYxMjFfY29u bmVjdG9yX2RldGVjdF9jdHgoc3RydWN0IGRybV9jb25uZWN0b3IgCj4+PiAqY29ubmVjdG9yLAo+ Pj4gICsgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkcm1fbW9kZXNldF9hY3F1aXJlX2N0eCAq YywKPj4+ICArICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlKQo+Pj4gICt7Cj4+PiAgKyAg ICBzdHJ1Y3QgaXQ2NjEyMV9jdHggKmN0eCA9IGNvbnRhaW5lcl9vZihjb25uZWN0b3IsIHN0cnVj dCAKPj4+IGl0NjYxMjFfY3R4LAo+Pj4gICsgICAgICAgICAgICBjb25uZWN0b3IpOwo+Pj4gICsK Pj4+ICArICAgIHJldHVybiBpdDY2MTIxX2lzX2hwZF9kZXRlY3QoY3R4KSA/IGNvbm5lY3Rvcl9z dGF0dXNfY29ubmVjdGVkCj4+PiAgKyAgICAgICAgICAgICAgICAgICAgICA6IGNvbm5lY3Rvcl9z dGF0dXNfZGlzY29ubmVjdGVkOwo+Pj4gICt9Cj4+PiAgKwo+Pj4gICtzdGF0aWMgZW51bSBkcm1f bW9kZV9zdGF0dXMgaXQ2NjEyMV9tb2RlX3ZhbGlkKHN0cnVjdCBpdDY2MTIxX2N0eCAKPj4+ICpj dHgsCj4+PiAgKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBkcm1fZGlz cGxheV9tb2RlICptb2RlKQo+Pj4gICt7Cj4+PiAgKyAgICB1bnNpZ25lZCBsb25nIG1heF9jbG9j azsKPj4+ICArCj4+PiAgKyAgICBtYXhfY2xvY2sgPSAoY3R4LT5idXNfd2lkdGggPT0gMTIpID8g NzQyNTAgOiAxNDg1MDA7Cj4+PiAgKwo+Pj4gICsgICAgaWYgKG1vZGUtPmNsb2NrID4gbWF4X2Ns b2NrKQo+Pj4gICsgICAgICAgIHJldHVybiBNT0RFX0NMT0NLX0hJR0g7Cj4+PiAgKwo+Pj4gICsg ICAgaWYgKG1vZGUtPmNsb2NrIDwgMjUwMDApCj4+PiAgKyAgICAgICAgcmV0dXJuIE1PREVfQ0xP Q0tfTE9XOwo+Pj4gICsKPj4+ICArICAgIHJldHVybiBNT0RFX09LOwo+Pj4gICt9Cj4+PiAgKwo+ Pj4gICtzdGF0aWMgZW51bSBkcm1fbW9kZV9zdGF0dXMgaXQ2NjEyMV9jb25uZWN0b3JfbW9kZV92 YWxpZChzdHJ1Y3QgCj4+PiBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCj4+PiAgKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpCj4+PiAg K3sKPj4+ICArICAgIHN0cnVjdCBpdDY2MTIxX2N0eCAqY3R4ID0gY29udGFpbmVyX29mKGNvbm5l Y3Rvciwgc3RydWN0IAo+Pj4gaXQ2NjEyMV9jdHgsCj4+PiAgKyAgICAgICAgICAgIGNvbm5lY3Rv cik7Cj4+PiAgKwo+Pj4gICsgICAgcmV0dXJuIGl0NjYxMjFfbW9kZV92YWxpZChjdHgsIG1vZGUp Owo+Pj4gICt9Cj4+PiAgKwo+Pj4gICtzdGF0aWMgc3RydWN0IGRybV9jb25uZWN0b3JfaGVscGVy X2Z1bmNzIAo+Pj4gaXQ2NjEyMV9jb25uZWN0b3JfaGVscGVyX2Z1bmNzID0gewo+Pj4gICsgICAg LmdldF9tb2RlcyA9IGl0NjYxMjFfY29ubmVjdG9yX2dldF9tb2RlcywKPj4+ICArICAgIC5kZXRl Y3RfY3R4ID0gaXQ2NjEyMV9jb25uZWN0b3JfZGV0ZWN0X2N0eCwKPj4+ICArICAgIC5tb2RlX3Zh bGlkID0gaXQ2NjEyMV9jb25uZWN0b3JfbW9kZV92YWxpZCwKPj4+ICArfTsKPj4+ICArCj4+PiAg K3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9mdW5jcyBpdDY2MTIxX2Nvbm5lY3Rv cl9mdW5jcyA9IAo+Pj4gewo+Pj4gICsgICAgLnJlc2V0ID0gZHJtX2F0b21pY19oZWxwZXJfY29u bmVjdG9yX3Jlc2V0LAo+Pj4gICsgICAgLmZpbGxfbW9kZXMgPSBkcm1faGVscGVyX3Byb2JlX3Np bmdsZV9jb25uZWN0b3JfbW9kZXMsCj4+PiAgKyAgICAuZGVzdHJveSA9IGRybV9jb25uZWN0b3Jf Y2xlYW51cCwKPj4+ICArICAgIC5hdG9taWNfZHVwbGljYXRlX3N0YXRlID0gCj4+PiBkcm1fYXRv bWljX2hlbHBlcl9jb25uZWN0b3JfZHVwbGljYXRlX3N0YXRlLAo+Pj4gICsgICAgLmF0b21pY19k ZXN0cm95X3N0YXRlID0gCj4+PiBkcm1fYXRvbWljX2hlbHBlcl9jb25uZWN0b3JfZGVzdHJveV9z dGF0ZSwKPj4+ICArfTsKPj4+ICArCj4+PiAgK3N0YXRpYyBpbnQgaXQ2NjEyMV9icmlkZ2VfYXR0 YWNoKHN0cnVjdCBkcm1fYnJpZGdlICpicmlkZ2UsCj4+PiAgKyAgICAgICAgICAgICAgICAgZW51 bSBkcm1fYnJpZGdlX2F0dGFjaF9mbGFncyBmbGFncykKPj4+ICArewo+Pj4gICsgICAgaW50IHJl dDsKPj4+ICArICAgIHN0cnVjdCBpdDY2MTIxX2N0eCAqY3R4ID0gY29udGFpbmVyX29mKGJyaWRn ZSwgc3RydWN0IAo+Pj4gaXQ2NjEyMV9jdHgsCj4+PiAgKyAgICAgICAgICAgIGJyaWRnZSk7Cj4+ PiAgKwo+Pj4gICsgICAgaWYgKCFicmlkZ2UtPmVuY29kZXIpIHsKPj4+ICArICAgICAgICBEUk1f RVJST1IoIlBhcmVudCBlbmNvZGVyIG9iamVjdCBub3QgZm91bmQiKTsKPj4+ICArICAgICAgICBy ZXR1cm4gLUVOT0RFVjsKPj4+ICArICAgIH0KPj4+ICArCj4+PiAgKyAgICByZXQgPSByZWdtYXBf d3JpdGVfYml0cyhjdHgtPnJlZ21hcCwgSVQ2NjEyMV9DTEtfQkFOS19SRUcsCj4+PiAgKyAgICAg ICAgICAgICAgICBJVDY2MTIxX0NMS19CQU5LX1BXUk9GRl9SQ0xLLCAwKTsKPj4+ICArICAgIGlm IChyZXQpCj4+PiAgKyAgICAgICAgcmV0dXJuIHJldDsKPj4+ICArCj4+PiAgKyAgICByZXQgPSBy ZWdtYXBfd3JpdGVfYml0cyhjdHgtPnJlZ21hcCwgSVQ2NjEyMV9JTlRfUkVHLAo+Pj4gICsgICAg ICAgICAgICAgICAgSVQ2NjEyMV9JTlRfVFhfQ0xLX09GRiwgMCk7Cj4+PiAgKyAgICBpZiAocmV0 KQo+Pj4gICsgICAgICAgIHJldHVybiByZXQ7Cj4+PiAgKwo+Pj4gICsgICAgcmV0ID0gcmVnbWFw X3dyaXRlX2JpdHMoY3R4LT5yZWdtYXAsIElUNjYxMjFfQUZFX0RSVl9SRUcsCj4+PiAgKyAgICAg ICAgICAgICAgICBJVDY2MTIxX0FGRV9EUlZfUFdELCAwKTsKPj4+ICArICAgIGlmIChyZXQpCj4+ PiAgKyAgICAgICAgcmV0dXJuIHJldDsKPj4+ICArCj4+PiAgKyAgICByZXQgPSByZWdtYXBfd3Jp dGVfYml0cyhjdHgtPnJlZ21hcCwgSVQ2NjEyMV9BRkVfWFBfUkVHLAo+Pj4gICsgICAgICAgICAg ICAgICAgSVQ2NjEyMV9BRkVfWFBfUFdESSB8IElUNjYxMjFfQUZFX1hQX1BXRFBMTCwgMCk7Cj4+ PiAgKyAgICBpZiAocmV0KQo+Pj4gICsgICAgICAgIHJldHVybiByZXQ7Cj4+PiAgKwo+Pj4gICsg ICAgcmV0ID0gcmVnbWFwX3dyaXRlX2JpdHMoY3R4LT5yZWdtYXAsIElUNjYxMjFfQUZFX0lQX1JF RywKPj4+ICArICAgICAgICAgICAgICAgIElUNjYxMjFfQUZFX0lQX1BXRFBMTCwgMCk7Cj4+PiAg KyAgICBpZiAocmV0KQo+Pj4gICsgICAgICAgIHJldHVybiByZXQ7Cj4+PiAgKwo+Pj4gICsgICAg cmV0ID0gcmVnbWFwX3dyaXRlX2JpdHMoY3R4LT5yZWdtYXAsIElUNjYxMjFfQUZFX0RSVl9SRUcs Cj4+PiAgKyAgICAgICAgICAgICAgICBJVDY2MTIxX0FGRV9EUlZfUlNULCAwKTsKPj4+ICArICAg IGlmIChyZXQpCj4+PiAgKyAgICAgICAgcmV0dXJuIHJldDsKPj4+ICArCj4+PiAgKyAgICByZXQg PSByZWdtYXBfd3JpdGVfYml0cyhjdHgtPnJlZ21hcCwgSVQ2NjEyMV9BRkVfWFBfUkVHLAo+Pj4g ICsgICAgICAgICAgICAgICAgSVQ2NjEyMV9BRkVfWFBfUkVTRVRCLCBJVDY2MTIxX0FGRV9YUF9S RVNFVEIpOwo+Pj4gICsgICAgaWYgKHJldCkKPj4+ICArICAgICAgICByZXR1cm4gcmV0Owo+Pj4g ICsKPj4+ICArICAgIHJldCA9IHJlZ21hcF93cml0ZV9iaXRzKGN0eC0+cmVnbWFwLCBJVDY2MTIx X0FGRV9JUF9SRUcsCj4+PiAgKyAgICAgICAgICAgICAgICBJVDY2MTIxX0FGRV9JUF9SRVNFVEIs IElUNjYxMjFfQUZFX0lQX1JFU0VUQik7Cj4+PiAgKyAgICBpZiAocmV0KQo+Pj4gICsgICAgICAg IHJldHVybiByZXQ7Cj4+PiAgKwo+Pj4gICsgICAgcmV0ID0gcmVnbWFwX3dyaXRlX2JpdHMoY3R4 LT5yZWdtYXAsIElUNjYxMjFfU1dfUlNUX1JFRywKPj4+ICArICAgICAgICAgICAgICAgIElUNjYx MjFfU1dfUlNUX1JFRiwKPj4+ICArICAgICAgICAgICAgICAgIElUNjYxMjFfU1dfUlNUX1JFRik7 Cj4+PiAgKyAgICBpZiAocmV0KQo+Pj4gICsgICAgICAgIHJldHVybiByZXQ7Cj4+PiAgKwo+Pj4g ICsgICAgLyogUGVyIHByb2dyYW1taW5nIG1hbnVhbCwgc2xlZXAgaGVyZSBmb3IgYnJpZGdlIHRv IHNldHRsZSAqLwo+Pj4gICsgICAgbXNsZWVwKDUwKTsKPj4+ICArCj4+PiAgKyAgICAvKiBTdGFy dCBpbnRlcnJ1cHRzICovCj4+PiAgKyAgICByZXQgPSByZWdtYXBfd3JpdGVfYml0cyhjdHgtPnJl Z21hcCwgSVQ2NjEyMV9JTlRfTUFTSzFfUkVHLAo+Pj4gICsgICAgICAgICAgICAgICAgSVQ2NjEy MV9JTlRfTUFTSzFfRERDX05PQUNLIHwKPj4+ICArICAgICAgICAgICAgICAgIElUNjYxMjFfSU5U X01BU0sxX0hQRCB8Cj4+PiAgKyAgICAgICAgICAgICAgICBJVDY2MTIxX0lOVF9NQVNLMV9ERENf RklGT0VSUiB8Cj4+PiAgKyAgICAgICAgICAgICAgICBJVDY2MTIxX0lOVF9NQVNLMV9ERENfQlVT SEFORywKPj4+ICArICAgICAgICAgICAgICAgIH4oSVQ2NjEyMV9JTlRfTUFTSzFfRERDX05PQUNL IHwKPj4+ICArICAgICAgICAgICAgICAgIElUNjYxMjFfSU5UX01BU0sxX0hQRCB8Cj4+PiAgKyAg ICAgICAgICAgICAgICBJVDY2MTIxX0lOVF9NQVNLMV9ERENfRklGT0VSUiB8Cj4+PiAgKyAgICAg ICAgICAgICAgICBJVDY2MTIxX0lOVF9NQVNLMV9ERENfQlVTSEFORykgJiAweEZGKTsKPj4+ICAr ICAgIGlmIChyZXQpCj4+PiAgKyAgICAgICAgcmV0dXJuIHJldDsKPj4+ICArCj4+PiAgKyAgICBp ZiAoZmxhZ3MgJiBEUk1fQlJJREdFX0FUVEFDSF9OT19DT05ORUNUT1IpCj4+PiAgKyAgICAgICAg cmV0dXJuIDA7Cj4+PiAgKwo+Pj4gICsgICAgcmV0ID0gZHJtX2Nvbm5lY3Rvcl9pbml0KGJyaWRn ZS0+ZGV2LCAmY3R4LT5jb25uZWN0b3IsCj4+PiAgKyAgICAgICAgICAgICAgICAgJml0NjYxMjFf Y29ubmVjdG9yX2Z1bmNzLAo+Pj4gICsgICAgICAgICAgICAgICAgIERSTV9NT0RFX0NPTk5FQ1RP Ul9IRE1JQSk7Cj4+PiAgKyAgICBpZiAocmV0KQo+Pj4gICsgICAgICAgIHJldHVybiByZXQ7Cj4+ PiAgKwo+Pj4gICsgICAgY3R4LT5jb25uZWN0b3IucG9sbGVkID0gRFJNX0NPTk5FQ1RPUl9QT0xM X0hQRDsKPj4+ICArICAgIGRybV9jb25uZWN0b3JfaGVscGVyX2FkZCgmY3R4LT5jb25uZWN0b3Is Cj4+PiAgKyAgICAgICAgICAgICAgICAgJml0NjYxMjFfY29ubmVjdG9yX2hlbHBlcl9mdW5jcyk7 Cj4+PiAgKwo+Pj4gICsgICAgcmV0ID0gZHJtX2Nvbm5lY3Rvcl9hdHRhY2hfZW5jb2RlcigmY3R4 LT5jb25uZWN0b3IsIAo+Pj4gYnJpZGdlLT5lbmNvZGVyKTsKPj4+ICArICAgIGlmIChyZXQpCj4+ PiAgKyAgICAgICAgcmV0dXJuIHJldDsKPj4+ICArCj4+PiAgKyAgICByZXR1cm4gZHJtX2Nvbm5l Y3Rvcl9yZWdpc3RlcigmY3R4LT5jb25uZWN0b3IpOwo+Pj4gICt9Cj4+PiAgKwo+Pj4gICtzdGF0 aWMgaW50IGl0NjYxMjFfc2V0X211dGUoc3RydWN0IGl0NjYxMjFfY3R4ICpjdHgsIGJvb2wgbXV0 ZSkKPj4+ICArewo+Pj4gICsgICAgaW50IHJldDsKPj4+ICArICAgIHVuc2lnbmVkIGludCB2YWwg PSAwOwo+Pj4gICsKPj4+ICArICAgIGlmIChtdXRlKQo+Pj4gICsgICAgICAgIHZhbCA9IElUNjYx MjFfQVZfTVVURV9PTjsKPj4+ICArCj4+PiAgKyAgICByZXQgPSByZWdtYXBfd3JpdGVfYml0cyhj dHgtPnJlZ21hcCwgSVQ2NjEyMV9BVl9NVVRFX1JFRywgCj4+PiBJVDY2MTIxX0FWX01VVEVfT04s IHZhbCk7Cj4+PiAgKyAgICBpZiAocmV0KQo+Pj4gICsgICAgICAgIHJldHVybiByZXQ7Cj4+PiAg Kwo+Pj4gICsgICAgcmV0dXJuIHJlZ21hcF93cml0ZShjdHgtPnJlZ21hcCwgSVQ2NjEyMV9QS1Rf R0VOX0NUUkxfUkVHLAo+Pj4gICsgICAgICAgICAgICAgICAgSVQ2NjEyMV9QS1RfR0VOX0NUUkxf T04gfCAKPj4+IElUNjYxMjFfUEtUX0dFTl9DVFJMX1JQVCk7Cj4+PiAgK30KPj4+ICArCj4+PiAg KyNkZWZpbmUgTUFYX09VVFBVVF9TRUxfRk9STUFUUyAgICAxCj4+PiAgKwo+Pj4gICtzdGF0aWMg dTMyICppdDY2MTIxX2JyaWRnZV9hdG9taWNfZ2V0X291dHB1dF9idXNfZm10cyhzdHJ1Y3QgCj4+ PiBkcm1fYnJpZGdlICpicmlkZ2UsCj4+PiAgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHN0cnVjdCBkcm1fYnJpZGdlX3N0YXRlIAo+Pj4gKmJyaWRnZV9zdGF0ZSwKPj4+ICArICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRybV9jcnRjX3N0YXRlICpjcnRjX3N0YXRl LAo+Pj4gICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZHJtX2Nvbm5lY3Rv cl9zdGF0ZSAKPj4+ICpjb25uX3N0YXRlLAo+Pj4gICsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICB1bnNpZ25lZCBpbnQgKm51bV9vdXRwdXRfZm10cykKPj4+ICArewo+Pj4gICsgICAgdTMy ICpvdXRwdXRfZm10czsKPj4+ICArCj4+PiAgKyAgICBvdXRwdXRfZm10cyA9IGtjYWxsb2MoTUFY X09VVFBVVF9TRUxfRk9STUFUUywgCj4+PiBzaXplb2YoKm91dHB1dF9mbXRzKSwKPj4+ICArICAg ICAgICAgICAgICAgICAgR0ZQX0tFUk5FTCk7Cj4+PiAgKyAgICBpZiAoIW91dHB1dF9mbXRzKQo+ Pj4gICsgICAgICAgIHJldHVybiBOVUxMOwo+Pj4gICsKPj4+ICArICAgIC8qIFRPRklYIGhhbmRs ZSBtb3JlIHRoYW4gTUVESUFfQlVTX0ZNVF9SR0I4ODhfMVgyNCBhcyBvdXRwdXQgCj4+PiBmb3Jt YXQgKi8KPj4+ICArICAgIG91dHB1dF9mbXRzWzBdID0gIE1FRElBX0JVU19GTVRfUkdCODg4XzFY MjQ7Cj4+PiAgKyAgICAqbnVtX291dHB1dF9mbXRzID0gMTsKPj4+ICArCj4+PiAgKyAgICByZXR1 cm4gb3V0cHV0X2ZtdHM7Cj4+PiAgK30KPj4+ICArCj4+PiAgKyNkZWZpbmUgTUFYX0lOUFVUX1NF TF9GT1JNQVRTICAgIDEKPj4+ICArCj4+PiAgK3N0YXRpYyB1MzIgKml0NjYxMjFfYnJpZGdlX2F0 b21pY19nZXRfaW5wdXRfYnVzX2ZtdHMoc3RydWN0IAo+Pj4gZHJtX2JyaWRnZSAqYnJpZGdlLAo+ Pj4gICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkcm1fYnJpZGdlX3N0YXRl IAo+Pj4gKmJyaWRnZV9zdGF0ZSwKPj4+ICArICAgICAgICAgICAgICAgICAgICAgICAgICAgICBz dHJ1Y3QgZHJtX2NydGNfc3RhdGUgKmNydGNfc3RhdGUsCj4+PiAgKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgc3RydWN0IGRybV9jb25uZWN0b3Jfc3RhdGUgCj4+PiAqY29ubl9zdGF0ZSwK Pj4+ICArICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgb3V0cHV0X2ZtdCwKPj4+ICAr ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKm51bV9pbnB1dF9mbXRz KQo+Pj4gICt7Cj4+PiAgKyAgICBzdHJ1Y3QgaXQ2NjEyMV9jdHggKmN0eCA9IGNvbnRhaW5lcl9v ZihicmlkZ2UsIHN0cnVjdCAKPj4+IGl0NjYxMjFfY3R4LCBicmlkZ2UpOwo+Pj4gICsgICAgdTMy ICppbnB1dF9mbXRzOwo+Pj4gICsKPj4+ICArICAgICpudW1faW5wdXRfZm10cyA9IDA7Cj4+PiAg Kwo+Pj4gICsgICAgaW5wdXRfZm10cyA9IGtjYWxsb2MoTUFYX0lOUFVUX1NFTF9GT1JNQVRTLCAK Pj4+IHNpemVvZigqaW5wdXRfZm10cyksCj4+PiAgKyAgICAgICAgICAgICAgICAgR0ZQX0tFUk5F TCk7Cj4+PiAgKyAgICBpZiAoIWlucHV0X2ZtdHMpCj4+PiAgKyAgICAgICAgcmV0dXJuIE5VTEw7 Cj4+PiAgKwo+Pj4gICsgICAgaWYgKGN0eC0+YnVzX3dpZHRoID09IDEyKQo+Pj4gICsgICAgICAg IC8qIElUNjYxMjFGTiBEYXRhc2hlZXQgc3BlY2lmaWVzIExpdHRsZS1FbmRpYW4gb3JkZXJpbmcg Ki8KPj4+ICArICAgICAgICBpbnB1dF9mbXRzWzBdID0gTUVESUFfQlVTX0ZNVF9SR0I4ODhfMlgx Ml9MRTsKPj4+ICArICAgIGVsc2UKPj4+ICArICAgICAgICAvKiBUT0ZJWCBzdXBwb3J0IG1vcmUg aW5wdXQgYnVzIGZvcm1hdHMgaW4gMjRiaXQgd2lkdGggKi8KPj4+ICArICAgICAgICBpbnB1dF9m bXRzWzBdID0gTUVESUFfQlVTX0ZNVF9SR0I4ODhfMVgyNDsKPj4+ICArICAgICpudW1faW5wdXRf Zm10cyA9IDE7Cj4+PiAgKwo+Pj4gICsgICAgcmV0dXJuIGlucHV0X2ZtdHM7Cj4+PiAgK30KPj4+ ICArCj4+PiAgK3N0YXRpYyB2b2lkIGl0NjYxMjFfYnJpZGdlX2VuYWJsZShzdHJ1Y3QgZHJtX2Jy aWRnZSAqYnJpZGdlKQo+Pj4gICt7Cj4+PiAgKyAgICBzdHJ1Y3QgaXQ2NjEyMV9jdHggKmN0eCA9 IGNvbnRhaW5lcl9vZihicmlkZ2UsIHN0cnVjdCAKPj4+IGl0NjYxMjFfY3R4LCBicmlkZ2UpOwo+ Pj4gICsKPj4+ICArICAgIGl0NjYxMjFfc2V0X211dGUoY3R4LCBmYWxzZSk7Cj4+PiAgK30KPj4+ ICArCj4+PiAgK3N0YXRpYyB2b2lkIGl0NjYxMjFfYnJpZGdlX2Rpc2FibGUoc3RydWN0IGRybV9i cmlkZ2UgKmJyaWRnZSkKPj4+ICArewo+Pj4gICsgICAgc3RydWN0IGl0NjYxMjFfY3R4ICpjdHgg PSBjb250YWluZXJfb2YoYnJpZGdlLCBzdHJ1Y3QgCj4+PiBpdDY2MTIxX2N0eCwgYnJpZGdlKTsK Pj4+ICArCj4+PiAgKyAgICBpdDY2MTIxX3NldF9tdXRlKGN0eCwgdHJ1ZSk7Cj4+PiAgK30KPj4+ ICArCj4+PiAgK3N0YXRpYwo+Pj4gICt2b2lkIGl0NjYxMjFfYnJpZGdlX21vZGVfc2V0KHN0cnVj dCBkcm1fYnJpZGdlICpicmlkZ2UsCj4+PiAgKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0 IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCj4+PiAgKyAgICAgICAgICAgICAgICAgY29uc3Qgc3Ry dWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUpCj4+PiAgK3sKPj4+ICArICAgIGlu dCByZXQsIGk7Cj4+PiAgKyAgICB1OCBidWZbSERNSV9JTkZPRlJBTUVfU0laRShBVkkpXTsKPj4+ ICArICAgIHN0cnVjdCBpdDY2MTIxX2N0eCAqY3R4ID0gY29udGFpbmVyX29mKGJyaWRnZSwgc3Ry dWN0IAo+Pj4gaXQ2NjEyMV9jdHgsIGJyaWRnZSk7Cj4+PiAgKyAgICBjb25zdCB1MTYgYXZpaW5m b19yZWdbSERNSV9BVklfSU5GT0ZSQU1FX1NJWkVdID0gewo+Pj4gICsgICAgICAgIElUNjYxMjFf QVZJSU5GT19EQjFfUkVHLAo+Pj4gICsgICAgICAgIElUNjYxMjFfQVZJSU5GT19EQjJfUkVHLAo+ Pj4gICsgICAgICAgIElUNjYxMjFfQVZJSU5GT19EQjNfUkVHLAo+Pj4gICsgICAgICAgIElUNjYx MjFfQVZJSU5GT19EQjRfUkVHLAo+Pj4gICsgICAgICAgIElUNjYxMjFfQVZJSU5GT19EQjVfUkVH LAo+Pj4gICsgICAgICAgIElUNjYxMjFfQVZJSU5GT19EQjZfUkVHLAo+Pj4gICsgICAgICAgIElU NjYxMjFfQVZJSU5GT19EQjdfUkVHLAo+Pj4gICsgICAgICAgIElUNjYxMjFfQVZJSU5GT19EQjhf UkVHLAo+Pj4gICsgICAgICAgIElUNjYxMjFfQVZJSU5GT19EQjlfUkVHLAo+Pj4gICsgICAgICAg IElUNjYxMjFfQVZJSU5GT19EQjEwX1JFRywKPj4+ICArICAgICAgICBJVDY2MTIxX0FWSUlORk9f REIxMV9SRUcsCj4+PiAgKyAgICAgICAgSVQ2NjEyMV9BVklJTkZPX0RCMTJfUkVHLAo+Pj4gICsg ICAgICAgIElUNjYxMjFfQVZJSU5GT19EQjEzX1JFRwo+Pj4gICsgICAgfTsKPj4+ICArCj4+PiAg KyAgICBtdXRleF9sb2NrKCZjdHgtPmxvY2spOwo+Pj4gICsKPj4+ICArICAgIGhkbWlfYXZpX2lu Zm9mcmFtZV9pbml0KCZjdHgtPmhkbWlfYXZpX2luZm9mcmFtZSk7Cj4+PiAgKwo+Pj4gICsgICAg cmV0ID0gCj4+PiBkcm1faGRtaV9hdmlfaW5mb2ZyYW1lX2Zyb21fZGlzcGxheV9tb2RlKCZjdHgt PmhkbWlfYXZpX2luZm9mcmFtZSwgCj4+PiAmY3R4LT5jb25uZWN0b3IsCj4+PiAgKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBhZGp1c3RlZF9tb2RlKTsKPj4+ICArICAgIGlmIChyZXQp IHsKPj4+ICArICAgICAgICBEUk1fRVJST1IoIkZhaWxlZCB0byBzZXR1cCBBVkkgaW5mb2ZyYW1l OiAlZFxuIiwgcmV0KTsKPj4+ICArICAgICAgICBnb3RvIHVubG9jazsKPj4+ICArICAgIH0KPj4+ ICArCj4+PiAgKyAgICByZXQgPSBoZG1pX2F2aV9pbmZvZnJhbWVfcGFjaygmY3R4LT5oZG1pX2F2 aV9pbmZvZnJhbWUsIGJ1ZiwgCj4+PiBzaXplb2YoYnVmKSk7Cj4+PiAgKyAgICBpZiAocmV0IDwg MCkgewo+Pj4gICsgICAgICAgIERSTV9FUlJPUigiRmFpbGVkIHRvIHBhY2sgaW5mb2ZyYW1lOiAl ZFxuIiwgcmV0KTsKPj4+ICArICAgICAgICBnb3RvIHVubG9jazsKPj4+ICArICAgIH0KPj4+ICAr Cj4+PiAgKyAgICAvKiBXcml0ZSBuZXcgQVZJIGluZm9mcmFtZSBwYWNrZXQgKi8KPj4+ICArICAg IGZvciAoaSA9IDA7IGkgPCBIRE1JX0FWSV9JTkZPRlJBTUVfU0laRTsgaSsrKSB7Cj4+PiAgKyAg ICAgICAgaWYgKHJlZ21hcF93cml0ZShjdHgtPnJlZ21hcCwgYXZpaW5mb19yZWdbaV0sIGJ1Zltp ICsgCj4+PiBIRE1JX0lORk9GUkFNRV9IRUFERVJfU0laRV0pKQo+Pj4gICsgICAgICAgICAgICBn b3RvIHVubG9jazsKPj4+ICArICAgIH0KPj4+ICArICAgIGlmIChyZWdtYXBfd3JpdGUoY3R4LT5y ZWdtYXAsIElUNjYxMjFfQVZJSU5GT19DU1VNX1JFRywgCj4+PiBidWZbM10pKQo+Pj4gICsgICAg ICAgIGdvdG8gdW5sb2NrOwo+Pj4gICsKPj4+ICArICAgIC8qIEVuYWJsZSBBVkkgaW5mb2ZyYW1l ICovCj4+PiAgKyAgICBpZiAocmVnbWFwX3dyaXRlKGN0eC0+cmVnbWFwLCBJVDY2MTIxX0FWSV9J TkZPX1BLVF9SRUcsCj4+PiAgKyAgICAgICAgICAgICBJVDY2MTIxX0FWSV9JTkZPX1BLVF9PTiB8 IElUNjYxMjFfQVZJX0lORk9fUEtUX1JQVCkpCj4+PiAgKyAgICAgICAgZ290byB1bmxvY2s7Cj4+ PiAgKwo+Pj4gICsgICAgLyogU2V0IFRYIG1vZGUgdG8gSERNSSAqLwo+Pj4gICsgICAgaWYgKHJl Z21hcF93cml0ZShjdHgtPnJlZ21hcCwgSVQ2NjEyMV9IRE1JX01PREVfUkVHLCAKPj4+IElUNjYx MjFfSERNSV9NT0RFX0hETUkpKQo+Pj4gICsgICAgICAgIGdvdG8gdW5sb2NrOwo+Pj4gICsKPj4+ ICArICAgIGlmIChyZWdtYXBfd3JpdGVfYml0cyhjdHgtPnJlZ21hcCwgSVQ2NjEyMV9DTEtfQkFO S19SRUcsCj4+PiAgKyAgICAgICAgICAgICAgICAgIElUNjYxMjFfQ0xLX0JBTktfUFdST0ZGX1RY Q0xLLCAKPj4+IElUNjYxMjFfQ0xLX0JBTktfUFdST0ZGX1RYQ0xLKSkKPj4+ICArICAgICAgICBn b3RvIHVubG9jazsKPj4+ICArCj4+PiAgKyAgICBpZiAoaXQ2NjEyMV9jb25maWd1cmVfaW5wdXQo Y3R4KSkKPj4+ICArICAgICAgICBnb3RvIHVubG9jazsKPj4+ICArCj4+PiAgKyAgICBpZiAoaXQ2 NjEyMV9jb25maWd1cmVfYWZlKGN0eCwgYWRqdXN0ZWRfbW9kZSkpCj4+PiAgKyAgICAgICAgZ290 byB1bmxvY2s7Cj4+PiAgKwo+Pj4gICsgICAgcmVnbWFwX3dyaXRlX2JpdHMoY3R4LT5yZWdtYXAs IElUNjYxMjFfQ0xLX0JBTktfUkVHLCAKPj4+IElUNjYxMjFfQ0xLX0JBTktfUFdST0ZGX1RYQ0xL LCAwKTsKPj4+ICArCj4+PiAgK3VubG9jazoKPj4+ICArICAgIG11dGV4X3VubG9jaygmY3R4LT5s b2NrKTsKPj4+ICArfQo+Pj4gICsKPj4+ICArc3RhdGljIGVudW0gZHJtX21vZGVfc3RhdHVzIGl0 NjYxMjFfYnJpZGdlX21vZGVfdmFsaWQoc3RydWN0IAo+Pj4gZHJtX2JyaWRnZSAqYnJpZGdlLAo+ Pj4gICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZHJtX2Rpc3Bs YXlfaW5mbyAqaW5mbywKPj4+ICArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qg c3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpCj4+PiAgK3sKPj4+ICArICAgIHN0cnVjdCBp dDY2MTIxX2N0eCAqY3R4ID0gY29udGFpbmVyX29mKGJyaWRnZSwgc3RydWN0IAo+Pj4gaXQ2NjEy MV9jdHgsIGJyaWRnZSk7Cj4+PiAgKwo+Pj4gICsgICAgcmV0dXJuIGl0NjYxMjFfbW9kZV92YWxp ZChjdHgsIG1vZGUpOwo+Pj4gICt9Cj4+PiAgKwo+Pj4gICtzdGF0aWMgZW51bSBkcm1fY29ubmVj dG9yX3N0YXR1cyBpdDY2MTIxX2JyaWRnZV9kZXRlY3Qoc3RydWN0IAo+Pj4gZHJtX2JyaWRnZSAq YnJpZGdlKQo+Pj4gICt7Cj4+PiAgKyAgICBzdHJ1Y3QgaXQ2NjEyMV9jdHggKmN0eCA9IGNvbnRh aW5lcl9vZihicmlkZ2UsIHN0cnVjdCAKPj4+IGl0NjYxMjFfY3R4LCBicmlkZ2UpOwo+Pj4gICsK Pj4+ICArICAgIHJldHVybiBpdDY2MTIxX2lzX2hwZF9kZXRlY3QoY3R4KSA/IGNvbm5lY3Rvcl9z dGF0dXNfY29ubmVjdGVkCj4+PiAgKyAgICAgICAgICAgICAgICAgICAgICA6IGNvbm5lY3Rvcl9z dGF0dXNfZGlzY29ubmVjdGVkOwo+Pj4gICt9Cj4+PiAgKwo+Pj4gICtzdGF0aWMgc3RydWN0IGVk aWQgKml0NjYxMjFfYnJpZGdlX2dldF9lZGlkKHN0cnVjdCBkcm1fYnJpZGdlIAo+Pj4gKmJyaWRn ZSwKPj4+ICArICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRybV9jb25uZWN0b3IgKmNv bm5lY3RvcikKPj4+ICArewo+Pj4gICsgICAgc3RydWN0IGl0NjYxMjFfY3R4ICpjdHggPSBjb250 YWluZXJfb2YoYnJpZGdlLCBzdHJ1Y3QgCj4+PiBpdDY2MTIxX2N0eCwgYnJpZGdlKTsKPj4+ICAr ICAgIHN0cnVjdCBlZGlkICplZGlkOwo+Pj4gICsKPj4+ICArICAgIG11dGV4X2xvY2soJmN0eC0+ bG9jayk7Cj4+PiAgKyAgICBlZGlkID0gZHJtX2RvX2dldF9lZGlkKGNvbm5lY3RvciwgaXQ2NjEy MV9nZXRfZWRpZF9ibG9jaywgCj4+PiBjdHgpOwo+Pj4gICsgICAgbXV0ZXhfdW5sb2NrKCZjdHgt PmxvY2spOwo+Pj4gICsKPj4+ICArICAgIHJldHVybiBlZGlkOwo+Pj4gICt9Cj4+PiAgKwo+Pj4g ICtzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9icmlkZ2VfZnVuY3MgaXQ2NjEyMV9icmlkZ2VfZnVu Y3MgPSB7Cj4+PiAgKyAgICAuYXR0YWNoID0gaXQ2NjEyMV9icmlkZ2VfYXR0YWNoLAo+Pj4gICsg ICAgLmVuYWJsZSA9IGl0NjYxMjFfYnJpZGdlX2VuYWJsZSwKPj4+ICArICAgIC5kaXNhYmxlID0g aXQ2NjEyMV9icmlkZ2VfZGlzYWJsZSwKPj4+ICArICAgIC5tb2RlX3NldCA9IGl0NjYxMjFfYnJp ZGdlX21vZGVfc2V0LAo+Pj4gICsgICAgLm1vZGVfdmFsaWQgPSBpdDY2MTIxX2JyaWRnZV9tb2Rl X3ZhbGlkLAo+Pj4gICsgICAgLmRldGVjdCA9IGl0NjYxMjFfYnJpZGdlX2RldGVjdCwKPj4+ICAr ICAgIC5nZXRfZWRpZCA9IGl0NjYxMjFfYnJpZGdlX2dldF9lZGlkLAo+Pj4gICsgICAgLmF0b21p Y19nZXRfb3V0cHV0X2J1c19mbXRzID0gCj4+PiBpdDY2MTIxX2JyaWRnZV9hdG9taWNfZ2V0X291 dHB1dF9idXNfZm10cywKPj4+ICArICAgIC5hdG9taWNfZ2V0X2lucHV0X2J1c19mbXRzID0gCj4+ PiBpdDY2MTIxX2JyaWRnZV9hdG9taWNfZ2V0X2lucHV0X2J1c19mbXRzLAo+Pj4gICt9Owo+Pj4g ICsKPj4+ICArc3RhdGljIGlycXJldHVybl90IGl0NjYxMjFfaXJxX3RocmVhZGVkX2hhbmRsZXIo aW50IGlycSwgdm9pZCAKPj4+ICpkZXZfaWQpCj4+PiAgK3sKPj4+ICArICAgIGludCByZXQ7Cj4+ PiAgKyAgICB1bnNpZ25lZCBpbnQgdmFsOwo+Pj4gICsgICAgc3RydWN0IGl0NjYxMjFfY3R4ICpj dHggPSBkZXZfaWQ7Cj4+PiAgKyAgICBzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjdHgtPmRldjsKPj4+ ICArICAgIGJvb2wgZXZlbnQgPSBmYWxzZTsKPj4+ICArCj4+PiAgKyAgICBtdXRleF9sb2NrKCZj dHgtPmxvY2spOwo+Pj4gICsKPj4+ICArICAgIHJldCA9IHJlZ21hcF9yZWFkKGN0eC0+cmVnbWFw LCBJVDY2MTIxX1NZU19TVEFUVVNfUkVHLCAmdmFsKTsKPj4+ICArICAgIGlmIChyZXQpCj4+PiAg KyAgICAgICAgZ290byB1bmxvY2s7Cj4+PiAgKwo+Pj4gICsgICAgaWYgKCEodmFsICYgSVQ2NjEy MV9TWVNfU1RBVFVTX0FDVElWRV9JUlEpKQo+Pj4gICsgICAgICAgIGdvdG8gdW5sb2NrOwo+Pj4g ICsKPj4+ICArICAgIHJldCA9IHJlZ21hcF9yZWFkKGN0eC0+cmVnbWFwLCBJVDY2MTIxX0lOVF9T VEFUVVMxX1JFRywgJnZhbCk7Cj4+PiAgKyAgICBpZiAocmV0KSB7Cj4+PiAgKyAgICAgICAgZGV2 X2VycihkZXYsICJDYW5ub3QgcmVhZCBTVEFUVVMxX1JFRyAlZFxuIiwgcmV0KTsKPj4+ICArICAg IH0gZWxzZSB7Cj4+PiAgKyAgICAgICAgaWYgKHZhbCAmIElUNjYxMjFfSU5UX1NUQVRVUzFfRERD X0ZJRk9FUlIpCj4+PiAgKyAgICAgICAgICAgIGl0NjYxMjFfY2xlYXJfZGRjX2ZpZm8oY3R4KTsK Pj4+ICArICAgICAgICBpZiAodmFsICYgKElUNjYxMjFfSU5UX1NUQVRVUzFfRERDX0JVU0hBTkcg fAo+Pj4gICsgICAgICAgICAgICAgICBJVDY2MTIxX0lOVF9TVEFUVVMxX0REQ19OT0FDSykpCj4+ PiAgKyAgICAgICAgICAgIGl0NjYxMjFfYWJvcnRfZGRjX29wcyhjdHgpOwo+Pj4gICsgICAgICAg IGlmICh2YWwgJiBJVDY2MTIxX0lOVF9TVEFUVVMxX0hQRF9TVEFUVVMpIHsKPj4+ICArICAgICAg ICAgICAgcmVnbWFwX3dyaXRlX2JpdHMoY3R4LT5yZWdtYXAsIElUNjYxMjFfSU5UX0NMUjFfUkVH LAo+Pj4gICsgICAgICAgICAgICAgICAgICAgICAgSVQ2NjEyMV9JTlRfQ0xSMV9IUEQsIElUNjYx MjFfSU5UX0NMUjFfSFBEKTsKPj4+ICArCj4+PiAgKyAgICAgICAgICAgIGlmICghaXQ2NjEyMV9p c19ocGRfZGV0ZWN0KGN0eCkpIHsKPj4+ICArICAgICAgICAgICAgICAgIGtmcmVlKGN0eC0+ZWRp ZCk7Cj4+PiAgKyAgICAgICAgICAgICAgICBjdHgtPmVkaWQgPSBOVUxMOwo+Pj4gICsgICAgICAg ICAgICB9Cj4+PiAgKwo+Pj4gICsgICAgICAgICAgICBldmVudCA9IHRydWU7Cj4+PiAgKyAgICAg ICAgfQo+Pj4gICsgICAgfQo+Pj4gICsKPj4+ICArICAgIHJlZ21hcF93cml0ZV9iaXRzKGN0eC0+ cmVnbWFwLCBJVDY2MTIxX1NZU19TVEFUVVNfUkVHLAo+Pj4gICsgICAgICAgICAgICAgIElUNjYx MjFfU1lTX1NUQVRVU19DTEVBUl9JUlEsCj4+PiAgKyAgICAgICAgICAgICAgSVQ2NjEyMV9TWVNf U1RBVFVTX0NMRUFSX0lSUSk7Cj4+PiAgKwo+Pj4gICt1bmxvY2s6Cj4+PiAgKyAgICBtdXRleF91 bmxvY2soJmN0eC0+bG9jayk7Cj4+PiAgKwo+Pj4gICsgICAgaWYgKGV2ZW50KQo+Pj4gICsgICAg ICAgIGRybV9oZWxwZXJfaHBkX2lycV9ldmVudChjdHgtPmJyaWRnZS5kZXYpOwo+Pj4gICsKPj4+ ICArICAgIHJldHVybiBJUlFfSEFORExFRDsKPj4+ICArfQo+Pj4gICsKPj4+ICArc3RhdGljIGlu dCBpdDY2MTIxX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCj4+PiAgKyAgICAgICAg ICAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCj4+PiAgK3sKPj4+ICArICAgIHUz MiB2ZW5kb3JfaWRzWzJdLCBkZXZpY2VfaWRzWzJdLCByZXZpc2lvbl9pZDsKPj4+ICArICAgIHN0 cnVjdCBkZXZpY2Vfbm9kZSAqZXA7Cj4+PiAgKyAgICBpbnQgcmV0Owo+Pj4gICsgICAgc3RydWN0 IGl0NjYxMjFfY3R4ICpjdHg7Cj4+PiAgKyAgICBzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY2xpZW50 LT5kZXY7Cj4+PiAgKwo+Pj4gICsgICAgaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGll bnQtPmFkYXB0ZXIsIEkyQ19GVU5DX0kyQykpIHsKPj4+ICArICAgICAgICBkZXZfZXJyKGRldiwg IkkyQyBjaGVjayBmdW5jdGlvbmFsaXR5IGZhaWxlZC5cbiIpOwo+Pj4gICsgICAgICAgIHJldHVy biAtRU5YSU87Cj4+PiAgKyAgICB9Cj4+PiAgKwo+Pj4gICsgICAgZXAgPSBvZl9ncmFwaF9nZXRf ZW5kcG9pbnRfYnlfcmVncyhkZXYtPm9mX25vZGUsIDAsIDApOwo+Pj4gICsgICAgaWYgKCFlcCkK Pj4+ICArICAgICAgICByZXR1cm4gLUVJTlZBTDsKPj4+ICArCj4+PiAgKyAgICBjdHggPSBkZXZt X2t6YWxsb2MoZGV2LCBzaXplb2YoKmN0eCksIEdGUF9LRVJORUwpOwo+Pj4gICsgICAgaWYgKCFj dHgpCj4+PiAgKyAgICAgICAgcmV0dXJuIC1FTk9NRU07Cj4+PiAgKwo+Pj4gICsgICAgY3R4LT5k ZXYgPSBkZXY7Cj4+PiAgKyAgICBjdHgtPmNsaWVudCA9IGNsaWVudDsKPj4+ICArCj4+PiAgKyAg ICBvZl9wcm9wZXJ0eV9yZWFkX3UzMihlcCwgImJ1cy13aWR0aCIsICZjdHgtPmJ1c193aWR0aCk7 Cj4+PiAgKyAgICBvZl9ub2RlX3B1dChlcCk7Cj4+PiAgKwo+Pj4gICsgICAgaWYgKGN0eC0+YnVz X3dpZHRoICE9IDEyICYmIGN0eC0+YnVzX3dpZHRoICE9IDI0KQo+Pj4gICsgICAgICAgIHJldHVy biAtRUlOVkFMOwo+Pj4gICsKPj4+ICArICAgIGkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGN0 eCk7Cj4+PiAgKyAgICBtdXRleF9pbml0KCZjdHgtPmxvY2spOwo+Pj4gICsKPj4+ICArICAgIGN0 eC0+c3VwcGxpZXNbMF0uc3VwcGx5ID0gInZjbjMzIjsKPj4+ICArICAgIGN0eC0+c3VwcGxpZXNb MV0uc3VwcGx5ID0gInZjbjE4IjsKPj4+ICArICAgIGN0eC0+c3VwcGxpZXNbMl0uc3VwcGx5ID0g InZyZjEyIjsKPj4+ICArICAgIHJldCA9IGRldm1fcmVndWxhdG9yX2J1bGtfZ2V0KGN0eC0+ZGV2 LCAzLCBjdHgtPnN1cHBsaWVzKTsKPj4+ICArICAgIGlmIChyZXQpIHsKPj4+ICArICAgICAgICBk ZXZfZXJyKGN0eC0+ZGV2LCAicmVndWxhdG9yX2J1bGsgZmFpbGVkXG4iKTsKPj4+ICArICAgICAg ICByZXR1cm4gcmV0Owo+Pj4gICsgICAgfQo+Pj4gICsKPj4+ICArICAgIHJldCA9IGl0ZTY2MTIx X3Bvd2VyX29uKGN0eCk7Cj4+PiAgKyAgICBpZiAocmV0KQo+Pj4gICsgICAgICAgIHJldHVybiBy ZXQ7Cj4+PiAgKwo+Pj4gICsgICAgaXQ2NjEyMV9od19yZXNldChjdHgpOwo+Pj4gICsKPj4+ICAr ICAgIGN0eC0+cmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9pMmMoY2xpZW50LCAKPj4+ICZpdDY2 MTIxX3JlZ21hcF9jb25maWcpOwo+Pj4gICsgICAgaWYgKElTX0VSUihjdHgtPnJlZ21hcCkpIHsK Pj4+ICArICAgICAgICBpdGU2NjEyMV9wb3dlcl9vZmYoY3R4KTsKPj4+ICArICAgICAgICByZXR1 cm4gUFRSX0VSUihjdHgpOwo+Pj4gICsgICAgfQo+Pj4gICsKPj4+ICArICAgIHJlZ21hcF9yZWFk KGN0eC0+cmVnbWFwLCBJVDY2MTIxX1ZFTkRPUl9JRDBfUkVHLCAKPj4+ICZ2ZW5kb3JfaWRzWzBd KTsKPj4+ICArICAgIHJlZ21hcF9yZWFkKGN0eC0+cmVnbWFwLCBJVDY2MTIxX1ZFTkRPUl9JRDFf UkVHLCAKPj4+ICZ2ZW5kb3JfaWRzWzFdKTsKPj4+ICArICAgIHJlZ21hcF9yZWFkKGN0eC0+cmVn bWFwLCBJVDY2MTIxX0RFVklDRV9JRDBfUkVHLCAKPj4+ICZkZXZpY2VfaWRzWzBdKTsKPj4+ICAr ICAgIHJlZ21hcF9yZWFkKGN0eC0+cmVnbWFwLCBJVDY2MTIxX0RFVklDRV9JRDFfUkVHLCAKPj4+ ICZkZXZpY2VfaWRzWzFdKTsKPj4+ICArCj4+PiAgKyAgICAvKiBSZXZpc2lvbiBpcyBzaGFyZWQg d2l0aCBERVZJQ0VfSUQxICovCj4+PiAgKyAgICByZXZpc2lvbl9pZCA9IEZJRUxEX0dFVChJVDY2 MTIxX1JFVklTSU9OX01BU0ssIGRldmljZV9pZHNbMV0pOwo+Pj4gICsgICAgZGV2aWNlX2lkc1sx XSAmPSBJVDY2MTIxX0RFVklDRV9JRDFfTUFTSzsKPj4+ICArCj4+PiAgKyAgICBpZiAodmVuZG9y X2lkc1swXSAhPSBJVDY2MTIxX1ZFTkRPUl9JRDAgfHwgdmVuZG9yX2lkc1sxXSAhPSAKPj4+IElU NjYxMjFfVkVORE9SX0lEMSB8fAo+Pj4gICsgICAgICAgIGRldmljZV9pZHNbMF0gIT0gSVQ2NjEy MV9ERVZJQ0VfSUQwIHx8IGRldmljZV9pZHNbMV0gIT0gCj4+PiBJVDY2MTIxX0RFVklDRV9JRDEp IHsKPj4+ICArICAgICAgICBpdGU2NjEyMV9wb3dlcl9vZmYoY3R4KTsKPj4+ICArICAgICAgICBy ZXR1cm4gLUVOT0RFVjsKPj4+ICArICAgIH0KPj4+ICArCj4+PiAgKyAgICBjdHgtPmJyaWRnZS5m dW5jcyA9ICZpdDY2MTIxX2JyaWRnZV9mdW5jczsKPj4+ICArICAgIGN0eC0+YnJpZGdlLm9mX25v ZGUgPSBkZXYtPm9mX25vZGU7Cj4+PiAgKwo+Pj4gICsgICAgcmV0ID0gZGV2bV9yZXF1ZXN0X3Ro cmVhZGVkX2lycShkZXYsIGNsaWVudC0+aXJxLCBOVUxMLCAgICAKPj4+IGl0NjYxMjFfaXJxX3Ro cmVhZGVkX2hhbmRsZXIsCj4+PiAgKyAgICAgICAgICAgICAgICAgICAgSVJRRl9TSEFSRUQgfCBJ UlFGX09ORVNIT1QsIGRldl9uYW1lKGRldiksIAo+Pj4gY3R4KTsKPj4+ICArICAgIGlmIChyZXQg PCAwKSB7Cj4+PiAgKyAgICAgICAgZGV2X2VycihkZXYsICJGYWlsZWQgdG8gcmVxdWVzdCBpcnEg JWQ6JWRcbiIsIAo+Pj4gY2xpZW50LT5pcnEsIHJldCk7Cj4+PiAgKyAgICAgICAgaXRlNjYxMjFf cG93ZXJfb2ZmKGN0eCk7Cj4+PiAgKyAgICAgICAgcmV0dXJuIHJldDsKPj4+ICArICAgIH0KPj4+ ICArCj4+PiAgKyAgICBkcm1fYnJpZGdlX2FkZCgmY3R4LT5icmlkZ2UpOwo+Pj4gICsKPj4+ICAr ICAgIGRldl9pbmZvKGN0eC0+ZGV2LCAiSVQ2NjEyMSByZXZpc2lvbiAlZCBwcm9iZWRcbiIsIAo+ Pj4gcmV2aXNpb25faWQpOwo+Pj4gICsKPj4+ICArICAgIHJldHVybiAwOwo+Pj4gICt9Cj4+PiAg Kwo+Pj4gICtzdGF0aWMgaW50IGl0NjYxMjFfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGll bnQpCj4+PiAgK3sKPj4+ICArICAgIHN0cnVjdCBpdDY2MTIxX2N0eCAqY3R4ID0gaTJjX2dldF9j bGllbnRkYXRhKGNsaWVudCk7Cj4+PiAgKwo+Pj4gICsgICAgaXRlNjYxMjFfcG93ZXJfb2ZmKGN0 eCk7Cj4+PiAgKyAgICBkcm1fYnJpZGdlX3JlbW92ZSgmY3R4LT5icmlkZ2UpOwo+Pj4gICsgICAg a2ZyZWUoY3R4LT5lZGlkKTsKPj4+ICArICAgIG11dGV4X2Rlc3Ryb3koJmN0eC0+bG9jayk7Cj4+ PiAgKwo+Pj4gICsgICAgcmV0dXJuIDA7Cj4+PiAgK30KPj4+ICArCj4+PiAgK3N0YXRpYyBjb25z dCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGl0NjYxMjFfZHRfbWF0Y2hbXSA9IHsKPj4+ICArICAgIHsg LmNvbXBhdGlibGUgPSAiaXRlLGl0NjYxMjEiIH0sCj4+PiAgKyAgICB7IH0KPj4+ICArfTsKPj4+ ICArTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgaXQ2NjEyMV9kdF9tYXRjaCk7Cj4+PiAgKwo+Pj4g ICtzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgaXQ2NjEyMV9pZFtdID0gewo+Pj4g ICsgICAgeyAiaXQ2NjEyMSIsIDAgfSwKPj4+ICArICAgIHsgfQo+Pj4gICt9Owo+Pj4gICtNT0RV TEVfREVWSUNFX1RBQkxFKGkyYywgaXQ2NjEyMV9pZCk7Cj4+PiAgKwo+Pj4gICtzdGF0aWMgc3Ry dWN0IGkyY19kcml2ZXIgaXQ2NjEyMV9kcml2ZXIgPSB7Cj4+PiAgKyAgICAuZHJpdmVyID0gewo+ Pj4gICsgICAgICAgIC5uYW1lICAgID0gIml0NjYxMjEiLAo+Pj4gICsgICAgICAgIC5vZl9tYXRj aF90YWJsZSA9IGl0NjYxMjFfZHRfbWF0Y2gsCj4+PiAgKyAgICB9LAo+Pj4gICsgICAgLnByb2Jl ID0gaXQ2NjEyMV9wcm9iZSwKPj4+ICArICAgIC5yZW1vdmUgPSBpdDY2MTIxX3JlbW92ZSwKPj4+ ICArICAgIC5pZF90YWJsZSA9IGl0NjYxMjFfaWQsCj4+PiAgK307Cj4+PiAgKwo+Pj4gICttb2R1 bGVfaTJjX2RyaXZlcihpdDY2MTIxX2RyaXZlcik7Cj4+PiAgKwo+Pj4gICtNT0RVTEVfQVVUSE9S KCJQaG9uZyBMRSIpOwo+Pj4gICtNT0RVTEVfREVTQ1JJUFRJT04oIklUNjYxMjEgSERNSSB0cmFu c21pdHRlciBkcml2ZXIiKTsKPj4+ICArTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwo+Pj4gIC0t Cj4+PiAgMi4yNS4xCj4+PiAKPj4gCj4+IAoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fCmRyaS1kZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRldmVsQGxpc3Rz LmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xp c3RpbmZvL2RyaS1kZXZlbAo=