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 C4E61EB64D9 for ; Tue, 4 Jul 2023 14:50:59 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231309AbjGDOu6 (ORCPT ); Tue, 4 Jul 2023 10:50:58 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58468 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229603AbjGDOu6 (ORCPT ); Tue, 4 Jul 2023 10:50:58 -0400 Received: from relay7-d.mail.gandi.net (relay7-d.mail.gandi.net [217.70.183.200]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6DFB710D3; Tue, 4 Jul 2023 07:50:55 -0700 (PDT) X-GND-Sasl: miquel.raynal@bootlin.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1688482254; 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=hAa7biTsEED7+TVhihDfqMHafKwUs8+5OXhvg/ElE2s=; b=YWOIxp7ej0lyjKKecyJ5g5EpkiQ0RanVWn9ynveagXeTCSCdxEuVU/rrz47+vjlr/C4fO4 LZkvdu37RdsbaAdhsVevTFxHZK8bo7b7lD9/Hm/caoZ9Ehz+Frww2+kVM7rcfY08vaOlm7 b+ttbprF9qH/WPTgxsZRu6mm99WoTttwdLn4FIHfJQzMhjm5Ft7fiEGiw7DhHOjc3vsZH6 gSUC071MEX+YTN7N93yDZsvXZg6/35YCLq3cYnUOca/l5yWXBI7ul9BQtx+YctOCC8PWak X4nKtlA8XpKpm6IbFy0GX63yH23yAOMomYH4WfaHP4HjpWpGPQ2OplFXxfylQQ== X-GND-Sasl: miquel.raynal@bootlin.com X-GND-Sasl: miquel.raynal@bootlin.com X-GND-Sasl: miquel.raynal@bootlin.com X-GND-Sasl: miquel.raynal@bootlin.com X-GND-Sasl: miquel.raynal@bootlin.com X-GND-Sasl: miquel.raynal@bootlin.com X-GND-Sasl: miquel.raynal@bootlin.com Received: by mail.gandi.net (Postfix) with ESMTPSA id 331CB2000B; Tue, 4 Jul 2023 14:50:53 +0000 (UTC) Date: Tue, 4 Jul 2023 16:50:52 +0200 From: Miquel Raynal To: Md Sadre Alam Cc: mani@kernel.org, richard@nod.at, vigneshr@ti.com, linux-mtd@lists.infradead.org, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, quic_srichara@quicinc.com Subject: Re: [PATCH v4 1/5] mtd: rawnand: qcom: Implement exec_op() Message-ID: <20230704165052.30039969@xps-13> In-Reply-To: <20230615073143.25079-1-quic_mdalam@quicinc.com> References: <20230615073143.25079-1-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 Precedence: bulk List-ID: X-Mailing-List: linux-arm-msm@vger.kernel.org Hi, quic_mdalam@quicinc.com wrote on Thu, 15 Jun 2023 13:01:39 +0530: > Implement exec_op() so we can later get rid of the legacy interface > implementation. >=20 > Co-developed-by: Sricharan Ramabadhran > Signed-off-by: Sricharan Ramabadhran > Signed-off-by: Md Sadre Alam > --- > Change in [v4] >=20 > * No change for this patch, since this is part of exec_op > series posting new patch. >=20 > Change in [v3] >=20 > * Removed NAND_CMD_STATUS check in pre_command and move > it to status exec_op. >=20 > * Removed min() , since this check not needed >=20 > * Removed all the dummy APIs of exec_ops, and added it > into same patch where its getting added. >=20 > * Added qcom_check_op() API to check for unsupported feature > by controller in check_only path. >=20 > Change in [v2] >=20 > * Missed to post Cover-letter, so posting v2 patch with cover-letter >=20 > Change in [v1] >=20 > * Added initial support for exec_ops. >=20 > drivers/mtd/nand/raw/qcom_nandc.c | 159 ++++++++++++++++++++++++++++++ > 1 file changed, 159 insertions(+) >=20 > diff --git a/drivers/mtd/nand/raw/qcom_nandc.c b/drivers/mtd/nand/raw/qco= m_nandc.c > index 72d6168d8a1b..d9c4c9fe2fe8 100644 > --- a/drivers/mtd/nand/raw/qcom_nandc.c > +++ b/drivers/mtd/nand/raw/qcom_nandc.c > @@ -157,6 +157,7 @@ > #define OP_PAGE_PROGRAM_WITH_ECC 0x7 > #define OP_PROGRAM_PAGE_SPARE 0x9 > #define OP_BLOCK_ERASE 0xa > +#define OP_CHECK_STATUS 0xc > #define OP_FETCH_ID 0xb > #define OP_RESET_DEVICE 0xd > =20 > @@ -235,6 +236,8 @@ nandc_set_reg(chip, reg, \ > */ > #define NAND_ERASED_CW_SET BIT(4) > =20 > +#define MAX_ADDRESS_CYCLE 5 > +#define MAX_CHUNK_SIZE SZ_8K New line. > /* > * This data type corresponds to the BAM transaction which will be used = for all > * NAND transfers. > @@ -447,6 +450,29 @@ struct qcom_nand_boot_partition { > u32 page_size; > }; > =20 > +/* > + * Qcom op for each exec_op transfer > + * > + * @data_instr: data instruction pointer > + * @data_instr_idx: data instruction index > + * @rdy_timeout_ms: wait ready timeout in ms > + * @rdy_delay_ns: Additional delay in ns > + * @addr1_reg: Address1 register value > + * @addr2_reg: Address2 register value > + * @cmd_reg: CMD register value > + * @flag: flag for misc instruction > + */ > +struct qcom_op { > + const struct nand_op_instr *data_instr; > + unsigned int data_instr_idx; > + unsigned int rdy_timeout_ms; > + unsigned int rdy_delay_ns; > + u32 addr1_reg; > + u32 addr2_reg; > + u32 cmd_reg; > + u8 flag; > +}; > + > /* > * NAND chip structure > * > @@ -2867,8 +2893,141 @@ static int qcom_nand_attach_chip(struct nand_chip= *chip) > return 0; > } > =20 > +static int qcom_op_cmd_mapping(struct qcom_nand_controller *nandc, u8 cm= d, > + struct qcom_op *q_op) > +{ > + int ret; > + > + switch (cmd) { > + case NAND_CMD_RESET: > + ret =3D OP_RESET_DEVICE; > + break; > + case NAND_CMD_READID: > + ret =3D OP_FETCH_ID; > + break; > + case NAND_CMD_PARAM: > + if (nandc->props->qpic_v2) > + ret =3D OP_PAGE_READ_ONFI_READ; > + else > + ret =3D OP_PAGE_READ; > + break; > + case NAND_CMD_ERASE1: > + case NAND_CMD_ERASE2: > + ret =3D OP_BLOCK_ERASE; > + break; > + case NAND_CMD_STATUS: > + ret =3D OP_CHECK_STATUS; > + break; > + case NAND_CMD_PAGEPROG: > + ret =3D OP_PROGRAM_PAGE; > + break; > + default: Again, this is not a supported case, you should handle it. And this must be checked upon check_only conditions as well. > + break; > + } > + > + return ret; > +} > + > +/* NAND framework ->exec_op() hooks and related helpers */ > +static void qcom_parse_instructions(struct nand_chip *chip, > + const struct nand_subop *subop, > + struct qcom_op *q_op) > +{ > + struct qcom_nand_controller *nandc =3D get_qcom_nand_controller(chip); > + const struct nand_op_instr *instr =3D NULL; > + unsigned int op_id; > + int i; > + > + memset(q_op, 0, sizeof(*q_op)); > + > + for (op_id =3D 0; op_id < subop->ninstrs; op_id++) { > + unsigned int offset, naddrs; > + const u8 *addrs; > + > + instr =3D &subop->instrs[op_id]; > + > + switch (instr->type) { > + case NAND_OP_CMD_INSTR: > + q_op->cmd_reg =3D qcom_op_cmd_mapping(nandc, instr->ctx.cmd.opcode, q= _op); > + q_op->rdy_delay_ns =3D instr->delay_ns; > + break; > + > + case NAND_OP_ADDR_INSTR: > + offset =3D nand_subop_get_addr_start_off(subop, op_id); > + naddrs =3D nand_subop_get_num_addr_cyc(subop, op_id); > + addrs =3D &instr->ctx.addr.addrs[offset]; > + for (i =3D 0; i < MAX_ADDRESS_CYCLE; i++) { > + if (i < 4) > + q_op->addr1_reg |=3D (u32)addrs[i] << i * 8; > + else > + q_op->addr2_reg |=3D addrs[i]; > + } > + q_op->rdy_delay_ns =3D instr->delay_ns; > + break; > + > + case NAND_OP_DATA_IN_INSTR: > + q_op->data_instr =3D instr; > + q_op->data_instr_idx =3D op_id; > + q_op->rdy_delay_ns =3D instr->delay_ns; > + fallthrough; > + case NAND_OP_DATA_OUT_INSTR: > + q_op->rdy_delay_ns =3D instr->delay_ns; > + break; > + > + case NAND_OP_WAITRDY_INSTR: > + q_op->rdy_timeout_ms =3D instr->ctx.waitrdy.timeout_ms; > + q_op->rdy_delay_ns =3D instr->delay_ns; > + break; > + } > + } > +} > + > +static int qcom_check_op(struct nand_chip *chip, > + const struct nand_operation *op) > +{ > + const struct nand_op_instr *instr; > + int op_id; > + > + for (op_id =3D 0; op_id < op->ninstrs; op_id++) { > + instr =3D &op->instrs[op_id]; > + > + switch (instr->type) { > + case NAND_OP_CMD_INSTR: > + if (instr->ctx.cmd.opcode =3D=3D NAND_CMD_READCACHESEQ || > + instr->ctx.cmd.opcode =3D=3D NAND_CMD_READCACHEEND) > + return -ENOTSUPP; Do you really need this check? These operations have specific pattern, no? I believe you should not need this check. > + break; > + case NAND_OP_ADDR_INSTR: > + if (instr->ctx.addr.naddrs > MAX_ADDRESS_CYCLE) > + return -ENOTSUPP; This one is not needed either, as long as you properly define the patterns. > + > + break; > + case NAND_OP_DATA_IN_INSTR: > + case NAND_OP_DATA_OUT_INSTR: > + if (instr->ctx.data.len > MAX_CHUNK_SIZE) Same. > + return -ENOTSUPP; > + break; > + default: > + break; > + } > + } > + > + return 0; > +} > + > +static int qcom_nand_exec_op(struct nand_chip *chip, > + const struct nand_operation *op, > + bool check_only) > +{ > + if (check_only) > + return qcom_check_op(chip, op); > + > + return 0; > +} > + > static const struct nand_controller_ops qcom_nandc_ops =3D { > .attach_chip =3D qcom_nand_attach_chip, > + .exec_op =3D qcom_nand_exec_op, I understand the idea of making the series easier to review, and I thank you for that, but in practice the series is not bisectable. I doubt the driver works right after patch 1. You will likely need two patches, one to add exec_op, one to remove the legacy implementation. > }; > =20 > static void qcom_nandc_unalloc(struct qcom_nand_controller *nandc) 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 30901EB64D9 for ; Tue, 4 Jul 2023 14:51:10 +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=g6dkJjYmByxhrTLrzqpKMAUz/PtXAaemI65uVGCTZgE=; b=Y0mQkDsK/vQOYA 82GIIdBHzhWv0sCd1zaJ6zHHl7WCbSZpOt3Jr/1AWtT/0beeEQ3fm4+QQfx2a3bXpFoqq5RA7WLiQ SHtCO6tngxZotUM/+ZHmFp+kGV90+mOZvDVgBwz+zaneTqX16tw+8+aPCv9qPXi+l/4/T/t97aSUD 1LHDXrJEc2tDnOUxCswLBFVm+0ksuoXhESsb93MzihOslAG45MArZ19u0Mr1hPbvWsTRexp3YSkH3 4FJ+9k+M7pf+2nlKiBcnKX78QAXF/qZuQahvxiRVJKED3cSFZV1aKLlIISuyUX7qMnzicOkaPfP0t 5Nbd5qQ3dV5qFChXCeQQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qGhMr-00DYv5-0r; Tue, 04 Jul 2023 14:51:01 +0000 Received: from relay7-d.mail.gandi.net ([217.70.183.200]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1qGhMo-00DYtw-0A for linux-mtd@lists.infradead.org; Tue, 04 Jul 2023 14:51:00 +0000 X-GND-Sasl: miquel.raynal@bootlin.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1688482254; 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=hAa7biTsEED7+TVhihDfqMHafKwUs8+5OXhvg/ElE2s=; b=YWOIxp7ej0lyjKKecyJ5g5EpkiQ0RanVWn9ynveagXeTCSCdxEuVU/rrz47+vjlr/C4fO4 LZkvdu37RdsbaAdhsVevTFxHZK8bo7b7lD9/Hm/caoZ9Ehz+Frww2+kVM7rcfY08vaOlm7 b+ttbprF9qH/WPTgxsZRu6mm99WoTttwdLn4FIHfJQzMhjm5Ft7fiEGiw7DhHOjc3vsZH6 gSUC071MEX+YTN7N93yDZsvXZg6/35YCLq3cYnUOca/l5yWXBI7ul9BQtx+YctOCC8PWak X4nKtlA8XpKpm6IbFy0GX63yH23yAOMomYH4WfaHP4HjpWpGPQ2OplFXxfylQQ== X-GND-Sasl: miquel.raynal@bootlin.com X-GND-Sasl: miquel.raynal@bootlin.com X-GND-Sasl: miquel.raynal@bootlin.com X-GND-Sasl: miquel.raynal@bootlin.com X-GND-Sasl: miquel.raynal@bootlin.com X-GND-Sasl: miquel.raynal@bootlin.com X-GND-Sasl: miquel.raynal@bootlin.com Received: by mail.gandi.net (Postfix) with ESMTPSA id 331CB2000B; Tue, 4 Jul 2023 14:50:53 +0000 (UTC) Date: Tue, 4 Jul 2023 16:50:52 +0200 From: Miquel Raynal To: Md Sadre Alam Cc: mani@kernel.org, richard@nod.at, vigneshr@ti.com, linux-mtd@lists.infradead.org, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, quic_srichara@quicinc.com Subject: Re: [PATCH v4 1/5] mtd: rawnand: qcom: Implement exec_op() Message-ID: <20230704165052.30039969@xps-13> In-Reply-To: <20230615073143.25079-1-quic_mdalam@quicinc.com> References: <20230615073143.25079-1-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-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230704_075058_498633_39D099BD X-CRM114-Status: GOOD ( 31.14 ) 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 SGksCgpxdWljX21kYWxhbUBxdWljaW5jLmNvbSB3cm90ZSBvbiBUaHUsIDE1IEp1biAyMDIzIDEz OjAxOjM5ICswNTMwOgoKPiBJbXBsZW1lbnQgZXhlY19vcCgpIHNvIHdlIGNhbiBsYXRlciBnZXQg cmlkIG9mIHRoZSBsZWdhY3kgaW50ZXJmYWNlCj4gaW1wbGVtZW50YXRpb24uCj4gCj4gQ28tZGV2 ZWxvcGVkLWJ5OiBTcmljaGFyYW4gUmFtYWJhZGhyYW4gPHF1aWNfc3JpY2hhcmFAcXVpY2luYy5j b20+Cj4gU2lnbmVkLW9mZi1ieTogU3JpY2hhcmFuIFJhbWFiYWRocmFuIDxxdWljX3NyaWNoYXJh QHF1aWNpbmMuY29tPgo+IFNpZ25lZC1vZmYtYnk6IE1kIFNhZHJlIEFsYW0gPHF1aWNfbWRhbGFt QHF1aWNpbmMuY29tPgo+IC0tLQo+IENoYW5nZSBpbiBbdjRdCj4gCj4gKiBObyBjaGFuZ2UgZm9y IHRoaXMgcGF0Y2gsIHNpbmNlIHRoaXMgaXMgcGFydCBvZiBleGVjX29wCj4gICBzZXJpZXMgcG9z dGluZyBuZXcgcGF0Y2guCj4gCj4gQ2hhbmdlIGluIFt2M10KPiAKPiAqIFJlbW92ZWQgTkFORF9D TURfU1RBVFVTIGNoZWNrIGluIHByZV9jb21tYW5kIGFuZCBtb3ZlCj4gICBpdCB0byBzdGF0dXMg ZXhlY19vcC4KPiAKPiAqIFJlbW92ZWQgbWluKCkgLCBzaW5jZSB0aGlzIGNoZWNrIG5vdCBuZWVk ZWQKPiAKPiAqIFJlbW92ZWQgYWxsIHRoZSBkdW1teSBBUElzIG9mIGV4ZWNfb3BzLCBhbmQgYWRk ZWQgaXQKPiAgIGludG8gc2FtZSBwYXRjaCB3aGVyZSBpdHMgZ2V0dGluZyBhZGRlZC4KPiAKPiAq IEFkZGVkIHFjb21fY2hlY2tfb3AoKSBBUEkgdG8gY2hlY2sgZm9yIHVuc3VwcG9ydGVkIGZlYXR1 cmUKPiAgIGJ5IGNvbnRyb2xsZXIgaW4gY2hlY2tfb25seSBwYXRoLgo+IAo+IENoYW5nZSBpbiBb djJdCj4gCj4gKiBNaXNzZWQgdG8gcG9zdCBDb3Zlci1sZXR0ZXIsIHNvIHBvc3RpbmcgdjIgcGF0 Y2ggd2l0aCBjb3Zlci1sZXR0ZXIKPiAKPiBDaGFuZ2UgaW4gW3YxXQo+IAo+ICogQWRkZWQgaW5p dGlhbCBzdXBwb3J0IGZvciBleGVjX29wcy4KPiAKPiAgZHJpdmVycy9tdGQvbmFuZC9yYXcvcWNv bV9uYW5kYy5jIHwgMTU5ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwo+ICAxIGZpbGUg Y2hhbmdlZCwgMTU5IGluc2VydGlvbnMoKykKPiAKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQv bmFuZC9yYXcvcWNvbV9uYW5kYy5jIGIvZHJpdmVycy9tdGQvbmFuZC9yYXcvcWNvbV9uYW5kYy5j Cj4gaW5kZXggNzJkNjE2OGQ4YTFiLi5kOWM0YzlmZTJmZTggMTAwNjQ0Cj4gLS0tIGEvZHJpdmVy cy9tdGQvbmFuZC9yYXcvcWNvbV9uYW5kYy5jCj4gKysrIGIvZHJpdmVycy9tdGQvbmFuZC9yYXcv cWNvbV9uYW5kYy5jCj4gQEAgLTE1Nyw2ICsxNTcsNyBAQAo+ICAjZGVmaW5lCU9QX1BBR0VfUFJP R1JBTV9XSVRIX0VDQwkweDcKPiAgI2RlZmluZQlPUF9QUk9HUkFNX1BBR0VfU1BBUkUJCTB4OQo+ ICAjZGVmaW5lCU9QX0JMT0NLX0VSQVNFCQkJMHhhCj4gKyNkZWZpbmUJT1BfQ0hFQ0tfU1RBVFVT CQkJMHhjCj4gICNkZWZpbmUJT1BfRkVUQ0hfSUQJCQkweGIKPiAgI2RlZmluZQlPUF9SRVNFVF9E RVZJQ0UJCQkweGQKPiAgCj4gQEAgLTIzNSw2ICsyMzYsOCBAQCBuYW5kY19zZXRfcmVnKGNoaXAs IHJlZywJCQlcCj4gICAqLwo+ICAjZGVmaW5lIE5BTkRfRVJBU0VEX0NXX1NFVAkJQklUKDQpCj4g IAo+ICsjZGVmaW5lIE1BWF9BRERSRVNTX0NZQ0xFCQk1Cj4gKyNkZWZpbmUgTUFYX0NIVU5LX1NJ WkUJCQlTWl84SwoKTmV3IGxpbmUuCgo+ICAvKgo+ICAgKiBUaGlzIGRhdGEgdHlwZSBjb3JyZXNw b25kcyB0byB0aGUgQkFNIHRyYW5zYWN0aW9uIHdoaWNoIHdpbGwgYmUgdXNlZCBmb3IgYWxsCj4g ICAqIE5BTkQgdHJhbnNmZXJzLgo+IEBAIC00NDcsNiArNDUwLDI5IEBAIHN0cnVjdCBxY29tX25h bmRfYm9vdF9wYXJ0aXRpb24gewo+ICAJdTMyIHBhZ2Vfc2l6ZTsKPiAgfTsKPiAgCj4gKy8qCj4g KyAqIFFjb20gb3AgZm9yIGVhY2ggZXhlY19vcCB0cmFuc2Zlcgo+ICsgKgo+ICsgKiBAZGF0YV9p bnN0cjoJCQlkYXRhIGluc3RydWN0aW9uIHBvaW50ZXIKPiArICogQGRhdGFfaW5zdHJfaWR4OgkJ ZGF0YSBpbnN0cnVjdGlvbiBpbmRleAo+ICsgKiBAcmR5X3RpbWVvdXRfbXM6CQl3YWl0IHJlYWR5 IHRpbWVvdXQgaW4gbXMKPiArICogQHJkeV9kZWxheV9uczoJCUFkZGl0aW9uYWwgZGVsYXkgaW4g bnMKPiArICogQGFkZHIxX3JlZzoJCQlBZGRyZXNzMSByZWdpc3RlciB2YWx1ZQo+ICsgKiBAYWRk cjJfcmVnOgkJCUFkZHJlc3MyIHJlZ2lzdGVyIHZhbHVlCj4gKyAqIEBjbWRfcmVnOgkJCUNNRCBy ZWdpc3RlciB2YWx1ZQo+ICsgKiBAZmxhZzoJCQlmbGFnIGZvciBtaXNjIGluc3RydWN0aW9uCj4g KyAqLwo+ICtzdHJ1Y3QgcWNvbV9vcCB7Cj4gKwljb25zdCBzdHJ1Y3QgbmFuZF9vcF9pbnN0ciAq ZGF0YV9pbnN0cjsKPiArCXVuc2lnbmVkIGludCBkYXRhX2luc3RyX2lkeDsKPiArCXVuc2lnbmVk IGludCByZHlfdGltZW91dF9tczsKPiArCXVuc2lnbmVkIGludCByZHlfZGVsYXlfbnM7Cj4gKwl1 MzIgYWRkcjFfcmVnOwo+ICsJdTMyIGFkZHIyX3JlZzsKPiArCXUzMiBjbWRfcmVnOwo+ICsJdTgg ZmxhZzsKPiArfTsKPiArCj4gIC8qCj4gICAqIE5BTkQgY2hpcCBzdHJ1Y3R1cmUKPiAgICoKPiBA QCAtMjg2Nyw4ICsyODkzLDE0MSBAQCBzdGF0aWMgaW50IHFjb21fbmFuZF9hdHRhY2hfY2hpcChz dHJ1Y3QgbmFuZF9jaGlwICpjaGlwKQo+ICAJcmV0dXJuIDA7Cj4gIH0KPiAgCj4gK3N0YXRpYyBp bnQgcWNvbV9vcF9jbWRfbWFwcGluZyhzdHJ1Y3QgcWNvbV9uYW5kX2NvbnRyb2xsZXIgKm5hbmRj LCB1OCBjbWQsCj4gKwkJCSAgICAgICBzdHJ1Y3QgcWNvbV9vcCAqcV9vcCkKPiArewo+ICsJaW50 IHJldDsKPiArCj4gKwlzd2l0Y2ggKGNtZCkgewo+ICsJY2FzZSBOQU5EX0NNRF9SRVNFVDoKPiAr CQlyZXQgPSBPUF9SRVNFVF9ERVZJQ0U7Cj4gKwkJYnJlYWs7Cj4gKwljYXNlIE5BTkRfQ01EX1JF QURJRDoKPiArCQlyZXQgPSBPUF9GRVRDSF9JRDsKPiArCQlicmVhazsKPiArCWNhc2UgTkFORF9D TURfUEFSQU06Cj4gKwkJaWYgKG5hbmRjLT5wcm9wcy0+cXBpY192MikKPiArCQkJcmV0ID0gT1Bf UEFHRV9SRUFEX09ORklfUkVBRDsKPiArCQllbHNlCj4gKwkJCXJldCA9IE9QX1BBR0VfUkVBRDsK PiArCQlicmVhazsKPiArCWNhc2UgTkFORF9DTURfRVJBU0UxOgo+ICsJY2FzZSBOQU5EX0NNRF9F UkFTRTI6Cj4gKwkJcmV0ID0gT1BfQkxPQ0tfRVJBU0U7Cj4gKwkJYnJlYWs7Cj4gKwljYXNlIE5B TkRfQ01EX1NUQVRVUzoKPiArCQlyZXQgPSBPUF9DSEVDS19TVEFUVVM7Cj4gKwkJYnJlYWs7Cj4g KwljYXNlIE5BTkRfQ01EX1BBR0VQUk9HOgo+ICsJCXJldCA9IE9QX1BST0dSQU1fUEFHRTsKPiAr CQlicmVhazsKPiArCWRlZmF1bHQ6CgpBZ2FpbiwgdGhpcyBpcyBub3QgYSBzdXBwb3J0ZWQgY2Fz ZSwgeW91IHNob3VsZCBoYW5kbGUgaXQuIEFuZCB0aGlzCm11c3QgYmUgY2hlY2tlZCB1cG9uIGNo ZWNrX29ubHkgY29uZGl0aW9ucyBhcyB3ZWxsLgoKPiArCQlicmVhazsKPiArCX0KPiArCj4gKwly ZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICsvKiBOQU5EIGZyYW1ld29yayAtPmV4ZWNfb3AoKSBob29r cyBhbmQgcmVsYXRlZCBoZWxwZXJzICovCj4gK3N0YXRpYyB2b2lkIHFjb21fcGFyc2VfaW5zdHJ1 Y3Rpb25zKHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAsCj4gKwkJCQkgICAgY29uc3Qgc3RydWN0IG5h bmRfc3Vib3AgKnN1Ym9wLAo+ICsJCQkJCXN0cnVjdCBxY29tX29wICpxX29wKQo+ICt7Cj4gKwlz dHJ1Y3QgcWNvbV9uYW5kX2NvbnRyb2xsZXIgKm5hbmRjID0gZ2V0X3Fjb21fbmFuZF9jb250cm9s bGVyKGNoaXApOwo+ICsJY29uc3Qgc3RydWN0IG5hbmRfb3BfaW5zdHIgKmluc3RyID0gTlVMTDsK PiArCXVuc2lnbmVkIGludCBvcF9pZDsKPiArCWludCBpOwo+ICsKPiArCW1lbXNldChxX29wLCAw LCBzaXplb2YoKnFfb3ApKTsKPiArCj4gKwlmb3IgKG9wX2lkID0gMDsgb3BfaWQgPCBzdWJvcC0+ bmluc3Ryczsgb3BfaWQrKykgewo+ICsJCXVuc2lnbmVkIGludCBvZmZzZXQsIG5hZGRyczsKPiAr CQljb25zdCB1OCAqYWRkcnM7Cj4gKwo+ICsJCWluc3RyID0gJnN1Ym9wLT5pbnN0cnNbb3BfaWRd Owo+ICsKPiArCQlzd2l0Y2ggKGluc3RyLT50eXBlKSB7Cj4gKwkJY2FzZSBOQU5EX09QX0NNRF9J TlNUUjoKPiArCQkJcV9vcC0+Y21kX3JlZyA9IHFjb21fb3BfY21kX21hcHBpbmcobmFuZGMsIGlu c3RyLT5jdHguY21kLm9wY29kZSwgcV9vcCk7Cj4gKwkJCXFfb3AtPnJkeV9kZWxheV9ucyA9IGlu c3RyLT5kZWxheV9uczsKPiArCQkJYnJlYWs7Cj4gKwo+ICsJCWNhc2UgTkFORF9PUF9BRERSX0lO U1RSOgo+ICsJCQlvZmZzZXQgPSBuYW5kX3N1Ym9wX2dldF9hZGRyX3N0YXJ0X29mZihzdWJvcCwg b3BfaWQpOwo+ICsJCQluYWRkcnMgPSBuYW5kX3N1Ym9wX2dldF9udW1fYWRkcl9jeWMoc3Vib3As IG9wX2lkKTsKPiArCQkJYWRkcnMgPSAmaW5zdHItPmN0eC5hZGRyLmFkZHJzW29mZnNldF07Cj4g KwkJCWZvciAoaSA9IDA7IGkgPCBNQVhfQUREUkVTU19DWUNMRTsgaSsrKSB7Cj4gKwkJCQlpZiAo aSA8IDQpCj4gKwkJCQkJcV9vcC0+YWRkcjFfcmVnIHw9ICh1MzIpYWRkcnNbaV0gPDwgaSAqIDg7 Cj4gKwkJCQllbHNlCj4gKwkJCQkJcV9vcC0+YWRkcjJfcmVnIHw9IGFkZHJzW2ldOwo+ICsJCQl9 Cj4gKwkJCXFfb3AtPnJkeV9kZWxheV9ucyA9IGluc3RyLT5kZWxheV9uczsKPiArCQkJYnJlYWs7 Cj4gKwo+ICsJCWNhc2UgTkFORF9PUF9EQVRBX0lOX0lOU1RSOgo+ICsJCQlxX29wLT5kYXRhX2lu c3RyID0gaW5zdHI7Cj4gKwkJCXFfb3AtPmRhdGFfaW5zdHJfaWR4ID0gb3BfaWQ7Cj4gKwkJCXFf b3AtPnJkeV9kZWxheV9ucyA9IGluc3RyLT5kZWxheV9uczsKPiArCQkJZmFsbHRocm91Z2g7Cj4g KwkJY2FzZSBOQU5EX09QX0RBVEFfT1VUX0lOU1RSOgo+ICsJCQlxX29wLT5yZHlfZGVsYXlfbnMg PSBpbnN0ci0+ZGVsYXlfbnM7Cj4gKwkJCWJyZWFrOwo+ICsKPiArCQljYXNlIE5BTkRfT1BfV0FJ VFJEWV9JTlNUUjoKPiArCQkJcV9vcC0+cmR5X3RpbWVvdXRfbXMgPSBpbnN0ci0+Y3R4LndhaXRy ZHkudGltZW91dF9tczsKPiArCQkJcV9vcC0+cmR5X2RlbGF5X25zID0gaW5zdHItPmRlbGF5X25z Owo+ICsJCQlicmVhazsKPiArCQl9Cj4gKwl9Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgcWNvbV9j aGVja19vcChzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLAo+ICsJCQkgY29uc3Qgc3RydWN0IG5hbmRf b3BlcmF0aW9uICpvcCkKPiArewo+ICsJY29uc3Qgc3RydWN0IG5hbmRfb3BfaW5zdHIgKmluc3Ry Owo+ICsJaW50IG9wX2lkOwo+ICsKPiArCWZvciAob3BfaWQgPSAwOyBvcF9pZCA8IG9wLT5uaW5z dHJzOyBvcF9pZCsrKSB7Cj4gKwkJaW5zdHIgPSAmb3AtPmluc3Ryc1tvcF9pZF07Cj4gKwo+ICsJ CXN3aXRjaCAoaW5zdHItPnR5cGUpIHsKPiArCQljYXNlIE5BTkRfT1BfQ01EX0lOU1RSOgo+ICsJ CQlpZiAoaW5zdHItPmN0eC5jbWQub3Bjb2RlID09IE5BTkRfQ01EX1JFQURDQUNIRVNFUSB8fAo+ ICsJCQkgICAgaW5zdHItPmN0eC5jbWQub3Bjb2RlID09IE5BTkRfQ01EX1JFQURDQUNIRUVORCkK PiArCQkJCXJldHVybiAtRU5PVFNVUFA7CgpEbyB5b3UgcmVhbGx5IG5lZWQgdGhpcyBjaGVjaz8g VGhlc2Ugb3BlcmF0aW9ucyBoYXZlIHNwZWNpZmljIHBhdHRlcm4sCm5vPyBJIGJlbGlldmUgeW91 IHNob3VsZCBub3QgbmVlZCB0aGlzIGNoZWNrLgo+ICsJCQlicmVhazsKPiArCQljYXNlIE5BTkRf T1BfQUREUl9JTlNUUjoKPiArCQkJaWYgKGluc3RyLT5jdHguYWRkci5uYWRkcnMgPiBNQVhfQURE UkVTU19DWUNMRSkKPiArCQkJCXJldHVybiAtRU5PVFNVUFA7CgpUaGlzIG9uZSBpcyBub3QgbmVl ZGVkIGVpdGhlciwgYXMgbG9uZyBhcyB5b3UgcHJvcGVybHkgZGVmaW5lIHRoZQpwYXR0ZXJucy4K Cj4gKwo+ICsJCQlicmVhazsKPiArCQljYXNlIE5BTkRfT1BfREFUQV9JTl9JTlNUUjoKPiArCQlj YXNlIE5BTkRfT1BfREFUQV9PVVRfSU5TVFI6Cj4gKwkJCWlmIChpbnN0ci0+Y3R4LmRhdGEubGVu ID4gTUFYX0NIVU5LX1NJWkUpCgpTYW1lLgo+ICsJCQkJcmV0dXJuIC1FTk9UU1VQUDsKPiArCQkJ YnJlYWs7Cj4gKwkJZGVmYXVsdDoKPiArCQkJYnJlYWs7Cj4gKwkJfQo+ICsJfQo+ICsKPiArCXJl dHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IHFjb21fbmFuZF9leGVjX29wKHN0cnVjdCBu YW5kX2NoaXAgKmNoaXAsCj4gKwkJCSAgICAgY29uc3Qgc3RydWN0IG5hbmRfb3BlcmF0aW9uICpv cCwKPiArCQkJYm9vbCBjaGVja19vbmx5KQo+ICt7Cj4gKwlpZiAoY2hlY2tfb25seSkKPiArCQly ZXR1cm4gcWNvbV9jaGVja19vcChjaGlwLCBvcCk7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiAr Cj4gIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmFuZF9jb250cm9sbGVyX29wcyBxY29tX25hbmRjX29w cyA9IHsKPiAgCS5hdHRhY2hfY2hpcCA9IHFjb21fbmFuZF9hdHRhY2hfY2hpcCwKPiArCS5leGVj X29wID0gcWNvbV9uYW5kX2V4ZWNfb3AsCgpJIHVuZGVyc3RhbmQgdGhlIGlkZWEgb2YgbWFraW5n IHRoZSBzZXJpZXMgZWFzaWVyIHRvIHJldmlldywgYW5kIEkKdGhhbmsgeW91IGZvciB0aGF0LCBi dXQgaW4gcHJhY3RpY2UgdGhlIHNlcmllcyBpcyBub3QgYmlzZWN0YWJsZS4gSQpkb3VidCB0aGUg ZHJpdmVyIHdvcmtzIHJpZ2h0IGFmdGVyIHBhdGNoIDEuCgpZb3Ugd2lsbCBsaWtlbHkgbmVlZCB0 d28gcGF0Y2hlcywgb25lIHRvIGFkZCBleGVjX29wLCBvbmUgdG8gcmVtb3ZlIHRoZQpsZWdhY3kg aW1wbGVtZW50YXRpb24uCgo+ICB9Owo+ICAKPiAgc3RhdGljIHZvaWQgcWNvbV9uYW5kY191bmFs bG9jKHN0cnVjdCBxY29tX25hbmRfY29udHJvbGxlciAqbmFuZGMpCgoKVGhhbmtzLApNaXF1w6hs CgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18K TGludXggTVREIGRpc2N1c3Npb24gbWFpbGluZyBsaXN0Cmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQu b3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtbXRkLwo=