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=-6.7 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED 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 55785C48BD8 for ; Wed, 26 Jun 2019 12:29:46 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 1C1DB21670 for ; Wed, 26 Jun 2019 12:29:46 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726708AbfFZM3m convert rfc822-to-8bit (ORCPT ); Wed, 26 Jun 2019 08:29:42 -0400 Received: from gloria.sntech.de ([185.11.138.130]:52624 "EHLO gloria.sntech.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726387AbfFZM3l (ORCPT ); Wed, 26 Jun 2019 08:29:41 -0400 Received: from ip5f5a6320.dynamic.kabel-deutschland.de ([95.90.99.32] helo=phil.localnet) by gloria.sntech.de with esmtpsa (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.89) (envelope-from ) id 1hg73B-0001xX-Ke; Wed, 26 Jun 2019 14:29:21 +0200 From: Heiko Stuebner To: Tony Xie Cc: broonie@kernel.org, lee.jones@linaro.org, robh+dt@kernel.org, mark.rutland@arm.com, a.zummo@towertech.it, alexandre.belloni@bootlin.com, sboyd@kernel.org, linux-clk@vger.kernel.org, linux-rtc@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, chenjh@rock-chips.com, xsf@rock-chips.com, zhangqing@rock-chips.com, huangtao@rock-chips.com Subject: [PATCH v10.1 3/6] regulator: rk808: add RK809 and RK817 support. Date: Wed, 26 Jun 2019 14:29:18 +0200 Message-ID: <2530880.ZKY9jcxCHy@phil> In-Reply-To: <20190621103258.8154-4-tony.xie@rock-chips.com> References: <20190621103258.8154-1-tony.xie@rock-chips.com> <20190621103258.8154-4-tony.xie@rock-chips.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8BIT Content-Type: text/plain; charset="UTF-8" Sender: linux-clk-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-clk@vger.kernel.org Add support for the rk809 and rk817 regulator driver. Their specifications are as follows: 1. The RK809 and RK809 consist of 5 DCDCs, 9 LDOs and have the same registers for these components except dcdc5. 2. The dcdc5 is a boost dcdc for RK817 and is a buck for RK809. 3. The RK817 has one switch but The Rk809 has two. The output voltages are configurable and are meant to supply power to the main processor and other components. Signed-off-by: Tony Xie Acked-by: Lee Jones Acked-by: Mark Brown [rebased on top of 5.2-rc1] Signed-off-by: Heiko Stuebner --- Hi Lee, to maybe help that along as Tony is probably asleep right now, I just did the rebase of this patch on top of 5.2-rc1 . The other patches seemed to apply fine. drivers/regulator/Kconfig | 4 +- drivers/regulator/rk808-regulator.c | 646 ++++++++++++++++++++++++++-- include/linux/mfd/rk808.h | 3 + 3 files changed, 625 insertions(+), 28 deletions(-) diff --git a/drivers/regulator/Kconfig b/drivers/regulator/Kconfig index 6c37f0df9323..214a958ff3e5 100644 --- a/drivers/regulator/Kconfig +++ b/drivers/regulator/Kconfig @@ -762,11 +762,11 @@ config REGULATOR_RC5T583 outputs which can be controlled by i2c communication. config REGULATOR_RK808 - tristate "Rockchip RK805/RK808/RK818 Power regulators" + tristate "Rockchip RK805/RK808/RK809/RK817/RK818 Power regulators" depends on MFD_RK808 help Select this option to enable the power regulator of ROCKCHIP - PMIC RK805,RK808 and RK818. + PMIC RK805,RK809&RK817,RK808 and RK818. This driver supports the control of different power rails of device through regulator interface. The device supports multiple DCDC/LDO outputs which can be controlled by i2c communication. diff --git a/drivers/regulator/rk808-regulator.c b/drivers/regulator/rk808-regulator.c index 23713e16c286..e9b0bb996fc4 100644 --- a/drivers/regulator/rk808-regulator.c +++ b/drivers/regulator/rk808-regulator.c @@ -36,6 +36,12 @@ #define RK808_BUCK4_VSEL_MASK 0xf #define RK808_LDO_VSEL_MASK 0x1f +#define RK809_BUCK5_VSEL_MASK 0x7 + +#define RK817_LDO_VSEL_MASK 0x7f +#define RK817_BOOST_VSEL_MASK 0x7 +#define RK817_BUCK_VSEL_MASK 0x7f + #define RK818_BUCK_VSEL_MASK 0x3f #define RK818_BUCK4_VSEL_MASK 0x1f #define RK818_LDO_VSEL_MASK 0x1f @@ -65,30 +71,36 @@ /* max steps for increase voltage of Buck1/2, equal 100mv*/ #define MAX_STEPS_ONE_TIME 8 -#define RK805_DESC(_id, _match, _supply, _min, _max, _step, _vreg, \ - _vmask, _ereg, _emask, _etime) \ - [_id] = { \ - .name = (_match), \ - .supply_name = (_supply), \ - .of_match = of_match_ptr(_match), \ - .regulators_node = of_match_ptr("regulators"), \ - .type = REGULATOR_VOLTAGE, \ - .id = (_id), \ - .n_voltages = (((_max) - (_min)) / (_step) + 1), \ - .owner = THIS_MODULE, \ - .min_uV = (_min) * 1000, \ - .uV_step = (_step) * 1000, \ - .vsel_reg = (_vreg), \ - .vsel_mask = (_vmask), \ - .enable_reg = (_ereg), \ - .enable_mask = (_emask), \ - .enable_time = (_etime), \ - .ops = &rk805_reg_ops, \ +#define ENABLE_MASK(id) (BIT(id) | BIT(4 + (id))) +#define DISABLE_VAL(id) (BIT(4 + (id))) + +#define RK817_BOOST_DESC(_id, _match, _supply, _min, _max, _step, _vreg,\ + _vmask, _ereg, _emask, _enval, _disval, _etime, m_drop) \ + { \ + .name = (_match), \ + .supply_name = (_supply), \ + .of_match = of_match_ptr(_match), \ + .regulators_node = of_match_ptr("regulators"), \ + .type = REGULATOR_VOLTAGE, \ + .id = (_id), \ + .n_voltages = (((_max) - (_min)) / (_step) + 1), \ + .owner = THIS_MODULE, \ + .min_uV = (_min) * 1000, \ + .uV_step = (_step) * 1000, \ + .vsel_reg = (_vreg), \ + .vsel_mask = (_vmask), \ + .enable_reg = (_ereg), \ + .enable_mask = (_emask), \ + .enable_val = (_enval), \ + .disable_val = (_disval), \ + .enable_time = (_etime), \ + .min_dropout_uV = (m_drop) * 1000, \ + .ops = &rk817_boost_ops, \ } -#define RK8XX_DESC(_id, _match, _supply, _min, _max, _step, _vreg, \ - _vmask, _ereg, _emask, _etime) \ - [_id] = { \ +#define RK8XX_DESC_COM(_id, _match, _supply, _min, _max, _step, _vreg, \ + _vmask, _ereg, _emask, _enval, _disval, _etime, _ops) \ + { \ .name = (_match), \ .supply_name = (_supply), \ .of_match = of_match_ptr(_match), \ @@ -103,12 +115,30 @@ .vsel_mask = (_vmask), \ .enable_reg = (_ereg), \ .enable_mask = (_emask), \ + .enable_val = (_enval), \ + .disable_val = (_disval), \ .enable_time = (_etime), \ - .ops = &rk808_reg_ops, \ + .ops = _ops, \ } -#define RK8XX_DESC_SWITCH(_id, _match, _supply, _ereg, _emask) \ - [_id] = { \ +#define RK805_DESC(_id, _match, _supply, _min, _max, _step, _vreg, \ + _vmask, _ereg, _emask, _etime) \ + RK8XX_DESC_COM(_id, _match, _supply, _min, _max, _step, _vreg, \ + _vmask, _ereg, _emask, 0, 0, _etime, &rk805_reg_ops) + +#define RK8XX_DESC(_id, _match, _supply, _min, _max, _step, _vreg, \ + _vmask, _ereg, _emask, _etime) \ + RK8XX_DESC_COM(_id, _match, _supply, _min, _max, _step, _vreg, \ + _vmask, _ereg, _emask, 0, 0, _etime, &rk808_reg_ops) + +#define RK817_DESC(_id, _match, _supply, _min, _max, _step, _vreg, \ + _vmask, _ereg, _emask, _disval, _etime) \ + RK8XX_DESC_COM(_id, _match, _supply, _min, _max, _step, _vreg, \ + _vmask, _ereg, _emask, _emask, _disval, _etime, &rk817_reg_ops) + +#define RKXX_DESC_SWITCH_COM(_id, _match, _supply, _ereg, _emask, \ + _enval, _disval, _ops) \ + { \ .name = (_match), \ .supply_name = (_supply), \ .of_match = of_match_ptr(_match), \ @@ -117,10 +147,20 @@ .id = (_id), \ .enable_reg = (_ereg), \ .enable_mask = (_emask), \ + .enable_val = (_enval), \ + .disable_val = (_disval), \ .owner = THIS_MODULE, \ - .ops = &rk808_switch_ops \ + .ops = _ops \ } +#define RK817_DESC_SWITCH(_id, _match, _supply, _ereg, _emask, \ + _disval) \ + RKXX_DESC_SWITCH_COM(_id, _match, _supply, _ereg, _emask, \ + _emask, _disval, &rk817_switch_ops) + +#define RK8XX_DESC_SWITCH(_id, _match, _supply, _ereg, _emask) \ + RKXX_DESC_SWITCH_COM(_id, _match, _supply, _ereg, _emask, \ + 0, 0, &rk808_switch_ops) struct rk808_regulator_data { struct gpio_desc *dvs_gpio[2]; @@ -138,6 +178,51 @@ static const struct regulator_linear_range rk808_ldo3_voltage_ranges[] = { REGULATOR_LINEAR_RANGE(2500000, 15, 15, 0), }; +#define RK809_BUCK5_SEL_CNT (8) + +static const struct regulator_linear_range rk809_buck5_voltage_ranges[] = { + REGULATOR_LINEAR_RANGE(1500000, 0, 0, 0), + REGULATOR_LINEAR_RANGE(1800000, 1, 3, 200000), + REGULATOR_LINEAR_RANGE(2800000, 4, 5, 200000), + REGULATOR_LINEAR_RANGE(3300000, 6, 7, 300000), +}; + +#define RK817_BUCK1_MIN0 500000 +#define RK817_BUCK1_MAX0 1500000 + +#define RK817_BUCK1_MIN1 1600000 +#define RK817_BUCK1_MAX1 2400000 + +#define RK817_BUCK3_MAX1 3400000 + +#define RK817_BUCK1_STP0 12500 +#define RK817_BUCK1_STP1 100000 + +#define RK817_BUCK1_SEL0 ((RK817_BUCK1_MAX0 - RK817_BUCK1_MIN0) /\ + RK817_BUCK1_STP0) +#define RK817_BUCK1_SEL1 ((RK817_BUCK1_MAX1 - RK817_BUCK1_MIN1) /\ + RK817_BUCK1_STP1) + +#define RK817_BUCK3_SEL1 ((RK817_BUCK3_MAX1 - RK817_BUCK1_MIN1) /\ + RK817_BUCK1_STP1) + +#define RK817_BUCK1_SEL_CNT (RK817_BUCK1_SEL0 + RK817_BUCK1_SEL1 + 1) +#define RK817_BUCK3_SEL_CNT (RK817_BUCK1_SEL0 + RK817_BUCK3_SEL1 + 1) + +static const struct regulator_linear_range rk817_buck1_voltage_ranges[] = { + REGULATOR_LINEAR_RANGE(RK817_BUCK1_MIN0, 0, + RK817_BUCK1_SEL0, RK817_BUCK1_STP0), + REGULATOR_LINEAR_RANGE(RK817_BUCK1_MIN1, RK817_BUCK1_SEL0 + 1, + RK817_BUCK1_SEL_CNT, RK817_BUCK1_STP1), +}; + +static const struct regulator_linear_range rk817_buck3_voltage_ranges[] = { + REGULATOR_LINEAR_RANGE(RK817_BUCK1_MIN0, 0, + RK817_BUCK1_SEL0, RK817_BUCK1_STP0), + REGULATOR_LINEAR_RANGE(RK817_BUCK1_MIN1, RK817_BUCK1_SEL0 + 1, + RK817_BUCK3_SEL_CNT, RK817_BUCK1_STP1), +}; + static int rk808_buck1_2_get_voltage_sel_regmap(struct regulator_dev *rdev) { struct rk808_regulator_data *pdata = rdev_get_drvdata(rdev); @@ -289,6 +374,36 @@ static int rk808_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay) RK808_RAMP_RATE_MASK, ramp_value); } +/* + * RK817 RK809 + */ +static int rk817_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay) +{ + unsigned int ramp_value = RK817_RAMP_RATE_25MV_PER_US; + unsigned int reg = RK817_BUCK_CONFIG_REG(rdev_get_id(rdev)); + + switch (ramp_delay) { + case 0 ... 3000: + ramp_value = RK817_RAMP_RATE_3MV_PER_US; + break; + case 3001 ... 6300: + ramp_value = RK817_RAMP_RATE_6_3MV_PER_US; + break; + case 6301 ... 12500: + ramp_value = RK817_RAMP_RATE_12_5MV_PER_US; + break; + case 12501 ... 25000: + break; + default: + dev_warn(&rdev->dev, + "%s ramp_delay: %d not supported, setting 10000\n", + rdev->desc->name, ramp_delay); + } + + return regmap_update_bits(rdev->regmap, reg, + RK817_RAMP_RATE_MASK, ramp_value); +} + static int rk808_set_suspend_voltage(struct regulator_dev *rdev, int uv) { unsigned int reg; @@ -304,6 +419,21 @@ static int rk808_set_suspend_voltage(struct regulator_dev *rdev, int uv) sel); } +static int rk817_set_suspend_voltage(struct regulator_dev *rdev, int uv) +{ + unsigned int reg; + int sel = regulator_map_voltage_linear(rdev, uv, uv); + /* only ldo1~ldo9 */ + if (sel < 0) + return -EINVAL; + + reg = rdev->desc->vsel_reg + RK808_SLP_REG_OFFSET; + + return regmap_update_bits(rdev->regmap, reg, + rdev->desc->vsel_mask, + sel); +} + static int rk808_set_suspend_voltage_range(struct regulator_dev *rdev, int uv) { unsigned int reg; @@ -363,6 +493,131 @@ static int rk808_set_suspend_disable(struct regulator_dev *rdev) rdev->desc->enable_mask); } +static int rk817_set_suspend_enable_ctrl(struct regulator_dev *rdev, + unsigned int en) +{ + unsigned int reg; + int id = rdev_get_id(rdev); + unsigned int id_slp, msk, val; + + if (id >= RK817_ID_DCDC1 && id <= RK817_ID_DCDC4) + id_slp = id; + else if (id >= RK817_ID_LDO1 && id <= RK817_ID_LDO8) + id_slp = 8 + (id - RK817_ID_LDO1); + else if (id >= RK817_ID_LDO9 && id <= RK809_ID_SW2) + id_slp = 4 + (id - RK817_ID_LDO9); + else + return -EINVAL; + + reg = RK817_POWER_SLP_EN_REG(id_slp / 8); + + msk = BIT(id_slp % 8); + if (en) + val = msk; + else + val = 0; + + return regmap_update_bits(rdev->regmap, reg, msk, val); +} + +static int rk817_set_suspend_enable(struct regulator_dev *rdev) +{ + return rk817_set_suspend_enable_ctrl(rdev, 1); +} + +static int rk817_set_suspend_disable(struct regulator_dev *rdev) +{ + return rk817_set_suspend_enable_ctrl(rdev, 0); +} + +static int rk8xx_set_suspend_mode(struct regulator_dev *rdev, unsigned int mode) +{ + unsigned int reg; + + reg = rdev->desc->vsel_reg + RK808_SLP_REG_OFFSET; + + switch (mode) { + case REGULATOR_MODE_FAST: + return regmap_update_bits(rdev->regmap, reg, + PWM_MODE_MSK, FPWM_MODE); + case REGULATOR_MODE_NORMAL: + return regmap_update_bits(rdev->regmap, reg, + PWM_MODE_MSK, AUTO_PWM_MODE); + default: + dev_err(&rdev->dev, "do not support this mode\n"); + return -EINVAL; + } + + return 0; +} + +static int rk8xx_set_mode(struct regulator_dev *rdev, unsigned int mode) +{ + switch (mode) { + case REGULATOR_MODE_FAST: + return regmap_update_bits(rdev->regmap, rdev->desc->vsel_reg, + PWM_MODE_MSK, FPWM_MODE); + case REGULATOR_MODE_NORMAL: + return regmap_update_bits(rdev->regmap, rdev->desc->vsel_reg, + PWM_MODE_MSK, AUTO_PWM_MODE); + default: + dev_err(&rdev->dev, "do not support this mode\n"); + return -EINVAL; + } + + return 0; +} + +static unsigned int rk8xx_get_mode(struct regulator_dev *rdev) +{ + unsigned int val; + int err; + + err = regmap_read(rdev->regmap, rdev->desc->vsel_reg, &val); + if (err) + return err; + + if (val & FPWM_MODE) + return REGULATOR_MODE_FAST; + else + return REGULATOR_MODE_NORMAL; +} + +static int rk8xx_is_enabled_wmsk_regmap(struct regulator_dev *rdev) +{ + unsigned int val; + int ret; + + ret = regmap_read(rdev->regmap, rdev->desc->enable_reg, &val); + if (ret != 0) + return ret; + + /* add write mask bit */ + val |= (rdev->desc->enable_mask & 0xf0); + val &= rdev->desc->enable_mask; + + if (rdev->desc->enable_is_inverted) { + if (rdev->desc->enable_val) + return val != rdev->desc->enable_val; + return (val == 0); + } + if (rdev->desc->enable_val) + return val == rdev->desc->enable_val; + return val != 0; +} + +static unsigned int rk8xx_regulator_of_map_mode(unsigned int mode) +{ + switch (mode) { + case 1: + return REGULATOR_MODE_FAST; + case 2: + return REGULATOR_MODE_NORMAL; + default: + return -EINVAL; + } +} + static const struct regulator_ops rk805_reg_ops = { .list_voltage = regulator_list_voltage_linear, .map_voltage = regulator_map_voltage_linear, @@ -439,6 +694,71 @@ static const struct regulator_linear_range rk805_buck_1_2_voltage_ranges[] = { REGULATOR_LINEAR_RANGE(2300000, 63, 63, 0), }; +static struct regulator_ops rk809_buck5_ops_range = { + .list_voltage = regulator_list_voltage_linear_range, + .map_voltage = regulator_map_voltage_linear_range, + .get_voltage_sel = regulator_get_voltage_sel_regmap, + .set_voltage_sel = regulator_set_voltage_sel_regmap, + .set_voltage_time_sel = regulator_set_voltage_time_sel, + .enable = regulator_enable_regmap, + .disable = regulator_disable_regmap, + .is_enabled = rk8xx_is_enabled_wmsk_regmap, + .set_suspend_voltage = rk808_set_suspend_voltage_range, + .set_suspend_enable = rk817_set_suspend_enable, + .set_suspend_disable = rk817_set_suspend_disable, +}; + +static struct regulator_ops rk817_reg_ops = { + .list_voltage = regulator_list_voltage_linear, + .map_voltage = regulator_map_voltage_linear, + .get_voltage_sel = regulator_get_voltage_sel_regmap, + .set_voltage_sel = regulator_set_voltage_sel_regmap, + .enable = regulator_enable_regmap, + .disable = regulator_disable_regmap, + .is_enabled = rk8xx_is_enabled_wmsk_regmap, + .set_suspend_voltage = rk817_set_suspend_voltage, + .set_suspend_enable = rk817_set_suspend_enable, + .set_suspend_disable = rk817_set_suspend_disable, +}; + +static struct regulator_ops rk817_boost_ops = { + .list_voltage = regulator_list_voltage_linear, + .map_voltage = regulator_map_voltage_linear, + .get_voltage_sel = regulator_get_voltage_sel_regmap, + .set_voltage_sel = regulator_set_voltage_sel_regmap, + .enable = regulator_enable_regmap, + .disable = regulator_disable_regmap, + .is_enabled = rk8xx_is_enabled_wmsk_regmap, + .set_suspend_enable = rk817_set_suspend_enable, + .set_suspend_disable = rk817_set_suspend_disable, +}; + +static struct regulator_ops rk817_buck_ops_range = { + .list_voltage = regulator_list_voltage_linear_range, + .map_voltage = regulator_map_voltage_linear_range, + .get_voltage_sel = regulator_get_voltage_sel_regmap, + .set_voltage_sel = regulator_set_voltage_sel_regmap, + .set_voltage_time_sel = regulator_set_voltage_time_sel, + .enable = regulator_enable_regmap, + .disable = regulator_disable_regmap, + .is_enabled = rk8xx_is_enabled_wmsk_regmap, + .set_mode = rk8xx_set_mode, + .get_mode = rk8xx_get_mode, + .set_suspend_mode = rk8xx_set_suspend_mode, + .set_ramp_delay = rk817_set_ramp_delay, + .set_suspend_voltage = rk808_set_suspend_voltage_range, + .set_suspend_enable = rk817_set_suspend_enable, + .set_suspend_disable = rk817_set_suspend_disable, +}; + +static struct regulator_ops rk817_switch_ops = { + .enable = regulator_enable_regmap, + .disable = regulator_disable_regmap, + .is_enabled = rk8xx_is_enabled_wmsk_regmap, + .set_suspend_enable = rk817_set_suspend_enable, + .set_suspend_disable = rk817_set_suspend_disable, +}; + static const struct regulator_desc rk805_reg[] = { { .name = "DCDC_REG1", @@ -595,6 +915,271 @@ static const struct regulator_desc rk808_reg[] = { RK808_DCDC_EN_REG, BIT(6)), }; +static const struct regulator_desc rk809_reg[] = { + { + .name = "DCDC_REG1", + .supply_name = "vcc1", + .of_match = of_match_ptr("DCDC_REG1"), + .regulators_node = of_match_ptr("regulators"), + .id = RK817_ID_DCDC1, + .ops = &rk817_buck_ops_range, + .type = REGULATOR_VOLTAGE, + .n_voltages = RK817_BUCK1_SEL_CNT + 1, + .linear_ranges = rk817_buck1_voltage_ranges, + .n_linear_ranges = ARRAY_SIZE(rk817_buck1_voltage_ranges), + .vsel_reg = RK817_BUCK1_ON_VSEL_REG, + .vsel_mask = RK817_BUCK_VSEL_MASK, + .enable_reg = RK817_POWER_EN_REG(0), + .enable_mask = ENABLE_MASK(RK817_ID_DCDC1), + .enable_val = ENABLE_MASK(RK817_ID_DCDC1), + .disable_val = DISABLE_VAL(RK817_ID_DCDC1), + .of_map_mode = rk8xx_regulator_of_map_mode, + .owner = THIS_MODULE, + }, { + .name = "DCDC_REG2", + .supply_name = "vcc2", + .of_match = of_match_ptr("DCDC_REG2"), + .regulators_node = of_match_ptr("regulators"), + .id = RK817_ID_DCDC2, + .ops = &rk817_buck_ops_range, + .type = REGULATOR_VOLTAGE, + .n_voltages = RK817_BUCK1_SEL_CNT + 1, + .linear_ranges = rk817_buck1_voltage_ranges, + .n_linear_ranges = ARRAY_SIZE(rk817_buck1_voltage_ranges), + .vsel_reg = RK817_BUCK2_ON_VSEL_REG, + .vsel_mask = RK817_BUCK_VSEL_MASK, + .enable_reg = RK817_POWER_EN_REG(0), + .enable_mask = ENABLE_MASK(RK817_ID_DCDC2), + .enable_val = ENABLE_MASK(RK817_ID_DCDC2), + .disable_val = DISABLE_VAL(RK817_ID_DCDC2), + .of_map_mode = rk8xx_regulator_of_map_mode, + .owner = THIS_MODULE, + }, { + .name = "DCDC_REG3", + .supply_name = "vcc3", + .of_match = of_match_ptr("DCDC_REG3"), + .regulators_node = of_match_ptr("regulators"), + .id = RK817_ID_DCDC3, + .ops = &rk817_buck_ops_range, + .type = REGULATOR_VOLTAGE, + .n_voltages = RK817_BUCK1_SEL_CNT + 1, + .linear_ranges = rk817_buck1_voltage_ranges, + .n_linear_ranges = ARRAY_SIZE(rk817_buck1_voltage_ranges), + .vsel_reg = RK817_BUCK3_ON_VSEL_REG, + .vsel_mask = RK817_BUCK_VSEL_MASK, + .enable_reg = RK817_POWER_EN_REG(0), + .enable_mask = ENABLE_MASK(RK817_ID_DCDC3), + .enable_val = ENABLE_MASK(RK817_ID_DCDC3), + .disable_val = DISABLE_VAL(RK817_ID_DCDC3), + .of_map_mode = rk8xx_regulator_of_map_mode, + .owner = THIS_MODULE, + }, { + .name = "DCDC_REG4", + .supply_name = "vcc4", + .of_match = of_match_ptr("DCDC_REG4"), + .regulators_node = of_match_ptr("regulators"), + .id = RK817_ID_DCDC4, + .ops = &rk817_buck_ops_range, + .type = REGULATOR_VOLTAGE, + .n_voltages = RK817_BUCK3_SEL_CNT + 1, + .linear_ranges = rk817_buck3_voltage_ranges, + .n_linear_ranges = ARRAY_SIZE(rk817_buck3_voltage_ranges), + .vsel_reg = RK817_BUCK4_ON_VSEL_REG, + .vsel_mask = RK817_BUCK_VSEL_MASK, + .enable_reg = RK817_POWER_EN_REG(0), + .enable_mask = ENABLE_MASK(RK817_ID_DCDC4), + .enable_val = ENABLE_MASK(RK817_ID_DCDC4), + .disable_val = DISABLE_VAL(RK817_ID_DCDC4), + .of_map_mode = rk8xx_regulator_of_map_mode, + .owner = THIS_MODULE, + }, + { + .name = "DCDC_REG5", + .supply_name = "vcc9", + .of_match = of_match_ptr("DCDC_REG5"), + .regulators_node = of_match_ptr("regulators"), + .id = RK809_ID_DCDC5, + .ops = &rk809_buck5_ops_range, + .type = REGULATOR_VOLTAGE, + .n_voltages = RK809_BUCK5_SEL_CNT, + .linear_ranges = rk809_buck5_voltage_ranges, + .n_linear_ranges = ARRAY_SIZE(rk809_buck5_voltage_ranges), + .vsel_reg = RK809_BUCK5_CONFIG(0), + .vsel_mask = RK809_BUCK5_VSEL_MASK, + .enable_reg = RK817_POWER_EN_REG(3), + .enable_mask = ENABLE_MASK(1), + .enable_val = ENABLE_MASK(1), + .disable_val = DISABLE_VAL(1), + .of_map_mode = rk8xx_regulator_of_map_mode, + .owner = THIS_MODULE, + }, + RK817_DESC(RK817_ID_LDO1, "LDO_REG1", "vcc5", 600, 3400, 25, + RK817_LDO_ON_VSEL_REG(0), RK817_LDO_VSEL_MASK, + RK817_POWER_EN_REG(1), ENABLE_MASK(0), + DISABLE_VAL(0), 400), + RK817_DESC(RK817_ID_LDO2, "LDO_REG2", "vcc5", 600, 3400, 25, + RK817_LDO_ON_VSEL_REG(1), RK817_LDO_VSEL_MASK, + RK817_POWER_EN_REG(1), ENABLE_MASK(1), + DISABLE_VAL(1), 400), + RK817_DESC(RK817_ID_LDO3, "LDO_REG3", "vcc5", 600, 3400, 25, + RK817_LDO_ON_VSEL_REG(2), RK817_LDO_VSEL_MASK, + RK817_POWER_EN_REG(1), ENABLE_MASK(2), + DISABLE_VAL(2), 400), + RK817_DESC(RK817_ID_LDO4, "LDO_REG4", "vcc6", 600, 3400, 25, + RK817_LDO_ON_VSEL_REG(3), RK817_LDO_VSEL_MASK, + RK817_POWER_EN_REG(1), ENABLE_MASK(3), + DISABLE_VAL(3), 400), + RK817_DESC(RK817_ID_LDO5, "LDO_REG5", "vcc6", 600, 3400, 25, + RK817_LDO_ON_VSEL_REG(4), RK817_LDO_VSEL_MASK, + RK817_POWER_EN_REG(2), ENABLE_MASK(0), + DISABLE_VAL(0), 400), + RK817_DESC(RK817_ID_LDO6, "LDO_REG6", "vcc6", 600, 3400, 25, + RK817_LDO_ON_VSEL_REG(5), RK817_LDO_VSEL_MASK, + RK817_POWER_EN_REG(2), ENABLE_MASK(1), + DISABLE_VAL(1), 400), + RK817_DESC(RK817_ID_LDO7, "LDO_REG7", "vcc7", 600, 3400, 25, + RK817_LDO_ON_VSEL_REG(6), RK817_LDO_VSEL_MASK, + RK817_POWER_EN_REG(2), ENABLE_MASK(2), + DISABLE_VAL(2), 400), + RK817_DESC(RK817_ID_LDO8, "LDO_REG8", "vcc7", 600, 3400, 25, + RK817_LDO_ON_VSEL_REG(7), RK817_LDO_VSEL_MASK, + RK817_POWER_EN_REG(2), ENABLE_MASK(3), + DISABLE_VAL(3), 400), + RK817_DESC(RK817_ID_LDO9, "LDO_REG9", "vcc7", 600, 3400, 25, + RK817_LDO_ON_VSEL_REG(8), RK817_LDO_VSEL_MASK, + RK817_POWER_EN_REG(3), ENABLE_MASK(0), + DISABLE_VAL(0), 400), + RK817_DESC_SWITCH(RK809_ID_SW1, "SWITCH_REG1", "vcc9", + RK817_POWER_EN_REG(3), ENABLE_MASK(2), + DISABLE_VAL(2)), + RK817_DESC_SWITCH(RK809_ID_SW2, "SWITCH_REG2", "vcc8", + RK817_POWER_EN_REG(3), ENABLE_MASK(3), + DISABLE_VAL(3)), +}; + +static const struct regulator_desc rk817_reg[] = { + { + .name = "DCDC_REG1", + .supply_name = "vcc1", + .of_match = of_match_ptr("DCDC_REG1"), + .regulators_node = of_match_ptr("regulators"), + .id = RK817_ID_DCDC1, + .ops = &rk817_buck_ops_range, + .type = REGULATOR_VOLTAGE, + .n_voltages = RK817_BUCK1_SEL_CNT + 1, + .linear_ranges = rk817_buck1_voltage_ranges, + .n_linear_ranges = ARRAY_SIZE(rk817_buck1_voltage_ranges), + .vsel_reg = RK817_BUCK1_ON_VSEL_REG, + .vsel_mask = RK817_BUCK_VSEL_MASK, + .enable_reg = RK817_POWER_EN_REG(0), + .enable_mask = ENABLE_MASK(RK817_ID_DCDC1), + .enable_val = ENABLE_MASK(RK817_ID_DCDC1), + .disable_val = DISABLE_VAL(RK817_ID_DCDC1), + .of_map_mode = rk8xx_regulator_of_map_mode, + .owner = THIS_MODULE, + }, { + .name = "DCDC_REG2", + .supply_name = "vcc2", + .of_match = of_match_ptr("DCDC_REG2"), + .regulators_node = of_match_ptr("regulators"), + .id = RK817_ID_DCDC2, + .ops = &rk817_buck_ops_range, + .type = REGULATOR_VOLTAGE, + .n_voltages = RK817_BUCK1_SEL_CNT + 1, + .linear_ranges = rk817_buck1_voltage_ranges, + .n_linear_ranges = ARRAY_SIZE(rk817_buck1_voltage_ranges), + .vsel_reg = RK817_BUCK2_ON_VSEL_REG, + .vsel_mask = RK817_BUCK_VSEL_MASK, + .enable_reg = RK817_POWER_EN_REG(0), + .enable_mask = ENABLE_MASK(RK817_ID_DCDC2), + .enable_val = ENABLE_MASK(RK817_ID_DCDC2), + .disable_val = DISABLE_VAL(RK817_ID_DCDC2), + .of_map_mode = rk8xx_regulator_of_map_mode, + .owner = THIS_MODULE, + }, { + .name = "DCDC_REG3", + .supply_name = "vcc3", + .of_match = of_match_ptr("DCDC_REG3"), + .regulators_node = of_match_ptr("regulators"), + .id = RK817_ID_DCDC3, + .ops = &rk817_buck_ops_range, + .type = REGULATOR_VOLTAGE, + .n_voltages = RK817_BUCK1_SEL_CNT + 1, + .linear_ranges = rk817_buck1_voltage_ranges, + .n_linear_ranges = ARRAY_SIZE(rk817_buck1_voltage_ranges), + .vsel_reg = RK817_BUCK3_ON_VSEL_REG, + .vsel_mask = RK817_BUCK_VSEL_MASK, + .enable_reg = RK817_POWER_EN_REG(0), + .enable_mask = ENABLE_MASK(RK817_ID_DCDC3), + .enable_val = ENABLE_MASK(RK817_ID_DCDC3), + .disable_val = DISABLE_VAL(RK817_ID_DCDC3), + .of_map_mode = rk8xx_regulator_of_map_mode, + .owner = THIS_MODULE, + }, { + .name = "DCDC_REG4", + .supply_name = "vcc4", + .of_match = of_match_ptr("DCDC_REG4"), + .regulators_node = of_match_ptr("regulators"), + .id = RK817_ID_DCDC4, + .ops = &rk817_buck_ops_range, + .type = REGULATOR_VOLTAGE, + .n_voltages = RK817_BUCK3_SEL_CNT + 1, + .linear_ranges = rk817_buck3_voltage_ranges, + .n_linear_ranges = ARRAY_SIZE(rk817_buck3_voltage_ranges), + .vsel_reg = RK817_BUCK4_ON_VSEL_REG, + .vsel_mask = RK817_BUCK_VSEL_MASK, + .enable_reg = RK817_POWER_EN_REG(0), + .enable_mask = ENABLE_MASK(RK817_ID_DCDC4), + .enable_val = ENABLE_MASK(RK817_ID_DCDC4), + .disable_val = DISABLE_VAL(RK817_ID_DCDC4), + .of_map_mode = rk8xx_regulator_of_map_mode, + .owner = THIS_MODULE, + }, + RK817_DESC(RK817_ID_LDO1, "LDO_REG1", "vcc5", 600, 3400, 25, + RK817_LDO_ON_VSEL_REG(0), RK817_LDO_VSEL_MASK, + RK817_POWER_EN_REG(1), ENABLE_MASK(0), + DISABLE_VAL(0), 400), + RK817_DESC(RK817_ID_LDO2, "LDO_REG2", "vcc5", 600, 3400, 25, + RK817_LDO_ON_VSEL_REG(1), RK817_LDO_VSEL_MASK, + RK817_POWER_EN_REG(1), ENABLE_MASK(1), + DISABLE_VAL(1), 400), + RK817_DESC(RK817_ID_LDO3, "LDO_REG3", "vcc5", 600, 3400, 25, + RK817_LDO_ON_VSEL_REG(2), RK817_LDO_VSEL_MASK, + RK817_POWER_EN_REG(1), ENABLE_MASK(2), + DISABLE_VAL(2), 400), + RK817_DESC(RK817_ID_LDO4, "LDO_REG4", "vcc6", 600, 3400, 25, + RK817_LDO_ON_VSEL_REG(3), RK817_LDO_VSEL_MASK, + RK817_POWER_EN_REG(1), ENABLE_MASK(3), + DISABLE_VAL(3), 400), + RK817_DESC(RK817_ID_LDO5, "LDO_REG5", "vcc6", 600, 3400, 25, + RK817_LDO_ON_VSEL_REG(4), RK817_LDO_VSEL_MASK, + RK817_POWER_EN_REG(2), ENABLE_MASK(0), + DISABLE_VAL(0), 400), + RK817_DESC(RK817_ID_LDO6, "LDO_REG6", "vcc6", 600, 3400, 25, + RK817_LDO_ON_VSEL_REG(5), RK817_LDO_VSEL_MASK, + RK817_POWER_EN_REG(2), ENABLE_MASK(1), + DISABLE_VAL(1), 400), + RK817_DESC(RK817_ID_LDO7, "LDO_REG7", "vcc7", 600, 3400, 25, + RK817_LDO_ON_VSEL_REG(6), RK817_LDO_VSEL_MASK, + RK817_POWER_EN_REG(2), ENABLE_MASK(2), + DISABLE_VAL(2), 400), + RK817_DESC(RK817_ID_LDO8, "LDO_REG8", "vcc7", 600, 3400, 25, + RK817_LDO_ON_VSEL_REG(7), RK817_LDO_VSEL_MASK, + RK817_POWER_EN_REG(2), ENABLE_MASK(3), + DISABLE_VAL(3), 400), + RK817_DESC(RK817_ID_LDO9, "LDO_REG9", "vcc7", 600, 3400, 25, + RK817_LDO_ON_VSEL_REG(8), RK817_LDO_VSEL_MASK, + RK817_POWER_EN_REG(3), ENABLE_MASK(0), + DISABLE_VAL(0), 400), + RK817_BOOST_DESC(RK817_ID_BOOST, "BOOST", "vcc8", 4700, 5400, 100, + RK817_BOOST_OTG_CFG, RK817_BOOST_VSEL_MASK, + RK817_POWER_EN_REG(3), ENABLE_MASK(1), ENABLE_MASK(1), + DISABLE_VAL(1), 400, 3500 - 5400), + RK817_DESC_SWITCH(RK817_ID_BOOST_OTG_SW, "OTG_SWITCH", "vcc9", + RK817_POWER_EN_REG(3), ENABLE_MASK(2), + DISABLE_VAL(2)), +}; + static const struct regulator_desc rk818_reg[] = { { .name = "DCDC_REG1", @@ -765,6 +1350,14 @@ static int rk808_regulator_probe(struct platform_device *pdev) regulators = rk808_reg; nregulators = RK808_NUM_REGULATORS; break; + case RK809_ID: + regulators = rk809_reg; + nregulators = RK809_NUM_REGULATORS; + break; + case RK817_ID: + regulators = rk817_reg; + nregulators = RK817_NUM_REGULATORS; + break; case RK818_ID: regulators = rk818_reg; nregulators = RK818_NUM_REGULATORS; @@ -803,6 +1396,7 @@ static struct platform_driver rk808_regulator_driver = { module_platform_driver(rk808_regulator_driver); MODULE_DESCRIPTION("regulator driver for the RK805/RK808/RK818 series PMICs"); +MODULE_AUTHOR("Tony xie "); MODULE_AUTHOR("Chris Zhong "); MODULE_AUTHOR("Zhang Qing "); MODULE_AUTHOR("Wadim Egorov "); diff --git a/include/linux/mfd/rk808.h b/include/linux/mfd/rk808.h index 0fd9eedf3c20..2a9cd01691b2 100644 --- a/include/linux/mfd/rk808.h +++ b/include/linux/mfd/rk808.h @@ -396,7 +396,10 @@ enum rk805_reg { #define SHUTDOWN_FUN (0x2 << 2) #define SLEEP_FUN (0x1 << 2) #define RK8XX_ID_MSK 0xfff0 +#define PWM_MODE_MSK BIT(7) #define FPWM_MODE BIT(7) +#define AUTO_PWM_MODE 0 + enum rk817_reg_id { RK817_ID_DCDC1 = 0, RK817_ID_DCDC2, -- 2.20.1 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.8 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6927BC48BD3 for ; Wed, 26 Jun 2019 12:29:55 +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 3A9982063F for ; Wed, 26 Jun 2019 12:29:55 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="SVPsQEQi" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 3A9982063F Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=sntech.de Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=WK/ahGEO0Fg7mUqXnE4NVIWZUrgJtjcca4iaa5AU3EM=; b=SVPsQEQil1ERLO /yZKSSVZCPEPoCwFnSdY6kK6KelOmZVtVIcEisn9NP78JOBTjsPlHsBTR316sCP/lHXa0n9pgyaX3 3KcQVFdk4poP56cUXsXxTh2x1d3jckF26LuyVXkdS4TiA5NoDOnTulLlC8tNQAr6BYgB1iVEAmYlX Yf1AipvQfl9GUKOJtgEdwymG1NUYYkHTcN5JdYPPv0oKL03h9rGA9n2SA0oJv4YeTc4adEtvt3YrT IvisWLy7RytGGqQC+4K+g4ATVVWeffkmup0WPGlUWuJy5xw8iOgRAv438yqQoZDZfiK8vLLFK+0YA Nz7jB8iuQ25WlEvYSXdQ==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92 #3 (Red Hat Linux)) id 1hg73c-0001wm-3m; Wed, 26 Jun 2019 12:29:48 +0000 Received: from gloria.sntech.de ([185.11.138.130]) by bombadil.infradead.org with esmtps (Exim 4.92 #3 (Red Hat Linux)) id 1hg73X-0001uf-4F; Wed, 26 Jun 2019 12:29:46 +0000 Received: from ip5f5a6320.dynamic.kabel-deutschland.de ([95.90.99.32] helo=phil.localnet) by gloria.sntech.de with esmtpsa (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.89) (envelope-from ) id 1hg73B-0001xX-Ke; Wed, 26 Jun 2019 14:29:21 +0200 From: Heiko Stuebner To: Tony Xie Subject: [PATCH v10.1 3/6] regulator: rk808: add RK809 and RK817 support. Date: Wed, 26 Jun 2019 14:29:18 +0200 Message-ID: <2530880.ZKY9jcxCHy@phil> In-Reply-To: <20190621103258.8154-4-tony.xie@rock-chips.com> References: <20190621103258.8154-1-tony.xie@rock-chips.com> <20190621103258.8154-4-tony.xie@rock-chips.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20190626_052943_586848_6D95E577 X-CRM114-Status: GOOD ( 16.90 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: mark.rutland@arm.com, a.zummo@towertech.it, alexandre.belloni@bootlin.com, huangtao@rock-chips.com, devicetree@vger.kernel.org, sboyd@kernel.org, zhangqing@rock-chips.com, linux-kernel@vger.kernel.org, robh+dt@kernel.org, xsf@rock-chips.com, linux-rockchip@lists.infradead.org, broonie@kernel.org, chenjh@rock-chips.com, lee.jones@linaro.org, linux-clk@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rtc@vger.kernel.org Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org ICAgIEFkZCBzdXBwb3J0IGZvciB0aGUgcms4MDkgYW5kIHJrODE3IHJlZ3VsYXRvciBkcml2ZXIu CiAgICBUaGVpciBzcGVjaWZpY2F0aW9ucyBhcmUgYXMgZm9sbG93c++8mgogICAgMS4gVGhlIFJL ODA5IGFuZCBSSzgwOSBjb25zaXN0IG9mIDUgRENEQ3MsIDkgTERPcwogICAgICAgYW5kIGhhdmUg dGhlIHNhbWUgcmVnaXN0ZXJzIGZvciB0aGVzZSBjb21wb25lbnRzIGV4Y2VwdCBkY2RjNS4KICAg IDIuIFRoZSBkY2RjNSBpcyBhIGJvb3N0IGRjZGMgZm9yIFJLODE3IGFuZCBpcyBhIGJ1Y2sgZm9y IFJLODA5LgogICAgMy4gVGhlIFJLODE3IGhhcyBvbmUgc3dpdGNoIGJ1dCBUaGUgUms4MDkgaGFz IHR3by4KCiAgICBUaGUgb3V0cHV0IHZvbHRhZ2VzIGFyZSBjb25maWd1cmFibGUgYW5kIGFyZSBt ZWFudCB0byBzdXBwbHkgcG93ZXIKICAgIHRvIHRoZSBtYWluIHByb2Nlc3NvciBhbmQgb3RoZXIg Y29tcG9uZW50cy4KClNpZ25lZC1vZmYtYnk6IFRvbnkgWGllIDx0b255LnhpZUByb2NrLWNoaXBz LmNvbT4KQWNrZWQtYnk6IExlZSBKb25lcyA8bGVlLmpvbmVzQGxpbmFyby5vcmc+CkFja2VkLWJ5 OiBNYXJrIEJyb3duIDxicm9vbmllQGtlcm5lbC5vcmc+CltyZWJhc2VkIG9uIHRvcCBvZiA1LjIt cmMxXQpTaWduZWQtb2ZmLWJ5OiBIZWlrbyBTdHVlYm5lciA8aGVpa29Ac250ZWNoLmRlPgotLS0K SGkgTGVlLAoKdG8gbWF5YmUgaGVscCB0aGF0IGFsb25nIGFzIFRvbnkgaXMgcHJvYmFibHkgYXNs ZWVwIHJpZ2h0IG5vdywKSSBqdXN0IGRpZCB0aGUgcmViYXNlIG9mIHRoaXMgcGF0Y2ggb24gdG9w IG9mIDUuMi1yYzEgLgoKVGhlIG90aGVyIHBhdGNoZXMgc2VlbWVkIHRvIGFwcGx5IGZpbmUuCgog ZHJpdmVycy9yZWd1bGF0b3IvS2NvbmZpZyAgICAgICAgICAgfCAgIDQgKy0KIGRyaXZlcnMvcmVn dWxhdG9yL3JrODA4LXJlZ3VsYXRvci5jIHwgNjQ2ICsrKysrKysrKysrKysrKysrKysrKysrKysr LS0KIGluY2x1ZGUvbGludXgvbWZkL3JrODA4LmggICAgICAgICAgIHwgICAzICsKIDMgZmlsZXMg Y2hhbmdlZCwgNjI1IGluc2VydGlvbnMoKyksIDI4IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBh L2RyaXZlcnMvcmVndWxhdG9yL0tjb25maWcgYi9kcml2ZXJzL3JlZ3VsYXRvci9LY29uZmlnCmlu ZGV4IDZjMzdmMGRmOTMyMy4uMjE0YTk1OGZmM2U1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3Vs YXRvci9LY29uZmlnCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL0tjb25maWcKQEAgLTc2MiwxMSAr NzYyLDExIEBAIGNvbmZpZyBSRUdVTEFUT1JfUkM1VDU4MwogCSAgb3V0cHV0cyB3aGljaCBjYW4g YmUgY29udHJvbGxlZCBieSBpMmMgY29tbXVuaWNhdGlvbi4KIAogY29uZmlnIFJFR1VMQVRPUl9S SzgwOAotCXRyaXN0YXRlICJSb2NrY2hpcCBSSzgwNS9SSzgwOC9SSzgxOCBQb3dlciByZWd1bGF0 b3JzIgorCXRyaXN0YXRlICJSb2NrY2hpcCBSSzgwNS9SSzgwOC9SSzgwOS9SSzgxNy9SSzgxOCBQ b3dlciByZWd1bGF0b3JzIgogCWRlcGVuZHMgb24gTUZEX1JLODA4CiAJaGVscAogCSAgU2VsZWN0 IHRoaXMgb3B0aW9uIHRvIGVuYWJsZSB0aGUgcG93ZXIgcmVndWxhdG9yIG9mIFJPQ0tDSElQCi0J ICBQTUlDIFJLODA1LFJLODA4IGFuZCBSSzgxOC4KKwkgIFBNSUMgUks4MDUsUks4MDkmUks4MTcs Uks4MDggYW5kIFJLODE4LgogCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIGNvbnRyb2wgb2Yg ZGlmZmVyZW50IHBvd2VyIHJhaWxzIG9mIGRldmljZQogCSAgdGhyb3VnaCByZWd1bGF0b3IgaW50 ZXJmYWNlLiBUaGUgZGV2aWNlIHN1cHBvcnRzIG11bHRpcGxlIERDREMvTERPCiAJICBvdXRwdXRz IHdoaWNoIGNhbiBiZSBjb250cm9sbGVkIGJ5IGkyYyBjb21tdW5pY2F0aW9uLgpkaWZmIC0tZ2l0 IGEvZHJpdmVycy9yZWd1bGF0b3Ivcms4MDgtcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRv ci9yazgwOC1yZWd1bGF0b3IuYwppbmRleCAyMzcxM2UxNmMyODYuLmU5YjBiYjk5NmZjNCAxMDA2 NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3Ivcms4MDgtcmVndWxhdG9yLmMKKysrIGIvZHJpdmVy cy9yZWd1bGF0b3Ivcms4MDgtcmVndWxhdG9yLmMKQEAgLTM2LDYgKzM2LDEyIEBACiAjZGVmaW5l IFJLODA4X0JVQ0s0X1ZTRUxfTUFTSwkweGYKICNkZWZpbmUgUks4MDhfTERPX1ZTRUxfTUFTSwkw eDFmCiAKKyNkZWZpbmUgUks4MDlfQlVDSzVfVlNFTF9NQVNLCQkweDcKKworI2RlZmluZSBSSzgx N19MRE9fVlNFTF9NQVNLCQkweDdmCisjZGVmaW5lIFJLODE3X0JPT1NUX1ZTRUxfTUFTSwkJMHg3 CisjZGVmaW5lIFJLODE3X0JVQ0tfVlNFTF9NQVNLCQkweDdmCisKICNkZWZpbmUgUks4MThfQlVD S19WU0VMX01BU0sJCTB4M2YKICNkZWZpbmUgUks4MThfQlVDSzRfVlNFTF9NQVNLCQkweDFmCiAj ZGVmaW5lIFJLODE4X0xET19WU0VMX01BU0sJCTB4MWYKQEAgLTY1LDMwICs3MSwzNiBAQAogLyog bWF4IHN0ZXBzIGZvciBpbmNyZWFzZSB2b2x0YWdlIG9mIEJ1Y2sxLzIsIGVxdWFsIDEwMG12Ki8K ICNkZWZpbmUgTUFYX1NURVBTX09ORV9USU1FIDgKIAotI2RlZmluZSBSSzgwNV9ERVNDKF9pZCwg X21hdGNoLCBfc3VwcGx5LCBfbWluLCBfbWF4LCBfc3RlcCwgX3ZyZWcsICAgICAgXAotCV92bWFz aywgX2VyZWcsIF9lbWFzaywgX2V0aW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBcCi0JW19pZF0gPSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIFwKLQkJLm5hbWUgICAgICAgICAgID0gKF9tYXRjaCksICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBcCi0JCS5zdXBwbHlfbmFtZSAgICA9IChfc3VwcGx5KSwgICAgICAg ICAgICAgICAgICAgICAgICAgICAgXAotCQkub2ZfbWF0Y2ggICAgICAgPSBvZl9tYXRjaF9wdHIo X21hdGNoKSwgICAgICAgICAgICAgICAgIFwKLQkJLnJlZ3VsYXRvcnNfbm9kZSA9IG9mX21hdGNo X3B0cigicmVndWxhdG9ycyIpLCAgICAgICAgICBcCi0JCS50eXBlICAgICAgICAgICA9IFJFR1VM QVRPUl9WT0xUQUdFLCAgICAgICAgICAgICAgICAgICAgXAotCQkuaWQgICAgICAgICAgICAgPSAo X2lkKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJLm5fdm9sdGFnZXMgICAg ID0gKCgoX21heCkgLSAoX21pbikpIC8gKF9zdGVwKSArIDEpLCAgICBcCi0JCS5vd25lciAgICAg ICAgICA9IFRISVNfTU9EVUxFLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkubWluX3VW ICAgICAgICAgPSAoX21pbikgKiAxMDAwLCAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJLnVW X3N0ZXAgICAgICAgID0gKF9zdGVwKSAqIDEwMDAsICAgICAgICAgICAgICAgICAgICAgICBcCi0J CS52c2VsX3JlZyAgICAgICA9IChfdnJlZyksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg XAotCQkudnNlbF9tYXNrICAgICAgPSAoX3ZtYXNrKSwgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIFwKLQkJLmVuYWJsZV9yZWcgICAgID0gKF9lcmVnKSwgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBcCi0JCS5lbmFibGVfbWFzayAgICA9IChfZW1hc2spLCAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgXAotCQkuZW5hYmxlX3RpbWUgICAgPSAoX2V0aW1lKSwgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIFwKLQkJLm9wcyAgICAgICAgICAgID0gJnJrODA1X3JlZ19vcHMsICAg ICAgICAgICAgICAgICAgICAgICBcCisjZGVmaW5lIEVOQUJMRV9NQVNLKGlkKQkJCShCSVQoaWQp IHwgQklUKDQgKyAoaWQpKSkKKyNkZWZpbmUgRElTQUJMRV9WQUwoaWQpCQkJKEJJVCg0ICsgKGlk KSkpCisKKyNkZWZpbmUgUks4MTdfQk9PU1RfREVTQyhfaWQsIF9tYXRjaCwgX3N1cHBseSwgX21p biwgX21heCwgX3N0ZXAsIF92cmVnLFwKKwlfdm1hc2ssIF9lcmVnLCBfZW1hc2ssIF9lbnZhbCwg X2Rpc3ZhbCwgX2V0aW1lLCBtX2Ryb3ApCQlcCisJewkJCQkJCQlcCisJCS5uYW1lCQk9IChfbWF0 Y2gpLAkJCQlcCisJCS5zdXBwbHlfbmFtZQk9IChfc3VwcGx5KSwJCQkJXAorCQkub2ZfbWF0Y2gJ PSBvZl9tYXRjaF9wdHIoX21hdGNoKSwJCQlcCisJCS5yZWd1bGF0b3JzX25vZGUgPSBvZl9tYXRj aF9wdHIoInJlZ3VsYXRvcnMiKSwJCVwKKwkJLnR5cGUJCT0gUkVHVUxBVE9SX1ZPTFRBR0UsCQkJ XAorCQkuaWQJCT0gKF9pZCksCQkJCVwKKwkJLm5fdm9sdGFnZXMJPSAoKChfbWF4KSAtIChfbWlu KSkgLyAoX3N0ZXApICsgMSksCVwKKwkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAkJCQlcCisJCS5t aW5fdVYJCT0gKF9taW4pICogMTAwMCwJCQlcCisJCS51Vl9zdGVwCT0gKF9zdGVwKSAqIDEwMDAs CQkJXAorCQkudnNlbF9yZWcJPSAoX3ZyZWcpLAkJCQlcCisJCS52c2VsX21hc2sJPSAoX3ZtYXNr KSwJCQkJXAorCQkuZW5hYmxlX3JlZwk9IChfZXJlZyksCQkJCVwKKwkJLmVuYWJsZV9tYXNrCT0g KF9lbWFzayksCQkJCVwKKwkJLmVuYWJsZV92YWwgICAgID0gKF9lbnZhbCksCQkJCVwKKwkJLmRp c2FibGVfdmFsICAgICA9IChfZGlzdmFsKSwJCQkJXAorCQkuZW5hYmxlX3RpbWUJPSAoX2V0aW1l KSwJCQkJXAorCQkubWluX2Ryb3BvdXRfdVYgPSAobV9kcm9wKSAqIDEwMDAsCQkJXAorCQkub3Bz CQk9ICZyazgxN19ib29zdF9vcHMsCQkJXAogCX0KIAotI2RlZmluZSBSSzhYWF9ERVNDKF9pZCwg X21hdGNoLCBfc3VwcGx5LCBfbWluLCBfbWF4LCBfc3RlcCwgX3ZyZWcsCVwKLQlfdm1hc2ssIF9l cmVnLCBfZW1hc2ssIF9ldGltZSkJCQkJCVwKLQlbX2lkXSA9IHsJCQkJCQkJXAorI2RlZmluZSBS SzhYWF9ERVNDX0NPTShfaWQsIF9tYXRjaCwgX3N1cHBseSwgX21pbiwgX21heCwgX3N0ZXAsIF92 cmVnLAlcCisJX3ZtYXNrLCBfZXJlZywgX2VtYXNrLCBfZW52YWwsIF9kaXN2YWwsIF9ldGltZSwg X29wcykJCVwKKwl7CQkJCQkJCQlcCiAJCS5uYW1lCQk9IChfbWF0Y2gpLAkJCQlcCiAJCS5zdXBw bHlfbmFtZQk9IChfc3VwcGx5KSwJCQkJXAogCQkub2ZfbWF0Y2gJPSBvZl9tYXRjaF9wdHIoX21h dGNoKSwJCQlcCkBAIC0xMDMsMTIgKzExNSwzMCBAQAogCQkudnNlbF9tYXNrCT0gKF92bWFzayks CQkJCVwKIAkJLmVuYWJsZV9yZWcJPSAoX2VyZWcpLAkJCQlcCiAJCS5lbmFibGVfbWFzawk9IChf ZW1hc2spLAkJCQlcCisJCS5lbmFibGVfdmFsICAgICA9IChfZW52YWwpLAkJCQlcCisJCS5kaXNh YmxlX3ZhbCAgICAgPSAoX2Rpc3ZhbCksCQkJCVwKIAkJLmVuYWJsZV90aW1lCT0gKF9ldGltZSks CQkJCVwKLQkJLm9wcwkJPSAmcms4MDhfcmVnX29wcywJCQlcCisJCS5vcHMJCT0gX29wcywJCQlc CiAJfQogCi0jZGVmaW5lIFJLOFhYX0RFU0NfU1dJVENIKF9pZCwgX21hdGNoLCBfc3VwcGx5LCBf ZXJlZywgX2VtYXNrKQkJXAotCVtfaWRdID0gewkJCQkJCQlcCisjZGVmaW5lIFJLODA1X0RFU0Mo X2lkLCBfbWF0Y2gsIF9zdXBwbHksIF9taW4sIF9tYXgsIF9zdGVwLCBfdnJlZywJXAorCV92bWFz aywgX2VyZWcsIF9lbWFzaywgX2V0aW1lKQkJCQkJXAorCVJLOFhYX0RFU0NfQ09NKF9pZCwgX21h dGNoLCBfc3VwcGx5LCBfbWluLCBfbWF4LCBfc3RlcCwgX3ZyZWcsCVwKKwlfdm1hc2ssIF9lcmVn LCBfZW1hc2ssIDAsIDAsIF9ldGltZSwgJnJrODA1X3JlZ19vcHMpCisKKyNkZWZpbmUgUks4WFhf REVTQyhfaWQsIF9tYXRjaCwgX3N1cHBseSwgX21pbiwgX21heCwgX3N0ZXAsIF92cmVnLAlcCisJ X3ZtYXNrLCBfZXJlZywgX2VtYXNrLCBfZXRpbWUpCQkJCQlcCisJUks4WFhfREVTQ19DT00oX2lk LCBfbWF0Y2gsIF9zdXBwbHksIF9taW4sIF9tYXgsIF9zdGVwLCBfdnJlZywJXAorCV92bWFzaywg X2VyZWcsIF9lbWFzaywgMCwgMCwgX2V0aW1lLCAmcms4MDhfcmVnX29wcykKKworI2RlZmluZSBS SzgxN19ERVNDKF9pZCwgX21hdGNoLCBfc3VwcGx5LCBfbWluLCBfbWF4LCBfc3RlcCwgX3ZyZWcs CVwKKwlfdm1hc2ssIF9lcmVnLCBfZW1hc2ssIF9kaXN2YWwsIF9ldGltZSkJCQkJXAorCVJLOFhY X0RFU0NfQ09NKF9pZCwgX21hdGNoLCBfc3VwcGx5LCBfbWluLCBfbWF4LCBfc3RlcCwgX3ZyZWcs CVwKKwlfdm1hc2ssIF9lcmVnLCBfZW1hc2ssIF9lbWFzaywgX2Rpc3ZhbCwgX2V0aW1lLCAmcms4 MTdfcmVnX29wcykKKworI2RlZmluZSBSS1hYX0RFU0NfU1dJVENIX0NPTShfaWQsIF9tYXRjaCwg X3N1cHBseSwgX2VyZWcsIF9lbWFzaywJXAorCV9lbnZhbCwgX2Rpc3ZhbCwgX29wcykJCQkJCQlc CisJewkJCQkJCQkJXAogCQkubmFtZQkJPSAoX21hdGNoKSwJCQkJXAogCQkuc3VwcGx5X25hbWUJ PSAoX3N1cHBseSksCQkJCVwKIAkJLm9mX21hdGNoCT0gb2ZfbWF0Y2hfcHRyKF9tYXRjaCksCQkJ XApAQCAtMTE3LDEwICsxNDcsMjAgQEAKIAkJLmlkCQk9IChfaWQpLAkJCQlcCiAJCS5lbmFibGVf cmVnCT0gKF9lcmVnKSwJCQkJXAogCQkuZW5hYmxlX21hc2sJPSAoX2VtYXNrKSwJCQkJXAorCQku ZW5hYmxlX3ZhbCAgICAgPSAoX2VudmFsKSwJCQkJXAorCQkuZGlzYWJsZV92YWwgICAgID0gKF9k aXN2YWwpLAkJCQlcCiAJCS5vd25lcgkJPSBUSElTX01PRFVMRSwJCQkJXAotCQkub3BzCQk9ICZy azgwOF9zd2l0Y2hfb3BzCQkJXAorCQkub3BzCQk9IF9vcHMJCQkJCVwKIAl9CiAKKyNkZWZpbmUg Uks4MTdfREVTQ19TV0lUQ0goX2lkLCBfbWF0Y2gsIF9zdXBwbHksIF9lcmVnLCBfZW1hc2ssCQlc CisJX2Rpc3ZhbCkJCQkJCQkJXAorCVJLWFhfREVTQ19TV0lUQ0hfQ09NKF9pZCwgX21hdGNoLCBf c3VwcGx5LCBfZXJlZywgX2VtYXNrLAlcCisJX2VtYXNrLCBfZGlzdmFsLCAmcms4MTdfc3dpdGNo X29wcykKKworI2RlZmluZSBSSzhYWF9ERVNDX1NXSVRDSChfaWQsIF9tYXRjaCwgX3N1cHBseSwg X2VyZWcsIF9lbWFzaykJCVwKKwlSS1hYX0RFU0NfU1dJVENIX0NPTShfaWQsIF9tYXRjaCwgX3N1 cHBseSwgX2VyZWcsIF9lbWFzaywJXAorCTAsIDAsICZyazgwOF9zd2l0Y2hfb3BzKQogCiBzdHJ1 Y3Qgcms4MDhfcmVndWxhdG9yX2RhdGEgewogCXN0cnVjdCBncGlvX2Rlc2MgKmR2c19ncGlvWzJd OwpAQCAtMTM4LDYgKzE3OCw1MSBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ3VsYXRvcl9saW5l YXJfcmFuZ2Ugcms4MDhfbGRvM192b2x0YWdlX3Jhbmdlc1tdID0gewogCVJFR1VMQVRPUl9MSU5F QVJfUkFOR0UoMjUwMDAwMCwgMTUsIDE1LCAwKSwKIH07CiAKKyNkZWZpbmUgUks4MDlfQlVDSzVf U0VMX0NOVAkJKDgpCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVndWxhdG9yX2xpbmVhcl9yYW5n ZSByazgwOV9idWNrNV92b2x0YWdlX3Jhbmdlc1tdID0geworCVJFR1VMQVRPUl9MSU5FQVJfUkFO R0UoMTUwMDAwMCwgMCwgMCwgMCksCisJUkVHVUxBVE9SX0xJTkVBUl9SQU5HRSgxODAwMDAwLCAx LCAzLCAyMDAwMDApLAorCVJFR1VMQVRPUl9MSU5FQVJfUkFOR0UoMjgwMDAwMCwgNCwgNSwgMjAw MDAwKSwKKwlSRUdVTEFUT1JfTElORUFSX1JBTkdFKDMzMDAwMDAsIDYsIDcsIDMwMDAwMCksCit9 OworCisjZGVmaW5lIFJLODE3X0JVQ0sxX01JTjAgNTAwMDAwCisjZGVmaW5lIFJLODE3X0JVQ0sx X01BWDAgMTUwMDAwMAorCisjZGVmaW5lIFJLODE3X0JVQ0sxX01JTjEgMTYwMDAwMAorI2RlZmlu ZSBSSzgxN19CVUNLMV9NQVgxIDI0MDAwMDAKKworI2RlZmluZSBSSzgxN19CVUNLM19NQVgxIDM0 MDAwMDAKKworI2RlZmluZSBSSzgxN19CVUNLMV9TVFAwIDEyNTAwCisjZGVmaW5lIFJLODE3X0JV Q0sxX1NUUDEgMTAwMDAwCisKKyNkZWZpbmUgUks4MTdfQlVDSzFfU0VMMCAoKFJLODE3X0JVQ0sx X01BWDAgLSBSSzgxN19CVUNLMV9NSU4wKSAvXAorCQkJCQkJICBSSzgxN19CVUNLMV9TVFAwKQor I2RlZmluZSBSSzgxN19CVUNLMV9TRUwxICgoUks4MTdfQlVDSzFfTUFYMSAtIFJLODE3X0JVQ0sx X01JTjEpIC9cCisJCQkJCQkgIFJLODE3X0JVQ0sxX1NUUDEpCisKKyNkZWZpbmUgUks4MTdfQlVD SzNfU0VMMSAoKFJLODE3X0JVQ0szX01BWDEgLSBSSzgxN19CVUNLMV9NSU4xKSAvXAorCQkJCQkJ ICBSSzgxN19CVUNLMV9TVFAxKQorCisjZGVmaW5lIFJLODE3X0JVQ0sxX1NFTF9DTlQgKFJLODE3 X0JVQ0sxX1NFTDAgKyBSSzgxN19CVUNLMV9TRUwxICsgMSkKKyNkZWZpbmUgUks4MTdfQlVDSzNf U0VMX0NOVCAoUks4MTdfQlVDSzFfU0VMMCArIFJLODE3X0JVQ0szX1NFTDEgKyAxKQorCitzdGF0 aWMgY29uc3Qgc3RydWN0IHJlZ3VsYXRvcl9saW5lYXJfcmFuZ2Ugcms4MTdfYnVjazFfdm9sdGFn ZV9yYW5nZXNbXSA9IHsKKwlSRUdVTEFUT1JfTElORUFSX1JBTkdFKFJLODE3X0JVQ0sxX01JTjAs IDAsCisJCQkgICAgICAgUks4MTdfQlVDSzFfU0VMMCwgUks4MTdfQlVDSzFfU1RQMCksCisJUkVH VUxBVE9SX0xJTkVBUl9SQU5HRShSSzgxN19CVUNLMV9NSU4xLCBSSzgxN19CVUNLMV9TRUwwICsg MSwKKwkJCSAgICAgICBSSzgxN19CVUNLMV9TRUxfQ05ULCBSSzgxN19CVUNLMV9TVFAxKSwKK307 CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVndWxhdG9yX2xpbmVhcl9yYW5nZSByazgxN19idWNr M192b2x0YWdlX3Jhbmdlc1tdID0geworCVJFR1VMQVRPUl9MSU5FQVJfUkFOR0UoUks4MTdfQlVD SzFfTUlOMCwgMCwKKwkJCSAgICAgICBSSzgxN19CVUNLMV9TRUwwLCBSSzgxN19CVUNLMV9TVFAw KSwKKwlSRUdVTEFUT1JfTElORUFSX1JBTkdFKFJLODE3X0JVQ0sxX01JTjEsIFJLODE3X0JVQ0sx X1NFTDAgKyAxLAorCQkJICAgICAgIFJLODE3X0JVQ0szX1NFTF9DTlQsIFJLODE3X0JVQ0sxX1NU UDEpLAorfTsKKwogc3RhdGljIGludCByazgwOF9idWNrMV8yX2dldF92b2x0YWdlX3NlbF9yZWdt YXAoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCiB7CiAJc3RydWN0IHJrODA4X3JlZ3VsYXRv cl9kYXRhICpwZGF0YSA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CkBAIC0yODksNiArMzc0LDM2 IEBAIHN0YXRpYyBpbnQgcms4MDhfc2V0X3JhbXBfZGVsYXkoc3RydWN0IHJlZ3VsYXRvcl9kZXYg KnJkZXYsIGludCByYW1wX2RlbGF5KQogCQkJCSAgUks4MDhfUkFNUF9SQVRFX01BU0ssIHJhbXBf dmFsdWUpOwogfQogCisvKgorICogUks4MTcgUks4MDkKKyAqLworc3RhdGljIGludCByazgxN19z ZXRfcmFtcF9kZWxheShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwgaW50IHJhbXBfZGVsYXkp Cit7CisJdW5zaWduZWQgaW50IHJhbXBfdmFsdWUgPSBSSzgxN19SQU1QX1JBVEVfMjVNVl9QRVJf VVM7CisJdW5zaWduZWQgaW50IHJlZyA9IFJLODE3X0JVQ0tfQ09ORklHX1JFRyhyZGV2X2dldF9p ZChyZGV2KSk7CisKKwlzd2l0Y2ggKHJhbXBfZGVsYXkpIHsKKwljYXNlIDAgLi4uIDMwMDA6CisJ CXJhbXBfdmFsdWUgPSBSSzgxN19SQU1QX1JBVEVfM01WX1BFUl9VUzsKKwkJYnJlYWs7CisJY2Fz ZSAzMDAxIC4uLiA2MzAwOgorCQlyYW1wX3ZhbHVlID0gUks4MTdfUkFNUF9SQVRFXzZfM01WX1BF Ul9VUzsKKwkJYnJlYWs7CisJY2FzZSA2MzAxIC4uLiAxMjUwMDoKKwkJcmFtcF92YWx1ZSA9IFJL ODE3X1JBTVBfUkFURV8xMl81TVZfUEVSX1VTOworCQlicmVhazsKKwljYXNlIDEyNTAxIC4uLiAy NTAwMDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X3dhcm4oJnJkZXYtPmRldiwKKwkJCSAi JXMgcmFtcF9kZWxheTogJWQgbm90IHN1cHBvcnRlZCwgc2V0dGluZyAxMDAwMFxuIiwKKwkJCSBy ZGV2LT5kZXNjLT5uYW1lLCByYW1wX2RlbGF5KTsKKwl9CisKKwlyZXR1cm4gcmVnbWFwX3VwZGF0 ZV9iaXRzKHJkZXYtPnJlZ21hcCwgcmVnLAorCQkJCSAgUks4MTdfUkFNUF9SQVRFX01BU0ssIHJh bXBfdmFsdWUpOworfQorCiBzdGF0aWMgaW50IHJrODA4X3NldF9zdXNwZW5kX3ZvbHRhZ2Uoc3Ry dWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsIGludCB1dikKIHsKIAl1bnNpZ25lZCBpbnQgcmVnOwpA QCAtMzA0LDYgKzQxOSwyMSBAQCBzdGF0aWMgaW50IHJrODA4X3NldF9zdXNwZW5kX3ZvbHRhZ2Uo c3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsIGludCB1dikKIAkJCQkgIHNlbCk7CiB9CiAKK3N0 YXRpYyBpbnQgcms4MTdfc2V0X3N1c3BlbmRfdm9sdGFnZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAq cmRldiwgaW50IHV2KQoreworCXVuc2lnbmVkIGludCByZWc7CisJaW50IHNlbCA9IHJlZ3VsYXRv cl9tYXBfdm9sdGFnZV9saW5lYXIocmRldiwgdXYsIHV2KTsKKwkvKiBvbmx5IGxkbzF+bGRvOSAq LworCWlmIChzZWwgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJlZyA9IHJkZXYtPmRlc2Mt PnZzZWxfcmVnICsgUks4MDhfU0xQX1JFR19PRkZTRVQ7CisKKwlyZXR1cm4gcmVnbWFwX3VwZGF0 ZV9iaXRzKHJkZXYtPnJlZ21hcCwgcmVnLAorCQkJCSAgcmRldi0+ZGVzYy0+dnNlbF9tYXNrLAor CQkJCSAgc2VsKTsKK30KKwogc3RhdGljIGludCByazgwOF9zZXRfc3VzcGVuZF92b2x0YWdlX3Jh bmdlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LCBpbnQgdXYpCiB7CiAJdW5zaWduZWQgaW50 IHJlZzsKQEAgLTM2Myw2ICs0OTMsMTMxIEBAIHN0YXRpYyBpbnQgcms4MDhfc2V0X3N1c3BlbmRf ZGlzYWJsZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKIAkJCQkgIHJkZXYtPmRlc2MtPmVu YWJsZV9tYXNrKTsKIH0KIAorc3RhdGljIGludCByazgxN19zZXRfc3VzcGVuZF9lbmFibGVfY3Ry bChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwKKwkJCQkJIHVuc2lnbmVkIGludCBlbikKK3sK Kwl1bnNpZ25lZCBpbnQgcmVnOworCWludCBpZCA9IHJkZXZfZ2V0X2lkKHJkZXYpOworCXVuc2ln bmVkIGludCBpZF9zbHAsIG1zaywgdmFsOworCisJaWYgKGlkID49IFJLODE3X0lEX0RDREMxICYm IGlkIDw9IFJLODE3X0lEX0RDREM0KQorCQlpZF9zbHAgPSBpZDsKKwllbHNlIGlmIChpZCA+PSBS SzgxN19JRF9MRE8xICYmIGlkIDw9IFJLODE3X0lEX0xETzgpCisJCWlkX3NscCA9IDggKyAoaWQg LSBSSzgxN19JRF9MRE8xKTsKKwllbHNlIGlmIChpZCA+PSBSSzgxN19JRF9MRE85ICYmIGlkIDw9 IFJLODA5X0lEX1NXMikKKwkJaWRfc2xwID0gNCArIChpZCAtIFJLODE3X0lEX0xETzkpOworCWVs c2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZWcgPSBSSzgxN19QT1dFUl9TTFBfRU5fUkVHKGlk X3NscCAvIDgpOworCisJbXNrID0gQklUKGlkX3NscCAlIDgpOworCWlmIChlbikKKwkJdmFsID0g bXNrOworCWVsc2UKKwkJdmFsID0gMDsKKworCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMocmRl di0+cmVnbWFwLCByZWcsIG1zaywgdmFsKTsKK30KKworc3RhdGljIGludCByazgxN19zZXRfc3Vz cGVuZF9lbmFibGUoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCit7CisJcmV0dXJuIHJrODE3 X3NldF9zdXNwZW5kX2VuYWJsZV9jdHJsKHJkZXYsIDEpOworfQorCitzdGF0aWMgaW50IHJrODE3 X3NldF9zdXNwZW5kX2Rpc2FibGUoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCit7CisJcmV0 dXJuIHJrODE3X3NldF9zdXNwZW5kX2VuYWJsZV9jdHJsKHJkZXYsIDApOworfQorCitzdGF0aWMg aW50IHJrOHh4X3NldF9zdXNwZW5kX21vZGUoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsIHVu c2lnbmVkIGludCBtb2RlKQoreworCXVuc2lnbmVkIGludCByZWc7CisKKwlyZWcgPSByZGV2LT5k ZXNjLT52c2VsX3JlZyArIFJLODA4X1NMUF9SRUdfT0ZGU0VUOworCisJc3dpdGNoIChtb2RlKSB7 CisJY2FzZSBSRUdVTEFUT1JfTU9ERV9GQVNUOgorCQlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRz KHJkZXYtPnJlZ21hcCwgcmVnLAorCQkJCQkgIFBXTV9NT0RFX01TSywgRlBXTV9NT0RFKTsKKwlj YXNlIFJFR1VMQVRPUl9NT0RFX05PUk1BTDoKKwkJcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhy ZGV2LT5yZWdtYXAsIHJlZywKKwkJCQkJICBQV01fTU9ERV9NU0ssIEFVVE9fUFdNX01PREUpOwor CWRlZmF1bHQ6CisJCWRldl9lcnIoJnJkZXYtPmRldiwgImRvIG5vdCBzdXBwb3J0IHRoaXMgbW9k ZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMg aW50IHJrOHh4X3NldF9tb2RlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LCB1bnNpZ25lZCBp bnQgbW9kZSkKK3sKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIFJFR1VMQVRPUl9NT0RFX0ZBU1Q6 CisJCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMocmRldi0+cmVnbWFwLCByZGV2LT5kZXNjLT52 c2VsX3JlZywKKwkJCQkJICBQV01fTU9ERV9NU0ssIEZQV01fTU9ERSk7CisJY2FzZSBSRUdVTEFU T1JfTU9ERV9OT1JNQUw6CisJCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMocmRldi0+cmVnbWFw LCByZGV2LT5kZXNjLT52c2VsX3JlZywKKwkJCQkJICBQV01fTU9ERV9NU0ssIEFVVE9fUFdNX01P REUpOworCWRlZmF1bHQ6CisJCWRldl9lcnIoJnJkZXYtPmRldiwgImRvIG5vdCBzdXBwb3J0IHRo aXMgbW9kZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitz dGF0aWMgdW5zaWduZWQgaW50IHJrOHh4X2dldF9tb2RlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpy ZGV2KQoreworCXVuc2lnbmVkIGludCB2YWw7CisJaW50IGVycjsKKworCWVyciA9IHJlZ21hcF9y ZWFkKHJkZXYtPnJlZ21hcCwgcmRldi0+ZGVzYy0+dnNlbF9yZWcsICZ2YWwpOworCWlmIChlcnIp CisJCXJldHVybiBlcnI7CisKKwlpZiAodmFsICYgRlBXTV9NT0RFKQorCQlyZXR1cm4gUkVHVUxB VE9SX01PREVfRkFTVDsKKwllbHNlCisJCXJldHVybiBSRUdVTEFUT1JfTU9ERV9OT1JNQUw7Cit9 CisKK3N0YXRpYyBpbnQgcms4eHhfaXNfZW5hYmxlZF93bXNrX3JlZ21hcChzdHJ1Y3QgcmVndWxh dG9yX2RldiAqcmRldikKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCWludCByZXQ7CisKKwlyZXQg PSByZWdtYXBfcmVhZChyZGV2LT5yZWdtYXAsIHJkZXYtPmRlc2MtPmVuYWJsZV9yZWcsICZ2YWwp OworCWlmIChyZXQgIT0gMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIGFkZCB3cml0ZSBtYXNrIGJp dCAqLworCXZhbCB8PSAocmRldi0+ZGVzYy0+ZW5hYmxlX21hc2sgJiAweGYwKTsKKwl2YWwgJj0g cmRldi0+ZGVzYy0+ZW5hYmxlX21hc2s7CisKKwlpZiAocmRldi0+ZGVzYy0+ZW5hYmxlX2lzX2lu dmVydGVkKSB7CisJCWlmIChyZGV2LT5kZXNjLT5lbmFibGVfdmFsKQorCQkJcmV0dXJuIHZhbCAh PSByZGV2LT5kZXNjLT5lbmFibGVfdmFsOworCQlyZXR1cm4gKHZhbCA9PSAwKTsKKwl9CisJaWYg KHJkZXYtPmRlc2MtPmVuYWJsZV92YWwpCisJCXJldHVybiB2YWwgPT0gcmRldi0+ZGVzYy0+ZW5h YmxlX3ZhbDsKKwlyZXR1cm4gdmFsICE9IDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcms4 eHhfcmVndWxhdG9yX29mX21hcF9tb2RlKHVuc2lnbmVkIGludCBtb2RlKQoreworCXN3aXRjaCAo bW9kZSkgeworCWNhc2UgMToKKwkJcmV0dXJuIFJFR1VMQVRPUl9NT0RFX0ZBU1Q7CisJY2FzZSAy OgorCQlyZXR1cm4gUkVHVUxBVE9SX01PREVfTk9STUFMOworCWRlZmF1bHQ6CisJCXJldHVybiAt RUlOVkFMOworCX0KK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCByZWd1bGF0b3Jfb3BzIHJrODA1 X3JlZ19vcHMgPSB7CiAJLmxpc3Rfdm9sdGFnZSAgICAgICAgICAgPSByZWd1bGF0b3JfbGlzdF92 b2x0YWdlX2xpbmVhciwKIAkubWFwX3ZvbHRhZ2UgICAgICAgICAgICA9IHJlZ3VsYXRvcl9tYXBf dm9sdGFnZV9saW5lYXIsCkBAIC00MzksNiArNjk0LDcxIEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3Qg cmVndWxhdG9yX2xpbmVhcl9yYW5nZSByazgwNV9idWNrXzFfMl92b2x0YWdlX3Jhbmdlc1tdID0g ewogCVJFR1VMQVRPUl9MSU5FQVJfUkFOR0UoMjMwMDAwMCwgNjMsIDYzLCAwKSwKIH07CiAKK3N0 YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX29wcyByazgwOV9idWNrNV9vcHNfcmFuZ2UgPSB7CisJLmxp c3Rfdm9sdGFnZQkJPSByZWd1bGF0b3JfbGlzdF92b2x0YWdlX2xpbmVhcl9yYW5nZSwKKwkubWFw X3ZvbHRhZ2UJCT0gcmVndWxhdG9yX21hcF92b2x0YWdlX2xpbmVhcl9yYW5nZSwKKwkuZ2V0X3Zv bHRhZ2Vfc2VsCT0gcmVndWxhdG9yX2dldF92b2x0YWdlX3NlbF9yZWdtYXAsCisJLnNldF92b2x0 YWdlX3NlbAk9IHJlZ3VsYXRvcl9zZXRfdm9sdGFnZV9zZWxfcmVnbWFwLAorCS5zZXRfdm9sdGFn ZV90aW1lX3NlbAk9IHJlZ3VsYXRvcl9zZXRfdm9sdGFnZV90aW1lX3NlbCwKKwkuZW5hYmxlCQkJ PSByZWd1bGF0b3JfZW5hYmxlX3JlZ21hcCwKKwkuZGlzYWJsZQkJPSByZWd1bGF0b3JfZGlzYWJs ZV9yZWdtYXAsCisJLmlzX2VuYWJsZWQJCT0gcms4eHhfaXNfZW5hYmxlZF93bXNrX3JlZ21hcCwK Kwkuc2V0X3N1c3BlbmRfdm9sdGFnZQk9IHJrODA4X3NldF9zdXNwZW5kX3ZvbHRhZ2VfcmFuZ2Us CisJLnNldF9zdXNwZW5kX2VuYWJsZQk9IHJrODE3X3NldF9zdXNwZW5kX2VuYWJsZSwKKwkuc2V0 X3N1c3BlbmRfZGlzYWJsZQk9IHJrODE3X3NldF9zdXNwZW5kX2Rpc2FibGUsCit9OworCitzdGF0 aWMgc3RydWN0IHJlZ3VsYXRvcl9vcHMgcms4MTdfcmVnX29wcyA9IHsKKwkubGlzdF92b2x0YWdl CQk9IHJlZ3VsYXRvcl9saXN0X3ZvbHRhZ2VfbGluZWFyLAorCS5tYXBfdm9sdGFnZQkJPSByZWd1 bGF0b3JfbWFwX3ZvbHRhZ2VfbGluZWFyLAorCS5nZXRfdm9sdGFnZV9zZWwJPSByZWd1bGF0b3Jf Z2V0X3ZvbHRhZ2Vfc2VsX3JlZ21hcCwKKwkuc2V0X3ZvbHRhZ2Vfc2VsCT0gcmVndWxhdG9yX3Nl dF92b2x0YWdlX3NlbF9yZWdtYXAsCisJLmVuYWJsZQkJCT0gcmVndWxhdG9yX2VuYWJsZV9yZWdt YXAsCisJLmRpc2FibGUJCT0gcmVndWxhdG9yX2Rpc2FibGVfcmVnbWFwLAorCS5pc19lbmFibGVk CQk9IHJrOHh4X2lzX2VuYWJsZWRfd21za19yZWdtYXAsCisJLnNldF9zdXNwZW5kX3ZvbHRhZ2UJ PSByazgxN19zZXRfc3VzcGVuZF92b2x0YWdlLAorCS5zZXRfc3VzcGVuZF9lbmFibGUJPSByazgx N19zZXRfc3VzcGVuZF9lbmFibGUsCisJLnNldF9zdXNwZW5kX2Rpc2FibGUJPSByazgxN19zZXRf c3VzcGVuZF9kaXNhYmxlLAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3Jfb3BzIHJrODE3 X2Jvb3N0X29wcyA9IHsKKwkubGlzdF92b2x0YWdlCQk9IHJlZ3VsYXRvcl9saXN0X3ZvbHRhZ2Vf bGluZWFyLAorCS5tYXBfdm9sdGFnZQkJPSByZWd1bGF0b3JfbWFwX3ZvbHRhZ2VfbGluZWFyLAor CS5nZXRfdm9sdGFnZV9zZWwJPSByZWd1bGF0b3JfZ2V0X3ZvbHRhZ2Vfc2VsX3JlZ21hcCwKKwku c2V0X3ZvbHRhZ2Vfc2VsCT0gcmVndWxhdG9yX3NldF92b2x0YWdlX3NlbF9yZWdtYXAsCisJLmVu YWJsZQkJCT0gcmVndWxhdG9yX2VuYWJsZV9yZWdtYXAsCisJLmRpc2FibGUJCT0gcmVndWxhdG9y X2Rpc2FibGVfcmVnbWFwLAorCS5pc19lbmFibGVkCQk9IHJrOHh4X2lzX2VuYWJsZWRfd21za19y ZWdtYXAsCisJLnNldF9zdXNwZW5kX2VuYWJsZQk9IHJrODE3X3NldF9zdXNwZW5kX2VuYWJsZSwK Kwkuc2V0X3N1c3BlbmRfZGlzYWJsZQk9IHJrODE3X3NldF9zdXNwZW5kX2Rpc2FibGUsCit9Owor CitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9vcHMgcms4MTdfYnVja19vcHNfcmFuZ2UgPSB7CisJ Lmxpc3Rfdm9sdGFnZQkJPSByZWd1bGF0b3JfbGlzdF92b2x0YWdlX2xpbmVhcl9yYW5nZSwKKwku bWFwX3ZvbHRhZ2UJCT0gcmVndWxhdG9yX21hcF92b2x0YWdlX2xpbmVhcl9yYW5nZSwKKwkuZ2V0 X3ZvbHRhZ2Vfc2VsCT0gcmVndWxhdG9yX2dldF92b2x0YWdlX3NlbF9yZWdtYXAsCisJLnNldF92 b2x0YWdlX3NlbAk9IHJlZ3VsYXRvcl9zZXRfdm9sdGFnZV9zZWxfcmVnbWFwLAorCS5zZXRfdm9s dGFnZV90aW1lX3NlbAk9IHJlZ3VsYXRvcl9zZXRfdm9sdGFnZV90aW1lX3NlbCwKKwkuZW5hYmxl CQkJPSByZWd1bGF0b3JfZW5hYmxlX3JlZ21hcCwKKwkuZGlzYWJsZQkJPSByZWd1bGF0b3JfZGlz YWJsZV9yZWdtYXAsCisJLmlzX2VuYWJsZWQJCT0gcms4eHhfaXNfZW5hYmxlZF93bXNrX3JlZ21h cCwKKwkuc2V0X21vZGUJCT0gcms4eHhfc2V0X21vZGUsCisJLmdldF9tb2RlCQk9IHJrOHh4X2dl dF9tb2RlLAorCS5zZXRfc3VzcGVuZF9tb2RlCT0gcms4eHhfc2V0X3N1c3BlbmRfbW9kZSwKKwku c2V0X3JhbXBfZGVsYXkJCT0gcms4MTdfc2V0X3JhbXBfZGVsYXksCisJLnNldF9zdXNwZW5kX3Zv bHRhZ2UJPSByazgwOF9zZXRfc3VzcGVuZF92b2x0YWdlX3JhbmdlLAorCS5zZXRfc3VzcGVuZF9l bmFibGUJPSByazgxN19zZXRfc3VzcGVuZF9lbmFibGUsCisJLnNldF9zdXNwZW5kX2Rpc2FibGUJ PSByazgxN19zZXRfc3VzcGVuZF9kaXNhYmxlLAorfTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0 b3Jfb3BzIHJrODE3X3N3aXRjaF9vcHMgPSB7CisJLmVuYWJsZQkJCT0gcmVndWxhdG9yX2VuYWJs ZV9yZWdtYXAsCisJLmRpc2FibGUJCT0gcmVndWxhdG9yX2Rpc2FibGVfcmVnbWFwLAorCS5pc19l bmFibGVkCQk9IHJrOHh4X2lzX2VuYWJsZWRfd21za19yZWdtYXAsCisJLnNldF9zdXNwZW5kX2Vu YWJsZQk9IHJrODE3X3NldF9zdXNwZW5kX2VuYWJsZSwKKwkuc2V0X3N1c3BlbmRfZGlzYWJsZQk9 IHJrODE3X3NldF9zdXNwZW5kX2Rpc2FibGUsCit9OworCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJl Z3VsYXRvcl9kZXNjIHJrODA1X3JlZ1tdID0gewogCXsKIAkJLm5hbWUgPSAiRENEQ19SRUcxIiwK QEAgLTU5NSw2ICs5MTUsMjcxIEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVndWxhdG9yX2Rlc2Mg cms4MDhfcmVnW10gPSB7CiAJCVJLODA4X0RDRENfRU5fUkVHLCBCSVQoNikpLAogfTsKIAorc3Rh dGljIGNvbnN0IHN0cnVjdCByZWd1bGF0b3JfZGVzYyByazgwOV9yZWdbXSA9IHsKKwl7CisJCS5u YW1lID0gIkRDRENfUkVHMSIsCisJCS5zdXBwbHlfbmFtZSA9ICJ2Y2MxIiwKKwkJLm9mX21hdGNo ID0gb2ZfbWF0Y2hfcHRyKCJEQ0RDX1JFRzEiKSwKKwkJLnJlZ3VsYXRvcnNfbm9kZSA9IG9mX21h dGNoX3B0cigicmVndWxhdG9ycyIpLAorCQkuaWQgPSBSSzgxN19JRF9EQ0RDMSwKKwkJLm9wcyA9 ICZyazgxN19idWNrX29wc19yYW5nZSwKKwkJLnR5cGUgPSBSRUdVTEFUT1JfVk9MVEFHRSwKKwkJ Lm5fdm9sdGFnZXMgPSBSSzgxN19CVUNLMV9TRUxfQ05UICsgMSwKKwkJLmxpbmVhcl9yYW5nZXMg PSByazgxN19idWNrMV92b2x0YWdlX3JhbmdlcywKKwkJLm5fbGluZWFyX3JhbmdlcyA9IEFSUkFZ X1NJWkUocms4MTdfYnVjazFfdm9sdGFnZV9yYW5nZXMpLAorCQkudnNlbF9yZWcgPSBSSzgxN19C VUNLMV9PTl9WU0VMX1JFRywKKwkJLnZzZWxfbWFzayA9IFJLODE3X0JVQ0tfVlNFTF9NQVNLLAor CQkuZW5hYmxlX3JlZyA9IFJLODE3X1BPV0VSX0VOX1JFRygwKSwKKwkJLmVuYWJsZV9tYXNrID0g RU5BQkxFX01BU0soUks4MTdfSURfRENEQzEpLAorCQkuZW5hYmxlX3ZhbCA9IEVOQUJMRV9NQVNL KFJLODE3X0lEX0RDREMxKSwKKwkJLmRpc2FibGVfdmFsID0gRElTQUJMRV9WQUwoUks4MTdfSURf RENEQzEpLAorCQkub2ZfbWFwX21vZGUgPSByazh4eF9yZWd1bGF0b3Jfb2ZfbWFwX21vZGUsCisJ CS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sIHsKKwkJLm5hbWUgPSAiRENEQ19SRUcyIiwKKwkJ LnN1cHBseV9uYW1lID0gInZjYzIiLAorCQkub2ZfbWF0Y2ggPSBvZl9tYXRjaF9wdHIoIkRDRENf UkVHMiIpLAorCQkucmVndWxhdG9yc19ub2RlID0gb2ZfbWF0Y2hfcHRyKCJyZWd1bGF0b3JzIiks CisJCS5pZCA9IFJLODE3X0lEX0RDREMyLAorCQkub3BzID0gJnJrODE3X2J1Y2tfb3BzX3Jhbmdl LAorCQkudHlwZSA9IFJFR1VMQVRPUl9WT0xUQUdFLAorCQkubl92b2x0YWdlcyA9IFJLODE3X0JV Q0sxX1NFTF9DTlQgKyAxLAorCQkubGluZWFyX3JhbmdlcyA9IHJrODE3X2J1Y2sxX3ZvbHRhZ2Vf cmFuZ2VzLAorCQkubl9saW5lYXJfcmFuZ2VzID0gQVJSQVlfU0laRShyazgxN19idWNrMV92b2x0 YWdlX3JhbmdlcyksCisJCS52c2VsX3JlZyA9IFJLODE3X0JVQ0syX09OX1ZTRUxfUkVHLAorCQku dnNlbF9tYXNrID0gUks4MTdfQlVDS19WU0VMX01BU0ssCisJCS5lbmFibGVfcmVnID0gUks4MTdf UE9XRVJfRU5fUkVHKDApLAorCQkuZW5hYmxlX21hc2sgPSBFTkFCTEVfTUFTSyhSSzgxN19JRF9E Q0RDMiksCisJCS5lbmFibGVfdmFsID0gRU5BQkxFX01BU0soUks4MTdfSURfRENEQzIpLAorCQku ZGlzYWJsZV92YWwgPSBESVNBQkxFX1ZBTChSSzgxN19JRF9EQ0RDMiksCisJCS5vZl9tYXBfbW9k ZSA9IHJrOHh4X3JlZ3VsYXRvcl9vZl9tYXBfbW9kZSwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUs CisJfSwgeworCQkubmFtZSA9ICJEQ0RDX1JFRzMiLAorCQkuc3VwcGx5X25hbWUgPSAidmNjMyIs CisJCS5vZl9tYXRjaCA9IG9mX21hdGNoX3B0cigiRENEQ19SRUczIiksCisJCS5yZWd1bGF0b3Jz X25vZGUgPSBvZl9tYXRjaF9wdHIoInJlZ3VsYXRvcnMiKSwKKwkJLmlkID0gUks4MTdfSURfRENE QzMsCisJCS5vcHMgPSAmcms4MTdfYnVja19vcHNfcmFuZ2UsCisJCS50eXBlID0gUkVHVUxBVE9S X1ZPTFRBR0UsCisJCS5uX3ZvbHRhZ2VzID0gUks4MTdfQlVDSzFfU0VMX0NOVCArIDEsCisJCS5s aW5lYXJfcmFuZ2VzID0gcms4MTdfYnVjazFfdm9sdGFnZV9yYW5nZXMsCisJCS5uX2xpbmVhcl9y YW5nZXMgPSBBUlJBWV9TSVpFKHJrODE3X2J1Y2sxX3ZvbHRhZ2VfcmFuZ2VzKSwKKwkJLnZzZWxf cmVnID0gUks4MTdfQlVDSzNfT05fVlNFTF9SRUcsCisJCS52c2VsX21hc2sgPSBSSzgxN19CVUNL X1ZTRUxfTUFTSywKKwkJLmVuYWJsZV9yZWcgPSBSSzgxN19QT1dFUl9FTl9SRUcoMCksCisJCS5l bmFibGVfbWFzayA9IEVOQUJMRV9NQVNLKFJLODE3X0lEX0RDREMzKSwKKwkJLmVuYWJsZV92YWwg PSBFTkFCTEVfTUFTSyhSSzgxN19JRF9EQ0RDMyksCisJCS5kaXNhYmxlX3ZhbCA9IERJU0FCTEVf VkFMKFJLODE3X0lEX0RDREMzKSwKKwkJLm9mX21hcF9tb2RlID0gcms4eHhfcmVndWxhdG9yX29m X21hcF9tb2RlLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LCB7CisJCS5uYW1lID0gIkRD RENfUkVHNCIsCisJCS5zdXBwbHlfbmFtZSA9ICJ2Y2M0IiwKKwkJLm9mX21hdGNoID0gb2ZfbWF0 Y2hfcHRyKCJEQ0RDX1JFRzQiKSwKKwkJLnJlZ3VsYXRvcnNfbm9kZSA9IG9mX21hdGNoX3B0cigi cmVndWxhdG9ycyIpLAorCQkuaWQgPSBSSzgxN19JRF9EQ0RDNCwKKwkJLm9wcyA9ICZyazgxN19i dWNrX29wc19yYW5nZSwKKwkJLnR5cGUgPSBSRUdVTEFUT1JfVk9MVEFHRSwKKwkJLm5fdm9sdGFn ZXMgPSBSSzgxN19CVUNLM19TRUxfQ05UICsgMSwKKwkJLmxpbmVhcl9yYW5nZXMgPSByazgxN19i dWNrM192b2x0YWdlX3JhbmdlcywKKwkJLm5fbGluZWFyX3JhbmdlcyA9IEFSUkFZX1NJWkUocms4 MTdfYnVjazNfdm9sdGFnZV9yYW5nZXMpLAorCQkudnNlbF9yZWcgPSBSSzgxN19CVUNLNF9PTl9W U0VMX1JFRywKKwkJLnZzZWxfbWFzayA9IFJLODE3X0JVQ0tfVlNFTF9NQVNLLAorCQkuZW5hYmxl X3JlZyA9IFJLODE3X1BPV0VSX0VOX1JFRygwKSwKKwkJLmVuYWJsZV9tYXNrID0gRU5BQkxFX01B U0soUks4MTdfSURfRENEQzQpLAorCQkuZW5hYmxlX3ZhbCA9IEVOQUJMRV9NQVNLKFJLODE3X0lE X0RDREM0KSwKKwkJLmRpc2FibGVfdmFsID0gRElTQUJMRV9WQUwoUks4MTdfSURfRENEQzQpLAor CQkub2ZfbWFwX21vZGUgPSByazh4eF9yZWd1bGF0b3Jfb2ZfbWFwX21vZGUsCisJCS5vd25lciA9 IFRISVNfTU9EVUxFLAorCX0sCisJeworCQkubmFtZSA9ICJEQ0RDX1JFRzUiLAorCQkuc3VwcGx5 X25hbWUgPSAidmNjOSIsCisJCS5vZl9tYXRjaCA9IG9mX21hdGNoX3B0cigiRENEQ19SRUc1Iiks CisJCS5yZWd1bGF0b3JzX25vZGUgPSBvZl9tYXRjaF9wdHIoInJlZ3VsYXRvcnMiKSwKKwkJLmlk ID0gUks4MDlfSURfRENEQzUsCisJCS5vcHMgPSAmcms4MDlfYnVjazVfb3BzX3JhbmdlLAorCQku dHlwZSA9IFJFR1VMQVRPUl9WT0xUQUdFLAorCQkubl92b2x0YWdlcyA9IFJLODA5X0JVQ0s1X1NF TF9DTlQsCisJCS5saW5lYXJfcmFuZ2VzID0gcms4MDlfYnVjazVfdm9sdGFnZV9yYW5nZXMsCisJ CS5uX2xpbmVhcl9yYW5nZXMgPSBBUlJBWV9TSVpFKHJrODA5X2J1Y2s1X3ZvbHRhZ2VfcmFuZ2Vz KSwKKwkJLnZzZWxfcmVnID0gUks4MDlfQlVDSzVfQ09ORklHKDApLAorCQkudnNlbF9tYXNrID0g Uks4MDlfQlVDSzVfVlNFTF9NQVNLLAorCQkuZW5hYmxlX3JlZyA9IFJLODE3X1BPV0VSX0VOX1JF RygzKSwKKwkJLmVuYWJsZV9tYXNrID0gRU5BQkxFX01BU0soMSksCisJCS5lbmFibGVfdmFsID0g RU5BQkxFX01BU0soMSksCisJCS5kaXNhYmxlX3ZhbCA9IERJU0FCTEVfVkFMKDEpLAorCQkub2Zf bWFwX21vZGUgPSByazh4eF9yZWd1bGF0b3Jfb2ZfbWFwX21vZGUsCisJCS5vd25lciA9IFRISVNf TU9EVUxFLAorCX0sCisJUks4MTdfREVTQyhSSzgxN19JRF9MRE8xLCAiTERPX1JFRzEiLCAidmNj NSIsIDYwMCwgMzQwMCwgMjUsCisJCSAgIFJLODE3X0xET19PTl9WU0VMX1JFRygwKSwgUks4MTdf TERPX1ZTRUxfTUFTSywKKwkJICAgUks4MTdfUE9XRVJfRU5fUkVHKDEpLCBFTkFCTEVfTUFTSygw KSwKKwkJICAgRElTQUJMRV9WQUwoMCksIDQwMCksCisJUks4MTdfREVTQyhSSzgxN19JRF9MRE8y LCAiTERPX1JFRzIiLCAidmNjNSIsIDYwMCwgMzQwMCwgMjUsCisJCSAgIFJLODE3X0xET19PTl9W U0VMX1JFRygxKSwgUks4MTdfTERPX1ZTRUxfTUFTSywKKwkJICAgUks4MTdfUE9XRVJfRU5fUkVH KDEpLCBFTkFCTEVfTUFTSygxKSwKKwkJICAgRElTQUJMRV9WQUwoMSksIDQwMCksCisJUks4MTdf REVTQyhSSzgxN19JRF9MRE8zLCAiTERPX1JFRzMiLCAidmNjNSIsIDYwMCwgMzQwMCwgMjUsCisJ CSAgIFJLODE3X0xET19PTl9WU0VMX1JFRygyKSwgUks4MTdfTERPX1ZTRUxfTUFTSywKKwkJICAg Uks4MTdfUE9XRVJfRU5fUkVHKDEpLCBFTkFCTEVfTUFTSygyKSwKKwkJICAgRElTQUJMRV9WQUwo MiksIDQwMCksCisJUks4MTdfREVTQyhSSzgxN19JRF9MRE80LCAiTERPX1JFRzQiLCAidmNjNiIs IDYwMCwgMzQwMCwgMjUsCisJCSAgIFJLODE3X0xET19PTl9WU0VMX1JFRygzKSwgUks4MTdfTERP X1ZTRUxfTUFTSywKKwkJICAgUks4MTdfUE9XRVJfRU5fUkVHKDEpLCBFTkFCTEVfTUFTSygzKSwK KwkJICAgRElTQUJMRV9WQUwoMyksIDQwMCksCisJUks4MTdfREVTQyhSSzgxN19JRF9MRE81LCAi TERPX1JFRzUiLCAidmNjNiIsIDYwMCwgMzQwMCwgMjUsCisJCSAgIFJLODE3X0xET19PTl9WU0VM X1JFRyg0KSwgUks4MTdfTERPX1ZTRUxfTUFTSywKKwkJICAgUks4MTdfUE9XRVJfRU5fUkVHKDIp LCBFTkFCTEVfTUFTSygwKSwKKwkJICAgRElTQUJMRV9WQUwoMCksIDQwMCksCisJUks4MTdfREVT QyhSSzgxN19JRF9MRE82LCAiTERPX1JFRzYiLCAidmNjNiIsIDYwMCwgMzQwMCwgMjUsCisJCSAg IFJLODE3X0xET19PTl9WU0VMX1JFRyg1KSwgUks4MTdfTERPX1ZTRUxfTUFTSywKKwkJICAgUks4 MTdfUE9XRVJfRU5fUkVHKDIpLCBFTkFCTEVfTUFTSygxKSwKKwkJICAgRElTQUJMRV9WQUwoMSks IDQwMCksCisJUks4MTdfREVTQyhSSzgxN19JRF9MRE83LCAiTERPX1JFRzciLCAidmNjNyIsIDYw MCwgMzQwMCwgMjUsCisJCSAgIFJLODE3X0xET19PTl9WU0VMX1JFRyg2KSwgUks4MTdfTERPX1ZT RUxfTUFTSywKKwkJICAgUks4MTdfUE9XRVJfRU5fUkVHKDIpLCBFTkFCTEVfTUFTSygyKSwKKwkJ ICAgRElTQUJMRV9WQUwoMiksIDQwMCksCisJUks4MTdfREVTQyhSSzgxN19JRF9MRE84LCAiTERP X1JFRzgiLCAidmNjNyIsIDYwMCwgMzQwMCwgMjUsCisJCSAgIFJLODE3X0xET19PTl9WU0VMX1JF Ryg3KSwgUks4MTdfTERPX1ZTRUxfTUFTSywKKwkJICAgUks4MTdfUE9XRVJfRU5fUkVHKDIpLCBF TkFCTEVfTUFTSygzKSwKKwkJICAgRElTQUJMRV9WQUwoMyksIDQwMCksCisJUks4MTdfREVTQyhS SzgxN19JRF9MRE85LCAiTERPX1JFRzkiLCAidmNjNyIsIDYwMCwgMzQwMCwgMjUsCisJCSAgIFJL ODE3X0xET19PTl9WU0VMX1JFRyg4KSwgUks4MTdfTERPX1ZTRUxfTUFTSywKKwkJICAgUks4MTdf UE9XRVJfRU5fUkVHKDMpLCBFTkFCTEVfTUFTSygwKSwKKwkJICAgRElTQUJMRV9WQUwoMCksIDQw MCksCisJUks4MTdfREVTQ19TV0lUQ0goUks4MDlfSURfU1cxLCAiU1dJVENIX1JFRzEiLCAidmNj OSIsCisJCQkgIFJLODE3X1BPV0VSX0VOX1JFRygzKSwgRU5BQkxFX01BU0soMiksCisJCQkgIERJ U0FCTEVfVkFMKDIpKSwKKwlSSzgxN19ERVNDX1NXSVRDSChSSzgwOV9JRF9TVzIsICJTV0lUQ0hf UkVHMiIsICJ2Y2M4IiwKKwkJCSAgUks4MTdfUE9XRVJfRU5fUkVHKDMpLCBFTkFCTEVfTUFTSygz KSwKKwkJCSAgRElTQUJMRV9WQUwoMykpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWd1 bGF0b3JfZGVzYyByazgxN19yZWdbXSA9IHsKKwl7CisJCS5uYW1lID0gIkRDRENfUkVHMSIsCisJ CS5zdXBwbHlfbmFtZSA9ICJ2Y2MxIiwKKwkJLm9mX21hdGNoID0gb2ZfbWF0Y2hfcHRyKCJEQ0RD X1JFRzEiKSwKKwkJLnJlZ3VsYXRvcnNfbm9kZSA9IG9mX21hdGNoX3B0cigicmVndWxhdG9ycyIp LAorCQkuaWQgPSBSSzgxN19JRF9EQ0RDMSwKKwkJLm9wcyA9ICZyazgxN19idWNrX29wc19yYW5n ZSwKKwkJLnR5cGUgPSBSRUdVTEFUT1JfVk9MVEFHRSwKKwkJLm5fdm9sdGFnZXMgPSBSSzgxN19C VUNLMV9TRUxfQ05UICsgMSwKKwkJLmxpbmVhcl9yYW5nZXMgPSByazgxN19idWNrMV92b2x0YWdl X3JhbmdlcywKKwkJLm5fbGluZWFyX3JhbmdlcyA9IEFSUkFZX1NJWkUocms4MTdfYnVjazFfdm9s dGFnZV9yYW5nZXMpLAorCQkudnNlbF9yZWcgPSBSSzgxN19CVUNLMV9PTl9WU0VMX1JFRywKKwkJ LnZzZWxfbWFzayA9IFJLODE3X0JVQ0tfVlNFTF9NQVNLLAorCQkuZW5hYmxlX3JlZyA9IFJLODE3 X1BPV0VSX0VOX1JFRygwKSwKKwkJLmVuYWJsZV9tYXNrID0gRU5BQkxFX01BU0soUks4MTdfSURf RENEQzEpLAorCQkuZW5hYmxlX3ZhbCA9IEVOQUJMRV9NQVNLKFJLODE3X0lEX0RDREMxKSwKKwkJ LmRpc2FibGVfdmFsID0gRElTQUJMRV9WQUwoUks4MTdfSURfRENEQzEpLAorCQkub2ZfbWFwX21v ZGUgPSByazh4eF9yZWd1bGF0b3Jfb2ZfbWFwX21vZGUsCisJCS5vd25lciA9IFRISVNfTU9EVUxF LAorCX0sIHsKKwkJLm5hbWUgPSAiRENEQ19SRUcyIiwKKwkJLnN1cHBseV9uYW1lID0gInZjYzIi LAorCQkub2ZfbWF0Y2ggPSBvZl9tYXRjaF9wdHIoIkRDRENfUkVHMiIpLAorCQkucmVndWxhdG9y c19ub2RlID0gb2ZfbWF0Y2hfcHRyKCJyZWd1bGF0b3JzIiksCisJCS5pZCA9IFJLODE3X0lEX0RD REMyLAorCQkub3BzID0gJnJrODE3X2J1Y2tfb3BzX3JhbmdlLAorCQkudHlwZSA9IFJFR1VMQVRP Ul9WT0xUQUdFLAorCQkubl92b2x0YWdlcyA9IFJLODE3X0JVQ0sxX1NFTF9DTlQgKyAxLAorCQku bGluZWFyX3JhbmdlcyA9IHJrODE3X2J1Y2sxX3ZvbHRhZ2VfcmFuZ2VzLAorCQkubl9saW5lYXJf cmFuZ2VzID0gQVJSQVlfU0laRShyazgxN19idWNrMV92b2x0YWdlX3JhbmdlcyksCisJCS52c2Vs X3JlZyA9IFJLODE3X0JVQ0syX09OX1ZTRUxfUkVHLAorCQkudnNlbF9tYXNrID0gUks4MTdfQlVD S19WU0VMX01BU0ssCisJCS5lbmFibGVfcmVnID0gUks4MTdfUE9XRVJfRU5fUkVHKDApLAorCQku ZW5hYmxlX21hc2sgPSBFTkFCTEVfTUFTSyhSSzgxN19JRF9EQ0RDMiksCisJCS5lbmFibGVfdmFs ID0gRU5BQkxFX01BU0soUks4MTdfSURfRENEQzIpLAorCQkuZGlzYWJsZV92YWwgPSBESVNBQkxF X1ZBTChSSzgxN19JRF9EQ0RDMiksCisJCS5vZl9tYXBfbW9kZSA9IHJrOHh4X3JlZ3VsYXRvcl9v Zl9tYXBfbW9kZSwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwgeworCQkubmFtZSA9ICJE Q0RDX1JFRzMiLAorCQkuc3VwcGx5X25hbWUgPSAidmNjMyIsCisJCS5vZl9tYXRjaCA9IG9mX21h dGNoX3B0cigiRENEQ19SRUczIiksCisJCS5yZWd1bGF0b3JzX25vZGUgPSBvZl9tYXRjaF9wdHIo InJlZ3VsYXRvcnMiKSwKKwkJLmlkID0gUks4MTdfSURfRENEQzMsCisJCS5vcHMgPSAmcms4MTdf YnVja19vcHNfcmFuZ2UsCisJCS50eXBlID0gUkVHVUxBVE9SX1ZPTFRBR0UsCisJCS5uX3ZvbHRh Z2VzID0gUks4MTdfQlVDSzFfU0VMX0NOVCArIDEsCisJCS5saW5lYXJfcmFuZ2VzID0gcms4MTdf YnVjazFfdm9sdGFnZV9yYW5nZXMsCisJCS5uX2xpbmVhcl9yYW5nZXMgPSBBUlJBWV9TSVpFKHJr ODE3X2J1Y2sxX3ZvbHRhZ2VfcmFuZ2VzKSwKKwkJLnZzZWxfcmVnID0gUks4MTdfQlVDSzNfT05f VlNFTF9SRUcsCisJCS52c2VsX21hc2sgPSBSSzgxN19CVUNLX1ZTRUxfTUFTSywKKwkJLmVuYWJs ZV9yZWcgPSBSSzgxN19QT1dFUl9FTl9SRUcoMCksCisJCS5lbmFibGVfbWFzayA9IEVOQUJMRV9N QVNLKFJLODE3X0lEX0RDREMzKSwKKwkJLmVuYWJsZV92YWwgPSBFTkFCTEVfTUFTSyhSSzgxN19J RF9EQ0RDMyksCisJCS5kaXNhYmxlX3ZhbCA9IERJU0FCTEVfVkFMKFJLODE3X0lEX0RDREMzKSwK KwkJLm9mX21hcF9tb2RlID0gcms4eHhfcmVndWxhdG9yX29mX21hcF9tb2RlLAorCQkub3duZXIg PSBUSElTX01PRFVMRSwKKwl9LCB7CisJCS5uYW1lID0gIkRDRENfUkVHNCIsCisJCS5zdXBwbHlf bmFtZSA9ICJ2Y2M0IiwKKwkJLm9mX21hdGNoID0gb2ZfbWF0Y2hfcHRyKCJEQ0RDX1JFRzQiKSwK KwkJLnJlZ3VsYXRvcnNfbm9kZSA9IG9mX21hdGNoX3B0cigicmVndWxhdG9ycyIpLAorCQkuaWQg PSBSSzgxN19JRF9EQ0RDNCwKKwkJLm9wcyA9ICZyazgxN19idWNrX29wc19yYW5nZSwKKwkJLnR5 cGUgPSBSRUdVTEFUT1JfVk9MVEFHRSwKKwkJLm5fdm9sdGFnZXMgPSBSSzgxN19CVUNLM19TRUxf Q05UICsgMSwKKwkJLmxpbmVhcl9yYW5nZXMgPSByazgxN19idWNrM192b2x0YWdlX3JhbmdlcywK KwkJLm5fbGluZWFyX3JhbmdlcyA9IEFSUkFZX1NJWkUocms4MTdfYnVjazNfdm9sdGFnZV9yYW5n ZXMpLAorCQkudnNlbF9yZWcgPSBSSzgxN19CVUNLNF9PTl9WU0VMX1JFRywKKwkJLnZzZWxfbWFz ayA9IFJLODE3X0JVQ0tfVlNFTF9NQVNLLAorCQkuZW5hYmxlX3JlZyA9IFJLODE3X1BPV0VSX0VO X1JFRygwKSwKKwkJLmVuYWJsZV9tYXNrID0gRU5BQkxFX01BU0soUks4MTdfSURfRENEQzQpLAor CQkuZW5hYmxlX3ZhbCA9IEVOQUJMRV9NQVNLKFJLODE3X0lEX0RDREM0KSwKKwkJLmRpc2FibGVf dmFsID0gRElTQUJMRV9WQUwoUks4MTdfSURfRENEQzQpLAorCQkub2ZfbWFwX21vZGUgPSByazh4 eF9yZWd1bGF0b3Jfb2ZfbWFwX21vZGUsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJ Uks4MTdfREVTQyhSSzgxN19JRF9MRE8xLCAiTERPX1JFRzEiLCAidmNjNSIsIDYwMCwgMzQwMCwg MjUsCisJCSAgIFJLODE3X0xET19PTl9WU0VMX1JFRygwKSwgUks4MTdfTERPX1ZTRUxfTUFTSywK KwkJICAgUks4MTdfUE9XRVJfRU5fUkVHKDEpLCBFTkFCTEVfTUFTSygwKSwKKwkJICAgRElTQUJM RV9WQUwoMCksIDQwMCksCisJUks4MTdfREVTQyhSSzgxN19JRF9MRE8yLCAiTERPX1JFRzIiLCAi dmNjNSIsIDYwMCwgMzQwMCwgMjUsCisJCSAgIFJLODE3X0xET19PTl9WU0VMX1JFRygxKSwgUks4 MTdfTERPX1ZTRUxfTUFTSywKKwkJICAgUks4MTdfUE9XRVJfRU5fUkVHKDEpLCBFTkFCTEVfTUFT SygxKSwKKwkJICAgRElTQUJMRV9WQUwoMSksIDQwMCksCisJUks4MTdfREVTQyhSSzgxN19JRF9M RE8zLCAiTERPX1JFRzMiLCAidmNjNSIsIDYwMCwgMzQwMCwgMjUsCisJCSAgIFJLODE3X0xET19P Tl9WU0VMX1JFRygyKSwgUks4MTdfTERPX1ZTRUxfTUFTSywKKwkJICAgUks4MTdfUE9XRVJfRU5f UkVHKDEpLCBFTkFCTEVfTUFTSygyKSwKKwkJICAgRElTQUJMRV9WQUwoMiksIDQwMCksCisJUks4 MTdfREVTQyhSSzgxN19JRF9MRE80LCAiTERPX1JFRzQiLCAidmNjNiIsIDYwMCwgMzQwMCwgMjUs CisJCSAgIFJLODE3X0xET19PTl9WU0VMX1JFRygzKSwgUks4MTdfTERPX1ZTRUxfTUFTSywKKwkJ ICAgUks4MTdfUE9XRVJfRU5fUkVHKDEpLCBFTkFCTEVfTUFTSygzKSwKKwkJICAgRElTQUJMRV9W QUwoMyksIDQwMCksCisJUks4MTdfREVTQyhSSzgxN19JRF9MRE81LCAiTERPX1JFRzUiLCAidmNj NiIsIDYwMCwgMzQwMCwgMjUsCisJCSAgIFJLODE3X0xET19PTl9WU0VMX1JFRyg0KSwgUks4MTdf TERPX1ZTRUxfTUFTSywKKwkJICAgUks4MTdfUE9XRVJfRU5fUkVHKDIpLCBFTkFCTEVfTUFTSygw KSwKKwkJICAgRElTQUJMRV9WQUwoMCksIDQwMCksCisJUks4MTdfREVTQyhSSzgxN19JRF9MRE82 LCAiTERPX1JFRzYiLCAidmNjNiIsIDYwMCwgMzQwMCwgMjUsCisJCSAgIFJLODE3X0xET19PTl9W U0VMX1JFRyg1KSwgUks4MTdfTERPX1ZTRUxfTUFTSywKKwkJICAgUks4MTdfUE9XRVJfRU5fUkVH KDIpLCBFTkFCTEVfTUFTSygxKSwKKwkJICAgRElTQUJMRV9WQUwoMSksIDQwMCksCisJUks4MTdf REVTQyhSSzgxN19JRF9MRE83LCAiTERPX1JFRzciLCAidmNjNyIsIDYwMCwgMzQwMCwgMjUsCisJ CSAgIFJLODE3X0xET19PTl9WU0VMX1JFRyg2KSwgUks4MTdfTERPX1ZTRUxfTUFTSywKKwkJICAg Uks4MTdfUE9XRVJfRU5fUkVHKDIpLCBFTkFCTEVfTUFTSygyKSwKKwkJICAgRElTQUJMRV9WQUwo MiksIDQwMCksCisJUks4MTdfREVTQyhSSzgxN19JRF9MRE84LCAiTERPX1JFRzgiLCAidmNjNyIs IDYwMCwgMzQwMCwgMjUsCisJCSAgIFJLODE3X0xET19PTl9WU0VMX1JFRyg3KSwgUks4MTdfTERP X1ZTRUxfTUFTSywKKwkJICAgUks4MTdfUE9XRVJfRU5fUkVHKDIpLCBFTkFCTEVfTUFTSygzKSwK KwkJICAgRElTQUJMRV9WQUwoMyksIDQwMCksCisJUks4MTdfREVTQyhSSzgxN19JRF9MRE85LCAi TERPX1JFRzkiLCAidmNjNyIsIDYwMCwgMzQwMCwgMjUsCisJCSAgIFJLODE3X0xET19PTl9WU0VM X1JFRyg4KSwgUks4MTdfTERPX1ZTRUxfTUFTSywKKwkJICAgUks4MTdfUE9XRVJfRU5fUkVHKDMp LCBFTkFCTEVfTUFTSygwKSwKKwkJICAgRElTQUJMRV9WQUwoMCksIDQwMCksCisJUks4MTdfQk9P U1RfREVTQyhSSzgxN19JRF9CT09TVCwgIkJPT1NUIiwgInZjYzgiLCA0NzAwLCA1NDAwLCAxMDAs CisJCQkgUks4MTdfQk9PU1RfT1RHX0NGRywgUks4MTdfQk9PU1RfVlNFTF9NQVNLLAorCQkJIFJL ODE3X1BPV0VSX0VOX1JFRygzKSwgRU5BQkxFX01BU0soMSksIEVOQUJMRV9NQVNLKDEpLAorCQkg ICBESVNBQkxFX1ZBTCgxKSwgNDAwLCAzNTAwIC0gNTQwMCksCisJUks4MTdfREVTQ19TV0lUQ0go Uks4MTdfSURfQk9PU1RfT1RHX1NXLCAiT1RHX1NXSVRDSCIsICJ2Y2M5IiwKKwkJCSAgUks4MTdf UE9XRVJfRU5fUkVHKDMpLCBFTkFCTEVfTUFTSygyKSwKKwkJCSAgRElTQUJMRV9WQUwoMikpLAor fTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCByZWd1bGF0b3JfZGVzYyByazgxOF9yZWdbXSA9IHsK IAl7CiAJCS5uYW1lID0gIkRDRENfUkVHMSIsCkBAIC03NjUsNiArMTM1MCwxNCBAQCBzdGF0aWMg aW50IHJrODA4X3JlZ3VsYXRvcl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQog CQlyZWd1bGF0b3JzID0gcms4MDhfcmVnOwogCQlucmVndWxhdG9ycyA9IFJLODA4X05VTV9SRUdV TEFUT1JTOwogCQlicmVhazsKKwljYXNlIFJLODA5X0lEOgorCQlyZWd1bGF0b3JzID0gcms4MDlf cmVnOworCQlucmVndWxhdG9ycyA9IFJLODA5X05VTV9SRUdVTEFUT1JTOworCQlicmVhazsKKwlj YXNlIFJLODE3X0lEOgorCQlyZWd1bGF0b3JzID0gcms4MTdfcmVnOworCQlucmVndWxhdG9ycyA9 IFJLODE3X05VTV9SRUdVTEFUT1JTOworCQlicmVhazsKIAljYXNlIFJLODE4X0lEOgogCQlyZWd1 bGF0b3JzID0gcms4MThfcmVnOwogCQlucmVndWxhdG9ycyA9IFJLODE4X05VTV9SRUdVTEFUT1JT OwpAQCAtODAzLDYgKzEzOTYsNyBAQCBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciByazgw OF9yZWd1bGF0b3JfZHJpdmVyID0gewogbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihyazgwOF9yZWd1 bGF0b3JfZHJpdmVyKTsKIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJyZWd1bGF0b3IgZHJpdmVyIGZv ciB0aGUgUks4MDUvUks4MDgvUks4MTggc2VyaWVzIFBNSUNzIik7CitNT0RVTEVfQVVUSE9SKCJU b255IHhpZSA8dG9ueS54aWVAcm9jay1jaGlwcy5jb20+Iik7CiBNT0RVTEVfQVVUSE9SKCJDaHJp cyBaaG9uZyA8enl3QHJvY2stY2hpcHMuY29tPiIpOwogTU9EVUxFX0FVVEhPUigiWmhhbmcgUWlu ZyA8emhhbmdxaW5nQHJvY2stY2hpcHMuY29tPiIpOwogTU9EVUxFX0FVVEhPUigiV2FkaW0gRWdv cm92IDx3LmVnb3JvdkBwaHl0ZWMuZGU+Iik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21m ZC9yazgwOC5oIGIvaW5jbHVkZS9saW51eC9tZmQvcms4MDguaAppbmRleCAwZmQ5ZWVkZjNjMjAu LjJhOWNkMDE2OTFiMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvcms4MDguaAorKysg Yi9pbmNsdWRlL2xpbnV4L21mZC9yazgwOC5oCkBAIC0zOTYsNyArMzk2LDEwIEBAIGVudW0gcms4 MDVfcmVnIHsKICNkZWZpbmUgU0hVVERPV05fRlVOCQkJKDB4MiA8PCAyKQogI2RlZmluZSBTTEVF UF9GVU4JCQkoMHgxIDw8IDIpCiAjZGVmaW5lIFJLOFhYX0lEX01TSwkJCTB4ZmZmMAorI2RlZmlu ZSBQV01fTU9ERV9NU0sJCQlCSVQoNykKICNkZWZpbmUgRlBXTV9NT0RFCQkJQklUKDcpCisjZGVm aW5lIEFVVE9fUFdNX01PREUJCQkwCisKIGVudW0gcms4MTdfcmVnX2lkIHsKIAlSSzgxN19JRF9E Q0RDMSA9IDAsCiAJUks4MTdfSURfRENEQzIsCi0tIAoyLjIwLjEKCgoKCgpfX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1haWxp bmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3Rz LmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCg==