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 DE97C3385B9 for ; Thu, 16 Jul 2026 15:24:42 +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=1784215485; cv=none; b=tqOX1DWixnXcIQ1JjVzOlJY0B0h+PVshPtMU0UfxaJNt2RIyHkipleZajpB43lqmm3644SUszYkR0Ehd0zDPXGnOeKSLR4msNQ8NQ/wYipKVbrEOZ4IHGpW7RMFUPJ/57GbTG8MrVy59u/toYu5dKGoejOUktTA9ERxJeBcQovE= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784215485; c=relaxed/simple; bh=UQeLihb1h++U4w2pnSJPMjEjKX2YkiH+AwCMPslTrl4=; h=From:Subject:To:Cc:In-Reply-To:References:Content-Type:Date: Message-Id; b=u+/ATGBcwqQwCsO5wii1L0wrH1rJ91zqonUR2aeuiPSwt7f2IYCLYYKJBnXUNEETagLQotZn6oHOlod/Ae1laEayZ6T+nN7jLTwgv72oCIeANzOdpNby6/nKFGfAXdShxxiufY6WUL6hyQqBKy0VghulBdIZ3bEcPALl+UIubkM= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=CaV5Xx/D; 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="CaV5Xx/D" Received: by smtp.kernel.org (Postfix) with ESMTPSA id EBAF61F000E9; Thu, 16 Jul 2026 15:24:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1784215482; bh=U2trcA6L3CTjGQWJ6mgCr1miHu8mbNzhU2EhWWWwyOM=; h=From:Subject:Reply-To:To:Cc:In-Reply-To:References:Date; b=CaV5Xx/DbxEqC99W7S7ZMQWY1N8WUdnPWrig+3PtktIfO6Fg65alouQTPIftCxc7r vGezfBHXS65JPbzK9AWjOTuipQ87aPeRqMbVVEArQu17T4qJlXdd9EpUcWaAfMlS+s T94bUNB7Jax280wTeOVqiekmO52OD5dKZhqrglPYThc2Z+u6aMnglcHT0208XM0fFl e3AhSZySLdo/a4XPDNz7g23vFjsYTt9J6m9vRj8N1w4IQcSs3M1yQsA3ThhT1KYo7k ZvJMOulfrp8g4Z3U98aKUkRPoDoIuhQnEnFbAjP1X8hAF9fQThQgz8LG7CbhkoAoqr GaRHY2jf9AqCw== From: sashiko-bot@kernel.org Subject: Re: [PATCH 2/2] phy: mediatek: Add support for PCI-Express Gen4 S-PHY Reply-To: sashiko-reviews@lists.linux.dev To: "AngeloGioacchino Del Regno" Cc: devicetree@vger.kernel.org, olteanv@gmail.com, linux-phy@lists.infradead.org, neil.armstrong@linaro.org, conor+dt@kernel.org, robh@kernel.org, vkoul@kernel.org In-Reply-To: <20260716151333.77254-3-angelogioacchino.delregno@collabora.com> References: <20260716151333.77254-1-angelogioacchino.delregno@collabora.com> <20260716151333.77254-3-angelogioacchino.delregno@collabora.com> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Date: Thu, 16 Jul 2026 15:24:41 +0000 Message-Id: <20260716152441.EBAF61F000E9@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 7 potential issue(= s) to consider: - [High] The 4-bit bitfields in `struct mtk_pcie_sphy_imp_sel` will silentl= y truncate 5-bit TX impedance calibration values. - [High] Probe fails when CONFIG_NVMEM is disabled due to unhandled -EOPNOT= SUPP. - [Medium] Unconditional read of lane 1 calibration data needlessly disable= s calibration entirely for 1-lane PHYs. - [Medium] Valid calibration data containing the value '0' incorrectly abor= ts the entire calibration process. - [Medium] PHY provider is registered before Runtime PM is enabled, creatin= g a probe race condition. - [Low] Expected missing calibration data and probe deferrals trigger uncon= ditional dev_err() logs. - [Low] Missing `#include ` while using `devm_pm_runtim= e_enable()`. -- --- Patch [2]: [PATCH 2/2] phy: mediatek: Add support for PCI-Express Gen4 = S-PHY --- commit 7cbdba90e32bbdc889bb04306231fd5de6141303 Author: AngeloGioacchino Del Regno phy: mediatek: Add support for PCI-Express Gen4 S-PHY Add support for the PCI-Express Gen4 S-PHY found in the latest MediaTek SoCs, including MT8196, MT8894 and similar. > diff --git a/drivers/phy/mediatek/phy-mtk-pcie-sphy.c b/drivers/phy/media= tek/phy-mtk-pcie-sphy.c > new file mode 100644 > --- /dev/null > +++ b/drivers/phy/mediatek/phy-mtk-pcie-sphy.c > @@ -0,0 +1,560 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* > + * Copyright (c) 2022 MediaTek Inc. > + * Copyright (c) 2026 Collabora Ltd. > + * AngeloGioacchino Del Regno > + */ > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include [Severity: Low] Does this need linux/pm_runtime.h included since devm_pm_runtime_enable() is used later in the file? [ ... ] > +/** > + * struct mtk_pcie_sphy_imp_sel - Impedance Selection parameters > + * @pmos: Impedance selection for P-Channel MOSFET > + * @nmos: Impedance selection for N-Channel MOSFET > + */ > +struct mtk_pcie_sphy_imp_sel { > + u8 pmos : 4; > + u8 nmos : 4; > +}; [Severity: High] Can this truncate calibration values? The eFuse data read for tx-lanes-pmos and tx-lanes-nmos uses FIELD_MAX(RG_XTP_LN_TX_IMPSEL_PMOS), which is GENMASK(4, 0), allowing 5-bit values up to 31. Will values greater than 15 be silently truncated here? [ ... ] > +static int mtk_pcie_sphy_get_one_cal_para(struct device *dev, const char= *name, u8 max_val) > +{ > + u16 buf; > + u8 tmp; > + 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, &tmp); > + if (ret =3D=3D 0) > + buf =3D tmp; > + else > + ret =3D nvmem_cell_read_u16(dev, name, &buf); > + > + if (ret) { > + dev_err(dev, "Cannot get calibration data for %s: %d\n", name, ret); > + return ret; > + }; [Severity: Low] Does this unconditionally log an error for expected missing cells (-ENOENT) or during probe deferral (-EPROBE_DEFER)? > + > + if (buf =3D=3D 0) { > + dev_warn(dev, "No calibration for %s. Using defaults\n", name); > + return -ENOENT; > + } [Severity: Medium] Is 0 an invalid calibration value? Later code checks if the calibration version is <=3D 4, which implies versi= on 0 could exist. If a valid cell contains 0, will this mistakenly abort the entire calibration process? [ ... ] > +static int mtk_pcie_sphy_get_calibration_data(struct mtk_pcie_sphy *pcie= _sphy) > +{ [ ... ] > + ret =3D mtk_pcie_sphy_get_one_cal_para(dev, "tx-ln0-rswn", > + FIELD_MAX(RG_XTP_LN_TX_RSWN_IMPSEL)); > + if (ret < 0) > + goto end; > + cal->tx_rswn_impsel[0] =3D ret; > + > + ret =3D mtk_pcie_sphy_get_one_cal_para(dev, "tx-ln1-rswn", > + FIELD_MAX(RG_XTP_LN_TX_RSWN_IMPSEL)); > + if (ret < 0) > + goto end; > + cal->tx_rswn_impsel[1] =3D ret; [Severity: Medium] Will this break calibration on 1-lane PHYs? If num_lanes is 1, the device tree might naturally omit lane 1 data. Would the read for tx-ln1-rswn then return -ENOENT and cause all valid lane 0 calibration to be discarded? [ ... ] > +end: > + if (ret < 0) { > + /* > + * If any of the calibration values is missing, or if there is > + * no calibration at all in the eFuses, this is not a problem, > + * as the PHY doesn't require one to actually work. > + */ > + if (ret =3D=3D -ENOENT) { > + cal->supported =3D false; > + return 0; > + } > + return ret; > + }; [Severity: High] If the kernel is compiled without CONFIG_NVMEM, nvmem_cell_read_u8 returns -EOPNOTSUPP. Does this cause the entire PHY probe to fail on systems without NVMEM, even though calibration is optional? [ ... ] > +static int mtk_pcie_sphy_probe(struct platform_device *pdev) > +{ [ ... ] > + provider =3D devm_of_phy_provider_register(dev, of_phy_simple_xlate); > + if (IS_ERR(provider)) > + return dev_err_probe(dev, PTR_ERR(provider), > + "Could not register PCI-Express S-PHY\n"); > + > + ret =3D devm_pm_runtime_enable(dev); > + if (ret) > + return ret; > + > + return 0; > +} [Severity: Medium] Could registering the PHY provider before enabling Runtime PM lead to a race condition? If a consumer driver probes concurrently and immediately calls phy_init(), could it try to interact with the device before devm_pm_runtime_enable() has completed? --=20 Sashiko AI review =C2=B7 https://sashiko.dev/#/patchset/20260716151333.7725= 4-1-angelogioacchino.delregno@collabora.com?part=3D2 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 E1E17C44512 for ; Thu, 16 Jul 2026 15:24:44 +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=UVncVNDRqmn6KTzsQVkg0E9xS7XmZZsA8wuOomcxdR4=; b=QfRkhBfqlk9sdt STwsvzgQLvuBODT/Eu4LpWM7+6fprpNQ8KMb/W6bI7cvs81YEWctme1hruzx+I7xJLU3MAFrH+fKw IFS4yd6SfFjRheePzTvzZtk748VjgQlmOpIL5JE8T3PiiKN04W/VgXeCk1KuPcHRFQV0cZkzh2Fua tAZJ9mk5HFojrOn64kONzovZj27kddVRw9EW/Z/lfLhnFPbm+q5JovOd7qd+p3Qgo6Gj63NLogdwv hcBU5QWDoQmNDl59Y+v0qxmfkk2XZ4Dve+UXyxnpIOeF+/YlNu28A1hemiHdcnvOLpT13qw/I3tet ThGX6rxK1xcIHqzOouqw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.99.1 #2 (Red Hat Linux)) id 1wkNx6-000000002bf-2n96; Thu, 16 Jul 2026 15:24:44 +0000 Received: from tor.source.kernel.org ([172.105.4.254]) by bombadil.infradead.org with esmtps (Exim 4.99.1 #2 (Red Hat Linux)) id 1wkNx5-000000002bG-1ZoT for linux-phy@lists.infradead.org; Thu, 16 Jul 2026 15:24:43 +0000 Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) by tor.source.kernel.org (Postfix) with ESMTP id B558B60A61; Thu, 16 Jul 2026 15:24:42 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id EBAF61F000E9; Thu, 16 Jul 2026 15:24:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1784215482; bh=U2trcA6L3CTjGQWJ6mgCr1miHu8mbNzhU2EhWWWwyOM=; h=From:Subject:Reply-To:To:Cc:In-Reply-To:References:Date; b=CaV5Xx/DbxEqC99W7S7ZMQWY1N8WUdnPWrig+3PtktIfO6Fg65alouQTPIftCxc7r vGezfBHXS65JPbzK9AWjOTuipQ87aPeRqMbVVEArQu17T4qJlXdd9EpUcWaAfMlS+s T94bUNB7Jax280wTeOVqiekmO52OD5dKZhqrglPYThc2Z+u6aMnglcHT0208XM0fFl e3AhSZySLdo/a4XPDNz7g23vFjsYTt9J6m9vRj8N1w4IQcSs3M1yQsA3ThhT1KYo7k ZvJMOulfrp8g4Z3U98aKUkRPoDoIuhQnEnFbAjP1X8hAF9fQThQgz8LG7CbhkoAoqr GaRHY2jf9AqCw== From: sashiko-bot@kernel.org Subject: Re: [PATCH 2/2] phy: mediatek: Add support for PCI-Express Gen4 S-PHY To: "AngeloGioacchino Del Regno" Cc: devicetree@vger.kernel.org, olteanv@gmail.com, linux-phy@lists.infradead.org, neil.armstrong@linaro.org, conor+dt@kernel.org, robh@kernel.org, vkoul@kernel.org In-Reply-To: <20260716151333.77254-3-angelogioacchino.delregno@collabora.com> References: <20260716151333.77254-1-angelogioacchino.delregno@collabora.com> <20260716151333.77254-3-angelogioacchino.delregno@collabora.com> Date: Thu, 16 Jul 2026 15:24:41 +0000 Message-Id: <20260716152441.EBAF61F000E9@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 NyBwb3RlbnRpYWwgaXNzdWUocykgdG8gY29uc2lkZXI6Ci0gW0hpZ2hdIFRoZSA0LWJpdCBiaXRm aWVsZHMgaW4gYHN0cnVjdCBtdGtfcGNpZV9zcGh5X2ltcF9zZWxgIHdpbGwgc2lsZW50bHkgdHJ1 bmNhdGUgNS1iaXQgVFggaW1wZWRhbmNlIGNhbGlicmF0aW9uIHZhbHVlcy4KLSBbSGlnaF0gUHJv YmUgZmFpbHMgd2hlbiBDT05GSUdfTlZNRU0gaXMgZGlzYWJsZWQgZHVlIHRvIHVuaGFuZGxlZCAt RU9QTk9UU1VQUC4KLSBbTWVkaXVtXSBVbmNvbmRpdGlvbmFsIHJlYWQgb2YgbGFuZSAxIGNhbGli cmF0aW9uIGRhdGEgbmVlZGxlc3NseSBkaXNhYmxlcyBjYWxpYnJhdGlvbiBlbnRpcmVseSBmb3Ig MS1sYW5lIFBIWXMuCi0gW01lZGl1bV0gVmFsaWQgY2FsaWJyYXRpb24gZGF0YSBjb250YWluaW5n IHRoZSB2YWx1ZSAnMCcgaW5jb3JyZWN0bHkgYWJvcnRzIHRoZSBlbnRpcmUgY2FsaWJyYXRpb24g cHJvY2Vzcy4KLSBbTWVkaXVtXSBQSFkgcHJvdmlkZXIgaXMgcmVnaXN0ZXJlZCBiZWZvcmUgUnVu dGltZSBQTSBpcyBlbmFibGVkLCBjcmVhdGluZyBhIHByb2JlIHJhY2UgY29uZGl0aW9uLgotIFtM b3ddIEV4cGVjdGVkIG1pc3NpbmcgY2FsaWJyYXRpb24gZGF0YSBhbmQgcHJvYmUgZGVmZXJyYWxz IHRyaWdnZXIgdW5jb25kaXRpb25hbCBkZXZfZXJyKCkgbG9ncy4KLSBbTG93XSBNaXNzaW5nIGAj aW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPmAgd2hpbGUgdXNpbmcgYGRldm1fcG1fcnVudGlt ZV9lbmFibGUoKWAuCi0tCgotLS0gUGF0Y2ggWzJdOiBbUEFUQ0ggMi8yXSBwaHk6IG1lZGlhdGVr OiBBZGQgc3VwcG9ydCBmb3IgUENJLUV4cHJlc3MgR2VuNCBTLVBIWSAtLS0KY29tbWl0IDdjYmRi YTkwZTMyYmJkYzg4OWJiMDQzMDYyMzFmZDVkZTYxNDEzMDMKQXV0aG9yOiBBbmdlbG9HaW9hY2No aW5vIERlbCBSZWdubyA8YW5nZWxvZ2lvYWNjaGluby5kZWxyZWdub0Bjb2xsYWJvcmEuY29tPgoK cGh5OiBtZWRpYXRlazogQWRkIHN1cHBvcnQgZm9yIFBDSS1FeHByZXNzIEdlbjQgUy1QSFkKCkFk ZCBzdXBwb3J0IGZvciB0aGUgUENJLUV4cHJlc3MgR2VuNCBTLVBIWSBmb3VuZCBpbiB0aGUgbGF0 ZXN0Ck1lZGlhVGVrIFNvQ3MsIGluY2x1ZGluZyBNVDgxOTYsIE1UODg5NCBhbmQgc2ltaWxhci4K Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L21lZGlhdGVrL3BoeS1tdGstcGNpZS1zcGh5LmMg Yi9kcml2ZXJzL3BoeS9tZWRpYXRlay9waHktbXRrLXBjaWUtc3BoeS5jCj4gbmV3IGZpbGUgbW9k ZSAxMDA2NDQKPiAtLS0gL2Rldi9udWxsCj4gKysrIGIvZHJpdmVycy9waHkvbWVkaWF0ZWsvcGh5 LW10ay1wY2llLXNwaHkuYwo+IEBAIC0wLDAgKzEsNTYwIEBACj4gKy8vIFNQRFgtTGljZW5zZS1J ZGVudGlmaWVyOiBHUEwtMi4wCj4gKy8qCj4gKyAqIENvcHlyaWdodCAoYykgMjAyMiBNZWRpYVRl ayBJbmMuCj4gKyAqIENvcHlyaWdodCAoYykgMjAyNiBDb2xsYWJvcmEgTHRkLgo+ICsgKiAgICAg ICAgICAgICAgICAgICAgQW5nZWxvR2lvYWNjaGlubyBEZWwgUmVnbm8gPGFuZ2Vsb2dpb2FjY2hp bm8uZGVscmVnbm9AY29sbGFib3JhLmNvbT4KPiArICovCj4gKwo+ICsjaW5jbHVkZSA8bGludXgv Yml0ZmllbGQuaD4KPiArI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgo+ICsjaW5jbHVkZSA8bGlu dXgvbnZtZW0tY29uc3VtZXIuaD4KPiArI2luY2x1ZGUgPGxpbnV4L29mLmg+Cj4gKyNpbmNsdWRl IDxsaW51eC9waHkvcGh5Lmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4K PiArI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KCltTZXZlcml0eTogTG93XQpEb2VzIHRoaXMgbmVl ZCBsaW51eC9wbV9ydW50aW1lLmggaW5jbHVkZWQgc2luY2UgZGV2bV9wbV9ydW50aW1lX2VuYWJs ZSgpCmlzIHVzZWQgbGF0ZXIgaW4gdGhlIGZpbGU/CgpbIC4uLiBdCgo+ICsvKioKPiArICogc3Ry dWN0IG10a19wY2llX3NwaHlfaW1wX3NlbCAtIEltcGVkYW5jZSBTZWxlY3Rpb24gcGFyYW1ldGVy cwo+ICsgKiBAcG1vczogSW1wZWRhbmNlIHNlbGVjdGlvbiBmb3IgUC1DaGFubmVsIE1PU0ZFVAo+ ICsgKiBAbm1vczogSW1wZWRhbmNlIHNlbGVjdGlvbiBmb3IgTi1DaGFubmVsIE1PU0ZFVAo+ICsg Ki8KPiArc3RydWN0IG10a19wY2llX3NwaHlfaW1wX3NlbCB7Cj4gKwl1OCBwbW9zIDogNDsKPiAr CXU4IG5tb3MgOiA0Owo+ICt9OwoKW1NldmVyaXR5OiBIaWdoXQpDYW4gdGhpcyB0cnVuY2F0ZSBj YWxpYnJhdGlvbiB2YWx1ZXM/IFRoZSBlRnVzZSBkYXRhIHJlYWQgZm9yIHR4LWxhbmVzLXBtb3MK YW5kIHR4LWxhbmVzLW5tb3MgdXNlcyBGSUVMRF9NQVgoUkdfWFRQX0xOX1RYX0lNUFNFTF9QTU9T KSwgd2hpY2ggaXMKR0VOTUFTSyg0LCAwKSwgYWxsb3dpbmcgNS1iaXQgdmFsdWVzIHVwIHRvIDMx LiBXaWxsIHZhbHVlcyBncmVhdGVyIHRoYW4gMTUKYmUgc2lsZW50bHkgdHJ1bmNhdGVkIGhlcmU/ CgpbIC4uLiBdCgo+ICtzdGF0aWMgaW50IG10a19wY2llX3NwaHlfZ2V0X29uZV9jYWxfcGFyYShz dHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKm5hbWUsIHU4IG1heF92YWwpCj4gK3sKPiAr CXUxNiBidWY7Cj4gKwl1OCB0bXA7Cj4gKwlpbnQgcmV0Owo+ICsKPiArCS8qCj4gKwkgKiBBbGwg b2YgdGhlIGNhbGlicmF0aW9ucyBhcmUgYWx3YXlzIG1heCA4IGJpdHMgbG9uZywgYnV0IHNvbWUg bWF5Cj4gKwkgKiBiZSBzcGxpdCBiZXR3ZWVuIHR3byBkaWZmZXJlbnQgOC1iaXRzIGNlbGxzOiBo YW5kbGUgdGhpcyBjb3JuZXIKPiArCSAqIGNhc2UgYnkgcmV0cnlpbmcgcmVhZGluZyBhcyB1MTYu Cj4gKwkgKi8KPiArCXJldCA9IG52bWVtX2NlbGxfcmVhZF91OChkZXYsIG5hbWUsICZ0bXApOwo+ ICsJaWYgKHJldCA9PSAwKQo+ICsJCWJ1ZiA9IHRtcDsKPiArCWVsc2UKPiArCQlyZXQgPSBudm1l bV9jZWxsX3JlYWRfdTE2KGRldiwgbmFtZSwgJmJ1Zik7Cj4gKwo+ICsJaWYgKHJldCkgewo+ICsJ CWRldl9lcnIoZGV2LCAiQ2Fubm90IGdldCBjYWxpYnJhdGlvbiBkYXRhIGZvciAlczogJWRcbiIs IG5hbWUsIHJldCk7Cj4gKwkJcmV0dXJuIHJldDsKPiArCX07CgpbU2V2ZXJpdHk6IExvd10KRG9l cyB0aGlzIHVuY29uZGl0aW9uYWxseSBsb2cgYW4gZXJyb3IgZm9yIGV4cGVjdGVkIG1pc3Npbmcg Y2VsbHMgKC1FTk9FTlQpCm9yIGR1cmluZyBwcm9iZSBkZWZlcnJhbCAoLUVQUk9CRV9ERUZFUik/ Cgo+ICsKPiArCWlmIChidWYgPT0gMCkgewo+ICsJCWRldl93YXJuKGRldiwgIk5vIGNhbGlicmF0 aW9uIGZvciAlcy4gVXNpbmcgZGVmYXVsdHNcbiIsIG5hbWUpOwo+ICsJCXJldHVybiAtRU5PRU5U Owo+ICsJfQoKW1NldmVyaXR5OiBNZWRpdW1dCklzIDAgYW4gaW52YWxpZCBjYWxpYnJhdGlvbiB2 YWx1ZT8KCkxhdGVyIGNvZGUgY2hlY2tzIGlmIHRoZSBjYWxpYnJhdGlvbiB2ZXJzaW9uIGlzIDw9 IDQsIHdoaWNoIGltcGxpZXMgdmVyc2lvbgowIGNvdWxkIGV4aXN0LiBJZiBhIHZhbGlkIGNlbGwg Y29udGFpbnMgMCwgd2lsbCB0aGlzIG1pc3Rha2VubHkgYWJvcnQgdGhlCmVudGlyZSBjYWxpYnJh dGlvbiBwcm9jZXNzPwoKWyAuLi4gXQoKPiArc3RhdGljIGludCBtdGtfcGNpZV9zcGh5X2dldF9j YWxpYnJhdGlvbl9kYXRhKHN0cnVjdCBtdGtfcGNpZV9zcGh5ICpwY2llX3NwaHkpCj4gK3sKClsg Li4uIF0KCj4gKwlyZXQgPSBtdGtfcGNpZV9zcGh5X2dldF9vbmVfY2FsX3BhcmEoZGV2LCAidHgt bG4wLXJzd24iLAo+ICsJCQkJCSAgICAgRklFTERfTUFYKFJHX1hUUF9MTl9UWF9SU1dOX0lNUFNF TCkpOwo+ICsJaWYgKHJldCA8IDApCj4gKwkJZ290byBlbmQ7Cj4gKwljYWwtPnR4X3Jzd25faW1w c2VsWzBdID0gcmV0Owo+ICsKPiArCXJldCA9IG10a19wY2llX3NwaHlfZ2V0X29uZV9jYWxfcGFy YShkZXYsICJ0eC1sbjEtcnN3biIsCj4gKwkJCQkJICAgICBGSUVMRF9NQVgoUkdfWFRQX0xOX1RY X1JTV05fSU1QU0VMKSk7Cj4gKwlpZiAocmV0IDwgMCkKPiArCQlnb3RvIGVuZDsKPiArCWNhbC0+ dHhfcnN3bl9pbXBzZWxbMV0gPSByZXQ7CgpbU2V2ZXJpdHk6IE1lZGl1bV0KV2lsbCB0aGlzIGJy ZWFrIGNhbGlicmF0aW9uIG9uIDEtbGFuZSBQSFlzPwoKSWYgbnVtX2xhbmVzIGlzIDEsIHRoZSBk ZXZpY2UgdHJlZSBtaWdodCBuYXR1cmFsbHkgb21pdCBsYW5lIDEgZGF0YS4gV291bGQKdGhlIHJl YWQgZm9yIHR4LWxuMS1yc3duIHRoZW4gcmV0dXJuIC1FTk9FTlQgYW5kIGNhdXNlIGFsbCB2YWxp ZCBsYW5lIDAKY2FsaWJyYXRpb24gdG8gYmUgZGlzY2FyZGVkPwoKWyAuLi4gXQoKPiArZW5kOgo+ ICsJaWYgKHJldCA8IDApIHsKPiArCQkvKgo+ICsJCSAqIElmIGFueSBvZiB0aGUgY2FsaWJyYXRp b24gdmFsdWVzIGlzIG1pc3NpbmcsIG9yIGlmIHRoZXJlIGlzCj4gKwkJICogbm8gY2FsaWJyYXRp b24gYXQgYWxsIGluIHRoZSBlRnVzZXMsIHRoaXMgaXMgbm90IGEgcHJvYmxlbSwKPiArCQkgKiBh cyB0aGUgUEhZIGRvZXNuJ3QgcmVxdWlyZSBvbmUgdG8gYWN0dWFsbHkgd29yay4KPiArCQkgKi8K PiArCQlpZiAocmV0ID09IC1FTk9FTlQpIHsKPiArCQkJY2FsLT5zdXBwb3J0ZWQgPSBmYWxzZTsK PiArCQkJcmV0dXJuIDA7Cj4gKwkJfQo+ICsJCXJldHVybiByZXQ7Cj4gKwl9OwoKW1NldmVyaXR5 OiBIaWdoXQpJZiB0aGUga2VybmVsIGlzIGNvbXBpbGVkIHdpdGhvdXQgQ09ORklHX05WTUVNLCBu dm1lbV9jZWxsX3JlYWRfdTggcmV0dXJucwotRU9QTk9UU1VQUC4gRG9lcyB0aGlzIGNhdXNlIHRo ZSBlbnRpcmUgUEhZIHByb2JlIHRvIGZhaWwgb24gc3lzdGVtcyB3aXRob3V0Ck5WTUVNLCBldmVu IHRob3VnaCBjYWxpYnJhdGlvbiBpcyBvcHRpb25hbD8KClsgLi4uIF0KCj4gK3N0YXRpYyBpbnQg bXRrX3BjaWVfc3BoeV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQo+ICt7Cgpb IC4uLiBdCgo+ICsJcHJvdmlkZXIgPSBkZXZtX29mX3BoeV9wcm92aWRlcl9yZWdpc3RlcihkZXYs IG9mX3BoeV9zaW1wbGVfeGxhdGUpOwo+ICsJaWYgKElTX0VSUihwcm92aWRlcikpCj4gKwkJcmV0 dXJuIGRldl9lcnJfcHJvYmUoZGV2LCBQVFJfRVJSKHByb3ZpZGVyKSwKPiArCQkJCSAgICAgIkNv dWxkIG5vdCByZWdpc3RlciBQQ0ktRXhwcmVzcyBTLVBIWVxuIik7Cj4gKwo+ICsJcmV0ID0gZGV2 bV9wbV9ydW50aW1lX2VuYWJsZShkZXYpOwo+ICsJaWYgKHJldCkKPiArCQlyZXR1cm4gcmV0Owo+ ICsKPiArCXJldHVybiAwOwo+ICt9CgpbU2V2ZXJpdHk6IE1lZGl1bV0KQ291bGQgcmVnaXN0ZXJp bmcgdGhlIFBIWSBwcm92aWRlciBiZWZvcmUgZW5hYmxpbmcgUnVudGltZSBQTSBsZWFkIHRvIGEg cmFjZQpjb25kaXRpb24/CgpJZiBhIGNvbnN1bWVyIGRyaXZlciBwcm9iZXMgY29uY3VycmVudGx5 IGFuZCBpbW1lZGlhdGVseSBjYWxscyBwaHlfaW5pdCgpLApjb3VsZCBpdCB0cnkgdG8gaW50ZXJh Y3Qgd2l0aCB0aGUgZGV2aWNlIGJlZm9yZSBkZXZtX3BtX3J1bnRpbWVfZW5hYmxlKCkgaGFzCmNv bXBsZXRlZD8KCi0tIApTYXNoaWtvIEFJIHJldmlldyDCtyBodHRwczovL3Nhc2hpa28uZGV2LyMv cGF0Y2hzZXQvMjAyNjA3MTYxNTEzMzMuNzcyNTQtMS1hbmdlbG9naW9hY2NoaW5vLmRlbHJlZ25v QGNvbGxhYm9yYS5jb20/cGFydD0yCgotLSAKbGludXgtcGh5IG1haWxpbmcgbGlzdApsaW51eC1w aHlAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwczovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1h bi9saXN0aW5mby9saW51eC1waHkK