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 8A7FACA6014 for ; Thu, 8 Oct 2026 16:33:08 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:MIME-Version: Content-Transfer-Encoding:Content-Type:References:In-Reply-To:Message-ID:Date :Cc:To:From:Subject:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=h9+Ef6Q6JTFr94bJHiwnUUDG+UwXDm8MEIg8h6D+/uI=; b=o0xLxp1puA5SbxPSCG3hAA0UYW 7eAw1fxQFQW3K3KxzRTdrcmWQQSKYRXIJmfi4jFpwzpRlkujmQkj/vHQNsQpFuM/chtzVhp0mUghA YknsrPfa1A9/5mUw5bwAEon423qxFvsR0OcnPQHnUBxnHlIDv0CmygdwL1uEAOI6GovLWj6mp3n9X +Xlq/XvX9NYN3LVZl5ttwvToh9V6AB4kwvCAn6xhHNUV+oYJgcqx3WuTPiVWyfl8RTMRsrdmoTDvc yIPdEA3PV68QImuvRAfqcYFaw6sdofYHIK7CUudZchk+jwesoZiSbii9x0XYs4+4cHDGRy3hF15hs f16/HYmg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.99.1 #2 (Red Hat Linux)) id 1xEr3F-00000004hPB-4Bvf; Thu, 08 Oct 2026 16:33:02 +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 1xEr3A-00000004hLJ-1ZPH; Thu, 08 Oct 2026 16:32:56 +0000 Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) by sea.source.kernel.org (Postfix) with ESMTP id 2326943CF6; Thu, 8 Oct 2026 16:32:56 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 0371F1F000FF; Thu, 8 Oct 2026 16:32:54 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1791477176; bh=h9+Ef6Q6JTFr94bJHiwnUUDG+UwXDm8MEIg8h6D+/uI=; h=Subject:From:To:Cc:Date:In-Reply-To:References; b=MU9lsv4uPt4NxzHEdirAJpSdabWb496cs2+YeVOAhGAanLH60UP096o9/qBPAOJbz shGFgZQJns+6/9O0uftnPka3NhUwcarc8pgDSd5aSeUP2csmNad5d7AwD7qzWJerTV w/jc6Pc/rirRJmTK6NLCECm0cr3IeVmHV5pTFRUkef4bZNuNW+oM2pjWwhMT65KkWg OqqpLqVx6m4GR8SIPw19mbTkP9uru3GpnaCm5P//Ru28e9Klgtn3k5n1kglHzU/i7D uNF7LhpWwwuXHy689+4YF5rx1pHEa7CnuqzbOxgRgJn0C1tBoc7/Uezhv8/d4wLkOS +XEnSLKbmUiKw== Subject: Re: [PATCH net-next v10 3/6] net: pcs: xpcs: add Rockchip RK3568 platform glue driver From: netdev-bot+sashiko@kernel.org To: coiaprant@gmail.com Cc: kuba@kernel.org, andrew+netdev@lunn.ch, davem@davemloft.net, edumazet@kernel.org, pabeni@redhat.com, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org, heiko@sntech.de, maxime.chevallier@bootlin.com, hkallweit1@gmail.com, linux@armlinux.org.uk, david.wu@rock-chips.com, netdev@vger.kernel.org, linux-rockchip@lists.infradead.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Date: Thu, 08 Oct 2026 16:32:54 +0000 Message-ID: <179147717456.434549.11670636132488819014@kernel.org> In-Reply-To: <20261005223011.1124347-4-coiaprant@gmail.com> References: <20261005223011.1124347-4-coiaprant@gmail.com> X-sashiko-severity: High Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 8bit MIME-Version: 1.0 X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Thank you for your contribution! Sashiko AI review found 4 potential issue(s) to consider. Critical: 0 · High: 1 · Medium: 2 · Low: 1 If you believe none of the issues are legitimate, please reply to each issue of Medium severity or higher and explain why the AI is wrong. If any of them are legitimate and you plan to respin, please let patchwork know by including "pw-bot: cr" as a separate line at the end of your reply (one such reply per series is enough). - [High] The system-suspend design described in the commit message and in the comment in xpcs_rk_system_suspend() does not work. - [Medium] xpcs_rk_create() (drivers/net/pcs/pcs-xpcs-rk.c:537-560) decides it is safe to use the supplier's devm-managed drvdata by doing… - [Medium] xpcs_rk_mdio_write_remapping() (drivers/net/pcs/pcs-xpcs- rk.c:141-147) sends writes to DW_VR_MII_AN_CTRL,… - [Low] Baseline decision: false positive at the end of the series. -- net: pcs: xpcs: add Rockchip RK3568 platform glue driver This adds a platform glue driver for the Synopsys DesignWare XPCS in RK3568. The driver exposes the XPCS through a virtual MDIO bus that maps accesses onto APB3 registers, with each port remapped to its own MMD. It also moves pcs-xpcs-plat.o into a new PCS_XPCS_PLATFORM module, exports xpcs_rk_create() for MAC drivers, and marks the XPCS as part of the wakeup path during system suspend to keep PD_PIPE powered for MAC WoL. Link: https://dl.radxa.com/rock3/docs/hw/datasheet/Rockchip%20RK3568%20TRM%20Part1%20V1.1-20210301.pdf (Page 59, CRU_CLKSEL_CON29) Link: https://dl.radxa.com/rock3/docs/hw/datasheet/Rockchip%20RK3568%20TRM%20Part2%20V1.1-20210301.pdf (Page 2078) > diff --git a/drivers/net/pcs/pcs-xpcs-rk.c b/drivers/net/pcs/pcs-xpcs-rk.c > new file mode 100644 > index 0000000000000..35ee980a759e5 > --- /dev/null > +++ b/drivers/net/pcs/pcs-xpcs-rk.c > @@ -0,0 +1,619 @@ [ ... ] > +static int xpcs_rk_mdio_write_remapping(int addr, int dev, int reg) > +{ > + switch (dev) { > + case MDIO_MMD_PMAPMD: > + return ROCKCHIP_MMD_PMAPMD; > + case MDIO_MMD_VEND2: > + break; > + default: > + return -ENXIO; > + } > + > + /* > + * These registers physically live only in MII (the management port). > + * Ports 1-3 expose read-only mirrors of these bits, so writes must > + * always target MII; the read path remaps per address and the > + * hardware redirects to the port's mirror. > + */ > + switch (reg) { > + case DW_VR_MII_AN_CTRL: > + case DW_VR_MII_AN_INTR_STS: > + case DW_VR_MII_EEE_MCTRL0: > + case DW_VR_MII_EEE_MCTRL1: > + case DW_VR_MII_DIG_CTRL2: > + return ROCKCHIP_MMD_MII; [Severity: Medium] Suppose two GMACs are routed to different ports, for example GMAC0 on mii@0 and GMAC1 on mii@1. The commit message says this is supported. Do these registers then become shared state between two independent dw_xpcs instances? Writes from port 1 go to port 0's MMD 7. GMAC1's xpcs would then program port 0's AN_CTRL and EEE_MCTRL0/1 and clear port 0's AN_INTR_STS. One example is in xpcs_get_state_c37_sgmii(): ret = xpcs_write(xpcs, MDIO_MMD_VEND2, DW_VR_MII_AN_INTR_STS, 0); Another is in xpcs_config_eee(): ret = xpcs_modify(xpcs, MDIO_MMD_VEND2, DW_VR_MII_EEE_MCTRL0, mask, Could this change GMAC0's PCS mode or LPI settings, or clear its AN-complete latch, without GMAC0's phylink instance knowing? No lock spans more than one dw_xpcs instance. Split read-then-write sequences on these registers can therefore race between the two phylink instances. An example is the AN_INTR_STS read followed by a write in xpcs_get_state_c37_1000basex(). There is a separate question if the per-port registers are not exact mirrors of MII0. In that case reads come from port N's register while writes go to MII0. Could port N's CL37_ANCMPLT_INTR latch then never be cleared? If so, every xpcs_get_state_c37_sgmii() poll with the link down would see an_complete and set BMCR_ANRESTART again. > + default: > + break; > + } [ ... ] > + /* > + * Establish the device link before reading the supplier's drvdata. > + * device_link_add() does not fail on a supplier that is unbinding: > + * it creates the link in DL_STATE_SUPPLIER_UNBIND. Whether the link > + * actually protects the drvdata depends on the supplier's state at > + * creation time. > + * > + * Check link->supplier->links.status right after creation. If the > + * supplier was DL_DEV_DRIVER_BOUND, the link is in > + * DL_STATE_CONSUMER_PROBE and device_links_unbind_consumers() will > + * wait for this probe to finish before unbinding the supplier, so > + * the drvdata stays valid for the rest of the function. Any other > + * state means the supplier is not usable yet; defer and retry. > + * > + * The link is released automatically when the consumer device is > + * destroyed (DL_FLAG_AUTOREMOVE_CONSUMER), so no explicit > + * device_link_remove() is needed on the failure paths. > + */ > + link = device_link_add(dev, &pdev->dev, DL_FLAG_AUTOREMOVE_CONSUMER); > + if (!link) { > + put_device(&pdev->dev); > + return ERR_PTR(-EPROBE_DEFER); > + } > + > + if (READ_ONCE(link->supplier->links.status) != DL_DEV_DRIVER_BOUND) { > + put_device(&pdev->dev); > + return ERR_PTR(-EPROBE_DEFER); > + } [Severity: Medium] Does a bound supplier here guarantee that the link itself is in DL_STATE_CONSUMER_PROBE? device_link_init_status() creates the link as DL_STATE_DORMANT when the supplier has no driver yet. fw_devlink doesn't parse pcs-handle, so the GMAC can probe while the XPCS probe is still deferred on the combphy, clocks or power domain: CPU0 (GMAC probe) CPU1 (XPCS probe) xpcs_rk_create() device_link_add() link is DL_STATE_DORMANT xpcs_rk_probe() completes device_links_driver_bound() link -> DL_STATE_AVAILABLE links.status -> DL_DEV_DRIVER_BOUND READ_ONCE(...links.status) passes pxpcs = platform_get_drvdata(pdev) xpcs_create_mdiodev(pxpcs->bus, ...) Now suppose the XPCS is unbound through sysfs or rmmod. device_links_unbind_consumers() waits only for CONSUMER_PROBE links: if (status == DL_STATE_CONSUMER_PROBE) { device_links_write_unlock(); wait_for_device_probe(); goto start; } WRITE_ONCE(link->status, DL_STATE_SUPPLIER_UNBIND); For an AVAILABLE link it just continues, and devres frees pxpcs and the mii_bus. Can CPU0 then dereference pxpcs->bus and pxpcs->eee_mult_fact after they have been freed? Even without an unbind, the GMAC probe would finish with this link still in DL_STATE_AVAILABLE. Wouldn't device_links_driver_bound() for the consumer then hit this check? WARN_ON(link->status != DL_STATE_CONSUMER_PROBE); Also, the comment says the link is released when the consumer device is destroyed. With DL_FLAG_AUTOREMOVE_CONSUMER, isn't it actually dropped when the consumer's driver unbinds or its probe fails? > + > + pxpcs = platform_get_drvdata(pdev); > + if (!pxpcs || !pxpcs->bus) { > + put_device(&pdev->dev); > + return ERR_PTR(-EPROBE_DEFER); > + } > + > + xpcs = xpcs_create_mdiodev(pxpcs->bus, (int)port); [ ... ] > +static int xpcs_rk_system_suspend(struct device *dev) > +{ > + /* > + * Keep the PD_PIPE power domain on during system suspend. > + * > + * PD_PIPE is shared with SATA/PCIe and would be powered down by > + * genpd once all its consumers are suspended, killing the SerDes > + * and breaking MAC WoL. Mark the XPCS as part of the wakeup path > + * so genpd keeps the domain on. Unconditional because the XPCS > + * core has no callback to convey the MAC WoL state. > + */ > + device_set_wakeup_path(dev); > + return 0; > +} [Severity: High] Does device_set_wakeup_path() actually keep PD_PIPE powered here? The commit message says: genpd then leaves the domain powered, because the Rockchip power domain driver sets GENPD_FLAG_ACTIVE_WAKEUP on PD_PIPE In drivers/pmdomain/rockchip/pm-domains.c, though, PD_PIPE is declared with active_wakeup set to false: [RK3568_PD_PIPE] = DOMAIN_RK3568("pipe", BIT(8), BIT(11), false, false), rockchip_pm_add_one_domain() sets the flag only when that field is true: pd->genpd.flags = GENPD_FLAG_PM_CLK | GENPD_FLAG_NO_STAY_ON; if (pd_info->active_wakeup) pd->genpd.flags |= GENPD_FLAG_ACTIVE_WAKEUP; genpd_finish_suspend() skips the power-off only when both conditions hold: if (device_awake_path(dev) && genpd_is_active_wakeup(genpd) && !device_out_band_wakeup(dev)) return 0; So the XPCS is counted in suspended_count and genpd_sync_power_off() runs. That function compares suspended_count with device_count and checks sd_count. It does not look at the rpm_always_on that probe set with dev_pm_genpd_rpm_always_on(dev, true). Once the other PD_PIPE consumers have suspended, would the domain be powered off during system suspend? That would leave SGMII WoL without a working PCS. If PD_PIPE does lose power, the XPCS register state is lost too. xpcs_rk_system_resume() below is an empty stub and does not redo the SerDes or XPCS bring-up. Does anything restore that state on resume? Two things are not confirmed here: whether phylink fully reprograms the XPCS on resume, and whether the combphy really sits in PD_PIPE. The rk356x combphy DT nodes have no power-domains property. > + > +static int xpcs_rk_system_resume(struct device *dev) > +{ > + return 0; > +} [ ... ] > diff --git a/include/linux/pcs/pcs-xpcs-rk.h b/include/linux/pcs/pcs-xpcs-rk.h > new file mode 100644 > index 0000000000000..28723d5bd75cc > --- /dev/null > +++ b/include/linux/pcs/pcs-xpcs-rk.h > @@ -0,0 +1,11 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > +#ifndef __LINUX_PCS_XPCS_ROCKCHIP_H > +#define __LINUX_PCS_XPCS_ROCKCHIP_H > + > +#include > +#include > +#include > + > +struct dw_xpcs *xpcs_rk_create(struct device *dev, struct device_node *np); [Severity: Low] This isn't a bug once the whole series is applied. In this patch on its own, though, xpcs_rk_create() has no caller, and the prototype has no stub for CONFIG_PCS_XPCS_ROCKCHIP=n. The later commit "net: stmmac: dwmac-rk: add SGMII support for RK3568" handles both points: - It adds rk_pcs_init(), which calls xpcs_rk_create(). - It wires rk_pcs_init() up through plat_dat->pcs_init, so stmmac_pcs_setup() never falls back to xpcs_create_fwnode() for this PCS. - It makes DWMAC_ROCKCHIP select PCS_XPCS_ROCKCHIP, so the missing stub can't cause a link failure for that user. Is a stub still wanted for future users that don't select the symbol? > + > +#endif /* __LINUX_PCS_XPCS_ROCKCHIP_H */ -- Sashiko AI review · https://netdev-ai.bots.linux.dev/sashiko/#/patchset/20261005223011.1124347-1-coiaprant%40gmail.com 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 825D0CA600C for ; Thu, 8 Oct 2026 16:33:05 +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:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Date:Cc:To:From:Subject:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=aRSkR53JLFuBrxSHkHJlAkbt6TrTTRt+8snPfxGzhlI=; b=sI98ykFEmvKGAF j8YAKRIbyA7lphTybMDcYEOiBw6uq0gmsCCRiLa3P6QsoMajYClZt29GcXGVD7fP8H7f/Ltl/AZPr gnI5fc0QdVHnwOpNRzxKLB9jSM+kZiL5Ab+oJKeVCjhGBb52WUj+8K9n1IABP1QLjI2np8HydMiao Kxq5fvXsYEwGip2g8noAJoBn/S+m7g8YRuWTV7Gmm1DUuA45bMzolu0hQZvxvXbCHocMaBoHjGqK+ sA5nmiEnYTK5RWOxoSbeqxfgBp/R2AGHDgQNAtlopIbz0UWsZlTJyRrdGRCqOub8TfmGnla3oIHLL S/IhSgFNqdMnMAm0UG0Q==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.99.1 #2 (Red Hat Linux)) id 1xEr3G-00000004hPZ-2GZx; Thu, 08 Oct 2026 16:33:02 +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 1xEr3A-00000004hLJ-1ZPH; Thu, 08 Oct 2026 16:32:56 +0000 Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) by sea.source.kernel.org (Postfix) with ESMTP id 2326943CF6; Thu, 8 Oct 2026 16:32:56 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 0371F1F000FF; Thu, 8 Oct 2026 16:32:54 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1791477176; bh=h9+Ef6Q6JTFr94bJHiwnUUDG+UwXDm8MEIg8h6D+/uI=; h=Subject:From:To:Cc:Date:In-Reply-To:References; b=MU9lsv4uPt4NxzHEdirAJpSdabWb496cs2+YeVOAhGAanLH60UP096o9/qBPAOJbz shGFgZQJns+6/9O0uftnPka3NhUwcarc8pgDSd5aSeUP2csmNad5d7AwD7qzWJerTV w/jc6Pc/rirRJmTK6NLCECm0cr3IeVmHV5pTFRUkef4bZNuNW+oM2pjWwhMT65KkWg OqqpLqVx6m4GR8SIPw19mbTkP9uru3GpnaCm5P//Ru28e9Klgtn3k5n1kglHzU/i7D uNF7LhpWwwuXHy689+4YF5rx1pHEa7CnuqzbOxgRgJn0C1tBoc7/Uezhv8/d4wLkOS +XEnSLKbmUiKw== Subject: Re: [PATCH net-next v10 3/6] net: pcs: xpcs: add Rockchip RK3568 platform glue driver From: netdev-bot+sashiko@kernel.org To: coiaprant@gmail.com Cc: kuba@kernel.org, andrew+netdev@lunn.ch, davem@davemloft.net, edumazet@kernel.org, pabeni@redhat.com, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org, heiko@sntech.de, maxime.chevallier@bootlin.com, hkallweit1@gmail.com, linux@armlinux.org.uk, david.wu@rock-chips.com, netdev@vger.kernel.org, linux-rockchip@lists.infradead.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Date: Thu, 08 Oct 2026 16:32:54 +0000 Message-ID: <179147717456.434549.11670636132488819014@kernel.org> In-Reply-To: <20261005223011.1124347-4-coiaprant@gmail.com> References: <20261005223011.1124347-4-coiaprant@gmail.com> X-sashiko-severity: High MIME-Version: 1.0 X-BeenThere: linux-rockchip@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Upstream kernel work for Rockchip platforms List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "Linux-rockchip" Errors-To: linux-rockchip-bounces+linux-rockchip=archiver.kernel.org@lists.infradead.org VGhhbmsgeW91IGZvciB5b3VyIGNvbnRyaWJ1dGlvbiEgU2FzaGlrbyBBSSByZXZpZXcgZm91bmQg NCBwb3RlbnRpYWwKaXNzdWUocykgdG8gY29uc2lkZXIuCgpDcml0aWNhbDogMCDCtyBIaWdoOiAx IMK3IE1lZGl1bTogMiDCtyBMb3c6IDEKCklmIHlvdSBiZWxpZXZlIG5vbmUgb2YgdGhlIGlzc3Vl cyBhcmUgbGVnaXRpbWF0ZSwgcGxlYXNlIHJlcGx5IHRvIGVhY2gKaXNzdWUgb2YgTWVkaXVtIHNl dmVyaXR5IG9yIGhpZ2hlciBhbmQgZXhwbGFpbiB3aHkgdGhlIEFJIGlzIHdyb25nLgpJZiBhbnkg b2YgdGhlbSBhcmUgbGVnaXRpbWF0ZSBhbmQgeW91IHBsYW4gdG8gcmVzcGluLCBwbGVhc2UgbGV0 IHBhdGNod29yawprbm93IGJ5IGluY2x1ZGluZyAicHctYm90OiBjciIgYXMgYSBzZXBhcmF0ZSBs aW5lIGF0IHRoZSBlbmQgb2YgeW91ciByZXBseQoob25lIHN1Y2ggcmVwbHkgcGVyIHNlcmllcyBp cyBlbm91Z2gpLgoKLSBbSGlnaF0gVGhlIHN5c3RlbS1zdXNwZW5kIGRlc2lnbiBkZXNjcmliZWQg aW4gdGhlIGNvbW1pdCBtZXNzYWdlIGFuZCBpbgogIHRoZSBjb21tZW50IGluIHhwY3Nfcmtfc3lz dGVtX3N1c3BlbmQoKSBkb2VzIG5vdCB3b3JrLgotIFtNZWRpdW1dIHhwY3NfcmtfY3JlYXRlKCkg KGRyaXZlcnMvbmV0L3Bjcy9wY3MteHBjcy1yay5jOjUzNy01NjApCiAgZGVjaWRlcyBpdCBpcyBz YWZlIHRvIHVzZSB0aGUgc3VwcGxpZXIncyBkZXZtLW1hbmFnZWQgZHJ2ZGF0YSBieSBkb2luZ+KA pgotIFtNZWRpdW1dIHhwY3NfcmtfbWRpb193cml0ZV9yZW1hcHBpbmcoKSAoZHJpdmVycy9uZXQv cGNzL3Bjcy14cGNzLQogIHJrLmM6MTQxLTE0Nykgc2VuZHMgd3JpdGVzIHRvIERXX1ZSX01JSV9B Tl9DVFJMLOKApgotIFtMb3ddIEJhc2VsaW5lIGRlY2lzaW9uOiBmYWxzZSBwb3NpdGl2ZSBhdCB0 aGUgZW5kIG9mIHRoZSBzZXJpZXMuCgotLQoKbmV0OiBwY3M6IHhwY3M6IGFkZCBSb2NrY2hpcCBS SzM1NjggcGxhdGZvcm0gZ2x1ZSBkcml2ZXIKClRoaXMgYWRkcyBhIHBsYXRmb3JtIGdsdWUgZHJp dmVyIGZvciB0aGUgU3lub3BzeXMgRGVzaWduV2FyZSBYUENTIGluClJLMzU2OC4gVGhlIGRyaXZl ciBleHBvc2VzIHRoZSBYUENTIHRocm91Z2ggYSB2aXJ0dWFsIE1ESU8gYnVzIHRoYXQgbWFwcwph Y2Nlc3NlcyBvbnRvIEFQQjMgcmVnaXN0ZXJzLCB3aXRoIGVhY2ggcG9ydCByZW1hcHBlZCB0byBp dHMgb3duIE1NRC4gSXQKYWxzbyBtb3ZlcyBwY3MteHBjcy1wbGF0Lm8gaW50byBhIG5ldyBQQ1Nf WFBDU19QTEFURk9STSBtb2R1bGUsIGV4cG9ydHMKeHBjc19ya19jcmVhdGUoKSBmb3IgTUFDIGRy aXZlcnMsIGFuZCBtYXJrcyB0aGUgWFBDUyBhcyBwYXJ0IG9mIHRoZQp3YWtldXAgcGF0aCBkdXJp bmcgc3lzdGVtIHN1c3BlbmQgdG8ga2VlcCBQRF9QSVBFIHBvd2VyZWQgZm9yIE1BQyBXb0wuCgpM aW5rOiBodHRwczovL2RsLnJhZHhhLmNvbS9yb2NrMy9kb2NzL2h3L2RhdGFzaGVldC9Sb2NrY2hp cCUyMFJLMzU2OCUyMFRSTSUyMFBhcnQxJTIwVjEuMS0yMDIxMDMwMS5wZGYgKFBhZ2UgNTksIENS VV9DTEtTRUxfQ09OMjkpCkxpbms6IGh0dHBzOi8vZGwucmFkeGEuY29tL3JvY2szL2RvY3MvaHcv ZGF0YXNoZWV0L1JvY2tjaGlwJTIwUkszNTY4JTIwVFJNJTIwUGFydDIlMjBWMS4xLTIwMjEwMzAx LnBkZiAoUGFnZSAyMDc4KQoKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGNzL3Bjcy14cGNz LXJrLmMgYi9kcml2ZXJzL25ldC9wY3MvcGNzLXhwY3MtcmsuYwo+IG5ldyBmaWxlIG1vZGUgMTAw NjQ0Cj4gaW5kZXggMDAwMDAwMDAwMDAwMC4uMzVlZTk4MGE3NTllNQo+IC0tLSAvZGV2L251bGwK PiArKysgYi9kcml2ZXJzL25ldC9wY3MvcGNzLXhwY3MtcmsuYwo+IEBAIC0wLDAgKzEsNjE5IEBA CgpbIC4uLiBdCgo+ICtzdGF0aWMgaW50IHhwY3NfcmtfbWRpb193cml0ZV9yZW1hcHBpbmcoaW50 IGFkZHIsIGludCBkZXYsIGludCByZWcpCj4gK3sKPiArCXN3aXRjaCAoZGV2KSB7Cj4gKwljYXNl IE1ESU9fTU1EX1BNQVBNRDoKPiArCQlyZXR1cm4gUk9DS0NISVBfTU1EX1BNQVBNRDsKPiArCWNh c2UgTURJT19NTURfVkVORDI6Cj4gKwkJYnJlYWs7Cj4gKwlkZWZhdWx0Ogo+ICsJCXJldHVybiAt RU5YSU87Cj4gKwl9Cj4gKwo+ICsJLyoKPiArCSAqIFRoZXNlIHJlZ2lzdGVycyBwaHlzaWNhbGx5 IGxpdmUgb25seSBpbiBNSUkgKHRoZSBtYW5hZ2VtZW50IHBvcnQpLgo+ICsJICogUG9ydHMgMS0z IGV4cG9zZSByZWFkLW9ubHkgbWlycm9ycyBvZiB0aGVzZSBiaXRzLCBzbyB3cml0ZXMgbXVzdAo+ ICsJICogYWx3YXlzIHRhcmdldCBNSUk7IHRoZSByZWFkIHBhdGggcmVtYXBzIHBlciBhZGRyZXNz IGFuZCB0aGUKPiArCSAqIGhhcmR3YXJlIHJlZGlyZWN0cyB0byB0aGUgcG9ydCdzIG1pcnJvci4K PiArCSAqLwo+ICsJc3dpdGNoIChyZWcpIHsKPiArCWNhc2UgRFdfVlJfTUlJX0FOX0NUUkw6Cj4g KwljYXNlIERXX1ZSX01JSV9BTl9JTlRSX1NUUzoKPiArCWNhc2UgRFdfVlJfTUlJX0VFRV9NQ1RS TDA6Cj4gKwljYXNlIERXX1ZSX01JSV9FRUVfTUNUUkwxOgo+ICsJY2FzZSBEV19WUl9NSUlfRElH X0NUUkwyOgo+ICsJCXJldHVybiBST0NLQ0hJUF9NTURfTUlJOwoKW1NldmVyaXR5OiBNZWRpdW1d CgpTdXBwb3NlIHR3byBHTUFDcyBhcmUgcm91dGVkIHRvIGRpZmZlcmVudCBwb3J0cywgZm9yIGV4 YW1wbGUgR01BQzAgb24KbWlpQDAgYW5kIEdNQUMxIG9uIG1paUAxLiBUaGUgY29tbWl0IG1lc3Nh Z2Ugc2F5cyB0aGlzIGlzIHN1cHBvcnRlZC4KRG8gdGhlc2UgcmVnaXN0ZXJzIHRoZW4gYmVjb21l IHNoYXJlZCBzdGF0ZSBiZXR3ZWVuIHR3byBpbmRlcGVuZGVudApkd194cGNzIGluc3RhbmNlcz8K CldyaXRlcyBmcm9tIHBvcnQgMSBnbyB0byBwb3J0IDAncyBNTUQgNy4gR01BQzEncyB4cGNzIHdv dWxkIHRoZW4KcHJvZ3JhbSBwb3J0IDAncyBBTl9DVFJMIGFuZCBFRUVfTUNUUkwwLzEgYW5kIGNs ZWFyIHBvcnQgMCdzCkFOX0lOVFJfU1RTLiBPbmUgZXhhbXBsZSBpcyBpbiB4cGNzX2dldF9zdGF0 ZV9jMzdfc2dtaWkoKToKCiAgICByZXQgPSB4cGNzX3dyaXRlKHhwY3MsIE1ESU9fTU1EX1ZFTkQy LCBEV19WUl9NSUlfQU5fSU5UUl9TVFMsIDApOwoKQW5vdGhlciBpcyBpbiB4cGNzX2NvbmZpZ19l ZWUoKToKCiAgICByZXQgPSB4cGNzX21vZGlmeSh4cGNzLCBNRElPX01NRF9WRU5EMiwgRFdfVlJf TUlJX0VFRV9NQ1RSTDAsIG1hc2ssCgpDb3VsZCB0aGlzIGNoYW5nZSBHTUFDMCdzIFBDUyBtb2Rl IG9yIExQSSBzZXR0aW5ncywgb3IgY2xlYXIgaXRzCkFOLWNvbXBsZXRlIGxhdGNoLCB3aXRob3V0 IEdNQUMwJ3MgcGh5bGluayBpbnN0YW5jZSBrbm93aW5nPwoKTm8gbG9jayBzcGFucyBtb3JlIHRo YW4gb25lIGR3X3hwY3MgaW5zdGFuY2UuIFNwbGl0IHJlYWQtdGhlbi13cml0ZQpzZXF1ZW5jZXMg b24gdGhlc2UgcmVnaXN0ZXJzIGNhbiB0aGVyZWZvcmUgcmFjZSBiZXR3ZWVuIHRoZSB0d28KcGh5 bGluayBpbnN0YW5jZXMuIEFuIGV4YW1wbGUgaXMgdGhlIEFOX0lOVFJfU1RTIHJlYWQgZm9sbG93 ZWQgYnkgYQp3cml0ZSBpbiB4cGNzX2dldF9zdGF0ZV9jMzdfMTAwMGJhc2V4KCkuCgpUaGVyZSBp cyBhIHNlcGFyYXRlIHF1ZXN0aW9uIGlmIHRoZSBwZXItcG9ydCByZWdpc3RlcnMgYXJlIG5vdCBl eGFjdAptaXJyb3JzIG9mIE1JSTAuIEluIHRoYXQgY2FzZSByZWFkcyBjb21lIGZyb20gcG9ydCBO J3MgcmVnaXN0ZXIgd2hpbGUKd3JpdGVzIGdvIHRvIE1JSTAuIENvdWxkIHBvcnQgTidzIENMMzdf QU5DTVBMVF9JTlRSIGxhdGNoIHRoZW4gbmV2ZXIgYmUKY2xlYXJlZD8gSWYgc28sIGV2ZXJ5IHhw Y3NfZ2V0X3N0YXRlX2MzN19zZ21paSgpIHBvbGwgd2l0aCB0aGUgbGluayBkb3duCndvdWxkIHNl ZSBhbl9jb21wbGV0ZSBhbmQgc2V0IEJNQ1JfQU5SRVNUQVJUIGFnYWluLgoKPiArCWRlZmF1bHQ6 Cj4gKwkJYnJlYWs7Cj4gKwl9CgpbIC4uLiBdCgo+ICsJLyoKPiArCSAqIEVzdGFibGlzaCB0aGUg ZGV2aWNlIGxpbmsgYmVmb3JlIHJlYWRpbmcgdGhlIHN1cHBsaWVyJ3MgZHJ2ZGF0YS4KPiArCSAq IGRldmljZV9saW5rX2FkZCgpIGRvZXMgbm90IGZhaWwgb24gYSBzdXBwbGllciB0aGF0IGlzIHVu YmluZGluZzoKPiArCSAqIGl0IGNyZWF0ZXMgdGhlIGxpbmsgaW4gRExfU1RBVEVfU1VQUExJRVJf VU5CSU5ELiBXaGV0aGVyIHRoZSBsaW5rCj4gKwkgKiBhY3R1YWxseSBwcm90ZWN0cyB0aGUgZHJ2 ZGF0YSBkZXBlbmRzIG9uIHRoZSBzdXBwbGllcidzIHN0YXRlIGF0Cj4gKwkgKiBjcmVhdGlvbiB0 aW1lLgo+ICsJICoKPiArCSAqIENoZWNrIGxpbmstPnN1cHBsaWVyLT5saW5rcy5zdGF0dXMgcmln aHQgYWZ0ZXIgY3JlYXRpb24uIElmIHRoZQo+ICsJICogc3VwcGxpZXIgd2FzIERMX0RFVl9EUklW RVJfQk9VTkQsIHRoZSBsaW5rIGlzIGluCj4gKwkgKiBETF9TVEFURV9DT05TVU1FUl9QUk9CRSBh bmQgZGV2aWNlX2xpbmtzX3VuYmluZF9jb25zdW1lcnMoKSB3aWxsCj4gKwkgKiB3YWl0IGZvciB0 aGlzIHByb2JlIHRvIGZpbmlzaCBiZWZvcmUgdW5iaW5kaW5nIHRoZSBzdXBwbGllciwgc28KPiAr CSAqIHRoZSBkcnZkYXRhIHN0YXlzIHZhbGlkIGZvciB0aGUgcmVzdCBvZiB0aGUgZnVuY3Rpb24u IEFueSBvdGhlcgo+ICsJICogc3RhdGUgbWVhbnMgdGhlIHN1cHBsaWVyIGlzIG5vdCB1c2FibGUg eWV0OyBkZWZlciBhbmQgcmV0cnkuCj4gKwkgKgo+ICsJICogVGhlIGxpbmsgaXMgcmVsZWFzZWQg YXV0b21hdGljYWxseSB3aGVuIHRoZSBjb25zdW1lciBkZXZpY2UgaXMKPiArCSAqIGRlc3Ryb3ll ZCAoRExfRkxBR19BVVRPUkVNT1ZFX0NPTlNVTUVSKSwgc28gbm8gZXhwbGljaXQKPiArCSAqIGRl dmljZV9saW5rX3JlbW92ZSgpIGlzIG5lZWRlZCBvbiB0aGUgZmFpbHVyZSBwYXRocy4KPiArCSAq Lwo+ICsJbGluayA9IGRldmljZV9saW5rX2FkZChkZXYsICZwZGV2LT5kZXYsIERMX0ZMQUdfQVVU T1JFTU9WRV9DT05TVU1FUik7Cj4gKwlpZiAoIWxpbmspIHsKPiArCQlwdXRfZGV2aWNlKCZwZGV2 LT5kZXYpOwo+ICsJCXJldHVybiBFUlJfUFRSKC1FUFJPQkVfREVGRVIpOwo+ICsJfQo+ICsKPiAr CWlmIChSRUFEX09OQ0UobGluay0+c3VwcGxpZXItPmxpbmtzLnN0YXR1cykgIT0gRExfREVWX0RS SVZFUl9CT1VORCkgewo+ICsJCXB1dF9kZXZpY2UoJnBkZXYtPmRldik7Cj4gKwkJcmV0dXJuIEVS Ul9QVFIoLUVQUk9CRV9ERUZFUik7Cj4gKwl9CgpbU2V2ZXJpdHk6IE1lZGl1bV0KCkRvZXMgYSBi b3VuZCBzdXBwbGllciBoZXJlIGd1YXJhbnRlZSB0aGF0IHRoZSBsaW5rIGl0c2VsZiBpcyBpbgpE TF9TVEFURV9DT05TVU1FUl9QUk9CRT8KCmRldmljZV9saW5rX2luaXRfc3RhdHVzKCkgY3JlYXRl cyB0aGUgbGluayBhcyBETF9TVEFURV9ET1JNQU5UIHdoZW4gdGhlCnN1cHBsaWVyIGhhcyBubyBk cml2ZXIgeWV0LiBmd19kZXZsaW5rIGRvZXNuJ3QgcGFyc2UgcGNzLWhhbmRsZSwgc28gdGhlCkdN QUMgY2FuIHByb2JlIHdoaWxlIHRoZSBYUENTIHByb2JlIGlzIHN0aWxsIGRlZmVycmVkIG9uIHRo ZSBjb21icGh5LApjbG9ja3Mgb3IgcG93ZXIgZG9tYWluOgoKQ1BVMCAoR01BQyBwcm9iZSkgICAg ICAgICAgICAgICAgIENQVTEgKFhQQ1MgcHJvYmUpCnhwY3NfcmtfY3JlYXRlKCkKICBkZXZpY2Vf bGlua19hZGQoKQogICAgbGluayBpcyBETF9TVEFURV9ET1JNQU5UCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICB4cGNzX3JrX3Byb2JlKCkgY29tcGxldGVzCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBkZXZpY2VfbGlua3NfZHJpdmVyX2JvdW5kKCkKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluayAtPiBETF9TVEFURV9BVkFJTEFCTEUKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua3Muc3RhdHVzIC0+IERMX0RFVl9E UklWRVJfQk9VTkQKICBSRUFEX09OQ0UoLi4ubGlua3Muc3RhdHVzKSBwYXNzZXMKICBweHBjcyA9 IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpCiAgeHBjc19jcmVhdGVfbWRpb2RldihweHBjcy0+ YnVzLCAuLi4pCgpOb3cgc3VwcG9zZSB0aGUgWFBDUyBpcyB1bmJvdW5kIHRocm91Z2ggc3lzZnMg b3Igcm1tb2QuCmRldmljZV9saW5rc191bmJpbmRfY29uc3VtZXJzKCkgd2FpdHMgb25seSBmb3Ig Q09OU1VNRVJfUFJPQkUgbGlua3M6CgogICAgaWYgKHN0YXR1cyA9PSBETF9TVEFURV9DT05TVU1F Ul9QUk9CRSkgewogICAgICAgIGRldmljZV9saW5rc193cml0ZV91bmxvY2soKTsKICAgICAgICB3 YWl0X2Zvcl9kZXZpY2VfcHJvYmUoKTsKICAgICAgICBnb3RvIHN0YXJ0OwogICAgfQogICAgV1JJ VEVfT05DRShsaW5rLT5zdGF0dXMsIERMX1NUQVRFX1NVUFBMSUVSX1VOQklORCk7CgpGb3IgYW4g QVZBSUxBQkxFIGxpbmsgaXQganVzdCBjb250aW51ZXMsIGFuZCBkZXZyZXMgZnJlZXMgcHhwY3Mg YW5kIHRoZQptaWlfYnVzLiBDYW4gQ1BVMCB0aGVuIGRlcmVmZXJlbmNlIHB4cGNzLT5idXMgYW5k IHB4cGNzLT5lZWVfbXVsdF9mYWN0CmFmdGVyIHRoZXkgaGF2ZSBiZWVuIGZyZWVkPwoKRXZlbiB3 aXRob3V0IGFuIHVuYmluZCwgdGhlIEdNQUMgcHJvYmUgd291bGQgZmluaXNoIHdpdGggdGhpcyBs aW5rCnN0aWxsIGluIERMX1NUQVRFX0FWQUlMQUJMRS4gV291bGRuJ3QgZGV2aWNlX2xpbmtzX2Ry aXZlcl9ib3VuZCgpIGZvcgp0aGUgY29uc3VtZXIgdGhlbiBoaXQgdGhpcyBjaGVjaz8KCiAgICBX QVJOX09OKGxpbmstPnN0YXR1cyAhPSBETF9TVEFURV9DT05TVU1FUl9QUk9CRSk7CgpBbHNvLCB0 aGUgY29tbWVudCBzYXlzIHRoZSBsaW5rIGlzIHJlbGVhc2VkIHdoZW4gdGhlIGNvbnN1bWVyIGRl dmljZSBpcwpkZXN0cm95ZWQuIFdpdGggRExfRkxBR19BVVRPUkVNT1ZFX0NPTlNVTUVSLCBpc24n dCBpdCBhY3R1YWxseSBkcm9wcGVkCndoZW4gdGhlIGNvbnN1bWVyJ3MgZHJpdmVyIHVuYmluZHMg b3IgaXRzIHByb2JlIGZhaWxzPwoKPiArCj4gKwlweHBjcyA9IHBsYXRmb3JtX2dldF9kcnZkYXRh KHBkZXYpOwo+ICsJaWYgKCFweHBjcyB8fCAhcHhwY3MtPmJ1cykgewo+ICsJCXB1dF9kZXZpY2Uo JnBkZXYtPmRldik7Cj4gKwkJcmV0dXJuIEVSUl9QVFIoLUVQUk9CRV9ERUZFUik7Cj4gKwl9Cj4g Kwo+ICsJeHBjcyA9IHhwY3NfY3JlYXRlX21kaW9kZXYocHhwY3MtPmJ1cywgKGludClwb3J0KTsK ClsgLi4uIF0KCj4gK3N0YXRpYyBpbnQgeHBjc19ya19zeXN0ZW1fc3VzcGVuZChzdHJ1Y3QgZGV2 aWNlICpkZXYpCj4gK3sKPiArCS8qCj4gKwkgKiBLZWVwIHRoZSBQRF9QSVBFIHBvd2VyIGRvbWFp biBvbiBkdXJpbmcgc3lzdGVtIHN1c3BlbmQuCj4gKwkgKgo+ICsJICogUERfUElQRSBpcyBzaGFy ZWQgd2l0aCBTQVRBL1BDSWUgYW5kIHdvdWxkIGJlIHBvd2VyZWQgZG93biBieQo+ICsJICogZ2Vu cGQgb25jZSBhbGwgaXRzIGNvbnN1bWVycyBhcmUgc3VzcGVuZGVkLCBraWxsaW5nIHRoZSBTZXJE ZXMKPiArCSAqIGFuZCBicmVha2luZyBNQUMgV29MLiAgTWFyayB0aGUgWFBDUyBhcyBwYXJ0IG9m IHRoZSB3YWtldXAgcGF0aAo+ICsJICogc28gZ2VucGQga2VlcHMgdGhlIGRvbWFpbiBvbi4gIFVu Y29uZGl0aW9uYWwgYmVjYXVzZSB0aGUgWFBDUwo+ICsJICogY29yZSBoYXMgbm8gY2FsbGJhY2sg dG8gY29udmV5IHRoZSBNQUMgV29MIHN0YXRlLgo+ICsJICovCj4gKwlkZXZpY2Vfc2V0X3dha2V1 cF9wYXRoKGRldik7Cj4gKwlyZXR1cm4gMDsKPiArfQoKW1NldmVyaXR5OiBIaWdoXQoKRG9lcyBk ZXZpY2Vfc2V0X3dha2V1cF9wYXRoKCkgYWN0dWFsbHkga2VlcCBQRF9QSVBFIHBvd2VyZWQgaGVy ZT8gVGhlCmNvbW1pdCBtZXNzYWdlIHNheXM6CgogIGdlbnBkIHRoZW4gbGVhdmVzIHRoZSBkb21h aW4gcG93ZXJlZCwgYmVjYXVzZSB0aGUgUm9ja2NoaXAgcG93ZXIKICBkb21haW4gZHJpdmVyIHNl dHMgR0VOUERfRkxBR19BQ1RJVkVfV0FLRVVQIG9uIFBEX1BJUEUKCkluIGRyaXZlcnMvcG1kb21h aW4vcm9ja2NoaXAvcG0tZG9tYWlucy5jLCB0aG91Z2gsIFBEX1BJUEUgaXMgZGVjbGFyZWQKd2l0 aCBhY3RpdmVfd2FrZXVwIHNldCB0byBmYWxzZToKCiAgICBbUkszNTY4X1BEX1BJUEVdID0gRE9N QUlOX1JLMzU2OCgicGlwZSIsIEJJVCg4KSwgQklUKDExKSwgZmFsc2UsIGZhbHNlKSwKCnJvY2tj aGlwX3BtX2FkZF9vbmVfZG9tYWluKCkgc2V0cyB0aGUgZmxhZyBvbmx5IHdoZW4gdGhhdCBmaWVs ZCBpcwp0cnVlOgoKICAgIHBkLT5nZW5wZC5mbGFncyA9IEdFTlBEX0ZMQUdfUE1fQ0xLIHwgR0VO UERfRkxBR19OT19TVEFZX09OOwogICAgaWYgKHBkX2luZm8tPmFjdGl2ZV93YWtldXApCiAgICAg ICAgcGQtPmdlbnBkLmZsYWdzIHw9IEdFTlBEX0ZMQUdfQUNUSVZFX1dBS0VVUDsKCmdlbnBkX2Zp bmlzaF9zdXNwZW5kKCkgc2tpcHMgdGhlIHBvd2VyLW9mZiBvbmx5IHdoZW4gYm90aCBjb25kaXRp b25zCmhvbGQ6CgogICAgaWYgKGRldmljZV9hd2FrZV9wYXRoKGRldikgJiYgZ2VucGRfaXNfYWN0 aXZlX3dha2V1cChnZW5wZCkgJiYKICAgICAgICAhZGV2aWNlX291dF9iYW5kX3dha2V1cChkZXYp KQogICAgICAgIHJldHVybiAwOwoKU28gdGhlIFhQQ1MgaXMgY291bnRlZCBpbiBzdXNwZW5kZWRf Y291bnQgYW5kIGdlbnBkX3N5bmNfcG93ZXJfb2ZmKCkKcnVucy4gVGhhdCBmdW5jdGlvbiBjb21w YXJlcyBzdXNwZW5kZWRfY291bnQgd2l0aCBkZXZpY2VfY291bnQgYW5kCmNoZWNrcyBzZF9jb3Vu dC4gSXQgZG9lcyBub3QgbG9vayBhdCB0aGUgcnBtX2Fsd2F5c19vbiB0aGF0IHByb2JlIHNldAp3 aXRoIGRldl9wbV9nZW5wZF9ycG1fYWx3YXlzX29uKGRldiwgdHJ1ZSkuCgpPbmNlIHRoZSBvdGhl ciBQRF9QSVBFIGNvbnN1bWVycyBoYXZlIHN1c3BlbmRlZCwgd291bGQgdGhlIGRvbWFpbiBiZQpw b3dlcmVkIG9mZiBkdXJpbmcgc3lzdGVtIHN1c3BlbmQ/IFRoYXQgd291bGQgbGVhdmUgU0dNSUkg V29MIHdpdGhvdXQKYSB3b3JraW5nIFBDUy4KCklmIFBEX1BJUEUgZG9lcyBsb3NlIHBvd2VyLCB0 aGUgWFBDUyByZWdpc3RlciBzdGF0ZSBpcyBsb3N0IHRvby4KeHBjc19ya19zeXN0ZW1fcmVzdW1l KCkgYmVsb3cgaXMgYW4gZW1wdHkgc3R1YiBhbmQgZG9lcyBub3QgcmVkbyB0aGUKU2VyRGVzIG9y IFhQQ1MgYnJpbmctdXAuIERvZXMgYW55dGhpbmcgcmVzdG9yZSB0aGF0IHN0YXRlIG9uIHJlc3Vt ZT8KClR3byB0aGluZ3MgYXJlIG5vdCBjb25maXJtZWQgaGVyZTogd2hldGhlciBwaHlsaW5rIGZ1 bGx5IHJlcHJvZ3JhbXMgdGhlClhQQ1Mgb24gcmVzdW1lLCBhbmQgd2hldGhlciB0aGUgY29tYnBo eSByZWFsbHkgc2l0cyBpbiBQRF9QSVBFLiBUaGUKcmszNTZ4IGNvbWJwaHkgRFQgbm9kZXMgaGF2 ZSBubyBwb3dlci1kb21haW5zIHByb3BlcnR5LgoKPiArCj4gK3N0YXRpYyBpbnQgeHBjc19ya19z eXN0ZW1fcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKPiArewo+ICsJcmV0dXJuIDA7Cj4gK30K ClsgLi4uIF0KCj4gZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGNzL3Bjcy14cGNzLXJrLmgg Yi9pbmNsdWRlL2xpbnV4L3Bjcy9wY3MteHBjcy1yay5oCj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQK PiBpbmRleCAwMDAwMDAwMDAwMDAwLi4yODcyM2Q1YmQ3NWNjCj4gLS0tIC9kZXYvbnVsbAo+ICsr KyBiL2luY2x1ZGUvbGludXgvcGNzL3Bjcy14cGNzLXJrLmgKPiBAQCAtMCwwICsxLDExIEBACj4g Ky8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovCj4gKyNpZm5kZWYgX19MSU5V WF9QQ1NfWFBDU19ST0NLQ0hJUF9ICj4gKyNkZWZpbmUgX19MSU5VWF9QQ1NfWFBDU19ST0NLQ0hJ UF9ICj4gKwo+ICsjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9v Zi5oPgo+ICsjaW5jbHVkZSA8bGludXgvcGNzL3Bjcy14cGNzLmg+Cj4gKwo+ICtzdHJ1Y3QgZHdf eHBjcyAqeHBjc19ya19jcmVhdGUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX25v ZGUgKm5wKTsKCltTZXZlcml0eTogTG93XQoKVGhpcyBpc24ndCBhIGJ1ZyBvbmNlIHRoZSB3aG9s ZSBzZXJpZXMgaXMgYXBwbGllZC4gSW4gdGhpcyBwYXRjaCBvbiBpdHMKb3duLCB0aG91Z2gsIHhw Y3NfcmtfY3JlYXRlKCkgaGFzIG5vIGNhbGxlciwgYW5kIHRoZSBwcm90b3R5cGUgaGFzIG5vCnN0 dWIgZm9yIENPTkZJR19QQ1NfWFBDU19ST0NLQ0hJUD1uLgoKVGhlIGxhdGVyIGNvbW1pdCAibmV0 OiBzdG1tYWM6IGR3bWFjLXJrOiBhZGQgU0dNSUkgc3VwcG9ydCBmb3IgUkszNTY4IgpoYW5kbGVz IGJvdGggcG9pbnRzOgoKLSBJdCBhZGRzIHJrX3Bjc19pbml0KCksIHdoaWNoIGNhbGxzIHhwY3Nf cmtfY3JlYXRlKCkuCi0gSXQgd2lyZXMgcmtfcGNzX2luaXQoKSB1cCB0aHJvdWdoIHBsYXRfZGF0 LT5wY3NfaW5pdCwgc28KICBzdG1tYWNfcGNzX3NldHVwKCkgbmV2ZXIgZmFsbHMgYmFjayB0byB4 cGNzX2NyZWF0ZV9md25vZGUoKSBmb3IgdGhpcwogIFBDUy4KLSBJdCBtYWtlcyBEV01BQ19ST0NL Q0hJUCBzZWxlY3QgUENTX1hQQ1NfUk9DS0NISVAsIHNvIHRoZSBtaXNzaW5nIHN0dWIKICBjYW4n dCBjYXVzZSBhIGxpbmsgZmFpbHVyZSBmb3IgdGhhdCB1c2VyLgoKSXMgYSBzdHViIHN0aWxsIHdh bnRlZCBmb3IgZnV0dXJlIHVzZXJzIHRoYXQgZG9uJ3Qgc2VsZWN0IHRoZSBzeW1ib2w/Cgo+ICsK PiArI2VuZGlmIC8qIF9fTElOVVhfUENTX1hQQ1NfUk9DS0NISVBfSCAqLwoKLS0gClNhc2hpa28g QUkgcmV2aWV3IMK3IGh0dHBzOi8vbmV0ZGV2LWFpLmJvdHMubGludXguZGV2L3Nhc2hpa28vIy9w YXRjaHNldC8yMDI2MTAwNTIyMzAxMS4xMTI0MzQ3LTEtY29pYXByYW50JTQwZ21haWwuY29tCgpf X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpMaW51eC1yb2Nr Y2hpcCBtYWlsaW5nIGxpc3QKTGludXgtcm9ja2NoaXBAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRw Oi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LXJvY2tjaGlwCg==