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 805EB2882DE for ; Thu, 3 Sep 2026 02:45:40 +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=1788403541; cv=none; b=tTZAgRSey2ze+UCjdx9FuvvAXZdcQiNdbD026B8is3CwRbKviXH85KkXyIbhyuqvV7wvLbvq/DDED9YnoeViEcuQSbbcIqLDxsg1m2mq7NjBMLIQl8PIaOlAj52cNC+4bxiIsp6wa+/frwkMNpW1t2Ufxc3fo8aYbMJ0l5ydoIs= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788403541; c=relaxed/simple; bh=DANyefz9nmXgO2/GOwrwjEN7lnlD/QnXQYO4qrHyHe0=; h=From:Subject:To:Cc:In-Reply-To:References:Content-Type:Date: Message-Id; b=KzqHeuRZcEfJNjqLocPSclDtmseo7UGtTTthKWvQJH6O+3sBWOoiSF7mX3zjpunYOGAFL16uypB6ArOGxH1Shm0nqoUPH+7x9M6tv6zQXqKZu8ue5A+SmUBSt1OFco51dXGBUvVcfePsnY4kWHFFGB2944WnIz29S7e1qZan1DU= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=f3+sLfVO; 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="f3+sLfVO" Received: by smtp.kernel.org (Postfix) with ESMTPSA id ADB881F000E9; Thu, 3 Sep 2026 02:45:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1788403540; bh=YA5GOgzpiNZnpTsf0aCfkh7Ipzo73Chaf6cmrvc+4IE=; h=From:Subject:Reply-To:To:Cc:In-Reply-To:References:Date; b=f3+sLfVOQSYc9G89sF10GfU1tEo+Ly1C373GzlAU/UCUaZT85YkBWvzvlmUVHIEeE Nu3RkCUO9TUNEUYPgGYQeKqZmefPaBH7TXG7yN6Fld/E9j2mHESAAoXHsqcd+eFIG7 T1TTmMcmaY2BwIbv88DSjxJtYHEy7Db4PnmoCFaag06s0A4/Kv5ybZMo17/gNQqy9M jUvSH1Tg/EyF4LXqUNDEdJVCt7OC87vJ6e2G8Vm2XknoQnJjqyXZTqo1mUqfGMXrSe HF1+yMoO+X4I9SYg9mWgUscZkzAOBBzvcv9GT2U6CHif/OghRXVYzAtmRgvJ2uTlh8 V6woKfsHxQo3g== From: sashiko-bot@kernel.org Subject: Re: [PATCH v3 4/5] usb: cdns3: Add CIX Sky1 glue driver Reply-To: sashiko-reviews@lists.linux.dev To: "Hongliang Yang" Cc: vkoul@kernel.org, olteanv@gmail.com, neil.armstrong@linaro.org, linux-phy@lists.infradead.org, robh@kernel.org, conor+dt@kernel.org, devicetree@vger.kernel.org In-Reply-To: <20260903023521.2064986-5-hongliang.yang@cixtech.com> References: <503e87d9-3311-413a-98c0-e02a02c4a354@kernel.org> <20260903023521.2064986-1-hongliang.yang@cixtech.com> <20260903023521.2064986-5-hongliang.yang@cixtech.com> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Date: Thu, 03 Sep 2026 02:45:39 +0000 Message-Id: <20260903024539.ADB881F000E9@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] Double disable of clocks on probe error path causes reference coun= t underflows. - [High] Incorrect operation order and disable_irq() on a shared IRQ in cdn= sp_sky1_shutdown. - [High] Lockless access to cdns->host_dev during system suspend and shutdo= wn leads to a Use-After-Free. - [Medium] Incorrect PM wrapper macro used for the dev_pm_ops structure poi= nter. - [Medium] Fragile lookup of Device Tree child nodes for register addresses. - [Medium] Unconditional disabling of AXI and SOF clocks during suspend bre= aks Wake-on-USB. - [Low] Missing inclusion of . -- commit 5ad3503fa82899af71645298ce56167ad8a8a82d Author: Hongliang Yang Date: Thu Sep 3 02:35:20 2026 +0000 usb: cdns3: Add CIX Sky1 glue driver This patch adds a glue layer driver for the Cadence USBSSP controller integrated into the CIX Sky1 SoC. It enables the controller clocks, resets, and handles mode strap controls via the Sky1 S5 system controller. > --- /dev/null > +++ b/drivers/usb/cdns3/cdnsp-sky1.c [ ... ] > +static int sky1_handshake(void __iomem *ptr, u32 mask, u32 done, u64 tim= eout_us) > +{ > + u32 result; > + int ret; > + > + ret =3D readl_poll_timeout(ptr, result, > + (result & mask) =3D=3D done || result =3D=3D U32_MAX, > + 10, timeout_us); [Severity: Low] Could this fail to compile on certain architectures or configurations? The readl_poll_timeout macro is used here, but its defining header=20 is not included in the file. [ ... ] > +static int cdns_sky1_platform_suspend(struct device *dev, > + bool suspend, bool wakeup) > +{ > + struct cdns *cdns =3D dev_get_drvdata(dev); > + struct platform_device *xhci_dev =3D cdns->host_dev; [Severity: High] Is it safe to read cdns->host_dev here without holding cdns->mutex? If a concurrent OTG role switch triggers while the system executes this sus= pend callback, could this lead to a use-after-free when the host_dev is freed? [ ... ] > +static void __iomem *sky1_of_get_addr_by_name(struct device_node *parent= , const char *name) > +{ > + void __iomem *addr =3D NULL; > + struct device_node *node; > + int index; > + > + node =3D of_get_next_child(parent, NULL); > + if (!node) > + return NULL; > + > + index =3D of_property_match_string(node, "reg-names", name); [Severity: Medium] Could this lookup be fragile against changes in the device tree ordering? By passing NULL to of_get_next_child, it blindly assumes the target device = node is always the very first child. If the structure is ordered differently, this might abort the probe. [ ... ] > +err_quiesce: > + reset_control_assert(data->reset); > + reset_control_assert(data->preset); > + cdnsp_sky1_clk_disable_all(dev); [Severity: High] Could this cause a reference count underflow on the clocks? If cdnsp_sky1_clk_enable_all fails mid-initialization, it cleanly unwinds i= ts own prepared clocks. Returning the error then propagates up to the probe function which jumps to err_quiesce and unconditionally calls cdnsp_sky1_clk_disable_all, disabling the already unwound clocks a second time. [ ... ] > +static int cdnsp_sky1_system_suspend(struct device *dev) > +{ > + struct cdnsp_sky1 *data =3D dev_get_drvdata(dev); > + > + if (!data->wakeup) { > + reset_control_assert(data->reset); > + reset_control_assert(data->preset); > + } > + cdnsp_sky1_clk_disable_suspend(dev); > + return 0; > +} [Severity: Medium] Does unconditionally disabling the AXI and SOF clocks here break Wake-on-USB functionality? The comment earlier mentions that closing the axi and sof clock will result= in the inability to generate port status change interrupts, yet the disable function is called unconditionally, outside the !data->wakeup block. [ ... ] > +static void cdnsp_sky1_shutdown(struct platform_device *pdev) > +{ > + struct device *dev =3D &pdev->dev; > + struct cdnsp_sky1 *data =3D dev_get_drvdata(dev); > + struct device *cdns_dev =3D NULL; > + struct device *gadget_dev =3D NULL; > + struct cdns *cdns =3D NULL; [ ... ] > + if (cdns && cdns->host_dev) { > + struct usb_hcd *hcd =3D platform_get_drvdata(cdns->host_dev); [Severity: High] Similar to the suspend callback, is there a risk of a use-after-free here if an interleaving OTG role switch frees cdns->host_dev right before platform_get_drvdata is called, since this is accessed without cdns->mutex? > + > + if (hcd && hcd->irq > 0) { > + disable_irq(hcd->irq); > + synchronize_irq(hcd->irq); > + /* > + * Clear HCD_FLAG_HW_ACCESSIBLE before disable_irq. > + * This prevents usb_hcd_irq from calling xhci_irq > + * (which reads USBSTS) after clocks are disabled. > + */ > + clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); > + } > + } [Severity: High] Does calling disable_irq on a potentially shared IRQ line risk breaking oth= er devices on the same line? Additionally, the comment explicitly states that HCD_FLAG_HW_ACCESSIBLE must be cleared before disable_irq to prevent the interrupt handler from reading USBSTS after clocks are disabled. However, the implementation executes disable_irq and synchronize_irq before clear_bit. Could this out-of-order execution risk interrupt handlers firing inappropriately during teardown? [ ... ] > +static struct platform_driver cdnsp_sky1_driver =3D { > + .probe =3D cdnsp_sky1_probe, > + .remove =3D cdnsp_sky1_remove, > + .shutdown =3D cdnsp_sky1_shutdown, > + .driver =3D { > + .name =3D "cdnsp-sky1", > + .of_match_table =3D cdns_sky1_of_match, > + .pm =3D pm_sleep_ptr(&cdnsp_sky1_pm_ops), > + }, > +}; [Severity: Medium] Should the dev_pm_ops structure pointer use the pm_ptr macro instead of pm_sleep_ptr? If the kernel is built with CONFIG_PM=3Dy but CONFIG_PM_SLEEP=3Dn, using pm_sleep_ptr erroneously excludes the structure pointer, leading to dead co= de and bypassed power management. --=20 Sashiko AI review =C2=B7 https://sashiko.dev/#/patchset/20260903023521.2064= 986-1-hongliang.yang@cixtech.com?part=3D4 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 51684C61DD6 for ; Thu, 3 Sep 2026 02:45:42 +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=6DV+zoGt1SuvvMIk2G9jkFS3Fq1Cdjo6R6odoK5kShA=; b=mmlcp/Qxc9NGQ8 bfYYtmScErwN87xJjeORThoqUMJNZ+l3dRr+4qgLTlV5tSFJO32yTgUlivwiUhicCc1Ij5S5RfdNK GMwMl48bVegprR0ErqMDSeSpy+qh1Jl89l68jR9gHqZwBU9ng7JiJNBO32IcD09pSBLVBbTl6Uv0r AGMpGXMJm9B7dI6VLcT0j3E8mhzuUX3sOHKaS5pC+tDF7SZ0q1v10LfyI8bpVfcrtkahSYdeLfaeN +Afr2rxLRlEDIQRvPkEkxbAzacUJ8vAyu3vBJf4bsucxjf3R49J+uv0tnJnkqGoGYi+C/9n2Zpyfq nLI+BSTaD+1pUOt5GzLw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.99.1 #2 (Red Hat Linux)) id 1x1xSQ-0000000GF4z-01kT; Thu, 03 Sep 2026 02:45:42 +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 1x1xSP-0000000GF4p-1XRV for linux-phy@lists.infradead.org; Thu, 03 Sep 2026 02:45:41 +0000 Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) by sea.source.kernel.org (Postfix) with ESMTP id 489C6418A6; Thu, 3 Sep 2026 02:45:40 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id ADB881F000E9; Thu, 3 Sep 2026 02:45:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1788403540; bh=YA5GOgzpiNZnpTsf0aCfkh7Ipzo73Chaf6cmrvc+4IE=; h=From:Subject:Reply-To:To:Cc:In-Reply-To:References:Date; b=f3+sLfVOQSYc9G89sF10GfU1tEo+Ly1C373GzlAU/UCUaZT85YkBWvzvlmUVHIEeE Nu3RkCUO9TUNEUYPgGYQeKqZmefPaBH7TXG7yN6Fld/E9j2mHESAAoXHsqcd+eFIG7 T1TTmMcmaY2BwIbv88DSjxJtYHEy7Db4PnmoCFaag06s0A4/Kv5ybZMo17/gNQqy9M jUvSH1Tg/EyF4LXqUNDEdJVCt7OC87vJ6e2G8Vm2XknoQnJjqyXZTqo1mUqfGMXrSe HF1+yMoO+X4I9SYg9mWgUscZkzAOBBzvcv9GT2U6CHif/OghRXVYzAtmRgvJ2uTlh8 V6woKfsHxQo3g== From: sashiko-bot@kernel.org Subject: Re: [PATCH v3 4/5] usb: cdns3: Add CIX Sky1 glue driver To: "Hongliang Yang" Cc: vkoul@kernel.org, olteanv@gmail.com, neil.armstrong@linaro.org, linux-phy@lists.infradead.org, robh@kernel.org, conor+dt@kernel.org, devicetree@vger.kernel.org In-Reply-To: <20260903023521.2064986-5-hongliang.yang@cixtech.com> References: <503e87d9-3311-413a-98c0-e02a02c4a354@kernel.org> <20260903023521.2064986-1-hongliang.yang@cixtech.com> <20260903023521.2064986-5-hongliang.yang@cixtech.com> Date: Thu, 03 Sep 2026 02:45:39 +0000 Message-Id: <20260903024539.ADB881F000E9@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 NyBwb3RlbnRpYWwgaXNzdWUocykgdG8gY29uc2lkZXI6Ci0gW0hpZ2hdIERvdWJsZSBkaXNhYmxl IG9mIGNsb2NrcyBvbiBwcm9iZSBlcnJvciBwYXRoIGNhdXNlcyByZWZlcmVuY2UgY291bnQgdW5k ZXJmbG93cy4KLSBbSGlnaF0gSW5jb3JyZWN0IG9wZXJhdGlvbiBvcmRlciBhbmQgZGlzYWJsZV9p cnEoKSBvbiBhIHNoYXJlZCBJUlEgaW4gY2Ruc3Bfc2t5MV9zaHV0ZG93bi4KLSBbSGlnaF0gTG9j a2xlc3MgYWNjZXNzIHRvIGNkbnMtPmhvc3RfZGV2IGR1cmluZyBzeXN0ZW0gc3VzcGVuZCBhbmQg c2h1dGRvd24gbGVhZHMgdG8gYSBVc2UtQWZ0ZXItRnJlZS4KLSBbTWVkaXVtXSBJbmNvcnJlY3Qg UE0gd3JhcHBlciBtYWNybyB1c2VkIGZvciB0aGUgZGV2X3BtX29wcyBzdHJ1Y3R1cmUgcG9pbnRl ci4KLSBbTWVkaXVtXSBGcmFnaWxlIGxvb2t1cCBvZiBEZXZpY2UgVHJlZSBjaGlsZCBub2RlcyBm b3IgcmVnaXN0ZXIgYWRkcmVzc2VzLgotIFtNZWRpdW1dIFVuY29uZGl0aW9uYWwgZGlzYWJsaW5n IG9mIEFYSSBhbmQgU09GIGNsb2NrcyBkdXJpbmcgc3VzcGVuZCBicmVha3MgV2FrZS1vbi1VU0Iu Ci0gW0xvd10gTWlzc2luZyBpbmNsdXNpb24gb2YgPGxpbnV4L2lvcG9sbC5oPi4KLS0KCmNvbW1p dCA1YWQzNTAzZmE4Mjg5OWFmNzE2NDUyOThjZTU2MTY3YWQ4YThhODJkCkF1dGhvcjogSG9uZ2xp YW5nIFlhbmcgPGhvbmdsaWFuZy55YW5nQGNpeHRlY2guY29tPgpEYXRlOiAgIFRodSBTZXAgMyAw MjozNToyMCAyMDI2ICswMDAwCgogICAgdXNiOiBjZG5zMzogQWRkIENJWCBTa3kxIGdsdWUgZHJp dmVyCgpUaGlzIHBhdGNoIGFkZHMgYSBnbHVlIGxheWVyIGRyaXZlciBmb3IgdGhlIENhZGVuY2Ug VVNCU1NQIGNvbnRyb2xsZXIKaW50ZWdyYXRlZCBpbnRvIHRoZSBDSVggU2t5MSBTb0MuIEl0IGVu YWJsZXMgdGhlIGNvbnRyb2xsZXIgY2xvY2tzLCByZXNldHMsCmFuZCBoYW5kbGVzIG1vZGUgc3Ry YXAgY29udHJvbHMgdmlhIHRoZSBTa3kxIFM1IHN5c3RlbSBjb250cm9sbGVyLgoKPiAtLS0gL2Rl di9udWxsCj4gKysrIGIvZHJpdmVycy91c2IvY2RuczMvY2Ruc3Atc2t5MS5jClsgLi4uIF0KPiAr c3RhdGljIGludCBza3kxX2hhbmRzaGFrZSh2b2lkIF9faW9tZW0gKnB0ciwgdTMyIG1hc2ssIHUz MiBkb25lLCB1NjQgdGltZW91dF91cykKPiArewo+ICsJdTMyCXJlc3VsdDsKPiArCWludAlyZXQ7 Cj4gKwo+ICsJcmV0ID0gcmVhZGxfcG9sbF90aW1lb3V0KHB0ciwgcmVzdWx0LAo+ICsJCQkJIChy ZXN1bHQgJiBtYXNrKSA9PSBkb25lIHx8IHJlc3VsdCA9PSBVMzJfTUFYLAo+ICsJCQkJIDEwLCB0 aW1lb3V0X3VzKTsKCltTZXZlcml0eTogTG93XQpDb3VsZCB0aGlzIGZhaWwgdG8gY29tcGlsZSBv biBjZXJ0YWluIGFyY2hpdGVjdHVyZXMgb3IgY29uZmlndXJhdGlvbnM/CgpUaGUgcmVhZGxfcG9s bF90aW1lb3V0IG1hY3JvIGlzIHVzZWQgaGVyZSwgYnV0IGl0cyBkZWZpbmluZyBoZWFkZXIgCjxs aW51eC9pb3BvbGwuaD4gaXMgbm90IGluY2x1ZGVkIGluIHRoZSBmaWxlLgoKWyAuLi4gXQo+ICtz dGF0aWMgaW50IGNkbnNfc2t5MV9wbGF0Zm9ybV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwK PiArCQkJCSAgICAgIGJvb2wgc3VzcGVuZCwgYm9vbCB3YWtldXApCj4gK3sKPiArCXN0cnVjdCBj ZG5zICpjZG5zID0gZGV2X2dldF9kcnZkYXRhKGRldik7Cj4gKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2 aWNlICp4aGNpX2RldiA9IGNkbnMtPmhvc3RfZGV2OwoKW1NldmVyaXR5OiBIaWdoXQpJcyBpdCBz YWZlIHRvIHJlYWQgY2Rucy0+aG9zdF9kZXYgaGVyZSB3aXRob3V0IGhvbGRpbmcgY2Rucy0+bXV0 ZXg/CgpJZiBhIGNvbmN1cnJlbnQgT1RHIHJvbGUgc3dpdGNoIHRyaWdnZXJzIHdoaWxlIHRoZSBz eXN0ZW0gZXhlY3V0ZXMgdGhpcyBzdXNwZW5kCmNhbGxiYWNrLCBjb3VsZCB0aGlzIGxlYWQgdG8g YSB1c2UtYWZ0ZXItZnJlZSB3aGVuIHRoZSBob3N0X2RldiBpcyBmcmVlZD8KClsgLi4uIF0KPiAr c3RhdGljIHZvaWQgX19pb21lbSAqc2t5MV9vZl9nZXRfYWRkcl9ieV9uYW1lKHN0cnVjdCBkZXZp Y2Vfbm9kZSAqcGFyZW50LCBjb25zdCBjaGFyICpuYW1lKQo+ICt7Cj4gKwl2b2lkIF9faW9tZW0g KmFkZHIgPSBOVUxMOwo+ICsJc3RydWN0IGRldmljZV9ub2RlICpub2RlOwo+ICsJaW50IGluZGV4 Owo+ICsKPiArCW5vZGUgPSBvZl9nZXRfbmV4dF9jaGlsZChwYXJlbnQsIE5VTEwpOwo+ICsJaWYg KCFub2RlKQo+ICsJCXJldHVybiBOVUxMOwo+ICsKPiArCWluZGV4ID0gb2ZfcHJvcGVydHlfbWF0 Y2hfc3RyaW5nKG5vZGUsICJyZWctbmFtZXMiLCBuYW1lKTsKCltTZXZlcml0eTogTWVkaXVtXQpD b3VsZCB0aGlzIGxvb2t1cCBiZSBmcmFnaWxlIGFnYWluc3QgY2hhbmdlcyBpbiB0aGUgZGV2aWNl IHRyZWUgb3JkZXJpbmc/CgpCeSBwYXNzaW5nIE5VTEwgdG8gb2ZfZ2V0X25leHRfY2hpbGQsIGl0 IGJsaW5kbHkgYXNzdW1lcyB0aGUgdGFyZ2V0IGRldmljZSBub2RlCmlzIGFsd2F5cyB0aGUgdmVy eSBmaXJzdCBjaGlsZC4KCklmIHRoZSBzdHJ1Y3R1cmUgaXMgb3JkZXJlZCBkaWZmZXJlbnRseSwg dGhpcyBtaWdodCBhYm9ydCB0aGUgcHJvYmUuCgpbIC4uLiBdCj4gK2Vycl9xdWllc2NlOgo+ICsJ cmVzZXRfY29udHJvbF9hc3NlcnQoZGF0YS0+cmVzZXQpOwo+ICsJcmVzZXRfY29udHJvbF9hc3Nl cnQoZGF0YS0+cHJlc2V0KTsKPiArCWNkbnNwX3NreTFfY2xrX2Rpc2FibGVfYWxsKGRldik7Cgpb U2V2ZXJpdHk6IEhpZ2hdCkNvdWxkIHRoaXMgY2F1c2UgYSByZWZlcmVuY2UgY291bnQgdW5kZXJm bG93IG9uIHRoZSBjbG9ja3M/CgpJZiBjZG5zcF9za3kxX2Nsa19lbmFibGVfYWxsIGZhaWxzIG1p ZC1pbml0aWFsaXphdGlvbiwgaXQgY2xlYW5seSB1bndpbmRzIGl0cwpvd24gcHJlcGFyZWQgY2xv Y2tzLgoKUmV0dXJuaW5nIHRoZSBlcnJvciB0aGVuIHByb3BhZ2F0ZXMgdXAgdG8gdGhlIHByb2Jl IGZ1bmN0aW9uIHdoaWNoIGp1bXBzIHRvCmVycl9xdWllc2NlIGFuZCB1bmNvbmRpdGlvbmFsbHkg Y2FsbHMgY2Ruc3Bfc2t5MV9jbGtfZGlzYWJsZV9hbGwsIGRpc2FibGluZwp0aGUgYWxyZWFkeSB1 bndvdW5kIGNsb2NrcyBhIHNlY29uZCB0aW1lLgoKWyAuLi4gXQo+ICtzdGF0aWMgaW50IGNkbnNw X3NreTFfc3lzdGVtX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQo+ICt7Cj4gKwlzdHJ1Y3Qg Y2Ruc3Bfc2t5MSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwo+ICsKPiArCWlmICghZGF0 YS0+d2FrZXVwKSB7Cj4gKwkJcmVzZXRfY29udHJvbF9hc3NlcnQoZGF0YS0+cmVzZXQpOwo+ICsJ CXJlc2V0X2NvbnRyb2xfYXNzZXJ0KGRhdGEtPnByZXNldCk7Cj4gKwl9Cj4gKwljZG5zcF9za3kx X2Nsa19kaXNhYmxlX3N1c3BlbmQoZGV2KTsKPiArCXJldHVybiAwOwo+ICt9CgpbU2V2ZXJpdHk6 IE1lZGl1bV0KRG9lcyB1bmNvbmRpdGlvbmFsbHkgZGlzYWJsaW5nIHRoZSBBWEkgYW5kIFNPRiBj bG9ja3MgaGVyZSBicmVhayBXYWtlLW9uLVVTQgpmdW5jdGlvbmFsaXR5PwoKVGhlIGNvbW1lbnQg ZWFybGllciBtZW50aW9ucyB0aGF0IGNsb3NpbmcgdGhlIGF4aSBhbmQgc29mIGNsb2NrIHdpbGwg cmVzdWx0IGluCnRoZSBpbmFiaWxpdHkgdG8gZ2VuZXJhdGUgcG9ydCBzdGF0dXMgY2hhbmdlIGlu dGVycnVwdHMsIHlldCB0aGUgZGlzYWJsZQpmdW5jdGlvbiBpcyBjYWxsZWQgdW5jb25kaXRpb25h bGx5LCBvdXRzaWRlIHRoZSAhZGF0YS0+d2FrZXVwIGJsb2NrLgoKWyAuLi4gXQo+ICtzdGF0aWMg dm9pZCBjZG5zcF9za3kxX3NodXRkb3duKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4g K3sKPiArCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7Cj4gKwlzdHJ1Y3QgY2Ruc3Bf c2t5MSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwo+ICsJc3RydWN0IGRldmljZSAqY2Ru c19kZXYgPSBOVUxMOwo+ICsJc3RydWN0IGRldmljZSAqZ2FkZ2V0X2RldiA9IE5VTEw7Cj4gKwlz dHJ1Y3QgY2RucyAqY2RucyA9IE5VTEw7ClsgLi4uIF0KPiArCQlpZiAoY2RucyAmJiBjZG5zLT5o b3N0X2Rldikgewo+ICsJCQlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gcGxhdGZvcm1fZ2V0X2RydmRh dGEoY2Rucy0+aG9zdF9kZXYpOwoKW1NldmVyaXR5OiBIaWdoXQpTaW1pbGFyIHRvIHRoZSBzdXNw ZW5kIGNhbGxiYWNrLCBpcyB0aGVyZSBhIHJpc2sgb2YgYSB1c2UtYWZ0ZXItZnJlZSBoZXJlIGlm CmFuIGludGVybGVhdmluZyBPVEcgcm9sZSBzd2l0Y2ggZnJlZXMgY2Rucy0+aG9zdF9kZXYgcmln aHQgYmVmb3JlCnBsYXRmb3JtX2dldF9kcnZkYXRhIGlzIGNhbGxlZCwgc2luY2UgdGhpcyBpcyBh Y2Nlc3NlZCB3aXRob3V0IGNkbnMtPm11dGV4PwoKPiArCj4gKwkJCWlmIChoY2QgJiYgaGNkLT5p cnEgPiAwKSB7Cj4gKwkJCQlkaXNhYmxlX2lycShoY2QtPmlycSk7Cj4gKwkJCQlzeW5jaHJvbml6 ZV9pcnEoaGNkLT5pcnEpOwo+ICsJCQkJLyoKPiArCQkJCSAqIENsZWFyIEhDRF9GTEFHX0hXX0FD Q0VTU0lCTEUgYmVmb3JlIGRpc2FibGVfaXJxLgo+ICsJCQkJICogVGhpcyBwcmV2ZW50cyB1c2Jf aGNkX2lycSBmcm9tIGNhbGxpbmcgeGhjaV9pcnEKPiArCQkJCSAqICh3aGljaCByZWFkcyBVU0JT VFMpIGFmdGVyIGNsb2NrcyBhcmUgZGlzYWJsZWQuCj4gKwkJCQkgKi8KPiArCQkJCWNsZWFyX2Jp dChIQ0RfRkxBR19IV19BQ0NFU1NJQkxFLCAmaGNkLT5mbGFncyk7Cj4gKwkJCX0KPiArCQl9Cgpb U2V2ZXJpdHk6IEhpZ2hdCkRvZXMgY2FsbGluZyBkaXNhYmxlX2lycSBvbiBhIHBvdGVudGlhbGx5 IHNoYXJlZCBJUlEgbGluZSByaXNrIGJyZWFraW5nIG90aGVyCmRldmljZXMgb24gdGhlIHNhbWUg bGluZT8KCkFkZGl0aW9uYWxseSwgdGhlIGNvbW1lbnQgZXhwbGljaXRseSBzdGF0ZXMgdGhhdCBI Q0RfRkxBR19IV19BQ0NFU1NJQkxFIG11c3QKYmUgY2xlYXJlZCBiZWZvcmUgZGlzYWJsZV9pcnEg dG8gcHJldmVudCB0aGUgaW50ZXJydXB0IGhhbmRsZXIgZnJvbSByZWFkaW5nClVTQlNUUyBhZnRl ciBjbG9ja3MgYXJlIGRpc2FibGVkLgoKSG93ZXZlciwgdGhlIGltcGxlbWVudGF0aW9uIGV4ZWN1 dGVzIGRpc2FibGVfaXJxIGFuZCBzeW5jaHJvbml6ZV9pcnEgYmVmb3JlCmNsZWFyX2JpdC4KCkNv dWxkIHRoaXMgb3V0LW9mLW9yZGVyIGV4ZWN1dGlvbiByaXNrIGludGVycnVwdCBoYW5kbGVycyBm aXJpbmcKaW5hcHByb3ByaWF0ZWx5IGR1cmluZyB0ZWFyZG93bj8KClsgLi4uIF0KPiArc3RhdGlj IHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgY2Ruc3Bfc2t5MV9kcml2ZXIgPSB7Cj4gKwkucHJvYmUJ CT0gY2Ruc3Bfc2t5MV9wcm9iZSwKPiArCS5yZW1vdmUJCT0gY2Ruc3Bfc2t5MV9yZW1vdmUsCj4g Kwkuc2h1dGRvd24JPSBjZG5zcF9za3kxX3NodXRkb3duLAo+ICsJLmRyaXZlcgkJPSB7Cj4gKwkJ Lm5hbWUJPSAiY2Ruc3Atc2t5MSIsCj4gKwkJLm9mX21hdGNoX3RhYmxlCT0gY2Ruc19za3kxX29m X21hdGNoLAo+ICsJCS5wbQk9IHBtX3NsZWVwX3B0cigmY2Ruc3Bfc2t5MV9wbV9vcHMpLAo+ICsJ fSwKPiArfTsKCltTZXZlcml0eTogTWVkaXVtXQpTaG91bGQgdGhlIGRldl9wbV9vcHMgc3RydWN0 dXJlIHBvaW50ZXIgdXNlIHRoZSBwbV9wdHIgbWFjcm8gaW5zdGVhZCBvZgpwbV9zbGVlcF9wdHI/ CgpJZiB0aGUga2VybmVsIGlzIGJ1aWx0IHdpdGggQ09ORklHX1BNPXkgYnV0IENPTkZJR19QTV9T TEVFUD1uLCB1c2luZwpwbV9zbGVlcF9wdHIgZXJyb25lb3VzbHkgZXhjbHVkZXMgdGhlIHN0cnVj dHVyZSBwb2ludGVyLCBsZWFkaW5nIHRvIGRlYWQgY29kZQphbmQgYnlwYXNzZWQgcG93ZXIgbWFu YWdlbWVudC4KCi0tIApTYXNoaWtvIEFJIHJldmlldyDCtyBodHRwczovL3Nhc2hpa28uZGV2LyMv cGF0Y2hzZXQvMjAyNjA5MDMwMjM1MjEuMjA2NDk4Ni0xLWhvbmdsaWFuZy55YW5nQGNpeHRlY2gu Y29tP3BhcnQ9NAoKLS0gCmxpbnV4LXBoeSBtYWlsaW5nIGxpc3QKbGludXgtcGh5QGxpc3RzLmlu ZnJhZGVhZC5vcmcKaHR0cHM6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8v bGludXgtcGh5Cg==