From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (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 4AF6A48166B for ; Wed, 1 Jul 2026 12:50:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782910220; cv=none; b=I4y6LH/KIV02hA6TD9Ig7QxdZDTkI/o01f8TI2dqu/9ghUTwh7GSszZQn4qL7aELdrlPLc4x1+L+o7zlo7ztvnVH8tnXiNHCXunUA/4nTFMsE1hYk8Pw9n0+4Cj8i5uP2b8ijKfEY8eZSdHksVqErzRhgv3AokxHmzGtM5mY/zM= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782910220; c=relaxed/simple; bh=w4DvYxS6HnRx4Jq/p9NKCGNXiZSMIzL68Loqqm5xo+E=; h=From:Subject:To:Cc:In-Reply-To:References:Content-Type:Date: Message-Id; b=k/ip3BSd3oKC22r7+dgPcTtacE5rpLDrl5bv0btF02F2mo0gbZZbCAhvRYTIhWeHoV3oOPgKzgpbuL5PLhnpbWGVFp/7gEQwTXZ48PouQ9r6HKxmjx2TSORL/DUxg/y7gC0FEn+HQyL0q/24b5c7nSPT1Y0ewjPKsdGm2pSS3Gw= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=kp1AG33T; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="kp1AG33T" Received: by smtp.kernel.org (Postfix) with ESMTPSA id E27181F00A3A; Wed, 1 Jul 2026 12:50:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1782910219; bh=ogQceqQ808YsZTT5xDvMfw/Hxp/6gRHLqBYleisECB4=; h=From:Subject:Reply-To:To:Cc:In-Reply-To:References:Date; b=kp1AG33TiMj1MOOaPTrHbySOB1SFehS0ILSJ7TceQ+aea/ThrhP+ELIB8SSAD7/dG yxiWNflGVKZWYwm4Mza9zuHdhXkhtU0q+Ky3GcmNfhHgIEEx8SH96dIxnKtPr2XJAx c735uhAP+PJ2ir/8CB5/FLIsd/fub+Q1Xm1OiFFQFiLimb13hBddXFN09jCFqXdbnt hAHFoXMfqcrtPo5ayIIeYQUvTQsa/ELKgdvk5t10Pw0j/gcBfIHvaJjItJL9Xkmm5X QcM9uwtwEYwIniG08wz32riltIH8AmYOo99vcYL/OrxG2cQiw1PP36fHZa7LdmvvSR xUQChCvVXRiHA== From: sashiko-bot@kernel.org Subject: Re: [PATCH 09/12] phy: phy-mtk-dp: Rewrite and document default driving param macros Reply-To: sashiko-reviews@lists.linux.dev To: "AngeloGioacchino Del Regno" Cc: robh@kernel.org, dri-devel@lists.freedesktop.org, vkoul@kernel.org, neil.armstrong@linaro.org, conor+dt@kernel.org, linux-phy@lists.infradead.org, devicetree@vger.kernel.org, olteanv@gmail.com In-Reply-To: <20260701122008.19509-10-angelogioacchino.delregno@collabora.com> References: <20260701122008.19509-1-angelogioacchino.delregno@collabora.com> <20260701122008.19509-10-angelogioacchino.delregno@collabora.com> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Date: Wed, 01 Jul 2026 12:50:15 +0000 Message-Id: <20260701125017.E27181F00A3A@smtp.kernel.org> Precedence: bulk X-Mailing-List: devicetree@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Thank you for your contribution! Sashiko AI review found 4 potential issue(= s) to consider: - [High] The refactoring introduces incorrect integer values for two Displa= yPort PHY driving parameters, silently altering the underlying hardware con= figuration. - [High] Integer underflow and undefined behavior in mtk_dp_phy_disable_all= _lanes when no lanes are enabled. - [High] Flawed PM runtime initialization, race condition, and unhandled er= rors in probe. - [Medium] Incorrect endianness conversion by pointer aliasing a u16 as a u= 8*. -- commit 3ae397642076d659c70475bdbefbc3286e0e7c1f Author: AngeloGioacchino Del Regno Subject: phy: phy-mtk-dp: Rewrite and document default driving param macros This patch uses FIELD_PREP_CONST and adds definitions and macros to build the default driving parameters for the PHY. It also adds comments explaining what they are supposed to set in the PHY. > diff --git a/drivers/phy/mediatek/phy-mtk-dp.c b/drivers/phy/mediatek/phy= -mtk-dp.c > index d7024a1443358..1d73a622ef322 100644 > --- a/drivers/phy/mediatek/phy-mtk-dp.c > +++ b/drivers/phy/mediatek/phy-mtk-dp.c [ ... ] > +/* MT8195: Logic State Change Point (LC TX C) */ > +#define MT8195_DRIVING_PARAM_3_DEFAULT BUILD_DRIVING_PARAM_0( 16, 20, 24= , 32) > +#define MT8195_DRIVING_PARAM_4_DEFAULT BUILD_DRIVING_PARAM_12(24, 30, 60= , 32) [Severity: High] Does this unintentionally change the default for SW1_PRE2? The conversion to macros incorrectly alters the sw1_pre2 value. The original macro XTP_LN_TX_LCTXC0_SW1_PRE2_DEFAULT was (BIT(18) | BIT(21)), which evaluates to 36 (0x24) when shifted. This macro now sets it to 60 (0x3c). > +#define MT8195_DRIVING_PARAM_5_DEFAULT BUILD_DRIVING_PARAM_23(8, 48) [Severity: High] Is there a similar issue with the default for SW2_PRE1? The original value was 40 (0x28), but this is now passing 8 (0x08), which drops BIT(5). These altered driving parameters can degrade signal integrity and cause connection instability. [ ... ] > +static int mtk_dp_phy_disable_all_lanes(struct mtk_dp_phy *dp_phy) > +{ > + const struct mtk_dp_phy_pdata *pdata =3D dp_phy->pdata; > + const u8 *regs =3D pdata->regs_dig_glb; > + int ret; > + u32 val; > + > + ret =3D regmap_read(dp_phy->regmap, pdata->off_dig_glb + regs[DP_PHYD_T= X_CTL_0], &val); > + if (ret) > + return ret; > + > + /* Get mask of currently enabled lane */ > + val =3D FIELD_GET(PHYD_TX_LN_EN, val); > + > + /* Disable all lanes (needs to be done one by one, from last to first) = */ > + do { > + u32 lane_num =3D fls(val) - 1; > + val &=3D ~BIT(lane_num); > + > + ret =3D regmap_clear_bits(dp_phy->regmap, > + pdata->off_dig_glb + regs[DP_PHYD_TX_CTL_0], > + FIELD_PREP(PHYD_TX_LN_EN, lane_num)); > + if (ret) > + return ret; > + } while (val); [Severity: High] Can this do-while loop execute with val initially at 0? If the PHY is already fully disabled when this is called, val will be 0. The loop blindly executes once, fls(0) returns 0, and lane_num underflows to 0xffffffff. Using ~BIT(0xffffffff) invokes undefined behavior, and passing 0xffffffff to FIELD_PREP() extracts unpredictable bits, causing a spurious out-of-boun= ds register write when clearing the PHY control registers. > + > + return 0; > +} [ ... ] > +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); [Severity: Medium] Will this lead to an endianness violation on Big Endian platforms? Casting a u16 buffer pointer to (u8 *) will cause the single byte to be written into the most significant byte of buf instead of the least significant byte on Big Endian architectures. For instance, reading 0x0F would result in buf holding 0x0F00 (3840), which would falsely trigger the subsequent if (buf > max_val) validation check. > + if (ret) > + ret =3D nvmem_cell_read_u16(dev, name, &buf); [ ... ] > +static int mtk_dp_phy_probe(struct platform_device *pdev) > +{ [ ... ] > + phy_set_drvdata(phy, dp_phy); > + > + provider =3D devm_of_phy_provider_register(dev, of_phy_simple_xlate); > + if (IS_ERR(provider)) > + return PTR_ERR(provider); [Severity: High] Could registering the provider before enabling PM runtime cause a race cond= ition? Exposing the PHY to consumers here means a consumer could claim the PHY and attempt to power it on before pm_runtime_enable() is called below. This would return -EACCES and break the consumer initialization. > + > + pm_runtime_enable(dev); > + pm_runtime_get_sync(dev); [Severity: High] Should the return value of pm_runtime_get_sync(dev) be checked? Ignoring the return value means the probe silently succeeds even if the hardware cannot be powered. Additionally, this driver lacks a .remove callback. Since pm_runtime_get_sync() increases the usage counter without it ever being released, and pm_runtime_disable() is never called, unloading the module permanently leaks the PM reference and breaks PM runtime for this device. > + > + return 0; > +} --=20 Sashiko AI review =C2=B7 https://sashiko.dev/#/patchset/20260701122008.1950= 9-1-angelogioacchino.delregno@collabora.com?part=3D9 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 B7CD6C43602 for ; Wed, 1 Jul 2026 12:50:20 +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=nofstU8V/1H8UpYrYFDn5cJt0XumJv3NsEVbnNiWeTU=; b=Ezf3p1S5wssK8H AgD5Of9M5NDpYK7hYXQUAPqdZiCY51Grgn/2GBBPn2ZW8NFoYQU6H04We/RqrzgN636nV+DzXfyfS uUhy6uEc2QBa88HhcxtPjChVRkO3vUBlsuykQg4so3MRAkznEnH9xj9XtixDkL5klk3hzz2x4zftm 2JCXKiFFbp8Jbmgkc+aTglSj6qGPBY5p15pZBoUGf8W8IRk4HC/LVl+E0OXNQY2SDmfPUQfcHB+Tc jcEwY3FoqSWT+Em6c8gvNCCVNEBn3a7AhshwEi71jB5WIXwGTizVMR4+Knfp8kpWFLSTWIT77OGHN i3vw8ii6Bg+RzWrjdSlA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.99.1 #2 (Red Hat Linux)) id 1weuOS-000000022wG-2AnC; Wed, 01 Jul 2026 12:50:20 +0000 Received: from sea.source.kernel.org ([172.234.252.31]) by bombadil.infradead.org with esmtps (Exim 4.99.1 #2 (Red Hat Linux)) id 1weuOR-000000022vw-1cSx for linux-phy@lists.infradead.org; Wed, 01 Jul 2026 12:50:19 +0000 Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) by sea.source.kernel.org (Postfix) with ESMTP id 2A0BF43CD8; Wed, 1 Jul 2026 12:50:19 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id E27181F00A3A; Wed, 1 Jul 2026 12:50:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1782910219; bh=ogQceqQ808YsZTT5xDvMfw/Hxp/6gRHLqBYleisECB4=; h=From:Subject:Reply-To:To:Cc:In-Reply-To:References:Date; b=kp1AG33TiMj1MOOaPTrHbySOB1SFehS0ILSJ7TceQ+aea/ThrhP+ELIB8SSAD7/dG yxiWNflGVKZWYwm4Mza9zuHdhXkhtU0q+Ky3GcmNfhHgIEEx8SH96dIxnKtPr2XJAx c735uhAP+PJ2ir/8CB5/FLIsd/fub+Q1Xm1OiFFQFiLimb13hBddXFN09jCFqXdbnt hAHFoXMfqcrtPo5ayIIeYQUvTQsa/ELKgdvk5t10Pw0j/gcBfIHvaJjItJL9Xkmm5X QcM9uwtwEYwIniG08wz32riltIH8AmYOo99vcYL/OrxG2cQiw1PP36fHZa7LdmvvSR xUQChCvVXRiHA== From: sashiko-bot@kernel.org Subject: Re: [PATCH 09/12] phy: phy-mtk-dp: Rewrite and document default driving param macros To: "AngeloGioacchino Del Regno" Cc: robh@kernel.org, dri-devel@lists.freedesktop.org, vkoul@kernel.org, neil.armstrong@linaro.org, conor+dt@kernel.org, linux-phy@lists.infradead.org, devicetree@vger.kernel.org, olteanv@gmail.com In-Reply-To: <20260701122008.19509-10-angelogioacchino.delregno@collabora.com> References: <20260701122008.19509-1-angelogioacchino.delregno@collabora.com> <20260701122008.19509-10-angelogioacchino.delregno@collabora.com> Date: Wed, 01 Jul 2026 12:50:15 +0000 Message-Id: <20260701125017.E27181F00A3A@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 NCBwb3RlbnRpYWwgaXNzdWUocykgdG8gY29uc2lkZXI6Ci0gW0hpZ2hdIFRoZSByZWZhY3Rvcmlu ZyBpbnRyb2R1Y2VzIGluY29ycmVjdCBpbnRlZ2VyIHZhbHVlcyBmb3IgdHdvIERpc3BsYXlQb3J0 IFBIWSBkcml2aW5nIHBhcmFtZXRlcnMsIHNpbGVudGx5IGFsdGVyaW5nIHRoZSB1bmRlcmx5aW5n IGhhcmR3YXJlIGNvbmZpZ3VyYXRpb24uCi0gW0hpZ2hdIEludGVnZXIgdW5kZXJmbG93IGFuZCB1 bmRlZmluZWQgYmVoYXZpb3IgaW4gbXRrX2RwX3BoeV9kaXNhYmxlX2FsbF9sYW5lcyB3aGVuIG5v IGxhbmVzIGFyZSBlbmFibGVkLgotIFtIaWdoXSBGbGF3ZWQgUE0gcnVudGltZSBpbml0aWFsaXph dGlvbiwgcmFjZSBjb25kaXRpb24sIGFuZCB1bmhhbmRsZWQgZXJyb3JzIGluIHByb2JlLgotIFtN ZWRpdW1dIEluY29ycmVjdCBlbmRpYW5uZXNzIGNvbnZlcnNpb24gYnkgcG9pbnRlciBhbGlhc2lu ZyBhIHUxNiBhcyBhIHU4Ki4KLS0KCmNvbW1pdCAzYWUzOTc2NDIwNzZkNjU5YzcwNDc1YmRiZWZi YzMyODZlMGU3YzFmCkF1dGhvcjogQW5nZWxvR2lvYWNjaGlubyBEZWwgUmVnbm8gPGFuZ2Vsb2dp b2FjY2hpbm8uZGVscmVnbm9AY29sbGFib3JhLmNvbT4KU3ViamVjdDogcGh5OiBwaHktbXRrLWRw OiBSZXdyaXRlIGFuZCBkb2N1bWVudCBkZWZhdWx0IGRyaXZpbmcgcGFyYW0gbWFjcm9zCgpUaGlz IHBhdGNoIHVzZXMgRklFTERfUFJFUF9DT05TVCBhbmQgYWRkcyBkZWZpbml0aW9ucyBhbmQgbWFj cm9zIHRvIGJ1aWxkCnRoZSBkZWZhdWx0IGRyaXZpbmcgcGFyYW1ldGVycyBmb3IgdGhlIFBIWS4g SXQgYWxzbyBhZGRzIGNvbW1lbnRzIGV4cGxhaW5pbmcKd2hhdCB0aGV5IGFyZSBzdXBwb3NlZCB0 byBzZXQgaW4gdGhlIFBIWS4KCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L21lZGlhdGVrL3Bo eS1tdGstZHAuYyBiL2RyaXZlcnMvcGh5L21lZGlhdGVrL3BoeS1tdGstZHAuYwo+IGluZGV4IGQ3 MDI0YTE0NDMzNTguLjFkNzNhNjIyZWYzMjIgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9waHkvbWVk aWF0ZWsvcGh5LW10ay1kcC5jCj4gKysrIGIvZHJpdmVycy9waHkvbWVkaWF0ZWsvcGh5LW10ay1k cC5jClsgLi4uIF0KPiArLyogTVQ4MTk1OiBMb2dpYyBTdGF0ZSBDaGFuZ2UgUG9pbnQgKExDIFRY IEMpICovCj4gKyNkZWZpbmUgTVQ4MTk1X0RSSVZJTkdfUEFSQU1fM19ERUZBVUxUCUJVSUxEX0RS SVZJTkdfUEFSQU1fMCggMTYsIDIwLCAyNCwgMzIpCj4gKyNkZWZpbmUgTVQ4MTk1X0RSSVZJTkdf UEFSQU1fNF9ERUZBVUxUCUJVSUxEX0RSSVZJTkdfUEFSQU1fMTIoMjQsIDMwLCA2MCwgMzIpCgpb U2V2ZXJpdHk6IEhpZ2hdCkRvZXMgdGhpcyB1bmludGVudGlvbmFsbHkgY2hhbmdlIHRoZSBkZWZh dWx0IGZvciBTVzFfUFJFMj8KClRoZSBjb252ZXJzaW9uIHRvIG1hY3JvcyBpbmNvcnJlY3RseSBh bHRlcnMgdGhlIHN3MV9wcmUyIHZhbHVlLiBUaGUKb3JpZ2luYWwgbWFjcm8gWFRQX0xOX1RYX0xD VFhDMF9TVzFfUFJFMl9ERUZBVUxUIHdhcyAoQklUKDE4KSB8IEJJVCgyMSkpLAp3aGljaCBldmFs dWF0ZXMgdG8gMzYgKDB4MjQpIHdoZW4gc2hpZnRlZC4gVGhpcyBtYWNybyBub3cgc2V0cyBpdCB0 bwo2MCAoMHgzYykuCgo+ICsjZGVmaW5lIE1UODE5NV9EUklWSU5HX1BBUkFNXzVfREVGQVVMVAlC VUlMRF9EUklWSU5HX1BBUkFNXzIzKDgsIDQ4KQoKW1NldmVyaXR5OiBIaWdoXQpJcyB0aGVyZSBh IHNpbWlsYXIgaXNzdWUgd2l0aCB0aGUgZGVmYXVsdCBmb3IgU1cyX1BSRTE/CgpUaGUgb3JpZ2lu YWwgdmFsdWUgd2FzIDQwICgweDI4KSwgYnV0IHRoaXMgaXMgbm93IHBhc3NpbmcgOCAoMHgwOCks IHdoaWNoCmRyb3BzIEJJVCg1KS4gVGhlc2UgYWx0ZXJlZCBkcml2aW5nIHBhcmFtZXRlcnMgY2Fu IGRlZ3JhZGUgc2lnbmFsIGludGVncml0eQphbmQgY2F1c2UgY29ubmVjdGlvbiBpbnN0YWJpbGl0 eS4KClsgLi4uIF0KPiArc3RhdGljIGludCBtdGtfZHBfcGh5X2Rpc2FibGVfYWxsX2xhbmVzKHN0 cnVjdCBtdGtfZHBfcGh5ICpkcF9waHkpCj4gK3sKPiArCWNvbnN0IHN0cnVjdCBtdGtfZHBfcGh5 X3BkYXRhICpwZGF0YSA9IGRwX3BoeS0+cGRhdGE7Cj4gKwljb25zdCB1OCAqcmVncyA9IHBkYXRh LT5yZWdzX2RpZ19nbGI7Cj4gKwlpbnQgcmV0Owo+ICsJdTMyIHZhbDsKPiArCj4gKwlyZXQgPSBy ZWdtYXBfcmVhZChkcF9waHktPnJlZ21hcCwgcGRhdGEtPm9mZl9kaWdfZ2xiICsgcmVnc1tEUF9Q SFlEX1RYX0NUTF8wXSwgJnZhbCk7Cj4gKwlpZiAocmV0KQo+ICsJCXJldHVybiByZXQ7Cj4gKwo+ ICsJLyogR2V0IG1hc2sgb2YgY3VycmVudGx5IGVuYWJsZWQgbGFuZSAqLwo+ICsJdmFsID0gRklF TERfR0VUKFBIWURfVFhfTE5fRU4sIHZhbCk7Cj4gKwo+ICsJLyogRGlzYWJsZSBhbGwgbGFuZXMg KG5lZWRzIHRvIGJlIGRvbmUgb25lIGJ5IG9uZSwgZnJvbSBsYXN0IHRvIGZpcnN0KSAqLwo+ICsJ ZG8gewo+ICsJCXUzMiBsYW5lX251bSA9IGZscyh2YWwpIC0gMTsKPiArCQl2YWwgJj0gfkJJVChs YW5lX251bSk7Cj4gKwo+ICsJCXJldCA9IHJlZ21hcF9jbGVhcl9iaXRzKGRwX3BoeS0+cmVnbWFw LAo+ICsJCQkJCXBkYXRhLT5vZmZfZGlnX2dsYiArIHJlZ3NbRFBfUEhZRF9UWF9DVExfMF0sCj4g KwkJCQkJRklFTERfUFJFUChQSFlEX1RYX0xOX0VOLCBsYW5lX251bSkpOwo+ICsJCWlmIChyZXQp Cj4gKwkJCXJldHVybiByZXQ7Cj4gKwl9IHdoaWxlICh2YWwpOwoKW1NldmVyaXR5OiBIaWdoXQpD YW4gdGhpcyBkby13aGlsZSBsb29wIGV4ZWN1dGUgd2l0aCB2YWwgaW5pdGlhbGx5IGF0IDA/CgpJ ZiB0aGUgUEhZIGlzIGFscmVhZHkgZnVsbHkgZGlzYWJsZWQgd2hlbiB0aGlzIGlzIGNhbGxlZCwg dmFsIHdpbGwgYmUgMC4KVGhlIGxvb3AgYmxpbmRseSBleGVjdXRlcyBvbmNlLCBmbHMoMCkgcmV0 dXJucyAwLCBhbmQgbGFuZV9udW0gdW5kZXJmbG93cwp0byAweGZmZmZmZmZmLgoKVXNpbmcgfkJJ VCgweGZmZmZmZmZmKSBpbnZva2VzIHVuZGVmaW5lZCBiZWhhdmlvciwgYW5kIHBhc3NpbmcgMHhm ZmZmZmZmZgp0byBGSUVMRF9QUkVQKCkgZXh0cmFjdHMgdW5wcmVkaWN0YWJsZSBiaXRzLCBjYXVz aW5nIGEgc3B1cmlvdXMgb3V0LW9mLWJvdW5kcwpyZWdpc3RlciB3cml0ZSB3aGVuIGNsZWFyaW5n IHRoZSBQSFkgY29udHJvbCByZWdpc3RlcnMuCgo+ICsKPiArCXJldHVybiAwOwo+ICt9ClsgLi4u IF0KPiArc3RhdGljIGludCBtdGtfZHBfcGh5X2dldF9vbmVfY2FsX3BhcmEoc3RydWN0IGRldmlj ZSAqZGV2LCBjb25zdCBjaGFyICpuYW1lLCB1OCBtYXhfdmFsKQo+ICt7Cj4gKwl1MTYgYnVmID0g MDsKPiArCWludCByZXQ7Cj4gKwo+ICsJLyoKPiArCSAqIEFsbCBvZiB0aGUgY2FsaWJyYXRpb25z IGFyZSBhbHdheXMgbWF4IDggYml0cyBsb25nLCBidXQgc29tZSBtYXkKPiArCSAqIGJlIHNwbGl0 IGJldHdlZW4gdHdvIGRpZmZlcmVudCA4LWJpdHMgY2VsbHM6IGhhbmRsZSB0aGlzIGNvcm5lcgo+ ICsJICogY2FzZSBieSByZXRyeWluZyByZWFkaW5nIGFzIHUxNi4KPiArCSAqLwo+ICsJcmV0ID0g bnZtZW1fY2VsbF9yZWFkX3U4KGRldiwgbmFtZSwgKHU4ICopJmJ1Zik7CgpbU2V2ZXJpdHk6IE1l ZGl1bV0KV2lsbCB0aGlzIGxlYWQgdG8gYW4gZW5kaWFubmVzcyB2aW9sYXRpb24gb24gQmlnIEVu ZGlhbiBwbGF0Zm9ybXM/CgpDYXN0aW5nIGEgdTE2IGJ1ZmZlciBwb2ludGVyIHRvICh1OCAqKSB3 aWxsIGNhdXNlIHRoZSBzaW5nbGUgYnl0ZSB0byBiZQp3cml0dGVuIGludG8gdGhlIG1vc3Qgc2ln bmlmaWNhbnQgYnl0ZSBvZiBidWYgaW5zdGVhZCBvZiB0aGUgbGVhc3QKc2lnbmlmaWNhbnQgYnl0 ZSBvbiBCaWcgRW5kaWFuIGFyY2hpdGVjdHVyZXMuCgpGb3IgaW5zdGFuY2UsIHJlYWRpbmcgMHgw RiB3b3VsZCByZXN1bHQgaW4gYnVmIGhvbGRpbmcgMHgwRjAwICgzODQwKSwgd2hpY2gKd291bGQg ZmFsc2VseSB0cmlnZ2VyIHRoZSBzdWJzZXF1ZW50IGlmIChidWYgPiBtYXhfdmFsKSB2YWxpZGF0 aW9uIGNoZWNrLgoKPiArCWlmIChyZXQpCj4gKwkJcmV0ID0gbnZtZW1fY2VsbF9yZWFkX3UxNihk ZXYsIG5hbWUsICZidWYpOwpbIC4uLiBdCj4gK3N0YXRpYyBpbnQgbXRrX2RwX3BoeV9wcm9iZShz dHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQo+ICt7ClsgLi4uIF0KPiArCXBoeV9zZXRfZHJ2 ZGF0YShwaHksIGRwX3BoeSk7Cj4gKwo+ICsJcHJvdmlkZXIgPSBkZXZtX29mX3BoeV9wcm92aWRl cl9yZWdpc3RlcihkZXYsIG9mX3BoeV9zaW1wbGVfeGxhdGUpOwo+ICsJaWYgKElTX0VSUihwcm92 aWRlcikpCj4gKwkJcmV0dXJuIFBUUl9FUlIocHJvdmlkZXIpOwoKW1NldmVyaXR5OiBIaWdoXQpD b3VsZCByZWdpc3RlcmluZyB0aGUgcHJvdmlkZXIgYmVmb3JlIGVuYWJsaW5nIFBNIHJ1bnRpbWUg Y2F1c2UgYSByYWNlIGNvbmRpdGlvbj8KCkV4cG9zaW5nIHRoZSBQSFkgdG8gY29uc3VtZXJzIGhl cmUgbWVhbnMgYSBjb25zdW1lciBjb3VsZCBjbGFpbSB0aGUgUEhZIGFuZAphdHRlbXB0IHRvIHBv d2VyIGl0IG9uIGJlZm9yZSBwbV9ydW50aW1lX2VuYWJsZSgpIGlzIGNhbGxlZCBiZWxvdy4gVGhp cwp3b3VsZCByZXR1cm4gLUVBQ0NFUyBhbmQgYnJlYWsgdGhlIGNvbnN1bWVyIGluaXRpYWxpemF0 aW9uLgoKPiArCj4gKwlwbV9ydW50aW1lX2VuYWJsZShkZXYpOwo+ICsJcG1fcnVudGltZV9nZXRf c3luYyhkZXYpOwoKW1NldmVyaXR5OiBIaWdoXQpTaG91bGQgdGhlIHJldHVybiB2YWx1ZSBvZiBw bV9ydW50aW1lX2dldF9zeW5jKGRldikgYmUgY2hlY2tlZD8KCklnbm9yaW5nIHRoZSByZXR1cm4g dmFsdWUgbWVhbnMgdGhlIHByb2JlIHNpbGVudGx5IHN1Y2NlZWRzIGV2ZW4gaWYgdGhlCmhhcmR3 YXJlIGNhbm5vdCBiZSBwb3dlcmVkLgoKQWRkaXRpb25hbGx5LCB0aGlzIGRyaXZlciBsYWNrcyBh IC5yZW1vdmUgY2FsbGJhY2suIFNpbmNlCnBtX3J1bnRpbWVfZ2V0X3N5bmMoKSBpbmNyZWFzZXMg dGhlIHVzYWdlIGNvdW50ZXIgd2l0aG91dCBpdCBldmVyIGJlaW5nCnJlbGVhc2VkLCBhbmQgcG1f cnVudGltZV9kaXNhYmxlKCkgaXMgbmV2ZXIgY2FsbGVkLCB1bmxvYWRpbmcgdGhlIG1vZHVsZQpw ZXJtYW5lbnRseSBsZWFrcyB0aGUgUE0gcmVmZXJlbmNlIGFuZCBicmVha3MgUE0gcnVudGltZSBm b3IgdGhpcyBkZXZpY2UuCgo+ICsKPiArCXJldHVybiAwOwo+ICt9CgotLSAKU2FzaGlrbyBBSSBy ZXZpZXcgwrcgaHR0cHM6Ly9zYXNoaWtvLmRldi8jL3BhdGNoc2V0LzIwMjYwNzAxMTIyMDA4LjE5 NTA5LTEtYW5nZWxvZ2lvYWNjaGluby5kZWxyZWdub0Bjb2xsYWJvcmEuY29tP3BhcnQ9OQoKLS0g CmxpbnV4LXBoeSBtYWlsaW5nIGxpc3QKbGludXgtcGh5QGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0 cHM6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtcGh5Cg==