From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.8 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 578E6C43217 for ; Fri, 10 Sep 2021 18:42:48 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 416936120E for ; Fri, 10 Sep 2021 18:42:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233120AbhIJSn6 (ORCPT ); Fri, 10 Sep 2021 14:43:58 -0400 Received: from relay10.mail.gandi.net ([217.70.178.230]:59733 "EHLO relay10.mail.gandi.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232706AbhIJSnv (ORCPT ); Fri, 10 Sep 2021 14:43:51 -0400 Received: (Authenticated sender: paul.kocialkowski@bootlin.com) by relay10.mail.gandi.net (Postfix) with ESMTPSA id 1BC3E240004; Fri, 10 Sep 2021 18:42:37 +0000 (UTC) From: Paul Kocialkowski To: linux-media@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-kernel@vger.kernel.org, linux-phy@lists.infradead.org, linux-clk@vger.kernel.org, linux-staging@lists.linux.dev Cc: Yong Deng , Mauro Carvalho Chehab , Rob Herring , Maxime Ripard , Sakari Ailus , Hans Verkuil , Chen-Yu Tsai , Jernej Skrabec , Paul Kocialkowski , Greg Kroah-Hartman , Helen Koike , Laurent Pinchart , Thomas Petazzoni Subject: [PATCH 15/22] media: sunxi: Remove the sun6i-csi driver implementation Date: Fri, 10 Sep 2021 20:41:40 +0200 Message-Id: <20210910184147.336618-16-paul.kocialkowski@bootlin.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20210910184147.336618-1-paul.kocialkowski@bootlin.com> References: <20210910184147.336618-1-paul.kocialkowski@bootlin.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-clk@vger.kernel.org As described in the commit adding support for the new sun6i-csi driver, a complete rewrite was necessary to support the Allwinner A31 ISP as well as fix a number of issues with the current implementation. Farewell and thanks for all the pixels! Signed-off-by: Paul Kocialkowski --- .../media/platform/sunxi/sun6i-csi/Kconfig | 12 - .../media/platform/sunxi/sun6i-csi/Makefile | 4 - .../platform/sunxi/sun6i-csi/sun6i_csi.c | 936 ------------------ .../platform/sunxi/sun6i-csi/sun6i_csi.h | 138 --- .../platform/sunxi/sun6i-csi/sun6i_csi_reg.h | 196 ---- .../platform/sunxi/sun6i-csi/sun6i_video.c | 683 ------------- .../platform/sunxi/sun6i-csi/sun6i_video.h | 38 - 7 files changed, 2007 deletions(-) delete mode 100644 drivers/media/platform/sunxi/sun6i-csi/Kconfig delete mode 100644 drivers/media/platform/sunxi/sun6i-csi/Makefile delete mode 100644 drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.c delete mode 100644 drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.h delete mode 100644 drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_reg.h delete mode 100644 drivers/media/platform/sunxi/sun6i-csi/sun6i_video.c delete mode 100644 drivers/media/platform/sunxi/sun6i-csi/sun6i_video.h diff --git a/drivers/media/platform/sunxi/sun6i-csi/Kconfig b/drivers/media/platform/sunxi/sun6i-csi/Kconfig deleted file mode 100644 index 586e3fb3a80d..000000000000 --- a/drivers/media/platform/sunxi/sun6i-csi/Kconfig +++ /dev/null @@ -1,12 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0-only -config VIDEO_SUN6I_CSI - tristate "Allwinner V3s Camera Sensor Interface driver" - depends on VIDEO_V4L2 && COMMON_CLK && HAS_DMA - depends on ARCH_SUNXI || COMPILE_TEST - select MEDIA_CONTROLLER - select VIDEO_V4L2_SUBDEV_API - select VIDEOBUF2_DMA_CONTIG - select REGMAP_MMIO - select V4L2_FWNODE - help - Support for the Allwinner Camera Sensor Interface Controller on V3s. diff --git a/drivers/media/platform/sunxi/sun6i-csi/Makefile b/drivers/media/platform/sunxi/sun6i-csi/Makefile deleted file mode 100644 index e7e315347804..000000000000 --- a/drivers/media/platform/sunxi/sun6i-csi/Makefile +++ /dev/null @@ -1,4 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0-only -sun6i-csi-y += sun6i_video.o sun6i_csi.o - -obj-$(CONFIG_VIDEO_SUN6I_CSI) += sun6i-csi.o diff --git a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.c b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.c deleted file mode 100644 index 27935f1e9555..000000000000 --- a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.c +++ /dev/null @@ -1,936 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0+ -/* - * Copyright (c) 2011-2018 Magewell Electronics Co., Ltd. (Nanjing) - * All rights reserved. - * Author: Yong Deng - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "sun6i_csi.h" -#include "sun6i_csi_reg.h" - -#define MODULE_NAME "sun6i-csi" - -struct sun6i_csi_dev { - struct sun6i_csi csi; - struct device *dev; - - struct regmap *regmap; - struct clk *clk_mod; - struct clk *clk_ram; - struct reset_control *rstc_bus; - - int planar_offset[3]; -}; - -static inline struct sun6i_csi_dev *sun6i_csi_to_dev(struct sun6i_csi *csi) -{ - return container_of(csi, struct sun6i_csi_dev, csi); -} - -/* TODO add 10&12 bit YUV, RGB support */ -bool sun6i_csi_is_format_supported(struct sun6i_csi *csi, - u32 pixformat, u32 mbus_code) -{ - struct sun6i_csi_dev *sdev = sun6i_csi_to_dev(csi); - - /* - * Some video receivers have the ability to be compatible with - * 8bit and 16bit bus width. - * Identify the media bus format from device tree. - */ - if ((sdev->csi.v4l2_ep.bus_type == V4L2_MBUS_PARALLEL - || sdev->csi.v4l2_ep.bus_type == V4L2_MBUS_BT656) - && sdev->csi.v4l2_ep.bus.parallel.bus_width == 16) { - switch (pixformat) { - case V4L2_PIX_FMT_HM12: - case V4L2_PIX_FMT_NV12: - case V4L2_PIX_FMT_NV21: - case V4L2_PIX_FMT_NV16: - case V4L2_PIX_FMT_NV61: - case V4L2_PIX_FMT_YUV420: - case V4L2_PIX_FMT_YVU420: - case V4L2_PIX_FMT_YUV422P: - switch (mbus_code) { - case MEDIA_BUS_FMT_UYVY8_1X16: - case MEDIA_BUS_FMT_VYUY8_1X16: - case MEDIA_BUS_FMT_YUYV8_1X16: - case MEDIA_BUS_FMT_YVYU8_1X16: - return true; - default: - dev_dbg(sdev->dev, "Unsupported mbus code: 0x%x\n", - mbus_code); - break; - } - break; - default: - dev_dbg(sdev->dev, "Unsupported pixformat: 0x%x\n", - pixformat); - break; - } - return false; - } - - switch (pixformat) { - case V4L2_PIX_FMT_SBGGR8: - return (mbus_code == MEDIA_BUS_FMT_SBGGR8_1X8); - case V4L2_PIX_FMT_SGBRG8: - return (mbus_code == MEDIA_BUS_FMT_SGBRG8_1X8); - case V4L2_PIX_FMT_SGRBG8: - return (mbus_code == MEDIA_BUS_FMT_SGRBG8_1X8); - case V4L2_PIX_FMT_SRGGB8: - return (mbus_code == MEDIA_BUS_FMT_SRGGB8_1X8); - case V4L2_PIX_FMT_SBGGR10: - return (mbus_code == MEDIA_BUS_FMT_SBGGR10_1X10); - case V4L2_PIX_FMT_SGBRG10: - return (mbus_code == MEDIA_BUS_FMT_SGBRG10_1X10); - case V4L2_PIX_FMT_SGRBG10: - return (mbus_code == MEDIA_BUS_FMT_SGRBG10_1X10); - case V4L2_PIX_FMT_SRGGB10: - return (mbus_code == MEDIA_BUS_FMT_SRGGB10_1X10); - case V4L2_PIX_FMT_SBGGR12: - return (mbus_code == MEDIA_BUS_FMT_SBGGR12_1X12); - case V4L2_PIX_FMT_SGBRG12: - return (mbus_code == MEDIA_BUS_FMT_SGBRG12_1X12); - case V4L2_PIX_FMT_SGRBG12: - return (mbus_code == MEDIA_BUS_FMT_SGRBG12_1X12); - case V4L2_PIX_FMT_SRGGB12: - return (mbus_code == MEDIA_BUS_FMT_SRGGB12_1X12); - - case V4L2_PIX_FMT_YUYV: - return (mbus_code == MEDIA_BUS_FMT_YUYV8_2X8); - case V4L2_PIX_FMT_YVYU: - return (mbus_code == MEDIA_BUS_FMT_YVYU8_2X8); - case V4L2_PIX_FMT_UYVY: - return (mbus_code == MEDIA_BUS_FMT_UYVY8_2X8); - case V4L2_PIX_FMT_VYUY: - return (mbus_code == MEDIA_BUS_FMT_VYUY8_2X8); - - case V4L2_PIX_FMT_HM12: - case V4L2_PIX_FMT_NV12: - case V4L2_PIX_FMT_NV21: - case V4L2_PIX_FMT_NV16: - case V4L2_PIX_FMT_NV61: - case V4L2_PIX_FMT_YUV420: - case V4L2_PIX_FMT_YVU420: - case V4L2_PIX_FMT_YUV422P: - switch (mbus_code) { - case MEDIA_BUS_FMT_UYVY8_2X8: - case MEDIA_BUS_FMT_VYUY8_2X8: - case MEDIA_BUS_FMT_YUYV8_2X8: - case MEDIA_BUS_FMT_YVYU8_2X8: - return true; - default: - dev_dbg(sdev->dev, "Unsupported mbus code: 0x%x\n", - mbus_code); - break; - } - break; - - case V4L2_PIX_FMT_RGB565: - return (mbus_code == MEDIA_BUS_FMT_RGB565_2X8_LE); - case V4L2_PIX_FMT_RGB565X: - return (mbus_code == MEDIA_BUS_FMT_RGB565_2X8_BE); - - case V4L2_PIX_FMT_JPEG: - return (mbus_code == MEDIA_BUS_FMT_JPEG_1X8); - - default: - dev_dbg(sdev->dev, "Unsupported pixformat: 0x%x\n", pixformat); - break; - } - - return false; -} - -int sun6i_csi_set_power(struct sun6i_csi *csi, bool enable) -{ - struct sun6i_csi_dev *sdev = sun6i_csi_to_dev(csi); - struct device *dev = sdev->dev; - struct regmap *regmap = sdev->regmap; - int ret; - - if (!enable) { - regmap_update_bits(regmap, CSI_EN_REG, CSI_EN_CSI_EN, 0); - - clk_disable_unprepare(sdev->clk_ram); - if (of_device_is_compatible(dev->of_node, - "allwinner,sun50i-a64-csi")) - clk_rate_exclusive_put(sdev->clk_mod); - clk_disable_unprepare(sdev->clk_mod); - reset_control_assert(sdev->rstc_bus); - return 0; - } - - ret = clk_prepare_enable(sdev->clk_mod); - if (ret) { - dev_err(sdev->dev, "Enable csi clk err %d\n", ret); - return ret; - } - - if (of_device_is_compatible(dev->of_node, "allwinner,sun50i-a64-csi")) - clk_set_rate_exclusive(sdev->clk_mod, 300000000); - - ret = clk_prepare_enable(sdev->clk_ram); - if (ret) { - dev_err(sdev->dev, "Enable clk_dram_csi clk err %d\n", ret); - goto clk_mod_disable; - } - - ret = reset_control_deassert(sdev->rstc_bus); - if (ret) { - dev_err(sdev->dev, "reset err %d\n", ret); - goto clk_ram_disable; - } - - regmap_update_bits(regmap, CSI_EN_REG, CSI_EN_CSI_EN, CSI_EN_CSI_EN); - - return 0; - -clk_ram_disable: - clk_disable_unprepare(sdev->clk_ram); -clk_mod_disable: - if (of_device_is_compatible(dev->of_node, "allwinner,sun50i-a64-csi")) - clk_rate_exclusive_put(sdev->clk_mod); - clk_disable_unprepare(sdev->clk_mod); - return ret; -} - -static enum csi_input_fmt get_csi_input_format(struct sun6i_csi_dev *sdev, - u32 mbus_code, u32 pixformat) -{ - /* non-YUV */ - if ((mbus_code & 0xF000) != 0x2000) - return CSI_INPUT_FORMAT_RAW; - - switch (pixformat) { - case V4L2_PIX_FMT_YUYV: - case V4L2_PIX_FMT_YVYU: - case V4L2_PIX_FMT_UYVY: - case V4L2_PIX_FMT_VYUY: - return CSI_INPUT_FORMAT_RAW; - default: - break; - } - - /* not support YUV420 input format yet */ - dev_dbg(sdev->dev, "Select YUV422 as default input format of CSI.\n"); - return CSI_INPUT_FORMAT_YUV422; -} - -static enum csi_output_fmt get_csi_output_format(struct sun6i_csi_dev *sdev, - u32 pixformat, u32 field) -{ - bool buf_interlaced = false; - - if (field == V4L2_FIELD_INTERLACED - || field == V4L2_FIELD_INTERLACED_TB - || field == V4L2_FIELD_INTERLACED_BT) - buf_interlaced = true; - - switch (pixformat) { - case V4L2_PIX_FMT_SBGGR8: - case V4L2_PIX_FMT_SGBRG8: - case V4L2_PIX_FMT_SGRBG8: - case V4L2_PIX_FMT_SRGGB8: - return buf_interlaced ? CSI_FRAME_RAW_8 : CSI_FIELD_RAW_8; - case V4L2_PIX_FMT_SBGGR10: - case V4L2_PIX_FMT_SGBRG10: - case V4L2_PIX_FMT_SGRBG10: - case V4L2_PIX_FMT_SRGGB10: - return buf_interlaced ? CSI_FRAME_RAW_10 : CSI_FIELD_RAW_10; - case V4L2_PIX_FMT_SBGGR12: - case V4L2_PIX_FMT_SGBRG12: - case V4L2_PIX_FMT_SGRBG12: - case V4L2_PIX_FMT_SRGGB12: - return buf_interlaced ? CSI_FRAME_RAW_12 : CSI_FIELD_RAW_12; - - case V4L2_PIX_FMT_YUYV: - case V4L2_PIX_FMT_YVYU: - case V4L2_PIX_FMT_UYVY: - case V4L2_PIX_FMT_VYUY: - return buf_interlaced ? CSI_FRAME_RAW_8 : CSI_FIELD_RAW_8; - - case V4L2_PIX_FMT_HM12: - return buf_interlaced ? CSI_FRAME_MB_YUV420 : - CSI_FIELD_MB_YUV420; - case V4L2_PIX_FMT_NV12: - case V4L2_PIX_FMT_NV21: - return buf_interlaced ? CSI_FRAME_UV_CB_YUV420 : - CSI_FIELD_UV_CB_YUV420; - case V4L2_PIX_FMT_YUV420: - case V4L2_PIX_FMT_YVU420: - return buf_interlaced ? CSI_FRAME_PLANAR_YUV420 : - CSI_FIELD_PLANAR_YUV420; - case V4L2_PIX_FMT_NV16: - case V4L2_PIX_FMT_NV61: - return buf_interlaced ? CSI_FRAME_UV_CB_YUV422 : - CSI_FIELD_UV_CB_YUV422; - case V4L2_PIX_FMT_YUV422P: - return buf_interlaced ? CSI_FRAME_PLANAR_YUV422 : - CSI_FIELD_PLANAR_YUV422; - - case V4L2_PIX_FMT_RGB565: - case V4L2_PIX_FMT_RGB565X: - return buf_interlaced ? CSI_FRAME_RGB565 : CSI_FIELD_RGB565; - - case V4L2_PIX_FMT_JPEG: - return buf_interlaced ? CSI_FRAME_RAW_8 : CSI_FIELD_RAW_8; - - default: - dev_warn(sdev->dev, "Unsupported pixformat: 0x%x\n", pixformat); - break; - } - - return CSI_FIELD_RAW_8; -} - -static enum csi_input_seq get_csi_input_seq(struct sun6i_csi_dev *sdev, - u32 mbus_code, u32 pixformat) -{ - /* Input sequence does not apply to non-YUV formats */ - if ((mbus_code & 0xF000) != 0x2000) - return 0; - - switch (pixformat) { - case V4L2_PIX_FMT_HM12: - case V4L2_PIX_FMT_NV12: - case V4L2_PIX_FMT_NV16: - case V4L2_PIX_FMT_YUV420: - case V4L2_PIX_FMT_YUV422P: - switch (mbus_code) { - case MEDIA_BUS_FMT_UYVY8_2X8: - case MEDIA_BUS_FMT_UYVY8_1X16: - return CSI_INPUT_SEQ_UYVY; - case MEDIA_BUS_FMT_VYUY8_2X8: - case MEDIA_BUS_FMT_VYUY8_1X16: - return CSI_INPUT_SEQ_VYUY; - case MEDIA_BUS_FMT_YUYV8_2X8: - case MEDIA_BUS_FMT_YUYV8_1X16: - return CSI_INPUT_SEQ_YUYV; - case MEDIA_BUS_FMT_YVYU8_1X16: - case MEDIA_BUS_FMT_YVYU8_2X8: - return CSI_INPUT_SEQ_YVYU; - default: - dev_warn(sdev->dev, "Unsupported mbus code: 0x%x\n", - mbus_code); - break; - } - break; - case V4L2_PIX_FMT_NV21: - case V4L2_PIX_FMT_NV61: - case V4L2_PIX_FMT_YVU420: - switch (mbus_code) { - case MEDIA_BUS_FMT_UYVY8_2X8: - case MEDIA_BUS_FMT_UYVY8_1X16: - return CSI_INPUT_SEQ_VYUY; - case MEDIA_BUS_FMT_VYUY8_2X8: - case MEDIA_BUS_FMT_VYUY8_1X16: - return CSI_INPUT_SEQ_UYVY; - case MEDIA_BUS_FMT_YUYV8_2X8: - case MEDIA_BUS_FMT_YUYV8_1X16: - return CSI_INPUT_SEQ_YVYU; - case MEDIA_BUS_FMT_YVYU8_1X16: - case MEDIA_BUS_FMT_YVYU8_2X8: - return CSI_INPUT_SEQ_YUYV; - default: - dev_warn(sdev->dev, "Unsupported mbus code: 0x%x\n", - mbus_code); - break; - } - break; - - case V4L2_PIX_FMT_YUYV: - return CSI_INPUT_SEQ_YUYV; - - default: - dev_warn(sdev->dev, "Unsupported pixformat: 0x%x, defaulting to YUYV\n", - pixformat); - break; - } - - return CSI_INPUT_SEQ_YUYV; -} - -static void sun6i_csi_setup_bus(struct sun6i_csi_dev *sdev) -{ - struct v4l2_fwnode_endpoint *endpoint = &sdev->csi.v4l2_ep; - struct sun6i_csi *csi = &sdev->csi; - unsigned char bus_width; - u32 flags; - u32 cfg; - bool input_interlaced = false; - - if (csi->config.field == V4L2_FIELD_INTERLACED - || csi->config.field == V4L2_FIELD_INTERLACED_TB - || csi->config.field == V4L2_FIELD_INTERLACED_BT) - input_interlaced = true; - - bus_width = endpoint->bus.parallel.bus_width; - - regmap_read(sdev->regmap, CSI_IF_CFG_REG, &cfg); - - cfg &= ~(CSI_IF_CFG_CSI_IF_MASK | CSI_IF_CFG_MIPI_IF_MASK | - CSI_IF_CFG_IF_DATA_WIDTH_MASK | - CSI_IF_CFG_CLK_POL_MASK | CSI_IF_CFG_VREF_POL_MASK | - CSI_IF_CFG_HREF_POL_MASK | CSI_IF_CFG_FIELD_MASK | - CSI_IF_CFG_SRC_TYPE_MASK); - - if (input_interlaced) - cfg |= CSI_IF_CFG_SRC_TYPE_INTERLACED; - else - cfg |= CSI_IF_CFG_SRC_TYPE_PROGRESSED; - - switch (endpoint->bus_type) { - case V4L2_MBUS_PARALLEL: - cfg |= CSI_IF_CFG_MIPI_IF_CSI; - - flags = endpoint->bus.parallel.flags; - - cfg |= (bus_width == 16) ? CSI_IF_CFG_CSI_IF_YUV422_16BIT : - CSI_IF_CFG_CSI_IF_YUV422_INTLV; - - if (flags & V4L2_MBUS_FIELD_EVEN_LOW) - cfg |= CSI_IF_CFG_FIELD_POSITIVE; - - if (flags & V4L2_MBUS_VSYNC_ACTIVE_LOW) - cfg |= CSI_IF_CFG_VREF_POL_POSITIVE; - if (flags & V4L2_MBUS_HSYNC_ACTIVE_LOW) - cfg |= CSI_IF_CFG_HREF_POL_POSITIVE; - - if (flags & V4L2_MBUS_PCLK_SAMPLE_RISING) - cfg |= CSI_IF_CFG_CLK_POL_FALLING_EDGE; - break; - case V4L2_MBUS_BT656: - cfg |= CSI_IF_CFG_MIPI_IF_CSI; - - flags = endpoint->bus.parallel.flags; - - cfg |= (bus_width == 16) ? CSI_IF_CFG_CSI_IF_BT1120 : - CSI_IF_CFG_CSI_IF_BT656; - - if (flags & V4L2_MBUS_FIELD_EVEN_LOW) - cfg |= CSI_IF_CFG_FIELD_POSITIVE; - - if (flags & V4L2_MBUS_PCLK_SAMPLE_FALLING) - cfg |= CSI_IF_CFG_CLK_POL_FALLING_EDGE; - break; - default: - dev_warn(sdev->dev, "Unsupported bus type: %d\n", - endpoint->bus_type); - break; - } - - switch (bus_width) { - case 8: - cfg |= CSI_IF_CFG_IF_DATA_WIDTH_8BIT; - break; - case 10: - cfg |= CSI_IF_CFG_IF_DATA_WIDTH_10BIT; - break; - case 12: - cfg |= CSI_IF_CFG_IF_DATA_WIDTH_12BIT; - break; - case 16: /* No need to configure DATA_WIDTH for 16bit */ - break; - default: - dev_warn(sdev->dev, "Unsupported bus width: %u\n", bus_width); - break; - } - - regmap_write(sdev->regmap, CSI_IF_CFG_REG, cfg); -} - -static void sun6i_csi_set_format(struct sun6i_csi_dev *sdev) -{ - struct sun6i_csi *csi = &sdev->csi; - u32 cfg; - u32 val; - - regmap_read(sdev->regmap, CSI_CH_CFG_REG, &cfg); - - cfg &= ~(CSI_CH_CFG_INPUT_FMT_MASK | - CSI_CH_CFG_OUTPUT_FMT_MASK | CSI_CH_CFG_VFLIP_EN | - CSI_CH_CFG_HFLIP_EN | CSI_CH_CFG_FIELD_SEL_MASK | - CSI_CH_CFG_INPUT_SEQ_MASK); - - val = get_csi_input_format(sdev, csi->config.code, - csi->config.pixelformat); - cfg |= CSI_CH_CFG_INPUT_FMT(val); - - val = get_csi_output_format(sdev, csi->config.pixelformat, - csi->config.field); - cfg |= CSI_CH_CFG_OUTPUT_FMT(val); - - val = get_csi_input_seq(sdev, csi->config.code, - csi->config.pixelformat); - cfg |= CSI_CH_CFG_INPUT_SEQ(val); - - if (csi->config.field == V4L2_FIELD_TOP) - cfg |= CSI_CH_CFG_FIELD_SEL_FIELD0; - else if (csi->config.field == V4L2_FIELD_BOTTOM) - cfg |= CSI_CH_CFG_FIELD_SEL_FIELD1; - else - cfg |= CSI_CH_CFG_FIELD_SEL_BOTH; - - regmap_write(sdev->regmap, CSI_CH_CFG_REG, cfg); -} - -static void sun6i_csi_set_window(struct sun6i_csi_dev *sdev) -{ - struct sun6i_csi_config *config = &sdev->csi.config; - u32 bytesperline_y; - u32 bytesperline_c; - int *planar_offset = sdev->planar_offset; - u32 width = config->width; - u32 height = config->height; - u32 hor_len = width; - - switch (config->pixelformat) { - case V4L2_PIX_FMT_YUYV: - case V4L2_PIX_FMT_YVYU: - case V4L2_PIX_FMT_UYVY: - case V4L2_PIX_FMT_VYUY: - dev_dbg(sdev->dev, - "Horizontal length should be 2 times of width for packed YUV formats!\n"); - hor_len = width * 2; - break; - default: - break; - } - - regmap_write(sdev->regmap, CSI_CH_HSIZE_REG, - CSI_CH_HSIZE_HOR_LEN(hor_len) | - CSI_CH_HSIZE_HOR_START(0)); - regmap_write(sdev->regmap, CSI_CH_VSIZE_REG, - CSI_CH_VSIZE_VER_LEN(height) | - CSI_CH_VSIZE_VER_START(0)); - - planar_offset[0] = 0; - switch (config->pixelformat) { - case V4L2_PIX_FMT_HM12: - case V4L2_PIX_FMT_NV12: - case V4L2_PIX_FMT_NV21: - case V4L2_PIX_FMT_NV16: - case V4L2_PIX_FMT_NV61: - bytesperline_y = width; - bytesperline_c = width; - planar_offset[1] = bytesperline_y * height; - planar_offset[2] = -1; - break; - case V4L2_PIX_FMT_YUV420: - case V4L2_PIX_FMT_YVU420: - bytesperline_y = width; - bytesperline_c = width / 2; - planar_offset[1] = bytesperline_y * height; - planar_offset[2] = planar_offset[1] + - bytesperline_c * height / 2; - break; - case V4L2_PIX_FMT_YUV422P: - bytesperline_y = width; - bytesperline_c = width / 2; - planar_offset[1] = bytesperline_y * height; - planar_offset[2] = planar_offset[1] + - bytesperline_c * height; - break; - default: /* raw */ - dev_dbg(sdev->dev, - "Calculating pixelformat(0x%x)'s bytesperline as a packed format\n", - config->pixelformat); - bytesperline_y = (sun6i_csi_get_bpp(config->pixelformat) * - config->width) / 8; - bytesperline_c = 0; - planar_offset[1] = -1; - planar_offset[2] = -1; - break; - } - - regmap_write(sdev->regmap, CSI_CH_BUF_LEN_REG, - CSI_CH_BUF_LEN_BUF_LEN_C(bytesperline_c) | - CSI_CH_BUF_LEN_BUF_LEN_Y(bytesperline_y)); -} - -int sun6i_csi_update_config(struct sun6i_csi *csi, - struct sun6i_csi_config *config) -{ - struct sun6i_csi_dev *sdev = sun6i_csi_to_dev(csi); - - if (!config) - return -EINVAL; - - memcpy(&csi->config, config, sizeof(csi->config)); - - sun6i_csi_setup_bus(sdev); - sun6i_csi_set_format(sdev); - sun6i_csi_set_window(sdev); - - return 0; -} - -void sun6i_csi_update_buf_addr(struct sun6i_csi *csi, dma_addr_t addr) -{ - struct sun6i_csi_dev *sdev = sun6i_csi_to_dev(csi); - - regmap_write(sdev->regmap, CSI_CH_F0_BUFA_REG, - (addr + sdev->planar_offset[0]) >> 2); - if (sdev->planar_offset[1] != -1) - regmap_write(sdev->regmap, CSI_CH_F1_BUFA_REG, - (addr + sdev->planar_offset[1]) >> 2); - if (sdev->planar_offset[2] != -1) - regmap_write(sdev->regmap, CSI_CH_F2_BUFA_REG, - (addr + sdev->planar_offset[2]) >> 2); -} - -void sun6i_csi_set_stream(struct sun6i_csi *csi, bool enable) -{ - struct sun6i_csi_dev *sdev = sun6i_csi_to_dev(csi); - struct regmap *regmap = sdev->regmap; - - if (!enable) { - regmap_update_bits(regmap, CSI_CAP_REG, CSI_CAP_CH0_VCAP_ON, 0); - regmap_write(regmap, CSI_CH_INT_EN_REG, 0); - return; - } - - regmap_write(regmap, CSI_CH_INT_STA_REG, 0xFF); - regmap_write(regmap, CSI_CH_INT_EN_REG, - CSI_CH_INT_EN_HB_OF_INT_EN | - CSI_CH_INT_EN_FIFO2_OF_INT_EN | - CSI_CH_INT_EN_FIFO1_OF_INT_EN | - CSI_CH_INT_EN_FIFO0_OF_INT_EN | - CSI_CH_INT_EN_FD_INT_EN | - CSI_CH_INT_EN_CD_INT_EN); - - regmap_update_bits(regmap, CSI_CAP_REG, CSI_CAP_CH0_VCAP_ON, - CSI_CAP_CH0_VCAP_ON); -} - -/* ----------------------------------------------------------------------------- - * Media Controller and V4L2 - */ -static int sun6i_csi_link_entity(struct sun6i_csi *csi, - struct media_entity *entity, - struct fwnode_handle *fwnode) -{ - struct media_entity *sink; - struct media_pad *sink_pad; - int src_pad_index; - int ret; - - ret = media_entity_get_fwnode_pad(entity, fwnode, MEDIA_PAD_FL_SOURCE); - if (ret < 0) { - dev_err(csi->dev, "%s: no source pad in external entity %s\n", - __func__, entity->name); - return -EINVAL; - } - - src_pad_index = ret; - - sink = &csi->video.vdev.entity; - sink_pad = &csi->video.pad; - - dev_dbg(csi->dev, "creating %s:%u -> %s:%u link\n", - entity->name, src_pad_index, sink->name, sink_pad->index); - ret = media_create_pad_link(entity, src_pad_index, sink, - sink_pad->index, - MEDIA_LNK_FL_ENABLED | - MEDIA_LNK_FL_IMMUTABLE); - if (ret < 0) { - dev_err(csi->dev, "failed to create %s:%u -> %s:%u link\n", - entity->name, src_pad_index, - sink->name, sink_pad->index); - return ret; - } - - return 0; -} - -static int sun6i_subdev_notify_complete(struct v4l2_async_notifier *notifier) -{ - struct sun6i_csi *csi = container_of(notifier, struct sun6i_csi, - notifier); - struct v4l2_device *v4l2_dev = &csi->v4l2_dev; - struct v4l2_subdev *sd; - int ret; - - dev_dbg(csi->dev, "notify complete, all subdevs registered\n"); - - sd = list_first_entry(&v4l2_dev->subdevs, struct v4l2_subdev, list); - if (!sd) - return -EINVAL; - - ret = sun6i_csi_link_entity(csi, &sd->entity, sd->fwnode); - if (ret < 0) - return ret; - - ret = v4l2_device_register_subdev_nodes(&csi->v4l2_dev); - if (ret < 0) - return ret; - - return media_device_register(&csi->media_dev); -} - -static const struct v4l2_async_notifier_operations sun6i_csi_async_ops = { - .complete = sun6i_subdev_notify_complete, -}; - -static int sun6i_csi_fwnode_parse(struct device *dev, - struct v4l2_fwnode_endpoint *vep, - struct v4l2_async_subdev *asd) -{ - struct sun6i_csi *csi = dev_get_drvdata(dev); - - if (vep->base.port || vep->base.id) { - dev_warn(dev, "Only support a single port with one endpoint\n"); - return -ENOTCONN; - } - - switch (vep->bus_type) { - case V4L2_MBUS_PARALLEL: - case V4L2_MBUS_BT656: - csi->v4l2_ep = *vep; - return 0; - default: - dev_err(dev, "Unsupported media bus type\n"); - return -ENOTCONN; - } -} - -static void sun6i_csi_v4l2_cleanup(struct sun6i_csi *csi) -{ - media_device_unregister(&csi->media_dev); - v4l2_async_notifier_unregister(&csi->notifier); - v4l2_async_notifier_cleanup(&csi->notifier); - sun6i_video_cleanup(&csi->video); - v4l2_device_unregister(&csi->v4l2_dev); - v4l2_ctrl_handler_free(&csi->ctrl_handler); - media_device_cleanup(&csi->media_dev); -} - -static int sun6i_csi_v4l2_init(struct sun6i_csi *csi) -{ - int ret; - - csi->media_dev.dev = csi->dev; - strscpy(csi->media_dev.model, "Allwinner Video Capture Device", - sizeof(csi->media_dev.model)); - csi->media_dev.hw_revision = 0; - snprintf(csi->media_dev.bus_info, sizeof(csi->media_dev.bus_info), - "platform:%s", dev_name(csi->dev)); - - media_device_init(&csi->media_dev); - v4l2_async_notifier_init(&csi->notifier); - - ret = v4l2_ctrl_handler_init(&csi->ctrl_handler, 0); - if (ret) { - dev_err(csi->dev, "V4L2 controls handler init failed (%d)\n", - ret); - goto clean_media; - } - - csi->v4l2_dev.mdev = &csi->media_dev; - csi->v4l2_dev.ctrl_handler = &csi->ctrl_handler; - ret = v4l2_device_register(csi->dev, &csi->v4l2_dev); - if (ret) { - dev_err(csi->dev, "V4L2 device registration failed (%d)\n", - ret); - goto free_ctrl; - } - - ret = sun6i_video_init(&csi->video, csi, "sun6i-csi"); - if (ret) - goto unreg_v4l2; - - ret = v4l2_async_notifier_parse_fwnode_endpoints(csi->dev, - &csi->notifier, - sizeof(struct v4l2_async_subdev), - sun6i_csi_fwnode_parse); - if (ret) - goto clean_video; - - csi->notifier.ops = &sun6i_csi_async_ops; - - ret = v4l2_async_notifier_register(&csi->v4l2_dev, &csi->notifier); - if (ret) { - dev_err(csi->dev, "notifier registration failed\n"); - goto clean_video; - } - - return 0; - -clean_video: - sun6i_video_cleanup(&csi->video); -unreg_v4l2: - v4l2_device_unregister(&csi->v4l2_dev); -free_ctrl: - v4l2_ctrl_handler_free(&csi->ctrl_handler); -clean_media: - v4l2_async_notifier_cleanup(&csi->notifier); - media_device_cleanup(&csi->media_dev); - - return ret; -} - -/* ----------------------------------------------------------------------------- - * Resources and IRQ - */ -static irqreturn_t sun6i_csi_isr(int irq, void *dev_id) -{ - struct sun6i_csi_dev *sdev = (struct sun6i_csi_dev *)dev_id; - struct regmap *regmap = sdev->regmap; - u32 status; - - regmap_read(regmap, CSI_CH_INT_STA_REG, &status); - - if (!(status & 0xFF)) - return IRQ_NONE; - - if ((status & CSI_CH_INT_STA_FIFO0_OF_PD) || - (status & CSI_CH_INT_STA_FIFO1_OF_PD) || - (status & CSI_CH_INT_STA_FIFO2_OF_PD) || - (status & CSI_CH_INT_STA_HB_OF_PD)) { - regmap_write(regmap, CSI_CH_INT_STA_REG, status); - regmap_update_bits(regmap, CSI_EN_REG, CSI_EN_CSI_EN, 0); - regmap_update_bits(regmap, CSI_EN_REG, CSI_EN_CSI_EN, - CSI_EN_CSI_EN); - return IRQ_HANDLED; - } - - if (status & CSI_CH_INT_STA_FD_PD) - sun6i_video_frame_done(&sdev->csi.video); - - regmap_write(regmap, CSI_CH_INT_STA_REG, status); - - return IRQ_HANDLED; -} - -static const struct regmap_config sun6i_csi_regmap_config = { - .reg_bits = 32, - .reg_stride = 4, - .val_bits = 32, - .max_register = 0x9c, -}; - -static int sun6i_csi_resource_request(struct sun6i_csi_dev *sdev, - struct platform_device *pdev) -{ - struct resource *res; - void __iomem *io_base; - int ret; - int irq; - - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - io_base = devm_ioremap_resource(&pdev->dev, res); - if (IS_ERR(io_base)) - return PTR_ERR(io_base); - - sdev->regmap = devm_regmap_init_mmio_clk(&pdev->dev, "bus", io_base, - &sun6i_csi_regmap_config); - if (IS_ERR(sdev->regmap)) { - dev_err(&pdev->dev, "Failed to init register map\n"); - return PTR_ERR(sdev->regmap); - } - - sdev->clk_mod = devm_clk_get(&pdev->dev, "mod"); - if (IS_ERR(sdev->clk_mod)) { - dev_err(&pdev->dev, "Unable to acquire csi clock\n"); - return PTR_ERR(sdev->clk_mod); - } - - sdev->clk_ram = devm_clk_get(&pdev->dev, "ram"); - if (IS_ERR(sdev->clk_ram)) { - dev_err(&pdev->dev, "Unable to acquire dram-csi clock\n"); - return PTR_ERR(sdev->clk_ram); - } - - sdev->rstc_bus = devm_reset_control_get_shared(&pdev->dev, NULL); - if (IS_ERR(sdev->rstc_bus)) { - dev_err(&pdev->dev, "Cannot get reset controller\n"); - return PTR_ERR(sdev->rstc_bus); - } - - irq = platform_get_irq(pdev, 0); - if (irq < 0) - return -ENXIO; - - ret = devm_request_irq(&pdev->dev, irq, sun6i_csi_isr, 0, MODULE_NAME, - sdev); - if (ret) { - dev_err(&pdev->dev, "Cannot request csi IRQ\n"); - return ret; - } - - return 0; -} - -static int sun6i_csi_probe(struct platform_device *pdev) -{ - struct sun6i_csi_dev *sdev; - int ret; - - sdev = devm_kzalloc(&pdev->dev, sizeof(*sdev), GFP_KERNEL); - if (!sdev) - return -ENOMEM; - - sdev->dev = &pdev->dev; - - ret = sun6i_csi_resource_request(sdev, pdev); - if (ret) - return ret; - - platform_set_drvdata(pdev, sdev); - - sdev->csi.dev = &pdev->dev; - return sun6i_csi_v4l2_init(&sdev->csi); -} - -static int sun6i_csi_remove(struct platform_device *pdev) -{ - struct sun6i_csi_dev *sdev = platform_get_drvdata(pdev); - - sun6i_csi_v4l2_cleanup(&sdev->csi); - - return 0; -} - -static const struct of_device_id sun6i_csi_of_match[] = { - { .compatible = "allwinner,sun6i-a31-csi", }, - { .compatible = "allwinner,sun8i-a83t-csi", }, - { .compatible = "allwinner,sun8i-h3-csi", }, - { .compatible = "allwinner,sun8i-v3s-csi", }, - { .compatible = "allwinner,sun50i-a64-csi", }, - {}, -}; -MODULE_DEVICE_TABLE(of, sun6i_csi_of_match); - -static struct platform_driver sun6i_csi_platform_driver = { - .probe = sun6i_csi_probe, - .remove = sun6i_csi_remove, - .driver = { - .name = MODULE_NAME, - .of_match_table = of_match_ptr(sun6i_csi_of_match), - }, -}; -module_platform_driver(sun6i_csi_platform_driver); - -MODULE_DESCRIPTION("Allwinner V3s Camera Sensor Interface driver"); -MODULE_AUTHOR("Yong Deng "); -MODULE_LICENSE("GPL"); diff --git a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.h b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.h deleted file mode 100644 index c626821aaedb..000000000000 --- a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.h +++ /dev/null @@ -1,138 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0+ */ -/* - * Copyright (c) 2011-2018 Magewell Electronics Co., Ltd. (Nanjing) - * All rights reserved. - * Author: Yong Deng - */ - -#ifndef __SUN6I_CSI_H__ -#define __SUN6I_CSI_H__ - -#include -#include -#include - -#include "sun6i_video.h" - -struct sun6i_csi; - -/** - * struct sun6i_csi_config - configs for sun6i csi - * @pixelformat: v4l2 pixel format (V4L2_PIX_FMT_*) - * @code: media bus format code (MEDIA_BUS_FMT_*) - * @field: used interlacing type (enum v4l2_field) - * @width: frame width - * @height: frame height - */ -struct sun6i_csi_config { - u32 pixelformat; - u32 code; - u32 field; - u32 width; - u32 height; -}; - -struct sun6i_csi { - struct device *dev; - struct v4l2_ctrl_handler ctrl_handler; - struct v4l2_device v4l2_dev; - struct media_device media_dev; - - struct v4l2_async_notifier notifier; - - /* video port settings */ - struct v4l2_fwnode_endpoint v4l2_ep; - - struct sun6i_csi_config config; - - struct sun6i_video video; -}; - -/** - * sun6i_csi_is_format_supported() - check if the format supported by csi - * @csi: pointer to the csi - * @pixformat: v4l2 pixel format (V4L2_PIX_FMT_*) - * @mbus_code: media bus format code (MEDIA_BUS_FMT_*) - */ -bool sun6i_csi_is_format_supported(struct sun6i_csi *csi, u32 pixformat, - u32 mbus_code); - -/** - * sun6i_csi_set_power() - power on/off the csi - * @csi: pointer to the csi - * @enable: on/off - */ -int sun6i_csi_set_power(struct sun6i_csi *csi, bool enable); - -/** - * sun6i_csi_update_config() - update the csi register settings - * @csi: pointer to the csi - * @config: see struct sun6i_csi_config - */ -int sun6i_csi_update_config(struct sun6i_csi *csi, - struct sun6i_csi_config *config); - -/** - * sun6i_csi_update_buf_addr() - update the csi frame buffer address - * @csi: pointer to the csi - * @addr: frame buffer's physical address - */ -void sun6i_csi_update_buf_addr(struct sun6i_csi *csi, dma_addr_t addr); - -/** - * sun6i_csi_set_stream() - start/stop csi streaming - * @csi: pointer to the csi - * @enable: start/stop - */ -void sun6i_csi_set_stream(struct sun6i_csi *csi, bool enable); - -/* get bpp form v4l2 pixformat */ -static inline int sun6i_csi_get_bpp(unsigned int pixformat) -{ - switch (pixformat) { - case V4L2_PIX_FMT_SBGGR8: - case V4L2_PIX_FMT_SGBRG8: - case V4L2_PIX_FMT_SGRBG8: - case V4L2_PIX_FMT_SRGGB8: - case V4L2_PIX_FMT_JPEG: - return 8; - case V4L2_PIX_FMT_SBGGR10: - case V4L2_PIX_FMT_SGBRG10: - case V4L2_PIX_FMT_SGRBG10: - case V4L2_PIX_FMT_SRGGB10: - return 10; - case V4L2_PIX_FMT_SBGGR12: - case V4L2_PIX_FMT_SGBRG12: - case V4L2_PIX_FMT_SGRBG12: - case V4L2_PIX_FMT_SRGGB12: - case V4L2_PIX_FMT_HM12: - case V4L2_PIX_FMT_NV12: - case V4L2_PIX_FMT_NV21: - case V4L2_PIX_FMT_YUV420: - case V4L2_PIX_FMT_YVU420: - return 12; - case V4L2_PIX_FMT_YUYV: - case V4L2_PIX_FMT_YVYU: - case V4L2_PIX_FMT_UYVY: - case V4L2_PIX_FMT_VYUY: - case V4L2_PIX_FMT_NV16: - case V4L2_PIX_FMT_NV61: - case V4L2_PIX_FMT_YUV422P: - case V4L2_PIX_FMT_RGB565: - case V4L2_PIX_FMT_RGB565X: - return 16; - case V4L2_PIX_FMT_RGB24: - case V4L2_PIX_FMT_BGR24: - return 24; - case V4L2_PIX_FMT_RGB32: - case V4L2_PIX_FMT_BGR32: - return 32; - default: - WARN(1, "Unsupported pixformat: 0x%x\n", pixformat); - break; - } - - return 0; -} - -#endif /* __SUN6I_CSI_H__ */ diff --git a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_reg.h b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_reg.h deleted file mode 100644 index 703fa14bb313..000000000000 --- a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_reg.h +++ /dev/null @@ -1,196 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0+ */ -/* - * Copyright (c) 2011-2018 Magewell Electronics Co., Ltd. (Nanjing) - * All rights reserved. - * Author: Yong Deng - */ - -#ifndef __SUN6I_CSI_REG_H__ -#define __SUN6I_CSI_REG_H__ - -#include - -#define CSI_EN_REG 0x0 -#define CSI_EN_VER_EN BIT(30) -#define CSI_EN_CSI_EN BIT(0) - -#define CSI_IF_CFG_REG 0x4 -#define CSI_IF_CFG_SRC_TYPE_MASK BIT(21) -#define CSI_IF_CFG_SRC_TYPE_PROGRESSED ((0 << 21) & CSI_IF_CFG_SRC_TYPE_MASK) -#define CSI_IF_CFG_SRC_TYPE_INTERLACED ((1 << 21) & CSI_IF_CFG_SRC_TYPE_MASK) -#define CSI_IF_CFG_FPS_DS_EN BIT(20) -#define CSI_IF_CFG_FIELD_MASK BIT(19) -#define CSI_IF_CFG_FIELD_NEGATIVE ((0 << 19) & CSI_IF_CFG_FIELD_MASK) -#define CSI_IF_CFG_FIELD_POSITIVE ((1 << 19) & CSI_IF_CFG_FIELD_MASK) -#define CSI_IF_CFG_VREF_POL_MASK BIT(18) -#define CSI_IF_CFG_VREF_POL_NEGATIVE ((0 << 18) & CSI_IF_CFG_VREF_POL_MASK) -#define CSI_IF_CFG_VREF_POL_POSITIVE ((1 << 18) & CSI_IF_CFG_VREF_POL_MASK) -#define CSI_IF_CFG_HREF_POL_MASK BIT(17) -#define CSI_IF_CFG_HREF_POL_NEGATIVE ((0 << 17) & CSI_IF_CFG_HREF_POL_MASK) -#define CSI_IF_CFG_HREF_POL_POSITIVE ((1 << 17) & CSI_IF_CFG_HREF_POL_MASK) -#define CSI_IF_CFG_CLK_POL_MASK BIT(16) -#define CSI_IF_CFG_CLK_POL_RISING_EDGE ((0 << 16) & CSI_IF_CFG_CLK_POL_MASK) -#define CSI_IF_CFG_CLK_POL_FALLING_EDGE ((1 << 16) & CSI_IF_CFG_CLK_POL_MASK) -#define CSI_IF_CFG_IF_DATA_WIDTH_MASK GENMASK(10, 8) -#define CSI_IF_CFG_IF_DATA_WIDTH_8BIT ((0 << 8) & CSI_IF_CFG_IF_DATA_WIDTH_MASK) -#define CSI_IF_CFG_IF_DATA_WIDTH_10BIT ((1 << 8) & CSI_IF_CFG_IF_DATA_WIDTH_MASK) -#define CSI_IF_CFG_IF_DATA_WIDTH_12BIT ((2 << 8) & CSI_IF_CFG_IF_DATA_WIDTH_MASK) -#define CSI_IF_CFG_MIPI_IF_MASK BIT(7) -#define CSI_IF_CFG_MIPI_IF_CSI (0 << 7) -#define CSI_IF_CFG_MIPI_IF_MIPI BIT(7) -#define CSI_IF_CFG_CSI_IF_MASK GENMASK(4, 0) -#define CSI_IF_CFG_CSI_IF_YUV422_INTLV ((0 << 0) & CSI_IF_CFG_CSI_IF_MASK) -#define CSI_IF_CFG_CSI_IF_YUV422_16BIT ((1 << 0) & CSI_IF_CFG_CSI_IF_MASK) -#define CSI_IF_CFG_CSI_IF_BT656 ((4 << 0) & CSI_IF_CFG_CSI_IF_MASK) -#define CSI_IF_CFG_CSI_IF_BT1120 ((5 << 0) & CSI_IF_CFG_CSI_IF_MASK) - -#define CSI_CAP_REG 0x8 -#define CSI_CAP_CH0_CAP_MASK_MASK GENMASK(5, 2) -#define CSI_CAP_CH0_CAP_MASK(count) (((count) << 2) & CSI_CAP_CH0_CAP_MASK_MASK) -#define CSI_CAP_CH0_VCAP_ON BIT(1) -#define CSI_CAP_CH0_SCAP_ON BIT(0) - -#define CSI_SYNC_CNT_REG 0xc -#define CSI_FIFO_THRS_REG 0x10 -#define CSI_BT656_HEAD_CFG_REG 0x14 -#define CSI_PTN_LEN_REG 0x30 -#define CSI_PTN_ADDR_REG 0x34 -#define CSI_VER_REG 0x3c - -#define CSI_CH_CFG_REG 0x44 -#define CSI_CH_CFG_INPUT_FMT_MASK GENMASK(23, 20) -#define CSI_CH_CFG_INPUT_FMT(fmt) (((fmt) << 20) & CSI_CH_CFG_INPUT_FMT_MASK) -#define CSI_CH_CFG_OUTPUT_FMT_MASK GENMASK(19, 16) -#define CSI_CH_CFG_OUTPUT_FMT(fmt) (((fmt) << 16) & CSI_CH_CFG_OUTPUT_FMT_MASK) -#define CSI_CH_CFG_VFLIP_EN BIT(13) -#define CSI_CH_CFG_HFLIP_EN BIT(12) -#define CSI_CH_CFG_FIELD_SEL_MASK GENMASK(11, 10) -#define CSI_CH_CFG_FIELD_SEL_FIELD0 ((0 << 10) & CSI_CH_CFG_FIELD_SEL_MASK) -#define CSI_CH_CFG_FIELD_SEL_FIELD1 ((1 << 10) & CSI_CH_CFG_FIELD_SEL_MASK) -#define CSI_CH_CFG_FIELD_SEL_BOTH ((2 << 10) & CSI_CH_CFG_FIELD_SEL_MASK) -#define CSI_CH_CFG_INPUT_SEQ_MASK GENMASK(9, 8) -#define CSI_CH_CFG_INPUT_SEQ(seq) (((seq) << 8) & CSI_CH_CFG_INPUT_SEQ_MASK) - -#define CSI_CH_SCALE_REG 0x4c -#define CSI_CH_SCALE_QUART_EN BIT(0) - -#define CSI_CH_F0_BUFA_REG 0x50 - -#define CSI_CH_F1_BUFA_REG 0x58 - -#define CSI_CH_F2_BUFA_REG 0x60 - -#define CSI_CH_STA_REG 0x6c -#define CSI_CH_STA_FIELD_STA_MASK BIT(2) -#define CSI_CH_STA_FIELD_STA_FIELD0 ((0 << 2) & CSI_CH_STA_FIELD_STA_MASK) -#define CSI_CH_STA_FIELD_STA_FIELD1 ((1 << 2) & CSI_CH_STA_FIELD_STA_MASK) -#define CSI_CH_STA_VCAP_STA BIT(1) -#define CSI_CH_STA_SCAP_STA BIT(0) - -#define CSI_CH_INT_EN_REG 0x70 -#define CSI_CH_INT_EN_VS_INT_EN BIT(7) -#define CSI_CH_INT_EN_HB_OF_INT_EN BIT(6) -#define CSI_CH_INT_EN_MUL_ERR_INT_EN BIT(5) -#define CSI_CH_INT_EN_FIFO2_OF_INT_EN BIT(4) -#define CSI_CH_INT_EN_FIFO1_OF_INT_EN BIT(3) -#define CSI_CH_INT_EN_FIFO0_OF_INT_EN BIT(2) -#define CSI_CH_INT_EN_FD_INT_EN BIT(1) -#define CSI_CH_INT_EN_CD_INT_EN BIT(0) - -#define CSI_CH_INT_STA_REG 0x74 -#define CSI_CH_INT_STA_VS_PD BIT(7) -#define CSI_CH_INT_STA_HB_OF_PD BIT(6) -#define CSI_CH_INT_STA_MUL_ERR_PD BIT(5) -#define CSI_CH_INT_STA_FIFO2_OF_PD BIT(4) -#define CSI_CH_INT_STA_FIFO1_OF_PD BIT(3) -#define CSI_CH_INT_STA_FIFO0_OF_PD BIT(2) -#define CSI_CH_INT_STA_FD_PD BIT(1) -#define CSI_CH_INT_STA_CD_PD BIT(0) - -#define CSI_CH_FLD1_VSIZE_REG 0x78 - -#define CSI_CH_HSIZE_REG 0x80 -#define CSI_CH_HSIZE_HOR_LEN_MASK GENMASK(28, 16) -#define CSI_CH_HSIZE_HOR_LEN(len) (((len) << 16) & CSI_CH_HSIZE_HOR_LEN_MASK) -#define CSI_CH_HSIZE_HOR_START_MASK GENMASK(12, 0) -#define CSI_CH_HSIZE_HOR_START(start) (((start) << 0) & CSI_CH_HSIZE_HOR_START_MASK) - -#define CSI_CH_VSIZE_REG 0x84 -#define CSI_CH_VSIZE_VER_LEN_MASK GENMASK(28, 16) -#define CSI_CH_VSIZE_VER_LEN(len) (((len) << 16) & CSI_CH_VSIZE_VER_LEN_MASK) -#define CSI_CH_VSIZE_VER_START_MASK GENMASK(12, 0) -#define CSI_CH_VSIZE_VER_START(start) (((start) << 0) & CSI_CH_VSIZE_VER_START_MASK) - -#define CSI_CH_BUF_LEN_REG 0x88 -#define CSI_CH_BUF_LEN_BUF_LEN_C_MASK GENMASK(29, 16) -#define CSI_CH_BUF_LEN_BUF_LEN_C(len) (((len) << 16) & CSI_CH_BUF_LEN_BUF_LEN_C_MASK) -#define CSI_CH_BUF_LEN_BUF_LEN_Y_MASK GENMASK(13, 0) -#define CSI_CH_BUF_LEN_BUF_LEN_Y(len) (((len) << 0) & CSI_CH_BUF_LEN_BUF_LEN_Y_MASK) - -#define CSI_CH_FLIP_SIZE_REG 0x8c -#define CSI_CH_FLIP_SIZE_VER_LEN_MASK GENMASK(28, 16) -#define CSI_CH_FLIP_SIZE_VER_LEN(len) (((len) << 16) & CSI_CH_FLIP_SIZE_VER_LEN_MASK) -#define CSI_CH_FLIP_SIZE_VALID_LEN_MASK GENMASK(12, 0) -#define CSI_CH_FLIP_SIZE_VALID_LEN(len) (((len) << 0) & CSI_CH_FLIP_SIZE_VALID_LEN_MASK) - -#define CSI_CH_FRM_CLK_CNT_REG 0x90 -#define CSI_CH_ACC_ITNL_CLK_CNT_REG 0x94 -#define CSI_CH_FIFO_STAT_REG 0x98 -#define CSI_CH_PCLK_STAT_REG 0x9c - -/* - * csi input data format - */ -enum csi_input_fmt { - CSI_INPUT_FORMAT_RAW = 0, - CSI_INPUT_FORMAT_YUV422 = 3, - CSI_INPUT_FORMAT_YUV420 = 4, -}; - -/* - * csi output data format - */ -enum csi_output_fmt { - /* only when input format is RAW */ - CSI_FIELD_RAW_8 = 0, - CSI_FIELD_RAW_10 = 1, - CSI_FIELD_RAW_12 = 2, - CSI_FIELD_RGB565 = 4, - CSI_FIELD_RGB888 = 5, - CSI_FIELD_PRGB888 = 6, - CSI_FRAME_RAW_8 = 8, - CSI_FRAME_RAW_10 = 9, - CSI_FRAME_RAW_12 = 10, - CSI_FRAME_RGB565 = 12, - CSI_FRAME_RGB888 = 13, - CSI_FRAME_PRGB888 = 14, - - /* only when input format is YUV422 */ - CSI_FIELD_PLANAR_YUV422 = 0, - CSI_FIELD_PLANAR_YUV420 = 1, - CSI_FRAME_PLANAR_YUV420 = 2, - CSI_FRAME_PLANAR_YUV422 = 3, - CSI_FIELD_UV_CB_YUV422 = 4, - CSI_FIELD_UV_CB_YUV420 = 5, - CSI_FRAME_UV_CB_YUV420 = 6, - CSI_FRAME_UV_CB_YUV422 = 7, - CSI_FIELD_MB_YUV422 = 8, - CSI_FIELD_MB_YUV420 = 9, - CSI_FRAME_MB_YUV420 = 10, - CSI_FRAME_MB_YUV422 = 11, - CSI_FIELD_UV_CB_YUV422_10 = 12, - CSI_FIELD_UV_CB_YUV420_10 = 13, -}; - -/* - * csi YUV input data sequence - */ -enum csi_input_seq { - /* only when input format is YUV422 */ - CSI_INPUT_SEQ_YUYV = 0, - CSI_INPUT_SEQ_YVYU, - CSI_INPUT_SEQ_UYVY, - CSI_INPUT_SEQ_VYUY, -}; - -#endif /* __SUN6I_CSI_REG_H__ */ diff --git a/drivers/media/platform/sunxi/sun6i-csi/sun6i_video.c b/drivers/media/platform/sunxi/sun6i-csi/sun6i_video.c deleted file mode 100644 index 07b2161392d2..000000000000 --- a/drivers/media/platform/sunxi/sun6i-csi/sun6i_video.c +++ /dev/null @@ -1,683 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0+ -/* - * Copyright (c) 2011-2018 Magewell Electronics Co., Ltd. (Nanjing) - * All rights reserved. - * Author: Yong Deng - */ - -#include - -#include -#include -#include -#include -#include -#include - -#include "sun6i_csi.h" -#include "sun6i_video.h" - -/* This is got from BSP sources. */ -#define MIN_WIDTH (32) -#define MIN_HEIGHT (32) -#define MAX_WIDTH (4800) -#define MAX_HEIGHT (4800) - -struct sun6i_csi_buffer { - struct vb2_v4l2_buffer vb; - struct list_head list; - - dma_addr_t dma_addr; - bool queued_to_csi; -}; - -static const u32 supported_pixformats[] = { - V4L2_PIX_FMT_SBGGR8, - V4L2_PIX_FMT_SGBRG8, - V4L2_PIX_FMT_SGRBG8, - V4L2_PIX_FMT_SRGGB8, - V4L2_PIX_FMT_SBGGR10, - V4L2_PIX_FMT_SGBRG10, - V4L2_PIX_FMT_SGRBG10, - V4L2_PIX_FMT_SRGGB10, - V4L2_PIX_FMT_SBGGR12, - V4L2_PIX_FMT_SGBRG12, - V4L2_PIX_FMT_SGRBG12, - V4L2_PIX_FMT_SRGGB12, - V4L2_PIX_FMT_YUYV, - V4L2_PIX_FMT_YVYU, - V4L2_PIX_FMT_UYVY, - V4L2_PIX_FMT_VYUY, - V4L2_PIX_FMT_HM12, - V4L2_PIX_FMT_NV12, - V4L2_PIX_FMT_NV21, - V4L2_PIX_FMT_YUV420, - V4L2_PIX_FMT_YVU420, - V4L2_PIX_FMT_NV16, - V4L2_PIX_FMT_NV61, - V4L2_PIX_FMT_YUV422P, - V4L2_PIX_FMT_RGB565, - V4L2_PIX_FMT_RGB565X, - V4L2_PIX_FMT_JPEG, -}; - -static bool is_pixformat_valid(unsigned int pixformat) -{ - unsigned int i; - - for (i = 0; i < ARRAY_SIZE(supported_pixformats); i++) - if (supported_pixformats[i] == pixformat) - return true; - - return false; -} - -static struct v4l2_subdev * -sun6i_video_remote_subdev(struct sun6i_video *video, u32 *pad) -{ - struct media_pad *remote; - - remote = media_entity_remote_pad(&video->pad); - - if (!remote || !is_media_entity_v4l2_subdev(remote->entity)) - return NULL; - - if (pad) - *pad = remote->index; - - return media_entity_to_v4l2_subdev(remote->entity); -} - -static int sun6i_video_queue_setup(struct vb2_queue *vq, - unsigned int *nbuffers, - unsigned int *nplanes, - unsigned int sizes[], - struct device *alloc_devs[]) -{ - struct sun6i_video *video = vb2_get_drv_priv(vq); - unsigned int size = video->fmt.fmt.pix.sizeimage; - - if (*nplanes) - return sizes[0] < size ? -EINVAL : 0; - - *nplanes = 1; - sizes[0] = size; - - return 0; -} - -static int sun6i_video_buffer_prepare(struct vb2_buffer *vb) -{ - struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb); - struct sun6i_csi_buffer *buf = - container_of(vbuf, struct sun6i_csi_buffer, vb); - struct sun6i_video *video = vb2_get_drv_priv(vb->vb2_queue); - unsigned long size = video->fmt.fmt.pix.sizeimage; - - if (vb2_plane_size(vb, 0) < size) { - v4l2_err(video->vdev.v4l2_dev, "buffer too small (%lu < %lu)\n", - vb2_plane_size(vb, 0), size); - return -EINVAL; - } - - vb2_set_plane_payload(vb, 0, size); - - buf->dma_addr = vb2_dma_contig_plane_dma_addr(vb, 0); - - vbuf->field = video->fmt.fmt.pix.field; - - return 0; -} - -static int sun6i_video_start_streaming(struct vb2_queue *vq, unsigned int count) -{ - struct sun6i_video *video = vb2_get_drv_priv(vq); - struct sun6i_csi_buffer *buf; - struct sun6i_csi_buffer *next_buf; - struct sun6i_csi_config config; - struct v4l2_subdev *subdev; - unsigned long flags; - int ret; - - video->sequence = 0; - - ret = media_pipeline_start(&video->vdev.entity, &video->vdev.pipe); - if (ret < 0) - goto clear_dma_queue; - - if (video->mbus_code == 0) { - ret = -EINVAL; - goto stop_media_pipeline; - } - - subdev = sun6i_video_remote_subdev(video, NULL); - if (!subdev) { - ret = -EINVAL; - goto stop_media_pipeline; - } - - config.pixelformat = video->fmt.fmt.pix.pixelformat; - config.code = video->mbus_code; - config.field = video->fmt.fmt.pix.field; - config.width = video->fmt.fmt.pix.width; - config.height = video->fmt.fmt.pix.height; - - ret = sun6i_csi_update_config(video->csi, &config); - if (ret < 0) - goto stop_media_pipeline; - - spin_lock_irqsave(&video->dma_queue_lock, flags); - - buf = list_first_entry(&video->dma_queue, - struct sun6i_csi_buffer, list); - buf->queued_to_csi = true; - sun6i_csi_update_buf_addr(video->csi, buf->dma_addr); - - sun6i_csi_set_stream(video->csi, true); - - /* - * CSI will lookup the next dma buffer for next frame before the - * the current frame done IRQ triggered. This is not documented - * but reported by Ondřej Jirman. - * The BSP code has workaround for this too. It skip to mark the - * first buffer as frame done for VB2 and pass the second buffer - * to CSI in the first frame done ISR call. Then in second frame - * done ISR call, it mark the first buffer as frame done for VB2 - * and pass the third buffer to CSI. And so on. The bad thing is - * that the first buffer will be written twice and the first frame - * is dropped even the queued buffer is sufficient. - * So, I make some improvement here. Pass the next buffer to CSI - * just follow starting the CSI. In this case, the first frame - * will be stored in first buffer, second frame in second buffer. - * This method is used to avoid dropping the first frame, it - * would also drop frame when lacking of queued buffer. - */ - next_buf = list_next_entry(buf, list); - next_buf->queued_to_csi = true; - sun6i_csi_update_buf_addr(video->csi, next_buf->dma_addr); - - spin_unlock_irqrestore(&video->dma_queue_lock, flags); - - ret = v4l2_subdev_call(subdev, video, s_stream, 1); - if (ret && ret != -ENOIOCTLCMD) - goto stop_csi_stream; - - return 0; - -stop_csi_stream: - sun6i_csi_set_stream(video->csi, false); -stop_media_pipeline: - media_pipeline_stop(&video->vdev.entity); -clear_dma_queue: - spin_lock_irqsave(&video->dma_queue_lock, flags); - list_for_each_entry(buf, &video->dma_queue, list) - vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_QUEUED); - INIT_LIST_HEAD(&video->dma_queue); - spin_unlock_irqrestore(&video->dma_queue_lock, flags); - - return ret; -} - -static void sun6i_video_stop_streaming(struct vb2_queue *vq) -{ - struct sun6i_video *video = vb2_get_drv_priv(vq); - struct v4l2_subdev *subdev; - unsigned long flags; - struct sun6i_csi_buffer *buf; - - subdev = sun6i_video_remote_subdev(video, NULL); - if (subdev) - v4l2_subdev_call(subdev, video, s_stream, 0); - - sun6i_csi_set_stream(video->csi, false); - - media_pipeline_stop(&video->vdev.entity); - - /* Release all active buffers */ - spin_lock_irqsave(&video->dma_queue_lock, flags); - list_for_each_entry(buf, &video->dma_queue, list) - vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR); - INIT_LIST_HEAD(&video->dma_queue); - spin_unlock_irqrestore(&video->dma_queue_lock, flags); -} - -static void sun6i_video_buffer_queue(struct vb2_buffer *vb) -{ - struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb); - struct sun6i_csi_buffer *buf = - container_of(vbuf, struct sun6i_csi_buffer, vb); - struct sun6i_video *video = vb2_get_drv_priv(vb->vb2_queue); - unsigned long flags; - - spin_lock_irqsave(&video->dma_queue_lock, flags); - buf->queued_to_csi = false; - list_add_tail(&buf->list, &video->dma_queue); - spin_unlock_irqrestore(&video->dma_queue_lock, flags); -} - -void sun6i_video_frame_done(struct sun6i_video *video) -{ - struct sun6i_csi_buffer *buf; - struct sun6i_csi_buffer *next_buf; - struct vb2_v4l2_buffer *vbuf; - - spin_lock(&video->dma_queue_lock); - - buf = list_first_entry(&video->dma_queue, - struct sun6i_csi_buffer, list); - if (list_is_last(&buf->list, &video->dma_queue)) { - dev_dbg(video->csi->dev, "Frame dropped!\n"); - goto unlock; - } - - next_buf = list_next_entry(buf, list); - /* If a new buffer (#next_buf) had not been queued to CSI, the old - * buffer (#buf) is still holding by CSI for storing the next - * frame. So, we queue a new buffer (#next_buf) to CSI then wait - * for next ISR call. - */ - if (!next_buf->queued_to_csi) { - next_buf->queued_to_csi = true; - sun6i_csi_update_buf_addr(video->csi, next_buf->dma_addr); - dev_dbg(video->csi->dev, "Frame dropped!\n"); - goto unlock; - } - - list_del(&buf->list); - vbuf = &buf->vb; - vbuf->vb2_buf.timestamp = ktime_get_ns(); - vbuf->sequence = video->sequence; - vb2_buffer_done(&vbuf->vb2_buf, VB2_BUF_STATE_DONE); - - /* Prepare buffer for next frame but one. */ - if (!list_is_last(&next_buf->list, &video->dma_queue)) { - next_buf = list_next_entry(next_buf, list); - next_buf->queued_to_csi = true; - sun6i_csi_update_buf_addr(video->csi, next_buf->dma_addr); - } else { - dev_dbg(video->csi->dev, "Next frame will be dropped!\n"); - } - -unlock: - video->sequence++; - spin_unlock(&video->dma_queue_lock); -} - -static const struct vb2_ops sun6i_csi_vb2_ops = { - .queue_setup = sun6i_video_queue_setup, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, - .buf_prepare = sun6i_video_buffer_prepare, - .start_streaming = sun6i_video_start_streaming, - .stop_streaming = sun6i_video_stop_streaming, - .buf_queue = sun6i_video_buffer_queue, -}; - -static int vidioc_querycap(struct file *file, void *priv, - struct v4l2_capability *cap) -{ - struct sun6i_video *video = video_drvdata(file); - - strscpy(cap->driver, "sun6i-video", sizeof(cap->driver)); - strscpy(cap->card, video->vdev.name, sizeof(cap->card)); - snprintf(cap->bus_info, sizeof(cap->bus_info), "platform:%s", - video->csi->dev->of_node->name); - - return 0; -} - -static int vidioc_enum_fmt_vid_cap(struct file *file, void *priv, - struct v4l2_fmtdesc *f) -{ - u32 index = f->index; - - if (index >= ARRAY_SIZE(supported_pixformats)) - return -EINVAL; - - f->pixelformat = supported_pixformats[index]; - - return 0; -} - -static int vidioc_g_fmt_vid_cap(struct file *file, void *priv, - struct v4l2_format *fmt) -{ - struct sun6i_video *video = video_drvdata(file); - - *fmt = video->fmt; - - return 0; -} - -static int sun6i_video_try_fmt(struct sun6i_video *video, - struct v4l2_format *f) -{ - struct v4l2_pix_format *pixfmt = &f->fmt.pix; - int bpp; - - if (!is_pixformat_valid(pixfmt->pixelformat)) - pixfmt->pixelformat = supported_pixformats[0]; - - v4l_bound_align_image(&pixfmt->width, MIN_WIDTH, MAX_WIDTH, 1, - &pixfmt->height, MIN_HEIGHT, MAX_WIDTH, 1, 1); - - bpp = sun6i_csi_get_bpp(pixfmt->pixelformat); - pixfmt->bytesperline = (pixfmt->width * bpp) >> 3; - pixfmt->sizeimage = pixfmt->bytesperline * pixfmt->height; - - if (pixfmt->field == V4L2_FIELD_ANY) - pixfmt->field = V4L2_FIELD_NONE; - - pixfmt->colorspace = V4L2_COLORSPACE_RAW; - pixfmt->ycbcr_enc = V4L2_YCBCR_ENC_DEFAULT; - pixfmt->quantization = V4L2_QUANTIZATION_DEFAULT; - pixfmt->xfer_func = V4L2_XFER_FUNC_DEFAULT; - - return 0; -} - -static int sun6i_video_set_fmt(struct sun6i_video *video, struct v4l2_format *f) -{ - int ret; - - ret = sun6i_video_try_fmt(video, f); - if (ret) - return ret; - - video->fmt = *f; - - return 0; -} - -static int vidioc_s_fmt_vid_cap(struct file *file, void *priv, - struct v4l2_format *f) -{ - struct sun6i_video *video = video_drvdata(file); - - if (vb2_is_busy(&video->vb2_vidq)) - return -EBUSY; - - return sun6i_video_set_fmt(video, f); -} - -static int vidioc_try_fmt_vid_cap(struct file *file, void *priv, - struct v4l2_format *f) -{ - struct sun6i_video *video = video_drvdata(file); - - return sun6i_video_try_fmt(video, f); -} - -static int vidioc_enum_input(struct file *file, void *fh, - struct v4l2_input *inp) -{ - if (inp->index != 0) - return -EINVAL; - - strscpy(inp->name, "camera", sizeof(inp->name)); - inp->type = V4L2_INPUT_TYPE_CAMERA; - - return 0; -} - -static int vidioc_g_input(struct file *file, void *fh, unsigned int *i) -{ - *i = 0; - - return 0; -} - -static int vidioc_s_input(struct file *file, void *fh, unsigned int i) -{ - if (i != 0) - return -EINVAL; - - return 0; -} - -static const struct v4l2_ioctl_ops sun6i_video_ioctl_ops = { - .vidioc_querycap = vidioc_querycap, - .vidioc_enum_fmt_vid_cap = vidioc_enum_fmt_vid_cap, - .vidioc_g_fmt_vid_cap = vidioc_g_fmt_vid_cap, - .vidioc_s_fmt_vid_cap = vidioc_s_fmt_vid_cap, - .vidioc_try_fmt_vid_cap = vidioc_try_fmt_vid_cap, - - .vidioc_enum_input = vidioc_enum_input, - .vidioc_s_input = vidioc_s_input, - .vidioc_g_input = vidioc_g_input, - - .vidioc_reqbufs = vb2_ioctl_reqbufs, - .vidioc_querybuf = vb2_ioctl_querybuf, - .vidioc_qbuf = vb2_ioctl_qbuf, - .vidioc_expbuf = vb2_ioctl_expbuf, - .vidioc_dqbuf = vb2_ioctl_dqbuf, - .vidioc_create_bufs = vb2_ioctl_create_bufs, - .vidioc_prepare_buf = vb2_ioctl_prepare_buf, - .vidioc_streamon = vb2_ioctl_streamon, - .vidioc_streamoff = vb2_ioctl_streamoff, - - .vidioc_log_status = v4l2_ctrl_log_status, - .vidioc_subscribe_event = v4l2_ctrl_subscribe_event, - .vidioc_unsubscribe_event = v4l2_event_unsubscribe, -}; - -/* ----------------------------------------------------------------------------- - * V4L2 file operations - */ -static int sun6i_video_open(struct file *file) -{ - struct sun6i_video *video = video_drvdata(file); - int ret; - - if (mutex_lock_interruptible(&video->lock)) - return -ERESTARTSYS; - - ret = v4l2_fh_open(file); - if (ret < 0) - goto unlock; - - ret = v4l2_pipeline_pm_get(&video->vdev.entity); - if (ret < 0) - goto fh_release; - - /* check if already powered */ - if (!v4l2_fh_is_singular_file(file)) { - ret = -EBUSY; - goto unlock; - } - - ret = sun6i_csi_set_power(video->csi, true); - if (ret < 0) - goto fh_release; - - mutex_unlock(&video->lock); - return 0; - -fh_release: - v4l2_fh_release(file); -unlock: - mutex_unlock(&video->lock); - return ret; -} - -static int sun6i_video_close(struct file *file) -{ - struct sun6i_video *video = video_drvdata(file); - bool last_fh; - - mutex_lock(&video->lock); - - last_fh = v4l2_fh_is_singular_file(file); - - _vb2_fop_release(file, NULL); - - v4l2_pipeline_pm_put(&video->vdev.entity); - - if (last_fh) - sun6i_csi_set_power(video->csi, false); - - mutex_unlock(&video->lock); - - return 0; -} - -static const struct v4l2_file_operations sun6i_video_fops = { - .owner = THIS_MODULE, - .open = sun6i_video_open, - .release = sun6i_video_close, - .unlocked_ioctl = video_ioctl2, - .mmap = vb2_fop_mmap, - .poll = vb2_fop_poll -}; - -/* ----------------------------------------------------------------------------- - * Media Operations - */ -static int sun6i_video_link_validate_get_format(struct media_pad *pad, - struct v4l2_subdev_format *fmt) -{ - if (is_media_entity_v4l2_subdev(pad->entity)) { - struct v4l2_subdev *sd = - media_entity_to_v4l2_subdev(pad->entity); - - fmt->which = V4L2_SUBDEV_FORMAT_ACTIVE; - fmt->pad = pad->index; - return v4l2_subdev_call(sd, pad, get_fmt, NULL, fmt); - } - - return -EINVAL; -} - -static int sun6i_video_link_validate(struct media_link *link) -{ - struct video_device *vdev = container_of(link->sink->entity, - struct video_device, entity); - struct sun6i_video *video = video_get_drvdata(vdev); - struct v4l2_subdev_format source_fmt; - int ret; - - video->mbus_code = 0; - - if (!media_entity_remote_pad(link->sink->entity->pads)) { - dev_info(video->csi->dev, - "video node %s pad not connected\n", vdev->name); - return -ENOLINK; - } - - ret = sun6i_video_link_validate_get_format(link->source, &source_fmt); - if (ret < 0) - return ret; - - if (!sun6i_csi_is_format_supported(video->csi, - video->fmt.fmt.pix.pixelformat, - source_fmt.format.code)) { - dev_err(video->csi->dev, - "Unsupported pixformat: 0x%x with mbus code: 0x%x!\n", - video->fmt.fmt.pix.pixelformat, - source_fmt.format.code); - return -EPIPE; - } - - if (source_fmt.format.width != video->fmt.fmt.pix.width || - source_fmt.format.height != video->fmt.fmt.pix.height) { - dev_err(video->csi->dev, - "Wrong width or height %ux%u (%ux%u expected)\n", - video->fmt.fmt.pix.width, video->fmt.fmt.pix.height, - source_fmt.format.width, source_fmt.format.height); - return -EPIPE; - } - - video->mbus_code = source_fmt.format.code; - - return 0; -} - -static const struct media_entity_operations sun6i_video_media_ops = { - .link_validate = sun6i_video_link_validate -}; - -int sun6i_video_init(struct sun6i_video *video, struct sun6i_csi *csi, - const char *name) -{ - struct video_device *vdev = &video->vdev; - struct vb2_queue *vidq = &video->vb2_vidq; - struct v4l2_format fmt = { 0 }; - int ret; - - video->csi = csi; - - /* Initialize the media entity... */ - video->pad.flags = MEDIA_PAD_FL_SINK | MEDIA_PAD_FL_MUST_CONNECT; - vdev->entity.ops = &sun6i_video_media_ops; - ret = media_entity_pads_init(&vdev->entity, 1, &video->pad); - if (ret < 0) - return ret; - - mutex_init(&video->lock); - - INIT_LIST_HEAD(&video->dma_queue); - spin_lock_init(&video->dma_queue_lock); - - video->sequence = 0; - - /* Setup default format */ - fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; - fmt.fmt.pix.pixelformat = supported_pixformats[0]; - fmt.fmt.pix.width = 1280; - fmt.fmt.pix.height = 720; - fmt.fmt.pix.field = V4L2_FIELD_NONE; - sun6i_video_set_fmt(video, &fmt); - - /* Initialize videobuf2 queue */ - vidq->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; - vidq->io_modes = VB2_MMAP | VB2_DMABUF; - vidq->drv_priv = video; - vidq->buf_struct_size = sizeof(struct sun6i_csi_buffer); - vidq->ops = &sun6i_csi_vb2_ops; - vidq->mem_ops = &vb2_dma_contig_memops; - vidq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC; - vidq->lock = &video->lock; - /* Make sure non-dropped frame */ - vidq->min_buffers_needed = 3; - vidq->dev = csi->dev; - - ret = vb2_queue_init(vidq); - if (ret) { - v4l2_err(&csi->v4l2_dev, "vb2_queue_init failed: %d\n", ret); - goto clean_entity; - } - - /* Register video device */ - strscpy(vdev->name, name, sizeof(vdev->name)); - vdev->release = video_device_release_empty; - vdev->fops = &sun6i_video_fops; - vdev->ioctl_ops = &sun6i_video_ioctl_ops; - vdev->vfl_type = VFL_TYPE_VIDEO; - vdev->vfl_dir = VFL_DIR_RX; - vdev->v4l2_dev = &csi->v4l2_dev; - vdev->queue = vidq; - vdev->lock = &video->lock; - vdev->device_caps = V4L2_CAP_STREAMING | V4L2_CAP_VIDEO_CAPTURE; - video_set_drvdata(vdev, video); - - ret = video_register_device(vdev, VFL_TYPE_VIDEO, -1); - if (ret < 0) { - v4l2_err(&csi->v4l2_dev, - "video_register_device failed: %d\n", ret); - goto clean_entity; - } - - return 0; - -clean_entity: - media_entity_cleanup(&video->vdev.entity); - mutex_destroy(&video->lock); - return ret; -} - -void sun6i_video_cleanup(struct sun6i_video *video) -{ - vb2_video_unregister_device(&video->vdev); - media_entity_cleanup(&video->vdev.entity); - mutex_destroy(&video->lock); -} diff --git a/drivers/media/platform/sunxi/sun6i-csi/sun6i_video.h b/drivers/media/platform/sunxi/sun6i-csi/sun6i_video.h deleted file mode 100644 index b9cd919c24ac..000000000000 --- a/drivers/media/platform/sunxi/sun6i-csi/sun6i_video.h +++ /dev/null @@ -1,38 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0+ */ -/* - * Copyright (c) 2011-2018 Magewell Electronics Co., Ltd. (Nanjing) - * All rights reserved. - * Author: Yong Deng - */ - -#ifndef __SUN6I_VIDEO_H__ -#define __SUN6I_VIDEO_H__ - -#include -#include - -struct sun6i_csi; - -struct sun6i_video { - struct video_device vdev; - struct media_pad pad; - struct sun6i_csi *csi; - - struct mutex lock; - - struct vb2_queue vb2_vidq; - spinlock_t dma_queue_lock; - struct list_head dma_queue; - - unsigned int sequence; - struct v4l2_format fmt; - u32 mbus_code; -}; - -int sun6i_video_init(struct sun6i_video *video, struct sun6i_csi *csi, - const char *name); -void sun6i_video_cleanup(struct sun6i_video *video); - -void sun6i_video_frame_done(struct sun6i_video *video); - -#endif /* __SUN6I_VIDEO_H__ */ -- 2.32.0 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-17.1 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id CDA29C433EF for ; Fri, 10 Sep 2021 18:53:08 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 9088A60F93 for ; Fri, 10 Sep 2021 18:53:08 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 9088A60F93 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=bootlin.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=TCLtPQWskj5npm1zQHxncJYYvVTezHJVOTqaPpLSErE=; b=TAP7nYLGRQMyMJ yoRwySqJJAmK0EbxBGw/9RHtSdubuRZ0RJd47rfZTXtyOXXHDPGS1eUhRhZTGkNM0U1VKzKaNYyXr xBFX6klwaRQwnUaFF//iXQzzVjKPCPYPHV7V0C3loAqwX3dH/YcDRh9keOqnKqpyI1UdQaZ9MT4GI F43faLHpxgmZeC5edY9TXJ9pj5lzIoarMVF9QrP/4A4qJhb2lDtbjzLXm22znQWvsIS4piQ67e4bw CBbx8kntTU88iTHe9SalkAWqG7sZeR9ws3tl612LJcPdI1FeTIM23Aosnr8IhBiviVtTMktitSch/ 8TMGr3ALsZ76sDnpjf3Q==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1mOle7-00DR2o-I9; Fri, 10 Sep 2021 18:53:07 +0000 Received: from relay10.mail.gandi.net ([217.70.178.230]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1mOlU0-00DM4F-9E; Fri, 10 Sep 2021 18:42:51 +0000 Received: (Authenticated sender: paul.kocialkowski@bootlin.com) by relay10.mail.gandi.net (Postfix) with ESMTPSA id 1BC3E240004; Fri, 10 Sep 2021 18:42:37 +0000 (UTC) From: Paul Kocialkowski To: linux-media@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-kernel@vger.kernel.org, linux-phy@lists.infradead.org, linux-clk@vger.kernel.org, linux-staging@lists.linux.dev Cc: Yong Deng , Mauro Carvalho Chehab , Rob Herring , Maxime Ripard , Sakari Ailus , Hans Verkuil , Chen-Yu Tsai , Jernej Skrabec , Paul Kocialkowski , Greg Kroah-Hartman , Helen Koike , Laurent Pinchart , Thomas Petazzoni Subject: [PATCH 15/22] media: sunxi: Remove the sun6i-csi driver implementation Date: Fri, 10 Sep 2021 20:41:40 +0200 Message-Id: <20210910184147.336618-16-paul.kocialkowski@bootlin.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20210910184147.336618-1-paul.kocialkowski@bootlin.com> References: <20210910184147.336618-1-paul.kocialkowski@bootlin.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210910_114240_972278_991C93BC X-CRM114-Status: GOOD ( 19.32 ) X-BeenThere: linux-phy@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Linux Phy Mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-phy" Errors-To: linux-phy-bounces+linux-phy=archiver.kernel.org@lists.infradead.org QXMgZGVzY3JpYmVkIGluIHRoZSBjb21taXQgYWRkaW5nIHN1cHBvcnQgZm9yIHRoZSBuZXcgc3Vu NmktY3NpIGRyaXZlciwKYSBjb21wbGV0ZSByZXdyaXRlIHdhcyBuZWNlc3NhcnkgdG8gc3VwcG9y dCB0aGUgQWxsd2lubmVyIEEzMSBJU1AgYXMKd2VsbCBhcyBmaXggYSBudW1iZXIgb2YgaXNzdWVz IHdpdGggdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24uCgpGYXJld2VsbCBhbmQgdGhhbmtzIGZv ciBhbGwgdGhlIHBpeGVscyEKClNpZ25lZC1vZmYtYnk6IFBhdWwgS29jaWFsa293c2tpIDxwYXVs LmtvY2lhbGtvd3NraUBib290bGluLmNvbT4KLS0tCiAuLi4vbWVkaWEvcGxhdGZvcm0vc3VueGkv c3VuNmktY3NpL0tjb25maWcgICAgfCAgMTIgLQogLi4uL21lZGlhL3BsYXRmb3JtL3N1bnhpL3N1 bjZpLWNzaS9NYWtlZmlsZSAgIHwgICA0IC0KIC4uLi9wbGF0Zm9ybS9zdW54aS9zdW42aS1jc2kv c3VuNmlfY3NpLmMgICAgICB8IDkzNiAtLS0tLS0tLS0tLS0tLS0tLS0KIC4uLi9wbGF0Zm9ybS9z dW54aS9zdW42aS1jc2kvc3VuNmlfY3NpLmggICAgICB8IDEzOCAtLS0KIC4uLi9wbGF0Zm9ybS9z dW54aS9zdW42aS1jc2kvc3VuNmlfY3NpX3JlZy5oICB8IDE5NiAtLS0tCiAuLi4vcGxhdGZvcm0v c3VueGkvc3VuNmktY3NpL3N1bjZpX3ZpZGVvLmMgICAgfCA2ODMgLS0tLS0tLS0tLS0tLQogLi4u L3BsYXRmb3JtL3N1bnhpL3N1bjZpLWNzaS9zdW42aV92aWRlby5oICAgIHwgIDM4IC0KIDcgZmls ZXMgY2hhbmdlZCwgMjAwNyBkZWxldGlvbnMoLSkKIGRlbGV0ZSBtb2RlIDEwMDY0NCBkcml2ZXJz L21lZGlhL3BsYXRmb3JtL3N1bnhpL3N1bjZpLWNzaS9LY29uZmlnCiBkZWxldGUgbW9kZSAxMDA2 NDQgZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zdW54aS9zdW42aS1jc2kvTWFrZWZpbGUKIGRlbGV0 ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL21lZGlhL3BsYXRmb3JtL3N1bnhpL3N1bjZpLWNzaS9zdW42 aV9jc2kuYwogZGVsZXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvbWVkaWEvcGxhdGZvcm0vc3VueGkv c3VuNmktY3NpL3N1bjZpX2NzaS5oCiBkZWxldGUgbW9kZSAxMDA2NDQgZHJpdmVycy9tZWRpYS9w bGF0Zm9ybS9zdW54aS9zdW42aS1jc2kvc3VuNmlfY3NpX3JlZy5oCiBkZWxldGUgbW9kZSAxMDA2 NDQgZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zdW54aS9zdW42aS1jc2kvc3VuNmlfdmlkZW8uYwog ZGVsZXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvbWVkaWEvcGxhdGZvcm0vc3VueGkvc3VuNmktY3Np L3N1bjZpX3ZpZGVvLmgKCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3N1bnhp L3N1bjZpLWNzaS9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zdW54aS9zdW42aS1j c2kvS2NvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg2ZTNmYjNhODBkLi4w MDAwMDAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zdW54aS9zdW42aS1jc2kv S2NvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMgU1BEWC1MaWNlbnNlLUlk ZW50aWZpZXI6IEdQTC0yLjAtb25seQotY29uZmlnIFZJREVPX1NVTjZJX0NTSQotCXRyaXN0YXRl ICJBbGx3aW5uZXIgVjNzIENhbWVyYSBTZW5zb3IgSW50ZXJmYWNlIGRyaXZlciIKLQlkZXBlbmRz IG9uIFZJREVPX1Y0TDIgJiYgQ09NTU9OX0NMSyAgJiYgSEFTX0RNQQotCWRlcGVuZHMgb24gQVJD SF9TVU5YSSB8fCBDT01QSUxFX1RFU1QKLQlzZWxlY3QgTUVESUFfQ09OVFJPTExFUgotCXNlbGVj dCBWSURFT19WNEwyX1NVQkRFVl9BUEkKLQlzZWxlY3QgVklERU9CVUYyX0RNQV9DT05USUcKLQlz ZWxlY3QgUkVHTUFQX01NSU8KLQlzZWxlY3QgVjRMMl9GV05PREUKLQloZWxwCi0JICAgU3VwcG9y dCBmb3IgdGhlIEFsbHdpbm5lciBDYW1lcmEgU2Vuc29yIEludGVyZmFjZSBDb250cm9sbGVyIG9u IFYzcy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vc3VueGkvc3VuNmktY3Np L01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zdW54aS9zdW42aS1jc2kvTWFrZWZp bGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ZTMxNTM0NzgwNC4uMDAwMDAwMDAw MDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vc3VueGkvc3VuNmktY3NpL01ha2VmaWxl CisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jIFNQRFgtTGljZW5zZS1JZGVudGlmaWVy OiBHUEwtMi4wLW9ubHkKLXN1bjZpLWNzaS15ICs9IHN1bjZpX3ZpZGVvLm8gc3VuNmlfY3NpLm8K LQotb2JqLSQoQ09ORklHX1ZJREVPX1NVTjZJX0NTSSkgKz0gc3VuNmktY3NpLm8KZGlmZiAtLWdp dCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vc3VueGkvc3VuNmktY3NpL3N1bjZpX2NzaS5jIGIv ZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zdW54aS9zdW42aS1jc2kvc3VuNmlfY3NpLmMKZGVsZXRl ZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3OTM1ZjFlOTU1NS4uMDAwMDAwMDAwMDAwCi0tLSBh L2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vc3VueGkvc3VuNmktY3NpL3N1bjZpX2NzaS5jCisrKyAv ZGV2L251bGwKQEAgLTEsOTM2ICswLDAgQEAKLS8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBH UEwtMi4wKwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMS0yMDE4IE1hZ2V3ZWxsIEVsZWN0cm9u aWNzIENvLiwgTHRkLiAoTmFuamluZykKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBBdXRo b3I6IFlvbmcgRGVuZyA8eW9uZy5kZW5nQG1hZ2V3ZWxsLmNvbT4KLSAqLwotCi0jaW5jbHVkZSA8 bGludXgvY2xrLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9k bWEtbWFwcGluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L2Zz Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4K LSNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2lu Y2x1ZGUgPGxpbnV4L29mLmg+Ci0jaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+Ci0jaW5jbHVk ZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5o PgotI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgotI2luY2x1ZGUgPGxpbnV4L3Jlc2V0Lmg+Ci0j aW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9zaXplcy5oPgotI2luY2x1 ZGUgPGxpbnV4L3NsYWIuaD4KLQotI2luY2x1ZGUgInN1bjZpX2NzaS5oIgotI2luY2x1ZGUgInN1 bjZpX2NzaV9yZWcuaCIKLQotI2RlZmluZSBNT0RVTEVfTkFNRQkic3VuNmktY3NpIgotCi1zdHJ1 Y3Qgc3VuNmlfY3NpX2RldiB7Ci0Jc3RydWN0IHN1bjZpX2NzaQkJY3NpOwotCXN0cnVjdCBkZXZp Y2UJCQkqZGV2OwotCi0Jc3RydWN0IHJlZ21hcAkJCSpyZWdtYXA7Ci0Jc3RydWN0IGNsawkJCSpj bGtfbW9kOwotCXN0cnVjdCBjbGsJCQkqY2xrX3JhbTsKLQlzdHJ1Y3QgcmVzZXRfY29udHJvbAkJ KnJzdGNfYnVzOwotCi0JaW50CQkJCXBsYW5hcl9vZmZzZXRbM107Ci19OwotCi1zdGF0aWMgaW5s aW5lIHN0cnVjdCBzdW42aV9jc2lfZGV2ICpzdW42aV9jc2lfdG9fZGV2KHN0cnVjdCBzdW42aV9j c2kgKmNzaSkKLXsKLQlyZXR1cm4gY29udGFpbmVyX29mKGNzaSwgc3RydWN0IHN1bjZpX2NzaV9k ZXYsIGNzaSk7Ci19Ci0KLS8qIFRPRE8gYWRkIDEwJjEyIGJpdCBZVVYsIFJHQiBzdXBwb3J0ICov Ci1ib29sIHN1bjZpX2NzaV9pc19mb3JtYXRfc3VwcG9ydGVkKHN0cnVjdCBzdW42aV9jc2kgKmNz aSwKLQkJCQkgICB1MzIgcGl4Zm9ybWF0LCB1MzIgbWJ1c19jb2RlKQotewotCXN0cnVjdCBzdW42 aV9jc2lfZGV2ICpzZGV2ID0gc3VuNmlfY3NpX3RvX2Rldihjc2kpOwotCi0JLyoKLQkgKiBTb21l IHZpZGVvIHJlY2VpdmVycyBoYXZlIHRoZSBhYmlsaXR5IHRvIGJlIGNvbXBhdGlibGUgd2l0aAot CSAqIDhiaXQgYW5kIDE2Yml0IGJ1cyB3aWR0aC4KLQkgKiBJZGVudGlmeSB0aGUgbWVkaWEgYnVz IGZvcm1hdCBmcm9tIGRldmljZSB0cmVlLgotCSAqLwotCWlmICgoc2Rldi0+Y3NpLnY0bDJfZXAu YnVzX3R5cGUgPT0gVjRMMl9NQlVTX1BBUkFMTEVMCi0JICAgICB8fCBzZGV2LT5jc2kudjRsMl9l cC5idXNfdHlwZSA9PSBWNEwyX01CVVNfQlQ2NTYpCi0JICAgICAmJiBzZGV2LT5jc2kudjRsMl9l cC5idXMucGFyYWxsZWwuYnVzX3dpZHRoID09IDE2KSB7Ci0JCXN3aXRjaCAocGl4Zm9ybWF0KSB7 Ci0JCWNhc2UgVjRMMl9QSVhfRk1UX0hNMTI6Ci0JCWNhc2UgVjRMMl9QSVhfRk1UX05WMTI6Ci0J CWNhc2UgVjRMMl9QSVhfRk1UX05WMjE6Ci0JCWNhc2UgVjRMMl9QSVhfRk1UX05WMTY6Ci0JCWNh c2UgVjRMMl9QSVhfRk1UX05WNjE6Ci0JCWNhc2UgVjRMMl9QSVhfRk1UX1lVVjQyMDoKLQkJY2Fz ZSBWNEwyX1BJWF9GTVRfWVZVNDIwOgotCQljYXNlIFY0TDJfUElYX0ZNVF9ZVVY0MjJQOgotCQkJ c3dpdGNoIChtYnVzX2NvZGUpIHsKLQkJCWNhc2UgTUVESUFfQlVTX0ZNVF9VWVZZOF8xWDE2Ogot CQkJY2FzZSBNRURJQV9CVVNfRk1UX1ZZVVk4XzFYMTY6Ci0JCQljYXNlIE1FRElBX0JVU19GTVRf WVVZVjhfMVgxNjoKLQkJCWNhc2UgTUVESUFfQlVTX0ZNVF9ZVllVOF8xWDE2OgotCQkJCXJldHVy biB0cnVlOwotCQkJZGVmYXVsdDoKLQkJCQlkZXZfZGJnKHNkZXYtPmRldiwgIlVuc3VwcG9ydGVk IG1idXMgY29kZTogMHgleFxuIiwKLQkJCQkJbWJ1c19jb2RlKTsKLQkJCQlicmVhazsKLQkJCX0K LQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJZGV2X2RiZyhzZGV2LT5kZXYsICJVbnN1cHBvcnRl ZCBwaXhmb3JtYXQ6IDB4JXhcbiIsCi0JCQkJcGl4Zm9ybWF0KTsKLQkJCWJyZWFrOwotCQl9Ci0J CXJldHVybiBmYWxzZTsKLQl9Ci0KLQlzd2l0Y2ggKHBpeGZvcm1hdCkgewotCWNhc2UgVjRMMl9Q SVhfRk1UX1NCR0dSODoKLQkJcmV0dXJuIChtYnVzX2NvZGUgPT0gTUVESUFfQlVTX0ZNVF9TQkdH UjhfMVg4KTsKLQljYXNlIFY0TDJfUElYX0ZNVF9TR0JSRzg6Ci0JCXJldHVybiAobWJ1c19jb2Rl ID09IE1FRElBX0JVU19GTVRfU0dCUkc4XzFYOCk7Ci0JY2FzZSBWNEwyX1BJWF9GTVRfU0dSQkc4 OgotCQlyZXR1cm4gKG1idXNfY29kZSA9PSBNRURJQV9CVVNfRk1UX1NHUkJHOF8xWDgpOwotCWNh c2UgVjRMMl9QSVhfRk1UX1NSR0dCODoKLQkJcmV0dXJuIChtYnVzX2NvZGUgPT0gTUVESUFfQlVT X0ZNVF9TUkdHQjhfMVg4KTsKLQljYXNlIFY0TDJfUElYX0ZNVF9TQkdHUjEwOgotCQlyZXR1cm4g KG1idXNfY29kZSA9PSBNRURJQV9CVVNfRk1UX1NCR0dSMTBfMVgxMCk7Ci0JY2FzZSBWNEwyX1BJ WF9GTVRfU0dCUkcxMDoKLQkJcmV0dXJuIChtYnVzX2NvZGUgPT0gTUVESUFfQlVTX0ZNVF9TR0JS RzEwXzFYMTApOwotCWNhc2UgVjRMMl9QSVhfRk1UX1NHUkJHMTA6Ci0JCXJldHVybiAobWJ1c19j b2RlID09IE1FRElBX0JVU19GTVRfU0dSQkcxMF8xWDEwKTsKLQljYXNlIFY0TDJfUElYX0ZNVF9T UkdHQjEwOgotCQlyZXR1cm4gKG1idXNfY29kZSA9PSBNRURJQV9CVVNfRk1UX1NSR0dCMTBfMVgx MCk7Ci0JY2FzZSBWNEwyX1BJWF9GTVRfU0JHR1IxMjoKLQkJcmV0dXJuIChtYnVzX2NvZGUgPT0g TUVESUFfQlVTX0ZNVF9TQkdHUjEyXzFYMTIpOwotCWNhc2UgVjRMMl9QSVhfRk1UX1NHQlJHMTI6 Ci0JCXJldHVybiAobWJ1c19jb2RlID09IE1FRElBX0JVU19GTVRfU0dCUkcxMl8xWDEyKTsKLQlj YXNlIFY0TDJfUElYX0ZNVF9TR1JCRzEyOgotCQlyZXR1cm4gKG1idXNfY29kZSA9PSBNRURJQV9C VVNfRk1UX1NHUkJHMTJfMVgxMik7Ci0JY2FzZSBWNEwyX1BJWF9GTVRfU1JHR0IxMjoKLQkJcmV0 dXJuIChtYnVzX2NvZGUgPT0gTUVESUFfQlVTX0ZNVF9TUkdHQjEyXzFYMTIpOwotCi0JY2FzZSBW NEwyX1BJWF9GTVRfWVVZVjoKLQkJcmV0dXJuIChtYnVzX2NvZGUgPT0gTUVESUFfQlVTX0ZNVF9Z VVlWOF8yWDgpOwotCWNhc2UgVjRMMl9QSVhfRk1UX1lWWVU6Ci0JCXJldHVybiAobWJ1c19jb2Rl ID09IE1FRElBX0JVU19GTVRfWVZZVThfMlg4KTsKLQljYXNlIFY0TDJfUElYX0ZNVF9VWVZZOgot CQlyZXR1cm4gKG1idXNfY29kZSA9PSBNRURJQV9CVVNfRk1UX1VZVlk4XzJYOCk7Ci0JY2FzZSBW NEwyX1BJWF9GTVRfVllVWToKLQkJcmV0dXJuIChtYnVzX2NvZGUgPT0gTUVESUFfQlVTX0ZNVF9W WVVZOF8yWDgpOwotCi0JY2FzZSBWNEwyX1BJWF9GTVRfSE0xMjoKLQljYXNlIFY0TDJfUElYX0ZN VF9OVjEyOgotCWNhc2UgVjRMMl9QSVhfRk1UX05WMjE6Ci0JY2FzZSBWNEwyX1BJWF9GTVRfTlYx NjoKLQljYXNlIFY0TDJfUElYX0ZNVF9OVjYxOgotCWNhc2UgVjRMMl9QSVhfRk1UX1lVVjQyMDoK LQljYXNlIFY0TDJfUElYX0ZNVF9ZVlU0MjA6Ci0JY2FzZSBWNEwyX1BJWF9GTVRfWVVWNDIyUDoK LQkJc3dpdGNoIChtYnVzX2NvZGUpIHsKLQkJY2FzZSBNRURJQV9CVVNfRk1UX1VZVlk4XzJYODoK LQkJY2FzZSBNRURJQV9CVVNfRk1UX1ZZVVk4XzJYODoKLQkJY2FzZSBNRURJQV9CVVNfRk1UX1lV WVY4XzJYODoKLQkJY2FzZSBNRURJQV9CVVNfRk1UX1lWWVU4XzJYODoKLQkJCXJldHVybiB0cnVl OwotCQlkZWZhdWx0OgotCQkJZGV2X2RiZyhzZGV2LT5kZXYsICJVbnN1cHBvcnRlZCBtYnVzIGNv ZGU6IDB4JXhcbiIsCi0JCQkJbWJ1c19jb2RlKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwot Ci0JY2FzZSBWNEwyX1BJWF9GTVRfUkdCNTY1OgotCQlyZXR1cm4gKG1idXNfY29kZSA9PSBNRURJ QV9CVVNfRk1UX1JHQjU2NV8yWDhfTEUpOwotCWNhc2UgVjRMMl9QSVhfRk1UX1JHQjU2NVg6Ci0J CXJldHVybiAobWJ1c19jb2RlID09IE1FRElBX0JVU19GTVRfUkdCNTY1XzJYOF9CRSk7Ci0KLQlj YXNlIFY0TDJfUElYX0ZNVF9KUEVHOgotCQlyZXR1cm4gKG1idXNfY29kZSA9PSBNRURJQV9CVVNf Rk1UX0pQRUdfMVg4KTsKLQotCWRlZmF1bHQ6Ci0JCWRldl9kYmcoc2Rldi0+ZGV2LCAiVW5zdXBw b3J0ZWQgcGl4Zm9ybWF0OiAweCV4XG4iLCBwaXhmb3JtYXQpOwotCQlicmVhazsKLQl9Ci0KLQly ZXR1cm4gZmFsc2U7Ci19Ci0KLWludCBzdW42aV9jc2lfc2V0X3Bvd2VyKHN0cnVjdCBzdW42aV9j c2kgKmNzaSwgYm9vbCBlbmFibGUpCi17Ci0Jc3RydWN0IHN1bjZpX2NzaV9kZXYgKnNkZXYgPSBz dW42aV9jc2lfdG9fZGV2KGNzaSk7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gc2Rldi0+ZGV2Owot CXN0cnVjdCByZWdtYXAgKnJlZ21hcCA9IHNkZXYtPnJlZ21hcDsKLQlpbnQgcmV0OwotCi0JaWYg KCFlbmFibGUpIHsKLQkJcmVnbWFwX3VwZGF0ZV9iaXRzKHJlZ21hcCwgQ1NJX0VOX1JFRywgQ1NJ X0VOX0NTSV9FTiwgMCk7Ci0KLQkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHNkZXYtPmNsa19yYW0p OwotCQlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUoZGV2LT5vZl9ub2RlLAotCQkJCQkgICAg ImFsbHdpbm5lcixzdW41MGktYTY0LWNzaSIpKQotCQkJY2xrX3JhdGVfZXhjbHVzaXZlX3B1dChz ZGV2LT5jbGtfbW9kKTsKLQkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHNkZXYtPmNsa19tb2QpOwot CQlyZXNldF9jb250cm9sX2Fzc2VydChzZGV2LT5yc3RjX2J1cyk7Ci0JCXJldHVybiAwOwotCX0K LQotCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShzZGV2LT5jbGtfbW9kKTsKLQlpZiAocmV0KSB7 Ci0JCWRldl9lcnIoc2Rldi0+ZGV2LCAiRW5hYmxlIGNzaSBjbGsgZXJyICVkXG4iLCByZXQpOwot CQlyZXR1cm4gcmV0OwotCX0KLQotCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShkZXYtPm9m X25vZGUsICJhbGx3aW5uZXIsc3VuNTBpLWE2NC1jc2kiKSkKLQkJY2xrX3NldF9yYXRlX2V4Y2x1 c2l2ZShzZGV2LT5jbGtfbW9kLCAzMDAwMDAwMDApOwotCi0JcmV0ID0gY2xrX3ByZXBhcmVfZW5h YmxlKHNkZXYtPmNsa19yYW0pOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycihzZGV2LT5kZXYsICJF bmFibGUgY2xrX2RyYW1fY3NpIGNsayBlcnIgJWRcbiIsIHJldCk7Ci0JCWdvdG8gY2xrX21vZF9k aXNhYmxlOwotCX0KLQotCXJldCA9IHJlc2V0X2NvbnRyb2xfZGVhc3NlcnQoc2Rldi0+cnN0Y19i dXMpOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycihzZGV2LT5kZXYsICJyZXNldCBlcnIgJWRcbiIs IHJldCk7Ci0JCWdvdG8gY2xrX3JhbV9kaXNhYmxlOwotCX0KLQotCXJlZ21hcF91cGRhdGVfYml0 cyhyZWdtYXAsIENTSV9FTl9SRUcsIENTSV9FTl9DU0lfRU4sIENTSV9FTl9DU0lfRU4pOwotCi0J cmV0dXJuIDA7Ci0KLWNsa19yYW1fZGlzYWJsZToKLQljbGtfZGlzYWJsZV91bnByZXBhcmUoc2Rl di0+Y2xrX3JhbSk7Ci1jbGtfbW9kX2Rpc2FibGU6Ci0JaWYgKG9mX2RldmljZV9pc19jb21wYXRp YmxlKGRldi0+b2Zfbm9kZSwgImFsbHdpbm5lcixzdW41MGktYTY0LWNzaSIpKQotCQljbGtfcmF0 ZV9leGNsdXNpdmVfcHV0KHNkZXYtPmNsa19tb2QpOwotCWNsa19kaXNhYmxlX3VucHJlcGFyZShz ZGV2LT5jbGtfbW9kKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgZW51bSBjc2lfaW5wdXRf Zm10IGdldF9jc2lfaW5wdXRfZm9ybWF0KHN0cnVjdCBzdW42aV9jc2lfZGV2ICpzZGV2LAotCQkJ CQkgICAgICAgdTMyIG1idXNfY29kZSwgdTMyIHBpeGZvcm1hdCkKLXsKLQkvKiBub24tWVVWICov Ci0JaWYgKChtYnVzX2NvZGUgJiAweEYwMDApICE9IDB4MjAwMCkKLQkJcmV0dXJuIENTSV9JTlBV VF9GT1JNQVRfUkFXOwotCi0Jc3dpdGNoIChwaXhmb3JtYXQpIHsKLQljYXNlIFY0TDJfUElYX0ZN VF9ZVVlWOgotCWNhc2UgVjRMMl9QSVhfRk1UX1lWWVU6Ci0JY2FzZSBWNEwyX1BJWF9GTVRfVVlW WToKLQljYXNlIFY0TDJfUElYX0ZNVF9WWVVZOgotCQlyZXR1cm4gQ1NJX0lOUFVUX0ZPUk1BVF9S QVc7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JLyogbm90IHN1cHBvcnQgWVVWNDIwIGlu cHV0IGZvcm1hdCB5ZXQgKi8KLQlkZXZfZGJnKHNkZXYtPmRldiwgIlNlbGVjdCBZVVY0MjIgYXMg ZGVmYXVsdCBpbnB1dCBmb3JtYXQgb2YgQ1NJLlxuIik7Ci0JcmV0dXJuIENTSV9JTlBVVF9GT1JN QVRfWVVWNDIyOwotfQotCi1zdGF0aWMgZW51bSBjc2lfb3V0cHV0X2ZtdCBnZXRfY3NpX291dHB1 dF9mb3JtYXQoc3RydWN0IHN1bjZpX2NzaV9kZXYgKnNkZXYsCi0JCQkJCQkgdTMyIHBpeGZvcm1h dCwgdTMyIGZpZWxkKQotewotCWJvb2wgYnVmX2ludGVybGFjZWQgPSBmYWxzZTsKLQotCWlmIChm aWVsZCA9PSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQKLQkgICAgfHwgZmllbGQgPT0gVjRMMl9GSUVM RF9JTlRFUkxBQ0VEX1RCCi0JICAgIHx8IGZpZWxkID09IFY0TDJfRklFTERfSU5URVJMQUNFRF9C VCkKLQkJYnVmX2ludGVybGFjZWQgPSB0cnVlOwotCi0Jc3dpdGNoIChwaXhmb3JtYXQpIHsKLQlj YXNlIFY0TDJfUElYX0ZNVF9TQkdHUjg6Ci0JY2FzZSBWNEwyX1BJWF9GTVRfU0dCUkc4OgotCWNh c2UgVjRMMl9QSVhfRk1UX1NHUkJHODoKLQljYXNlIFY0TDJfUElYX0ZNVF9TUkdHQjg6Ci0JCXJl dHVybiBidWZfaW50ZXJsYWNlZCA/IENTSV9GUkFNRV9SQVdfOCA6IENTSV9GSUVMRF9SQVdfODsK LQljYXNlIFY0TDJfUElYX0ZNVF9TQkdHUjEwOgotCWNhc2UgVjRMMl9QSVhfRk1UX1NHQlJHMTA6 Ci0JY2FzZSBWNEwyX1BJWF9GTVRfU0dSQkcxMDoKLQljYXNlIFY0TDJfUElYX0ZNVF9TUkdHQjEw OgotCQlyZXR1cm4gYnVmX2ludGVybGFjZWQgPyBDU0lfRlJBTUVfUkFXXzEwIDogQ1NJX0ZJRUxE X1JBV18xMDsKLQljYXNlIFY0TDJfUElYX0ZNVF9TQkdHUjEyOgotCWNhc2UgVjRMMl9QSVhfRk1U X1NHQlJHMTI6Ci0JY2FzZSBWNEwyX1BJWF9GTVRfU0dSQkcxMjoKLQljYXNlIFY0TDJfUElYX0ZN VF9TUkdHQjEyOgotCQlyZXR1cm4gYnVmX2ludGVybGFjZWQgPyBDU0lfRlJBTUVfUkFXXzEyIDog Q1NJX0ZJRUxEX1JBV18xMjsKLQotCWNhc2UgVjRMMl9QSVhfRk1UX1lVWVY6Ci0JY2FzZSBWNEwy X1BJWF9GTVRfWVZZVToKLQljYXNlIFY0TDJfUElYX0ZNVF9VWVZZOgotCWNhc2UgVjRMMl9QSVhf Rk1UX1ZZVVk6Ci0JCXJldHVybiBidWZfaW50ZXJsYWNlZCA/IENTSV9GUkFNRV9SQVdfOCA6IENT SV9GSUVMRF9SQVdfODsKLQotCWNhc2UgVjRMMl9QSVhfRk1UX0hNMTI6Ci0JCXJldHVybiBidWZf aW50ZXJsYWNlZCA/IENTSV9GUkFNRV9NQl9ZVVY0MjAgOgotCQkJCQlDU0lfRklFTERfTUJfWVVW NDIwOwotCWNhc2UgVjRMMl9QSVhfRk1UX05WMTI6Ci0JY2FzZSBWNEwyX1BJWF9GTVRfTlYyMToK LQkJcmV0dXJuIGJ1Zl9pbnRlcmxhY2VkID8gQ1NJX0ZSQU1FX1VWX0NCX1lVVjQyMCA6Ci0JCQkJ CUNTSV9GSUVMRF9VVl9DQl9ZVVY0MjA7Ci0JY2FzZSBWNEwyX1BJWF9GTVRfWVVWNDIwOgotCWNh c2UgVjRMMl9QSVhfRk1UX1lWVTQyMDoKLQkJcmV0dXJuIGJ1Zl9pbnRlcmxhY2VkID8gQ1NJX0ZS QU1FX1BMQU5BUl9ZVVY0MjAgOgotCQkJCQlDU0lfRklFTERfUExBTkFSX1lVVjQyMDsKLQljYXNl IFY0TDJfUElYX0ZNVF9OVjE2OgotCWNhc2UgVjRMMl9QSVhfRk1UX05WNjE6Ci0JCXJldHVybiBi dWZfaW50ZXJsYWNlZCA/IENTSV9GUkFNRV9VVl9DQl9ZVVY0MjIgOgotCQkJCQlDU0lfRklFTERf VVZfQ0JfWVVWNDIyOwotCWNhc2UgVjRMMl9QSVhfRk1UX1lVVjQyMlA6Ci0JCXJldHVybiBidWZf aW50ZXJsYWNlZCA/IENTSV9GUkFNRV9QTEFOQVJfWVVWNDIyIDoKLQkJCQkJQ1NJX0ZJRUxEX1BM QU5BUl9ZVVY0MjI7Ci0KLQljYXNlIFY0TDJfUElYX0ZNVF9SR0I1NjU6Ci0JY2FzZSBWNEwyX1BJ WF9GTVRfUkdCNTY1WDoKLQkJcmV0dXJuIGJ1Zl9pbnRlcmxhY2VkID8gQ1NJX0ZSQU1FX1JHQjU2 NSA6IENTSV9GSUVMRF9SR0I1NjU7Ci0KLQljYXNlIFY0TDJfUElYX0ZNVF9KUEVHOgotCQlyZXR1 cm4gYnVmX2ludGVybGFjZWQgPyBDU0lfRlJBTUVfUkFXXzggOiBDU0lfRklFTERfUkFXXzg7Ci0K LQlkZWZhdWx0OgotCQlkZXZfd2FybihzZGV2LT5kZXYsICJVbnN1cHBvcnRlZCBwaXhmb3JtYXQ6 IDB4JXhcbiIsIHBpeGZvcm1hdCk7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiBDU0lfRklFTERf UkFXXzg7Ci19Ci0KLXN0YXRpYyBlbnVtIGNzaV9pbnB1dF9zZXEgZ2V0X2NzaV9pbnB1dF9zZXEo c3RydWN0IHN1bjZpX2NzaV9kZXYgKnNkZXYsCi0JCQkJCSAgICB1MzIgbWJ1c19jb2RlLCB1MzIg cGl4Zm9ybWF0KQotewotCS8qIElucHV0IHNlcXVlbmNlIGRvZXMgbm90IGFwcGx5IHRvIG5vbi1Z VVYgZm9ybWF0cyAqLwotCWlmICgobWJ1c19jb2RlICYgMHhGMDAwKSAhPSAweDIwMDApCi0JCXJl dHVybiAwOwotCi0Jc3dpdGNoIChwaXhmb3JtYXQpIHsKLQljYXNlIFY0TDJfUElYX0ZNVF9ITTEy OgotCWNhc2UgVjRMMl9QSVhfRk1UX05WMTI6Ci0JY2FzZSBWNEwyX1BJWF9GTVRfTlYxNjoKLQlj YXNlIFY0TDJfUElYX0ZNVF9ZVVY0MjA6Ci0JY2FzZSBWNEwyX1BJWF9GTVRfWVVWNDIyUDoKLQkJ c3dpdGNoIChtYnVzX2NvZGUpIHsKLQkJY2FzZSBNRURJQV9CVVNfRk1UX1VZVlk4XzJYODoKLQkJ Y2FzZSBNRURJQV9CVVNfRk1UX1VZVlk4XzFYMTY6Ci0JCQlyZXR1cm4gQ1NJX0lOUFVUX1NFUV9V WVZZOwotCQljYXNlIE1FRElBX0JVU19GTVRfVllVWThfMlg4OgotCQljYXNlIE1FRElBX0JVU19G TVRfVllVWThfMVgxNjoKLQkJCXJldHVybiBDU0lfSU5QVVRfU0VRX1ZZVVk7Ci0JCWNhc2UgTUVE SUFfQlVTX0ZNVF9ZVVlWOF8yWDg6Ci0JCWNhc2UgTUVESUFfQlVTX0ZNVF9ZVVlWOF8xWDE2Ogot CQkJcmV0dXJuIENTSV9JTlBVVF9TRVFfWVVZVjsKLQkJY2FzZSBNRURJQV9CVVNfRk1UX1lWWVU4 XzFYMTY6Ci0JCWNhc2UgTUVESUFfQlVTX0ZNVF9ZVllVOF8yWDg6Ci0JCQlyZXR1cm4gQ1NJX0lO UFVUX1NFUV9ZVllVOwotCQlkZWZhdWx0OgotCQkJZGV2X3dhcm4oc2Rldi0+ZGV2LCAiVW5zdXBw b3J0ZWQgbWJ1cyBjb2RlOiAweCV4XG4iLAotCQkJCSBtYnVzX2NvZGUpOwotCQkJYnJlYWs7Ci0J CX0KLQkJYnJlYWs7Ci0JY2FzZSBWNEwyX1BJWF9GTVRfTlYyMToKLQljYXNlIFY0TDJfUElYX0ZN VF9OVjYxOgotCWNhc2UgVjRMMl9QSVhfRk1UX1lWVTQyMDoKLQkJc3dpdGNoIChtYnVzX2NvZGUp IHsKLQkJY2FzZSBNRURJQV9CVVNfRk1UX1VZVlk4XzJYODoKLQkJY2FzZSBNRURJQV9CVVNfRk1U X1VZVlk4XzFYMTY6Ci0JCQlyZXR1cm4gQ1NJX0lOUFVUX1NFUV9WWVVZOwotCQljYXNlIE1FRElB X0JVU19GTVRfVllVWThfMlg4OgotCQljYXNlIE1FRElBX0JVU19GTVRfVllVWThfMVgxNjoKLQkJ CXJldHVybiBDU0lfSU5QVVRfU0VRX1VZVlk7Ci0JCWNhc2UgTUVESUFfQlVTX0ZNVF9ZVVlWOF8y WDg6Ci0JCWNhc2UgTUVESUFfQlVTX0ZNVF9ZVVlWOF8xWDE2OgotCQkJcmV0dXJuIENTSV9JTlBV VF9TRVFfWVZZVTsKLQkJY2FzZSBNRURJQV9CVVNfRk1UX1lWWVU4XzFYMTY6Ci0JCWNhc2UgTUVE SUFfQlVTX0ZNVF9ZVllVOF8yWDg6Ci0JCQlyZXR1cm4gQ1NJX0lOUFVUX1NFUV9ZVVlWOwotCQlk ZWZhdWx0OgotCQkJZGV2X3dhcm4oc2Rldi0+ZGV2LCAiVW5zdXBwb3J0ZWQgbWJ1cyBjb2RlOiAw eCV4XG4iLAotCQkJCSBtYnVzX2NvZGUpOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0KLQlj YXNlIFY0TDJfUElYX0ZNVF9ZVVlWOgotCQlyZXR1cm4gQ1NJX0lOUFVUX1NFUV9ZVVlWOwotCi0J ZGVmYXVsdDoKLQkJZGV2X3dhcm4oc2Rldi0+ZGV2LCAiVW5zdXBwb3J0ZWQgcGl4Zm9ybWF0OiAw eCV4LCBkZWZhdWx0aW5nIHRvIFlVWVZcbiIsCi0JCQkgcGl4Zm9ybWF0KTsKLQkJYnJlYWs7Ci0J fQotCi0JcmV0dXJuIENTSV9JTlBVVF9TRVFfWVVZVjsKLX0KLQotc3RhdGljIHZvaWQgc3VuNmlf Y3NpX3NldHVwX2J1cyhzdHJ1Y3Qgc3VuNmlfY3NpX2RldiAqc2RldikKLXsKLQlzdHJ1Y3QgdjRs Ml9md25vZGVfZW5kcG9pbnQgKmVuZHBvaW50ID0gJnNkZXYtPmNzaS52NGwyX2VwOwotCXN0cnVj dCBzdW42aV9jc2kgKmNzaSA9ICZzZGV2LT5jc2k7Ci0JdW5zaWduZWQgY2hhciBidXNfd2lkdGg7 Ci0JdTMyIGZsYWdzOwotCXUzMiBjZmc7Ci0JYm9vbCBpbnB1dF9pbnRlcmxhY2VkID0gZmFsc2U7 Ci0KLQlpZiAoY3NpLT5jb25maWcuZmllbGQgPT0gVjRMMl9GSUVMRF9JTlRFUkxBQ0VECi0JICAg IHx8IGNzaS0+Y29uZmlnLmZpZWxkID09IFY0TDJfRklFTERfSU5URVJMQUNFRF9UQgotCSAgICB8 fCBjc2ktPmNvbmZpZy5maWVsZCA9PSBWNEwyX0ZJRUxEX0lOVEVSTEFDRURfQlQpCi0JCWlucHV0 X2ludGVybGFjZWQgPSB0cnVlOwotCi0JYnVzX3dpZHRoID0gZW5kcG9pbnQtPmJ1cy5wYXJhbGxl bC5idXNfd2lkdGg7Ci0KLQlyZWdtYXBfcmVhZChzZGV2LT5yZWdtYXAsIENTSV9JRl9DRkdfUkVH LCAmY2ZnKTsKLQotCWNmZyAmPSB+KENTSV9JRl9DRkdfQ1NJX0lGX01BU0sgfCBDU0lfSUZfQ0ZH X01JUElfSUZfTUFTSyB8Ci0JCSBDU0lfSUZfQ0ZHX0lGX0RBVEFfV0lEVEhfTUFTSyB8Ci0JCSBD U0lfSUZfQ0ZHX0NMS19QT0xfTUFTSyB8IENTSV9JRl9DRkdfVlJFRl9QT0xfTUFTSyB8Ci0JCSBD U0lfSUZfQ0ZHX0hSRUZfUE9MX01BU0sgfCBDU0lfSUZfQ0ZHX0ZJRUxEX01BU0sgfAotCQkgQ1NJ X0lGX0NGR19TUkNfVFlQRV9NQVNLKTsKLQotCWlmIChpbnB1dF9pbnRlcmxhY2VkKQotCQljZmcg fD0gQ1NJX0lGX0NGR19TUkNfVFlQRV9JTlRFUkxBQ0VEOwotCWVsc2UKLQkJY2ZnIHw9IENTSV9J Rl9DRkdfU1JDX1RZUEVfUFJPR1JFU1NFRDsKLQotCXN3aXRjaCAoZW5kcG9pbnQtPmJ1c190eXBl KSB7Ci0JY2FzZSBWNEwyX01CVVNfUEFSQUxMRUw6Ci0JCWNmZyB8PSBDU0lfSUZfQ0ZHX01JUElf SUZfQ1NJOwotCi0JCWZsYWdzID0gZW5kcG9pbnQtPmJ1cy5wYXJhbGxlbC5mbGFnczsKLQotCQlj ZmcgfD0gKGJ1c193aWR0aCA9PSAxNikgPyBDU0lfSUZfQ0ZHX0NTSV9JRl9ZVVY0MjJfMTZCSVQg OgotCQkJCQkgICBDU0lfSUZfQ0ZHX0NTSV9JRl9ZVVY0MjJfSU5UTFY7Ci0KLQkJaWYgKGZsYWdz ICYgVjRMMl9NQlVTX0ZJRUxEX0VWRU5fTE9XKQotCQkJY2ZnIHw9IENTSV9JRl9DRkdfRklFTERf UE9TSVRJVkU7Ci0KLQkJaWYgKGZsYWdzICYgVjRMMl9NQlVTX1ZTWU5DX0FDVElWRV9MT1cpCi0J CQljZmcgfD0gQ1NJX0lGX0NGR19WUkVGX1BPTF9QT1NJVElWRTsKLQkJaWYgKGZsYWdzICYgVjRM Ml9NQlVTX0hTWU5DX0FDVElWRV9MT1cpCi0JCQljZmcgfD0gQ1NJX0lGX0NGR19IUkVGX1BPTF9Q T1NJVElWRTsKLQotCQlpZiAoZmxhZ3MgJiBWNEwyX01CVVNfUENMS19TQU1QTEVfUklTSU5HKQot CQkJY2ZnIHw9IENTSV9JRl9DRkdfQ0xLX1BPTF9GQUxMSU5HX0VER0U7Ci0JCWJyZWFrOwotCWNh c2UgVjRMMl9NQlVTX0JUNjU2OgotCQljZmcgfD0gQ1NJX0lGX0NGR19NSVBJX0lGX0NTSTsKLQot CQlmbGFncyA9IGVuZHBvaW50LT5idXMucGFyYWxsZWwuZmxhZ3M7Ci0KLQkJY2ZnIHw9IChidXNf d2lkdGggPT0gMTYpID8gQ1NJX0lGX0NGR19DU0lfSUZfQlQxMTIwIDoKLQkJCQkJICAgQ1NJX0lG X0NGR19DU0lfSUZfQlQ2NTY7Ci0KLQkJaWYgKGZsYWdzICYgVjRMMl9NQlVTX0ZJRUxEX0VWRU5f TE9XKQotCQkJY2ZnIHw9IENTSV9JRl9DRkdfRklFTERfUE9TSVRJVkU7Ci0KLQkJaWYgKGZsYWdz ICYgVjRMMl9NQlVTX1BDTEtfU0FNUExFX0ZBTExJTkcpCi0JCQljZmcgfD0gQ1NJX0lGX0NGR19D TEtfUE9MX0ZBTExJTkdfRURHRTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZGV2X3dhcm4oc2Rl di0+ZGV2LCAiVW5zdXBwb3J0ZWQgYnVzIHR5cGU6ICVkXG4iLAotCQkJIGVuZHBvaW50LT5idXNf dHlwZSk7Ci0JCWJyZWFrOwotCX0KLQotCXN3aXRjaCAoYnVzX3dpZHRoKSB7Ci0JY2FzZSA4Ogot CQljZmcgfD0gQ1NJX0lGX0NGR19JRl9EQVRBX1dJRFRIXzhCSVQ7Ci0JCWJyZWFrOwotCWNhc2Ug MTA6Ci0JCWNmZyB8PSBDU0lfSUZfQ0ZHX0lGX0RBVEFfV0lEVEhfMTBCSVQ7Ci0JCWJyZWFrOwot CWNhc2UgMTI6Ci0JCWNmZyB8PSBDU0lfSUZfQ0ZHX0lGX0RBVEFfV0lEVEhfMTJCSVQ7Ci0JCWJy ZWFrOwotCWNhc2UgMTY6IC8qIE5vIG5lZWQgdG8gY29uZmlndXJlIERBVEFfV0lEVEggZm9yIDE2 Yml0ICovCi0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWRldl93YXJuKHNkZXYtPmRldiwgIlVuc3Vw cG9ydGVkIGJ1cyB3aWR0aDogJXVcbiIsIGJ1c193aWR0aCk7Ci0JCWJyZWFrOwotCX0KLQotCXJl Z21hcF93cml0ZShzZGV2LT5yZWdtYXAsIENTSV9JRl9DRkdfUkVHLCBjZmcpOwotfQotCi1zdGF0 aWMgdm9pZCBzdW42aV9jc2lfc2V0X2Zvcm1hdChzdHJ1Y3Qgc3VuNmlfY3NpX2RldiAqc2RldikK LXsKLQlzdHJ1Y3Qgc3VuNmlfY3NpICpjc2kgPSAmc2Rldi0+Y3NpOwotCXUzMiBjZmc7Ci0JdTMy IHZhbDsKLQotCXJlZ21hcF9yZWFkKHNkZXYtPnJlZ21hcCwgQ1NJX0NIX0NGR19SRUcsICZjZmcp OwotCi0JY2ZnICY9IH4oQ1NJX0NIX0NGR19JTlBVVF9GTVRfTUFTSyB8Ci0JCSBDU0lfQ0hfQ0ZH X09VVFBVVF9GTVRfTUFTSyB8IENTSV9DSF9DRkdfVkZMSVBfRU4gfAotCQkgQ1NJX0NIX0NGR19I RkxJUF9FTiB8IENTSV9DSF9DRkdfRklFTERfU0VMX01BU0sgfAotCQkgQ1NJX0NIX0NGR19JTlBV VF9TRVFfTUFTSyk7Ci0KLQl2YWwgPSBnZXRfY3NpX2lucHV0X2Zvcm1hdChzZGV2LCBjc2ktPmNv bmZpZy5jb2RlLAotCQkJCSAgIGNzaS0+Y29uZmlnLnBpeGVsZm9ybWF0KTsKLQljZmcgfD0gQ1NJ X0NIX0NGR19JTlBVVF9GTVQodmFsKTsKLQotCXZhbCA9IGdldF9jc2lfb3V0cHV0X2Zvcm1hdChz ZGV2LCBjc2ktPmNvbmZpZy5waXhlbGZvcm1hdCwKLQkJCQkgICAgY3NpLT5jb25maWcuZmllbGQp OwotCWNmZyB8PSBDU0lfQ0hfQ0ZHX09VVFBVVF9GTVQodmFsKTsKLQotCXZhbCA9IGdldF9jc2lf aW5wdXRfc2VxKHNkZXYsIGNzaS0+Y29uZmlnLmNvZGUsCi0JCQkJY3NpLT5jb25maWcucGl4ZWxm b3JtYXQpOwotCWNmZyB8PSBDU0lfQ0hfQ0ZHX0lOUFVUX1NFUSh2YWwpOwotCi0JaWYgKGNzaS0+ Y29uZmlnLmZpZWxkID09IFY0TDJfRklFTERfVE9QKQotCQljZmcgfD0gQ1NJX0NIX0NGR19GSUVM RF9TRUxfRklFTEQwOwotCWVsc2UgaWYgKGNzaS0+Y29uZmlnLmZpZWxkID09IFY0TDJfRklFTERf Qk9UVE9NKQotCQljZmcgfD0gQ1NJX0NIX0NGR19GSUVMRF9TRUxfRklFTEQxOwotCWVsc2UKLQkJ Y2ZnIHw9IENTSV9DSF9DRkdfRklFTERfU0VMX0JPVEg7Ci0KLQlyZWdtYXBfd3JpdGUoc2Rldi0+ cmVnbWFwLCBDU0lfQ0hfQ0ZHX1JFRywgY2ZnKTsKLX0KLQotc3RhdGljIHZvaWQgc3VuNmlfY3Np X3NldF93aW5kb3coc3RydWN0IHN1bjZpX2NzaV9kZXYgKnNkZXYpCi17Ci0Jc3RydWN0IHN1bjZp X2NzaV9jb25maWcgKmNvbmZpZyA9ICZzZGV2LT5jc2kuY29uZmlnOwotCXUzMiBieXRlc3Blcmxp bmVfeTsKLQl1MzIgYnl0ZXNwZXJsaW5lX2M7Ci0JaW50ICpwbGFuYXJfb2Zmc2V0ID0gc2Rldi0+ cGxhbmFyX29mZnNldDsKLQl1MzIgd2lkdGggPSBjb25maWctPndpZHRoOwotCXUzMiBoZWlnaHQg PSBjb25maWctPmhlaWdodDsKLQl1MzIgaG9yX2xlbiA9IHdpZHRoOwotCi0Jc3dpdGNoIChjb25m aWctPnBpeGVsZm9ybWF0KSB7Ci0JY2FzZSBWNEwyX1BJWF9GTVRfWVVZVjoKLQljYXNlIFY0TDJf UElYX0ZNVF9ZVllVOgotCWNhc2UgVjRMMl9QSVhfRk1UX1VZVlk6Ci0JY2FzZSBWNEwyX1BJWF9G TVRfVllVWToKLQkJZGV2X2RiZyhzZGV2LT5kZXYsCi0JCQkiSG9yaXpvbnRhbCBsZW5ndGggc2hv dWxkIGJlIDIgdGltZXMgb2Ygd2lkdGggZm9yIHBhY2tlZCBZVVYgZm9ybWF0cyFcbiIpOwotCQlo b3JfbGVuID0gd2lkdGggKiAyOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0K LQlyZWdtYXBfd3JpdGUoc2Rldi0+cmVnbWFwLCBDU0lfQ0hfSFNJWkVfUkVHLAotCQkgICAgIENT SV9DSF9IU0laRV9IT1JfTEVOKGhvcl9sZW4pIHwKLQkJICAgICBDU0lfQ0hfSFNJWkVfSE9SX1NU QVJUKDApKTsKLQlyZWdtYXBfd3JpdGUoc2Rldi0+cmVnbWFwLCBDU0lfQ0hfVlNJWkVfUkVHLAot CQkgICAgIENTSV9DSF9WU0laRV9WRVJfTEVOKGhlaWdodCkgfAotCQkgICAgIENTSV9DSF9WU0la RV9WRVJfU1RBUlQoMCkpOwotCi0JcGxhbmFyX29mZnNldFswXSA9IDA7Ci0Jc3dpdGNoIChjb25m aWctPnBpeGVsZm9ybWF0KSB7Ci0JY2FzZSBWNEwyX1BJWF9GTVRfSE0xMjoKLQljYXNlIFY0TDJf UElYX0ZNVF9OVjEyOgotCWNhc2UgVjRMMl9QSVhfRk1UX05WMjE6Ci0JY2FzZSBWNEwyX1BJWF9G TVRfTlYxNjoKLQljYXNlIFY0TDJfUElYX0ZNVF9OVjYxOgotCQlieXRlc3BlcmxpbmVfeSA9IHdp ZHRoOwotCQlieXRlc3BlcmxpbmVfYyA9IHdpZHRoOwotCQlwbGFuYXJfb2Zmc2V0WzFdID0gYnl0 ZXNwZXJsaW5lX3kgKiBoZWlnaHQ7Ci0JCXBsYW5hcl9vZmZzZXRbMl0gPSAtMTsKLQkJYnJlYWs7 Ci0JY2FzZSBWNEwyX1BJWF9GTVRfWVVWNDIwOgotCWNhc2UgVjRMMl9QSVhfRk1UX1lWVTQyMDoK LQkJYnl0ZXNwZXJsaW5lX3kgPSB3aWR0aDsKLQkJYnl0ZXNwZXJsaW5lX2MgPSB3aWR0aCAvIDI7 Ci0JCXBsYW5hcl9vZmZzZXRbMV0gPSBieXRlc3BlcmxpbmVfeSAqIGhlaWdodDsKLQkJcGxhbmFy X29mZnNldFsyXSA9IHBsYW5hcl9vZmZzZXRbMV0gKwotCQkJCWJ5dGVzcGVybGluZV9jICogaGVp Z2h0IC8gMjsKLQkJYnJlYWs7Ci0JY2FzZSBWNEwyX1BJWF9GTVRfWVVWNDIyUDoKLQkJYnl0ZXNw ZXJsaW5lX3kgPSB3aWR0aDsKLQkJYnl0ZXNwZXJsaW5lX2MgPSB3aWR0aCAvIDI7Ci0JCXBsYW5h cl9vZmZzZXRbMV0gPSBieXRlc3BlcmxpbmVfeSAqIGhlaWdodDsKLQkJcGxhbmFyX29mZnNldFsy XSA9IHBsYW5hcl9vZmZzZXRbMV0gKwotCQkJCWJ5dGVzcGVybGluZV9jICogaGVpZ2h0OwotCQli cmVhazsKLQlkZWZhdWx0OiAvKiByYXcgKi8KLQkJZGV2X2RiZyhzZGV2LT5kZXYsCi0JCQkiQ2Fs Y3VsYXRpbmcgcGl4ZWxmb3JtYXQoMHgleCkncyBieXRlc3BlcmxpbmUgYXMgYSBwYWNrZWQgZm9y bWF0XG4iLAotCQkJY29uZmlnLT5waXhlbGZvcm1hdCk7Ci0JCWJ5dGVzcGVybGluZV95ID0gKHN1 bjZpX2NzaV9nZXRfYnBwKGNvbmZpZy0+cGl4ZWxmb3JtYXQpICoKLQkJCQkgIGNvbmZpZy0+d2lk dGgpIC8gODsKLQkJYnl0ZXNwZXJsaW5lX2MgPSAwOwotCQlwbGFuYXJfb2Zmc2V0WzFdID0gLTE7 Ci0JCXBsYW5hcl9vZmZzZXRbMl0gPSAtMTsKLQkJYnJlYWs7Ci0JfQotCi0JcmVnbWFwX3dyaXRl KHNkZXYtPnJlZ21hcCwgQ1NJX0NIX0JVRl9MRU5fUkVHLAotCQkgICAgIENTSV9DSF9CVUZfTEVO X0JVRl9MRU5fQyhieXRlc3BlcmxpbmVfYykgfAotCQkgICAgIENTSV9DSF9CVUZfTEVOX0JVRl9M RU5fWShieXRlc3BlcmxpbmVfeSkpOwotfQotCi1pbnQgc3VuNmlfY3NpX3VwZGF0ZV9jb25maWco c3RydWN0IHN1bjZpX2NzaSAqY3NpLAotCQkJICAgIHN0cnVjdCBzdW42aV9jc2lfY29uZmlnICpj b25maWcpCi17Ci0Jc3RydWN0IHN1bjZpX2NzaV9kZXYgKnNkZXYgPSBzdW42aV9jc2lfdG9fZGV2 KGNzaSk7Ci0KLQlpZiAoIWNvbmZpZykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltZW1jcHkoJmNz aS0+Y29uZmlnLCBjb25maWcsIHNpemVvZihjc2ktPmNvbmZpZykpOwotCi0Jc3VuNmlfY3NpX3Nl dHVwX2J1cyhzZGV2KTsKLQlzdW42aV9jc2lfc2V0X2Zvcm1hdChzZGV2KTsKLQlzdW42aV9jc2lf c2V0X3dpbmRvdyhzZGV2KTsKLQotCXJldHVybiAwOwotfQotCi12b2lkIHN1bjZpX2NzaV91cGRh dGVfYnVmX2FkZHIoc3RydWN0IHN1bjZpX2NzaSAqY3NpLCBkbWFfYWRkcl90IGFkZHIpCi17Ci0J c3RydWN0IHN1bjZpX2NzaV9kZXYgKnNkZXYgPSBzdW42aV9jc2lfdG9fZGV2KGNzaSk7Ci0KLQly ZWdtYXBfd3JpdGUoc2Rldi0+cmVnbWFwLCBDU0lfQ0hfRjBfQlVGQV9SRUcsCi0JCSAgICAgKGFk ZHIgKyBzZGV2LT5wbGFuYXJfb2Zmc2V0WzBdKSA+PiAyKTsKLQlpZiAoc2Rldi0+cGxhbmFyX29m ZnNldFsxXSAhPSAtMSkKLQkJcmVnbWFwX3dyaXRlKHNkZXYtPnJlZ21hcCwgQ1NJX0NIX0YxX0JV RkFfUkVHLAotCQkJICAgICAoYWRkciArIHNkZXYtPnBsYW5hcl9vZmZzZXRbMV0pID4+IDIpOwot CWlmIChzZGV2LT5wbGFuYXJfb2Zmc2V0WzJdICE9IC0xKQotCQlyZWdtYXBfd3JpdGUoc2Rldi0+ cmVnbWFwLCBDU0lfQ0hfRjJfQlVGQV9SRUcsCi0JCQkgICAgIChhZGRyICsgc2Rldi0+cGxhbmFy X29mZnNldFsyXSkgPj4gMik7Ci19Ci0KLXZvaWQgc3VuNmlfY3NpX3NldF9zdHJlYW0oc3RydWN0 IHN1bjZpX2NzaSAqY3NpLCBib29sIGVuYWJsZSkKLXsKLQlzdHJ1Y3Qgc3VuNmlfY3NpX2RldiAq c2RldiA9IHN1bjZpX2NzaV90b19kZXYoY3NpKTsKLQlzdHJ1Y3QgcmVnbWFwICpyZWdtYXAgPSBz ZGV2LT5yZWdtYXA7Ci0KLQlpZiAoIWVuYWJsZSkgewotCQlyZWdtYXBfdXBkYXRlX2JpdHMocmVn bWFwLCBDU0lfQ0FQX1JFRywgQ1NJX0NBUF9DSDBfVkNBUF9PTiwgMCk7Ci0JCXJlZ21hcF93cml0 ZShyZWdtYXAsIENTSV9DSF9JTlRfRU5fUkVHLCAwKTsKLQkJcmV0dXJuOwotCX0KLQotCXJlZ21h cF93cml0ZShyZWdtYXAsIENTSV9DSF9JTlRfU1RBX1JFRywgMHhGRik7Ci0JcmVnbWFwX3dyaXRl KHJlZ21hcCwgQ1NJX0NIX0lOVF9FTl9SRUcsCi0JCSAgICAgQ1NJX0NIX0lOVF9FTl9IQl9PRl9J TlRfRU4gfAotCQkgICAgIENTSV9DSF9JTlRfRU5fRklGTzJfT0ZfSU5UX0VOIHwKLQkJICAgICBD U0lfQ0hfSU5UX0VOX0ZJRk8xX09GX0lOVF9FTiB8Ci0JCSAgICAgQ1NJX0NIX0lOVF9FTl9GSUZP MF9PRl9JTlRfRU4gfAotCQkgICAgIENTSV9DSF9JTlRfRU5fRkRfSU5UX0VOIHwKLQkJICAgICBD U0lfQ0hfSU5UX0VOX0NEX0lOVF9FTik7Ci0KLQlyZWdtYXBfdXBkYXRlX2JpdHMocmVnbWFwLCBD U0lfQ0FQX1JFRywgQ1NJX0NBUF9DSDBfVkNBUF9PTiwKLQkJCSAgIENTSV9DQVBfQ0gwX1ZDQVBf T04pOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogTWVkaWEgQ29udHJvbGxlciBh bmQgVjRMMgotICovCi1zdGF0aWMgaW50IHN1bjZpX2NzaV9saW5rX2VudGl0eShzdHJ1Y3Qgc3Vu NmlfY3NpICpjc2ksCi0JCQkJIHN0cnVjdCBtZWRpYV9lbnRpdHkgKmVudGl0eSwKLQkJCQkgc3Ry dWN0IGZ3bm9kZV9oYW5kbGUgKmZ3bm9kZSkKLXsKLQlzdHJ1Y3QgbWVkaWFfZW50aXR5ICpzaW5r OwotCXN0cnVjdCBtZWRpYV9wYWQgKnNpbmtfcGFkOwotCWludCBzcmNfcGFkX2luZGV4OwotCWlu dCByZXQ7Ci0KLQlyZXQgPSBtZWRpYV9lbnRpdHlfZ2V0X2Z3bm9kZV9wYWQoZW50aXR5LCBmd25v ZGUsIE1FRElBX1BBRF9GTF9TT1VSQ0UpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoY3Np LT5kZXYsICIlczogbm8gc291cmNlIHBhZCBpbiBleHRlcm5hbCBlbnRpdHkgJXNcbiIsCi0JCQlf X2Z1bmNfXywgZW50aXR5LT5uYW1lKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0Jc3JjX3Bh ZF9pbmRleCA9IHJldDsKLQotCXNpbmsgPSAmY3NpLT52aWRlby52ZGV2LmVudGl0eTsKLQlzaW5r X3BhZCA9ICZjc2ktPnZpZGVvLnBhZDsKLQotCWRldl9kYmcoY3NpLT5kZXYsICJjcmVhdGluZyAl czoldSAtPiAlczoldSBsaW5rXG4iLAotCQllbnRpdHktPm5hbWUsIHNyY19wYWRfaW5kZXgsIHNp bmstPm5hbWUsIHNpbmtfcGFkLT5pbmRleCk7Ci0JcmV0ID0gbWVkaWFfY3JlYXRlX3BhZF9saW5r KGVudGl0eSwgc3JjX3BhZF9pbmRleCwgc2luaywKLQkJCQkgICAgc2lua19wYWQtPmluZGV4LAot CQkJCSAgICBNRURJQV9MTktfRkxfRU5BQkxFRCB8Ci0JCQkJICAgIE1FRElBX0xOS19GTF9JTU1V VEFCTEUpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoY3NpLT5kZXYsICJmYWlsZWQgdG8g Y3JlYXRlICVzOiV1IC0+ICVzOiV1IGxpbmtcbiIsCi0JCQllbnRpdHktPm5hbWUsIHNyY19wYWRf aW5kZXgsCi0JCQlzaW5rLT5uYW1lLCBzaW5rX3BhZC0+aW5kZXgpOwotCQlyZXR1cm4gcmV0Owot CX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHN1bjZpX3N1YmRldl9ub3RpZnlfY29t cGxldGUoc3RydWN0IHY0bDJfYXN5bmNfbm90aWZpZXIgKm5vdGlmaWVyKQotewotCXN0cnVjdCBz dW42aV9jc2kgKmNzaSA9IGNvbnRhaW5lcl9vZihub3RpZmllciwgc3RydWN0IHN1bjZpX2NzaSwK LQkJCQkJICAgICBub3RpZmllcik7Ci0Jc3RydWN0IHY0bDJfZGV2aWNlICp2NGwyX2RldiA9ICZj c2ktPnY0bDJfZGV2OwotCXN0cnVjdCB2NGwyX3N1YmRldiAqc2Q7Ci0JaW50IHJldDsKLQotCWRl dl9kYmcoY3NpLT5kZXYsICJub3RpZnkgY29tcGxldGUsIGFsbCBzdWJkZXZzIHJlZ2lzdGVyZWRc biIpOwotCi0Jc2QgPSBsaXN0X2ZpcnN0X2VudHJ5KCZ2NGwyX2Rldi0+c3ViZGV2cywgc3RydWN0 IHY0bDJfc3ViZGV2LCBsaXN0KTsKLQlpZiAoIXNkKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJl dCA9IHN1bjZpX2NzaV9saW5rX2VudGl0eShjc2ksICZzZC0+ZW50aXR5LCBzZC0+Zndub2RlKTsK LQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IHY0bDJfZGV2aWNlX3JlZ2lz dGVyX3N1YmRldl9ub2RlcygmY3NpLT52NGwyX2Rldik7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVy biByZXQ7Ci0KLQlyZXR1cm4gbWVkaWFfZGV2aWNlX3JlZ2lzdGVyKCZjc2ktPm1lZGlhX2Rldik7 Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9hc3luY19ub3RpZmllcl9vcGVyYXRpb25z IHN1bjZpX2NzaV9hc3luY19vcHMgPSB7Ci0JLmNvbXBsZXRlID0gc3VuNmlfc3ViZGV2X25vdGlm eV9jb21wbGV0ZSwKLX07Ci0KLXN0YXRpYyBpbnQgc3VuNmlfY3NpX2Z3bm9kZV9wYXJzZShzdHJ1 Y3QgZGV2aWNlICpkZXYsCi0JCQkJICBzdHJ1Y3QgdjRsMl9md25vZGVfZW5kcG9pbnQgKnZlcCwK LQkJCQkgIHN0cnVjdCB2NGwyX2FzeW5jX3N1YmRldiAqYXNkKQotewotCXN0cnVjdCBzdW42aV9j c2kgKmNzaSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCi0JaWYgKHZlcC0+YmFzZS5wb3J0IHx8 IHZlcC0+YmFzZS5pZCkgewotCQlkZXZfd2FybihkZXYsICJPbmx5IHN1cHBvcnQgYSBzaW5nbGUg cG9ydCB3aXRoIG9uZSBlbmRwb2ludFxuIik7Ci0JCXJldHVybiAtRU5PVENPTk47Ci0JfQotCi0J c3dpdGNoICh2ZXAtPmJ1c190eXBlKSB7Ci0JY2FzZSBWNEwyX01CVVNfUEFSQUxMRUw6Ci0JY2Fz ZSBWNEwyX01CVVNfQlQ2NTY6Ci0JCWNzaS0+djRsMl9lcCA9ICp2ZXA7Ci0JCXJldHVybiAwOwot CWRlZmF1bHQ6Ci0JCWRldl9lcnIoZGV2LCAiVW5zdXBwb3J0ZWQgbWVkaWEgYnVzIHR5cGVcbiIp OwotCQlyZXR1cm4gLUVOT1RDT05OOwotCX0KLX0KLQotc3RhdGljIHZvaWQgc3VuNmlfY3NpX3Y0 bDJfY2xlYW51cChzdHJ1Y3Qgc3VuNmlfY3NpICpjc2kpCi17Ci0JbWVkaWFfZGV2aWNlX3VucmVn aXN0ZXIoJmNzaS0+bWVkaWFfZGV2KTsKLQl2NGwyX2FzeW5jX25vdGlmaWVyX3VucmVnaXN0ZXIo JmNzaS0+bm90aWZpZXIpOwotCXY0bDJfYXN5bmNfbm90aWZpZXJfY2xlYW51cCgmY3NpLT5ub3Rp Zmllcik7Ci0Jc3VuNmlfdmlkZW9fY2xlYW51cCgmY3NpLT52aWRlbyk7Ci0JdjRsMl9kZXZpY2Vf dW5yZWdpc3RlcigmY3NpLT52NGwyX2Rldik7Ci0JdjRsMl9jdHJsX2hhbmRsZXJfZnJlZSgmY3Np LT5jdHJsX2hhbmRsZXIpOwotCW1lZGlhX2RldmljZV9jbGVhbnVwKCZjc2ktPm1lZGlhX2Rldik7 Ci19Ci0KLXN0YXRpYyBpbnQgc3VuNmlfY3NpX3Y0bDJfaW5pdChzdHJ1Y3Qgc3VuNmlfY3NpICpj c2kpCi17Ci0JaW50IHJldDsKLQotCWNzaS0+bWVkaWFfZGV2LmRldiA9IGNzaS0+ZGV2OwotCXN0 cnNjcHkoY3NpLT5tZWRpYV9kZXYubW9kZWwsICJBbGx3aW5uZXIgVmlkZW8gQ2FwdHVyZSBEZXZp Y2UiLAotCQlzaXplb2YoY3NpLT5tZWRpYV9kZXYubW9kZWwpKTsKLQljc2ktPm1lZGlhX2Rldi5o d19yZXZpc2lvbiA9IDA7Ci0Jc25wcmludGYoY3NpLT5tZWRpYV9kZXYuYnVzX2luZm8sIHNpemVv Zihjc2ktPm1lZGlhX2Rldi5idXNfaW5mbyksCi0JCSAicGxhdGZvcm06JXMiLCBkZXZfbmFtZShj c2ktPmRldikpOwotCi0JbWVkaWFfZGV2aWNlX2luaXQoJmNzaS0+bWVkaWFfZGV2KTsKLQl2NGwy X2FzeW5jX25vdGlmaWVyX2luaXQoJmNzaS0+bm90aWZpZXIpOwotCi0JcmV0ID0gdjRsMl9jdHJs X2hhbmRsZXJfaW5pdCgmY3NpLT5jdHJsX2hhbmRsZXIsIDApOwotCWlmIChyZXQpIHsKLQkJZGV2 X2Vycihjc2ktPmRldiwgIlY0TDIgY29udHJvbHMgaGFuZGxlciBpbml0IGZhaWxlZCAoJWQpXG4i LAotCQkJcmV0KTsKLQkJZ290byBjbGVhbl9tZWRpYTsKLQl9Ci0KLQljc2ktPnY0bDJfZGV2Lm1k ZXYgPSAmY3NpLT5tZWRpYV9kZXY7Ci0JY3NpLT52NGwyX2Rldi5jdHJsX2hhbmRsZXIgPSAmY3Np LT5jdHJsX2hhbmRsZXI7Ci0JcmV0ID0gdjRsMl9kZXZpY2VfcmVnaXN0ZXIoY3NpLT5kZXYsICZj c2ktPnY0bDJfZGV2KTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoY3NpLT5kZXYsICJWNEwyIGRl dmljZSByZWdpc3RyYXRpb24gZmFpbGVkICglZClcbiIsCi0JCQlyZXQpOwotCQlnb3RvIGZyZWVf Y3RybDsKLQl9Ci0KLQlyZXQgPSBzdW42aV92aWRlb19pbml0KCZjc2ktPnZpZGVvLCBjc2ksICJz dW42aS1jc2kiKTsKLQlpZiAocmV0KQotCQlnb3RvIHVucmVnX3Y0bDI7Ci0KLQlyZXQgPSB2NGwy X2FzeW5jX25vdGlmaWVyX3BhcnNlX2Z3bm9kZV9lbmRwb2ludHMoY3NpLT5kZXYsCi0JCQkJCQkJ ICZjc2ktPm5vdGlmaWVyLAotCQkJCQkJCSBzaXplb2Yoc3RydWN0IHY0bDJfYXN5bmNfc3ViZGV2 KSwKLQkJCQkJCQkgc3VuNmlfY3NpX2Z3bm9kZV9wYXJzZSk7Ci0JaWYgKHJldCkKLQkJZ290byBj bGVhbl92aWRlbzsKLQotCWNzaS0+bm90aWZpZXIub3BzID0gJnN1bjZpX2NzaV9hc3luY19vcHM7 Ci0KLQlyZXQgPSB2NGwyX2FzeW5jX25vdGlmaWVyX3JlZ2lzdGVyKCZjc2ktPnY0bDJfZGV2LCAm Y3NpLT5ub3RpZmllcik7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKGNzaS0+ZGV2LCAibm90aWZp ZXIgcmVnaXN0cmF0aW9uIGZhaWxlZFxuIik7Ci0JCWdvdG8gY2xlYW5fdmlkZW87Ci0JfQotCi0J cmV0dXJuIDA7Ci0KLWNsZWFuX3ZpZGVvOgotCXN1bjZpX3ZpZGVvX2NsZWFudXAoJmNzaS0+dmlk ZW8pOwotdW5yZWdfdjRsMjoKLQl2NGwyX2RldmljZV91bnJlZ2lzdGVyKCZjc2ktPnY0bDJfZGV2 KTsKLWZyZWVfY3RybDoKLQl2NGwyX2N0cmxfaGFuZGxlcl9mcmVlKCZjc2ktPmN0cmxfaGFuZGxl cik7Ci1jbGVhbl9tZWRpYToKLQl2NGwyX2FzeW5jX25vdGlmaWVyX2NsZWFudXAoJmNzaS0+bm90 aWZpZXIpOwotCW1lZGlhX2RldmljZV9jbGVhbnVwKCZjc2ktPm1lZGlhX2Rldik7Ci0KLQlyZXR1 cm4gcmV0OwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogUmVzb3VyY2VzIGFuZCBJ UlEKLSAqLwotc3RhdGljIGlycXJldHVybl90IHN1bjZpX2NzaV9pc3IoaW50IGlycSwgdm9pZCAq ZGV2X2lkKQotewotCXN0cnVjdCBzdW42aV9jc2lfZGV2ICpzZGV2ID0gKHN0cnVjdCBzdW42aV9j c2lfZGV2ICopZGV2X2lkOwotCXN0cnVjdCByZWdtYXAgKnJlZ21hcCA9IHNkZXYtPnJlZ21hcDsK LQl1MzIgc3RhdHVzOwotCi0JcmVnbWFwX3JlYWQocmVnbWFwLCBDU0lfQ0hfSU5UX1NUQV9SRUcs ICZzdGF0dXMpOwotCi0JaWYgKCEoc3RhdHVzICYgMHhGRikpCi0JCXJldHVybiBJUlFfTk9ORTsK LQotCWlmICgoc3RhdHVzICYgQ1NJX0NIX0lOVF9TVEFfRklGTzBfT0ZfUEQpIHx8Ci0JICAgIChz dGF0dXMgJiBDU0lfQ0hfSU5UX1NUQV9GSUZPMV9PRl9QRCkgfHwKLQkgICAgKHN0YXR1cyAmIENT SV9DSF9JTlRfU1RBX0ZJRk8yX09GX1BEKSB8fAotCSAgICAoc3RhdHVzICYgQ1NJX0NIX0lOVF9T VEFfSEJfT0ZfUEQpKSB7Ci0JCXJlZ21hcF93cml0ZShyZWdtYXAsIENTSV9DSF9JTlRfU1RBX1JF Rywgc3RhdHVzKTsKLQkJcmVnbWFwX3VwZGF0ZV9iaXRzKHJlZ21hcCwgQ1NJX0VOX1JFRywgQ1NJ X0VOX0NTSV9FTiwgMCk7Ci0JCXJlZ21hcF91cGRhdGVfYml0cyhyZWdtYXAsIENTSV9FTl9SRUcs IENTSV9FTl9DU0lfRU4sCi0JCQkJICAgQ1NJX0VOX0NTSV9FTik7Ci0JCXJldHVybiBJUlFfSEFO RExFRDsKLQl9Ci0KLQlpZiAoc3RhdHVzICYgQ1NJX0NIX0lOVF9TVEFfRkRfUEQpCi0JCXN1bjZp X3ZpZGVvX2ZyYW1lX2RvbmUoJnNkZXYtPmNzaS52aWRlbyk7Ci0KLQlyZWdtYXBfd3JpdGUocmVn bWFwLCBDU0lfQ0hfSU5UX1NUQV9SRUcsIHN0YXR1cyk7Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7 Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBzdW42aV9jc2lfcmVnbWFw X2NvbmZpZyA9IHsKLQkucmVnX2JpdHMgICAgICAgPSAzMiwKLQkucmVnX3N0cmlkZSAgICAgPSA0 LAotCS52YWxfYml0cyAgICAgICA9IDMyLAotCS5tYXhfcmVnaXN0ZXIJPSAweDljLAotfTsKLQot c3RhdGljIGludCBzdW42aV9jc2lfcmVzb3VyY2VfcmVxdWVzdChzdHJ1Y3Qgc3VuNmlfY3NpX2Rl diAqc2RldiwKLQkJCQkgICAgICBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0 cnVjdCByZXNvdXJjZSAqcmVzOwotCXZvaWQgX19pb21lbSAqaW9fYmFzZTsKLQlpbnQgcmV0Owot CWludCBpcnE7Ci0KLQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJD RV9NRU0sIDApOwotCWlvX2Jhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwg cmVzKTsKLQlpZiAoSVNfRVJSKGlvX2Jhc2UpKQotCQlyZXR1cm4gUFRSX0VSUihpb19iYXNlKTsK LQotCXNkZXYtPnJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfbW1pb19jbGsoJnBkZXYtPmRldiwg ImJ1cyIsIGlvX2Jhc2UsCi0JCQkJCQkgJnN1bjZpX2NzaV9yZWdtYXBfY29uZmlnKTsKLQlpZiAo SVNfRVJSKHNkZXYtPnJlZ21hcCkpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRv IGluaXQgcmVnaXN0ZXIgbWFwXG4iKTsKLQkJcmV0dXJuIFBUUl9FUlIoc2Rldi0+cmVnbWFwKTsK LQl9Ci0KLQlzZGV2LT5jbGtfbW9kID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJtb2QiKTsK LQlpZiAoSVNfRVJSKHNkZXYtPmNsa19tb2QpKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIlVu YWJsZSB0byBhY3F1aXJlIGNzaSBjbG9ja1xuIik7Ci0JCXJldHVybiBQVFJfRVJSKHNkZXYtPmNs a19tb2QpOwotCX0KLQotCXNkZXYtPmNsa19yYW0gPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwg InJhbSIpOwotCWlmIChJU19FUlIoc2Rldi0+Y2xrX3JhbSkpIHsKLQkJZGV2X2VycigmcGRldi0+ ZGV2LCAiVW5hYmxlIHRvIGFjcXVpcmUgZHJhbS1jc2kgY2xvY2tcbiIpOwotCQlyZXR1cm4gUFRS X0VSUihzZGV2LT5jbGtfcmFtKTsKLQl9Ci0KLQlzZGV2LT5yc3RjX2J1cyA9IGRldm1fcmVzZXRf Y29udHJvbF9nZXRfc2hhcmVkKCZwZGV2LT5kZXYsIE5VTEwpOwotCWlmIChJU19FUlIoc2Rldi0+ cnN0Y19idXMpKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbm5vdCBnZXQgcmVzZXQgY29u dHJvbGxlclxuIik7Ci0JCXJldHVybiBQVFJfRVJSKHNkZXYtPnJzdGNfYnVzKTsKLQl9Ci0KLQlp cnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOwotCWlmIChpcnEgPCAwKQotCQlyZXR1cm4g LUVOWElPOwotCi0JcmV0ID0gZGV2bV9yZXF1ZXN0X2lycSgmcGRldi0+ZGV2LCBpcnEsIHN1bjZp X2NzaV9pc3IsIDAsIE1PRFVMRV9OQU1FLAotCQkJICAgICAgIHNkZXYpOwotCWlmIChyZXQpIHsK LQkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2Fubm90IHJlcXVlc3QgY3NpIElSUVxuIik7Ci0JCXJl dHVybiByZXQ7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc3VuNmlfY3NpX3By b2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IHN1bjZpX2NzaV9k ZXYgKnNkZXY7Ci0JaW50IHJldDsKLQotCXNkZXYgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwg c2l6ZW9mKCpzZGV2KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzZGV2KQotCQlyZXR1cm4gLUVOT01F TTsKLQotCXNkZXYtPmRldiA9ICZwZGV2LT5kZXY7Ci0KLQlyZXQgPSBzdW42aV9jc2lfcmVzb3Vy Y2VfcmVxdWVzdChzZGV2LCBwZGV2KTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JcGxh dGZvcm1fc2V0X2RydmRhdGEocGRldiwgc2Rldik7Ci0KLQlzZGV2LT5jc2kuZGV2ID0gJnBkZXYt PmRldjsKLQlyZXR1cm4gc3VuNmlfY3NpX3Y0bDJfaW5pdCgmc2Rldi0+Y3NpKTsKLX0KLQotc3Rh dGljIGludCBzdW42aV9jc2lfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17 Ci0Jc3RydWN0IHN1bjZpX2NzaV9kZXYgKnNkZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2 KTsKLQotCXN1bjZpX2NzaV92NGwyX2NsZWFudXAoJnNkZXYtPmNzaSk7Ci0KLQlyZXR1cm4gMDsK LX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc3VuNmlfY3NpX29mX21hdGNo W10gPSB7Ci0JeyAuY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNmktYTMxLWNzaSIsIH0sCi0J eyAuY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuOGktYTgzdC1jc2kiLCB9LAotCXsgLmNvbXBh dGlibGUgPSAiYWxsd2lubmVyLHN1bjhpLWgzLWNzaSIsIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJh bGx3aW5uZXIsc3VuOGktdjNzLWNzaSIsIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIs c3VuNTBpLWE2NC1jc2kiLCB9LAotCXt9LAotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHN1 bjZpX2NzaV9vZl9tYXRjaCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHN1bjZp X2NzaV9wbGF0Zm9ybV9kcml2ZXIgPSB7Ci0JLnByb2JlID0gc3VuNmlfY3NpX3Byb2JlLAotCS5y ZW1vdmUgPSBzdW42aV9jc2lfcmVtb3ZlLAotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gTU9EVUxF X05BTUUsCi0JCS5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX3B0cihzdW42aV9jc2lfb2ZfbWF0 Y2gpLAotCX0sCi19OwotbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihzdW42aV9jc2lfcGxhdGZvcm1f ZHJpdmVyKTsKLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJBbGx3aW5uZXIgVjNzIENhbWVyYSBTZW5z b3IgSW50ZXJmYWNlIGRyaXZlciIpOwotTU9EVUxFX0FVVEhPUigiWW9uZyBEZW5nIDx5b25nLmRl bmdAbWFnZXdlbGwuY29tPiIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEv ZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zdW54aS9zdW42aS1jc2kvc3VuNmlfY3NpLmggYi9kcml2 ZXJzL21lZGlhL3BsYXRmb3JtL3N1bnhpL3N1bjZpLWNzaS9zdW42aV9jc2kuaApkZWxldGVkIGZp bGUgbW9kZSAxMDA2NDQKaW5kZXggYzYyNjgyMWFhZWRiLi4wMDAwMDAwMDAwMDAKLS0tIGEvZHJp dmVycy9tZWRpYS9wbGF0Zm9ybS9zdW54aS9zdW42aS1jc2kvc3VuNmlfY3NpLmgKKysrIC9kZXYv bnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0y LjArICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTggTWFnZXdlbGwgRWxlY3Ryb25p Y3MgQ28uLCBMdGQuIChOYW5qaW5nKQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIEF1dGhv cjogWW9uZyBEZW5nIDx5b25nLmRlbmdAbWFnZXdlbGwuY29tPgotICovCi0KLSNpZm5kZWYgX19T VU42SV9DU0lfSF9fCi0jZGVmaW5lIF9fU1VONklfQ1NJX0hfXwotCi0jaW5jbHVkZSA8bWVkaWEv djRsMi1jdHJscy5oPgotI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+Ci0jaW5jbHVkZSA8 bWVkaWEvdjRsMi1md25vZGUuaD4KLQotI2luY2x1ZGUgInN1bjZpX3ZpZGVvLmgiCi0KLXN0cnVj dCBzdW42aV9jc2k7Ci0KLS8qKgotICogc3RydWN0IHN1bjZpX2NzaV9jb25maWcgLSBjb25maWdz IGZvciBzdW42aSBjc2kKLSAqIEBwaXhlbGZvcm1hdDogdjRsMiBwaXhlbCBmb3JtYXQgKFY0TDJf UElYX0ZNVF8qKQotICogQGNvZGU6CW1lZGlhIGJ1cyBmb3JtYXQgY29kZSAoTUVESUFfQlVTX0ZN VF8qKQotICogQGZpZWxkOgl1c2VkIGludGVybGFjaW5nIHR5cGUgKGVudW0gdjRsMl9maWVsZCkK LSAqIEB3aWR0aDoJZnJhbWUgd2lkdGgKLSAqIEBoZWlnaHQ6CWZyYW1lIGhlaWdodAotICovCi1z dHJ1Y3Qgc3VuNmlfY3NpX2NvbmZpZyB7Ci0JdTMyCQlwaXhlbGZvcm1hdDsKLQl1MzIJCWNvZGU7 Ci0JdTMyCQlmaWVsZDsKLQl1MzIJCXdpZHRoOwotCXUzMgkJaGVpZ2h0OwotfTsKLQotc3RydWN0 IHN1bjZpX2NzaSB7Ci0Jc3RydWN0IGRldmljZQkJCSpkZXY7Ci0Jc3RydWN0IHY0bDJfY3RybF9o YW5kbGVyCWN0cmxfaGFuZGxlcjsKLQlzdHJ1Y3QgdjRsMl9kZXZpY2UJCXY0bDJfZGV2OwotCXN0 cnVjdCBtZWRpYV9kZXZpY2UJCW1lZGlhX2RldjsKLQotCXN0cnVjdCB2NGwyX2FzeW5jX25vdGlm aWVyCW5vdGlmaWVyOwotCi0JLyogdmlkZW8gcG9ydCBzZXR0aW5ncyAqLwotCXN0cnVjdCB2NGwy X2Z3bm9kZV9lbmRwb2ludAl2NGwyX2VwOwotCi0Jc3RydWN0IHN1bjZpX2NzaV9jb25maWcJCWNv bmZpZzsKLQotCXN0cnVjdCBzdW42aV92aWRlbwkJdmlkZW87Ci19OwotCi0vKioKLSAqIHN1bjZp X2NzaV9pc19mb3JtYXRfc3VwcG9ydGVkKCkgLSBjaGVjayBpZiB0aGUgZm9ybWF0IHN1cHBvcnRl ZCBieSBjc2kKLSAqIEBjc2k6CXBvaW50ZXIgdG8gdGhlIGNzaQotICogQHBpeGZvcm1hdDoJdjRs MiBwaXhlbCBmb3JtYXQgKFY0TDJfUElYX0ZNVF8qKQotICogQG1idXNfY29kZToJbWVkaWEgYnVz IGZvcm1hdCBjb2RlIChNRURJQV9CVVNfRk1UXyopCi0gKi8KLWJvb2wgc3VuNmlfY3NpX2lzX2Zv cm1hdF9zdXBwb3J0ZWQoc3RydWN0IHN1bjZpX2NzaSAqY3NpLCB1MzIgcGl4Zm9ybWF0LAotCQkJ CSAgIHUzMiBtYnVzX2NvZGUpOwotCi0vKioKLSAqIHN1bjZpX2NzaV9zZXRfcG93ZXIoKSAtIHBv d2VyIG9uL29mZiB0aGUgY3NpCi0gKiBAY3NpOglwb2ludGVyIHRvIHRoZSBjc2kKLSAqIEBlbmFi bGU6CW9uL29mZgotICovCi1pbnQgc3VuNmlfY3NpX3NldF9wb3dlcihzdHJ1Y3Qgc3VuNmlfY3Np ICpjc2ksIGJvb2wgZW5hYmxlKTsKLQotLyoqCi0gKiBzdW42aV9jc2lfdXBkYXRlX2NvbmZpZygp IC0gdXBkYXRlIHRoZSBjc2kgcmVnaXN0ZXIgc2V0dGluZ3MKLSAqIEBjc2k6CXBvaW50ZXIgdG8g dGhlIGNzaQotICogQGNvbmZpZzoJc2VlIHN0cnVjdCBzdW42aV9jc2lfY29uZmlnCi0gKi8KLWlu dCBzdW42aV9jc2lfdXBkYXRlX2NvbmZpZyhzdHJ1Y3Qgc3VuNmlfY3NpICpjc2ksCi0JCQkgICAg c3RydWN0IHN1bjZpX2NzaV9jb25maWcgKmNvbmZpZyk7Ci0KLS8qKgotICogc3VuNmlfY3NpX3Vw ZGF0ZV9idWZfYWRkcigpIC0gdXBkYXRlIHRoZSBjc2kgZnJhbWUgYnVmZmVyIGFkZHJlc3MKLSAq IEBjc2k6CXBvaW50ZXIgdG8gdGhlIGNzaQotICogQGFkZHI6CWZyYW1lIGJ1ZmZlcidzIHBoeXNp Y2FsIGFkZHJlc3MKLSAqLwotdm9pZCBzdW42aV9jc2lfdXBkYXRlX2J1Zl9hZGRyKHN0cnVjdCBz dW42aV9jc2kgKmNzaSwgZG1hX2FkZHJfdCBhZGRyKTsKLQotLyoqCi0gKiBzdW42aV9jc2lfc2V0 X3N0cmVhbSgpIC0gc3RhcnQvc3RvcCBjc2kgc3RyZWFtaW5nCi0gKiBAY3NpOglwb2ludGVyIHRv IHRoZSBjc2kKLSAqIEBlbmFibGU6CXN0YXJ0L3N0b3AKLSAqLwotdm9pZCBzdW42aV9jc2lfc2V0 X3N0cmVhbShzdHJ1Y3Qgc3VuNmlfY3NpICpjc2ksIGJvb2wgZW5hYmxlKTsKLQotLyogZ2V0IGJw cCBmb3JtIHY0bDIgcGl4Zm9ybWF0ICovCi1zdGF0aWMgaW5saW5lIGludCBzdW42aV9jc2lfZ2V0 X2JwcCh1bnNpZ25lZCBpbnQgcGl4Zm9ybWF0KQotewotCXN3aXRjaCAocGl4Zm9ybWF0KSB7Ci0J Y2FzZSBWNEwyX1BJWF9GTVRfU0JHR1I4OgotCWNhc2UgVjRMMl9QSVhfRk1UX1NHQlJHODoKLQlj YXNlIFY0TDJfUElYX0ZNVF9TR1JCRzg6Ci0JY2FzZSBWNEwyX1BJWF9GTVRfU1JHR0I4OgotCWNh c2UgVjRMMl9QSVhfRk1UX0pQRUc6Ci0JCXJldHVybiA4OwotCWNhc2UgVjRMMl9QSVhfRk1UX1NC R0dSMTA6Ci0JY2FzZSBWNEwyX1BJWF9GTVRfU0dCUkcxMDoKLQljYXNlIFY0TDJfUElYX0ZNVF9T R1JCRzEwOgotCWNhc2UgVjRMMl9QSVhfRk1UX1NSR0dCMTA6Ci0JCXJldHVybiAxMDsKLQljYXNl IFY0TDJfUElYX0ZNVF9TQkdHUjEyOgotCWNhc2UgVjRMMl9QSVhfRk1UX1NHQlJHMTI6Ci0JY2Fz ZSBWNEwyX1BJWF9GTVRfU0dSQkcxMjoKLQljYXNlIFY0TDJfUElYX0ZNVF9TUkdHQjEyOgotCWNh c2UgVjRMMl9QSVhfRk1UX0hNMTI6Ci0JY2FzZSBWNEwyX1BJWF9GTVRfTlYxMjoKLQljYXNlIFY0 TDJfUElYX0ZNVF9OVjIxOgotCWNhc2UgVjRMMl9QSVhfRk1UX1lVVjQyMDoKLQljYXNlIFY0TDJf UElYX0ZNVF9ZVlU0MjA6Ci0JCXJldHVybiAxMjsKLQljYXNlIFY0TDJfUElYX0ZNVF9ZVVlWOgot CWNhc2UgVjRMMl9QSVhfRk1UX1lWWVU6Ci0JY2FzZSBWNEwyX1BJWF9GTVRfVVlWWToKLQljYXNl IFY0TDJfUElYX0ZNVF9WWVVZOgotCWNhc2UgVjRMMl9QSVhfRk1UX05WMTY6Ci0JY2FzZSBWNEwy X1BJWF9GTVRfTlY2MToKLQljYXNlIFY0TDJfUElYX0ZNVF9ZVVY0MjJQOgotCWNhc2UgVjRMMl9Q SVhfRk1UX1JHQjU2NToKLQljYXNlIFY0TDJfUElYX0ZNVF9SR0I1NjVYOgotCQlyZXR1cm4gMTY7 Ci0JY2FzZSBWNEwyX1BJWF9GTVRfUkdCMjQ6Ci0JY2FzZSBWNEwyX1BJWF9GTVRfQkdSMjQ6Ci0J CXJldHVybiAyNDsKLQljYXNlIFY0TDJfUElYX0ZNVF9SR0IzMjoKLQljYXNlIFY0TDJfUElYX0ZN VF9CR1IzMjoKLQkJcmV0dXJuIDMyOwotCWRlZmF1bHQ6Ci0JCVdBUk4oMSwgIlVuc3VwcG9ydGVk IHBpeGZvcm1hdDogMHgleFxuIiwgcGl4Zm9ybWF0KTsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJu IDA7Ci19Ci0KLSNlbmRpZiAvKiBfX1NVTjZJX0NTSV9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZl cnMvbWVkaWEvcGxhdGZvcm0vc3VueGkvc3VuNmktY3NpL3N1bjZpX2NzaV9yZWcuaCBiL2RyaXZl cnMvbWVkaWEvcGxhdGZvcm0vc3VueGkvc3VuNmktY3NpL3N1bjZpX2NzaV9yZWcuaApkZWxldGVk IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzAzZmExNGJiMzEzLi4wMDAwMDAwMDAwMDAKLS0tIGEv ZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zdW54aS9zdW42aS1jc2kvc3VuNmlfY3NpX3JlZy5oCisr KyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVy OiBHUEwtMi4wKyAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMS0yMDE4IE1hZ2V3ZWxsIEVs ZWN0cm9uaWNzIENvLiwgTHRkLiAoTmFuamluZykKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0g KiBBdXRob3I6IFlvbmcgRGVuZyA8eW9uZy5kZW5nQG1hZ2V3ZWxsLmNvbT4KLSAqLwotCi0jaWZu ZGVmIF9fU1VONklfQ1NJX1JFR19IX18KLSNkZWZpbmUgX19TVU42SV9DU0lfUkVHX0hfXwotCi0j aW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0KLSNkZWZpbmUgQ1NJX0VOX1JFRwkJCTB4MAotI2Rl ZmluZSBDU0lfRU5fVkVSX0VOCQkJCUJJVCgzMCkKLSNkZWZpbmUgQ1NJX0VOX0NTSV9FTgkJCQlC SVQoMCkKLQotI2RlZmluZSBDU0lfSUZfQ0ZHX1JFRwkJCTB4NAotI2RlZmluZSBDU0lfSUZfQ0ZH X1NSQ19UWVBFX01BU0sJCUJJVCgyMSkKLSNkZWZpbmUgQ1NJX0lGX0NGR19TUkNfVFlQRV9QUk9H UkVTU0VECQkoKDAgPDwgMjEpICYgQ1NJX0lGX0NGR19TUkNfVFlQRV9NQVNLKQotI2RlZmluZSBD U0lfSUZfQ0ZHX1NSQ19UWVBFX0lOVEVSTEFDRUQJCSgoMSA8PCAyMSkgJiBDU0lfSUZfQ0ZHX1NS Q19UWVBFX01BU0spCi0jZGVmaW5lIENTSV9JRl9DRkdfRlBTX0RTX0VOCQkJQklUKDIwKQotI2Rl ZmluZSBDU0lfSUZfQ0ZHX0ZJRUxEX01BU0sJCQlCSVQoMTkpCi0jZGVmaW5lIENTSV9JRl9DRkdf RklFTERfTkVHQVRJVkUJCSgoMCA8PCAxOSkgJiBDU0lfSUZfQ0ZHX0ZJRUxEX01BU0spCi0jZGVm aW5lIENTSV9JRl9DRkdfRklFTERfUE9TSVRJVkUJCSgoMSA8PCAxOSkgJiBDU0lfSUZfQ0ZHX0ZJ RUxEX01BU0spCi0jZGVmaW5lIENTSV9JRl9DRkdfVlJFRl9QT0xfTUFTSwkJQklUKDE4KQotI2Rl ZmluZSBDU0lfSUZfQ0ZHX1ZSRUZfUE9MX05FR0FUSVZFCQkoKDAgPDwgMTgpICYgQ1NJX0lGX0NG R19WUkVGX1BPTF9NQVNLKQotI2RlZmluZSBDU0lfSUZfQ0ZHX1ZSRUZfUE9MX1BPU0lUSVZFCQko KDEgPDwgMTgpICYgQ1NJX0lGX0NGR19WUkVGX1BPTF9NQVNLKQotI2RlZmluZSBDU0lfSUZfQ0ZH X0hSRUZfUE9MX01BU0sJCUJJVCgxNykKLSNkZWZpbmUgQ1NJX0lGX0NGR19IUkVGX1BPTF9ORUdB VElWRQkJKCgwIDw8IDE3KSAmIENTSV9JRl9DRkdfSFJFRl9QT0xfTUFTSykKLSNkZWZpbmUgQ1NJ X0lGX0NGR19IUkVGX1BPTF9QT1NJVElWRQkJKCgxIDw8IDE3KSAmIENTSV9JRl9DRkdfSFJFRl9Q T0xfTUFTSykKLSNkZWZpbmUgQ1NJX0lGX0NGR19DTEtfUE9MX01BU0sJCQlCSVQoMTYpCi0jZGVm aW5lIENTSV9JRl9DRkdfQ0xLX1BPTF9SSVNJTkdfRURHRQkJKCgwIDw8IDE2KSAmIENTSV9JRl9D RkdfQ0xLX1BPTF9NQVNLKQotI2RlZmluZSBDU0lfSUZfQ0ZHX0NMS19QT0xfRkFMTElOR19FREdF CQkoKDEgPDwgMTYpICYgQ1NJX0lGX0NGR19DTEtfUE9MX01BU0spCi0jZGVmaW5lIENTSV9JRl9D RkdfSUZfREFUQV9XSURUSF9NQVNLCQlHRU5NQVNLKDEwLCA4KQotI2RlZmluZSBDU0lfSUZfQ0ZH X0lGX0RBVEFfV0lEVEhfOEJJVAkJKCgwIDw8IDgpICYgQ1NJX0lGX0NGR19JRl9EQVRBX1dJRFRI X01BU0spCi0jZGVmaW5lIENTSV9JRl9DRkdfSUZfREFUQV9XSURUSF8xMEJJVAkJKCgxIDw8IDgp ICYgQ1NJX0lGX0NGR19JRl9EQVRBX1dJRFRIX01BU0spCi0jZGVmaW5lIENTSV9JRl9DRkdfSUZf REFUQV9XSURUSF8xMkJJVAkJKCgyIDw8IDgpICYgQ1NJX0lGX0NGR19JRl9EQVRBX1dJRFRIX01B U0spCi0jZGVmaW5lIENTSV9JRl9DRkdfTUlQSV9JRl9NQVNLCQkJQklUKDcpCi0jZGVmaW5lIENT SV9JRl9DRkdfTUlQSV9JRl9DU0kJCQkoMCA8PCA3KQotI2RlZmluZSBDU0lfSUZfQ0ZHX01JUElf SUZfTUlQSQkJCUJJVCg3KQotI2RlZmluZSBDU0lfSUZfQ0ZHX0NTSV9JRl9NQVNLCQkJR0VOTUFT Syg0LCAwKQotI2RlZmluZSBDU0lfSUZfQ0ZHX0NTSV9JRl9ZVVY0MjJfSU5UTFYJCSgoMCA8PCAw KSAmIENTSV9JRl9DRkdfQ1NJX0lGX01BU0spCi0jZGVmaW5lIENTSV9JRl9DRkdfQ1NJX0lGX1lV VjQyMl8xNkJJVAkJKCgxIDw8IDApICYgQ1NJX0lGX0NGR19DU0lfSUZfTUFTSykKLSNkZWZpbmUg Q1NJX0lGX0NGR19DU0lfSUZfQlQ2NTYJCQkoKDQgPDwgMCkgJiBDU0lfSUZfQ0ZHX0NTSV9JRl9N QVNLKQotI2RlZmluZSBDU0lfSUZfQ0ZHX0NTSV9JRl9CVDExMjAJCSgoNSA8PCAwKSAmIENTSV9J Rl9DRkdfQ1NJX0lGX01BU0spCi0KLSNkZWZpbmUgQ1NJX0NBUF9SRUcJCQkweDgKLSNkZWZpbmUg Q1NJX0NBUF9DSDBfQ0FQX01BU0tfTUFTSwkJR0VOTUFTSyg1LCAyKQotI2RlZmluZSBDU0lfQ0FQ X0NIMF9DQVBfTUFTSyhjb3VudCkJCSgoKGNvdW50KSA8PCAyKSAmIENTSV9DQVBfQ0gwX0NBUF9N QVNLX01BU0spCi0jZGVmaW5lIENTSV9DQVBfQ0gwX1ZDQVBfT04JCQlCSVQoMSkKLSNkZWZpbmUg Q1NJX0NBUF9DSDBfU0NBUF9PTgkJCUJJVCgwKQotCi0jZGVmaW5lIENTSV9TWU5DX0NOVF9SRUcJ CTB4YwotI2RlZmluZSBDU0lfRklGT19USFJTX1JFRwkJMHgxMAotI2RlZmluZSBDU0lfQlQ2NTZf SEVBRF9DRkdfUkVHCQkweDE0Ci0jZGVmaW5lIENTSV9QVE5fTEVOX1JFRwkJCTB4MzAKLSNkZWZp bmUgQ1NJX1BUTl9BRERSX1JFRwkJMHgzNAotI2RlZmluZSBDU0lfVkVSX1JFRwkJCTB4M2MKLQot I2RlZmluZSBDU0lfQ0hfQ0ZHX1JFRwkJCTB4NDQKLSNkZWZpbmUgQ1NJX0NIX0NGR19JTlBVVF9G TVRfTUFTSwkJR0VOTUFTSygyMywgMjApCi0jZGVmaW5lIENTSV9DSF9DRkdfSU5QVVRfRk1UKGZt dCkJCSgoKGZtdCkgPDwgMjApICYgQ1NJX0NIX0NGR19JTlBVVF9GTVRfTUFTSykKLSNkZWZpbmUg Q1NJX0NIX0NGR19PVVRQVVRfRk1UX01BU0sJCUdFTk1BU0soMTksIDE2KQotI2RlZmluZSBDU0lf Q0hfQ0ZHX09VVFBVVF9GTVQoZm10KQkJKCgoZm10KSA8PCAxNikgJiBDU0lfQ0hfQ0ZHX09VVFBV VF9GTVRfTUFTSykKLSNkZWZpbmUgQ1NJX0NIX0NGR19WRkxJUF9FTgkJCUJJVCgxMykKLSNkZWZp bmUgQ1NJX0NIX0NGR19IRkxJUF9FTgkJCUJJVCgxMikKLSNkZWZpbmUgQ1NJX0NIX0NGR19GSUVM RF9TRUxfTUFTSwkJR0VOTUFTSygxMSwgMTApCi0jZGVmaW5lIENTSV9DSF9DRkdfRklFTERfU0VM X0ZJRUxEMAkJKCgwIDw8IDEwKSAmIENTSV9DSF9DRkdfRklFTERfU0VMX01BU0spCi0jZGVmaW5l IENTSV9DSF9DRkdfRklFTERfU0VMX0ZJRUxEMQkJKCgxIDw8IDEwKSAmIENTSV9DSF9DRkdfRklF TERfU0VMX01BU0spCi0jZGVmaW5lIENTSV9DSF9DRkdfRklFTERfU0VMX0JPVEgJCSgoMiA8PCAx MCkgJiBDU0lfQ0hfQ0ZHX0ZJRUxEX1NFTF9NQVNLKQotI2RlZmluZSBDU0lfQ0hfQ0ZHX0lOUFVU X1NFUV9NQVNLCQlHRU5NQVNLKDksIDgpCi0jZGVmaW5lIENTSV9DSF9DRkdfSU5QVVRfU0VRKHNl cSkJCSgoKHNlcSkgPDwgOCkgJiBDU0lfQ0hfQ0ZHX0lOUFVUX1NFUV9NQVNLKQotCi0jZGVmaW5l IENTSV9DSF9TQ0FMRV9SRUcJCTB4NGMKLSNkZWZpbmUgQ1NJX0NIX1NDQUxFX1FVQVJUX0VOCQkJ QklUKDApCi0KLSNkZWZpbmUgQ1NJX0NIX0YwX0JVRkFfUkVHCQkweDUwCi0KLSNkZWZpbmUgQ1NJ X0NIX0YxX0JVRkFfUkVHCQkweDU4Ci0KLSNkZWZpbmUgQ1NJX0NIX0YyX0JVRkFfUkVHCQkweDYw Ci0KLSNkZWZpbmUgQ1NJX0NIX1NUQV9SRUcJCQkweDZjCi0jZGVmaW5lIENTSV9DSF9TVEFfRklF TERfU1RBX01BU0sJCUJJVCgyKQotI2RlZmluZSBDU0lfQ0hfU1RBX0ZJRUxEX1NUQV9GSUVMRDAJ CSgoMCA8PCAyKSAmIENTSV9DSF9TVEFfRklFTERfU1RBX01BU0spCi0jZGVmaW5lIENTSV9DSF9T VEFfRklFTERfU1RBX0ZJRUxEMQkJKCgxIDw8IDIpICYgQ1NJX0NIX1NUQV9GSUVMRF9TVEFfTUFT SykKLSNkZWZpbmUgQ1NJX0NIX1NUQV9WQ0FQX1NUQQkJCUJJVCgxKQotI2RlZmluZSBDU0lfQ0hf U1RBX1NDQVBfU1RBCQkJQklUKDApCi0KLSNkZWZpbmUgQ1NJX0NIX0lOVF9FTl9SRUcJCTB4NzAK LSNkZWZpbmUgQ1NJX0NIX0lOVF9FTl9WU19JTlRfRU4JCQlCSVQoNykKLSNkZWZpbmUgQ1NJX0NI X0lOVF9FTl9IQl9PRl9JTlRfRU4JCUJJVCg2KQotI2RlZmluZSBDU0lfQ0hfSU5UX0VOX01VTF9F UlJfSU5UX0VOCQlCSVQoNSkKLSNkZWZpbmUgQ1NJX0NIX0lOVF9FTl9GSUZPMl9PRl9JTlRfRU4J CUJJVCg0KQotI2RlZmluZSBDU0lfQ0hfSU5UX0VOX0ZJRk8xX09GX0lOVF9FTgkJQklUKDMpCi0j ZGVmaW5lIENTSV9DSF9JTlRfRU5fRklGTzBfT0ZfSU5UX0VOCQlCSVQoMikKLSNkZWZpbmUgQ1NJ X0NIX0lOVF9FTl9GRF9JTlRfRU4JCQlCSVQoMSkKLSNkZWZpbmUgQ1NJX0NIX0lOVF9FTl9DRF9J TlRfRU4JCQlCSVQoMCkKLQotI2RlZmluZSBDU0lfQ0hfSU5UX1NUQV9SRUcJCTB4NzQKLSNkZWZp bmUgQ1NJX0NIX0lOVF9TVEFfVlNfUEQJCQlCSVQoNykKLSNkZWZpbmUgQ1NJX0NIX0lOVF9TVEFf SEJfT0ZfUEQJCQlCSVQoNikKLSNkZWZpbmUgQ1NJX0NIX0lOVF9TVEFfTVVMX0VSUl9QRAkJQklU KDUpCi0jZGVmaW5lIENTSV9DSF9JTlRfU1RBX0ZJRk8yX09GX1BECQlCSVQoNCkKLSNkZWZpbmUg Q1NJX0NIX0lOVF9TVEFfRklGTzFfT0ZfUEQJCUJJVCgzKQotI2RlZmluZSBDU0lfQ0hfSU5UX1NU QV9GSUZPMF9PRl9QRAkJQklUKDIpCi0jZGVmaW5lIENTSV9DSF9JTlRfU1RBX0ZEX1BECQkJQklU KDEpCi0jZGVmaW5lIENTSV9DSF9JTlRfU1RBX0NEX1BECQkJQklUKDApCi0KLSNkZWZpbmUgQ1NJ X0NIX0ZMRDFfVlNJWkVfUkVHCQkweDc4Ci0KLSNkZWZpbmUgQ1NJX0NIX0hTSVpFX1JFRwkJMHg4 MAotI2RlZmluZSBDU0lfQ0hfSFNJWkVfSE9SX0xFTl9NQVNLCQlHRU5NQVNLKDI4LCAxNikKLSNk ZWZpbmUgQ1NJX0NIX0hTSVpFX0hPUl9MRU4obGVuKQkJKCgobGVuKSA8PCAxNikgJiBDU0lfQ0hf SFNJWkVfSE9SX0xFTl9NQVNLKQotI2RlZmluZSBDU0lfQ0hfSFNJWkVfSE9SX1NUQVJUX01BU0sJ CUdFTk1BU0soMTIsIDApCi0jZGVmaW5lIENTSV9DSF9IU0laRV9IT1JfU1RBUlQoc3RhcnQpCQko KChzdGFydCkgPDwgMCkgJiBDU0lfQ0hfSFNJWkVfSE9SX1NUQVJUX01BU0spCi0KLSNkZWZpbmUg Q1NJX0NIX1ZTSVpFX1JFRwkJMHg4NAotI2RlZmluZSBDU0lfQ0hfVlNJWkVfVkVSX0xFTl9NQVNL CQlHRU5NQVNLKDI4LCAxNikKLSNkZWZpbmUgQ1NJX0NIX1ZTSVpFX1ZFUl9MRU4obGVuKQkJKCgo bGVuKSA8PCAxNikgJiBDU0lfQ0hfVlNJWkVfVkVSX0xFTl9NQVNLKQotI2RlZmluZSBDU0lfQ0hf VlNJWkVfVkVSX1NUQVJUX01BU0sJCUdFTk1BU0soMTIsIDApCi0jZGVmaW5lIENTSV9DSF9WU0la RV9WRVJfU1RBUlQoc3RhcnQpCQkoKChzdGFydCkgPDwgMCkgJiBDU0lfQ0hfVlNJWkVfVkVSX1NU QVJUX01BU0spCi0KLSNkZWZpbmUgQ1NJX0NIX0JVRl9MRU5fUkVHCQkweDg4Ci0jZGVmaW5lIENT SV9DSF9CVUZfTEVOX0JVRl9MRU5fQ19NQVNLCQlHRU5NQVNLKDI5LCAxNikKLSNkZWZpbmUgQ1NJ X0NIX0JVRl9MRU5fQlVGX0xFTl9DKGxlbikJCSgoKGxlbikgPDwgMTYpICYgQ1NJX0NIX0JVRl9M RU5fQlVGX0xFTl9DX01BU0spCi0jZGVmaW5lIENTSV9DSF9CVUZfTEVOX0JVRl9MRU5fWV9NQVNL CQlHRU5NQVNLKDEzLCAwKQotI2RlZmluZSBDU0lfQ0hfQlVGX0xFTl9CVUZfTEVOX1kobGVuKQkJ KCgobGVuKSA8PCAwKSAmIENTSV9DSF9CVUZfTEVOX0JVRl9MRU5fWV9NQVNLKQotCi0jZGVmaW5l IENTSV9DSF9GTElQX1NJWkVfUkVHCQkweDhjCi0jZGVmaW5lIENTSV9DSF9GTElQX1NJWkVfVkVS X0xFTl9NQVNLCQlHRU5NQVNLKDI4LCAxNikKLSNkZWZpbmUgQ1NJX0NIX0ZMSVBfU0laRV9WRVJf TEVOKGxlbikJCSgoKGxlbikgPDwgMTYpICYgQ1NJX0NIX0ZMSVBfU0laRV9WRVJfTEVOX01BU0sp Ci0jZGVmaW5lIENTSV9DSF9GTElQX1NJWkVfVkFMSURfTEVOX01BU0sJCUdFTk1BU0soMTIsIDAp Ci0jZGVmaW5lIENTSV9DSF9GTElQX1NJWkVfVkFMSURfTEVOKGxlbikJCSgoKGxlbikgPDwgMCkg JiBDU0lfQ0hfRkxJUF9TSVpFX1ZBTElEX0xFTl9NQVNLKQotCi0jZGVmaW5lIENTSV9DSF9GUk1f Q0xLX0NOVF9SRUcJCTB4OTAKLSNkZWZpbmUgQ1NJX0NIX0FDQ19JVE5MX0NMS19DTlRfUkVHCTB4 OTQKLSNkZWZpbmUgQ1NJX0NIX0ZJRk9fU1RBVF9SRUcJCTB4OTgKLSNkZWZpbmUgQ1NJX0NIX1BD TEtfU1RBVF9SRUcJCTB4OWMKLQotLyoKLSAqIGNzaSBpbnB1dCBkYXRhIGZvcm1hdAotICovCi1l bnVtIGNzaV9pbnB1dF9mbXQgewotCUNTSV9JTlBVVF9GT1JNQVRfUkFXCQk9IDAsCi0JQ1NJX0lO UFVUX0ZPUk1BVF9ZVVY0MjIJCT0gMywKLQlDU0lfSU5QVVRfRk9STUFUX1lVVjQyMAkJPSA0LAot fTsKLQotLyoKLSAqIGNzaSBvdXRwdXQgZGF0YSBmb3JtYXQKLSAqLwotZW51bSBjc2lfb3V0cHV0 X2ZtdCB7Ci0JLyogb25seSB3aGVuIGlucHV0IGZvcm1hdCBpcyBSQVcgKi8KLQlDU0lfRklFTERf UkFXXzgJCQk9IDAsCi0JQ1NJX0ZJRUxEX1JBV18xMAkJPSAxLAotCUNTSV9GSUVMRF9SQVdfMTIJ CT0gMiwKLQlDU0lfRklFTERfUkdCNTY1CQk9IDQsCi0JQ1NJX0ZJRUxEX1JHQjg4OAkJPSA1LAot CUNTSV9GSUVMRF9QUkdCODg4CQk9IDYsCi0JQ1NJX0ZSQU1FX1JBV184CQkJPSA4LAotCUNTSV9G UkFNRV9SQVdfMTAJCT0gOSwKLQlDU0lfRlJBTUVfUkFXXzEyCQk9IDEwLAotCUNTSV9GUkFNRV9S R0I1NjUJCT0gMTIsCi0JQ1NJX0ZSQU1FX1JHQjg4OAkJPSAxMywKLQlDU0lfRlJBTUVfUFJHQjg4 OAkJPSAxNCwKLQotCS8qIG9ubHkgd2hlbiBpbnB1dCBmb3JtYXQgaXMgWVVWNDIyICovCi0JQ1NJ X0ZJRUxEX1BMQU5BUl9ZVVY0MjIJCT0gMCwKLQlDU0lfRklFTERfUExBTkFSX1lVVjQyMAkJPSAx LAotCUNTSV9GUkFNRV9QTEFOQVJfWVVWNDIwCQk9IDIsCi0JQ1NJX0ZSQU1FX1BMQU5BUl9ZVVY0 MjIJCT0gMywKLQlDU0lfRklFTERfVVZfQ0JfWVVWNDIyCQk9IDQsCi0JQ1NJX0ZJRUxEX1VWX0NC X1lVVjQyMAkJPSA1LAotCUNTSV9GUkFNRV9VVl9DQl9ZVVY0MjAJCT0gNiwKLQlDU0lfRlJBTUVf VVZfQ0JfWVVWNDIyCQk9IDcsCi0JQ1NJX0ZJRUxEX01CX1lVVjQyMgkJPSA4LAotCUNTSV9GSUVM RF9NQl9ZVVY0MjAJCT0gOSwKLQlDU0lfRlJBTUVfTUJfWVVWNDIwCQk9IDEwLAotCUNTSV9GUkFN RV9NQl9ZVVY0MjIJCT0gMTEsCi0JQ1NJX0ZJRUxEX1VWX0NCX1lVVjQyMl8xMAk9IDEyLAotCUNT SV9GSUVMRF9VVl9DQl9ZVVY0MjBfMTAJPSAxMywKLX07Ci0KLS8qCi0gKiBjc2kgWVVWIGlucHV0 IGRhdGEgc2VxdWVuY2UKLSAqLwotZW51bSBjc2lfaW5wdXRfc2VxIHsKLQkvKiBvbmx5IHdoZW4g aW5wdXQgZm9ybWF0IGlzIFlVVjQyMiAqLwotCUNTSV9JTlBVVF9TRVFfWVVZViA9IDAsCi0JQ1NJ X0lOUFVUX1NFUV9ZVllVLAotCUNTSV9JTlBVVF9TRVFfVVlWWSwKLQlDU0lfSU5QVVRfU0VRX1ZZ VVksCi19OwotCi0jZW5kaWYgLyogX19TVU42SV9DU0lfUkVHX0hfXyAqLwpkaWZmIC0tZ2l0IGEv ZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zdW54aS9zdW42aS1jc2kvc3VuNmlfdmlkZW8uYyBiL2Ry aXZlcnMvbWVkaWEvcGxhdGZvcm0vc3VueGkvc3VuNmktY3NpL3N1bjZpX3ZpZGVvLmMKZGVsZXRl ZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3YjIxNjEzOTJkMi4uMDAwMDAwMDAwMDAwCi0tLSBh L2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vc3VueGkvc3VuNmktY3NpL3N1bjZpX3ZpZGVvLmMKKysr IC9kZXYvbnVsbApAQCAtMSw2ODMgKzAsMCBAQAotLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6 IEdQTC0yLjArCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTggTWFnZXdlbGwgRWxlY3Ry b25pY3MgQ28uLCBMdGQuIChOYW5qaW5nKQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIEF1 dGhvcjogWW9uZyBEZW5nIDx5b25nLmRlbmdAbWFnZXdlbGwuY29tPgotICovCi0KLSNpbmNsdWRl IDxsaW51eC9vZi5oPgotCi0jaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KLSNpbmNsdWRl IDxtZWRpYS92NGwyLWV2ZW50Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvdjRsMi1pb2N0bC5oPgotI2lu Y2x1ZGUgPG1lZGlhL3Y0bDItbWMuaD4KLSNpbmNsdWRlIDxtZWRpYS92aWRlb2J1ZjItZG1hLWNv bnRpZy5oPgotI2luY2x1ZGUgPG1lZGlhL3ZpZGVvYnVmMi12NGwyLmg+Ci0KLSNpbmNsdWRlICJz dW42aV9jc2kuaCIKLSNpbmNsdWRlICJzdW42aV92aWRlby5oIgotCi0vKiBUaGlzIGlzIGdvdCBm cm9tIEJTUCBzb3VyY2VzLiAqLwotI2RlZmluZSBNSU5fV0lEVEgJKDMyKQotI2RlZmluZSBNSU5f SEVJR0hUCSgzMikKLSNkZWZpbmUgTUFYX1dJRFRICSg0ODAwKQotI2RlZmluZSBNQVhfSEVJR0hU CSg0ODAwKQotCi1zdHJ1Y3Qgc3VuNmlfY3NpX2J1ZmZlciB7Ci0Jc3RydWN0IHZiMl92NGwyX2J1 ZmZlcgkJdmI7Ci0Jc3RydWN0IGxpc3RfaGVhZAkJbGlzdDsKLQotCWRtYV9hZGRyX3QJCQlkbWFf YWRkcjsKLQlib29sCQkJCXF1ZXVlZF90b19jc2k7Ci19OwotCi1zdGF0aWMgY29uc3QgdTMyIHN1 cHBvcnRlZF9waXhmb3JtYXRzW10gPSB7Ci0JVjRMMl9QSVhfRk1UX1NCR0dSOCwKLQlWNEwyX1BJ WF9GTVRfU0dCUkc4LAotCVY0TDJfUElYX0ZNVF9TR1JCRzgsCi0JVjRMMl9QSVhfRk1UX1NSR0dC OCwKLQlWNEwyX1BJWF9GTVRfU0JHR1IxMCwKLQlWNEwyX1BJWF9GTVRfU0dCUkcxMCwKLQlWNEwy X1BJWF9GTVRfU0dSQkcxMCwKLQlWNEwyX1BJWF9GTVRfU1JHR0IxMCwKLQlWNEwyX1BJWF9GTVRf U0JHR1IxMiwKLQlWNEwyX1BJWF9GTVRfU0dCUkcxMiwKLQlWNEwyX1BJWF9GTVRfU0dSQkcxMiwK LQlWNEwyX1BJWF9GTVRfU1JHR0IxMiwKLQlWNEwyX1BJWF9GTVRfWVVZViwKLQlWNEwyX1BJWF9G TVRfWVZZVSwKLQlWNEwyX1BJWF9GTVRfVVlWWSwKLQlWNEwyX1BJWF9GTVRfVllVWSwKLQlWNEwy X1BJWF9GTVRfSE0xMiwKLQlWNEwyX1BJWF9GTVRfTlYxMiwKLQlWNEwyX1BJWF9GTVRfTlYyMSwK LQlWNEwyX1BJWF9GTVRfWVVWNDIwLAotCVY0TDJfUElYX0ZNVF9ZVlU0MjAsCi0JVjRMMl9QSVhf Rk1UX05WMTYsCi0JVjRMMl9QSVhfRk1UX05WNjEsCi0JVjRMMl9QSVhfRk1UX1lVVjQyMlAsCi0J VjRMMl9QSVhfRk1UX1JHQjU2NSwKLQlWNEwyX1BJWF9GTVRfUkdCNTY1WCwKLQlWNEwyX1BJWF9G TVRfSlBFRywKLX07Ci0KLXN0YXRpYyBib29sIGlzX3BpeGZvcm1hdF92YWxpZCh1bnNpZ25lZCBp bnQgcGl4Zm9ybWF0KQotewotCXVuc2lnbmVkIGludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IEFS UkFZX1NJWkUoc3VwcG9ydGVkX3BpeGZvcm1hdHMpOyBpKyspCi0JCWlmIChzdXBwb3J0ZWRfcGl4 Zm9ybWF0c1tpXSA9PSBwaXhmb3JtYXQpCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCXJldHVybiBmYWxz ZTsKLX0KLQotc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldiAqCi1zdW42aV92aWRlb19yZW1vdGVf c3ViZGV2KHN0cnVjdCBzdW42aV92aWRlbyAqdmlkZW8sIHUzMiAqcGFkKQotewotCXN0cnVjdCBt ZWRpYV9wYWQgKnJlbW90ZTsKLQotCXJlbW90ZSA9IG1lZGlhX2VudGl0eV9yZW1vdGVfcGFkKCZ2 aWRlby0+cGFkKTsKLQotCWlmICghcmVtb3RlIHx8ICFpc19tZWRpYV9lbnRpdHlfdjRsMl9zdWJk ZXYocmVtb3RlLT5lbnRpdHkpKQotCQlyZXR1cm4gTlVMTDsKLQotCWlmIChwYWQpCi0JCSpwYWQg PSByZW1vdGUtPmluZGV4OwotCi0JcmV0dXJuIG1lZGlhX2VudGl0eV90b192NGwyX3N1YmRldihy ZW1vdGUtPmVudGl0eSk7Ci19Ci0KLXN0YXRpYyBpbnQgc3VuNmlfdmlkZW9fcXVldWVfc2V0dXAo c3RydWN0IHZiMl9xdWV1ZSAqdnEsCi0JCQkJICAgdW5zaWduZWQgaW50ICpuYnVmZmVycywKLQkJ CQkgICB1bnNpZ25lZCBpbnQgKm5wbGFuZXMsCi0JCQkJICAgdW5zaWduZWQgaW50IHNpemVzW10s Ci0JCQkJICAgc3RydWN0IGRldmljZSAqYWxsb2NfZGV2c1tdKQotewotCXN0cnVjdCBzdW42aV92 aWRlbyAqdmlkZW8gPSB2YjJfZ2V0X2Rydl9wcml2KHZxKTsKLQl1bnNpZ25lZCBpbnQgc2l6ZSA9 IHZpZGVvLT5mbXQuZm10LnBpeC5zaXplaW1hZ2U7Ci0KLQlpZiAoKm5wbGFuZXMpCi0JCXJldHVy biBzaXplc1swXSA8IHNpemUgPyAtRUlOVkFMIDogMDsKLQotCSpucGxhbmVzID0gMTsKLQlzaXpl c1swXSA9IHNpemU7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzdW42aV92aWRlb19i dWZmZXJfcHJlcGFyZShzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIpCi17Ci0Jc3RydWN0IHZiMl92NGwy X2J1ZmZlciAqdmJ1ZiA9IHRvX3ZiMl92NGwyX2J1ZmZlcih2Yik7Ci0Jc3RydWN0IHN1bjZpX2Nz aV9idWZmZXIgKmJ1ZiA9Ci0JCQljb250YWluZXJfb2YodmJ1Ziwgc3RydWN0IHN1bjZpX2NzaV9i dWZmZXIsIHZiKTsKLQlzdHJ1Y3Qgc3VuNmlfdmlkZW8gKnZpZGVvID0gdmIyX2dldF9kcnZfcHJp dih2Yi0+dmIyX3F1ZXVlKTsKLQl1bnNpZ25lZCBsb25nIHNpemUgPSB2aWRlby0+Zm10LmZtdC5w aXguc2l6ZWltYWdlOwotCi0JaWYgKHZiMl9wbGFuZV9zaXplKHZiLCAwKSA8IHNpemUpIHsKLQkJ djRsMl9lcnIodmlkZW8tPnZkZXYudjRsMl9kZXYsICJidWZmZXIgdG9vIHNtYWxsICglbHUgPCAl bHUpXG4iLAotCQkJIHZiMl9wbGFuZV9zaXplKHZiLCAwKSwgc2l6ZSk7Ci0JCXJldHVybiAtRUlO VkFMOwotCX0KLQotCXZiMl9zZXRfcGxhbmVfcGF5bG9hZCh2YiwgMCwgc2l6ZSk7Ci0KLQlidWYt PmRtYV9hZGRyID0gdmIyX2RtYV9jb250aWdfcGxhbmVfZG1hX2FkZHIodmIsIDApOwotCi0JdmJ1 Zi0+ZmllbGQgPSB2aWRlby0+Zm10LmZtdC5waXguZmllbGQ7Ci0KLQlyZXR1cm4gMDsKLX0KLQot c3RhdGljIGludCBzdW42aV92aWRlb19zdGFydF9zdHJlYW1pbmcoc3RydWN0IHZiMl9xdWV1ZSAq dnEsIHVuc2lnbmVkIGludCBjb3VudCkKLXsKLQlzdHJ1Y3Qgc3VuNmlfdmlkZW8gKnZpZGVvID0g dmIyX2dldF9kcnZfcHJpdih2cSk7Ci0Jc3RydWN0IHN1bjZpX2NzaV9idWZmZXIgKmJ1ZjsKLQlz dHJ1Y3Qgc3VuNmlfY3NpX2J1ZmZlciAqbmV4dF9idWY7Ci0Jc3RydWN0IHN1bjZpX2NzaV9jb25m aWcgY29uZmlnOwotCXN0cnVjdCB2NGwyX3N1YmRldiAqc3ViZGV2OwotCXVuc2lnbmVkIGxvbmcg ZmxhZ3M7Ci0JaW50IHJldDsKLQotCXZpZGVvLT5zZXF1ZW5jZSA9IDA7Ci0KLQlyZXQgPSBtZWRp YV9waXBlbGluZV9zdGFydCgmdmlkZW8tPnZkZXYuZW50aXR5LCAmdmlkZW8tPnZkZXYucGlwZSk7 Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gY2xlYXJfZG1hX3F1ZXVlOwotCi0JaWYgKHZpZGVvLT5t YnVzX2NvZGUgPT0gMCkgewotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIHN0b3BfbWVkaWFfcGlw ZWxpbmU7Ci0JfQotCi0Jc3ViZGV2ID0gc3VuNmlfdmlkZW9fcmVtb3RlX3N1YmRldih2aWRlbywg TlVMTCk7Ci0JaWYgKCFzdWJkZXYpIHsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBzdG9wX21l ZGlhX3BpcGVsaW5lOwotCX0KLQotCWNvbmZpZy5waXhlbGZvcm1hdCA9IHZpZGVvLT5mbXQuZm10 LnBpeC5waXhlbGZvcm1hdDsKLQljb25maWcuY29kZSA9IHZpZGVvLT5tYnVzX2NvZGU7Ci0JY29u ZmlnLmZpZWxkID0gdmlkZW8tPmZtdC5mbXQucGl4LmZpZWxkOwotCWNvbmZpZy53aWR0aCA9IHZp ZGVvLT5mbXQuZm10LnBpeC53aWR0aDsKLQljb25maWcuaGVpZ2h0ID0gdmlkZW8tPmZtdC5mbXQu cGl4LmhlaWdodDsKLQotCXJldCA9IHN1bjZpX2NzaV91cGRhdGVfY29uZmlnKHZpZGVvLT5jc2ks ICZjb25maWcpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIHN0b3BfbWVkaWFfcGlwZWxpbmU7Ci0K LQlzcGluX2xvY2tfaXJxc2F2ZSgmdmlkZW8tPmRtYV9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0KLQli dWYgPSBsaXN0X2ZpcnN0X2VudHJ5KCZ2aWRlby0+ZG1hX3F1ZXVlLAotCQkJICAgICAgIHN0cnVj dCBzdW42aV9jc2lfYnVmZmVyLCBsaXN0KTsKLQlidWYtPnF1ZXVlZF90b19jc2kgPSB0cnVlOwot CXN1bjZpX2NzaV91cGRhdGVfYnVmX2FkZHIodmlkZW8tPmNzaSwgYnVmLT5kbWFfYWRkcik7Ci0K LQlzdW42aV9jc2lfc2V0X3N0cmVhbSh2aWRlby0+Y3NpLCB0cnVlKTsKLQotCS8qCi0JICogQ1NJ IHdpbGwgbG9va3VwIHRoZSBuZXh0IGRtYSBidWZmZXIgZm9yIG5leHQgZnJhbWUgYmVmb3JlIHRo ZQotCSAqIHRoZSBjdXJyZW50IGZyYW1lIGRvbmUgSVJRIHRyaWdnZXJlZC4gVGhpcyBpcyBub3Qg ZG9jdW1lbnRlZAotCSAqIGJ1dCByZXBvcnRlZCBieSBPbmTFmWVqIEppcm1hbi4KLQkgKiBUaGUg QlNQIGNvZGUgaGFzIHdvcmthcm91bmQgZm9yIHRoaXMgdG9vLiBJdCBza2lwIHRvIG1hcmsgdGhl Ci0JICogZmlyc3QgYnVmZmVyIGFzIGZyYW1lIGRvbmUgZm9yIFZCMiBhbmQgcGFzcyB0aGUgc2Vj b25kIGJ1ZmZlcgotCSAqIHRvIENTSSBpbiB0aGUgZmlyc3QgZnJhbWUgZG9uZSBJU1IgY2FsbC4g VGhlbiBpbiBzZWNvbmQgZnJhbWUKLQkgKiBkb25lIElTUiBjYWxsLCBpdCBtYXJrIHRoZSBmaXJz dCBidWZmZXIgYXMgZnJhbWUgZG9uZSBmb3IgVkIyCi0JICogYW5kIHBhc3MgdGhlIHRoaXJkIGJ1 ZmZlciB0byBDU0kuIEFuZCBzbyBvbi4gVGhlIGJhZCB0aGluZyBpcwotCSAqIHRoYXQgdGhlIGZp cnN0IGJ1ZmZlciB3aWxsIGJlIHdyaXR0ZW4gdHdpY2UgYW5kIHRoZSBmaXJzdCBmcmFtZQotCSAq IGlzIGRyb3BwZWQgZXZlbiB0aGUgcXVldWVkIGJ1ZmZlciBpcyBzdWZmaWNpZW50LgotCSAqIFNv LCBJIG1ha2Ugc29tZSBpbXByb3ZlbWVudCBoZXJlLiBQYXNzIHRoZSBuZXh0IGJ1ZmZlciB0byBD U0kKLQkgKiBqdXN0IGZvbGxvdyBzdGFydGluZyB0aGUgQ1NJLiBJbiB0aGlzIGNhc2UsIHRoZSBm aXJzdCBmcmFtZQotCSAqIHdpbGwgYmUgc3RvcmVkIGluIGZpcnN0IGJ1ZmZlciwgc2Vjb25kIGZy YW1lIGluIHNlY29uZCBidWZmZXIuCi0JICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBhdm9pZCBk cm9wcGluZyB0aGUgZmlyc3QgZnJhbWUsIGl0Ci0JICogd291bGQgYWxzbyBkcm9wIGZyYW1lIHdo ZW4gbGFja2luZyBvZiBxdWV1ZWQgYnVmZmVyLgotCSAqLwotCW5leHRfYnVmID0gbGlzdF9uZXh0 X2VudHJ5KGJ1ZiwgbGlzdCk7Ci0JbmV4dF9idWYtPnF1ZXVlZF90b19jc2kgPSB0cnVlOwotCXN1 bjZpX2NzaV91cGRhdGVfYnVmX2FkZHIodmlkZW8tPmNzaSwgbmV4dF9idWYtPmRtYV9hZGRyKTsK LQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZpZGVvLT5kbWFfcXVldWVfbG9jaywgZmxhZ3Mp OwotCi0JcmV0ID0gdjRsMl9zdWJkZXZfY2FsbChzdWJkZXYsIHZpZGVvLCBzX3N0cmVhbSwgMSk7 Ci0JaWYgKHJldCAmJiByZXQgIT0gLUVOT0lPQ1RMQ01EKQotCQlnb3RvIHN0b3BfY3NpX3N0cmVh bTsKLQotCXJldHVybiAwOwotCi1zdG9wX2NzaV9zdHJlYW06Ci0Jc3VuNmlfY3NpX3NldF9zdHJl YW0odmlkZW8tPmNzaSwgZmFsc2UpOwotc3RvcF9tZWRpYV9waXBlbGluZToKLQltZWRpYV9waXBl bGluZV9zdG9wKCZ2aWRlby0+dmRldi5lbnRpdHkpOwotY2xlYXJfZG1hX3F1ZXVlOgotCXNwaW5f bG9ja19pcnFzYXZlKCZ2aWRlby0+ZG1hX3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQlsaXN0X2Zvcl9l YWNoX2VudHJ5KGJ1ZiwgJnZpZGVvLT5kbWFfcXVldWUsIGxpc3QpCi0JCXZiMl9idWZmZXJfZG9u ZSgmYnVmLT52Yi52YjJfYnVmLCBWQjJfQlVGX1NUQVRFX1FVRVVFRCk7Ci0JSU5JVF9MSVNUX0hF QUQoJnZpZGVvLT5kbWFfcXVldWUpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZpZGVvLT5k bWFfcXVldWVfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQg c3VuNmlfdmlkZW9fc3RvcF9zdHJlYW1pbmcoc3RydWN0IHZiMl9xdWV1ZSAqdnEpCi17Ci0Jc3Ry dWN0IHN1bjZpX3ZpZGVvICp2aWRlbyA9IHZiMl9nZXRfZHJ2X3ByaXYodnEpOwotCXN0cnVjdCB2 NGwyX3N1YmRldiAqc3ViZGV2OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IHN1bjZp X2NzaV9idWZmZXIgKmJ1ZjsKLQotCXN1YmRldiA9IHN1bjZpX3ZpZGVvX3JlbW90ZV9zdWJkZXYo dmlkZW8sIE5VTEwpOwotCWlmIChzdWJkZXYpCi0JCXY0bDJfc3ViZGV2X2NhbGwoc3ViZGV2LCB2 aWRlbywgc19zdHJlYW0sIDApOwotCi0Jc3VuNmlfY3NpX3NldF9zdHJlYW0odmlkZW8tPmNzaSwg ZmFsc2UpOwotCi0JbWVkaWFfcGlwZWxpbmVfc3RvcCgmdmlkZW8tPnZkZXYuZW50aXR5KTsKLQot CS8qIFJlbGVhc2UgYWxsIGFjdGl2ZSBidWZmZXJzICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnZp ZGVvLT5kbWFfcXVldWVfbG9jaywgZmxhZ3MpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoYnVmLCAm dmlkZW8tPmRtYV9xdWV1ZSwgbGlzdCkKLQkJdmIyX2J1ZmZlcl9kb25lKCZidWYtPnZiLnZiMl9i dWYsIFZCMl9CVUZfU1RBVEVfRVJST1IpOwotCUlOSVRfTElTVF9IRUFEKCZ2aWRlby0+ZG1hX3F1 ZXVlKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aWRlby0+ZG1hX3F1ZXVlX2xvY2ssIGZs YWdzKTsKLX0KLQotc3RhdGljIHZvaWQgc3VuNmlfdmlkZW9fYnVmZmVyX3F1ZXVlKHN0cnVjdCB2 YjJfYnVmZmVyICp2YikKLXsKLQlzdHJ1Y3QgdmIyX3Y0bDJfYnVmZmVyICp2YnVmID0gdG9fdmIy X3Y0bDJfYnVmZmVyKHZiKTsKLQlzdHJ1Y3Qgc3VuNmlfY3NpX2J1ZmZlciAqYnVmID0KLQkJCWNv bnRhaW5lcl9vZih2YnVmLCBzdHJ1Y3Qgc3VuNmlfY3NpX2J1ZmZlciwgdmIpOwotCXN0cnVjdCBz dW42aV92aWRlbyAqdmlkZW8gPSB2YjJfZ2V0X2Rydl9wcml2KHZiLT52YjJfcXVldWUpOwotCXVu c2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmdmlkZW8tPmRtYV9xdWV1 ZV9sb2NrLCBmbGFncyk7Ci0JYnVmLT5xdWV1ZWRfdG9fY3NpID0gZmFsc2U7Ci0JbGlzdF9hZGRf dGFpbCgmYnVmLT5saXN0LCAmdmlkZW8tPmRtYV9xdWV1ZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVz dG9yZSgmdmlkZW8tPmRtYV9xdWV1ZV9sb2NrLCBmbGFncyk7Ci19Ci0KLXZvaWQgc3VuNmlfdmlk ZW9fZnJhbWVfZG9uZShzdHJ1Y3Qgc3VuNmlfdmlkZW8gKnZpZGVvKQotewotCXN0cnVjdCBzdW42 aV9jc2lfYnVmZmVyICpidWY7Ci0Jc3RydWN0IHN1bjZpX2NzaV9idWZmZXIgKm5leHRfYnVmOwot CXN0cnVjdCB2YjJfdjRsMl9idWZmZXIgKnZidWY7Ci0KLQlzcGluX2xvY2soJnZpZGVvLT5kbWFf cXVldWVfbG9jayk7Ci0KLQlidWYgPSBsaXN0X2ZpcnN0X2VudHJ5KCZ2aWRlby0+ZG1hX3F1ZXVl LAotCQkJICAgICAgIHN0cnVjdCBzdW42aV9jc2lfYnVmZmVyLCBsaXN0KTsKLQlpZiAobGlzdF9p c19sYXN0KCZidWYtPmxpc3QsICZ2aWRlby0+ZG1hX3F1ZXVlKSkgewotCQlkZXZfZGJnKHZpZGVv LT5jc2ktPmRldiwgIkZyYW1lIGRyb3BwZWQhXG4iKTsKLQkJZ290byB1bmxvY2s7Ci0JfQotCi0J bmV4dF9idWYgPSBsaXN0X25leHRfZW50cnkoYnVmLCBsaXN0KTsKLQkvKiBJZiBhIG5ldyBidWZm ZXIgKCNuZXh0X2J1ZikgaGFkIG5vdCBiZWVuIHF1ZXVlZCB0byBDU0ksIHRoZSBvbGQKLQkgKiBi dWZmZXIgKCNidWYpIGlzIHN0aWxsIGhvbGRpbmcgYnkgQ1NJIGZvciBzdG9yaW5nIHRoZSBuZXh0 Ci0JICogZnJhbWUuIFNvLCB3ZSBxdWV1ZSBhIG5ldyBidWZmZXIgKCNuZXh0X2J1ZikgdG8gQ1NJ IHRoZW4gd2FpdAotCSAqIGZvciBuZXh0IElTUiBjYWxsLgotCSAqLwotCWlmICghbmV4dF9idWYt PnF1ZXVlZF90b19jc2kpIHsKLQkJbmV4dF9idWYtPnF1ZXVlZF90b19jc2kgPSB0cnVlOwotCQlz dW42aV9jc2lfdXBkYXRlX2J1Zl9hZGRyKHZpZGVvLT5jc2ksIG5leHRfYnVmLT5kbWFfYWRkcik7 Ci0JCWRldl9kYmcodmlkZW8tPmNzaS0+ZGV2LCAiRnJhbWUgZHJvcHBlZCFcbiIpOwotCQlnb3Rv IHVubG9jazsKLQl9Ci0KLQlsaXN0X2RlbCgmYnVmLT5saXN0KTsKLQl2YnVmID0gJmJ1Zi0+dmI7 Ci0JdmJ1Zi0+dmIyX2J1Zi50aW1lc3RhbXAgPSBrdGltZV9nZXRfbnMoKTsKLQl2YnVmLT5zZXF1 ZW5jZSA9IHZpZGVvLT5zZXF1ZW5jZTsKLQl2YjJfYnVmZmVyX2RvbmUoJnZidWYtPnZiMl9idWYs IFZCMl9CVUZfU1RBVEVfRE9ORSk7Ci0KLQkvKiBQcmVwYXJlIGJ1ZmZlciBmb3IgbmV4dCBmcmFt ZSBidXQgb25lLiAgKi8KLQlpZiAoIWxpc3RfaXNfbGFzdCgmbmV4dF9idWYtPmxpc3QsICZ2aWRl by0+ZG1hX3F1ZXVlKSkgewotCQluZXh0X2J1ZiA9IGxpc3RfbmV4dF9lbnRyeShuZXh0X2J1Ziwg bGlzdCk7Ci0JCW5leHRfYnVmLT5xdWV1ZWRfdG9fY3NpID0gdHJ1ZTsKLQkJc3VuNmlfY3NpX3Vw ZGF0ZV9idWZfYWRkcih2aWRlby0+Y3NpLCBuZXh0X2J1Zi0+ZG1hX2FkZHIpOwotCX0gZWxzZSB7 Ci0JCWRldl9kYmcodmlkZW8tPmNzaS0+ZGV2LCAiTmV4dCBmcmFtZSB3aWxsIGJlIGRyb3BwZWQh XG4iKTsKLQl9Ci0KLXVubG9jazoKLQl2aWRlby0+c2VxdWVuY2UrKzsKLQlzcGluX3VubG9jaygm dmlkZW8tPmRtYV9xdWV1ZV9sb2NrKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCB2YjJfb3Bz IHN1bjZpX2NzaV92YjJfb3BzID0gewotCS5xdWV1ZV9zZXR1cAkJPSBzdW42aV92aWRlb19xdWV1 ZV9zZXR1cCwKLQkud2FpdF9wcmVwYXJlCQk9IHZiMl9vcHNfd2FpdF9wcmVwYXJlLAotCS53YWl0 X2ZpbmlzaAkJPSB2YjJfb3BzX3dhaXRfZmluaXNoLAotCS5idWZfcHJlcGFyZQkJPSBzdW42aV92 aWRlb19idWZmZXJfcHJlcGFyZSwKLQkuc3RhcnRfc3RyZWFtaW5nCT0gc3VuNmlfdmlkZW9fc3Rh cnRfc3RyZWFtaW5nLAotCS5zdG9wX3N0cmVhbWluZwkJPSBzdW42aV92aWRlb19zdG9wX3N0cmVh bWluZywKLQkuYnVmX3F1ZXVlCQk9IHN1bjZpX3ZpZGVvX2J1ZmZlcl9xdWV1ZSwKLX07Ci0KLXN0 YXRpYyBpbnQgdmlkaW9jX3F1ZXJ5Y2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAot CQkJICAgc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAqY2FwKQotewotCXN0cnVjdCBzdW42aV92aWRl byAqdmlkZW8gPSB2aWRlb19kcnZkYXRhKGZpbGUpOwotCi0Jc3Ryc2NweShjYXAtPmRyaXZlciwg InN1bjZpLXZpZGVvIiwgc2l6ZW9mKGNhcC0+ZHJpdmVyKSk7Ci0Jc3Ryc2NweShjYXAtPmNhcmQs IHZpZGVvLT52ZGV2Lm5hbWUsIHNpemVvZihjYXAtPmNhcmQpKTsKLQlzbnByaW50ZihjYXAtPmJ1 c19pbmZvLCBzaXplb2YoY2FwLT5idXNfaW5mbyksICJwbGF0Zm9ybTolcyIsCi0JCSB2aWRlby0+ Y3NpLT5kZXYtPm9mX25vZGUtPm5hbWUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQg dmlkaW9jX2VudW1fZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0J CQkJICAgc3RydWN0IHY0bDJfZm10ZGVzYyAqZikKLXsKLQl1MzIgaW5kZXggPSBmLT5pbmRleDsK LQotCWlmIChpbmRleCA+PSBBUlJBWV9TSVpFKHN1cHBvcnRlZF9waXhmb3JtYXRzKSkKLQkJcmV0 dXJuIC1FSU5WQUw7Ci0KLQlmLT5waXhlbGZvcm1hdCA9IHN1cHBvcnRlZF9waXhmb3JtYXRzW2lu ZGV4XTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19nX2ZtdF92aWRfY2Fw KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJCXN0cnVjdCB2NGwyX2Zvcm1hdCAq Zm10KQotewotCXN0cnVjdCBzdW42aV92aWRlbyAqdmlkZW8gPSB2aWRlb19kcnZkYXRhKGZpbGUp OwotCi0JKmZtdCA9IHZpZGVvLT5mbXQ7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBz dW42aV92aWRlb190cnlfZm10KHN0cnVjdCBzdW42aV92aWRlbyAqdmlkZW8sCi0JCQkgICAgICAg c3RydWN0IHY0bDJfZm9ybWF0ICpmKQotewotCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgKnBpeGZt dCA9ICZmLT5mbXQucGl4OwotCWludCBicHA7Ci0KLQlpZiAoIWlzX3BpeGZvcm1hdF92YWxpZChw aXhmbXQtPnBpeGVsZm9ybWF0KSkKLQkJcGl4Zm10LT5waXhlbGZvcm1hdCA9IHN1cHBvcnRlZF9w aXhmb3JtYXRzWzBdOwotCi0JdjRsX2JvdW5kX2FsaWduX2ltYWdlKCZwaXhmbXQtPndpZHRoLCBN SU5fV0lEVEgsIE1BWF9XSURUSCwgMSwKLQkJCSAgICAgICZwaXhmbXQtPmhlaWdodCwgTUlOX0hF SUdIVCwgTUFYX1dJRFRILCAxLCAxKTsKLQotCWJwcCA9IHN1bjZpX2NzaV9nZXRfYnBwKHBpeGZt dC0+cGl4ZWxmb3JtYXQpOwotCXBpeGZtdC0+Ynl0ZXNwZXJsaW5lID0gKHBpeGZtdC0+d2lkdGgg KiBicHApID4+IDM7Ci0JcGl4Zm10LT5zaXplaW1hZ2UgPSBwaXhmbXQtPmJ5dGVzcGVybGluZSAq IHBpeGZtdC0+aGVpZ2h0OwotCi0JaWYgKHBpeGZtdC0+ZmllbGQgPT0gVjRMMl9GSUVMRF9BTlkp Ci0JCXBpeGZtdC0+ZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7Ci0KLQlwaXhmbXQtPmNvbG9yc3Bh Y2UgPSBWNEwyX0NPTE9SU1BBQ0VfUkFXOwotCXBpeGZtdC0+eWNiY3JfZW5jID0gVjRMMl9ZQ0JD Ul9FTkNfREVGQVVMVDsKLQlwaXhmbXQtPnF1YW50aXphdGlvbiA9IFY0TDJfUVVBTlRJWkFUSU9O X0RFRkFVTFQ7Ci0JcGl4Zm10LT54ZmVyX2Z1bmMgPSBWNEwyX1hGRVJfRlVOQ19ERUZBVUxUOwot Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc3VuNmlfdmlkZW9fc2V0X2ZtdChzdHJ1Y3Qg c3VuNmlfdmlkZW8gKnZpZGVvLCBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCi17Ci0JaW50IHJldDsK LQotCXJldCA9IHN1bjZpX3ZpZGVvX3RyeV9mbXQodmlkZW8sIGYpOwotCWlmIChyZXQpCi0JCXJl dHVybiByZXQ7Ci0KLQl2aWRlby0+Zm10ID0gKmY7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGlj IGludCB2aWRpb2Nfc19mbXRfdmlkX2NhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwK LQkJCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCi17Ci0Jc3RydWN0IHN1bjZpX3ZpZGVvICp2aWRl byA9IHZpZGVvX2RydmRhdGEoZmlsZSk7Ci0KLQlpZiAodmIyX2lzX2J1c3koJnZpZGVvLT52YjJf dmlkcSkpCi0JCXJldHVybiAtRUJVU1k7Ci0KLQlyZXR1cm4gc3VuNmlfdmlkZW9fc2V0X2ZtdCh2 aWRlbywgZik7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX3RyeV9mbXRfdmlkX2NhcChzdHJ1Y3Qg ZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCQkgIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKLXsK LQlzdHJ1Y3Qgc3VuNmlfdmlkZW8gKnZpZGVvID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKLQotCXJl dHVybiBzdW42aV92aWRlb190cnlfZm10KHZpZGVvLCBmKTsKLX0KLQotc3RhdGljIGludCB2aWRp b2NfZW51bV9pbnB1dChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCi0JCQkgICAgIHN0cnVj dCB2NGwyX2lucHV0ICppbnApCi17Ci0JaWYgKGlucC0+aW5kZXggIT0gMCkKLQkJcmV0dXJuIC1F SU5WQUw7Ci0KLQlzdHJzY3B5KGlucC0+bmFtZSwgImNhbWVyYSIsIHNpemVvZihpbnAtPm5hbWUp KTsKLQlpbnAtPnR5cGUgPSBWNEwyX0lOUFVUX1RZUEVfQ0FNRVJBOwotCi0JcmV0dXJuIDA7Ci19 Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX2dfaW5wdXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZo LCB1bnNpZ25lZCBpbnQgKmkpCi17Ci0JKmkgPSAwOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRp YyBpbnQgdmlkaW9jX3NfaW5wdXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCB1bnNpZ25l ZCBpbnQgaSkKLXsKLQlpZiAoaSAhPSAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJldHVybiAw OwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfaW9jdGxfb3BzIHN1bjZpX3ZpZGVvX2lv Y3RsX29wcyA9IHsKLQkudmlkaW9jX3F1ZXJ5Y2FwCQk9IHZpZGlvY19xdWVyeWNhcCwKLQkudmlk aW9jX2VudW1fZm10X3ZpZF9jYXAJPSB2aWRpb2NfZW51bV9mbXRfdmlkX2NhcCwKLQkudmlkaW9j X2dfZm10X3ZpZF9jYXAJCT0gdmlkaW9jX2dfZm10X3ZpZF9jYXAsCi0JLnZpZGlvY19zX2ZtdF92 aWRfY2FwCQk9IHZpZGlvY19zX2ZtdF92aWRfY2FwLAotCS52aWRpb2NfdHJ5X2ZtdF92aWRfY2Fw CQk9IHZpZGlvY190cnlfZm10X3ZpZF9jYXAsCi0KLQkudmlkaW9jX2VudW1faW5wdXQJCT0gdmlk aW9jX2VudW1faW5wdXQsCi0JLnZpZGlvY19zX2lucHV0CQkJPSB2aWRpb2Nfc19pbnB1dCwKLQku dmlkaW9jX2dfaW5wdXQJCQk9IHZpZGlvY19nX2lucHV0LAotCi0JLnZpZGlvY19yZXFidWZzCQkJ PSB2YjJfaW9jdGxfcmVxYnVmcywKLQkudmlkaW9jX3F1ZXJ5YnVmCQk9IHZiMl9pb2N0bF9xdWVy eWJ1ZiwKLQkudmlkaW9jX3FidWYJCQk9IHZiMl9pb2N0bF9xYnVmLAotCS52aWRpb2NfZXhwYnVm CQkJPSB2YjJfaW9jdGxfZXhwYnVmLAotCS52aWRpb2NfZHFidWYJCQk9IHZiMl9pb2N0bF9kcWJ1 ZiwKLQkudmlkaW9jX2NyZWF0ZV9idWZzCQk9IHZiMl9pb2N0bF9jcmVhdGVfYnVmcywKLQkudmlk aW9jX3ByZXBhcmVfYnVmCQk9IHZiMl9pb2N0bF9wcmVwYXJlX2J1ZiwKLQkudmlkaW9jX3N0cmVh bW9uCQk9IHZiMl9pb2N0bF9zdHJlYW1vbiwKLQkudmlkaW9jX3N0cmVhbW9mZgkJPSB2YjJfaW9j dGxfc3RyZWFtb2ZmLAotCi0JLnZpZGlvY19sb2dfc3RhdHVzCQk9IHY0bDJfY3RybF9sb2dfc3Rh dHVzLAotCS52aWRpb2Nfc3Vic2NyaWJlX2V2ZW50CQk9IHY0bDJfY3RybF9zdWJzY3JpYmVfZXZl bnQsCi0JLnZpZGlvY191bnN1YnNjcmliZV9ldmVudAk9IHY0bDJfZXZlbnRfdW5zdWJzY3JpYmUs Ci19OwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogVjRMMiBmaWxlIG9wZXJhdGlvbnMK LSAqLwotc3RhdGljIGludCBzdW42aV92aWRlb19vcGVuKHN0cnVjdCBmaWxlICpmaWxlKQotewot CXN0cnVjdCBzdW42aV92aWRlbyAqdmlkZW8gPSB2aWRlb19kcnZkYXRhKGZpbGUpOwotCWludCBy ZXQ7Ci0KLQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZ2aWRlby0+bG9jaykpCi0JCXJl dHVybiAtRVJFU1RBUlRTWVM7Ci0KLQlyZXQgPSB2NGwyX2ZoX29wZW4oZmlsZSk7Ci0JaWYgKHJl dCA8IDApCi0JCWdvdG8gdW5sb2NrOwotCi0JcmV0ID0gdjRsMl9waXBlbGluZV9wbV9nZXQoJnZp ZGVvLT52ZGV2LmVudGl0eSk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZmhfcmVsZWFzZTsKLQot CS8qIGNoZWNrIGlmIGFscmVhZHkgcG93ZXJlZCAqLwotCWlmICghdjRsMl9maF9pc19zaW5ndWxh cl9maWxlKGZpbGUpKSB7Ci0JCXJldCA9IC1FQlVTWTsKLQkJZ290byB1bmxvY2s7Ci0JfQotCi0J cmV0ID0gc3VuNmlfY3NpX3NldF9wb3dlcih2aWRlby0+Y3NpLCB0cnVlKTsKLQlpZiAocmV0IDwg MCkKLQkJZ290byBmaF9yZWxlYXNlOwotCi0JbXV0ZXhfdW5sb2NrKCZ2aWRlby0+bG9jayk7Ci0J cmV0dXJuIDA7Ci0KLWZoX3JlbGVhc2U6Ci0JdjRsMl9maF9yZWxlYXNlKGZpbGUpOwotdW5sb2Nr OgotCW11dGV4X3VubG9jaygmdmlkZW8tPmxvY2spOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRp YyBpbnQgc3VuNmlfdmlkZW9fY2xvc2Uoc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IHN1 bjZpX3ZpZGVvICp2aWRlbyA9IHZpZGVvX2RydmRhdGEoZmlsZSk7Ci0JYm9vbCBsYXN0X2ZoOwot Ci0JbXV0ZXhfbG9jaygmdmlkZW8tPmxvY2spOwotCi0JbGFzdF9maCA9IHY0bDJfZmhfaXNfc2lu Z3VsYXJfZmlsZShmaWxlKTsKLQotCV92YjJfZm9wX3JlbGVhc2UoZmlsZSwgTlVMTCk7Ci0KLQl2 NGwyX3BpcGVsaW5lX3BtX3B1dCgmdmlkZW8tPnZkZXYuZW50aXR5KTsKLQotCWlmIChsYXN0X2Zo KQotCQlzdW42aV9jc2lfc2V0X3Bvd2VyKHZpZGVvLT5jc2ksIGZhbHNlKTsKLQotCW11dGV4X3Vu bG9jaygmdmlkZW8tPmxvY2spOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1 Y3QgdjRsMl9maWxlX29wZXJhdGlvbnMgc3VuNmlfdmlkZW9fZm9wcyA9IHsKLQkub3duZXIJCT0g VEhJU19NT0RVTEUsCi0JLm9wZW4JCT0gc3VuNmlfdmlkZW9fb3BlbiwKLQkucmVsZWFzZQk9IHN1 bjZpX3ZpZGVvX2Nsb3NlLAotCS51bmxvY2tlZF9pb2N0bAk9IHZpZGVvX2lvY3RsMiwKLQkubW1h cAkJPSB2YjJfZm9wX21tYXAsCi0JLnBvbGwJCT0gdmIyX2ZvcF9wb2xsCi19OwotCi0vKiAtLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQotICogTWVkaWEgT3BlcmF0aW9ucwotICovCi1zdGF0aWMgaW50IHN1 bjZpX3ZpZGVvX2xpbmtfdmFsaWRhdGVfZ2V0X2Zvcm1hdChzdHJ1Y3QgbWVkaWFfcGFkICpwYWQs Ci0JCQkJCQlzdHJ1Y3QgdjRsMl9zdWJkZXZfZm9ybWF0ICpmbXQpCi17Ci0JaWYgKGlzX21lZGlh X2VudGl0eV92NGwyX3N1YmRldihwYWQtPmVudGl0eSkpIHsKLQkJc3RydWN0IHY0bDJfc3ViZGV2 ICpzZCA9Ci0JCQkJbWVkaWFfZW50aXR5X3RvX3Y0bDJfc3ViZGV2KHBhZC0+ZW50aXR5KTsKLQot CQlmbXQtPndoaWNoID0gVjRMMl9TVUJERVZfRk9STUFUX0FDVElWRTsKLQkJZm10LT5wYWQgPSBw YWQtPmluZGV4OwotCQlyZXR1cm4gdjRsMl9zdWJkZXZfY2FsbChzZCwgcGFkLCBnZXRfZm10LCBO VUxMLCBmbXQpOwotCX0KLQotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgaW50IHN1bjZp X3ZpZGVvX2xpbmtfdmFsaWRhdGUoc3RydWN0IG1lZGlhX2xpbmsgKmxpbmspCi17Ci0Jc3RydWN0 IHZpZGVvX2RldmljZSAqdmRldiA9IGNvbnRhaW5lcl9vZihsaW5rLT5zaW5rLT5lbnRpdHksCi0J CQkJCQkgc3RydWN0IHZpZGVvX2RldmljZSwgZW50aXR5KTsKLQlzdHJ1Y3Qgc3VuNmlfdmlkZW8g KnZpZGVvID0gdmlkZW9fZ2V0X2RydmRhdGEodmRldik7Ci0Jc3RydWN0IHY0bDJfc3ViZGV2X2Zv cm1hdCBzb3VyY2VfZm10OwotCWludCByZXQ7Ci0KLQl2aWRlby0+bWJ1c19jb2RlID0gMDsKLQot CWlmICghbWVkaWFfZW50aXR5X3JlbW90ZV9wYWQobGluay0+c2luay0+ZW50aXR5LT5wYWRzKSkg ewotCQlkZXZfaW5mbyh2aWRlby0+Y3NpLT5kZXYsCi0JCQkgInZpZGVvIG5vZGUgJXMgcGFkIG5v dCBjb25uZWN0ZWRcbiIsIHZkZXYtPm5hbWUpOwotCQlyZXR1cm4gLUVOT0xJTks7Ci0JfQotCi0J cmV0ID0gc3VuNmlfdmlkZW9fbGlua192YWxpZGF0ZV9nZXRfZm9ybWF0KGxpbmstPnNvdXJjZSwg JnNvdXJjZV9mbXQpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JaWYgKCFzdW42 aV9jc2lfaXNfZm9ybWF0X3N1cHBvcnRlZCh2aWRlby0+Y3NpLAotCQkJCQkgICB2aWRlby0+Zm10 LmZtdC5waXgucGl4ZWxmb3JtYXQsCi0JCQkJCSAgIHNvdXJjZV9mbXQuZm9ybWF0LmNvZGUpKSB7 Ci0JCWRldl9lcnIodmlkZW8tPmNzaS0+ZGV2LAotCQkJIlVuc3VwcG9ydGVkIHBpeGZvcm1hdDog MHgleCB3aXRoIG1idXMgY29kZTogMHgleCFcbiIsCi0JCQl2aWRlby0+Zm10LmZtdC5waXgucGl4 ZWxmb3JtYXQsCi0JCQlzb3VyY2VfZm10LmZvcm1hdC5jb2RlKTsKLQkJcmV0dXJuIC1FUElQRTsK LQl9Ci0KLQlpZiAoc291cmNlX2ZtdC5mb3JtYXQud2lkdGggIT0gdmlkZW8tPmZtdC5mbXQucGl4 LndpZHRoIHx8Ci0JICAgIHNvdXJjZV9mbXQuZm9ybWF0LmhlaWdodCAhPSB2aWRlby0+Zm10LmZt dC5waXguaGVpZ2h0KSB7Ci0JCWRldl9lcnIodmlkZW8tPmNzaS0+ZGV2LAotCQkJIldyb25nIHdp ZHRoIG9yIGhlaWdodCAldXgldSAoJXV4JXUgZXhwZWN0ZWQpXG4iLAotCQkJdmlkZW8tPmZtdC5m bXQucGl4LndpZHRoLCB2aWRlby0+Zm10LmZtdC5waXguaGVpZ2h0LAotCQkJc291cmNlX2ZtdC5m b3JtYXQud2lkdGgsIHNvdXJjZV9mbXQuZm9ybWF0LmhlaWdodCk7Ci0JCXJldHVybiAtRVBJUEU7 Ci0JfQotCi0JdmlkZW8tPm1idXNfY29kZSA9IHNvdXJjZV9mbXQuZm9ybWF0LmNvZGU7Ci0KLQly ZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBtZWRpYV9lbnRpdHlfb3BlcmF0aW9u cyBzdW42aV92aWRlb19tZWRpYV9vcHMgPSB7Ci0JLmxpbmtfdmFsaWRhdGUgPSBzdW42aV92aWRl b19saW5rX3ZhbGlkYXRlCi19OwotCi1pbnQgc3VuNmlfdmlkZW9faW5pdChzdHJ1Y3Qgc3VuNmlf dmlkZW8gKnZpZGVvLCBzdHJ1Y3Qgc3VuNmlfY3NpICpjc2ksCi0JCSAgICAgY29uc3QgY2hhciAq bmFtZSkKLXsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gJnZpZGVvLT52ZGV2OwotCXN0 cnVjdCB2YjJfcXVldWUgKnZpZHEgPSAmdmlkZW8tPnZiMl92aWRxOwotCXN0cnVjdCB2NGwyX2Zv cm1hdCBmbXQgPSB7IDAgfTsKLQlpbnQgcmV0OwotCi0JdmlkZW8tPmNzaSA9IGNzaTsKLQotCS8q IEluaXRpYWxpemUgdGhlIG1lZGlhIGVudGl0eS4uLiAqLwotCXZpZGVvLT5wYWQuZmxhZ3MgPSBN RURJQV9QQURfRkxfU0lOSyB8IE1FRElBX1BBRF9GTF9NVVNUX0NPTk5FQ1Q7Ci0JdmRldi0+ZW50 aXR5Lm9wcyA9ICZzdW42aV92aWRlb19tZWRpYV9vcHM7Ci0JcmV0ID0gbWVkaWFfZW50aXR5X3Bh ZHNfaW5pdCgmdmRldi0+ZW50aXR5LCAxLCAmdmlkZW8tPnBhZCk7Ci0JaWYgKHJldCA8IDApCi0J CXJldHVybiByZXQ7Ci0KLQltdXRleF9pbml0KCZ2aWRlby0+bG9jayk7Ci0KLQlJTklUX0xJU1Rf SEVBRCgmdmlkZW8tPmRtYV9xdWV1ZSk7Ci0Jc3Bpbl9sb2NrX2luaXQoJnZpZGVvLT5kbWFfcXVl dWVfbG9jayk7Ci0KLQl2aWRlby0+c2VxdWVuY2UgPSAwOwotCi0JLyogU2V0dXAgZGVmYXVsdCBm b3JtYXQgKi8KLQlmbXQudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKLQlmbXQu Zm10LnBpeC5waXhlbGZvcm1hdCA9IHN1cHBvcnRlZF9waXhmb3JtYXRzWzBdOwotCWZtdC5mbXQu cGl4LndpZHRoID0gMTI4MDsKLQlmbXQuZm10LnBpeC5oZWlnaHQgPSA3MjA7Ci0JZm10LmZtdC5w aXguZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7Ci0Jc3VuNmlfdmlkZW9fc2V0X2ZtdCh2aWRlbywg JmZtdCk7Ci0KLQkvKiBJbml0aWFsaXplIHZpZGVvYnVmMiBxdWV1ZSAqLwotCXZpZHEtPnR5cGUJ CQk9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKLQl2aWRxLT5pb19tb2RlcwkJCT0gVkIy X01NQVAgfCBWQjJfRE1BQlVGOwotCXZpZHEtPmRydl9wcml2CQkJPSB2aWRlbzsKLQl2aWRxLT5i dWZfc3RydWN0X3NpemUJCT0gc2l6ZW9mKHN0cnVjdCBzdW42aV9jc2lfYnVmZmVyKTsKLQl2aWRx LT5vcHMJCQk9ICZzdW42aV9jc2lfdmIyX29wczsKLQl2aWRxLT5tZW1fb3BzCQkJPSAmdmIyX2Rt YV9jb250aWdfbWVtb3BzOwotCXZpZHEtPnRpbWVzdGFtcF9mbGFncwkJPSBWNEwyX0JVRl9GTEFH X1RJTUVTVEFNUF9NT05PVE9OSUM7Ci0JdmlkcS0+bG9jawkJCT0gJnZpZGVvLT5sb2NrOwotCS8q IE1ha2Ugc3VyZSBub24tZHJvcHBlZCBmcmFtZSAqLwotCXZpZHEtPm1pbl9idWZmZXJzX25lZWRl ZAk9IDM7Ci0JdmlkcS0+ZGV2CQkJPSBjc2ktPmRldjsKLQotCXJldCA9IHZiMl9xdWV1ZV9pbml0 KHZpZHEpOwotCWlmIChyZXQpIHsKLQkJdjRsMl9lcnIoJmNzaS0+djRsMl9kZXYsICJ2YjJfcXVl dWVfaW5pdCBmYWlsZWQ6ICVkXG4iLCByZXQpOwotCQlnb3RvIGNsZWFuX2VudGl0eTsKLQl9Ci0K LQkvKiBSZWdpc3RlciB2aWRlbyBkZXZpY2UgKi8KLQlzdHJzY3B5KHZkZXYtPm5hbWUsIG5hbWUs IHNpemVvZih2ZGV2LT5uYW1lKSk7Ci0JdmRldi0+cmVsZWFzZQkJPSB2aWRlb19kZXZpY2VfcmVs ZWFzZV9lbXB0eTsKLQl2ZGV2LT5mb3BzCQk9ICZzdW42aV92aWRlb19mb3BzOwotCXZkZXYtPmlv Y3RsX29wcwkJPSAmc3VuNmlfdmlkZW9faW9jdGxfb3BzOwotCXZkZXYtPnZmbF90eXBlCQk9IFZG TF9UWVBFX1ZJREVPOwotCXZkZXYtPnZmbF9kaXIJCT0gVkZMX0RJUl9SWDsKLQl2ZGV2LT52NGwy X2RldgkJPSAmY3NpLT52NGwyX2RldjsKLQl2ZGV2LT5xdWV1ZQkJPSB2aWRxOwotCXZkZXYtPmxv Y2sJCT0gJnZpZGVvLT5sb2NrOwotCXZkZXYtPmRldmljZV9jYXBzCT0gVjRMMl9DQVBfU1RSRUFN SU5HIHwgVjRMMl9DQVBfVklERU9fQ0FQVFVSRTsKLQl2aWRlb19zZXRfZHJ2ZGF0YSh2ZGV2LCB2 aWRlbyk7Ci0KLQlyZXQgPSB2aWRlb19yZWdpc3Rlcl9kZXZpY2UodmRldiwgVkZMX1RZUEVfVklE RU8sIC0xKTsKLQlpZiAocmV0IDwgMCkgewotCQl2NGwyX2VycigmY3NpLT52NGwyX2RldiwKLQkJ CSAidmlkZW9fcmVnaXN0ZXJfZGV2aWNlIGZhaWxlZDogJWRcbiIsIHJldCk7Ci0JCWdvdG8gY2xl YW5fZW50aXR5OwotCX0KLQotCXJldHVybiAwOwotCi1jbGVhbl9lbnRpdHk6Ci0JbWVkaWFfZW50 aXR5X2NsZWFudXAoJnZpZGVvLT52ZGV2LmVudGl0eSk7Ci0JbXV0ZXhfZGVzdHJveSgmdmlkZW8t PmxvY2spOwotCXJldHVybiByZXQ7Ci19Ci0KLXZvaWQgc3VuNmlfdmlkZW9fY2xlYW51cChzdHJ1 Y3Qgc3VuNmlfdmlkZW8gKnZpZGVvKQotewotCXZiMl92aWRlb191bnJlZ2lzdGVyX2RldmljZSgm dmlkZW8tPnZkZXYpOwotCW1lZGlhX2VudGl0eV9jbGVhbnVwKCZ2aWRlby0+dmRldi5lbnRpdHkp OwotCW11dGV4X2Rlc3Ryb3koJnZpZGVvLT5sb2NrKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMv bWVkaWEvcGxhdGZvcm0vc3VueGkvc3VuNmktY3NpL3N1bjZpX3ZpZGVvLmggYi9kcml2ZXJzL21l ZGlhL3BsYXRmb3JtL3N1bnhpL3N1bjZpLWNzaS9zdW42aV92aWRlby5oCmRlbGV0ZWQgZmlsZSBt b2RlIDEwMDY0NAppbmRleCBiOWNkOTE5YzI0YWMuLjAwMDAwMDAwMDAwMAotLS0gYS9kcml2ZXJz L21lZGlhL3BsYXRmb3JtL3N1bnhpL3N1bjZpLWNzaS9zdW42aV92aWRlby5oCisrKyAvZGV2L251 bGwKQEAgLTEsMzggKzAsMCBAQAotLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAr ICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTggTWFnZXdlbGwgRWxlY3Ryb25pY3Mg Q28uLCBMdGQuIChOYW5qaW5nKQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIEF1dGhvcjog WW9uZyBEZW5nIDx5b25nLmRlbmdAbWFnZXdlbGwuY29tPgotICovCi0KLSNpZm5kZWYgX19TVU42 SV9WSURFT19IX18KLSNkZWZpbmUgX19TVU42SV9WSURFT19IX18KLQotI2luY2x1ZGUgPG1lZGlh L3Y0bDItZGV2Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvdmlkZW9idWYyLWNvcmUuaD4KLQotc3RydWN0 IHN1bjZpX2NzaTsKLQotc3RydWN0IHN1bjZpX3ZpZGVvIHsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNl CQl2ZGV2OwotCXN0cnVjdCBtZWRpYV9wYWQJCXBhZDsKLQlzdHJ1Y3Qgc3VuNmlfY3NpCQkqY3Np OwotCi0Jc3RydWN0IG11dGV4CQkJbG9jazsKLQotCXN0cnVjdCB2YjJfcXVldWUJCXZiMl92aWRx OwotCXNwaW5sb2NrX3QJCQlkbWFfcXVldWVfbG9jazsKLQlzdHJ1Y3QgbGlzdF9oZWFkCQlkbWFf cXVldWU7Ci0KLQl1bnNpZ25lZCBpbnQJCQlzZXF1ZW5jZTsKLQlzdHJ1Y3QgdjRsMl9mb3JtYXQJ CWZtdDsKLQl1MzIJCQkJbWJ1c19jb2RlOwotfTsKLQotaW50IHN1bjZpX3ZpZGVvX2luaXQoc3Ry dWN0IHN1bjZpX3ZpZGVvICp2aWRlbywgc3RydWN0IHN1bjZpX2NzaSAqY3NpLAotCQkgICAgIGNv bnN0IGNoYXIgKm5hbWUpOwotdm9pZCBzdW42aV92aWRlb19jbGVhbnVwKHN0cnVjdCBzdW42aV92 aWRlbyAqdmlkZW8pOwotCi12b2lkIHN1bjZpX3ZpZGVvX2ZyYW1lX2RvbmUoc3RydWN0IHN1bjZp X3ZpZGVvICp2aWRlbyk7Ci0KLSNlbmRpZiAvKiBfX1NVTjZJX1ZJREVPX0hfXyAqLwotLSAKMi4z Mi4wCgoKLS0gCmxpbnV4LXBoeSBtYWlsaW5nIGxpc3QKbGludXgtcGh5QGxpc3RzLmluZnJhZGVh ZC5vcmcKaHR0cHM6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgt cGh5Cg== 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=-17.1 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 47A38C433F5 for ; Fri, 10 Sep 2021 18:52:20 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 0223C60F93 for ; Fri, 10 Sep 2021 18:52:19 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 0223C60F93 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=bootlin.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=GPsnemq4hf1TeGYzMI+hMsdoHbzLZA8+GD8K45/ow9E=; b=wmTscZW9Ts8teK RZCwLYw+kOmGpmfsDJy+uB5+U3re8EAc0mRBaR7IJNaczDRr9mOfyL/e6YZpczQzUxAgP9nM/6BCf wlCqyIzuyT9kDMGtX3PDT2bq1xnxNszUR9MtKXSnccG1u6VQMXp8sRii+YgjaXklI5hPiso3EhvmX aH0i80bqD7S+zyRlOCql5vaJB0KU6cPPhlrZcMzGCRLh4I/vnCWNxcTlcLpDPGAt5N5IZIVEUqFs9 aLaIE+XXHLev6t+9u+0SRTuMKg+tnA84ybxdLVlzr0vDAuWMHPyYSpHSAM9v3TRiJldl5TBWD24Wm 3ZWQ7MdlolNNGrO2LYFg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1mOlax-00DPba-Re; Fri, 10 Sep 2021 18:49:52 +0000 Received: from relay10.mail.gandi.net ([217.70.178.230]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1mOlU0-00DM4F-9E; Fri, 10 Sep 2021 18:42:51 +0000 Received: (Authenticated sender: paul.kocialkowski@bootlin.com) by relay10.mail.gandi.net (Postfix) with ESMTPSA id 1BC3E240004; Fri, 10 Sep 2021 18:42:37 +0000 (UTC) From: Paul Kocialkowski To: linux-media@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-kernel@vger.kernel.org, linux-phy@lists.infradead.org, linux-clk@vger.kernel.org, linux-staging@lists.linux.dev Cc: Yong Deng , Mauro Carvalho Chehab , Rob Herring , Maxime Ripard , Sakari Ailus , Hans Verkuil , Chen-Yu Tsai , Jernej Skrabec , Paul Kocialkowski , Greg Kroah-Hartman , Helen Koike , Laurent Pinchart , Thomas Petazzoni Subject: [PATCH 15/22] media: sunxi: Remove the sun6i-csi driver implementation Date: Fri, 10 Sep 2021 20:41:40 +0200 Message-Id: <20210910184147.336618-16-paul.kocialkowski@bootlin.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20210910184147.336618-1-paul.kocialkowski@bootlin.com> References: <20210910184147.336618-1-paul.kocialkowski@bootlin.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210910_114240_972278_991C93BC X-CRM114-Status: GOOD ( 19.32 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org QXMgZGVzY3JpYmVkIGluIHRoZSBjb21taXQgYWRkaW5nIHN1cHBvcnQgZm9yIHRoZSBuZXcgc3Vu NmktY3NpIGRyaXZlciwKYSBjb21wbGV0ZSByZXdyaXRlIHdhcyBuZWNlc3NhcnkgdG8gc3VwcG9y dCB0aGUgQWxsd2lubmVyIEEzMSBJU1AgYXMKd2VsbCBhcyBmaXggYSBudW1iZXIgb2YgaXNzdWVz IHdpdGggdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24uCgpGYXJld2VsbCBhbmQgdGhhbmtzIGZv ciBhbGwgdGhlIHBpeGVscyEKClNpZ25lZC1vZmYtYnk6IFBhdWwgS29jaWFsa293c2tpIDxwYXVs LmtvY2lhbGtvd3NraUBib290bGluLmNvbT4KLS0tCiAuLi4vbWVkaWEvcGxhdGZvcm0vc3VueGkv c3VuNmktY3NpL0tjb25maWcgICAgfCAgMTIgLQogLi4uL21lZGlhL3BsYXRmb3JtL3N1bnhpL3N1 bjZpLWNzaS9NYWtlZmlsZSAgIHwgICA0IC0KIC4uLi9wbGF0Zm9ybS9zdW54aS9zdW42aS1jc2kv c3VuNmlfY3NpLmMgICAgICB8IDkzNiAtLS0tLS0tLS0tLS0tLS0tLS0KIC4uLi9wbGF0Zm9ybS9z dW54aS9zdW42aS1jc2kvc3VuNmlfY3NpLmggICAgICB8IDEzOCAtLS0KIC4uLi9wbGF0Zm9ybS9z dW54aS9zdW42aS1jc2kvc3VuNmlfY3NpX3JlZy5oICB8IDE5NiAtLS0tCiAuLi4vcGxhdGZvcm0v c3VueGkvc3VuNmktY3NpL3N1bjZpX3ZpZGVvLmMgICAgfCA2ODMgLS0tLS0tLS0tLS0tLQogLi4u L3BsYXRmb3JtL3N1bnhpL3N1bjZpLWNzaS9zdW42aV92aWRlby5oICAgIHwgIDM4IC0KIDcgZmls ZXMgY2hhbmdlZCwgMjAwNyBkZWxldGlvbnMoLSkKIGRlbGV0ZSBtb2RlIDEwMDY0NCBkcml2ZXJz L21lZGlhL3BsYXRmb3JtL3N1bnhpL3N1bjZpLWNzaS9LY29uZmlnCiBkZWxldGUgbW9kZSAxMDA2 NDQgZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zdW54aS9zdW42aS1jc2kvTWFrZWZpbGUKIGRlbGV0 ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL21lZGlhL3BsYXRmb3JtL3N1bnhpL3N1bjZpLWNzaS9zdW42 aV9jc2kuYwogZGVsZXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvbWVkaWEvcGxhdGZvcm0vc3VueGkv c3VuNmktY3NpL3N1bjZpX2NzaS5oCiBkZWxldGUgbW9kZSAxMDA2NDQgZHJpdmVycy9tZWRpYS9w bGF0Zm9ybS9zdW54aS9zdW42aS1jc2kvc3VuNmlfY3NpX3JlZy5oCiBkZWxldGUgbW9kZSAxMDA2 NDQgZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zdW54aS9zdW42aS1jc2kvc3VuNmlfdmlkZW8uYwog ZGVsZXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvbWVkaWEvcGxhdGZvcm0vc3VueGkvc3VuNmktY3Np L3N1bjZpX3ZpZGVvLmgKCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3N1bnhp L3N1bjZpLWNzaS9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zdW54aS9zdW42aS1j c2kvS2NvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg2ZTNmYjNhODBkLi4w MDAwMDAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zdW54aS9zdW42aS1jc2kv S2NvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMgU1BEWC1MaWNlbnNlLUlk ZW50aWZpZXI6IEdQTC0yLjAtb25seQotY29uZmlnIFZJREVPX1NVTjZJX0NTSQotCXRyaXN0YXRl ICJBbGx3aW5uZXIgVjNzIENhbWVyYSBTZW5zb3IgSW50ZXJmYWNlIGRyaXZlciIKLQlkZXBlbmRz IG9uIFZJREVPX1Y0TDIgJiYgQ09NTU9OX0NMSyAgJiYgSEFTX0RNQQotCWRlcGVuZHMgb24gQVJD SF9TVU5YSSB8fCBDT01QSUxFX1RFU1QKLQlzZWxlY3QgTUVESUFfQ09OVFJPTExFUgotCXNlbGVj dCBWSURFT19WNEwyX1NVQkRFVl9BUEkKLQlzZWxlY3QgVklERU9CVUYyX0RNQV9DT05USUcKLQlz ZWxlY3QgUkVHTUFQX01NSU8KLQlzZWxlY3QgVjRMMl9GV05PREUKLQloZWxwCi0JICAgU3VwcG9y dCBmb3IgdGhlIEFsbHdpbm5lciBDYW1lcmEgU2Vuc29yIEludGVyZmFjZSBDb250cm9sbGVyIG9u IFYzcy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vc3VueGkvc3VuNmktY3Np L01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zdW54aS9zdW42aS1jc2kvTWFrZWZp bGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ZTMxNTM0NzgwNC4uMDAwMDAwMDAw MDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vc3VueGkvc3VuNmktY3NpL01ha2VmaWxl CisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jIFNQRFgtTGljZW5zZS1JZGVudGlmaWVy OiBHUEwtMi4wLW9ubHkKLXN1bjZpLWNzaS15ICs9IHN1bjZpX3ZpZGVvLm8gc3VuNmlfY3NpLm8K LQotb2JqLSQoQ09ORklHX1ZJREVPX1NVTjZJX0NTSSkgKz0gc3VuNmktY3NpLm8KZGlmZiAtLWdp dCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vc3VueGkvc3VuNmktY3NpL3N1bjZpX2NzaS5jIGIv ZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zdW54aS9zdW42aS1jc2kvc3VuNmlfY3NpLmMKZGVsZXRl ZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3OTM1ZjFlOTU1NS4uMDAwMDAwMDAwMDAwCi0tLSBh L2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vc3VueGkvc3VuNmktY3NpL3N1bjZpX2NzaS5jCisrKyAv ZGV2L251bGwKQEAgLTEsOTM2ICswLDAgQEAKLS8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBH UEwtMi4wKwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMS0yMDE4IE1hZ2V3ZWxsIEVsZWN0cm9u aWNzIENvLiwgTHRkLiAoTmFuamluZykKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBBdXRo b3I6IFlvbmcgRGVuZyA8eW9uZy5kZW5nQG1hZ2V3ZWxsLmNvbT4KLSAqLwotCi0jaW5jbHVkZSA8 bGludXgvY2xrLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9k bWEtbWFwcGluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L2Zz Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4K LSNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2lu Y2x1ZGUgPGxpbnV4L29mLmg+Ci0jaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+Ci0jaW5jbHVk ZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5o PgotI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgotI2luY2x1ZGUgPGxpbnV4L3Jlc2V0Lmg+Ci0j aW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9zaXplcy5oPgotI2luY2x1 ZGUgPGxpbnV4L3NsYWIuaD4KLQotI2luY2x1ZGUgInN1bjZpX2NzaS5oIgotI2luY2x1ZGUgInN1 bjZpX2NzaV9yZWcuaCIKLQotI2RlZmluZSBNT0RVTEVfTkFNRQkic3VuNmktY3NpIgotCi1zdHJ1 Y3Qgc3VuNmlfY3NpX2RldiB7Ci0Jc3RydWN0IHN1bjZpX2NzaQkJY3NpOwotCXN0cnVjdCBkZXZp Y2UJCQkqZGV2OwotCi0Jc3RydWN0IHJlZ21hcAkJCSpyZWdtYXA7Ci0Jc3RydWN0IGNsawkJCSpj bGtfbW9kOwotCXN0cnVjdCBjbGsJCQkqY2xrX3JhbTsKLQlzdHJ1Y3QgcmVzZXRfY29udHJvbAkJ KnJzdGNfYnVzOwotCi0JaW50CQkJCXBsYW5hcl9vZmZzZXRbM107Ci19OwotCi1zdGF0aWMgaW5s aW5lIHN0cnVjdCBzdW42aV9jc2lfZGV2ICpzdW42aV9jc2lfdG9fZGV2KHN0cnVjdCBzdW42aV9j c2kgKmNzaSkKLXsKLQlyZXR1cm4gY29udGFpbmVyX29mKGNzaSwgc3RydWN0IHN1bjZpX2NzaV9k ZXYsIGNzaSk7Ci19Ci0KLS8qIFRPRE8gYWRkIDEwJjEyIGJpdCBZVVYsIFJHQiBzdXBwb3J0ICov Ci1ib29sIHN1bjZpX2NzaV9pc19mb3JtYXRfc3VwcG9ydGVkKHN0cnVjdCBzdW42aV9jc2kgKmNz aSwKLQkJCQkgICB1MzIgcGl4Zm9ybWF0LCB1MzIgbWJ1c19jb2RlKQotewotCXN0cnVjdCBzdW42 aV9jc2lfZGV2ICpzZGV2ID0gc3VuNmlfY3NpX3RvX2Rldihjc2kpOwotCi0JLyoKLQkgKiBTb21l IHZpZGVvIHJlY2VpdmVycyBoYXZlIHRoZSBhYmlsaXR5IHRvIGJlIGNvbXBhdGlibGUgd2l0aAot CSAqIDhiaXQgYW5kIDE2Yml0IGJ1cyB3aWR0aC4KLQkgKiBJZGVudGlmeSB0aGUgbWVkaWEgYnVz IGZvcm1hdCBmcm9tIGRldmljZSB0cmVlLgotCSAqLwotCWlmICgoc2Rldi0+Y3NpLnY0bDJfZXAu YnVzX3R5cGUgPT0gVjRMMl9NQlVTX1BBUkFMTEVMCi0JICAgICB8fCBzZGV2LT5jc2kudjRsMl9l cC5idXNfdHlwZSA9PSBWNEwyX01CVVNfQlQ2NTYpCi0JICAgICAmJiBzZGV2LT5jc2kudjRsMl9l cC5idXMucGFyYWxsZWwuYnVzX3dpZHRoID09IDE2KSB7Ci0JCXN3aXRjaCAocGl4Zm9ybWF0KSB7 Ci0JCWNhc2UgVjRMMl9QSVhfRk1UX0hNMTI6Ci0JCWNhc2UgVjRMMl9QSVhfRk1UX05WMTI6Ci0J CWNhc2UgVjRMMl9QSVhfRk1UX05WMjE6Ci0JCWNhc2UgVjRMMl9QSVhfRk1UX05WMTY6Ci0JCWNh c2UgVjRMMl9QSVhfRk1UX05WNjE6Ci0JCWNhc2UgVjRMMl9QSVhfRk1UX1lVVjQyMDoKLQkJY2Fz ZSBWNEwyX1BJWF9GTVRfWVZVNDIwOgotCQljYXNlIFY0TDJfUElYX0ZNVF9ZVVY0MjJQOgotCQkJ c3dpdGNoIChtYnVzX2NvZGUpIHsKLQkJCWNhc2UgTUVESUFfQlVTX0ZNVF9VWVZZOF8xWDE2Ogot CQkJY2FzZSBNRURJQV9CVVNfRk1UX1ZZVVk4XzFYMTY6Ci0JCQljYXNlIE1FRElBX0JVU19GTVRf WVVZVjhfMVgxNjoKLQkJCWNhc2UgTUVESUFfQlVTX0ZNVF9ZVllVOF8xWDE2OgotCQkJCXJldHVy biB0cnVlOwotCQkJZGVmYXVsdDoKLQkJCQlkZXZfZGJnKHNkZXYtPmRldiwgIlVuc3VwcG9ydGVk IG1idXMgY29kZTogMHgleFxuIiwKLQkJCQkJbWJ1c19jb2RlKTsKLQkJCQlicmVhazsKLQkJCX0K LQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJZGV2X2RiZyhzZGV2LT5kZXYsICJVbnN1cHBvcnRl ZCBwaXhmb3JtYXQ6IDB4JXhcbiIsCi0JCQkJcGl4Zm9ybWF0KTsKLQkJCWJyZWFrOwotCQl9Ci0J CXJldHVybiBmYWxzZTsKLQl9Ci0KLQlzd2l0Y2ggKHBpeGZvcm1hdCkgewotCWNhc2UgVjRMMl9Q SVhfRk1UX1NCR0dSODoKLQkJcmV0dXJuIChtYnVzX2NvZGUgPT0gTUVESUFfQlVTX0ZNVF9TQkdH UjhfMVg4KTsKLQljYXNlIFY0TDJfUElYX0ZNVF9TR0JSRzg6Ci0JCXJldHVybiAobWJ1c19jb2Rl ID09IE1FRElBX0JVU19GTVRfU0dCUkc4XzFYOCk7Ci0JY2FzZSBWNEwyX1BJWF9GTVRfU0dSQkc4 OgotCQlyZXR1cm4gKG1idXNfY29kZSA9PSBNRURJQV9CVVNfRk1UX1NHUkJHOF8xWDgpOwotCWNh c2UgVjRMMl9QSVhfRk1UX1NSR0dCODoKLQkJcmV0dXJuIChtYnVzX2NvZGUgPT0gTUVESUFfQlVT X0ZNVF9TUkdHQjhfMVg4KTsKLQljYXNlIFY0TDJfUElYX0ZNVF9TQkdHUjEwOgotCQlyZXR1cm4g KG1idXNfY29kZSA9PSBNRURJQV9CVVNfRk1UX1NCR0dSMTBfMVgxMCk7Ci0JY2FzZSBWNEwyX1BJ WF9GTVRfU0dCUkcxMDoKLQkJcmV0dXJuIChtYnVzX2NvZGUgPT0gTUVESUFfQlVTX0ZNVF9TR0JS RzEwXzFYMTApOwotCWNhc2UgVjRMMl9QSVhfRk1UX1NHUkJHMTA6Ci0JCXJldHVybiAobWJ1c19j b2RlID09IE1FRElBX0JVU19GTVRfU0dSQkcxMF8xWDEwKTsKLQljYXNlIFY0TDJfUElYX0ZNVF9T UkdHQjEwOgotCQlyZXR1cm4gKG1idXNfY29kZSA9PSBNRURJQV9CVVNfRk1UX1NSR0dCMTBfMVgx MCk7Ci0JY2FzZSBWNEwyX1BJWF9GTVRfU0JHR1IxMjoKLQkJcmV0dXJuIChtYnVzX2NvZGUgPT0g TUVESUFfQlVTX0ZNVF9TQkdHUjEyXzFYMTIpOwotCWNhc2UgVjRMMl9QSVhfRk1UX1NHQlJHMTI6 Ci0JCXJldHVybiAobWJ1c19jb2RlID09IE1FRElBX0JVU19GTVRfU0dCUkcxMl8xWDEyKTsKLQlj YXNlIFY0TDJfUElYX0ZNVF9TR1JCRzEyOgotCQlyZXR1cm4gKG1idXNfY29kZSA9PSBNRURJQV9C VVNfRk1UX1NHUkJHMTJfMVgxMik7Ci0JY2FzZSBWNEwyX1BJWF9GTVRfU1JHR0IxMjoKLQkJcmV0 dXJuIChtYnVzX2NvZGUgPT0gTUVESUFfQlVTX0ZNVF9TUkdHQjEyXzFYMTIpOwotCi0JY2FzZSBW NEwyX1BJWF9GTVRfWVVZVjoKLQkJcmV0dXJuIChtYnVzX2NvZGUgPT0gTUVESUFfQlVTX0ZNVF9Z VVlWOF8yWDgpOwotCWNhc2UgVjRMMl9QSVhfRk1UX1lWWVU6Ci0JCXJldHVybiAobWJ1c19jb2Rl ID09IE1FRElBX0JVU19GTVRfWVZZVThfMlg4KTsKLQljYXNlIFY0TDJfUElYX0ZNVF9VWVZZOgot CQlyZXR1cm4gKG1idXNfY29kZSA9PSBNRURJQV9CVVNfRk1UX1VZVlk4XzJYOCk7Ci0JY2FzZSBW NEwyX1BJWF9GTVRfVllVWToKLQkJcmV0dXJuIChtYnVzX2NvZGUgPT0gTUVESUFfQlVTX0ZNVF9W WVVZOF8yWDgpOwotCi0JY2FzZSBWNEwyX1BJWF9GTVRfSE0xMjoKLQljYXNlIFY0TDJfUElYX0ZN VF9OVjEyOgotCWNhc2UgVjRMMl9QSVhfRk1UX05WMjE6Ci0JY2FzZSBWNEwyX1BJWF9GTVRfTlYx NjoKLQljYXNlIFY0TDJfUElYX0ZNVF9OVjYxOgotCWNhc2UgVjRMMl9QSVhfRk1UX1lVVjQyMDoK LQljYXNlIFY0TDJfUElYX0ZNVF9ZVlU0MjA6Ci0JY2FzZSBWNEwyX1BJWF9GTVRfWVVWNDIyUDoK LQkJc3dpdGNoIChtYnVzX2NvZGUpIHsKLQkJY2FzZSBNRURJQV9CVVNfRk1UX1VZVlk4XzJYODoK LQkJY2FzZSBNRURJQV9CVVNfRk1UX1ZZVVk4XzJYODoKLQkJY2FzZSBNRURJQV9CVVNfRk1UX1lV WVY4XzJYODoKLQkJY2FzZSBNRURJQV9CVVNfRk1UX1lWWVU4XzJYODoKLQkJCXJldHVybiB0cnVl OwotCQlkZWZhdWx0OgotCQkJZGV2X2RiZyhzZGV2LT5kZXYsICJVbnN1cHBvcnRlZCBtYnVzIGNv ZGU6IDB4JXhcbiIsCi0JCQkJbWJ1c19jb2RlKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwot Ci0JY2FzZSBWNEwyX1BJWF9GTVRfUkdCNTY1OgotCQlyZXR1cm4gKG1idXNfY29kZSA9PSBNRURJ QV9CVVNfRk1UX1JHQjU2NV8yWDhfTEUpOwotCWNhc2UgVjRMMl9QSVhfRk1UX1JHQjU2NVg6Ci0J CXJldHVybiAobWJ1c19jb2RlID09IE1FRElBX0JVU19GTVRfUkdCNTY1XzJYOF9CRSk7Ci0KLQlj YXNlIFY0TDJfUElYX0ZNVF9KUEVHOgotCQlyZXR1cm4gKG1idXNfY29kZSA9PSBNRURJQV9CVVNf Rk1UX0pQRUdfMVg4KTsKLQotCWRlZmF1bHQ6Ci0JCWRldl9kYmcoc2Rldi0+ZGV2LCAiVW5zdXBw b3J0ZWQgcGl4Zm9ybWF0OiAweCV4XG4iLCBwaXhmb3JtYXQpOwotCQlicmVhazsKLQl9Ci0KLQly ZXR1cm4gZmFsc2U7Ci19Ci0KLWludCBzdW42aV9jc2lfc2V0X3Bvd2VyKHN0cnVjdCBzdW42aV9j c2kgKmNzaSwgYm9vbCBlbmFibGUpCi17Ci0Jc3RydWN0IHN1bjZpX2NzaV9kZXYgKnNkZXYgPSBz dW42aV9jc2lfdG9fZGV2KGNzaSk7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gc2Rldi0+ZGV2Owot CXN0cnVjdCByZWdtYXAgKnJlZ21hcCA9IHNkZXYtPnJlZ21hcDsKLQlpbnQgcmV0OwotCi0JaWYg KCFlbmFibGUpIHsKLQkJcmVnbWFwX3VwZGF0ZV9iaXRzKHJlZ21hcCwgQ1NJX0VOX1JFRywgQ1NJ X0VOX0NTSV9FTiwgMCk7Ci0KLQkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHNkZXYtPmNsa19yYW0p OwotCQlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUoZGV2LT5vZl9ub2RlLAotCQkJCQkgICAg ImFsbHdpbm5lcixzdW41MGktYTY0LWNzaSIpKQotCQkJY2xrX3JhdGVfZXhjbHVzaXZlX3B1dChz ZGV2LT5jbGtfbW9kKTsKLQkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHNkZXYtPmNsa19tb2QpOwot CQlyZXNldF9jb250cm9sX2Fzc2VydChzZGV2LT5yc3RjX2J1cyk7Ci0JCXJldHVybiAwOwotCX0K LQotCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShzZGV2LT5jbGtfbW9kKTsKLQlpZiAocmV0KSB7 Ci0JCWRldl9lcnIoc2Rldi0+ZGV2LCAiRW5hYmxlIGNzaSBjbGsgZXJyICVkXG4iLCByZXQpOwot CQlyZXR1cm4gcmV0OwotCX0KLQotCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShkZXYtPm9m X25vZGUsICJhbGx3aW5uZXIsc3VuNTBpLWE2NC1jc2kiKSkKLQkJY2xrX3NldF9yYXRlX2V4Y2x1 c2l2ZShzZGV2LT5jbGtfbW9kLCAzMDAwMDAwMDApOwotCi0JcmV0ID0gY2xrX3ByZXBhcmVfZW5h YmxlKHNkZXYtPmNsa19yYW0pOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycihzZGV2LT5kZXYsICJF bmFibGUgY2xrX2RyYW1fY3NpIGNsayBlcnIgJWRcbiIsIHJldCk7Ci0JCWdvdG8gY2xrX21vZF9k aXNhYmxlOwotCX0KLQotCXJldCA9IHJlc2V0X2NvbnRyb2xfZGVhc3NlcnQoc2Rldi0+cnN0Y19i dXMpOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycihzZGV2LT5kZXYsICJyZXNldCBlcnIgJWRcbiIs IHJldCk7Ci0JCWdvdG8gY2xrX3JhbV9kaXNhYmxlOwotCX0KLQotCXJlZ21hcF91cGRhdGVfYml0 cyhyZWdtYXAsIENTSV9FTl9SRUcsIENTSV9FTl9DU0lfRU4sIENTSV9FTl9DU0lfRU4pOwotCi0J cmV0dXJuIDA7Ci0KLWNsa19yYW1fZGlzYWJsZToKLQljbGtfZGlzYWJsZV91bnByZXBhcmUoc2Rl di0+Y2xrX3JhbSk7Ci1jbGtfbW9kX2Rpc2FibGU6Ci0JaWYgKG9mX2RldmljZV9pc19jb21wYXRp YmxlKGRldi0+b2Zfbm9kZSwgImFsbHdpbm5lcixzdW41MGktYTY0LWNzaSIpKQotCQljbGtfcmF0 ZV9leGNsdXNpdmVfcHV0KHNkZXYtPmNsa19tb2QpOwotCWNsa19kaXNhYmxlX3VucHJlcGFyZShz ZGV2LT5jbGtfbW9kKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgZW51bSBjc2lfaW5wdXRf Zm10IGdldF9jc2lfaW5wdXRfZm9ybWF0KHN0cnVjdCBzdW42aV9jc2lfZGV2ICpzZGV2LAotCQkJ CQkgICAgICAgdTMyIG1idXNfY29kZSwgdTMyIHBpeGZvcm1hdCkKLXsKLQkvKiBub24tWVVWICov Ci0JaWYgKChtYnVzX2NvZGUgJiAweEYwMDApICE9IDB4MjAwMCkKLQkJcmV0dXJuIENTSV9JTlBV VF9GT1JNQVRfUkFXOwotCi0Jc3dpdGNoIChwaXhmb3JtYXQpIHsKLQljYXNlIFY0TDJfUElYX0ZN VF9ZVVlWOgotCWNhc2UgVjRMMl9QSVhfRk1UX1lWWVU6Ci0JY2FzZSBWNEwyX1BJWF9GTVRfVVlW WToKLQljYXNlIFY0TDJfUElYX0ZNVF9WWVVZOgotCQlyZXR1cm4gQ1NJX0lOUFVUX0ZPUk1BVF9S QVc7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JLyogbm90IHN1cHBvcnQgWVVWNDIwIGlu cHV0IGZvcm1hdCB5ZXQgKi8KLQlkZXZfZGJnKHNkZXYtPmRldiwgIlNlbGVjdCBZVVY0MjIgYXMg ZGVmYXVsdCBpbnB1dCBmb3JtYXQgb2YgQ1NJLlxuIik7Ci0JcmV0dXJuIENTSV9JTlBVVF9GT1JN QVRfWVVWNDIyOwotfQotCi1zdGF0aWMgZW51bSBjc2lfb3V0cHV0X2ZtdCBnZXRfY3NpX291dHB1 dF9mb3JtYXQoc3RydWN0IHN1bjZpX2NzaV9kZXYgKnNkZXYsCi0JCQkJCQkgdTMyIHBpeGZvcm1h dCwgdTMyIGZpZWxkKQotewotCWJvb2wgYnVmX2ludGVybGFjZWQgPSBmYWxzZTsKLQotCWlmIChm aWVsZCA9PSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQKLQkgICAgfHwgZmllbGQgPT0gVjRMMl9GSUVM RF9JTlRFUkxBQ0VEX1RCCi0JICAgIHx8IGZpZWxkID09IFY0TDJfRklFTERfSU5URVJMQUNFRF9C VCkKLQkJYnVmX2ludGVybGFjZWQgPSB0cnVlOwotCi0Jc3dpdGNoIChwaXhmb3JtYXQpIHsKLQlj YXNlIFY0TDJfUElYX0ZNVF9TQkdHUjg6Ci0JY2FzZSBWNEwyX1BJWF9GTVRfU0dCUkc4OgotCWNh c2UgVjRMMl9QSVhfRk1UX1NHUkJHODoKLQljYXNlIFY0TDJfUElYX0ZNVF9TUkdHQjg6Ci0JCXJl dHVybiBidWZfaW50ZXJsYWNlZCA/IENTSV9GUkFNRV9SQVdfOCA6IENTSV9GSUVMRF9SQVdfODsK LQljYXNlIFY0TDJfUElYX0ZNVF9TQkdHUjEwOgotCWNhc2UgVjRMMl9QSVhfRk1UX1NHQlJHMTA6 Ci0JY2FzZSBWNEwyX1BJWF9GTVRfU0dSQkcxMDoKLQljYXNlIFY0TDJfUElYX0ZNVF9TUkdHQjEw OgotCQlyZXR1cm4gYnVmX2ludGVybGFjZWQgPyBDU0lfRlJBTUVfUkFXXzEwIDogQ1NJX0ZJRUxE X1JBV18xMDsKLQljYXNlIFY0TDJfUElYX0ZNVF9TQkdHUjEyOgotCWNhc2UgVjRMMl9QSVhfRk1U X1NHQlJHMTI6Ci0JY2FzZSBWNEwyX1BJWF9GTVRfU0dSQkcxMjoKLQljYXNlIFY0TDJfUElYX0ZN VF9TUkdHQjEyOgotCQlyZXR1cm4gYnVmX2ludGVybGFjZWQgPyBDU0lfRlJBTUVfUkFXXzEyIDog Q1NJX0ZJRUxEX1JBV18xMjsKLQotCWNhc2UgVjRMMl9QSVhfRk1UX1lVWVY6Ci0JY2FzZSBWNEwy X1BJWF9GTVRfWVZZVToKLQljYXNlIFY0TDJfUElYX0ZNVF9VWVZZOgotCWNhc2UgVjRMMl9QSVhf Rk1UX1ZZVVk6Ci0JCXJldHVybiBidWZfaW50ZXJsYWNlZCA/IENTSV9GUkFNRV9SQVdfOCA6IENT SV9GSUVMRF9SQVdfODsKLQotCWNhc2UgVjRMMl9QSVhfRk1UX0hNMTI6Ci0JCXJldHVybiBidWZf aW50ZXJsYWNlZCA/IENTSV9GUkFNRV9NQl9ZVVY0MjAgOgotCQkJCQlDU0lfRklFTERfTUJfWVVW NDIwOwotCWNhc2UgVjRMMl9QSVhfRk1UX05WMTI6Ci0JY2FzZSBWNEwyX1BJWF9GTVRfTlYyMToK LQkJcmV0dXJuIGJ1Zl9pbnRlcmxhY2VkID8gQ1NJX0ZSQU1FX1VWX0NCX1lVVjQyMCA6Ci0JCQkJ CUNTSV9GSUVMRF9VVl9DQl9ZVVY0MjA7Ci0JY2FzZSBWNEwyX1BJWF9GTVRfWVVWNDIwOgotCWNh c2UgVjRMMl9QSVhfRk1UX1lWVTQyMDoKLQkJcmV0dXJuIGJ1Zl9pbnRlcmxhY2VkID8gQ1NJX0ZS QU1FX1BMQU5BUl9ZVVY0MjAgOgotCQkJCQlDU0lfRklFTERfUExBTkFSX1lVVjQyMDsKLQljYXNl IFY0TDJfUElYX0ZNVF9OVjE2OgotCWNhc2UgVjRMMl9QSVhfRk1UX05WNjE6Ci0JCXJldHVybiBi dWZfaW50ZXJsYWNlZCA/IENTSV9GUkFNRV9VVl9DQl9ZVVY0MjIgOgotCQkJCQlDU0lfRklFTERf VVZfQ0JfWVVWNDIyOwotCWNhc2UgVjRMMl9QSVhfRk1UX1lVVjQyMlA6Ci0JCXJldHVybiBidWZf aW50ZXJsYWNlZCA/IENTSV9GUkFNRV9QTEFOQVJfWVVWNDIyIDoKLQkJCQkJQ1NJX0ZJRUxEX1BM QU5BUl9ZVVY0MjI7Ci0KLQljYXNlIFY0TDJfUElYX0ZNVF9SR0I1NjU6Ci0JY2FzZSBWNEwyX1BJ WF9GTVRfUkdCNTY1WDoKLQkJcmV0dXJuIGJ1Zl9pbnRlcmxhY2VkID8gQ1NJX0ZSQU1FX1JHQjU2 NSA6IENTSV9GSUVMRF9SR0I1NjU7Ci0KLQljYXNlIFY0TDJfUElYX0ZNVF9KUEVHOgotCQlyZXR1 cm4gYnVmX2ludGVybGFjZWQgPyBDU0lfRlJBTUVfUkFXXzggOiBDU0lfRklFTERfUkFXXzg7Ci0K LQlkZWZhdWx0OgotCQlkZXZfd2FybihzZGV2LT5kZXYsICJVbnN1cHBvcnRlZCBwaXhmb3JtYXQ6 IDB4JXhcbiIsIHBpeGZvcm1hdCk7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiBDU0lfRklFTERf UkFXXzg7Ci19Ci0KLXN0YXRpYyBlbnVtIGNzaV9pbnB1dF9zZXEgZ2V0X2NzaV9pbnB1dF9zZXEo c3RydWN0IHN1bjZpX2NzaV9kZXYgKnNkZXYsCi0JCQkJCSAgICB1MzIgbWJ1c19jb2RlLCB1MzIg cGl4Zm9ybWF0KQotewotCS8qIElucHV0IHNlcXVlbmNlIGRvZXMgbm90IGFwcGx5IHRvIG5vbi1Z VVYgZm9ybWF0cyAqLwotCWlmICgobWJ1c19jb2RlICYgMHhGMDAwKSAhPSAweDIwMDApCi0JCXJl dHVybiAwOwotCi0Jc3dpdGNoIChwaXhmb3JtYXQpIHsKLQljYXNlIFY0TDJfUElYX0ZNVF9ITTEy OgotCWNhc2UgVjRMMl9QSVhfRk1UX05WMTI6Ci0JY2FzZSBWNEwyX1BJWF9GTVRfTlYxNjoKLQlj YXNlIFY0TDJfUElYX0ZNVF9ZVVY0MjA6Ci0JY2FzZSBWNEwyX1BJWF9GTVRfWVVWNDIyUDoKLQkJ c3dpdGNoIChtYnVzX2NvZGUpIHsKLQkJY2FzZSBNRURJQV9CVVNfRk1UX1VZVlk4XzJYODoKLQkJ Y2FzZSBNRURJQV9CVVNfRk1UX1VZVlk4XzFYMTY6Ci0JCQlyZXR1cm4gQ1NJX0lOUFVUX1NFUV9V WVZZOwotCQljYXNlIE1FRElBX0JVU19GTVRfVllVWThfMlg4OgotCQljYXNlIE1FRElBX0JVU19G TVRfVllVWThfMVgxNjoKLQkJCXJldHVybiBDU0lfSU5QVVRfU0VRX1ZZVVk7Ci0JCWNhc2UgTUVE SUFfQlVTX0ZNVF9ZVVlWOF8yWDg6Ci0JCWNhc2UgTUVESUFfQlVTX0ZNVF9ZVVlWOF8xWDE2Ogot CQkJcmV0dXJuIENTSV9JTlBVVF9TRVFfWVVZVjsKLQkJY2FzZSBNRURJQV9CVVNfRk1UX1lWWVU4 XzFYMTY6Ci0JCWNhc2UgTUVESUFfQlVTX0ZNVF9ZVllVOF8yWDg6Ci0JCQlyZXR1cm4gQ1NJX0lO UFVUX1NFUV9ZVllVOwotCQlkZWZhdWx0OgotCQkJZGV2X3dhcm4oc2Rldi0+ZGV2LCAiVW5zdXBw b3J0ZWQgbWJ1cyBjb2RlOiAweCV4XG4iLAotCQkJCSBtYnVzX2NvZGUpOwotCQkJYnJlYWs7Ci0J CX0KLQkJYnJlYWs7Ci0JY2FzZSBWNEwyX1BJWF9GTVRfTlYyMToKLQljYXNlIFY0TDJfUElYX0ZN VF9OVjYxOgotCWNhc2UgVjRMMl9QSVhfRk1UX1lWVTQyMDoKLQkJc3dpdGNoIChtYnVzX2NvZGUp IHsKLQkJY2FzZSBNRURJQV9CVVNfRk1UX1VZVlk4XzJYODoKLQkJY2FzZSBNRURJQV9CVVNfRk1U X1VZVlk4XzFYMTY6Ci0JCQlyZXR1cm4gQ1NJX0lOUFVUX1NFUV9WWVVZOwotCQljYXNlIE1FRElB X0JVU19GTVRfVllVWThfMlg4OgotCQljYXNlIE1FRElBX0JVU19GTVRfVllVWThfMVgxNjoKLQkJ CXJldHVybiBDU0lfSU5QVVRfU0VRX1VZVlk7Ci0JCWNhc2UgTUVESUFfQlVTX0ZNVF9ZVVlWOF8y WDg6Ci0JCWNhc2UgTUVESUFfQlVTX0ZNVF9ZVVlWOF8xWDE2OgotCQkJcmV0dXJuIENTSV9JTlBV VF9TRVFfWVZZVTsKLQkJY2FzZSBNRURJQV9CVVNfRk1UX1lWWVU4XzFYMTY6Ci0JCWNhc2UgTUVE SUFfQlVTX0ZNVF9ZVllVOF8yWDg6Ci0JCQlyZXR1cm4gQ1NJX0lOUFVUX1NFUV9ZVVlWOwotCQlk ZWZhdWx0OgotCQkJZGV2X3dhcm4oc2Rldi0+ZGV2LCAiVW5zdXBwb3J0ZWQgbWJ1cyBjb2RlOiAw eCV4XG4iLAotCQkJCSBtYnVzX2NvZGUpOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0KLQlj YXNlIFY0TDJfUElYX0ZNVF9ZVVlWOgotCQlyZXR1cm4gQ1NJX0lOUFVUX1NFUV9ZVVlWOwotCi0J ZGVmYXVsdDoKLQkJZGV2X3dhcm4oc2Rldi0+ZGV2LCAiVW5zdXBwb3J0ZWQgcGl4Zm9ybWF0OiAw eCV4LCBkZWZhdWx0aW5nIHRvIFlVWVZcbiIsCi0JCQkgcGl4Zm9ybWF0KTsKLQkJYnJlYWs7Ci0J fQotCi0JcmV0dXJuIENTSV9JTlBVVF9TRVFfWVVZVjsKLX0KLQotc3RhdGljIHZvaWQgc3VuNmlf Y3NpX3NldHVwX2J1cyhzdHJ1Y3Qgc3VuNmlfY3NpX2RldiAqc2RldikKLXsKLQlzdHJ1Y3QgdjRs Ml9md25vZGVfZW5kcG9pbnQgKmVuZHBvaW50ID0gJnNkZXYtPmNzaS52NGwyX2VwOwotCXN0cnVj dCBzdW42aV9jc2kgKmNzaSA9ICZzZGV2LT5jc2k7Ci0JdW5zaWduZWQgY2hhciBidXNfd2lkdGg7 Ci0JdTMyIGZsYWdzOwotCXUzMiBjZmc7Ci0JYm9vbCBpbnB1dF9pbnRlcmxhY2VkID0gZmFsc2U7 Ci0KLQlpZiAoY3NpLT5jb25maWcuZmllbGQgPT0gVjRMMl9GSUVMRF9JTlRFUkxBQ0VECi0JICAg IHx8IGNzaS0+Y29uZmlnLmZpZWxkID09IFY0TDJfRklFTERfSU5URVJMQUNFRF9UQgotCSAgICB8 fCBjc2ktPmNvbmZpZy5maWVsZCA9PSBWNEwyX0ZJRUxEX0lOVEVSTEFDRURfQlQpCi0JCWlucHV0 X2ludGVybGFjZWQgPSB0cnVlOwotCi0JYnVzX3dpZHRoID0gZW5kcG9pbnQtPmJ1cy5wYXJhbGxl bC5idXNfd2lkdGg7Ci0KLQlyZWdtYXBfcmVhZChzZGV2LT5yZWdtYXAsIENTSV9JRl9DRkdfUkVH LCAmY2ZnKTsKLQotCWNmZyAmPSB+KENTSV9JRl9DRkdfQ1NJX0lGX01BU0sgfCBDU0lfSUZfQ0ZH X01JUElfSUZfTUFTSyB8Ci0JCSBDU0lfSUZfQ0ZHX0lGX0RBVEFfV0lEVEhfTUFTSyB8Ci0JCSBD U0lfSUZfQ0ZHX0NMS19QT0xfTUFTSyB8IENTSV9JRl9DRkdfVlJFRl9QT0xfTUFTSyB8Ci0JCSBD U0lfSUZfQ0ZHX0hSRUZfUE9MX01BU0sgfCBDU0lfSUZfQ0ZHX0ZJRUxEX01BU0sgfAotCQkgQ1NJ X0lGX0NGR19TUkNfVFlQRV9NQVNLKTsKLQotCWlmIChpbnB1dF9pbnRlcmxhY2VkKQotCQljZmcg fD0gQ1NJX0lGX0NGR19TUkNfVFlQRV9JTlRFUkxBQ0VEOwotCWVsc2UKLQkJY2ZnIHw9IENTSV9J Rl9DRkdfU1JDX1RZUEVfUFJPR1JFU1NFRDsKLQotCXN3aXRjaCAoZW5kcG9pbnQtPmJ1c190eXBl KSB7Ci0JY2FzZSBWNEwyX01CVVNfUEFSQUxMRUw6Ci0JCWNmZyB8PSBDU0lfSUZfQ0ZHX01JUElf SUZfQ1NJOwotCi0JCWZsYWdzID0gZW5kcG9pbnQtPmJ1cy5wYXJhbGxlbC5mbGFnczsKLQotCQlj ZmcgfD0gKGJ1c193aWR0aCA9PSAxNikgPyBDU0lfSUZfQ0ZHX0NTSV9JRl9ZVVY0MjJfMTZCSVQg OgotCQkJCQkgICBDU0lfSUZfQ0ZHX0NTSV9JRl9ZVVY0MjJfSU5UTFY7Ci0KLQkJaWYgKGZsYWdz ICYgVjRMMl9NQlVTX0ZJRUxEX0VWRU5fTE9XKQotCQkJY2ZnIHw9IENTSV9JRl9DRkdfRklFTERf UE9TSVRJVkU7Ci0KLQkJaWYgKGZsYWdzICYgVjRMMl9NQlVTX1ZTWU5DX0FDVElWRV9MT1cpCi0J CQljZmcgfD0gQ1NJX0lGX0NGR19WUkVGX1BPTF9QT1NJVElWRTsKLQkJaWYgKGZsYWdzICYgVjRM Ml9NQlVTX0hTWU5DX0FDVElWRV9MT1cpCi0JCQljZmcgfD0gQ1NJX0lGX0NGR19IUkVGX1BPTF9Q T1NJVElWRTsKLQotCQlpZiAoZmxhZ3MgJiBWNEwyX01CVVNfUENMS19TQU1QTEVfUklTSU5HKQot CQkJY2ZnIHw9IENTSV9JRl9DRkdfQ0xLX1BPTF9GQUxMSU5HX0VER0U7Ci0JCWJyZWFrOwotCWNh c2UgVjRMMl9NQlVTX0JUNjU2OgotCQljZmcgfD0gQ1NJX0lGX0NGR19NSVBJX0lGX0NTSTsKLQot CQlmbGFncyA9IGVuZHBvaW50LT5idXMucGFyYWxsZWwuZmxhZ3M7Ci0KLQkJY2ZnIHw9IChidXNf d2lkdGggPT0gMTYpID8gQ1NJX0lGX0NGR19DU0lfSUZfQlQxMTIwIDoKLQkJCQkJICAgQ1NJX0lG X0NGR19DU0lfSUZfQlQ2NTY7Ci0KLQkJaWYgKGZsYWdzICYgVjRMMl9NQlVTX0ZJRUxEX0VWRU5f TE9XKQotCQkJY2ZnIHw9IENTSV9JRl9DRkdfRklFTERfUE9TSVRJVkU7Ci0KLQkJaWYgKGZsYWdz ICYgVjRMMl9NQlVTX1BDTEtfU0FNUExFX0ZBTExJTkcpCi0JCQljZmcgfD0gQ1NJX0lGX0NGR19D TEtfUE9MX0ZBTExJTkdfRURHRTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZGV2X3dhcm4oc2Rl di0+ZGV2LCAiVW5zdXBwb3J0ZWQgYnVzIHR5cGU6ICVkXG4iLAotCQkJIGVuZHBvaW50LT5idXNf dHlwZSk7Ci0JCWJyZWFrOwotCX0KLQotCXN3aXRjaCAoYnVzX3dpZHRoKSB7Ci0JY2FzZSA4Ogot CQljZmcgfD0gQ1NJX0lGX0NGR19JRl9EQVRBX1dJRFRIXzhCSVQ7Ci0JCWJyZWFrOwotCWNhc2Ug MTA6Ci0JCWNmZyB8PSBDU0lfSUZfQ0ZHX0lGX0RBVEFfV0lEVEhfMTBCSVQ7Ci0JCWJyZWFrOwot CWNhc2UgMTI6Ci0JCWNmZyB8PSBDU0lfSUZfQ0ZHX0lGX0RBVEFfV0lEVEhfMTJCSVQ7Ci0JCWJy ZWFrOwotCWNhc2UgMTY6IC8qIE5vIG5lZWQgdG8gY29uZmlndXJlIERBVEFfV0lEVEggZm9yIDE2 Yml0ICovCi0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWRldl93YXJuKHNkZXYtPmRldiwgIlVuc3Vw cG9ydGVkIGJ1cyB3aWR0aDogJXVcbiIsIGJ1c193aWR0aCk7Ci0JCWJyZWFrOwotCX0KLQotCXJl Z21hcF93cml0ZShzZGV2LT5yZWdtYXAsIENTSV9JRl9DRkdfUkVHLCBjZmcpOwotfQotCi1zdGF0 aWMgdm9pZCBzdW42aV9jc2lfc2V0X2Zvcm1hdChzdHJ1Y3Qgc3VuNmlfY3NpX2RldiAqc2RldikK LXsKLQlzdHJ1Y3Qgc3VuNmlfY3NpICpjc2kgPSAmc2Rldi0+Y3NpOwotCXUzMiBjZmc7Ci0JdTMy IHZhbDsKLQotCXJlZ21hcF9yZWFkKHNkZXYtPnJlZ21hcCwgQ1NJX0NIX0NGR19SRUcsICZjZmcp OwotCi0JY2ZnICY9IH4oQ1NJX0NIX0NGR19JTlBVVF9GTVRfTUFTSyB8Ci0JCSBDU0lfQ0hfQ0ZH X09VVFBVVF9GTVRfTUFTSyB8IENTSV9DSF9DRkdfVkZMSVBfRU4gfAotCQkgQ1NJX0NIX0NGR19I RkxJUF9FTiB8IENTSV9DSF9DRkdfRklFTERfU0VMX01BU0sgfAotCQkgQ1NJX0NIX0NGR19JTlBV VF9TRVFfTUFTSyk7Ci0KLQl2YWwgPSBnZXRfY3NpX2lucHV0X2Zvcm1hdChzZGV2LCBjc2ktPmNv bmZpZy5jb2RlLAotCQkJCSAgIGNzaS0+Y29uZmlnLnBpeGVsZm9ybWF0KTsKLQljZmcgfD0gQ1NJ X0NIX0NGR19JTlBVVF9GTVQodmFsKTsKLQotCXZhbCA9IGdldF9jc2lfb3V0cHV0X2Zvcm1hdChz ZGV2LCBjc2ktPmNvbmZpZy5waXhlbGZvcm1hdCwKLQkJCQkgICAgY3NpLT5jb25maWcuZmllbGQp OwotCWNmZyB8PSBDU0lfQ0hfQ0ZHX09VVFBVVF9GTVQodmFsKTsKLQotCXZhbCA9IGdldF9jc2lf aW5wdXRfc2VxKHNkZXYsIGNzaS0+Y29uZmlnLmNvZGUsCi0JCQkJY3NpLT5jb25maWcucGl4ZWxm b3JtYXQpOwotCWNmZyB8PSBDU0lfQ0hfQ0ZHX0lOUFVUX1NFUSh2YWwpOwotCi0JaWYgKGNzaS0+ Y29uZmlnLmZpZWxkID09IFY0TDJfRklFTERfVE9QKQotCQljZmcgfD0gQ1NJX0NIX0NGR19GSUVM RF9TRUxfRklFTEQwOwotCWVsc2UgaWYgKGNzaS0+Y29uZmlnLmZpZWxkID09IFY0TDJfRklFTERf Qk9UVE9NKQotCQljZmcgfD0gQ1NJX0NIX0NGR19GSUVMRF9TRUxfRklFTEQxOwotCWVsc2UKLQkJ Y2ZnIHw9IENTSV9DSF9DRkdfRklFTERfU0VMX0JPVEg7Ci0KLQlyZWdtYXBfd3JpdGUoc2Rldi0+ cmVnbWFwLCBDU0lfQ0hfQ0ZHX1JFRywgY2ZnKTsKLX0KLQotc3RhdGljIHZvaWQgc3VuNmlfY3Np X3NldF93aW5kb3coc3RydWN0IHN1bjZpX2NzaV9kZXYgKnNkZXYpCi17Ci0Jc3RydWN0IHN1bjZp X2NzaV9jb25maWcgKmNvbmZpZyA9ICZzZGV2LT5jc2kuY29uZmlnOwotCXUzMiBieXRlc3Blcmxp bmVfeTsKLQl1MzIgYnl0ZXNwZXJsaW5lX2M7Ci0JaW50ICpwbGFuYXJfb2Zmc2V0ID0gc2Rldi0+ cGxhbmFyX29mZnNldDsKLQl1MzIgd2lkdGggPSBjb25maWctPndpZHRoOwotCXUzMiBoZWlnaHQg PSBjb25maWctPmhlaWdodDsKLQl1MzIgaG9yX2xlbiA9IHdpZHRoOwotCi0Jc3dpdGNoIChjb25m aWctPnBpeGVsZm9ybWF0KSB7Ci0JY2FzZSBWNEwyX1BJWF9GTVRfWVVZVjoKLQljYXNlIFY0TDJf UElYX0ZNVF9ZVllVOgotCWNhc2UgVjRMMl9QSVhfRk1UX1VZVlk6Ci0JY2FzZSBWNEwyX1BJWF9G TVRfVllVWToKLQkJZGV2X2RiZyhzZGV2LT5kZXYsCi0JCQkiSG9yaXpvbnRhbCBsZW5ndGggc2hv dWxkIGJlIDIgdGltZXMgb2Ygd2lkdGggZm9yIHBhY2tlZCBZVVYgZm9ybWF0cyFcbiIpOwotCQlo b3JfbGVuID0gd2lkdGggKiAyOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0K LQlyZWdtYXBfd3JpdGUoc2Rldi0+cmVnbWFwLCBDU0lfQ0hfSFNJWkVfUkVHLAotCQkgICAgIENT SV9DSF9IU0laRV9IT1JfTEVOKGhvcl9sZW4pIHwKLQkJICAgICBDU0lfQ0hfSFNJWkVfSE9SX1NU QVJUKDApKTsKLQlyZWdtYXBfd3JpdGUoc2Rldi0+cmVnbWFwLCBDU0lfQ0hfVlNJWkVfUkVHLAot CQkgICAgIENTSV9DSF9WU0laRV9WRVJfTEVOKGhlaWdodCkgfAotCQkgICAgIENTSV9DSF9WU0la RV9WRVJfU1RBUlQoMCkpOwotCi0JcGxhbmFyX29mZnNldFswXSA9IDA7Ci0Jc3dpdGNoIChjb25m aWctPnBpeGVsZm9ybWF0KSB7Ci0JY2FzZSBWNEwyX1BJWF9GTVRfSE0xMjoKLQljYXNlIFY0TDJf UElYX0ZNVF9OVjEyOgotCWNhc2UgVjRMMl9QSVhfRk1UX05WMjE6Ci0JY2FzZSBWNEwyX1BJWF9G TVRfTlYxNjoKLQljYXNlIFY0TDJfUElYX0ZNVF9OVjYxOgotCQlieXRlc3BlcmxpbmVfeSA9IHdp ZHRoOwotCQlieXRlc3BlcmxpbmVfYyA9IHdpZHRoOwotCQlwbGFuYXJfb2Zmc2V0WzFdID0gYnl0 ZXNwZXJsaW5lX3kgKiBoZWlnaHQ7Ci0JCXBsYW5hcl9vZmZzZXRbMl0gPSAtMTsKLQkJYnJlYWs7 Ci0JY2FzZSBWNEwyX1BJWF9GTVRfWVVWNDIwOgotCWNhc2UgVjRMMl9QSVhfRk1UX1lWVTQyMDoK LQkJYnl0ZXNwZXJsaW5lX3kgPSB3aWR0aDsKLQkJYnl0ZXNwZXJsaW5lX2MgPSB3aWR0aCAvIDI7 Ci0JCXBsYW5hcl9vZmZzZXRbMV0gPSBieXRlc3BlcmxpbmVfeSAqIGhlaWdodDsKLQkJcGxhbmFy X29mZnNldFsyXSA9IHBsYW5hcl9vZmZzZXRbMV0gKwotCQkJCWJ5dGVzcGVybGluZV9jICogaGVp Z2h0IC8gMjsKLQkJYnJlYWs7Ci0JY2FzZSBWNEwyX1BJWF9GTVRfWVVWNDIyUDoKLQkJYnl0ZXNw ZXJsaW5lX3kgPSB3aWR0aDsKLQkJYnl0ZXNwZXJsaW5lX2MgPSB3aWR0aCAvIDI7Ci0JCXBsYW5h cl9vZmZzZXRbMV0gPSBieXRlc3BlcmxpbmVfeSAqIGhlaWdodDsKLQkJcGxhbmFyX29mZnNldFsy XSA9IHBsYW5hcl9vZmZzZXRbMV0gKwotCQkJCWJ5dGVzcGVybGluZV9jICogaGVpZ2h0OwotCQli cmVhazsKLQlkZWZhdWx0OiAvKiByYXcgKi8KLQkJZGV2X2RiZyhzZGV2LT5kZXYsCi0JCQkiQ2Fs Y3VsYXRpbmcgcGl4ZWxmb3JtYXQoMHgleCkncyBieXRlc3BlcmxpbmUgYXMgYSBwYWNrZWQgZm9y bWF0XG4iLAotCQkJY29uZmlnLT5waXhlbGZvcm1hdCk7Ci0JCWJ5dGVzcGVybGluZV95ID0gKHN1 bjZpX2NzaV9nZXRfYnBwKGNvbmZpZy0+cGl4ZWxmb3JtYXQpICoKLQkJCQkgIGNvbmZpZy0+d2lk dGgpIC8gODsKLQkJYnl0ZXNwZXJsaW5lX2MgPSAwOwotCQlwbGFuYXJfb2Zmc2V0WzFdID0gLTE7 Ci0JCXBsYW5hcl9vZmZzZXRbMl0gPSAtMTsKLQkJYnJlYWs7Ci0JfQotCi0JcmVnbWFwX3dyaXRl KHNkZXYtPnJlZ21hcCwgQ1NJX0NIX0JVRl9MRU5fUkVHLAotCQkgICAgIENTSV9DSF9CVUZfTEVO X0JVRl9MRU5fQyhieXRlc3BlcmxpbmVfYykgfAotCQkgICAgIENTSV9DSF9CVUZfTEVOX0JVRl9M RU5fWShieXRlc3BlcmxpbmVfeSkpOwotfQotCi1pbnQgc3VuNmlfY3NpX3VwZGF0ZV9jb25maWco c3RydWN0IHN1bjZpX2NzaSAqY3NpLAotCQkJICAgIHN0cnVjdCBzdW42aV9jc2lfY29uZmlnICpj b25maWcpCi17Ci0Jc3RydWN0IHN1bjZpX2NzaV9kZXYgKnNkZXYgPSBzdW42aV9jc2lfdG9fZGV2 KGNzaSk7Ci0KLQlpZiAoIWNvbmZpZykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltZW1jcHkoJmNz aS0+Y29uZmlnLCBjb25maWcsIHNpemVvZihjc2ktPmNvbmZpZykpOwotCi0Jc3VuNmlfY3NpX3Nl dHVwX2J1cyhzZGV2KTsKLQlzdW42aV9jc2lfc2V0X2Zvcm1hdChzZGV2KTsKLQlzdW42aV9jc2lf c2V0X3dpbmRvdyhzZGV2KTsKLQotCXJldHVybiAwOwotfQotCi12b2lkIHN1bjZpX2NzaV91cGRh dGVfYnVmX2FkZHIoc3RydWN0IHN1bjZpX2NzaSAqY3NpLCBkbWFfYWRkcl90IGFkZHIpCi17Ci0J c3RydWN0IHN1bjZpX2NzaV9kZXYgKnNkZXYgPSBzdW42aV9jc2lfdG9fZGV2KGNzaSk7Ci0KLQly ZWdtYXBfd3JpdGUoc2Rldi0+cmVnbWFwLCBDU0lfQ0hfRjBfQlVGQV9SRUcsCi0JCSAgICAgKGFk ZHIgKyBzZGV2LT5wbGFuYXJfb2Zmc2V0WzBdKSA+PiAyKTsKLQlpZiAoc2Rldi0+cGxhbmFyX29m ZnNldFsxXSAhPSAtMSkKLQkJcmVnbWFwX3dyaXRlKHNkZXYtPnJlZ21hcCwgQ1NJX0NIX0YxX0JV RkFfUkVHLAotCQkJICAgICAoYWRkciArIHNkZXYtPnBsYW5hcl9vZmZzZXRbMV0pID4+IDIpOwot CWlmIChzZGV2LT5wbGFuYXJfb2Zmc2V0WzJdICE9IC0xKQotCQlyZWdtYXBfd3JpdGUoc2Rldi0+ cmVnbWFwLCBDU0lfQ0hfRjJfQlVGQV9SRUcsCi0JCQkgICAgIChhZGRyICsgc2Rldi0+cGxhbmFy X29mZnNldFsyXSkgPj4gMik7Ci19Ci0KLXZvaWQgc3VuNmlfY3NpX3NldF9zdHJlYW0oc3RydWN0 IHN1bjZpX2NzaSAqY3NpLCBib29sIGVuYWJsZSkKLXsKLQlzdHJ1Y3Qgc3VuNmlfY3NpX2RldiAq c2RldiA9IHN1bjZpX2NzaV90b19kZXYoY3NpKTsKLQlzdHJ1Y3QgcmVnbWFwICpyZWdtYXAgPSBz ZGV2LT5yZWdtYXA7Ci0KLQlpZiAoIWVuYWJsZSkgewotCQlyZWdtYXBfdXBkYXRlX2JpdHMocmVn bWFwLCBDU0lfQ0FQX1JFRywgQ1NJX0NBUF9DSDBfVkNBUF9PTiwgMCk7Ci0JCXJlZ21hcF93cml0 ZShyZWdtYXAsIENTSV9DSF9JTlRfRU5fUkVHLCAwKTsKLQkJcmV0dXJuOwotCX0KLQotCXJlZ21h cF93cml0ZShyZWdtYXAsIENTSV9DSF9JTlRfU1RBX1JFRywgMHhGRik7Ci0JcmVnbWFwX3dyaXRl KHJlZ21hcCwgQ1NJX0NIX0lOVF9FTl9SRUcsCi0JCSAgICAgQ1NJX0NIX0lOVF9FTl9IQl9PRl9J TlRfRU4gfAotCQkgICAgIENTSV9DSF9JTlRfRU5fRklGTzJfT0ZfSU5UX0VOIHwKLQkJICAgICBD U0lfQ0hfSU5UX0VOX0ZJRk8xX09GX0lOVF9FTiB8Ci0JCSAgICAgQ1NJX0NIX0lOVF9FTl9GSUZP MF9PRl9JTlRfRU4gfAotCQkgICAgIENTSV9DSF9JTlRfRU5fRkRfSU5UX0VOIHwKLQkJICAgICBD U0lfQ0hfSU5UX0VOX0NEX0lOVF9FTik7Ci0KLQlyZWdtYXBfdXBkYXRlX2JpdHMocmVnbWFwLCBD U0lfQ0FQX1JFRywgQ1NJX0NBUF9DSDBfVkNBUF9PTiwKLQkJCSAgIENTSV9DQVBfQ0gwX1ZDQVBf T04pOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogTWVkaWEgQ29udHJvbGxlciBh bmQgVjRMMgotICovCi1zdGF0aWMgaW50IHN1bjZpX2NzaV9saW5rX2VudGl0eShzdHJ1Y3Qgc3Vu NmlfY3NpICpjc2ksCi0JCQkJIHN0cnVjdCBtZWRpYV9lbnRpdHkgKmVudGl0eSwKLQkJCQkgc3Ry dWN0IGZ3bm9kZV9oYW5kbGUgKmZ3bm9kZSkKLXsKLQlzdHJ1Y3QgbWVkaWFfZW50aXR5ICpzaW5r OwotCXN0cnVjdCBtZWRpYV9wYWQgKnNpbmtfcGFkOwotCWludCBzcmNfcGFkX2luZGV4OwotCWlu dCByZXQ7Ci0KLQlyZXQgPSBtZWRpYV9lbnRpdHlfZ2V0X2Z3bm9kZV9wYWQoZW50aXR5LCBmd25v ZGUsIE1FRElBX1BBRF9GTF9TT1VSQ0UpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoY3Np LT5kZXYsICIlczogbm8gc291cmNlIHBhZCBpbiBleHRlcm5hbCBlbnRpdHkgJXNcbiIsCi0JCQlf X2Z1bmNfXywgZW50aXR5LT5uYW1lKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0Jc3JjX3Bh ZF9pbmRleCA9IHJldDsKLQotCXNpbmsgPSAmY3NpLT52aWRlby52ZGV2LmVudGl0eTsKLQlzaW5r X3BhZCA9ICZjc2ktPnZpZGVvLnBhZDsKLQotCWRldl9kYmcoY3NpLT5kZXYsICJjcmVhdGluZyAl czoldSAtPiAlczoldSBsaW5rXG4iLAotCQllbnRpdHktPm5hbWUsIHNyY19wYWRfaW5kZXgsIHNp bmstPm5hbWUsIHNpbmtfcGFkLT5pbmRleCk7Ci0JcmV0ID0gbWVkaWFfY3JlYXRlX3BhZF9saW5r KGVudGl0eSwgc3JjX3BhZF9pbmRleCwgc2luaywKLQkJCQkgICAgc2lua19wYWQtPmluZGV4LAot CQkJCSAgICBNRURJQV9MTktfRkxfRU5BQkxFRCB8Ci0JCQkJICAgIE1FRElBX0xOS19GTF9JTU1V VEFCTEUpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoY3NpLT5kZXYsICJmYWlsZWQgdG8g Y3JlYXRlICVzOiV1IC0+ICVzOiV1IGxpbmtcbiIsCi0JCQllbnRpdHktPm5hbWUsIHNyY19wYWRf aW5kZXgsCi0JCQlzaW5rLT5uYW1lLCBzaW5rX3BhZC0+aW5kZXgpOwotCQlyZXR1cm4gcmV0Owot CX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHN1bjZpX3N1YmRldl9ub3RpZnlfY29t cGxldGUoc3RydWN0IHY0bDJfYXN5bmNfbm90aWZpZXIgKm5vdGlmaWVyKQotewotCXN0cnVjdCBz dW42aV9jc2kgKmNzaSA9IGNvbnRhaW5lcl9vZihub3RpZmllciwgc3RydWN0IHN1bjZpX2NzaSwK LQkJCQkJICAgICBub3RpZmllcik7Ci0Jc3RydWN0IHY0bDJfZGV2aWNlICp2NGwyX2RldiA9ICZj c2ktPnY0bDJfZGV2OwotCXN0cnVjdCB2NGwyX3N1YmRldiAqc2Q7Ci0JaW50IHJldDsKLQotCWRl dl9kYmcoY3NpLT5kZXYsICJub3RpZnkgY29tcGxldGUsIGFsbCBzdWJkZXZzIHJlZ2lzdGVyZWRc biIpOwotCi0Jc2QgPSBsaXN0X2ZpcnN0X2VudHJ5KCZ2NGwyX2Rldi0+c3ViZGV2cywgc3RydWN0 IHY0bDJfc3ViZGV2LCBsaXN0KTsKLQlpZiAoIXNkKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJl dCA9IHN1bjZpX2NzaV9saW5rX2VudGl0eShjc2ksICZzZC0+ZW50aXR5LCBzZC0+Zndub2RlKTsK LQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IHY0bDJfZGV2aWNlX3JlZ2lz dGVyX3N1YmRldl9ub2RlcygmY3NpLT52NGwyX2Rldik7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVy biByZXQ7Ci0KLQlyZXR1cm4gbWVkaWFfZGV2aWNlX3JlZ2lzdGVyKCZjc2ktPm1lZGlhX2Rldik7 Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9hc3luY19ub3RpZmllcl9vcGVyYXRpb25z IHN1bjZpX2NzaV9hc3luY19vcHMgPSB7Ci0JLmNvbXBsZXRlID0gc3VuNmlfc3ViZGV2X25vdGlm eV9jb21wbGV0ZSwKLX07Ci0KLXN0YXRpYyBpbnQgc3VuNmlfY3NpX2Z3bm9kZV9wYXJzZShzdHJ1 Y3QgZGV2aWNlICpkZXYsCi0JCQkJICBzdHJ1Y3QgdjRsMl9md25vZGVfZW5kcG9pbnQgKnZlcCwK LQkJCQkgIHN0cnVjdCB2NGwyX2FzeW5jX3N1YmRldiAqYXNkKQotewotCXN0cnVjdCBzdW42aV9j c2kgKmNzaSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCi0JaWYgKHZlcC0+YmFzZS5wb3J0IHx8 IHZlcC0+YmFzZS5pZCkgewotCQlkZXZfd2FybihkZXYsICJPbmx5IHN1cHBvcnQgYSBzaW5nbGUg cG9ydCB3aXRoIG9uZSBlbmRwb2ludFxuIik7Ci0JCXJldHVybiAtRU5PVENPTk47Ci0JfQotCi0J c3dpdGNoICh2ZXAtPmJ1c190eXBlKSB7Ci0JY2FzZSBWNEwyX01CVVNfUEFSQUxMRUw6Ci0JY2Fz ZSBWNEwyX01CVVNfQlQ2NTY6Ci0JCWNzaS0+djRsMl9lcCA9ICp2ZXA7Ci0JCXJldHVybiAwOwot CWRlZmF1bHQ6Ci0JCWRldl9lcnIoZGV2LCAiVW5zdXBwb3J0ZWQgbWVkaWEgYnVzIHR5cGVcbiIp OwotCQlyZXR1cm4gLUVOT1RDT05OOwotCX0KLX0KLQotc3RhdGljIHZvaWQgc3VuNmlfY3NpX3Y0 bDJfY2xlYW51cChzdHJ1Y3Qgc3VuNmlfY3NpICpjc2kpCi17Ci0JbWVkaWFfZGV2aWNlX3VucmVn aXN0ZXIoJmNzaS0+bWVkaWFfZGV2KTsKLQl2NGwyX2FzeW5jX25vdGlmaWVyX3VucmVnaXN0ZXIo JmNzaS0+bm90aWZpZXIpOwotCXY0bDJfYXN5bmNfbm90aWZpZXJfY2xlYW51cCgmY3NpLT5ub3Rp Zmllcik7Ci0Jc3VuNmlfdmlkZW9fY2xlYW51cCgmY3NpLT52aWRlbyk7Ci0JdjRsMl9kZXZpY2Vf dW5yZWdpc3RlcigmY3NpLT52NGwyX2Rldik7Ci0JdjRsMl9jdHJsX2hhbmRsZXJfZnJlZSgmY3Np LT5jdHJsX2hhbmRsZXIpOwotCW1lZGlhX2RldmljZV9jbGVhbnVwKCZjc2ktPm1lZGlhX2Rldik7 Ci19Ci0KLXN0YXRpYyBpbnQgc3VuNmlfY3NpX3Y0bDJfaW5pdChzdHJ1Y3Qgc3VuNmlfY3NpICpj c2kpCi17Ci0JaW50IHJldDsKLQotCWNzaS0+bWVkaWFfZGV2LmRldiA9IGNzaS0+ZGV2OwotCXN0 cnNjcHkoY3NpLT5tZWRpYV9kZXYubW9kZWwsICJBbGx3aW5uZXIgVmlkZW8gQ2FwdHVyZSBEZXZp Y2UiLAotCQlzaXplb2YoY3NpLT5tZWRpYV9kZXYubW9kZWwpKTsKLQljc2ktPm1lZGlhX2Rldi5o d19yZXZpc2lvbiA9IDA7Ci0Jc25wcmludGYoY3NpLT5tZWRpYV9kZXYuYnVzX2luZm8sIHNpemVv Zihjc2ktPm1lZGlhX2Rldi5idXNfaW5mbyksCi0JCSAicGxhdGZvcm06JXMiLCBkZXZfbmFtZShj c2ktPmRldikpOwotCi0JbWVkaWFfZGV2aWNlX2luaXQoJmNzaS0+bWVkaWFfZGV2KTsKLQl2NGwy X2FzeW5jX25vdGlmaWVyX2luaXQoJmNzaS0+bm90aWZpZXIpOwotCi0JcmV0ID0gdjRsMl9jdHJs X2hhbmRsZXJfaW5pdCgmY3NpLT5jdHJsX2hhbmRsZXIsIDApOwotCWlmIChyZXQpIHsKLQkJZGV2 X2Vycihjc2ktPmRldiwgIlY0TDIgY29udHJvbHMgaGFuZGxlciBpbml0IGZhaWxlZCAoJWQpXG4i LAotCQkJcmV0KTsKLQkJZ290byBjbGVhbl9tZWRpYTsKLQl9Ci0KLQljc2ktPnY0bDJfZGV2Lm1k ZXYgPSAmY3NpLT5tZWRpYV9kZXY7Ci0JY3NpLT52NGwyX2Rldi5jdHJsX2hhbmRsZXIgPSAmY3Np LT5jdHJsX2hhbmRsZXI7Ci0JcmV0ID0gdjRsMl9kZXZpY2VfcmVnaXN0ZXIoY3NpLT5kZXYsICZj c2ktPnY0bDJfZGV2KTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoY3NpLT5kZXYsICJWNEwyIGRl dmljZSByZWdpc3RyYXRpb24gZmFpbGVkICglZClcbiIsCi0JCQlyZXQpOwotCQlnb3RvIGZyZWVf Y3RybDsKLQl9Ci0KLQlyZXQgPSBzdW42aV92aWRlb19pbml0KCZjc2ktPnZpZGVvLCBjc2ksICJz dW42aS1jc2kiKTsKLQlpZiAocmV0KQotCQlnb3RvIHVucmVnX3Y0bDI7Ci0KLQlyZXQgPSB2NGwy X2FzeW5jX25vdGlmaWVyX3BhcnNlX2Z3bm9kZV9lbmRwb2ludHMoY3NpLT5kZXYsCi0JCQkJCQkJ ICZjc2ktPm5vdGlmaWVyLAotCQkJCQkJCSBzaXplb2Yoc3RydWN0IHY0bDJfYXN5bmNfc3ViZGV2 KSwKLQkJCQkJCQkgc3VuNmlfY3NpX2Z3bm9kZV9wYXJzZSk7Ci0JaWYgKHJldCkKLQkJZ290byBj bGVhbl92aWRlbzsKLQotCWNzaS0+bm90aWZpZXIub3BzID0gJnN1bjZpX2NzaV9hc3luY19vcHM7 Ci0KLQlyZXQgPSB2NGwyX2FzeW5jX25vdGlmaWVyX3JlZ2lzdGVyKCZjc2ktPnY0bDJfZGV2LCAm Y3NpLT5ub3RpZmllcik7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKGNzaS0+ZGV2LCAibm90aWZp ZXIgcmVnaXN0cmF0aW9uIGZhaWxlZFxuIik7Ci0JCWdvdG8gY2xlYW5fdmlkZW87Ci0JfQotCi0J cmV0dXJuIDA7Ci0KLWNsZWFuX3ZpZGVvOgotCXN1bjZpX3ZpZGVvX2NsZWFudXAoJmNzaS0+dmlk ZW8pOwotdW5yZWdfdjRsMjoKLQl2NGwyX2RldmljZV91bnJlZ2lzdGVyKCZjc2ktPnY0bDJfZGV2 KTsKLWZyZWVfY3RybDoKLQl2NGwyX2N0cmxfaGFuZGxlcl9mcmVlKCZjc2ktPmN0cmxfaGFuZGxl cik7Ci1jbGVhbl9tZWRpYToKLQl2NGwyX2FzeW5jX25vdGlmaWVyX2NsZWFudXAoJmNzaS0+bm90 aWZpZXIpOwotCW1lZGlhX2RldmljZV9jbGVhbnVwKCZjc2ktPm1lZGlhX2Rldik7Ci0KLQlyZXR1 cm4gcmV0OwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogUmVzb3VyY2VzIGFuZCBJ UlEKLSAqLwotc3RhdGljIGlycXJldHVybl90IHN1bjZpX2NzaV9pc3IoaW50IGlycSwgdm9pZCAq ZGV2X2lkKQotewotCXN0cnVjdCBzdW42aV9jc2lfZGV2ICpzZGV2ID0gKHN0cnVjdCBzdW42aV9j c2lfZGV2ICopZGV2X2lkOwotCXN0cnVjdCByZWdtYXAgKnJlZ21hcCA9IHNkZXYtPnJlZ21hcDsK LQl1MzIgc3RhdHVzOwotCi0JcmVnbWFwX3JlYWQocmVnbWFwLCBDU0lfQ0hfSU5UX1NUQV9SRUcs ICZzdGF0dXMpOwotCi0JaWYgKCEoc3RhdHVzICYgMHhGRikpCi0JCXJldHVybiBJUlFfTk9ORTsK LQotCWlmICgoc3RhdHVzICYgQ1NJX0NIX0lOVF9TVEFfRklGTzBfT0ZfUEQpIHx8Ci0JICAgIChz dGF0dXMgJiBDU0lfQ0hfSU5UX1NUQV9GSUZPMV9PRl9QRCkgfHwKLQkgICAgKHN0YXR1cyAmIENT SV9DSF9JTlRfU1RBX0ZJRk8yX09GX1BEKSB8fAotCSAgICAoc3RhdHVzICYgQ1NJX0NIX0lOVF9T VEFfSEJfT0ZfUEQpKSB7Ci0JCXJlZ21hcF93cml0ZShyZWdtYXAsIENTSV9DSF9JTlRfU1RBX1JF Rywgc3RhdHVzKTsKLQkJcmVnbWFwX3VwZGF0ZV9iaXRzKHJlZ21hcCwgQ1NJX0VOX1JFRywgQ1NJ X0VOX0NTSV9FTiwgMCk7Ci0JCXJlZ21hcF91cGRhdGVfYml0cyhyZWdtYXAsIENTSV9FTl9SRUcs IENTSV9FTl9DU0lfRU4sCi0JCQkJICAgQ1NJX0VOX0NTSV9FTik7Ci0JCXJldHVybiBJUlFfSEFO RExFRDsKLQl9Ci0KLQlpZiAoc3RhdHVzICYgQ1NJX0NIX0lOVF9TVEFfRkRfUEQpCi0JCXN1bjZp X3ZpZGVvX2ZyYW1lX2RvbmUoJnNkZXYtPmNzaS52aWRlbyk7Ci0KLQlyZWdtYXBfd3JpdGUocmVn bWFwLCBDU0lfQ0hfSU5UX1NUQV9SRUcsIHN0YXR1cyk7Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7 Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBzdW42aV9jc2lfcmVnbWFw X2NvbmZpZyA9IHsKLQkucmVnX2JpdHMgICAgICAgPSAzMiwKLQkucmVnX3N0cmlkZSAgICAgPSA0 LAotCS52YWxfYml0cyAgICAgICA9IDMyLAotCS5tYXhfcmVnaXN0ZXIJPSAweDljLAotfTsKLQot c3RhdGljIGludCBzdW42aV9jc2lfcmVzb3VyY2VfcmVxdWVzdChzdHJ1Y3Qgc3VuNmlfY3NpX2Rl diAqc2RldiwKLQkJCQkgICAgICBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0 cnVjdCByZXNvdXJjZSAqcmVzOwotCXZvaWQgX19pb21lbSAqaW9fYmFzZTsKLQlpbnQgcmV0Owot CWludCBpcnE7Ci0KLQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJD RV9NRU0sIDApOwotCWlvX2Jhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwg cmVzKTsKLQlpZiAoSVNfRVJSKGlvX2Jhc2UpKQotCQlyZXR1cm4gUFRSX0VSUihpb19iYXNlKTsK LQotCXNkZXYtPnJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfbW1pb19jbGsoJnBkZXYtPmRldiwg ImJ1cyIsIGlvX2Jhc2UsCi0JCQkJCQkgJnN1bjZpX2NzaV9yZWdtYXBfY29uZmlnKTsKLQlpZiAo SVNfRVJSKHNkZXYtPnJlZ21hcCkpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRv IGluaXQgcmVnaXN0ZXIgbWFwXG4iKTsKLQkJcmV0dXJuIFBUUl9FUlIoc2Rldi0+cmVnbWFwKTsK LQl9Ci0KLQlzZGV2LT5jbGtfbW9kID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJtb2QiKTsK LQlpZiAoSVNfRVJSKHNkZXYtPmNsa19tb2QpKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIlVu YWJsZSB0byBhY3F1aXJlIGNzaSBjbG9ja1xuIik7Ci0JCXJldHVybiBQVFJfRVJSKHNkZXYtPmNs a19tb2QpOwotCX0KLQotCXNkZXYtPmNsa19yYW0gPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwg InJhbSIpOwotCWlmIChJU19FUlIoc2Rldi0+Y2xrX3JhbSkpIHsKLQkJZGV2X2VycigmcGRldi0+ ZGV2LCAiVW5hYmxlIHRvIGFjcXVpcmUgZHJhbS1jc2kgY2xvY2tcbiIpOwotCQlyZXR1cm4gUFRS X0VSUihzZGV2LT5jbGtfcmFtKTsKLQl9Ci0KLQlzZGV2LT5yc3RjX2J1cyA9IGRldm1fcmVzZXRf Y29udHJvbF9nZXRfc2hhcmVkKCZwZGV2LT5kZXYsIE5VTEwpOwotCWlmIChJU19FUlIoc2Rldi0+ cnN0Y19idXMpKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbm5vdCBnZXQgcmVzZXQgY29u dHJvbGxlclxuIik7Ci0JCXJldHVybiBQVFJfRVJSKHNkZXYtPnJzdGNfYnVzKTsKLQl9Ci0KLQlp cnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOwotCWlmIChpcnEgPCAwKQotCQlyZXR1cm4g LUVOWElPOwotCi0JcmV0ID0gZGV2bV9yZXF1ZXN0X2lycSgmcGRldi0+ZGV2LCBpcnEsIHN1bjZp X2NzaV9pc3IsIDAsIE1PRFVMRV9OQU1FLAotCQkJICAgICAgIHNkZXYpOwotCWlmIChyZXQpIHsK LQkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2Fubm90IHJlcXVlc3QgY3NpIElSUVxuIik7Ci0JCXJl dHVybiByZXQ7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc3VuNmlfY3NpX3By b2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IHN1bjZpX2NzaV9k ZXYgKnNkZXY7Ci0JaW50IHJldDsKLQotCXNkZXYgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwg c2l6ZW9mKCpzZGV2KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzZGV2KQotCQlyZXR1cm4gLUVOT01F TTsKLQotCXNkZXYtPmRldiA9ICZwZGV2LT5kZXY7Ci0KLQlyZXQgPSBzdW42aV9jc2lfcmVzb3Vy Y2VfcmVxdWVzdChzZGV2LCBwZGV2KTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JcGxh dGZvcm1fc2V0X2RydmRhdGEocGRldiwgc2Rldik7Ci0KLQlzZGV2LT5jc2kuZGV2ID0gJnBkZXYt PmRldjsKLQlyZXR1cm4gc3VuNmlfY3NpX3Y0bDJfaW5pdCgmc2Rldi0+Y3NpKTsKLX0KLQotc3Rh dGljIGludCBzdW42aV9jc2lfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17 Ci0Jc3RydWN0IHN1bjZpX2NzaV9kZXYgKnNkZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2 KTsKLQotCXN1bjZpX2NzaV92NGwyX2NsZWFudXAoJnNkZXYtPmNzaSk7Ci0KLQlyZXR1cm4gMDsK LX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc3VuNmlfY3NpX29mX21hdGNo W10gPSB7Ci0JeyAuY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNmktYTMxLWNzaSIsIH0sCi0J eyAuY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuOGktYTgzdC1jc2kiLCB9LAotCXsgLmNvbXBh dGlibGUgPSAiYWxsd2lubmVyLHN1bjhpLWgzLWNzaSIsIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJh bGx3aW5uZXIsc3VuOGktdjNzLWNzaSIsIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIs c3VuNTBpLWE2NC1jc2kiLCB9LAotCXt9LAotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHN1 bjZpX2NzaV9vZl9tYXRjaCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHN1bjZp X2NzaV9wbGF0Zm9ybV9kcml2ZXIgPSB7Ci0JLnByb2JlID0gc3VuNmlfY3NpX3Byb2JlLAotCS5y ZW1vdmUgPSBzdW42aV9jc2lfcmVtb3ZlLAotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gTU9EVUxF X05BTUUsCi0JCS5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX3B0cihzdW42aV9jc2lfb2ZfbWF0 Y2gpLAotCX0sCi19OwotbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihzdW42aV9jc2lfcGxhdGZvcm1f ZHJpdmVyKTsKLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJBbGx3aW5uZXIgVjNzIENhbWVyYSBTZW5z b3IgSW50ZXJmYWNlIGRyaXZlciIpOwotTU9EVUxFX0FVVEhPUigiWW9uZyBEZW5nIDx5b25nLmRl bmdAbWFnZXdlbGwuY29tPiIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEv ZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zdW54aS9zdW42aS1jc2kvc3VuNmlfY3NpLmggYi9kcml2 ZXJzL21lZGlhL3BsYXRmb3JtL3N1bnhpL3N1bjZpLWNzaS9zdW42aV9jc2kuaApkZWxldGVkIGZp bGUgbW9kZSAxMDA2NDQKaW5kZXggYzYyNjgyMWFhZWRiLi4wMDAwMDAwMDAwMDAKLS0tIGEvZHJp dmVycy9tZWRpYS9wbGF0Zm9ybS9zdW54aS9zdW42aS1jc2kvc3VuNmlfY3NpLmgKKysrIC9kZXYv bnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0y LjArICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTggTWFnZXdlbGwgRWxlY3Ryb25p Y3MgQ28uLCBMdGQuIChOYW5qaW5nKQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIEF1dGhv cjogWW9uZyBEZW5nIDx5b25nLmRlbmdAbWFnZXdlbGwuY29tPgotICovCi0KLSNpZm5kZWYgX19T VU42SV9DU0lfSF9fCi0jZGVmaW5lIF9fU1VONklfQ1NJX0hfXwotCi0jaW5jbHVkZSA8bWVkaWEv djRsMi1jdHJscy5oPgotI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+Ci0jaW5jbHVkZSA8 bWVkaWEvdjRsMi1md25vZGUuaD4KLQotI2luY2x1ZGUgInN1bjZpX3ZpZGVvLmgiCi0KLXN0cnVj dCBzdW42aV9jc2k7Ci0KLS8qKgotICogc3RydWN0IHN1bjZpX2NzaV9jb25maWcgLSBjb25maWdz IGZvciBzdW42aSBjc2kKLSAqIEBwaXhlbGZvcm1hdDogdjRsMiBwaXhlbCBmb3JtYXQgKFY0TDJf UElYX0ZNVF8qKQotICogQGNvZGU6CW1lZGlhIGJ1cyBmb3JtYXQgY29kZSAoTUVESUFfQlVTX0ZN VF8qKQotICogQGZpZWxkOgl1c2VkIGludGVybGFjaW5nIHR5cGUgKGVudW0gdjRsMl9maWVsZCkK LSAqIEB3aWR0aDoJZnJhbWUgd2lkdGgKLSAqIEBoZWlnaHQ6CWZyYW1lIGhlaWdodAotICovCi1z dHJ1Y3Qgc3VuNmlfY3NpX2NvbmZpZyB7Ci0JdTMyCQlwaXhlbGZvcm1hdDsKLQl1MzIJCWNvZGU7 Ci0JdTMyCQlmaWVsZDsKLQl1MzIJCXdpZHRoOwotCXUzMgkJaGVpZ2h0OwotfTsKLQotc3RydWN0 IHN1bjZpX2NzaSB7Ci0Jc3RydWN0IGRldmljZQkJCSpkZXY7Ci0Jc3RydWN0IHY0bDJfY3RybF9o YW5kbGVyCWN0cmxfaGFuZGxlcjsKLQlzdHJ1Y3QgdjRsMl9kZXZpY2UJCXY0bDJfZGV2OwotCXN0 cnVjdCBtZWRpYV9kZXZpY2UJCW1lZGlhX2RldjsKLQotCXN0cnVjdCB2NGwyX2FzeW5jX25vdGlm aWVyCW5vdGlmaWVyOwotCi0JLyogdmlkZW8gcG9ydCBzZXR0aW5ncyAqLwotCXN0cnVjdCB2NGwy X2Z3bm9kZV9lbmRwb2ludAl2NGwyX2VwOwotCi0Jc3RydWN0IHN1bjZpX2NzaV9jb25maWcJCWNv bmZpZzsKLQotCXN0cnVjdCBzdW42aV92aWRlbwkJdmlkZW87Ci19OwotCi0vKioKLSAqIHN1bjZp X2NzaV9pc19mb3JtYXRfc3VwcG9ydGVkKCkgLSBjaGVjayBpZiB0aGUgZm9ybWF0IHN1cHBvcnRl ZCBieSBjc2kKLSAqIEBjc2k6CXBvaW50ZXIgdG8gdGhlIGNzaQotICogQHBpeGZvcm1hdDoJdjRs MiBwaXhlbCBmb3JtYXQgKFY0TDJfUElYX0ZNVF8qKQotICogQG1idXNfY29kZToJbWVkaWEgYnVz IGZvcm1hdCBjb2RlIChNRURJQV9CVVNfRk1UXyopCi0gKi8KLWJvb2wgc3VuNmlfY3NpX2lzX2Zv cm1hdF9zdXBwb3J0ZWQoc3RydWN0IHN1bjZpX2NzaSAqY3NpLCB1MzIgcGl4Zm9ybWF0LAotCQkJ CSAgIHUzMiBtYnVzX2NvZGUpOwotCi0vKioKLSAqIHN1bjZpX2NzaV9zZXRfcG93ZXIoKSAtIHBv d2VyIG9uL29mZiB0aGUgY3NpCi0gKiBAY3NpOglwb2ludGVyIHRvIHRoZSBjc2kKLSAqIEBlbmFi bGU6CW9uL29mZgotICovCi1pbnQgc3VuNmlfY3NpX3NldF9wb3dlcihzdHJ1Y3Qgc3VuNmlfY3Np ICpjc2ksIGJvb2wgZW5hYmxlKTsKLQotLyoqCi0gKiBzdW42aV9jc2lfdXBkYXRlX2NvbmZpZygp IC0gdXBkYXRlIHRoZSBjc2kgcmVnaXN0ZXIgc2V0dGluZ3MKLSAqIEBjc2k6CXBvaW50ZXIgdG8g dGhlIGNzaQotICogQGNvbmZpZzoJc2VlIHN0cnVjdCBzdW42aV9jc2lfY29uZmlnCi0gKi8KLWlu dCBzdW42aV9jc2lfdXBkYXRlX2NvbmZpZyhzdHJ1Y3Qgc3VuNmlfY3NpICpjc2ksCi0JCQkgICAg c3RydWN0IHN1bjZpX2NzaV9jb25maWcgKmNvbmZpZyk7Ci0KLS8qKgotICogc3VuNmlfY3NpX3Vw ZGF0ZV9idWZfYWRkcigpIC0gdXBkYXRlIHRoZSBjc2kgZnJhbWUgYnVmZmVyIGFkZHJlc3MKLSAq IEBjc2k6CXBvaW50ZXIgdG8gdGhlIGNzaQotICogQGFkZHI6CWZyYW1lIGJ1ZmZlcidzIHBoeXNp Y2FsIGFkZHJlc3MKLSAqLwotdm9pZCBzdW42aV9jc2lfdXBkYXRlX2J1Zl9hZGRyKHN0cnVjdCBz dW42aV9jc2kgKmNzaSwgZG1hX2FkZHJfdCBhZGRyKTsKLQotLyoqCi0gKiBzdW42aV9jc2lfc2V0 X3N0cmVhbSgpIC0gc3RhcnQvc3RvcCBjc2kgc3RyZWFtaW5nCi0gKiBAY3NpOglwb2ludGVyIHRv IHRoZSBjc2kKLSAqIEBlbmFibGU6CXN0YXJ0L3N0b3AKLSAqLwotdm9pZCBzdW42aV9jc2lfc2V0 X3N0cmVhbShzdHJ1Y3Qgc3VuNmlfY3NpICpjc2ksIGJvb2wgZW5hYmxlKTsKLQotLyogZ2V0IGJw cCBmb3JtIHY0bDIgcGl4Zm9ybWF0ICovCi1zdGF0aWMgaW5saW5lIGludCBzdW42aV9jc2lfZ2V0 X2JwcCh1bnNpZ25lZCBpbnQgcGl4Zm9ybWF0KQotewotCXN3aXRjaCAocGl4Zm9ybWF0KSB7Ci0J Y2FzZSBWNEwyX1BJWF9GTVRfU0JHR1I4OgotCWNhc2UgVjRMMl9QSVhfRk1UX1NHQlJHODoKLQlj YXNlIFY0TDJfUElYX0ZNVF9TR1JCRzg6Ci0JY2FzZSBWNEwyX1BJWF9GTVRfU1JHR0I4OgotCWNh c2UgVjRMMl9QSVhfRk1UX0pQRUc6Ci0JCXJldHVybiA4OwotCWNhc2UgVjRMMl9QSVhfRk1UX1NC R0dSMTA6Ci0JY2FzZSBWNEwyX1BJWF9GTVRfU0dCUkcxMDoKLQljYXNlIFY0TDJfUElYX0ZNVF9T R1JCRzEwOgotCWNhc2UgVjRMMl9QSVhfRk1UX1NSR0dCMTA6Ci0JCXJldHVybiAxMDsKLQljYXNl IFY0TDJfUElYX0ZNVF9TQkdHUjEyOgotCWNhc2UgVjRMMl9QSVhfRk1UX1NHQlJHMTI6Ci0JY2Fz ZSBWNEwyX1BJWF9GTVRfU0dSQkcxMjoKLQljYXNlIFY0TDJfUElYX0ZNVF9TUkdHQjEyOgotCWNh c2UgVjRMMl9QSVhfRk1UX0hNMTI6Ci0JY2FzZSBWNEwyX1BJWF9GTVRfTlYxMjoKLQljYXNlIFY0 TDJfUElYX0ZNVF9OVjIxOgotCWNhc2UgVjRMMl9QSVhfRk1UX1lVVjQyMDoKLQljYXNlIFY0TDJf UElYX0ZNVF9ZVlU0MjA6Ci0JCXJldHVybiAxMjsKLQljYXNlIFY0TDJfUElYX0ZNVF9ZVVlWOgot CWNhc2UgVjRMMl9QSVhfRk1UX1lWWVU6Ci0JY2FzZSBWNEwyX1BJWF9GTVRfVVlWWToKLQljYXNl IFY0TDJfUElYX0ZNVF9WWVVZOgotCWNhc2UgVjRMMl9QSVhfRk1UX05WMTY6Ci0JY2FzZSBWNEwy X1BJWF9GTVRfTlY2MToKLQljYXNlIFY0TDJfUElYX0ZNVF9ZVVY0MjJQOgotCWNhc2UgVjRMMl9Q SVhfRk1UX1JHQjU2NToKLQljYXNlIFY0TDJfUElYX0ZNVF9SR0I1NjVYOgotCQlyZXR1cm4gMTY7 Ci0JY2FzZSBWNEwyX1BJWF9GTVRfUkdCMjQ6Ci0JY2FzZSBWNEwyX1BJWF9GTVRfQkdSMjQ6Ci0J CXJldHVybiAyNDsKLQljYXNlIFY0TDJfUElYX0ZNVF9SR0IzMjoKLQljYXNlIFY0TDJfUElYX0ZN VF9CR1IzMjoKLQkJcmV0dXJuIDMyOwotCWRlZmF1bHQ6Ci0JCVdBUk4oMSwgIlVuc3VwcG9ydGVk IHBpeGZvcm1hdDogMHgleFxuIiwgcGl4Zm9ybWF0KTsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJu IDA7Ci19Ci0KLSNlbmRpZiAvKiBfX1NVTjZJX0NTSV9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZl cnMvbWVkaWEvcGxhdGZvcm0vc3VueGkvc3VuNmktY3NpL3N1bjZpX2NzaV9yZWcuaCBiL2RyaXZl cnMvbWVkaWEvcGxhdGZvcm0vc3VueGkvc3VuNmktY3NpL3N1bjZpX2NzaV9yZWcuaApkZWxldGVk IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzAzZmExNGJiMzEzLi4wMDAwMDAwMDAwMDAKLS0tIGEv ZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zdW54aS9zdW42aS1jc2kvc3VuNmlfY3NpX3JlZy5oCisr KyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVy OiBHUEwtMi4wKyAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMS0yMDE4IE1hZ2V3ZWxsIEVs ZWN0cm9uaWNzIENvLiwgTHRkLiAoTmFuamluZykKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0g KiBBdXRob3I6IFlvbmcgRGVuZyA8eW9uZy5kZW5nQG1hZ2V3ZWxsLmNvbT4KLSAqLwotCi0jaWZu ZGVmIF9fU1VONklfQ1NJX1JFR19IX18KLSNkZWZpbmUgX19TVU42SV9DU0lfUkVHX0hfXwotCi0j aW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0KLSNkZWZpbmUgQ1NJX0VOX1JFRwkJCTB4MAotI2Rl ZmluZSBDU0lfRU5fVkVSX0VOCQkJCUJJVCgzMCkKLSNkZWZpbmUgQ1NJX0VOX0NTSV9FTgkJCQlC SVQoMCkKLQotI2RlZmluZSBDU0lfSUZfQ0ZHX1JFRwkJCTB4NAotI2RlZmluZSBDU0lfSUZfQ0ZH X1NSQ19UWVBFX01BU0sJCUJJVCgyMSkKLSNkZWZpbmUgQ1NJX0lGX0NGR19TUkNfVFlQRV9QUk9H UkVTU0VECQkoKDAgPDwgMjEpICYgQ1NJX0lGX0NGR19TUkNfVFlQRV9NQVNLKQotI2RlZmluZSBD U0lfSUZfQ0ZHX1NSQ19UWVBFX0lOVEVSTEFDRUQJCSgoMSA8PCAyMSkgJiBDU0lfSUZfQ0ZHX1NS Q19UWVBFX01BU0spCi0jZGVmaW5lIENTSV9JRl9DRkdfRlBTX0RTX0VOCQkJQklUKDIwKQotI2Rl ZmluZSBDU0lfSUZfQ0ZHX0ZJRUxEX01BU0sJCQlCSVQoMTkpCi0jZGVmaW5lIENTSV9JRl9DRkdf RklFTERfTkVHQVRJVkUJCSgoMCA8PCAxOSkgJiBDU0lfSUZfQ0ZHX0ZJRUxEX01BU0spCi0jZGVm aW5lIENTSV9JRl9DRkdfRklFTERfUE9TSVRJVkUJCSgoMSA8PCAxOSkgJiBDU0lfSUZfQ0ZHX0ZJ RUxEX01BU0spCi0jZGVmaW5lIENTSV9JRl9DRkdfVlJFRl9QT0xfTUFTSwkJQklUKDE4KQotI2Rl ZmluZSBDU0lfSUZfQ0ZHX1ZSRUZfUE9MX05FR0FUSVZFCQkoKDAgPDwgMTgpICYgQ1NJX0lGX0NG R19WUkVGX1BPTF9NQVNLKQotI2RlZmluZSBDU0lfSUZfQ0ZHX1ZSRUZfUE9MX1BPU0lUSVZFCQko KDEgPDwgMTgpICYgQ1NJX0lGX0NGR19WUkVGX1BPTF9NQVNLKQotI2RlZmluZSBDU0lfSUZfQ0ZH X0hSRUZfUE9MX01BU0sJCUJJVCgxNykKLSNkZWZpbmUgQ1NJX0lGX0NGR19IUkVGX1BPTF9ORUdB VElWRQkJKCgwIDw8IDE3KSAmIENTSV9JRl9DRkdfSFJFRl9QT0xfTUFTSykKLSNkZWZpbmUgQ1NJ X0lGX0NGR19IUkVGX1BPTF9QT1NJVElWRQkJKCgxIDw8IDE3KSAmIENTSV9JRl9DRkdfSFJFRl9Q T0xfTUFTSykKLSNkZWZpbmUgQ1NJX0lGX0NGR19DTEtfUE9MX01BU0sJCQlCSVQoMTYpCi0jZGVm aW5lIENTSV9JRl9DRkdfQ0xLX1BPTF9SSVNJTkdfRURHRQkJKCgwIDw8IDE2KSAmIENTSV9JRl9D RkdfQ0xLX1BPTF9NQVNLKQotI2RlZmluZSBDU0lfSUZfQ0ZHX0NMS19QT0xfRkFMTElOR19FREdF CQkoKDEgPDwgMTYpICYgQ1NJX0lGX0NGR19DTEtfUE9MX01BU0spCi0jZGVmaW5lIENTSV9JRl9D RkdfSUZfREFUQV9XSURUSF9NQVNLCQlHRU5NQVNLKDEwLCA4KQotI2RlZmluZSBDU0lfSUZfQ0ZH X0lGX0RBVEFfV0lEVEhfOEJJVAkJKCgwIDw8IDgpICYgQ1NJX0lGX0NGR19JRl9EQVRBX1dJRFRI X01BU0spCi0jZGVmaW5lIENTSV9JRl9DRkdfSUZfREFUQV9XSURUSF8xMEJJVAkJKCgxIDw8IDgp ICYgQ1NJX0lGX0NGR19JRl9EQVRBX1dJRFRIX01BU0spCi0jZGVmaW5lIENTSV9JRl9DRkdfSUZf REFUQV9XSURUSF8xMkJJVAkJKCgyIDw8IDgpICYgQ1NJX0lGX0NGR19JRl9EQVRBX1dJRFRIX01B U0spCi0jZGVmaW5lIENTSV9JRl9DRkdfTUlQSV9JRl9NQVNLCQkJQklUKDcpCi0jZGVmaW5lIENT SV9JRl9DRkdfTUlQSV9JRl9DU0kJCQkoMCA8PCA3KQotI2RlZmluZSBDU0lfSUZfQ0ZHX01JUElf SUZfTUlQSQkJCUJJVCg3KQotI2RlZmluZSBDU0lfSUZfQ0ZHX0NTSV9JRl9NQVNLCQkJR0VOTUFT Syg0LCAwKQotI2RlZmluZSBDU0lfSUZfQ0ZHX0NTSV9JRl9ZVVY0MjJfSU5UTFYJCSgoMCA8PCAw KSAmIENTSV9JRl9DRkdfQ1NJX0lGX01BU0spCi0jZGVmaW5lIENTSV9JRl9DRkdfQ1NJX0lGX1lV VjQyMl8xNkJJVAkJKCgxIDw8IDApICYgQ1NJX0lGX0NGR19DU0lfSUZfTUFTSykKLSNkZWZpbmUg Q1NJX0lGX0NGR19DU0lfSUZfQlQ2NTYJCQkoKDQgPDwgMCkgJiBDU0lfSUZfQ0ZHX0NTSV9JRl9N QVNLKQotI2RlZmluZSBDU0lfSUZfQ0ZHX0NTSV9JRl9CVDExMjAJCSgoNSA8PCAwKSAmIENTSV9J Rl9DRkdfQ1NJX0lGX01BU0spCi0KLSNkZWZpbmUgQ1NJX0NBUF9SRUcJCQkweDgKLSNkZWZpbmUg Q1NJX0NBUF9DSDBfQ0FQX01BU0tfTUFTSwkJR0VOTUFTSyg1LCAyKQotI2RlZmluZSBDU0lfQ0FQ X0NIMF9DQVBfTUFTSyhjb3VudCkJCSgoKGNvdW50KSA8PCAyKSAmIENTSV9DQVBfQ0gwX0NBUF9N QVNLX01BU0spCi0jZGVmaW5lIENTSV9DQVBfQ0gwX1ZDQVBfT04JCQlCSVQoMSkKLSNkZWZpbmUg Q1NJX0NBUF9DSDBfU0NBUF9PTgkJCUJJVCgwKQotCi0jZGVmaW5lIENTSV9TWU5DX0NOVF9SRUcJ CTB4YwotI2RlZmluZSBDU0lfRklGT19USFJTX1JFRwkJMHgxMAotI2RlZmluZSBDU0lfQlQ2NTZf SEVBRF9DRkdfUkVHCQkweDE0Ci0jZGVmaW5lIENTSV9QVE5fTEVOX1JFRwkJCTB4MzAKLSNkZWZp bmUgQ1NJX1BUTl9BRERSX1JFRwkJMHgzNAotI2RlZmluZSBDU0lfVkVSX1JFRwkJCTB4M2MKLQot I2RlZmluZSBDU0lfQ0hfQ0ZHX1JFRwkJCTB4NDQKLSNkZWZpbmUgQ1NJX0NIX0NGR19JTlBVVF9G TVRfTUFTSwkJR0VOTUFTSygyMywgMjApCi0jZGVmaW5lIENTSV9DSF9DRkdfSU5QVVRfRk1UKGZt dCkJCSgoKGZtdCkgPDwgMjApICYgQ1NJX0NIX0NGR19JTlBVVF9GTVRfTUFTSykKLSNkZWZpbmUg Q1NJX0NIX0NGR19PVVRQVVRfRk1UX01BU0sJCUdFTk1BU0soMTksIDE2KQotI2RlZmluZSBDU0lf Q0hfQ0ZHX09VVFBVVF9GTVQoZm10KQkJKCgoZm10KSA8PCAxNikgJiBDU0lfQ0hfQ0ZHX09VVFBV VF9GTVRfTUFTSykKLSNkZWZpbmUgQ1NJX0NIX0NGR19WRkxJUF9FTgkJCUJJVCgxMykKLSNkZWZp bmUgQ1NJX0NIX0NGR19IRkxJUF9FTgkJCUJJVCgxMikKLSNkZWZpbmUgQ1NJX0NIX0NGR19GSUVM RF9TRUxfTUFTSwkJR0VOTUFTSygxMSwgMTApCi0jZGVmaW5lIENTSV9DSF9DRkdfRklFTERfU0VM X0ZJRUxEMAkJKCgwIDw8IDEwKSAmIENTSV9DSF9DRkdfRklFTERfU0VMX01BU0spCi0jZGVmaW5l IENTSV9DSF9DRkdfRklFTERfU0VMX0ZJRUxEMQkJKCgxIDw8IDEwKSAmIENTSV9DSF9DRkdfRklF TERfU0VMX01BU0spCi0jZGVmaW5lIENTSV9DSF9DRkdfRklFTERfU0VMX0JPVEgJCSgoMiA8PCAx MCkgJiBDU0lfQ0hfQ0ZHX0ZJRUxEX1NFTF9NQVNLKQotI2RlZmluZSBDU0lfQ0hfQ0ZHX0lOUFVU X1NFUV9NQVNLCQlHRU5NQVNLKDksIDgpCi0jZGVmaW5lIENTSV9DSF9DRkdfSU5QVVRfU0VRKHNl cSkJCSgoKHNlcSkgPDwgOCkgJiBDU0lfQ0hfQ0ZHX0lOUFVUX1NFUV9NQVNLKQotCi0jZGVmaW5l IENTSV9DSF9TQ0FMRV9SRUcJCTB4NGMKLSNkZWZpbmUgQ1NJX0NIX1NDQUxFX1FVQVJUX0VOCQkJ QklUKDApCi0KLSNkZWZpbmUgQ1NJX0NIX0YwX0JVRkFfUkVHCQkweDUwCi0KLSNkZWZpbmUgQ1NJ X0NIX0YxX0JVRkFfUkVHCQkweDU4Ci0KLSNkZWZpbmUgQ1NJX0NIX0YyX0JVRkFfUkVHCQkweDYw Ci0KLSNkZWZpbmUgQ1NJX0NIX1NUQV9SRUcJCQkweDZjCi0jZGVmaW5lIENTSV9DSF9TVEFfRklF TERfU1RBX01BU0sJCUJJVCgyKQotI2RlZmluZSBDU0lfQ0hfU1RBX0ZJRUxEX1NUQV9GSUVMRDAJ CSgoMCA8PCAyKSAmIENTSV9DSF9TVEFfRklFTERfU1RBX01BU0spCi0jZGVmaW5lIENTSV9DSF9T VEFfRklFTERfU1RBX0ZJRUxEMQkJKCgxIDw8IDIpICYgQ1NJX0NIX1NUQV9GSUVMRF9TVEFfTUFT SykKLSNkZWZpbmUgQ1NJX0NIX1NUQV9WQ0FQX1NUQQkJCUJJVCgxKQotI2RlZmluZSBDU0lfQ0hf U1RBX1NDQVBfU1RBCQkJQklUKDApCi0KLSNkZWZpbmUgQ1NJX0NIX0lOVF9FTl9SRUcJCTB4NzAK LSNkZWZpbmUgQ1NJX0NIX0lOVF9FTl9WU19JTlRfRU4JCQlCSVQoNykKLSNkZWZpbmUgQ1NJX0NI X0lOVF9FTl9IQl9PRl9JTlRfRU4JCUJJVCg2KQotI2RlZmluZSBDU0lfQ0hfSU5UX0VOX01VTF9F UlJfSU5UX0VOCQlCSVQoNSkKLSNkZWZpbmUgQ1NJX0NIX0lOVF9FTl9GSUZPMl9PRl9JTlRfRU4J CUJJVCg0KQotI2RlZmluZSBDU0lfQ0hfSU5UX0VOX0ZJRk8xX09GX0lOVF9FTgkJQklUKDMpCi0j ZGVmaW5lIENTSV9DSF9JTlRfRU5fRklGTzBfT0ZfSU5UX0VOCQlCSVQoMikKLSNkZWZpbmUgQ1NJ X0NIX0lOVF9FTl9GRF9JTlRfRU4JCQlCSVQoMSkKLSNkZWZpbmUgQ1NJX0NIX0lOVF9FTl9DRF9J TlRfRU4JCQlCSVQoMCkKLQotI2RlZmluZSBDU0lfQ0hfSU5UX1NUQV9SRUcJCTB4NzQKLSNkZWZp bmUgQ1NJX0NIX0lOVF9TVEFfVlNfUEQJCQlCSVQoNykKLSNkZWZpbmUgQ1NJX0NIX0lOVF9TVEFf SEJfT0ZfUEQJCQlCSVQoNikKLSNkZWZpbmUgQ1NJX0NIX0lOVF9TVEFfTVVMX0VSUl9QRAkJQklU KDUpCi0jZGVmaW5lIENTSV9DSF9JTlRfU1RBX0ZJRk8yX09GX1BECQlCSVQoNCkKLSNkZWZpbmUg Q1NJX0NIX0lOVF9TVEFfRklGTzFfT0ZfUEQJCUJJVCgzKQotI2RlZmluZSBDU0lfQ0hfSU5UX1NU QV9GSUZPMF9PRl9QRAkJQklUKDIpCi0jZGVmaW5lIENTSV9DSF9JTlRfU1RBX0ZEX1BECQkJQklU KDEpCi0jZGVmaW5lIENTSV9DSF9JTlRfU1RBX0NEX1BECQkJQklUKDApCi0KLSNkZWZpbmUgQ1NJ X0NIX0ZMRDFfVlNJWkVfUkVHCQkweDc4Ci0KLSNkZWZpbmUgQ1NJX0NIX0hTSVpFX1JFRwkJMHg4 MAotI2RlZmluZSBDU0lfQ0hfSFNJWkVfSE9SX0xFTl9NQVNLCQlHRU5NQVNLKDI4LCAxNikKLSNk ZWZpbmUgQ1NJX0NIX0hTSVpFX0hPUl9MRU4obGVuKQkJKCgobGVuKSA8PCAxNikgJiBDU0lfQ0hf SFNJWkVfSE9SX0xFTl9NQVNLKQotI2RlZmluZSBDU0lfQ0hfSFNJWkVfSE9SX1NUQVJUX01BU0sJ CUdFTk1BU0soMTIsIDApCi0jZGVmaW5lIENTSV9DSF9IU0laRV9IT1JfU1RBUlQoc3RhcnQpCQko KChzdGFydCkgPDwgMCkgJiBDU0lfQ0hfSFNJWkVfSE9SX1NUQVJUX01BU0spCi0KLSNkZWZpbmUg Q1NJX0NIX1ZTSVpFX1JFRwkJMHg4NAotI2RlZmluZSBDU0lfQ0hfVlNJWkVfVkVSX0xFTl9NQVNL CQlHRU5NQVNLKDI4LCAxNikKLSNkZWZpbmUgQ1NJX0NIX1ZTSVpFX1ZFUl9MRU4obGVuKQkJKCgo bGVuKSA8PCAxNikgJiBDU0lfQ0hfVlNJWkVfVkVSX0xFTl9NQVNLKQotI2RlZmluZSBDU0lfQ0hf VlNJWkVfVkVSX1NUQVJUX01BU0sJCUdFTk1BU0soMTIsIDApCi0jZGVmaW5lIENTSV9DSF9WU0la RV9WRVJfU1RBUlQoc3RhcnQpCQkoKChzdGFydCkgPDwgMCkgJiBDU0lfQ0hfVlNJWkVfVkVSX1NU QVJUX01BU0spCi0KLSNkZWZpbmUgQ1NJX0NIX0JVRl9MRU5fUkVHCQkweDg4Ci0jZGVmaW5lIENT SV9DSF9CVUZfTEVOX0JVRl9MRU5fQ19NQVNLCQlHRU5NQVNLKDI5LCAxNikKLSNkZWZpbmUgQ1NJ X0NIX0JVRl9MRU5fQlVGX0xFTl9DKGxlbikJCSgoKGxlbikgPDwgMTYpICYgQ1NJX0NIX0JVRl9M RU5fQlVGX0xFTl9DX01BU0spCi0jZGVmaW5lIENTSV9DSF9CVUZfTEVOX0JVRl9MRU5fWV9NQVNL CQlHRU5NQVNLKDEzLCAwKQotI2RlZmluZSBDU0lfQ0hfQlVGX0xFTl9CVUZfTEVOX1kobGVuKQkJ KCgobGVuKSA8PCAwKSAmIENTSV9DSF9CVUZfTEVOX0JVRl9MRU5fWV9NQVNLKQotCi0jZGVmaW5l IENTSV9DSF9GTElQX1NJWkVfUkVHCQkweDhjCi0jZGVmaW5lIENTSV9DSF9GTElQX1NJWkVfVkVS X0xFTl9NQVNLCQlHRU5NQVNLKDI4LCAxNikKLSNkZWZpbmUgQ1NJX0NIX0ZMSVBfU0laRV9WRVJf TEVOKGxlbikJCSgoKGxlbikgPDwgMTYpICYgQ1NJX0NIX0ZMSVBfU0laRV9WRVJfTEVOX01BU0sp Ci0jZGVmaW5lIENTSV9DSF9GTElQX1NJWkVfVkFMSURfTEVOX01BU0sJCUdFTk1BU0soMTIsIDAp Ci0jZGVmaW5lIENTSV9DSF9GTElQX1NJWkVfVkFMSURfTEVOKGxlbikJCSgoKGxlbikgPDwgMCkg JiBDU0lfQ0hfRkxJUF9TSVpFX1ZBTElEX0xFTl9NQVNLKQotCi0jZGVmaW5lIENTSV9DSF9GUk1f Q0xLX0NOVF9SRUcJCTB4OTAKLSNkZWZpbmUgQ1NJX0NIX0FDQ19JVE5MX0NMS19DTlRfUkVHCTB4 OTQKLSNkZWZpbmUgQ1NJX0NIX0ZJRk9fU1RBVF9SRUcJCTB4OTgKLSNkZWZpbmUgQ1NJX0NIX1BD TEtfU1RBVF9SRUcJCTB4OWMKLQotLyoKLSAqIGNzaSBpbnB1dCBkYXRhIGZvcm1hdAotICovCi1l bnVtIGNzaV9pbnB1dF9mbXQgewotCUNTSV9JTlBVVF9GT1JNQVRfUkFXCQk9IDAsCi0JQ1NJX0lO UFVUX0ZPUk1BVF9ZVVY0MjIJCT0gMywKLQlDU0lfSU5QVVRfRk9STUFUX1lVVjQyMAkJPSA0LAot fTsKLQotLyoKLSAqIGNzaSBvdXRwdXQgZGF0YSBmb3JtYXQKLSAqLwotZW51bSBjc2lfb3V0cHV0 X2ZtdCB7Ci0JLyogb25seSB3aGVuIGlucHV0IGZvcm1hdCBpcyBSQVcgKi8KLQlDU0lfRklFTERf UkFXXzgJCQk9IDAsCi0JQ1NJX0ZJRUxEX1JBV18xMAkJPSAxLAotCUNTSV9GSUVMRF9SQVdfMTIJ CT0gMiwKLQlDU0lfRklFTERfUkdCNTY1CQk9IDQsCi0JQ1NJX0ZJRUxEX1JHQjg4OAkJPSA1LAot CUNTSV9GSUVMRF9QUkdCODg4CQk9IDYsCi0JQ1NJX0ZSQU1FX1JBV184CQkJPSA4LAotCUNTSV9G UkFNRV9SQVdfMTAJCT0gOSwKLQlDU0lfRlJBTUVfUkFXXzEyCQk9IDEwLAotCUNTSV9GUkFNRV9S R0I1NjUJCT0gMTIsCi0JQ1NJX0ZSQU1FX1JHQjg4OAkJPSAxMywKLQlDU0lfRlJBTUVfUFJHQjg4 OAkJPSAxNCwKLQotCS8qIG9ubHkgd2hlbiBpbnB1dCBmb3JtYXQgaXMgWVVWNDIyICovCi0JQ1NJ X0ZJRUxEX1BMQU5BUl9ZVVY0MjIJCT0gMCwKLQlDU0lfRklFTERfUExBTkFSX1lVVjQyMAkJPSAx LAotCUNTSV9GUkFNRV9QTEFOQVJfWVVWNDIwCQk9IDIsCi0JQ1NJX0ZSQU1FX1BMQU5BUl9ZVVY0 MjIJCT0gMywKLQlDU0lfRklFTERfVVZfQ0JfWVVWNDIyCQk9IDQsCi0JQ1NJX0ZJRUxEX1VWX0NC X1lVVjQyMAkJPSA1LAotCUNTSV9GUkFNRV9VVl9DQl9ZVVY0MjAJCT0gNiwKLQlDU0lfRlJBTUVf VVZfQ0JfWVVWNDIyCQk9IDcsCi0JQ1NJX0ZJRUxEX01CX1lVVjQyMgkJPSA4LAotCUNTSV9GSUVM RF9NQl9ZVVY0MjAJCT0gOSwKLQlDU0lfRlJBTUVfTUJfWVVWNDIwCQk9IDEwLAotCUNTSV9GUkFN RV9NQl9ZVVY0MjIJCT0gMTEsCi0JQ1NJX0ZJRUxEX1VWX0NCX1lVVjQyMl8xMAk9IDEyLAotCUNT SV9GSUVMRF9VVl9DQl9ZVVY0MjBfMTAJPSAxMywKLX07Ci0KLS8qCi0gKiBjc2kgWVVWIGlucHV0 IGRhdGEgc2VxdWVuY2UKLSAqLwotZW51bSBjc2lfaW5wdXRfc2VxIHsKLQkvKiBvbmx5IHdoZW4g aW5wdXQgZm9ybWF0IGlzIFlVVjQyMiAqLwotCUNTSV9JTlBVVF9TRVFfWVVZViA9IDAsCi0JQ1NJ X0lOUFVUX1NFUV9ZVllVLAotCUNTSV9JTlBVVF9TRVFfVVlWWSwKLQlDU0lfSU5QVVRfU0VRX1ZZ VVksCi19OwotCi0jZW5kaWYgLyogX19TVU42SV9DU0lfUkVHX0hfXyAqLwpkaWZmIC0tZ2l0IGEv ZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zdW54aS9zdW42aS1jc2kvc3VuNmlfdmlkZW8uYyBiL2Ry aXZlcnMvbWVkaWEvcGxhdGZvcm0vc3VueGkvc3VuNmktY3NpL3N1bjZpX3ZpZGVvLmMKZGVsZXRl ZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3YjIxNjEzOTJkMi4uMDAwMDAwMDAwMDAwCi0tLSBh L2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vc3VueGkvc3VuNmktY3NpL3N1bjZpX3ZpZGVvLmMKKysr IC9kZXYvbnVsbApAQCAtMSw2ODMgKzAsMCBAQAotLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6 IEdQTC0yLjArCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTggTWFnZXdlbGwgRWxlY3Ry b25pY3MgQ28uLCBMdGQuIChOYW5qaW5nKQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIEF1 dGhvcjogWW9uZyBEZW5nIDx5b25nLmRlbmdAbWFnZXdlbGwuY29tPgotICovCi0KLSNpbmNsdWRl IDxsaW51eC9vZi5oPgotCi0jaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KLSNpbmNsdWRl IDxtZWRpYS92NGwyLWV2ZW50Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvdjRsMi1pb2N0bC5oPgotI2lu Y2x1ZGUgPG1lZGlhL3Y0bDItbWMuaD4KLSNpbmNsdWRlIDxtZWRpYS92aWRlb2J1ZjItZG1hLWNv bnRpZy5oPgotI2luY2x1ZGUgPG1lZGlhL3ZpZGVvYnVmMi12NGwyLmg+Ci0KLSNpbmNsdWRlICJz dW42aV9jc2kuaCIKLSNpbmNsdWRlICJzdW42aV92aWRlby5oIgotCi0vKiBUaGlzIGlzIGdvdCBm cm9tIEJTUCBzb3VyY2VzLiAqLwotI2RlZmluZSBNSU5fV0lEVEgJKDMyKQotI2RlZmluZSBNSU5f SEVJR0hUCSgzMikKLSNkZWZpbmUgTUFYX1dJRFRICSg0ODAwKQotI2RlZmluZSBNQVhfSEVJR0hU CSg0ODAwKQotCi1zdHJ1Y3Qgc3VuNmlfY3NpX2J1ZmZlciB7Ci0Jc3RydWN0IHZiMl92NGwyX2J1 ZmZlcgkJdmI7Ci0Jc3RydWN0IGxpc3RfaGVhZAkJbGlzdDsKLQotCWRtYV9hZGRyX3QJCQlkbWFf YWRkcjsKLQlib29sCQkJCXF1ZXVlZF90b19jc2k7Ci19OwotCi1zdGF0aWMgY29uc3QgdTMyIHN1 cHBvcnRlZF9waXhmb3JtYXRzW10gPSB7Ci0JVjRMMl9QSVhfRk1UX1NCR0dSOCwKLQlWNEwyX1BJ WF9GTVRfU0dCUkc4LAotCVY0TDJfUElYX0ZNVF9TR1JCRzgsCi0JVjRMMl9QSVhfRk1UX1NSR0dC OCwKLQlWNEwyX1BJWF9GTVRfU0JHR1IxMCwKLQlWNEwyX1BJWF9GTVRfU0dCUkcxMCwKLQlWNEwy X1BJWF9GTVRfU0dSQkcxMCwKLQlWNEwyX1BJWF9GTVRfU1JHR0IxMCwKLQlWNEwyX1BJWF9GTVRf U0JHR1IxMiwKLQlWNEwyX1BJWF9GTVRfU0dCUkcxMiwKLQlWNEwyX1BJWF9GTVRfU0dSQkcxMiwK LQlWNEwyX1BJWF9GTVRfU1JHR0IxMiwKLQlWNEwyX1BJWF9GTVRfWVVZViwKLQlWNEwyX1BJWF9G TVRfWVZZVSwKLQlWNEwyX1BJWF9GTVRfVVlWWSwKLQlWNEwyX1BJWF9GTVRfVllVWSwKLQlWNEwy X1BJWF9GTVRfSE0xMiwKLQlWNEwyX1BJWF9GTVRfTlYxMiwKLQlWNEwyX1BJWF9GTVRfTlYyMSwK LQlWNEwyX1BJWF9GTVRfWVVWNDIwLAotCVY0TDJfUElYX0ZNVF9ZVlU0MjAsCi0JVjRMMl9QSVhf Rk1UX05WMTYsCi0JVjRMMl9QSVhfRk1UX05WNjEsCi0JVjRMMl9QSVhfRk1UX1lVVjQyMlAsCi0J VjRMMl9QSVhfRk1UX1JHQjU2NSwKLQlWNEwyX1BJWF9GTVRfUkdCNTY1WCwKLQlWNEwyX1BJWF9G TVRfSlBFRywKLX07Ci0KLXN0YXRpYyBib29sIGlzX3BpeGZvcm1hdF92YWxpZCh1bnNpZ25lZCBp bnQgcGl4Zm9ybWF0KQotewotCXVuc2lnbmVkIGludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IEFS UkFZX1NJWkUoc3VwcG9ydGVkX3BpeGZvcm1hdHMpOyBpKyspCi0JCWlmIChzdXBwb3J0ZWRfcGl4 Zm9ybWF0c1tpXSA9PSBwaXhmb3JtYXQpCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCXJldHVybiBmYWxz ZTsKLX0KLQotc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldiAqCi1zdW42aV92aWRlb19yZW1vdGVf c3ViZGV2KHN0cnVjdCBzdW42aV92aWRlbyAqdmlkZW8sIHUzMiAqcGFkKQotewotCXN0cnVjdCBt ZWRpYV9wYWQgKnJlbW90ZTsKLQotCXJlbW90ZSA9IG1lZGlhX2VudGl0eV9yZW1vdGVfcGFkKCZ2 aWRlby0+cGFkKTsKLQotCWlmICghcmVtb3RlIHx8ICFpc19tZWRpYV9lbnRpdHlfdjRsMl9zdWJk ZXYocmVtb3RlLT5lbnRpdHkpKQotCQlyZXR1cm4gTlVMTDsKLQotCWlmIChwYWQpCi0JCSpwYWQg PSByZW1vdGUtPmluZGV4OwotCi0JcmV0dXJuIG1lZGlhX2VudGl0eV90b192NGwyX3N1YmRldihy ZW1vdGUtPmVudGl0eSk7Ci19Ci0KLXN0YXRpYyBpbnQgc3VuNmlfdmlkZW9fcXVldWVfc2V0dXAo c3RydWN0IHZiMl9xdWV1ZSAqdnEsCi0JCQkJICAgdW5zaWduZWQgaW50ICpuYnVmZmVycywKLQkJ CQkgICB1bnNpZ25lZCBpbnQgKm5wbGFuZXMsCi0JCQkJICAgdW5zaWduZWQgaW50IHNpemVzW10s Ci0JCQkJICAgc3RydWN0IGRldmljZSAqYWxsb2NfZGV2c1tdKQotewotCXN0cnVjdCBzdW42aV92 aWRlbyAqdmlkZW8gPSB2YjJfZ2V0X2Rydl9wcml2KHZxKTsKLQl1bnNpZ25lZCBpbnQgc2l6ZSA9 IHZpZGVvLT5mbXQuZm10LnBpeC5zaXplaW1hZ2U7Ci0KLQlpZiAoKm5wbGFuZXMpCi0JCXJldHVy biBzaXplc1swXSA8IHNpemUgPyAtRUlOVkFMIDogMDsKLQotCSpucGxhbmVzID0gMTsKLQlzaXpl c1swXSA9IHNpemU7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzdW42aV92aWRlb19i dWZmZXJfcHJlcGFyZShzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIpCi17Ci0Jc3RydWN0IHZiMl92NGwy X2J1ZmZlciAqdmJ1ZiA9IHRvX3ZiMl92NGwyX2J1ZmZlcih2Yik7Ci0Jc3RydWN0IHN1bjZpX2Nz aV9idWZmZXIgKmJ1ZiA9Ci0JCQljb250YWluZXJfb2YodmJ1Ziwgc3RydWN0IHN1bjZpX2NzaV9i dWZmZXIsIHZiKTsKLQlzdHJ1Y3Qgc3VuNmlfdmlkZW8gKnZpZGVvID0gdmIyX2dldF9kcnZfcHJp dih2Yi0+dmIyX3F1ZXVlKTsKLQl1bnNpZ25lZCBsb25nIHNpemUgPSB2aWRlby0+Zm10LmZtdC5w aXguc2l6ZWltYWdlOwotCi0JaWYgKHZiMl9wbGFuZV9zaXplKHZiLCAwKSA8IHNpemUpIHsKLQkJ djRsMl9lcnIodmlkZW8tPnZkZXYudjRsMl9kZXYsICJidWZmZXIgdG9vIHNtYWxsICglbHUgPCAl bHUpXG4iLAotCQkJIHZiMl9wbGFuZV9zaXplKHZiLCAwKSwgc2l6ZSk7Ci0JCXJldHVybiAtRUlO VkFMOwotCX0KLQotCXZiMl9zZXRfcGxhbmVfcGF5bG9hZCh2YiwgMCwgc2l6ZSk7Ci0KLQlidWYt PmRtYV9hZGRyID0gdmIyX2RtYV9jb250aWdfcGxhbmVfZG1hX2FkZHIodmIsIDApOwotCi0JdmJ1 Zi0+ZmllbGQgPSB2aWRlby0+Zm10LmZtdC5waXguZmllbGQ7Ci0KLQlyZXR1cm4gMDsKLX0KLQot c3RhdGljIGludCBzdW42aV92aWRlb19zdGFydF9zdHJlYW1pbmcoc3RydWN0IHZiMl9xdWV1ZSAq dnEsIHVuc2lnbmVkIGludCBjb3VudCkKLXsKLQlzdHJ1Y3Qgc3VuNmlfdmlkZW8gKnZpZGVvID0g dmIyX2dldF9kcnZfcHJpdih2cSk7Ci0Jc3RydWN0IHN1bjZpX2NzaV9idWZmZXIgKmJ1ZjsKLQlz dHJ1Y3Qgc3VuNmlfY3NpX2J1ZmZlciAqbmV4dF9idWY7Ci0Jc3RydWN0IHN1bjZpX2NzaV9jb25m aWcgY29uZmlnOwotCXN0cnVjdCB2NGwyX3N1YmRldiAqc3ViZGV2OwotCXVuc2lnbmVkIGxvbmcg ZmxhZ3M7Ci0JaW50IHJldDsKLQotCXZpZGVvLT5zZXF1ZW5jZSA9IDA7Ci0KLQlyZXQgPSBtZWRp YV9waXBlbGluZV9zdGFydCgmdmlkZW8tPnZkZXYuZW50aXR5LCAmdmlkZW8tPnZkZXYucGlwZSk7 Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gY2xlYXJfZG1hX3F1ZXVlOwotCi0JaWYgKHZpZGVvLT5t YnVzX2NvZGUgPT0gMCkgewotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIHN0b3BfbWVkaWFfcGlw ZWxpbmU7Ci0JfQotCi0Jc3ViZGV2ID0gc3VuNmlfdmlkZW9fcmVtb3RlX3N1YmRldih2aWRlbywg TlVMTCk7Ci0JaWYgKCFzdWJkZXYpIHsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBzdG9wX21l ZGlhX3BpcGVsaW5lOwotCX0KLQotCWNvbmZpZy5waXhlbGZvcm1hdCA9IHZpZGVvLT5mbXQuZm10 LnBpeC5waXhlbGZvcm1hdDsKLQljb25maWcuY29kZSA9IHZpZGVvLT5tYnVzX2NvZGU7Ci0JY29u ZmlnLmZpZWxkID0gdmlkZW8tPmZtdC5mbXQucGl4LmZpZWxkOwotCWNvbmZpZy53aWR0aCA9IHZp ZGVvLT5mbXQuZm10LnBpeC53aWR0aDsKLQljb25maWcuaGVpZ2h0ID0gdmlkZW8tPmZtdC5mbXQu cGl4LmhlaWdodDsKLQotCXJldCA9IHN1bjZpX2NzaV91cGRhdGVfY29uZmlnKHZpZGVvLT5jc2ks ICZjb25maWcpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIHN0b3BfbWVkaWFfcGlwZWxpbmU7Ci0K LQlzcGluX2xvY2tfaXJxc2F2ZSgmdmlkZW8tPmRtYV9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0KLQli dWYgPSBsaXN0X2ZpcnN0X2VudHJ5KCZ2aWRlby0+ZG1hX3F1ZXVlLAotCQkJICAgICAgIHN0cnVj dCBzdW42aV9jc2lfYnVmZmVyLCBsaXN0KTsKLQlidWYtPnF1ZXVlZF90b19jc2kgPSB0cnVlOwot CXN1bjZpX2NzaV91cGRhdGVfYnVmX2FkZHIodmlkZW8tPmNzaSwgYnVmLT5kbWFfYWRkcik7Ci0K LQlzdW42aV9jc2lfc2V0X3N0cmVhbSh2aWRlby0+Y3NpLCB0cnVlKTsKLQotCS8qCi0JICogQ1NJ IHdpbGwgbG9va3VwIHRoZSBuZXh0IGRtYSBidWZmZXIgZm9yIG5leHQgZnJhbWUgYmVmb3JlIHRo ZQotCSAqIHRoZSBjdXJyZW50IGZyYW1lIGRvbmUgSVJRIHRyaWdnZXJlZC4gVGhpcyBpcyBub3Qg ZG9jdW1lbnRlZAotCSAqIGJ1dCByZXBvcnRlZCBieSBPbmTFmWVqIEppcm1hbi4KLQkgKiBUaGUg QlNQIGNvZGUgaGFzIHdvcmthcm91bmQgZm9yIHRoaXMgdG9vLiBJdCBza2lwIHRvIG1hcmsgdGhl Ci0JICogZmlyc3QgYnVmZmVyIGFzIGZyYW1lIGRvbmUgZm9yIFZCMiBhbmQgcGFzcyB0aGUgc2Vj b25kIGJ1ZmZlcgotCSAqIHRvIENTSSBpbiB0aGUgZmlyc3QgZnJhbWUgZG9uZSBJU1IgY2FsbC4g VGhlbiBpbiBzZWNvbmQgZnJhbWUKLQkgKiBkb25lIElTUiBjYWxsLCBpdCBtYXJrIHRoZSBmaXJz dCBidWZmZXIgYXMgZnJhbWUgZG9uZSBmb3IgVkIyCi0JICogYW5kIHBhc3MgdGhlIHRoaXJkIGJ1 ZmZlciB0byBDU0kuIEFuZCBzbyBvbi4gVGhlIGJhZCB0aGluZyBpcwotCSAqIHRoYXQgdGhlIGZp cnN0IGJ1ZmZlciB3aWxsIGJlIHdyaXR0ZW4gdHdpY2UgYW5kIHRoZSBmaXJzdCBmcmFtZQotCSAq IGlzIGRyb3BwZWQgZXZlbiB0aGUgcXVldWVkIGJ1ZmZlciBpcyBzdWZmaWNpZW50LgotCSAqIFNv LCBJIG1ha2Ugc29tZSBpbXByb3ZlbWVudCBoZXJlLiBQYXNzIHRoZSBuZXh0IGJ1ZmZlciB0byBD U0kKLQkgKiBqdXN0IGZvbGxvdyBzdGFydGluZyB0aGUgQ1NJLiBJbiB0aGlzIGNhc2UsIHRoZSBm aXJzdCBmcmFtZQotCSAqIHdpbGwgYmUgc3RvcmVkIGluIGZpcnN0IGJ1ZmZlciwgc2Vjb25kIGZy YW1lIGluIHNlY29uZCBidWZmZXIuCi0JICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBhdm9pZCBk cm9wcGluZyB0aGUgZmlyc3QgZnJhbWUsIGl0Ci0JICogd291bGQgYWxzbyBkcm9wIGZyYW1lIHdo ZW4gbGFja2luZyBvZiBxdWV1ZWQgYnVmZmVyLgotCSAqLwotCW5leHRfYnVmID0gbGlzdF9uZXh0 X2VudHJ5KGJ1ZiwgbGlzdCk7Ci0JbmV4dF9idWYtPnF1ZXVlZF90b19jc2kgPSB0cnVlOwotCXN1 bjZpX2NzaV91cGRhdGVfYnVmX2FkZHIodmlkZW8tPmNzaSwgbmV4dF9idWYtPmRtYV9hZGRyKTsK LQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZpZGVvLT5kbWFfcXVldWVfbG9jaywgZmxhZ3Mp OwotCi0JcmV0ID0gdjRsMl9zdWJkZXZfY2FsbChzdWJkZXYsIHZpZGVvLCBzX3N0cmVhbSwgMSk7 Ci0JaWYgKHJldCAmJiByZXQgIT0gLUVOT0lPQ1RMQ01EKQotCQlnb3RvIHN0b3BfY3NpX3N0cmVh bTsKLQotCXJldHVybiAwOwotCi1zdG9wX2NzaV9zdHJlYW06Ci0Jc3VuNmlfY3NpX3NldF9zdHJl YW0odmlkZW8tPmNzaSwgZmFsc2UpOwotc3RvcF9tZWRpYV9waXBlbGluZToKLQltZWRpYV9waXBl bGluZV9zdG9wKCZ2aWRlby0+dmRldi5lbnRpdHkpOwotY2xlYXJfZG1hX3F1ZXVlOgotCXNwaW5f bG9ja19pcnFzYXZlKCZ2aWRlby0+ZG1hX3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQlsaXN0X2Zvcl9l YWNoX2VudHJ5KGJ1ZiwgJnZpZGVvLT5kbWFfcXVldWUsIGxpc3QpCi0JCXZiMl9idWZmZXJfZG9u ZSgmYnVmLT52Yi52YjJfYnVmLCBWQjJfQlVGX1NUQVRFX1FVRVVFRCk7Ci0JSU5JVF9MSVNUX0hF QUQoJnZpZGVvLT5kbWFfcXVldWUpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZpZGVvLT5k bWFfcXVldWVfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQg c3VuNmlfdmlkZW9fc3RvcF9zdHJlYW1pbmcoc3RydWN0IHZiMl9xdWV1ZSAqdnEpCi17Ci0Jc3Ry dWN0IHN1bjZpX3ZpZGVvICp2aWRlbyA9IHZiMl9nZXRfZHJ2X3ByaXYodnEpOwotCXN0cnVjdCB2 NGwyX3N1YmRldiAqc3ViZGV2OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IHN1bjZp X2NzaV9idWZmZXIgKmJ1ZjsKLQotCXN1YmRldiA9IHN1bjZpX3ZpZGVvX3JlbW90ZV9zdWJkZXYo dmlkZW8sIE5VTEwpOwotCWlmIChzdWJkZXYpCi0JCXY0bDJfc3ViZGV2X2NhbGwoc3ViZGV2LCB2 aWRlbywgc19zdHJlYW0sIDApOwotCi0Jc3VuNmlfY3NpX3NldF9zdHJlYW0odmlkZW8tPmNzaSwg ZmFsc2UpOwotCi0JbWVkaWFfcGlwZWxpbmVfc3RvcCgmdmlkZW8tPnZkZXYuZW50aXR5KTsKLQot CS8qIFJlbGVhc2UgYWxsIGFjdGl2ZSBidWZmZXJzICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnZp ZGVvLT5kbWFfcXVldWVfbG9jaywgZmxhZ3MpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoYnVmLCAm dmlkZW8tPmRtYV9xdWV1ZSwgbGlzdCkKLQkJdmIyX2J1ZmZlcl9kb25lKCZidWYtPnZiLnZiMl9i dWYsIFZCMl9CVUZfU1RBVEVfRVJST1IpOwotCUlOSVRfTElTVF9IRUFEKCZ2aWRlby0+ZG1hX3F1 ZXVlKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aWRlby0+ZG1hX3F1ZXVlX2xvY2ssIGZs YWdzKTsKLX0KLQotc3RhdGljIHZvaWQgc3VuNmlfdmlkZW9fYnVmZmVyX3F1ZXVlKHN0cnVjdCB2 YjJfYnVmZmVyICp2YikKLXsKLQlzdHJ1Y3QgdmIyX3Y0bDJfYnVmZmVyICp2YnVmID0gdG9fdmIy X3Y0bDJfYnVmZmVyKHZiKTsKLQlzdHJ1Y3Qgc3VuNmlfY3NpX2J1ZmZlciAqYnVmID0KLQkJCWNv bnRhaW5lcl9vZih2YnVmLCBzdHJ1Y3Qgc3VuNmlfY3NpX2J1ZmZlciwgdmIpOwotCXN0cnVjdCBz dW42aV92aWRlbyAqdmlkZW8gPSB2YjJfZ2V0X2Rydl9wcml2KHZiLT52YjJfcXVldWUpOwotCXVu c2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmdmlkZW8tPmRtYV9xdWV1 ZV9sb2NrLCBmbGFncyk7Ci0JYnVmLT5xdWV1ZWRfdG9fY3NpID0gZmFsc2U7Ci0JbGlzdF9hZGRf dGFpbCgmYnVmLT5saXN0LCAmdmlkZW8tPmRtYV9xdWV1ZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVz dG9yZSgmdmlkZW8tPmRtYV9xdWV1ZV9sb2NrLCBmbGFncyk7Ci19Ci0KLXZvaWQgc3VuNmlfdmlk ZW9fZnJhbWVfZG9uZShzdHJ1Y3Qgc3VuNmlfdmlkZW8gKnZpZGVvKQotewotCXN0cnVjdCBzdW42 aV9jc2lfYnVmZmVyICpidWY7Ci0Jc3RydWN0IHN1bjZpX2NzaV9idWZmZXIgKm5leHRfYnVmOwot CXN0cnVjdCB2YjJfdjRsMl9idWZmZXIgKnZidWY7Ci0KLQlzcGluX2xvY2soJnZpZGVvLT5kbWFf cXVldWVfbG9jayk7Ci0KLQlidWYgPSBsaXN0X2ZpcnN0X2VudHJ5KCZ2aWRlby0+ZG1hX3F1ZXVl LAotCQkJICAgICAgIHN0cnVjdCBzdW42aV9jc2lfYnVmZmVyLCBsaXN0KTsKLQlpZiAobGlzdF9p c19sYXN0KCZidWYtPmxpc3QsICZ2aWRlby0+ZG1hX3F1ZXVlKSkgewotCQlkZXZfZGJnKHZpZGVv LT5jc2ktPmRldiwgIkZyYW1lIGRyb3BwZWQhXG4iKTsKLQkJZ290byB1bmxvY2s7Ci0JfQotCi0J bmV4dF9idWYgPSBsaXN0X25leHRfZW50cnkoYnVmLCBsaXN0KTsKLQkvKiBJZiBhIG5ldyBidWZm ZXIgKCNuZXh0X2J1ZikgaGFkIG5vdCBiZWVuIHF1ZXVlZCB0byBDU0ksIHRoZSBvbGQKLQkgKiBi dWZmZXIgKCNidWYpIGlzIHN0aWxsIGhvbGRpbmcgYnkgQ1NJIGZvciBzdG9yaW5nIHRoZSBuZXh0 Ci0JICogZnJhbWUuIFNvLCB3ZSBxdWV1ZSBhIG5ldyBidWZmZXIgKCNuZXh0X2J1ZikgdG8gQ1NJ IHRoZW4gd2FpdAotCSAqIGZvciBuZXh0IElTUiBjYWxsLgotCSAqLwotCWlmICghbmV4dF9idWYt PnF1ZXVlZF90b19jc2kpIHsKLQkJbmV4dF9idWYtPnF1ZXVlZF90b19jc2kgPSB0cnVlOwotCQlz dW42aV9jc2lfdXBkYXRlX2J1Zl9hZGRyKHZpZGVvLT5jc2ksIG5leHRfYnVmLT5kbWFfYWRkcik7 Ci0JCWRldl9kYmcodmlkZW8tPmNzaS0+ZGV2LCAiRnJhbWUgZHJvcHBlZCFcbiIpOwotCQlnb3Rv IHVubG9jazsKLQl9Ci0KLQlsaXN0X2RlbCgmYnVmLT5saXN0KTsKLQl2YnVmID0gJmJ1Zi0+dmI7 Ci0JdmJ1Zi0+dmIyX2J1Zi50aW1lc3RhbXAgPSBrdGltZV9nZXRfbnMoKTsKLQl2YnVmLT5zZXF1 ZW5jZSA9IHZpZGVvLT5zZXF1ZW5jZTsKLQl2YjJfYnVmZmVyX2RvbmUoJnZidWYtPnZiMl9idWYs IFZCMl9CVUZfU1RBVEVfRE9ORSk7Ci0KLQkvKiBQcmVwYXJlIGJ1ZmZlciBmb3IgbmV4dCBmcmFt ZSBidXQgb25lLiAgKi8KLQlpZiAoIWxpc3RfaXNfbGFzdCgmbmV4dF9idWYtPmxpc3QsICZ2aWRl by0+ZG1hX3F1ZXVlKSkgewotCQluZXh0X2J1ZiA9IGxpc3RfbmV4dF9lbnRyeShuZXh0X2J1Ziwg bGlzdCk7Ci0JCW5leHRfYnVmLT5xdWV1ZWRfdG9fY3NpID0gdHJ1ZTsKLQkJc3VuNmlfY3NpX3Vw ZGF0ZV9idWZfYWRkcih2aWRlby0+Y3NpLCBuZXh0X2J1Zi0+ZG1hX2FkZHIpOwotCX0gZWxzZSB7 Ci0JCWRldl9kYmcodmlkZW8tPmNzaS0+ZGV2LCAiTmV4dCBmcmFtZSB3aWxsIGJlIGRyb3BwZWQh XG4iKTsKLQl9Ci0KLXVubG9jazoKLQl2aWRlby0+c2VxdWVuY2UrKzsKLQlzcGluX3VubG9jaygm dmlkZW8tPmRtYV9xdWV1ZV9sb2NrKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCB2YjJfb3Bz IHN1bjZpX2NzaV92YjJfb3BzID0gewotCS5xdWV1ZV9zZXR1cAkJPSBzdW42aV92aWRlb19xdWV1 ZV9zZXR1cCwKLQkud2FpdF9wcmVwYXJlCQk9IHZiMl9vcHNfd2FpdF9wcmVwYXJlLAotCS53YWl0 X2ZpbmlzaAkJPSB2YjJfb3BzX3dhaXRfZmluaXNoLAotCS5idWZfcHJlcGFyZQkJPSBzdW42aV92 aWRlb19idWZmZXJfcHJlcGFyZSwKLQkuc3RhcnRfc3RyZWFtaW5nCT0gc3VuNmlfdmlkZW9fc3Rh cnRfc3RyZWFtaW5nLAotCS5zdG9wX3N0cmVhbWluZwkJPSBzdW42aV92aWRlb19zdG9wX3N0cmVh bWluZywKLQkuYnVmX3F1ZXVlCQk9IHN1bjZpX3ZpZGVvX2J1ZmZlcl9xdWV1ZSwKLX07Ci0KLXN0 YXRpYyBpbnQgdmlkaW9jX3F1ZXJ5Y2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAot CQkJICAgc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAqY2FwKQotewotCXN0cnVjdCBzdW42aV92aWRl byAqdmlkZW8gPSB2aWRlb19kcnZkYXRhKGZpbGUpOwotCi0Jc3Ryc2NweShjYXAtPmRyaXZlciwg InN1bjZpLXZpZGVvIiwgc2l6ZW9mKGNhcC0+ZHJpdmVyKSk7Ci0Jc3Ryc2NweShjYXAtPmNhcmQs IHZpZGVvLT52ZGV2Lm5hbWUsIHNpemVvZihjYXAtPmNhcmQpKTsKLQlzbnByaW50ZihjYXAtPmJ1 c19pbmZvLCBzaXplb2YoY2FwLT5idXNfaW5mbyksICJwbGF0Zm9ybTolcyIsCi0JCSB2aWRlby0+ Y3NpLT5kZXYtPm9mX25vZGUtPm5hbWUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQg dmlkaW9jX2VudW1fZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0J CQkJICAgc3RydWN0IHY0bDJfZm10ZGVzYyAqZikKLXsKLQl1MzIgaW5kZXggPSBmLT5pbmRleDsK LQotCWlmIChpbmRleCA+PSBBUlJBWV9TSVpFKHN1cHBvcnRlZF9waXhmb3JtYXRzKSkKLQkJcmV0 dXJuIC1FSU5WQUw7Ci0KLQlmLT5waXhlbGZvcm1hdCA9IHN1cHBvcnRlZF9waXhmb3JtYXRzW2lu ZGV4XTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19nX2ZtdF92aWRfY2Fw KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJCXN0cnVjdCB2NGwyX2Zvcm1hdCAq Zm10KQotewotCXN0cnVjdCBzdW42aV92aWRlbyAqdmlkZW8gPSB2aWRlb19kcnZkYXRhKGZpbGUp OwotCi0JKmZtdCA9IHZpZGVvLT5mbXQ7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBz dW42aV92aWRlb190cnlfZm10KHN0cnVjdCBzdW42aV92aWRlbyAqdmlkZW8sCi0JCQkgICAgICAg c3RydWN0IHY0bDJfZm9ybWF0ICpmKQotewotCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgKnBpeGZt dCA9ICZmLT5mbXQucGl4OwotCWludCBicHA7Ci0KLQlpZiAoIWlzX3BpeGZvcm1hdF92YWxpZChw aXhmbXQtPnBpeGVsZm9ybWF0KSkKLQkJcGl4Zm10LT5waXhlbGZvcm1hdCA9IHN1cHBvcnRlZF9w aXhmb3JtYXRzWzBdOwotCi0JdjRsX2JvdW5kX2FsaWduX2ltYWdlKCZwaXhmbXQtPndpZHRoLCBN SU5fV0lEVEgsIE1BWF9XSURUSCwgMSwKLQkJCSAgICAgICZwaXhmbXQtPmhlaWdodCwgTUlOX0hF SUdIVCwgTUFYX1dJRFRILCAxLCAxKTsKLQotCWJwcCA9IHN1bjZpX2NzaV9nZXRfYnBwKHBpeGZt dC0+cGl4ZWxmb3JtYXQpOwotCXBpeGZtdC0+Ynl0ZXNwZXJsaW5lID0gKHBpeGZtdC0+d2lkdGgg KiBicHApID4+IDM7Ci0JcGl4Zm10LT5zaXplaW1hZ2UgPSBwaXhmbXQtPmJ5dGVzcGVybGluZSAq IHBpeGZtdC0+aGVpZ2h0OwotCi0JaWYgKHBpeGZtdC0+ZmllbGQgPT0gVjRMMl9GSUVMRF9BTlkp Ci0JCXBpeGZtdC0+ZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7Ci0KLQlwaXhmbXQtPmNvbG9yc3Bh Y2UgPSBWNEwyX0NPTE9SU1BBQ0VfUkFXOwotCXBpeGZtdC0+eWNiY3JfZW5jID0gVjRMMl9ZQ0JD Ul9FTkNfREVGQVVMVDsKLQlwaXhmbXQtPnF1YW50aXphdGlvbiA9IFY0TDJfUVVBTlRJWkFUSU9O X0RFRkFVTFQ7Ci0JcGl4Zm10LT54ZmVyX2Z1bmMgPSBWNEwyX1hGRVJfRlVOQ19ERUZBVUxUOwot Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc3VuNmlfdmlkZW9fc2V0X2ZtdChzdHJ1Y3Qg c3VuNmlfdmlkZW8gKnZpZGVvLCBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCi17Ci0JaW50IHJldDsK LQotCXJldCA9IHN1bjZpX3ZpZGVvX3RyeV9mbXQodmlkZW8sIGYpOwotCWlmIChyZXQpCi0JCXJl dHVybiByZXQ7Ci0KLQl2aWRlby0+Zm10ID0gKmY7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGlj IGludCB2aWRpb2Nfc19mbXRfdmlkX2NhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwK LQkJCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCi17Ci0Jc3RydWN0IHN1bjZpX3ZpZGVvICp2aWRl byA9IHZpZGVvX2RydmRhdGEoZmlsZSk7Ci0KLQlpZiAodmIyX2lzX2J1c3koJnZpZGVvLT52YjJf dmlkcSkpCi0JCXJldHVybiAtRUJVU1k7Ci0KLQlyZXR1cm4gc3VuNmlfdmlkZW9fc2V0X2ZtdCh2 aWRlbywgZik7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX3RyeV9mbXRfdmlkX2NhcChzdHJ1Y3Qg ZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCQkgIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKLXsK LQlzdHJ1Y3Qgc3VuNmlfdmlkZW8gKnZpZGVvID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKLQotCXJl dHVybiBzdW42aV92aWRlb190cnlfZm10KHZpZGVvLCBmKTsKLX0KLQotc3RhdGljIGludCB2aWRp b2NfZW51bV9pbnB1dChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCi0JCQkgICAgIHN0cnVj dCB2NGwyX2lucHV0ICppbnApCi17Ci0JaWYgKGlucC0+aW5kZXggIT0gMCkKLQkJcmV0dXJuIC1F SU5WQUw7Ci0KLQlzdHJzY3B5KGlucC0+bmFtZSwgImNhbWVyYSIsIHNpemVvZihpbnAtPm5hbWUp KTsKLQlpbnAtPnR5cGUgPSBWNEwyX0lOUFVUX1RZUEVfQ0FNRVJBOwotCi0JcmV0dXJuIDA7Ci19 Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX2dfaW5wdXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZo LCB1bnNpZ25lZCBpbnQgKmkpCi17Ci0JKmkgPSAwOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRp YyBpbnQgdmlkaW9jX3NfaW5wdXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCB1bnNpZ25l ZCBpbnQgaSkKLXsKLQlpZiAoaSAhPSAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJldHVybiAw OwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfaW9jdGxfb3BzIHN1bjZpX3ZpZGVvX2lv Y3RsX29wcyA9IHsKLQkudmlkaW9jX3F1ZXJ5Y2FwCQk9IHZpZGlvY19xdWVyeWNhcCwKLQkudmlk aW9jX2VudW1fZm10X3ZpZF9jYXAJPSB2aWRpb2NfZW51bV9mbXRfdmlkX2NhcCwKLQkudmlkaW9j X2dfZm10X3ZpZF9jYXAJCT0gdmlkaW9jX2dfZm10X3ZpZF9jYXAsCi0JLnZpZGlvY19zX2ZtdF92 aWRfY2FwCQk9IHZpZGlvY19zX2ZtdF92aWRfY2FwLAotCS52aWRpb2NfdHJ5X2ZtdF92aWRfY2Fw CQk9IHZpZGlvY190cnlfZm10X3ZpZF9jYXAsCi0KLQkudmlkaW9jX2VudW1faW5wdXQJCT0gdmlk aW9jX2VudW1faW5wdXQsCi0JLnZpZGlvY19zX2lucHV0CQkJPSB2aWRpb2Nfc19pbnB1dCwKLQku dmlkaW9jX2dfaW5wdXQJCQk9IHZpZGlvY19nX2lucHV0LAotCi0JLnZpZGlvY19yZXFidWZzCQkJ PSB2YjJfaW9jdGxfcmVxYnVmcywKLQkudmlkaW9jX3F1ZXJ5YnVmCQk9IHZiMl9pb2N0bF9xdWVy eWJ1ZiwKLQkudmlkaW9jX3FidWYJCQk9IHZiMl9pb2N0bF9xYnVmLAotCS52aWRpb2NfZXhwYnVm CQkJPSB2YjJfaW9jdGxfZXhwYnVmLAotCS52aWRpb2NfZHFidWYJCQk9IHZiMl9pb2N0bF9kcWJ1 ZiwKLQkudmlkaW9jX2NyZWF0ZV9idWZzCQk9IHZiMl9pb2N0bF9jcmVhdGVfYnVmcywKLQkudmlk aW9jX3ByZXBhcmVfYnVmCQk9IHZiMl9pb2N0bF9wcmVwYXJlX2J1ZiwKLQkudmlkaW9jX3N0cmVh bW9uCQk9IHZiMl9pb2N0bF9zdHJlYW1vbiwKLQkudmlkaW9jX3N0cmVhbW9mZgkJPSB2YjJfaW9j dGxfc3RyZWFtb2ZmLAotCi0JLnZpZGlvY19sb2dfc3RhdHVzCQk9IHY0bDJfY3RybF9sb2dfc3Rh dHVzLAotCS52aWRpb2Nfc3Vic2NyaWJlX2V2ZW50CQk9IHY0bDJfY3RybF9zdWJzY3JpYmVfZXZl bnQsCi0JLnZpZGlvY191bnN1YnNjcmliZV9ldmVudAk9IHY0bDJfZXZlbnRfdW5zdWJzY3JpYmUs Ci19OwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogVjRMMiBmaWxlIG9wZXJhdGlvbnMK LSAqLwotc3RhdGljIGludCBzdW42aV92aWRlb19vcGVuKHN0cnVjdCBmaWxlICpmaWxlKQotewot CXN0cnVjdCBzdW42aV92aWRlbyAqdmlkZW8gPSB2aWRlb19kcnZkYXRhKGZpbGUpOwotCWludCBy ZXQ7Ci0KLQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZ2aWRlby0+bG9jaykpCi0JCXJl dHVybiAtRVJFU1RBUlRTWVM7Ci0KLQlyZXQgPSB2NGwyX2ZoX29wZW4oZmlsZSk7Ci0JaWYgKHJl dCA8IDApCi0JCWdvdG8gdW5sb2NrOwotCi0JcmV0ID0gdjRsMl9waXBlbGluZV9wbV9nZXQoJnZp ZGVvLT52ZGV2LmVudGl0eSk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZmhfcmVsZWFzZTsKLQot CS8qIGNoZWNrIGlmIGFscmVhZHkgcG93ZXJlZCAqLwotCWlmICghdjRsMl9maF9pc19zaW5ndWxh cl9maWxlKGZpbGUpKSB7Ci0JCXJldCA9IC1FQlVTWTsKLQkJZ290byB1bmxvY2s7Ci0JfQotCi0J cmV0ID0gc3VuNmlfY3NpX3NldF9wb3dlcih2aWRlby0+Y3NpLCB0cnVlKTsKLQlpZiAocmV0IDwg MCkKLQkJZ290byBmaF9yZWxlYXNlOwotCi0JbXV0ZXhfdW5sb2NrKCZ2aWRlby0+bG9jayk7Ci0J cmV0dXJuIDA7Ci0KLWZoX3JlbGVhc2U6Ci0JdjRsMl9maF9yZWxlYXNlKGZpbGUpOwotdW5sb2Nr OgotCW11dGV4X3VubG9jaygmdmlkZW8tPmxvY2spOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRp YyBpbnQgc3VuNmlfdmlkZW9fY2xvc2Uoc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IHN1 bjZpX3ZpZGVvICp2aWRlbyA9IHZpZGVvX2RydmRhdGEoZmlsZSk7Ci0JYm9vbCBsYXN0X2ZoOwot Ci0JbXV0ZXhfbG9jaygmdmlkZW8tPmxvY2spOwotCi0JbGFzdF9maCA9IHY0bDJfZmhfaXNfc2lu Z3VsYXJfZmlsZShmaWxlKTsKLQotCV92YjJfZm9wX3JlbGVhc2UoZmlsZSwgTlVMTCk7Ci0KLQl2 NGwyX3BpcGVsaW5lX3BtX3B1dCgmdmlkZW8tPnZkZXYuZW50aXR5KTsKLQotCWlmIChsYXN0X2Zo KQotCQlzdW42aV9jc2lfc2V0X3Bvd2VyKHZpZGVvLT5jc2ksIGZhbHNlKTsKLQotCW11dGV4X3Vu bG9jaygmdmlkZW8tPmxvY2spOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1 Y3QgdjRsMl9maWxlX29wZXJhdGlvbnMgc3VuNmlfdmlkZW9fZm9wcyA9IHsKLQkub3duZXIJCT0g VEhJU19NT0RVTEUsCi0JLm9wZW4JCT0gc3VuNmlfdmlkZW9fb3BlbiwKLQkucmVsZWFzZQk9IHN1 bjZpX3ZpZGVvX2Nsb3NlLAotCS51bmxvY2tlZF9pb2N0bAk9IHZpZGVvX2lvY3RsMiwKLQkubW1h cAkJPSB2YjJfZm9wX21tYXAsCi0JLnBvbGwJCT0gdmIyX2ZvcF9wb2xsCi19OwotCi0vKiAtLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQotICogTWVkaWEgT3BlcmF0aW9ucwotICovCi1zdGF0aWMgaW50IHN1 bjZpX3ZpZGVvX2xpbmtfdmFsaWRhdGVfZ2V0X2Zvcm1hdChzdHJ1Y3QgbWVkaWFfcGFkICpwYWQs Ci0JCQkJCQlzdHJ1Y3QgdjRsMl9zdWJkZXZfZm9ybWF0ICpmbXQpCi17Ci0JaWYgKGlzX21lZGlh X2VudGl0eV92NGwyX3N1YmRldihwYWQtPmVudGl0eSkpIHsKLQkJc3RydWN0IHY0bDJfc3ViZGV2 ICpzZCA9Ci0JCQkJbWVkaWFfZW50aXR5X3RvX3Y0bDJfc3ViZGV2KHBhZC0+ZW50aXR5KTsKLQot CQlmbXQtPndoaWNoID0gVjRMMl9TVUJERVZfRk9STUFUX0FDVElWRTsKLQkJZm10LT5wYWQgPSBw YWQtPmluZGV4OwotCQlyZXR1cm4gdjRsMl9zdWJkZXZfY2FsbChzZCwgcGFkLCBnZXRfZm10LCBO VUxMLCBmbXQpOwotCX0KLQotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgaW50IHN1bjZp X3ZpZGVvX2xpbmtfdmFsaWRhdGUoc3RydWN0IG1lZGlhX2xpbmsgKmxpbmspCi17Ci0Jc3RydWN0 IHZpZGVvX2RldmljZSAqdmRldiA9IGNvbnRhaW5lcl9vZihsaW5rLT5zaW5rLT5lbnRpdHksCi0J CQkJCQkgc3RydWN0IHZpZGVvX2RldmljZSwgZW50aXR5KTsKLQlzdHJ1Y3Qgc3VuNmlfdmlkZW8g KnZpZGVvID0gdmlkZW9fZ2V0X2RydmRhdGEodmRldik7Ci0Jc3RydWN0IHY0bDJfc3ViZGV2X2Zv cm1hdCBzb3VyY2VfZm10OwotCWludCByZXQ7Ci0KLQl2aWRlby0+bWJ1c19jb2RlID0gMDsKLQot CWlmICghbWVkaWFfZW50aXR5X3JlbW90ZV9wYWQobGluay0+c2luay0+ZW50aXR5LT5wYWRzKSkg ewotCQlkZXZfaW5mbyh2aWRlby0+Y3NpLT5kZXYsCi0JCQkgInZpZGVvIG5vZGUgJXMgcGFkIG5v dCBjb25uZWN0ZWRcbiIsIHZkZXYtPm5hbWUpOwotCQlyZXR1cm4gLUVOT0xJTks7Ci0JfQotCi0J cmV0ID0gc3VuNmlfdmlkZW9fbGlua192YWxpZGF0ZV9nZXRfZm9ybWF0KGxpbmstPnNvdXJjZSwg JnNvdXJjZV9mbXQpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JaWYgKCFzdW42 aV9jc2lfaXNfZm9ybWF0X3N1cHBvcnRlZCh2aWRlby0+Y3NpLAotCQkJCQkgICB2aWRlby0+Zm10 LmZtdC5waXgucGl4ZWxmb3JtYXQsCi0JCQkJCSAgIHNvdXJjZV9mbXQuZm9ybWF0LmNvZGUpKSB7 Ci0JCWRldl9lcnIodmlkZW8tPmNzaS0+ZGV2LAotCQkJIlVuc3VwcG9ydGVkIHBpeGZvcm1hdDog MHgleCB3aXRoIG1idXMgY29kZTogMHgleCFcbiIsCi0JCQl2aWRlby0+Zm10LmZtdC5waXgucGl4 ZWxmb3JtYXQsCi0JCQlzb3VyY2VfZm10LmZvcm1hdC5jb2RlKTsKLQkJcmV0dXJuIC1FUElQRTsK LQl9Ci0KLQlpZiAoc291cmNlX2ZtdC5mb3JtYXQud2lkdGggIT0gdmlkZW8tPmZtdC5mbXQucGl4 LndpZHRoIHx8Ci0JICAgIHNvdXJjZV9mbXQuZm9ybWF0LmhlaWdodCAhPSB2aWRlby0+Zm10LmZt dC5waXguaGVpZ2h0KSB7Ci0JCWRldl9lcnIodmlkZW8tPmNzaS0+ZGV2LAotCQkJIldyb25nIHdp ZHRoIG9yIGhlaWdodCAldXgldSAoJXV4JXUgZXhwZWN0ZWQpXG4iLAotCQkJdmlkZW8tPmZtdC5m bXQucGl4LndpZHRoLCB2aWRlby0+Zm10LmZtdC5waXguaGVpZ2h0LAotCQkJc291cmNlX2ZtdC5m b3JtYXQud2lkdGgsIHNvdXJjZV9mbXQuZm9ybWF0LmhlaWdodCk7Ci0JCXJldHVybiAtRVBJUEU7 Ci0JfQotCi0JdmlkZW8tPm1idXNfY29kZSA9IHNvdXJjZV9mbXQuZm9ybWF0LmNvZGU7Ci0KLQly ZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBtZWRpYV9lbnRpdHlfb3BlcmF0aW9u cyBzdW42aV92aWRlb19tZWRpYV9vcHMgPSB7Ci0JLmxpbmtfdmFsaWRhdGUgPSBzdW42aV92aWRl b19saW5rX3ZhbGlkYXRlCi19OwotCi1pbnQgc3VuNmlfdmlkZW9faW5pdChzdHJ1Y3Qgc3VuNmlf dmlkZW8gKnZpZGVvLCBzdHJ1Y3Qgc3VuNmlfY3NpICpjc2ksCi0JCSAgICAgY29uc3QgY2hhciAq bmFtZSkKLXsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gJnZpZGVvLT52ZGV2OwotCXN0 cnVjdCB2YjJfcXVldWUgKnZpZHEgPSAmdmlkZW8tPnZiMl92aWRxOwotCXN0cnVjdCB2NGwyX2Zv cm1hdCBmbXQgPSB7IDAgfTsKLQlpbnQgcmV0OwotCi0JdmlkZW8tPmNzaSA9IGNzaTsKLQotCS8q IEluaXRpYWxpemUgdGhlIG1lZGlhIGVudGl0eS4uLiAqLwotCXZpZGVvLT5wYWQuZmxhZ3MgPSBN RURJQV9QQURfRkxfU0lOSyB8IE1FRElBX1BBRF9GTF9NVVNUX0NPTk5FQ1Q7Ci0JdmRldi0+ZW50 aXR5Lm9wcyA9ICZzdW42aV92aWRlb19tZWRpYV9vcHM7Ci0JcmV0ID0gbWVkaWFfZW50aXR5X3Bh ZHNfaW5pdCgmdmRldi0+ZW50aXR5LCAxLCAmdmlkZW8tPnBhZCk7Ci0JaWYgKHJldCA8IDApCi0J CXJldHVybiByZXQ7Ci0KLQltdXRleF9pbml0KCZ2aWRlby0+bG9jayk7Ci0KLQlJTklUX0xJU1Rf SEVBRCgmdmlkZW8tPmRtYV9xdWV1ZSk7Ci0Jc3Bpbl9sb2NrX2luaXQoJnZpZGVvLT5kbWFfcXVl dWVfbG9jayk7Ci0KLQl2aWRlby0+c2VxdWVuY2UgPSAwOwotCi0JLyogU2V0dXAgZGVmYXVsdCBm b3JtYXQgKi8KLQlmbXQudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKLQlmbXQu Zm10LnBpeC5waXhlbGZvcm1hdCA9IHN1cHBvcnRlZF9waXhmb3JtYXRzWzBdOwotCWZtdC5mbXQu cGl4LndpZHRoID0gMTI4MDsKLQlmbXQuZm10LnBpeC5oZWlnaHQgPSA3MjA7Ci0JZm10LmZtdC5w aXguZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7Ci0Jc3VuNmlfdmlkZW9fc2V0X2ZtdCh2aWRlbywg JmZtdCk7Ci0KLQkvKiBJbml0aWFsaXplIHZpZGVvYnVmMiBxdWV1ZSAqLwotCXZpZHEtPnR5cGUJ CQk9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKLQl2aWRxLT5pb19tb2RlcwkJCT0gVkIy X01NQVAgfCBWQjJfRE1BQlVGOwotCXZpZHEtPmRydl9wcml2CQkJPSB2aWRlbzsKLQl2aWRxLT5i dWZfc3RydWN0X3NpemUJCT0gc2l6ZW9mKHN0cnVjdCBzdW42aV9jc2lfYnVmZmVyKTsKLQl2aWRx LT5vcHMJCQk9ICZzdW42aV9jc2lfdmIyX29wczsKLQl2aWRxLT5tZW1fb3BzCQkJPSAmdmIyX2Rt YV9jb250aWdfbWVtb3BzOwotCXZpZHEtPnRpbWVzdGFtcF9mbGFncwkJPSBWNEwyX0JVRl9GTEFH X1RJTUVTVEFNUF9NT05PVE9OSUM7Ci0JdmlkcS0+bG9jawkJCT0gJnZpZGVvLT5sb2NrOwotCS8q IE1ha2Ugc3VyZSBub24tZHJvcHBlZCBmcmFtZSAqLwotCXZpZHEtPm1pbl9idWZmZXJzX25lZWRl ZAk9IDM7Ci0JdmlkcS0+ZGV2CQkJPSBjc2ktPmRldjsKLQotCXJldCA9IHZiMl9xdWV1ZV9pbml0 KHZpZHEpOwotCWlmIChyZXQpIHsKLQkJdjRsMl9lcnIoJmNzaS0+djRsMl9kZXYsICJ2YjJfcXVl dWVfaW5pdCBmYWlsZWQ6ICVkXG4iLCByZXQpOwotCQlnb3RvIGNsZWFuX2VudGl0eTsKLQl9Ci0K LQkvKiBSZWdpc3RlciB2aWRlbyBkZXZpY2UgKi8KLQlzdHJzY3B5KHZkZXYtPm5hbWUsIG5hbWUs IHNpemVvZih2ZGV2LT5uYW1lKSk7Ci0JdmRldi0+cmVsZWFzZQkJPSB2aWRlb19kZXZpY2VfcmVs ZWFzZV9lbXB0eTsKLQl2ZGV2LT5mb3BzCQk9ICZzdW42aV92aWRlb19mb3BzOwotCXZkZXYtPmlv Y3RsX29wcwkJPSAmc3VuNmlfdmlkZW9faW9jdGxfb3BzOwotCXZkZXYtPnZmbF90eXBlCQk9IFZG TF9UWVBFX1ZJREVPOwotCXZkZXYtPnZmbF9kaXIJCT0gVkZMX0RJUl9SWDsKLQl2ZGV2LT52NGwy X2RldgkJPSAmY3NpLT52NGwyX2RldjsKLQl2ZGV2LT5xdWV1ZQkJPSB2aWRxOwotCXZkZXYtPmxv Y2sJCT0gJnZpZGVvLT5sb2NrOwotCXZkZXYtPmRldmljZV9jYXBzCT0gVjRMMl9DQVBfU1RSRUFN SU5HIHwgVjRMMl9DQVBfVklERU9fQ0FQVFVSRTsKLQl2aWRlb19zZXRfZHJ2ZGF0YSh2ZGV2LCB2 aWRlbyk7Ci0KLQlyZXQgPSB2aWRlb19yZWdpc3Rlcl9kZXZpY2UodmRldiwgVkZMX1RZUEVfVklE RU8sIC0xKTsKLQlpZiAocmV0IDwgMCkgewotCQl2NGwyX2VycigmY3NpLT52NGwyX2RldiwKLQkJ CSAidmlkZW9fcmVnaXN0ZXJfZGV2aWNlIGZhaWxlZDogJWRcbiIsIHJldCk7Ci0JCWdvdG8gY2xl YW5fZW50aXR5OwotCX0KLQotCXJldHVybiAwOwotCi1jbGVhbl9lbnRpdHk6Ci0JbWVkaWFfZW50 aXR5X2NsZWFudXAoJnZpZGVvLT52ZGV2LmVudGl0eSk7Ci0JbXV0ZXhfZGVzdHJveSgmdmlkZW8t PmxvY2spOwotCXJldHVybiByZXQ7Ci19Ci0KLXZvaWQgc3VuNmlfdmlkZW9fY2xlYW51cChzdHJ1 Y3Qgc3VuNmlfdmlkZW8gKnZpZGVvKQotewotCXZiMl92aWRlb191bnJlZ2lzdGVyX2RldmljZSgm dmlkZW8tPnZkZXYpOwotCW1lZGlhX2VudGl0eV9jbGVhbnVwKCZ2aWRlby0+dmRldi5lbnRpdHkp OwotCW11dGV4X2Rlc3Ryb3koJnZpZGVvLT5sb2NrKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMv bWVkaWEvcGxhdGZvcm0vc3VueGkvc3VuNmktY3NpL3N1bjZpX3ZpZGVvLmggYi9kcml2ZXJzL21l ZGlhL3BsYXRmb3JtL3N1bnhpL3N1bjZpLWNzaS9zdW42aV92aWRlby5oCmRlbGV0ZWQgZmlsZSBt b2RlIDEwMDY0NAppbmRleCBiOWNkOTE5YzI0YWMuLjAwMDAwMDAwMDAwMAotLS0gYS9kcml2ZXJz L21lZGlhL3BsYXRmb3JtL3N1bnhpL3N1bjZpLWNzaS9zdW42aV92aWRlby5oCisrKyAvZGV2L251 bGwKQEAgLTEsMzggKzAsMCBAQAotLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAr ICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTggTWFnZXdlbGwgRWxlY3Ryb25pY3Mg Q28uLCBMdGQuIChOYW5qaW5nKQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIEF1dGhvcjog WW9uZyBEZW5nIDx5b25nLmRlbmdAbWFnZXdlbGwuY29tPgotICovCi0KLSNpZm5kZWYgX19TVU42 SV9WSURFT19IX18KLSNkZWZpbmUgX19TVU42SV9WSURFT19IX18KLQotI2luY2x1ZGUgPG1lZGlh L3Y0bDItZGV2Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvdmlkZW9idWYyLWNvcmUuaD4KLQotc3RydWN0 IHN1bjZpX2NzaTsKLQotc3RydWN0IHN1bjZpX3ZpZGVvIHsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNl CQl2ZGV2OwotCXN0cnVjdCBtZWRpYV9wYWQJCXBhZDsKLQlzdHJ1Y3Qgc3VuNmlfY3NpCQkqY3Np OwotCi0Jc3RydWN0IG11dGV4CQkJbG9jazsKLQotCXN0cnVjdCB2YjJfcXVldWUJCXZiMl92aWRx OwotCXNwaW5sb2NrX3QJCQlkbWFfcXVldWVfbG9jazsKLQlzdHJ1Y3QgbGlzdF9oZWFkCQlkbWFf cXVldWU7Ci0KLQl1bnNpZ25lZCBpbnQJCQlzZXF1ZW5jZTsKLQlzdHJ1Y3QgdjRsMl9mb3JtYXQJ CWZtdDsKLQl1MzIJCQkJbWJ1c19jb2RlOwotfTsKLQotaW50IHN1bjZpX3ZpZGVvX2luaXQoc3Ry dWN0IHN1bjZpX3ZpZGVvICp2aWRlbywgc3RydWN0IHN1bjZpX2NzaSAqY3NpLAotCQkgICAgIGNv bnN0IGNoYXIgKm5hbWUpOwotdm9pZCBzdW42aV92aWRlb19jbGVhbnVwKHN0cnVjdCBzdW42aV92 aWRlbyAqdmlkZW8pOwotCi12b2lkIHN1bjZpX3ZpZGVvX2ZyYW1lX2RvbmUoc3RydWN0IHN1bjZp X3ZpZGVvICp2aWRlbyk7Ci0KLSNlbmRpZiAvKiBfX1NVTjZJX1ZJREVPX0hfXyAqLwotLSAKMi4z Mi4wCgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGlu dXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRl YWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgt YXJtLWtlcm5lbAo=