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 6B00729346F for ; Mon, 18 May 2026 14:40:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779115247; cv=none; b=kKKjU9IbtKJHDVTarp8tBKfkzNPR59bCULZhmLTngl8B1p4pZ16sarxAUN0XNfL2Hh/IDGSYYxM0Bz2Au8RnuGHhENTb4ehxZ9fkCjBsu5zggoSdkB395VBh4xqdi8IoBOBgGAh0cLBoNxT43oPbeIJNEwyp24s6SfazVuEtG5g= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779115247; c=relaxed/simple; bh=Bng3RcR9g1tPQxp632lA6SH6v3CbL4x4QY9YwK7Jobg=; h=From:Subject:To:Cc:In-Reply-To:References:Content-Type:Date: Message-Id; b=tbTeVnDZuE7lAH3R/E1HKKIJ08SS1YrOihLPUV3xSdZFguFXGm+VHcARX9LDPB0h+qE5dlCao5O46osBYB1SQrm2KcBtdBmyRX5HG5wHnZH1sd/xdWFZ3Qafm5UBQCp2KQLAUBPsLDeQkIacX99PdRoWu7Rvv8z2hxjEkl5qWRQ= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=KHeRSTPq; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="KHeRSTPq" Received: by smtp.kernel.org (Postfix) with ESMTPSA id EE840C2BCB7; Mon, 18 May 2026 14:40:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1779115247; bh=Bng3RcR9g1tPQxp632lA6SH6v3CbL4x4QY9YwK7Jobg=; h=From:Subject:Reply-To:To:Cc:In-Reply-To:References:Date:From; b=KHeRSTPq04L0K/bP+m3HYfPrurHkSszlgtrfchLlBJtFKlytl3xxL3ZnmpHB+/Ger gsNSx+rgY/IvBJKPyY/Y7UOOeOV509EnW4wE/NVRw382LQJ2hBWH9/hN+3h67EhTLJ D0MDWcfWWCj79q9ViaVdmvCHGz5Uv4+MEbvcBfkz33bL62PK+WgiwLowEylsvr5wkf FLRuOcK/Si3wYr9drHp5eCLOHX9h7Vd5YKQ6xnlgPhF+OK6juJ/V0ux4wyKz6rz9MN jtq6VMk/j/1dWyyzcHRrhfvowD5pdgCyN1t/X2KN5deiZBnJKnT4G7THN9vMfxyFgt rqnVUJlpEM4DQ== From: sashiko-bot@kernel.org Subject: Re: [PATCH 2/2] phy: econet: Add EcoNet USB PHY Reply-To: sashiko-reviews@lists.linux.dev To: "Caleb James DeLisle" Cc: linux-phy@lists.infradead.org, robh@kernel.org, devicetree@vger.kernel.org, vkoul@kernel.org, neil.armstrong@linaro.org, conor+dt@kernel.org, olteanv@gmail.com In-Reply-To: <20260518141343.401555-3-cjd@cjdns.fr> References: <20260518141343.401555-3-cjd@cjdns.fr> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Date: Mon, 18 May 2026 14:40:46 +0000 Message-Id: <20260518144046.EE840C2BCB7@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 6 potential issue(= s) to consider: - [High] Race condition on shared Frequency Meter registers during concurre= nt PHY initialization. - [High] Hardware state machine race due to polling data register instead o= f valid bit. - [High] Devres lifecycle bug caused by attaching memory and regmap resourc= es to the child PHY device. - [Medium] Iteration over disabled Device Tree nodes accesses unpowered har= dware. - [Medium] Missing bounds check on dynamically calculated slew rate configu= ration exposes hardware to silent bit truncation. - [Low] Pointer signedness mismatch in `regmap_read_poll_timeout` causes co= mpiler warnings and violates type safety. -- commit ab614fd3da75925164048ae81b01b59ec760d67e Author: Caleb James DeLisle phy: econet: Add EcoNet USB PHY This commit adds support for the USB PHY found on EcoNet EN751221, EN751627, and EN7528 based SoCs. It implements the setup and tuning rituals for both USB 2.0 and USB 3.0 PHY blocks. Link: https://github.com/openwrt/openwrt/pull/23264#issuecomment-4415906568 > diff --git a/drivers/phy/phy-econet-usb.c b/drivers/phy/phy-econet-usb.c > new file mode 100644 > index 0000000000000..e8fa2e80eb130 > --- /dev/null > +++ b/drivers/phy/phy-econet-usb.c [ ... ] > +static void u2_slew_rate_calibration(struct econet_usb_phy_priv *priv, > + struct econet_phy_instance *instance) > +{ > + struct regmap *com =3D instance->regmap; > + struct regmap *regmap =3D priv->regmap; > + int fm_out =3D 0; Does this pointer type cause compiler warnings? regmap_read_poll_timeout() passes the address of fm_out to regmap_read(), which expects an unsigned int pointer. Using a signed int can lead to incompatible pointer type warnings. > + u32 srctrl; > + > + /* Enable HS TX SR calibration */ > + regmap_set_bits(com, U2PHY_COM + USBPHYACR0, RG_HSTX_SRCAL_EN); > + > + usleep_range(1000, 1500); > + > + /* Enable Free run clock */ > + regmap_set_bits(regmap, FMREG + FMMONR1, RG_FRCK_EN); > + > + /* Select Monitor Clock */ > + regmap_update_bits(regmap, FMREG + FMCR0, RG_MONCLK_SEL, > + FIELD_PREP(RG_MONCLK_SEL, instance->port_id)); Is it possible for multiple PHY ports to race when accessing these shared FMREG registers? The Linux PHY core serializes phy_init() only per-PHY instance, meaning multiple ports could potentially initialize at the same time. If two threads run this calibration concurrently, could one overwrite the active port selection or prematurely clear the frequency detection enable bit while the other is still polling? Might this require a driver-level mutex to serialize access to the FMREG hardware block? > + > + /* Set cyclecnt */ > + regmap_update_bits(regmap, FMREG + FMCR0, RG_CYCLECNT, > + FIELD_PREP_CONST(RG_CYCLECNT, > + ECONET_USB_PHY_U2_FM_DET_CYCLE_CNT)); > + > + /* Enable Frequency meter */ > + regmap_set_bits(regmap, FMREG + FMCR0, RG_FREQDET_EN); > + > + /* Timeout can happen and we will apply workaround at the end */ > + regmap_read_poll_timeout(regmap, FMREG + FMMONR0, fm_out, > + fm_out, ECONET_USB_PHY_FREQDET_SLEEP, > + ECONET_USB_PHY_FREQDET_TIMEOUT); Could this loop prematurely succeed by reading a stale value? FMMONR0 holds the result of the calibration. If this function is called a second time for another port, polling for fm_out !=3D 0 might instantly succeed using the previous run's result. Would it be more robust to poll the FMMONR1 register for the RG_FM_VALID flag before reading the result from FMMONR0? [ ... ] > + } else { > + /* (1024 / FM_OUT) * REF_CK * U2_SR_COEF (round to nearest) */ > + srctrl =3D ECONET_USB_PHY_REF_CK * ECONET_USB_PHY_U2_SR_COEF; > + srctrl =3D (srctrl * ECONET_USB_PHY_U2_FM_DET_CYCLE_CNT) / fm_out; > + srctrl =3D DIV_ROUND_CLOSEST(srctrl, > + ECONET_USB_PHY_U2_SR_COEF_DIVISOR); > + dev_info(&instance->phy->dev, > + "frequency meter result 0x%x, set slew rate 0x%x\n", > + fm_out, srctrl); > + } > + > + /* Set slew rate */ > + regmap_update_bits(com, U2PHY_COM + USBPHYACR0, RG_HSTX_SRCTRL, > + FIELD_PREP(RG_HSTX_SRCTRL, srctrl)); Is there a risk of silent bit truncation here? The target field RG_HSTX_SRCTRL is only 3 bits wide. If the frequency meter provides a low output value (for instance, due to a stale read), the divisi= on above could yield a value much larger than 7. Since FIELD_PREP masks runtime values without error, could this write an unintended configuration to the hardware? Should the calculated srctrl value be clamped before applying it? [ ... ] > +static int econet_usb_phy_probe(struct platform_device *pdev) > +{ > + struct device *dev =3D &pdev->dev; > + struct device_node *np =3D dev->of_node; [ ... ] > + phy_n =3D 0; > + for_each_child_of_node_scoped(np, child_np) { Does this loop interact with disabled hardware blocks? Using for_each_child_of_node_scoped() will iterate over all child nodes, including those with status =3D "disabled" in the device tree. This results in the driver mapping memory, initializing regmaps, and calling econet_usb_phy_exit() to write to registers on unpowered or unclocked hardware, which can sometimes cause system hangs. Would it be safer to use for_each_available_child_of_node_scoped()? > + struct econet_phy_instance *instance; > + void __iomem *phy_base; > + struct device *subdev; > + struct resource res; > + int retval; [ ... ] > + instance->phy =3D devm_phy_create(dev, child_np, &econet_phy); > + if (IS_ERR(instance->phy)) > + return dev_err_probe(dev, PTR_ERR(instance->phy), > + "failed to create phy\n"); > + > + subdev =3D &instance->phy->dev; > + retval =3D of_address_to_resource(child_np, 0, &res); > + if (retval) > + return dev_err_probe(subdev, retval, > + "getting reg for phy %d\n", > + phy_n); > + > + phy_base =3D devm_ioremap_resource(subdev, &res); Can using the child PHY device for resource allocations cause memory leaks and probe failures? The subdev pointer belongs to the child PHY device created by devm_phy_create(). Devres resources are tied to the device's reference count reaching zero. If userspace holds an active sysfs file descriptor for the PHY device when the parent platform driver unbinds, the subdev kobject stays alive and the memory region is not freed. If the platform driver is re-probed, it might fail with -EBUSY when requesting the same memory region. Should devm_ioremap_resource and devm_regmap_init_mmio be associated with the parent platform device instead? > + if (IS_ERR(phy_base)) > + return dev_err_probe(subdev, PTR_ERR(phy_base), > + "remapping reg for phy %d\n", > + phy_n); > + > + instance->regmap =3D > + devm_regmap_init_mmio(subdev, phy_base, > + &econet_usb_phy_regmap_config); > + if (IS_ERR(instance->regmap)) > + return dev_err_probe(subdev, PTR_ERR(instance->regmap), > + "making regmap for phy %d\n", > + phy_n); --=20 Sashiko AI review =C2=B7 https://sashiko.dev/#/patchset/20260518141343.4015= 55-1-cjd@cjdns.fr?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 21CE7CD4F4A for ; Mon, 18 May 2026 14:40:51 +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=+1mbLKzpZ2XPa1jdb8pax+gu8d6xhpSMreSW9slTByA=; b=ZyZbmS3rlBiDAl ndI85DwN5DxKRqxpGwnoULLtcj9YpjKzunxJTkE3HOFZur4FCMNQQS128DAlX6TxqPfqNpMYeun2+ N33yOkeMSbdHBNGrBlYhiAjX+0lr5Imu3w7fLCIKfcZHcEqddEHkhBZCIt7C6NRl8DIoq+/M9tOds ov9NpUe+4wjBNn+2Zwqntot3RtHaoRsaGu/ZStt4RYVZ/2SOyQpEtvGRs5KaaD/of+3cabX+CSIxD 0jR1WRWNZMH0RtMNAXTmAud9SJCiNmkCALcv0rEKsdd1oPzmCu8BsEk6wHXkVfrzokShQWBrkVMKd vcdobiZw2i85BcUhut3w==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.99.1 #2 (Red Hat Linux)) id 1wOz9G-0000000G1ci-3l0I; Mon, 18 May 2026 14:40:50 +0000 Received: from sea.source.kernel.org ([2600:3c0a:e001:78e:0:1991:8:25]) by bombadil.infradead.org with esmtps (Exim 4.99.1 #2 (Red Hat Linux)) id 1wOz9E-0000000G1bQ-0IXj for linux-phy@lists.infradead.org; Mon, 18 May 2026 14:40:49 +0000 Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by sea.source.kernel.org (Postfix) with ESMTP id 6BDEC4037F; Mon, 18 May 2026 14:40:47 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id EE840C2BCB7; Mon, 18 May 2026 14:40:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1779115247; bh=Bng3RcR9g1tPQxp632lA6SH6v3CbL4x4QY9YwK7Jobg=; h=From:Subject:Reply-To:To:Cc:In-Reply-To:References:Date:From; b=KHeRSTPq04L0K/bP+m3HYfPrurHkSszlgtrfchLlBJtFKlytl3xxL3ZnmpHB+/Ger gsNSx+rgY/IvBJKPyY/Y7UOOeOV509EnW4wE/NVRw382LQJ2hBWH9/hN+3h67EhTLJ D0MDWcfWWCj79q9ViaVdmvCHGz5Uv4+MEbvcBfkz33bL62PK+WgiwLowEylsvr5wkf FLRuOcK/Si3wYr9drHp5eCLOHX9h7Vd5YKQ6xnlgPhF+OK6juJ/V0ux4wyKz6rz9MN jtq6VMk/j/1dWyyzcHRrhfvowD5pdgCyN1t/X2KN5deiZBnJKnT4G7THN9vMfxyFgt rqnVUJlpEM4DQ== From: sashiko-bot@kernel.org Subject: Re: [PATCH 2/2] phy: econet: Add EcoNet USB PHY To: "Caleb James DeLisle" Cc: linux-phy@lists.infradead.org, robh@kernel.org, devicetree@vger.kernel.org, vkoul@kernel.org, neil.armstrong@linaro.org, conor+dt@kernel.org, olteanv@gmail.com In-Reply-To: <20260518141343.401555-3-cjd@cjdns.fr> References: <20260518141343.401555-3-cjd@cjdns.fr> Date: Mon, 18 May 2026 14:40:46 +0000 Message-Id: <20260518144046.EE840C2BCB7@smtp.kernel.org> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.9.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20260518_074048_194374_F7CC4813 X-CRM114-Status: GOOD ( 23.66 ) 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 NiBwb3RlbnRpYWwgaXNzdWUocykgdG8gY29uc2lkZXI6Ci0gW0hpZ2hdIFJhY2UgY29uZGl0aW9u IG9uIHNoYXJlZCBGcmVxdWVuY3kgTWV0ZXIgcmVnaXN0ZXJzIGR1cmluZyBjb25jdXJyZW50IFBI WSBpbml0aWFsaXphdGlvbi4KLSBbSGlnaF0gSGFyZHdhcmUgc3RhdGUgbWFjaGluZSByYWNlIGR1 ZSB0byBwb2xsaW5nIGRhdGEgcmVnaXN0ZXIgaW5zdGVhZCBvZiB2YWxpZCBiaXQuCi0gW0hpZ2hd IERldnJlcyBsaWZlY3ljbGUgYnVnIGNhdXNlZCBieSBhdHRhY2hpbmcgbWVtb3J5IGFuZCByZWdt YXAgcmVzb3VyY2VzIHRvIHRoZSBjaGlsZCBQSFkgZGV2aWNlLgotIFtNZWRpdW1dIEl0ZXJhdGlv biBvdmVyIGRpc2FibGVkIERldmljZSBUcmVlIG5vZGVzIGFjY2Vzc2VzIHVucG93ZXJlZCBoYXJk d2FyZS4KLSBbTWVkaXVtXSBNaXNzaW5nIGJvdW5kcyBjaGVjayBvbiBkeW5hbWljYWxseSBjYWxj dWxhdGVkIHNsZXcgcmF0ZSBjb25maWd1cmF0aW9uIGV4cG9zZXMgaGFyZHdhcmUgdG8gc2lsZW50 IGJpdCB0cnVuY2F0aW9uLgotIFtMb3ddIFBvaW50ZXIgc2lnbmVkbmVzcyBtaXNtYXRjaCBpbiBg cmVnbWFwX3JlYWRfcG9sbF90aW1lb3V0YCBjYXVzZXMgY29tcGlsZXIgd2FybmluZ3MgYW5kIHZp b2xhdGVzIHR5cGUgc2FmZXR5LgotLQoKY29tbWl0IGFiNjE0ZmQzZGE3NTkyNTE2NDA0OGFlODFi MDFiNTllYzc2MGQ2N2UKQXV0aG9yOiBDYWxlYiBKYW1lcyBEZUxpc2xlIDxjamRAY2pkbnMuZnI+ CgpwaHk6IGVjb25ldDogQWRkIEVjb05ldCBVU0IgUEhZCgpUaGlzIGNvbW1pdCBhZGRzIHN1cHBv cnQgZm9yIHRoZSBVU0IgUEhZIGZvdW5kIG9uIEVjb05ldCBFTjc1MTIyMSwgRU43NTE2MjcsCmFu ZCBFTjc1MjggYmFzZWQgU29Dcy4gSXQgaW1wbGVtZW50cyB0aGUgc2V0dXAgYW5kIHR1bmluZyBy aXR1YWxzIGZvciBib3RoClVTQiAyLjAgYW5kIFVTQiAzLjAgUEhZIGJsb2Nrcy4KCkxpbms6IGh0 dHBzOi8vZ2l0aHViLmNvbS9vcGVud3J0L29wZW53cnQvcHVsbC8yMzI2NCNpc3N1ZWNvbW1lbnQt NDQxNTkwNjU2OAoKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9waHkvcGh5LWVjb25ldC11c2IuYyBi L2RyaXZlcnMvcGh5L3BoeS1lY29uZXQtdXNiLmMKPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+IGlu ZGV4IDAwMDAwMDAwMDAwMDAuLmU4ZmEyZTgwZWIxMzAKPiAtLS0gL2Rldi9udWxsCj4gKysrIGIv ZHJpdmVycy9waHkvcGh5LWVjb25ldC11c2IuYwoKWyAuLi4gXQoKPiArc3RhdGljIHZvaWQgdTJf c2xld19yYXRlX2NhbGlicmF0aW9uKHN0cnVjdCBlY29uZXRfdXNiX3BoeV9wcml2ICpwcml2LAo+ ICsJCQkJICAgICBzdHJ1Y3QgZWNvbmV0X3BoeV9pbnN0YW5jZSAqaW5zdGFuY2UpCj4gK3sKPiAr CXN0cnVjdCByZWdtYXAgKmNvbSA9IGluc3RhbmNlLT5yZWdtYXA7Cj4gKwlzdHJ1Y3QgcmVnbWFw ICpyZWdtYXAgPSBwcml2LT5yZWdtYXA7Cj4gKwlpbnQgZm1fb3V0ID0gMDsKCkRvZXMgdGhpcyBw b2ludGVyIHR5cGUgY2F1c2UgY29tcGlsZXIgd2FybmluZ3M/CgpyZWdtYXBfcmVhZF9wb2xsX3Rp bWVvdXQoKSBwYXNzZXMgdGhlIGFkZHJlc3Mgb2YgZm1fb3V0IHRvIHJlZ21hcF9yZWFkKCksCndo aWNoIGV4cGVjdHMgYW4gdW5zaWduZWQgaW50IHBvaW50ZXIuIFVzaW5nIGEgc2lnbmVkIGludCBj YW4gbGVhZCB0bwppbmNvbXBhdGlibGUgcG9pbnRlciB0eXBlIHdhcm5pbmdzLgoKPiArCXUzMiBz cmN0cmw7Cj4gKwo+ICsJLyogRW5hYmxlIEhTIFRYIFNSIGNhbGlicmF0aW9uICovCj4gKwlyZWdt YXBfc2V0X2JpdHMoY29tLCBVMlBIWV9DT00gKyBVU0JQSFlBQ1IwLCBSR19IU1RYX1NSQ0FMX0VO KTsKPiArCj4gKwl1c2xlZXBfcmFuZ2UoMTAwMCwgMTUwMCk7Cj4gKwo+ICsJLyogRW5hYmxlIEZy ZWUgcnVuIGNsb2NrICovCj4gKwlyZWdtYXBfc2V0X2JpdHMocmVnbWFwLCBGTVJFRyArIEZNTU9O UjEsIFJHX0ZSQ0tfRU4pOwo+ICsKPiArCS8qIFNlbGVjdCBNb25pdG9yIENsb2NrICovCj4gKwly ZWdtYXBfdXBkYXRlX2JpdHMocmVnbWFwLCBGTVJFRyArIEZNQ1IwLCBSR19NT05DTEtfU0VMLAo+ ICsJCQkgICBGSUVMRF9QUkVQKFJHX01PTkNMS19TRUwsIGluc3RhbmNlLT5wb3J0X2lkKSk7CgpJ cyBpdCBwb3NzaWJsZSBmb3IgbXVsdGlwbGUgUEhZIHBvcnRzIHRvIHJhY2Ugd2hlbiBhY2Nlc3Np bmcgdGhlc2Ugc2hhcmVkCkZNUkVHIHJlZ2lzdGVycz8KClRoZSBMaW51eCBQSFkgY29yZSBzZXJp YWxpemVzIHBoeV9pbml0KCkgb25seSBwZXItUEhZIGluc3RhbmNlLCBtZWFuaW5nCm11bHRpcGxl IHBvcnRzIGNvdWxkIHBvdGVudGlhbGx5IGluaXRpYWxpemUgYXQgdGhlIHNhbWUgdGltZS4gSWYg dHdvCnRocmVhZHMgcnVuIHRoaXMgY2FsaWJyYXRpb24gY29uY3VycmVudGx5LCBjb3VsZCBvbmUg b3ZlcndyaXRlIHRoZSBhY3RpdmUKcG9ydCBzZWxlY3Rpb24gb3IgcHJlbWF0dXJlbHkgY2xlYXIg dGhlIGZyZXF1ZW5jeSBkZXRlY3Rpb24gZW5hYmxlIGJpdAp3aGlsZSB0aGUgb3RoZXIgaXMgc3Rp bGwgcG9sbGluZz8KCk1pZ2h0IHRoaXMgcmVxdWlyZSBhIGRyaXZlci1sZXZlbCBtdXRleCB0byBz ZXJpYWxpemUgYWNjZXNzIHRvIHRoZSBGTVJFRwpoYXJkd2FyZSBibG9jaz8KCj4gKwo+ICsJLyog U2V0IGN5Y2xlY250ICovCj4gKwlyZWdtYXBfdXBkYXRlX2JpdHMocmVnbWFwLCBGTVJFRyArIEZN Q1IwLCBSR19DWUNMRUNOVCwKPiArCQkJICAgRklFTERfUFJFUF9DT05TVChSR19DWUNMRUNOVCwK PiArCQkJCQkgICAgRUNPTkVUX1VTQl9QSFlfVTJfRk1fREVUX0NZQ0xFX0NOVCkpOwo+ICsKPiAr CS8qIEVuYWJsZSBGcmVxdWVuY3kgbWV0ZXIgKi8KPiArCXJlZ21hcF9zZXRfYml0cyhyZWdtYXAs IEZNUkVHICsgRk1DUjAsIFJHX0ZSRVFERVRfRU4pOwo+ICsKPiArCS8qIFRpbWVvdXQgY2FuIGhh cHBlbiBhbmQgd2Ugd2lsbCBhcHBseSB3b3JrYXJvdW5kIGF0IHRoZSBlbmQgKi8KPiArCXJlZ21h cF9yZWFkX3BvbGxfdGltZW91dChyZWdtYXAsIEZNUkVHICsgRk1NT05SMCwgZm1fb3V0LAo+ICsJ CQkJIGZtX291dCwgRUNPTkVUX1VTQl9QSFlfRlJFUURFVF9TTEVFUCwKPiArCQkJCSBFQ09ORVRf VVNCX1BIWV9GUkVRREVUX1RJTUVPVVQpOwoKQ291bGQgdGhpcyBsb29wIHByZW1hdHVyZWx5IHN1 Y2NlZWQgYnkgcmVhZGluZyBhIHN0YWxlIHZhbHVlPwoKRk1NT05SMCBob2xkcyB0aGUgcmVzdWx0 IG9mIHRoZSBjYWxpYnJhdGlvbi4gSWYgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQKYSBzZWNvbmQg dGltZSBmb3IgYW5vdGhlciBwb3J0LCBwb2xsaW5nIGZvciBmbV9vdXQgIT0gMCBtaWdodCBpbnN0 YW50bHkKc3VjY2VlZCB1c2luZyB0aGUgcHJldmlvdXMgcnVuJ3MgcmVzdWx0LgoKV291bGQgaXQg YmUgbW9yZSByb2J1c3QgdG8gcG9sbCB0aGUgRk1NT05SMSByZWdpc3RlciBmb3IgdGhlIFJHX0ZN X1ZBTElECmZsYWcgYmVmb3JlIHJlYWRpbmcgdGhlIHJlc3VsdCBmcm9tIEZNTU9OUjA/CgpbIC4u LiBdCgo+ICsJfSBlbHNlIHsKPiArCQkvKiAoMTAyNCAvIEZNX09VVCkgKiBSRUZfQ0sgKiBVMl9T Ul9DT0VGIChyb3VuZCB0byBuZWFyZXN0KSAqLwo+ICsJCXNyY3RybCA9IEVDT05FVF9VU0JfUEhZ X1JFRl9DSyAqIEVDT05FVF9VU0JfUEhZX1UyX1NSX0NPRUY7Cj4gKwkJc3JjdHJsID0gKHNyY3Ry bCAqIEVDT05FVF9VU0JfUEhZX1UyX0ZNX0RFVF9DWUNMRV9DTlQpIC8gZm1fb3V0Owo+ICsJCXNy Y3RybCA9IERJVl9ST1VORF9DTE9TRVNUKHNyY3RybCwKPiArCQkJCQkgICBFQ09ORVRfVVNCX1BI WV9VMl9TUl9DT0VGX0RJVklTT1IpOwo+ICsJCWRldl9pbmZvKCZpbnN0YW5jZS0+cGh5LT5kZXYs Cj4gKwkJCSAiZnJlcXVlbmN5IG1ldGVyIHJlc3VsdCAweCV4LCBzZXQgc2xldyByYXRlIDB4JXhc biIsCj4gKwkJCSBmbV9vdXQsIHNyY3RybCk7Cj4gKwl9Cj4gKwo+ICsJLyogU2V0IHNsZXcgcmF0 ZSAqLwo+ICsJcmVnbWFwX3VwZGF0ZV9iaXRzKGNvbSwgVTJQSFlfQ09NICsgVVNCUEhZQUNSMCwg UkdfSFNUWF9TUkNUUkwsCj4gKwkJCSAgIEZJRUxEX1BSRVAoUkdfSFNUWF9TUkNUUkwsIHNyY3Ry bCkpOwoKSXMgdGhlcmUgYSByaXNrIG9mIHNpbGVudCBiaXQgdHJ1bmNhdGlvbiBoZXJlPwoKVGhl IHRhcmdldCBmaWVsZCBSR19IU1RYX1NSQ1RSTCBpcyBvbmx5IDMgYml0cyB3aWRlLiBJZiB0aGUg ZnJlcXVlbmN5IG1ldGVyCnByb3ZpZGVzIGEgbG93IG91dHB1dCB2YWx1ZSAoZm9yIGluc3RhbmNl LCBkdWUgdG8gYSBzdGFsZSByZWFkKSwgdGhlIGRpdmlzaW9uCmFib3ZlIGNvdWxkIHlpZWxkIGEg dmFsdWUgbXVjaCBsYXJnZXIgdGhhbiA3LgoKU2luY2UgRklFTERfUFJFUCBtYXNrcyBydW50aW1l IHZhbHVlcyB3aXRob3V0IGVycm9yLCBjb3VsZCB0aGlzIHdyaXRlCmFuIHVuaW50ZW5kZWQgY29u ZmlndXJhdGlvbiB0byB0aGUgaGFyZHdhcmU/IFNob3VsZCB0aGUgY2FsY3VsYXRlZCBzcmN0cmwK dmFsdWUgYmUgY2xhbXBlZCBiZWZvcmUgYXBwbHlpbmcgaXQ/CgpbIC4uLiBdCgo+ICtzdGF0aWMg aW50IGVjb25ldF91c2JfcGh5X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4g K3sKPiArCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7Cj4gKwlzdHJ1Y3QgZGV2aWNl X25vZGUgKm5wID0gZGV2LT5vZl9ub2RlOwoKWyAuLi4gXQoKPiArCXBoeV9uID0gMDsKPiArCWZv cl9lYWNoX2NoaWxkX29mX25vZGVfc2NvcGVkKG5wLCBjaGlsZF9ucCkgewoKRG9lcyB0aGlzIGxv b3AgaW50ZXJhY3Qgd2l0aCBkaXNhYmxlZCBoYXJkd2FyZSBibG9ja3M/CgpVc2luZyBmb3JfZWFj aF9jaGlsZF9vZl9ub2RlX3Njb3BlZCgpIHdpbGwgaXRlcmF0ZSBvdmVyIGFsbCBjaGlsZCBub2Rl cywKaW5jbHVkaW5nIHRob3NlIHdpdGggc3RhdHVzID0gImRpc2FibGVkIiBpbiB0aGUgZGV2aWNl IHRyZWUuCgpUaGlzIHJlc3VsdHMgaW4gdGhlIGRyaXZlciBtYXBwaW5nIG1lbW9yeSwgaW5pdGlh bGl6aW5nIHJlZ21hcHMsIGFuZApjYWxsaW5nIGVjb25ldF91c2JfcGh5X2V4aXQoKSB0byB3cml0 ZSB0byByZWdpc3RlcnMgb24gdW5wb3dlcmVkIG9yCnVuY2xvY2tlZCBoYXJkd2FyZSwgd2hpY2gg Y2FuIHNvbWV0aW1lcyBjYXVzZSBzeXN0ZW0gaGFuZ3MuCgpXb3VsZCBpdCBiZSBzYWZlciB0byB1 c2UgZm9yX2VhY2hfYXZhaWxhYmxlX2NoaWxkX29mX25vZGVfc2NvcGVkKCk/Cgo+ICsJCXN0cnVj dCBlY29uZXRfcGh5X2luc3RhbmNlICppbnN0YW5jZTsKPiArCQl2b2lkIF9faW9tZW0gKnBoeV9i YXNlOwo+ICsJCXN0cnVjdCBkZXZpY2UgKnN1YmRldjsKPiArCQlzdHJ1Y3QgcmVzb3VyY2UgcmVz Owo+ICsJCWludCByZXR2YWw7CgpbIC4uLiBdCgo+ICsJCWluc3RhbmNlLT5waHkgPSBkZXZtX3Bo eV9jcmVhdGUoZGV2LCBjaGlsZF9ucCwgJmVjb25ldF9waHkpOwo+ICsJCWlmIChJU19FUlIoaW5z dGFuY2UtPnBoeSkpCj4gKwkJCXJldHVybiBkZXZfZXJyX3Byb2JlKGRldiwgUFRSX0VSUihpbnN0 YW5jZS0+cGh5KSwKPiArCQkJCQkgICAgICJmYWlsZWQgdG8gY3JlYXRlIHBoeVxuIik7Cj4gKwo+ ICsJCXN1YmRldiA9ICZpbnN0YW5jZS0+cGh5LT5kZXY7Cj4gKwkJcmV0dmFsID0gb2ZfYWRkcmVz c190b19yZXNvdXJjZShjaGlsZF9ucCwgMCwgJnJlcyk7Cj4gKwkJaWYgKHJldHZhbCkKPiArCQkJ cmV0dXJuIGRldl9lcnJfcHJvYmUoc3ViZGV2LCByZXR2YWwsCj4gKwkJCQkJICAgICAiZ2V0dGlu ZyByZWcgZm9yIHBoeSAlZFxuIiwKPiArCQkJCQkgICAgIHBoeV9uKTsKPiArCj4gKwkJcGh5X2Jh c2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2Uoc3ViZGV2LCAmcmVzKTsKCkNhbiB1c2luZyB0aGUg Y2hpbGQgUEhZIGRldmljZSBmb3IgcmVzb3VyY2UgYWxsb2NhdGlvbnMgY2F1c2UgbWVtb3J5IGxl YWtzCmFuZCBwcm9iZSBmYWlsdXJlcz8KClRoZSBzdWJkZXYgcG9pbnRlciBiZWxvbmdzIHRvIHRo ZSBjaGlsZCBQSFkgZGV2aWNlIGNyZWF0ZWQgYnkKZGV2bV9waHlfY3JlYXRlKCkuIERldnJlcyBy ZXNvdXJjZXMgYXJlIHRpZWQgdG8gdGhlIGRldmljZSdzIHJlZmVyZW5jZQpjb3VudCByZWFjaGlu ZyB6ZXJvLgoKSWYgdXNlcnNwYWNlIGhvbGRzIGFuIGFjdGl2ZSBzeXNmcyBmaWxlIGRlc2NyaXB0 b3IgZm9yIHRoZSBQSFkgZGV2aWNlIHdoZW4KdGhlIHBhcmVudCBwbGF0Zm9ybSBkcml2ZXIgdW5i aW5kcywgdGhlIHN1YmRldiBrb2JqZWN0IHN0YXlzIGFsaXZlIGFuZAp0aGUgbWVtb3J5IHJlZ2lv biBpcyBub3QgZnJlZWQuCgpJZiB0aGUgcGxhdGZvcm0gZHJpdmVyIGlzIHJlLXByb2JlZCwgaXQg bWlnaHQgZmFpbCB3aXRoIC1FQlVTWSB3aGVuCnJlcXVlc3RpbmcgdGhlIHNhbWUgbWVtb3J5IHJl Z2lvbi4gU2hvdWxkIGRldm1faW9yZW1hcF9yZXNvdXJjZSBhbmQKZGV2bV9yZWdtYXBfaW5pdF9t bWlvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGFyZW50IHBsYXRmb3JtIGRldmljZSBpbnN0ZWFk PwoKPiArCQlpZiAoSVNfRVJSKHBoeV9iYXNlKSkKPiArCQkJcmV0dXJuIGRldl9lcnJfcHJvYmUo c3ViZGV2LCBQVFJfRVJSKHBoeV9iYXNlKSwKPiArCQkJCQkgICAgICJyZW1hcHBpbmcgcmVnIGZv ciBwaHkgJWRcbiIsCj4gKwkJCQkJICAgICBwaHlfbik7Cj4gKwo+ICsJCWluc3RhbmNlLT5yZWdt YXAgPQo+ICsJCQlkZXZtX3JlZ21hcF9pbml0X21taW8oc3ViZGV2LCBwaHlfYmFzZSwKPiArCQkJ CQkgICAgICAmZWNvbmV0X3VzYl9waHlfcmVnbWFwX2NvbmZpZyk7Cj4gKwkJaWYgKElTX0VSUihp bnN0YW5jZS0+cmVnbWFwKSkKPiArCQkJcmV0dXJuIGRldl9lcnJfcHJvYmUoc3ViZGV2LCBQVFJf RVJSKGluc3RhbmNlLT5yZWdtYXApLAo+ICsJCQkJCSAgICAgIm1ha2luZyByZWdtYXAgZm9yIHBo eSAlZFxuIiwKPiArCQkJCQkgICAgIHBoeV9uKTsKCi0tIApTYXNoaWtvIEFJIHJldmlldyDCtyBo dHRwczovL3Nhc2hpa28uZGV2LyMvcGF0Y2hzZXQvMjAyNjA1MTgxNDEzNDMuNDAxNTU1LTEtY2pk QGNqZG5zLmZyP3BhcnQ9MgoKLS0gCmxpbnV4LXBoeSBtYWlsaW5nIGxpc3QKbGludXgtcGh5QGxp c3RzLmluZnJhZGVhZC5vcmcKaHR0cHM6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlz dGluZm8vbGludXgtcGh5Cg==