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 gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (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 03C53C43458 for ; Wed, 1 Jul 2026 12:48:28 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 610A010EF88; Wed, 1 Jul 2026 12:48:27 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=pass (2048-bit key; unprotected) header.d=kernel.org header.i=@kernel.org header.b="Pn0V4vIU"; dkim-atps=neutral Received: from tor.source.kernel.org (tor.source.kernel.org [172.105.4.254]) by gabe.freedesktop.org (Postfix) with ESMTPS id B8EA210EF8D for ; Wed, 1 Jul 2026 12:48:25 +0000 (UTC) Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) by tor.source.kernel.org (Postfix) with ESMTP id E8DC76001D; Wed, 1 Jul 2026 12:48:24 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2C1241F000E9; Wed, 1 Jul 2026 12:48:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1782910104; bh=1T7VWutfcoT1eQhz6SNDIKkUC3UgjAn1asmuahoNjEk=; h=From:Subject:Reply-To:To:Cc:In-Reply-To:References:Date; b=Pn0V4vIUspI+U3HIrzMrqv7noPwD0R7B9lbAF3BDEk5dqxLfi0SN7GAhF5EZZ9qSE 9+q0eZv6/wWEShFlrZwpDWa1p/rNpGlpTmYL6ktyZi+fFHbs3Q9GuwaQ4ru4CpaxV2 Zo9nOxBOFIy878dbJbW7qR2u65Co/i776XC8DWqaMPLJu8Dd5BptA6HRaMI/DFzlEP gAHnRQZClle6scG7/tv6de8nrdadHXv0CyhIWCJt/kqQOYqiD41WH1J86sM0+NtiNv vW27FBs+Q9oWQ8CH0kyHFchVcA9Tv8EtukhY7QqS7af4+q/VK9tEPfbRVYc9lVVMW7 fgC7PIVqVhKmA== From: sashiko-bot@kernel.org Subject: Re: [PATCH 08/12] phy: phy-mtk-dp: Add support for digital and analog calibration To: "AngeloGioacchino Del Regno" Cc: olteanv@gmail.com, neil.armstrong@linaro.org, vkoul@kernel.org, devicetree@vger.kernel.org, conor+dt@kernel.org, dri-devel@lists.freedesktop.org, linux-phy@lists.infradead.org, robh@kernel.org In-Reply-To: <20260701122008.19509-9-angelogioacchino.delregno@collabora.com> References: <20260701122008.19509-1-angelogioacchino.delregno@collabora.com> <20260701122008.19509-9-angelogioacchino.delregno@collabora.com> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Date: Wed, 01 Jul 2026 12:48:23 +0000 Message-Id: <20260701124824.2C1241F000E9@smtp.kernel.org> X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: sashiko-reviews@lists.linux.dev Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" Thank you for your contribution! Sashiko AI review found 9 potential issue(= s) to consider: - [High] Pointer casting a 16-bit variable to a `u8 *` in `nvmem_cell_read_= u8()` causes incorrect value retrieval on big-endian architectures. - [High] `mtk_dp_phy_set_analog_calibration_params()` clears hardware regis= ters due to missing bitwise shifts and ignores eFuse calibration. - [High] Legacy probe path fails to initialize analog calibration parameter= s, breaking PHY transmission. - [High] Driver probe fails unconditionally on platforms without NVMEM supp= ort due to unhandled `-EOPNOTSUPP`. - [High] Missing `pm_runtime_put_sync()`, `pm_runtime_disable()`, and `phy_= remove_lookup()` in driver removal, with unchecked `pm_runtime_get_sync()`. - [High] Incorrect indexing of digital register array using an analog enum = causes writes to the wrong offsets during power off. - [Medium] Spams `dev_err` on boot when expected eFuse calibration data is = not present. - [Medium] Incorrect field mask used when validating N-MOSFET impedance val= ues. - [Low] The field `efuse_cal_present` is set but never read. -- commit d7c70553eca35e13b77a951e8cbb9167598a5701 Author: AngeloGioacchino Del Regno phy: phy-mtk-dp: Add support for digital and analog calibration This commit adds support for reading digital and analog calibration values from eFuse for the MediaTek DP PHY. If calibration values are present, they are used; otherwise, the driver falls back to SoC-specific defaults. It also implements hardware writes for the analog calibration. > diff --git a/drivers/phy/mediatek/phy-mtk-dp.c b/drivers/phy/mediatek/phy= -mtk-dp.c > index 17d871530ccaf..cdcae861012c7 100644 > --- a/drivers/phy/mediatek/phy-mtk-dp.c > +++ b/drivers/phy/mediatek/phy-mtk-dp.c [ ... ] > @@ -257,21 +257,21 @@ > +static int mtk_dp_phy_set_analog_calibration_params(struct mtk_dp_phy *d= p_phy) > +{ > + const struct mtk_dp_phy_pdata *pdata =3D dp_phy->pdata; > + const u8 *regs_ana_glb =3D pdata->regs_ana_glb; > + const u8 *regs_ana_lane =3D pdata->regs_ana_lane; > + int i, ret; > + > + ret =3D regmap_update_bits(dp_phy->regmap, > + pdata->off_ana_glb + regs_ana_glb[DP_PHYA_GLB_BIAS_GEN_0], > + XTP_GLB_BIAS_INT_R_CTRL, pdata->ana_bias_r); [Severity: High] Does this clear the hardware registers instead of applying the calibrated values? The regmap_update_bits() call uses the static pdata->ana_bias_r defaults instead of the calibrated dp_phy->ana_bias_r. Additionally, passing unshift= ed values with the high-mask field XTP_GLB_BIAS_INT_R_CTRL results in a bitwise AND that yields zero. [ ... ] > @@ -517,109 +517,109 @@ > +static int mtk_dp_phy_get_one_cal_para(struct device *dev, const char *n= ame, u8 max_val) > +{ > + u16 buf =3D 0; > + int ret; > + > + /* > + * All of the calibrations are always max 8 bits long, but some may > + * be split between two different 8-bits cells: handle this corner > + * case by retrying reading as u16. > + */ > + ret =3D nvmem_cell_read_u8(dev, name, (u8 *)&buf); > + if (ret) > + ret =3D nvmem_cell_read_u16(dev, name, &buf); [Severity: High] Can this pointer cast corrupt the read value on big-endian architectures? Casting the 16-bit buf variable to (u8 *) will write to the most significant byte on big-endian systems. This shifts the 8-bit value left by 8 bits, whi= ch will exceed max_val and cause an -ERANGE error. > + > + if (ret) { > + dev_err(dev, "Cannot get calibration data for %s: %d\n", name, ret); > + return ret; > + }; [Severity: Medium] Will this spam dev_err on boot when the eFuse calibration data is missing? If the NVMEM cells are absent, this unconditionally prints an error before = the fallback logic can handle the -ENOENT return code. [ ... ] > +static int mtk_dp_phy_get_calibration_data(struct mtk_dp_phy *dp_phy) > +{ > + char mtk_dp_cal_lane_imp_name[] =3D "impedance-laneXM"; > + struct device *dev =3D dp_phy->dev; > + int i, ret; [ ... ] > + /* Get impedance params for each lane */ > + for (i =3D 0; i < MTK_DP_PHY_MAX_LANES; i++) { > + /* P-MOSFET first */ [ ... ] > + /* ...and then N-MOSFET too */ > + snprintf(mtk_dp_cal_lane_imp_name, ARRAY_SIZE(mtk_dp_cal_lane_imp_name= ), > + "impedance-lane%dn", i); > + ret =3D mtk_dp_phy_get_one_cal_para(dev, mtk_dp_cal_lane_imp_name, > + FIELD_MAX(XTP_LN_TX_IMPSEL_PMOS)); [Severity: Medium] Is this using the wrong mask for the N-MOSFET impedance values? It passes FIELD_MAX(XTP_LN_TX_IMPSEL_PMOS) instead of NMOS. While they both share a 4-bit width currently, this might cause semantic errors if the bit widths change. > + if (ret < 0) > + goto end; > + dp_phy->ana_impsel[i].nmos =3D ret; > + } > +end: > + if (ret < 0) { > + /* > + * If any of the calibration values is missing, or if there > + * is no calibration at all in the eFuses, copy the default > + * one entirely (as partial values shall not be mixed!) > + */ > + if (ret =3D=3D -ENOENT) { > + dev_info(dev, "Using calibration default values\n"); > + mtk_dp_phy_get_default_cal_data(dp_phy); > + return 0; > + } > + return ret; > + }; [Severity: High] Will the driver probe fail unconditionally on platforms without NVMEM suppo= rt? If NVMEM is disabled, nvmem_cell_read_u8() returns -EOPNOTSUPP. The strict check for -ENOENT means the default fallback is skipped and the driver probe aborts. > + dp_phy->efuse_cal_present =3D true; [Severity: Low] Is this flag actually used anywhere? The efuse_cal_present field is populated here but does not seem to be evaluated anywhere else in the code. > + > + return 0; > +} [ ... ] > @@ -437,6 +661,7 @@ static int mtk_dp_phy_probe(struct platform_device *p= dev) > struct mtk_dp_phy *dp_phy; > void __iomem *base; > struct phy *phy; > + int ret; > =20 > dp_phy =3D devm_kzalloc(dev, sizeof(*dp_phy), GFP_KERNEL); > if (!dp_phy) > @@ -458,6 +683,10 @@ static int mtk_dp_phy_probe(struct platform_device *= pdev) > =20 > dp_phy->pdata =3D device_get_match_data(dev); > =20 > + ret =3D mtk_dp_phy_get_calibration_data(dp_phy); > + if (ret) > + return ret; > + [Severity: High] Does the legacy probe path also need to initialize the analog calibration parameters? If mtk_dp_phy_legacy_probe() bypasses calibration data loading, dp_phy->ana_impsel is left entirely zeroed. These uninitialized zeroes will then be written directly to the PHY registers, which breaks transmission on legacy platforms. [Severity: High] Does the driver properly clean up runtime PM resources during removal? The probe function acquires PM resources without verifying the result: pm_runtime_enable(dev); pm_runtime_get_sync(dev); But there appears to be no corresponding .remove callback providing pm_runtime_put_sync(), pm_runtime_disable(), or phy_remove_lookup(). [Severity: High] Does mtk_dp_phy_power_off() access the wrong offset by indexing a digital register array with an analog enum? Looking at mtk_dp_phy_power_off() in phy-mtk-dp.c: static int mtk_dp_phy_power_off(struct phy *phy) { ... const u8 *regs =3D pdata->regs_dig_glb; ... ret =3D regmap_set_bits(dp_phy->regmap, pdata->off_ana_glb + regs[DP_PHYA_GLB_FORCE_CTRL_1], Using DP_PHYA_GLB_FORCE_CTRL_1 (which is an analog enum) to index regs (which points to regs_dig_glb) writes to the wrong offsets during power off. --=20 Sashiko AI review =C2=B7 https://sashiko.dev/#/patchset/20260701122008.1950= 9-1-angelogioacchino.delregno@collabora.com?part=3D8 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 70643C43602 for ; Wed, 1 Jul 2026 12:48:29 +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:MIME-Version:Reply-To:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id:Message-Id:Date: References:In-Reply-To:Cc:To:Subject:From:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=UTGufZgGjNfgF2lpF3ILBhO0lzaQFlqUK1TffCdgyMU=; b=HMfSLW/E5FSXyv RdzRLXyInVZUWqwyGUBNUwpt1AWLtV/ytRFysRthjOzcTVdPzurDkq7AcnDNFxEEiHCvoNV9dYXYO mnps4hUATYsi+Fw0gtiB0mn5aXPMzpI1B+DdYl0BFt8eJ6EHjoRK+gQZl4QjMuj+R7c6w7SvX0lyL QAMpuVFS08BITOrwi9YOYneHHNgWS7tOYLjAjlluolxvp+QdhKSF2cbNJFutH2avnvRIgpLPrnJHK 9PlYQIPqV53WBdgpjaF6XwUGyX0S08NT0z/VLJGOjwlYsROy+PyUk1hZQUGTDihA5aNxy2nruKUN1 9LFVYU7JxP5ysZhKLGaw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.99.1 #2 (Red Hat Linux)) id 1weuMf-000000022kR-07pS; Wed, 01 Jul 2026 12:48:29 +0000 Received: from tor.source.kernel.org ([2600:3c04:e001:324:0:1991:8:25]) by bombadil.infradead.org with esmtps (Exim 4.99.1 #2 (Red Hat Linux)) id 1weuMd-000000022jq-0Iv8 for linux-phy@lists.infradead.org; Wed, 01 Jul 2026 12:48:27 +0000 Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) by tor.source.kernel.org (Postfix) with ESMTP id E8DC76001D; Wed, 1 Jul 2026 12:48:24 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2C1241F000E9; Wed, 1 Jul 2026 12:48:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1782910104; bh=1T7VWutfcoT1eQhz6SNDIKkUC3UgjAn1asmuahoNjEk=; h=From:Subject:Reply-To:To:Cc:In-Reply-To:References:Date; b=Pn0V4vIUspI+U3HIrzMrqv7noPwD0R7B9lbAF3BDEk5dqxLfi0SN7GAhF5EZZ9qSE 9+q0eZv6/wWEShFlrZwpDWa1p/rNpGlpTmYL6ktyZi+fFHbs3Q9GuwaQ4ru4CpaxV2 Zo9nOxBOFIy878dbJbW7qR2u65Co/i776XC8DWqaMPLJu8Dd5BptA6HRaMI/DFzlEP gAHnRQZClle6scG7/tv6de8nrdadHXv0CyhIWCJt/kqQOYqiD41WH1J86sM0+NtiNv vW27FBs+Q9oWQ8CH0kyHFchVcA9Tv8EtukhY7QqS7af4+q/VK9tEPfbRVYc9lVVMW7 fgC7PIVqVhKmA== From: sashiko-bot@kernel.org Subject: Re: [PATCH 08/12] phy: phy-mtk-dp: Add support for digital and analog calibration To: "AngeloGioacchino Del Regno" Cc: olteanv@gmail.com, neil.armstrong@linaro.org, vkoul@kernel.org, devicetree@vger.kernel.org, conor+dt@kernel.org, dri-devel@lists.freedesktop.org, linux-phy@lists.infradead.org, robh@kernel.org In-Reply-To: <20260701122008.19509-9-angelogioacchino.delregno@collabora.com> References: <20260701122008.19509-1-angelogioacchino.delregno@collabora.com> <20260701122008.19509-9-angelogioacchino.delregno@collabora.com> Date: Wed, 01 Jul 2026 12:48:23 +0000 Message-Id: <20260701124824.2C1241F000E9@smtp.kernel.org> 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: , Reply-To: sashiko-reviews@lists.linux.dev MIME-Version: 1.0 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 VGhhbmsgeW91IGZvciB5b3VyIGNvbnRyaWJ1dGlvbiEgU2FzaGlrbyBBSSByZXZpZXcgZm91bmQg OSBwb3RlbnRpYWwgaXNzdWUocykgdG8gY29uc2lkZXI6Ci0gW0hpZ2hdIFBvaW50ZXIgY2FzdGlu ZyBhIDE2LWJpdCB2YXJpYWJsZSB0byBhIGB1OCAqYCBpbiBgbnZtZW1fY2VsbF9yZWFkX3U4KClg IGNhdXNlcyBpbmNvcnJlY3QgdmFsdWUgcmV0cmlldmFsIG9uIGJpZy1lbmRpYW4gYXJjaGl0ZWN0 dXJlcy4KLSBbSGlnaF0gYG10a19kcF9waHlfc2V0X2FuYWxvZ19jYWxpYnJhdGlvbl9wYXJhbXMo KWAgY2xlYXJzIGhhcmR3YXJlIHJlZ2lzdGVycyBkdWUgdG8gbWlzc2luZyBiaXR3aXNlIHNoaWZ0 cyBhbmQgaWdub3JlcyBlRnVzZSBjYWxpYnJhdGlvbi4KLSBbSGlnaF0gTGVnYWN5IHByb2JlIHBh dGggZmFpbHMgdG8gaW5pdGlhbGl6ZSBhbmFsb2cgY2FsaWJyYXRpb24gcGFyYW1ldGVycywgYnJl YWtpbmcgUEhZIHRyYW5zbWlzc2lvbi4KLSBbSGlnaF0gRHJpdmVyIHByb2JlIGZhaWxzIHVuY29u ZGl0aW9uYWxseSBvbiBwbGF0Zm9ybXMgd2l0aG91dCBOVk1FTSBzdXBwb3J0IGR1ZSB0byB1bmhh bmRsZWQgYC1FT1BOT1RTVVBQYC4KLSBbSGlnaF0gTWlzc2luZyBgcG1fcnVudGltZV9wdXRfc3lu YygpYCwgYHBtX3J1bnRpbWVfZGlzYWJsZSgpYCwgYW5kIGBwaHlfcmVtb3ZlX2xvb2t1cCgpYCBp biBkcml2ZXIgcmVtb3ZhbCwgd2l0aCB1bmNoZWNrZWQgYHBtX3J1bnRpbWVfZ2V0X3N5bmMoKWAu Ci0gW0hpZ2hdIEluY29ycmVjdCBpbmRleGluZyBvZiBkaWdpdGFsIHJlZ2lzdGVyIGFycmF5IHVz aW5nIGFuIGFuYWxvZyBlbnVtIGNhdXNlcyB3cml0ZXMgdG8gdGhlIHdyb25nIG9mZnNldHMgZHVy aW5nIHBvd2VyIG9mZi4KLSBbTWVkaXVtXSBTcGFtcyBgZGV2X2VycmAgb24gYm9vdCB3aGVuIGV4 cGVjdGVkIGVGdXNlIGNhbGlicmF0aW9uIGRhdGEgaXMgbm90IHByZXNlbnQuCi0gW01lZGl1bV0g SW5jb3JyZWN0IGZpZWxkIG1hc2sgdXNlZCB3aGVuIHZhbGlkYXRpbmcgTi1NT1NGRVQgaW1wZWRh bmNlIHZhbHVlcy4KLSBbTG93XSBUaGUgZmllbGQgYGVmdXNlX2NhbF9wcmVzZW50YCBpcyBzZXQg YnV0IG5ldmVyIHJlYWQuCi0tCgpjb21taXQgZDdjNzA1NTNlY2EzNWUxM2I3N2E5NTFlOGNiYjkx Njc1OThhNTcwMQpBdXRob3I6IEFuZ2Vsb0dpb2FjY2hpbm8gRGVsIFJlZ25vIDxhbmdlbG9naW9h Y2NoaW5vLmRlbHJlZ25vQGNvbGxhYm9yYS5jb20+CgpwaHk6IHBoeS1tdGstZHA6IEFkZCBzdXBw b3J0IGZvciBkaWdpdGFsIGFuZCBhbmFsb2cgY2FsaWJyYXRpb24KClRoaXMgY29tbWl0IGFkZHMg c3VwcG9ydCBmb3IgcmVhZGluZyBkaWdpdGFsIGFuZCBhbmFsb2cgY2FsaWJyYXRpb24KdmFsdWVz IGZyb20gZUZ1c2UgZm9yIHRoZSBNZWRpYVRlayBEUCBQSFkuIElmIGNhbGlicmF0aW9uIHZhbHVl cyBhcmUKcHJlc2VudCwgdGhleSBhcmUgdXNlZDsgb3RoZXJ3aXNlLCB0aGUgZHJpdmVyIGZhbGxz IGJhY2sgdG8gU29DLXNwZWNpZmljCmRlZmF1bHRzLiBJdCBhbHNvIGltcGxlbWVudHMgaGFyZHdh cmUgd3JpdGVzIGZvciB0aGUgYW5hbG9nIGNhbGlicmF0aW9uLgoKPiBkaWZmIC0tZ2l0IGEvZHJp dmVycy9waHkvbWVkaWF0ZWsvcGh5LW10ay1kcC5jIGIvZHJpdmVycy9waHkvbWVkaWF0ZWsvcGh5 LW10ay1kcC5jCj4gaW5kZXggMTdkODcxNTMwY2NhZi4uY2RjYWU4NjEwMTJjNyAxMDA2NDQKPiAt LS0gYS9kcml2ZXJzL3BoeS9tZWRpYXRlay9waHktbXRrLWRwLmMKPiArKysgYi9kcml2ZXJzL3Bo eS9tZWRpYXRlay9waHktbXRrLWRwLmMKWyAuLi4gXQo+IEBAIC0yNTcsMjEgKzI1NywyMSBAQAo+ ICtzdGF0aWMgaW50IG10a19kcF9waHlfc2V0X2FuYWxvZ19jYWxpYnJhdGlvbl9wYXJhbXMoc3Ry dWN0IG10a19kcF9waHkgKmRwX3BoeSkKPiArewo+ICsJY29uc3Qgc3RydWN0IG10a19kcF9waHlf cGRhdGEgKnBkYXRhID0gZHBfcGh5LT5wZGF0YTsKPiArCWNvbnN0IHU4ICpyZWdzX2FuYV9nbGIg PSBwZGF0YS0+cmVnc19hbmFfZ2xiOwo+ICsJY29uc3QgdTggKnJlZ3NfYW5hX2xhbmUgPSBwZGF0 YS0+cmVnc19hbmFfbGFuZTsKPiArCWludCBpLCByZXQ7Cj4gKwo+ICsJcmV0ID0gcmVnbWFwX3Vw ZGF0ZV9iaXRzKGRwX3BoeS0+cmVnbWFwLAo+ICsJCQkJIHBkYXRhLT5vZmZfYW5hX2dsYiArIHJl Z3NfYW5hX2dsYltEUF9QSFlBX0dMQl9CSUFTX0dFTl8wXSwKPiArCQkJCSBYVFBfR0xCX0JJQVNf SU5UX1JfQ1RSTCwgcGRhdGEtPmFuYV9iaWFzX3IpOwoKW1NldmVyaXR5OiBIaWdoXQpEb2VzIHRo aXMgY2xlYXIgdGhlIGhhcmR3YXJlIHJlZ2lzdGVycyBpbnN0ZWFkIG9mIGFwcGx5aW5nIHRoZSBj YWxpYnJhdGVkCnZhbHVlcz8KClRoZSByZWdtYXBfdXBkYXRlX2JpdHMoKSBjYWxsIHVzZXMgdGhl IHN0YXRpYyBwZGF0YS0+YW5hX2JpYXNfciBkZWZhdWx0cwppbnN0ZWFkIG9mIHRoZSBjYWxpYnJh dGVkIGRwX3BoeS0+YW5hX2JpYXNfci4gQWRkaXRpb25hbGx5LCBwYXNzaW5nIHVuc2hpZnRlZAp2 YWx1ZXMgd2l0aCB0aGUgaGlnaC1tYXNrIGZpZWxkIFhUUF9HTEJfQklBU19JTlRfUl9DVFJMIHJl c3VsdHMgaW4gYSBiaXR3aXNlCkFORCB0aGF0IHlpZWxkcyB6ZXJvLgoKWyAuLi4gXQo+IEBAIC01 MTcsMTA5ICs1MTcsMTA5IEBACj4gK3N0YXRpYyBpbnQgbXRrX2RwX3BoeV9nZXRfb25lX2NhbF9w YXJhKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqbmFtZSwgdTggbWF4X3ZhbCkKPiAr ewo+ICsJdTE2IGJ1ZiA9IDA7Cj4gKwlpbnQgcmV0Owo+ICsKPiArCS8qCj4gKwkgKiBBbGwgb2Yg dGhlIGNhbGlicmF0aW9ucyBhcmUgYWx3YXlzIG1heCA4IGJpdHMgbG9uZywgYnV0IHNvbWUgbWF5 Cj4gKwkgKiBiZSBzcGxpdCBiZXR3ZWVuIHR3byBkaWZmZXJlbnQgOC1iaXRzIGNlbGxzOiBoYW5k bGUgdGhpcyBjb3JuZXIKPiArCSAqIGNhc2UgYnkgcmV0cnlpbmcgcmVhZGluZyBhcyB1MTYuCj4g KwkgKi8KPiArCXJldCA9IG52bWVtX2NlbGxfcmVhZF91OChkZXYsIG5hbWUsICh1OCAqKSZidWYp Owo+ICsJaWYgKHJldCkKPiArCQlyZXQgPSBudm1lbV9jZWxsX3JlYWRfdTE2KGRldiwgbmFtZSwg JmJ1Zik7CgpbU2V2ZXJpdHk6IEhpZ2hdCkNhbiB0aGlzIHBvaW50ZXIgY2FzdCBjb3JydXB0IHRo ZSByZWFkIHZhbHVlIG9uIGJpZy1lbmRpYW4gYXJjaGl0ZWN0dXJlcz8KCkNhc3RpbmcgdGhlIDE2 LWJpdCBidWYgdmFyaWFibGUgdG8gKHU4ICopIHdpbGwgd3JpdGUgdG8gdGhlIG1vc3Qgc2lnbmlm aWNhbnQKYnl0ZSBvbiBiaWctZW5kaWFuIHN5c3RlbXMuIFRoaXMgc2hpZnRzIHRoZSA4LWJpdCB2 YWx1ZSBsZWZ0IGJ5IDggYml0cywgd2hpY2gKd2lsbCBleGNlZWQgbWF4X3ZhbCBhbmQgY2F1c2Ug YW4gLUVSQU5HRSBlcnJvci4KCj4gKwo+ICsJaWYgKHJldCkgewo+ICsJCWRldl9lcnIoZGV2LCAi Q2Fubm90IGdldCBjYWxpYnJhdGlvbiBkYXRhIGZvciAlczogJWRcbiIsIG5hbWUsIHJldCk7Cj4g KwkJcmV0dXJuIHJldDsKPiArCX07CgpbU2V2ZXJpdHk6IE1lZGl1bV0KV2lsbCB0aGlzIHNwYW0g ZGV2X2VyciBvbiBib290IHdoZW4gdGhlIGVGdXNlIGNhbGlicmF0aW9uIGRhdGEgaXMgbWlzc2lu Zz8KCklmIHRoZSBOVk1FTSBjZWxscyBhcmUgYWJzZW50LCB0aGlzIHVuY29uZGl0aW9uYWxseSBw cmludHMgYW4gZXJyb3IgYmVmb3JlIHRoZQpmYWxsYmFjayBsb2dpYyBjYW4gaGFuZGxlIHRoZSAt RU5PRU5UIHJldHVybiBjb2RlLgoKWyAuLi4gXQo+ICtzdGF0aWMgaW50IG10a19kcF9waHlfZ2V0 X2NhbGlicmF0aW9uX2RhdGEoc3RydWN0IG10a19kcF9waHkgKmRwX3BoeSkKPiArewo+ICsJY2hh ciBtdGtfZHBfY2FsX2xhbmVfaW1wX25hbWVbXSA9ICJpbXBlZGFuY2UtbGFuZVhNIjsKPiArCXN0 cnVjdCBkZXZpY2UgKmRldiA9IGRwX3BoeS0+ZGV2Owo+ICsJaW50IGksIHJldDsKWyAuLi4gXQo+ ICsJLyogR2V0IGltcGVkYW5jZSBwYXJhbXMgZm9yIGVhY2ggbGFuZSAqLwo+ICsJZm9yIChpID0g MDsgaSA8IE1US19EUF9QSFlfTUFYX0xBTkVTOyBpKyspIHsKPiArCQkvKiBQLU1PU0ZFVCBmaXJz dCAqLwpbIC4uLiBdCj4gKwkJLyogLi4uYW5kIHRoZW4gTi1NT1NGRVQgdG9vICovCj4gKwkJc25w cmludGYobXRrX2RwX2NhbF9sYW5lX2ltcF9uYW1lLCBBUlJBWV9TSVpFKG10a19kcF9jYWxfbGFu ZV9pbXBfbmFtZSksCj4gKwkJCSAiaW1wZWRhbmNlLWxhbmUlZG4iLCBpKTsKPiArCQlyZXQgPSBt dGtfZHBfcGh5X2dldF9vbmVfY2FsX3BhcmEoZGV2LCBtdGtfZHBfY2FsX2xhbmVfaW1wX25hbWUs Cj4gKwkJCQkJCSAgRklFTERfTUFYKFhUUF9MTl9UWF9JTVBTRUxfUE1PUykpOwoKW1NldmVyaXR5 OiBNZWRpdW1dCklzIHRoaXMgdXNpbmcgdGhlIHdyb25nIG1hc2sgZm9yIHRoZSBOLU1PU0ZFVCBp bXBlZGFuY2UgdmFsdWVzPwoKSXQgcGFzc2VzIEZJRUxEX01BWChYVFBfTE5fVFhfSU1QU0VMX1BN T1MpIGluc3RlYWQgb2YgTk1PUy4gV2hpbGUgdGhleSBib3RoCnNoYXJlIGEgNC1iaXQgd2lkdGgg Y3VycmVudGx5LCB0aGlzIG1pZ2h0IGNhdXNlIHNlbWFudGljIGVycm9ycyBpZiB0aGUgYml0Cndp ZHRocyBjaGFuZ2UuCgo+ICsJCWlmIChyZXQgPCAwKQo+ICsJCQlnb3RvIGVuZDsKPiArCQlkcF9w aHktPmFuYV9pbXBzZWxbaV0ubm1vcyA9IHJldDsKPiArCX0KPiArZW5kOgo+ICsJaWYgKHJldCA8 IDApIHsKPiArCQkvKgo+ICsJCSAqIElmIGFueSBvZiB0aGUgY2FsaWJyYXRpb24gdmFsdWVzIGlz IG1pc3NpbmcsIG9yIGlmIHRoZXJlCj4gKwkJICogaXMgbm8gY2FsaWJyYXRpb24gYXQgYWxsIGlu IHRoZSBlRnVzZXMsIGNvcHkgdGhlIGRlZmF1bHQKPiArCQkgKiBvbmUgZW50aXJlbHkgKGFzIHBh cnRpYWwgdmFsdWVzIHNoYWxsIG5vdCBiZSBtaXhlZCEpCj4gKwkJICovCj4gKwkJaWYgKHJldCA9 PSAtRU5PRU5UKSB7Cj4gKwkJCWRldl9pbmZvKGRldiwgIlVzaW5nIGNhbGlicmF0aW9uIGRlZmF1 bHQgdmFsdWVzXG4iKTsKPiArCQkJbXRrX2RwX3BoeV9nZXRfZGVmYXVsdF9jYWxfZGF0YShkcF9w aHkpOwo+ICsJCQlyZXR1cm4gMDsKPiArCQl9Cj4gKwkJcmV0dXJuIHJldDsKPiArCX07CgpbU2V2 ZXJpdHk6IEhpZ2hdCldpbGwgdGhlIGRyaXZlciBwcm9iZSBmYWlsIHVuY29uZGl0aW9uYWxseSBv biBwbGF0Zm9ybXMgd2l0aG91dCBOVk1FTSBzdXBwb3J0PwoKSWYgTlZNRU0gaXMgZGlzYWJsZWQs IG52bWVtX2NlbGxfcmVhZF91OCgpIHJldHVybnMgLUVPUE5PVFNVUFAuIFRoZSBzdHJpY3QKY2hl Y2sgZm9yIC1FTk9FTlQgbWVhbnMgdGhlIGRlZmF1bHQgZmFsbGJhY2sgaXMgc2tpcHBlZCBhbmQg dGhlIGRyaXZlciBwcm9iZQphYm9ydHMuCgo+ICsJZHBfcGh5LT5lZnVzZV9jYWxfcHJlc2VudCA9 IHRydWU7CgpbU2V2ZXJpdHk6IExvd10KSXMgdGhpcyBmbGFnIGFjdHVhbGx5IHVzZWQgYW55d2hl cmU/CgpUaGUgZWZ1c2VfY2FsX3ByZXNlbnQgZmllbGQgaXMgcG9wdWxhdGVkIGhlcmUgYnV0IGRv ZXMgbm90IHNlZW0gdG8gYmUKZXZhbHVhdGVkIGFueXdoZXJlIGVsc2UgaW4gdGhlIGNvZGUuCgo+ ICsKPiArCXJldHVybiAwOwo+ICt9ClsgLi4uIF0KPiBAQCAtNDM3LDYgKzY2MSw3IEBAIHN0YXRp YyBpbnQgbXRrX2RwX3BoeV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQo+ICAJ c3RydWN0IG10a19kcF9waHkgKmRwX3BoeTsKPiAgCXZvaWQgX19pb21lbSAqYmFzZTsKPiAgCXN0 cnVjdCBwaHkgKnBoeTsKPiArCWludCByZXQ7Cj4gIAo+ICAJZHBfcGh5ID0gZGV2bV9remFsbG9j KGRldiwgc2l6ZW9mKCpkcF9waHkpLCBHRlBfS0VSTkVMKTsKPiAgCWlmICghZHBfcGh5KQo+IEBA IC00NTgsNiArNjgzLDEwIEBAIHN0YXRpYyBpbnQgbXRrX2RwX3BoeV9wcm9iZShzdHJ1Y3QgcGxh dGZvcm1fZGV2aWNlICpwZGV2KQo+ICAKPiAgCWRwX3BoeS0+cGRhdGEgPSBkZXZpY2VfZ2V0X21h dGNoX2RhdGEoZGV2KTsKPiAgCj4gKwlyZXQgPSBtdGtfZHBfcGh5X2dldF9jYWxpYnJhdGlvbl9k YXRhKGRwX3BoeSk7Cj4gKwlpZiAocmV0KQo+ICsJCXJldHVybiByZXQ7Cj4gKwoKW1NldmVyaXR5 OiBIaWdoXQpEb2VzIHRoZSBsZWdhY3kgcHJvYmUgcGF0aCBhbHNvIG5lZWQgdG8gaW5pdGlhbGl6 ZSB0aGUgYW5hbG9nIGNhbGlicmF0aW9uCnBhcmFtZXRlcnM/CgpJZiBtdGtfZHBfcGh5X2xlZ2Fj eV9wcm9iZSgpIGJ5cGFzc2VzIGNhbGlicmF0aW9uIGRhdGEgbG9hZGluZywKZHBfcGh5LT5hbmFf aW1wc2VsIGlzIGxlZnQgZW50aXJlbHkgemVyb2VkLiBUaGVzZSB1bmluaXRpYWxpemVkIHplcm9l cyB3aWxsCnRoZW4gYmUgd3JpdHRlbiBkaXJlY3RseSB0byB0aGUgUEhZIHJlZ2lzdGVycywgd2hp Y2ggYnJlYWtzIHRyYW5zbWlzc2lvbiBvbgpsZWdhY3kgcGxhdGZvcm1zLgoKW1NldmVyaXR5OiBI aWdoXQpEb2VzIHRoZSBkcml2ZXIgcHJvcGVybHkgY2xlYW4gdXAgcnVudGltZSBQTSByZXNvdXJj ZXMgZHVyaW5nIHJlbW92YWw/CgpUaGUgcHJvYmUgZnVuY3Rpb24gYWNxdWlyZXMgUE0gcmVzb3Vy Y2VzIHdpdGhvdXQgdmVyaWZ5aW5nIHRoZSByZXN1bHQ6CgpwbV9ydW50aW1lX2VuYWJsZShkZXYp OwpwbV9ydW50aW1lX2dldF9zeW5jKGRldik7CgpCdXQgdGhlcmUgYXBwZWFycyB0byBiZSBubyBj b3JyZXNwb25kaW5nIC5yZW1vdmUgY2FsbGJhY2sgcHJvdmlkaW5nCnBtX3J1bnRpbWVfcHV0X3N5 bmMoKSwgcG1fcnVudGltZV9kaXNhYmxlKCksIG9yIHBoeV9yZW1vdmVfbG9va3VwKCkuCgpbU2V2 ZXJpdHk6IEhpZ2hdCkRvZXMgbXRrX2RwX3BoeV9wb3dlcl9vZmYoKSBhY2Nlc3MgdGhlIHdyb25n IG9mZnNldCBieSBpbmRleGluZyBhIGRpZ2l0YWwKcmVnaXN0ZXIgYXJyYXkgd2l0aCBhbiBhbmFs b2cgZW51bT8KCkxvb2tpbmcgYXQgbXRrX2RwX3BoeV9wb3dlcl9vZmYoKSBpbiBwaHktbXRrLWRw LmM6CgpzdGF0aWMgaW50IG10a19kcF9waHlfcG93ZXJfb2ZmKHN0cnVjdCBwaHkgKnBoeSkKewog ICAgICAgIC4uLgogICAgICAgIGNvbnN0IHU4ICpyZWdzID0gcGRhdGEtPnJlZ3NfZGlnX2dsYjsK ICAgICAgICAuLi4KICAgICAgICByZXQgPSByZWdtYXBfc2V0X2JpdHMoZHBfcGh5LT5yZWdtYXAs CiAgICAgICAgICAgICAgICAgICAgICAgIHBkYXRhLT5vZmZfYW5hX2dsYiArIHJlZ3NbRFBfUEhZ QV9HTEJfRk9SQ0VfQ1RSTF8xXSwKClVzaW5nIERQX1BIWUFfR0xCX0ZPUkNFX0NUUkxfMSAod2hp Y2ggaXMgYW4gYW5hbG9nIGVudW0pIHRvIGluZGV4IHJlZ3MKKHdoaWNoIHBvaW50cyB0byByZWdz X2RpZ19nbGIpIHdyaXRlcyB0byB0aGUgd3Jvbmcgb2Zmc2V0cyBkdXJpbmcgcG93ZXIgb2ZmLgoK LS0gClNhc2hpa28gQUkgcmV2aWV3IMK3IGh0dHBzOi8vc2FzaGlrby5kZXYvIy9wYXRjaHNldC8y MDI2MDcwMTEyMjAwOC4xOTUwOS0xLWFuZ2Vsb2dpb2FjY2hpbm8uZGVscmVnbm9AY29sbGFib3Jh LmNvbT9wYXJ0PTgKCi0tIApsaW51eC1waHkgbWFpbGluZyBsaXN0CmxpbnV4LXBoeUBsaXN0cy5p bmZyYWRlYWQub3JnCmh0dHBzOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZv L2xpbnV4LXBoeQo=