From nobody Wed Dec 17 00:05:03 2025 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 93FECC7EE43 for ; Thu, 24 Aug 2023 16:26:46 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242539AbjHXQ0T (ORCPT ); Thu, 24 Aug 2023 12:26:19 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60684 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242544AbjHXQ0M (ORCPT ); Thu, 24 Aug 2023 12:26:12 -0400 Received: from EUR01-HE1-obe.outbound.protection.outlook.com (mail-he1eur01on2059.outbound.protection.outlook.com [40.107.13.59]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C9ED71736; Thu, 24 Aug 2023 09:26:09 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=BA0toj5wLYFw0XMyfTHUu3tKQ8OLuRL5JySM9LMNKOXPCycmymQKu5jSQCIF/zP7JXkMkeqmgmE4OCFFzqlqnHUaEx3gfjtesMM5WaR7NXIiadTlTABQEWOTyknnSbIEo6b8C6tqXfsWIQ4FPRVu1ldUrz1MXDbrRlOPfruoJjq7Kvat/GEPB38pAAKFI2zW+PwXf509i9jC28Em+VkUYnM9x+EJ+wY/m6D6Ma9QfxDALUk9idc108r76DE2tDV8cVdw8a11INRD2iNEIE2kHGz4GMCqCk0DBJ2xFaKnmulc2CXB6asrDAuzVXxIwYoXUW7IxZwlOGVat8hMj9PAmg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=CaZh+/BCdP+oWQPDpDOGGD9BzLRANoJCexVMJHK4P9w=; b=RZrduVtMaCK+oo3LJNg5wyLwW9HOs6x3zD7wKUoQAQuJs1lqqq9FyPNezDqLjfOVE5oyLtKAcg7qEKOMJ0PCAkAILXp+XQqNN1QtQLS8wIgCIpP1n5xOvQeI79fcOHt/a5mpwaSh8NJ4b+N1J//gfDDAQSHf2u92p1yvOmGnlQ2wNdD+dXeLHGv6EWvyAnvmiFy75zIX9OvyblRsYMMO8juX2Y9u1VtceOpe9KtCOuigKlS7C1a5dT1MmeOmf+wquBqXAtrcbGQcK7pZHffRlmOppQVpGGZKTL+gjQUIx6xDG9gYroEbC4NWLZP7Mh86Ls3X2OUEgNjzHYp1I3Vwqw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass header.d=nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=CaZh+/BCdP+oWQPDpDOGGD9BzLRANoJCexVMJHK4P9w=; b=cKtW5+S6khmIUDivA/5OcLyqA1cESwo1iGO0crk38ItTWa0eZEYjNrJqoB637bUzTmK1nHQ6lMC0dXQxhhq6oXXVPeUSxw3B9gNSgAruMbdxkPuIP901LwFqer0IK/xQTT7X9dur8ETg9VICroRL5dkNYIU8OVPxywnRxIsJqhk= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from AM6PR04MB4838.eurprd04.prod.outlook.com (2603:10a6:20b:4::16) by AS1PR04MB9656.eurprd04.prod.outlook.com (2603:10a6:20b:478::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6699.27; Thu, 24 Aug 2023 16:26:08 +0000 Received: from AM6PR04MB4838.eurprd04.prod.outlook.com ([fe80::a680:2943:82d1:6aa8]) by AM6PR04MB4838.eurprd04.prod.outlook.com ([fe80::a680:2943:82d1:6aa8%3]) with mapi id 15.20.6699.027; Thu, 24 Aug 2023 16:26:08 +0000 From: Frank Li To: frank.li@nxp.com Cc: dmaengine@vger.kernel.org, imx@lists.linux.dev, joy.zou@nxp.com, linux-kernel@vger.kernel.org, peng.fan@nxp.com, shenwei.wang@nxp.com, vkoul@kernel.org Subject: [PATCH 1/2] dmaengine: fsl-edma: add debugfs support Date: Thu, 24 Aug 2023 12:25:47 -0400 Message-Id: <20230824162548.2940355-2-Frank.Li@nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230824162548.2940355-1-Frank.Li@nxp.com> References: <20230824162548.2940355-1-Frank.Li@nxp.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: BYAPR03CA0034.namprd03.prod.outlook.com (2603:10b6:a02:a8::47) To AM6PR04MB4838.eurprd04.prod.outlook.com (2603:10a6:20b:4::16) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AM6PR04MB4838:EE_|AS1PR04MB9656:EE_ X-MS-Office365-Filtering-Correlation-Id: 6ca428f2-5db2-4466-92ff-08dba4bed261 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: VYTpBDzAa4+QY6XR+GdUpaMvcEY7VwXiEAcVZpntruhB3MErPfPiVliGvMdHQPBE7AWRiqUltwnzNF2QJlW7nMdMENpw+enO9PYoc1r4CdPCrF1EnUvb1kwuRvWj+pPeAcD8AJpPL+6j6PPDsdcrS7sLCFrv/1g9Vav6f2baNAe/gY4Fhun1O6drzRgJqXw6PtTEFQgXVJcwJKmwHLi+YC0Vo3cFOPipBhlWFaCDzgojYy1sOkUkH/O/+NcNgXJG0D5sRotC8Ed6srZZKoelVIYFaAqQpSCaR8djDoL7g5W66tuzUi0gqir/CRHfwQGVioA8OvV1rYICREmUEN0IKhTNK+ZSaqam1atKFIAQ/m8HvO92Y4PM+EPRyiUA5byXzLaoDFANoDWRfDtVE1nuRxvV58eQPZad8iplegR2Nf1vmyxRiLoW36McM1kcmYrG/01Ns67qp+rM9ZR0ucHhaHjnrOTZKWu8PTCjKUUnKu4noBVsbJzDYw14k/LPQ7YXZMgUDgJABawiXwDntrzMMhnhOUp9trPDFLfAlJTr5AAjOV9ckJlwH56xFlIZ9Wxr1Jw8WfH8NDbPQbSvbdnHyn0b5rw76AFnjDoVgijL7+cBpwhEjm41wOIhC8nDKJNj X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AM6PR04MB4838.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(39860400002)(396003)(376002)(346002)(366004)(136003)(186009)(1800799009)(451199024)(1076003)(2616005)(5660300002)(34206002)(8676002)(8936002)(4326008)(36756003)(83380400001)(26005)(38350700002)(38100700002)(6666004)(37006003)(66556008)(66946007)(66476007)(316002)(478600001)(41300700001)(6506007)(6512007)(2906002)(86362001)(52116002)(6486002);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?6H3PAmtUwa8qB5qJi6NQuaooyKxXbUlXkh6v+kj1dRExsoSEtI5qPNrmn6aP?= =?us-ascii?Q?TnocCBoqi9TTXwQ8GLlRWXOg3Tw/dvw8OmA6GbH/3S/Wxjh9GtGyeE7wEVFP?= =?us-ascii?Q?Z/kpVZ3RjlYryjfQSqp1FCuq6gBqTEDuvQWLpCLCwv+G18SlRIUwcuSj59x6?= =?us-ascii?Q?B/VazwCakPUC041aWIREn6ECtQJFcVgGuzf6QxIujG5vw85ManhEhHLIZWFE?= =?us-ascii?Q?W4YHr1LYNpF9TIEfkQx+Wom34mHh0zy0yZuPad7KzRZQhnFOToQIhqs/37um?= =?us-ascii?Q?YHoZK2Q3LQk3eppM2ftAgtm/xJI59jgfnvMUa63x1AdF0szVGIFzGJ7zOs0a?= =?us-ascii?Q?Nzki45t3LvkI2TAgNNgM13DI9CuqpGSjbhVZqK7aQL538EjDnl4KyFXJoQ8n?= =?us-ascii?Q?ayvLsuZ+t+I5Ns/S8Y8jodYQ/o7Szfh4IfDZYSQ5kxtFgrn8mdCnZ7om05lI?= =?us-ascii?Q?AyjimRk7Nl/jDCPMJQWtNz81PfQe7sRCUEbngvhTQMxXm7iTchASGdIPvXsq?= =?us-ascii?Q?mb/88yuKwYI/pBJIhlJ8ppqP/EHJJPZrcH03atpeO1s0qQLFQrdmAvhbXtHh?= =?us-ascii?Q?vnhcXYj6r6uYFpwbzt1S1atMnF3o5KcLlq7ieDQ4q/UvKSAXzsZwJKe0AAUx?= =?us-ascii?Q?ho+Huf2XnKKkBpuIvSuRFRztaohyp5Xp0jOfazFV37F0CzQIfs+IKkQGx6I8?= =?us-ascii?Q?mJdGXL2aUcrAqYaA1g0oSg5012Rm5vDFh/427pJuSxOHlFTW9eKLo683I9TU?= =?us-ascii?Q?RxVEqeDV2cOf/3dvnn+kmmZayomsja1yVxPcIl5KQRVNb/Q2SAEtUs+PH36L?= =?us-ascii?Q?7qNr1GUzSEbuLoaT0YM4Yafp0CfOxnFw2XHiNoJW422SrarxBbSEIVtzQnPB?= =?us-ascii?Q?3AMCN7QXkXOfABiVqjuCdVjZyrTX/8bw62/d1OjcTTSyrPr5OTcHU19Fn90T?= =?us-ascii?Q?YXw7so4PNt6JnpbPmJaRxVIdG3fClgYz2Mj8wdNN0atMBa//7K86/FzFhJEO?= =?us-ascii?Q?7BjwdIO1OF5IzuA6o4+h4S80Bsw4SJ+Z23ZDzKZmiZZXqyC2qA+ogePQY735?= =?us-ascii?Q?IugTSVFurbe+yl9S+kMJfBM8nO9IAq6N7btQl+2qS8iPKkV91Qyz/xRSgHSr?= =?us-ascii?Q?i0RZfcGSjEe9KalqkGj0arizy2lpqzeI5UI5F1EpEgQBR8TUOy4S+iAygbk8?= =?us-ascii?Q?oUK9s0f0fJLtqyjesZUDbTaripXDb2WQadpo91JrdAQjowQH3nSWHZGMKcRz?= =?us-ascii?Q?XwaUaYXDGT9W+Ap1kFgO6Uz9ZxKgdxdenh2Po65ANVMaSuXurJM2RkzVzxUp?= =?us-ascii?Q?t6O7P9P84+xinCDDpVjEhVUSo1EQN9YvyE4wt5Ds/wGD/b4SlZ/uAMn2SSUO?= =?us-ascii?Q?GMtU9Y7Q1q7YkS890TpIoJ8/QnbSTUMAobQRajQGyiTFG1CE5bl3cuq56L7Y?= =?us-ascii?Q?DDZZDjgwVrnK1J6pDtUV59+hlB4oujDRXDxe39y++1kUVokwtSzAx14zEV47?= =?us-ascii?Q?lizrid7M9NGO3YtekOg/Fvzh3F199D1e07m3IeQ4nIhP0rfD9d+zpc9e93Cb?= =?us-ascii?Q?Z/N6KVI+XirJLpv4V+gcjSR6OZC5M7/xkUQVcalO?= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 6ca428f2-5db2-4466-92ff-08dba4bed261 X-MS-Exchange-CrossTenant-AuthSource: AM6PR04MB4838.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Aug 2023 16:26:08.4988 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: Q1EmUu+tiWPjeDAi1+EjBgOaC0x2sBe2DkGG+2iSRQpJsCj9DbG2YMeLtFoogHL1Q5eUpTicK9Iw2VSAC5Js4g== X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS1PR04MB9656 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Add debugfs support to fsl-edma to enable dumping of register states. Signed-off-by: Frank Li --- drivers/dma/Makefile | 5 +- drivers/dma/fsl-edma-common.h | 8 +++ drivers/dma/fsl-edma-debugfs.c | 120 +++++++++++++++++++++++++++++++++ drivers/dma/fsl-edma-main.c | 2 + 4 files changed, 133 insertions(+), 2 deletions(-) create mode 100644 drivers/dma/fsl-edma-debugfs.c diff --git a/drivers/dma/Makefile b/drivers/dma/Makefile index 83553a97a010..a51c6397bcad 100644 --- a/drivers/dma/Makefile +++ b/drivers/dma/Makefile @@ -31,10 +31,11 @@ obj-$(CONFIG_DW_AXI_DMAC) +=3D dw-axi-dmac/ obj-$(CONFIG_DW_DMAC_CORE) +=3D dw/ obj-$(CONFIG_DW_EDMA) +=3D dw-edma/ obj-$(CONFIG_EP93XX_DMA) +=3D ep93xx_dma.o +fsl-edma-debugfs-$(CONFIG_DEBUG_FS) :=3D fsl-edma-debugfs.o obj-$(CONFIG_FSL_DMA) +=3D fsldma.o -fsl-edma-objs :=3D fsl-edma-main.o fsl-edma-common.o +fsl-edma-objs :=3D fsl-edma-main.o fsl-edma-common.o $(fsl-edma-debugfs-y) obj-$(CONFIG_FSL_EDMA) +=3D fsl-edma.o -mcf-edma-objs :=3D mcf-edma-main.o fsl-edma-common.o +mcf-edma-objs :=3D mcf-edma-main.o fsl-edma-common.o $(fsl-edma-debugfs-y) obj-$(CONFIG_MCF_EDMA) +=3D mcf-edma.o obj-$(CONFIG_FSL_QDMA) +=3D fsl-qdma.o obj-$(CONFIG_FSL_RAID) +=3D fsl_raid.o diff --git a/drivers/dma/fsl-edma-common.h b/drivers/dma/fsl-edma-common.h index 3cc0cc8fc2d0..ecaba563d489 100644 --- a/drivers/dma/fsl-edma-common.h +++ b/drivers/dma/fsl-edma-common.h @@ -336,4 +336,12 @@ void fsl_edma_free_chan_resources(struct dma_chan *cha= n); void fsl_edma_cleanup_vchan(struct dma_device *dmadev); void fsl_edma_setup_regs(struct fsl_edma_engine *edma); =20 +#ifdef CONFIG_DEBUG_FS +void fsl_edma_debugfs_on(struct fsl_edma_engine *edma); +#else +static inline void fsl_edma_debugfs_on(struct dw_edma *edma) +{ +} +#endif /* CONFIG_DEBUG_FS */ + #endif /* _FSL_EDMA_COMMON_H_ */ diff --git a/drivers/dma/fsl-edma-debugfs.c b/drivers/dma/fsl-edma-debugfs.c new file mode 100644 index 000000000000..0f9a2cb57545 --- /dev/null +++ b/drivers/dma/fsl-edma-debugfs.c @@ -0,0 +1,120 @@ +// SPDX-License-Identifier: GPL-2.0 +// +// Copyright 2023 NXP + +#include +#include + +#include "fsl-edma-common.h" + +#define fsl_edma_debugfs_reg(reg, dir, __name) \ +((sizeof(reg->__name) =3D=3D sizeof(u32)) ? \ + debugfs_create_x32(__stringify(__name), 0644, dir, (u32 *)®->__name) := \ + debugfs_create_x16(__stringify(__name), 0644, dir, (u16 *)®->__name) \ +) + +#define fsl_edma_debugfs_regv1(reg, dir, __name) \ + debugfs_create_x32(__stringify(__name), 0644, dir, reg.__name) + +static void fsl_edma_debufs_tcdreg(struct fsl_edma_chan *chan, struct dent= ry *dir) +{ + fsl_edma_debugfs_reg(chan->tcd, dir, saddr); + fsl_edma_debugfs_reg(chan->tcd, dir, soff); + fsl_edma_debugfs_reg(chan->tcd, dir, attr); + fsl_edma_debugfs_reg(chan->tcd, dir, nbytes); + fsl_edma_debugfs_reg(chan->tcd, dir, slast); + fsl_edma_debugfs_reg(chan->tcd, dir, daddr); + fsl_edma_debugfs_reg(chan->tcd, dir, doff); + fsl_edma_debugfs_reg(chan->tcd, dir, citer); + fsl_edma_debugfs_reg(chan->tcd, dir, dlast_sga); + fsl_edma_debugfs_reg(chan->tcd, dir, csr); + fsl_edma_debugfs_reg(chan->tcd, dir, biter); +} + +static void fsl_edma3_debufs_chan(struct fsl_edma_chan *chan, struct dentr= y *entry) +{ + struct fsl_edma3_ch_reg *reg; + struct dentry *dir; + + reg =3D container_of(chan->tcd, struct fsl_edma3_ch_reg, tcd); + fsl_edma_debugfs_reg(reg, entry, ch_csr); + fsl_edma_debugfs_reg(reg, entry, ch_int); + fsl_edma_debugfs_reg(reg, entry, ch_sbr); + fsl_edma_debugfs_reg(reg, entry, ch_pri); + fsl_edma_debugfs_reg(reg, entry, ch_mux); + fsl_edma_debugfs_reg(reg, entry, ch_mattr); + + dir =3D debugfs_create_dir("tcd_regs", entry); + + fsl_edma_debufs_tcdreg(chan, dir); +} + +static void fsl_edma3_debugfs_init(struct fsl_edma_engine *edma) +{ + struct fsl_edma_chan *chan; + struct dentry *dir; + int i; + + for (i =3D 0; i < edma->n_chans; i++) { + if (edma->chan_masked & BIT(i)) + continue; + + chan =3D &edma->chans[i]; + dir =3D debugfs_create_dir(chan->chan_name, edma->dma_dev.dbg_dev_root); + + fsl_edma3_debufs_chan(chan, dir); + } + +} + +static void fsl_edma_debugfs_init(struct fsl_edma_engine *edma) +{ + struct fsl_edma_chan *chan; + struct dentry *dir; + int i; + + fsl_edma_debugfs_regv1(edma->regs, edma->dma_dev.dbg_dev_root, cr); + fsl_edma_debugfs_regv1(edma->regs, edma->dma_dev.dbg_dev_root, es); + fsl_edma_debugfs_regv1(edma->regs, edma->dma_dev.dbg_dev_root, erqh); + fsl_edma_debugfs_regv1(edma->regs, edma->dma_dev.dbg_dev_root, erql); + fsl_edma_debugfs_regv1(edma->regs, edma->dma_dev.dbg_dev_root, eeih); + fsl_edma_debugfs_regv1(edma->regs, edma->dma_dev.dbg_dev_root, eeil); + fsl_edma_debugfs_regv1(edma->regs, edma->dma_dev.dbg_dev_root, seei); + fsl_edma_debugfs_regv1(edma->regs, edma->dma_dev.dbg_dev_root, ceei); + fsl_edma_debugfs_regv1(edma->regs, edma->dma_dev.dbg_dev_root, serq); + fsl_edma_debugfs_regv1(edma->regs, edma->dma_dev.dbg_dev_root, cerq); + fsl_edma_debugfs_regv1(edma->regs, edma->dma_dev.dbg_dev_root, cint); + fsl_edma_debugfs_regv1(edma->regs, edma->dma_dev.dbg_dev_root, cerr); + fsl_edma_debugfs_regv1(edma->regs, edma->dma_dev.dbg_dev_root, ssrt); + fsl_edma_debugfs_regv1(edma->regs, edma->dma_dev.dbg_dev_root, cdne); + fsl_edma_debugfs_regv1(edma->regs, edma->dma_dev.dbg_dev_root, inth); + fsl_edma_debugfs_regv1(edma->regs, edma->dma_dev.dbg_dev_root, errh); + fsl_edma_debugfs_regv1(edma->regs, edma->dma_dev.dbg_dev_root, errl); + + for (i =3D 0; i < edma->n_chans; i++) { + if (edma->chan_masked & BIT(i)) + continue; + + chan =3D &edma->chans[i]; + dir =3D debugfs_create_dir(chan->chan_name, edma->dma_dev.dbg_dev_root); + + fsl_edma_debufs_tcdreg(chan, dir); + } +} + +void fsl_edma_debugfs_on(struct fsl_edma_engine *edma) +{ + if (!debugfs_initialized()) + return; + + debugfs_create_bool("big_endian", 0444, edma->dma_dev.dbg_dev_root, &edma= ->big_endian); + debugfs_create_x64("chan_mask", 0444, edma->dma_dev.dbg_dev_root, &edma->= chan_masked); + debugfs_create_x32("n_chans", 0444, edma->dma_dev.dbg_dev_root, &edma->n_= chans); + + if (edma->drvdata->flags & FSL_EDMA_DRV_SPLIT_REG) + fsl_edma3_debugfs_init(edma); + else + fsl_edma_debugfs_init(edma); +} + + diff --git a/drivers/dma/fsl-edma-main.c b/drivers/dma/fsl-edma-main.c index 63d48d046f04..029a72872821 100644 --- a/drivers/dma/fsl-edma-main.c +++ b/drivers/dma/fsl-edma-main.c @@ -612,6 +612,8 @@ static int fsl_edma_probe(struct platform_device *pdev) if (!(drvdata->flags & FSL_EDMA_DRV_SPLIT_REG)) edma_writel(fsl_edma, EDMA_CR_ERGA | EDMA_CR_ERCA, regs->cr); =20 + fsl_edma_debugfs_on(fsl_edma); + return 0; } =20 --=20 2.34.1 From nobody Wed Dec 17 00:05:03 2025 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 AD7A9C71153 for ; Thu, 24 Aug 2023 16:27:18 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242555AbjHXQ0t (ORCPT ); Thu, 24 Aug 2023 12:26:49 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60728 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242548AbjHXQ0Q (ORCPT ); Thu, 24 Aug 2023 12:26:16 -0400 Received: from EUR01-HE1-obe.outbound.protection.outlook.com (mail-he1eur01on2085.outbound.protection.outlook.com [40.107.13.85]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 803E21BE; Thu, 24 Aug 2023 09:26:13 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=ZcdFwRQjXO6ph7Wj188qczsRCw1LctRbKW92uqoB4JiPot1E7ldwhyMTpB4mVGHCJU6Pt3yeOC7anFiHKN3aLaddkLEToU8E4niGu2eYWWmVDdqmdZc+OfbfW+EecBXBwCl6i4EjYReU6kf90HD2kILbQO757rgWTUIm4JWk9L8IJ7O2N1EznwUZx9BtyQMeofCwApU+/NdQL0GMyrkAR2UlvUXZWRiACGYkt2oMKO0jmpNNgWzvfhsSNqr5YLgarjjnM1eWXMHTBqg2ulQQWnCghZMUWG+joLMI/O6E9jaMdmoRId14gtY/Fr+7g+X2klQLdFp4Tp24TYhZTJ6HXA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=QeOsqgZafWe7JXJudPD0OiJcqcuBVmiM30CcNoOokDA=; b=mZJeEX87fvTgMWLxCUc9trX31pb2t8+zCnrxQlKNFfDBmyNKWiwfE3G7MBEwenxT0XGFG5Aca3KBC/sV1je52sH2Tw5Ur5uKVGq08DK23XrlcA0BsLp2iw8YvcLRBFYEvo9hnDSJApF9QukzWPDYGfmbd9dZLUskESCCbjZUpXR7CDnlSwrJwDb9jc3M3X9HRuQR4O/++tJmCIahY/2C6slVsKQmiEGvGkEvfKn4SIuWRGPPalEhIdznKjqPcDcyi3tMi5UnwPbvcPPWV0rpd9JS3Kb2IJMtwB4tKObCtMDYw25PVdG+ot2T3AaL7SoURiLuJE/XEKVfkOa6vUQ3kQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass header.d=nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=QeOsqgZafWe7JXJudPD0OiJcqcuBVmiM30CcNoOokDA=; b=clfdy3F6poriIlJHVMP2Sbqo/Ws8uzQHNZziO6XRloSTrePpAkifkrMf4udtc48bFCcy4aw9lcoBNYkoMHLPWdXSXuOKE7I3UWBpGC0/pW4x/v5PaL3YZg/cUdKj0kMqz40EcbqkKco7yIz2+JzoyZq3AkKUrsBIO2B2l4jP06E= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from AM6PR04MB4838.eurprd04.prod.outlook.com (2603:10a6:20b:4::16) by AS1PR04MB9656.eurprd04.prod.outlook.com (2603:10a6:20b:478::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6699.27; Thu, 24 Aug 2023 16:26:11 +0000 Received: from AM6PR04MB4838.eurprd04.prod.outlook.com ([fe80::a680:2943:82d1:6aa8]) by AM6PR04MB4838.eurprd04.prod.outlook.com ([fe80::a680:2943:82d1:6aa8%3]) with mapi id 15.20.6699.027; Thu, 24 Aug 2023 16:26:11 +0000 From: Frank Li To: frank.li@nxp.com Cc: dmaengine@vger.kernel.org, imx@lists.linux.dev, joy.zou@nxp.com, linux-kernel@vger.kernel.org, peng.fan@nxp.com, shenwei.wang@nxp.com, vkoul@kernel.org Subject: [PATCH 2/2] dmaengine: fsl-edma: add trace event support Date: Thu, 24 Aug 2023 12:25:48 -0400 Message-Id: <20230824162548.2940355-3-Frank.Li@nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230824162548.2940355-1-Frank.Li@nxp.com> References: <20230824162548.2940355-1-Frank.Li@nxp.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: BYAPR03CA0034.namprd03.prod.outlook.com (2603:10b6:a02:a8::47) To AM6PR04MB4838.eurprd04.prod.outlook.com (2603:10a6:20b:4::16) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AM6PR04MB4838:EE_|AS1PR04MB9656:EE_ X-MS-Office365-Filtering-Correlation-Id: 1e5623e5-4c0a-4b0a-a26a-08dba4bed3dc X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 5rYfSxV5mzNNrdfCabfED3V7WvF8PKfkJjCOHQ0FEKpzNx/lIS0W9l0qLfMnMg9/jm/41e8yQoM8YrYwpalhI97twdWMgr8xU6TWX7eMNhr7jHWJZp9vuVGdQTiyAJnlZMf9cpCoWRw4oypUzAoXLJFyYSiXodPhvSqkn6I1QH6dSKAIYn6ZbFPVb5FXDmQ9l1UzNqoNqlStH+7hH2TxFM2+CkH4VB0aXQYVm4ZF9ze4bmmMlZXCJ6Qmou2R4owNmwhDn/H2ZjTQaQK4rOkN5fq73OAlVPBxH0+yMnfPPZTOFxIAYCzlMOFrsNc8zdKUEAgEYi608lhh/CCVRacK9BC2p6SlZmqCCu6mjMy9+GKNkpNUmuYZHwNv4WD0z2ewJ0gfgKJqHeMLihQYiRW4SvYoQQVk7oGNyJBnsFBtqDKwI08TR/2geG6wgk7z5dT0COYi5lPyEV9FELcnTuXcY2IU3WYGMJjlzptHOr//ztc8/xQf9lt8FWmYH3Vuhg6Si4a9Uiq5A7cGECh4ofW4qxfsJZNDDsBDrtRXEB+YBpZlVuBL473V0Fs8UOUfmBM2mGuMoUJ1mqTRl4WOutmD7QLm6TPKO+/lDZbxFAkhhdC/DNXh2p0J1gmghnEDuR6t X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AM6PR04MB4838.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(39860400002)(396003)(376002)(346002)(366004)(136003)(186009)(1800799009)(451199024)(1076003)(2616005)(5660300002)(34206002)(8676002)(8936002)(4326008)(36756003)(83380400001)(26005)(38350700002)(38100700002)(6666004)(37006003)(66556008)(66946007)(66476007)(316002)(478600001)(41300700001)(6506007)(6512007)(2906002)(86362001)(52116002)(6486002);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?pFfpdKNN4ogx7qGgeI9FRqeCbemIv/g9as+QNjCotaBnLkxpT/GPQTtafEyv?= =?us-ascii?Q?aC6SflYW1B6ajiwTozUdHUjf/PYoobfnKn9L907zYIJBpCLtYGiO/5i5Nvlq?= =?us-ascii?Q?r+wGwt3T+Sc6djxVcHimNryj3HKlBgk78F0VhGy7LtbnZhjItBJohM+H5QHv?= =?us-ascii?Q?Cfv87Cb2o2v9idcE9HJEhDawaA4UHS9n4wgmC6QcKExv0gCsj9PKqrZh/Xcd?= =?us-ascii?Q?xZcmyqY2nzNrlI0TenuyDe37sIH//sLTm4UXyJ/3HayIm3ADLFkhK5u8Q/NJ?= =?us-ascii?Q?zZevFjADRExVIgfkSoAijQjN21cymmcdA/8zL6LvBW0p2inAm6ENDd4T/ybz?= =?us-ascii?Q?+3y8Mm4DCW7+AdHOC+zcAZVhejz0ReHfEByyO4j4t6tsvNq8us4MpCugvcw0?= =?us-ascii?Q?dOrlbQyRVewWfjQi6fnzj5m/dFeBhhWkB40RVA1rQYxK+C7RCcX8aTyxWzUp?= =?us-ascii?Q?3SlpWgX0SQI85aJnEUJCD3jyqO8hwnmGkwr01kLXi0CdZ2g3WRGnG0U56QUM?= =?us-ascii?Q?PyIR88oAdfJyGvuCRVIBB8mScpmYt43kKkmlKjwv8PCS9q8zj87NY2Bw12TV?= =?us-ascii?Q?wbsYAY4TUI4qvGT9aD1ZcrIjZecV9We3O1imepT3wWCQ9raZkT0BfIlzSe0i?= =?us-ascii?Q?ECP4IKwlhS0+ILL18tMC+XiOBaRLkYVhZdA7xxDxz9cr+19+GF7aanLADubx?= =?us-ascii?Q?MECm1OwpMVbU6cG+phKFs1t+/gmaC+Wym+zMY1rWxHfgI5HWCNYyvS3bFSd/?= =?us-ascii?Q?/ROjTVfuqoCrIb/VAlRLrBhdQ0av2J3ItdGBA1nnfnNkPDABpMPLpIXbAN02?= =?us-ascii?Q?nL74B/ZE5q/NyIFf7m6+H959lBXdnvz5tWyzyqCw8/AYfqchShH7Sed3KtNj?= =?us-ascii?Q?nHS1ovi3zKDMEYXCfQ2ctOS2i6ybFjMxuX486Ibvf6Tst6eYohnMV60EG9mw?= =?us-ascii?Q?3RBIQz8wihcMOHHMKyJaMIc8Z/6Ux47Jt/OjS5r502rhoEv68LPtmQMZl7qs?= =?us-ascii?Q?0u1Pt5ueqOKV6pyNdKKEbh3hLiVkW54VNBoijns6o5BaGGztDzrn3W4EY8R/?= =?us-ascii?Q?iadAoBJXqOKWzxBNjY4k9GMyICZTf/lOeGZlA2r0yvFcquGH24ma9a8rrUBS?= =?us-ascii?Q?OkTOUmQcGUH5bUSPneTJVGHKiN8a1YHzxHsWXvWb38A2gGziM+pzwtFi0Vts?= =?us-ascii?Q?YXRsVN6lcmJpe52SSfCtL6SkVnfML6eD7QH1Q5UllCIkBRHl53B1BNFvs4+v?= =?us-ascii?Q?63oFcEmT/f6UdW3A5ozZ2Nj6Fjlsv+iZVbgbmL7ECO0mZ3eIEmv+30rQfTbP?= =?us-ascii?Q?0tKJ98T1fndkn6E/51QxgqANY0lXk7gGdDVG24PaOzmjAB0DPTrU2SiAzCqm?= =?us-ascii?Q?Y4PZYf2t/GdbmkJWeFbB9GmIMyBCWGXMDP6+6DecOgwmQ53cDgzrtL9PyJHw?= =?us-ascii?Q?JLINNUEuY+nPIITAMZa2laf9n0j3rw3GpJbVC2BQDcVMAiem8cRK+oV65HtR?= =?us-ascii?Q?MGXg5cynnuKazgMzDwd0OufnkrVZ+7WtvGRc2vvVjG8wZh/G79BbZ5GHW3vq?= =?us-ascii?Q?vjl6bpheUsVo/CnmSw1Sl5RJsYJ36gPZpezU4gXd?= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 1e5623e5-4c0a-4b0a-a26a-08dba4bed3dc X-MS-Exchange-CrossTenant-AuthSource: AM6PR04MB4838.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Aug 2023 16:26:10.9911 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: VDowyAwd9BN/cHuF6L1X3LpqUGW+va9RsN2rztmvVzE7G7QQn4bOZz4Cxn3Jg3Ff0EfeE5pcKdvs29L24eSJhw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS1PR04MB9656 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Implement trace event support to enhance logging functionality for register access and the transfer control descriptor (TCD) context. This will enable more comprehensive monitoring and analysis of system activities Signed-off-by: Frank Li --- drivers/dma/Makefile | 6 +- drivers/dma/fsl-edma-common.c | 2 + drivers/dma/fsl-edma-common.h | 29 +++++++-- drivers/dma/fsl-edma-trace.c | 4 ++ drivers/dma/fsl-edma-trace.h | 113 ++++++++++++++++++++++++++++++++++ 5 files changed, 148 insertions(+), 6 deletions(-) create mode 100644 drivers/dma/fsl-edma-trace.c create mode 100644 drivers/dma/fsl-edma-trace.h diff --git a/drivers/dma/Makefile b/drivers/dma/Makefile index a51c6397bcad..40b2dd554e5d 100644 --- a/drivers/dma/Makefile +++ b/drivers/dma/Makefile @@ -32,10 +32,12 @@ obj-$(CONFIG_DW_DMAC_CORE) +=3D dw/ obj-$(CONFIG_DW_EDMA) +=3D dw-edma/ obj-$(CONFIG_EP93XX_DMA) +=3D ep93xx_dma.o fsl-edma-debugfs-$(CONFIG_DEBUG_FS) :=3D fsl-edma-debugfs.o +CFLAGS_fsl-edma-trace.o :=3D -I$(src) +fsl-edma-trace-$(CONFIG_TRACING) :=3D fsl-edma-trace.o obj-$(CONFIG_FSL_DMA) +=3D fsldma.o -fsl-edma-objs :=3D fsl-edma-main.o fsl-edma-common.o $(fsl-edma-debugfs-y) +fsl-edma-objs :=3D fsl-edma-main.o fsl-edma-common.o $(fsl-edma-debugfs-y)= ${fsl-edma-trace-y} obj-$(CONFIG_FSL_EDMA) +=3D fsl-edma.o -mcf-edma-objs :=3D mcf-edma-main.o fsl-edma-common.o $(fsl-edma-debugfs-y) +mcf-edma-objs :=3D mcf-edma-main.o fsl-edma-common.o $(fsl-edma-debugfs-y)= ${fsl-edma-trace-y} obj-$(CONFIG_MCF_EDMA) +=3D mcf-edma.o obj-$(CONFIG_FSL_QDMA) +=3D fsl-qdma.o obj-$(CONFIG_FSL_RAID) +=3D fsl_raid.o diff --git a/drivers/dma/fsl-edma-common.c b/drivers/dma/fsl-edma-common.c index edb92fa93315..70e24e76d73b 100644 --- a/drivers/dma/fsl-edma-common.c +++ b/drivers/dma/fsl-edma-common.c @@ -527,6 +527,8 @@ void fsl_edma_fill_tcd(struct fsl_edma_chan *fsl_chan, csr |=3D EDMA_TCD_CSR_START; =20 tcd->csr =3D cpu_to_le16(csr); + + trace_edma_fill_tcd(fsl_chan->edma, tcd); } =20 static struct fsl_edma_desc *fsl_edma_alloc_desc(struct fsl_edma_chan *fsl= _chan, diff --git a/drivers/dma/fsl-edma-common.h b/drivers/dma/fsl-edma-common.h index ecaba563d489..a9e27110ac7d 100644 --- a/drivers/dma/fsl-edma-common.h +++ b/drivers/dma/fsl-edma-common.h @@ -234,6 +234,9 @@ struct fsl_edma_engine { edma_writel(chan->edma, val, \ (void __iomem *)&(container_of(chan->tcd, struct fsl_edma3_ch_reg, tc= d)->__name)) =20 +/* Need after struct defination */ +#include "fsl-edma-trace.h" + /* * R/W functions for big- or little-endian registers: * The eDMA controller's endian is independent of the CPU core's endian. @@ -242,18 +245,30 @@ struct fsl_edma_engine { */ static inline u32 edma_readl(struct fsl_edma_engine *edma, void __iomem *a= ddr) { + u32 val; + if (edma->big_endian) - return ioread32be(addr); + val =3D ioread32be(addr); else - return ioread32(addr); + val =3D ioread32(addr); + + trace_edma_readl(edma, addr, val); + + return val; } =20 static inline u16 edma_readw(struct fsl_edma_engine *edma, void __iomem *a= ddr) { + u16 val; + if (edma->big_endian) - return ioread16be(addr); + val =3D ioread16be(addr); else - return ioread16(addr); + val =3D ioread16(addr); + + trace_edma_readw(edma, addr, val); + + return val; } =20 static inline void edma_writeb(struct fsl_edma_engine *edma, @@ -264,6 +279,8 @@ static inline void edma_writeb(struct fsl_edma_engine *= edma, iowrite8(val, (void __iomem *)((unsigned long)addr ^ 0x3)); else iowrite8(val, addr); + + trace_edma_writeb(edma, addr, val); } =20 static inline void edma_writew(struct fsl_edma_engine *edma, @@ -274,6 +291,8 @@ static inline void edma_writew(struct fsl_edma_engine *= edma, iowrite16be(val, (void __iomem *)((unsigned long)addr ^ 0x2)); else iowrite16(val, addr); + + trace_edma_writew(edma, addr, val); } =20 static inline void edma_writel(struct fsl_edma_engine *edma, @@ -283,6 +302,8 @@ static inline void edma_writel(struct fsl_edma_engine *= edma, iowrite32be(val, addr); else iowrite32(val, addr); + + trace_edma_writel(edma, addr, val); } =20 static inline struct fsl_edma_chan *to_fsl_edma_chan(struct dma_chan *chan) diff --git a/drivers/dma/fsl-edma-trace.c b/drivers/dma/fsl-edma-trace.c new file mode 100644 index 000000000000..28300ad80bb7 --- /dev/null +++ b/drivers/dma/fsl-edma-trace.c @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0 + +#define CREATE_TRACE_POINTS +#include "fsl-edma-common.h" diff --git a/drivers/dma/fsl-edma-trace.h b/drivers/dma/fsl-edma-trace.h new file mode 100644 index 000000000000..2a11cccb76e7 --- /dev/null +++ b/drivers/dma/fsl-edma-trace.h @@ -0,0 +1,113 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ +/* + * Copyright 2023 NXP. + */ + +#undef TRACE_SYSTEM +#define TRACE_SYSTEM fsl_edma + +#if !defined(__LINUX_FSL_EDMA_TRACE) || defined(TRACE_HEADER_MULTI_READ) +#define __LINUX_FSL_EDMA_TRACE + +#include +#include + +DECLARE_EVENT_CLASS(edma_log_io, + TP_PROTO(struct fsl_edma_engine *edma, void __iomem *addr, u32 value), + TP_ARGS(edma, addr, value), + TP_STRUCT__entry( + __field(struct fsl_edma_engine *, edma) + __field(void __iomem *, addr) + __field(u32, value) + ), + TP_fast_assign( + __entry->edma =3D edma; + __entry->addr =3D addr; + __entry->value =3D value; + ), + TP_printk("offset %08lx: value %08x", + __entry->addr - __entry->edma->membase, __entry->value) +); + +DEFINE_EVENT(edma_log_io, edma_readl, + TP_PROTO(struct fsl_edma_engine *edma, void __iomem *addr, u32 value), + TP_ARGS(edma, addr, value) +); + +DEFINE_EVENT(edma_log_io, edma_writel, + TP_PROTO(struct fsl_edma_engine *edma, void __iomem *addr, u32 value), + TP_ARGS(edma, addr, value) +); + +DEFINE_EVENT(edma_log_io, edma_readw, + TP_PROTO(struct fsl_edma_engine *edma, void __iomem *addr, u32 value), + TP_ARGS(edma, addr, value) +); + +DEFINE_EVENT(edma_log_io, edma_writew, + TP_PROTO(struct fsl_edma_engine *edma, void __iomem *addr, u32 value), + TP_ARGS(edma, addr, value) +); + +DEFINE_EVENT(edma_log_io, edma_readb, + TP_PROTO(struct fsl_edma_engine *edma, void __iomem *addr, u32 value), + TP_ARGS(edma, addr, value) +); + +DEFINE_EVENT(edma_log_io, edma_writeb, + TP_PROTO(struct fsl_edma_engine *edma, void __iomem *addr, u32 value), + TP_ARGS(edma, addr, value) +); + +DECLARE_EVENT_CLASS(edma_log_tcd, + TP_PROTO(struct fsl_edma_engine *edma, struct fsl_edma_hw_tcd *tcd), + TP_ARGS(edma, tcd), + TP_STRUCT__entry( + __field(struct fsl_edma_engine *, edma) + __field(struct fsl_edma_hw_tcd *, tcd) + ), + TP_fast_assign( + __entry->edma =3D edma; + __entry->tcd =3D tcd; + ), + TP_printk("\n=3D=3D=3D=3D TCD =3D=3D=3D=3D=3D\n" + " saddr: 0x%08x\n" + " soff: 0x%04x\n" + " attr: 0x%04x\n" + " nbytes: 0x%08x\n" + " slast: 0x%08x\n" + " daddr: 0x%08x\n" + " doff: 0x%04x\n" + " citer: 0x%04x\n" + " dlast: 0x%08x\n" + " csr: 0x%04x\n" + " biter: 0x%04x\n", + __entry->tcd->saddr, + __entry->tcd->soff, + __entry->tcd->attr, + __entry->tcd->nbytes, + __entry->tcd->slast, + __entry->tcd->daddr, + __entry->tcd->doff, + __entry->tcd->citer, + __entry->tcd->dlast_sga, + __entry->tcd->csr, + __entry->tcd->biter) +); + +DEFINE_EVENT(edma_log_tcd, edma_fill_tcd, + TP_PROTO(struct fsl_edma_engine *edma, struct fsl_edma_hw_tcd *tcd), + TP_ARGS(edma, tcd) +); + +#endif + +/* this part must be outside header guard */ + +#undef TRACE_INCLUDE_PATH +#define TRACE_INCLUDE_PATH . + +#undef TRACE_INCLUDE_FILE +#define TRACE_INCLUDE_FILE fsl-edma-trace + +#include --=20 2.34.1