From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D5A9853A0 for ; Thu, 9 Nov 2023 03:26:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="C7t0dFiP" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 09F16C433C8; Thu, 9 Nov 2023 03:26:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1699500380; bh=PU6sK4Ov586+n9ZFXKoNa98Ilva3IBaB9Q4vCXGsCdg=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=C7t0dFiPe9OU6D+eLUWdMkEEDClcBKvNwa/9NPqxGcltEFgKfLpxbTAfCPM6fvYf7 4JV/aPkmt0/DYRJyzInSNy33+k7cY1BgRVBFR1kODW15MvHzt1yyRVZdNF89NTkKVu /5W6NuFGv2F9aythl0Tl1+OGTYD5VVqszqPpmmc/MmhFzzR7dfewpuRFiiQA08XTbq T/fof2FJHpD6O0q41a9oly1XOObk0sqBcG/8i3W5ULZCfHV6JLyd8Ov1yInMlvULFI 4PYv2M7cI0mBL2HO7k6Bt+AeO2634shmQL3gJxjNx0dPs3ktNvnj+to4wnuBo2lIqT TRVemY6kLZ2SA== Date: Thu, 9 Nov 2023 08:56:04 +0530 From: Manivannan Sadhasivam To: Can Guo Cc: Dmitry Baryshkov , Can Guo , bvanassche@acm.org, stanley.chu@mediatek.com, adrian.hunter@intel.com, beanhuo@micron.com, avri.altman@wdc.com, junwoo80.lee@samsung.com, martin.petersen@oracle.com, linux-scsi@vger.kernel.org, Andy Gross , Bjorn Andersson , Konrad Dybcio , Vinod Koul , Kishon Vijay Abraham I , "open list:ARM/QUALCOMM SUPPORT" , "open list:GENERIC PHY FRAMEWORK" , open list Subject: Re: [PATCH v2 6/7] phy: qualcomm: phy-qcom-qmp-ufs: Add High Speed Gear 5 support for SM8550 Message-ID: <20231109032604.GB3752@thinkpad> References: <1699332374-9324-1-git-send-email-cang@qti.qualcomm.com> <1699332374-9324-7-git-send-email-cang@qti.qualcomm.com> <20231108054942.GF3296@thinkpad> Precedence: bulk X-Mailing-List: linux-arm-msm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: On Wed, Nov 08, 2023 at 05:19:43PM +0800, Can Guo wrote: > Hi Mani, > > On 11/8/2023 1:49 PM, Manivannan Sadhasivam wrote: > > On Tue, Nov 07, 2023 at 03:18:09PM +0200, Dmitry Baryshkov wrote: > > > On Tue, 7 Nov 2023 at 06:47, Can Guo wrote: > > > > > > > > From: Can Guo > > > > > > > > On SM8550, two sets of UFS PHY settings are provided, one set is to support > > > > HS-G5, another set is to support HS-G4 and lower gears. The two sets of PHY > > > > settings are programming different values to different registers, mixing > > > > the two sets and/or overwriting one set with another set is definitely not > > > > blessed by UFS PHY designers. In order to add HS-G5 support for SM8550, we > > > > need to split the two sets into their dedicated tables, and leave only the > > > > common settings in the .tlbs. To have the PHY programmed with the correct > > > > set of PHY settings, the submode passed to PHY driver must be either HS-G4 > > > > or HS-G5. > > > > > > > > You should also mention that this issue is also present in G4 supported targets. > > And a note that it will get fixed later. > > Will this info upset more people? How about I mention this in the cover > letter? > It is working fine for now and we just want to make sure the sequence is aligned with HPG. So I don't think it can upset anyone. But yeah, you can just mention it in the cover letter. - Mani > > > > > > Signed-off-by: Can Guo > > > > --- > > > > drivers/phy/qualcomm/phy-qcom-qmp-pcs-ufs-v6.h | 2 + > > > > drivers/phy/qualcomm/phy-qcom-qmp-qserdes-com-v6.h | 2 + > > > > .../qualcomm/phy-qcom-qmp-qserdes-txrx-ufs-v6.h | 12 +++ > > > > drivers/phy/qualcomm/phy-qcom-qmp-ufs.c | 112 ++++++++++++++++++--- > > > > 4 files changed, 115 insertions(+), 13 deletions(-) > > > > > > > > diff --git a/drivers/phy/qualcomm/phy-qcom-qmp-pcs-ufs-v6.h b/drivers/phy/qualcomm/phy-qcom-qmp-pcs-ufs-v6.h > > > > index c23d5e4..e563af5 100644 > > > > --- a/drivers/phy/qualcomm/phy-qcom-qmp-pcs-ufs-v6.h > > > > +++ b/drivers/phy/qualcomm/phy-qcom-qmp-pcs-ufs-v6.h > > > > @@ -18,6 +18,7 @@ > > > > #define QPHY_V6_PCS_UFS_BIST_FIXED_PAT_CTRL 0x060 > > > > #define QPHY_V6_PCS_UFS_TX_HSGEAR_CAPABILITY 0x074 > > > > #define QPHY_V6_PCS_UFS_RX_HSGEAR_CAPABILITY 0x0bc > > > > +#define QPHY_V6_PCS_UFS_RX_HS_G5_SYNC_LENGTH_CAPABILITY 0x12c > > > > #define QPHY_V6_PCS_UFS_DEBUG_BUS_CLKSEL 0x158 > > > > #define QPHY_V6_PCS_UFS_LINECFG_DISABLE 0x17c > > > > #define QPHY_V6_PCS_UFS_RX_MIN_HIBERN8_TIME 0x184 > > > > @@ -27,5 +28,6 @@ > > > > #define QPHY_V6_PCS_UFS_READY_STATUS 0x1a8 > > > > #define QPHY_V6_PCS_UFS_TX_MID_TERM_CTRL1 0x1f4 > > > > #define QPHY_V6_PCS_UFS_MULTI_LANE_CTRL1 0x1fc > > > > +#define QPHY_V6_PCS_UFS_RX_HSG5_SYNC_WAIT_TIME 0x220 > > > > > > > > #endif > > > > diff --git a/drivers/phy/qualcomm/phy-qcom-qmp-qserdes-com-v6.h b/drivers/phy/qualcomm/phy-qcom-qmp-qserdes-com-v6.h > > > > index f420f8f..ef392ce 100644 > > > > --- a/drivers/phy/qualcomm/phy-qcom-qmp-qserdes-com-v6.h > > > > +++ b/drivers/phy/qualcomm/phy-qcom-qmp-qserdes-com-v6.h > > > > @@ -56,6 +56,8 @@ > > > > #define QSERDES_V6_COM_SYS_CLK_CTRL 0xe4 > > > > #define QSERDES_V6_COM_SYSCLK_BUF_ENABLE 0xe8 > > > > #define QSERDES_V6_COM_PLL_IVCO 0xf4 > > > > +#define QSERDES_V6_COM_CMN_IETRIM 0xfc > > > > +#define QSERDES_V6_COM_CMN_IPTRIM 0x100 > > > > #define QSERDES_V6_COM_SYSCLK_EN_SEL 0x110 > > > > #define QSERDES_V6_COM_RESETSM_CNTRL 0x118 > > > > #define QSERDES_V6_COM_LOCK_CMP_EN 0x120 > > > > diff --git a/drivers/phy/qualcomm/phy-qcom-qmp-qserdes-txrx-ufs-v6.h b/drivers/phy/qualcomm/phy-qcom-qmp-qserdes-txrx-ufs-v6.h > > > > index 15bcb4b..48f31c8 100644 > > > > --- a/drivers/phy/qualcomm/phy-qcom-qmp-qserdes-txrx-ufs-v6.h > > > > +++ b/drivers/phy/qualcomm/phy-qcom-qmp-qserdes-txrx-ufs-v6.h > > > > @@ -10,10 +10,20 @@ > > > > #define QSERDES_UFS_V6_TX_RES_CODE_LANE_RX 0x2c > > > > #define QSERDES_UFS_V6_TX_RES_CODE_LANE_OFFSET_TX 0x30 > > > > #define QSERDES_UFS_V6_TX_RES_CODE_LANE_OFFSET_RX 0x34 > > > > +#define QSERDES_UFS_V6_TX_LANE_MODE_1 0x7c > > > > +#define QSERDES_UFS_V6_TX_FR_DCC_CTRL 0x108 > > > > > > > > #define QSERDES_UFS_V6_RX_UCDR_FASTLOCK_FO_GAIN_RATE2 0x08 > > > > #define QSERDES_UFS_V6_RX_UCDR_FASTLOCK_FO_GAIN_RATE4 0x10 > > > > +#define QSERDES_UFS_V6_RX_UCDR_FASTLOCK_SO_GAIN_RATE4 0x24 > > > > +#define QSERDES_UFS_V6_RX_UCDR_FASTLOCK_COUNT_HIGH_RATE4 0x54 > > > > +#define QSERDES_UFS_V6_RX_UCDR_FO_GAIN_RATE2 0xd4 > > > > +#define QSERDES_UFS_V6_RX_UCDR_FO_GAIN_RATE4 0xdc > > > > +#define QSERDES_UFS_V6_RX_UCDR_SO_GAIN_RATE4 0xf0 > > > > +#define QSERDES_UFS_V6_RX_UCDR_PI_CONTROLS 0xf4 > > > > #define QSERDES_UFS_V6_RX_VGA_CAL_MAN_VAL 0x178 > > > > +#define QSERDES_UFS_V6_RX_EQ_OFFSET_ADAPTOR_CNTRL1 0x1bc > > > > +#define QSERDES_UFS_V6_RX_OFFSET_ADAPTOR_CNTRL3 0x1c4 > > > > #define QSERDES_UFS_V6_RX_MODE_RATE_0_1_B0 0x208 > > > > #define QSERDES_UFS_V6_RX_MODE_RATE_0_1_B1 0x20c > > > > #define QSERDES_UFS_V6_RX_MODE_RATE_0_1_B3 0x214 > > > > @@ -25,6 +35,8 @@ > > > > #define QSERDES_UFS_V6_RX_MODE_RATE3_B5 0x264 > > > > #define QSERDES_UFS_V6_RX_MODE_RATE3_B8 0x270 > > > > #define QSERDES_UFS_V6_RX_MODE_RATE4_B3 0x280 > > > > +#define QSERDES_UFS_V6_RX_MODE_RATE4_B4 0x284 > > > > #define QSERDES_UFS_V6_RX_MODE_RATE4_B6 0x28c > > > > +#define QSERDES_UFS_V6_RX_DLL0_FTUNE_CTRL 0x2f8 > > > > > > > > #endif > > > > diff --git a/drivers/phy/qualcomm/phy-qcom-qmp-ufs.c b/drivers/phy/qualcomm/phy-qcom-qmp-ufs.c > > > > index 3927eba..e0a01497 100644 > > > > --- a/drivers/phy/qualcomm/phy-qcom-qmp-ufs.c > > > > +++ b/drivers/phy/qualcomm/phy-qcom-qmp-ufs.c > > > > @@ -649,32 +649,51 @@ static const struct qmp_phy_init_tbl sm8550_ufsphy_serdes[] = { > > > > QMP_PHY_INIT_CFG(QSERDES_V6_COM_HSCLK_SEL_1, 0x11), > > > > QMP_PHY_INIT_CFG(QSERDES_V6_COM_HSCLK_HS_SWITCH_SEL_1, 0x00), > > > > QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP_EN, 0x01), > > > > - QMP_PHY_INIT_CFG(QSERDES_V6_COM_VCO_TUNE_MAP, 0x04), > > > > - QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_IVCO, 0x0f), > > > > + > > > > QMP_PHY_INIT_CFG(QSERDES_V6_COM_VCO_TUNE_INITVAL2, 0x00), > > > > QMP_PHY_INIT_CFG(QSERDES_V6_COM_DEC_START_MODE0, 0x41), > > > > - QMP_PHY_INIT_CFG(QSERDES_V6_COM_CP_CTRL_MODE0, 0x0a), > > > > QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_RCTRL_MODE0, 0x18), > > > > QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_CCTRL_MODE0, 0x14), > > > > QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP1_MODE0, 0x7f), > > > > QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP2_MODE0, 0x06), > > > > - QMP_PHY_INIT_CFG(QSERDES_V6_COM_DEC_START_MODE0, 0x4c), > > > > +}; > > > > + > > > > +static const struct qmp_phy_init_tbl sm8550_ufsphy_hs_b_serdes[] = { > > > > + QMP_PHY_INIT_CFG(QSERDES_V6_COM_VCO_TUNE_MAP, 0x44), > > > > +}; > > > > + > > > > +static const struct qmp_phy_init_tbl sm8550_ufsphy_g4_serdes[] = { > > > > + QMP_PHY_INIT_CFG(QSERDES_V6_COM_VCO_TUNE_MAP, 0x04), > > > > + QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_IVCO, 0x0f), > > > > QMP_PHY_INIT_CFG(QSERDES_V6_COM_CP_CTRL_MODE0, 0x0a), > > > > - QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_RCTRL_MODE0, 0x18), > > > > - QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_CCTRL_MODE0, 0x14), > > > > - QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP1_MODE0, 0x99), > > > > - QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP2_MODE0, 0x07), > > > > > > Aside from moving these registers to the HS_G4 table, you are also > > > changing these registers. It makes me think that there was an error in > > > the original programming sequence. > > > If that is correct, could you please split the patch into two pieces: > > > - Fix programming sequence (add proper Fixes tags) > > > - Split G4 and G5 tables. > > > > Ack > > > > > > > > > + > > > > + QMP_PHY_INIT_CFG(QSERDES_V6_COM_DEC_START_MODE1, 0x4c), > > > > + QMP_PHY_INIT_CFG(QSERDES_V6_COM_CP_CTRL_MODE1, 0x0a), > > > > + QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_RCTRL_MODE1, 0x18), > > > > + QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_CCTRL_MODE1, 0x14), > > > > + QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP1_MODE1, 0x99), > > > > + QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP2_MODE1, 0x07), > > > > > > I see all the MODE1 registers being only present in G4 and G5 tables. > > > Should they be programmed for the modes lower than G4? > > > > > > > We use G4 table for all the modes <= G4. > > > > > > +}; > > > > + > > > > +static const struct qmp_phy_init_tbl sm8550_ufsphy_g5_serdes[] = { > > > > + QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_IVCO, 0x1f), > > > > + > > > > + QMP_PHY_INIT_CFG(QSERDES_V6_COM_CMN_IETRIM, 0x1b), > > > > + QMP_PHY_INIT_CFG(QSERDES_V6_COM_CMN_IPTRIM, 0x1c), > > > > + QMP_PHY_INIT_CFG(QSERDES_V6_COM_CP_CTRL_MODE0, 0x06), > > > > }; > > > > > > > > static const struct qmp_phy_init_tbl sm8550_ufsphy_tx[] = { > > > > - QMP_PHY_INIT_CFG(QSERDES_V6_TX_LANE_MODE_1, 0x05), > > > > + QMP_PHY_INIT_CFG(QSERDES_UFS_V6_TX_LANE_MODE_1, 0x05), > > > > QMP_PHY_INIT_CFG(QSERDES_UFS_V6_TX_RES_CODE_LANE_OFFSET_TX, 0x07), > > > > }; > > > > > > > > +static const struct qmp_phy_init_tbl sm8550_ufsphy_g4_tx[] = { > > > > + QMP_PHY_INIT_CFG(QSERDES_UFS_V6_TX_FR_DCC_CTRL, 0x4c), > > > > +}; > > > > + > > > > static const struct qmp_phy_init_tbl sm8550_ufsphy_rx[] = { > > > > - QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_UCDR_FASTLOCK_FO_GAIN_RATE2, 0x0c), > > > > - QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_UCDR_FASTLOCK_FO_GAIN_RATE4, 0x0f), > > > > - QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_VGA_CAL_MAN_VAL, 0x0e), > > > > + QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_UCDR_FO_GAIN_RATE2, 0x0c), > > > > > > > > QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE_0_1_B0, 0xc2), > > > > QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE_0_1_B1, 0xc2), > > > > @@ -690,14 +709,46 @@ static const struct qmp_phy_init_tbl sm8550_ufsphy_rx[] = { > > > > QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE3_B8, 0x02), > > > > }; > > > > > > > > +static const struct qmp_phy_init_tbl sm8550_ufsphy_g4_rx[] = { > > > > + QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_VGA_CAL_MAN_VAL, 0x0e), > > > > +}; > > > > + > > > > +static const struct qmp_phy_init_tbl sm8550_ufsphy_g5_rx[] = { > > > > + QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_UCDR_FO_GAIN_RATE4, 0x0c), > > > > + QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_UCDR_SO_GAIN_RATE4, 0x04), > > > > + QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x14), > > > > + QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_UCDR_PI_CONTROLS, 0x07), > > > > + QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_OFFSET_ADAPTOR_CNTRL3, 0x0e), > > > > + QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_UCDR_FASTLOCK_COUNT_HIGH_RATE4, 0x02), > > > > + QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_UCDR_FASTLOCK_FO_GAIN_RATE4, 0x1c), > > > > + QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_UCDR_FASTLOCK_SO_GAIN_RATE4, 0x06), > > > > + QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_VGA_CAL_MAN_VAL, 0x08), > > > > + > > > > + QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE4_B3, 0xb9), > > > > + QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE4_B4, 0x4f), > > > > + QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE4_B6, 0xff), > > > > + QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_DLL0_FTUNE_CTRL, 0x30), > > > > +}; > > > > + > > > > static const struct qmp_phy_init_tbl sm8550_ufsphy_pcs[] = { > > > > QMP_PHY_INIT_CFG(QPHY_V6_PCS_UFS_RX_SIGDET_CTRL2, 0x69), > > > > QMP_PHY_INIT_CFG(QPHY_V6_PCS_UFS_TX_LARGE_AMP_DRV_LVL, 0x0f), > > > > QMP_PHY_INIT_CFG(QPHY_V6_PCS_UFS_TX_MID_TERM_CTRL1, 0x43), > > > > - QMP_PHY_INIT_CFG(QPHY_V6_PCS_UFS_PLL_CNTL, 0x2b), > > > > QMP_PHY_INIT_CFG(QPHY_V6_PCS_UFS_MULTI_LANE_CTRL1, 0x02), > > > > }; > > > > > > > > +static const struct qmp_phy_init_tbl sm8550_ufsphy_g4_pcs[] = { > > > > + QMP_PHY_INIT_CFG(QPHY_V6_PCS_UFS_PLL_CNTL, 0x2b), > > > > + QMP_PHY_INIT_CFG(QPHY_V6_PCS_UFS_TX_HSGEAR_CAPABILITY, 0x04), > > > > + QMP_PHY_INIT_CFG(QPHY_V6_PCS_UFS_RX_HSGEAR_CAPABILITY, 0x04), > > > > +}; > > > > + > > > > +static const struct qmp_phy_init_tbl sm8550_ufsphy_g5_pcs[] = { > > > > + QMP_PHY_INIT_CFG(QPHY_V6_PCS_UFS_PLL_CNTL, 0x33), > > > > + QMP_PHY_INIT_CFG(QPHY_V6_PCS_UFS_RX_HS_G5_SYNC_LENGTH_CAPABILITY, 0x4f), > > > > + QMP_PHY_INIT_CFG(QPHY_V6_PCS_UFS_RX_HSG5_SYNC_WAIT_TIME, 0x9e), > > > > +}; > > > > + > > > > struct qmp_ufs_offsets { > > > > u16 serdes; > > > > u16 pcs; > > > > @@ -731,6 +782,8 @@ struct qmp_phy_cfg { > > > > const struct qmp_phy_cfg_tbls tbls_hs_b; > > > > /* Additional sequence for HS G4 */ > > > > const struct qmp_phy_cfg_tbls tbls_hs_g4; > > > > + /* Additional sequence for HS G4 */ > > > > HS G5 > > Sure > > > > > > > + const struct qmp_phy_cfg_tbls tbls_hs_g5; > > > > > > > > /* clock ids to be requested */ > > > > const char * const *clk_list; > > > > @@ -1157,6 +1210,28 @@ static const struct qmp_phy_cfg sm8550_ufsphy_cfg = { > > > > .pcs = sm8550_ufsphy_pcs, > > > > .pcs_num = ARRAY_SIZE(sm8550_ufsphy_pcs), > > > > }, > > > > + .tbls_hs_b = { > > > > + .serdes = sm8550_ufsphy_hs_b_serdes, > > > > + .serdes_num = ARRAY_SIZE(sm8550_ufsphy_hs_b_serdes), > > > > + }, > > > > + .tbls_hs_g4 = { > > > > + .serdes = sm8550_ufsphy_g4_serdes, > > > > + .serdes_num = ARRAY_SIZE(sm8550_ufsphy_g4_serdes), > > > > + .tx = sm8550_ufsphy_g4_tx, > > > > + .tx_num = ARRAY_SIZE(sm8550_ufsphy_g4_tx), > > > > + .rx = sm8550_ufsphy_g4_rx, > > > > + .rx_num = ARRAY_SIZE(sm8550_ufsphy_g4_rx), > > > > + .pcs = sm8550_ufsphy_g4_pcs, > > > > + .pcs_num = ARRAY_SIZE(sm8550_ufsphy_g4_pcs), > > > > + }, > > > > + .tbls_hs_g5 = { > > > > + .serdes = sm8550_ufsphy_g5_serdes, > > > > + .serdes_num = ARRAY_SIZE(sm8550_ufsphy_g5_serdes), > > > > + .rx = sm8550_ufsphy_g5_rx, > > > > + .rx_num = ARRAY_SIZE(sm8550_ufsphy_g5_rx), > > > > + .pcs = sm8550_ufsphy_g5_pcs, > > > > + .pcs_num = ARRAY_SIZE(sm8550_ufsphy_g5_pcs), > > > > + }, > > > > .clk_list = sdm845_ufs_phy_clk_l, > > > > .num_clks = ARRAY_SIZE(sdm845_ufs_phy_clk_l), > > > > .vreg_list = qmp_phy_vreg_l, > > > > @@ -1222,14 +1297,25 @@ static void qmp_ufs_pcs_init(struct qmp_ufs *qmp, const struct qmp_phy_cfg_tbls > > > > static void qmp_ufs_init_registers(struct qmp_ufs *qmp, const struct qmp_phy_cfg *cfg) > > > > { > > > > qmp_ufs_serdes_init(qmp, &cfg->tbls); > > > > + if (qmp->submode == UFS_HS_G4) > > > > + qmp_ufs_serdes_init(qmp, &cfg->tbls_hs_g4); > > > > + else if (qmp->submode == UFS_HS_G5) > > > > + qmp_ufs_serdes_init(qmp, &cfg->tbls_hs_g5); > > > > + > > > > Should we program submode sequence after HS_B? > > > > - Mani > > > As the UFS PHY HW programming doc mentions, order of these writes is not > important, so long as they are programmed correctly before release S/W > reset, then it is fine. > > Thanks, > Can Guo. > > -- மணிவண்ணன் சதாசிவம் 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 8519BC4332F for ; Thu, 9 Nov 2023 03:26:27 +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=rsulwT0kcWT3Lgy3e1nZGSmiaOcuwn8rlGLUsTk4+eU=; b=ilXHTZah7haXDS mvZmzIJ/FoGAQtpP+C4TPlsPLnlphVfWSEuBB23hWdm9ng3IVQQciGPG49ZlVa5484fBRkQjiJzmq e+T3Wf6qfgYEaUffiBrVn7dsO1GoTHS6KoCyK48xP3rYoTxSEKCVBCOmzbKknIoyUJ6VPSd35tudz eBbd5XP6Kr6Kcsjzk/PfGUVFALWfacBwm9pmazkzZih5aDamA92LfKBpRfO9z5Kapip4nsJA3ZCg4 d+E8Hi2aSLwPYiAd4Qy0OwpI/5S58K7RRhGMjglgO0CE2SBtOMdFYJlTY5zD9HvCa5Ok6hM5MuOCx 0bNYbHujlqwMIHPh5qDQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1r0vgZ-005Aq5-0M; Thu, 09 Nov 2023 03:26:27 +0000 Received: from sin.source.kernel.org ([2604:1380:40e1:4800::1]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1r0vgU-005Aoh-38 for linux-phy@lists.infradead.org; Thu, 09 Nov 2023 03:26:25 +0000 Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by sin.source.kernel.org (Postfix) with ESMTP id 03D7ACE1189; Thu, 9 Nov 2023 03:26:21 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 09F16C433C8; Thu, 9 Nov 2023 03:26:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1699500380; bh=PU6sK4Ov586+n9ZFXKoNa98Ilva3IBaB9Q4vCXGsCdg=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=C7t0dFiPe9OU6D+eLUWdMkEEDClcBKvNwa/9NPqxGcltEFgKfLpxbTAfCPM6fvYf7 4JV/aPkmt0/DYRJyzInSNy33+k7cY1BgRVBFR1kODW15MvHzt1yyRVZdNF89NTkKVu /5W6NuFGv2F9aythl0Tl1+OGTYD5VVqszqPpmmc/MmhFzzR7dfewpuRFiiQA08XTbq T/fof2FJHpD6O0q41a9oly1XOObk0sqBcG/8i3W5ULZCfHV6JLyd8Ov1yInMlvULFI 4PYv2M7cI0mBL2HO7k6Bt+AeO2634shmQL3gJxjNx0dPs3ktNvnj+to4wnuBo2lIqT TRVemY6kLZ2SA== Date: Thu, 9 Nov 2023 08:56:04 +0530 From: Manivannan Sadhasivam To: Can Guo Cc: Dmitry Baryshkov , Can Guo , bvanassche@acm.org, stanley.chu@mediatek.com, adrian.hunter@intel.com, beanhuo@micron.com, avri.altman@wdc.com, junwoo80.lee@samsung.com, martin.petersen@oracle.com, linux-scsi@vger.kernel.org, Andy Gross , Bjorn Andersson , Konrad Dybcio , Vinod Koul , Kishon Vijay Abraham I , "open list:ARM/QUALCOMM SUPPORT" , "open list:GENERIC PHY FRAMEWORK" , open list Subject: Re: [PATCH v2 6/7] phy: qualcomm: phy-qcom-qmp-ufs: Add High Speed Gear 5 support for SM8550 Message-ID: <20231109032604.GB3752@thinkpad> References: <1699332374-9324-1-git-send-email-cang@qti.qualcomm.com> <1699332374-9324-7-git-send-email-cang@qti.qualcomm.com> <20231108054942.GF3296@thinkpad> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20231108_192623_356728_5EEDF2BE X-CRM114-Status: GOOD ( 38.42 ) X-BeenThere: linux-phy@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Linux Phy Mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-phy" Errors-To: linux-phy-bounces+linux-phy=archiver.kernel.org@lists.infradead.org T24gV2VkLCBOb3YgMDgsIDIwMjMgYXQgMDU6MTk6NDNQTSArMDgwMCwgQ2FuIEd1byB3cm90ZToK PiBIaSBNYW5pLAo+IAo+IE9uIDExLzgvMjAyMyAxOjQ5IFBNLCBNYW5pdmFubmFuIFNhZGhhc2l2 YW0gd3JvdGU6Cj4gPiBPbiBUdWUsIE5vdiAwNywgMjAyMyBhdCAwMzoxODowOVBNICswMjAwLCBE bWl0cnkgQmFyeXNoa292IHdyb3RlOgo+ID4gPiBPbiBUdWUsIDcgTm92IDIwMjMgYXQgMDY6NDcs IENhbiBHdW8gPGNhbmdAcXRpLnF1YWxjb21tLmNvbT4gd3JvdGU6Cj4gPiA+ID4gCj4gPiA+ID4g RnJvbTogQ2FuIEd1byA8cXVpY19jYW5nQHF1aWNpbmMuY29tPgo+ID4gPiA+IAo+ID4gPiA+IE9u IFNNODU1MCwgdHdvIHNldHMgb2YgVUZTIFBIWSBzZXR0aW5ncyBhcmUgcHJvdmlkZWQsIG9uZSBz ZXQgaXMgdG8gc3VwcG9ydAo+ID4gPiA+IEhTLUc1LCBhbm90aGVyIHNldCBpcyB0byBzdXBwb3J0 IEhTLUc0IGFuZCBsb3dlciBnZWFycy4gVGhlIHR3byBzZXRzIG9mIFBIWQo+ID4gPiA+IHNldHRp bmdzIGFyZSBwcm9ncmFtbWluZyBkaWZmZXJlbnQgdmFsdWVzIHRvIGRpZmZlcmVudCByZWdpc3Rl cnMsIG1peGluZwo+ID4gPiA+IHRoZSB0d28gc2V0cyBhbmQvb3Igb3ZlcndyaXRpbmcgb25lIHNl dCB3aXRoIGFub3RoZXIgc2V0IGlzIGRlZmluaXRlbHkgbm90Cj4gPiA+ID4gYmxlc3NlZCBieSBV RlMgUEhZIGRlc2lnbmVycy4gSW4gb3JkZXIgdG8gYWRkIEhTLUc1IHN1cHBvcnQgZm9yIFNNODU1 MCwgd2UKPiA+ID4gPiBuZWVkIHRvIHNwbGl0IHRoZSB0d28gc2V0cyBpbnRvIHRoZWlyIGRlZGlj YXRlZCB0YWJsZXMsIGFuZCBsZWF2ZSBvbmx5IHRoZQo+ID4gPiA+IGNvbW1vbiBzZXR0aW5ncyBp biB0aGUgLnRsYnMuIFRvIGhhdmUgdGhlIFBIWSBwcm9ncmFtbWVkIHdpdGggdGhlIGNvcnJlY3QK PiA+ID4gPiBzZXQgb2YgUEhZIHNldHRpbmdzLCB0aGUgc3VibW9kZSBwYXNzZWQgdG8gUEhZIGRy aXZlciBtdXN0IGJlIGVpdGhlciBIUy1HNAo+ID4gPiA+IG9yIEhTLUc1Lgo+ID4gPiA+IAo+ID4g Cj4gPiBZb3Ugc2hvdWxkIGFsc28gbWVudGlvbiB0aGF0IHRoaXMgaXNzdWUgaXMgYWxzbyBwcmVz ZW50IGluIEc0IHN1cHBvcnRlZCB0YXJnZXRzLgo+ID4gQW5kIGEgbm90ZSB0aGF0IGl0IHdpbGwg Z2V0IGZpeGVkIGxhdGVyLgo+IAo+IFdpbGwgdGhpcyBpbmZvIHVwc2V0IG1vcmUgcGVvcGxlPyBI b3cgYWJvdXQgSSBtZW50aW9uIHRoaXMgaW4gdGhlIGNvdmVyCj4gbGV0dGVyPwo+IAoKSXQgaXMg d29ya2luZyBmaW5lIGZvciBub3cgYW5kIHdlIGp1c3Qgd2FudCB0byBtYWtlIHN1cmUgdGhlIHNl cXVlbmNlIGlzIGFsaWduZWQKd2l0aCBIUEcuIFNvIEkgZG9uJ3QgdGhpbmsgaXQgY2FuIHVwc2V0 IGFueW9uZS4gQnV0IHllYWgsIHlvdSBjYW4ganVzdCBtZW50aW9uCml0IGluIHRoZSBjb3ZlciBs ZXR0ZXIuCgotIE1hbmkKCj4gPiAKPiA+ID4gPiBTaWduZWQtb2ZmLWJ5OiBDYW4gR3VvIDxxdWlj X2NhbmdAcXVpY2luYy5jb20+Cj4gPiA+ID4gLS0tCj4gPiA+ID4gICBkcml2ZXJzL3BoeS9xdWFs Y29tbS9waHktcWNvbS1xbXAtcGNzLXVmcy12Ni5oICAgICB8ICAgMiArCj4gPiA+ID4gICBkcml2 ZXJzL3BoeS9xdWFsY29tbS9waHktcWNvbS1xbXAtcXNlcmRlcy1jb20tdjYuaCB8ICAgMiArCj4g PiA+ID4gICAuLi4vcXVhbGNvbW0vcGh5LXFjb20tcW1wLXFzZXJkZXMtdHhyeC11ZnMtdjYuaCAg ICB8ICAxMiArKysKPiA+ID4gPiAgIGRyaXZlcnMvcGh5L3F1YWxjb21tL3BoeS1xY29tLXFtcC11 ZnMuYyAgICAgICAgICAgIHwgMTEyICsrKysrKysrKysrKysrKysrKy0tLQo+ID4gPiA+ICAgNCBm aWxlcyBjaGFuZ2VkLCAxMTUgaW5zZXJ0aW9ucygrKSwgMTMgZGVsZXRpb25zKC0pCj4gPiA+ID4g Cj4gPiA+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L3F1YWxjb21tL3BoeS1xY29tLXFtcC1w Y3MtdWZzLXY2LmggYi9kcml2ZXJzL3BoeS9xdWFsY29tbS9waHktcWNvbS1xbXAtcGNzLXVmcy12 Ni5oCj4gPiA+ID4gaW5kZXggYzIzZDVlNC4uZTU2M2FmNSAxMDA2NDQKPiA+ID4gPiAtLS0gYS9k cml2ZXJzL3BoeS9xdWFsY29tbS9waHktcWNvbS1xbXAtcGNzLXVmcy12Ni5oCj4gPiA+ID4gKysr IGIvZHJpdmVycy9waHkvcXVhbGNvbW0vcGh5LXFjb20tcW1wLXBjcy11ZnMtdjYuaAo+ID4gPiA+ IEBAIC0xOCw2ICsxOCw3IEBACj4gPiA+ID4gICAjZGVmaW5lIFFQSFlfVjZfUENTX1VGU19CSVNU X0ZJWEVEX1BBVF9DVFJMICAgICAgICAgICAgMHgwNjAKPiA+ID4gPiAgICNkZWZpbmUgUVBIWV9W Nl9QQ1NfVUZTX1RYX0hTR0VBUl9DQVBBQklMSVRZICAgICAgICAgICAweDA3NAo+ID4gPiA+ICAg I2RlZmluZSBRUEhZX1Y2X1BDU19VRlNfUlhfSFNHRUFSX0NBUEFCSUxJVFkgICAgICAgICAgIDB4 MGJjCj4gPiA+ID4gKyNkZWZpbmUgUVBIWV9WNl9QQ1NfVUZTX1JYX0hTX0c1X1NZTkNfTEVOR1RI X0NBUEFCSUxJVFkgICAgICAgIDB4MTJjCj4gPiA+ID4gICAjZGVmaW5lIFFQSFlfVjZfUENTX1VG U19ERUJVR19CVVNfQ0xLU0VMICAgICAgICAgICAgICAgMHgxNTgKPiA+ID4gPiAgICNkZWZpbmUg UVBIWV9WNl9QQ1NfVUZTX0xJTkVDRkdfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgICAgIDB4 MTdjCj4gPiA+ID4gICAjZGVmaW5lIFFQSFlfVjZfUENTX1VGU19SWF9NSU5fSElCRVJOOF9USU1F ICAgICAgICAgICAgMHgxODQKPiA+ID4gPiBAQCAtMjcsNSArMjgsNiBAQAo+ID4gPiA+ICAgI2Rl ZmluZSBRUEhZX1Y2X1BDU19VRlNfUkVBRFlfU1RBVFVTICAgICAgICAgICAgICAgICAgIDB4MWE4 Cj4gPiA+ID4gICAjZGVmaW5lIFFQSFlfVjZfUENTX1VGU19UWF9NSURfVEVSTV9DVFJMMSAgICAg ICAgICAgICAgMHgxZjQKPiA+ID4gPiAgICNkZWZpbmUgUVBIWV9WNl9QQ1NfVUZTX01VTFRJX0xB TkVfQ1RSTDEgICAgICAgICAgICAgICAweDFmYwo+ID4gPiA+ICsjZGVmaW5lIFFQSFlfVjZfUENT X1VGU19SWF9IU0c1X1NZTkNfV0FJVF9USU1FICAgICAgICAgMHgyMjAKPiA+ID4gPiAKPiA+ID4g PiAgICNlbmRpZgo+ID4gPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3BoeS9xdWFsY29tbS9waHkt cWNvbS1xbXAtcXNlcmRlcy1jb20tdjYuaCBiL2RyaXZlcnMvcGh5L3F1YWxjb21tL3BoeS1xY29t LXFtcC1xc2VyZGVzLWNvbS12Ni5oCj4gPiA+ID4gaW5kZXggZjQyMGY4Zi4uZWYzOTJjZSAxMDA2 NDQKPiA+ID4gPiAtLS0gYS9kcml2ZXJzL3BoeS9xdWFsY29tbS9waHktcWNvbS1xbXAtcXNlcmRl cy1jb20tdjYuaAo+ID4gPiA+ICsrKyBiL2RyaXZlcnMvcGh5L3F1YWxjb21tL3BoeS1xY29tLXFt cC1xc2VyZGVzLWNvbS12Ni5oCj4gPiA+ID4gQEAgLTU2LDYgKzU2LDggQEAKPiA+ID4gPiAgICNk ZWZpbmUgUVNFUkRFU19WNl9DT01fU1lTX0NMS19DVFJMICAgICAgICAgICAgICAgICAgICAgICAg ICAgIDB4ZTQKPiA+ID4gPiAgICNkZWZpbmUgUVNFUkRFU19WNl9DT01fU1lTQ0xLX0JVRl9FTkFC TEUgICAgICAgICAgICAgICAgICAgICAgIDB4ZTgKPiA+ID4gPiAgICNkZWZpbmUgUVNFUkRFU19W Nl9DT01fUExMX0lWQ08gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhm NAo+ID4gPiA+ICsjZGVmaW5lIFFTRVJERVNfVjZfQ09NX0NNTl9JRVRSSU0gICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAweGZjCj4gPiA+ID4gKyNkZWZpbmUgUVNFUkRFU19WNl9DT01fQ01O X0lQVFJJTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwCj4gPiA+ID4gICAjZGVm aW5lIFFTRVJERVNfVjZfQ09NX1NZU0NMS19FTl9TRUwgICAgICAgICAgICAgICAgICAgICAgICAg ICAweDExMAo+ID4gPiA+ICAgI2RlZmluZSBRU0VSREVTX1Y2X0NPTV9SRVNFVFNNX0NOVFJMICAg ICAgICAgICAgICAgICAgICAgICAgICAgMHgxMTgKPiA+ID4gPiAgICNkZWZpbmUgUVNFUkRFU19W Nl9DT01fTE9DS19DTVBfRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTIwCj4gPiA+ ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L3F1YWxjb21tL3BoeS1xY29tLXFtcC1xc2VyZGVz LXR4cngtdWZzLXY2LmggYi9kcml2ZXJzL3BoeS9xdWFsY29tbS9waHktcWNvbS1xbXAtcXNlcmRl cy10eHJ4LXVmcy12Ni5oCj4gPiA+ID4gaW5kZXggMTViY2I0Yi4uNDhmMzFjOCAxMDA2NDQKPiA+ ID4gPiAtLS0gYS9kcml2ZXJzL3BoeS9xdWFsY29tbS9waHktcWNvbS1xbXAtcXNlcmRlcy10eHJ4 LXVmcy12Ni5oCj4gPiA+ID4gKysrIGIvZHJpdmVycy9waHkvcXVhbGNvbW0vcGh5LXFjb20tcW1w LXFzZXJkZXMtdHhyeC11ZnMtdjYuaAo+ID4gPiA+IEBAIC0xMCwxMCArMTAsMjAgQEAKPiA+ID4g PiAgICNkZWZpbmUgUVNFUkRFU19VRlNfVjZfVFhfUkVTX0NPREVfTEFORV9SWCAgICAgICAgICAg ICAgICAgICAgIDB4MmMKPiA+ID4gPiAgICNkZWZpbmUgUVNFUkRFU19VRlNfVjZfVFhfUkVTX0NP REVfTEFORV9PRkZTRVRfVFggICAgICAgICAgICAgIDB4MzAKPiA+ID4gPiAgICNkZWZpbmUgUVNF UkRFU19VRlNfVjZfVFhfUkVTX0NPREVfTEFORV9PRkZTRVRfUlggICAgICAgICAgICAgIDB4MzQK PiA+ID4gPiArI2RlZmluZSBRU0VSREVTX1VGU19WNl9UWF9MQU5FX01PREVfMSAgICAgICAgICAg ICAgICAgICAgICAgICAgMHg3Ywo+ID4gPiA+ICsjZGVmaW5lIFFTRVJERVNfVUZTX1Y2X1RYX0ZS X0RDQ19DVFJMICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwOAo+ID4gPiA+IAo+ID4gPiA+ ICAgI2RlZmluZSBRU0VSREVTX1VGU19WNl9SWF9VQ0RSX0ZBU1RMT0NLX0ZPX0dBSU5fUkFURTIg ICAgICAgICAgMHgwOAo+ID4gPiA+ICAgI2RlZmluZSBRU0VSREVTX1VGU19WNl9SWF9VQ0RSX0ZB U1RMT0NLX0ZPX0dBSU5fUkFURTQgICAgICAgICAgMHgxMAo+ID4gPiA+ICsjZGVmaW5lIFFTRVJE RVNfVUZTX1Y2X1JYX1VDRFJfRkFTVExPQ0tfU09fR0FJTl9SQVRFNCAgICAgICAgICAweDI0Cj4g PiA+ID4gKyNkZWZpbmUgUVNFUkRFU19VRlNfVjZfUlhfVUNEUl9GQVNUTE9DS19DT1VOVF9ISUdI X1JBVEU0ICAgICAgIDB4NTQKPiA+ID4gPiArI2RlZmluZSBRU0VSREVTX1VGU19WNl9SWF9VQ0RS X0ZPX0dBSU5fUkFURTIgICAgICAgICAgICAgICAgICAgMHhkNAo+ID4gPiA+ICsjZGVmaW5lIFFT RVJERVNfVUZTX1Y2X1JYX1VDRFJfRk9fR0FJTl9SQVRFNCAgICAgICAgICAgICAgICAgICAweGRj Cj4gPiA+ID4gKyNkZWZpbmUgUVNFUkRFU19VRlNfVjZfUlhfVUNEUl9TT19HQUlOX1JBVEU0ICAg ICAgICAgICAgICAgICAgIDB4ZjAKPiA+ID4gPiArI2RlZmluZSBRU0VSREVTX1VGU19WNl9SWF9V Q0RSX1BJX0NPTlRST0xTICAgICAgICAgICAgICAgICAgICAgMHhmNAo+ID4gPiA+ICAgI2RlZmlu ZSBRU0VSREVTX1VGU19WNl9SWF9WR0FfQ0FMX01BTl9WQUwgICAgICAgICAgICAgICAgICAgICAg MHgxNzgKPiA+ID4gPiArI2RlZmluZSBRU0VSREVTX1VGU19WNl9SWF9FUV9PRkZTRVRfQURBUFRP Ul9DTlRSTDEgICAgICAgICAgICAgMHgxYmMKPiA+ID4gPiArI2RlZmluZSBRU0VSREVTX1VGU19W Nl9SWF9PRkZTRVRfQURBUFRPUl9DTlRSTDMgICAgICAgICAgICAgICAgICAgICAgICAweDFjNAo+ ID4gPiA+ICAgI2RlZmluZSBRU0VSREVTX1VGU19WNl9SWF9NT0RFX1JBVEVfMF8xX0IwICAgICAg ICAgICAgICAgICAgICAgMHgyMDgKPiA+ID4gPiAgICNkZWZpbmUgUVNFUkRFU19VRlNfVjZfUlhf TU9ERV9SQVRFXzBfMV9CMSAgICAgICAgICAgICAgICAgICAgIDB4MjBjCj4gPiA+ID4gICAjZGVm aW5lIFFTRVJERVNfVUZTX1Y2X1JYX01PREVfUkFURV8wXzFfQjMgICAgICAgICAgICAgICAgICAg ICAweDIxNAo+ID4gPiA+IEBAIC0yNSw2ICszNSw4IEBACj4gPiA+ID4gICAjZGVmaW5lIFFTRVJE RVNfVUZTX1Y2X1JYX01PREVfUkFURTNfQjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IDB4MjY0Cj4gPiA+ID4gICAjZGVmaW5lIFFTRVJERVNfVUZTX1Y2X1JYX01PREVfUkFURTNfQjgg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjcwCj4gPiA+ID4gICAjZGVmaW5lIFFT RVJERVNfVUZTX1Y2X1JYX01PREVfUkFURTRfQjMgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIDB4MjgwCj4gPiA+ID4gKyNkZWZpbmUgUVNFUkRFU19VRlNfVjZfUlhfTU9ERV9SQVRFNF9C NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyODQKPiA+ID4gPiAgICNkZWZpbmUg UVNFUkRFU19VRlNfVjZfUlhfTU9ERV9SQVRFNF9CNiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgMHgyOGMKPiA+ID4gPiArI2RlZmluZSBRU0VSREVTX1VGU19WNl9SWF9ETEwwX0ZUVU5F X0NUUkwgICAgICAgICAgICAgICAgICAgICAgMHgyZjgKPiA+ID4gPiAKPiA+ID4gPiAgICNlbmRp Zgo+ID4gPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3BoeS9xdWFsY29tbS9waHktcWNvbS1xbXAt dWZzLmMgYi9kcml2ZXJzL3BoeS9xdWFsY29tbS9waHktcWNvbS1xbXAtdWZzLmMKPiA+ID4gPiBp bmRleCAzOTI3ZWJhLi5lMGEwMTQ5NyAxMDA2NDQKPiA+ID4gPiAtLS0gYS9kcml2ZXJzL3BoeS9x dWFsY29tbS9waHktcWNvbS1xbXAtdWZzLmMKPiA+ID4gPiArKysgYi9kcml2ZXJzL3BoeS9xdWFs Y29tbS9waHktcWNvbS1xbXAtdWZzLmMKPiA+ID4gPiBAQCAtNjQ5LDMyICs2NDksNTEgQEAgc3Rh dGljIGNvbnN0IHN0cnVjdCBxbXBfcGh5X2luaXRfdGJsIHNtODU1MF91ZnNwaHlfc2VyZGVzW10g PSB7Cj4gPiA+ID4gICAgICAgICAgUU1QX1BIWV9JTklUX0NGRyhRU0VSREVTX1Y2X0NPTV9IU0NM S19TRUxfMSwgMHgxMSksCj4gPiA+ID4gICAgICAgICAgUU1QX1BIWV9JTklUX0NGRyhRU0VSREVT X1Y2X0NPTV9IU0NMS19IU19TV0lUQ0hfU0VMXzEsIDB4MDApLAo+ID4gPiA+ICAgICAgICAgIFFN UF9QSFlfSU5JVF9DRkcoUVNFUkRFU19WNl9DT01fTE9DS19DTVBfRU4sIDB4MDEpLAo+ID4gPiA+ IC0gICAgICAgUU1QX1BIWV9JTklUX0NGRyhRU0VSREVTX1Y2X0NPTV9WQ09fVFVORV9NQVAsIDB4 MDQpLAo+ID4gPiA+IC0gICAgICAgUU1QX1BIWV9JTklUX0NGRyhRU0VSREVTX1Y2X0NPTV9QTExf SVZDTywgMHgwZiksCj4gPiA+ID4gKwo+ID4gPiA+ICAgICAgICAgIFFNUF9QSFlfSU5JVF9DRkco UVNFUkRFU19WNl9DT01fVkNPX1RVTkVfSU5JVFZBTDIsIDB4MDApLAo+ID4gPiA+ICAgICAgICAg IFFNUF9QSFlfSU5JVF9DRkcoUVNFUkRFU19WNl9DT01fREVDX1NUQVJUX01PREUwLCAweDQxKSwK PiA+ID4gPiAtICAgICAgIFFNUF9QSFlfSU5JVF9DRkcoUVNFUkRFU19WNl9DT01fQ1BfQ1RSTF9N T0RFMCwgMHgwYSksCj4gPiA+ID4gICAgICAgICAgUU1QX1BIWV9JTklUX0NGRyhRU0VSREVTX1Y2 X0NPTV9QTExfUkNUUkxfTU9ERTAsIDB4MTgpLAo+ID4gPiA+ICAgICAgICAgIFFNUF9QSFlfSU5J VF9DRkcoUVNFUkRFU19WNl9DT01fUExMX0NDVFJMX01PREUwLCAweDE0KSwKPiA+ID4gPiAgICAg ICAgICBRTVBfUEhZX0lOSVRfQ0ZHKFFTRVJERVNfVjZfQ09NX0xPQ0tfQ01QMV9NT0RFMCwgMHg3 ZiksCj4gPiA+ID4gICAgICAgICAgUU1QX1BIWV9JTklUX0NGRyhRU0VSREVTX1Y2X0NPTV9MT0NL X0NNUDJfTU9ERTAsIDB4MDYpLAo+ID4gPiA+IC0gICAgICAgUU1QX1BIWV9JTklUX0NGRyhRU0VS REVTX1Y2X0NPTV9ERUNfU1RBUlRfTU9ERTAsIDB4NGMpLAo+ID4gPiA+ICt9Owo+ID4gPiA+ICsK PiA+ID4gPiArc3RhdGljIGNvbnN0IHN0cnVjdCBxbXBfcGh5X2luaXRfdGJsIHNtODU1MF91ZnNw aHlfaHNfYl9zZXJkZXNbXSA9IHsKPiA+ID4gPiArICAgICAgIFFNUF9QSFlfSU5JVF9DRkcoUVNF UkRFU19WNl9DT01fVkNPX1RVTkVfTUFQLCAweDQ0KSwKPiA+ID4gPiArfTsKPiA+ID4gPiArCj4g PiA+ID4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcW1wX3BoeV9pbml0X3RibCBzbTg1NTBfdWZzcGh5 X2c0X3NlcmRlc1tdID0gewo+ID4gPiA+ICsgICAgICAgUU1QX1BIWV9JTklUX0NGRyhRU0VSREVT X1Y2X0NPTV9WQ09fVFVORV9NQVAsIDB4MDQpLAo+ID4gPiA+ICsgICAgICAgUU1QX1BIWV9JTklU X0NGRyhRU0VSREVTX1Y2X0NPTV9QTExfSVZDTywgMHgwZiksCj4gPiA+ID4gICAgICAgICAgUU1Q X1BIWV9JTklUX0NGRyhRU0VSREVTX1Y2X0NPTV9DUF9DVFJMX01PREUwLCAweDBhKSwKPiA+ID4g PiAtICAgICAgIFFNUF9QSFlfSU5JVF9DRkcoUVNFUkRFU19WNl9DT01fUExMX1JDVFJMX01PREUw LCAweDE4KSwKPiA+ID4gPiAtICAgICAgIFFNUF9QSFlfSU5JVF9DRkcoUVNFUkRFU19WNl9DT01f UExMX0NDVFJMX01PREUwLCAweDE0KSwKPiA+ID4gPiAtICAgICAgIFFNUF9QSFlfSU5JVF9DRkco UVNFUkRFU19WNl9DT01fTE9DS19DTVAxX01PREUwLCAweDk5KSwKPiA+ID4gPiAtICAgICAgIFFN UF9QSFlfSU5JVF9DRkcoUVNFUkRFU19WNl9DT01fTE9DS19DTVAyX01PREUwLCAweDA3KSwKPiA+ ID4gCj4gPiA+IEFzaWRlIGZyb20gbW92aW5nIHRoZXNlIHJlZ2lzdGVycyB0byB0aGUgSFNfRzQg dGFibGUsIHlvdSBhcmUgYWxzbwo+ID4gPiBjaGFuZ2luZyB0aGVzZSByZWdpc3RlcnMuIEl0IG1h a2VzIG1lIHRoaW5rIHRoYXQgdGhlcmUgd2FzIGFuIGVycm9yIGluCj4gPiA+IHRoZSBvcmlnaW5h bCBwcm9ncmFtbWluZyBzZXF1ZW5jZS4KPiA+ID4gSWYgdGhhdCBpcyBjb3JyZWN0LCBjb3VsZCB5 b3UgcGxlYXNlIHNwbGl0IHRoZSBwYXRjaCBpbnRvIHR3byBwaWVjZXM6Cj4gPiA+IC0gRml4IHBy b2dyYW1taW5nIHNlcXVlbmNlIChhZGQgcHJvcGVyIEZpeGVzIHRhZ3MpCj4gPiA+IC0gU3BsaXQg RzQgYW5kIEc1IHRhYmxlcy4KPiA+IAo+ID4gQWNrCj4gPiAKPiA+ID4gCj4gPiA+ID4gKwo+ID4g PiA+ICsgICAgICAgUU1QX1BIWV9JTklUX0NGRyhRU0VSREVTX1Y2X0NPTV9ERUNfU1RBUlRfTU9E RTEsIDB4NGMpLAo+ID4gPiA+ICsgICAgICAgUU1QX1BIWV9JTklUX0NGRyhRU0VSREVTX1Y2X0NP TV9DUF9DVFJMX01PREUxLCAweDBhKSwKPiA+ID4gPiArICAgICAgIFFNUF9QSFlfSU5JVF9DRkco UVNFUkRFU19WNl9DT01fUExMX1JDVFJMX01PREUxLCAweDE4KSwKPiA+ID4gPiArICAgICAgIFFN UF9QSFlfSU5JVF9DRkcoUVNFUkRFU19WNl9DT01fUExMX0NDVFJMX01PREUxLCAweDE0KSwKPiA+ ID4gPiArICAgICAgIFFNUF9QSFlfSU5JVF9DRkcoUVNFUkRFU19WNl9DT01fTE9DS19DTVAxX01P REUxLCAweDk5KSwKPiA+ID4gPiArICAgICAgIFFNUF9QSFlfSU5JVF9DRkcoUVNFUkRFU19WNl9D T01fTE9DS19DTVAyX01PREUxLCAweDA3KSwKPiA+ID4gCj4gPiA+IEkgc2VlIGFsbCB0aGUgTU9E RTEgcmVnaXN0ZXJzIGJlaW5nIG9ubHkgcHJlc2VudCBpbiBHNCBhbmQgRzUgdGFibGVzLgo+ID4g PiBTaG91bGQgdGhleSBiZSBwcm9ncmFtbWVkIGZvciB0aGUgbW9kZXMgbG93ZXIgdGhhbiBHND8K PiA+ID4gCj4gPiAKPiA+IFdlIHVzZSBHNCB0YWJsZSBmb3IgYWxsIHRoZSBtb2RlcyA8PSBHNC4K PiA+IAo+ID4gPiA+ICt9Owo+ID4gPiA+ICsKPiA+ID4gPiArc3RhdGljIGNvbnN0IHN0cnVjdCBx bXBfcGh5X2luaXRfdGJsIHNtODU1MF91ZnNwaHlfZzVfc2VyZGVzW10gPSB7Cj4gPiA+ID4gKyAg ICAgICBRTVBfUEhZX0lOSVRfQ0ZHKFFTRVJERVNfVjZfQ09NX1BMTF9JVkNPLCAweDFmKSwKPiA+ ID4gPiArCj4gPiA+ID4gKyAgICAgICBRTVBfUEhZX0lOSVRfQ0ZHKFFTRVJERVNfVjZfQ09NX0NN Tl9JRVRSSU0sIDB4MWIpLAo+ID4gPiA+ICsgICAgICAgUU1QX1BIWV9JTklUX0NGRyhRU0VSREVT X1Y2X0NPTV9DTU5fSVBUUklNLCAweDFjKSwKPiA+ID4gPiArICAgICAgIFFNUF9QSFlfSU5JVF9D RkcoUVNFUkRFU19WNl9DT01fQ1BfQ1RSTF9NT0RFMCwgMHgwNiksCj4gPiA+ID4gICB9Owo+ID4g PiA+IAo+ID4gPiA+ICAgc3RhdGljIGNvbnN0IHN0cnVjdCBxbXBfcGh5X2luaXRfdGJsIHNtODU1 MF91ZnNwaHlfdHhbXSA9IHsKPiA+ID4gPiAtICAgICAgIFFNUF9QSFlfSU5JVF9DRkcoUVNFUkRF U19WNl9UWF9MQU5FX01PREVfMSwgMHgwNSksCj4gPiA+ID4gKyAgICAgICBRTVBfUEhZX0lOSVRf Q0ZHKFFTRVJERVNfVUZTX1Y2X1RYX0xBTkVfTU9ERV8xLCAweDA1KSwKPiA+ID4gPiAgICAgICAg ICBRTVBfUEhZX0lOSVRfQ0ZHKFFTRVJERVNfVUZTX1Y2X1RYX1JFU19DT0RFX0xBTkVfT0ZGU0VU X1RYLCAweDA3KSwKPiA+ID4gPiAgIH07Cj4gPiA+ID4gCj4gPiA+ID4gK3N0YXRpYyBjb25zdCBz dHJ1Y3QgcW1wX3BoeV9pbml0X3RibCBzbTg1NTBfdWZzcGh5X2c0X3R4W10gPSB7Cj4gPiA+ID4g KyAgICAgICBRTVBfUEhZX0lOSVRfQ0ZHKFFTRVJERVNfVUZTX1Y2X1RYX0ZSX0RDQ19DVFJMLCAw eDRjKSwKPiA+ID4gPiArfTsKPiA+ID4gPiArCj4gPiA+ID4gICBzdGF0aWMgY29uc3Qgc3RydWN0 IHFtcF9waHlfaW5pdF90Ymwgc204NTUwX3Vmc3BoeV9yeFtdID0gewo+ID4gPiA+IC0gICAgICAg UU1QX1BIWV9JTklUX0NGRyhRU0VSREVTX1VGU19WNl9SWF9VQ0RSX0ZBU1RMT0NLX0ZPX0dBSU5f UkFURTIsIDB4MGMpLAo+ID4gPiA+IC0gICAgICAgUU1QX1BIWV9JTklUX0NGRyhRU0VSREVTX1VG U19WNl9SWF9VQ0RSX0ZBU1RMT0NLX0ZPX0dBSU5fUkFURTQsIDB4MGYpLAo+ID4gPiA+IC0gICAg ICAgUU1QX1BIWV9JTklUX0NGRyhRU0VSREVTX1VGU19WNl9SWF9WR0FfQ0FMX01BTl9WQUwsIDB4 MGUpLAo+ID4gPiA+ICsgICAgICAgUU1QX1BIWV9JTklUX0NGRyhRU0VSREVTX1VGU19WNl9SWF9V Q0RSX0ZPX0dBSU5fUkFURTIsIDB4MGMpLAo+ID4gPiA+IAo+ID4gPiA+ICAgICAgICAgIFFNUF9Q SFlfSU5JVF9DRkcoUVNFUkRFU19VRlNfVjZfUlhfTU9ERV9SQVRFXzBfMV9CMCwgMHhjMiksCj4g PiA+ID4gICAgICAgICAgUU1QX1BIWV9JTklUX0NGRyhRU0VSREVTX1VGU19WNl9SWF9NT0RFX1JB VEVfMF8xX0IxLCAweGMyKSwKPiA+ID4gPiBAQCAtNjkwLDE0ICs3MDksNDYgQEAgc3RhdGljIGNv bnN0IHN0cnVjdCBxbXBfcGh5X2luaXRfdGJsIHNtODU1MF91ZnNwaHlfcnhbXSA9IHsKPiA+ID4g PiAgICAgICAgICBRTVBfUEhZX0lOSVRfQ0ZHKFFTRVJERVNfVUZTX1Y2X1JYX01PREVfUkFURTNf QjgsIDB4MDIpLAo+ID4gPiA+ICAgfTsKPiA+ID4gPiAKPiA+ID4gPiArc3RhdGljIGNvbnN0IHN0 cnVjdCBxbXBfcGh5X2luaXRfdGJsIHNtODU1MF91ZnNwaHlfZzRfcnhbXSA9IHsKPiA+ID4gPiAr ICAgICAgIFFNUF9QSFlfSU5JVF9DRkcoUVNFUkRFU19VRlNfVjZfUlhfVkdBX0NBTF9NQU5fVkFM LCAweDBlKSwKPiA+ID4gPiArfTsKPiA+ID4gPiArCj4gPiA+ID4gK3N0YXRpYyBjb25zdCBzdHJ1 Y3QgcW1wX3BoeV9pbml0X3RibCBzbTg1NTBfdWZzcGh5X2c1X3J4W10gPSB7Cj4gPiA+ID4gKyAg ICAgICBRTVBfUEhZX0lOSVRfQ0ZHKFFTRVJERVNfVUZTX1Y2X1JYX1VDRFJfRk9fR0FJTl9SQVRF NCwgMHgwYyksCj4gPiA+ID4gKyAgICAgICBRTVBfUEhZX0lOSVRfQ0ZHKFFTRVJERVNfVUZTX1Y2 X1JYX1VDRFJfU09fR0FJTl9SQVRFNCwgMHgwNCksCj4gPiA+ID4gKyAgICAgICBRTVBfUEhZX0lO SVRfQ0ZHKFFTRVJERVNfVUZTX1Y2X1JYX0VRX09GRlNFVF9BREFQVE9SX0NOVFJMMSwgMHgxNCks Cj4gPiA+ID4gKyAgICAgICBRTVBfUEhZX0lOSVRfQ0ZHKFFTRVJERVNfVUZTX1Y2X1JYX1VDRFJf UElfQ09OVFJPTFMsIDB4MDcpLAo+ID4gPiA+ICsgICAgICAgUU1QX1BIWV9JTklUX0NGRyhRU0VS REVTX1VGU19WNl9SWF9PRkZTRVRfQURBUFRPUl9DTlRSTDMsIDB4MGUpLAo+ID4gPiA+ICsgICAg ICAgUU1QX1BIWV9JTklUX0NGRyhRU0VSREVTX1VGU19WNl9SWF9VQ0RSX0ZBU1RMT0NLX0NPVU5U X0hJR0hfUkFURTQsIDB4MDIpLAo+ID4gPiA+ICsgICAgICAgUU1QX1BIWV9JTklUX0NGRyhRU0VS REVTX1VGU19WNl9SWF9VQ0RSX0ZBU1RMT0NLX0ZPX0dBSU5fUkFURTQsIDB4MWMpLAo+ID4gPiA+ ICsgICAgICAgUU1QX1BIWV9JTklUX0NGRyhRU0VSREVTX1VGU19WNl9SWF9VQ0RSX0ZBU1RMT0NL X1NPX0dBSU5fUkFURTQsIDB4MDYpLAo+ID4gPiA+ICsgICAgICAgUU1QX1BIWV9JTklUX0NGRyhR U0VSREVTX1VGU19WNl9SWF9WR0FfQ0FMX01BTl9WQUwsIDB4MDgpLAo+ID4gPiA+ICsKPiA+ID4g PiArICAgICAgIFFNUF9QSFlfSU5JVF9DRkcoUVNFUkRFU19VRlNfVjZfUlhfTU9ERV9SQVRFNF9C MywgMHhiOSksCj4gPiA+ID4gKyAgICAgICBRTVBfUEhZX0lOSVRfQ0ZHKFFTRVJERVNfVUZTX1Y2 X1JYX01PREVfUkFURTRfQjQsIDB4NGYpLAo+ID4gPiA+ICsgICAgICAgUU1QX1BIWV9JTklUX0NG RyhRU0VSREVTX1VGU19WNl9SWF9NT0RFX1JBVEU0X0I2LCAweGZmKSwKPiA+ID4gPiArICAgICAg IFFNUF9QSFlfSU5JVF9DRkcoUVNFUkRFU19VRlNfVjZfUlhfRExMMF9GVFVORV9DVFJMLCAweDMw KSwKPiA+ID4gPiArfTsKPiA+ID4gPiArCj4gPiA+ID4gICBzdGF0aWMgY29uc3Qgc3RydWN0IHFt cF9waHlfaW5pdF90Ymwgc204NTUwX3Vmc3BoeV9wY3NbXSA9IHsKPiA+ID4gPiAgICAgICAgICBR TVBfUEhZX0lOSVRfQ0ZHKFFQSFlfVjZfUENTX1VGU19SWF9TSUdERVRfQ1RSTDIsIDB4NjkpLAo+ ID4gPiA+ICAgICAgICAgIFFNUF9QSFlfSU5JVF9DRkcoUVBIWV9WNl9QQ1NfVUZTX1RYX0xBUkdF X0FNUF9EUlZfTFZMLCAweDBmKSwKPiA+ID4gPiAgICAgICAgICBRTVBfUEhZX0lOSVRfQ0ZHKFFQ SFlfVjZfUENTX1VGU19UWF9NSURfVEVSTV9DVFJMMSwgMHg0MyksCj4gPiA+ID4gLSAgICAgICBR TVBfUEhZX0lOSVRfQ0ZHKFFQSFlfVjZfUENTX1VGU19QTExfQ05UTCwgMHgyYiksCj4gPiA+ID4g ICAgICAgICAgUU1QX1BIWV9JTklUX0NGRyhRUEhZX1Y2X1BDU19VRlNfTVVMVElfTEFORV9DVFJM MSwgMHgwMiksCj4gPiA+ID4gICB9Owo+ID4gPiA+IAo+ID4gPiA+ICtzdGF0aWMgY29uc3Qgc3Ry dWN0IHFtcF9waHlfaW5pdF90Ymwgc204NTUwX3Vmc3BoeV9nNF9wY3NbXSA9IHsKPiA+ID4gPiAr ICAgICAgIFFNUF9QSFlfSU5JVF9DRkcoUVBIWV9WNl9QQ1NfVUZTX1BMTF9DTlRMLCAweDJiKSwK PiA+ID4gPiArICAgICAgIFFNUF9QSFlfSU5JVF9DRkcoUVBIWV9WNl9QQ1NfVUZTX1RYX0hTR0VB Ul9DQVBBQklMSVRZLCAweDA0KSwKPiA+ID4gPiArICAgICAgIFFNUF9QSFlfSU5JVF9DRkcoUVBI WV9WNl9QQ1NfVUZTX1JYX0hTR0VBUl9DQVBBQklMSVRZLCAweDA0KSwKPiA+ID4gPiArfTsKPiA+ ID4gPiArCj4gPiA+ID4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcW1wX3BoeV9pbml0X3RibCBzbTg1 NTBfdWZzcGh5X2c1X3Bjc1tdID0gewo+ID4gPiA+ICsgICAgICAgUU1QX1BIWV9JTklUX0NGRyhR UEhZX1Y2X1BDU19VRlNfUExMX0NOVEwsIDB4MzMpLAo+ID4gPiA+ICsgICAgICAgUU1QX1BIWV9J TklUX0NGRyhRUEhZX1Y2X1BDU19VRlNfUlhfSFNfRzVfU1lOQ19MRU5HVEhfQ0FQQUJJTElUWSwg MHg0ZiksCj4gPiA+ID4gKyAgICAgICBRTVBfUEhZX0lOSVRfQ0ZHKFFQSFlfVjZfUENTX1VGU19S WF9IU0c1X1NZTkNfV0FJVF9USU1FLCAweDllKSwKPiA+ID4gPiArfTsKPiA+ID4gPiArCj4gPiA+ ID4gICBzdHJ1Y3QgcW1wX3Vmc19vZmZzZXRzIHsKPiA+ID4gPiAgICAgICAgICB1MTYgc2VyZGVz Owo+ID4gPiA+ICAgICAgICAgIHUxNiBwY3M7Cj4gPiA+ID4gQEAgLTczMSw2ICs3ODIsOCBAQCBz dHJ1Y3QgcW1wX3BoeV9jZmcgewo+ID4gPiA+ICAgICAgICAgIGNvbnN0IHN0cnVjdCBxbXBfcGh5 X2NmZ190YmxzIHRibHNfaHNfYjsKPiA+ID4gPiAgICAgICAgICAvKiBBZGRpdGlvbmFsIHNlcXVl bmNlIGZvciBIUyBHNCAqLwo+ID4gPiA+ICAgICAgICAgIGNvbnN0IHN0cnVjdCBxbXBfcGh5X2Nm Z190YmxzIHRibHNfaHNfZzQ7Cj4gPiA+ID4gKyAgICAgICAvKiBBZGRpdGlvbmFsIHNlcXVlbmNl IGZvciBIUyBHNCAqLwo+ID4gCj4gPiBIUyBHNQo+IAo+IFN1cmUKPiAKPiA+IAo+ID4gPiA+ICsg ICAgICAgY29uc3Qgc3RydWN0IHFtcF9waHlfY2ZnX3RibHMgdGJsc19oc19nNTsKPiA+ID4gPiAK PiA+ID4gPiAgICAgICAgICAvKiBjbG9jayBpZHMgdG8gYmUgcmVxdWVzdGVkICovCj4gPiA+ID4g ICAgICAgICAgY29uc3QgY2hhciAqIGNvbnN0ICpjbGtfbGlzdDsKPiA+ID4gPiBAQCAtMTE1Nyw2 ICsxMjEwLDI4IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcW1wX3BoeV9jZmcgc204NTUwX3Vmc3Bo eV9jZmcgPSB7Cj4gPiA+ID4gICAgICAgICAgICAgICAgICAucGNzICAgICAgICAgICAgPSBzbTg1 NTBfdWZzcGh5X3BjcywKPiA+ID4gPiAgICAgICAgICAgICAgICAgIC5wY3NfbnVtICAgICAgICA9 IEFSUkFZX1NJWkUoc204NTUwX3Vmc3BoeV9wY3MpLAo+ID4gPiA+ICAgICAgICAgIH0sCj4gPiA+ ID4gKyAgICAgICAudGJsc19oc19iID0gewo+ID4gPiA+ICsgICAgICAgICAgICAgICAuc2VyZGVz ICAgICAgICAgPSBzbTg1NTBfdWZzcGh5X2hzX2Jfc2VyZGVzLAo+ID4gPiA+ICsgICAgICAgICAg ICAgICAuc2VyZGVzX251bSAgICAgPSBBUlJBWV9TSVpFKHNtODU1MF91ZnNwaHlfaHNfYl9zZXJk ZXMpLAo+ID4gPiA+ICsgICAgICAgfSwKPiA+ID4gPiArICAgICAgIC50YmxzX2hzX2c0ID0gewo+ ID4gPiA+ICsgICAgICAgICAgICAgICAuc2VyZGVzICAgICAgICAgPSBzbTg1NTBfdWZzcGh5X2c0 X3NlcmRlcywKPiA+ID4gPiArICAgICAgICAgICAgICAgLnNlcmRlc19udW0gICAgID0gQVJSQVlf U0laRShzbTg1NTBfdWZzcGh5X2c0X3NlcmRlcyksCj4gPiA+ID4gKyAgICAgICAgICAgICAgIC50 eCAgICAgICAgICAgICA9IHNtODU1MF91ZnNwaHlfZzRfdHgsCj4gPiA+ID4gKyAgICAgICAgICAg ICAgIC50eF9udW0gICAgICAgICA9IEFSUkFZX1NJWkUoc204NTUwX3Vmc3BoeV9nNF90eCksCj4g PiA+ID4gKyAgICAgICAgICAgICAgIC5yeCAgICAgICAgICAgICA9IHNtODU1MF91ZnNwaHlfZzRf cngsCj4gPiA+ID4gKyAgICAgICAgICAgICAgIC5yeF9udW0gICAgICAgICA9IEFSUkFZX1NJWkUo c204NTUwX3Vmc3BoeV9nNF9yeCksCj4gPiA+ID4gKyAgICAgICAgICAgICAgIC5wY3MgICAgICAg ICAgICA9IHNtODU1MF91ZnNwaHlfZzRfcGNzLAo+ID4gPiA+ICsgICAgICAgICAgICAgICAucGNz X251bSAgICAgICAgPSBBUlJBWV9TSVpFKHNtODU1MF91ZnNwaHlfZzRfcGNzKSwKPiA+ID4gPiAr ICAgICAgIH0sCj4gPiA+ID4gKyAgICAgICAudGJsc19oc19nNSA9IHsKPiA+ID4gPiArICAgICAg ICAgICAgICAgLnNlcmRlcyAgICAgICAgID0gc204NTUwX3Vmc3BoeV9nNV9zZXJkZXMsCj4gPiA+ ID4gKyAgICAgICAgICAgICAgIC5zZXJkZXNfbnVtICAgICA9IEFSUkFZX1NJWkUoc204NTUwX3Vm c3BoeV9nNV9zZXJkZXMpLAo+ID4gPiA+ICsgICAgICAgICAgICAgICAucnggICAgICAgICAgICAg PSBzbTg1NTBfdWZzcGh5X2c1X3J4LAo+ID4gPiA+ICsgICAgICAgICAgICAgICAucnhfbnVtICAg ICAgICAgPSBBUlJBWV9TSVpFKHNtODU1MF91ZnNwaHlfZzVfcngpLAo+ID4gPiA+ICsgICAgICAg ICAgICAgICAucGNzICAgICAgICAgICAgPSBzbTg1NTBfdWZzcGh5X2c1X3BjcywKPiA+ID4gPiAr ICAgICAgICAgICAgICAgLnBjc19udW0gICAgICAgID0gQVJSQVlfU0laRShzbTg1NTBfdWZzcGh5 X2c1X3BjcyksCj4gPiA+ID4gKyAgICAgICB9LAo+ID4gPiA+ICAgICAgICAgIC5jbGtfbGlzdCAg ICAgICAgICAgICAgID0gc2RtODQ1X3Vmc19waHlfY2xrX2wsCj4gPiA+ID4gICAgICAgICAgLm51 bV9jbGtzICAgICAgICAgICAgICAgPSBBUlJBWV9TSVpFKHNkbTg0NV91ZnNfcGh5X2Nsa19sKSwK PiA+ID4gPiAgICAgICAgICAudnJlZ19saXN0ICAgICAgICAgICAgICA9IHFtcF9waHlfdnJlZ19s LAo+ID4gPiA+IEBAIC0xMjIyLDE0ICsxMjk3LDI1IEBAIHN0YXRpYyB2b2lkIHFtcF91ZnNfcGNz X2luaXQoc3RydWN0IHFtcF91ZnMgKnFtcCwgY29uc3Qgc3RydWN0IHFtcF9waHlfY2ZnX3RibHMK PiA+ID4gPiAgIHN0YXRpYyB2b2lkIHFtcF91ZnNfaW5pdF9yZWdpc3RlcnMoc3RydWN0IHFtcF91 ZnMgKnFtcCwgY29uc3Qgc3RydWN0IHFtcF9waHlfY2ZnICpjZmcpCj4gPiA+ID4gICB7Cj4gPiA+ ID4gICAgICAgICAgcW1wX3Vmc19zZXJkZXNfaW5pdChxbXAsICZjZmctPnRibHMpOwo+ID4gPiA+ ICsgICAgICAgaWYgKHFtcC0+c3VibW9kZSA9PSBVRlNfSFNfRzQpCj4gPiA+ID4gKyAgICAgICAg ICAgICAgIHFtcF91ZnNfc2VyZGVzX2luaXQocW1wLCAmY2ZnLT50YmxzX2hzX2c0KTsKPiA+ID4g PiArICAgICAgIGVsc2UgaWYgKHFtcC0+c3VibW9kZSA9PSBVRlNfSFNfRzUpCj4gPiA+ID4gKyAg ICAgICAgICAgICAgIHFtcF91ZnNfc2VyZGVzX2luaXQocW1wLCAmY2ZnLT50YmxzX2hzX2c1KTsK PiA+ID4gPiArCj4gPiAKPiA+IFNob3VsZCB3ZSBwcm9ncmFtIHN1Ym1vZGUgc2VxdWVuY2UgYWZ0 ZXIgSFNfQj8KPiA+IAo+ID4gLSBNYW5pCj4gPiAKPiBBcyB0aGUgVUZTIFBIWSBIVyBwcm9ncmFt bWluZyBkb2MgbWVudGlvbnMsIG9yZGVyIG9mIHRoZXNlIHdyaXRlcyBpcyBub3QKPiBpbXBvcnRh bnQsIHNvIGxvbmcgYXMgdGhleSBhcmUgcHJvZ3JhbW1lZCBjb3JyZWN0bHkgYmVmb3JlIHJlbGVh c2UgUy9XCj4gcmVzZXQsIHRoZW4gaXQgaXMgZmluZS4KPiAKPiBUaGFua3MsCj4gQ2FuIEd1by4K PiAKPiAKCi0tIArgrq7grqPgrr/grrXgrqPgr43grqPgrqngr40g4K6a4K6k4K6+4K6a4K6/4K61 4K6u4K+NCgotLSAKbGludXgtcGh5IG1haWxpbmcgbGlzdApsaW51eC1waHlAbGlzdHMuaW5mcmFk ZWFkLm9yZwpodHRwczovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51 eC1waHkK