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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id A6D8DC4167B for ; Tue, 31 Oct 2023 15:29:07 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1344730AbjJaP3I (ORCPT ); Tue, 31 Oct 2023 11:29:08 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35522 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1344229AbjJaP3H (ORCPT ); Tue, 31 Oct 2023 11:29:07 -0400 Received: from relay5-d.mail.gandi.net (relay5-d.mail.gandi.net [217.70.183.197]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B2CEC9F; Tue, 31 Oct 2023 08:29:03 -0700 (PDT) Received: by mail.gandi.net (Postfix) with ESMTPSA id 363031C000B; Tue, 31 Oct 2023 15:28:58 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1698766141; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=RPYUkZNPreY88VDhOmVn3AFyOFRRtuLzyph5YgbM3vw=; b=eP6LsbtTgo6LDa5+lKR/f83CNNGqISbapv0U2I6aLXb3X2fCHkzNPjvbXI1xd8xmC8qEsu ZP+B3iYZkLiCfqYxfwRtRmYIgodRCtj5xUMpZ3+md0+S3mkMWhz3PmgtFW8ZtViHj+2oA7 0Fr17W394i8zUeZPr8rGCvn86z/D01hN4L1Hj/MfJUbqhT33IcrHURRtb4+JEzcNukl009 UNfV5KwMIhT5KmeWzzo1hY1mHENs+Of8aq//RVhE9iono7AxX+yNSFJLx18/ot9RPr/qEc xNLLGDLNcQaWDcmYUZQa22+G2wydV42L2Qq+LzH0euWuFOiOUQMIlhiu7as/qQ== Date: Tue, 31 Oct 2023 16:28:56 +0100 From: Miquel Raynal To: Md Sadre Alam Cc: agross@kernel.org, andersson@kernel.org, konrad.dybcio@linaro.org, robh+dt@kernel.org, conor+dt@kernel.org, krzysztof.kozlowski+dt@linaro.org, richard@nod.at, vigneshr@ti.com, broonie@kernel.org, linux-arm-msm@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mtd@lists.infradead.org, linux-spi@vger.kernel.org, quic_srichara@quicinc.com, qpic_varada@quicinc.com Subject: Re: [RFC PATCH 1/5] mtd: nand: ecc-qcom: Add support for ECC Engine Driver Message-ID: <20231031162856.1d9e3246@xps-13> In-Reply-To: <20231031120307.1600689-2-quic_mdalam@quicinc.com> References: <20231031120307.1600689-1-quic_mdalam@quicinc.com> <20231031120307.1600689-2-quic_mdalam@quicinc.com> Organization: Bootlin X-Mailer: Claws Mail 4.0.0 (GTK+ 3.24.33; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-GND-Sasl: miquel.raynal@bootlin.com Precedence: bulk List-ID: X-Mailing-List: linux-arm-msm@vger.kernel.org Hi, quic_mdalam@quicinc.com wrote on Tue, 31 Oct 2023 17:33:03 +0530: Commit log is missing. > Signed-off-by: Md Sadre Alam > Signed-off-by: Sricharan R If Sricharan is a co developer you need to use the right tags. Please have a look at the documentation. Using the two SoB here does not mean anything. > --- > drivers/mtd/nand/Kconfig | 7 ++ > drivers/mtd/nand/Makefile | 1 + > drivers/mtd/nand/ecc-qcom.c | 198 ++++++++++++++++++++++++++++++++++++ > 3 files changed, 206 insertions(+) > create mode 100644 drivers/mtd/nand/ecc-qcom.c >=20 > diff --git a/drivers/mtd/nand/Kconfig b/drivers/mtd/nand/Kconfig > index 5b0c2c95f10c..333cec8187c8 100644 > --- a/drivers/mtd/nand/Kconfig > +++ b/drivers/mtd/nand/Kconfig > @@ -61,6 +61,13 @@ config MTD_NAND_ECC_MEDIATEK > help > This enables support for the hardware ECC engine from Mediatek. > =20 > +config MTD_NAND_ECC_QCOM > + tristate "Qualcomm hardware ECC engine" > + depends on ARCH_QCOM Same comment as Mark regarding COMPILE_TEST > + select MTD_NAND_ECC > + help > + This enables support for the hardware ECC engine from Qualcomm. > + > endmenu > =20 > endmenu > diff --git a/drivers/mtd/nand/Makefile b/drivers/mtd/nand/Makefile > index 19e1291ac4d5..c73b8a3456ec 100644 > --- a/drivers/mtd/nand/Makefile > +++ b/drivers/mtd/nand/Makefile > @@ -3,6 +3,7 @@ > nandcore-objs :=3D core.o bbt.o > obj-$(CONFIG_MTD_NAND_CORE) +=3D nandcore.o > obj-$(CONFIG_MTD_NAND_ECC_MEDIATEK) +=3D ecc-mtk.o > +obj-$(CONFIG_MTD_NAND_ECC_QCOM) +=3D ecc-qcom.o qpic_common.o > =20 > obj-y +=3D onenand/ > obj-y +=3D raw/ > diff --git a/drivers/mtd/nand/ecc-qcom.c b/drivers/mtd/nand/ecc-qcom.c > new file mode 100644 > index 000000000000..a85423ed368a > --- /dev/null > +++ b/drivers/mtd/nand/ecc-qcom.c > @@ -0,0 +1,198 @@ > +// SPDX-License-Identifier: GPL-2.0 OR MIT > +/* > + * QCOM ECC Engine Driver. > + * Copyright (C) 2023 Qualcomm Inc. > + * Authors: Md sadre Alam > + * Sricharan R > + */ > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > + > + > +/* ECC modes supported by the controller */ > +#define ECC_NONE BIT(0) > +#define ECC_RS_4BIT BIT(1) > +#define ECC_BCH_4BIT BIT(2) > +#define ECC_BCH_8BIT BIT(3) > + > +struct qpic_ecc_caps { > + u32 err_mask; > + u32 err_shift; > + const u8 *ecc_strength; > + const u32 *ecc_regs; > + u8 num_ecc_strength; > + u8 ecc_mode_shift; > + u32 parity_bits; > + int pg_irq_sel; > +}; > + > + > +struct qcom_nand_host *to_qcom_nand_host(struct nand_chip *chip) > +{ > + return container_of(chip, struct qcom_nand_host, chip); > +} > +EXPORT_SYMBOL(to_qcom_nand_host); > + > +struct qcom_nand_controller * > +get_qcom_nand_controller(struct nand_chip *chip) > +{ > + return container_of(chip->controller, struct qcom_nand_controller, > + controller); > +} > +EXPORT_SYMBOL(get_qcom_nand_controller); > + > +static struct qpic_ecc *qpic_ecc_get(struct device_node *np) > +{ > + struct platform_device *pdev; > + struct qpic_ecc *ecc; > + > + pdev =3D of_find_device_by_node(np); > + if (!pdev) > + return ERR_PTR(-EPROBE_DEFER); > + > + ecc =3D platform_get_drvdata(pdev); > + if (!ecc) { > + put_device(&pdev->dev); > + return ERR_PTR(-EPROBE_DEFER); > + } > + > + return ecc; > +} > + > +struct qpic_ecc *of_qpic_ecc_get(struct device_node *of_node) > +{ > + struct qpic_ecc *ecc =3D NULL; > + struct device_node *np; > + > + np =3D of_parse_phandle(of_node, "nand-ecc-engine", 0); > + /* for backward compatibility */ There is no backward compatibility to handle upstream > + if (!np) > + np =3D of_parse_phandle(of_node, "ecc-engine", 0); > + if (np) { > + ecc =3D qpic_ecc_get(np); > + of_node_put(np); > + } > + > + return ecc; > +} > +EXPORT_SYMBOL(of_qpic_ecc_get); > + > +int qcom_ecc_config(struct qpic_ecc *ecc, int ecc_strength, > + bool wide_bus) > +{ > + ecc->ecc_modes =3D (ECC_RS_4BIT | ECC_BCH_8BIT); > + > + if (ecc_strength >=3D 8) { If your engine does not support more than an 8-bit strength this condition seems a bit strange. > + /* 8 bit ECC defaults to BCH ECC on all platforms */ > + ecc->bch_enabled =3D true; > + ecc->ecc_mode =3D 1; ecc_modes above, ecc_mode here, not very clear what this is. Please give meaningful names to your variables, not just the bit name that this is capturing because here it's unclear what this is. > + > + if (wide_bus) { > + ecc->ecc_bytes_hw =3D 14; > + ecc->spare_bytes =3D 0; Spare bytes depend on the flash, you can't use constant values like that. I also don't understand what wide_bus is and why it has an impact of only 1 on the number of ECC bytes. Please make all this more explicit. > + ecc->bbm_size =3D 2; > + } else { > + ecc->ecc_bytes_hw =3D 13; > + ecc->spare_bytes =3D 2; > + ecc->bbm_size =3D 1; > + } > + } else { > + /* > + * if the controller supports BCH for 4 bit ECC, the controller > + * uses lesser bytes for ECC. If RS is used, the ECC bytes is > + * always 10 bytes > + */ > + if (ecc->ecc_modes & ECC_BCH_4BIT) { > + /* BCH */ > + ecc->bch_enabled =3D true; > + ecc->ecc_mode =3D 0; > + if (wide_bus) { > + ecc->ecc_bytes_hw =3D 8; > + ecc->spare_bytes =3D 2; > + ecc->bbm_size =3D 2; > + } else { > + ecc->ecc_bytes_hw =3D 7; > + ecc->spare_bytes =3D 4; > + ecc->bbm_size =3D 1; > + } > + } else { > + /* RS */ > + ecc->ecc_bytes_hw =3D 10; > + if (wide_bus) { > + ecc->spare_bytes =3D 0; > + ecc->bbm_size =3D 2; > + } else { > + ecc->spare_bytes =3D 1; > + ecc->bbm_size =3D 1; > + } > + } > + } > + > + return 0; > +} > +EXPORT_SYMBOL(qcom_ecc_config); 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 59FAFC4332F for ; Tue, 31 Oct 2023 15:29:17 +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:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=qPp3GT5NBXEbQmROKpWbZFtJRBhIhZZ4+SFINOWJZkQ=; b=Q1yB/W5t3zc2tU PkiF0gzTjdzV90Rmlc21A7FEhq+PmEuU03fmEqrZK9gl95rhAaNbk/lQTED296bDkhO8TIWdR85dp tAmTDZYLA23YhxR0PxtSLFWzOiJ9qNtyMHKmsWS9om4iJYJWyKaskdt7BxH8F1umrmXojlN3L69Y7 dtvSsCwdcSGoSZheYBRKXGJUuuXkNr0GnAK/3caG+q44TCBFnQbGz+mlgwS36HhPimCQ5aEcdP6eG wa8gKsP5wKwqn1Q312MCVdFdVcY5COrh7o55Pg9BXGkjwTa44rHEk0MBKxNBZAn8NiDE9I4HrmTDX EOOMCKgYcs25+A/D6dFQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qxqg3-005Wuq-2p; Tue, 31 Oct 2023 15:29:11 +0000 Received: from relay5-d.mail.gandi.net ([217.70.183.197]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1qxqfz-005Wty-0T for linux-mtd@lists.infradead.org; Tue, 31 Oct 2023 15:29:09 +0000 Received: by mail.gandi.net (Postfix) with ESMTPSA id 363031C000B; Tue, 31 Oct 2023 15:28:58 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1698766141; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=RPYUkZNPreY88VDhOmVn3AFyOFRRtuLzyph5YgbM3vw=; b=eP6LsbtTgo6LDa5+lKR/f83CNNGqISbapv0U2I6aLXb3X2fCHkzNPjvbXI1xd8xmC8qEsu ZP+B3iYZkLiCfqYxfwRtRmYIgodRCtj5xUMpZ3+md0+S3mkMWhz3PmgtFW8ZtViHj+2oA7 0Fr17W394i8zUeZPr8rGCvn86z/D01hN4L1Hj/MfJUbqhT33IcrHURRtb4+JEzcNukl009 UNfV5KwMIhT5KmeWzzo1hY1mHENs+Of8aq//RVhE9iono7AxX+yNSFJLx18/ot9RPr/qEc xNLLGDLNcQaWDcmYUZQa22+G2wydV42L2Qq+LzH0euWuFOiOUQMIlhiu7as/qQ== Date: Tue, 31 Oct 2023 16:28:56 +0100 From: Miquel Raynal To: Md Sadre Alam Cc: agross@kernel.org, andersson@kernel.org, konrad.dybcio@linaro.org, robh+dt@kernel.org, conor+dt@kernel.org, krzysztof.kozlowski+dt@linaro.org, richard@nod.at, vigneshr@ti.com, broonie@kernel.org, linux-arm-msm@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mtd@lists.infradead.org, linux-spi@vger.kernel.org, quic_srichara@quicinc.com, qpic_varada@quicinc.com Subject: Re: [RFC PATCH 1/5] mtd: nand: ecc-qcom: Add support for ECC Engine Driver Message-ID: <20231031162856.1d9e3246@xps-13> In-Reply-To: <20231031120307.1600689-2-quic_mdalam@quicinc.com> References: <20231031120307.1600689-1-quic_mdalam@quicinc.com> <20231031120307.1600689-2-quic_mdalam@quicinc.com> Organization: Bootlin X-Mailer: Claws Mail 4.0.0 (GTK+ 3.24.33; x86_64-pc-linux-gnu) MIME-Version: 1.0 X-GND-Sasl: miquel.raynal@bootlin.com X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20231031_082907_482316_69C249FB X-CRM114-Status: GOOD ( 29.26 ) X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Linux MTD discussion 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-mtd" Errors-To: linux-mtd-bounces+linux-mtd=archiver.kernel.org@lists.infradead.org SGksCgpxdWljX21kYWxhbUBxdWljaW5jLmNvbSB3cm90ZSBvbiBUdWUsIDMxIE9jdCAyMDIzIDE3 OjMzOjAzICswNTMwOgoKQ29tbWl0IGxvZyBpcyBtaXNzaW5nLgoKPiBTaWduZWQtb2ZmLWJ5OiBN ZCBTYWRyZSBBbGFtIDxxdWljX21kYWxhbUBxdWljaW5jLmNvbT4KPiBTaWduZWQtb2ZmLWJ5OiBT cmljaGFyYW4gUiA8cXVpY19zcmljaGFyYUBxdWljaW5jLmNvbT4KCklmIFNyaWNoYXJhbiBpcyBh IGNvIGRldmVsb3BlciB5b3UgbmVlZCB0byB1c2UgdGhlIHJpZ2h0IHRhZ3MuIFBsZWFzZQpoYXZl IGEgbG9vayBhdCB0aGUgZG9jdW1lbnRhdGlvbi4gVXNpbmcgdGhlIHR3byBTb0IgaGVyZSBkb2Vz IG5vdCBtZWFuCmFueXRoaW5nLgoKPiAtLS0KPiAgZHJpdmVycy9tdGQvbmFuZC9LY29uZmlnICAg IHwgICA3ICsrCj4gIGRyaXZlcnMvbXRkL25hbmQvTWFrZWZpbGUgICB8ICAgMSArCj4gIGRyaXZl cnMvbXRkL25hbmQvZWNjLXFjb20uYyB8IDE5OCArKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysKPiAgMyBmaWxlcyBjaGFuZ2VkLCAyMDYgaW5zZXJ0aW9ucygrKQo+ICBjcmVhdGUg bW9kZSAxMDA2NDQgZHJpdmVycy9tdGQvbmFuZC9lY2MtcWNvbS5jCj4gCj4gZGlmZiAtLWdpdCBh L2RyaXZlcnMvbXRkL25hbmQvS2NvbmZpZyBiL2RyaXZlcnMvbXRkL25hbmQvS2NvbmZpZwo+IGlu ZGV4IDViMGMyYzk1ZjEwYy4uMzMzY2VjODE4N2M4IDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvbXRk L25hbmQvS2NvbmZpZwo+ICsrKyBiL2RyaXZlcnMvbXRkL25hbmQvS2NvbmZpZwo+IEBAIC02MSw2 ICs2MSwxMyBAQCBjb25maWcgTVREX05BTkRfRUNDX01FRElBVEVLCj4gIAloZWxwCj4gIAkgIFRo aXMgZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgaGFyZHdhcmUgRUNDIGVuZ2luZSBmcm9tIE1lZGlh dGVrLgo+ICAKPiArY29uZmlnIE1URF9OQU5EX0VDQ19RQ09NCj4gKwl0cmlzdGF0ZSAiUXVhbGNv bW0gaGFyZHdhcmUgRUNDIGVuZ2luZSIKPiArCWRlcGVuZHMgb24gQVJDSF9RQ09NCgpTYW1lIGNv bW1lbnQgYXMgTWFyayByZWdhcmRpbmcgQ09NUElMRV9URVNUCgo+ICsJc2VsZWN0IE1URF9OQU5E X0VDQwo+ICsJaGVscAo+ICsJICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIGhhcmR3YXJl IEVDQyBlbmdpbmUgZnJvbSBRdWFsY29tbS4KPiArCj4gIGVuZG1lbnUKPiAgCj4gIGVuZG1lbnUK PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9NYWtlZmlsZSBiL2RyaXZlcnMvbXRkL25h bmQvTWFrZWZpbGUKPiBpbmRleCAxOWUxMjkxYWM0ZDUuLmM3M2I4YTM0NTZlYyAxMDA2NDQKPiAt LS0gYS9kcml2ZXJzL210ZC9uYW5kL01ha2VmaWxlCj4gKysrIGIvZHJpdmVycy9tdGQvbmFuZC9N YWtlZmlsZQo+IEBAIC0zLDYgKzMsNyBAQAo+ICBuYW5kY29yZS1vYmpzIDo9IGNvcmUubyBiYnQu bwo+ICBvYmotJChDT05GSUdfTVREX05BTkRfQ09SRSkgKz0gbmFuZGNvcmUubwo+ICBvYmotJChD T05GSUdfTVREX05BTkRfRUNDX01FRElBVEVLKSArPSBlY2MtbXRrLm8KPiArb2JqLSQoQ09ORklH X01URF9OQU5EX0VDQ19RQ09NKSArPSBlY2MtcWNvbS5vIHFwaWNfY29tbW9uLm8KPiAgCj4gIG9i ai15CSs9IG9uZW5hbmQvCj4gIG9iai15CSs9IHJhdy8KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9t dGQvbmFuZC9lY2MtcWNvbS5jIGIvZHJpdmVycy9tdGQvbmFuZC9lY2MtcWNvbS5jCj4gbmV3IGZp bGUgbW9kZSAxMDA2NDQKPiBpbmRleCAwMDAwMDAwMDAwMDAuLmE4NTQyM2VkMzY4YQo+IC0tLSAv ZGV2L251bGwKPiArKysgYi9kcml2ZXJzL210ZC9uYW5kL2VjYy1xY29tLmMKPiBAQCAtMCwwICsx LDE5OCBAQAo+ICsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCBPUiBNSVQKPiAr LyoKPiArICogUUNPTSBFQ0MgRW5naW5lICBEcml2ZXIuCj4gKyAqIENvcHlyaWdodCAoQykgMjAy MyAgUXVhbGNvbW0gSW5jLgo+ICsgKiBBdXRob3JzOglNZCBzYWRyZSBBbGFtCQk8cXVpY19tZGFs YW1AcXVpY2luYy5jb20+Cj4gKyAqCQlTcmljaGFyYW4gUgkJPHF1aWNfc3JpY2hhcmFAcXVpY2lu Yy5jb20+Cj4gKyAqLwo+ICsKPiArI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgo+ ICsjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KPiArI2luY2x1ZGUgPGxpbnV4L2ludGVy cnVwdC5oPgo+ICsjaW5jbHVkZSA8bGludXgvY2xrLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9tb2R1 bGUuaD4KPiArI2luY2x1ZGUgPGxpbnV4L2lvcG9sbC5oPgo+ICsjaW5jbHVkZSA8bGludXgvb2Yu aD4KPiArI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9t dXRleC5oPgo+ICsjaW5jbHVkZSA8bGludXgvbXRkL25hbmQtcXBpYy1jb21tb24uaD4KPiArCj4g Kwo+ICsKPiArLyogRUNDIG1vZGVzIHN1cHBvcnRlZCBieSB0aGUgY29udHJvbGxlciAqLwo+ICsj ZGVmaW5lIEVDQ19OT05FICAgICAgICBCSVQoMCkKPiArI2RlZmluZSBFQ0NfUlNfNEJJVCAgICAg QklUKDEpCj4gKyNkZWZpbmUgRUNDX0JDSF80QklUICAgIEJJVCgyKQo+ICsjZGVmaW5lIEVDQ19C Q0hfOEJJVCAgICBCSVQoMykKPiArCj4gK3N0cnVjdCBxcGljX2VjY19jYXBzIHsKPiArCXUzMiBl cnJfbWFzazsKPiArCXUzMiBlcnJfc2hpZnQ7Cj4gKwljb25zdCB1OCAqZWNjX3N0cmVuZ3RoOwo+ ICsJY29uc3QgdTMyICplY2NfcmVnczsKPiArCXU4IG51bV9lY2Nfc3RyZW5ndGg7Cj4gKwl1OCBl Y2NfbW9kZV9zaGlmdDsKPiArCXUzMiBwYXJpdHlfYml0czsKPiArCWludCBwZ19pcnFfc2VsOwo+ ICt9Owo+ICsKPiArCj4gK3N0cnVjdCBxY29tX25hbmRfaG9zdCAqdG9fcWNvbV9uYW5kX2hvc3Qo c3RydWN0IG5hbmRfY2hpcCAqY2hpcCkKPiArewo+ICsJcmV0dXJuIGNvbnRhaW5lcl9vZihjaGlw LCBzdHJ1Y3QgcWNvbV9uYW5kX2hvc3QsIGNoaXApOwo+ICt9Cj4gK0VYUE9SVF9TWU1CT0wodG9f cWNvbV9uYW5kX2hvc3QpOwo+ICsKPiArc3RydWN0IHFjb21fbmFuZF9jb250cm9sbGVyICoKPiAr Z2V0X3Fjb21fbmFuZF9jb250cm9sbGVyKHN0cnVjdCBuYW5kX2NoaXAgKmNoaXApCj4gK3sKPiAr CXJldHVybiBjb250YWluZXJfb2YoY2hpcC0+Y29udHJvbGxlciwgc3RydWN0IHFjb21fbmFuZF9j b250cm9sbGVyLAo+ICsJCQkgICAgY29udHJvbGxlcik7Cj4gK30KPiArRVhQT1JUX1NZTUJPTChn ZXRfcWNvbV9uYW5kX2NvbnRyb2xsZXIpOwo+ICsKPiArc3RhdGljIHN0cnVjdCBxcGljX2VjYyAq cXBpY19lY2NfZ2V0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCj4gK3sKPiArCXN0cnVjdCBwbGF0 Zm9ybV9kZXZpY2UgKnBkZXY7Cj4gKwlzdHJ1Y3QgcXBpY19lY2MgKmVjYzsKPiArCj4gKwlwZGV2 ID0gb2ZfZmluZF9kZXZpY2VfYnlfbm9kZShucCk7Cj4gKwlpZiAoIXBkZXYpCj4gKwkJcmV0dXJu IEVSUl9QVFIoLUVQUk9CRV9ERUZFUik7Cj4gKwo+ICsJZWNjID0gcGxhdGZvcm1fZ2V0X2RydmRh dGEocGRldik7Cj4gKwlpZiAoIWVjYykgewo+ICsJCXB1dF9kZXZpY2UoJnBkZXYtPmRldik7Cj4g KwkJcmV0dXJuIEVSUl9QVFIoLUVQUk9CRV9ERUZFUik7Cj4gKwl9Cj4gKwo+ICsJcmV0dXJuIGVj YzsKPiArfQo+ICsKPiArc3RydWN0IHFwaWNfZWNjICpvZl9xcGljX2VjY19nZXQoc3RydWN0IGRl dmljZV9ub2RlICpvZl9ub2RlKQo+ICt7Cj4gKwlzdHJ1Y3QgcXBpY19lY2MgKmVjYyA9IE5VTEw7 Cj4gKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwo+ICsKPiArCW5wID0gb2ZfcGFyc2VfcGhhbmRs ZShvZl9ub2RlLCAibmFuZC1lY2MtZW5naW5lIiwgMCk7Cj4gKwkvKiBmb3IgYmFja3dhcmQgY29t cGF0aWJpbGl0eSAqLwoKVGhlcmUgaXMgbm8gYmFja3dhcmQgY29tcGF0aWJpbGl0eSB0byBoYW5k bGUgdXBzdHJlYW0KCj4gKwlpZiAoIW5wKQo+ICsJCW5wID0gb2ZfcGFyc2VfcGhhbmRsZShvZl9u b2RlLCAiZWNjLWVuZ2luZSIsIDApOwo+ICsJaWYgKG5wKSB7Cj4gKwkJZWNjID0gcXBpY19lY2Nf Z2V0KG5wKTsKPiArCQlvZl9ub2RlX3B1dChucCk7Cj4gKwl9Cj4gKwo+ICsJcmV0dXJuIGVjYzsK PiArfQo+ICtFWFBPUlRfU1lNQk9MKG9mX3FwaWNfZWNjX2dldCk7Cj4gKwo+ICtpbnQgcWNvbV9l Y2NfY29uZmlnKHN0cnVjdCBxcGljX2VjYyAgKmVjYywgaW50IGVjY19zdHJlbmd0aCwKPiArCQkJ Ym9vbCB3aWRlX2J1cykKPiArewo+ICsJZWNjLT5lY2NfbW9kZXMgPSAoRUNDX1JTXzRCSVQgfCBF Q0NfQkNIXzhCSVQpOwo+ICsKPiArCWlmIChlY2Nfc3RyZW5ndGggPj0gOCkgewoKSWYgeW91ciBl bmdpbmUgZG9lcyBub3Qgc3VwcG9ydCBtb3JlIHRoYW4gYW4gOC1iaXQgc3RyZW5ndGggdGhpcwpj b25kaXRpb24gc2VlbXMgYSBiaXQgc3RyYW5nZS4KCj4gKwkJLyogOCBiaXQgRUNDIGRlZmF1bHRz IHRvIEJDSCBFQ0Mgb24gYWxsIHBsYXRmb3JtcyAqLwo+ICsJCWVjYy0+YmNoX2VuYWJsZWQgPSB0 cnVlOwo+ICsJCWVjYy0+ZWNjX21vZGUgPSAxOwoKZWNjX21vZGVzIGFib3ZlLCBlY2NfbW9kZSBo ZXJlLCBub3QgdmVyeSBjbGVhciB3aGF0IHRoaXMgaXMuClBsZWFzZSBnaXZlIG1lYW5pbmdmdWwg bmFtZXMgdG8geW91ciB2YXJpYWJsZXMsIG5vdCBqdXN0IHRoZSBiaXQgbmFtZQp0aGF0IHRoaXMg aXMgY2FwdHVyaW5nIGJlY2F1c2UgaGVyZSBpdCdzIHVuY2xlYXIgd2hhdCB0aGlzIGlzLgoKPiAr Cj4gKwkJaWYgKHdpZGVfYnVzKSB7Cj4gKwkJCWVjYy0+ZWNjX2J5dGVzX2h3ID0gMTQ7Cj4gKwkJ CWVjYy0+c3BhcmVfYnl0ZXMgPSAwOwoKU3BhcmUgYnl0ZXMgZGVwZW5kIG9uIHRoZSBmbGFzaCwg eW91IGNhbid0IHVzZSBjb25zdGFudCB2YWx1ZXMgbGlrZQp0aGF0LgoKSSBhbHNvIGRvbid0IHVu ZGVyc3RhbmQgd2hhdCB3aWRlX2J1cyBpcyBhbmQgd2h5IGl0IGhhcyBhbiBpbXBhY3Qgb2YKb25s eSAxIG9uIHRoZSBudW1iZXIgb2YgRUNDIGJ5dGVzLiBQbGVhc2UgbWFrZSBhbGwgdGhpcyBtb3Jl IGV4cGxpY2l0LgoKPiArCQkJZWNjLT5iYm1fc2l6ZSA9IDI7Cj4gKwkJfSBlbHNlIHsKPiArCQkJ ZWNjLT5lY2NfYnl0ZXNfaHcgPSAxMzsKPiArCQkJZWNjLT5zcGFyZV9ieXRlcyA9IDI7Cj4gKwkJ CWVjYy0+YmJtX3NpemUgPSAxOwo+ICsJCX0KPiArCX0gZWxzZSB7Cj4gKwkJLyoKPiArCQkgKiBp ZiB0aGUgY29udHJvbGxlciBzdXBwb3J0cyBCQ0ggZm9yIDQgYml0IEVDQywgdGhlIGNvbnRyb2xs ZXIKPiArCQkgKiB1c2VzIGxlc3NlciBieXRlcyBmb3IgRUNDLiBJZiBSUyBpcyB1c2VkLCB0aGUg RUNDIGJ5dGVzIGlzCj4gKwkJICogYWx3YXlzIDEwIGJ5dGVzCj4gKwkJICovCj4gKwkJaWYgKGVj Yy0+ZWNjX21vZGVzICYgRUNDX0JDSF80QklUKSB7Cj4gKwkJCS8qIEJDSCAqLwo+ICsJCQllY2Mt PmJjaF9lbmFibGVkID0gdHJ1ZTsKPiArCQkJZWNjLT5lY2NfbW9kZSA9IDA7Cj4gKwkJCWlmICh3 aWRlX2J1cykgewo+ICsJCQkJZWNjLT5lY2NfYnl0ZXNfaHcgPSA4Owo+ICsJCQkJZWNjLT5zcGFy ZV9ieXRlcyA9IDI7Cj4gKwkJCQllY2MtPmJibV9zaXplID0gMjsKPiArCQkJfSBlbHNlIHsKPiAr CQkJCWVjYy0+ZWNjX2J5dGVzX2h3ID0gNzsKPiArCQkJCWVjYy0+c3BhcmVfYnl0ZXMgPSA0Owo+ ICsJCQkJZWNjLT5iYm1fc2l6ZSA9IDE7Cj4gKwkJCX0KPiArCQl9IGVsc2Ugewo+ICsJCQkvKiBS UyAqLwo+ICsJCQllY2MtPmVjY19ieXRlc19odyA9IDEwOwo+ICsJCQlpZiAod2lkZV9idXMpIHsK PiArCQkJCWVjYy0+c3BhcmVfYnl0ZXMgPSAwOwo+ICsJCQkJZWNjLT5iYm1fc2l6ZSA9IDI7Cj4g KwkJCX0gZWxzZSB7Cj4gKwkJCQllY2MtPnNwYXJlX2J5dGVzID0gMTsKPiArCQkJCWVjYy0+YmJt X3NpemUgPSAxOwo+ICsJCQl9Cj4gKwkJfQo+ICsJfQo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4g K0VYUE9SVF9TWU1CT0wocWNvbV9lY2NfY29uZmlnKTsKClRoYW5rcywKTWlxdcOobAoKX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkxpbnV4IE1U RCBkaXNjdXNzaW9uIG1haWxpbmcgbGlzdApodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWls bWFuL2xpc3RpbmZvL2xpbnV4LW10ZC8K