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 0127510A1E for ; Tue, 14 Nov 2023 06:12:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="VjG/gWWF" Received: by smtp.kernel.org (Postfix) with ESMTPSA id C871CC433C8; Tue, 14 Nov 2023 06:12:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1699942338; bh=7o+qcNSLliDf6miAkXOnZwRXZlD/pnx0atypyNiV59A=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=VjG/gWWFPCFOzH1TkCrMHV0SWQrMmkpk8tG/xlzP0pGG5OFF5fTUVtFI9/lBeURdE OprnIDGFs8TnJYEiqJCJO/Cluc3tOyMS3dCZQfGOJkXPBykdeDqqHcsSfPnISWnxQv 3vF2TGGT/ca4C6sEutVgii4c48Z6tu9GVULtJLzRBraIfhxe1kniB2CX852bD0cO/+ gu8cvX04bAA22vKV5c8q4ZlrmNG+srLecY0SsgGJJXmDPPZ3LWsz37nWepxSt1u8/c +zQwjesSM6YW0PJVpxuXSxWe/g3Wh7k6Ada/gkdiOOIaX00gs9ymDq3s+7phw2atP+ 5Vkc8yEzIgz8A== Date: Tue, 14 Nov 2023 11:42:02 +0530 From: Manivannan Sadhasivam To: Can Guo Cc: Manivannan Sadhasivam , 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: <20231114061202.GA28789@thinkpad> References: <20231109032418.GA3752@thinkpad> <20231109104250.GF3752@thinkpad> <20231109160430.GG3752@thinkpad> <20231110131803.GA5025@thinkpad> <1ac5ae60-7e76-43f2-8b3d-c286eade0251@quicinc.com> <20231111041215.GA4823@thinkpad> <7b98d2e0-b989-4937-a674-6866c6aa05d4@quicinc.com> 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: <7b98d2e0-b989-4937-a674-6866c6aa05d4@quicinc.com> On Sun, Nov 12, 2023 at 01:13:30PM +0800, Can Guo wrote: > Hi Mani, > > On 11/11/2023 12:12 PM, Manivannan Sadhasivam wrote: > > On Fri, Nov 10, 2023 at 10:40:53PM +0800, Can Guo wrote: > > > > > > > > > On 11/10/2023 9:18 PM, Manivannan Sadhasivam wrote: > > > > On Fri, Nov 10, 2023 at 12:11:46AM +0200, Dmitry Baryshkov wrote: > > > > > On Thu, 9 Nov 2023 at 18:04, Manivannan Sadhasivam wrote: > > > > > > > > > > > > On Thu, Nov 09, 2023 at 01:00:51PM +0200, Dmitry Baryshkov wrote: > > > > > > > On Thu, 9 Nov 2023 at 12:43, Manivannan Sadhasivam wrote: > > > > > > > > > > > > > > > > On Thu, Nov 09, 2023 at 11:40:51AM +0200, Dmitry Baryshkov wrote: > > > > > > > > > On Thu, 9 Nov 2023 at 05:24, Manivannan Sadhasivam wrote: > > > > > > > > > > > > > > > > > > > > On Wed, Nov 08, 2023 at 08:56:16AM +0200, Dmitry Baryshkov wrote: > > > > > > > > > > > On Wed, 8 Nov 2023 at 07:49, 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. > > > > > > > > > > > > > > > > > > > > > > > > > > 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. > > > > > > > > > > > > > > > > > > > > > > Could you please point me how it's handled? > > > > > > > > > > > In the patch I see just: > > > > > > > > > > > > > > > > > > > > > > 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); > > > > > > > > > > > > > > > > > > > > > > Which looks like two special cases (HS_G4 and HS_G5) and nothing for > > > > > > > > > > > anything else. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Yes, and the UFS driver passes only G4/G5. For all the gears <=G4, G4 init > > > > > > > > > > sequence will be used and for G5, G5 sequence will be used. > > > > > > > > > > > > > > > > > > > > > > > > > > > > That's what I could not find in the UFS driver. I see a call to > > > > > > > > > `phy_set_mode_ext(phy, PHY_MODE_UFS_HS_B, host->phy_gear);` and > > > > > > > > > host->phy_gear is initialised to UFS_HS_G2. > > > > > > > > > > > > > > > > > > > > > > > > > You need to check the UFS driver changes in this series to get the complete > > > > > > > > picture as the logic is getting changed. > > > > > > > > > > > > > > > > It is common to get confused because of the way the UFS driver (qcom mostly) > > > > > > > > handles the PHY init sequence programming. We used to have only one init > > > > > > > > sequence for older targets and life was easy. But when I wanted to add G4 > > > > > > > > support for SM8250, I learned that there are 2 separate init sequences. One for > > > > > > > > non-G4 and other for G4. So I used the phy_sub_mode property to pass the > > > > > > > > relevant mode from the UFS driver to the PHY driver and programmed the sequence > > > > > > > > accordingly. This got extended to non-G5 and G5 now. > > > > > > > > > > > > > > > > Now, the UFS driver will start probing from a low gear for older targets (G2) > > > > > > > > and G4/G5 for newer ones then scale up based on the device and host capability. > > > > > > > > For older targets, the common table (tbls) will be used if the submode doesn't > > > > > > > > match G4/G5. But for newer targets, the UFS driver will _only_ pass G4 or G5 as > > > > > > > > the phy_gear, so those specific sequence will only be used. > > > > > > > > > > > > > > > > Hope I'm clear. > > > > > > > > > > > > > > Yes, it is now clear, thank you! > > > > > > > > > > > > > > Would it be possible / feasible / logical to maintain this idea even > > > > > > > for newer platforms (leaving the HS_A / HS_B aside)? > > > > > > > > > > > > > > tbls - works for HS_G2 > > > > > > > tbls + tbls_g4 - works for HS_G4 > > > > > > > tbls + tbls_g5 - works for HS_G5 > > > > > > > > > > > > > > > > > > > No. The PHY team only gives 2 init sequences for any SoC now. > > > > > > > > > > Ack. Then the code should become > > > > > if (HS_G5) > > > > > program(tbls_hs_g5) > > > > > else > > > > > program(tbls_hs_g4); > > > > > > > > > > > > > This should work. Even if we have to accomodate G6 in the future, we can use > > > > "else if" for that and keep G4 as the "else" condition. This logic can also be > > > > optimized in the future. > > > > > > That would make dual init meaningless for old targets. Say on SM8450, the > > > initial PHY gear is G2, with the "else" condition, during the first init, G4 > > > table would be programmed, then gear negotiation happens btw host and device > > > and the negotiated gear is G3 (assume a UFS2.x is connected). During the 2nd > > > init, the "else" condition would __again__ program the G4 table - it is not > > > programming the non-G4 table for power saving. The dual init is supposed to > > > find the optimal PHY settings, but the "else" condition is programming G4 > > > table unconditinally. > > > > > > With the original code change in this patch, the dual init works as it is > > > for old targets. say SM8450, the initial PHY gear is G2, during the 2nd > > > init, it is programming the non-G4 table (assume a UFS2.x is connected), but > > > not the G4 table. > > > > > > > You are right. I completely overlooked the compatibility for old targets. But > > still we can move the common table to the "else" condition. This makes it clear > > that one of the 3 will be programmed at a time. But with the current logic, I > > get the impression that common table is overridden by G4/G5 tables. > > > > So this is what I'm suggesting: > > > > if (HS_G5) > > program(tbls_hs_g5) > > else if (HS_G4) > > program(tbls_hs_g4); > > else > > program(tbls_hs_common); > > > > Common table is needed regardlessly, we cannot put it in "else", otherwise > it would break all targets - > > On old targets (no G5 supported): > Common table - supports non-G4 (G3 and lower) > Common table + G4 table - supports G4 > > On new targets (G5 supported): > Common table - supports nothing, as it is just common parts of G4 table > and G5 table. > Common table + G4 table - support non-G5 (G4 and lower) > Common table + G5 table - support G5 > Doh! I missed the fact that common table is not a standalone table. Sorry for the confusion. Let's keep it as you proposed for now. I still don't like the if conditions as it would just keep growing with future gears, but we can get to it later. - Mani > Thanks, > Can Guo. > > > - Mani > > > > > Thanks, > > > Can Guo. > > > > > > > > - Mani > > > > > > > > > > > > > > > > - Mani > > > > > > > > > > > > > I mean here that the PHY driver should not depend on the knowledge > > > > > > > that the UFS driver will not be setting HS_G2 for some particular > > > > > > > platform and ideally it should continue working if at some point we > > > > > > > change the UFS driver to set HS_G2. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > - Mani > > > > > > > > > > > > > > > > > Maybe we should change the condition here (in the PHY driver) to: > > > > > > > > > > > > > > > > > > if (qmp->submode <= UFS_HS_G4) > > > > > > > > > > > > > > > > > > ? > > > > > > > > > -- > > > > > > > > > With best wishes > > > > > > > > > Dmitry > > > > > > > > > > > > > > > > -- > > > > > > > > மணிவண்ணன் சதாசிவம் > > > > > > > > > > > > > > > > > > > > > > > > > > > > -- > > > > > > > With best wishes > > > > > > > Dmitry > > > > > > > > > > > > -- > > > > > > மணிவண்ணன் சதாசிவம் > > > > > > > > > > > > > > > > > > > > -- > > > > > With best wishes > > > > > Dmitry > > > > > > -- மணிவண்ணன் சதாசிவம் 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 7B4F4C4332F for ; Tue, 14 Nov 2023 06:12: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=CiQ5hV8skRl4VvDD3gGFhzAsYVLiPnHcLVv9RPql97s=; b=RkZtSdDaPyby51 JQ1mUGmGjk4Nfwh+HRaL8KsE63FQJpQ4XksZ/0Om0W0VN3E1qyCaDjW2gitZXidQgsUHbVo764Yhj 0zHYjRnFyhJUIAWEvE88O9RIVhXT7CozIxdBIOumE92I48HheEzNJyAvE1gvitbyW8orgH2KScKjn k574mUFIHJN+//tFCUmBii2AbKWezy4EX+P/zFKu5dE1i1t1Y9D+D6SeDAA8mRnfAh4m7WgjsvtKW wjd2e/jtIiRuoZvvSRdivmvz0wzqKwatIe4nvuNLZno+MGetJ0xtToO+GLyj3bx1kzq6aC6g/Wcsy ReMwc52a8D7QmRRtTsuQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1r2mew-00FFy8-2T; Tue, 14 Nov 2023 06:12:26 +0000 Received: from dfw.source.kernel.org ([139.178.84.217]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1r2mer-00FFxX-1y for linux-phy@lists.infradead.org; Tue, 14 Nov 2023 06:12:25 +0000 Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by dfw.source.kernel.org (Postfix) with ESMTP id 5126761089; Tue, 14 Nov 2023 06:12:19 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id C871CC433C8; Tue, 14 Nov 2023 06:12:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1699942338; bh=7o+qcNSLliDf6miAkXOnZwRXZlD/pnx0atypyNiV59A=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=VjG/gWWFPCFOzH1TkCrMHV0SWQrMmkpk8tG/xlzP0pGG5OFF5fTUVtFI9/lBeURdE OprnIDGFs8TnJYEiqJCJO/Cluc3tOyMS3dCZQfGOJkXPBykdeDqqHcsSfPnISWnxQv 3vF2TGGT/ca4C6sEutVgii4c48Z6tu9GVULtJLzRBraIfhxe1kniB2CX852bD0cO/+ gu8cvX04bAA22vKV5c8q4ZlrmNG+srLecY0SsgGJJXmDPPZ3LWsz37nWepxSt1u8/c +zQwjesSM6YW0PJVpxuXSxWe/g3Wh7k6Ada/gkdiOOIaX00gs9ymDq3s+7phw2atP+ 5Vkc8yEzIgz8A== Date: Tue, 14 Nov 2023 11:42:02 +0530 From: Manivannan Sadhasivam To: Can Guo Cc: Manivannan Sadhasivam , 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: <20231114061202.GA28789@thinkpad> References: <20231109032418.GA3752@thinkpad> <20231109104250.GF3752@thinkpad> <20231109160430.GG3752@thinkpad> <20231110131803.GA5025@thinkpad> <1ac5ae60-7e76-43f2-8b3d-c286eade0251@quicinc.com> <20231111041215.GA4823@thinkpad> <7b98d2e0-b989-4937-a674-6866c6aa05d4@quicinc.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <7b98d2e0-b989-4937-a674-6866c6aa05d4@quicinc.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20231113_221221_762943_CF4D77CE X-CRM114-Status: GOOD ( 36.33 ) 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 T24gU3VuLCBOb3YgMTIsIDIwMjMgYXQgMDE6MTM6MzBQTSArMDgwMCwgQ2FuIEd1byB3cm90ZToK PiBIaSBNYW5pLAo+IAo+IE9uIDExLzExLzIwMjMgMTI6MTIgUE0sIE1hbml2YW5uYW4gU2FkaGFz aXZhbSB3cm90ZToKPiA+IE9uIEZyaSwgTm92IDEwLCAyMDIzIGF0IDEwOjQwOjUzUE0gKzA4MDAs IENhbiBHdW8gd3JvdGU6Cj4gPiA+IAo+ID4gPiAKPiA+ID4gT24gMTEvMTAvMjAyMyA5OjE4IFBN LCBNYW5pdmFubmFuIFNhZGhhc2l2YW0gd3JvdGU6Cj4gPiA+ID4gT24gRnJpLCBOb3YgMTAsIDIw MjMgYXQgMTI6MTE6NDZBTSArMDIwMCwgRG1pdHJ5IEJhcnlzaGtvdiB3cm90ZToKPiA+ID4gPiA+ IE9uIFRodSwgOSBOb3YgMjAyMyBhdCAxODowNCwgTWFuaXZhbm5hbiBTYWRoYXNpdmFtIDxtYW5p QGtlcm5lbC5vcmc+IHdyb3RlOgo+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gT24gVGh1LCBOb3Yg MDksIDIwMjMgYXQgMDE6MDA6NTFQTSArMDIwMCwgRG1pdHJ5IEJhcnlzaGtvdiB3cm90ZToKPiA+ ID4gPiA+ID4gPiBPbiBUaHUsIDkgTm92IDIwMjMgYXQgMTI6NDMsIE1hbml2YW5uYW4gU2FkaGFz aXZhbSA8bWFuaUBrZXJuZWwub3JnPiB3cm90ZToKPiA+ID4gPiA+ID4gPiA+IAo+ID4gPiA+ID4g PiA+ID4gT24gVGh1LCBOb3YgMDksIDIwMjMgYXQgMTE6NDA6NTFBTSArMDIwMCwgRG1pdHJ5IEJh cnlzaGtvdiB3cm90ZToKPiA+ID4gPiA+ID4gPiA+ID4gT24gVGh1LCA5IE5vdiAyMDIzIGF0IDA1 OjI0LCBNYW5pdmFubmFuIFNhZGhhc2l2YW0gPG1hbmlAa2VybmVsLm9yZz4gd3JvdGU6Cj4gPiA+ ID4gPiA+ID4gPiA+ID4gCj4gPiA+ID4gPiA+ID4gPiA+ID4gT24gV2VkLCBOb3YgMDgsIDIwMjMg YXQgMDg6NTY6MTZBTSArMDIwMCwgRG1pdHJ5IEJhcnlzaGtvdiB3cm90ZToKPiA+ID4gPiA+ID4g PiA+ID4gPiA+IE9uIFdlZCwgOCBOb3YgMjAyMyBhdCAwNzo0OSwgTWFuaXZhbm5hbiBTYWRoYXNp dmFtIDxtYW5pQGtlcm5lbC5vcmc+IHdyb3RlOgo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiAKPiA+ ID4gPiA+ID4gPiA+ID4gPiA+ID4gT24gVHVlLCBOb3YgMDcsIDIwMjMgYXQgMDM6MTg6MDlQTSAr MDIwMCwgRG1pdHJ5IEJhcnlzaGtvdiB3cm90ZToKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiBP biBUdWUsIDcgTm92IDIwMjMgYXQgMDY6NDcsIENhbiBHdW8gPGNhbmdAcXRpLnF1YWxjb21tLmNv bT4gd3JvdGU6Cj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiA+ID4g PiA+ID4gPiA+IEZyb206IENhbiBHdW8gPHF1aWNfY2FuZ0BxdWljaW5jLmNvbT4KPiA+ID4gPiA+ ID4gPiA+ID4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gT24gU004NTUw LCB0d28gc2V0cyBvZiBVRlMgUEhZIHNldHRpbmdzIGFyZSBwcm92aWRlZCwgb25lIHNldCBpcyB0 byBzdXBwb3J0Cj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiBIUy1HNSwgYW5vdGhlciBzZXQg aXMgdG8gc3VwcG9ydCBIUy1HNCBhbmQgbG93ZXIgZ2VhcnMuIFRoZSB0d28gc2V0cyBvZiBQSFkK PiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+IHNldHRpbmdzIGFyZSBwcm9ncmFtbWluZyBkaWZm ZXJlbnQgdmFsdWVzIHRvIGRpZmZlcmVudCByZWdpc3RlcnMsIG1peGluZwo+ID4gPiA+ID4gPiA+ ID4gPiA+ID4gPiA+ID4gdGhlIHR3byBzZXRzIGFuZC9vciBvdmVyd3JpdGluZyBvbmUgc2V0IHdp dGggYW5vdGhlciBzZXQgaXMgZGVmaW5pdGVseSBub3QKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4g PiA+IGJsZXNzZWQgYnkgVUZTIFBIWSBkZXNpZ25lcnMuIEluIG9yZGVyIHRvIGFkZCBIUy1HNSBz dXBwb3J0IGZvciBTTTg1NTAsIHdlCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiBuZWVkIHRv IHNwbGl0IHRoZSB0d28gc2V0cyBpbnRvIHRoZWlyIGRlZGljYXRlZCB0YWJsZXMsIGFuZCBsZWF2 ZSBvbmx5IHRoZQo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gY29tbW9uIHNldHRpbmdzIGlu IHRoZSAudGxicy4gVG8gaGF2ZSB0aGUgUEhZIHByb2dyYW1tZWQgd2l0aCB0aGUgY29ycmVjdAo+ ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gc2V0IG9mIFBIWSBzZXR0aW5ncywgdGhlIHN1Ym1v ZGUgcGFzc2VkIHRvIFBIWSBkcml2ZXIgbXVzdCBiZSBlaXRoZXIgSFMtRzQKPiA+ID4gPiA+ID4g PiA+ID4gPiA+ID4gPiA+IG9yIEhTLUc1Lgo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gCj4g PiA+ID4gPiA+ID4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiBZb3Ugc2hvdWxk IGFsc28gbWVudGlvbiB0aGF0IHRoaXMgaXNzdWUgaXMgYWxzbyBwcmVzZW50IGluIEc0IHN1cHBv cnRlZCB0YXJnZXRzLgo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiBBbmQgYSBub3RlIHRoYXQgaXQg d2lsbCBnZXQgZml4ZWQgbGF0ZXIuCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+IAo+ID4gPiA+ID4g PiA+ID4gPiA+ID4gPiA+ID4gU2lnbmVkLW9mZi1ieTogQ2FuIEd1byA8cXVpY19jYW5nQHF1aWNp bmMuY29tPgo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gLS0tCj4gPiA+ID4gPiA+ID4gPiA+ ID4gPiA+ID4gPiAgICBkcml2ZXJzL3BoeS9xdWFsY29tbS9waHktcWNvbS1xbXAtcGNzLXVmcy12 Ni5oICAgICB8ICAgMiArCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiAgICBkcml2ZXJzL3Bo eS9xdWFsY29tbS9waHktcWNvbS1xbXAtcXNlcmRlcy1jb20tdjYuaCB8ICAgMiArCj4gPiA+ID4g PiA+ID4gPiA+ID4gPiA+ID4gPiAgICAuLi4vcXVhbGNvbW0vcGh5LXFjb20tcW1wLXFzZXJkZXMt dHhyeC11ZnMtdjYuaCAgICB8ICAxMiArKysKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICAg IGRyaXZlcnMvcGh5L3F1YWxjb21tL3BoeS1xY29tLXFtcC11ZnMuYyAgICAgICAgICAgIHwgMTEy ICsrKysrKysrKysrKysrKysrKy0tLQo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gICAgNCBm aWxlcyBjaGFuZ2VkLCAxMTUgaW5zZXJ0aW9ucygrKSwgMTMgZGVsZXRpb25zKC0pCj4gPiA+ID4g PiA+ID4gPiA+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+IGRpZmYgLS1n aXQgYS9kcml2ZXJzL3BoeS9xdWFsY29tbS9waHktcWNvbS1xbXAtcGNzLXVmcy12Ni5oIGIvZHJp dmVycy9waHkvcXVhbGNvbW0vcGh5LXFjb20tcW1wLXBjcy11ZnMtdjYuaAo+ID4gPiA+ID4gPiA+ ID4gPiA+ID4gPiA+ID4gaW5kZXggYzIzZDVlNC4uZTU2M2FmNSAxMDA2NDQKPiA+ID4gPiA+ID4g PiA+ID4gPiA+ID4gPiA+IC0tLSBhL2RyaXZlcnMvcGh5L3F1YWxjb21tL3BoeS1xY29tLXFtcC1w Y3MtdWZzLXY2LmgKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICsrKyBiL2RyaXZlcnMvcGh5 L3F1YWxjb21tL3BoeS1xY29tLXFtcC1wY3MtdWZzLXY2LmgKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ ID4gPiA+IEBAIC0xOCw2ICsxOCw3IEBACj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiAgICAj ZGVmaW5lIFFQSFlfVjZfUENTX1VGU19CSVNUX0ZJWEVEX1BBVF9DVFJMICAgICAgICAgICAgMHgw NjAKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICAgICNkZWZpbmUgUVBIWV9WNl9QQ1NfVUZT X1RYX0hTR0VBUl9DQVBBQklMSVRZICAgICAgICAgICAweDA3NAo+ID4gPiA+ID4gPiA+ID4gPiA+ ID4gPiA+ID4gICAgI2RlZmluZSBRUEhZX1Y2X1BDU19VRlNfUlhfSFNHRUFSX0NBUEFCSUxJVFkg ICAgICAgICAgIDB4MGJjCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiArI2RlZmluZSBRUEhZ X1Y2X1BDU19VRlNfUlhfSFNfRzVfU1lOQ19MRU5HVEhfQ0FQQUJJTElUWSAgICAgICAgMHgxMmMK PiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICAgICNkZWZpbmUgUVBIWV9WNl9QQ1NfVUZTX0RF QlVHX0JVU19DTEtTRUwgICAgICAgICAgICAgICAweDE1OAo+ID4gPiA+ID4gPiA+ID4gPiA+ID4g PiA+ID4gICAgI2RlZmluZSBRUEhZX1Y2X1BDU19VRlNfTElORUNGR19ESVNBQkxFICAgICAgICAg ICAgICAgICAgICAgICAgMHgxN2MKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICAgICNkZWZp bmUgUVBIWV9WNl9QQ1NfVUZTX1JYX01JTl9ISUJFUk44X1RJTUUgICAgICAgICAgICAweDE4NAo+ ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gQEAgLTI3LDUgKzI4LDYgQEAKPiA+ID4gPiA+ID4g PiA+ID4gPiA+ID4gPiA+ICAgICNkZWZpbmUgUVBIWV9WNl9QQ1NfVUZTX1JFQURZX1NUQVRVUyAg ICAgICAgICAgICAgICAgICAweDFhOAo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gICAgI2Rl ZmluZSBRUEhZX1Y2X1BDU19VRlNfVFhfTUlEX1RFUk1fQ1RSTDEgICAgICAgICAgICAgIDB4MWY0 Cj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiAgICAjZGVmaW5lIFFQSFlfVjZfUENTX1VGU19N VUxUSV9MQU5FX0NUUkwxICAgICAgICAgICAgICAgMHgxZmMKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ ID4gPiA+ICsjZGVmaW5lIFFQSFlfVjZfUENTX1VGU19SWF9IU0c1X1NZTkNfV0FJVF9USU1FICAg ICAgICAgMHgyMjAKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+ID4g PiA+ID4gPiA+ID4gICAgI2VuZGlmCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiBkaWZmIC0t Z2l0IGEvZHJpdmVycy9waHkvcXVhbGNvbW0vcGh5LXFjb20tcW1wLXFzZXJkZXMtY29tLXY2Lmgg Yi9kcml2ZXJzL3BoeS9xdWFsY29tbS9waHktcWNvbS1xbXAtcXNlcmRlcy1jb20tdjYuaAo+ID4g PiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gaW5kZXggZjQyMGY4Zi4uZWYzOTJjZSAxMDA2NDQKPiA+ ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+IC0tLSBhL2RyaXZlcnMvcGh5L3F1YWxjb21tL3BoeS1x Y29tLXFtcC1xc2VyZGVzLWNvbS12Ni5oCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiArKysg Yi9kcml2ZXJzL3BoeS9xdWFsY29tbS9waHktcWNvbS1xbXAtcXNlcmRlcy1jb20tdjYuaAo+ID4g PiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gQEAgLTU2LDYgKzU2LDggQEAKPiA+ID4gPiA+ID4gPiA+ ID4gPiA+ID4gPiA+ICAgICNkZWZpbmUgUVNFUkRFU19WNl9DT01fU1lTX0NMS19DVFJMICAgICAg ICAgICAgICAgICAgICAgICAgICAgIDB4ZTQKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICAg ICNkZWZpbmUgUVNFUkRFU19WNl9DT01fU1lTQ0xLX0JVRl9FTkFCTEUgICAgICAgICAgICAgICAg ICAgICAgIDB4ZTgKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICAgICNkZWZpbmUgUVNFUkRF U19WNl9DT01fUExMX0lWQ08gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg MHhmNAo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gKyNkZWZpbmUgUVNFUkRFU19WNl9DT01f Q01OX0lFVFJJTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmMKPiA+ID4gPiA+ID4g PiA+ID4gPiA+ID4gPiA+ICsjZGVmaW5lIFFTRVJERVNfVjZfQ09NX0NNTl9JUFRSSU0gICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAweDEwMAo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4g ICAgI2RlZmluZSBRU0VSREVTX1Y2X0NPTV9TWVNDTEtfRU5fU0VMICAgICAgICAgICAgICAgICAg ICAgICAgICAgMHgxMTAKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICAgICNkZWZpbmUgUVNF UkRFU19WNl9DT01fUkVTRVRTTV9DTlRSTCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTE4 Cj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiAgICAjZGVmaW5lIFFTRVJERVNfVjZfQ09NX0xP Q0tfQ01QX0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEyMAo+ID4gPiA+ID4gPiA+ ID4gPiA+ID4gPiA+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L3F1YWxjb21tL3BoeS1xY29t LXFtcC1xc2VyZGVzLXR4cngtdWZzLXY2LmggYi9kcml2ZXJzL3BoeS9xdWFsY29tbS9waHktcWNv bS1xbXAtcXNlcmRlcy10eHJ4LXVmcy12Ni5oCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiBp bmRleCAxNWJjYjRiLi40OGYzMWM4IDEwMDY0NAo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4g LS0tIGEvZHJpdmVycy9waHkvcXVhbGNvbW0vcGh5LXFjb20tcW1wLXFzZXJkZXMtdHhyeC11ZnMt djYuaAo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gKysrIGIvZHJpdmVycy9waHkvcXVhbGNv bW0vcGh5LXFjb20tcW1wLXFzZXJkZXMtdHhyeC11ZnMtdjYuaAo+ID4gPiA+ID4gPiA+ID4gPiA+ ID4gPiA+ID4gQEAgLTEwLDEwICsxMCwyMCBAQAo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4g ICAgI2RlZmluZSBRU0VSREVTX1VGU19WNl9UWF9SRVNfQ09ERV9MQU5FX1JYICAgICAgICAgICAg ICAgICAgICAgMHgyYwo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gICAgI2RlZmluZSBRU0VS REVTX1VGU19WNl9UWF9SRVNfQ09ERV9MQU5FX09GRlNFVF9UWCAgICAgICAgICAgICAgMHgzMAo+ ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gICAgI2RlZmluZSBRU0VSREVTX1VGU19WNl9UWF9S RVNfQ09ERV9MQU5FX09GRlNFVF9SWCAgICAgICAgICAgICAgMHgzNAo+ID4gPiA+ID4gPiA+ID4g PiA+ID4gPiA+ID4gKyNkZWZpbmUgUVNFUkRFU19VRlNfVjZfVFhfTEFORV9NT0RFXzEgICAgICAg ICAgICAgICAgICAgICAgICAgIDB4N2MKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICsjZGVm aW5lIFFTRVJERVNfVUZTX1Y2X1RYX0ZSX0RDQ19DVFJMICAgICAgICAgICAgICAgICAgICAgICAg ICAweDEwOAo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gCj4gPiA+ID4gPiA+ID4gPiA+ID4g PiA+ID4gPiAgICAjZGVmaW5lIFFTRVJERVNfVUZTX1Y2X1JYX1VDRFJfRkFTVExPQ0tfRk9fR0FJ Tl9SQVRFMiAgICAgICAgICAweDA4Cj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiAgICAjZGVm aW5lIFFTRVJERVNfVUZTX1Y2X1JYX1VDRFJfRkFTVExPQ0tfRk9fR0FJTl9SQVRFNCAgICAgICAg ICAweDEwCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiArI2RlZmluZSBRU0VSREVTX1VGU19W Nl9SWF9VQ0RSX0ZBU1RMT0NLX1NPX0dBSU5fUkFURTQgICAgICAgICAgMHgyNAo+ID4gPiA+ID4g PiA+ID4gPiA+ID4gPiA+ID4gKyNkZWZpbmUgUVNFUkRFU19VRlNfVjZfUlhfVUNEUl9GQVNUTE9D S19DT1VOVF9ISUdIX1JBVEU0ICAgICAgIDB4NTQKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ ICsjZGVmaW5lIFFTRVJERVNfVUZTX1Y2X1JYX1VDRFJfRk9fR0FJTl9SQVRFMiAgICAgICAgICAg ICAgICAgICAweGQ0Cj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiArI2RlZmluZSBRU0VSREVT X1VGU19WNl9SWF9VQ0RSX0ZPX0dBSU5fUkFURTQgICAgICAgICAgICAgICAgICAgMHhkYwo+ID4g PiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gKyNkZWZpbmUgUVNFUkRFU19VRlNfVjZfUlhfVUNEUl9T T19HQUlOX1JBVEU0ICAgICAgICAgICAgICAgICAgIDB4ZjAKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ ID4gPiA+ICsjZGVmaW5lIFFTRVJERVNfVUZTX1Y2X1JYX1VDRFJfUElfQ09OVFJPTFMgICAgICAg ICAgICAgICAgICAgICAweGY0Cj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiAgICAjZGVmaW5l IFFTRVJERVNfVUZTX1Y2X1JYX1ZHQV9DQUxfTUFOX1ZBTCAgICAgICAgICAgICAgICAgICAgICAw eDE3OAo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gKyNkZWZpbmUgUVNFUkRFU19VRlNfVjZf UlhfRVFfT0ZGU0VUX0FEQVBUT1JfQ05UUkwxICAgICAgICAgICAgIDB4MWJjCj4gPiA+ID4gPiA+ ID4gPiA+ID4gPiA+ID4gPiArI2RlZmluZSBRU0VSREVTX1VGU19WNl9SWF9PRkZTRVRfQURBUFRP Ul9DTlRSTDMgICAgICAgICAgICAgICAgICAgICAgICAweDFjNAo+ID4gPiA+ID4gPiA+ID4gPiA+ ID4gPiA+ID4gICAgI2RlZmluZSBRU0VSREVTX1VGU19WNl9SWF9NT0RFX1JBVEVfMF8xX0IwICAg ICAgICAgICAgICAgICAgICAgMHgyMDgKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICAgICNk ZWZpbmUgUVNFUkRFU19VRlNfVjZfUlhfTU9ERV9SQVRFXzBfMV9CMSAgICAgICAgICAgICAgICAg ICAgIDB4MjBjCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiAgICAjZGVmaW5lIFFTRVJERVNf VUZTX1Y2X1JYX01PREVfUkFURV8wXzFfQjMgICAgICAgICAgICAgICAgICAgICAweDIxNAo+ID4g PiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gQEAgLTI1LDYgKzM1LDggQEAKPiA+ID4gPiA+ID4gPiA+ ID4gPiA+ID4gPiA+ICAgICNkZWZpbmUgUVNFUkRFU19VRlNfVjZfUlhfTU9ERV9SQVRFM19CNSAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyNjQKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ ID4gPiA+ICAgICNkZWZpbmUgUVNFUkRFU19VRlNfVjZfUlhfTU9ERV9SQVRFM19COCAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgMHgyNzAKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ ICAgICNkZWZpbmUgUVNFUkRFU19VRlNfVjZfUlhfTU9ERV9SQVRFNF9CMyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgMHgyODAKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICsjZGVm aW5lIFFTRVJERVNfVUZTX1Y2X1JYX01PREVfUkFURTRfQjQgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIDB4Mjg0Cj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiAgICAjZGVmaW5lIFFT RVJERVNfVUZTX1Y2X1JYX01PREVfUkFURTRfQjYgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIDB4MjhjCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiArI2RlZmluZSBRU0VSREVTX1VG U19WNl9SWF9ETEwwX0ZUVU5FX0NUUkwgICAgICAgICAgICAgICAgICAgICAgMHgyZjgKPiA+ID4g PiA+ID4gPiA+ID4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gICAgI2Vu ZGlmCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9waHkv cXVhbGNvbW0vcGh5LXFjb20tcW1wLXVmcy5jIGIvZHJpdmVycy9waHkvcXVhbGNvbW0vcGh5LXFj b20tcW1wLXVmcy5jCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiBpbmRleCAzOTI3ZWJhLi5l MGEwMTQ5NyAxMDA2NDQKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+IC0tLSBhL2RyaXZlcnMv cGh5L3F1YWxjb21tL3BoeS1xY29tLXFtcC11ZnMuYwo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ ID4gKysrIGIvZHJpdmVycy9waHkvcXVhbGNvbW0vcGh5LXFjb20tcW1wLXVmcy5jCj4gPiA+ID4g PiA+ID4gPiA+ID4gPiA+ID4gPiBAQCAtNjQ5LDMyICs2NDksNTEgQEAgc3RhdGljIGNvbnN0IHN0 cnVjdCBxbXBfcGh5X2luaXRfdGJsIHNtODU1MF91ZnNwaHlfc2VyZGVzW10gPSB7Cj4gPiA+ID4g PiA+ID4gPiA+ID4gPiA+ID4gPiAgICAgICAgICAgUU1QX1BIWV9JTklUX0NGRyhRU0VSREVTX1Y2 X0NPTV9IU0NMS19TRUxfMSwgMHgxMSksCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiAgICAg ICAgICAgUU1QX1BIWV9JTklUX0NGRyhRU0VSREVTX1Y2X0NPTV9IU0NMS19IU19TV0lUQ0hfU0VM XzEsIDB4MDApLAo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gICAgICAgICAgIFFNUF9QSFlf SU5JVF9DRkcoUVNFUkRFU19WNl9DT01fTE9DS19DTVBfRU4sIDB4MDEpLAo+ID4gPiA+ID4gPiA+ ID4gPiA+ID4gPiA+ID4gLSAgICAgICBRTVBfUEhZX0lOSVRfQ0ZHKFFTRVJERVNfVjZfQ09NX1ZD T19UVU5FX01BUCwgMHgwNCksCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiAtICAgICAgIFFN UF9QSFlfSU5JVF9DRkcoUVNFUkRFU19WNl9DT01fUExMX0lWQ08sIDB4MGYpLAo+ID4gPiA+ID4g PiA+ID4gPiA+ID4gPiA+ID4gKwo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gICAgICAgICAg IFFNUF9QSFlfSU5JVF9DRkcoUVNFUkRFU19WNl9DT01fVkNPX1RVTkVfSU5JVFZBTDIsIDB4MDAp LAo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gICAgICAgICAgIFFNUF9QSFlfSU5JVF9DRkco UVNFUkRFU19WNl9DT01fREVDX1NUQVJUX01PREUwLCAweDQxKSwKPiA+ID4gPiA+ID4gPiA+ID4g PiA+ID4gPiA+IC0gICAgICAgUU1QX1BIWV9JTklUX0NGRyhRU0VSREVTX1Y2X0NPTV9DUF9DVFJM X01PREUwLCAweDBhKSwKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICAgICAgICAgICBRTVBf UEhZX0lOSVRfQ0ZHKFFTRVJERVNfVjZfQ09NX1BMTF9SQ1RSTF9NT0RFMCwgMHgxOCksCj4gPiA+ ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiAgICAgICAgICAgUU1QX1BIWV9JTklUX0NGRyhRU0VSREVT X1Y2X0NPTV9QTExfQ0NUUkxfTU9ERTAsIDB4MTQpLAo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ ID4gICAgICAgICAgIFFNUF9QSFlfSU5JVF9DRkcoUVNFUkRFU19WNl9DT01fTE9DS19DTVAxX01P REUwLCAweDdmKSwKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICAgICAgICAgICBRTVBfUEhZ X0lOSVRfQ0ZHKFFTRVJERVNfVjZfQ09NX0xPQ0tfQ01QMl9NT0RFMCwgMHgwNiksCj4gPiA+ID4g PiA+ID4gPiA+ID4gPiA+ID4gPiAtICAgICAgIFFNUF9QSFlfSU5JVF9DRkcoUVNFUkRFU19WNl9D T01fREVDX1NUQVJUX01PREUwLCAweDRjKSwKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICt9 Owo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gKwo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ ID4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcW1wX3BoeV9pbml0X3RibCBzbTg1NTBfdWZzcGh5X2hz X2Jfc2VyZGVzW10gPSB7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiArICAgICAgIFFNUF9Q SFlfSU5JVF9DRkcoUVNFUkRFU19WNl9DT01fVkNPX1RVTkVfTUFQLCAweDQ0KSwKPiA+ID4gPiA+ ID4gPiA+ID4gPiA+ID4gPiA+ICt9Owo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gKwo+ID4g PiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcW1wX3BoeV9pbml0 X3RibCBzbTg1NTBfdWZzcGh5X2c0X3NlcmRlc1tdID0gewo+ID4gPiA+ID4gPiA+ID4gPiA+ID4g PiA+ID4gKyAgICAgICBRTVBfUEhZX0lOSVRfQ0ZHKFFTRVJERVNfVjZfQ09NX1ZDT19UVU5FX01B UCwgMHgwNCksCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiArICAgICAgIFFNUF9QSFlfSU5J VF9DRkcoUVNFUkRFU19WNl9DT01fUExMX0lWQ08sIDB4MGYpLAo+ID4gPiA+ID4gPiA+ID4gPiA+ ID4gPiA+ID4gICAgICAgICAgIFFNUF9QSFlfSU5JVF9DRkcoUVNFUkRFU19WNl9DT01fQ1BfQ1RS TF9NT0RFMCwgMHgwYSksCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiAtICAgICAgIFFNUF9Q SFlfSU5JVF9DRkcoUVNFUkRFU19WNl9DT01fUExMX1JDVFJMX01PREUwLCAweDE4KSwKPiA+ID4g PiA+ID4gPiA+ID4gPiA+ID4gPiA+IC0gICAgICAgUU1QX1BIWV9JTklUX0NGRyhRU0VSREVTX1Y2 X0NPTV9QTExfQ0NUUkxfTU9ERTAsIDB4MTQpLAo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4g LSAgICAgICBRTVBfUEhZX0lOSVRfQ0ZHKFFTRVJERVNfVjZfQ09NX0xPQ0tfQ01QMV9NT0RFMCwg MHg5OSksCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiAtICAgICAgIFFNUF9QSFlfSU5JVF9D RkcoUVNFUkRFU19WNl9DT01fTE9DS19DTVAyX01PREUwLCAweDA3KSwKPiA+ID4gPiA+ID4gPiA+ ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiBBc2lkZSBmcm9tIG1vdmluZyB0 aGVzZSByZWdpc3RlcnMgdG8gdGhlIEhTX0c0IHRhYmxlLCB5b3UgYXJlIGFsc28KPiA+ID4gPiA+ ID4gPiA+ID4gPiA+ID4gPiBjaGFuZ2luZyB0aGVzZSByZWdpc3RlcnMuIEl0IG1ha2VzIG1lIHRo aW5rIHRoYXQgdGhlcmUgd2FzIGFuIGVycm9yIGluCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4g dGhlIG9yaWdpbmFsIHByb2dyYW1taW5nIHNlcXVlbmNlLgo+ID4gPiA+ID4gPiA+ID4gPiA+ID4g PiA+IElmIHRoYXQgaXMgY29ycmVjdCwgY291bGQgeW91IHBsZWFzZSBzcGxpdCB0aGUgcGF0Y2gg aW50byB0d28gcGllY2VzOgo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+IC0gRml4IHByb2dyYW1t aW5nIHNlcXVlbmNlIChhZGQgcHJvcGVyIEZpeGVzIHRhZ3MpCj4gPiA+ID4gPiA+ID4gPiA+ID4g PiA+ID4gLSBTcGxpdCBHNCBhbmQgRzUgdGFibGVzLgo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiAK PiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gQWNrCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+IAo+ID4g PiA+ID4gPiA+ID4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gKwo+ID4g PiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgICAgICBRTVBfUEhZX0lOSVRfQ0ZHKFFTRVJERVNf VjZfQ09NX0RFQ19TVEFSVF9NT0RFMSwgMHg0YyksCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4g PiArICAgICAgIFFNUF9QSFlfSU5JVF9DRkcoUVNFUkRFU19WNl9DT01fQ1BfQ1RSTF9NT0RFMSwg MHgwYSksCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiArICAgICAgIFFNUF9QSFlfSU5JVF9D RkcoUVNFUkRFU19WNl9DT01fUExMX1JDVFJMX01PREUxLCAweDE4KSwKPiA+ID4gPiA+ID4gPiA+ ID4gPiA+ID4gPiA+ICsgICAgICAgUU1QX1BIWV9JTklUX0NGRyhRU0VSREVTX1Y2X0NPTV9QTExf Q0NUUkxfTU9ERTEsIDB4MTQpLAo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgICAgICBR TVBfUEhZX0lOSVRfQ0ZHKFFTRVJERVNfVjZfQ09NX0xPQ0tfQ01QMV9NT0RFMSwgMHg5OSksCj4g PiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiArICAgICAgIFFNUF9QSFlfSU5JVF9DRkcoUVNFUkRF U19WNl9DT01fTE9DS19DTVAyX01PREUxLCAweDA3KSwKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4g PiAKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiBJIHNlZSBhbGwgdGhlIE1PREUxIHJlZ2lzdGVy cyBiZWluZyBvbmx5IHByZXNlbnQgaW4gRzQgYW5kIEc1IHRhYmxlcy4KPiA+ID4gPiA+ID4gPiA+ ID4gPiA+ID4gPiBTaG91bGQgdGhleSBiZSBwcm9ncmFtbWVkIGZvciB0aGUgbW9kZXMgbG93ZXIg dGhhbiBHND8KPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ ID4gCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+IFdlIHVzZSBHNCB0YWJsZSBmb3IgYWxsIHRoZSBt b2RlcyA8PSBHNC4KPiA+ID4gPiA+ID4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+ID4gPiA+ID4g Q291bGQgeW91IHBsZWFzZSBwb2ludCBtZSBob3cgaXQncyBoYW5kbGVkPwo+ID4gPiA+ID4gPiA+ ID4gPiA+ID4gSW4gdGhlIHBhdGNoIEkgc2VlIGp1c3Q6Cj4gPiA+ID4gPiA+ID4gPiA+ID4gPiAK PiA+ID4gPiA+ID4gPiA+ID4gPiA+ICAgICAgICAgIGlmIChxbXAtPnN1Ym1vZGUgPT0gVUZTX0hT X0c0KQo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gICAgICAgICAgICAgICAgICBxbXBfdWZzX3NlcmRl c19pbml0KHFtcCwgJmNmZy0+dGJsc19oc19nNCk7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gPiAgICAg ICAgICBlbHNlIGlmIChxbXAtPnN1Ym1vZGUgPT0gVUZTX0hTX0c1KQo+ID4gPiA+ID4gPiA+ID4g PiA+ID4gICAgICAgICAgICAgICAgICBxbXBfdWZzX3NlcmRlc19pbml0KHFtcCwgJmNmZy0+dGJs c19oc19nNSk7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiA+ID4gPiA+IFdo aWNoIGxvb2tzIGxpa2UgdHdvIHNwZWNpYWwgY2FzZXMgKEhTX0c0IGFuZCBIU19HNSkgYW5kIG5v dGhpbmcgZm9yCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiBhbnl0aGluZyBlbHNlLgo+ID4gPiA+ID4g PiA+ID4gPiA+ID4gCj4gPiA+ID4gPiA+ID4gPiA+ID4gCj4gPiA+ID4gPiA+ID4gPiA+ID4gWWVz LCBhbmQgdGhlIFVGUyBkcml2ZXIgcGFzc2VzIG9ubHkgRzQvRzUuIEZvciBhbGwgdGhlIGdlYXJz IDw9RzQsIEc0IGluaXQKPiA+ID4gPiA+ID4gPiA+ID4gPiBzZXF1ZW5jZSB3aWxsIGJlIHVzZWQg YW5kIGZvciBHNSwgRzUgc2VxdWVuY2Ugd2lsbCBiZSB1c2VkLgo+ID4gPiA+ID4gPiA+ID4gPiA+ IAo+ID4gPiA+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiA+ID4gVGhhdCdzIHdoYXQgSSBjb3Vs ZCBub3QgZmluZCBpbiB0aGUgVUZTIGRyaXZlci4gSSBzZWUgYSBjYWxsIHRvCj4gPiA+ID4gPiA+ ID4gPiA+IGBwaHlfc2V0X21vZGVfZXh0KHBoeSwgUEhZX01PREVfVUZTX0hTX0IsIGhvc3QtPnBo eV9nZWFyKTtgIGFuZAo+ID4gPiA+ID4gPiA+ID4gPiBob3N0LT5waHlfZ2VhciBpcyBpbml0aWFs aXNlZCB0byBVRlNfSFNfRzIuCj4gPiA+ID4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+ID4gCj4g PiA+ID4gPiA+ID4gPiBZb3UgbmVlZCB0byBjaGVjayB0aGUgVUZTIGRyaXZlciBjaGFuZ2VzIGlu IHRoaXMgc2VyaWVzIHRvIGdldCB0aGUgY29tcGxldGUKPiA+ID4gPiA+ID4gPiA+IHBpY3R1cmUg YXMgdGhlIGxvZ2ljIGlzIGdldHRpbmcgY2hhbmdlZC4KPiA+ID4gPiA+ID4gPiA+IAo+ID4gPiA+ ID4gPiA+ID4gSXQgaXMgY29tbW9uIHRvIGdldCBjb25mdXNlZCBiZWNhdXNlIG9mIHRoZSB3YXkg dGhlIFVGUyBkcml2ZXIgKHFjb20gbW9zdGx5KQo+ID4gPiA+ID4gPiA+ID4gaGFuZGxlcyB0aGUg UEhZIGluaXQgc2VxdWVuY2UgcHJvZ3JhbW1pbmcuIFdlIHVzZWQgdG8gaGF2ZSBvbmx5IG9uZSBp bml0Cj4gPiA+ID4gPiA+ID4gPiBzZXF1ZW5jZSBmb3Igb2xkZXIgdGFyZ2V0cyBhbmQgbGlmZSB3 YXMgZWFzeS4gQnV0IHdoZW4gSSB3YW50ZWQgdG8gYWRkIEc0Cj4gPiA+ID4gPiA+ID4gPiBzdXBw b3J0IGZvciBTTTgyNTAsIEkgbGVhcm5lZCB0aGF0IHRoZXJlIGFyZSAyIHNlcGFyYXRlIGluaXQg c2VxdWVuY2VzLiBPbmUgZm9yCj4gPiA+ID4gPiA+ID4gPiBub24tRzQgYW5kIG90aGVyIGZvciBH NC4gU28gSSB1c2VkIHRoZSBwaHlfc3ViX21vZGUgcHJvcGVydHkgdG8gcGFzcyB0aGUKPiA+ID4g PiA+ID4gPiA+IHJlbGV2YW50IG1vZGUgZnJvbSB0aGUgVUZTIGRyaXZlciB0byB0aGUgUEhZIGRy aXZlciBhbmQgcHJvZ3JhbW1lZCB0aGUgc2VxdWVuY2UKPiA+ID4gPiA+ID4gPiA+IGFjY29yZGlu Z2x5LiBUaGlzIGdvdCBleHRlbmRlZCB0byBub24tRzUgYW5kIEc1IG5vdy4KPiA+ID4gPiA+ID4g PiA+IAo+ID4gPiA+ID4gPiA+ID4gTm93LCB0aGUgVUZTIGRyaXZlciB3aWxsIHN0YXJ0IHByb2Jp bmcgZnJvbSBhIGxvdyBnZWFyIGZvciBvbGRlciB0YXJnZXRzIChHMikKPiA+ID4gPiA+ID4gPiA+ IGFuZCBHNC9HNSBmb3IgbmV3ZXIgb25lcyB0aGVuIHNjYWxlIHVwIGJhc2VkIG9uIHRoZSBkZXZp Y2UgYW5kIGhvc3QgY2FwYWJpbGl0eS4KPiA+ID4gPiA+ID4gPiA+IEZvciBvbGRlciB0YXJnZXRz LCB0aGUgY29tbW9uIHRhYmxlICh0YmxzKSB3aWxsIGJlIHVzZWQgaWYgdGhlIHN1Ym1vZGUgZG9l c24ndAo+ID4gPiA+ID4gPiA+ID4gbWF0Y2ggRzQvRzUuIEJ1dCBmb3IgbmV3ZXIgdGFyZ2V0cywg dGhlIFVGUyBkcml2ZXIgd2lsbCBfb25seV8gcGFzcyBHNCBvciBHNSBhcwo+ID4gPiA+ID4gPiA+ ID4gdGhlIHBoeV9nZWFyLCBzbyB0aG9zZSBzcGVjaWZpYyBzZXF1ZW5jZSB3aWxsIG9ubHkgYmUg dXNlZC4KPiA+ID4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+ID4gSG9wZSBJJ20gY2xlYXIuCj4g PiA+ID4gPiA+ID4gCj4gPiA+ID4gPiA+ID4gWWVzLCBpdCBpcyBub3cgY2xlYXIsIHRoYW5rIHlv dSEKPiA+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiBXb3VsZCBpdCBiZSBwb3NzaWJsZSAvIGZl YXNpYmxlIC8gbG9naWNhbCB0byBtYWludGFpbiB0aGlzIGlkZWEgZXZlbgo+ID4gPiA+ID4gPiA+ IGZvciBuZXdlciBwbGF0Zm9ybXMgKGxlYXZpbmcgdGhlIEhTX0EgIC8gSFNfQiBhc2lkZSk/Cj4g PiA+ID4gPiA+ID4gCj4gPiA+ID4gPiA+ID4gdGJscyAtIHdvcmtzIGZvciBIU19HMgo+ID4gPiA+ ID4gPiA+IHRibHMgKyB0YmxzX2c0IC0gd29ya3MgZm9yIEhTX0c0Cj4gPiA+ID4gPiA+ID4gdGJs cyArIHRibHNfZzUgLSB3b3JrcyBmb3IgSFNfRzUKPiA+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4g Cj4gPiA+ID4gPiA+IE5vLiBUaGUgUEhZIHRlYW0gb25seSBnaXZlcyAyIGluaXQgc2VxdWVuY2Vz IGZvciBhbnkgU29DIG5vdy4KPiA+ID4gPiA+IAo+ID4gPiA+ID4gQWNrLiBUaGVuIHRoZSBjb2Rl IHNob3VsZCBiZWNvbWUKPiA+ID4gPiA+IGlmIChIU19HNSkKPiA+ID4gPiA+ICAgICAgcHJvZ3Jh bSh0YmxzX2hzX2c1KQo+ID4gPiA+ID4gZWxzZQo+ID4gPiA+ID4gICAgICBwcm9ncmFtKHRibHNf aHNfZzQpOwo+ID4gPiA+ID4gCj4gPiA+ID4gCj4gPiA+ID4gVGhpcyBzaG91bGQgd29yay4gRXZl biBpZiB3ZSBoYXZlIHRvIGFjY29tb2RhdGUgRzYgaW4gdGhlIGZ1dHVyZSwgd2UgY2FuIHVzZQo+ ID4gPiA+ICJlbHNlIGlmIiBmb3IgdGhhdCBhbmQga2VlcCBHNCBhcyB0aGUgImVsc2UiIGNvbmRp dGlvbi4gVGhpcyBsb2dpYyBjYW4gYWxzbyBiZQo+ID4gPiA+IG9wdGltaXplZCBpbiB0aGUgZnV0 dXJlLgo+ID4gPiAKPiA+ID4gVGhhdCB3b3VsZCBtYWtlIGR1YWwgaW5pdCBtZWFuaW5nbGVzcyBm b3Igb2xkIHRhcmdldHMuIFNheSBvbiBTTTg0NTAsIHRoZQo+ID4gPiBpbml0aWFsIFBIWSBnZWFy IGlzIEcyLCB3aXRoIHRoZSAiZWxzZSIgY29uZGl0aW9uLCBkdXJpbmcgdGhlIGZpcnN0IGluaXQs IEc0Cj4gPiA+IHRhYmxlIHdvdWxkIGJlIHByb2dyYW1tZWQsIHRoZW4gZ2VhciBuZWdvdGlhdGlv biBoYXBwZW5zIGJ0dyBob3N0IGFuZCBkZXZpY2UKPiA+ID4gYW5kIHRoZSBuZWdvdGlhdGVkIGdl YXIgaXMgRzMgKGFzc3VtZSBhIFVGUzIueCBpcyBjb25uZWN0ZWQpLiBEdXJpbmcgdGhlIDJuZAo+ ID4gPiBpbml0LCB0aGUgImVsc2UiIGNvbmRpdGlvbiB3b3VsZCBfX2FnYWluX18gcHJvZ3JhbSB0 aGUgRzQgdGFibGUgLSBpdCBpcyBub3QKPiA+ID4gcHJvZ3JhbW1pbmcgdGhlIG5vbi1HNCB0YWJs ZSBmb3IgcG93ZXIgc2F2aW5nLiBUaGUgZHVhbCBpbml0IGlzIHN1cHBvc2VkIHRvCj4gPiA+IGZp bmQgdGhlIG9wdGltYWwgUEhZIHNldHRpbmdzLCBidXQgdGhlICJlbHNlIiBjb25kaXRpb24gaXMg cHJvZ3JhbW1pbmcgRzQKPiA+ID4gdGFibGUgdW5jb25kaXRpbmFsbHkuCj4gPiA+IAo+ID4gPiBX aXRoIHRoZSBvcmlnaW5hbCBjb2RlIGNoYW5nZSBpbiB0aGlzIHBhdGNoLCB0aGUgZHVhbCBpbml0 IHdvcmtzIGFzIGl0IGlzCj4gPiA+IGZvciBvbGQgdGFyZ2V0cy4gc2F5IFNNODQ1MCwgdGhlIGlu aXRpYWwgUEhZIGdlYXIgaXMgRzIsIGR1cmluZyB0aGUgMm5kCj4gPiA+IGluaXQsIGl0IGlzIHBy b2dyYW1taW5nIHRoZSBub24tRzQgdGFibGUgKGFzc3VtZSBhIFVGUzIueCBpcyBjb25uZWN0ZWQp LCBidXQKPiA+ID4gbm90IHRoZSBHNCB0YWJsZS4KPiA+ID4gCj4gPiAKPiA+IFlvdSBhcmUgcmln aHQuIEkgY29tcGxldGVseSBvdmVybG9va2VkIHRoZSBjb21wYXRpYmlsaXR5IGZvciBvbGQgdGFy Z2V0cy4gQnV0Cj4gPiBzdGlsbCB3ZSBjYW4gbW92ZSB0aGUgY29tbW9uIHRhYmxlIHRvIHRoZSAi ZWxzZSIgY29uZGl0aW9uLiBUaGlzIG1ha2VzIGl0IGNsZWFyCj4gPiB0aGF0IG9uZSBvZiB0aGUg MyB3aWxsIGJlIHByb2dyYW1tZWQgYXQgYSB0aW1lLiBCdXQgd2l0aCB0aGUgY3VycmVudCBsb2dp YywgSQo+ID4gZ2V0IHRoZSBpbXByZXNzaW9uIHRoYXQgY29tbW9uIHRhYmxlIGlzIG92ZXJyaWRk ZW4gYnkgRzQvRzUgdGFibGVzLgo+ID4gCj4gPiBTbyB0aGlzIGlzIHdoYXQgSSdtIHN1Z2dlc3Rp bmc6Cj4gPiAKPiA+IGlmIChIU19HNSkKPiA+IAlwcm9ncmFtKHRibHNfaHNfZzUpCj4gPiBlbHNl IGlmIChIU19HNCkKPiA+IAlwcm9ncmFtKHRibHNfaHNfZzQpOwo+ID4gZWxzZQo+ID4gCXByb2dy YW0odGJsc19oc19jb21tb24pOwo+ID4gCj4gCj4gQ29tbW9uIHRhYmxlIGlzIG5lZWRlZCByZWdh cmRsZXNzbHksIHdlIGNhbm5vdCBwdXQgaXQgaW4gImVsc2UiLCBvdGhlcndpc2UKPiBpdCB3b3Vs ZCBicmVhayBhbGwgdGFyZ2V0cyAtCj4gCj4gT24gb2xkIHRhcmdldHMgKG5vIEc1IHN1cHBvcnRl ZCk6Cj4gQ29tbW9uIHRhYmxlIAkJLSBzdXBwb3J0cyBub24tRzQgKEczIGFuZCBsb3dlcikKPiBD b21tb24gdGFibGUgKyBHNCB0YWJsZSAtIHN1cHBvcnRzIEc0Cj4gCj4gT24gbmV3IHRhcmdldHMg KEc1IHN1cHBvcnRlZCk6Cj4gQ29tbW9uIHRhYmxlIAkJLSBzdXBwb3J0cyBub3RoaW5nLCBhcyBp dCBpcyBqdXN0IGNvbW1vbiBwYXJ0cyBvZiBHNCB0YWJsZQo+IGFuZCBHNSB0YWJsZS4KPiBDb21t b24gdGFibGUgKyBHNCB0YWJsZSAtIHN1cHBvcnQgbm9uLUc1IChHNCBhbmQgbG93ZXIpCj4gQ29t bW9uIHRhYmxlICsgRzUgdGFibGUgLSBzdXBwb3J0IEc1Cj4gCgpEb2ghIEkgbWlzc2VkIHRoZSBm YWN0IHRoYXQgY29tbW9uIHRhYmxlIGlzIG5vdCBhIHN0YW5kYWxvbmUgdGFibGUuIFNvcnJ5IGZv cgp0aGUgY29uZnVzaW9uLiBMZXQncyBrZWVwIGl0IGFzIHlvdSBwcm9wb3NlZCBmb3Igbm93LiBJ IHN0aWxsIGRvbid0IGxpa2UgdGhlIGlmCmNvbmRpdGlvbnMgYXMgaXQgd291bGQganVzdCBrZWVw IGdyb3dpbmcgd2l0aCBmdXR1cmUgZ2VhcnMsIGJ1dCB3ZSBjYW4gZ2V0IHRvIGl0CmxhdGVyLgoK LSBNYW5pCgo+IFRoYW5rcywKPiBDYW4gR3VvLgo+IAo+ID4gLSBNYW5pCj4gPiAKPiA+ID4gVGhh bmtzLAo+ID4gPiBDYW4gR3VvLgo+ID4gPiA+IAo+ID4gPiA+IC0gTWFuaQo+ID4gPiA+IAo+ID4g PiA+ID4gPiAKPiA+ID4gPiA+ID4gLSBNYW5pCj4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+IEkg bWVhbiBoZXJlIHRoYXQgdGhlIFBIWSBkcml2ZXIgc2hvdWxkIG5vdCBkZXBlbmQgb24gdGhlIGtu b3dsZWRnZQo+ID4gPiA+ID4gPiA+IHRoYXQgdGhlIFVGUyBkcml2ZXIgd2lsbCBub3QgYmUgc2V0 dGluZyBIU19HMiBmb3Igc29tZSBwYXJ0aWN1bGFyCj4gPiA+ID4gPiA+ID4gcGxhdGZvcm0gYW5k IGlkZWFsbHkgaXQgc2hvdWxkIGNvbnRpbnVlIHdvcmtpbmcgaWYgYXQgc29tZSBwb2ludCB3ZQo+ ID4gPiA+ID4gPiA+IGNoYW5nZSB0aGUgVUZTIGRyaXZlciB0byBzZXQgSFNfRzIuCj4gPiA+ID4g PiA+ID4gCj4gPiA+ID4gPiA+ID4gCj4gPiA+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiA+IC0g TWFuaQo+ID4gPiA+ID4gPiA+ID4gCj4gPiA+ID4gPiA+ID4gPiA+IE1heWJlIHdlIHNob3VsZCBj aGFuZ2UgdGhlIGNvbmRpdGlvbiBoZXJlIChpbiB0aGUgUEhZIGRyaXZlcikgdG86Cj4gPiA+ID4g PiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+ID4gPiBpZiAocW1wLT5zdWJtb2RlIDw9IFVGU19IU19H NCkKPiA+ID4gPiA+ID4gPiA+ID4gCj4gPiA+ID4gPiA+ID4gPiA+ID8KPiA+ID4gPiA+ID4gPiA+ ID4gLS0KPiA+ID4gPiA+ID4gPiA+ID4gV2l0aCBiZXN0IHdpc2hlcwo+ID4gPiA+ID4gPiA+ID4g PiBEbWl0cnkKPiA+ID4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+ID4gLS0KPiA+ID4gPiA+ID4g PiA+IOCuruCuo+Cuv+CuteCuo+CvjeCuo+CuqeCvjSDgrprgrqTgrr7grprgrr/grrXgrq7gr40K PiA+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4g PiAtLQo+ID4gPiA+ID4gPiA+IFdpdGggYmVzdCB3aXNoZXMKPiA+ID4gPiA+ID4gPiBEbWl0cnkK PiA+ID4gPiA+ID4gCj4gPiA+ID4gPiA+IC0tCj4gPiA+ID4gPiA+IOCuruCuo+Cuv+CuteCuo+Cv jeCuo+CuqeCvjSDgrprgrqTgrr7grprgrr/grrXgrq7gr40KPiA+ID4gPiA+IAo+ID4gPiA+ID4g Cj4gPiA+ID4gPiAKPiA+ID4gPiA+IC0tIAo+ID4gPiA+ID4gV2l0aCBiZXN0IHdpc2hlcwo+ID4g PiA+ID4gRG1pdHJ5Cj4gPiA+ID4gCj4gPiAKCi0tIArgrq7grqPgrr/grrXgrqPgr43grqPgrqng r40g4K6a4K6k4K6+4K6a4K6/4K614K6u4K+NCgotLSAKbGludXgtcGh5IG1haWxpbmcgbGlzdAps aW51eC1waHlAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwczovL2xpc3RzLmluZnJhZGVhZC5vcmcv bWFpbG1hbi9saXN0aW5mby9saW51eC1waHkK