From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtpout-02.galae.net (smtpout-02.galae.net [185.246.84.56]) (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 8F52633A9F1 for ; Wed, 25 Feb 2026 13:57:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.84.56 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772027833; cv=none; b=BeXPlaFOq2cM1CqviRFJt36yssnhf51JrbYm25Kxc78JYBwFuh7PHbHiF7K4Gsd2JPRqM76D/TcypTai8zBuZUc0zKPvt9Q9NY+5HWn5vLC6bThm/dZXVVC0SRAREtnR5DaqHD/5DO3ChzMNijG4QqjM1QGdNd9LUfexm0R8d60= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772027833; c=relaxed/simple; bh=TuXo6P+puSBX13L6PqdWtJyV9bR9L8shiyQsXJBniiY=; h=Mime-Version:Content-Type:Date:Message-Id:To:From:Subject:Cc: References:In-Reply-To; b=VXBVrDjnMhTVBE+R6JEb8XrnmrF4yDpKb4EOzPm194pIFkU08a8Mlw1TP8xH4jixoiUMaRLuCbUaTfkxLuZ0ZKsoweEWisi9QTPkIlGD2Y9yKLdaNTriEqSRRQ13xUPjyygFA4n5nH7iXfPfKUrBbijtYbFL283hPrvMeTN/6pU= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=DN49YSDv; arc=none smtp.client-ip=185.246.84.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="DN49YSDv" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 086C81A135D; Wed, 25 Feb 2026 13:57:04 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id CDF0D5FDE6; Wed, 25 Feb 2026 13:57:03 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id C616C1036929A; Wed, 25 Feb 2026 14:56:57 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1772027822; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=6bWuF5pnWZBOwGGR56VwV7gssDOPxvk9jbjZSVd1+oY=; b=DN49YSDv4DKnLEtUUqqxL1Z4t7u10b5WDH8Rcm+n2o5P0sObpW/9of+6p5+Odt6vq/QciE U6nVBd6CYrMaUMQjzlMl+jKozaXmKVMj8NMypq01BJW0lPn6PwdJSHYG/+yHFHZiF9pblL 4W+kj5CKbbtlevi7Qe2pOXkh6fw+qpLO6v4rxCaQ0MT7QgQWWuRVk9Zy8Qo7cEY3cSikJP dH72CMSnVfue4PoK4f8xapk8eoHoQLu0Um7pYOp/WbAu9VuK4Bj2b0K0JyjVnzL4ueoZcU /6ySo8Zz0jWlLgcpuid1rGL4TBh28hUy/U5OlUoIXbW0bAvbj9QBn0slxpfL9g== Precedence: bulk X-Mailing-List: linux-clk@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=UTF-8 Date: Wed, 25 Feb 2026 14:56:56 +0100 Message-Id: To: =?utf-8?q?Th=C3=A9o_Lebrun?= , "Vladimir Oltean" From: =?utf-8?q?Th=C3=A9o_Lebrun?= Subject: Re: [PATCH v6 3/8] phy: Add driver for EyeQ5 Ethernet PHY wrapper Cc: "Vladimir Kondratiev" , =?utf-8?q?Gr=C3=A9gory_Clement?= , "Rob Herring" , "Krzysztof Kozlowski" , "Conor Dooley" , "Vinod Koul" , "Kishon Vijay Abraham I" , "Michael Turquette" , "Stephen Boyd" , "Philipp Zabel" , "Thomas Bogendoerfer" , "Neil Armstrong" , , , , , , =?utf-8?q?Beno=C3=AEt_Monin?= , "Tawfik Bayouk" , "Thomas Petazzoni" , "Luca Ceresoli" X-Mailer: aerc 0.21.0-0-g5549850facc2 References: <20260127-macb-phy-v6-0-cdd840588188@bootlin.com> <20260127-macb-phy-v6-3-cdd840588188@bootlin.com> <20260210193516.temrg46yozxma7xb@skbuf> In-Reply-To: X-Last-TLS-Session-Version: TLSv1.3 Hello Th=C3=A9o, On Tue Feb 24, 2026 at 6:20 PM CET, Th=C3=A9o Lebrun wrote: > Hello Vladimir, > > On Tue Feb 10, 2026 at 8:35 PM CET, Vladimir Oltean wrote: >> On Tue, Jan 27, 2026 at 06:09:31PM +0100, Th=C3=A9o Lebrun wrote: >>> +static int eq5_phy_init(struct phy *phy) >>> +{ >>> + struct eq5_phy_inst *inst =3D phy_get_drvdata(phy); >>> + struct eq5_phy_private *priv =3D inst->priv; >>> + struct device *dev =3D priv->dev; >>> + u32 reg; >>> + >>> + dev_dbg(dev, "phy_init(inst=3D%td)\n", inst - priv->phys); >> >> Nitpick: can you please remove the debugging prints and maybe add some >> trace points to the PHY core if you feel strongly about having some >> introspection? > > Ack! > >>> + >>> + writel(0, inst->gp); >>> + writel(0, inst->sgmii); >>> + >>> + udelay(5); >> >> Could you please add a macro or comment hinting at the origin of the >> magic number 5 here? You could also place these 3 lines in a common >> helper, also called from eq5_phy_exit(), to avoid minor code >> duplication. > > ACK, something named `eq5_phy_reinit()`. > > I don't have precise explanation for the 5=C2=B5s value; I only know it i= s > time to let the PHY settle before further register config writes. > Is this enough? > > udelay(5); /* settling time */ > >>> + >>> + reg =3D readl(inst->gp) | EQ5_GP_TX_SWRST_DIS | EQ5_GP_TX_M_CLKE | >> >> When you write 0 to inst->gp and then read it back, do you expect to >> (a) get back 0 or >> (b) are some fields non-resetting? >> >> I see both as inconsistent, since if (a), you can remove the >> readl(inst->gp) and expect the same result. And if (b), it also >> shouldn't matter if you write zeroes a second time, if it was fine the >> first time? >> >> Shortly said, is readl(inst->gp) really needed? > > Some fields are non-resetting (BIT 30). > Will drop. I was trying to play it safe for no good reason. > >> >>> + EQ5_GP_SYS_SWRST_DIS | EQ5_GP_SYS_M_CLKE | >>> + FIELD_PREP(EQ5_GP_RGMII_DRV, 0x9); >> >> Quick sanity check on your proposal to use #phy-cells =3D <1>. This is n= ot >> a request to change anything. >> >> What if you need to customize the RGMII drive strength (or some other >> setting, maybe SGMII polarity if that is available) per lane, for a >> particular board? How would you do that if each PHY does not have its >> own OF node? > > I have no knowledge of what that 0x9 stands for, I didn't see the point > exposing it to devicetree. We could plan for the future and add a cell > or create subnodes, but here I kept it simple stupid. Is it OK? > >>> + writel(reg, inst->gp); >>> + >>> + return 0; >>> +} >>> + >>> +static int eq5_phy_exit(struct phy *phy) >>> +{ >>> + struct eq5_phy_inst *inst =3D phy_get_drvdata(phy); >>> + struct eq5_phy_private *priv =3D inst->priv; >>> + struct device *dev =3D priv->dev; >>> + >>> + dev_dbg(dev, "phy_exit(inst=3D%td)\n", inst - priv->phys); >>> + >>> + writel(0, inst->gp); >>> + writel(0, inst->sgmii); >>> + udelay(5); >>> + >>> + return 0; >>> +} >>> + >>> +static int eq5_phy_set_mode(struct phy *phy, enum phy_mode mode, int s= ubmode) >>> +{ >>> + struct eq5_phy_inst *inst =3D phy_get_drvdata(phy); >>> + struct eq5_phy_private *priv =3D inst->priv; >>> + struct device *dev =3D priv->dev; >>> + >>> + dev_dbg(dev, "phy_set_mode(inst=3D%td, mode=3D%d, submode=3D%d)\n", >>> + inst - priv->phys, mode, submode); >>> + >>> + if (mode !=3D PHY_MODE_ETHERNET) >>> + return -EOPNOTSUPP; >>> + >>> + if (!phy_interface_mode_is_rgmii(submode) && >>> + submode !=3D PHY_INTERFACE_MODE_SGMII) >>> + return -EOPNOTSUPP; >> >> Both PHYs are equal in capabilities, and support both RGMII and SGMII, >> correct? I see the driver is implemented as if they were, but it doesn't >> hurt to ask. > > Datasheet indicates 0 can do SGMII/RGMII and 1 can do only RGMII. > Did you imply that the driver code should reject SGMII on PHY 1 > if it ever gets asked for? > >>> + >>> + inst->phy_interface =3D submode; >> >> Short story: don't rely on the phy_set_mode_ext() -> phy_power_on() orde= r. >> Implement the driver so that it works the other way around too. >> >> Long story: >> https://lore.kernel.org/netdev/aXzFH09AeIRawCwU@shell.armlinux.org.uk/ > > I wouldn't mind, but what should phy_power_on() do if no submode has > been provided through phy_set_mode_ext() yet? Guess one? Fail? > > Also our PHY will need to be reset to change its mode if we do > power_on() followed by set_mode(), which in practice is never something > we want. Maybe there is a flag to indicate that we require a submode to > power on? To give something concrete, here is what it could look like. - We refuse phy_power_on() if we haven't been given a mode (we probe with `inst->phy_interface =3D=3D PHY_INTERFACE_MODE_NA`). - We finish phy_set_mode() by restarting if `phy->power_count`. I am not convinced. I would prefer to refuse phy_set_mode() with EBUSY if `phy->power_count =3D=3D 0`. static void eq5_phy_reinit(struct phy *phy) { struct eq5_phy_inst *inst =3D phy_get_drvdata(phy); writel(0, inst->gp); writel(0, inst->sgmii); udelay(5); /* settling time */ } static int eq5_phy_init(struct phy *phy) { struct eq5_phy_inst *inst =3D phy_get_drvdata(phy); u32 reg; eq5_phy_reinit(phy); reg =3D EQ5_GP_TX_SWRST_DIS | EQ5_GP_TX_M_CLKE | EQ5_GP_SYS_SWRST_DIS | EQ5_GP_SYS_M_CLKE | FIELD_PREP(EQ5_GP_RGMII_DRV, 0x9); writel(reg, inst->gp); return 0; } static int eq5_phy_exit(struct phy *phy) { eq5_phy_reinit(phy); return 0; } static int eq5_phy_power_on(struct phy *phy) { struct eq5_phy_inst *inst =3D phy_get_drvdata(phy); struct eq5_phy_private *priv =3D inst->priv; struct device *dev =3D priv->dev; u32 reg; if (inst->phy_interface =3D=3D PHY_INTERFACE_MODE_NA) return -ENOMEDIUM; if (inst->phy_interface =3D=3D PHY_INTERFACE_MODE_SGMII) { writel(readl(inst->gp) | EQ5_GP_SGMII_MODE, inst->gp); reg =3D EQ5_SGMII_PWR_EN | EQ5_SGMII_RST_DIS | EQ5_SGMII_PLL_EN; writel(reg, inst->sgmii); if (readl_poll_timeout(inst->sgmii, reg, reg & EQ5_SGMII_PLL_ACK, 1, 100)) { dev_err(dev, "PLL timeout\n"); return -ETIMEDOUT; } reg =3D readl(inst->sgmii); reg |=3D EQ5_SGMII_PWR_STATE | EQ5_SGMII_SIG_DET_SW; writel(reg, inst->sgmii); } else { writel(readl(inst->gp) & ~EQ5_GP_SGMII_MODE, inst->gp); writel(0, inst->sgmii); } return 0; } static int eq5_phy_set_mode(struct phy *phy, enum phy_mode mode, int submod= e) { struct eq5_phy_inst *inst =3D phy_get_drvdata(phy); if (mode !=3D PHY_MODE_ETHERNET) return -EOPNOTSUPP; if (!phy_interface_mode_is_rgmii(submode) && submode !=3D PHY_INTERFACE_MODE_SGMII) return -EOPNOTSUPP; if (submode !=3D inst->phy_interface) { inst->phy_interface =3D submode; if (phy->power_count) { eq5_phy_reinit(phy); return eq5_phy_power_on(phy); } } return 0; } static int eq5_phy_power_off(struct phy *phy) { struct eq5_phy_inst *inst =3D phy_get_drvdata(phy); writel(readl(inst->gp) & ~EQ5_GP_SGMII_MODE, inst->gp); writel(0, inst->sgmii); return 0; } Thanks, -- Th=C3=A9o Lebrun, Bootlin Embedded Linux and Kernel engineering https://bootlin.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 9909EFD375F for ; Wed, 25 Feb 2026 13:57:11 +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:In-Reply-To:References:Cc:Subject:From: To:Message-Id:Date:Mime-Version:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=u0uXiguM40+2mEPUBehvEhXI5H2AAS9qB2FlZ+BZaQI=; b=o0AsamH2COa7t2 eFZQZhmRlA4UIHMxC4Cu0d03M02JQJKWlR+6UFNpz8PPOWIlc5GROVH+pQzBpJjbytsuPhtntyuRC og+6BJQUIJOQVaTisu6RNPZOkbcfZ6qIRXsSIzyqvSgBrOkq+PtK/Kk4cJC4qBjU/BzEklr4DMMs+ SgoC9z2UckiJGKXWKBnxG7hkJAfsqa1Pe9cuGN/3vUBOrSrvH+wiVufE2hMPLOCt/kFs7Slgj+MON Kdka2Jvwi5ezTqtxSr+kU+xdWjoMbM/b1mCRuHK29yTiY/Qocpggza/PJrc+3mONrg+aCjd/vk2t9 cl/ycvHAYKdiGC7w20DQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98.2 #2 (Red Hat Linux)) id 1vvFO3-000000049LL-1L5j; Wed, 25 Feb 2026 13:57:11 +0000 Received: from smtpout-02.galae.net ([185.246.84.56]) by bombadil.infradead.org with esmtps (Exim 4.98.2 #2 (Red Hat Linux)) id 1vvFNz-000000049KL-0zql for linux-phy@lists.infradead.org; Wed, 25 Feb 2026 13:57:09 +0000 Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 086C81A135D; Wed, 25 Feb 2026 13:57:04 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id CDF0D5FDE6; Wed, 25 Feb 2026 13:57:03 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id C616C1036929A; Wed, 25 Feb 2026 14:56:57 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1772027822; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=6bWuF5pnWZBOwGGR56VwV7gssDOPxvk9jbjZSVd1+oY=; b=DN49YSDv4DKnLEtUUqqxL1Z4t7u10b5WDH8Rcm+n2o5P0sObpW/9of+6p5+Odt6vq/QciE U6nVBd6CYrMaUMQjzlMl+jKozaXmKVMj8NMypq01BJW0lPn6PwdJSHYG/+yHFHZiF9pblL 4W+kj5CKbbtlevi7Qe2pOXkh6fw+qpLO6v4rxCaQ0MT7QgQWWuRVk9Zy8Qo7cEY3cSikJP dH72CMSnVfue4PoK4f8xapk8eoHoQLu0Um7pYOp/WbAu9VuK4Bj2b0K0JyjVnzL4ueoZcU /6ySo8Zz0jWlLgcpuid1rGL4TBh28hUy/U5OlUoIXbW0bAvbj9QBn0slxpfL9g== Mime-Version: 1.0 Date: Wed, 25 Feb 2026 14:56:56 +0100 Message-Id: To: =?utf-8?q?Th=C3=A9o_Lebrun?= , "Vladimir Oltean" From: =?utf-8?q?Th=C3=A9o_Lebrun?= Subject: Re: [PATCH v6 3/8] phy: Add driver for EyeQ5 Ethernet PHY wrapper Cc: "Vladimir Kondratiev" , =?utf-8?q?Gr=C3=A9gory_Clement?= , "Rob Herring" , "Krzysztof Kozlowski" , "Conor Dooley" , "Vinod Koul" , "Kishon Vijay Abraham I" , "Michael Turquette" , "Stephen Boyd" , "Philipp Zabel" , "Thomas Bogendoerfer" , "Neil Armstrong" , , , , , , =?utf-8?q?Beno=C3=AEt_Monin?= , "Tawfik Bayouk" , "Thomas Petazzoni" , "Luca Ceresoli" X-Mailer: aerc 0.21.0-0-g5549850facc2 References: <20260127-macb-phy-v6-0-cdd840588188@bootlin.com> <20260127-macb-phy-v6-3-cdd840588188@bootlin.com> <20260210193516.temrg46yozxma7xb@skbuf> In-Reply-To: X-Last-TLS-Session-Version: TLSv1.3 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20260225_055707_759709_56A5CA69 X-CRM114-Status: GOOD ( 34.61 ) 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: , 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 SGVsbG8gVGjDqW8sCgpPbiBUdWUgRmViIDI0LCAyMDI2IGF0IDY6MjAgUE0gQ0VULCBUaMOpbyBM ZWJydW4gd3JvdGU6Cj4gSGVsbG8gVmxhZGltaXIsCj4KPiBPbiBUdWUgRmViIDEwLCAyMDI2IGF0 IDg6MzUgUE0gQ0VULCBWbGFkaW1pciBPbHRlYW4gd3JvdGU6Cj4+IE9uIFR1ZSwgSmFuIDI3LCAy MDI2IGF0IDA2OjA5OjMxUE0gKzAxMDAsIFRow6lvIExlYnJ1biB3cm90ZToKPj4+ICtzdGF0aWMg aW50IGVxNV9waHlfaW5pdChzdHJ1Y3QgcGh5ICpwaHkpCj4+PiArewo+Pj4gKwlzdHJ1Y3QgZXE1 X3BoeV9pbnN0ICppbnN0ID0gcGh5X2dldF9kcnZkYXRhKHBoeSk7Cj4+PiArCXN0cnVjdCBlcTVf cGh5X3ByaXZhdGUgKnByaXYgPSBpbnN0LT5wcml2Owo+Pj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXYg PSBwcml2LT5kZXY7Cj4+PiArCXUzMiByZWc7Cj4+PiArCj4+PiArCWRldl9kYmcoZGV2LCAicGh5 X2luaXQoaW5zdD0ldGQpXG4iLCBpbnN0IC0gcHJpdi0+cGh5cyk7Cj4+Cj4+IE5pdHBpY2s6IGNh biB5b3UgcGxlYXNlIHJlbW92ZSB0aGUgZGVidWdnaW5nIHByaW50cyBhbmQgbWF5YmUgYWRkIHNv bWUKPj4gdHJhY2UgcG9pbnRzIHRvIHRoZSBQSFkgY29yZSBpZiB5b3UgZmVlbCBzdHJvbmdseSBh Ym91dCBoYXZpbmcgc29tZQo+PiBpbnRyb3NwZWN0aW9uPwo+Cj4gQWNrIQo+Cj4+PiArCj4+PiAr CXdyaXRlbCgwLCBpbnN0LT5ncCk7Cj4+PiArCXdyaXRlbCgwLCBpbnN0LT5zZ21paSk7Cj4+PiAr Cj4+PiArCXVkZWxheSg1KTsKPj4KPj4gQ291bGQgeW91IHBsZWFzZSBhZGQgYSBtYWNybyBvciBj b21tZW50IGhpbnRpbmcgYXQgdGhlIG9yaWdpbiBvZiB0aGUKPj4gbWFnaWMgbnVtYmVyIDUgaGVy ZT8gWW91IGNvdWxkIGFsc28gcGxhY2UgdGhlc2UgMyBsaW5lcyBpbiBhIGNvbW1vbgo+PiBoZWxw ZXIsIGFsc28gY2FsbGVkIGZyb20gZXE1X3BoeV9leGl0KCksIHRvIGF2b2lkIG1pbm9yIGNvZGUK Pj4gZHVwbGljYXRpb24uCj4KPiBBQ0ssIHNvbWV0aGluZyBuYW1lZCBgZXE1X3BoeV9yZWluaXQo KWAuCj4KPiBJIGRvbid0IGhhdmUgcHJlY2lzZSBleHBsYW5hdGlvbiBmb3IgdGhlIDXCtXMgdmFs dWU7IEkgb25seSBrbm93IGl0IGlzCj4gdGltZSB0byBsZXQgdGhlIFBIWSBzZXR0bGUgYmVmb3Jl IGZ1cnRoZXIgcmVnaXN0ZXIgY29uZmlnIHdyaXRlcy4KPiBJcyB0aGlzIGVub3VnaD8KPgo+ICAg IHVkZWxheSg1KTsgLyogc2V0dGxpbmcgdGltZSAqLwo+Cj4+PiArCj4+PiArCXJlZyA9IHJlYWRs KGluc3QtPmdwKSB8IEVRNV9HUF9UWF9TV1JTVF9ESVMgfCBFUTVfR1BfVFhfTV9DTEtFIHwKPj4K Pj4gV2hlbiB5b3Ugd3JpdGUgMCB0byBpbnN0LT5ncCBhbmQgdGhlbiByZWFkIGl0IGJhY2ssIGRv IHlvdSBleHBlY3QgdG8KPj4gKGEpIGdldCBiYWNrIDAgb3IKPj4gKGIpIGFyZSBzb21lIGZpZWxk cyBub24tcmVzZXR0aW5nPwo+Pgo+PiBJIHNlZSBib3RoIGFzIGluY29uc2lzdGVudCwgc2luY2Ug aWYgKGEpLCB5b3UgY2FuIHJlbW92ZSB0aGUKPj4gcmVhZGwoaW5zdC0+Z3ApIGFuZCBleHBlY3Qg dGhlIHNhbWUgcmVzdWx0LiBBbmQgaWYgKGIpLCBpdCBhbHNvCj4+IHNob3VsZG4ndCBtYXR0ZXIg aWYgeW91IHdyaXRlIHplcm9lcyBhIHNlY29uZCB0aW1lLCBpZiBpdCB3YXMgZmluZSB0aGUKPj4g Zmlyc3QgdGltZT8KPj4KPj4gU2hvcnRseSBzYWlkLCBpcyByZWFkbChpbnN0LT5ncCkgcmVhbGx5 IG5lZWRlZD8KPgo+IFNvbWUgZmllbGRzIGFyZSBub24tcmVzZXR0aW5nIChCSVQgMzApLgo+IFdp bGwgZHJvcC4gSSB3YXMgdHJ5aW5nIHRvIHBsYXkgaXQgc2FmZSBmb3Igbm8gZ29vZCByZWFzb24u Cj4KPj4KPj4+ICsJICAgICAgRVE1X0dQX1NZU19TV1JTVF9ESVMgfCBFUTVfR1BfU1lTX01fQ0xL RSB8Cj4+PiArCSAgICAgIEZJRUxEX1BSRVAoRVE1X0dQX1JHTUlJX0RSViwgMHg5KTsKPj4KPj4g UXVpY2sgc2FuaXR5IGNoZWNrIG9uIHlvdXIgcHJvcG9zYWwgdG8gdXNlICNwaHktY2VsbHMgPSA8 MT4uIFRoaXMgaXMgbm90Cj4+IGEgcmVxdWVzdCB0byBjaGFuZ2UgYW55dGhpbmcuCj4+Cj4+IFdo YXQgaWYgeW91IG5lZWQgdG8gY3VzdG9taXplIHRoZSBSR01JSSBkcml2ZSBzdHJlbmd0aCAob3Ig c29tZSBvdGhlcgo+PiBzZXR0aW5nLCBtYXliZSBTR01JSSBwb2xhcml0eSBpZiB0aGF0IGlzIGF2 YWlsYWJsZSkgcGVyIGxhbmUsIGZvciBhCj4+IHBhcnRpY3VsYXIgYm9hcmQ/IEhvdyB3b3VsZCB5 b3UgZG8gdGhhdCBpZiBlYWNoIFBIWSBkb2VzIG5vdCBoYXZlIGl0cwo+PiBvd24gT0Ygbm9kZT8K Pgo+IEkgaGF2ZSBubyBrbm93bGVkZ2Ugb2Ygd2hhdCB0aGF0IDB4OSBzdGFuZHMgZm9yLCBJIGRp ZG4ndCBzZWUgdGhlIHBvaW50Cj4gZXhwb3NpbmcgaXQgdG8gZGV2aWNldHJlZS4gV2UgY291bGQg cGxhbiBmb3IgdGhlIGZ1dHVyZSBhbmQgYWRkIGEgY2VsbAo+IG9yIGNyZWF0ZSBzdWJub2Rlcywg YnV0IGhlcmUgSSBrZXB0IGl0IHNpbXBsZSBzdHVwaWQuIElzIGl0IE9LPwo+Cj4+PiArCXdyaXRl bChyZWcsIGluc3QtPmdwKTsKPj4+ICsKPj4+ICsJcmV0dXJuIDA7Cj4+PiArfQo+Pj4gKwo+Pj4g K3N0YXRpYyBpbnQgZXE1X3BoeV9leGl0KHN0cnVjdCBwaHkgKnBoeSkKPj4+ICt7Cj4+PiArCXN0 cnVjdCBlcTVfcGh5X2luc3QgKmluc3QgPSBwaHlfZ2V0X2RydmRhdGEocGh5KTsKPj4+ICsJc3Ry dWN0IGVxNV9waHlfcHJpdmF0ZSAqcHJpdiA9IGluc3QtPnByaXY7Cj4+PiArCXN0cnVjdCBkZXZp Y2UgKmRldiA9IHByaXYtPmRldjsKPj4+ICsKPj4+ICsJZGV2X2RiZyhkZXYsICJwaHlfZXhpdChp bnN0PSV0ZClcbiIsIGluc3QgLSBwcml2LT5waHlzKTsKPj4+ICsKPj4+ICsJd3JpdGVsKDAsIGlu c3QtPmdwKTsKPj4+ICsJd3JpdGVsKDAsIGluc3QtPnNnbWlpKTsKPj4+ICsJdWRlbGF5KDUpOwo+ Pj4gKwo+Pj4gKwlyZXR1cm4gMDsKPj4+ICt9Cj4+PiArCj4+PiArc3RhdGljIGludCBlcTVfcGh5 X3NldF9tb2RlKHN0cnVjdCBwaHkgKnBoeSwgZW51bSBwaHlfbW9kZSBtb2RlLCBpbnQgc3VibW9k ZSkKPj4+ICt7Cj4+PiArCXN0cnVjdCBlcTVfcGh5X2luc3QgKmluc3QgPSBwaHlfZ2V0X2RydmRh dGEocGh5KTsKPj4+ICsJc3RydWN0IGVxNV9waHlfcHJpdmF0ZSAqcHJpdiA9IGluc3QtPnByaXY7 Cj4+PiArCXN0cnVjdCBkZXZpY2UgKmRldiA9IHByaXYtPmRldjsKPj4+ICsKPj4+ICsJZGV2X2Ri ZyhkZXYsICJwaHlfc2V0X21vZGUoaW5zdD0ldGQsIG1vZGU9JWQsIHN1Ym1vZGU9JWQpXG4iLAo+ Pj4gKwkJaW5zdCAtIHByaXYtPnBoeXMsIG1vZGUsIHN1Ym1vZGUpOwo+Pj4gKwo+Pj4gKwlpZiAo bW9kZSAhPSBQSFlfTU9ERV9FVEhFUk5FVCkKPj4+ICsJCXJldHVybiAtRU9QTk9UU1VQUDsKPj4+ ICsKPj4+ICsJaWYgKCFwaHlfaW50ZXJmYWNlX21vZGVfaXNfcmdtaWkoc3VibW9kZSkgJiYKPj4+ ICsJICAgIHN1Ym1vZGUgIT0gUEhZX0lOVEVSRkFDRV9NT0RFX1NHTUlJKQo+Pj4gKwkJcmV0dXJu IC1FT1BOT1RTVVBQOwo+Pgo+PiBCb3RoIFBIWXMgYXJlIGVxdWFsIGluIGNhcGFiaWxpdGllcywg YW5kIHN1cHBvcnQgYm90aCBSR01JSSBhbmQgU0dNSUksCj4+IGNvcnJlY3Q/IEkgc2VlIHRoZSBk cml2ZXIgaXMgaW1wbGVtZW50ZWQgYXMgaWYgdGhleSB3ZXJlLCBidXQgaXQgZG9lc24ndAo+PiBo dXJ0IHRvIGFzay4KPgo+IERhdGFzaGVldCBpbmRpY2F0ZXMgMCBjYW4gZG8gU0dNSUkvUkdNSUkg YW5kIDEgY2FuIGRvIG9ubHkgUkdNSUkuCj4gRGlkIHlvdSBpbXBseSB0aGF0IHRoZSBkcml2ZXIg Y29kZSBzaG91bGQgcmVqZWN0IFNHTUlJIG9uIFBIWSAxCj4gaWYgaXQgZXZlciBnZXRzIGFza2Vk IGZvcj8KPgo+Pj4gKwo+Pj4gKwlpbnN0LT5waHlfaW50ZXJmYWNlID0gc3VibW9kZTsKPj4KPj4g U2hvcnQgc3Rvcnk6IGRvbid0IHJlbHkgb24gdGhlIHBoeV9zZXRfbW9kZV9leHQoKSAtPiBwaHlf cG93ZXJfb24oKSBvcmRlci4KPj4gSW1wbGVtZW50IHRoZSBkcml2ZXIgc28gdGhhdCBpdCB3b3Jr cyB0aGUgb3RoZXIgd2F5IGFyb3VuZCB0b28uCj4+Cj4+IExvbmcgc3Rvcnk6Cj4+IGh0dHBzOi8v bG9yZS5rZXJuZWwub3JnL25ldGRldi9hWHpGSDA5QWVJUmF3Q3dVQHNoZWxsLmFybWxpbnV4Lm9y Zy51ay8KPgo+IEkgd291bGRuJ3QgbWluZCwgYnV0IHdoYXQgc2hvdWxkIHBoeV9wb3dlcl9vbigp IGRvIGlmIG5vIHN1Ym1vZGUgaGFzCj4gYmVlbiBwcm92aWRlZCB0aHJvdWdoIHBoeV9zZXRfbW9k ZV9leHQoKSB5ZXQ/IEd1ZXNzIG9uZT8gRmFpbD8KPgo+IEFsc28gb3VyIFBIWSB3aWxsIG5lZWQg dG8gYmUgcmVzZXQgdG8gY2hhbmdlIGl0cyBtb2RlIGlmIHdlIGRvCj4gcG93ZXJfb24oKSBmb2xs b3dlZCBieSBzZXRfbW9kZSgpLCB3aGljaCBpbiBwcmFjdGljZSBpcyBuZXZlciBzb21ldGhpbmcK PiB3ZSB3YW50LiBNYXliZSB0aGVyZSBpcyBhIGZsYWcgdG8gaW5kaWNhdGUgdGhhdCB3ZSByZXF1 aXJlIGEgc3VibW9kZSB0bwo+IHBvd2VyIG9uPwoKVG8gZ2l2ZSBzb21ldGhpbmcgY29uY3JldGUs IGhlcmUgaXMgd2hhdCBpdCBjb3VsZCBsb29rIGxpa2UuCiAtIFdlIHJlZnVzZSBwaHlfcG93ZXJf b24oKSBpZiB3ZSBoYXZlbid0IGJlZW4gZ2l2ZW4gYSBtb2RlICh3ZSBwcm9iZQogICB3aXRoIGBp bnN0LT5waHlfaW50ZXJmYWNlID09IFBIWV9JTlRFUkZBQ0VfTU9ERV9OQWApLgogLSBXZSBmaW5p c2ggcGh5X3NldF9tb2RlKCkgYnkgcmVzdGFydGluZyBpZiBgcGh5LT5wb3dlcl9jb3VudGAuCgpJ IGFtIG5vdCBjb252aW5jZWQuIEkgd291bGQgcHJlZmVyIHRvIHJlZnVzZSBwaHlfc2V0X21vZGUo KSB3aXRoIEVCVVNZCmlmIGBwaHktPnBvd2VyX2NvdW50ID09IDBgLgoKCgpzdGF0aWMgdm9pZCBl cTVfcGh5X3JlaW5pdChzdHJ1Y3QgcGh5ICpwaHkpCnsKCXN0cnVjdCBlcTVfcGh5X2luc3QgKmlu c3QgPSBwaHlfZ2V0X2RydmRhdGEocGh5KTsKCgl3cml0ZWwoMCwgaW5zdC0+Z3ApOwoJd3JpdGVs KDAsIGluc3QtPnNnbWlpKTsKCXVkZWxheSg1KTsgLyogc2V0dGxpbmcgdGltZSAqLwp9CgpzdGF0 aWMgaW50IGVxNV9waHlfaW5pdChzdHJ1Y3QgcGh5ICpwaHkpCnsKCXN0cnVjdCBlcTVfcGh5X2lu c3QgKmluc3QgPSBwaHlfZ2V0X2RydmRhdGEocGh5KTsKCXUzMiByZWc7CgoJZXE1X3BoeV9yZWlu aXQocGh5KTsKCglyZWcgPSBFUTVfR1BfVFhfU1dSU1RfRElTIHwgRVE1X0dQX1RYX01fQ0xLRSB8 CgkgICAgICBFUTVfR1BfU1lTX1NXUlNUX0RJUyB8IEVRNV9HUF9TWVNfTV9DTEtFIHwKCSAgICAg IEZJRUxEX1BSRVAoRVE1X0dQX1JHTUlJX0RSViwgMHg5KTsKCXdyaXRlbChyZWcsIGluc3QtPmdw KTsKCglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBlcTVfcGh5X2V4aXQoc3RydWN0IHBoeSAqcGh5 KQp7CgllcTVfcGh5X3JlaW5pdChwaHkpOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgZXE1X3Bo eV9wb3dlcl9vbihzdHJ1Y3QgcGh5ICpwaHkpCnsKCXN0cnVjdCBlcTVfcGh5X2luc3QgKmluc3Qg PSBwaHlfZ2V0X2RydmRhdGEocGh5KTsKCXN0cnVjdCBlcTVfcGh5X3ByaXZhdGUgKnByaXYgPSBp bnN0LT5wcml2OwoJc3RydWN0IGRldmljZSAqZGV2ID0gcHJpdi0+ZGV2OwoJdTMyIHJlZzsKCglp ZiAoaW5zdC0+cGh5X2ludGVyZmFjZSA9PSBQSFlfSU5URVJGQUNFX01PREVfTkEpCgkJcmV0dXJu IC1FTk9NRURJVU07CgoJaWYgKGluc3QtPnBoeV9pbnRlcmZhY2UgPT0gUEhZX0lOVEVSRkFDRV9N T0RFX1NHTUlJKSB7CgkJd3JpdGVsKHJlYWRsKGluc3QtPmdwKSB8IEVRNV9HUF9TR01JSV9NT0RF LCBpbnN0LT5ncCk7CgoJCXJlZyA9IEVRNV9TR01JSV9QV1JfRU4gfCBFUTVfU0dNSUlfUlNUX0RJ UyB8IEVRNV9TR01JSV9QTExfRU47CgkJd3JpdGVsKHJlZywgaW5zdC0+c2dtaWkpOwoKCQlpZiAo cmVhZGxfcG9sbF90aW1lb3V0KGluc3QtPnNnbWlpLCByZWcsCgkJCQkgICAgICAgcmVnICYgRVE1 X1NHTUlJX1BMTF9BQ0ssIDEsIDEwMCkpIHsKCQkJZGV2X2VycihkZXYsICJQTEwgdGltZW91dFxu Iik7CgkJCXJldHVybiAtRVRJTUVET1VUOwoJCX0KCgkJcmVnID0gcmVhZGwoaW5zdC0+c2dtaWkp OwoJCXJlZyB8PSBFUTVfU0dNSUlfUFdSX1NUQVRFIHwgRVE1X1NHTUlJX1NJR19ERVRfU1c7CgkJ d3JpdGVsKHJlZywgaW5zdC0+c2dtaWkpOwoJfSBlbHNlIHsKCQl3cml0ZWwocmVhZGwoaW5zdC0+ Z3ApICYgfkVRNV9HUF9TR01JSV9NT0RFLCBpbnN0LT5ncCk7CgkJd3JpdGVsKDAsIGluc3QtPnNn bWlpKTsKCX0KCglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBlcTVfcGh5X3NldF9tb2RlKHN0cnVj dCBwaHkgKnBoeSwgZW51bSBwaHlfbW9kZSBtb2RlLCBpbnQgc3VibW9kZSkKewoJc3RydWN0IGVx NV9waHlfaW5zdCAqaW5zdCA9IHBoeV9nZXRfZHJ2ZGF0YShwaHkpOwoKCWlmIChtb2RlICE9IFBI WV9NT0RFX0VUSEVSTkVUKQoJCXJldHVybiAtRU9QTk9UU1VQUDsKCglpZiAoIXBoeV9pbnRlcmZh Y2VfbW9kZV9pc19yZ21paShzdWJtb2RlKSAmJgoJICAgIHN1Ym1vZGUgIT0gUEhZX0lOVEVSRkFD RV9NT0RFX1NHTUlJKQoJCXJldHVybiAtRU9QTk9UU1VQUDsKCglpZiAoc3VibW9kZSAhPSBpbnN0 LT5waHlfaW50ZXJmYWNlKSB7CgkJaW5zdC0+cGh5X2ludGVyZmFjZSA9IHN1Ym1vZGU7CgoJCWlm IChwaHktPnBvd2VyX2NvdW50KSB7CgkJCWVxNV9waHlfcmVpbml0KHBoeSk7CgkJCXJldHVybiBl cTVfcGh5X3Bvd2VyX29uKHBoeSk7CgkJfQoJfQoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IGVx NV9waHlfcG93ZXJfb2ZmKHN0cnVjdCBwaHkgKnBoeSkKewoJc3RydWN0IGVxNV9waHlfaW5zdCAq aW5zdCA9IHBoeV9nZXRfZHJ2ZGF0YShwaHkpOwoKCXdyaXRlbChyZWFkbChpbnN0LT5ncCkgJiB+ RVE1X0dQX1NHTUlJX01PREUsIGluc3QtPmdwKTsKCXdyaXRlbCgwLCBpbnN0LT5zZ21paSk7CgoJ cmV0dXJuIDA7Cn0KClRoYW5rcywKCi0tClRow6lvIExlYnJ1biwgQm9vdGxpbgpFbWJlZGRlZCBM aW51eCBhbmQgS2VybmVsIGVuZ2luZWVyaW5nCmh0dHBzOi8vYm9vdGxpbi5jb20KCgotLSAKbGlu dXgtcGh5IG1haWxpbmcgbGlzdApsaW51eC1waHlAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwczov L2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1waHkK