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 CAE8645FFA2; Fri, 28 Aug 2026 13:59: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=1787925561; cv=none; b=n67TVbuuPWkZ9/E9uwa8WyjA0VH7Q00UgKaehS0mCkuoqeaNY6N5OxR22VKU5SHeoHvPSdDu9eronxcwIdlsfk+SK8+YFxyKsfB9rR46akFhVQzdJ0UVowwgfk784pE9p3X7F34eIUc04gGPNixLuJpJPTKuD5s6/X9LzN2xu28= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787925561; c=relaxed/simple; bh=JYQYXZwCQjXKyjqNbVzdEdY2oNoW3mlTFi8sYb875hY=; h=From:Subject:To:Cc:In-Reply-To:References:Content-Type:Date: Message-Id; b=IzX9058r23XxkYFTagOEQtPYbEloByen6X7jiMfzQ7ujYKknxM1fDP9ky/TurCndNKzR8ebxHOdOFtn08Efpm8hJGzIz1guGq14+iAJU7nA2yY21lHJT8EHZpeBcQ4ypj2ctNc7qKjiB9ak2rr8AQCgtk5xu04EMbddIyhK58OE= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=afYFjGOK; 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="afYFjGOK" Received: by smtp.kernel.org (Postfix) with ESMTPSA id D4DF21F000E9; Fri, 28 Aug 2026 13:59:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1787925559; bh=TeannOBMhF9U7sNgKBJqR/xJ1ffND4mBh4aWV6lhAeA=; h=From:Subject:Reply-To:To:Cc:In-Reply-To:References:Date; b=afYFjGOKlE/BC+vf1tYFAc1ttChsRVSd/U625uUoMiQwZm5Agn9nrfloLdE7zmXDC JxSFYmazNdXodTzvX0dSiJ/P76hBgMpQopksbVpk8hWpVzSkn3o2J+nCA6rsxjr7Wc 1x9O+uY4lZc5tTgNuyy0kdZP2FHbNZGxTddZ8iryveowh14mHZ7iMSnorZIlpoUhwI V6z1JX7jQpU337CiGdbjzMJpVQWYepY6ScGjlNVhQKI3IFHukETGQaLEGzGwVmki3K dXk2H3nD8baUGybgAMfV6uHBiNnciMXnY8aQj3VMIkwhYTy0y1JJPyBoyewi66+ZgR 0sJy7RMZlhNTg== From: sashiko-bot@kernel.org Subject: Re: [PATCH v2 10/15] drm/bridge: starfive: Add JH7110 HDMI controller driver Reply-To: sashiko-reviews@lists.linux.dev To: "Michal Wilczynski" Cc: olteanv@gmail.com, conor+dt@kernel.org, linux-phy@lists.infradead.org, mfd@lists.linux.dev, devicetree@vger.kernel.org, lee@kernel.org, dri-devel@lists.freedesktop.org, neil.armstrong@linaro.org, robh@kernel.org, linux-clk@vger.kernel.org, vkoul@kernel.org In-Reply-To: <20260828-jh7110-clean-send-v2-10-331680c8b9d1@samsung.com> References: <20260828-jh7110-clean-send-v2-0-331680c8b9d1@samsung.com> <20260828-jh7110-clean-send-v2-10-331680c8b9d1@samsung.com> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Date: Fri, 28 Aug 2026 13:59:18 +0000 Message-Id: <20260828135918.D4DF21F000E9@smtp.kernel.org> Precedence: bulk X-Mailing-List: mfd@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: Thank you for your contribution! Sashiko AI review found 3 potential issue(= s) to consider: - [High] Naming collision for 'pclk' causes the generic driver to permanent= ly enable the pixel clock and breaks I2C/EDID reads. - [High] Manual teardown of clocks and reset in remove() and probe error pa= ths violates devres ordering, risking a kernel panic. - [Medium] PHY power state and pixel clock reference counts are leaked if t= he driver is unbound while active. -- commit c6a610527cc7d181c41335780cfb8a12665b7239 Author: Michal Wilczynski drm/bridge: starfive: Add JH7110 HDMI controller driver This commit adds the HDMI controller bridge driver for the StarFive JH7110, acting as a glue layer between the JH7110 HDMI subsystem and the generic Innosilicon HDMI bridge driver. It handles shared regmaps, manages clock hierarchies from voutcrg, and configures the PHY's pixel clock rate dynamic= ally. > diff --git a/drivers/gpu/drm/bridge/jh7110-inno-hdmi.c b/drivers/gpu/drm/= bridge/jh7110-inno-hdmi.c > new file mode 100644 > index 0000000000000..be865aa39e33f > --- /dev/null > +++ b/drivers/gpu/drm/bridge/jh7110-inno-hdmi.c [ ... ] > +static int starfive_inno_hdmi_controller_probe(struct platform_device *p= dev) > +{ > + struct device *dev =3D &pdev->dev; > + struct device *parent =3D dev->parent; > + struct stf_inno_hdmi_controller *ctrl; > + const struct inno_hdmi_plat_data *plat_data; > + struct regmap *regmap; > + struct inno_hdmi *inno; > + int ret; > + > + ctrl =3D devm_kzalloc(dev, sizeof(*ctrl), GFP_KERNEL); > + if (!ctrl) > + return -ENOMEM; > + > + ctrl->dev =3D dev; > + platform_set_drvdata(pdev, ctrl); > + > + /* Get the shared regmap from the parent */ > + regmap =3D dev_get_regmap(parent, NULL); > + if (!regmap) { > + dev_err(dev, "Failed to get parent regmap\n"); > + return -ENODEV; > + } > + > + ctrl->phy =3D devm_phy_get(dev, "hdmi-phy"); > + if (IS_ERR(ctrl->phy)) > + return dev_err_probe(dev, PTR_ERR(ctrl->phy), "Failed to get PHY\n"); > + > + ctrl->tx_rst =3D devm_reset_control_get_exclusive(dev, "hdmi_tx"); > + if (IS_ERR(ctrl->tx_rst)) > + return dev_err_probe(dev, PTR_ERR(ctrl->tx_rst), "failed to get tx res= et\n"); > + > + /* Populate the clock names this controller *consumes* */ > + ctrl->clks[CLK_SYS].id =3D "sys"; > + ctrl->clks[CLK_M].id =3D "mclk"; > + ctrl->clks[CLK_B].id =3D "bclk"; > + ctrl->clks[CLK_PCLK].id =3D "pclk"; /* Pixel clock *from* PHY */ [Severity: High] Does this naming collision for 'pclk' cause the generic driver to permanent= ly enable the pixel clock and break I2C/EDID reads? The wrapper driver maps the 'pclk' string ID to the dynamically-managed pix= el clock from the PHY. However, the generic driver inno_hdmi_probe() in drivers/gpu/drm/bridge/inno-hdmi.c expects 'pclk' to be the APB/peripheral clock and grabs it unconditionally: inno-hdmi.c:inno_hdmi_probe() { ... hdmi->pclk =3D devm_clk_get_enabled(hdmi->dev, "pclk"); ... } Because both query the same device tree node, the generic driver grabs the pixel clock and permanently enables it at probe time. Furthermore, inno_hdmi_init_hw() uses clk_get_rate(hdmi->pclk) at probe time to calculate the DDC I2C clock divider. Since the pixel clock rate isn't set until the .enable callback is invoked during modesetting, it will return 0 = or a default rate. This results in a 0 Hz DDC bus frequency, causing I2C timeo= uts and breaking EDID reading. > + > + ret =3D devm_clk_bulk_get(dev, CLK_CTRL_NUM, ctrl->clks); > + if (ret) > + return dev_err_probe(dev, ret, "Unable to get controller clocks\n"); > + > + /* pclk is enabled on demand during modeset */ > + ret =3D clk_bulk_prepare_enable(CLK_CTRL_NUM - 1, ctrl->clks); > + if (ret) > + return ret; > + > + ret =3D reset_control_deassert(ctrl->tx_rst); > + if (ret) { > + clk_bulk_disable_unprepare(CLK_CTRL_NUM - 1, ctrl->clks); > + return ret; > + } > + > + plat_data =3D of_device_get_match_data(dev); > + > + /* Hand off to the generic library to create the bridge. */ > + inno =3D inno_hdmi_probe(pdev, plat_data); > + if (IS_ERR(inno)) { > + reset_control_assert(ctrl->tx_rst); > + clk_bulk_disable_unprepare(CLK_CTRL_NUM - 1, ctrl->clks); [Severity: High] Can this manual teardown of clocks and reset violate devres ordering and ri= sk a kernel panic? The driver manually enables bus clocks and deasserts reset in probe before calling inno_hdmi_probe(). The generic inno_hdmi_probe() registers a shared interrupt handler (inno_hdmi_hardirq) via devm_request_threaded_irq(). In the probe error path here, and in starfive_inno_hdmi_controller_remove() below, the driver manually disables the clocks and asserts the reset. Becau= se the IRQ is managed by devres, it is not freed until after the probe error path finishes or the remove function returns. If a shared interrupt fires in the window between the manual clock disable and devres tearing down the IRQ, inno_hdmi_hardirq() will attempt to read the HDMI_STATUS register. Accessing registers with the APB clock disabled causes a bus hang. The driver should use devm_add_action_or_reset() to manage the clocks and reset safely. > + return PTR_ERR(inno); > + } > + > + return 0; > +} > + > +static void starfive_inno_hdmi_controller_remove(struct platform_device = *pdev) > +{ > + struct stf_inno_hdmi_controller *ctrl =3D platform_get_drvdata(pdev); > + > + reset_control_assert(ctrl->tx_rst); > + clk_bulk_disable_unprepare(CLK_CTRL_NUM - 1, ctrl->clks); > +} [Severity: Medium] Will this remove function leak the PHY power state and pixel clock reference counts if the driver is unbound while active? During modesetting, inno_hdmi_starfive_enable() dynamically prepares and enables the pclk and calls phy_power_on(), recording this in ctrl->enabled. If the driver is unbound while the display pipeline is active, this remove function executes but does not check ctrl->enabled. It omits the required phy_power_off() and clk_disable_unprepare() calls. While devres unwinds and drops the clock and PHY pointers, it does not reverse the dynamic power state or decrement the prepare/enable counts, leaving the hardware permanently on. --=20 Sashiko AI review =C2=B7 https://sashiko.dev/#/patchset/20260828-jh7110-cle= an-send-v2-0-331680c8b9d1@samsung.com?part=3D10 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 6475EC61DBD for ; Fri, 28 Aug 2026 13:59:22 +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=5zMxf4Pq1LafT1sakhj0E/fGqEMJKfo2X7U8USn1W7o=; b=KXcvxuGn2ZssYP p6nY4lJOt1H+adj4r6CeTwA1W8xTPy1c/vjjFNqWKdz0gHxpI7ZDSXPljvup0W4gfbZQjYwLhER9N MrHMrdrDOljjkpsf7MTOxaoBYwTcQ3lgQrxa9AiYnEAwTOKCF4+SgSTbxxZwXsMPXGQdieh2zrDGq r3D/BcTJ6pNoBKl6JKbwrrcntv3W1BuV+R2wNM1HwNXD1IFkwLaZnONog+ezuZ2otUZpoyuRX4r3x kVXYrSahMyQ1xIrp1Yls5EmOyaXtRvDRHIcSPn54aR1U3CceJrviX+I51Bib2EUUlNKgFz+6pGQY1 bQM6oK91pjXn8xzj6g2Q==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.99.1 #2 (Red Hat Linux)) id 1wzx73-00000005vcV-0HYJ; Fri, 28 Aug 2026 13:59:21 +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 1wzx72-00000005vcM-0f2v for linux-phy@lists.infradead.org; Fri, 28 Aug 2026 13:59:20 +0000 Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) by sea.source.kernel.org (Postfix) with ESMTP id 8D37440756; Fri, 28 Aug 2026 13:59:19 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id D4DF21F000E9; Fri, 28 Aug 2026 13:59:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1787925559; bh=TeannOBMhF9U7sNgKBJqR/xJ1ffND4mBh4aWV6lhAeA=; h=From:Subject:Reply-To:To:Cc:In-Reply-To:References:Date; b=afYFjGOKlE/BC+vf1tYFAc1ttChsRVSd/U625uUoMiQwZm5Agn9nrfloLdE7zmXDC JxSFYmazNdXodTzvX0dSiJ/P76hBgMpQopksbVpk8hWpVzSkn3o2J+nCA6rsxjr7Wc 1x9O+uY4lZc5tTgNuyy0kdZP2FHbNZGxTddZ8iryveowh14mHZ7iMSnorZIlpoUhwI V6z1JX7jQpU337CiGdbjzMJpVQWYepY6ScGjlNVhQKI3IFHukETGQaLEGzGwVmki3K dXk2H3nD8baUGybgAMfV6uHBiNnciMXnY8aQj3VMIkwhYTy0y1JJPyBoyewi66+ZgR 0sJy7RMZlhNTg== From: sashiko-bot@kernel.org Subject: Re: [PATCH v2 10/15] drm/bridge: starfive: Add JH7110 HDMI controller driver To: "Michal Wilczynski" Cc: olteanv@gmail.com, conor+dt@kernel.org, linux-phy@lists.infradead.org, mfd@lists.linux.dev, devicetree@vger.kernel.org, lee@kernel.org, dri-devel@lists.freedesktop.org, neil.armstrong@linaro.org, robh@kernel.org, linux-clk@vger.kernel.org, vkoul@kernel.org In-Reply-To: <20260828-jh7110-clean-send-v2-10-331680c8b9d1@samsung.com> References: <20260828-jh7110-clean-send-v2-0-331680c8b9d1@samsung.com> <20260828-jh7110-clean-send-v2-10-331680c8b9d1@samsung.com> Date: Fri, 28 Aug 2026 13:59:18 +0000 Message-Id: <20260828135918.D4DF21F000E9@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 MyBwb3RlbnRpYWwgaXNzdWUocykgdG8gY29uc2lkZXI6Ci0gW0hpZ2hdIE5hbWluZyBjb2xsaXNp b24gZm9yICdwY2xrJyBjYXVzZXMgdGhlIGdlbmVyaWMgZHJpdmVyIHRvIHBlcm1hbmVudGx5IGVu YWJsZSB0aGUgcGl4ZWwgY2xvY2sgYW5kIGJyZWFrcyBJMkMvRURJRCByZWFkcy4KLSBbSGlnaF0g TWFudWFsIHRlYXJkb3duIG9mIGNsb2NrcyBhbmQgcmVzZXQgaW4gcmVtb3ZlKCkgYW5kIHByb2Jl IGVycm9yIHBhdGhzIHZpb2xhdGVzIGRldnJlcyBvcmRlcmluZywgcmlza2luZyBhIGtlcm5lbCBw YW5pYy4KLSBbTWVkaXVtXSBQSFkgcG93ZXIgc3RhdGUgYW5kIHBpeGVsIGNsb2NrIHJlZmVyZW5j ZSBjb3VudHMgYXJlIGxlYWtlZCBpZiB0aGUgZHJpdmVyIGlzIHVuYm91bmQgd2hpbGUgYWN0aXZl LgotLQoKY29tbWl0IGM2YTYxMDUyN2NjN2QxODFjNDEzMzU3ODBjZmI4YTEyNjY1YjcyMzkKQXV0 aG9yOiBNaWNoYWwgV2lsY3p5bnNraSA8bS53aWxjenluc2tpQHNhbXN1bmcuY29tPgpkcm0vYnJp ZGdlOiBzdGFyZml2ZTogQWRkIEpINzExMCBIRE1JIGNvbnRyb2xsZXIgZHJpdmVyCgpUaGlzIGNv bW1pdCBhZGRzIHRoZSBIRE1JIGNvbnRyb2xsZXIgYnJpZGdlIGRyaXZlciBmb3IgdGhlIFN0YXJG aXZlIEpINzExMCwKYWN0aW5nIGFzIGEgZ2x1ZSBsYXllciBiZXR3ZWVuIHRoZSBKSDcxMTAgSERN SSBzdWJzeXN0ZW0gYW5kIHRoZSBnZW5lcmljCklubm9zaWxpY29uIEhETUkgYnJpZGdlIGRyaXZl ci4gSXQgaGFuZGxlcyBzaGFyZWQgcmVnbWFwcywgbWFuYWdlcyBjbG9jawpoaWVyYXJjaGllcyBm cm9tIHZvdXRjcmcsIGFuZCBjb25maWd1cmVzIHRoZSBQSFkncyBwaXhlbCBjbG9jayByYXRlIGR5 bmFtaWNhbGx5LgoKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9qaDcxMTAt aW5uby1oZG1pLmMgYi9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL2poNzExMC1pbm5vLWhkbWkuYwo+ IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMDAwMDAwMC4uYmU4NjVhYTM5ZTMz Zgo+IC0tLSAvZGV2L251bGwKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL2poNzExMC1p bm5vLWhkbWkuYwoKWyAuLi4gXQoKPiArc3RhdGljIGludCBzdGFyZml2ZV9pbm5vX2hkbWlfY29u dHJvbGxlcl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQo+ICt7Cj4gKwlzdHJ1 Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2Owo+ICsJc3RydWN0IGRldmljZSAqcGFyZW50ID0g ZGV2LT5wYXJlbnQ7Cj4gKwlzdHJ1Y3Qgc3RmX2lubm9faGRtaV9jb250cm9sbGVyICpjdHJsOwo+ ICsJY29uc3Qgc3RydWN0IGlubm9faGRtaV9wbGF0X2RhdGEgKnBsYXRfZGF0YTsKPiArCXN0cnVj dCByZWdtYXAgKnJlZ21hcDsKPiArCXN0cnVjdCBpbm5vX2hkbWkgKmlubm87Cj4gKwlpbnQgcmV0 Owo+ICsKPiArCWN0cmwgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmN0cmwpLCBHRlBfS0VS TkVMKTsKPiArCWlmICghY3RybCkKPiArCQlyZXR1cm4gLUVOT01FTTsKPiArCj4gKwljdHJsLT5k ZXYgPSBkZXY7Cj4gKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBjdHJsKTsKPiArCj4gKwkv KiBHZXQgdGhlIHNoYXJlZCByZWdtYXAgZnJvbSB0aGUgcGFyZW50ICovCj4gKwlyZWdtYXAgPSBk ZXZfZ2V0X3JlZ21hcChwYXJlbnQsIE5VTEwpOwo+ICsJaWYgKCFyZWdtYXApIHsKPiArCQlkZXZf ZXJyKGRldiwgIkZhaWxlZCB0byBnZXQgcGFyZW50IHJlZ21hcFxuIik7Cj4gKwkJcmV0dXJuIC1F Tk9ERVY7Cj4gKwl9Cj4gKwo+ICsJY3RybC0+cGh5ID0gZGV2bV9waHlfZ2V0KGRldiwgImhkbWkt cGh5Iik7Cj4gKwlpZiAoSVNfRVJSKGN0cmwtPnBoeSkpCj4gKwkJcmV0dXJuIGRldl9lcnJfcHJv YmUoZGV2LCBQVFJfRVJSKGN0cmwtPnBoeSksICJGYWlsZWQgdG8gZ2V0IFBIWVxuIik7Cj4gKwo+ ICsJY3RybC0+dHhfcnN0ID0gZGV2bV9yZXNldF9jb250cm9sX2dldF9leGNsdXNpdmUoZGV2LCAi aGRtaV90eCIpOwo+ICsJaWYgKElTX0VSUihjdHJsLT50eF9yc3QpKQo+ICsJCXJldHVybiBkZXZf ZXJyX3Byb2JlKGRldiwgUFRSX0VSUihjdHJsLT50eF9yc3QpLCAiZmFpbGVkIHRvIGdldCB0eCBy ZXNldFxuIik7Cj4gKwo+ICsJLyogUG9wdWxhdGUgdGhlIGNsb2NrIG5hbWVzIHRoaXMgY29udHJv bGxlciAqY29uc3VtZXMqICovCj4gKwljdHJsLT5jbGtzW0NMS19TWVNdLmlkID0gInN5cyI7Cj4g KwljdHJsLT5jbGtzW0NMS19NXS5pZCA9ICJtY2xrIjsKPiArCWN0cmwtPmNsa3NbQ0xLX0JdLmlk ID0gImJjbGsiOwo+ICsJY3RybC0+Y2xrc1tDTEtfUENMS10uaWQgPSAicGNsayI7IC8qIFBpeGVs IGNsb2NrICpmcm9tKiBQSFkgKi8KCltTZXZlcml0eTogSGlnaF0KRG9lcyB0aGlzIG5hbWluZyBj b2xsaXNpb24gZm9yICdwY2xrJyBjYXVzZSB0aGUgZ2VuZXJpYyBkcml2ZXIgdG8gcGVybWFuZW50 bHkKZW5hYmxlIHRoZSBwaXhlbCBjbG9jayBhbmQgYnJlYWsgSTJDL0VESUQgcmVhZHM/CgpUaGUg d3JhcHBlciBkcml2ZXIgbWFwcyB0aGUgJ3BjbGsnIHN0cmluZyBJRCB0byB0aGUgZHluYW1pY2Fs bHktbWFuYWdlZCBwaXhlbApjbG9jayBmcm9tIHRoZSBQSFkuIEhvd2V2ZXIsIHRoZSBnZW5lcmlj IGRyaXZlciBpbm5vX2hkbWlfcHJvYmUoKSBpbgpkcml2ZXJzL2dwdS9kcm0vYnJpZGdlL2lubm8t aGRtaS5jIGV4cGVjdHMgJ3BjbGsnIHRvIGJlIHRoZSBBUEIvcGVyaXBoZXJhbApjbG9jayBhbmQg Z3JhYnMgaXQgdW5jb25kaXRpb25hbGx5OgoKaW5uby1oZG1pLmM6aW5ub19oZG1pX3Byb2JlKCkg ewogICAgLi4uCiAgICBoZG1pLT5wY2xrID0gZGV2bV9jbGtfZ2V0X2VuYWJsZWQoaGRtaS0+ZGV2 LCAicGNsayIpOwogICAgLi4uCn0KCkJlY2F1c2UgYm90aCBxdWVyeSB0aGUgc2FtZSBkZXZpY2Ug dHJlZSBub2RlLCB0aGUgZ2VuZXJpYyBkcml2ZXIgZ3JhYnMgdGhlCnBpeGVsIGNsb2NrIGFuZCBw ZXJtYW5lbnRseSBlbmFibGVzIGl0IGF0IHByb2JlIHRpbWUuCgpGdXJ0aGVybW9yZSwgaW5ub19o ZG1pX2luaXRfaHcoKSB1c2VzIGNsa19nZXRfcmF0ZShoZG1pLT5wY2xrKSBhdCBwcm9iZSB0aW1l CnRvIGNhbGN1bGF0ZSB0aGUgRERDIEkyQyBjbG9jayBkaXZpZGVyLiBTaW5jZSB0aGUgcGl4ZWwg Y2xvY2sgcmF0ZSBpc24ndCBzZXQKdW50aWwgdGhlIC5lbmFibGUgY2FsbGJhY2sgaXMgaW52b2tl ZCBkdXJpbmcgbW9kZXNldHRpbmcsIGl0IHdpbGwgcmV0dXJuIDAgb3IKYSBkZWZhdWx0IHJhdGUu IFRoaXMgcmVzdWx0cyBpbiBhIDAgSHogRERDIGJ1cyBmcmVxdWVuY3ksIGNhdXNpbmcgSTJDIHRp bWVvdXRzCmFuZCBicmVha2luZyBFRElEIHJlYWRpbmcuCgo+ICsKPiArCXJldCA9IGRldm1fY2xr X2J1bGtfZ2V0KGRldiwgQ0xLX0NUUkxfTlVNLCBjdHJsLT5jbGtzKTsKPiArCWlmIChyZXQpCj4g KwkJcmV0dXJuIGRldl9lcnJfcHJvYmUoZGV2LCByZXQsICJVbmFibGUgdG8gZ2V0IGNvbnRyb2xs ZXIgY2xvY2tzXG4iKTsKPiArCj4gKwkvKiBwY2xrIGlzIGVuYWJsZWQgb24gZGVtYW5kIGR1cmlu ZyBtb2Rlc2V0ICovCj4gKwlyZXQgPSBjbGtfYnVsa19wcmVwYXJlX2VuYWJsZShDTEtfQ1RSTF9O VU0gLSAxLCBjdHJsLT5jbGtzKTsKPiArCWlmIChyZXQpCj4gKwkJcmV0dXJuIHJldDsKPiArCj4g KwlyZXQgPSByZXNldF9jb250cm9sX2RlYXNzZXJ0KGN0cmwtPnR4X3JzdCk7Cj4gKwlpZiAocmV0 KSB7Cj4gKwkJY2xrX2J1bGtfZGlzYWJsZV91bnByZXBhcmUoQ0xLX0NUUkxfTlVNIC0gMSwgY3Ry bC0+Y2xrcyk7Cj4gKwkJcmV0dXJuIHJldDsKPiArCX0KPiArCj4gKwlwbGF0X2RhdGEgPSBvZl9k ZXZpY2VfZ2V0X21hdGNoX2RhdGEoZGV2KTsKPiArCj4gKwkvKiBIYW5kIG9mZiB0byB0aGUgZ2Vu ZXJpYyBsaWJyYXJ5IHRvIGNyZWF0ZSB0aGUgYnJpZGdlLiAqLwo+ICsJaW5ubyA9IGlubm9faGRt aV9wcm9iZShwZGV2LCBwbGF0X2RhdGEpOwo+ICsJaWYgKElTX0VSUihpbm5vKSkgewo+ICsJCXJl c2V0X2NvbnRyb2xfYXNzZXJ0KGN0cmwtPnR4X3JzdCk7Cj4gKwkJY2xrX2J1bGtfZGlzYWJsZV91 bnByZXBhcmUoQ0xLX0NUUkxfTlVNIC0gMSwgY3RybC0+Y2xrcyk7CgpbU2V2ZXJpdHk6IEhpZ2hd CkNhbiB0aGlzIG1hbnVhbCB0ZWFyZG93biBvZiBjbG9ja3MgYW5kIHJlc2V0IHZpb2xhdGUgZGV2 cmVzIG9yZGVyaW5nIGFuZCByaXNrCmEga2VybmVsIHBhbmljPwoKVGhlIGRyaXZlciBtYW51YWxs eSBlbmFibGVzIGJ1cyBjbG9ja3MgYW5kIGRlYXNzZXJ0cyByZXNldCBpbiBwcm9iZSBiZWZvcmUK Y2FsbGluZyBpbm5vX2hkbWlfcHJvYmUoKS4gVGhlIGdlbmVyaWMgaW5ub19oZG1pX3Byb2JlKCkg cmVnaXN0ZXJzIGEgc2hhcmVkCmludGVycnVwdCBoYW5kbGVyIChpbm5vX2hkbWlfaGFyZGlycSkg dmlhIGRldm1fcmVxdWVzdF90aHJlYWRlZF9pcnEoKS4KCkluIHRoZSBwcm9iZSBlcnJvciBwYXRo IGhlcmUsIGFuZCBpbiBzdGFyZml2ZV9pbm5vX2hkbWlfY29udHJvbGxlcl9yZW1vdmUoKQpiZWxv dywgdGhlIGRyaXZlciBtYW51YWxseSBkaXNhYmxlcyB0aGUgY2xvY2tzIGFuZCBhc3NlcnRzIHRo ZSByZXNldC4gQmVjYXVzZQp0aGUgSVJRIGlzIG1hbmFnZWQgYnkgZGV2cmVzLCBpdCBpcyBub3Qg ZnJlZWQgdW50aWwgYWZ0ZXIgdGhlIHByb2JlIGVycm9yCnBhdGggZmluaXNoZXMgb3IgdGhlIHJl bW92ZSBmdW5jdGlvbiByZXR1cm5zLgoKSWYgYSBzaGFyZWQgaW50ZXJydXB0IGZpcmVzIGluIHRo ZSB3aW5kb3cgYmV0d2VlbiB0aGUgbWFudWFsIGNsb2NrIGRpc2FibGUKYW5kIGRldnJlcyB0ZWFy aW5nIGRvd24gdGhlIElSUSwgaW5ub19oZG1pX2hhcmRpcnEoKSB3aWxsIGF0dGVtcHQgdG8gcmVh ZAp0aGUgSERNSV9TVEFUVVMgcmVnaXN0ZXIuIEFjY2Vzc2luZyByZWdpc3RlcnMgd2l0aCB0aGUg QVBCIGNsb2NrIGRpc2FibGVkCmNhdXNlcyBhIGJ1cyBoYW5nLgoKVGhlIGRyaXZlciBzaG91bGQg dXNlIGRldm1fYWRkX2FjdGlvbl9vcl9yZXNldCgpIHRvIG1hbmFnZSB0aGUgY2xvY2tzIGFuZApy ZXNldCBzYWZlbHkuCgo+ICsJCXJldHVybiBQVFJfRVJSKGlubm8pOwo+ICsJfQo+ICsKPiArCXJl dHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBzdGFyZml2ZV9pbm5vX2hkbWlfY29udHJv bGxlcl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKPiArewo+ICsJc3RydWN0 IHN0Zl9pbm5vX2hkbWlfY29udHJvbGxlciAqY3RybCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBk ZXYpOwo+ICsKPiArCXJlc2V0X2NvbnRyb2xfYXNzZXJ0KGN0cmwtPnR4X3JzdCk7Cj4gKwljbGtf YnVsa19kaXNhYmxlX3VucHJlcGFyZShDTEtfQ1RSTF9OVU0gLSAxLCBjdHJsLT5jbGtzKTsKPiAr fQoKW1NldmVyaXR5OiBNZWRpdW1dCldpbGwgdGhpcyByZW1vdmUgZnVuY3Rpb24gbGVhayB0aGUg UEhZIHBvd2VyIHN0YXRlIGFuZCBwaXhlbCBjbG9jayByZWZlcmVuY2UKY291bnRzIGlmIHRoZSBk cml2ZXIgaXMgdW5ib3VuZCB3aGlsZSBhY3RpdmU/CgpEdXJpbmcgbW9kZXNldHRpbmcsIGlubm9f aGRtaV9zdGFyZml2ZV9lbmFibGUoKSBkeW5hbWljYWxseSBwcmVwYXJlcyBhbmQKZW5hYmxlcyB0 aGUgcGNsayBhbmQgY2FsbHMgcGh5X3Bvd2VyX29uKCksIHJlY29yZGluZyB0aGlzIGluIGN0cmwt PmVuYWJsZWQuCklmIHRoZSBkcml2ZXIgaXMgdW5ib3VuZCB3aGlsZSB0aGUgZGlzcGxheSBwaXBl bGluZSBpcyBhY3RpdmUsIHRoaXMgcmVtb3ZlCmZ1bmN0aW9uIGV4ZWN1dGVzIGJ1dCBkb2VzIG5v dCBjaGVjayBjdHJsLT5lbmFibGVkLgoKSXQgb21pdHMgdGhlIHJlcXVpcmVkIHBoeV9wb3dlcl9v ZmYoKSBhbmQgY2xrX2Rpc2FibGVfdW5wcmVwYXJlKCkgY2FsbHMuCldoaWxlIGRldnJlcyB1bndp bmRzIGFuZCBkcm9wcyB0aGUgY2xvY2sgYW5kIFBIWSBwb2ludGVycywgaXQgZG9lcyBub3QKcmV2 ZXJzZSB0aGUgZHluYW1pYyBwb3dlciBzdGF0ZSBvciBkZWNyZW1lbnQgdGhlIHByZXBhcmUvZW5h YmxlIGNvdW50cywKbGVhdmluZyB0aGUgaGFyZHdhcmUgcGVybWFuZW50bHkgb24uCgotLSAKU2Fz aGlrbyBBSSByZXZpZXcgwrcgaHR0cHM6Ly9zYXNoaWtvLmRldi8jL3BhdGNoc2V0LzIwMjYwODI4 LWpoNzExMC1jbGVhbi1zZW5kLXYyLTAtMzMxNjgwYzhiOWQxQHNhbXN1bmcuY29tP3BhcnQ9MTAK Ci0tIApsaW51eC1waHkgbWFpbGluZyBsaXN0CmxpbnV4LXBoeUBsaXN0cy5pbmZyYWRlYWQub3Jn Cmh0dHBzOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LXBoeQo=