From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 81550C6FA8E for ; Thu, 2 Mar 2023 17:53:15 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229817AbjCBRxO (ORCPT ); Thu, 2 Mar 2023 12:53:14 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54774 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229449AbjCBRxM (ORCPT ); Thu, 2 Mar 2023 12:53:12 -0500 Received: from ams.source.kernel.org (ams.source.kernel.org [IPv6:2604:1380:4601:e00::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2B8D212BDC; Thu, 2 Mar 2023 09:53:09 -0800 (PST) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id BBC10B81369; Thu, 2 Mar 2023 17:53:07 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 407B6C4339E; Thu, 2 Mar 2023 17:53:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1677779586; bh=HLPV3CPDsxx+rV0KAQqJpLI0zAaeIanzQcyF/w6UeLE=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=OBKZtzkj64TRNPW4y7tL/cJjgecCBQkCkdMrmdlqylf80I/tDLX62vaXLRq7MSAwc t/nSBau7KyVcjOGhevS6Epuppshk+N5CrADK2NWiPTZGlnL2DkIueikTNZtXTh3t/u YfWYVoMw8vmn1YuUupff5hJ/UlvUVVhDkX+slQwMD8487l2meaLdfitBmJubpuCiCQ 5+raGBNvDM0NXpwk4ZbWlVYHCbYOzu1+A+5ol9sVlhCYfP2ZyltbID5MW+ODvpT9OM 2roLHEuAFatW2qQXgkuEs2VdZd+RhFZsw8uwizkG42qsa5p58dKghFQcV4P9kLNFMh Gd6vQRDVMEkqw== Date: Thu, 2 Mar 2023 17:52:59 +0000 From: Lee Jones To: Sebastian Reichel Cc: Heiko Stuebner , Rob Herring , Krzysztof Kozlowski , Michael Turquette , Stephen Boyd , Linus Walleij , Mark Brown , Liam Girdwood , Alexandre Belloni , Alessandro Zummo , linux-rockchip@lists.infradead.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, kernel@collabora.com Subject: Re: [PATCHv6 08/11] mfd: rk8xx: add rk806 support Message-ID: <20230302175259.GB2303077@google.com> References: <20230127181244.160887-1-sebastian.reichel@collabora.com> <20230127181244.160887-9-sebastian.reichel@collabora.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20230127181244.160887-9-sebastian.reichel@collabora.com> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, 27 Jan 2023, Sebastian Reichel wrote: > Add support for SPI connected rk806, which is used by the RK3588 > evaluation boards. The PMIC is advertised to support I2C and SPI, > but the evaluation boards all use SPI. Thus only SPI support is > added here. > > Signed-off-by: Sebastian Reichel > --- > drivers/mfd/Kconfig | 14 ++ > drivers/mfd/Makefile | 1 + > drivers/mfd/rk8xx-core.c | 69 ++++++- > drivers/mfd/rk8xx-spi.c | 129 ++++++++++++ > include/linux/mfd/rk808.h | 409 ++++++++++++++++++++++++++++++++++++++ > 5 files changed, 619 insertions(+), 3 deletions(-) > create mode 100644 drivers/mfd/rk8xx-spi.c Few nits, nothing bad ... > diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig > index 692e38283bda..13582ea5cb44 100644 > --- a/drivers/mfd/Kconfig > +++ b/drivers/mfd/Kconfig > @@ -1222,6 +1222,20 @@ config MFD_RK8XX_I2C > through I2C interface. The device supports multiple sub-devices > including interrupts, RTC, LDO & DCDC regulators, and onkey. > > +config MFD_RK8XX_SPI > + tristate "Rockchip RK806 Power Management Chip" > + depends on SPI && OF > + select MFD_CORE > + select REGMAP_SPI > + select REGMAP_IRQ > + select MFD_RK8XX > + help > + If you say yes here you get support for the RK806 Power Management > + chip. > + This driver provides common support for accessing the device > + through an SPI interface. The device supports multiple sub-devices > + including interrupts, LDO & DCDC regulators, and power on-key. > + > config MFD_RN5T618 > tristate "Ricoh RN5T567/618 PMIC" > depends on I2C > diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile > index f65ef1bd0810..a88f27cd837b 100644 > --- a/drivers/mfd/Makefile > +++ b/drivers/mfd/Makefile > @@ -222,6 +222,7 @@ obj-$(CONFIG_MFD_NTXEC) += ntxec.o > obj-$(CONFIG_MFD_RC5T583) += rc5t583.o rc5t583-irq.o > obj-$(CONFIG_MFD_RK8XX) += rk8xx-core.o > obj-$(CONFIG_MFD_RK8XX_I2C) += rk8xx-i2c.o > +obj-$(CONFIG_MFD_RK8XX_SPI) += rk8xx-spi.o > obj-$(CONFIG_MFD_RN5T618) += rn5t618.o > obj-$(CONFIG_MFD_SEC_CORE) += sec-core.o sec-irq.o > obj-$(CONFIG_MFD_SYSCON) += syscon.o > diff --git a/drivers/mfd/rk8xx-core.c b/drivers/mfd/rk8xx-core.c > index 21c6484a951c..252030b9be4c 100644 > --- a/drivers/mfd/rk8xx-core.c > +++ b/drivers/mfd/rk8xx-core.c > @@ -37,6 +37,11 @@ static const struct resource rk805_key_resources[] = { > DEFINE_RES_IRQ(RK805_IRQ_PWRON_FALL), > }; > > +static struct resource rk806_pwrkey_resources[] = { > + DEFINE_RES_IRQ(RK806_IRQ_PWRON_FALL), > + DEFINE_RES_IRQ(RK806_IRQ_PWRON_RISE), > +}; > + > static const struct resource rk817_pwrkey_resources[] = { > DEFINE_RES_IRQ(RK817_IRQ_PWRON_RISE), > DEFINE_RES_IRQ(RK817_IRQ_PWRON_FALL), > @@ -64,6 +69,17 @@ static const struct mfd_cell rk805s[] = { > }, > }; > > +static const struct mfd_cell rk806s[] = { > + { .name = "rk805-pinctrl", .id = PLATFORM_DEVID_AUTO, }, > + { .name = "rk808-regulator", .id = PLATFORM_DEVID_AUTO, }, > + { > + .name = "rk805-pwrkey", > + .resources = rk806_pwrkey_resources, > + .num_resources = ARRAY_SIZE(rk806_pwrkey_resources), > + .id = PLATFORM_DEVID_AUTO, > + }, > +}; > + > static const struct mfd_cell rk808s[] = { > { .name = "rk808-clkout", .id = PLATFORM_DEVID_NONE, }, > { .name = "rk808-regulator", .id = PLATFORM_DEVID_NONE, }, > @@ -122,6 +138,12 @@ static const struct rk808_reg_data rk805_pre_init_reg[] = { > {RK805_THERMAL_REG, TEMP_HOTDIE_MSK, TEMP115C}, > }; > > +static const struct rk808_reg_data rk806_pre_init_reg[] = { > + { RK806_GPIO_INT_CONFIG, RK806_INT_POL_MSK, RK806_INT_POL_L }, > + { RK806_SYS_CFG3, RK806_SLAVE_RESTART_FUN_MSK, RK806_SLAVE_RESTART_FUN_EN }, > + { RK806_SYS_OPTION, RK806_SYS_ENB2_2M_MSK, RK806_SYS_ENB2_2M_EN }, > +}; > + > static const struct rk808_reg_data rk808_pre_init_reg[] = { > { RK808_BUCK3_CONFIG_REG, BUCK_ILMIN_MASK, BUCK_ILMIN_150MA }, > { RK808_BUCK4_CONFIG_REG, BUCK_ILMIN_MASK, BUCK_ILMIN_200MA }, > @@ -272,6 +294,27 @@ static const struct regmap_irq rk805_irqs[] = { > }, > }; > > +static const struct regmap_irq rk806_irqs[] = { > + /* INT_STS0 IRQs */ > + REGMAP_IRQ_REG(RK806_IRQ_PWRON_FALL, 0, RK806_INT_STS_PWRON_FALL), > + REGMAP_IRQ_REG(RK806_IRQ_PWRON_RISE, 0, RK806_INT_STS_PWRON_RISE), > + REGMAP_IRQ_REG(RK806_IRQ_PWRON, 0, RK806_INT_STS_PWRON), > + REGMAP_IRQ_REG(RK806_IRQ_PWRON_LP, 0, RK806_INT_STS_PWRON_LP), > + REGMAP_IRQ_REG(RK806_IRQ_HOTDIE, 0, RK806_INT_STS_HOTDIE), > + REGMAP_IRQ_REG(RK806_IRQ_VDC_RISE, 0, RK806_INT_STS_VDC_RISE), > + REGMAP_IRQ_REG(RK806_IRQ_VDC_FALL, 0, RK806_INT_STS_VDC_FALL), > + REGMAP_IRQ_REG(RK806_IRQ_VB_LO, 0, RK806_INT_STS_VB_LO), > + /* INT_STS1 IRQs */ > + REGMAP_IRQ_REG(RK806_IRQ_REV0, 1, RK806_INT_STS_REV0), > + REGMAP_IRQ_REG(RK806_IRQ_REV1, 1, RK806_INT_STS_REV1), > + REGMAP_IRQ_REG(RK806_IRQ_REV2, 1, RK806_INT_STS_REV2), > + REGMAP_IRQ_REG(RK806_IRQ_CRC_ERROR, 1, RK806_INT_STS_CRC_ERROR), > + REGMAP_IRQ_REG(RK806_IRQ_SLP3_GPIO, 1, RK806_INT_STS_SLP3_GPIO), > + REGMAP_IRQ_REG(RK806_IRQ_SLP2_GPIO, 1, RK806_INT_STS_SLP2_GPIO), > + REGMAP_IRQ_REG(RK806_IRQ_SLP1_GPIO, 1, RK806_INT_STS_SLP1_GPIO), > + REGMAP_IRQ_REG(RK806_IRQ_WDT, 1, RK806_INT_STS_WDT), > +}; > + > static const struct regmap_irq rk808_irqs[] = { > /* INT_STS */ > [RK808_IRQ_VOUT_LO] = { > @@ -422,6 +465,18 @@ static struct regmap_irq_chip rk805_irq_chip = { > .init_ack_masked = true, > }; > > +static struct regmap_irq_chip rk806_irq_chip = { > + .name = "rk806", > + .irqs = rk806_irqs, > + .num_irqs = ARRAY_SIZE(rk806_irqs), > + .num_regs = 2, > + .irq_reg_stride = 2, > + .mask_base = RK806_INT_MSK0, > + .status_base = RK806_INT_STS0, > + .ack_base = RK806_INT_STS0, > + .init_ack_masked = true, > +}; > + > static const struct regmap_irq_chip rk808_irq_chip = { > .name = "rk808", > .irqs = rk808_irqs, > @@ -548,6 +603,7 @@ int rk8xx_probe(struct device *dev, int variant, unsigned int irq, struct regmap > struct rk808 *rk808; > const struct rk808_reg_data *pre_init_reg; > const struct mfd_cell *cells; > + int dual_support = 0; > int nr_pre_init_regs; > int nr_cells; > int ret; > @@ -569,6 +625,14 @@ int rk8xx_probe(struct device *dev, int variant, unsigned int irq, struct regmap > cells = rk805s; > nr_cells = ARRAY_SIZE(rk805s); > break; > + case RK806_ID: > + rk808->regmap_irq_chip = &rk806_irq_chip; > + pre_init_reg = rk806_pre_init_reg; > + nr_pre_init_regs = ARRAY_SIZE(rk806_pre_init_reg); > + cells = rk806s; > + nr_cells = ARRAY_SIZE(rk806s); > + dual_support = IRQF_SHARED; > + break; > case RK808_ID: > rk808->regmap_irq_chip = &rk808_irq_chip; > pre_init_reg = rk808_pre_init_reg; > @@ -600,7 +664,7 @@ int rk8xx_probe(struct device *dev, int variant, unsigned int irq, struct regmap > return dev_err_probe(dev, -EINVAL, "No interrupt support, no core IRQ\n"); > > ret = devm_regmap_add_irq_chip(dev, rk808->regmap, irq, > - IRQF_ONESHOT, -1, > + IRQF_ONESHOT | dual_support, -1, > rk808->regmap_irq_chip, &rk808->irq_data); > if (ret) > return dev_err_probe(dev, ret, "Failed to add irq_chip\n"); > @@ -615,8 +679,7 @@ int rk8xx_probe(struct device *dev, int variant, unsigned int irq, struct regmap > pre_init_reg[i].addr); > } > > - ret = devm_mfd_add_devices(dev, PLATFORM_DEVID_NONE, > - cells, nr_cells, NULL, 0, > + ret = devm_mfd_add_devices(dev, 0, cells, nr_cells, NULL, 0, > regmap_irq_get_domain(rk808->irq_data)); > if (ret) > return dev_err_probe(dev, ret, "failed to add MFD devices\n"); > diff --git a/drivers/mfd/rk8xx-spi.c b/drivers/mfd/rk8xx-spi.c > new file mode 100644 > index 000000000000..3f6c5b1334f7 > --- /dev/null > +++ b/drivers/mfd/rk8xx-spi.c > @@ -0,0 +1,129 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* > + * Rockchip RK806 Core (SPI) driver > + * > + * Copyright (c) 2021 Rockchip Electronics Co., Ltd. > + * Copyright (c) 2023 Collabora Ltd. > + * > + * Author: Xu Shengfei > + * Author: Sebastian Reichel > + */ > + > +#include > +#include > +#include > +#include > +#include > +#include > + > +#define RK806_CMD 0 > +#define RK806_REG_ADDR_L 1 > +#define RK806_REG_ADDR_H 2 > +#define RK806_CMD_WITH_SIZE(CMD, VALUE_BYTES) \ > + (RK806_CMD_ ## CMD | (VALUE_BYTES-1)) Nit: Spaces around the '-' please. Spaces around the ## look odd to me too. > +static const struct regmap_range rk80g6_volatile_ranges[] = { > + regmap_reg_range(RK806_POWER_EN0, RK806_POWER_EN5), > + regmap_reg_range(RK806_DVS_START_CTRL, RK806_INT_MSK1), > +}; > + > +static const struct regmap_access_table rk806_volatile_table = { > + .yes_ranges = rk806_volatile_ranges, > + .n_yes_ranges = ARRAY_SIZE(rk806_volatile_ranges), > +}; > + > +static const struct regmap_config rk806_regmap_config_spi = { > + .reg_bits = 8, > + .val_bits = 8, > + .cache_type = REGCACHE_RBTREE, > + .volatile_table = &rk806_volatile_table, > +}; > + > +static int rk806_spi_bus_write(void *context, const void *vdata, size_t count) > +{ > + struct device *dev = context; > + struct spi_device *spi = to_spi_device(dev); > + const char *data = vdata; > + char buffer[3] = { 0 }; > + struct spi_transfer xfer[2] = { 0 }; > + /* count includes the register size */ > + size_t val_size = count - 1; > + > + if (val_size < 1 || val_size > 128) > + return -EINVAL; > + > + buffer[RK806_CMD] = RK806_CMD_WITH_SIZE(WRITE, val_size); > + buffer[RK806_REG_ADDR_L] = data[0]; > + buffer[RK806_REG_ADDR_H] = RK806_REG_H; > + > + xfer[0].tx_buf = buffer; > + xfer[0].len = sizeof(buffer); > + xfer[1].tx_buf = data + 1; Why, what's at [0]? Clearer with a define? > + xfer[1].len = count - 1; Isn't this val_size? > + return spi_sync_transfer(spi, xfer, ARRAY_SIZE(xfer)); > +} > + > +static int rk806_spi_bus_read(void *context, const void *vreg, size_t reg_size, > + void *val, size_t val_size) > +{ > + struct device *dev = context; > + struct spi_device *spi = to_spi_device(dev); > + const char *reg = vreg; > + char txbuf[3] = { 0 }; > + > + if (reg_size != sizeof(char) || val_size < 1 || val_size > 128) #define MAX_BUFFER_SIZE 128? > + return -EINVAL; > + > + txbuf[RK806_CMD] = RK806_CMD_WITH_SIZE(READ, val_size); > + txbuf[RK806_REG_ADDR_L] = *reg; > + txbuf[RK806_REG_ADDR_H] = RK806_REG_H; > + > + return spi_write_then_read(spi, txbuf, sizeof(txbuf), val, val_size); > +} > + > +static const struct regmap_bus rk806_regmap_bus_spi = { > + .write = rk806_spi_bus_write, > + .read = rk806_spi_bus_read, > + .reg_format_endian_default = REGMAP_ENDIAN_NATIVE, > + .val_format_endian_default = REGMAP_ENDIAN_NATIVE, > +}; > + > +static int rk8xx_spi_probe(struct spi_device *spi) > +{ > + struct regmap *regmap; > + > + regmap = devm_regmap_init(&spi->dev, &rk806_regmap_bus_spi, > + &spi->dev, &rk806_regmap_config_spi); > + if (IS_ERR(regmap)) > + return dev_err_probe(&spi->dev, PTR_ERR(regmap), > + "Failed to initialize register map\n"); It's more widely known as regmap. > + return rk8xx_probe(&spi->dev, RK806_ID, spi->irq, regmap); > +} > + > +static const struct of_device_id rk8xx_spi_of_match[] = { > + { .compatible = "rockchip,rk806", }, > + { } > +}; > +MODULE_DEVICE_TABLE(of, rk8xx_spi_of_match); > + > +static const struct spi_device_id rk8xx_spi_id_table[] = { > + { "rk806", 0 }, > + { } > +}; > +MODULE_DEVICE_TABLE(spi, rk8xx_spi_id_table); > + > +static struct spi_driver rk8xx_spi_driver = { > + .driver = { > + .name = "rk8xx-spi", > + .of_match_table = rk8xx_spi_of_match, > + }, > + .probe = rk8xx_spi_probe, > + .id_table = rk8xx_spi_id_table, > +}; > +module_spi_driver(rk8xx_spi_driver); > + > +MODULE_AUTHOR("Xu Shengfei "); > +MODULE_DESCRIPTION("RK8xx SPI PMIC driver"); > +MODULE_LICENSE("GPL v2"); > diff --git a/include/linux/mfd/rk808.h b/include/linux/mfd/rk808.h > index 4183427a80fe..78e167a92483 100644 > --- a/include/linux/mfd/rk808.h > +++ b/include/linux/mfd/rk808.h > @@ -289,6 +289,414 @@ enum rk805_reg { > #define RK805_INT_ALARM_EN (1 << 3) > #define RK805_INT_TIMER_EN (1 << 2) > > +/* RK806 */ > +#define RK806_POWER_EN0 0x0 > +#define RK806_POWER_EN1 0x1 > +#define RK806_POWER_EN2 0x2 > +#define RK806_POWER_EN3 0x3 > +#define RK806_POWER_EN4 0x4 > +#define RK806_POWER_EN5 0x5 > +#define RK806_POWER_SLP_EN0 0x6 > +#define RK806_POWER_SLP_EN1 0x7 > +#define RK806_POWER_SLP_EN2 0x8 > +#define RK806_POWER_DISCHRG_EN0 0x9 > +#define RK806_POWER_DISCHRG_EN1 0xA > +#define RK806_POWER_DISCHRG_EN2 0xB > +#define RK806_BUCK_FB_CONFIG 0xC > +#define RK806_SLP_LP_CONFIG 0xD > +#define RK806_POWER_FPWM_EN0 0xE > +#define RK806_POWER_FPWM_EN1 0xF > +#define RK806_BUCK1_CONFIG 0x10 > +#define RK806_BUCK2_CONFIG 0x11 > +#define RK806_BUCK3_CONFIG 0x12 > +#define RK806_BUCK4_CONFIG 0x13 > +#define RK806_BUCK5_CONFIG 0x14 > +#define RK806_BUCK6_CONFIG 0x15 > +#define RK806_BUCK7_CONFIG 0x16 > +#define RK806_BUCK8_CONFIG 0x17 > +#define RK806_BUCK9_CONFIG 0x18 > +#define RK806_BUCK10_CONFIG 0x19 > +#define RK806_BUCK1_ON_VSEL 0x1A > +#define RK806_BUCK2_ON_VSEL 0x1B > +#define RK806_BUCK3_ON_VSEL 0x1C > +#define RK806_BUCK4_ON_VSEL 0x1D > +#define RK806_BUCK5_ON_VSEL 0x1E > +#define RK806_BUCK6_ON_VSEL 0x1F > +#define RK806_BUCK7_ON_VSEL 0x20 > +#define RK806_BUCK8_ON_VSEL 0x21 > +#define RK806_BUCK9_ON_VSEL 0x22 > +#define RK806_BUCK10_ON_VSEL 0x23 > +#define RK806_BUCK1_SLP_VSEL 0x24 > +#define RK806_BUCK2_SLP_VSEL 0x25 > +#define RK806_BUCK3_SLP_VSEL 0x26 > +#define RK806_BUCK4_SLP_VSEL 0x27 > +#define RK806_BUCK5_SLP_VSEL 0x28 > +#define RK806_BUCK6_SLP_VSEL 0x29 > +#define RK806_BUCK7_SLP_VSEL 0x2A > +#define RK806_BUCK8_SLP_VSEL 0x2B > +#define RK806_BUCK9_SLP_VSEL 0x2D > +#define RK806_BUCK10_SLP_VSEL 0x2E > +#define RK806_BUCK_DEBUG1 0x30 > +#define RK806_BUCK_DEBUG2 0x31 > +#define RK806_BUCK_DEBUG3 0x32 > +#define RK806_BUCK_DEBUG4 0x33 > +#define RK806_BUCK_DEBUG5 0x34 > +#define RK806_BUCK_DEBUG6 0x35 > +#define RK806_BUCK_DEBUG7 0x36 > +#define RK806_BUCK_DEBUG8 0x37 > +#define RK806_BUCK_DEBUG9 0x38 > +#define RK806_BUCK_DEBUG10 0x39 > +#define RK806_BUCK_DEBUG11 0x3A > +#define RK806_BUCK_DEBUG12 0x3B > +#define RK806_BUCK_DEBUG13 0x3C > +#define RK806_BUCK_DEBUG14 0x3D > +#define RK806_BUCK_DEBUG15 0x3E > +#define RK806_BUCK_DEBUG16 0x3F > +#define RK806_BUCK_DEBUG17 0x40 > +#define RK806_BUCK_DEBUG18 0x41 > +#define RK806_NLDO_IMAX 0x42 > +#define RK806_NLDO1_ON_VSEL 0x43 > +#define RK806_NLDO2_ON_VSEL 0x44 > +#define RK806_NLDO3_ON_VSEL 0x45 > +#define RK806_NLDO4_ON_VSEL 0x46 > +#define RK806_NLDO5_ON_VSEL 0x47 > +#define RK806_NLDO1_SLP_VSEL 0x48 > +#define RK806_NLDO2_SLP_VSEL 0x49 > +#define RK806_NLDO3_SLP_VSEL 0x4A > +#define RK806_NLDO4_SLP_VSEL 0x4B > +#define RK806_NLDO5_SLP_VSEL 0x4C > +#define RK806_PLDO_IMAX 0x4D > +#define RK806_PLDO1_ON_VSEL 0x4E > +#define RK806_PLDO2_ON_VSEL 0x4F > +#define RK806_PLDO3_ON_VSEL 0x50 > +#define RK806_PLDO4_ON_VSEL 0x51 > +#define RK806_PLDO5_ON_VSEL 0x52 > +#define RK806_PLDO6_ON_VSEL 0x53 > +#define RK806_PLDO1_SLP_VSEL 0x54 > +#define RK806_PLDO2_SLP_VSEL 0x55 > +#define RK806_PLDO3_SLP_VSEL 0x56 > +#define RK806_PLDO4_SLP_VSEL 0x57 > +#define RK806_PLDO5_SLP_VSEL 0x58 > +#define RK806_PLDO6_SLP_VSEL 0x59 > +#define RK806_CHIP_NAME 0x5A > +#define RK806_CHIP_VER 0x5B > +#define RK806_OTP_VER 0x5C > +#define RK806_SYS_STS 0x5D > +#define RK806_SYS_CFG0 0x5E > +#define RK806_SYS_CFG1 0x5F > +#define RK806_SYS_OPTION 0x61 > +#define RK806_SLEEP_CONFIG0 0x62 > +#define RK806_SLEEP_CONFIG1 0x63 > +#define RK806_SLEEP_CTR_SEL0 0x64 > +#define RK806_SLEEP_CTR_SEL1 0x65 > +#define RK806_SLEEP_CTR_SEL2 0x66 > +#define RK806_SLEEP_CTR_SEL3 0x67 > +#define RK806_SLEEP_CTR_SEL4 0x68 > +#define RK806_SLEEP_CTR_SEL5 0x69 > +#define RK806_DVS_CTRL_SEL0 0x6A > +#define RK806_DVS_CTRL_SEL1 0x6B > +#define RK806_DVS_CTRL_SEL2 0x6C > +#define RK806_DVS_CTRL_SEL3 0x6D > +#define RK806_DVS_CTRL_SEL4 0x6E > +#define RK806_DVS_CTRL_SEL5 0x6F > +#define RK806_DVS_START_CTRL 0x70 > +#define RK806_SLEEP_GPIO 0x71 > +#define RK806_SYS_CFG3 0x72 > +#define RK806_ON_SOURCE 0x74 > +#define RK806_OFF_SOURCE 0x75 > +#define RK806_PWRON_KEY 0x76 > +#define RK806_INT_STS0 0x77 > +#define RK806_INT_MSK0 0x78 > +#define RK806_INT_STS1 0x79 > +#define RK806_INT_MSK1 0x7A > +#define RK806_GPIO_INT_CONFIG 0x7B > +#define RK806_DATA_REG0 0x7C > +#define RK806_DATA_REG1 0x7D > +#define RK806_DATA_REG2 0x7E > +#define RK806_DATA_REG3 0x7F > +#define RK806_DATA_REG4 0x80 > +#define RK806_DATA_REG5 0x81 > +#define RK806_DATA_REG6 0x82 > +#define RK806_DATA_REG7 0x83 > +#define RK806_DATA_REG8 0x84 > +#define RK806_DATA_REG9 0x85 > +#define RK806_DATA_REG10 0x86 > +#define RK806_DATA_REG11 0x87 > +#define RK806_DATA_REG12 0x88 > +#define RK806_DATA_REG13 0x89 > +#define RK806_DATA_REG14 0x8A > +#define RK806_DATA_REG15 0x8B > +#define RK806_TM_REG 0x8C > +#define RK806_OTP_EN_REG 0x8D > +#define RK806_FUNC_OTP_EN_REG 0x8E > +#define RK806_TEST_REG1 0x8F > +#define RK806_TEST_REG2 0x90 > +#define RK806_TEST_REG3 0x91 > +#define RK806_TEST_REG4 0x92 > +#define RK806_TEST_REG5 0x93 > +#define RK806_BUCK_VSEL_OTP_REG0 0x94 > +#define RK806_BUCK_VSEL_OTP_REG1 0x95 > +#define RK806_BUCK_VSEL_OTP_REG2 0x96 > +#define RK806_BUCK_VSEL_OTP_REG3 0x97 > +#define RK806_BUCK_VSEL_OTP_REG4 0x98 > +#define RK806_BUCK_VSEL_OTP_REG5 0x99 > +#define RK806_BUCK_VSEL_OTP_REG6 0x9A > +#define RK806_BUCK_VSEL_OTP_REG7 0x9B > +#define RK806_BUCK_VSEL_OTP_REG8 0x9C > +#define RK806_BUCK_VSEL_OTP_REG9 0x9D > +#define RK806_NLDO1_VSEL_OTP_REG0 0x9E > +#define RK806_NLDO1_VSEL_OTP_REG1 0x9F > +#define RK806_NLDO1_VSEL_OTP_REG2 0xA0 > +#define RK806_NLDO1_VSEL_OTP_REG3 0xA1 > +#define RK806_NLDO1_VSEL_OTP_REG4 0xA2 > +#define RK806_PLDO_VSEL_OTP_REG0 0xA3 > +#define RK806_PLDO_VSEL_OTP_REG1 0xA4 > +#define RK806_PLDO_VSEL_OTP_REG2 0xA5 > +#define RK806_PLDO_VSEL_OTP_REG3 0xA6 > +#define RK806_PLDO_VSEL_OTP_REG4 0xA7 > +#define RK806_PLDO_VSEL_OTP_REG5 0xA8 > +#define RK806_BUCK_EN_OTP_REG1 0xA9 > +#define RK806_NLDO_EN_OTP_REG1 0xAA > +#define RK806_PLDO_EN_OTP_REG1 0xAB > +#define RK806_BUCK_FB_RES_OTP_REG1 0xAC > +#define RK806_OTP_RESEV_REG0 0xAD > +#define RK806_OTP_RESEV_REG1 0xAE > +#define RK806_OTP_RESEV_REG2 0xAF > +#define RK806_OTP_RESEV_REG3 0xB0 > +#define RK806_OTP_RESEV_REG4 0xB1 > +#define RK806_BUCK_SEQ_REG0 0xB2 > +#define RK806_BUCK_SEQ_REG1 0xB3 > +#define RK806_BUCK_SEQ_REG2 0xB4 > +#define RK806_BUCK_SEQ_REG3 0xB5 > +#define RK806_BUCK_SEQ_REG4 0xB6 > +#define RK806_BUCK_SEQ_REG5 0xB7 > +#define RK806_BUCK_SEQ_REG6 0xB8 > +#define RK806_BUCK_SEQ_REG7 0xB9 > +#define RK806_BUCK_SEQ_REG8 0xBA > +#define RK806_BUCK_SEQ_REG9 0xBB > +#define RK806_BUCK_SEQ_REG10 0xBC > +#define RK806_BUCK_SEQ_REG11 0xBD > +#define RK806_BUCK_SEQ_REG12 0xBE > +#define RK806_BUCK_SEQ_REG13 0xBF > +#define RK806_BUCK_SEQ_REG14 0xC0 > +#define RK806_BUCK_SEQ_REG15 0xC1 > +#define RK806_BUCK_SEQ_REG16 0xC2 > +#define RK806_BUCK_SEQ_REG17 0xC3 > +#define RK806_HK_TRIM_REG1 0xC4 > +#define RK806_HK_TRIM_REG2 0xC5 > +#define RK806_BUCK_REF_TRIM_REG1 0xC6 > +#define RK806_BUCK_REF_TRIM_REG2 0xC7 > +#define RK806_BUCK_REF_TRIM_REG3 0xC8 > +#define RK806_BUCK_REF_TRIM_REG4 0xC9 > +#define RK806_BUCK_REF_TRIM_REG5 0xCA > +#define RK806_BUCK_OSC_TRIM_REG1 0xCB > +#define RK806_BUCK_OSC_TRIM_REG2 0xCC > +#define RK806_BUCK_OSC_TRIM_REG3 0xCD > +#define RK806_BUCK_OSC_TRIM_REG4 0xCE > +#define RK806_BUCK_OSC_TRIM_REG5 0xCF > +#define RK806_BUCK_TRIM_ZCDIOS_REG1 0xD0 > +#define RK806_BUCK_TRIM_ZCDIOS_REG2 0xD1 > +#define RK806_NLDO_TRIM_REG1 0xD2 > +#define RK806_NLDO_TRIM_REG2 0xD3 > +#define RK806_NLDO_TRIM_REG3 0xD4 > +#define RK806_PLDO_TRIM_REG1 0xD5 > +#define RK806_PLDO_TRIM_REG2 0xD6 > +#define RK806_PLDO_TRIM_REG3 0xD7 > +#define RK806_TRIM_ICOMP_REG1 0xD8 > +#define RK806_TRIM_ICOMP_REG2 0xD9 > +#define RK806_EFUSE_CONTROL_REGH 0xDA > +#define RK806_FUSE_PROG_REG 0xDB > +#define RK806_MAIN_FSM_STS_REG 0xDD > +#define RK806_FSM_REG 0xDE > +#define RK806_TOP_RESEV_OFFR 0xEC > +#define RK806_TOP_RESEV_POR 0xED > +#define RK806_BUCK_VRSN_REG1 0xEE > +#define RK806_BUCK_VRSN_REG2 0xEF > +#define RK806_NLDO_RLOAD_SEL_REG1 0xF0 > +#define RK806_PLDO_RLOAD_SEL_REG1 0xF1 > +#define RK806_PLDO_RLOAD_SEL_REG2 0xF2 > +#define RK806_BUCK_CMIN_MX_REG1 0xF3 > +#define RK806_BUCK_CMIN_MX_REG2 0xF4 > +#define RK806_BUCK_FREQ_SET_REG1 0xF5 > +#define RK806_BUCK_FREQ_SET_REG2 0xF6 > +#define RK806_BUCK_RS_MEABS_REG1 0xF7 > +#define RK806_BUCK_RS_MEABS_REG2 0xF8 > +#define RK806_BUCK_RS_ZDLEB_REG1 0xF9 > +#define RK806_BUCK_RS_ZDLEB_REG2 0xFA > +#define RK806_BUCK_RSERVE_REG1 0xFB > +#define RK806_BUCK_RSERVE_REG2 0xFC > +#define RK806_BUCK_RSERVE_REG3 0xFD > +#define RK806_BUCK_RSERVE_REG4 0xFE > +#define RK806_BUCK_RSERVE_REG5 0xFF > + > +/* INT_STS Register field definitions */ > +#define RK806_INT_STS_PWRON_FALL BIT(0) > +#define RK806_INT_STS_PWRON_RISE BIT(1) > +#define RK806_INT_STS_PWRON BIT(2) > +#define RK806_INT_STS_PWRON_LP BIT(3) > +#define RK806_INT_STS_HOTDIE BIT(4) > +#define RK806_INT_STS_VDC_RISE BIT(5) > +#define RK806_INT_STS_VDC_FALL BIT(6) > +#define RK806_INT_STS_VB_LO BIT(7) > +#define RK806_INT_STS_REV0 BIT(0) > +#define RK806_INT_STS_REV1 BIT(1) > +#define RK806_INT_STS_REV2 BIT(2) > +#define RK806_INT_STS_CRC_ERROR BIT(3) > +#define RK806_INT_STS_SLP3_GPIO BIT(4) > +#define RK806_INT_STS_SLP2_GPIO BIT(5) > +#define RK806_INT_STS_SLP1_GPIO BIT(6) > +#define RK806_INT_STS_WDT BIT(7) > + > +/* SPI command */ > +#define RK806_CMD_READ 0 > +#define RK806_CMD_WRITE BIT(7) > +#define RK806_CMD_CRC_EN BIT(6) > +#define RK806_CMD_CRC_DIS 0 > +#define RK806_CMD_LEN_MSK 0x0f > +#define RK806_REG_H 0x00 > + > +#define VERSION_AB 0x01 > + > +enum rk806_reg_id { > + RK806_ID_DCDC1 = 0, > + RK806_ID_DCDC2, > + RK806_ID_DCDC3, > + RK806_ID_DCDC4, > + RK806_ID_DCDC5, > + RK806_ID_DCDC6, > + RK806_ID_DCDC7, > + RK806_ID_DCDC8, > + RK806_ID_DCDC9, > + RK806_ID_DCDC10, > + > + RK806_ID_NLDO1, > + RK806_ID_NLDO2, > + RK806_ID_NLDO3, > + RK806_ID_NLDO4, > + RK806_ID_NLDO5, > + > + RK806_ID_PLDO1, > + RK806_ID_PLDO2, > + RK806_ID_PLDO3, > + RK806_ID_PLDO4, > + RK806_ID_PLDO5, > + RK806_ID_PLDO6, > + RK806_ID_END, > +}; > + > +/* Define the RK806 IRQ numbers */ > +enum rk806_irqs { > + /* INT_STS0 registers */ > + RK806_IRQ_PWRON_FALL, > + RK806_IRQ_PWRON_RISE, > + RK806_IRQ_PWRON, > + RK806_IRQ_PWRON_LP, > + RK806_IRQ_HOTDIE, > + RK806_IRQ_VDC_RISE, > + RK806_IRQ_VDC_FALL, > + RK806_IRQ_VB_LO, > + > + /* INT_STS0 registers */ > + RK806_IRQ_REV0, > + RK806_IRQ_REV1, > + RK806_IRQ_REV2, > + RK806_IRQ_CRC_ERROR, > + RK806_IRQ_SLP3_GPIO, > + RK806_IRQ_SLP2_GPIO, > + RK806_IRQ_SLP1_GPIO, > + RK806_IRQ_WDT, > +}; > + > +/* VCC1 Low Voltage Threshold */ > +enum rk806_lv_sel { > + VB_LO_SEL_2800, > + VB_LO_SEL_2900, > + VB_LO_SEL_3000, > + VB_LO_SEL_3100, > + VB_LO_SEL_3200, > + VB_LO_SEL_3300, > + VB_LO_SEL_3400, > + VB_LO_SEL_3500, > +}; > + > +/* System Shutdown Voltage Select */ > +enum rk806_uv_sel { > + VB_UV_SEL_2700, > + VB_UV_SEL_2800, > + VB_UV_SEL_2900, > + VB_UV_SEL_3000, > + VB_UV_SEL_3100, > + VB_UV_SEL_3200, > + VB_UV_SEL_3300, > + VB_UV_SEL_3400, > +}; > + > +/* Pin Function */ > +enum rk806_pwrctrl_fun { > + PWRCTRL_NULL_FUN, > + PWRCTRL_SLP_FUN, > + PWRCTRL_POWOFF_FUN, > + PWRCTRL_RST_FUN, > + PWRCTRL_DVS_FUN, > + PWRCTRL_GPIO_FUN, > +}; > + > +/* Pin Polarity */ > +enum rk806_pin_level { > + POL_LOW, > + POL_HIGH, > +}; > + > +enum rk806_vsel_ctr_sel { > + CTR_BY_NO_EFFECT, > + CTR_BY_PWRCTRL1, > + CTR_BY_PWRCTRL2, > + CTR_BY_PWRCTRL3, > +}; > + > +enum rk806_dvs_ctr_sel { > + CTR_SEL_NO_EFFECT, > + CTR_SEL_DVS_START1, > + CTR_SEL_DVS_START2, > + CTR_SEL_DVS_START3, > +}; > + > +enum rk806_pin_dr_sel { > + RK806_PIN_INPUT, > + RK806_PIN_OUTPUT, > +}; > + > +#define RK806_INT_POL_MSK BIT(1) > +#define RK806_INT_POL_H BIT(1) > +#define RK806_INT_POL_L 0 > + > +#define RK806_SLAVE_RESTART_FUN_MSK BIT(1) > +#define RK806_SLAVE_RESTART_FUN_EN BIT(1) > +#define RK806_SLAVE_RESTART_FUN_OFF 0 > + > +#define RK806_SYS_ENB2_2M_MSK BIT(1) > +#define RK806_SYS_ENB2_2M_EN BIT(1) > +#define RK806_SYS_ENB2_2M_OFF 0 > + > +enum rk806_int_fun { > + RK806_INT_ONLY, > + RK806_INT_ADN_WKUP, > +}; > + > +enum rk806_dvs_mode { > + RK806_DVS_NOT_SUPPORT, > + RK806_DVS_START1, > + RK806_DVS_START2, > + RK806_DVS_START3, > + RK806_DVS_PWRCTRL1, > + RK806_DVS_PWRCTRL2, > + RK806_DVS_PWRCTRL3, > + RK806_DVS_START_PWRCTR1, > + RK806_DVS_START_PWRCTR2, > + RK806_DVS_START_PWRCTR3, > + RK806_DVS_END, > +}; > + > /* RK808 IRQ Definitions */ > #define RK808_IRQ_VOUT_LO 0 > #define RK808_IRQ_VB_LO 1 > @@ -780,6 +1188,7 @@ enum { > > enum { > RK805_ID = 0x8050, > + RK806_ID = 0x8060, > RK808_ID = 0x0000, > RK809_ID = 0x8090, > RK817_ID = 0x8170, > -- > 2.39.0 > -- Lee Jones [李琼斯] From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id BFAE9C678D4 for ; Thu, 2 Mar 2023 17:53:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=bjqgIomWGIRiE6VcgEeEPVZnWfVLVgvGqpGE4GQhksU=; b=vGe75/sWe13XyY tikJ+S++zfhbjkd6LA72SFVo+PsksMG+YwgYtQ8nnSmSFRQsPzIIrgUQxUGmHd0sYUSkPZ6050tC/ 2hQScfe+qNa1kKNYxFWueGh2ZpKV4Gk/64+UjR0Me1akSZAP3Z0OPoTnqlfIprBx1aQWHISL1eubD zkFKUaBeqQ5SaMXJD02ZiffsxEcX+6xvI8KAOxsBHCHMkHPVoTr6SpqqX92XvezuHYYm/JckXMcEp mSy5khZmgg+Z2XUd71x2b3I+OVmyDpQcBrfy0MAJNRw35CgJWXv9Lhqt4nKioZ9fDO1ArajD3e1ZX /UUUIpRHmeZaBFZW3DKg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1pXn7D-0030gz-CE; Thu, 02 Mar 2023 17:53:15 +0000 Received: from ams.source.kernel.org ([145.40.68.75]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1pXn77-0030gR-DX for linux-rockchip@lists.infradead.org; Thu, 02 Mar 2023 17:53:12 +0000 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id AEAE3B8133A; Thu, 2 Mar 2023 17:53:07 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 407B6C4339E; Thu, 2 Mar 2023 17:53:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1677779586; bh=HLPV3CPDsxx+rV0KAQqJpLI0zAaeIanzQcyF/w6UeLE=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=OBKZtzkj64TRNPW4y7tL/cJjgecCBQkCkdMrmdlqylf80I/tDLX62vaXLRq7MSAwc t/nSBau7KyVcjOGhevS6Epuppshk+N5CrADK2NWiPTZGlnL2DkIueikTNZtXTh3t/u YfWYVoMw8vmn1YuUupff5hJ/UlvUVVhDkX+slQwMD8487l2meaLdfitBmJubpuCiCQ 5+raGBNvDM0NXpwk4ZbWlVYHCbYOzu1+A+5ol9sVlhCYfP2ZyltbID5MW+ODvpT9OM 2roLHEuAFatW2qQXgkuEs2VdZd+RhFZsw8uwizkG42qsa5p58dKghFQcV4P9kLNFMh Gd6vQRDVMEkqw== Date: Thu, 2 Mar 2023 17:52:59 +0000 From: Lee Jones To: Sebastian Reichel Cc: Heiko Stuebner , Rob Herring , Krzysztof Kozlowski , Michael Turquette , Stephen Boyd , Linus Walleij , Mark Brown , Liam Girdwood , Alexandre Belloni , Alessandro Zummo , linux-rockchip@lists.infradead.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, kernel@collabora.com Subject: Re: [PATCHv6 08/11] mfd: rk8xx: add rk806 support Message-ID: <20230302175259.GB2303077@google.com> References: <20230127181244.160887-1-sebastian.reichel@collabora.com> <20230127181244.160887-9-sebastian.reichel@collabora.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20230127181244.160887-9-sebastian.reichel@collabora.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230302_095309_807662_82CA3974 X-CRM114-Status: GOOD ( 37.08 ) X-BeenThere: linux-rockchip@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Upstream kernel work for Rockchip platforms List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "Linux-rockchip" Errors-To: linux-rockchip-bounces+linux-rockchip=archiver.kernel.org@lists.infradead.org T24gRnJpLCAyNyBKYW4gMjAyMywgU2ViYXN0aWFuIFJlaWNoZWwgd3JvdGU6Cgo+IEFkZCBzdXBw b3J0IGZvciBTUEkgY29ubmVjdGVkIHJrODA2LCB3aGljaCBpcyB1c2VkIGJ5IHRoZSBSSzM1ODgK PiBldmFsdWF0aW9uIGJvYXJkcy4gVGhlIFBNSUMgaXMgYWR2ZXJ0aXNlZCB0byBzdXBwb3J0IEky QyBhbmQgU1BJLAo+IGJ1dCB0aGUgZXZhbHVhdGlvbiBib2FyZHMgYWxsIHVzZSBTUEkuIFRodXMg b25seSBTUEkgc3VwcG9ydCBpcwo+IGFkZGVkIGhlcmUuCj4gCj4gU2lnbmVkLW9mZi1ieTogU2Vi YXN0aWFuIFJlaWNoZWwgPHNlYmFzdGlhbi5yZWljaGVsQGNvbGxhYm9yYS5jb20+Cj4gLS0tCj4g IGRyaXZlcnMvbWZkL0tjb25maWcgICAgICAgfCAgMTQgKysKPiAgZHJpdmVycy9tZmQvTWFrZWZp bGUgICAgICB8ICAgMSArCj4gIGRyaXZlcnMvbWZkL3JrOHh4LWNvcmUuYyAgfCAgNjkgKysrKysr LQo+ICBkcml2ZXJzL21mZC9yazh4eC1zcGkuYyAgIHwgMTI5ICsrKysrKysrKysrKwo+ICBpbmNs dWRlL2xpbnV4L21mZC9yazgwOC5oIHwgNDA5ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrCj4gIDUgZmlsZXMgY2hhbmdlZCwgNjE5IGluc2VydGlvbnMoKyksIDMgZGVsZXRp b25zKC0pCj4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL21mZC9yazh4eC1zcGkuYwoKRmV3 IG5pdHMsIG5vdGhpbmcgYmFkIC4uLgoKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvS2NvbmZp ZyBiL2RyaXZlcnMvbWZkL0tjb25maWcKPiBpbmRleCA2OTJlMzgyODNiZGEuLjEzNTgyZWE1Y2I0 NCAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL21mZC9LY29uZmlnCj4gKysrIGIvZHJpdmVycy9tZmQv S2NvbmZpZwo+IEBAIC0xMjIyLDYgKzEyMjIsMjAgQEAgY29uZmlnIE1GRF9SSzhYWF9JMkMKPiAg CSAgdGhyb3VnaCBJMkMgaW50ZXJmYWNlLiBUaGUgZGV2aWNlIHN1cHBvcnRzIG11bHRpcGxlIHN1 Yi1kZXZpY2VzCj4gIAkgIGluY2x1ZGluZyBpbnRlcnJ1cHRzLCBSVEMsIExETyAmIERDREMgcmVn dWxhdG9ycywgYW5kIG9ua2V5Lgo+ICAKPiArY29uZmlnIE1GRF9SSzhYWF9TUEkKPiArCXRyaXN0 YXRlICJSb2NrY2hpcCBSSzgwNiBQb3dlciBNYW5hZ2VtZW50IENoaXAiCj4gKwlkZXBlbmRzIG9u IFNQSSAmJiBPRgo+ICsJc2VsZWN0IE1GRF9DT1JFCj4gKwlzZWxlY3QgUkVHTUFQX1NQSQo+ICsJ c2VsZWN0IFJFR01BUF9JUlEKPiArCXNlbGVjdCBNRkRfUks4WFgKPiArCWhlbHAKPiArCSAgSWYg eW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBSSzgwNiBQb3dlciBNYW5h Z2VtZW50Cj4gKwkgIGNoaXAuCj4gKwkgIFRoaXMgZHJpdmVyIHByb3ZpZGVzIGNvbW1vbiBzdXBw b3J0IGZvciBhY2Nlc3NpbmcgdGhlIGRldmljZQo+ICsJICB0aHJvdWdoIGFuIFNQSSBpbnRlcmZh Y2UuIFRoZSBkZXZpY2Ugc3VwcG9ydHMgbXVsdGlwbGUgc3ViLWRldmljZXMKPiArCSAgaW5jbHVk aW5nIGludGVycnVwdHMsIExETyAmIERDREMgcmVndWxhdG9ycywgYW5kIHBvd2VyIG9uLWtleS4K PiArCj4gIGNvbmZpZyBNRkRfUk41VDYxOAo+ICAJdHJpc3RhdGUgIlJpY29oIFJONVQ1NjcvNjE4 IFBNSUMiCj4gIAlkZXBlbmRzIG9uIEkyQwo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9NYWtl ZmlsZSBiL2RyaXZlcnMvbWZkL01ha2VmaWxlCj4gaW5kZXggZjY1ZWYxYmQwODEwLi5hODhmMjdj ZDgzN2IgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9tZmQvTWFrZWZpbGUKPiArKysgYi9kcml2ZXJz L21mZC9NYWtlZmlsZQo+IEBAIC0yMjIsNiArMjIyLDcgQEAgb2JqLSQoQ09ORklHX01GRF9OVFhF QykJCSs9IG50eGVjLm8KPiAgb2JqLSQoQ09ORklHX01GRF9SQzVUNTgzKQkrPSByYzV0NTgzLm8g cmM1dDU4My1pcnEubwo+ICBvYmotJChDT05GSUdfTUZEX1JLOFhYKQkJKz0gcms4eHgtY29yZS5v Cj4gIG9iai0kKENPTkZJR19NRkRfUks4WFhfSTJDKQkrPSByazh4eC1pMmMubwo+ICtvYmotJChD T05GSUdfTUZEX1JLOFhYX1NQSSkJKz0gcms4eHgtc3BpLm8KPiAgb2JqLSQoQ09ORklHX01GRF9S TjVUNjE4KQkrPSBybjV0NjE4Lm8KPiAgb2JqLSQoQ09ORklHX01GRF9TRUNfQ09SRSkJKz0gc2Vj LWNvcmUubyBzZWMtaXJxLm8KPiAgb2JqLSQoQ09ORklHX01GRF9TWVNDT04pCSs9IHN5c2Nvbi5v Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3JrOHh4LWNvcmUuYyBiL2RyaXZlcnMvbWZkL3Jr OHh4LWNvcmUuYwo+IGluZGV4IDIxYzY0ODRhOTUxYy4uMjUyMDMwYjliZTRjIDEwMDY0NAo+IC0t LSBhL2RyaXZlcnMvbWZkL3JrOHh4LWNvcmUuYwo+ICsrKyBiL2RyaXZlcnMvbWZkL3JrOHh4LWNv cmUuYwo+IEBAIC0zNyw2ICszNywxMSBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IHJlc291cmNlIHJr ODA1X2tleV9yZXNvdXJjZXNbXSA9IHsKPiAgCURFRklORV9SRVNfSVJRKFJLODA1X0lSUV9QV1JP Tl9GQUxMKSwKPiAgfTsKPiAgCj4gK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugcms4MDZfcHdya2V5 X3Jlc291cmNlc1tdID0gewo+ICsJREVGSU5FX1JFU19JUlEoUks4MDZfSVJRX1BXUk9OX0ZBTEwp LAo+ICsJREVGSU5FX1JFU19JUlEoUks4MDZfSVJRX1BXUk9OX1JJU0UpLAo+ICt9Owo+ICsKPiAg c3RhdGljIGNvbnN0IHN0cnVjdCByZXNvdXJjZSByazgxN19wd3JrZXlfcmVzb3VyY2VzW10gPSB7 Cj4gIAlERUZJTkVfUkVTX0lSUShSSzgxN19JUlFfUFdST05fUklTRSksCj4gIAlERUZJTkVfUkVT X0lSUShSSzgxN19JUlFfUFdST05fRkFMTCksCj4gQEAgLTY0LDYgKzY5LDE3IEBAIHN0YXRpYyBj b25zdCBzdHJ1Y3QgbWZkX2NlbGwgcms4MDVzW10gPSB7Cj4gIAl9LAo+ICB9Owo+ICAKPiArc3Rh dGljIGNvbnN0IHN0cnVjdCBtZmRfY2VsbCByazgwNnNbXSA9IHsKPiArCXsgLm5hbWUgPSAicms4 MDUtcGluY3RybCIsIC5pZCA9IFBMQVRGT1JNX0RFVklEX0FVVE8sIH0sCj4gKwl7IC5uYW1lID0g InJrODA4LXJlZ3VsYXRvciIsIC5pZCA9IFBMQVRGT1JNX0RFVklEX0FVVE8sIH0sCj4gKwl7Cj4g KwkJLm5hbWUgPSAicms4MDUtcHdya2V5IiwKPiArCQkucmVzb3VyY2VzID0gcms4MDZfcHdya2V5 X3Jlc291cmNlcywKPiArCQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUocms4MDZfcHdya2V5 X3Jlc291cmNlcyksCj4gKwkJLmlkID0gUExBVEZPUk1fREVWSURfQVVUTywKPiArCX0sCj4gK307 Cj4gKwo+ICBzdGF0aWMgY29uc3Qgc3RydWN0IG1mZF9jZWxsIHJrODA4c1tdID0gewo+ICAJeyAu bmFtZSA9ICJyazgwOC1jbGtvdXQiLCAuaWQgPSBQTEFURk9STV9ERVZJRF9OT05FLCB9LAo+ICAJ eyAubmFtZSA9ICJyazgwOC1yZWd1bGF0b3IiLCAuaWQgPSBQTEFURk9STV9ERVZJRF9OT05FLCB9 LAo+IEBAIC0xMjIsNiArMTM4LDEyIEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgcms4MDhfcmVnX2Rh dGEgcms4MDVfcHJlX2luaXRfcmVnW10gPSB7Cj4gIAl7Uks4MDVfVEhFUk1BTF9SRUcsIFRFTVBf SE9URElFX01TSywgVEVNUDExNUN9LAo+ICB9Owo+ICAKPiArc3RhdGljIGNvbnN0IHN0cnVjdCBy azgwOF9yZWdfZGF0YSByazgwNl9wcmVfaW5pdF9yZWdbXSA9IHsKPiArCXsgUks4MDZfR1BJT19J TlRfQ09ORklHLCBSSzgwNl9JTlRfUE9MX01TSywgUks4MDZfSU5UX1BPTF9MIH0sCj4gKwl7IFJL ODA2X1NZU19DRkczLCBSSzgwNl9TTEFWRV9SRVNUQVJUX0ZVTl9NU0ssIFJLODA2X1NMQVZFX1JF U1RBUlRfRlVOX0VOIH0sCj4gKwl7IFJLODA2X1NZU19PUFRJT04sIFJLODA2X1NZU19FTkIyXzJN X01TSywgUks4MDZfU1lTX0VOQjJfMk1fRU4gfSwKPiArfTsKPiArCj4gIHN0YXRpYyBjb25zdCBz dHJ1Y3Qgcms4MDhfcmVnX2RhdGEgcms4MDhfcHJlX2luaXRfcmVnW10gPSB7Cj4gIAl7IFJLODA4 X0JVQ0szX0NPTkZJR19SRUcsIEJVQ0tfSUxNSU5fTUFTSywgIEJVQ0tfSUxNSU5fMTUwTUEgfSwK PiAgCXsgUks4MDhfQlVDSzRfQ09ORklHX1JFRywgQlVDS19JTE1JTl9NQVNLLCAgQlVDS19JTE1J Tl8yMDBNQSB9LAo+IEBAIC0yNzIsNiArMjk0LDI3IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVn bWFwX2lycSByazgwNV9pcnFzW10gPSB7Cj4gIAl9LAo+ICB9Owo+ICAKPiArc3RhdGljIGNvbnN0 IHN0cnVjdCByZWdtYXBfaXJxIHJrODA2X2lycXNbXSA9IHsKPiArCS8qIElOVF9TVFMwIElSUXMg Ki8KPiArCVJFR01BUF9JUlFfUkVHKFJLODA2X0lSUV9QV1JPTl9GQUxMLCAwLCBSSzgwNl9JTlRf U1RTX1BXUk9OX0ZBTEwpLAo+ICsJUkVHTUFQX0lSUV9SRUcoUks4MDZfSVJRX1BXUk9OX1JJU0Us IDAsIFJLODA2X0lOVF9TVFNfUFdST05fUklTRSksCj4gKwlSRUdNQVBfSVJRX1JFRyhSSzgwNl9J UlFfUFdST04sIDAsIFJLODA2X0lOVF9TVFNfUFdST04pLAo+ICsJUkVHTUFQX0lSUV9SRUcoUks4 MDZfSVJRX1BXUk9OX0xQLCAwLCBSSzgwNl9JTlRfU1RTX1BXUk9OX0xQKSwKPiArCVJFR01BUF9J UlFfUkVHKFJLODA2X0lSUV9IT1RESUUsIDAsIFJLODA2X0lOVF9TVFNfSE9URElFKSwKPiArCVJF R01BUF9JUlFfUkVHKFJLODA2X0lSUV9WRENfUklTRSwgMCwgUks4MDZfSU5UX1NUU19WRENfUklT RSksCj4gKwlSRUdNQVBfSVJRX1JFRyhSSzgwNl9JUlFfVkRDX0ZBTEwsIDAsIFJLODA2X0lOVF9T VFNfVkRDX0ZBTEwpLAo+ICsJUkVHTUFQX0lSUV9SRUcoUks4MDZfSVJRX1ZCX0xPLCAwLCBSSzgw Nl9JTlRfU1RTX1ZCX0xPKSwKPiArCS8qIElOVF9TVFMxIElSUXMgKi8KPiArCVJFR01BUF9JUlFf UkVHKFJLODA2X0lSUV9SRVYwLCAxLCBSSzgwNl9JTlRfU1RTX1JFVjApLAo+ICsJUkVHTUFQX0lS UV9SRUcoUks4MDZfSVJRX1JFVjEsIDEsIFJLODA2X0lOVF9TVFNfUkVWMSksCj4gKwlSRUdNQVBf SVJRX1JFRyhSSzgwNl9JUlFfUkVWMiwgMSwgUks4MDZfSU5UX1NUU19SRVYyKSwKPiArCVJFR01B UF9JUlFfUkVHKFJLODA2X0lSUV9DUkNfRVJST1IsIDEsIFJLODA2X0lOVF9TVFNfQ1JDX0VSUk9S KSwKPiArCVJFR01BUF9JUlFfUkVHKFJLODA2X0lSUV9TTFAzX0dQSU8sIDEsIFJLODA2X0lOVF9T VFNfU0xQM19HUElPKSwKPiArCVJFR01BUF9JUlFfUkVHKFJLODA2X0lSUV9TTFAyX0dQSU8sIDEs IFJLODA2X0lOVF9TVFNfU0xQMl9HUElPKSwKPiArCVJFR01BUF9JUlFfUkVHKFJLODA2X0lSUV9T TFAxX0dQSU8sIDEsIFJLODA2X0lOVF9TVFNfU0xQMV9HUElPKSwKPiArCVJFR01BUF9JUlFfUkVH KFJLODA2X0lSUV9XRFQsIDEsIFJLODA2X0lOVF9TVFNfV0RUKSwKPiArfTsKPiArCj4gIHN0YXRp YyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2lycSByazgwOF9pcnFzW10gPSB7Cj4gIAkvKiBJTlRfU1RT ICovCj4gIAlbUks4MDhfSVJRX1ZPVVRfTE9dID0gewo+IEBAIC00MjIsNiArNDY1LDE4IEBAIHN0 YXRpYyBzdHJ1Y3QgcmVnbWFwX2lycV9jaGlwIHJrODA1X2lycV9jaGlwID0gewo+ICAJLmluaXRf YWNrX21hc2tlZCA9IHRydWUsCj4gIH07Cj4gIAo+ICtzdGF0aWMgc3RydWN0IHJlZ21hcF9pcnFf Y2hpcCByazgwNl9pcnFfY2hpcCA9IHsKPiArCS5uYW1lID0gInJrODA2IiwKPiArCS5pcnFzID0g cms4MDZfaXJxcywKPiArCS5udW1faXJxcyA9IEFSUkFZX1NJWkUocms4MDZfaXJxcyksCj4gKwku bnVtX3JlZ3MgPSAyLAo+ICsJLmlycV9yZWdfc3RyaWRlID0gMiwKPiArCS5tYXNrX2Jhc2UgPSBS SzgwNl9JTlRfTVNLMCwKPiArCS5zdGF0dXNfYmFzZSA9IFJLODA2X0lOVF9TVFMwLAo+ICsJLmFj a19iYXNlID0gUks4MDZfSU5UX1NUUzAsCj4gKwkuaW5pdF9hY2tfbWFza2VkID0gdHJ1ZSwKPiAr fTsKPiArCj4gIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2lycV9jaGlwIHJrODA4X2lycV9j aGlwID0gewo+ICAJLm5hbWUgPSAicms4MDgiLAo+ICAJLmlycXMgPSByazgwOF9pcnFzLAo+IEBA IC01NDgsNiArNjAzLDcgQEAgaW50IHJrOHh4X3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50 IHZhcmlhbnQsIHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCByZWdtYXAKPiAgCXN0cnVjdCByazgw OCAqcms4MDg7Cj4gIAljb25zdCBzdHJ1Y3Qgcms4MDhfcmVnX2RhdGEgKnByZV9pbml0X3JlZzsK PiAgCWNvbnN0IHN0cnVjdCBtZmRfY2VsbCAqY2VsbHM7Cj4gKwlpbnQgZHVhbF9zdXBwb3J0ID0g MDsKPiAgCWludCBucl9wcmVfaW5pdF9yZWdzOwo+ICAJaW50IG5yX2NlbGxzOwo+ICAJaW50IHJl dDsKPiBAQCAtNTY5LDYgKzYyNSwxNCBAQCBpbnQgcms4eHhfcHJvYmUoc3RydWN0IGRldmljZSAq ZGV2LCBpbnQgdmFyaWFudCwgdW5zaWduZWQgaW50IGlycSwgc3RydWN0IHJlZ21hcAo+ICAJCWNl bGxzID0gcms4MDVzOwo+ICAJCW5yX2NlbGxzID0gQVJSQVlfU0laRShyazgwNXMpOwo+ICAJCWJy ZWFrOwo+ICsJY2FzZSBSSzgwNl9JRDoKPiArCQlyazgwOC0+cmVnbWFwX2lycV9jaGlwID0gJnJr ODA2X2lycV9jaGlwOwo+ICsJCXByZV9pbml0X3JlZyA9IHJrODA2X3ByZV9pbml0X3JlZzsKPiAr CQlucl9wcmVfaW5pdF9yZWdzID0gQVJSQVlfU0laRShyazgwNl9wcmVfaW5pdF9yZWcpOwo+ICsJ CWNlbGxzID0gcms4MDZzOwo+ICsJCW5yX2NlbGxzID0gQVJSQVlfU0laRShyazgwNnMpOwo+ICsJ CWR1YWxfc3VwcG9ydCA9IElSUUZfU0hBUkVEOwo+ICsJCWJyZWFrOwo+ICAJY2FzZSBSSzgwOF9J RDoKPiAgCQlyazgwOC0+cmVnbWFwX2lycV9jaGlwID0gJnJrODA4X2lycV9jaGlwOwo+ICAJCXBy ZV9pbml0X3JlZyA9IHJrODA4X3ByZV9pbml0X3JlZzsKPiBAQCAtNjAwLDcgKzY2NCw3IEBAIGlu dCByazh4eF9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCB2YXJpYW50LCB1bnNpZ25lZCBp bnQgaXJxLCBzdHJ1Y3QgcmVnbWFwCj4gIAkJcmV0dXJuIGRldl9lcnJfcHJvYmUoZGV2LCAtRUlO VkFMLCAiTm8gaW50ZXJydXB0IHN1cHBvcnQsIG5vIGNvcmUgSVJRXG4iKTsKPiAgCj4gIAlyZXQg PSBkZXZtX3JlZ21hcF9hZGRfaXJxX2NoaXAoZGV2LCByazgwOC0+cmVnbWFwLCBpcnEsCj4gLQkJ CQkgICAgICAgSVJRRl9PTkVTSE9ULCAtMSwKPiArCQkJCSAgICAgICBJUlFGX09ORVNIT1QgfCBk dWFsX3N1cHBvcnQsIC0xLAo+ICAJCQkJICAgICAgIHJrODA4LT5yZWdtYXBfaXJxX2NoaXAsICZy azgwOC0+aXJxX2RhdGEpOwo+ICAJaWYgKHJldCkKPiAgCQlyZXR1cm4gZGV2X2Vycl9wcm9iZShk ZXYsIHJldCwgIkZhaWxlZCB0byBhZGQgaXJxX2NoaXBcbiIpOwo+IEBAIC02MTUsOCArNjc5LDcg QEAgaW50IHJrOHh4X3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IHZhcmlhbnQsIHVuc2ln bmVkIGludCBpcnEsIHN0cnVjdCByZWdtYXAKPiAgCQkJCQkgICAgIHByZV9pbml0X3JlZ1tpXS5h ZGRyKTsKPiAgCX0KPiAgCj4gLQlyZXQgPSBkZXZtX21mZF9hZGRfZGV2aWNlcyhkZXYsIFBMQVRG T1JNX0RFVklEX05PTkUsCj4gLQkJCSAgICAgIGNlbGxzLCBucl9jZWxscywgTlVMTCwgMCwKPiAr CXJldCA9IGRldm1fbWZkX2FkZF9kZXZpY2VzKGRldiwgMCwgY2VsbHMsIG5yX2NlbGxzLCBOVUxM LCAwLAo+ICAJCQkgICAgICByZWdtYXBfaXJxX2dldF9kb21haW4ocms4MDgtPmlycV9kYXRhKSk7 Cj4gIAlpZiAocmV0KQo+ICAJCXJldHVybiBkZXZfZXJyX3Byb2JlKGRldiwgcmV0LCAiZmFpbGVk IHRvIGFkZCBNRkQgZGV2aWNlc1xuIik7Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3JrOHh4 LXNwaS5jIGIvZHJpdmVycy9tZmQvcms4eHgtc3BpLmMKPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+ IGluZGV4IDAwMDAwMDAwMDAwMC4uM2Y2YzViMTMzNGY3Cj4gLS0tIC9kZXYvbnVsbAo+ICsrKyBi L2RyaXZlcnMvbWZkL3JrOHh4LXNwaS5jCj4gQEAgLTAsMCArMSwxMjkgQEAKPiArLy8gU1BEWC1M aWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKPiArLyoKPiArICogUm9ja2NoaXAgUks4MDYgQ29y ZSAoU1BJKSBkcml2ZXIKPiArICoKPiArICogQ29weXJpZ2h0IChjKSAyMDIxIFJvY2tjaGlwIEVs ZWN0cm9uaWNzIENvLiwgTHRkLgo+ICsgKiBDb3B5cmlnaHQgKGMpIDIwMjMgQ29sbGFib3JhIEx0 ZC4KPiArICoKPiArICogQXV0aG9yOiBYdSBTaGVuZ2ZlaSA8eHNmQHJvY2stY2hpcHMuY29tPgo+ ICsgKiBBdXRob3I6IFNlYmFzdGlhbiBSZWljaGVsIDxzZWJhc3RpYW4ucmVpY2hlbEBjb2xsYWJv cmEuY29tPgo+ICsgKi8KPiArCj4gKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KPiArI2lu Y2x1ZGUgPGxpbnV4L21mZC9jb3JlLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9tZmQvcms4MDguaD4K PiArI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgo+ICsjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+ Cj4gKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+Cj4gKwo+ICsjZGVmaW5lIFJLODA2X0NNRAkJ MAo+ICsjZGVmaW5lIFJLODA2X1JFR19BRERSX0wJMQo+ICsjZGVmaW5lIFJLODA2X1JFR19BRERS X0gJMgo+ICsjZGVmaW5lIFJLODA2X0NNRF9XSVRIX1NJWkUoQ01ELCBWQUxVRV9CWVRFUykgXAo+ ICsJKFJLODA2X0NNRF8gIyMgQ01EIHwgKFZBTFVFX0JZVEVTLTEpKQoKTml0OiBTcGFjZXMgYXJv dW5kIHRoZSAnLScgcGxlYXNlLgoKU3BhY2VzIGFyb3VuZCB0aGUgIyMgbG9vayBvZGQgdG8gbWUg dG9vLgoKPiArc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfcmFuZ2Ugcms4MGc2X3ZvbGF0aWxl X3Jhbmdlc1tdID0gewo+ICsJcmVnbWFwX3JlZ19yYW5nZShSSzgwNl9QT1dFUl9FTjAsIFJLODA2 X1BPV0VSX0VONSksCj4gKwlyZWdtYXBfcmVnX3JhbmdlKFJLODA2X0RWU19TVEFSVF9DVFJMLCBS SzgwNl9JTlRfTVNLMSksCj4gK307Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9h Y2Nlc3NfdGFibGUgcms4MDZfdm9sYXRpbGVfdGFibGUgPSB7Cj4gKwkueWVzX3JhbmdlcyA9IHJr ODA2X3ZvbGF0aWxlX3JhbmdlcywKPiArCS5uX3llc19yYW5nZXMgPSBBUlJBWV9TSVpFKHJrODA2 X3ZvbGF0aWxlX3JhbmdlcyksCj4gK307Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21h cF9jb25maWcgcms4MDZfcmVnbWFwX2NvbmZpZ19zcGkgPSB7Cj4gKwkucmVnX2JpdHMgPSA4LAo+ ICsJLnZhbF9iaXRzID0gOCwKPiArCS5jYWNoZV90eXBlID0gUkVHQ0FDSEVfUkJUUkVFLAo+ICsJ LnZvbGF0aWxlX3RhYmxlID0gJnJrODA2X3ZvbGF0aWxlX3RhYmxlLAo+ICt9Owo+ICsKPiArc3Rh dGljIGludCByazgwNl9zcGlfYnVzX3dyaXRlKHZvaWQgKmNvbnRleHQsIGNvbnN0IHZvaWQgKnZk YXRhLCBzaXplX3QgY291bnQpCj4gK3sKPiArCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRleHQ7 Cj4gKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gdG9fc3BpX2RldmljZShkZXYpOwo+ICsJY29u c3QgY2hhciAqZGF0YSA9IHZkYXRhOwo+ICsJY2hhciBidWZmZXJbM10gPSB7IDAgfTsKPiArCXN0 cnVjdCBzcGlfdHJhbnNmZXIgeGZlclsyXSA9IHsgMCB9Owo+ICsJLyogY291bnQgaW5jbHVkZXMg dGhlIHJlZ2lzdGVyIHNpemUgKi8KPiArCXNpemVfdCB2YWxfc2l6ZSA9IGNvdW50IC0gMTsKPiAr Cj4gKwlpZiAodmFsX3NpemUgPCAxIHx8IHZhbF9zaXplID4gMTI4KQo+ICsJCXJldHVybiAtRUlO VkFMOwo+ICsKPiArCWJ1ZmZlcltSSzgwNl9DTURdCSA9IFJLODA2X0NNRF9XSVRIX1NJWkUoV1JJ VEUsIHZhbF9zaXplKTsKPiArCWJ1ZmZlcltSSzgwNl9SRUdfQUREUl9MXSA9IGRhdGFbMF07Cj4g KwlidWZmZXJbUks4MDZfUkVHX0FERFJfSF0gPSBSSzgwNl9SRUdfSDsKPiArCj4gKwl4ZmVyWzBd LnR4X2J1ZiA9IGJ1ZmZlcjsKPiArCXhmZXJbMF0ubGVuID0gc2l6ZW9mKGJ1ZmZlcik7Cj4gKwl4 ZmVyWzFdLnR4X2J1ZiA9IGRhdGEgKyAxOwoKV2h5LCB3aGF0J3MgYXQgWzBdPyAgQ2xlYXJlciB3 aXRoIGEgZGVmaW5lPwoKPiArCXhmZXJbMV0ubGVuID0gY291bnQgLSAxOwoKSXNuJ3QgdGhpcyB2 YWxfc2l6ZT8KCj4gKwlyZXR1cm4gc3BpX3N5bmNfdHJhbnNmZXIoc3BpLCB4ZmVyLCBBUlJBWV9T SVpFKHhmZXIpKTsKPiArfQo+ICsKPiArc3RhdGljIGludCByazgwNl9zcGlfYnVzX3JlYWQodm9p ZCAqY29udGV4dCwgY29uc3Qgdm9pZCAqdnJlZywgc2l6ZV90IHJlZ19zaXplLAo+ICsJCQkgICAg ICB2b2lkICp2YWwsIHNpemVfdCB2YWxfc2l6ZSkKPiArewo+ICsJc3RydWN0IGRldmljZSAqZGV2 ID0gY29udGV4dDsKPiArCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSB0b19zcGlfZGV2aWNlKGRl dik7Cj4gKwljb25zdCBjaGFyICpyZWcgPSB2cmVnOwo+ICsJY2hhciB0eGJ1ZlszXSA9IHsgMCB9 Owo+ICsKPiArCWlmIChyZWdfc2l6ZSAhPSBzaXplb2YoY2hhcikgfHwgdmFsX3NpemUgPCAxIHx8 IHZhbF9zaXplID4gMTI4KQoKI2RlZmluZSBNQVhfQlVGRkVSX1NJWkUgMTI4PwoKPiArCQlyZXR1 cm4gLUVJTlZBTDsKPiArCj4gKwl0eGJ1ZltSSzgwNl9DTURdCT0gUks4MDZfQ01EX1dJVEhfU0la RShSRUFELCB2YWxfc2l6ZSk7Cj4gKwl0eGJ1ZltSSzgwNl9SRUdfQUREUl9MXQk9ICpyZWc7Cj4g Kwl0eGJ1ZltSSzgwNl9SRUdfQUREUl9IXQk9IFJLODA2X1JFR19IOwo+ICsKPiArCXJldHVybiBz cGlfd3JpdGVfdGhlbl9yZWFkKHNwaSwgdHhidWYsIHNpemVvZih0eGJ1ZiksIHZhbCwgdmFsX3Np emUpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9idXMgcms4MDZfcmVn bWFwX2J1c19zcGkgPSB7Cj4gKwkud3JpdGUgPSByazgwNl9zcGlfYnVzX3dyaXRlLAo+ICsJLnJl YWQgPSByazgwNl9zcGlfYnVzX3JlYWQsCj4gKwkucmVnX2Zvcm1hdF9lbmRpYW5fZGVmYXVsdCA9 IFJFR01BUF9FTkRJQU5fTkFUSVZFLAo+ICsJLnZhbF9mb3JtYXRfZW5kaWFuX2RlZmF1bHQgPSBS RUdNQVBfRU5ESUFOX05BVElWRSwKPiArfTsKPiArCj4gK3N0YXRpYyBpbnQgcms4eHhfc3BpX3By b2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCj4gK3sKPiArCXN0cnVjdCByZWdtYXAgKnJlZ21h cDsKPiArCj4gKwlyZWdtYXAgPSBkZXZtX3JlZ21hcF9pbml0KCZzcGktPmRldiwgJnJrODA2X3Jl Z21hcF9idXNfc3BpLAo+ICsJCQkJICAmc3BpLT5kZXYsICZyazgwNl9yZWdtYXBfY29uZmlnX3Nw aSk7Cj4gKwlpZiAoSVNfRVJSKHJlZ21hcCkpCj4gKwkJcmV0dXJuIGRldl9lcnJfcHJvYmUoJnNw aS0+ZGV2LCBQVFJfRVJSKHJlZ21hcCksCj4gKwkJCQkgICAgICJGYWlsZWQgdG8gaW5pdGlhbGl6 ZSByZWdpc3RlciBtYXBcbiIpOwoKSXQncyBtb3JlIHdpZGVseSBrbm93biBhcyByZWdtYXAuCgo+ ICsJcmV0dXJuIHJrOHh4X3Byb2JlKCZzcGktPmRldiwgUks4MDZfSUQsIHNwaS0+aXJxLCByZWdt YXApOwo+ICt9Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCByazh4eF9z cGlfb2ZfbWF0Y2hbXSA9IHsKPiArCXsgLmNvbXBhdGlibGUgPSAicm9ja2NoaXAscms4MDYiLCB9 LAo+ICsJeyB9Cj4gK307Cj4gK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHJrOHh4X3NwaV9vZl9t YXRjaCk7Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IHNwaV9kZXZpY2VfaWQgcms4eHhfc3Bp X2lkX3RhYmxlW10gPSB7Cj4gKwl7ICJyazgwNiIsIDAgfSwKPiArCXsgfQo+ICt9Owo+ICtNT0RV TEVfREVWSUNFX1RBQkxFKHNwaSwgcms4eHhfc3BpX2lkX3RhYmxlKTsKPiArCj4gK3N0YXRpYyBz dHJ1Y3Qgc3BpX2RyaXZlciByazh4eF9zcGlfZHJpdmVyID0gewo+ICsJLmRyaXZlcgkJPSB7Cj4g KwkJLm5hbWUJPSAicms4eHgtc3BpIiwKPiArCQkub2ZfbWF0Y2hfdGFibGUgPSByazh4eF9zcGlf b2ZfbWF0Y2gsCj4gKwl9LAo+ICsJLnByb2JlCQk9IHJrOHh4X3NwaV9wcm9iZSwKPiArCS5pZF90 YWJsZQk9IHJrOHh4X3NwaV9pZF90YWJsZSwKPiArfTsKPiArbW9kdWxlX3NwaV9kcml2ZXIocms4 eHhfc3BpX2RyaXZlcik7Cj4gKwo+ICtNT0RVTEVfQVVUSE9SKCJYdSBTaGVuZ2ZlaSA8eHNmQHJv Y2stY2hpcHMuY29tPiIpOwo+ICtNT0RVTEVfREVTQ1JJUFRJT04oIlJLOHh4IFNQSSBQTUlDIGRy aXZlciIpOwo+ICtNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7Cj4gZGlmZiAtLWdpdCBhL2luY2x1 ZGUvbGludXgvbWZkL3JrODA4LmggYi9pbmNsdWRlL2xpbnV4L21mZC9yazgwOC5oCj4gaW5kZXgg NDE4MzQyN2E4MGZlLi43OGUxNjdhOTI0ODMgMTAwNjQ0Cj4gLS0tIGEvaW5jbHVkZS9saW51eC9t ZmQvcms4MDguaAo+ICsrKyBiL2luY2x1ZGUvbGludXgvbWZkL3JrODA4LmgKPiBAQCAtMjg5LDYg KzI4OSw0MTQgQEAgZW51bSByazgwNV9yZWcgewo+ICAjZGVmaW5lIFJLODA1X0lOVF9BTEFSTV9F TgkJKDEgPDwgMykKPiAgI2RlZmluZSBSSzgwNV9JTlRfVElNRVJfRU4JCSgxIDw8IDIpCj4gIAo+ ICsvKiBSSzgwNiAqLwo+ICsjZGVmaW5lIFJLODA2X1BPV0VSX0VOMAkJCTB4MAo+ICsjZGVmaW5l IFJLODA2X1BPV0VSX0VOMQkJCTB4MQo+ICsjZGVmaW5lIFJLODA2X1BPV0VSX0VOMgkJCTB4Mgo+ ICsjZGVmaW5lIFJLODA2X1BPV0VSX0VOMwkJCTB4Mwo+ICsjZGVmaW5lIFJLODA2X1BPV0VSX0VO NAkJCTB4NAo+ICsjZGVmaW5lIFJLODA2X1BPV0VSX0VONQkJCTB4NQo+ICsjZGVmaW5lIFJLODA2 X1BPV0VSX1NMUF9FTjAJCTB4Ngo+ICsjZGVmaW5lIFJLODA2X1BPV0VSX1NMUF9FTjEJCTB4Nwo+ ICsjZGVmaW5lIFJLODA2X1BPV0VSX1NMUF9FTjIJCTB4OAo+ICsjZGVmaW5lIFJLODA2X1BPV0VS X0RJU0NIUkdfRU4wCQkweDkKPiArI2RlZmluZSBSSzgwNl9QT1dFUl9ESVNDSFJHX0VOMQkJMHhB Cj4gKyNkZWZpbmUgUks4MDZfUE9XRVJfRElTQ0hSR19FTjIJCTB4Qgo+ICsjZGVmaW5lIFJLODA2 X0JVQ0tfRkJfQ09ORklHCQkweEMKPiArI2RlZmluZSBSSzgwNl9TTFBfTFBfQ09ORklHCQkweEQK PiArI2RlZmluZSBSSzgwNl9QT1dFUl9GUFdNX0VOMAkJMHhFCj4gKyNkZWZpbmUgUks4MDZfUE9X RVJfRlBXTV9FTjEJCTB4Rgo+ICsjZGVmaW5lIFJLODA2X0JVQ0sxX0NPTkZJRwkJMHgxMAo+ICsj ZGVmaW5lIFJLODA2X0JVQ0syX0NPTkZJRwkJMHgxMQo+ICsjZGVmaW5lIFJLODA2X0JVQ0szX0NP TkZJRwkJMHgxMgo+ICsjZGVmaW5lIFJLODA2X0JVQ0s0X0NPTkZJRwkJMHgxMwo+ICsjZGVmaW5l IFJLODA2X0JVQ0s1X0NPTkZJRwkJMHgxNAo+ICsjZGVmaW5lIFJLODA2X0JVQ0s2X0NPTkZJRwkJ MHgxNQo+ICsjZGVmaW5lIFJLODA2X0JVQ0s3X0NPTkZJRwkJMHgxNgo+ICsjZGVmaW5lIFJLODA2 X0JVQ0s4X0NPTkZJRwkJMHgxNwo+ICsjZGVmaW5lIFJLODA2X0JVQ0s5X0NPTkZJRwkJMHgxOAo+ ICsjZGVmaW5lIFJLODA2X0JVQ0sxMF9DT05GSUcJCTB4MTkKPiArI2RlZmluZSBSSzgwNl9CVUNL MV9PTl9WU0VMCQkweDFBCj4gKyNkZWZpbmUgUks4MDZfQlVDSzJfT05fVlNFTAkJMHgxQgo+ICsj ZGVmaW5lIFJLODA2X0JVQ0szX09OX1ZTRUwJCTB4MUMKPiArI2RlZmluZSBSSzgwNl9CVUNLNF9P Tl9WU0VMCQkweDFECj4gKyNkZWZpbmUgUks4MDZfQlVDSzVfT05fVlNFTAkJMHgxRQo+ICsjZGVm aW5lIFJLODA2X0JVQ0s2X09OX1ZTRUwJCTB4MUYKPiArI2RlZmluZSBSSzgwNl9CVUNLN19PTl9W U0VMCQkweDIwCj4gKyNkZWZpbmUgUks4MDZfQlVDSzhfT05fVlNFTAkJMHgyMQo+ICsjZGVmaW5l IFJLODA2X0JVQ0s5X09OX1ZTRUwJCTB4MjIKPiArI2RlZmluZSBSSzgwNl9CVUNLMTBfT05fVlNF TAkJMHgyMwo+ICsjZGVmaW5lIFJLODA2X0JVQ0sxX1NMUF9WU0VMCQkweDI0Cj4gKyNkZWZpbmUg Uks4MDZfQlVDSzJfU0xQX1ZTRUwJCTB4MjUKPiArI2RlZmluZSBSSzgwNl9CVUNLM19TTFBfVlNF TAkJMHgyNgo+ICsjZGVmaW5lIFJLODA2X0JVQ0s0X1NMUF9WU0VMCQkweDI3Cj4gKyNkZWZpbmUg Uks4MDZfQlVDSzVfU0xQX1ZTRUwJCTB4MjgKPiArI2RlZmluZSBSSzgwNl9CVUNLNl9TTFBfVlNF TAkJMHgyOQo+ICsjZGVmaW5lIFJLODA2X0JVQ0s3X1NMUF9WU0VMCQkweDJBCj4gKyNkZWZpbmUg Uks4MDZfQlVDSzhfU0xQX1ZTRUwJCTB4MkIKPiArI2RlZmluZSBSSzgwNl9CVUNLOV9TTFBfVlNF TAkJMHgyRAo+ICsjZGVmaW5lIFJLODA2X0JVQ0sxMF9TTFBfVlNFTAkJMHgyRQo+ICsjZGVmaW5l IFJLODA2X0JVQ0tfREVCVUcxCQkweDMwCj4gKyNkZWZpbmUgUks4MDZfQlVDS19ERUJVRzIJCTB4 MzEKPiArI2RlZmluZSBSSzgwNl9CVUNLX0RFQlVHMwkJMHgzMgo+ICsjZGVmaW5lIFJLODA2X0JV Q0tfREVCVUc0CQkweDMzCj4gKyNkZWZpbmUgUks4MDZfQlVDS19ERUJVRzUJCTB4MzQKPiArI2Rl ZmluZSBSSzgwNl9CVUNLX0RFQlVHNgkJMHgzNQo+ICsjZGVmaW5lIFJLODA2X0JVQ0tfREVCVUc3 CQkweDM2Cj4gKyNkZWZpbmUgUks4MDZfQlVDS19ERUJVRzgJCTB4MzcKPiArI2RlZmluZSBSSzgw Nl9CVUNLX0RFQlVHOQkJMHgzOAo+ICsjZGVmaW5lIFJLODA2X0JVQ0tfREVCVUcxMAkJMHgzOQo+ ICsjZGVmaW5lIFJLODA2X0JVQ0tfREVCVUcxMQkJMHgzQQo+ICsjZGVmaW5lIFJLODA2X0JVQ0tf REVCVUcxMgkJMHgzQgo+ICsjZGVmaW5lIFJLODA2X0JVQ0tfREVCVUcxMwkJMHgzQwo+ICsjZGVm aW5lIFJLODA2X0JVQ0tfREVCVUcxNAkJMHgzRAo+ICsjZGVmaW5lIFJLODA2X0JVQ0tfREVCVUcx NQkJMHgzRQo+ICsjZGVmaW5lIFJLODA2X0JVQ0tfREVCVUcxNgkJMHgzRgo+ICsjZGVmaW5lIFJL ODA2X0JVQ0tfREVCVUcxNwkJMHg0MAo+ICsjZGVmaW5lIFJLODA2X0JVQ0tfREVCVUcxOAkJMHg0 MQo+ICsjZGVmaW5lIFJLODA2X05MRE9fSU1BWAkJCTB4NDIKPiArI2RlZmluZSBSSzgwNl9OTERP MV9PTl9WU0VMCQkweDQzCj4gKyNkZWZpbmUgUks4MDZfTkxETzJfT05fVlNFTAkJMHg0NAo+ICsj ZGVmaW5lIFJLODA2X05MRE8zX09OX1ZTRUwJCTB4NDUKPiArI2RlZmluZSBSSzgwNl9OTERPNF9P Tl9WU0VMCQkweDQ2Cj4gKyNkZWZpbmUgUks4MDZfTkxETzVfT05fVlNFTAkJMHg0Nwo+ICsjZGVm aW5lIFJLODA2X05MRE8xX1NMUF9WU0VMCQkweDQ4Cj4gKyNkZWZpbmUgUks4MDZfTkxETzJfU0xQ X1ZTRUwJCTB4NDkKPiArI2RlZmluZSBSSzgwNl9OTERPM19TTFBfVlNFTAkJMHg0QQo+ICsjZGVm aW5lIFJLODA2X05MRE80X1NMUF9WU0VMCQkweDRCCj4gKyNkZWZpbmUgUks4MDZfTkxETzVfU0xQ X1ZTRUwJCTB4NEMKPiArI2RlZmluZSBSSzgwNl9QTERPX0lNQVgJCQkweDRECj4gKyNkZWZpbmUg Uks4MDZfUExETzFfT05fVlNFTAkJMHg0RQo+ICsjZGVmaW5lIFJLODA2X1BMRE8yX09OX1ZTRUwJ CTB4NEYKPiArI2RlZmluZSBSSzgwNl9QTERPM19PTl9WU0VMCQkweDUwCj4gKyNkZWZpbmUgUks4 MDZfUExETzRfT05fVlNFTAkJMHg1MQo+ICsjZGVmaW5lIFJLODA2X1BMRE81X09OX1ZTRUwJCTB4 NTIKPiArI2RlZmluZSBSSzgwNl9QTERPNl9PTl9WU0VMCQkweDUzCj4gKyNkZWZpbmUgUks4MDZf UExETzFfU0xQX1ZTRUwJCTB4NTQKPiArI2RlZmluZSBSSzgwNl9QTERPMl9TTFBfVlNFTAkJMHg1 NQo+ICsjZGVmaW5lIFJLODA2X1BMRE8zX1NMUF9WU0VMCQkweDU2Cj4gKyNkZWZpbmUgUks4MDZf UExETzRfU0xQX1ZTRUwJCTB4NTcKPiArI2RlZmluZSBSSzgwNl9QTERPNV9TTFBfVlNFTAkJMHg1 OAo+ICsjZGVmaW5lIFJLODA2X1BMRE82X1NMUF9WU0VMCQkweDU5Cj4gKyNkZWZpbmUgUks4MDZf Q0hJUF9OQU1FCQkJMHg1QQo+ICsjZGVmaW5lIFJLODA2X0NISVBfVkVSCQkJMHg1Qgo+ICsjZGVm aW5lIFJLODA2X09UUF9WRVIJCQkweDVDCj4gKyNkZWZpbmUgUks4MDZfU1lTX1NUUwkJCTB4NUQK PiArI2RlZmluZSBSSzgwNl9TWVNfQ0ZHMAkJCTB4NUUKPiArI2RlZmluZSBSSzgwNl9TWVNfQ0ZH MQkJCTB4NUYKPiArI2RlZmluZSBSSzgwNl9TWVNfT1BUSU9OCQkweDYxCj4gKyNkZWZpbmUgUks4 MDZfU0xFRVBfQ09ORklHMAkJMHg2Mgo+ICsjZGVmaW5lIFJLODA2X1NMRUVQX0NPTkZJRzEJCTB4 NjMKPiArI2RlZmluZSBSSzgwNl9TTEVFUF9DVFJfU0VMMAkJMHg2NAo+ICsjZGVmaW5lIFJLODA2 X1NMRUVQX0NUUl9TRUwxCQkweDY1Cj4gKyNkZWZpbmUgUks4MDZfU0xFRVBfQ1RSX1NFTDIJCTB4 NjYKPiArI2RlZmluZSBSSzgwNl9TTEVFUF9DVFJfU0VMMwkJMHg2Nwo+ICsjZGVmaW5lIFJLODA2 X1NMRUVQX0NUUl9TRUw0CQkweDY4Cj4gKyNkZWZpbmUgUks4MDZfU0xFRVBfQ1RSX1NFTDUJCTB4 NjkKPiArI2RlZmluZSBSSzgwNl9EVlNfQ1RSTF9TRUwwCQkweDZBCj4gKyNkZWZpbmUgUks4MDZf RFZTX0NUUkxfU0VMMQkJMHg2Qgo+ICsjZGVmaW5lIFJLODA2X0RWU19DVFJMX1NFTDIJCTB4NkMK PiArI2RlZmluZSBSSzgwNl9EVlNfQ1RSTF9TRUwzCQkweDZECj4gKyNkZWZpbmUgUks4MDZfRFZT X0NUUkxfU0VMNAkJMHg2RQo+ICsjZGVmaW5lIFJLODA2X0RWU19DVFJMX1NFTDUJCTB4NkYKPiAr I2RlZmluZSBSSzgwNl9EVlNfU1RBUlRfQ1RSTAkJMHg3MAo+ICsjZGVmaW5lIFJLODA2X1NMRUVQ X0dQSU8JCTB4NzEKPiArI2RlZmluZSBSSzgwNl9TWVNfQ0ZHMwkJCTB4NzIKPiArI2RlZmluZSBS SzgwNl9PTl9TT1VSQ0UJCQkweDc0Cj4gKyNkZWZpbmUgUks4MDZfT0ZGX1NPVVJDRQkJMHg3NQo+ ICsjZGVmaW5lIFJLODA2X1BXUk9OX0tFWQkJCTB4NzYKPiArI2RlZmluZSBSSzgwNl9JTlRfU1RT MAkJCTB4NzcKPiArI2RlZmluZSBSSzgwNl9JTlRfTVNLMAkJCTB4NzgKPiArI2RlZmluZSBSSzgw Nl9JTlRfU1RTMQkJCTB4NzkKPiArI2RlZmluZSBSSzgwNl9JTlRfTVNLMQkJCTB4N0EKPiArI2Rl ZmluZSBSSzgwNl9HUElPX0lOVF9DT05GSUcJCTB4N0IKPiArI2RlZmluZSBSSzgwNl9EQVRBX1JF RzAJCQkweDdDCj4gKyNkZWZpbmUgUks4MDZfREFUQV9SRUcxCQkJMHg3RAo+ICsjZGVmaW5lIFJL ODA2X0RBVEFfUkVHMgkJCTB4N0UKPiArI2RlZmluZSBSSzgwNl9EQVRBX1JFRzMJCQkweDdGCj4g KyNkZWZpbmUgUks4MDZfREFUQV9SRUc0CQkJMHg4MAo+ICsjZGVmaW5lIFJLODA2X0RBVEFfUkVH NQkJCTB4ODEKPiArI2RlZmluZSBSSzgwNl9EQVRBX1JFRzYJCQkweDgyCj4gKyNkZWZpbmUgUks4 MDZfREFUQV9SRUc3CQkJMHg4Mwo+ICsjZGVmaW5lIFJLODA2X0RBVEFfUkVHOAkJCTB4ODQKPiAr I2RlZmluZSBSSzgwNl9EQVRBX1JFRzkJCQkweDg1Cj4gKyNkZWZpbmUgUks4MDZfREFUQV9SRUcx MAkJMHg4Ngo+ICsjZGVmaW5lIFJLODA2X0RBVEFfUkVHMTEJCTB4ODcKPiArI2RlZmluZSBSSzgw Nl9EQVRBX1JFRzEyCQkweDg4Cj4gKyNkZWZpbmUgUks4MDZfREFUQV9SRUcxMwkJMHg4OQo+ICsj ZGVmaW5lIFJLODA2X0RBVEFfUkVHMTQJCTB4OEEKPiArI2RlZmluZSBSSzgwNl9EQVRBX1JFRzE1 CQkweDhCCj4gKyNkZWZpbmUgUks4MDZfVE1fUkVHCQkJMHg4Qwo+ICsjZGVmaW5lIFJLODA2X09U UF9FTl9SRUcJCTB4OEQKPiArI2RlZmluZSBSSzgwNl9GVU5DX09UUF9FTl9SRUcJCTB4OEUKPiAr I2RlZmluZSBSSzgwNl9URVNUX1JFRzEJCQkweDhGCj4gKyNkZWZpbmUgUks4MDZfVEVTVF9SRUcy CQkJMHg5MAo+ICsjZGVmaW5lIFJLODA2X1RFU1RfUkVHMwkJCTB4OTEKPiArI2RlZmluZSBSSzgw Nl9URVNUX1JFRzQJCQkweDkyCj4gKyNkZWZpbmUgUks4MDZfVEVTVF9SRUc1CQkJMHg5Mwo+ICsj ZGVmaW5lIFJLODA2X0JVQ0tfVlNFTF9PVFBfUkVHMAkweDk0Cj4gKyNkZWZpbmUgUks4MDZfQlVD S19WU0VMX09UUF9SRUcxCTB4OTUKPiArI2RlZmluZSBSSzgwNl9CVUNLX1ZTRUxfT1RQX1JFRzIJ MHg5Ngo+ICsjZGVmaW5lIFJLODA2X0JVQ0tfVlNFTF9PVFBfUkVHMwkweDk3Cj4gKyNkZWZpbmUg Uks4MDZfQlVDS19WU0VMX09UUF9SRUc0CTB4OTgKPiArI2RlZmluZSBSSzgwNl9CVUNLX1ZTRUxf T1RQX1JFRzUJMHg5OQo+ICsjZGVmaW5lIFJLODA2X0JVQ0tfVlNFTF9PVFBfUkVHNgkweDlBCj4g KyNkZWZpbmUgUks4MDZfQlVDS19WU0VMX09UUF9SRUc3CTB4OUIKPiArI2RlZmluZSBSSzgwNl9C VUNLX1ZTRUxfT1RQX1JFRzgJMHg5Qwo+ICsjZGVmaW5lIFJLODA2X0JVQ0tfVlNFTF9PVFBfUkVH OQkweDlECj4gKyNkZWZpbmUgUks4MDZfTkxETzFfVlNFTF9PVFBfUkVHMAkweDlFCj4gKyNkZWZp bmUgUks4MDZfTkxETzFfVlNFTF9PVFBfUkVHMQkweDlGCj4gKyNkZWZpbmUgUks4MDZfTkxETzFf VlNFTF9PVFBfUkVHMgkweEEwCj4gKyNkZWZpbmUgUks4MDZfTkxETzFfVlNFTF9PVFBfUkVHMwkw eEExCj4gKyNkZWZpbmUgUks4MDZfTkxETzFfVlNFTF9PVFBfUkVHNAkweEEyCj4gKyNkZWZpbmUg Uks4MDZfUExET19WU0VMX09UUF9SRUcwCTB4QTMKPiArI2RlZmluZSBSSzgwNl9QTERPX1ZTRUxf T1RQX1JFRzEJMHhBNAo+ICsjZGVmaW5lIFJLODA2X1BMRE9fVlNFTF9PVFBfUkVHMgkweEE1Cj4g KyNkZWZpbmUgUks4MDZfUExET19WU0VMX09UUF9SRUczCTB4QTYKPiArI2RlZmluZSBSSzgwNl9Q TERPX1ZTRUxfT1RQX1JFRzQJMHhBNwo+ICsjZGVmaW5lIFJLODA2X1BMRE9fVlNFTF9PVFBfUkVH NQkweEE4Cj4gKyNkZWZpbmUgUks4MDZfQlVDS19FTl9PVFBfUkVHMQkJMHhBOQo+ICsjZGVmaW5l IFJLODA2X05MRE9fRU5fT1RQX1JFRzEJCTB4QUEKPiArI2RlZmluZSBSSzgwNl9QTERPX0VOX09U UF9SRUcxCQkweEFCCj4gKyNkZWZpbmUgUks4MDZfQlVDS19GQl9SRVNfT1RQX1JFRzEJMHhBQwo+ ICsjZGVmaW5lIFJLODA2X09UUF9SRVNFVl9SRUcwCQkweEFECj4gKyNkZWZpbmUgUks4MDZfT1RQ X1JFU0VWX1JFRzEJCTB4QUUKPiArI2RlZmluZSBSSzgwNl9PVFBfUkVTRVZfUkVHMgkJMHhBRgo+ ICsjZGVmaW5lIFJLODA2X09UUF9SRVNFVl9SRUczCQkweEIwCj4gKyNkZWZpbmUgUks4MDZfT1RQ X1JFU0VWX1JFRzQJCTB4QjEKPiArI2RlZmluZSBSSzgwNl9CVUNLX1NFUV9SRUcwCQkweEIyCj4g KyNkZWZpbmUgUks4MDZfQlVDS19TRVFfUkVHMQkJMHhCMwo+ICsjZGVmaW5lIFJLODA2X0JVQ0tf U0VRX1JFRzIJCTB4QjQKPiArI2RlZmluZSBSSzgwNl9CVUNLX1NFUV9SRUczCQkweEI1Cj4gKyNk ZWZpbmUgUks4MDZfQlVDS19TRVFfUkVHNAkJMHhCNgo+ICsjZGVmaW5lIFJLODA2X0JVQ0tfU0VR X1JFRzUJCTB4QjcKPiArI2RlZmluZSBSSzgwNl9CVUNLX1NFUV9SRUc2CQkweEI4Cj4gKyNkZWZp bmUgUks4MDZfQlVDS19TRVFfUkVHNwkJMHhCOQo+ICsjZGVmaW5lIFJLODA2X0JVQ0tfU0VRX1JF RzgJCTB4QkEKPiArI2RlZmluZSBSSzgwNl9CVUNLX1NFUV9SRUc5CQkweEJCCj4gKyNkZWZpbmUg Uks4MDZfQlVDS19TRVFfUkVHMTAJCTB4QkMKPiArI2RlZmluZSBSSzgwNl9CVUNLX1NFUV9SRUcx MQkJMHhCRAo+ICsjZGVmaW5lIFJLODA2X0JVQ0tfU0VRX1JFRzEyCQkweEJFCj4gKyNkZWZpbmUg Uks4MDZfQlVDS19TRVFfUkVHMTMJCTB4QkYKPiArI2RlZmluZSBSSzgwNl9CVUNLX1NFUV9SRUcx NAkJMHhDMAo+ICsjZGVmaW5lIFJLODA2X0JVQ0tfU0VRX1JFRzE1CQkweEMxCj4gKyNkZWZpbmUg Uks4MDZfQlVDS19TRVFfUkVHMTYJCTB4QzIKPiArI2RlZmluZSBSSzgwNl9CVUNLX1NFUV9SRUcx NwkJMHhDMwo+ICsjZGVmaW5lIFJLODA2X0hLX1RSSU1fUkVHMQkJMHhDNAo+ICsjZGVmaW5lIFJL ODA2X0hLX1RSSU1fUkVHMgkJMHhDNQo+ICsjZGVmaW5lIFJLODA2X0JVQ0tfUkVGX1RSSU1fUkVH MQkweEM2Cj4gKyNkZWZpbmUgUks4MDZfQlVDS19SRUZfVFJJTV9SRUcyCTB4QzcKPiArI2RlZmlu ZSBSSzgwNl9CVUNLX1JFRl9UUklNX1JFRzMJMHhDOAo+ICsjZGVmaW5lIFJLODA2X0JVQ0tfUkVG X1RSSU1fUkVHNAkweEM5Cj4gKyNkZWZpbmUgUks4MDZfQlVDS19SRUZfVFJJTV9SRUc1CTB4Q0EK PiArI2RlZmluZSBSSzgwNl9CVUNLX09TQ19UUklNX1JFRzEJMHhDQgo+ICsjZGVmaW5lIFJLODA2 X0JVQ0tfT1NDX1RSSU1fUkVHMgkweENDCj4gKyNkZWZpbmUgUks4MDZfQlVDS19PU0NfVFJJTV9S RUczCTB4Q0QKPiArI2RlZmluZSBSSzgwNl9CVUNLX09TQ19UUklNX1JFRzQJMHhDRQo+ICsjZGVm aW5lIFJLODA2X0JVQ0tfT1NDX1RSSU1fUkVHNQkweENGCj4gKyNkZWZpbmUgUks4MDZfQlVDS19U UklNX1pDRElPU19SRUcxCTB4RDAKPiArI2RlZmluZSBSSzgwNl9CVUNLX1RSSU1fWkNESU9TX1JF RzIJMHhEMQo+ICsjZGVmaW5lIFJLODA2X05MRE9fVFJJTV9SRUcxCQkweEQyCj4gKyNkZWZpbmUg Uks4MDZfTkxET19UUklNX1JFRzIJCTB4RDMKPiArI2RlZmluZSBSSzgwNl9OTERPX1RSSU1fUkVH MwkJMHhENAo+ICsjZGVmaW5lIFJLODA2X1BMRE9fVFJJTV9SRUcxCQkweEQ1Cj4gKyNkZWZpbmUg Uks4MDZfUExET19UUklNX1JFRzIJCTB4RDYKPiArI2RlZmluZSBSSzgwNl9QTERPX1RSSU1fUkVH MwkJMHhENwo+ICsjZGVmaW5lIFJLODA2X1RSSU1fSUNPTVBfUkVHMQkJMHhEOAo+ICsjZGVmaW5l IFJLODA2X1RSSU1fSUNPTVBfUkVHMgkJMHhEOQo+ICsjZGVmaW5lIFJLODA2X0VGVVNFX0NPTlRS T0xfUkVHSAkweERBCj4gKyNkZWZpbmUgUks4MDZfRlVTRV9QUk9HX1JFRwkJMHhEQgo+ICsjZGVm aW5lIFJLODA2X01BSU5fRlNNX1NUU19SRUcJCTB4REQKPiArI2RlZmluZSBSSzgwNl9GU01fUkVH CQkJMHhERQo+ICsjZGVmaW5lIFJLODA2X1RPUF9SRVNFVl9PRkZSCQkweEVDCj4gKyNkZWZpbmUg Uks4MDZfVE9QX1JFU0VWX1BPUgkJMHhFRAo+ICsjZGVmaW5lIFJLODA2X0JVQ0tfVlJTTl9SRUcx CQkweEVFCj4gKyNkZWZpbmUgUks4MDZfQlVDS19WUlNOX1JFRzIJCTB4RUYKPiArI2RlZmluZSBS SzgwNl9OTERPX1JMT0FEX1NFTF9SRUcxCTB4RjAKPiArI2RlZmluZSBSSzgwNl9QTERPX1JMT0FE X1NFTF9SRUcxCTB4RjEKPiArI2RlZmluZSBSSzgwNl9QTERPX1JMT0FEX1NFTF9SRUcyCTB4RjIK PiArI2RlZmluZSBSSzgwNl9CVUNLX0NNSU5fTVhfUkVHMQkJMHhGMwo+ICsjZGVmaW5lIFJLODA2 X0JVQ0tfQ01JTl9NWF9SRUcyCQkweEY0Cj4gKyNkZWZpbmUgUks4MDZfQlVDS19GUkVRX1NFVF9S RUcxCTB4RjUKPiArI2RlZmluZSBSSzgwNl9CVUNLX0ZSRVFfU0VUX1JFRzIJMHhGNgo+ICsjZGVm aW5lIFJLODA2X0JVQ0tfUlNfTUVBQlNfUkVHMQkweEY3Cj4gKyNkZWZpbmUgUks4MDZfQlVDS19S U19NRUFCU19SRUcyCTB4RjgKPiArI2RlZmluZSBSSzgwNl9CVUNLX1JTX1pETEVCX1JFRzEJMHhG OQo+ICsjZGVmaW5lIFJLODA2X0JVQ0tfUlNfWkRMRUJfUkVHMgkweEZBCj4gKyNkZWZpbmUgUks4 MDZfQlVDS19SU0VSVkVfUkVHMQkJMHhGQgo+ICsjZGVmaW5lIFJLODA2X0JVQ0tfUlNFUlZFX1JF RzIJCTB4RkMKPiArI2RlZmluZSBSSzgwNl9CVUNLX1JTRVJWRV9SRUczCQkweEZECj4gKyNkZWZp bmUgUks4MDZfQlVDS19SU0VSVkVfUkVHNAkJMHhGRQo+ICsjZGVmaW5lIFJLODA2X0JVQ0tfUlNF UlZFX1JFRzUJCTB4RkYKPiArCj4gKy8qIElOVF9TVFMgUmVnaXN0ZXIgZmllbGQgZGVmaW5pdGlv bnMgKi8KPiArI2RlZmluZSBSSzgwNl9JTlRfU1RTX1BXUk9OX0ZBTEwJQklUKDApCj4gKyNkZWZp bmUgUks4MDZfSU5UX1NUU19QV1JPTl9SSVNFCUJJVCgxKQo+ICsjZGVmaW5lIFJLODA2X0lOVF9T VFNfUFdST04JCUJJVCgyKQo+ICsjZGVmaW5lIFJLODA2X0lOVF9TVFNfUFdST05fTFAJCUJJVCgz KQo+ICsjZGVmaW5lIFJLODA2X0lOVF9TVFNfSE9URElFCQlCSVQoNCkKPiArI2RlZmluZSBSSzgw Nl9JTlRfU1RTX1ZEQ19SSVNFCQlCSVQoNSkKPiArI2RlZmluZSBSSzgwNl9JTlRfU1RTX1ZEQ19G QUxMCQlCSVQoNikKPiArI2RlZmluZSBSSzgwNl9JTlRfU1RTX1ZCX0xPCQlCSVQoNykKPiArI2Rl ZmluZSBSSzgwNl9JTlRfU1RTX1JFVjAJCUJJVCgwKQo+ICsjZGVmaW5lIFJLODA2X0lOVF9TVFNf UkVWMQkJQklUKDEpCj4gKyNkZWZpbmUgUks4MDZfSU5UX1NUU19SRVYyCQlCSVQoMikKPiArI2Rl ZmluZSBSSzgwNl9JTlRfU1RTX0NSQ19FUlJPUgkJQklUKDMpCj4gKyNkZWZpbmUgUks4MDZfSU5U X1NUU19TTFAzX0dQSU8JCUJJVCg0KQo+ICsjZGVmaW5lIFJLODA2X0lOVF9TVFNfU0xQMl9HUElP CQlCSVQoNSkKPiArI2RlZmluZSBSSzgwNl9JTlRfU1RTX1NMUDFfR1BJTwkJQklUKDYpCj4gKyNk ZWZpbmUgUks4MDZfSU5UX1NUU19XRFQJCUJJVCg3KQo+ICsKPiArLyogU1BJIGNvbW1hbmQgKi8K PiArI2RlZmluZSBSSzgwNl9DTURfUkVBRAkJCTAKPiArI2RlZmluZSBSSzgwNl9DTURfV1JJVEUJ CQlCSVQoNykKPiArI2RlZmluZSBSSzgwNl9DTURfQ1JDX0VOCQlCSVQoNikKPiArI2RlZmluZSBS SzgwNl9DTURfQ1JDX0RJUwkJMAo+ICsjZGVmaW5lIFJLODA2X0NNRF9MRU5fTVNLCQkweDBmCj4g KyNkZWZpbmUgUks4MDZfUkVHX0gJCQkweDAwCj4gKwo+ICsjZGVmaW5lIFZFUlNJT05fQUIJCTB4 MDEKPiArCj4gK2VudW0gcms4MDZfcmVnX2lkIHsKPiArCVJLODA2X0lEX0RDREMxID0gMCwKPiAr CVJLODA2X0lEX0RDREMyLAo+ICsJUks4MDZfSURfRENEQzMsCj4gKwlSSzgwNl9JRF9EQ0RDNCwK PiArCVJLODA2X0lEX0RDREM1LAo+ICsJUks4MDZfSURfRENEQzYsCj4gKwlSSzgwNl9JRF9EQ0RD NywKPiArCVJLODA2X0lEX0RDREM4LAo+ICsJUks4MDZfSURfRENEQzksCj4gKwlSSzgwNl9JRF9E Q0RDMTAsCj4gKwo+ICsJUks4MDZfSURfTkxETzEsCj4gKwlSSzgwNl9JRF9OTERPMiwKPiArCVJL ODA2X0lEX05MRE8zLAo+ICsJUks4MDZfSURfTkxETzQsCj4gKwlSSzgwNl9JRF9OTERPNSwKPiAr Cj4gKwlSSzgwNl9JRF9QTERPMSwKPiArCVJLODA2X0lEX1BMRE8yLAo+ICsJUks4MDZfSURfUExE TzMsCj4gKwlSSzgwNl9JRF9QTERPNCwKPiArCVJLODA2X0lEX1BMRE81LAo+ICsJUks4MDZfSURf UExETzYsCj4gKwlSSzgwNl9JRF9FTkQsCj4gK307Cj4gKwo+ICsvKiBEZWZpbmUgdGhlIFJLODA2 IElSUSBudW1iZXJzICovCj4gK2VudW0gcms4MDZfaXJxcyB7Cj4gKwkvKiBJTlRfU1RTMCByZWdp c3RlcnMgKi8KPiArCVJLODA2X0lSUV9QV1JPTl9GQUxMLAo+ICsJUks4MDZfSVJRX1BXUk9OX1JJ U0UsCj4gKwlSSzgwNl9JUlFfUFdST04sCj4gKwlSSzgwNl9JUlFfUFdST05fTFAsCj4gKwlSSzgw Nl9JUlFfSE9URElFLAo+ICsJUks4MDZfSVJRX1ZEQ19SSVNFLAo+ICsJUks4MDZfSVJRX1ZEQ19G QUxMLAo+ICsJUks4MDZfSVJRX1ZCX0xPLAo+ICsKPiArCS8qIElOVF9TVFMwIHJlZ2lzdGVycyAq Lwo+ICsJUks4MDZfSVJRX1JFVjAsCj4gKwlSSzgwNl9JUlFfUkVWMSwKPiArCVJLODA2X0lSUV9S RVYyLAo+ICsJUks4MDZfSVJRX0NSQ19FUlJPUiwKPiArCVJLODA2X0lSUV9TTFAzX0dQSU8sCj4g KwlSSzgwNl9JUlFfU0xQMl9HUElPLAo+ICsJUks4MDZfSVJRX1NMUDFfR1BJTywKPiArCVJLODA2 X0lSUV9XRFQsCj4gK307Cj4gKwo+ICsvKiBWQ0MxIExvdyBWb2x0YWdlIFRocmVzaG9sZCAqLwo+ ICtlbnVtIHJrODA2X2x2X3NlbCB7Cj4gKwlWQl9MT19TRUxfMjgwMCwKPiArCVZCX0xPX1NFTF8y OTAwLAo+ICsJVkJfTE9fU0VMXzMwMDAsCj4gKwlWQl9MT19TRUxfMzEwMCwKPiArCVZCX0xPX1NF TF8zMjAwLAo+ICsJVkJfTE9fU0VMXzMzMDAsCj4gKwlWQl9MT19TRUxfMzQwMCwKPiArCVZCX0xP X1NFTF8zNTAwLAo+ICt9Owo+ICsKPiArLyogU3lzdGVtIFNodXRkb3duIFZvbHRhZ2UgU2VsZWN0 ICovCj4gK2VudW0gcms4MDZfdXZfc2VsIHsKPiArCVZCX1VWX1NFTF8yNzAwLAo+ICsJVkJfVVZf U0VMXzI4MDAsCj4gKwlWQl9VVl9TRUxfMjkwMCwKPiArCVZCX1VWX1NFTF8zMDAwLAo+ICsJVkJf VVZfU0VMXzMxMDAsCj4gKwlWQl9VVl9TRUxfMzIwMCwKPiArCVZCX1VWX1NFTF8zMzAwLAo+ICsJ VkJfVVZfU0VMXzM0MDAsCj4gK307Cj4gKwo+ICsvKiBQaW4gRnVuY3Rpb24gKi8KPiArZW51bSBy azgwNl9wd3JjdHJsX2Z1biB7Cj4gKwlQV1JDVFJMX05VTExfRlVOLAo+ICsJUFdSQ1RSTF9TTFBf RlVOLAo+ICsJUFdSQ1RSTF9QT1dPRkZfRlVOLAo+ICsJUFdSQ1RSTF9SU1RfRlVOLAo+ICsJUFdS Q1RSTF9EVlNfRlVOLAo+ICsJUFdSQ1RSTF9HUElPX0ZVTiwKPiArfTsKPiArCj4gKy8qIFBpbiBQ b2xhcml0eSAqLwo+ICtlbnVtIHJrODA2X3Bpbl9sZXZlbCB7Cj4gKwlQT0xfTE9XLAo+ICsJUE9M X0hJR0gsCj4gK307Cj4gKwo+ICtlbnVtIHJrODA2X3ZzZWxfY3RyX3NlbCB7Cj4gKwlDVFJfQllf Tk9fRUZGRUNULAo+ICsJQ1RSX0JZX1BXUkNUUkwxLAo+ICsJQ1RSX0JZX1BXUkNUUkwyLAo+ICsJ Q1RSX0JZX1BXUkNUUkwzLAo+ICt9Owo+ICsKPiArZW51bSByazgwNl9kdnNfY3RyX3NlbCB7Cj4g KwlDVFJfU0VMX05PX0VGRkVDVCwKPiArCUNUUl9TRUxfRFZTX1NUQVJUMSwKPiArCUNUUl9TRUxf RFZTX1NUQVJUMiwKPiArCUNUUl9TRUxfRFZTX1NUQVJUMywKPiArfTsKPiArCj4gK2VudW0gcms4 MDZfcGluX2RyX3NlbCB7Cj4gKwlSSzgwNl9QSU5fSU5QVVQsCj4gKwlSSzgwNl9QSU5fT1VUUFVU LAo+ICt9Owo+ICsKPiArI2RlZmluZSBSSzgwNl9JTlRfUE9MX01TSwkJQklUKDEpCj4gKyNkZWZp bmUgUks4MDZfSU5UX1BPTF9ICQkJQklUKDEpCj4gKyNkZWZpbmUgUks4MDZfSU5UX1BPTF9MCQkJ MAo+ICsKPiArI2RlZmluZSBSSzgwNl9TTEFWRV9SRVNUQVJUX0ZVTl9NU0sJQklUKDEpCj4gKyNk ZWZpbmUgUks4MDZfU0xBVkVfUkVTVEFSVF9GVU5fRU4JQklUKDEpCj4gKyNkZWZpbmUgUks4MDZf U0xBVkVfUkVTVEFSVF9GVU5fT0ZGCTAKPiArCj4gKyNkZWZpbmUgUks4MDZfU1lTX0VOQjJfMk1f TVNLCQlCSVQoMSkKPiArI2RlZmluZSBSSzgwNl9TWVNfRU5CMl8yTV9FTgkJQklUKDEpCj4gKyNk ZWZpbmUgUks4MDZfU1lTX0VOQjJfMk1fT0ZGCQkwCj4gKwo+ICtlbnVtIHJrODA2X2ludF9mdW4g ewo+ICsJUks4MDZfSU5UX09OTFksCj4gKwlSSzgwNl9JTlRfQUROX1dLVVAsCj4gK307Cj4gKwo+ ICtlbnVtIHJrODA2X2R2c19tb2RlIHsKPiArCVJLODA2X0RWU19OT1RfU1VQUE9SVCwKPiArCVJL ODA2X0RWU19TVEFSVDEsCj4gKwlSSzgwNl9EVlNfU1RBUlQyLAo+ICsJUks4MDZfRFZTX1NUQVJU MywKPiArCVJLODA2X0RWU19QV1JDVFJMMSwKPiArCVJLODA2X0RWU19QV1JDVFJMMiwKPiArCVJL ODA2X0RWU19QV1JDVFJMMywKPiArCVJLODA2X0RWU19TVEFSVF9QV1JDVFIxLAo+ICsJUks4MDZf RFZTX1NUQVJUX1BXUkNUUjIsCj4gKwlSSzgwNl9EVlNfU1RBUlRfUFdSQ1RSMywKPiArCVJLODA2 X0RWU19FTkQsCj4gK307Cj4gKwo+ICAvKiBSSzgwOCBJUlEgRGVmaW5pdGlvbnMgKi8KPiAgI2Rl ZmluZSBSSzgwOF9JUlFfVk9VVF9MTwkwCj4gICNkZWZpbmUgUks4MDhfSVJRX1ZCX0xPCQkxCj4g QEAgLTc4MCw2ICsxMTg4LDcgQEAgZW51bSB7Cj4gIAo+ICBlbnVtIHsKPiAgCVJLODA1X0lEID0g MHg4MDUwLAo+ICsJUks4MDZfSUQgPSAweDgwNjAsCj4gIAlSSzgwOF9JRCA9IDB4MDAwMCwKPiAg CVJLODA5X0lEID0gMHg4MDkwLAo+ICAJUks4MTdfSUQgPSAweDgxNzAsCj4gLS0gCj4gMi4zOS4w Cj4gCgotLSAKTGVlIEpvbmVzIFvmnY7nkLzmlq9dCgpfX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fXwpMaW51eC1yb2NrY2hpcCBtYWlsaW5nIGxpc3QKTGludXgt cm9ja2NoaXBAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9t YWlsbWFuL2xpc3RpbmZvL2xpbnV4LXJvY2tjaGlwCg==