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 4CF643043C6 for ; Mon, 29 Sep 2025 15:38:20 +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=1759160302; cv=none; b=R0KpIDlqcrwOkSKCNyXMPEOIFmzJ2BGb5rQSmq06wR+nr3RwKBym38gTqyVdya1R8+g6Cd0X4l8wcglKWfWURa3JQ8KaWkpPcgwE49DpOeRVGFOYvgj/cpx3Z0ZxDOjum8FCBnIN2xcIuFgjp5dYTgcCyCdgk89RpHTDZqkMsTQ= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759160302; c=relaxed/simple; bh=FBv5ZdGu2UjBYj7Q0c2JIqzYKMrQD4uTKs0ZYPb9IWA=; h=From:To:Cc:Subject:In-Reply-To:References:Date:Message-ID: MIME-Version:Content-Type; b=J9wVhmWUgtqiJrheSH2DpDi44x5cmGeDIt401DUiEgth6t3/dwKH2Ms8N7mc7QvClv7T5G9J6QtRzUsg+zCry3wMTSyu9OqfTNgrdZEWvyK5BmmL3LftHn6dl40/eE9846Kg3MnjoahTjzqYRTovot8v2W/RkLQRT/d9zvRlpwk= 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=Ef1LdPO5; 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="Ef1LdPO5" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 365FC1A101F; Mon, 29 Sep 2025 15:38:18 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 0B6A7606AE; Mon, 29 Sep 2025 15:38:18 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id DD8A9102F19E7; Mon, 29 Sep 2025 17:38:06 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1759160297; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=yTJdS3woupRsBMy0Zf0m8reGQJmYQlgaKoJKrrMf0C0=; b=Ef1LdPO5kTe3B1y6nxaFN3UWDawERCWgFi7K5qEKq82v5D1zSgdLnr/JJYY4ZIFSxzccBx TREMKJnfOKsaCeyqcZlpqb1ubQyUKBBJiNLADLvUe7GpRiOYTJ6xIQF6lK/As1j3jAhP8u 0pured7HzXTjmNA01Yy85ctp9wpIG+De4Kvwnv89dwEnDVyo+NgGUOjTx4q2MYEFvO1EPX W6yVrfOiyM+bEpBhhpAupkbqGa9C+QkOFEYPAD06C230daO2yAw4rD0dfuHDs+KJq6B5xT s4jIvwsRNgayPNoPabyujGOTZcTtNhqFxv3B+mEW0yu0i7+K7znfOFx+CSwVIQ== From: Miquel Raynal To: Frank Li Cc: Alexandre Belloni , Jonathan Cameron , David Lechner , Nuno =?utf-8?Q?S=C3=A1?= , Andy Shevchenko , linux-i3c@lists.infradead.org, linux-kernel@vger.kernel.org, imx@lists.linux.dev, linux-iio@vger.kernel.org, Carlos Song Subject: Re: [PATCH v2 2/4] i3c: master: svc: Add basic HDR mode support In-Reply-To: <20250924-i3c_ddr-v2-2-682a0eb32572@nxp.com> (Frank Li's message of "Wed, 24 Sep 2025 10:30:03 -0400") References: <20250924-i3c_ddr-v2-0-682a0eb32572@nxp.com> <20250924-i3c_ddr-v2-2-682a0eb32572@nxp.com> User-Agent: mu4e 1.12.7; emacs 30.2 Date: Mon, 29 Sep 2025 17:38:03 +0200 Message-ID: <87seg5i810.fsf@bootlin.com> Precedence: bulk X-Mailing-List: imx@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Last-TLS-Session-Version: TLSv1.3 Hi Frank, > struct svc_i3c_cmd { > u8 addr; > - bool rnw; > + u8 rnw; You used a union in the core, which makes sense I believe. I guess you should do it here as well? > u8 *in; > const void *out; > unsigned int len; > @@ -383,6 +386,21 @@ svc_i3c_master_dev_from_addr(struct svc_i3c_master *= master, > return master->descs[i]; > } Maybe we should: - First change the type of the command and make use of the helper to derive the fact that it is a read then - Introduce HDR support. Because there seems to be a lot of changes which are induced by this internal API change and not related to HDR introduction at all. >=20=20 > +static bool svc_is_read(u8 rnw_cmd, u32 type) Can we name this helper svc_cmd_is_read() ? > +{ > + return (type =3D=3D SVC_I3C_MCTRL_TYPE_DDR) ? !!(rnw_cmd & 0x80) : rnw_= cmd; > +} > + > +static void svc_i3c_master_emit_force_exit(struct svc_i3c_master *master) > +{ > + u32 reg =3D 0; > + > + writel(SVC_I3C_MCTRL_REQUEST_FORCE_EXIT, master->regs + SVC_I3C_MCTRL); > + readl_poll_timeout(master->regs + SVC_I3C_MSTATUS, reg, > + SVC_I3C_MSTATUS_MCTRLDONE(reg), 0, 1000); > + udelay(1); > +} > + > static void svc_i3c_master_emit_stop(struct svc_i3c_master *master) > { > writel(SVC_I3C_MCTRL_REQUEST_STOP, master->regs + SVC_I3C_MCTRL); > @@ -1272,7 +1290,7 @@ static int svc_i3c_master_write(struct svc_i3c_mast= er *master, > } >=20=20 > static int svc_i3c_master_xfer(struct svc_i3c_master *master, > - bool rnw, unsigned int xfer_type, u8 addr, > + u8 rnw, unsigned int xfer_type, u8 addr, > u8 *in, const u8 *out, unsigned int xfer_len, > unsigned int *actual_len, bool continued, bool repeat_start) > { > @@ -1283,12 +1301,22 @@ static int svc_i3c_master_xfer(struct svc_i3c_mas= ter *master, > /* clean SVC_I3C_MINT_IBIWON w1c bits */ > writel(SVC_I3C_MINT_IBIWON, master->regs + SVC_I3C_MSTATUS); >=20=20 > + if (xfer_type =3D=3D SVC_I3C_MCTRL_TYPE_DDR) { > + /* DDR command need prefill into FIFO */ > + writel(rnw, master->regs + SVC_I3C_MWDATAB); > + if (!svc_is_read(rnw, xfer_type)) { > + /* write data also need prefill into FIFO */ > + ret =3D svc_i3c_master_write(master, out, xfer_len); > + if (ret) > + goto emit_stop; > + } > + } >=20=20 > while (retry--) { > writel(SVC_I3C_MCTRL_REQUEST_START_ADDR | > xfer_type | > SVC_I3C_MCTRL_IBIRESP_NACK | > - SVC_I3C_MCTRL_DIR(rnw) | > + SVC_I3C_MCTRL_DIR(svc_is_read(rnw, xfer_type)) | > SVC_I3C_MCTRL_ADDR(addr) | > SVC_I3C_MCTRL_RDTERM(*actual_len), > master->regs + SVC_I3C_MCTRL); > @@ -1373,15 +1401,14 @@ static int svc_i3c_master_xfer(struct svc_i3c_mas= ter *master, > break; > } > } > - > - if (rnw) > + if (svc_is_read(rnw, xfer_type)) > ret =3D svc_i3c_master_read(master, in, xfer_len); > - else > + else if (xfer_type !=3D SVC_I3C_MCTRL_TYPE_DDR) > ret =3D svc_i3c_master_write(master, out, xfer_len); > if (ret < 0) > goto emit_stop; >=20=20 > - if (rnw) > + if (svc_is_read(rnw, xfer_type)) > *actual_len =3D ret; >=20=20 > ret =3D readl_poll_timeout(master->regs + SVC_I3C_MSTATUS, reg, > @@ -1389,10 +1416,19 @@ static int svc_i3c_master_xfer(struct svc_i3c_mas= ter *master, > if (ret) > goto emit_stop; >=20=20 > + if (xfer_type =3D=3D SVC_I3C_MCTRL_TYPE_DDR && > + (readl(master->regs + SVC_I3C_MERRWARN) & SVC_I3C_MERRWARN_CRC)) { > + ret =3D -ENXIO; > + goto emit_stop; > + } > + > writel(SVC_I3C_MINT_COMPLETE, master->regs + SVC_I3C_MSTATUS); >=20=20 > if (!continued) { > - svc_i3c_master_emit_stop(master); > + if (xfer_type !=3D SVC_I3C_MCTRL_TYPE_DDR) > + svc_i3c_master_emit_stop(master); > + else > + svc_i3c_master_emit_force_exit(master); >=20=20 > /* Wait idle if stop is sent. */ > readl_poll_timeout(master->regs + SVC_I3C_MSTATUS, reg, > @@ -1402,7 +1438,11 @@ static int svc_i3c_master_xfer(struct svc_i3c_mast= er *master, > return 0; >=20=20 > emit_stop: > - svc_i3c_master_emit_stop(master); > + if (xfer_type !=3D SVC_I3C_MCTRL_TYPE_DDR) > + svc_i3c_master_emit_stop(master); > + else > + svc_i3c_master_emit_force_exit(master); > + > svc_i3c_master_clear_merrwarn(master); > svc_i3c_master_flush_fifo(master); >=20=20 > @@ -1449,6 +1489,11 @@ static void svc_i3c_master_dequeue_xfer(struct svc= _i3c_master *master, > spin_unlock_irqrestore(&master->xferqueue.lock, flags); > } >=20=20 > +static int mode_to_type(enum i3c_hdr_mode mode) Maybe "i3c_mode_to_svc_type()"? > +{ > + return (mode =3D=3D I3C_SDR) ? SVC_I3C_MCTRL_TYPE_I3C : SVC_I3C_MCTRL_T= YPE_DDR; > +} > + > static void svc_i3c_master_start_xfer_locked(struct svc_i3c_master *mast= er) > { > struct svc_i3c_xfer *xfer =3D master->xferqueue.cur; > @@ -1638,9 +1683,8 @@ static int svc_i3c_master_send_ccc_cmd(struct i3c_m= aster_controller *m, > return ret; > } >=20=20 > -static int svc_i3c_master_priv_xfers(struct i3c_dev_desc *dev, > - struct i3c_priv_xfer *xfers, > - int nxfers) > +static int svc_i3c_master_i3c_xfers(struct i3c_dev_desc *dev, struct i3c= _priv_xfer *xfers, > + int nxfers, enum i3c_hdr_mode mode) > { > struct i3c_master_controller *m =3D i3c_dev_get_master(dev); > struct svc_i3c_master *master =3D to_svc_i3c_master(m); > @@ -1648,22 +1692,33 @@ static int svc_i3c_master_priv_xfers(struct i3c_d= ev_desc *dev, > struct svc_i3c_xfer *xfer; > int ret, i; >=20=20 > + if (mode !=3D I3C_SDR) { > + /* > + * Only support data size less than FIFO SIZE when use > DDR mode. when using DDR mode. > + * First entry is cmd in FIFO, so actual available FIFO for data > + * is SVC_I3C_FIFO_SIZE - 2 since DDR only support even > length. supports > + */ > + for (i =3D 0; i < nxfers; i++) > + if (xfers[i].len > SVC_I3C_FIFO_SIZE - 2) > + return -EINVAL; > + } > + > xfer =3D svc_i3c_master_alloc_xfer(master, nxfers); > if (!xfer) > return -ENOMEM; >=20=20 > - xfer->type =3D SVC_I3C_MCTRL_TYPE_I3C; > + xfer->type =3D mode_to_type(mode); >=20=20 > for (i =3D 0; i < nxfers; i++) { > + u8 rnw_cmd =3D (mode =3D=3D I3C_SDR) ? xfers[i].rnw : xfers[i].cmd; > struct svc_i3c_cmd *cmd =3D &xfer->cmds[i]; > - Spurious change? > cmd->xfer =3D &xfers[i]; > cmd->addr =3D master->addrs[data->index]; > - cmd->rnw =3D xfers[i].rnw; > - cmd->in =3D xfers[i].rnw ? xfers[i].data.in : NULL; > - cmd->out =3D xfers[i].rnw ? NULL : xfers[i].data.out; > + cmd->rnw =3D rnw_cmd; > + cmd->in =3D svc_is_read(rnw_cmd, mode_to_type(mode)) ? xfers[i].data.i= n : NULL; > + cmd->out =3D svc_is_read(rnw_cmd, mode_to_type(mode)) ? NULL : xfers[i= ].data.out; > cmd->len =3D xfers[i].len; > - cmd->actual_len =3D xfers[i].rnw ? xfers[i].len : 0; > + cmd->actual_len =3D svc_is_read(rnw_cmd, mode_to_type(mode)) ? xfers[i= ].len : 0; > cmd->continued =3D (i + 1) < nxfers; > } >=20=20 > @@ -1858,7 +1913,7 @@ static const struct i3c_master_controller_ops svc_i= 3c_master_ops =3D { > .do_daa =3D svc_i3c_master_do_daa, > .supports_ccc_cmd =3D svc_i3c_master_supports_ccc_cmd, > .send_ccc_cmd =3D svc_i3c_master_send_ccc_cmd, > - .priv_xfers =3D svc_i3c_master_priv_xfers, > + .i3c_xfers =3D svc_i3c_master_i3c_xfers, Didn't you change this name in patch 1? If you kept both naming, it's fine, otherwise you must do the switch in patch 1 as well to make sure you don't break the build in the middle of the series. > .i2c_xfers =3D svc_i3c_master_i2c_xfers, > .request_ibi =3D svc_i3c_master_request_ibi, > .free_ibi =3D svc_i3c_master_free_ibi, > @@ -1947,6 +2002,8 @@ static int svc_i3c_master_probe(struct platform_dev= ice *pdev) >=20=20 > svc_i3c_master_reset(master); >=20=20 > + master->base.mode_mask =3D BIT(I3C_SDR) | BIT(I3C_HDR_DDR); > + > /* Register the master */ > ret =3D i3c_master_register(&master->base, &pdev->dev, > &svc_i3c_master_ops, false); Thanks, Miqu=C3=A8l 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 CC340CAC5B9 for ; Mon, 29 Sep 2025 15:38:32 +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:Message-ID:Date:References :In-Reply-To:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=zHzYgZ1t/2aNnJYFllIKelG57V/f2UZ6ZFVx9b7s2FY=; b=bjpPd9Ulx2JFWT p6Ew5bByGYkUAPCGrGhYQaHO1ktSkIL36qPjLvhUvl3TsJWEdS84HEpXdEtIP9cA+tOfQDLoN6pa9 HKjlfbiYxwsS6PMkh35HmQGs/jcWOeIhIijbYjOmPrtVrkwL9mXUm6bAfKh2PVXDEUAQ60ETr30rV GCqbZgTw2LGFEZQp38ZXWhxmRbkNq8+0jAkzK7bSQf5MbBNHfBXZskHuYemg9YyUuIwJaS0Xky053 YIirmo36Q9Qn+8tS1YWLr4t4qBU8tc4gMXdup+0PUyWDGm1CKLDgqDQV1CYyujwnmK89f3D5xCWgS trSXpUaWfjA6PwRRFpEA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98.2 #2 (Red Hat Linux)) id 1v3FxQ-00000002nou-1uuP; Mon, 29 Sep 2025 15:38:32 +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 1v3FxM-00000002nnz-3wfM for linux-i3c@lists.infradead.org; Mon, 29 Sep 2025 15:38:31 +0000 Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 365FC1A101F; Mon, 29 Sep 2025 15:38:18 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 0B6A7606AE; Mon, 29 Sep 2025 15:38:18 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id DD8A9102F19E7; Mon, 29 Sep 2025 17:38:06 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1759160297; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=yTJdS3woupRsBMy0Zf0m8reGQJmYQlgaKoJKrrMf0C0=; b=Ef1LdPO5kTe3B1y6nxaFN3UWDawERCWgFi7K5qEKq82v5D1zSgdLnr/JJYY4ZIFSxzccBx TREMKJnfOKsaCeyqcZlpqb1ubQyUKBBJiNLADLvUe7GpRiOYTJ6xIQF6lK/As1j3jAhP8u 0pured7HzXTjmNA01Yy85ctp9wpIG+De4Kvwnv89dwEnDVyo+NgGUOjTx4q2MYEFvO1EPX W6yVrfOiyM+bEpBhhpAupkbqGa9C+QkOFEYPAD06C230daO2yAw4rD0dfuHDs+KJq6B5xT s4jIvwsRNgayPNoPabyujGOTZcTtNhqFxv3B+mEW0yu0i7+K7znfOFx+CSwVIQ== From: Miquel Raynal To: Frank Li Cc: Alexandre Belloni , Jonathan Cameron , David Lechner , Nuno =?utf-8?Q?S=C3=A1?= , Andy Shevchenko , linux-i3c@lists.infradead.org, linux-kernel@vger.kernel.org, imx@lists.linux.dev, linux-iio@vger.kernel.org, Carlos Song Subject: Re: [PATCH v2 2/4] i3c: master: svc: Add basic HDR mode support In-Reply-To: <20250924-i3c_ddr-v2-2-682a0eb32572@nxp.com> (Frank Li's message of "Wed, 24 Sep 2025 10:30:03 -0400") References: <20250924-i3c_ddr-v2-0-682a0eb32572@nxp.com> <20250924-i3c_ddr-v2-2-682a0eb32572@nxp.com> User-Agent: mu4e 1.12.7; emacs 30.2 Date: Mon, 29 Sep 2025 17:38:03 +0200 Message-ID: <87seg5i810.fsf@bootlin.com> MIME-Version: 1.0 X-Last-TLS-Session-Version: TLSv1.3 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250929_083829_121239_EFB15AF2 X-CRM114-Status: GOOD ( 23.70 ) X-BeenThere: linux-i3c@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-i3c" Errors-To: linux-i3c-bounces+linux-i3c=archiver.kernel.org@lists.infradead.org SGkgRnJhbmssCgo+ICBzdHJ1Y3Qgc3ZjX2kzY19jbWQgewo+ICAJdTggYWRkcjsKPiAtCWJvb2wg cm53Owo+ICsJdTggcm53OwoKWW91IHVzZWQgYSB1bmlvbiBpbiB0aGUgY29yZSwgd2hpY2ggbWFr ZXMgc2Vuc2UgSSBiZWxpZXZlLiBJIGd1ZXNzIHlvdQpzaG91bGQgZG8gaXQgaGVyZSBhcyB3ZWxs PwoKCj4gIAl1OCAqaW47Cj4gIAljb25zdCB2b2lkICpvdXQ7Cj4gIAl1bnNpZ25lZCBpbnQgbGVu Owo+IEBAIC0zODMsNiArMzg2LDIxIEBAIHN2Y19pM2NfbWFzdGVyX2Rldl9mcm9tX2FkZHIoc3Ry dWN0IHN2Y19pM2NfbWFzdGVyICptYXN0ZXIsCj4gIAlyZXR1cm4gbWFzdGVyLT5kZXNjc1tpXTsK PiAgfQoKTWF5YmUgd2Ugc2hvdWxkOgotIEZpcnN0IGNoYW5nZSB0aGUgdHlwZSBvZiB0aGUgY29t bWFuZCBhbmQgbWFrZSB1c2Ugb2YgdGhlIGhlbHBlciB0bwpkZXJpdmUgdGhlIGZhY3QgdGhhdCBp dCBpcyBhIHJlYWQKdGhlbgotIEludHJvZHVjZSBIRFIgc3VwcG9ydC4KCkJlY2F1c2UgdGhlcmUg c2VlbXMgdG8gYmUgYSBsb3Qgb2YgY2hhbmdlcyB3aGljaCBhcmUgaW5kdWNlZCBieSB0aGlzCmlu dGVybmFsIEFQSSBjaGFuZ2UgYW5kIG5vdCByZWxhdGVkIHRvIEhEUiBpbnRyb2R1Y3Rpb24gYXQg YWxsLgoKPiAgCj4gK3N0YXRpYyBib29sIHN2Y19pc19yZWFkKHU4IHJud19jbWQsIHUzMiB0eXBl KQoKQ2FuIHdlIG5hbWUgdGhpcyBoZWxwZXIgc3ZjX2NtZF9pc19yZWFkKCkgPwoKPiArewo+ICsJ cmV0dXJuICh0eXBlID09IFNWQ19JM0NfTUNUUkxfVFlQRV9ERFIpID8gISEocm53X2NtZCAmIDB4 ODApIDogcm53X2NtZDsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgc3ZjX2kzY19tYXN0ZXJfZW1p dF9mb3JjZV9leGl0KHN0cnVjdCBzdmNfaTNjX21hc3RlciAqbWFzdGVyKQo+ICt7Cj4gKwl1MzIg cmVnID0gMDsKPiArCj4gKwl3cml0ZWwoU1ZDX0kzQ19NQ1RSTF9SRVFVRVNUX0ZPUkNFX0VYSVQs IG1hc3Rlci0+cmVncyArIFNWQ19JM0NfTUNUUkwpOwo+ICsJcmVhZGxfcG9sbF90aW1lb3V0KG1h c3Rlci0+cmVncyArIFNWQ19JM0NfTVNUQVRVUywgcmVnLAo+ICsJCQkgICBTVkNfSTNDX01TVEFU VVNfTUNUUkxET05FKHJlZyksIDAsIDEwMDApOwo+ICsJdWRlbGF5KDEpOwo+ICt9Cj4gKwo+ICBz dGF0aWMgdm9pZCBzdmNfaTNjX21hc3Rlcl9lbWl0X3N0b3Aoc3RydWN0IHN2Y19pM2NfbWFzdGVy ICptYXN0ZXIpCj4gIHsKPiAgCXdyaXRlbChTVkNfSTNDX01DVFJMX1JFUVVFU1RfU1RPUCwgbWFz dGVyLT5yZWdzICsgU1ZDX0kzQ19NQ1RSTCk7Cj4gQEAgLTEyNzIsNyArMTI5MCw3IEBAIHN0YXRp YyBpbnQgc3ZjX2kzY19tYXN0ZXJfd3JpdGUoc3RydWN0IHN2Y19pM2NfbWFzdGVyICptYXN0ZXIs Cj4gIH0KPiAgCj4gIHN0YXRpYyBpbnQgc3ZjX2kzY19tYXN0ZXJfeGZlcihzdHJ1Y3Qgc3ZjX2kz Y19tYXN0ZXIgKm1hc3RlciwKPiAtCQkJICAgICAgIGJvb2wgcm53LCB1bnNpZ25lZCBpbnQgeGZl cl90eXBlLCB1OCBhZGRyLAo+ICsJCQkgICAgICAgdTggcm53LCB1bnNpZ25lZCBpbnQgeGZlcl90 eXBlLCB1OCBhZGRyLAo+ICAJCQkgICAgICAgdTggKmluLCBjb25zdCB1OCAqb3V0LCB1bnNpZ25l ZCBpbnQgeGZlcl9sZW4sCj4gIAkJCSAgICAgICB1bnNpZ25lZCBpbnQgKmFjdHVhbF9sZW4sIGJv b2wgY29udGludWVkLCBib29sIHJlcGVhdF9zdGFydCkKPiAgewo+IEBAIC0xMjgzLDEyICsxMzAx LDIyIEBAIHN0YXRpYyBpbnQgc3ZjX2kzY19tYXN0ZXJfeGZlcihzdHJ1Y3Qgc3ZjX2kzY19tYXN0 ZXIgKm1hc3RlciwKPiAgCS8qIGNsZWFuIFNWQ19JM0NfTUlOVF9JQklXT04gdzFjIGJpdHMgKi8K PiAgCXdyaXRlbChTVkNfSTNDX01JTlRfSUJJV09OLCBtYXN0ZXItPnJlZ3MgKyBTVkNfSTNDX01T VEFUVVMpOwo+ICAKPiArCWlmICh4ZmVyX3R5cGUgPT0gU1ZDX0kzQ19NQ1RSTF9UWVBFX0REUikg ewo+ICsJCS8qIEREUiBjb21tYW5kIG5lZWQgcHJlZmlsbCBpbnRvIEZJRk8gKi8KPiArCQl3cml0 ZWwocm53LCBtYXN0ZXItPnJlZ3MgKyBTVkNfSTNDX01XREFUQUIpOwo+ICsJCWlmICghc3ZjX2lz X3JlYWQocm53LCB4ZmVyX3R5cGUpKSB7Cj4gKwkJCS8qIHdyaXRlIGRhdGEgYWxzbyBuZWVkIHBy ZWZpbGwgaW50byBGSUZPICovCj4gKwkJCXJldCA9IHN2Y19pM2NfbWFzdGVyX3dyaXRlKG1hc3Rl ciwgb3V0LCB4ZmVyX2xlbik7Cj4gKwkJaWYgKHJldCkKPiArCQkJZ290byBlbWl0X3N0b3A7Cj4g KwkJfQo+ICsJfQo+ICAKPiAgCXdoaWxlIChyZXRyeS0tKSB7Cj4gIAkJd3JpdGVsKFNWQ19JM0Nf TUNUUkxfUkVRVUVTVF9TVEFSVF9BRERSIHwKPiAgCQkgICAgICAgeGZlcl90eXBlIHwKPiAgCQkg ICAgICAgU1ZDX0kzQ19NQ1RSTF9JQklSRVNQX05BQ0sgfAo+IC0JCSAgICAgICBTVkNfSTNDX01D VFJMX0RJUihybncpIHwKPiArCQkgICAgICAgU1ZDX0kzQ19NQ1RSTF9ESVIoc3ZjX2lzX3JlYWQo cm53LCB4ZmVyX3R5cGUpKSB8Cj4gIAkJICAgICAgIFNWQ19JM0NfTUNUUkxfQUREUihhZGRyKSB8 Cj4gIAkJICAgICAgIFNWQ19JM0NfTUNUUkxfUkRURVJNKCphY3R1YWxfbGVuKSwKPiAgCQkgICAg ICAgbWFzdGVyLT5yZWdzICsgU1ZDX0kzQ19NQ1RSTCk7Cj4gQEAgLTEzNzMsMTUgKzE0MDEsMTQg QEAgc3RhdGljIGludCBzdmNfaTNjX21hc3Rlcl94ZmVyKHN0cnVjdCBzdmNfaTNjX21hc3RlciAq bWFzdGVyLAo+ICAJCQlicmVhazsKPiAgCQl9Cj4gIAl9Cj4gLQo+IC0JaWYgKHJudykKPiArCWlm IChzdmNfaXNfcmVhZChybncsIHhmZXJfdHlwZSkpCj4gIAkJcmV0ID0gc3ZjX2kzY19tYXN0ZXJf cmVhZChtYXN0ZXIsIGluLCB4ZmVyX2xlbik7Cj4gLQllbHNlCj4gKwllbHNlIGlmICh4ZmVyX3R5 cGUgIT0gU1ZDX0kzQ19NQ1RSTF9UWVBFX0REUikKPiAgCQlyZXQgPSBzdmNfaTNjX21hc3Rlcl93 cml0ZShtYXN0ZXIsIG91dCwgeGZlcl9sZW4pOwo+ICAJaWYgKHJldCA8IDApCj4gIAkJZ290byBl bWl0X3N0b3A7Cj4gIAo+IC0JaWYgKHJudykKPiArCWlmIChzdmNfaXNfcmVhZChybncsIHhmZXJf dHlwZSkpCj4gIAkJKmFjdHVhbF9sZW4gPSByZXQ7Cj4gIAo+ICAJcmV0ID0gcmVhZGxfcG9sbF90 aW1lb3V0KG1hc3Rlci0+cmVncyArIFNWQ19JM0NfTVNUQVRVUywgcmVnLAo+IEBAIC0xMzg5LDEw ICsxNDE2LDE5IEBAIHN0YXRpYyBpbnQgc3ZjX2kzY19tYXN0ZXJfeGZlcihzdHJ1Y3Qgc3ZjX2kz Y19tYXN0ZXIgKm1hc3RlciwKPiAgCWlmIChyZXQpCj4gIAkJZ290byBlbWl0X3N0b3A7Cj4gIAo+ ICsJaWYgKHhmZXJfdHlwZSA9PSBTVkNfSTNDX01DVFJMX1RZUEVfRERSICYmCj4gKwkgICAgKHJl YWRsKG1hc3Rlci0+cmVncyArIFNWQ19JM0NfTUVSUldBUk4pICYgU1ZDX0kzQ19NRVJSV0FSTl9D UkMpKSB7Cj4gKwkJcmV0ID0gLUVOWElPOwo+ICsJCWdvdG8gZW1pdF9zdG9wOwo+ICsJfQo+ICsK PiAgCXdyaXRlbChTVkNfSTNDX01JTlRfQ09NUExFVEUsIG1hc3Rlci0+cmVncyArIFNWQ19JM0Nf TVNUQVRVUyk7Cj4gIAo+ICAJaWYgKCFjb250aW51ZWQpIHsKPiAtCQlzdmNfaTNjX21hc3Rlcl9l bWl0X3N0b3AobWFzdGVyKTsKPiArCQlpZiAoeGZlcl90eXBlICE9IFNWQ19JM0NfTUNUUkxfVFlQ RV9ERFIpCj4gKwkJCXN2Y19pM2NfbWFzdGVyX2VtaXRfc3RvcChtYXN0ZXIpOwo+ICsJCWVsc2UK PiArCQkJc3ZjX2kzY19tYXN0ZXJfZW1pdF9mb3JjZV9leGl0KG1hc3Rlcik7Cj4gIAo+ICAJCS8q IFdhaXQgaWRsZSBpZiBzdG9wIGlzIHNlbnQuICovCj4gIAkJcmVhZGxfcG9sbF90aW1lb3V0KG1h c3Rlci0+cmVncyArIFNWQ19JM0NfTVNUQVRVUywgcmVnLAo+IEBAIC0xNDAyLDcgKzE0MzgsMTEg QEAgc3RhdGljIGludCBzdmNfaTNjX21hc3Rlcl94ZmVyKHN0cnVjdCBzdmNfaTNjX21hc3RlciAq bWFzdGVyLAo+ICAJcmV0dXJuIDA7Cj4gIAo+ICBlbWl0X3N0b3A6Cj4gLQlzdmNfaTNjX21hc3Rl cl9lbWl0X3N0b3AobWFzdGVyKTsKPiArCWlmICh4ZmVyX3R5cGUgIT0gU1ZDX0kzQ19NQ1RSTF9U WVBFX0REUikKPiArCQlzdmNfaTNjX21hc3Rlcl9lbWl0X3N0b3AobWFzdGVyKTsKPiArCWVsc2UK PiArCQlzdmNfaTNjX21hc3Rlcl9lbWl0X2ZvcmNlX2V4aXQobWFzdGVyKTsKPiArCj4gIAlzdmNf aTNjX21hc3Rlcl9jbGVhcl9tZXJyd2FybihtYXN0ZXIpOwo+ICAJc3ZjX2kzY19tYXN0ZXJfZmx1 c2hfZmlmbyhtYXN0ZXIpOwo+ICAKPiBAQCAtMTQ0OSw2ICsxNDg5LDExIEBAIHN0YXRpYyB2b2lk IHN2Y19pM2NfbWFzdGVyX2RlcXVldWVfeGZlcihzdHJ1Y3Qgc3ZjX2kzY19tYXN0ZXIgKm1hc3Rl ciwKPiAgCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hc3Rlci0+eGZlcnF1ZXVlLmxvY2ssIGZs YWdzKTsKPiAgfQo+ICAKPiArc3RhdGljIGludCBtb2RlX3RvX3R5cGUoZW51bSBpM2NfaGRyX21v ZGUgbW9kZSkKCk1heWJlICJpM2NfbW9kZV90b19zdmNfdHlwZSgpIj8KPiArewo+ICsJcmV0dXJu IChtb2RlID09IEkzQ19TRFIpID8gU1ZDX0kzQ19NQ1RSTF9UWVBFX0kzQyA6IFNWQ19JM0NfTUNU UkxfVFlQRV9ERFI7Cj4gK30KPiArCj4gIHN0YXRpYyB2b2lkIHN2Y19pM2NfbWFzdGVyX3N0YXJ0 X3hmZXJfbG9ja2VkKHN0cnVjdCBzdmNfaTNjX21hc3RlciAqbWFzdGVyKQo+ICB7Cj4gIAlzdHJ1 Y3Qgc3ZjX2kzY194ZmVyICp4ZmVyID0gbWFzdGVyLT54ZmVycXVldWUuY3VyOwo+IEBAIC0xNjM4 LDkgKzE2ODMsOCBAQCBzdGF0aWMgaW50IHN2Y19pM2NfbWFzdGVyX3NlbmRfY2NjX2NtZChzdHJ1 Y3QgaTNjX21hc3Rlcl9jb250cm9sbGVyICptLAo+ICAJcmV0dXJuIHJldDsKPiAgfQo+ICAKPiAt c3RhdGljIGludCBzdmNfaTNjX21hc3Rlcl9wcml2X3hmZXJzKHN0cnVjdCBpM2NfZGV2X2Rlc2Mg KmRldiwKPiAtCQkJCSAgICAgc3RydWN0IGkzY19wcml2X3hmZXIgKnhmZXJzLAo+IC0JCQkJICAg ICBpbnQgbnhmZXJzKQo+ICtzdGF0aWMgaW50IHN2Y19pM2NfbWFzdGVyX2kzY194ZmVycyhzdHJ1 Y3QgaTNjX2Rldl9kZXNjICpkZXYsIHN0cnVjdCBpM2NfcHJpdl94ZmVyICp4ZmVycywKPiArCQkJ CSAgICBpbnQgbnhmZXJzLCBlbnVtIGkzY19oZHJfbW9kZSBtb2RlKQo+ICB7Cj4gIAlzdHJ1Y3Qg aTNjX21hc3Rlcl9jb250cm9sbGVyICptID0gaTNjX2Rldl9nZXRfbWFzdGVyKGRldik7Cj4gIAlz dHJ1Y3Qgc3ZjX2kzY19tYXN0ZXIgKm1hc3RlciA9IHRvX3N2Y19pM2NfbWFzdGVyKG0pOwo+IEBA IC0xNjQ4LDIyICsxNjkyLDMzIEBAIHN0YXRpYyBpbnQgc3ZjX2kzY19tYXN0ZXJfcHJpdl94ZmVy cyhzdHJ1Y3QgaTNjX2Rldl9kZXNjICpkZXYsCj4gIAlzdHJ1Y3Qgc3ZjX2kzY194ZmVyICp4ZmVy Owo+ICAJaW50IHJldCwgaTsKPiAgCj4gKwlpZiAobW9kZSAhPSBJM0NfU0RSKSB7Cj4gKwkJLyoK PiArCQkgKiBPbmx5IHN1cHBvcnQgZGF0YSBzaXplIGxlc3MgdGhhbiBGSUZPIFNJWkUgd2hlbiB1 c2UKPiBERFIgbW9kZS4KCndoZW4gdXNpbmcgRERSIG1vZGUuCgo+ICsJCSAqIEZpcnN0IGVudHJ5 IGlzIGNtZCBpbiBGSUZPLCBzbyBhY3R1YWwgYXZhaWxhYmxlIEZJRk8gZm9yIGRhdGEKPiArCQkg KiBpcyBTVkNfSTNDX0ZJRk9fU0laRSAtIDIgc2luY2UgRERSIG9ubHkgc3VwcG9ydCBldmVuCj4g bGVuZ3RoLgoKc3VwcG9ydHMKCj4gKwkJICovCj4gKwkJZm9yIChpID0gMDsgaSA8IG54ZmVyczsg aSsrKQo+ICsJCQlpZiAoeGZlcnNbaV0ubGVuID4gU1ZDX0kzQ19GSUZPX1NJWkUgLSAyKQo+ICsJ CQkJcmV0dXJuIC1FSU5WQUw7Cj4gKwl9Cj4gKwo+ICAJeGZlciA9IHN2Y19pM2NfbWFzdGVyX2Fs bG9jX3hmZXIobWFzdGVyLCBueGZlcnMpOwo+ICAJaWYgKCF4ZmVyKQo+ICAJCXJldHVybiAtRU5P TUVNOwo+ICAKPiAtCXhmZXItPnR5cGUgPSBTVkNfSTNDX01DVFJMX1RZUEVfSTNDOwo+ICsJeGZl ci0+dHlwZSA9IG1vZGVfdG9fdHlwZShtb2RlKTsKPiAgCj4gIAlmb3IgKGkgPSAwOyBpIDwgbnhm ZXJzOyBpKyspIHsKPiArCQl1OCBybndfY21kID0gKG1vZGUgPT0gSTNDX1NEUikgPyB4ZmVyc1tp XS5ybncgOiB4ZmVyc1tpXS5jbWQ7Cj4gIAkJc3RydWN0IHN2Y19pM2NfY21kICpjbWQgPSAmeGZl ci0+Y21kc1tpXTsKPiAtCgpTcHVyaW91cyBjaGFuZ2U/Cgo+ICAJCWNtZC0+eGZlciA9ICZ4ZmVy c1tpXTsKPiAgCQljbWQtPmFkZHIgPSBtYXN0ZXItPmFkZHJzW2RhdGEtPmluZGV4XTsKPiAtCQlj bWQtPnJudyA9IHhmZXJzW2ldLnJudzsKPiAtCQljbWQtPmluID0geGZlcnNbaV0ucm53ID8geGZl cnNbaV0uZGF0YS5pbiA6IE5VTEw7Cj4gLQkJY21kLT5vdXQgPSB4ZmVyc1tpXS5ybncgPyBOVUxM IDogeGZlcnNbaV0uZGF0YS5vdXQ7Cj4gKwkJY21kLT5ybncgPSBybndfY21kOwo+ICsJCWNtZC0+ aW4gPSBzdmNfaXNfcmVhZChybndfY21kLCBtb2RlX3RvX3R5cGUobW9kZSkpID8geGZlcnNbaV0u ZGF0YS5pbiA6IE5VTEw7Cj4gKwkJY21kLT5vdXQgPSBzdmNfaXNfcmVhZChybndfY21kLCBtb2Rl X3RvX3R5cGUobW9kZSkpID8gTlVMTCA6IHhmZXJzW2ldLmRhdGEub3V0Owo+ICAJCWNtZC0+bGVu ID0geGZlcnNbaV0ubGVuOwo+IC0JCWNtZC0+YWN0dWFsX2xlbiA9IHhmZXJzW2ldLnJudyA/IHhm ZXJzW2ldLmxlbiA6IDA7Cj4gKwkJY21kLT5hY3R1YWxfbGVuID0gc3ZjX2lzX3JlYWQocm53X2Nt ZCwgbW9kZV90b190eXBlKG1vZGUpKSA/IHhmZXJzW2ldLmxlbiA6IDA7Cj4gIAkJY21kLT5jb250 aW51ZWQgPSAoaSArIDEpIDwgbnhmZXJzOwo+ICAJfQo+ICAKPiBAQCAtMTg1OCw3ICsxOTEzLDcg QEAgc3RhdGljIGNvbnN0IHN0cnVjdCBpM2NfbWFzdGVyX2NvbnRyb2xsZXJfb3BzIHN2Y19pM2Nf bWFzdGVyX29wcyA9IHsKPiAgCS5kb19kYWEgPSBzdmNfaTNjX21hc3Rlcl9kb19kYWEsCj4gIAku c3VwcG9ydHNfY2NjX2NtZCA9IHN2Y19pM2NfbWFzdGVyX3N1cHBvcnRzX2NjY19jbWQsCj4gIAku c2VuZF9jY2NfY21kID0gc3ZjX2kzY19tYXN0ZXJfc2VuZF9jY2NfY21kLAo+IC0JLnByaXZfeGZl cnMgPSBzdmNfaTNjX21hc3Rlcl9wcml2X3hmZXJzLAo+ICsJLmkzY194ZmVycyA9IHN2Y19pM2Nf bWFzdGVyX2kzY194ZmVycywKCkRpZG4ndCB5b3UgY2hhbmdlIHRoaXMgbmFtZSBpbiBwYXRjaCAx PyBJZiB5b3Uga2VwdCBib3RoIG5hbWluZywgaXQncwpmaW5lLCBvdGhlcndpc2UgeW91IG11c3Qg ZG8gdGhlIHN3aXRjaCBpbiBwYXRjaCAxIGFzIHdlbGwgdG8gbWFrZSBzdXJlCnlvdSBkb24ndCBi cmVhayB0aGUgYnVpbGQgaW4gdGhlIG1pZGRsZSBvZiB0aGUgc2VyaWVzLgoKPiAgCS5pMmNfeGZl cnMgPSBzdmNfaTNjX21hc3Rlcl9pMmNfeGZlcnMsCj4gIAkucmVxdWVzdF9pYmkgPSBzdmNfaTNj X21hc3Rlcl9yZXF1ZXN0X2liaSwKPiAgCS5mcmVlX2liaSA9IHN2Y19pM2NfbWFzdGVyX2ZyZWVf aWJpLAo+IEBAIC0xOTQ3LDYgKzIwMDIsOCBAQCBzdGF0aWMgaW50IHN2Y19pM2NfbWFzdGVyX3By b2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4gIAo+ICAJc3ZjX2kzY19tYXN0ZXJf cmVzZXQobWFzdGVyKTsKPiAgCj4gKwltYXN0ZXItPmJhc2UubW9kZV9tYXNrID0gQklUKEkzQ19T RFIpIHwgQklUKEkzQ19IRFJfRERSKTsKPiArCj4gIAkvKiBSZWdpc3RlciB0aGUgbWFzdGVyICov Cj4gIAlyZXQgPSBpM2NfbWFzdGVyX3JlZ2lzdGVyKCZtYXN0ZXItPmJhc2UsICZwZGV2LT5kZXYs Cj4gIAkJCQkgICZzdmNfaTNjX21hc3Rlcl9vcHMsIGZhbHNlKTsKClRoYW5rcywKTWlxdcOobAoK LS0gCmxpbnV4LWkzYyBtYWlsaW5nIGxpc3QKbGludXgtaTNjQGxpc3RzLmluZnJhZGVhZC5vcmcK aHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1pM2MK